24

这两天时间比较充裕,可以有比较长的连续时间集中精神,我用来学Python了。
有C++、Perl、Bash和PHP的基础,要入门其实并不太难。
没有关注太多的细节,套用很远古一句话,语言是用来写程序的,不是用来理解的。(粗体部分请用适当的词替换)
的确很方便,而且比Perl要容易,很多。
不过似乎Python不支持++运算符,无语。
另外,Python3和Python2不完全兼容,但对我是没有丝毫影响的:)

我主要的学习资料是网上的两个教程:

  1. Python 绝对简明手册
  2. 简明 Python 教程

都写得很好,如果是有其他语言的基础,看过应该就可以了解Python的基本用法了。

至于进一步的参考,找到了《Dive Into Python》的中文版,已经下载,作为工具书翻阅:)

趁着还记得一点,把前两天那个进化论中的概率论用Python重写了一次。
当然,结果一样,因为这个问题的数学期望是有理论保证的。

#!/usr/bin/python
 
import os
import random
 
RandomCount=0;
GenerateCount=0;
Target = list("tobeornottobe");
 
def getRandomChar():
	global RandomCount;
	RandomCount = RandomCount+1;
	return random.choice("abcdefghijklmnopqrstuvwxyz");
 
def compareList(list1, list2):
	if( len(list1) != len(list2) ):
		raise Exception;
	DifferentCount = 0;
	for i in range(len(list2)):
		if( list1[i] == list2[i] ):
			continue;
		else:
			DifferentCount = DifferentCount+1;
	return DifferentCount;
 
def generateRandomList(now, target):
	global GenerateCount;
	GenerateCount = GenerateCount + 1;
	result = [];
	for i in range(len(target)):
		if( now[i] != target[i] ):
			result.append( getRandomChar() );
			if( result[i] == target[i] ):
				now[i] = target[i];
		else:
			result.append( ' ' );
	return result;
#	print result;
 
 
Now = list(" " * len(Target));
while compareList(Now, Target) != 0:
	Result = generateRandomList(Now, Target);
	print "%6d" % GenerateCount, "|", "".join(Now), "|", "".join(Result);
print "RandomCount: ", RandomCount;
Tagged with:
23

想在mail的一个页面里,用隐藏iframe引用soso的一个页面,加载后将数据取出。
但一直报错,说…undefine。
到群里咨询过前台高手们,原来又遇到所谓的“跨域”问题了。

处于安全性的考虑,JavaScript不允许脚本处理来自不同域(Domain)的资源。
用里的话说,就是同源策略(Same-Origin Policy):

一个脚本只能读取与它同源(如由同一个主机下载、通过同一个端口下载或者下载协议相同)的窗口或文档的属性。

对于我的需求,常规的解决跨域问题的方法都不适用,而非常规手段又过于复杂,代价太大。
只有作罢了。

我所知的常规手段包括:

  1. 设置document.domain,只适合位于不同子域的页面中使用
  2. 采用proxy页面中转

非常规手段

  1. 借助Flash
  2. GreaseMonkey

很久没写JS了~~~

function Search()
{
	var keyword = $("keyword").value;
	debug("search for " + keyword);
	var url = "http://qzone.soso.com/qz.q?&sc=qz&pid=qz.s.idx&ch=s.qz.diary&pg=1&ty=diary&w=" + keyword;
 
	var soso = document.createElement("iframe");
	soso.setAttribute("onload", "ParseResult()");
	soso.setAttribute("src", url);
	soso.setAttribute("id", "soso");
	document.getElementsByTagName("body")[0].appendChild(soso);
	return false;
}
 
function ParseResult()
{
	debug("begin to parse");
	var soso = $("soso");
	if(!soso)
		return;
 
//	var ids = document.frames[0].contentWindow.document.getElementsByTagName("div");
	var ids = document.getElementById("soso").contentWindow.document.getElementsByTagName("div");
 
	for( var i = 0; i < ids.length; i++)
	{
		var d = ids[i];
		if( d.getAttribte("ss_c") == "qz.show.res")
		{
			debug("found");
		}
		else
		{
			debug(d.className);
		}
	}
	debug("end of parse");
	document.getElementsByTagName("body")[0].removeChild($("soso"));
}
Tagged with:
19

这是今天看的第二篇和概率有关的文章——《数学之美番外篇:进化论中的概率论》

文章的开始就提到了:

