- 博客(81)
- 资源 (10)
- 收藏
- 关注
原创 (原)thinkjs使用腾讯云https证书
腾讯https证书腾讯云申请https证书后,下载的证书中包含以下目录&文件:Apache\IIS\Nginx\Tomcat\www.xxx.com.csr修改代码结构&载入https我们只需要Nginx目录下的两个文件,格式分别是:*.crt*.key把他们拷贝到ThinkJS工程某个目录,比如对于我的工程,目录如下:\ssl\Nginx\1_www.xxx.crt整体结构如下:然后,修改ThinkJS的启动方式。打开src\common\confi
2020-10-26 15:11:36
558
原创 普罗米修斯irate/rate算法区别(原创)
文章目录irate算法流程特点代码rate函数流程特点代码irate算法流程选取时间范围内最后两个点:end1,end2计算两个点的差值,这里分两种情况: 正常情况下:end2 > end1 ,此时 value = end2 - end1 异常情况下,end2 < end1 ,此时 value = end2计算两个时间点的时间差time = time2 -...
2020-04-21 15:07:42
6377
2
原创 electron-vue架构解析4-页面元素渲染过程分析(原)
前面介绍了整个环境的创建过程,这一节我们来看具体页面渲染的过程。 由于页面渲染都是在渲染进程完成的,我们就从渲染进程的配置文件来看入口在哪里。 前面介绍过,渲染进程公用了两个配置文件,一个是electron-vue/dev-client.js,他负责在界面上提示当前的编译步骤,而另一个配置文件在webpack.renderer.config.js中定义:let rendererConfig...
2018-06-11 14:11:33
3299
4
原创 electron-vue架构解析3-开发环境启动流程分析(原)
这一节我们来看开发环境的启动流程。该框架主要修改是对开发环境的优化,包括了于开发环境的配置文件隔离,主进程和渲染进程配置文件隔离,编译过程提示等功能,因此这一节内容才是整个框架的核心。 我们从开发人员用到的启动命令说起。 从package中我们看到启动命令就是:&quot;dev&quot;: &quot;node .electron-vue/dev-runner.js&quot;,也就是在终端使用npm run dev...
2018-06-11 14:01:48
7361
1
原创 electron-vue架构解析2-生产环境打包过程分析(原)
目录我们先从生产环境打包流程来分析。 从package.json文件入口来看打包命令和调用的脚本: "scripts": { "build": "node .electron-vue/build.js", "build:darwin": "cross-env BUILD_TARGET=darwin nod
2018-06-11 10:52:07
3648
1
原创 electron-vue架构解析1-序言(原)
目录 [toc]本系列文章将介绍electron-vue前端框架的作用、结构、使用方法。electron-vue是SimulatedGREG基于vue-cli搭建的Vue+Webpack+Electron脚手架,可以用来开发跨PC平台的应用,源码地址在这里。 其主要功能/特色包括:主进程和渲染进程配置文件分离代码热更新详细的Log输出除了必备的Electron、Vue、We...
2018-06-11 10:47:08
3416
原创 在Github上使用Hexo搭建博客并配置tranquilpeak主题(原)
该文章将会引导大家使用Hexo搭建私人博客,并配置tranquilpeak主题,最终效果如此,并发布到Github上,请严格按照以下顺序进行操作。创建Hexo工程导入tranquilpeak主题必要配置项1根目录的_config文件配置2tranquilpeak目录的_config文件配置运行项目主题config的其他配置启用RSS订阅功能启用侧边栏的分类菜单启用侧边
2018-02-07 14:03:24
1652
原创 Android的onTouchEventon、dispatchTouchEvent、InterceptTouchEvent按键消息派发流程(原)
Android自定义View时按键消息流程是绕不过去的知识点,其中又涉及到三大方法onTouchEvent、dispatchTouchEvent、onInterceptTouchEvent,他们之间的关系如何?优先级如何?出现矛盾时又会采取怎样的处理方式,我们这一节来做一下测试。1.Demo源码 搭建的Demo示例也比较简单,分别创建了TouchEventFlowActivity、To
2018-02-01 14:27:59
745
原创 算法系列之--Kotlin的算法实战比较(原)
前面几节我们介绍了各种算法的具体实现,这一节我们分别对以上算法进行性能测试。 测试方法如下,分别测试n=1000,10000,100000(十万),500000(五十万),1000000(一百万),3000000(三百万)情况下的运算效率,随机数产生的范围是当前数据量的十倍,比如1000个随机数时,随机范围1000*10=10000. 测试机型为小米6。
2017-09-14 16:18:33
2028
原创 算法系列之--Javascript和Kotlin的快速排序算法(原)
上一节我们学习了基数排序算法,这一节来学习快速排序算法介绍 从这个快速排序算法的名字就可以看出他非常快,有多块呢?在平均状况下,排序n个项目要O(n log n)次比较。在最坏状况下则需要O(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他O(n log n)算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现
2017-09-14 11:02:23
576
原创 算法系列之--Javascript和Kotlin的基数排序算法(原)
上一节我们学习了堆算法,这一节来学习基数算法介绍 之前的所有算法都是基于比较的算法,而基数排序算法不同,他不是基于比较的,而是将整形的数据拆分为不同的位数分别进行排序,适用于数列中的数字相差不大的情况,其具体操作步骤如下: 1. 将所有数字按照最后一位数的内容放入map中,比如对于[25,1,3,21,23,5,9]这个序列,放入map后内容
2017-09-14 10:59:17
410
原创 算法系列之--Javascript和Kotlin的堆排序算法(原)
上一节我们学习了希尔排序算法,这一节来学习堆排序算法介绍 堆排序算法是基于堆这种数据结构设计的算法,理解了堆的概念就明白了堆算法的原理,因此我们简单介绍一下堆的数据结构。 堆的结构主要有以下几个特征: 1. 堆是由一个个小堆构成的,每个堆中,父节点都大于两个子节点,但是两个子节点的大小没有要求,既可以左子节点>右子节点,又可
2017-09-14 10:55:31
478
原创 算法系列之--Javascript和Kotlin的希尔排序算法(原)
上一节我们学习了插入算法,这一节来学习希尔排序算法介绍 希尔排序是在插入排序基础上优化而来的,其思想就是利用插入排序最优时只需要O(n)的复杂度,我们可以对序列做调整,使其尽可能靠近最优序列,然后不断运算插入算法。详细步骤如下: 1. 挑选合适的步长 2. 以list[步长]为起点开始循环 3. 有了起点,
2017-09-14 10:39:12
458
原创 算法系列之--Javascript和Kotlin的插入算法(原)
上一节我们学习了选择算法,这一节来学习插入算法介绍 插入算法与选择算法类似,只不过“方向相反”,他的特点就是依次选择当前索引右边的元素,有序的插入当前索引左边的序列中,步骤如下: 1. 从第一个元素开始,该元素可以认为已经被排序 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 3. 如果该元素(已
2017-09-14 10:34:57
381
原创 算法系列之--Javascript和Kotlin的选择算法(原)
上一节我们学习了冒泡算法,这一节来学习选择算法介绍 选择排序与冒泡类似,都是入门级的排序算法,效率也与冒泡相同,都是O(n^2),算法步骤如下: 1. 寻找当前序列中最小的数的索引 2. 找到最小值索引后与第一位元素交换位置 3. 再在剩余序列中查找最小数的索引 4. 找到后与第二位元素交
2017-09-13 17:00:48
425
原创 算法系列之--Javascript和Kotlin的冒泡算法(原)
介绍 冒泡算法基本上是IT从业人员接触到的第一个算法,其原理就是依次对比相邻元素,大的放在后面,当全部list遍历之后,该list的最大值就会被置换到list的最后,详细步骤如下: 1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的
2017-09-13 16:54:14
590
原创 算法系列简单研究(原)
算法是一个工程师最基础的素养之一,就好比语言、框架一样,你不会这些知识,可能并不影响你日常工作的解BUG过程,但是如果你不去了解这些"抽象"的知识,那么可能整个职业生涯都只是解解BUG而已。 或者说,算法、框架、语言的研究,决定了一个程序员能到达的层次。 这个系列我们就来聊聊一些"烂大街"了的算法。 《算法系列之--Javascript和Kot
2017-09-13 16:46:35
488
原创 Dagger2教程六之Component的组织方法(原)
为了介绍Dagger2的使用,我们搭建了一个Demo来逐步分析,大家可以在这里下载源码(这个源码与之前的五个小节源码不同)(https://github.com/dushaofeng/DaggerDemo2.git)。 上一节我们介绍了《Dagger2教程五之单例模式》,这一节我们来介绍Component的组织方法。 所谓Component组织方法,也就是我们工
2017-05-22 14:44:21
7883
2
原创 Dagger2教程五之单例模式(原)
为了介绍Dagger2的使用,我们搭建了一个Demo来逐步分析,大家可以在这里下载源码(https://github.com/dushaofeng/DaggerDemo.git)。 上一节我们介绍了《Dagger2教程四之多构造方法的情况》,这一节我们来介绍Dagger2中的单例模式的使用。 Dagger2中有一个极其具有迷惑性的注释"@Singleton",字
2017-05-22 14:24:12
4359
原创 Dagger2教程四之多构造方法的情况(原)
为了介绍Dagger2的使用,我们搭建了一个Demo来逐步分析,大家可以在这里下载源码(https://github.com/dushaofeng/DaggerDemo.git)。 上一节我们介绍了《Dagger2教程二之基础使用》这一节我们来讨论如果注入类的构造方法中的参数不同或者注入类包含多个构造方法时的情况处理。一、包含可变参数的构造方法的情况
2017-05-22 14:08:24
4370
1
原创 Dagger2教程三之构造方法带参数的情况(原)
为了介绍Dagger2的使用,我们搭建了一个Demo来逐步分析,大家可以在这里下载源码(https://github.com/dushaofeng/DaggerDemo.git)。 前面一节《Dagger2教程二之基础使用篇》介绍了Dagger2最简单的使用场景,但是在结尾我们遇到两个困难,即如何在不修改注入类代码的情况下实现注入?如何解决注入类构造方法需要参数的情况?
2017-05-22 13:55:04
9515
原创 Dagger2教程二之基础使用(原)
为了介绍Dagger2的使用,我们搭建了一个Demo来逐步分析,大家可以在这里下载源码(https://github.com/dushaofeng/DaggerDemo.git)。 上一节我们介绍了《Dagger2教程一之配置篇》,这一节我们来介绍Dagger2的具体使用方法。一、原始方式 我们先来看一下如果不使用Dagger的情况,我们在Activ
2017-05-22 13:38:48
2516
原创 Dagger2教程一之配置(原)
既然打开了这篇文章,那么关于为什么使用Dagger2或者Dagger2的作用就不再多说,我们直接来动手配置Dagger2。 我们只介绍AndroidStudio的配置方法,至于依旧使用Eclipse的同学,请绕道。 我们打开模块的(不是全工程的)build.gradle文件,其内容大致是这个样子: apply plugin: 'com.andr
2017-05-22 13:25:12
2086
原创 Android Studio引入Library后运行报"Resources$NotFoundException"的解决办法(原)
【前提条件】 Eclipse导出的Library工程,其中的src目录被编译为jar,然后将此Library合入AndroidStudio中,编译(build)可以通过,但是运行(run)报错,报错信息: android.content.res.Resources$NotFoundException: Resource ID #0x7f030003【主要特征
2017-02-27 14:25:28
3855
原创 高通平台ModemBindingPolicyHandler和ModemBindingPolicyHandler作用(原)
做高通平台双卡项目的时候,高通在Telephony模块中添加了ModemBindingPolicyHandler和ModemStackController两个对象,今天我们来看一下他们的作用。由于这两个对象都是高通自己添加的,因此不方便贴出太多的源码,我们简要看一下其作用和原理。 高通之所以在AP侧添加这两个对象,是和其双卡的协议栈结构相关的。 我们知道虽然双卡
2016-02-19 16:46:09
1982
原创 Android运营商名称显示之PLMN与SPN显示规则(原)
前面的两节分别介绍了PLMN和SPN的读取方法,那么在锁屏、状态栏、通知栏这些地方的运营商名称究竟是来自于PLMN呢?还是来自于SPN呢? 在3GPP中规定的运营商名称显示规则如下: 1、名称可以为SPN或PLMN 2、如果没有SPN文件,那么就显示PLMN 3、若有SPN,并且注册的PLMN是HPLMN或者注册的PLMN在S
2016-02-17 20:06:04
12549
原创 Android运营商名称显示之SPN的读取(原)
SPN(Service Provider Name)就是当前发行SIM卡的运营商的名称,可以从以下两个路径获取: 1、从SIM文件系统读取 2、从配置文件读取 我们本节就来分析该字串的读取过程。一、从SIM读取SPN过程 一般来说,SIM上保存有当前SIM的发行运营商名称,也就是SPN,该字串可以存储在SI
2016-02-17 20:01:05
17210
原创 Android运营商名称显示之PLMN的读取(原)
Plmn的全称是Public Land Mobile Network(公共陆地移动网络),而在运营商显示方面主要是指当前SIM所驻留的网络,比如当中国移动的SIM(46000)如果漫游到联通的网络(46001),那么虽然当前的SIM是中国移动,但是他的Plmn就应该是中国联通。 也就是说,Plmn的名称与当前驻留的网络相关。 那么Plmn的来源是什么呢?
2016-02-17 19:50:50
18948
原创 Android运营商名称显示(原)
Android运营商名称的显示对用户来讲可能很少人注意到,但是对Telecomm的开发者来说,却有着不少的学问,虽然3GPP里面已经有明确的显示规则,但是在项目开发中却总能遇到各种特殊的运营商需求。在接下来的几节中我们就来对这个小小的字串显示进行分析。 Android平台的运营商名称主要显示在以下几个位置:1、锁屏时的状态栏,如图: 2、解锁后的下拉通知栏,
2016-02-17 19:41:07
7111
原创 Qualcomm平台qcril初始化及消息处理流程(原)
本节主要来介绍Qcril的初始化流程以及消息在Qcril中如何传递。Android平台不同厂商的AP侧可以相同,但是Modem侧肯定会有很大的差异,RILC要解决一个问题就是适配不同厂商的Modem,为了达到兼容性要求,Android在AP与Modem之间搭建了RILC的框架,由不同的Modem厂商将自己的协议连接到AP侧。对于高通平台来说,他的RILC就是QCRIL。
2016-01-30 17:58:35
13519
1
原创 Android短信发送流程之多收件人发送(原)
前面的《Android短信发送流程之长短信发送》中介绍了长短信对于普通短信的区别,而对于多收件人的情况,在SmsMessageSender的queueMessage()方法中我们了解到,发送之前,将多收件人的短信进行拆分,放入"content://sms/queued"队列中,在接下来的流程中,将会在SmsReceiverService中通过sendFirstQueuedMessage()方法取出
2015-12-12 08:54:44
3353
1
原创 Android短信发送流程之长短信发送(原)
从前面《Android短信发送流程之普通短信发送》流程看到,长短信与普通短信的流程从SmsManager的sendMultipartTextMessage()方法开始区分,现在我们来看长短信的流程: @SmsManager.java public void sendMultipartTextMessage( String destinationAddress, Str
2015-12-12 08:41:06
4296
1
原创 Android短信发送流程之普通短信发送(原)
我们先来看最简单的流程入手分析,即收件人只有一个,而且不是长短信的情况。一、地址有效性检测 当点击发送按钮时,触发onClick事件: @ComposeMessageActivity.java public void onClick(View v) { if ((v == mSendButtonSms
2015-12-12 08:25:59
7355
1
原创 Android短信发送流程(原)
在之前的《Android短信接收过程源码分析》一文中我们介绍了Android平台短信接收流程,本节我们来梳理短信发送流程。 本文的代码来自于Android L源码。 短信发送流程中,需要完成以下几件事务: 1、有效性检测 2、短彩信分离 3、长短新分离 4、权
2015-12-09 11:25:46
2043
原创 数据业务建立流程之发起网络连接过程(原)
经过前面这些过程,网络连接所需要的条件就全部准备就绪,接下来就是等待网络接入。 我们把网络接入过程简单分为三个阶段: 触发阶段 ----该阶段是由各种不同事件触发的,比如SIM载入完毕、PS域Attach成功、通话结束、APN改变等,该阶段的最终都是要调用setupDataOnConnectableApns()方法;
2015-11-03 10:47:08
10182
原创 数据业务建立流程之APN参数的激活(原)
APN参数在前面《数据业务建立流程之常规APN参数的创建》一文中已经都被创建完毕并存入mAllApnSettings的数组中,但是这些APN参数默认都是没有被Enable的,只有当APN被Enable之后,该APN才可以被使用,下面我们就来看如何将一个APN参数激活。 APN的Enable是通过TelephonyNetworkFactory中的needNetworkFor()方法
2015-11-03 10:33:28
6300
原创 数据业务建立流程之常规APN参数的创建(原)
区别于前面的紧急APN,这里的APN参数主要指常规的SIM卡APN参数,手机在上网时必须传递正确的APN参数给运营商才可以接入移动网络,而常规APN参数的创建是由监听器触发的。 前面在DcTracker初始化过程中注册了大量监听器,其中有两个监听器可以触发APN的创建过程:1、SIM载入完毕;2、APN改变。这两个事件所导致的APN创建流程也都是类似的,分别是:
2015-11-02 16:35:52
8971
1
原创 数据业务建立流程之DcTracker创建过程(原)
一、DcTracker介绍 DcTracker是Telephony框架中负责数据业务的核心(类似于GsmCallTracker是通话业务核心,GsmServiceStateTracker是网络CS业务的核心),所有对数据网络的请求(打开关闭数据开关、切换数据卡、修改APN参数等)都会发送到该处理中心来处理。本节所涉及的大部分代码也都在该对象中。下面我们先来看该对象的初始化
2015-11-02 16:19:39
10198
AsyncChannelDemo
2015-11-04
AsyncChannel测试Demo
2015-09-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人