不是官方网站上声称的4.23,而是今天:)
升级中……
来自stephen的推荐,花了一个小时细看,不甚了了。
scalable-network-programming
作者网站
还是把伤脑筋的事情留给CPU吧
#include <iostream> #include <cstdlib> #include <cstdio> using namespace std; class CShuDu { public: CShuDu() { _iLeft = 0; _GuestCount = 0; _Depth = 0; _CurrentX = _CurrentX = 0; }; ~CShuDu(){}; void GetInput() { for( int i = 0; i < 9; i++ ) { for( int j = 0; j < 9; j++ ) { int n; cin >> n; switch(n) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: _Board[i][j].iType = FIXED; _Board[i][j].iValue = n; break; case 0: _Board[i][j].iType = BLANK; _Board[i][j].iValue = n; _iLeft++; break; default: cout << "Input Error" << endl; exit(-1); } } } } void OutputBoard(int x, int y) { cout << _GuestCount << "\t" << _Depth << "\t" << _iLeft << "(" << x << "," << y << ")" << endl; cout << "\t\t "; for( unsigned int i = 0; i < 9; i++ ) if( i == y ) cout << " " << "x "; else cout << " " << i << " "; cout << endl; for(unsigned int i = 0; i < 9; i++) { if( i == x ) cout << "\t\t" << "x "; else cout << "\t\t" << i << " "; for( unsigned int j = 0; j < 9; j++ ) { if( _Board[i][j].iType == FIXED ) cout << " " << _Board[i][j].iValue << " "; else cout << "(" << _Board[i][j].iValue << ") "; } cout << endl; } } void Guest(int x, int y) { _Depth++; _CurrentX = x; _CurrentY = y; _GuestCount++; if( _iLeft == 0 ) { OutputBoard(-1, -1); return; } for( unsigned int i = 1; i <= 9; i++ ) { _Board[x][y].iValue = i; if( IsBoardValid(x, y) ) { int _x = x; int _y = y; GetNextPosition(_x, _y); _iLeft--; Guest(_x, _y); _iLeft++; } } _Board[x][y].iValue = 0; _Depth--; } void Run() { int x, y; x = y = -1; GetNextPosition(x, y); Guest(x, y); } private: int _iLeft; int _GuestCount; int _Depth; int _CurrentX; int _CurrentY; enum NodeType{ FIXED, BLANK }; struct Node{ int iValue; int iType; bool operator==(const Node &r) { return iValue == r.iValue; } }; Node _Board[9][9]; bool IsBoardValid(int x, int y) { int X = x / 3; int Y = y / 3; for( unsigned int i = 0; i < 9; i++ ) { if( i == x ) continue; if( _Board[i][y] == _Board[x][y] ) return false; } for( unsigned int i = 0; i < 9; i++ ) { if( i == y ) continue; if( _Board[x][i] == _Board[x][y] ) return false; } for( unsigned i = X * 3; i < (X+1)*3; i++ ) { for( unsigned j = Y * 3; j < (Y+1)*3; j++ ) { if( i == x && j == y ) continue; if( _Board[x][y] == _Board[i][j] ) return false; } } // OutputBoard(x, y); return true; } void GetNextPosition(int &x, int &y) { if( x == -1 ) x = 0; if( y == -1 ) y = 0; else { if( y == 8 ) { x++; y = 0; } else { y++; } } while( _Board[x][y].iType == FIXED ) { if( y == 8 ) { x++; y = 0; } else { y++; } CheckPosition(x, y); } } void CheckPosition(int x, int y) { if( x >= 9 || y >= 9 ) { cerr << "Position Error" << endl; exit(-3); } } }; int main() { CShuDu cShudu; cShudu.GetInput(); cShudu.Run(); return 0; }
0 0 7 2 8 0 3 0 0 2 3 0 0 0 7 1 0 0 0 4 0 0 0 6 7 2 0 9 0 0 0 7 0 0 1 0 4 0 1 0 0 5 6 0 8 0 7 0 8 2 0 0 0 4 0 8 6 4 0 0 0 5 0 0 0 2 9 0 0 0 6 7 0 0 4 0 6 2 8 0 0
161 46 0(-1,-1) 0 1 2 3 4 5 6 7 8 0 (1) (6) 7 2 8 (9) 3 (4) (5) 1 2 3 (9) (5) (4) 7 1 (8) (6) 2 (8) 4 (5) (1) (3) 6 7 2 (9) 3 9 (5) (8) (6) 7 (4) (2) 1 (3) 4 4 (2) 1 (3) (9) 5 6 (7) 8 5 (6) 7 (3) 8 2 (1) (5) (9) 4 6 (7) 8 6 4 (1) (3) (9) 5 (2) 7 (3) (1) 2 9 (5) (8) (4) 6 7 8 (5) (9) 4 (7) 6 2 8 (3) (1)
看APUE的时候,P436的Program 14.4里,提到
#define PAGER "${PAGER:-more}"而我在bash下输入echo ${PAGER:-more},得到的结果是more
似乎A:-B的意思是:如果A被定义过,则结果为A;否则结果为B
但是Google不到可以确认的证据,也就不知道官方的命名是什么。
比建立影子账号的方法要简单些,对我来说也够了。
找到了txt版本的天龙八部,准备放到手机上,但发现这个版本略有瑕疵。
可能是为了在固定宽度的显示器上显示的缘故,往往到了一定字数,文章就会折行。
萧峰道:“不行!”突然拍出一掌,击向木几,只听得劈拍一声响,木几碎成
数块,匕首随而跌落,凛然说道:“杀母大仇,岂可当作买卖交易?此仇能报便报,
如不能报,则我父子毕命于此便了。这等肮脏之事,岂是我萧氏父子所屑为?”慕容博仰天大笑,朗声说道:“我素闻萧峰萧大侠才略盖世,识见非凡,殊不
知今日一见,竟虽个不明大义、徒逞意气的一勇之夫。嘿嘿,可笑啊可笑!”萧峰知他是以言语相激,冷冷的道:“萧峰是英雄豪杰也罢,是凡夫俗子也罢,
总不能中你圈套,成为手中的杀人之刀。”慕容博道:“食君之禄,忠君之事。你是大辽国这臣,欲只记得父母私仇,不
思尽忠报国,如何对得起大辽?”萧峰蹭上一步,昂然说到:“你可曾见过边关之上、宋辽相互仇杀的惨状?可
曾见过宋人辽人妻离子散、家破人亡的情景?宋辽之间好容易罢兵数十年,倘若刀
兵再起,契丹铁骑侵入南朝,你可知将有多少宋人惨遭横死?多少辽人死于非命?”
他说到这里,想起当日雁门关外宋兵和辽兵相互打草谷的残酷情状,越说越响,又
道:“兵凶战危,世间岂有必胜之事?大宋兵多财足,只须有一二名将,率兵奋战,
大辽、吐蕃联手,未必便能取胜。咱们打一个血流成河,尸骨如山,欲让你慕容氏
来乘机兴复燕国,我对大辽尽忠报国,是在保土安民,而不是为了一己的荣华富贵,
因而杀人取地、建功立业。”忽听得长窗外一个苍老的声音说道:“善哉,善哉!萧居士宅心仁厚,如此以
天下苍生为念,当真是菩萨心肠。”
这样的格式在640*480的屏幕上可能很好,但是在iPhone上看殊为不爽。
解决方法:
awk 'BEGIN{ while(getline){ if( $0 !~ /^$/ ) printf $0; else printf "\n" } } END{printf "\n"}' filename
找解决方法的过程中,发现了两个附加产品:
曾尝试用sed,不果。
Update: 20090206
针对中文书,优化了一下
for f in *; do awk 'BEGIN{ while(getline){ if( $0 !~ /^[ \t\xa1]+/ ) printf $0; else printf "\r\n%s", $0 } } END{printf "\n"}' $f > $f.new; done
xA1A1是全角的\t
做Web已经快两年时间了,还没完整看过HTML的手册。
趁着今天有时间,看了一遍。
可以在这里下载,chm格式。
其实也不是很花时间,集中精神的话,一个多小时就看完了。
Windows偶尔还是有用的,除了玩游戏之外。
这两天时间比较充裕,可以有比较长的连续时间集中精神,我用来学Python了。
有C++、Perl、Bash和PHP的基础,要入门其实并不太难。
没有关注太多的细节,套用很远古一句话,语言是用来写程序的,不是用来理解的。(粗体部分请用适当的词替换)
的确很方便,而且比Perl要容易,很多。
不过似乎Python不支持++运算符,无语。
另外,Python3和Python2不完全兼容,但对我是没有丝毫影响的:)
我主要的学习资料是网上的两个教程:
都写得很好,如果是有其他语言的基础,看过应该就可以了解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;
想在mail的一个页面里,用隐藏iframe引用soso的一个页面,加载后将数据取出。
但一直报错,说…undefine。
到群里咨询过前台高手们,原来又遇到所谓的“跨域”问题了。
处于安全性的考虑,JavaScript不允许脚本处理来自不同域(Domain)的资源。
用里的话说,就是同源策略(Same-Origin Policy):
一个脚本只能读取与它同源(如由同一个主机下载、通过同一个端口下载或者下载协议相同)的窗口或文档的属性。
对于我的需求,常规的解决跨域问题的方法都不适用,而非常规手段又过于复杂,代价太大。
只有作罢了。
我所知的常规手段包括:
非常规手段
很久没写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")); }
这是今天看的第二篇和概率有关的文章——《数学之美番外篇:进化论中的概率论》。
文章的开始就提到了:
偶然性在进化中确实存在(例如,偶然性的突变可以产生新的特征),但是进化并不依赖偶然性来产生新的器官、蛋白质或其他实体。截然相反的是,自然选择,作为进化中已知的最主要机制,却会明确保留“需要的”(能适应的)特性,消除“不需要的”(无法适应的)特性。只要选择的影响力存在,自然选择就能把进化向一个方向推进,在出乎意料的短时间内产生复杂的结构。举个例子,现有由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
近期评论