Trade Off

supercalifragilisticexpialidocious

Log2n和log3n

merge sort的时间复杂度,log2n,曾经在算法书上看到过,相应的,merge sort也可以三分,复杂度变成log3n,好像还不错,但差多少呢?

log3n=log2n/log2(3),也就是只差了1/log2(3)对于看起来还更大。一般算法复杂度是log2n表示就是这个原因,loga(n)和log2n差不了太多,都是常数级别的差距,而且在复杂度分析的时候都会忽略常数,所以就简记为log2n复杂度了:)

Md5 Digest

对于一个字符串做md5,例如:"123456"做完md5后,比较常见的结果是:2e08539049ac0f6b5b4377ec20145c06,即十六进制的表示形式,长度一般是32位,有人也用16位的表示,就是把32位的字符串前后各去掉8位后的结果,但不多见。还有就是用md5的digest值,这是一个16字节的字符串,不容易看,但可以转换成ascii后观察,比如上面的digest就是:[46, 8, 83, 144, 73, 172, 15, 107, 91, 67, 119, 236, 32, 20, 92, 6], 如果你还看不清的话,可以考虑把这些ascii转成十六进制再看看:['2e', '08', '53', '90', '49', 'ac', '0f', '6b', '5b', '43', '77', 'ec', '20', '14', '5c', '06'],是不是很熟悉了,对就是一开始那个32位长的字符串。

在对某通的接口开发中遇到对发送数据校验,文档中说的是对数据进行md5再做base64,通常就是把那个32位长的字符串做base64,但怎么也对不上,后来再研究发现其实是用digest的结果做base64,太坑人了是吧,文档这个东西,能写详细就写详细点,没坏处。

Dive-into-tornado

早就有这样的计划,要深入了解自己在用的工具,veil算一个,tornado算一个,flask算一个……当然还有好多,总得一个个看一番,好在这些库都写得足够简单,不至于一下子看不懂,而且借助pycharm这样优秀的工具,一步步跟踪代码也给深入理解框架极大的帮助,所以,开始吧。(也好久都没更新过技术博客的内容了)

终于可以再让Mac发挥发挥余热了,pycharm用的社区版,估计对于学习够用了。tornado升级到了稳定的3.2版,也是目前的最新版,先慢慢研读官方的文档,再慢慢看完api。

在写hello,world例子的时候,处理GET我直接就下意识返回了想要的字符串,没想到运行起来是500 error,仔细一看原来官方的例子中处理GET是要调用self.write('xxx'),然后我就看了下self.write做了什么,self是我定义的class,但这个class继承自tornado.web.RequestHandler, 于是看tornado.web.RequestHandler的write做什么,write的参数叫chunk,并不是简单的叫str之类的东西,也就是说不限于str,有可能是些别的东西,比如注释中说如果你write了一个dict,tornado会转换成JSON,并且把Content-Type给你设置好,现在的veil也支持了这个优秀特性。还提到了list不会被转换成JSON格式,因为一个漏洞(坑),具体看这里,简单讲,就是用script的src指向一个网站需要登陆后才能访问的地址,因为你如果登陆过的话,cookie信息会随之发送到这个地址,此时如果你去了一个邪恶的网站,他里面有些脚本,引用刚刚提到的你需要登陆的网址,你浏览器会把你的一些信息带上,请求这个地址,这个地址会返回一些你的个人资料,比如是用JSON的array回给你,但邪恶网站把javascript array的constructor改写了,你拿到JSON的array会被自动转成js array,这样邪恶网站会收集到你的信息,然后再发送回自己一个接受数据的接口就可以了。避免方法就是:返回JSON的时候用对象方式;这种关键信息用POST提交,script标签只会发送GET请求;现代高级浏览器都不会有问题,大可放心。转换成了byte string(就是str)放入chunk_buffer,一起写到output。

我们的handler很简单,实现了get方法,然后write了一个字符串,但后来呢?或许应该从另一条路看起——从url被映射到handler看起。

Return-value-in-jquery-json-datatype

向api server发送请求做一件事的时候,比如修改密码,server做完后没有返回值,response code是200。这在原来的时候没问题,“原来”是指ajax的dataType未指定的时候,jQuery会自己猜测用什么,但这次指定了server的response是json,所以,即便是看到200 code也未能调用OnSuccess,空返回值对于json是不合法的,于是返回一个什么东西就好,当然要先to_json再返回。

Nginx-and-dependences

1
2
3
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.34.tar.gz
wget http://www.openssl.org/source/openssl-1.0.1f.tar.gz
wget http://nginx.org/download/nginx-1.5.8.tar.gz

default install pcre and openssl

