一直跑在亚马逊服务器上的一些Facebook应用,昨天抽风了,平时正常的页面都出现了504的timeout错误。Web使用的是Django,于是查看日志,发现N多记录:

SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /(ip x.x.x.x) !!!

write(): Broken pipe [plugins/python/wsgi_subhandler.c line 193]

然后看nginx的error日志:

[error] 16948#0: *21 upstream prematurely closed connection while reading response header from upstream

费了半天力气跟踪代码,发现是卡在调用facebook的api上,以前一直是好好的,怎么突然出问题了?

在服务器上尝试wget一下www.facebook.com,get不下来,才发现是亚马逊的DNS解析facebook的域名出问题了。于是调用facebook的api的那段代码就timeout了……

于是临时把DNS换成8.8.8.8,一切正常,坑爹的亚马逊……

VN:F [1.9.22_1171]
Rating: 10.0/10 (3 votes cast)
VN:F [1.9.22_1171]
Rating: +3 (from 3 votes)

最近在 OS X 下编译一些东西的时候常常遇到 Missing required libcurl dev >= 7.18.2 的问题,版本已经确认是最新的了,devel的也装了,还是不行。

Google了一下,这样搞: 

export LIBCURL_CFLAGS=-I/usr/local/opt/curl/include

export LIBCURL_LIBS=-L/usr/local/opt/curl/lib

记录下来备忘,免得下次再到处找。

VN:F [1.9.22_1171]
Rating: 10.0/10 (2 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 2 votes)

 将iPod touch 5的系统升级到了扁平化的iOS7,如丝般顺滑,比预想的要完美。很多不经意间发现的小细节让人发出雅典娜之惊叹。所以狗日的不要相信那些媒体的胡说八道,那些人根本就没有体会过即能写出各种奇谈怪论。纸上得来终觉浅,绝知此事需躬行。推荐升级安装。

然后是Xcode5,整个界面也是冲着扁平化的方向,怎么说呢,简约而不简单。总之就是更好用了。赶紧将以前写的一些app放Xcode5下编译,不少问题出来了。

首当其冲就是界面上的状态栏了,iOS7貌似默认程序就是全屏(fullscreen)模式,用半透明的方法将状态栏挡在后面,感觉有点怪怪的,比如:

要干掉它还真不容易,在iOS7之前,我们可以这样干:

[[UIApplication sharedApplication] setStatusBarHidden:YES];

但是现在无效了,怎么解?Google了一下,这么干:在app的plist文件中,添加两个属性:UIStatusBarHidden和UIViewControllerBasedStatusBarAppearance,顾名思义,就是用来设置状态栏的,如图所示:

搞定,收工。

VN:F [1.9.22_1171]
Rating: 5.9/10 (14 votes cast)
VN:F [1.9.22_1171]
Rating: +4 (from 6 votes)

刚刚安装Python的MySQL支持库,一口气遇到了一连串的问题,好在Google一下,均解决。遂记录下,备忘。

1.下载Python的MySQL支持库

地址:http://sourceforge.net/projects/mysql-python/

2.解压编译

python setup.py install

遇到第一个问题:

_mysql.c:44:23: error: my_config.h: No such file or directory

解决办法,编辑setup_posix.py文件,将mysql_config.path设置成你安装的mysql的目录,比如/usr/local/mysql/bin/mysql_config

3.在python中"import MySQLdb",遇到问题:

ImportError: libmysqlclient_r.so.16: cannot open shared object file: No such file or directory

解决办法,编辑/etc/ld.so.conf.d/mysql-i386.conf文件

改成正确的mysql安装地址,比如我的:usr/local/mysql/lib/mysql

存盘后退出,执行ldconfig

4.搞定,打完收工

VN:F [1.9.22_1171]
Rating: 10.0/10 (2 votes cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)

