Say Hello to the 2010

Say Hello to the 2010

We believe that we have changed something. Not just us, but all of us. We didnt just wanna run another tracker. We wanted it to mean something. And you our users have helped us with that. The history of the bay is still being written, it’s way to early for a conclusion. – The Pirate Bay @ Christmas, 2009 我们相信,我们已经改变了一些东西。不仅仅是我们,而是我们所有人。 我们不再想仅仅运行一个网站,而是想寻找一些意义。这离不开你的帮助。 我们的历史还在书写中,请不要匆忙下结论。 – 阮一峰(译) 这是面对2010,我唯一能感受到的一点点鼓励。 很多人发来邮件,祝福我圣诞快乐,新年快乐。同时指出我好久没有更新Flora_ssh-D了,在这里我感到很抱歉,因为有相关的一些问题,我仍然在研究中。 但是有一件事情需要澄清,这里不是“翻墙专博”,虽然好多网友认为如此。虽然可能GFW也这么认为。 这里仅仅是我,黄思夏的个人Blog,我只是在这里写写我的生活,以及其他一些乱七八糟的东西。 或许我也会写写翻墙,那仅仅是我生活的一部分而已,当然我也希望我写的能够一定程度帮助某一些朋友,但是那不是我的全部。 但是什么才是我的全部呢?随着时光的流逝,我已经越来越分不清楚什么是完整的自己。 送走了2008的万丈光芒,送走了2009的耀眼繁华,剩下的,是文明的灰飞烟灭,是深深深深的绝望与无助。 被包裹起来的“天下太平”已沿着千秋万载的城墙渐行渐远。

我也谈谈Apple的平板电脑

近期很多文章在谈论Apple的平板,针对Apple4us上的一些文章,我谈谈几点。 其实我觉得iPhone的成功最关键的是懂得放弃。所有Mac产品其实也如此。iPhone与其说是启发了多点触控的UI还不如说是做不到更好的硬件键盘而放弃硬件键盘。大家纵观Apple的产品,每个伟大的产品发布的时候都伴随着一点点的小遗憾。例如iPhone放弃多任务方式等等。 Apple总能关注自己做得有200%把握的部分,和用户最实用(而不是最关心,因为很多的追逐只是浮华)的部分。可见其实Apple的平板没有什么悬念的,Booksize是铁定的。多点触控也是铁定的,并不需要再多的讨论,因为Apple觉得无法做出比笔记本更好的键盘,只好放弃了。剩下的就是移动网络了,3G是铁定的。 我个人最期待的其实是OS。为什么呢?因为无论是实用desktop版本还是iphone版本的OS X,Apple都还有很多事情要做。我想,其实最让用户疯狂的正是这一部分的事情。硬件比iPhone优秀的手机一抓一大把,但是体验上能胜过iPhone的可能就不多。这就是OS的魅力,是Software的魅力。这里涉及一个平衡,就是强大和流畅的平衡。微软的table PC没有找准,上网本算是找到了,但是Apple将把这一点做到极致。然而这正是Apple最擅长的。也正是用户的一种内在的期待。一种对其产品的信心。 iPhone并没有Samsumg那么多千万像素的摄像头,却称为最受欢迎的拍照手机,Macbook并没有多BT的配置,却称为大家最喜爱的笔记本。同样的道理,别指望Apple的平板电脑会带来多少的技术冲击,退去简约的外观设计后,真正的冲击是来自应用层面的。 Apple真正要做的其实是两件事:1:在Desktop运算水平的Mac OS上实现即时开关,而不是桌面级休眠,这一点很重要;2:在Booksize的尺寸和操作方式、运算能力的前提下,如何提供让用户完成大多数常规的、日常的桌面计算任务,真正局部替代目前的Notebook而不是小打小闹的上网本。 疯狂而有趣、平顺的体验,才是Apple的杀手锏。毋庸置疑。 /* 另外我大胆做如下的猜测: 名字:我觉得大家不用再猜测了,我预计Apple的平板电脑其实就叫做Macbook。现有的笔记本Macbook将慢慢全部改名为Macbook Pro,Macbook的名字就留给平板了。慢慢Apple就将剩下两条产品线,Macbook Pro(专业,一体化铝制,物理键盘)、Macbook(消费级,便携平板,多点触控); OS:系统将会采用类似桌面版的Mac OS X,有完整的桌面软件运行能力。但是有针对的提供适合多点触控的touch UI。 */

条条大路通罗马,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的后续版本能解决这个问题。