Trade Off

supercalifragilisticexpialidocious

Dog-pile-effect

如果你的网站该去解决dog pile effect了,那应该有不小的PV了。今天看暴走漫画的架构设计,那是应对1000W PV的一个设计,当然架构这东西每家都不一样,可能这个就他们自己用着适合。里面提到了dog pile effect,这个的意思是:在多request去cache中拿数据的时候,如果发现自己拿的数据是过期了的,那么就要去db中拿新的来。这么看好像没问题,但有前提的——request很多,真的很多,而且确实用cache了(反正我不相信request很多的时候某些数据你不用cache,那得是个多么bt的db才能支撑啊?!)本来用cache的作用就是降低对某些slow query的执行次数,缓解db压力。但过期了,再去db中取这就和没有cache一样了,db会死的。

解决方法有这样的:

  • 有专门的job(比如crontab)来更新cache,这样request总是去cache取,不用管过不过期。好处就是简单;坏处是可能做一些没必要的重复计算,没有request你也更新了cache,而且你得确保这个job的执行时间要小于job的间隔,否则会积压很多job。
  • request取到数据发现过期,再请求一个update lock,成功拿到锁就可以更新cache,此时其他request也会请求这把锁,但就是请求不到,那就继续返回过期的数据。这是不容忍延迟的情况,如果对数据准确性要求高,那在updating的时候其他request会等,等数据更新了再返回。怎么用取决于environment。

引用自:http://hype-free.blogspot.jp/2008/05/avoiding-dogpile-effect.html,注意blogspot。。。

New-dev-env

终于把windows开发环境给换成Ubuntu了,顺便也去掉了虚拟机,原生开发的性能真好,一点都没有IO延迟的感觉,只能说Linux更加低碳。

很久没装过Ubuntu了,现在的安装过程越来越简单,而且体验也很好。需要注意的是,在安装时最好去掉下载更新这个选项,耽误时间不说,最后有个步骤,貌似是测试,超慢,我都睡着了。换成不下载更新,半小时内结束。

系统关机的效率比win7简直快了好几光年。。。至少几十倍的速度提升,有在使用SSD的感觉,顺便说一句,在使用SSD的Mac下也没得到那样的关机速度。不过发现合上休眠功能不管用,风扇仍然在转,发热量很大,可能缺什么驱动?以前关机慢,所以就不关了,现在可以考虑关机带走。

Ssh-proxy-with-autossh-in-mac

在Mac下原来一直用iSSH,好处是简单,功能够用,但有个缺点很致命,ssh有时候会断开,谁知道最终是什么原因导致的,但iSSH不会自动重连,只是提示你。在忍受了很久之后换成了autossh,它没有GUI,但可以在ssh断开后自动重连。

1.使用brew安装autossh,或者用其他工具安装autossh,包括手。

brew install autossh

2.配置你的海外主机,保证你可以不用密码登陆。无非就是在authorized_keys中加入你的public key。自己用ssh登陆只要不用密码了就ok。

3.用autossh连接。

autossh -M 20000 -f -p REMOTEPORT -D LOCALPORT xxx@8.8.8.8 -N

autossh就3个参数,-M、-f、-V,其中-V是显示版本,其余两个参数的意思看文档描述吧。

如果你没改远程主机ssh的默认端口,那就省略-p REMOTEPORT。

指定一个LOCALPORT,一般用什么1080,我用9998。

后面是ssh连接信息,最后-N表示port forward不用terminal交互。

4.(可选操作)如果你比较懒,希望login系统的时候自动帮你连接上ssh,Mac下使用launchd来做,推荐使用Lingon这个app,是个launchd的GUI。

添加一个My Agents就可以了,何时运行那里我勾选了at startup or login,生成的plist会放在~/Library/LaunchAgents/中,生成的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>autossh</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/autossh</string>
<string>-M</string>
<string>20000</string>
<string>-f</string>
<string>-p</string>
<string>9999</string>
<string>-D</string>
<string>9998</string>
<string>google@8.8.8.8</string>
<string>-N</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

至此,开机自动连接ssh,自由surfing吧。

Hhkb

终于,它来了。

HHKB

Nonexistent Bug

问题表现:IE6下,$.ajax()出现error,内容:No Transport

大约花了3天修复了一个不存在的问题。

第一天发现问题感觉这是一个大bug,可能因为它的表现真的很大,一下子就开始着手修复。很快发现这个bug没有正常在Log中找到记录,客户端还没有发送数据到服务器上,所以更难定位问题,因为在IE6下没有可用的js调试工具。

我委托了一个用户测试,她反馈说没问题,不过我没在意,以为她用错了浏览器或者其他问题导致的她可以“正常”使用。

第二天继续修复,Google前几页所有相关的页面都看了一遍,和这个问题的表现相同,不过根本不是一回事儿,为此去了jquery的IRC@freenode,还去了官方论坛发帖,在几个blog中留言反馈,均没有得到有效的帮助。

第三天,开始回退版本,无奈这个过程比较麻烦,主要是一些配置文件和改动不可能完全无错的回退。我又找用户测试了一遍,发现没什么问题,已经开始怀疑当初的判断。另找了一批用户机器,发现果真是没问题的。

重装了一台XP SP3,用里面的IE6测试,果然也没问题。

be-blocked-by-GFW

不知什么原因,我的VPS进入了全国路由监视节点。。。现实只要是谁打算ssh过去,就会被封锁一段时间。根据某人告知,这是进入短名单后的action,可以探测我换端口什么的操作,相信离IP被封已经不远了!

