Trade Off

supercalifragilisticexpialidocious

about-Sorted

早就考虑做这么一个app,不过拖延到现在了,再次佩服一下我的拖延症。

Sorted是这样一个app,安装上之后就会跟踪你使用手机上app的习惯,根据使用频率给桌面的app排序,估计等你用一段时间之后,第一页的apps就是最常用的了。

当然,这需要你的iPhone jailbreaken。

刚刚用iFile找到了存放app list的地方,在/User/Library/SpringBoard/IconState.plist,plist就像是python中的dict,里面两个key分别是:buttonBar、iconLists。

buttonBar中有个list,是底部Dock上的app标识,例如有:com.apple.mobilephone、com.apple.MobileSMS等。

iconLists中又是一个list,内容也是list,每个list表示桌面某一页上的apps。

不过有个问题是:如果我手动修改了这里的值,比如我交换某页两个app的位置,回到桌面并不会立刻看到效果,如果要看效果,需要respring…就是重启SpringBoard,这是我不能接受的。需要再看SpringBoard的私有api有没有提供这方面的支持了。

Generator-in-python

今天在代码中遇到一个next方法(python代码),以前从没用过这个,于是简单了解了一下。

next就是iterator了,可以通过iterator来找东西,找到就停下了,如果给了默认值,没找到的话就用默认值。

generator这个东西是很有意思的,比如:

1
2
3
4
5
6
def other_firstn(n):
 num, nums = 0, []
 while num < n:
   nums.append(num)
   num += 1
 return nums

可以产生一个list,里面是按顺序的数字,有n个,结果类似于range(n)的返回值。

还有一个版本的firstn:

1
2
3
4
5
def firstn(n):
 num = 0
 while num < n:
   yield num
   num += 1

这个看起来就很帅了,代码也简洁了很多,yield是十分神奇的表达式,产生了一个num,这里不太好想,不能按照正常的function来思考这个执行顺序了。

总之,如果产生100个数字,你可以一下子弄出100个来,或者你知道规则的话,你就弄出第一个来,然后用的时候按照规则,从第一个一直走下去,也产生了100个。最大的不同就是性能,后者必然速度更快了,前提是数量要足够多!写了一个简单的性能对比,主要是时间上的,内存上的不容易监控。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# /usr/bin/python
#! -*- coding: utf-8 -*-

import time

def firstn(n):
 num = 0
 while num < n:
   yield num
   num += 1

def other_firstn(n):
 num, nums = 0, []
 while num < n:
   nums.append(num)
   num += 1
 return nums


def timer(func_wrap, func, *args, **kwards):
 s = time.time()
 r = func_wrap(func(*args, **kwards))
 e = time.time()
 print 'return: %s   use %f ms[s: %s, e: %s]' % (r, (e - s), s, e)

def main():
 timer(sum, firstn, 1000000)
 timer(sum, other_firstn, 1000000)
 
 
 
if __name__ == "__main__":
 main()

输出结果是:大约会慢1倍

1
2
3
dawncold [21:49:11] ~=>$ python 1.py
return: 499999500000   use 0.137414 ms[s: 1363182552.38, e: 1363182552.52]
return: 499999500000   use 0.290716 ms[s: 1363182552.52, e: 1363182552.81]

Ckeditor Multi Instance in Ajax

初始化ckeditor后再用ajax刷掉页面,如果此时再次初始化它就会报错,说你要初始化的那个已经存在了。。。

此时需要检测一下是否已经存在,如果存在就remove掉:

1
2
3
4
5
6
if(CKEDITOR.instances['description']) {
  CKEDITOR.remove(CKEDITOR.instances['description']);
}
CKEDITOR.replace('description')

其中description是一个textareaname

Set Different Password for Amazon Account

不知怎么,突然发现在iPad上注册kindle设备后,在国内的amazon上无法看到这个设备,云端购买的书籍也都没了,深夜给amazon发了邮件,没想到十几分钟就回复了!!!

得知,如果在amazon美国用了和国内相同的账号,那注册设备的时候可能会被使用美国的数据,那里当然木有我买的书了。。。看来以后kindle要暂时和国际市场say byebye了。

解决方法就是给国内外这两个账号设置不同的密码,试了一下,解决!

Drop Not Null in Postgresql

要修改带有NOT NULL约束的某列为NULLABLE该如何写SQL呢?

ALTER TABLE xxx ALTER COLUMN xxx DROP NOT NULL

Encoder Error -2 When Writing Image File Error

今天编辑们在上传一张图的时候出了500错误,他们觉得是图片太大了,传给我看了下果然很大,高度13000+,大约7Mb,本地调试确实是在save的时候出问题,具体错误就是Encoder error -2 when writing image file Error,github上的pilkit中有这个issue,是因为默认的maxblock不够大了,其实PIL中还有个SAFEMAXBLOCK,但那也只是1024*1024,对于这张图仍然不够大。具体的方法就是取出图片width和height的最大值,再来个平方。。。

1
2
3
4
5
6
7
8
9
try:
  save porcess
except IOError:
  old_block = PIL.ImageFile.MAXBLOCK
  PIL.ImageFile.MAXBLOCK = max(image.size) ** 2
  try:
      save process
  finally:
      PIL.ImageFile.MAXBLOCK = old_block

这样试过后就好了。。。真要命啊这个max block

Extend in Jquery

jquery中的extend方法可以扩展一个{},今天用到了。写了一组配置文件:

1
2
3
4
5
6
7
var options = {
  data:1,
  data2:2
};

console.log($.extend(options, {data3:3}));
console.log(options);

这样的结果就是在extend之后optons已经被加入了data3这个key-value,因为默认extend使用的是deep copy,你可以$.extend(false, options, {data3:3}),这样就能够得到暂时的并且扩展了的options。

Do Something Using Refactor

最近在做发送短信的时候犯了个错误——修改配置文件没有使用重构方式。dev环境和pro环境中有相同名字的配置,只是值不一样,再修改了dev中的配置name做开发,但pro环境中的name还是原来的,导致上线后拿不到配置,发不出短信去。。。

以后为了防止遗忘,还是用重构吧!!!

Incrby in Redis

redis中的incrby可以让value+1,用这个的好处是:当你用setex给一个key设置了timeout之后,如果要再改变里面的值,比如加1,你再set回去的话就会丢掉timeout,这时用incrby就可以喽。

再没用incrby的时候我用了ttl先取出timeout的值,再用一遍setex附带上ttl,显得好傻。

Use Octopress Isolate Function

以前搜到过octpress的isolate功能,今天终于用上了,真TMD好用(除了操作稍微麻烦一点)

使用isolate的注意:filename是除了日期外的名字,有空格得用短杠隔开,比如我的这篇就得用rake isolate[use-octopress-isolate-function]才可以。还有啊,我希望isolate这个功能自动点不知道靠不靠谱,就是new_post就顺带着执行isolate,如果你一般不修改以前的post那还是可行的,实在修改的话只好integrate过来再isolate需要修改的那篇修改喽。

这样的话generate的速度会很快。