安卓开发领域,很多重要的问题都有了很好的开源解决方案,例如网络请求 OkHttp + Retrofit 简直就是不二之选。“我们不重复造轮子不表示我们不需要知道轮子该怎么造及如何更好的造!{:target="_blank"}”,在用了这些好轮子将近两年之后,现在是时候拆开轮子一探究竟了。本文基于 Retrofit 截至 2016.6.23 的最新源码{:target="_blank"}对其进行了详细分析。
继续阅读 »
RxJava{:target="_blank"} 这个项目已经持续四年半了,第一个 commit 是在 2012 年 3 月 18 号。我从 14 年 11 月份开始使用 RxJava,应该算是比较早的,将近两年过去了,现在 RxJava 1.x 版本已经进入稳定期,2.0 版本也已经进入了 RC 阶段。
继续阅读 »
定义
基数排序(英语:Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
more
算法步骤
将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。
然后,从最低位开始,依次进行一次排序。
这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由
继续阅读 »
Python的递归调用栈的深度有限制, 可以通过sys.getrecursionlimit()查看。
尾递归在很多语言中都可以被编译器优化, 基本都是直接复用旧的执行栈, 不用再创建新的栈帧, 原理上其实也很简单, 因为尾递归在本质上看的话递归调用是整个子过程调用的最后执行语句, 所以之前的栈帧的内容已经不再需要, 完全可以被复用。
需要注意的是, 一定记住尾递归的特点是: 递归调用是整个子过程调用的最后一步, 否则就不是真正的尾递归了, 如下就不是真正的尾递归, 虽然递归调用出现在尾部:
def fib(n):
if n == 0:
return 0
elif n == 1:
继续阅读 »
定义
插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
more
算法步骤
插入排序算法的运作如下:
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后
重复
继续阅读 »
之前团队对外推出了Juno all-in-one离线傻瓜式安装镜像和镜像的使用方法(传送门:这里和这里)。相信很多基于Juno版本学习和开发的童鞋会有这样的需求:对很多东西尚不精通的你,对OpenStack代码一通修改,然后发现自己的环境凌乱了,多了iscsi链接,以及一些你自己暂时弄不明白的虚拟网络设备……。于是,你的第一个想法肯定是重装,反正ISO很方便。今天,孔老湿告诉你:ISO是很方便,但是,还有更方便的方式!
原理其实很简单,就是在你成功安装Juno后,创建虚拟机,然后再用all-in-one ISO启动虚拟机,将虚拟机数据再导出为镜像。以后,直接用镜像创建虚拟机即可,不用再等待ISO的安装了。
废话不多说,直接上图上
继续阅读 »
有些网站的导航下面会有一到杠,鼠标在各个导航之间移动的时候,这一道杠也会跟着动,很好看,就像这个
See the Pen ooo-nav by Oliver (@ochukai) on CodePen.
我把她叫做小精灵。
原理
实现这个其实不难,当鼠标移动到某一个菜单上面时,小精灵滑入(至于方向,如果鼠标从右边进入菜单,那就从右向左滑),然后当鼠标移出时,小精灵跟着也移出菜单, 同时如果鼠标恰好移进了另一个菜单,下一个菜单的进入动画也开始播放,连续起来的话就像是小精灵跟着过来了。
实现
菜单
菜单的话当然是用 ul 来实现了
html
我的
导航栏
非常
牛逼
小精灵
这个小精灵该怎么实现
继续阅读 »
之前玩了下http://reg007.com,他可以判断手机号或者邮箱在哪些网站注册过.
于是试着写了一下判断帐号是否在淘宝注册的脚本.
原理很简单,就是用该帐号登陆,判断返回的页面是不是用户名与密码不匹配..只不过跑的次数太多了会出验证码,没有研究过怎么过验证码,所以还没办法测试大量的帐号.
用到了re,urllib2,request库.request用于简化登陆步骤,re正则简单判断返回页面有无关键字
继续阅读 »
使用Token来做身份认证在目前的移动客户端上非常流行,Token这个概念来源于OAuth认证,主要是在服务端实现。关于相关的原理,同学们自行百度。在这里,我简单介绍一下我是怎么具体实现的,重点描述token生成、token识别及token缓存。
生成Token
服务端接收客户端传递的username和password等请求,在数据库中检查,如果用户名密码匹配的话,表示登录成功,服务端生成并返回一个token访问令牌。
```php
public function login()
{
$data = array_merge($this->request->post(), []);
//
继续阅读 »
生产环境之运维
最近在生产环境上游历了一番,大版本升级,流量控制,问题的追根索源,甚是各种艰辛。
线上资源配置问题
池化连接
必须清楚了解业务进行设置
主要是连接数个数与闲置回收的时间: 防止连接数瓶颈。
超时设置:防止在网络抖动或者数据库不可用的状况下,业务核心线程被阻塞,连接池爆浆。
e.g. 数据库连接池
池的最小最大值(不同数据库需)
从DPCP获取连接超时
连接超时
读超时
socket超时
重试次数与每次重试相隔时间
NoSQL
容量 (dimension)
TTL
连接管理
Dev提供友好的配置指引,工程公式及原理,让Ops了解当前系统在不同的部署环境下如何合理配置系统资源。
系统连接数及计算公式
客户端(e.g
继续阅读 »