VPS啊,先提前和你说R.I.P.吧

End-sorted

暂时终止sorted的开发,经历了两天痛苦的、没白没黑的、浑浑噩噩的探索后,还是没能搞定iPhone上一个icon的移动过程。实在不行我都打算直接去修改iconstate.plist文件了。。。但就是修改了不能马上响应,需要respring这点受不了!

网上这方面的资料依然少的可怜,很多时间竟然是花在寻找headers文件了,最后才知道根本不需要。你只要有headers拿来看看就ok了,需要什么类的声明自己用@interface写在xm文件中就可以了。tweak的远离是做出dylib后加载,替代系统的api,headers文件对于你来说就是看,然后找需要哪些私有api即可。

过两天兴致来了或许又再搞一下。

Big-break-in-tweak-app-build

昨晚弄到1点多也没搞定iOSOpenDev,总是编译出问题,在irc上问了一下也没人回答我,看来还是有很多人在泡irc的!

睡前又看了一下各种文章,等起床打算还是回归theos搞搞试试。

没想到早晨用theos搞了一下竟然ok了!或许是用对了theos的版本?不清楚了。

theos我删掉了原来的,用github上的版本

1
git clone git://github.com/DHowett/theos.git $THEOS

ldid我自己编译的,因为dropbox上的总是很难下载

1
2
3
4
5
git clone git://git.saurik.com/ldid.git
cd ldid
git submodule update --init
./make.sh
cp -f ./ldid $THEOS/bin/ldid

有篇教程说在iOS上也安装perl和theos,我实在不清楚有什么用,不过我也安装了,蛋疼,具体方法看这里

headers用这里的:https://github.com/rpetrich/iphoneheaders需要注意一点的是IOSurface这个framework,你需要增加一个新的头文件,在Mac系统中,可能还得注释掉两行,这取决于你是不是10.7版本的Mac系统。命令是:cp /System/Library/Frameworks/IOSurface.framework/Headers/IOSurfaceAPI.h .,在251和255行(我编译错误时候提示的就这两行),注释掉

1
2
3
4
5
6
7
8
9
10
/* This call lets you get an xpc_object_t that holds a reference to the IOSurface.
  Note: Any live XPC objects created from an IOSurfaceRef implicity increase the IOSurface's global use
  count by one until the object is destroyed. */
//xpc_object_t IOSurfaceCreateXPCObject(IOSurfaceRef aSurface)
//IOSFC_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_NA);


/* This call lets you take an xpc_object_t created via IOSurfaceCreatePort() and recreate an IOSurfaceRef from it. */
//IOSurfaceRef IOSurfaceLookupFromXPCObject(xpc_object_t xobj)
//IOSFC_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_NA);

然后做你的tweak就可以了,我按照经典的heloworld例子搞了个hook,springboard中applicationDidFinishLaunching弹出alert,成功了。

OS:10.8.3,SDKVERSION:6.1

另外昨天说的设置theos的环境变量,我今天又重新加到了bash_profile中,发现make package install都能自动部署了。。。看来真是昨天theos版本的问题?!

Open-development-env-for-xcode

发现一个问题,使用theos这个makefile工具做app有很大困难,就是headers不好管理,真希望能集成到xcode中开发tweak,结果发现了一个神器—-iOSOpenDev。

安装好之后就能发现xcode中已经有很多可用的template了,对于tweak来说,有logos和CaptaionHook。logos就是theos,captainhook是另一个hook框架。

不过很可惜,可能是sdk6.1的问题,结合上springboard和uialertview后就从来没build success,总说armv7中的springboard link error或者uialertview linker error,是在不知道怎么办了,仔细又看了别人的做法,发现他们还在用sdk5.1,估计就是这点差异吧?

彻夜下载sdk5.1.。。。。。。

Build-up-env-for-sorted

找到了一篇教程,开始构建jailbreaken app的环境。

基本需要的工具

1
2
3
4
export THEOS=/opt/theos
svn co http://svn.howett.net/svn/theos/trunk $THEOS
curl -s https://dl.dropboxusercontent.com/u/3157793/ldid > $THEOS/bin/ldid; chmod +x $THEOS/bin/ldid
brew install dpkg(如果出错安不上dpkg,那就先update一下brew,我就遇到这么个问题)

用theos模板创建项目,$THEOS/bin/nic.pl,这会在当前目录中创建你的项目,选择模板类型,然后起名字之类的,填好就ok。

在创见出来的项目中有Makefile,里面有一个地方需要注意,就是xxxx_FILES=这里,后面的m和mm文件是你当前所有的,如果你自己加了新的,你需要手动添加进去。

再加两个环境变量

1
2
export SDKVERSION=6.1
export THEOS_DEVICE_IP=10.0.0.101

目标sdk版本,我用6.1了,后一个是手机的ip,自己弄到一个wifi中吧,后面部署需要。

make&make package,在make的时候不加sudo我会无法make成功。

1
2
sudo make
sudo make package

本目录下的deb就可以放到设备上安装了,安装命令是dpkg -i xxx.deb

不过你可以用部署的方式,make package install,他会依赖你刚刚设置的IP部署,但我这里似乎有问题,估计是环境变量的问题,光提示我找不到THEOS_DEVICE_IP

我就scp到了设备上,手动执行了dpkg的命令,然后respring竟然没效果,只好reboot了一下,看到了刚刚的app已经被安装上了!!!