CocoaPods Podspec for Static Library

新建 podspec 可以用命令 pod spec create YourLibrary 自动生成 YourLibrary.podspec,然后根据具体项目进行修改。对于 libYourLibrary.a 形式的静态库需要注意的地方:

s.source_files = '*.h'
s.preserve_paths = 'libYourLibrary.a'
s.library = 'YourLibrary'
s.xcconfig = { 'LIBRARY_SEARCH_PATHS' => '$(PODS_ROOT)/YourLibrary' }

preserve_paths 可以用 *.a 模糊匹配或指明静态库名,LIBRARY_SEARCH_PATHS 指定路径。

参考 CocoaPod/Podspec and *.framework

Reload HAProxy on the fly

haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)

Performance on Optimization

Donald Knuth:

Premature optimization is the root of all evil.

高性能的程序是一个程序员应该有的追求,但是过早的性能优化往往起到反作用,浪费时间,拖慢进度等等。如何尽量少的优化投入同时达到高性能?

  1. 一个高性能框架,赢在起跑线,比如 ngx_lua
  2. 一套成熟高效的技术架构解决方案,比如 Tornado + PostgreSQL + Redis。
  3. 一开始就按照最佳实践写代码,把常规需要优化的地方降到最少。
  4. 不要只局限于软件层,硬件升级往往比软件优化更给力,比如 SSD。

Vim 文本选择范围

Vim 文本选择时可以用 a i 指定选择范围。a 代表一个整体(block),i 代表 inner。比如:

vaw 包括单词和单词后的空格,viw 只选中单词。

vat - select a tag block, 包括 <tag></tag> 本身,vit - select inner tag,只选择 <tag></tag> 包起来的部分。

vab 选中包括 () 在内的文本,vib 不包括 () 自身,等同 va( va), vi( vi).

vaB 选中包括 {} 在内的文本,viB 不包括 {} 本身,等同 va{ va}, vi{ vi}, 类似有 va[ vi[

vip|vis 选中一段落文字,vip = visual inner paragraph. vis = inner sentence.

v 换为 d 是就变成了删除操作,删除范围同上。

查看帮助 :help v_<whatever>.

Only When

Well you only need the light when it’s burning low
Only miss the sun when it starts to snow
Only know you love her when you let her go

Only know you’ve been high when you’re feeling low
Only hate the road when you’re missing home
Only know you love her when you let her go

Let Her Go

Moving

如果我提前离开北京,那么房子可能是最大的原因。并不是要买房,而是租房都不让人省心。我只是想踏踏实实的租房,但现实是,房东嫌麻烦一般都把房子交给中介,无良中介又很多,让人心烦。 2013-03-03

来北京后第一次搬家,离开住了将近四年的天通苑。

一直很抗拒搬家,因为找房子搬家是个麻烦事,而我自己不知道从什么时候养成了一个毛病:事情在开始时候过于关注困难的部分,放大了可能出现的问题。这样的结果就是前期过于悲观,继而可能会影响自己的心情。这次也是如此,找房子时候烦中介,收拾东西时嫌东西多又不舍得扔,搬家还得找车找人,连续几天心情都是忽好忽坏。

这个毛病的“好处”就是如果事情发展没有想象中的那么困难,那会非常有干劲,因为最坏的情况已经有了思想准备,后续的发展都可以轻松接受。其实回过头看搬家也没有那么恐怖,我们之前遇到的问题是东西平铺开摆放没有规划,在收拾时就显得很多很杂;中介问题其实也不必过于担心受骗,大一点的中介公司还是很规范的。

Happy Moving.

Money

没钱,意味着失去了选择的能力。

缺少的不仅仅是选择的权利,还有为人生下赌注的资本。

你没钱,你放弃的成本就更高。

转两句从知乎看到的,然后提醒自己:

Money is like gasoline during a road trip. You don’t want to run out of gas on your trip, but you’re not doing a tour of gas stations. You have to pay attention to money, but it shouldn’t be about the money. – Tim O’Reilly

平滑升级 Nginx

Nginx 可以在不中断服务的情况下平滑升级,很是方便。

  1. 安装新版 Nginx,如果旧版本是编译安装可以通过 nginx -V 查看编译参数。默认会安装在同一目录,旧版本重命名为 nginx.old。

  2. kill -USR2 old_nginx.pid,old_nginx.pid 会被重命名为 nginx.pid.oldbin,然后用新版 nginx 启动全新 master 和 worker。

  3. 现在新旧版本会同时服务,共同处理请求保证服务的不间断。kill -WINCH old_nginx.pid 来逐步关闭 old worker。

  4. 待 old worker 完全退出,新版本工作没有问题,用 kill -QUIT old_nginx.pid 完全退出旧版,nginx.pid.oldbin 会被自动更新为 new_nginx.pid,升级完成。

  5. 如果新版本有处理失败,需要回滚旧版,用 kill -HUP old_nginx.pid 重新启动 old worker,kill -QUIT new_nginx.pid 退出新版本。

More:

通过自签名 SSL 证书分发安装 IPA

iOS 7.1 通过 itms-services:// 安装 IPA 时要求 ipa.plist 必须 HTTPS 环境,不然会提示证书错误而无法安装。简单解决可以把 ipa.plist 放在 Dropbox 等支持 HTTPS 访问的地方,不过这样就不方便一键打包部署。其实可以通过自签名的 SSL 证书来解决这个问题。

1.创建自签名 CA 根证书,方便自动信任该 CA 所签发的证书:

openssl genrsa -out CA.key 2048
openssl req -x509 -new -key CA.key -out CA.cer -days 730 -subj /CN="Custom CA"

2.将 CA.cer 通过邮件等分发安装到设备作为信任证书。

3.创建 HTTPS URL 需要的密钥和证书:

openssl genrsa -out ipa.key 2048
openssl req -new -out ipa.req -key ipa.key -subj /CN=ipa.site.com
openssl x509 -req -in ipa.req -out ipa.cer -CAkey CA.key -CA CA.cer -days 365 -CAcreateserial -CAserial serial

4.上传 ipa.ceripa.key 到服务器,比如 /etc/nginx/ssl 目录下。

5.设置 Nginx 使用自签名证书:

server {
    listen  443;
    server_name  ipa.site.com;

    ssl on;
    ssl_certificate /etc/nginx/ssl/ipa.cer;
    ssl_certificate_key /etc/nginx/ssl/ipa.key;

    location / {
        root /home/fannheyward/ipas;
        index  index.html index.htm index.php;
    }

    gzip on;
}

6.注意修改脚本里 ipa.plist 地址和 ipa 地址为 HTTPS.

Take Action Now