06

不是官方网站上声称的4.23,而是今天:)


升级中……

Tagged with:
04

来自stephen的推荐,花了一个小时细看,不甚了了。
scalable-network-programming
作者网站

Tagged with:
03

还是把伤脑筋的事情留给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)
Tagged with:
07

看APUE的时候,P436的Program 14.4里,提到

#define PAGER "${PAGER:-more}"

而我在bash下输入echo ${PAGER:-more},得到的结果是more
似乎A:-B的意思是:如果A被定义过,则结果为A;否则结果为B
但是Google不到可以确认的证据,也就不知道官方的命名是什么。

Tagged with:
03
  1. 运行regeidt
  2. 键的位置:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList
  3. 创建一个新的DWORD值,名称是想要隐藏的用户名,比如Administrator,而键值(十进制格式)设为0或者1,0即代表在欢迎屏幕上隐藏该用户,1则显示。

比建立影子账号的方法要简单些,对我来说也够了。

Tagged with:
03

找到了txt版本的天龙八部,准备放到手机上,但发现这个版本略有瑕疵。
可能是为了在固定宽度的显示器上显示的缘故,往往到了一定字数,文章就会折行。

萧峰道:“不行!”突然拍出一掌,击向木几,只听得劈拍一声响,木几碎成
数块,匕首随而跌落,凛然说道:“杀母大仇,岂可当作买卖交易?此仇能报便报,
如不能报,则我父子毕命于此便了。这等肮脏之事,岂是我萧氏父子所屑为?”

慕容博仰天大笑,朗声说道:“我素闻萧峰萧大侠才略盖世,识见非凡,殊不
知今日一见,竟虽个不明大义、徒逞意气的一勇之夫。嘿嘿,可笑啊可笑!”

萧峰知他是以言语相激,冷冷的道:“萧峰是英雄豪杰也罢,是凡夫俗子也罢,
总不能中你圈套,成为手中的杀人之刀。”

慕容博道:“食君之禄,忠君之事。你是大辽国这臣,欲只记得父母私仇,不
思尽忠报国,如何对得起大辽?”

萧峰蹭上一步,昂然说到:“你可曾见过边关之上、宋辽相互仇杀的惨状?可
曾见过宋人辽人妻离子散、家破人亡的情景?宋辽之间好容易罢兵数十年,倘若刀
兵再起,契丹铁骑侵入南朝,你可知将有多少宋人惨遭横死?多少辽人死于非命?”
他说到这里,想起当日雁门关外宋兵和辽兵相互打草谷的残酷情状,越说越响,又
道:“兵凶战危,世间岂有必胜之事?大宋兵多财足,只须有一二名将,率兵奋战,
大辽、吐蕃联手,未必便能取胜。咱们打一个血流成河,尸骨如山,欲让你慕容氏
来乘机兴复燕国,我对大辽尽忠报国,是在保土安民,而不是为了一己的荣华富贵,
因而杀人取地、建功立业。”

忽听得长窗外一个苍老的声音说道:“善哉,善哉!萧居士宅心仁厚,如此以
天下苍生为念,当真是菩萨心肠。”

这样的格式在640*480的屏幕上可能很好,但是在iPhone上看殊为不爽。
解决方法:

awk 'BEGIN{ while(getline){ if( $0 !~ /^$/ ) printf $0; else printf "\n" } }  END{printf "\n"}'  filename

找解决方法的过程中,发现了两个附加产品:

  1. 下载txt电子书的网站(不是论坛,无需注册,虽然广告很多)
  2. GNU的awk手册(比种种学习笔记要好得多)

曾尝试用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

Tagged with:
02

做Web已经快两年时间了,还没完整看过HTML的手册。
趁着今天有时间,看了一遍。
可以在这里下载,chm格式。
其实也不是很花时间,集中精神的话,一个多小时就看完了。
Windows偶尔还是有用的,除了玩游戏之外。

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?&amp;sc=qz&amp;pid=qz.s.idx&amp;ch=s.qz.diary&amp;pg=1&amp;ty=diary&amp;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 &lt; 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:
preload preload preload

无觅相关文章插件,快速提升流量