工作一年,mark下~~

去年的7月19号,一个人来到了这边,现在想起来恍惚昨日,时间真快啊。

前天晚上去买东西,看到本徐志摩的诗集,顺手翻了翻,前半部分语言充满了美好与希望的憧憬,后面却是伤心绝望,看不到尽头。也许大部分人的人生多半如此罢,年轻时的那些理想与快乐,随着年龄增长,逐渐破灭。得到如何,失去又如何呢?失去让人理想破灭,得到会发现不是当初想象的样子,同样没有动力。生活本身,就是一件无聊的重复性事件。

爱因斯坦说,搞科学本身就是逃避无聊生活的一种方式,这也许正是我当前的状态。

昨天晚上把斯塔夫里阿诺斯的全球通史最后两章读完了,前后延续了几个月,读完后如同完成任务般如释重负。阅读给人带来的快乐是无与伦比的。

brian kernighan的The Practice of Programming的后记里引用了下面这段话

If men could learn from history, what lessons it might teach us. But passion and party blind our eyes, and the light which experience gives us is a lantern on the stern, which shines only on the waves behind us!

Samuel Taylor Coleridge,Recollections

如果人能从历史中学习,我们将能学到多少东西啊!但是激忿和党派蒙住了我们的双眼,而经验的光亮就像船的艉灯,只能在我们背后的波涛上留下一点余辉。

Samuel Taylor Coleridge,《回忆》

历史读的多了,便愈发觉得印证了这句话。我们现在的社会相对于历史而言没有任何的特殊性,只不过是技术所取得的巨大进步给人以想当然的自信而已。每次进步虽然提高了人类的生活品质,但是带来的巨大的社会结构的变革与生活方式的改变,并不一定让人觉得快乐。

懒得写下去了,思想太琐碎。

今年世界杯最有意思的事情是,未来帝和章鱼哥对球赛的预测,奇准无比。

而我们平时也搞一些类似赌球的游戏,比如猜测结果请吃饭之类。不止足球,很多事情都是类似,这似乎是人们普遍的心态。

在各个古老的文明中,求神问卜,对未来重要事情的预测,似乎都占很重要一席。每一个文明都有类似的于祭司,巫师,先知之类的概念,这些人员都部分或者全部的从事预言的工作,并以此谋生。

预测是如此的普遍且广泛的存在于各个文明之中,必定是有某种更深层次的机制使然。

人的大脑比较复杂,会思考很长一段时间之后的重要事情,假如把这个时间段缩短到几分几秒再来看,似乎显得再也自然不过,比如,门将一个大脚把球开出去,所有队员都知道往前跑,因为大家可以肯定的预测,球将快速飞过中场。这种明显的理所当然的事情,常常被我们忽视而不去思考,在这里,人们同样是对球的走向进行了预测,这种预测跟对球赛结果的预测,似乎有些不同,因为我们根据已知的物理定律,几乎可以百分之百的指出球下一步将出现在哪个位置。但是球赛的结果却是千头万绪,不到最后谁也无法真正断言。

产生这两种不同预测的深层机制应该是相同的,对未来进行预测是人们作为一种生物的本能行为。在遥远的过去,生物为了生存,必须对周围的环境做出相应的反应,对不同的外部环境进行不同判断预测,决定下一步该如何行动。人的大脑会储存以往的经验信息,进行分析判断整理,并对当前环境做出反应。

大致可以认为,预测未来是生物进化出来的求生本能,各自独立发展的文明产生相应的巫师之类的职业,不过是这种深层次原因驱动的一种表现罢了。

近代科学,大部分所做的工作是对这些进行预测的规律进行总结,那些物理定律,数学方程,大多都是经验性的概括推理,只不过在经验领域得到了充分的正确性验证,其实质也许不比那些女巫高明多少。科学在大部分场合,也不过是在做预言,比如航天器未来运行的轨迹,宇宙的过去未来等。

有一种观点是,如果各种初始状态和影响因子都是确定的,抛去复杂度,一切事物的未来某段时间的状态都是可以预测的,这是所谓的拉普拉斯的决定论。之所以做出这种论断,可能是拉普拉斯被数学方程所取得的巨大成功所激励。这种想法很符合我们的想当然的常识,但是后来被量子力学的概率波之类的概念所否定。未来充满几率性很难让人接受,爱因斯坦就一直反对。但如果这样是正确的话,科学就更像巫师般的模棱两可的预言了。

人脑的思考预言,似乎很大程度上建立在推理这个概念的基础上,推理更深层次看来,应该是因果律,由某种先决条件产生相应后果。