偶然性在进化中确实存在(例如,偶然性的突变可以产生新的特征),但是进化并不依赖偶然性来产生新的器官、蛋白质或其他实体。截然相反的是,自然选择,作为进化中已知的最主要机制,却会明确保留“需要的”(能适应的)特性,消除“不需要的”(无法适应的)特性。只要选择的影响力存在,自然选择就能把进化向一个方向推进,在出乎意料的短时间内产生复杂的结构。举个例子,现有由13个字母构成的序列“TOBEORNOTTOBE”,假设有几百万只猴子,每只猴子每秒钟挑一条短语,需要78,800年才能从26^13种可能中选出这样的排列。不过,Glendale College的Richard Hardison在20世纪80年代写过一个程序,它能够在随机产生序列的同时,保证那些已经出现在正确位置上的字母不会变化(这样做倒有点《汉姆雷特》 的味道。译注:这个句子看了大半天才明白,嘿嘿)。这个程序平均只需要336次迭代就能生成上文提到的短语,时间少于90秒。更神奇的是,把莎士比亚的整个剧本重新生成一遍也只需要四天半时间。

很好奇是否真的是336,所以也写了个程序

#include <cstdlib>
#include <iostream>
#include <string>
 
using namespace std;
 
int GenerateRandomString(const string &sTarget, const string &sNow, string &sResult)
{
	char cBase = 'a';
	int iCounter = 0;
	for( unsigned int i = 0; i < sTarget.size(); i++ )
	{
		if( sTarget[i] != sNow[i] )
		{
			int r = rand() % 26;	
			sResult[i] = (cBase+r);	
			iCounter++;
		}
	}
	return iCounter;
}
 
int CountDifference(const string &s1, const string &s2, string &s3)
{
	unsigned int i = 0;
	unsigned int iCount = 0;
	for(; i < s1.size() && i < s2.size(); i++ )
	{
		if( s1[i] == s2[i] && s3[i] != s1[i] )
		{
			iCount++;
			s3[i] = s1[i];
		}
	}
	return iCount;
}
 
int evolution(int iSeed)
{
	string sTarget = "tobeornotobe";
	string sNow;
	for( unsigned int i = 0; i < sTarget.size(); i++ )
	{
		sNow += ' ';
	}
 
	int iNotMatch = sTarget.size();
	int iCounter = 1;
	int iRandTime = 0;
	srand(time(NULL) + getpid() + iSeed);
	while( iNotMatch > 0 )
	{
		string sTemp = "             ";
		iRandTime += GenerateRandomString(sTarget, sNow, sTemp);	
		int iMatch = CountDifference(sTarget, sTemp, sNow);
		iNotMatch -= iMatch;
		cout << iCounter++ << ":t" << iRandTime << "t" << iMatch << "t" << sTemp << "t" << sNow << endl;
	}
	return iRandTime;
}
 
int main(int c, char **v)
{
	unsigned int iLoop = ( c == 2 )? atoi(v[1]) : 100;
	int iRandTime = 0;
	for( unsigned int i = 0; i < iLoop; i++)
	{
		cout << i << "----------------------------" << endl;
		iRandTime += evolution(i);
		cout << iRandTime << " / " << iLoop << " = " << double(iRandTime) / iLoop << endl;
	}
	return 0;
}

而根据这个程序的结果,生成10000次”tobeornottobe”,平均每次需要331次随机,结果还是相当接近的,当然速度就快多了。
另外,原文作者说他自己写的程序是82次,这应该是生成整个句子的次数,而不是random的次数吧。
反映到上面的程序中,就是输出结果的行数均值,也和实际结果吻合。
附上其中一次的结果:

