域名快到期了,这几天收到godaddy的一封广告邮件,说什么celebrate the Year of the Rabbit with 30% savings,没想到这个美国公司对中国用户考虑还这么周到,我一高兴,又renewal了两年,倒也挺便宜,打完折后$16.38

从这封简单的邮件里可以看出,中国的实力和国际影响力已经在逐渐增强。希望有一天我们的文化能够广泛的被西方理解接受

今天给wikipedia捐了10美元,算是支持一下吧,她给我带来的知识远多于这个价值。

btw,paypal还是很方便的,点一下确定就行了,不像国内的一堆验证密码。这样间接促进了人的消费欲望。

今天在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还是很广泛的。

最近公司网络改造,限制所有对公网的直接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到。

这个空间的提供商说提供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出来。

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

HTML设计之初,没有考虑到数学公式排版,所以要想在里面添加一些比较复杂的符号就没有标签可以使用,唯一的折衷方法是,利用图片来代替显示,但是这样实在是麻烦。

这种不足很多人都意识到了,W3C的一个recommendation,MathML,就是针对html缺乏数学公式支持提出的,刚发现的时候,我欣喜若狂,没过多久就变成失望了,缘故是,MathML需要浏览器的渲染支持,大部分用户还在使用万恶的IE6,就是现在支持的浏览器,比如最新版的firefox,渲染效果并不好,本来应该很优美的公式,看起来只是大致正确表示出来而已。

MathML最大的弊端是,一个很简单的公式,用标签写起来要浪费一大堆文本,混杂在一起,没有第三方辅助工具的话,很难编辑和阅读。

我一直想,如果能在HTML里面嵌入latex该有多好啊,从语法角度来看,成为W3C标准是没有指望了,但是就像flash一样,能够作为一个插件成为事实上的标准也行啊,这个目标看起来同样很遥远,仔细想想,有几个用户会在web页面上写科学公式呢?

唯一的做法是,把latex作为在服务器端处理的脚本,客户端浏览器请求的时候,自动执行处理,生成相应的图片,就等同于服务器端的php,asp之类的脚本一样,如此就完全不用考虑到不兼容的问题。这种想法很容易被人想到,而且早就有人实现了,这里有一个页面,可以动态生成latex的图片。

wordpress也有相应的支持,提供一个生成latex图像的服务器,把要处理的latex文本作为url里的一个参数传入,就会返回一幅图片,http://l.wordpress.com/latex.php?latex=,后面这个latex=的参数就是latex源数据,只需要加入一个img标签,然后把src写成相应的url,就可支持数学公式的显示。当然,这样毕竟还是麻烦,有时候还要转换url编码,wordpress有一个latex插件,直接支持方括号latex标签,很方便。

下面这个随便写的公式,是个试验

[latex size=”2″]frac{x+sum_{i=0}^{n}{(i^2+int_a^b{3sin^i(x)dx}})}{sqrt[3]{x^2+y^2}piepsilon}[/latex]

看起来效果很不错哦;-)