入手了 iPod touch 5,港版 32G,依旧是我最喜欢的黑色。想起最初入手 iPod touch 3 的日子,已经是 2 年以前了。第一次接触  iOS 设备,第一次有了 Apple 开发者账号,第一次囊中羞涩地在黑苹果上安装 OS X,调试 “Hello World”,后来有了自己的 iPhone4 、 MacBook Pro……

拿到 iPod touch 5 之后的第一感觉是,太轻薄了,如此强大的功能塞进如此薄的机身中,简直有种不可思议的感觉。相比 iPod touch 4代,5 代在各个方面都没有缩水的感觉,App 的打开速度和系统的流畅度,让人惊叹。瞬间觉得手旁的 Andorid 手机的光芒变得一下子黯淡起来。当然,也不是十全十美,没有自动感光元件,在半夜打开的时候,总是要去调一下亮度。

总结一下优缺点吧。

优点

1. 完美的屏幕和界面流畅度

2.  4寸屏的感觉更加舒适

3. 令人惊叹的轻,不可思议的薄

4. 500万的摄像头很爽

5. EarPods耳机很赞

缺点

1. iPod touch loop 总感觉不太牢靠,不放心,没扣上。

2. Lightning 接口插拔挺费力的。

3. 没有光感器,晚上和白天使用的时候需要时不时手动设置一下亮度

VN:F [1.9.22_1171]
Rating: 7.3/10 (3 votes cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)

写服务器程序的免不了要经常和 crontab 打交道,定时执行一些脚本什么的。大部分情况下都是 bash 的一些 shell 脚本,但 shell 我不是很熟悉,于是在很多情况下都直接写 Python 脚本来搞定它。今天写了一个操作 PostgreSQL 数据库的 Python 脚本,放到 crontab 中定时执行的时候,时间到了却没有任何反映。但是如果在命令行下直接执行的话,没有任何问题。

首先看看 crontab 的日志(/var/log/cron),日志中显示脚本定时执行了。那么一定是在 crontab 运行该脚本的时候报错。直接在 Python 脚本中从第一行开始写一个大大的 try 模块,显示一下 Exception 的内容。果然,抓到了…… 错误日志显示显示 Python 找不到 libpq.so.5 这个 PostgreSQL 的库。

原来 crontab 的运行环境和我们用 root 登录进去的环境都是不同的,需要在运行 Python 脚本前重新设定一下运行的环境变量如 LD_LIBRARY_PATH。这下比较好办了,直接写一个 shell 脚本,设置一下环境变量,再调用 Python 吧。 libpq.so.5 这个库我是装在 /usr/local/pgsql/lib 中。最后的脚本如下:

搞定,crontab 又跑得欢快起来了。

折腾了一个上午,写下来备忘。

VN:F [1.9.22_1171]
Rating: 9.6/10 (24 votes cast)
VN:F [1.9.22_1171]
Rating: +2 (from 4 votes)

ssd

装上 SSD 后的确是如飞一般的感觉,开机只需要数秒钟,运行大型程序、编译代码、文件拷贝等各种操作的速度均非常之快。惟一的苦恼就是系统盘 128G 的空间对于庞大的 Lion 系统加上 Xcode 、Abode CS5 等大型软件来说,确实有些捉襟见肘。整理了一下硬盘,将一些不常使用的大块头文件都放到机械硬盘中去,然后用 ln 命令直接做软链接过去。

分析了一下磁盘空间,发现 iTunes 中的电影、App、音乐文件等最为大头,好几十个 G。本想全部拷到机械硬盘后做软链接过去,发现 iTunes 似乎只认本地,没有效果。于是在网上找到了一个 iTunes 目录搬家大法。

其实 iTunes 本身就支持自定义目录的,诀窍就是按住 option 键启动 iTunes。这时 iTunes 就会询问你是否要自定义它的所在目录,如下图所示:

iTunes

可以先将 ~/Music/iTunes 目录全部拷贝到另一个硬盘上,然后在上面的界面中选择“Choose Library…”,将其指到刚刚拷贝出来的 iTunes 目录中,就一切搞定。