1
2
3
4
5
6
7
8
9
10
nginx configure
+gzip


Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + md5: using system crypto library
  + sha1: using system crypto library
  + using system zlib library

Lxml-and-dependences

1
2
3
sudo apt-get install libxml2-dev
sudo apt-get install libxslt1-dev
sudo apt-get install python-dev  (if Python.h: No file or dir..)

Daemon-in-nginx

最近要把bnly重新运行起来,前两天整理了cli版本的程序,放到https://github.com/dawncold/bnly-cli,另一个web版的放到了bitbucket上的私有仓库,准备做部署的时候用,没想到bitbucket最近没有被kill,难道放开了?

用supervisor做进程管理的时候被nginx坑了,由于nginx的配置很强大,现在还处在搭建环境的初期,很多配置写不完整,导致了nginx总是在频繁启动,log中看到的是80端口已经被占用。。。找了半天只有nginx占着80,而且又不会开多个nginx(supervisor的配置中没有明确说开多个程序,默认一个),搜了挺长时间都没有结果。

突然想到了daemon。

nginx的文档建议生产环境应该off,但这个和我遇到的问题无关。默认daemon开了,supervisor运行后会认为nginx退出了,再启动一个,其实上一个已经启动成功,所以就总看到80端口被占用,于是在nginx的配置上加deamon off即可。

是不是很坑?

Object.keys-and-JSON-in-IE6

下单页面用到了js中的JSON和Object.keys,都是坑。

JSON虽然是build-in的JSON parser和stringify方法,但IE6,7,8(Q)都是无法使用的,如果用jQuery的话,可以用jQuery的parseJSON来解析,但stringify的话需要依赖第三方库或者自己实现,我用了JSON3.js这个库。首选build-in的parse和stringify方法,如果没有就实现。github地址:https://github.com/bestiejs/json3

同样的Object.keys()因为不能在IE9下使用,因为要取一个Object的keys数量,有的时候是用Object的keys列表,所以以后为了兼容,就只能:

1
2
3
4
5
6
var keys = [];
for(var p in obj) {
  if(obj.hasOwnProperty(p)) {
      keys.push(p);
  }
}

Useful-shell-command

找到size为0的文件,并删除:find -type f -size 0 | xargs rm

替换Linux的换行成windows的:ls | xargs perl -i -pe 's/\n/\r\n/g'

批量改名哦(把.md改为.markdown):

1
for i in `ls *.md`;do mv $i `echo $i | sed 's/.md/.markdown/'`;done

Upgrade-to-linode-for-not-waiting

上个月买了linode的vps,不知道干什么用,光翻墙了,月底干脆就关了,觉得这样翻墙的成本太高了,完全可以租个便宜的vps来用,后来觉得还是linode好。

在用linode之前用过digitalocean,那时候DO刚刚起步,速度不错,主要是华人不多,而且价格一如既往的便宜,公司决定买这个翻墙用,但后来速度一天天慢下来了,看到最近DO的推广力度增大,可能这就是为啥速度不理想的原因。

prgmr.com是个不错的vps,技术感超强,但很可惜在公司速度很好,160ms的ping延迟,不过回到家发现延迟到了400+,真不明白网络就能差这么多。好处是能不交费先用一段时间体验,support很好。

ramhost.us据说也不错,不会超售,在家wget一个文件速度上了400+,可惜就那么一次,也不知道是不是那一次把所有RP全用光了,后来怎么都是个位数的速度。同样技术感很强,缺点就是support靠人,站长貌似也不总是盯着这个,没拿到trial来试试。

其实vpsee这个也能考虑试试,linuxtoy.org放在上面,感觉访问速度挺好,价格10刀,不算是便宜,但和linode比便宜一半了。以前用过几个月的vps,很稳定,被GFW过IP,站长免费给换,总之一切都好。

最后是linode,又回来了,很早很早的时候,大约是初中那会,对建站很感兴趣,那时候还没有流行vps,都是shared hosting,当时买过hostmonster的一年服务,没做啥东西,算是浪费了吧。后来过了挺长时间逐渐接触到vps,用过yardvps,amazon的也试过,那时候没法买linode,因为信用卡,就想着哪天能有信用卡了就可以自由买这个了,现在确实能买了,也不知道买了干嘛了,以为能做个app,但终究没想出来做什么。好在能解决访问Google等网站时候的延迟,有时候大脑在想一件事,google一下结果,此时慢了,可能又跳跃到别的事情上了。或许人和人不太一样。

Linode Referral URL:https://www.linode.com/?r=84379f19216416e48085518afcde3beb02aee9c8

Linode Referral Code:84379f19216416e48085518afcde3beb02aee9c8

如果用这个code注册linode,在你用满3个月的时候我们彼此能够得到20刀的奖励:)