今天在vc8里发现了一段很有意思的东西,objbase.h头文件的开头是这样的
[cpp]
/*#!perl
MapHeaderToDll("objbase.h", "ole32.dll");
ActivateAroundFunctionCall("ole32.dll");
#IgnoreFunction("CreateDataAdviseHolder");
….
*/
[/cpp]
刚开始的!perl声明估计多半是用来对这个文件做一些预处理操作,自动生成一些东西

以前用微软的Debugging Tools for Windows里面的SrcSvr工具,对pdb符号文件建索引。其原理大致就是在pdb里储存一些svn的版本信息。微软给了一个ssindex.cmd的脚本来自动完成这些工作,直接就是用perl写的,而且在文档里写明要安装perl的支持。

看来微软内部使用perl还是很广泛的。

今天一直在玩ipad,实在是很爽,各方面的体验非常不错。
我一直不喜欢笔记本,ipad是个很好的替代。
试了几个数学软件,效果还可以,可惜功能不够强大,差强人意。不知道wolfram什么时候能出一个ipad版的完整mathematica来~~~


在无尽之中,自我重复
终要万川归一。无数拱顶
辐射交会,终为扶持
那巍峨的构型
万物之川流,只眷恋生命
巨星和泥土
任由一切孜孜不止
终要在上帝那里得永恒的安息

歌德

上周末在一个图书馆看到一本名字叫西方的没落的书,读了几段我就被其思维的深度所吸引,确实是一本好书。

卓越上没有货了,幸好当当还有,没有任何犹豫的买了下来。

google了一番,发现自己真的是孤陋寡闻,这么有名书都没有听说过。

上面歌德那段话,就是这本书的题词,读到的时候,真是感触颇多。

我愈发对德国人感到佩服了,科学,哲学,文学,每一个方面都很强大。

工作一年,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到。