经常性的对人的思考模型进行相应的思考(这似乎是个悖论),每次最后都不可避免的归结到因果律。它似乎基本到让人惊讶的地步,从大脑结构上看,神经元的前后传递本身也可能就是为因果律提供了先天的基础。不过因果这种关系隐含了一个假设,就是它必须以时间为前提,这样因果律似乎有了更基本的东西在支撑。

康德说,时间只不过是我们内感官的一种形式罢了。也许正是因为人的思考模式的存在才有时间的概念,对过去的记忆,以及对未来的推测,是这种思考结构上的种种表现。时间和空间这些纯粹概念的存在,是人脑先天的模型。但是因果律这种推理的存在,是先天的纯粹概念,还是时间或者空间的一种表现形式呢?

如果把时间当作基本概念,也许推理作为其表现形式更为自然一些。不过其中应该不可避免的掺杂了其他的因素,很难具体澄清出来。

预言本身就隐含了以时间做为前提,不过是人们无法做出正确推理,而采用的一种安慰形式罢了,我们有个词语叫猜测,就是对这种概念的准确描述。从生物进化的角度来看它,比考虑它的实质更有意义。

最近公司网络改造,限制所有对公网的直接tcp连接,打开一个网页只能通过代理,于是,我以前写的一些网络程序,统统不能用鸟~~

直接的socket连接不能用,也没有办法了,但是有些走http协议的,倒是还可以利用下代理访问,便想改造一番。

python的urllib支持代理的方式访问,只要设置一个http_proxy的环境变量就行了。但是,httplib不知道基于什么古怪的原因,居然不支持。

决定手工改了,打开httplib的源代码,仔细读了一番,在HTTPConnection类的connect方法中,直接连到代理服务器。试了试,还是不行,抓了下包,原来浏览器访问的时候在http协议的GET和POST之类的请求中,将地址设成绝对路径,而不仅仅是设置Host的header。又在putrequest函数里改了。

还是不行,抓包,仔细看,很诡异的问题,直到后来无意中发现,http请求里的header里面,Host被加入了两次~~~改掉之后就行了。

真烦啊,耽误我们大量时间的,往往不是那些看起来很困难的东西,而是无足轻重的不起眼的小细节。

直接改httplib的代码有些暴力,其他使用这个库的应用程序,可能会产生一些不可预知的错误,后来改了改,实现了一个单独的代理类。

下面把主要的代码贴出来

[python]
class ProxyHttpConnection(httplib.HTTPConnection):
def __init__(self, host, port=None, strict=None):
httplib.HTTPConnection.__init__(self, host, port, strict)

