一 24
这两天时间比较充裕,可以有比较长的连续时间集中精神,我用来学Python了。
有C++、Perl、Bash和PHP的基础,要入门其实并不太难。
没有关注太多的细节,套用很远古一句话,语言是用来写程序的,不是用来理解的。(粗体部分请用适当的词替换)
的确很方便,而且比Perl要容易,很多。
不过似乎Python不支持++运算符,无语。
另外,Python3和Python2不完全兼容,但对我是没有丝毫影响的:)
我主要的学习资料是网上的两个教程:
- 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: Python • 数学 • 概率
一 23
想在mail的一个页面里,用隐藏iframe引用soso的一个页面,加载后将数据取出。
但一直报错,说…undefine。
到群里咨询过前台高手们,原来又遇到所谓的“跨域”问题了。
处于安全性的考虑,JavaScript不允许脚本处理来自不同域(Domain)的资源。
用里的话说,就是同源策略(Same-Origin Policy):
一个脚本只能读取与它同源(如由同一个主机下载、通过同一个端口下载或者下载协议相同)的窗口或文档的属性。
对于我的需求,常规的解决跨域问题的方法都不适用,而非常规手段又过于复杂,代价太大。
只有作罢了。
我所知的常规手段包括:
- 设置document.domain,只适合位于不同子域的页面中使用
- 采用proxy页面中转
非常规手段
- 借助Flash
- 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: JavaScript • 跨域
一 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: greasemonkey • qqmail • reader
一 16
如果用obj.onclick = function(){…},
则脚本会异常终止。
改用addEventListener(“click”, function(){…}, true),
则一切正常。
Tagged with: greasemonkey • JavaScript
近期评论