条条大路通罗马,GAppProxy

条条大路通罗马,GAppProxy

其实应该有不少人已经知道GAppProxy(http://code.google.com/p/gappproxy/)了,下面还是简单介绍一下GAppProxy。 GAppProxy是一个开源项目,host在Google Code上面,源代码可以通过SVN获取: svn checkout http://gappproxy.googlecode.com/svn/trunk/ gappproxy-read-only GAppProxy提供一个HTTP代理,使用python编写; GAppProxy分成两部分,服务器为python程序,上传到Google App Engine执行,客户端是一个python代码包,可以编译为可执行文件运行,也可以在python环境中直接解释运行; GAppProxy运行后提供一个本地HTTP端口,当有HTTP访问请求这个端口,GAppProxy就分析请求所需要的文件,转发请求给Google App Engine上的服务器端,服务器端通过Google近乎无限的带宽抓取这个文件,然后转发到本地完成整个代理过程,由于Google部署在Google App Engine上的带宽相当充裕,所以整个过程十分快捷,程序的执行效率十分高。 使用的过程十分简单,大家Google一下就会得到好几篇写得很好的教程,这里我就不罗嗦前人写过的了,我这里说说几个大家比较关心的问题: 本地代理端口的修改:通过修改proxy.conf文件的listen_port就能修改本地端口,例如:listen_port = 8451(仅限SVN上最新的版本,旧版本不是这个参数哦); 多人共用的问题,旧版本中GAppProxy是支持“非本机访问”的,新版本做了限制(不知原因,可能是因为安全性),如何恢复这个功能,让其他人通过你的电脑上的GAppProxy上网呢?答案是编辑:proxy.py文件,把第481行(SVN r102版,其他版本可能有轻微差异)改为: httpd = ThreadingHTTPServer((‘’, listen_port), LocalProxyHandler) Mac上如何编译python客户端?Windows上有人编译出客户端,大大方便了使用,但是Mac上没有,可能有人会觉得不便利,其实大没有这个必要:首先,python执行的时候会被编译为中间文件,这个过程叫做冻结,冻结后的文件执行效率是相当高的,所以大家不需要担心客户端解释执行的效率;其次,Mac内置就有python执行环境,方便好用。 那么Mac上如何自动运行客户端呢?方法很简单,建立一个XML程序放到~/Library/LaunchAgents文件夹里。代码如下: *xml version=”1.0” encoding=”UTF-8”? http://www.apple.com/DTDs/PropertyList-1.0.dtd”*> Label com.leask.gappproxy.plist [此XML的文件名,随便写就可以] ProgramArguments /usr/bin/python [你的python环境路径,这个是OSX默认的,如果用macport或者darwin port等途径安装的python,路径会有所差异,请自行修正] /Users/Leask/Documents/flora/GAppProxy/localproxy/proxy.py [替换为你的客户端程序路径] RunAtLoad KeepAlive NetworkState** 好了,就这几点经验了,大家凑合看看,目前有些地方GAppProxy已经被墙盯上了,我所在的城市就是如此,但是搭建IPv6 tunnel后就能访问了,速度也还是超级快。最后提醒大家注意,由于Google App Engine免费版的限制,大文件的下载是不允许的,而且每天的流量限制是1GB,不过就正常浏览来说,足够多了。 经过我如上描述的配置后,可以在Console里头看到GAppProxy的运行状态: 希望此文对大家有帮助,祝福大家早日自由。

条条大路通罗马,IPv6

条条大路通罗马,IPv6

什么是IPv6?不明白的自己Google吧,目前Ipv6还没有成为“敏感字”不过相信在不久的将来,“IPv6”很有可能“上榜”。 IPv6是翻墙技术?错了,IPv6不是翻墙技术!注意了,IPv6是一种通用性的基础技术,其设计的主要目的是解决Internet上IPv4地址枯竭的问题。 目前而言,IPv6的部署在国内是很有限的,国内ADSL方式接入互联网的网民占大多数,通过PPPoE申请得到IPv4地址,只有少部分网民能够原生得到IPv6地址,其中教育网用户占多数。 那为什么要探索IPv6用于“突围”?主要是目前而言,墙的过滤功能主要通过干扰IPv4网络中的各级网关和DNS实现,尚未有准确的技术资料证明墙在干扰IPv6网络。 注意!这只是暂时的,墙迟早会对IPv6下手,这个只是时间问题。 那么如何接入IPv6网络呢?如果你的网络已经部署好IPv6功能,那么你在查看网络状态的时候就能够看到你的IPv6地址(IPv6地址的样子在上图可见)。 现代操作系统:Unix、Linux以及Windows Vista以上都能直接获取IPv6地址。仅需注意的是XP以及之前的Windows系统需要先安装IPv6协议,DHCP服务才能找到IPv6地址。 显然,大多数网民所处的网络是还没有部署IPv6的,这里我推荐大家到http://he.com申请一个IPv6 Over IPv4通道(tunnel)。申请好以后你会得到一大堆的IP地址、DNS、Router等资料,这些参数如果你可以看懂那么配置起来就很容易了,如果你实在看不懂也不要紧,上面有一个配置向导,会给你生成一段命令,把这几行命令往你的操作系统的命令行里头粘贴,基本上就能解决问题了。值得注意的是,如果你的是动态IP,在IP地址改变以后,你需要上去修改一下你的IPv4地址(endpoint)。然而,相应地向导所提供的代码也会根据endpoint的改变而改变。这些配置会根据你网络现状和操作系统的不同而有所改变。我在自己的Unix上面写了一段shell脚本,当IP地址改变的时候自动更新endpoint以及改变tunnel配置,原来打算把脚本公开出来,但是考虑到每个人的网络具体的情况都不一样,看来通用性不大,就不把问题复杂化了。大家跟着he.com的向导一般都能接入了,实在不行可以联系我共同研究一下。 接入后你可以通过ping ipv6.google.com命令测试你的IPv6连接(类Unix系统使用 ping6命令),测试通过后就能够在浏览器中访问IPv6站点了。这仅仅是个开始。接下来添加IPv6地址到你的hosts文件中,让电脑在访问这些站点的时候优先通过IPv6通道。这里的地址有两类,一类是如Google的服务,本来就支持IPv6访问的,另一类是IPv6反向代理,你不用管那么多,只管添加进去就可以了。配置范例:http://d.leaskh.com/7bz2E 然后你会发现前所未有的翻墙速度。特别是访问各种被墙的Google服务,由于仅仅是通过IPv6通道,并没有通过代理服务器转发,所以效率是相当不错的。IPv6翻墙在目前而言效率还是相当好的,值不值得折腾就看你自己权衡了。值得再提一提的是IPv6的反向代理目前还没找到能够支持SSL证书的,所以经过IPv6反向代理的网站如果需要通过https访问的话,IPv6反向代理就无能为力了(twitter,facebook等),不过Google服务不需要通过代理(原生IPv6),所以工作得挺好的。由于我的ssh服务器一个在美国,一个在日本,一个在新西兰,访问不同网站的速度都各自有制约,所以IPv6的高效率作为了一个利好的补充资源,提供稳定而快速的访问能力。 在我的Mac上,每次开机我的Shell脚本都会建立三条并行的ssh -D通道,以及GAppProxy代理(我的下一篇文章会介绍),还有IPv6 tunnel,然后自动进行测速,并配置好pac文件,当我的应用需要访问网络的时候,就会根据pac文件决定是否使用代理以及使用那一组比较快速的代理。虽然折腾花了我很长的时间,但是目前看来运行得相当良好,而且重要的是过程中学到了很多有趣的网络编程知识。看来这就是墙对我的一种积极意义吧。 正如俗语,世界上没有丑女人,只有懒女人。我说:世界上也没有不自由的人,只有懒于折腾的人罢了。若为自由故,一切皆可抛。这不是豪言壮语,是作为一个人,骨子里面的向往。互联网是上天送给中国人的礼物,是我们心中的“美丽岛(不许联想)”。

打造自动翻墙的iPod touch or iPhone!

打造自动翻墙的iPod touch or iPhone!

最近天朝越来越“墙大”了,Twitter最后一组IP地址也已经耗尽。 不知道大家有没有和我一样,有在移动设备上翻墙的需要。 由于iPhone OS基于完整的UNIX,那么想象的空间就很大了,ssh -D直接跑在iPhone OS上已经不是什么新鲜事情,但是ssh的链接有一点脆弱,碰上网络不稳定的时候还真的挺郁闷的。 既然Desktop UNIX上有autossh(实现ssh断线或者无响应的时候自动重新发起连接,注意如果想实现自动身份验证,你需要上传你的公匙【方法自行Google,十分简单】。),那么是不是iPhone OS也能编译一个对应的autossh呢?打开xcode,正打算对autossh的代码开刀。突然想起上Cydia上看看,果然已经有人编译好了,于是站在巨人的肩膀上: 简单编辑一下以下的脚本,并上传到设备上(注意设置权限为“可执行”): #!/bin/bash killall autossh; killall ssh; autossh -M20000 -f -q -N –D yourPort -g yourUserName@yourSSHServer; echo Flora tssh [Done]; exit 0; 当然了,脚本名字和提示信息等个性化的东西你随便写就可以,执行效果如下: 可爱的Facebook又回来了: 当然你也是可以配合pac文件用。pac文件和电脑上的语法完全一样,几乎不用做什么修改就能用到iPhone OS上了。 现在开始只需要启动一次脚本,就永远自动挂着ssh-D了哦,和电脑上翻墙一样方便了。 PS 1 :硬启动以后需要运行一次脚本哦,休眠醒来后不需要,千万不要忘记上传公匙。 PS 2 :有兴趣的朋友还可以把autossh放在启动项目上。 PS 3 :脚本其实不是必要的,autossh比较必要,脚本是为了让大家免去每次输入繁琐的命令。

TextMate的一个小兼容问题

TextMate的一个小兼容问题

我手头有不少项目是用TextMate写的,虽然最近几天开始改用vim(改用vim主要是想保持一个统一的编辑环境,在Command Line和GUI之间。),在vim完全上手之前,还是需要用TextMate一段时间。 今天工作的时候,遇到一个很奇怪的问题,我无法用Textmate的FTP/SSH插件(http://fuerstnet.de/en/ftp-ssh-bundle-textmate)来上传程序到服务器。程序提示PHP错误: 才知道原来TextMate的FTP/SSH插件是通过PHP环境上传和下载文件的。 考虑到前几天我配置了Snow Leopard本地的PHP环境体换掉了MAMP集成环境。于是考虑是不是本地的PHP环境和TextMate的插件环境不兼容。 查看插件的源代码: !! usr/bin/env php php // Initialize variables and load helper functions require($_ENV[‘TM_BUNDLE_SUPPORT’].‘/lib/helper_functions.php’); // put file to the remote host put_file($_ENV[‘TM_FILENAME’], $_ENV[‘TM_FILEPATH’], $_ENV[‘TM_DIRECTORY’], $PROJECT_DIR, $PREFS); !! 不难看出TextMate通过PHP环境变量的方式传递变量给一个PHP Shell,然后由PHP Shell的Function()上传和下载文件。经过对php.ini的分析研究,发现原来php.ini中有关于环境变量的这一个描述: !! ; This directive determines which super global arrays are registered when PHP ; starts up. If the register_globals directive is enabled, it also determines ; what order variables are populated into the global space. G,P,C,E & S are ; abbreviations for the following respective super globals: GET, POST, COOKIE, ; ENV and SERVER. There is a performance penalty paid for the registration of ; these arrays and because ENV is not as commonly used as the others, ENV is ; is not recommended on productions servers. You can still get access to ; the environment variables through getenv() should you need to. ; Default Value: “EGPCS” ; Development Value: “GPCS” ; Production Value: “GPCS”; ; !! variables_order = “GPCS” !! Snow Leopard在启用php.ini这个配置文件的时候,会更改PHP环境variables_order的默认值,然而这个设置将导致PHP定义全局环境变量的功能失效。于是尝试修改为: variables_order = “EGPCS” 重新加载插件: osascript -e ‘tell app “TextMate” to reload bundles’ 问题得到解决。 注意,如果你使用Snow Leoprad并使用系统内置的PHP环境,而且你用TextMate+FTP/SSH Bundle,你将遇到和我一样的问题。虽然variables_order = “EGPCS”并不是PHP推荐的设置值,但是目前看来只能这样了。期待TextMate的后续版本能解决这个问题。