1:	12	1	cmraiithaosb 	         o
2:	23	0	pvzordffr ha 	         o
3:	34	0	bxyneoxtr hx 	         o
4:	45	0	pdxyfkmly lc 	         o
5:	56	0	nifwqerkv tt 	         o
6:	67	0	khhcrjsep en 	         o
7:	78	0	huvvzxphl du 	         o
8:	89	0	ppkcrewns kt 	         o
9:	100	0	qzaqfoilf ky 	         o
10:	111	0	cghkflbzz vo 	         o
11:	122	1	wvopvraux df 	     r   o
12:	132	0	flvlw lwy yi 	     r   o
13:	142	0	wprip wsx db 	     r   o
14:	152	0	mpigu cub oo 	     r   o
15:	162	1	lmjwn fdt pd 	     r  to
16:	171	0	kwegg xz  fd 	     r  to
17:	180	0	vxaku tf  iv 	     r  to
18:	189	1	gtbka sm  vc 	  b  r  to
19:	197	0	ac gk qb  nd 	  b  r  to
20:	205	0	hz oc dx  gy 	  b  r  to
21:	213	0	lf xz sx  kz 	  b  r  to
22:	221	1	fe ph qo  hu 	  b  r oto
23:	228	0	pp ql b   qv 	  b  r oto
24:	235	0	ug yn g   vg 	  b  r oto
25:	242	0	uj my i   jt 	  b  r oto
26:	249	0	nq rd p   fg 	  b  r oto
27:	256	1	pw oo b   ta 	  b or oto
28:	262	0	xc x  g   jk 	  b or oto
29:	268	0	yt r  y   mt 	  b or oto
30:	274	0	el d  v   jz 	  b or oto
31:	280	0	ls l  e   wm 	  b or oto
32:	286	1	tt m  u   vn 	t b or oto
33:	291	0	 p d  z   wa 	t b or oto
34:	296	0	 r n  f   gb 	t b or oto
35:	301	1	 a t  r   se 	t b or oto e
36:	305	0	 q b  p   y  	t b or oto e
37:	309	0	 c p  e   x  	t b or oto e
38:	313	0	 e y  b   r  	t b or oto e
39:	317	0	 x p  s   f  	t b or oto e
40:	321	0	 l x  w   o  	t b or oto e
41:	325	0	 n n  i   l  	t b or oto e
42:	329	0	 q c  t   o  	t b or oto e
43:	333	0	 l b  t   y  	t b or oto e
44:	337	1	 i s  n   k  	t b ornoto e
45:	340	0	 s c      e  	t b ornoto e
46:	343	0	 m v      z  	t b ornoto e
47:	346	0	 x c      q  	t b ornoto e
48:	349	0	 r m      u  	t b ornoto e
49:	352	0	 x h      r  	t b ornoto e
50:	355	0	 z o      p  	t b ornoto e
51:	358	0	 y m      z  	t b ornoto e
52:	361	0	 e m      g  	t b ornoto e
53:	364	0	 q w      g  	t b ornoto e
54:	367	0	 q l      f  	t b ornoto e
55:	370	0	 t o      i  	t b ornoto e
56:	373	0	 k d      p  	t b ornoto e
57:	376	0	 q v      c  	t b ornoto e
58:	379	0	 z i      h  	t b ornoto e
59:	382	0	 n t      i  	t b ornoto e
60:	385	0	 a j      d  	t b ornoto e
61:	388	0	 q y      e  	t b ornoto e
62:	391	0	 s t      f  	t b ornoto e
63:	394	0	 a r      u  	t b ornoto e
64:	397	1	 o j      o  	tob ornoto e
65:	399	0	   b      a  	tob ornoto e
66:	401	2	   e      b  	tobeornotobe
Tagged with:
18

花了2个小时,细读《数学之美番外篇:平凡而又神奇的贝叶斯方法》
第一感觉是:原来贝叶斯是这样用的。

很多已经被尘封,甚至是掩埋的概念再次出现在眼前:条件概率、最大似然、马尔可夫链……

原来我仅仅是学过概率论和数理统计而已,根本不知道这些知识可以在计算机里有什么应用。
学校也仅仅是设立了这样的课程,并没有告诉我们这些课程和计算机有什么关系。
而事实上,概率论在计算机科学中可以应用的场景实在太多了。
拼写检查、中文分词、机器翻译、垃圾邮件过滤、语音识别……

不过对于大多数的程序员来说,日常的工作都是任务驱动的,
所需要的知识也大多和系统、网络、工具、框架、业务等有关,
已经很难找到数学的用武之地了。

ps:

由于csdn的相册停止服务,文章中很多图片都看不到了。
这时候可以借助搜索引擎,找到转载的文章

Tagged with:
17

Google Reader有462个GM脚本(GreaseFire的结果),而整个qq.com的域名只有一个,是用来优化qq.com的打印功能的。
这样的对比反映出了Geek们对两个域名的认同差异吧。

早上起床,写了一个用于用于阅读空间GS脚本。
just for fun啦,主要功能是在阅读时改变背景色,因为感觉现在的色彩有点单调。

已经上传到userscrips,可以在这里找到。

效果图:)
阅读空间

可惜Qzone对Firefox的支持还不好,否则也可以做一个:)

出去晒太阳了~~~

Tagged with:
16

如果用obj.onclick = function(){…},
则脚本会异常终止。
改用addEventListener(“click”, function(){…}, true),
则一切正常。

Tagged with:
13
还是挺形象的,不过名字叫浏览器战争史会贴切一点
浏览器战争

浏览器战争

Tagged with:
02

搬家了:)

preload preload preload