def connect(self):
"""Connect to the host and port specified in __init__."""
msg = "getaddrinfo returns an empty list"
for res in socket.getaddrinfo(self.host, self.port, 0,
socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
if self._http_vsn == 11 and os.environ.has_key("http_proxy"):
proaddr = os.environ["http_proxy"];
if proaddr.startswith("http:"): proaddr = proaddr[7:];
prhost,prport = proaddr.split(":");
sa = prhost,int(prport);
try:
self.sock = socket.socket(af, socktype, proto)
if self.debuglevel > 0:
print "connect: (%s, %s)" % (self.host, self.port)
self.sock.connect(sa)
except socket.error, msg:
if self.debuglevel > 0:
print ‘connect fail:’, (self.host, self.port)
if self.sock:
self.sock.close()
self.sock = None
continue
break
if not self.sock:
raise socket.error, msg

def putrequest(self, method, url, skip_host=0, skip_accept_encoding=0):
if self._HTTPConnection__response and self._HTTPConnection__response.isclosed():
self._HTTPConnection__response = None

if self._HTTPConnection__state == httplib._CS_IDLE:
self._HTTPConnection__state = httplib._CS_REQ_STARTED
else:
raise CannotSendRequest()

self._method = method
if not url:
url = ‘/’
if self._http_vsn == 11 and os.environ.has_key("http_proxy"):
if not url.startswith("http"):
tmport = "";
if self.port!=80: tmport = ":%d"%port;
url = "http://%s%s%s" % (self.host,tmport,url);
str = ‘%s %s %s’ % (method, url, self._http_vsn_str)

self._output(str)

if self._http_vsn == 11:
if not skip_accept_encoding:
self.putheader(‘Accept-Encoding’, ‘identity’)
self.putheader(‘Proxy-Connection’, ‘Close’);
else:
pass
[/python]

在自己的应用中,直接使用这个ProxyHttpConnection代替HttpConnection类就行了。

Proxy-Connection这个header在标准的http协议里是没有定义的,但是大部分浏览器实现了它,来告诉缓存服务器应该将连接直接关掉还是保持,主要是因为缓存服务器两边的连接有http 1.0和http 1.1两种可能,这样做反而导致了误解和歧义,因为http协议头本身就有一个connection来控制。现在的大部分浏览器会加入一个判断,如果连接的是一个代理服务器,就会使用Proxy-Connection,如果是真正的服务器,就采用标准的头。与之相关的一些讨论可以google到。

下了几天雨,今天终于放晴,心情也为之一变。

周六下的很大,上午有些感冒,下午很郁闷,爬了一把南山,中途雨下的很大,浑身淋的湿透。

上周末我尝试骑自行车到山顶,当时感觉没有多高,奋力往上骑,有些地方坡度甚至已经超过了30度,在快到山顶的时候虚脱了,实在走不动,我喘气都上不来了,汗水已经把我全身浸没,脸色铁青,几乎倒在地上。休息一会决定放弃,我连走路的力气都没有了。回去的路上,一个小孩子看到我吓得往他妈妈怀里钻,唉,真的想自己看看当时的形象。

周六我步行爬了上去,一路走来,到了山顶,没有感觉丝毫的劳累。看着道路的坡度,实在是感叹我居然能够一直骑上去,再看看我放弃的地方,距离山顶只差那么一点点,真是可惜啊,回想一下,就是这么一点点距离当时也实在没有力气上去了。为山九仞,功亏一篑,就是最后的一点点,将之前所有的努力都一笔抹煞,实在令人扼腕痛惜。

可能换一辆性能更好一些的单车会好一些,其实主要还是刚开始我骑的太快了,如果一开始慢慢的走,也许不会那么累,但是谁又知道呢,走的慢了,可能需要更多的功才能维持。第二次步行给我的感叹最多的就是,这座山实在是太陡峭了。

这次登山的经历,跟最近这段时间发生的一件事情倒是有些相似,也许昭示着我应该放弃吧。

这个空间的提供商说提供ssh访问,但是需要额外申请,那就申请吧,提交之后一直没有反应,可能是我填写的理由不够充分。

不过既然有权限执行perl脚本,那想必我的账户已经具有执行一些shell命令的权限了,只不过他们没有给我提供远程进行ssh的方式罢了。

但如果使用perl写一段cgi脚本,提供一个输入框,输入需要执行的命令,直接通过perl调用系统命令,是不是就能够实现一个简单的shell了?

下面是这段perl脚本

[perl]
#!/usr/bin/perl

use CGI qw(:all);

print header(),start_html("a simple shell");

print "<pre>n";
if (param("cmd")){
$c = param("cmd");
print `$c`;
}
print "</pre>n";
print start_form(-name=>"fm"),
textfield("cmd","",120),
end_form;

print "<script>document.fm.cmd.value=”;document.fm.cmd.focus();</script>";

print end_html();
[/perl]

放上去,随便敲下,cat /etc/passwd,果然很爽,除了不支持类似vi之类的交互模式,对于大部分场合已经足够了。

还有些不足,比如到stderr的输出无法重定向出来,仔细想想,应该有解决方案吧,不过也没必要了,倒是想到一个方案,先把标准错误流重定向到一个临时文件,再cat出来。

用了几下之后便把这个脚本删掉了,直接放到外面太危险了

从5月23号开始,megabyet的免费空间就一直访问不了,连接的时候服务器timeout,一开始我以为是down掉了,过了一天还是不能访问,心想维护人员也不可能这么不专业吧。于是我怀疑是否被墙掉了,但是如果被墙掉一般会是reset by peer的错误,timeout还是服务器挂掉的可能行比较大一些。

后来翻出去看了一下,果然能够正常访问,仔细想想原因,也许是ip被直接干掉了,在bing.com里输入ip:64.79.79.227有上万条结果,如此多站点都指向在这个地址,总有几个站点的内容敏感,被干掉也属正常,唉,好东西都被我朝糟蹋了。

一开始用blogger,遭墙,然后是appengine,也是断续的被封,后来用免费的megabyet以后以为高枕无忧,怎知到最后还是挂掉。

于是痛下决心,决定花钱租空间,对比后选择了一个叫cyberultra的新加坡服务提供商,一年$23.4,大致折合人民币160块,还算便宜,将就着用吧。

将域名的A记录改到了这个ip地址。花钱果然不同,支持perl和python等cgi脚本,ping了下,大致有300ms的延迟,配置上了wordpress后感觉速度和稳定性上都还可以。

我没什么大的需求,就是一个能写点东西的地方,连这点微小的权利,都不能保障,政~#府(连这两个字都要拆开写)啊,让我如何不愤怒呢~

新家,第一篇,发泄一下这几天的不爽。