刚才特意上twitter的API文档上看了眼 (http://dev.twitter.com/), 上面挂了个通知:

August 31, 2010 Basic Auth has been deprecated. All applications must now use OAuth.

也就是说, 第三方不能直接拿用户的密码做接口调用的认证. 都需要在twitter 主站登录获得用户授权.

其实就在最近的一个星期, twitter就开始限制 basic 认证的接口调用频率. 估计这一动作, 已经导致大批第三方出问题. 而现在, 那些继续 Basic 的第三方已经完全失效. 我也在本月中旬的时候, 发现我博客的一部分访问量是从 twittercn.sinaapp.com 上跳转过来的. 而这个地址, 是别人收集的推特中文圈的列表之中(早些时候, 有人把twitese移植到sina app engine, 我也搭建了一个). 为了不辜负这些流量, 我借了个vps, 搭建了现在的 twitese: http://api.liruqi.cn 这个twitese 来自于tuite 项目(twitese 项目页面被墙之后, tuite开始活跃). 实现了免翻墙的OAuth 认证登录. 这种方式, 对于那些不熟悉GFW的朋友, 相当方便了. 自己在使用tuite 项目中, 也抽了点时间修复了几个 lists 功能相关的bug. 后面有空的话, 再加点url rewrite之类的, 让地址看起来简介一些.

手机用户建议用dabr. @yakergong 搭了一个, 不过没对一般用户开放. 需要的话找他申请使用权限. 如果你刚好也是用Android手机, 有个 opera mini5 修改版, 可以直接翻墙上官方的手机站: mobile.twitter.com. 这个浏览器怎么翻墙的我还不清楚, 所以不能保证用户信息的安全性.

另外, 批评一下咱们祖国的 国家互联网应急中心 部门, 办事相当不靠谱. 就是这个正则表达式比赛, 早就说好了 8月20号 出结果, 并颁奖, 网站的时间都没改呢. 现在都9月了, 什么通知都没有. 我给比赛负责人李佳 发过两次短信催问结果, 回复都是说等待专家评审. 其实, 如果按照事先约定的规则, 结果当场就能出来. 祖国这么忽悠人, 太伤自尊了. 

我再瞎猜一些. 这个国家互联网应急中心, 就是中国政府进行GFW 开发维护的职能部门. 但是这里面领导居多, 估计具体的开发任务是分布到学校, 或者做安全的事业单位, 比如中科院. 现在国际流量越来越大, GFW 可能出现性能瓶颈, 他们尝试从算法上优化匹配算法. 于是举办了这个正则表达式比赛. 比赛的主要目的, 我看是招揽学校实验室, 或者是企业单位帮他们做这件事情. 比赛做完之后, 他们的目的也基本达到, 谁爱跟他们合作也应该开始谈. 就比赛本身而言, 比赛的结果是远远达不到他们的预期. 我看这个比赛, 他们自己办的也挺潦草. 于是到了颁奖的时候, 舍不得那点奖金. 于是推托掉颁奖, 自己把预算中的奖金黑了, 一共3+2+1.5, 6.5w rmb. 个狗日的.

Posted in | Comments(0)»

CNCERT 比赛三天记 August 14th, 2010


比赛的三天是本周的周一至周三,日期是2010年8月9号至11号。那三天是我为搞比赛最忙的三天,每天晚睡早期,几近虚脱。最开始跟 @yakergong 同学商量做比赛,然后yaker 叫上了他中科院同学黑虾(我不记得他名字了,也没见过面,暂且这么叫吧)。yaker 在中科院上学,在HUST的时候聊过几句,没深交,大概我跟他性格都有点问题。当时是在校内和twitter上看到cncert比赛相关信息的分享,cncert是第一次办这个比赛吧,也不高调,我估计没多少人参加,于是抱着抢钱的想法报名了。随后是找人一起参赛。得知yaker 读过字符串匹配相关的理论书籍之后,邀请他一起比赛。yaker 欣然同意。

赛前也就面聊过几次。平时我们都比较忙,前期的准备都是黑虾 同学做的。比赛题目是这样的:给你一堆正则表达式(决赛有2000条),以及一大块数据(资格赛是1G的数据文件,决赛8G),对于每一条正则,把它在数 据块中每一次匹配打印出来。每一次匹配打印一行,格式为:匹配位置的文件偏移地址_匹配文本的长度_正则的ID。因为我之前做ACM比赛时,写过基于 Trie(字典树)的DFA,可以高效地做字符串匹配。于是我认为处理这个问题,最快的方式,也是做正则表达式合并。比如有规则r1 - rn,那么把字符串做成 (r1)|(r2)|...|(r3) 这种方式,做一次匹配就OK了。资格赛只要求提交数据。我用python写了一份,yaker 那边用pcre 做了一份,都是最简单的每个的正则做一次扫描,基本上跟举办方发过来的demo没多少差别。后来我把我的数据发过去,让yaker 比较下。yaker 说数据没问题,然后提交了。一段时间之后,我收到了决赛通知。

决赛当时通知的只有9号、10号两天。我一直认为,参赛队伍不会太多。因为举办方给我们发了测试用的ssh账号,我们的用户名是user5。我预计参赛队伍只有10来个队伍。这更坚定了我参赛的决心。

决赛的一周前,跟yaker 碰了面,讨论算法。那时候我们基本达成了一致,就是合并规则,做一次数据扫描。但上周日,yaker 告诉我这种方式有问题。当时在女朋友家,吃过晚饭之后才去中科院。那时候貌似发现了几个问题。
    1. 如果规则里面有括号,如何处理? - 这个问题,实际上把每个表达式的左括号在所有左括号中编号找出来就可以。因为pcre_exec 返回的捕获项目,是以左括号编号的。
    2. 如果两个规则,匹配的数据块有重叠,怎么办?同一个规则,匹配数据块有重复,怎么办?- 这个问题,主要是看规则怎么要求的。后来仔细看了规则,发现是这样的,对于同一个规则,匹配数据块不能重复。不同规则则不做要求。

晚上回去才开始coding C代码。那天yaker 硬盘出了问题,之前写的代码读不出来。我要求yaker 重写。我也被逼开始着手写。写完了之后发现一个问题:合并表达式的做法超级慢。另外发现一个问题,pcre_exec 函数并不是一次把数据匹配完,而是在第一次发现匹配后返回,另外还能带回捕获的信息。我是自己那小数据测试发现这个问题的;发现之后我们都傻逼了。部分原 因是给的demo代码写得烂;不过我们自身也有问题,到决赛前一天晚上,才发现这么一回事。之后比赛完了,我一直在反思:以后自己决心做一件事情的话,绝不能太依赖别人。8号那天晚上改C代码,基本上是被逼的。因为我不想放弃拿到那笔奖金的机会。

第一天
yaker实 验室开会,去不了。第二天早晨我醒来9点多了。那天周一。本来已经跟老板请好假了。但是我估计这时候去太晚了,所以干脆不去。我尝试着跟举办方打电话能否 下午过去。那边人说得请示领导。几分钟之后,那边来电话,说可以换明天上午。当时挺高兴,因为争取了24小时的时间。9号那天在公司基本上在做自己的比 赛。基本上放弃了合并规则的方式,并做了参数调优。所谓参数调优,不过是把pcre_exec 函数,以不捕获的模式运行。这种方式要快一些,当时算的是80%吧。那天还是非常想用非捕获的模式,运行合并后的正则表达式;然后hack pcre代码,返回匹配结束的时候,正则执行的位置。不过这东西不可能一个晚上写完了。

第二天
yaker继续去不 了,又我只好一个人去。9号给手机设置了闹铃。所以10号得以醒来。我直接带个手机出门上地铁。到了健德门站下车,凭着之前一天看google map 的感觉走。结果后来开google map 搜,发现走反了方向。然后打的去的。打的我都不知道具体位置,让司机慢点开,居然让我看到了。在收发室办一个房客的牌子。查的很严格,首先是被访人电话确 认,然后报自己的手机号码、工作单位。收发室那会儿刚好碰到几个一起参赛的。一个是大连理工大学的女研究生;另外3人,是华南理工大学的,他们还背了一台 式机。看到这台式机,我想到某年ACM/ICPC 全球决赛,朝鲜队也背着台式机让人笑话了。。。我们在一楼,给负责人打电话,过一会儿来人了,于是一起上楼。

上楼才发现上午参赛队伍只有 我们3家。瞄了眼比赛的报到表,大部分是学校参赛,北航,中科院,以及外省的;也有已经有工作单位的过来参赛。华南理工大学有个老师带队,那老师进场之后 开始向比赛的负责人介绍他们的作品:GPU做正则匹配。台式机居然也是Ubuntu Desktop。我和大连理工研究生mm比较安静了。

那 天上午我挺紧张。首先是发现我们队一直在用的代码是旧的,后来举办方发了一个新的代码框架,不仅仅是数据读入共享内存,规则也预先读入共享内存。新的框架 去了一些无用代码。我就把匹配函数放在新框架中。狂改了1个小时,终于编译通过,测试小数据也没问题。于是让负责技术的老师运行。结果,一运行真实数据就 出问题了:没有结果输出。于是打印调试信息查问题。发现,8G的文件长度,一个int类型已经存不下了,得用8字节整形。改代码,再跑,还是没结果。求助 负责老师。老师说,pcre 只能处理4字节的整形。那我只好修改上层调用。当时没怎么想,就把测试数据分块了,分了8个1G的。最后终于可以跑出数据。但相当慢。中午在楼下吃饭回来 之后,下午的参赛队伍陆续来了。因为测试机器只有4台,我的程序只好掐掉。负责老师也说了,如果是pcre库,单核心得跑上10多个小时的。跑了两个小 时,似乎才跑完2G的数据不到,正确报出了 4k 多的结果,但是错误结果报了1w多。按规则算分的话,分数就是负数了。这令我郁闷的不行,挺绝望,比赛之前也没想到会遇到这么多操蛋的事情。

大 连理工大学那队,也是一个人来参赛。她早晨来了之后,宾馆没订好,直接来参赛了。她们队是自己手写的正则匹配方法,没有用到现成的库 -- 我觉得这事很不靠谱。她上午跑出来的结果是乱的,貌似也是因为测试数据的大小超出4字节整形的缘故。没调好,估计挺咪涨。她问比赛负责人LJ下午能否继续 调,LJ问她什么时候回去。她说后天。LJ告诉她说,那你明天上午再过来吧。

还有华南理工大学的。带队老师一会儿给LJ及其它领导介绍 GPU,一会儿监督两学生调程序。因为决赛通知里说了,最多每队只能两人到现场参赛;我觉得他们违反了规则。到了下午,别的队都来了,他们继续在台式机上 调。这令我很不爽。我心想,你们最开始坏的规则,早知道我也学着点。

下午我跟研究生mm一起下楼了,打算陪她去订好酒店就回去。结果去了 发现,酒店还是得她自己掏钱,报销是比赛结束后,交发票,然后打钱给你的。押金得900。她身上没那么多钱。她给比赛举办方打电话问能不能先举办方把钱交 了,电话那边给扯了一堆屁话,说什么怎么那么贵,问问能不能便宜点之类的,然后就挂了。我跟她说,我先借你钱吧。于是借了她1000。跟她一起上楼了。我 把电脑借她调程序了。

跟她交流中,我得知她在匹配过程中用了8个进程。8核就可以用满了。我想着,如果我们的代码加一个多核优化,以及对 于没有正则规则的表达式,聚合起来用DFA,那应该相当快的。我首先跟yaker 打电话,告诉他现在的情况以及自己的想法,问他还想不想搞。他答应了。我说数据还在现场,没数据没法知道我们现在错哪儿了。于是我马上跟LJ打电话,表示 希望争取下明天参赛的机会。LJ同意。当时我鼠标恰好也没带回来,我直接去那边拿了。过去的时候,又一次扣证件,并给LJ打电话说过来拿鼠标。LJ想我明 天再来拿,我说不行。他只好放我进来。但这会儿LJ在开会,只有那个技术负责人在比赛现场。我跟他说明了情况并把自己的数据拷了出来。出门的时候,由于没 有LJ的签字,在收发室等了好久;直到他一个电话过来,给值班人员说,先放我走,明天两份一起签字。

会宾馆之后累得不行,把数据发给 yaker 之后,就想睡觉。厕所有个浴缸。于是我跟研究生mm说了一声,进去泡了。泡得很舒服。这似乎还是我人生第一次用浴缸。以前没记得在哪用过;除非小时候的大 洗澡盘也算。出来之后都没力气把身体擦干净,直接穿个内裤上床睡觉了。不知睡了多久,研究生mm也洗去了。那时候就开始写字典树。她出浴之后还没写完。我 挺想在这里写一个通宵的。吃完了完饭之后,她说她想休息了。让我回去。我说我就在这里过一晚上呗。回去明天还得过来,麻烦。她说不方便,我说那好吧,我闪 了。

晚上回家用手机3G网络,继续跟yaker交流,写trie上的DFA。他的多线程的任务调度,在10点半左右写完,测好了,提交。 我这边的trie DFA出了点问题。我之前以为匹配失败,直接去连根节点的。但是稍微细致地想想就发现不对。因为一次失败之后,后缀可能会参与下一次匹配。直接重新从跟部 走,会丢掉后缀的。没办法,这算法我不熟悉,然后给@ichbinghost 打电话,要代码。他没有C的,有pascal的。我让他发过来。一看比TM天书还难懂 -- 这就是OI/ACM 代码风格,代码质量完全以是否能Accepted为准。我看得头疼,又打电话要论文。他给发了过来,继续看不懂。。。那论文刚说到要点就开始扯蛋,连一个 算法流程违代码都没有。当时搜google也没搜到。于是继续电话问原理。大概懂了。但是由于担心第二天精神不好,到了凌晨两点,没写完,我还是睡觉了。

第三天
第 二天来还拍了几张照片的。到了第三天,就完全没心情了。早晨在地铁上就开始画字典树的构造流程。到了现场直接开自己的笔记本敲代码。敲了有2多个小时,到 了10点半,才写完。make下 error 一堆的。error fix完了之后11点吧。这时候有点慌了,因为时间不多,而昨天yaker 的多线程仅仅测试了小数据。没办法,我把自己的代码注释掉了。开始测试yaker 的东西。结果再一次悲剧:木有结果出来。这会儿LJ过来看,说,昨天不是还有结果的么,今天怎么没了;只有1个小时的测试时间了,要不用昨天的结果吧。我 说,我相信这次一个小时出来的结果要比昨天的好。debug了一阵子,发现多线程传数据那块,把长度设为4字节int 类型了。改完了之后就让跑测试,并下楼吃饭。回来之后,我的程序已经跑完了。11分钟,8800+个正确,1个误报。这结果让我松了口气。我脸皮没有厚到 下午还要赖在这里。但研究生mm还是坚持下午做调试。后来也没怎么问结果如何了。

yaker 中午也过来了。他过来那会儿我在吃午饭。后来上去之后,我又改了代码,希望多报几个结果。很不好意思地说我把代码改怀了。于是连忙说这个结果不算,还是用 中午已经跑出来的那份吧。然后闪人了。打算跟yaker 一起回去,路上聊聊。结果进地铁手机没信号,也没碰到他。然后各自回去了。

第四天
这天不是比赛,只是又去了宾馆一趟,收钱而已。研究生mm要还我钱了。人家主动跟我说的,人还挺厚道。

最 开始一位这个比赛,yaker 他们完全可以搞定,我呢,之用去现场跑一跑就够了。而结果完全不是这样的。每一行代码我都得看都得改。虽然 yaker 在比赛前有段时间表现不太积极,但是我后来觉得,既然是以自己名义报名参赛,就应该承担所有的责任和风险,并且不能让队友失望。而且,自己去现场,就不能 太依赖别人。星期一那天去没参赛,女朋友打电话我问这件事情。我说起晚了,她把我骂了一通,说你咋这么不负责,这么轻易就把别人的付出白白浪费了。后来我 告诉她我已经争取到了第二天参赛的机会,她才消气。责任,责任。

至于pcre,比赛那几天可是争分夺秒地看文档,还非常希望能够自己去改pcre的代码。结束之后什么懒得做了。希望自己能够养成好的学习习惯。

小公司比较自由,可以有比较大的个人发挥空间。但闲散也能把一个人废掉吧。在这里,还得感谢我的老板,能在我的工作任务扎堆的情况下,给我三天时间作比赛。感谢队友@yaker 黑虾 以及 @ichbinghost 的参与和支持。

明天要去怀柔玩。我不把这些写下来,会很快忘记。用WebQQ,我开始选择性地记录。人总得往前走。人的记忆量也有限。会舍弃无用,会追求新知,这也是适应能力的一种表现。

Posted in | Comments(3)»

公司论坛(bbs.goapk.com)时常出现这种情况:首页打开缓慢,但是其它页面都比较正常。网上也发现有人提出这个问题,但没找到解决方案。今天用xhprof神器在测试机上看了下,发现是首页多格插件的问题。

解决方法:

打开文件 ./plugins/ducexhome/lib/default.inc.php 搜索 “checkremote”,45行会有句

  'checkremote' => 1,

把这句的1换成0就可以的。

这个配置是说,显示首页多格之前,论坛服务器是否检查附件服务的图片是否存在。这个过程在服务器上进行,没完成,php就不会有结果输出。在 ./plugins/ducexhome/xhome.php 里搜索 “checkremote”,就能看到相关代码段。按道理说,既然是个配置,应该可以在后台设置的,不过没找到在哪设置。

顺便在这里介绍下xhprof 的安装和使用。xhprof是facebook开源出来的php 代码profile 工具,很容易看到php 代码效率的瓶颈。我在ubuntu 10.04 上的安装脚本:

sudo apt-get install php-pear php5-dev
mkdir -p /opt/src/
cd /opt/src/
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar -xvf xhprof-0.9.2.tgz

cd xhprof-0.9.2/extension
phpize
./configure
su
make && make install
make test

 

编辑php.ini (/etc/php5/apache/php.ini) 加入xhprof扩展配置:

    [xhprof]
    extension=xhprof.so
    ;
    ; directory used by default implementation of the iXHProfRuns
    ; interface (namely, the XHProfRuns_Default class) for storing
    ; XHProf runs.
    ;
    xhprof.output_dir=/opt/xhprof

然后重启apache,就可以生效了。

配置里面是可以指定xhprof输出目录,但是我还没有用到它自带的输出信息。因为我的目的只是找到慢语句。xhprof默认是不对profile结果按时间排序的,我们自己排:

 15 xhprof_enable(0,
 16             array('ignored_functions' =>  array('call_user_func',
 17                                                 'call_user_func_array')));
     ... (需要做profile的代码段)
 38 $xhprof_data = xhprof_disable();
 39 uasort($xhprof_data, create_function('$a,$b',
 40             'return $a["wt"]<$b["wt"];'));
 41 file_put_contents("/tmp/bbs.goapk.com.xhprof.info", var_export($xhprof_data, true));

执行结束之后再看看输出文件。找到问题出在哪,后面就好办了。

Tags: php xhprof

Posted in | Comments(0)»

之前是用的自己熟悉点的Ubuntu 10.04。还是desktop的。前几天服务器出现几次无故死机,然后怀疑是系统不适合服务器硬件。跟机房托管人员沟通后,决定换CentOS。今天就在上面配置下LAMP。

1. 安装Apahce, PHP, Mysql, 以及php连接mysql库组件。
yum -y install httpd php mysql mysql-server php-mysql

2. 配置开机启动服务
/sbin/chkconfig httpd on #设置apache开机启动
/sbin/chkconfig mysqld on #设置mysql开机启动
/sbin/chkconfig --add mysqld #在服务清单中添加mysql服务
/sbin/service httpd start #启动httpd服务
/sbin/service mysqld start #启动mysql服务

3.设置mysql数据库root帐号密码。
mysqladmin -u root password 'new_password' #引号内填密码

4. 安装php5.2
安装php5.2 主要原因在于 php5.1没有 json_encode / json_decode 函数,默认也没有mb_string。而自己尝试在php5.1上安装json模块不成功。参考:http://wiki.centos.org /HowTos/PHP_5.1_To_5.2
大概说下步骤:
新建一个文本文件 /etc/yum.repos.d/CentOS-Php.repo
写入内容:

[c5-php5.2]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/$releasever/testing/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing
includepkgs=php*

保存文件,然后
yum update

就装好了。重启httpd生效:
service httpd restart

5. 打开非标准端口
附件往往会放在一个非标准端口提供下载。而CentOS默认只开标准端口,如80。所以需要自己手动修改iptables规则。比如开8080,在 /etc/sysconfig/iptables 文件中加入一行:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

重启iptables,重新加载规则:
service iptables restart

参考:http://www.cyberciti.biz/faq/howto-rhel-linux-open-port-using-iptables/

6. 配置httpd
这个跟ubuntu 上的apache类似,需要注意的是

NameVirtualHost *:80

指令。配置虚拟主机必备。

7. 补充
服务器貌似是被SYN Flood攻击。ubuntu desktop再不稳定也不至于一天死个两三次。今天局域网测试了SYN Flood,CentOS也挡不住的,得配个防火墙。
上次测试了下,貌似机房有抵御SYN Flood攻击的能力。比较麻烦的是那种,建立tcp连接之后不干事的请求。这种也不会有apache日志记录,目前还没办法分析是哪些IP发起的攻击。而且,由于有不少是移动网络访问,限制单IP连接数,可能会封掉移动网络的网关IP。

8. SELinux 配置

SELinux 全称是Security Enhanced Linux,是一个访问控制系统。CentOS上有安装并默认了规则。其中有一条默认规则是不让httpd做远程连接。处理这个问题有两个办法,第一是修改规则,把远程连接打开:

setsebool -P httpd_can_network_connect=1

第二种是关闭SElinux 对httpd的控制:

setsebool -P httpd_disable_trans 1

上次迁移discuz论坛就遇到了这个问题,导致附件上传不上服务器。参考 http://www.linuxquestions.org/questions/red-hat-31/centos-5-3-php-ftp_connect-working-command-line-only-758922/ 文中的评论。

 

本文最后更新:2010 Aug 13

本文不介绍具体的部署方法. 以前没用过GAE的同学想试一试的, 参考此文: 用Google App Engine做个人代理服务器 第二版 .

众所周知, GFW 阻断内陆到国外网络连接的方式之一, 是关键词过滤. 所以, 一般稳定的翻墙方法都会做数据加密, 使得关键词过滤失效. VPN/SSH Tunnel 是做信道加密, HTTPS 则是在网络协议上加密. GAppProxy, 相当于是在用户客户端和GAE服务器之间建立一个内容加密处理 - 实际上不算加密了, 因为用的是再正常不过的压缩和编码算法.

先说 HTTP吧. GAppProxy的客户端是作为一个本地代理服务器工作的. 浏览器设置本地代理, 然后客户端把HTTP请求的地址提取出来, 把请求的目标地址做个base64编码, 与同其它信息一起以post方式, 发给部署在GAE的服务器. GAppProxy的服务端取到post数据后, 再构造请求, 发给目标服务器; 服务端收到目标服务器返回结果后, 检查content-type. 如果是文本类型(content-type里面包含text字符串), 做gzip压缩, 发回给客户端. 客户端收到数据不做处理, 交给浏览器.

HTTPS 方式的原理基本不变, 但存在的问题是GAppProxy的客户端, 服务端通信没有用上HTTPS, 还是HTTP方式, 所以不能保证数据安全性. 而且, HTTPS证书是得花钱买的, 客户端程序自带的HTTPS证书往往不被浏览器信任, 所以经常出现登录补上的问题. 总之, 设置GAppProxy 未HTTPS 代理的方式是不推荐的.

然后说下我自己改过的地方. GAppProxy的实现中, 有个使用google.cn:80 作为HTTP代理的逻辑. 客户端启动时, 会去尝试读取GAppProxy服务端的负载均衡服务器. 负载均衡服务器地址是写死的, 是http://gappproxy-center.appspot.com/available_fetchserver.py 在 /localproxy/common.py. 如果客户端读不到服务器, 客户端则设置google.cn:80为默认的http 代理. gappproxy早就是敏感词, 所以负载均衡的服务器很可能连不上; google也已经离开中国, google.cn:80 的代理大概也已经失效. 所以客户端很容易出问题. 前段时间我就遇到过. 其实很简单, 从代码里把google.cn 的代理去掉就行.

同时, GAppProxy是可以设置为公共的HTTP 代理服务器的. GAppProxy在/localproxy/proxy.py 里写死了是监听本地地址127.0.0.1. 而把这个地址改成0.0.0.0, 则变成了一个公共的HTTP代理服务器 - 这取决于你所在的网络. 如果是局域网, 那是局域网代理; 如果是有独立IP的虚拟主机, 那么全国人民都可以把它当翻墙代理用. 上次在twitter上还看到说, 有的公司业务需要教全体员工用GAppProxy翻墙... 我的第一反应是, 那公司的技术人员不靠谱........ 局域网随便找台机器做翻墙代理就OK了.......

另外, 我这里有一份基于GAppProxy google code svn 的head version修改的客户端代码, 就一个proxy.py 文件. 去掉了google 代理, 并可以作为公共HTTP代理服务器用. 需要的同学点击这里下载源代码. 还有, 不要说我发此文加速GAE被墙之类的话. 我不爱听.

好吧, 我还是承认了, 本人不是专业搞翻墙的, 最好的Android 浏览器翻墙方式是用修改版的opera mini(有APK下载). 图片看这里.

如果希望你手机其它的基于HTTP/HTTPS的应用翻墙, 或者是单纯想知道我都捣腾了写什么, 继续往后看.

首先说明一下使用条件. 你需要有一个Android手机. 此apk目前只在G2, G3上测试过. 其它机型理论可行. 但是目前有如下限制:

1. 大前提: 需要有手机的root权限. 如果还没有拿到root权限, 可以先搜索相关教程, 如G3取root权限.

2. Wifi网络无法使用HTTP方式连接到国外含有敏感内容的网站. 所以一般Wifi网络时, 需要关闭mobile view 并强制使用HTTPS连接, 以保证不会跳转到HTTP的WAP页面.

3. HTTPS方式, 仅在手机ROM版本为安智网时可用(如果开机第一屏有xda-china或者安智网, 说明没问题). 如果是其它ROM来源, 需要上安智网(bbs.goapk.com)刷一个论坛里的ROM才可以使用. HTTPS在某些固件版本下不可用. 不行可以尝试刷一个bbs.goapk.com论坛的固件. 本人没有在多个机型仔细测试, 如果有测试结果欢迎以评论方式反馈.

4. 本程序修改了移动网络接入点设置. 卸载之前需要保证翻墙工具处于关闭状态. 或者在卸载之后, 在“移动网络设置” => "接入点名称"中按menu键, 重置为默认设置.

网络助手apk文件下载地址: http://medusa.sinaapp.com/NetHelper.apk

翻墙原理在前一篇博文介绍两种基于Google App Engine的翻墙方法  中有提到. 这里就不赘述.

没有APK安装器的同学,可以尝试下安智网的APK安装器.

注意: 本文中的应用程序由安智网网友开发, 如果法律或者政治风险, 安智网不负相关责任.

Jun 26 2:20pm 补充: HTTP因服务器负载无法承受, 暂停服务. HTTPS方式不依赖于服务器, 不受影响.

Jun 28 10:27am 补充2: 因缺少服务器资源, 担心负载不能承受, 此翻墙方法尚未对外宣传. 有可以的国内服务器的同学, 请在twitter DM @liruqi

Jun 29 2:00 pm 补充3: 今天apk文件版本有更新, 比以前更好用了(下载地址不变, 在上文). 本来还打算今天发截图的, 后来测试发现有台服务器不能处理302重定向(python 2.4.3的), 以及昨天刷新版ROM之后, https也走服务器代理了. https本来是不让走代理的, 不安全. 我今天尝试修复这个问题. 不过也有好消息. G2(HTC Magic) 上, 用北京动感地带的2G网络, 部分地址没有被dns污染. 比如mobile.twitter.com. 估计北京动感地带的2G用户, 可以直接下载上面的apk文件翻墙了.

July 1 10:47 pm 补充4: 今天测试了下最新翻墙工具, 基本没问题. 而且现在也没啥https不https的问题, 全走的代理. 不过还不确定是否跟上次刷了rom有关. apk文件下载地址不变, 文件已更新. 服务端源代码放放在这里, 各位有自己的国内服务器也可以自行搭建代理.

(本文最后修改时间: July 12, 3:27 pm)

前言:
1. 由于本人有后期的研究计划,本文以后可能会有更新。
2. 本文主要介绍Linux环境下的操作方式。Windows用户也可以套用类似的方法,本文下面会介绍下Windows环境的简单配置方法。

最近打算做一个Android平台上的翻墙工具,所以研究了下代理方式的翻墙方法。Windows下已经有不少现成的免费工具,但是Linux下 不多。西厢计划虽然牛逼,但是安装配置过程复杂,效果也不稳定。所以最近主要研究了墙外代理的方式。动手实践了两种:HTTPS在线代理,以及本地加密代 理。都是代理,但是绕墙原理不同。

HTTPS在线代理,是基于HTTPS协议的安全性。比较典型的,如mirror项目。体验地 址:https://opliruqi.appspot.com/。
优点:方便
缺点:不稳定,mirror项目在处理https登录可能有问题,所以只能浏览不需要https登录验证的网页。而且因为服务端有HTML文件处 理操作(如URL转换),可能会导致页面效果欠佳。

本地加密代理,是在本地把目标地址加密,GAE上解密并获取页面内容,处理之后发回客户端。典型的,如GAppProxy项目。
Windows系统下配置方案:
1. 安装python环境。一般是下载 http://python.org/ftp/python/2.6.5/python-2.6.5.msi 用64位系统的,下这个 http://python.org/ftp/python/2.6.5/python-2.6.5.amd64.msi
不过上面两个地址被墙,大家用迅雷试一试。(我怀疑python.org就是因为GAppProxy被墙的...因为GFW最怕这种应用层加密的 翻墙方法,这种方式不要求你有vsp,只需要有GAE帐号或者网络空间即可)
2. 下载客户端:liruqi.sinaapp.com/localproxy.zip。已经配置好了的。不过有GAE帐号的同学,还是用自己的吧,为了你们 的数据安全,也为减少我的压力。
3. 设置浏览器代理。把http代理设置为 127.0.0.1:8765

优点:稳定,快速,Youtube视频也可以看
缺点:还是SSL的问题,如果用其作为SSL代理,那么证书不被浏览器信任而频繁报错;如果不用,上了GFW黑名单的网站(如 twitter,facebook),有域名劫持,https依旧没法连上。这篇博文(http://blog.solrex.cn/articles /fix-gappproxy-set-cookie-and-https-cert-bugs.html)似乎在说,它解决了这个问题。但是我下载了它 的代码,测试不通过。

总之,SSL登录验证问题没有解决。GAppProxy配合西厢计划的反DNS污染的模块同时工作,(即GAppProxy只作为HTTP代理) 是最完美的。我打算在android平台上也做一个,其中的SSL代理问题也没解决,技术方案目前想到两种:
1. 订阅一个人工维护的域名到ip的列表
2. 把西厢计划的反DNS污染的模块编译到ROM中(这个工作已经有人尝试过,可行。但是对于用户而言技术难度太大)
其实,一般看看国外新闻,维基百科什么的,也用不到HTTPS。Twitter第三方遍地都是。不处理,问题也不大。

大家有意见、建议,可以到twitter(@liruqi)或者新浪微博(@liruqi)上讨论。本博客尚未开通评论功能。

--The orignal post is published on May-16 17:56

关于新浪离职 June 26th, 2010

最近离职的事情弄得很揪心。离职对于我而言是个痛苦的决定,半年来在新浪微博项目的努力全部白费,而且我害怕这样会给别人留下心浮气躁的印象。我甚至怀疑 作为一名开发人员,社交圈小一点更有助于技术上的学习和造诣。刚进公司的时候是做PHP开发工程师,我给自己定的计划也是先做PHP熟悉业务,后面做底层 系统研发。后来去朋友在的一家小公司看了一圈,被他们的一名人力和渠道负责人看中,拉我过去做服务端。偏偏在此时,微博成立独立部门,我被安排做系统研 发。两条岔道在我面前铺开。在新浪半年,我最深刻的感触是,技术完全为需求服务。很大程度上,这个现实熄灭了我对技术的追求。因为做什么都一样,最重要的 是有钱赚,在北京能够更好地生存。刚进新浪的时候,我要的钱不多。那时候是因为要尽快摆脱我在的做微软测试项目的外包公司。但是当我得知这个工资会至少维 持半年,我不干了。工资不高,没法攒钱,哪有心思安心做技术呢。

薪水的问题,是我离开的首要原因。还是那句话,要求得自己提,最好是有把握,有后路。我觉得自己在项目中已经有了足够的分量。但是两次提薪的请求都被回 绝。后面一次是说公司有制度约束。我不喜欢这种约束,那就撤吧。

但是有其他的因素,让我不喜欢继续呆在新浪。新浪微博项目,在新浪内部非常受重视,产品需求自上而下,还有频繁的应对突发事件的运行需求。产品需求一般是 由微博项目总监@simon 和微博项目产品经理@mingsheng1 确定的。用户、底层开发人员基本没有发言权。这中间有个问题是,确定需求的人基本不关心技术架构,都是在需求确定之后,讨论实现方案。所以,项目以上级定 的时间表往前推进。底层开发人员忙于新需求开发、现有的BUG修正,基本是没时间做大的架构和流程的改进。以结果为导向的工作环境中,重构工作往往是因为 代码改不下去了才开工。以至于平时代码维护起来就有点困难。现在新浪微博功能繁杂,实现也混乱,很难想象以这种方式做到后面会是什么样子。

年前产品部的鹏总貌似还说过,微博上不会做偷菜,不会做游戏平台。不过现在已经在做了。新浪微博可能演变成SNS平台。

上面说的问题,是公司内部因素,是可以改进的。比如大家一起头脑风暴,讨论产品需求。尽量在项目前期明确一个大家都没有任何意见的方案。说是 FACEBOOK的产品人员都是技术出身。新浪还是应该加大一线技术人员在产品设计中的分量。

再说两点环境问题吧。首先,新浪原本就不是一个做技术的公司。前段时间才知道,新浪2年前还在用Windows服务器。新浪网是新闻起家的,新浪有个很神 秘的人物,微博上叫老沉,真名陈彤,看互动百科上他的介绍(http://sinaurl.cn/h3T82),就能明白新浪网是如何起家的,擅长做什 么,习惯怎么做。新浪的运营部门的权力相当大,改版之前,新浪微博的运营页面由运营部门开发维护,跟个人微博页面完全是两套样式。现在页面统一了,但是运 营需求还是放在第一位。虽然部门独立,新浪微博还是难以保证它在产品需求上的独立性。

其次,是互联网公司都得面对的审核问题。因为微博上信息传递性强,所以后台审核系统要求很高。我工作上还是带有有自己的感情的。我喜欢做自己觉得很好、有 必要的功能;而对于不喜欢做的功能,把时间往后排或者跟产品人员讨论。从职业道德上讲,这是不敬业的行为。但是,审核功能加大了开发的工作量,甚至在设计 系统架构时需要考虑审核需求。

目前就说这些。换工作,一部分的目的,也是希望为早些赚够钱,肉身翻墙。如果以上内容关系到公司机密信息,请尽快联系我本人。liruqi at gmail, t.sina.com.cn。

--The orignal post is published on May-2 5:55

Tags: 新浪 离职

Posted in | Comments(1)»

关于我 June 26th, 2010


北漂, PHP工程师, 在新浪微博项目组呆过半年, 随后步入移动互联网行业. 目前只打算在北京继续漂, 帮公司做点事情. 在安智网(goapk.com)做web前/后端开发.

经常逛的地方:
http://t.sina.com.cn/liruqi
http://twitter.com/liruqi
http://verycool.me/liruqi
http://www.douban.com/people/liruqi/

我的工作:

http://market.goapk.com 这是一个在线的Android软件市场. 我希望G友能把它能够用她查询, 管理Android应用. 欢迎加入.

http://bbs.goapk.com 这就是我们的论坛了. 偶尔会改改这个论坛了.


本域名(liruqi.cn)好像还是一个twitter的api地址. 不过这样不方便, 打算更新到api.liruqi.cn
另外分享一个自己的在线代理:opliruqi.appspot.com

今天把liruqi.appspot.com 上的内容迁移到liruqi001.appspot.com, 目的在于把博客有原来的project picky项目程序转移到xuming的micolog. 至少micolog看起来挺漂亮, 有些主题可以换, 评论也是好好的. 今天就直接复制粘贴导入数据了. 以后再改时间戳吧. 先前的liruqi.appspot.com 打算冷处理, 废弃之.

Tags: 关于我

Posted in AboutMe | Comments(0)»