没有问题的话,就可以将系统盘中的 ~/Music/iTunes 目录给删除了,一下子几十 G 的空间就腾出来了,快哉。

VN:F [1.9.22_1171]
Rating: 10.0/10 (1 vote cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)

 

一直觉得 Android SDK 本身提供的界面 UI 库实在是太难看了,而且提供的功能也总是这里那里很多缺憾。所以一直在关注各种第三方的 UI 组件,很多不错的库收费又挺高的。在论坛上大家都推荐开源的 GreenDroid,一款增强型的 Android UI 库,可以实现自定义的 TabBar、SegmentedBar、ActionBar、PagedView等 UI 实现,于是下回来开用。

GreenDroid的地址:https://github.com/cyrilmottier/GreenDroid

下载回来后,把目录中的三个 project (GDCatalog、GreenDroid、GreenDroid-GoogleAPIs)都 Import 进Eclipse,如果没有报错,就一切正常。

如果编译的时候报 run() 函数错误,需要将 Java 的编译器设置到 1.6 及以上版本。在项目上点击右键,选择属性,在左侧选中“Java Compiler”,将编译器的 level 设置成1.6,如下图所示:

GreenDroid-GoogleAPIs 需要将 Compiler 设置成 1.5 才能正常编译。

在自己的项目中点击右键,选择“属性”,在界面左侧选择 Android,右侧会出现两个选项框,在下面的 Library 中,点击"Add"按钮,将 GreenDroid 添加进去,如下图所示。

现在就可以使用 GreenDroid 的各种 UI 界面库了。在 GDCatalog 项目中,是各种 UI 的使用方法和源代码,可以直接编译到手机上运行。需要的时候,随时查阅源代码就能找到使用方法。

VN:F [1.9.22_1171]
Rating: 8.0/10 (40 votes cast)
VN:F [1.9.22_1171]
Rating: +4 (from 4 votes)

android

最近项目需要,在 Android 手机上做测试的时候,需要频繁修改 Android 系统中的 hosts 文件。装了些终端控制台软件,因为手机上没有功能键(如ESC),进行诸如 vi 等操作的时候,实在是太坑爹了。本想安装 sshd 来远程 ssh 登录到手机上,也很麻烦。Google 了一下,其实可以直接用 Android SDK 提供的 adb 工具直接登录手机。

操作如下:

1.将手机与电脑用数据线进行连接。

2. 进入Android SDK的目录:比如我装在 ~/android-sdk-mac_86/platform-tools

3.运行 ./adb shell

4.此时已经登录进了 Android 手机,运行 su 命令获得 root 权限。此时手机可能会弹出权限控制的对话框,同意即可。

5.此时手机的文件系统是只读状态,运行命令:mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system

6.此时文件系统已经可读写。大功告成,想怎么折腾就怎么折腾吧!

android_root

VN:F [1.9.22_1171]
Rating: 10.0/10 (2 votes cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)

 在学习 Android 开发的过程中,经常调用一个类的方法的时候,总想按住 command + 鼠标左键 去点击这个方法,试图进入该类的源代码中看看是怎样实现的,但屡屡都报找不到 Android 源代码的错误。不爽,于是就干脆去下源代码好了。

Android SDK 官方源代码的下载地址:http://source.android.com/source/downloading.html

按照上面的教程一步一步来,就可以很方便地将源代码拖回到本地硬盘上,占用了我硬盘 9 个 G 的空间!不过这个教程是针对 Linux 或 Mac OS X 系统的。

然后在 Eclipse 中点击项目中的 android.jar,在右键菜单中选择“属性”,Location 指向刚刚下回来的源代码库的根目录,硬盘一阵狂响,搞定。

源代码全部出来了,很爽有木有?

VN:F [1.9.22_1171]
Rating: 10.0/10 (6 votes cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)