python makes me happy :)

这几天用 Python写了个Android Market web client,新手上路,却出奇的顺利!apache2 + mod_python, mod_python 里的req很好用。本想用ruby写的,可是ruby对protobuf支持不是很好,php更没份了,在jsp与psp犹豫了一下,还是选择了后者。我问wayhome,有没有python psp的资料,他愣住了,说没有,psp是什么?我再补充,不是psp游戏机哦,是Python Server Pages,你搞python这么久不会没听说过?后来他说写cgi都用PEP333。搞什么,弄了大半天,原来psp是早已过时不用的技术了。

听说python的框架Django牛气轰轰,堪比Ruby之Rails,我翻了一下,弄懂这玩意,也需要花不少时间。弄几个页面,还是写cgi快,维护BBS都用C写过cgi,还怕不会用脚本写cgi? python的语法跟ruby差不多,以前在曾厝庵学生公寓图书馆看过一个下午,长时间不用也忘记光了,工作中很少用到,好像是安装项目管理软件Trac调试过,不过看apache error log,一般问题都可以诊断出错误位置。

人生真是阴差阳错。一直关注C/C++, PHP,Ruby,我想不会再学Java,Python之类的了。没想到今年工作主要是写Java程序 :( 用什么,就学什么,现学现用。哲学家告诉我们:变化是永恒的,没有一劳永逸。

参考资料:
http://modpython.org/live/current/doc-html/pyapi-psp.html
http://www.python.org/dev/peps/pep-0333/
http://www.djangobook.com/en/2.0/chapter01/

反编译Android market Vending.apk包

主要是工作的缘故,Market时不时登录不了,东试这个rom,西试那个rom也不是解决办法,横下心来,决定fuck 她一下。

从今年5月份开始到现在,断断续续的干这事,用反编译工具apktool,ddx左右开工,下班回宿舍常常搞到两三点,弄得身心疲惫,已经完成了90%,2.5w行的代码,最后的10%将是最难的,集中分布在 try catch throw, 多层的if for 结合,不好处理。都是用最原始的方法: edit-compile-decompile-diff-edit,一直循环。手工反编译出来的代码已经可以阅读,需要再搞清楚它的protobuf协议,api,慢慢消化。有时间,用Rails写个网页,提供web浏览。反编译的Vending.apk是1.5版本的,跟最新的2.2差别太大了,也许最初的决定,是一种错误。这过程,除了锻炼我的牛力,学习熟悉Java之外,剩下的是无尽的空虚,浮云,都是浮云!

这事就这样暂停吧,接下来花时间去阅读Android的代码,过段时间有力气了再回头继续fuck。

转眼到了10月中旬,快过年了,三年的工作合同将满,下一步不知道去哪好,也向往搞一个像 37signals那样的公司,两三个人,崇尚简单即是美,上帝赐予我力量吧。

Android设置显示本机号码

本机号码,我觉得是没有多大的用处,几乎谁都会知道自己的手机号码,但也有用户真的需要这个功能。有个对讲机软件tikl – touch to talk,可以通过网络进行多方通话,需要用到本机号码。 测试短信的脚本,自己给自己发短信,也需要本机号码。

Android手机在 设置-关于手机-状态消息,可以查看到本机号码,很多情况是显示未知。 很多模组用AT+CNUM 这组AT命令可以设置与查询本机号码。一般的手机在查看本机号码的界面都可以添加本机号码的,比如MTK/展信手机都提供这个功能。 Android对卡的操作,都是直接读写卡上的信息,用比较底层的AT+CRSM,而不是常用的AT,比如 AT+CMBR, AT+CMBW,AT+CNUM等。

Android手机设置本机号码,目前我还没发现有工具可以设置,很多人是把SIM卡拿到可以设置的手机上设置,然后把卡重新插上。 不过,Froyo提供了内部接口方法Phone.setLine1Number(),CM6的通话设置里就加入了本机号码设置功能:

具体的代码,在这里看清清楚楚:

http://github.com/CyanogenMod/android_packages_apps_Phone/commit/5351ce8247eb9fc9a3bf2ec751d14dcd373ab92e

可能需要到github注册个帐号,才可以浏览代码,主要是在phone里面添加处理,独立写个小程序的话,比较麻烦,因为要访问PhoneApp。

更新: (2010-11-15) 今天试了一下,参考Settings, 共享一个sharedUserId,也可以写个独立的程序,在g1 2.2,HTC desire上测试通过。注意:Android 2.2以下的无法使用。

安装日志分析工具awstats

之前用Google Analytics分析网站,觉得多一次请求,对用户不太好,于是自己分析统计apache log。大约花了一个小时安装测试awstats,比预期的要顺利。

服务器是fedora,用yum安装很快。
[root@athena~]# yum install awstats

用默认的安装方法,/etc/httpd/conf.d/ 目录下面已经有了awstats.conf,如果没有,复制一个过去
# cp /usr/share/awstats/tools/httpd_conf /etc/httpd/conf.d/awstats.conf

编辑 /etc/httpd/conf.d/awstats.conf文件,默认的是:

<Directory "/usr/share/awstats/wwwroot">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from 127.0.0.1
</Directory>

如果是外面的服务器,将 127.0.0.1改为 all

[root@athena~]# cp /etc/awstats/awstats.module.conf /etc/awstats/awstats.broncho.cn.conf
编辑/etc/awstats/awstats.broncho.cn.conf, 修改下面三项即可:
SiteDomain="broncho.cn"
LogFile="/var/log/httpd/broncho.cn_access_log.%YYYY-0%MM-0%DD-0"
Lang="cn"

[root@athena~]# cd /usr/share/awstats/wwwroot/cgi-bin
[root@athena cgi-bin]# ./awstats.pl -update -config=broncho.cn

发现:

Create/Update database for config “/etc/awstats/awstats.broncho.cn.conf” by AWStats version 6.8 (build 1.910)
From data in log file “/var/log/httpd/broncho.cn_access_log.20100927″…
Phase 1 : First bypass old records, searching new record…
Searching new records from beginning of log file…
AWStats did not find any valid log lines that match your LogFormat parameter, in the 50th first non commented lines read of your log.
Your log file /var/log/httpd/broncho.cn_access_log.20100927 must have a bad format or LogFormat parameter setup does not match this format.
Your AWStats LogFormat parameter is:1
This means each line in your web server log file need to have “combined log format” like this:
111.22.33.44 – - [10/Jan/2001:02:14:14 +0200] “GET / HTTP/1.1″ 200 1234 “http://www.fromserver.com/from.htm” “Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)”
And this is an example of records AWStats found in your log file (the record number 50 in your log):
113.227.9.179 – - [27/Sep/2010:10:34:49 +0800] “GET /forum/styles/prosilver_se/theme/images/border_right.gif HTTP/1.1″ 200 124
Setup (‘/etc/awstats/awstats.broncho.cn.conf’ file, web server or permissions) may be wrong.
Check config file, permissions and AWStats documentation (in ‘docs’ directory).

原来的日志按天分割的:

CustomLog “|/usr/local/sbin/cronolog /var/log/httpd/broncho.cn_access_log.%Y%m%d” common

按错误提示,修改为:

CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/broncho.cn_access_log.%Y%m%d" combined

浏览 http://192.168.1.222/awstats/awstats.pl?config=broncho.cn 就可以看到效果。

定时分析日志,在服务器负载比较低的时候,一般是凌晨3,4点。

[root@athena~]# vim /usr/share/awstats/wwwroot/cgi-bin/awstats.sh

#!/bin/bash

cd /usr/share/awstats/wwwroot/cgi-bin
perl awstats.pl -update -config=broncho.cn

[root@athena~]# chmod 755 /usr/share/awstats/wwwroot/cgi-bin/awstats.sh

[root@athena~]# crontab -e
0 3 * * * /usr/share/awstats/wwwroot/cgi-bin/awstats.sh

thttpd源代码阅读笔记

thttpd源代码阅读笔记

thttpd是一个非常小巧的轻量级web server,适合做嵌入式web服务器,它的官方网站是http://www.acme.com/software/thttpd/
thttpd的代码量很小,大约1万行代码,代码风格好像是GNU,阅读不太习惯,用indent格式化:indent -kr -i4 -l200 -bad -bap -ip8 *.c
由于我的vim将tab设置为4个空格,代码中空格与tab共用,需要把tab还原为8个空格,才不出现排版混乱。

在fedora 12下编译,有错误:
htpasswd.c:52: error: conflicting types for 'getline'
/usr/include/stdio.h:655: error: previous declaration of 'getline' was here
htpasswd.c:52: error: conflicting types for 'getline'
/usr/include/stdio.h:655: error: previous declaration of 'getline' was here
make[1]: *** [htpasswd.o] Error 1
make[1]: Leaving directory `/home/deli/work/thttpd-2.25b/extras'
make: *** [subdirs] Error 2

原因是getline 已加入 POSIX 2008,可以把extras/htpasswd.c 里面的getline重命名为get_line或别的。

代码根目录下,就这几个文件:
fdwatch.c match.c strerror.c thttpd.c
libhttpd.c mmc.c tdate_parse.c timers.c

extras子目录两个
htpasswd.c makeweb.c

main函数在 thttpd.c
先梳理一些基本知识,看代码就容易多了。

编写守护进程(daemon)遵循的一般步骤:
1. 在父进程中执行fork并执行exit退出。
2. 在子进程调用setsid。
3. 让根目录“/” 成为子进程的工作目录。
4. 把子进程的umask变为0。
5. 关闭不必要的文件描述符。

除了上面所提的步骤,thttpd.c 跟其他服务器软件一样,解析参数,信号的处理,读取配置文件等。

Apache采用多进程模型响应用户请求,thttpd对并发请求不使用 fork()来派生子进程处理,采用IO多路复用解决方案。代码在fdwatch.c/h,对select()/poll()/kqueue()进行了封装,也加上了超时处理机制,跟Android RIL串口多路服用的代码非常相似。

至于socket网络编程,对HTTP/1.1协议的支持,都在libhttpd.c里面处理。

注意到了两个文本文件 mime_encodings.txt mime_types.txt,在Makefile.in里做处理,用sed格式化,生成mime_types.h,mime_encodings.h,在libhttpd.c中 再#include 进来,这是很常见的程序设计方法,好处就是修改方便,不容易出错。

Pages: Prev 1 2 3 4 5 6 7 8 9 10 ...14 15 16 Next