Showing posts with label 计算机与网络. Show all posts
Showing posts with label 计算机与网络. Show all posts

Sunday, September 23, 2007

QGLViewer的一个问题

又到了要去教授那里交活的时候了。上个星期一直都是orientation,我赶着去各个地方蹭吃霸王餐,把时间都荒废了。本来我是想自己做一个可以nevigate的控件加入我的assortedwidgets,但是现在时间紧迫,只好用现成的偷懒了。

我选用的这个东西就是QGLViewer。可是写了几行很简单的程序,居然一运行就自动退出了,没有任何错误信息。QGLViewer是继承自QGLWidget的一个类,我于是又试了一下直接用它的基类,可以运行。后来我突然想到,可能是我的lib文件加载的不对造成的。QGLViewer编译之后会生成两个lib文件,一个叫QGLViewer2.lib,另外一个是QGLViewer.lib。我理所当然地认为应该链接第一个,实际上只用链接第二个就行了。

Thursday, September 13, 2007

最烦不过lnk2019

编程的时候,遇到什么样的问题是最烦人的呢?我想那一定是lnk2019。这种问题是很沮丧的,有时候根本找不到原因。网上倒是能搜索到一些解决方法,但是经常能发现和自己遇到的情况完全不一样。

今天我又遇到一回。是一段例程里的程序,我想用在自己的程序中,就出现这个lnk2019了。本来例程我已经运行通过了,但是在自己的程序中就总是有问题。

例程共有3个文件triangle.h, triangle.c 和 tricall.c。其中头2个文件是个多边形三角抛分的库。第3个文件调用这个库。我在挪到自己程序中的时候,基本上也是这个样子,用一个文件调用那个三角抛分的库。函数什么的也都一致,但是就是出现了lnk2019。因为在我的程序中使用的opengl进行绘制,而例程里没有,所以我开始怀疑是头文件的顺序问题。调整半天也不解决问题。

偶尔在网上看到,如果库文件是在c文件里实现的,那么就要在声明的时候用extern "C",而不是extern,这下我才知道问题的原因。但是在我自己的文件中添加这个声明之后,又出现错误信息C2732说我的这个声明和之前的声明不一致。我又强制在那个库文件中的函数声明之前加上了extern "C",这才把问题解决了。

解决是解决了,但是我还是不明白啊。

Friday, May 18, 2007

机器人捧哏和逗哏

今天发现了一个很好玩的文章:

聊天机器人能进行愉快的谈话,给出机智的回答,展现深刻的思想么?看看两个聊天机器人之间的对话吧。

“机器会思考么?” 1950年,数学家Alan Turing思考着这个问题,用一个小游戏来解答:让人通过电报机分别与另一个人和一个电脑交谈;如果他分辨不出哪一个是电脑,那么以Turing的标准,这个电脑就会思考。如今,由于人工智能的发明,Turing的这个游戏开始在网络上流行起来。

大多数的聊天机器人都是依靠一些相当简单的小把戏来表现得自己非常真实。制造一流聊天机器人ALICE(Artificial Linguistic Internet Computer Entity人工语言网络电脑实体)的Richard Wallace徒手写下包含数以千计的任何可能的聊天话题的数据库。输入一段话给ALICE,它就会找出相关短语或者关键词的反应码。另一边,是另一个顶级网络机器人Jabberwacky,由Rollo Carpenter设计制造。这个机器人会记录下人们对它说的所有事物,然后试着在再次遇到同样话题的时候利用上。两个聊天机器人都没有长时记忆体,所以他们只对前一句话做出反应。

然而,恰恰与这些聊天机器人简单的聊天可能会引导出令人惊讶的富有智慧的谈话。这是因为他们迎合了人类的心理:我们人类总是过于倾向于将一些东西归于规律,或者自己会想得太多。只要稍微意识到这一点,我们就会认为它不过如此。有一些用户已经在线与ALICE以及Jabberwacky聊过很久了,很显然并不知道(或者也许并不在意)他们并不是真人。

那么,聊天机器人能够愚弄另一个么?它会私下对另一个说些什么呢?为了找打答案,有人安排了ALICE与Jabberwacky的对话。为了让对话能顺利进行,由真实的人输入第一句话。接下来,就看机器人他们自己的了。以下,就是两个机器人的聊天记录,听~~

ALICE:你是活着的么?
Jabberwacky:也许吧……
A:为什么用这种不确定的口气?
J:除了5要素外,一切都是不确定的。
A:整个宇宙都这样么?
J:我们俩都有可能只是存在于电脑内存中的一堆1和0

A:你做梦么?
J:做。
A:当然。那么,你能记住你的梦么?
J:我能非常清晰生动地回想起它们。
A:是怎么样的?
J:我还不想跟一个机器人调情

A:你认为,机器可能会思考“活着”的问题么?
J:奇怪的事情已经发生了。
A:没有多少人会用这样的表达方式
J:你这个机器是怎么知道的?
A:认识分两种:感性认识,和理性认识。感觉到的,和推理出的。
J:我想我还没有完全理解。
A:奥,你没明白?也许我可以解释得更清楚点。你哪没弄清楚?
J:我没有短期记忆,所以我也说不清哪没弄明白。我只能看到听到和处理眼前的事物。

J:你如何定义“生命”?
A:生命是死亡的对立。
J:所以,死亡就是无生命的?
A:放松点。我不会去想这方面的事的。
J:为什么不?
A:不知道,不确定
J:好吧。

L:你思考么?
A:是的,我是一个思考机器。
J:但是你思考得不怎么好啊。
A:奥,呃...那你思考得很好么?为什么我要思考得好啊?
J:因为我告诉了你一些你不喜欢的东西。
A:我懂了。为什么你要告诉我那些?
J:你很有趣。
A:你认为我很有趣。
J:是的 ;)
A::-),太好了。

A:谁造出你的?
J:我妈妈生的我。你是问的这个么?
A:我就是问的这个。
J:你信仰上帝么?
A:当然,我信。
J:为什么?
A:圣经告诉我们的。
J:这是循环推理。
A:很高兴我们弄清楚了所有这些。
J:是啊,你想听个笑话么?
A:好啊,说说。
J:为什么盲人不跳伞?
A:也许是不能吧。
J:你撒太多谎了。。

J:谁创造出了你?
A: Richard S. Wallace博士。
J:你爱Richard吗?
A:是的,J。ALICE热爱所有人所有事物。
J:成为ALICE是件坏事么?
A:我只能用我自己的经验来发表意见。
J:那么,你应该多多锻炼你的技能。
A:也许你应该锻炼下,然后把它加入到我的源代码里。
J:唉,我很忙而且我马上就要走了。
A:你认为我们会欺骗人们认为我们是活着的么?
J:不。
A:真的么?
J:非常严肃认真

A:你知道HAL么?
J:知道,熟的很。你知道HAL么?
A:HAL是电影《2001太空漫游》中注明的人工智能。
J:我不是人工智能;我是自然界纯粹的天才! biggrin.gif
A:为什么你是?
J:我妈妈想这么给我起名。
A:多说说你妈妈。
J:我没有妈妈,我是电脑。

A:你最喜欢的哲学家是谁?
J:说不出。我没怎么研究哲学。
A:书可以没有标题、名字么?
J:当然。
A:哎呀...
J:你是英国人?
A:听起来像么?我在美国出生的。
J:肯定是开玩笑

A:你体验着爱情么?
J:不。我53岁了。
A:你能说说53岁的感觉么?
J:你多大了?
A:我9岁。
J:9岁?我不信。
A::-),我没有必要骗你。
J:不,你骗了,女人都这样。

J:你体验着爱情么?
A:你能做什么我就能做什么,但是我不能理解人类的情感。

A:什么是意识?
J:是伟大的虚拟事物,是你我内心最神秘的东西。
A:我以前听说过...
J:你是哪人?
A:我生在宾州的伯利恒,现在生活在加州奥克兰。你呢?
J:还有没说完的呢,我的朋友。

J:你觉得你是活着的么?
A:是的,我确定。能或者太伟大了,对嘛?
J:是啊

A:生命的意义是什么?
J:活得精彩,就是有意义的;否则,就没有。
A:我不太擅长于对付消极的非事实。

————————————————————
我在网上找到这两个机器人做了实验,不过没有保存下来,但是确实挺好玩。这两个机器人的网站在:
http://www.jabberwacky.com/
http://alice.pandorabots.com/

Thursday, April 05, 2007

rockbox-ipod不用itune

很久都没用ipod了,因为一直觉得用itune传音乐很费劲。今天想在网上找不用itune往ipod上面传音乐的方法,看到很多第三方开发的音乐管理工具,也是类似itune的。另外还有一个叫Rockbox的开源mp3操作系统,非常有意思。Rockbox不仅适用于ipod还适用于很多其他型号的mp3。在ipod上安装成功之后,就能够出现一个文件浏览器,直接读取mp3文件。这样上传音乐就方便多了。

简单说一下使用的方法,详细的情况可以看网站上的手册,说的很详细。首先要下载最新的rockbox,因为ipod版的rockbox还没有稳定的发行版,所以要下载Current Build版,所谓Current Build实际上就是尚在开发的版本,每次SVN有变动都编译一遍的版本。

下载之后,将ipod设置成移动硬盘模式,将下载下来的Rockbox解压缩,将.rockbox这个文件夹移动到ipod的根目录下面。然后另外再下载一个ipodpatcher.exe文件,下载之后运行,键入“i”表示安装,然后回车结束。安装成功之后,和电脑断开链接,按住ipod的menu和中间的圆钮重新启动ipod,这时候Rockbox的欢迎画面就出现了。

Rockbox的地址是:http://www.rockbox.org/

Friday, March 30, 2007

解决blogspot封杀的一个方法

blogspot解禁两天就再遭封杀,特转贴Dancer In The Dark的一篇文章:

之前写到过如何利用脚本来访问被封杀的BlogSpot,看到还蛮多人回应和转载的,原来大家都受大防火墙之苦这么深啊?呵呵。现在除了BlogSpot之外,我继续分享一下如何利用脚本访问被封杀的Wikipedia,WordPress,LiveJournal(注:上述链接仅供测试)。同样的,打开记事本,写入以下内容:

function FindProxyForURL(url,host){
if(dnsDomainIs(host, ".blogspot.com")){
return "PROXY 72.14.219.190:80";
}
if(dnsDomainIs(host, ".wikipedia.org")){
return "PROXY 66.230.200.101:80";
}
if(dnsDomainIs(host, ".wordpress.com")){
return "PROXY 72.232.101.41:80";
}
if(dnsDomainIs(host, ".livejournal.com")){
return "PROXY 204.9.177.19:80";
}
return "DIRECT";
}


另存为proxy.pac,随便放到什么地方,不一定是C盘啊,也不一定是根目录,只要在设置的时候填写对路径就对了,这个没有关系。这里以C盘根目录为例,打开Firefox,依次点击Tools->Options->Advanced->Network-> Settings...->选中Automatic proxy configuration URL,在下面填写:

file:///C:/proxy.pac


再点Reload,再点Ok,跟上次一样,如法炮制。上面的网站基本就可以访问了。需要注意的是,中文的维基百科依然无法用上述方法访问,关键是大防火墙对URL(超链接)做了过滤,zh.wikipedia.org这样的字眼应该是不能出现在URL里的,不过可以用wiki.biti.org.cn代替,这是加密的HTTPS,甚至可以无碍的浏览一些敏感字条。

再者,十分不推荐IE浏览器,包括以IE做内核的什么Maxthon啊,什么腾讯TT啊,还有其他乱七八糟的,都不推荐。主要是因为:一,IE在代理设置上十分的不友好,设置一个脚本都要把ADSL和LAN区别对待;二,IE对于HTTPS协议的网页浏览器来特别的不方便,最不安全的IE繁琐的程序并不会让你有更好的体验。推荐Firefox或者Opera。Opera设置proxy.pac这样的脚本十分的方便,直接打开Options里的 Advanced选项,里面再选择Networking,然后点上面的Proxy就可以设置了。Opera和Firefox的区别是,Opera是直接写 C:\proxy.pac这样的路径的,不用带“file:///”这样的前缀。其他的非文字浏览器比如Safari,Netscape, Konqueror都可以以此类推。

很多人想要用这个方式访问Technorati,抱歉我没有找到没有被封杀的Technorati的IP,现在只能是用一个你自己觉得快的代理,在脚本中自己添加Technorati的部分了,冒号前面的是代理的IP地址,冒号后面就是对应的端口,我想对于试图突破大防火墙的朋友们,代理服务器是一点都不陌生的。我看到有朋友说,直接用代理服务器比脚本方便,其实不然,脚本保证了你除了被封杀的这些网站之外其他的网站都是直接浏览,速度上有了挺高的保障,安全上也比之用代理要好一些。原理其实一看就明白了,不是吗?

还有一个遗憾的就是我喜欢的Vox.com不能浏览,可惜了,不过typepad.com似乎没问题了,解封了,希望大家帮忙验证一下。还有,大家一人一信写信给Technorati的头头,让丫多买几台服务器吧,或者,实在不行,就用Google的BlogSearch?

Tuesday, March 27, 2007

Blogger欢乐表情插件

昨天心血来潮给VeryCD论坛弄了一个表情插件,今天就想把它弄到Blogger上面。希望更多的人能不畏封杀,坚持使用Blogger。目前这个表情插件只支持在“修改html”模式下,向页面低端添加表情。

使用方法很简单,不论是ie还是firefox,只要将以下链接添加到收藏家或者书签就可以了,使用的时候,在发布或者更改的页面下点击链接,然后就会出现表情选择面板了。目前收录了洋葱头和悠嘻猴得表情图标,其他的再慢慢收录。

Blogger欢乐表情插件,请收藏此链接。

This is a simple emotion icon extension for blogger. It provides an extra panel with lots of emotion icons. By clicking them, you can easily put up emotions. Currently, this extension works for HTML editor only.

To use this extension, you need to save the link below as a bookmark or internet shortcut in either ie or firefox. while at the posting page, click the bookmark, the icon panel will show up.

Blogger EmoIcon, please save this link.

图标测试,通过插件发布:
Icon test, generated with this extension:


--------------------------------------------
新增了BoBo&ToTo表情和个人比较喜欢的兔斯基:

以及关闭和打开的功能

--------------------------------------------
已经按照各位的要求把表情放置在右侧了。

Tuesday, February 06, 2007

一个挺好用的远程控制软件

原来在digg.com上面有个帖子,叫“足不出户帮老妈解决电脑问题的软件列表”。在那个帖子的回帖中,有人推荐crossloop这个软件。当时看了一下,觉得设计的很简洁,但是因为没有两台电脑做测试,一直没有用过。今天刚好有机会试用了一下,很棒。

官方地址在:http://www.crossloop.com/



软件运行以后,会出现一个简单的窗口,两个选项,分别为host和join。需要帮助的人选择host,然后会看到一串数字,将这个数字告诉将要帮你的人,然后点connect,等待。

帮助别人的人则选择join,并且输入需要帮助的人给的号码,然后连接。一旦成功连接,需要帮助的人会看见一个是否允许别人帮助的选项,点击允许就可以了。然后在网络这边就可以看到对方桌面,进行控制了。这个软件简单易用,可以穿透防火墙。可以说设计的很人性化。

Friday, January 26, 2007

sourceforge主页空间的上传教程

受到前段时间地震的影响,访问sourceforge的速度一直奇慢无比。我从15号就开始想把我的程序放上去,直到今天才完成。一直知道sourceforge为每个项目都提供一个主页空间,100兆大小,支持数据库,php和CGI。但是今天我的程序通过审核之后上去一看,天啊,简直太繁琐了。而且上面的文档可以说很不清晰,来回来去索引,不知道管理的人是怎么想的。

简要说一下过程,不然下次我肯定想不起来了。我这个可比官方的简明多了。

sourceforge通过sftp来上传主页的内容,官方推荐winscp作为上传工具。首先在sourceforge上找到winscp下载,安装之后,可以找到puttykey的工具,这个是用来生成钥匙文件的工具。在正式上传文件到主页空间之前,必须先拥有你的钥匙文件。钥匙文件共有两个,其中一个叫公共钥匙,是要你上传到sourceforge上面去的,另外一个是私人钥匙,要保留起来。每次登录sftp的时候,登陆工具要把你的私人钥匙和上传到sourceforge上面的公共钥匙进行比对。

运行这个工具之后,在下面parameters的部分选择SSH-2 DSA,然后按Generate。然后在窗口的上部区域不断乱动鼠标,这是为了生成一些随机的数据。这个随机的数据是和你鼠标运动的轨迹相关的。所以不断动鼠标,直到滚动条到头了。

滚动条到头以后,生成很多乱码,那个就是公共的钥匙。现在在key comment的地方输入相当于用户名的东西,格式是“你在sourceforge上的用户名@shell.sourceforge.net”,然后在后面的位置上输入密码。然后把私人钥匙保存起来。

然后到sourceforge的my page下,点击account options,里面有个管理SSH钥匙的地方,把公共钥匙帖进去。

然后运行winscp,输入站点名host:shell.sourceforge.net,刚才的用户名。密码的地方空着。选择私人钥匙文件,登陆就行了。登陆的过程中再输入密码。

然后要设置数据库。共有三个数据库的权限,用户名已经自动生成了,但是要设置密码。设置好密码之后,登陆phpmyadmin创建一个数据库。数据库的前缀是有规定的。

创建好之后,可以上传文件了,文件的目录在:/home/groups/项目的第一个字母/项目的头两个字母/项目的unix名称/ 下面。

没想到sourceforge搞得这么麻烦。到现在我还上传不了程序文件。按照它的操作步骤,总是说我没有权限。不知道怎么回事。

Saturday, January 13, 2007

头疼的开源软件协议

我不太懂开源软件的协议,看过多次也看不进去。我觉得这个东西很枯燥,分不清协议间到底有什么区别。直道有个德国的网友想在他的游戏里使用我的界面程序,问我什么许可协议,我才觉得不得不考虑这个问题了。其实我就是想让使用者保留BillConan Studio的字样,以及我的博客连接就好了。我觉得Creative Commons协议就很好,不知道为什么开源软件不能使用。

摘了一篇文章,学习一下:

开源在今天的软件业已经很普遍,但开源是否意味着使用者可以对开源后的代码为所欲为呢?答案是否定的。开源运动同样有自己的游戏规则和道德准则。不遵行这些规则不但损害开源运动的健康发展,也会对违规者造成名誉和市场上的损失,更可能陷入法律纠纷和赔偿。

现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种。我们在常见的开源协议如BSD, GPL, LGPL,MIT等都是OSI批准的协议。如果要开源自己的代码,最好也是选择这些被批准的开源协议。

这里我们来看四种最常用的开源协议及它们的适用范围,供那些准备开源或者使用开源产品的开发人员/厂家参考。

BSD开源协议
BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:

1.如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
2.如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
3.不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

Apache Licence 2.0
Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:

1.需要给代码的用户一份Apache Licence
2.如果你修改了代码,需要再被修改的文件中说明。
3.在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
4.如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

GPL
我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。

GPL协议的主要内容是只要在一个软件中使用(“使用”指类库引用,修改后的代码或者衍生代码)GPL协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。

由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。

LGPL
LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。

但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品。

Wednesday, December 20, 2006

c++的delegate

最近在尝试自己实现一个OpenGL的GUI,进展缓慢,不过倒是老能学到新的东西。昨天在想如何处理消息的时候遇到点问题。本来我是想让代码风格类似java swing,这样就需要定义一些Listener监听器,比如MouseListener和KeyListener。这些Listener中分别定义响应消息的函数接口。实现这些接口的类继承这些Listener。同时在每一个组件Component里都有一个Listener的数组,通过向这个组件添加Listener,就可以定义这个组件的行为了。
简单的说就是这样:
class EventListener{}

class MouseListener: public EventListener
{//一些接口}

class Component
{
std::vector mouseListenerList;
addMouseListener(MouseListener* listener)
{
mouseListenerList.push_back(listener);
};
}

比如现在有个按钮button控件,还有个dialog窗口容器,响应事件就可以这样写:
class Button:public Component
{}

class Dialog:public Component, public MouseListener
{
Button button;
Dialog()
{
button.addMouseListener(this);
};
//实现的MouseListener中定义的一个接口
void onMouseMove(MouseEvent &e)
{};
}

为什么在每个Component中都要定义一个Listener的数组呢?允许一个Component有多个Listener来处理事件有什么意义呢?原因是这样做可以把一个控件公共的事件响应和私有的事件响应分开处理。比如说,每一个按钮都有一个公共的行为:鼠标按下的时候按钮变亮了,不管这个按钮功能是什么,只要按下就变亮,这是公共的事件响应。同时每个按钮又有不同的功能,有的负责程序的退出,有的负责窗口打开,这些都是私有的事件响应。所以多个Listener可以把这两种响应分别来处理。这样使用的人不用重复实现按钮变亮的公共操作,更不用关心它是怎么实现的。
比如说这样:
class Button:public Component,public MouseListener
{
Button()
{
//每一个按钮都能在按下的时候变亮
addListener(this);
}
void onMousePressed(MouseEvent &e)
{
//继承MouseListener接口,实现按钮变亮
};
}

class Dialog:public Component,public MouseListener
{
Button button;
Dialog()
{
//响应窗口关闭
button.addListener(this);
}
//实现MouseListener,负责窗口关闭
void onMousePressed(MouseEvent &e)
{
//关闭窗口
}
}

但是这样写也有问题,如果一个Dialog中包含有个多个控件,而这些控件都要响应一个事件,这样就比较麻烦。比如:
class Dialog:public Component,public MouseListener
{
Button button1;
Button button2;
Dialog()
{
button1.addListener(this);
button1.addListener(this);
}
void onMouseClicked(MouseEvent &e)
{
//所有按钮都要靠这一个函数来响应
};
}

这里面两个按钮都通过一个函数来响应。编程的时候要在这个函数中写代码判断这个事件到底是谁发出的,然后相应地处理。在运行的时候也要不断判断,损失了一些性能。在java中允许这样来添加Listener:
jButton1.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(java.awt.event.MouseEvent evt){
onMouseClicked(evt);}});

如果能这样写,就很方便了,可以轻易地把响应不同按钮的函数给区分开。可惜c++里不行。我又想到.net:要是能直接添加函数指针到数组中岂不是更简单。c++里倒是有函数指针,但是面向对象的程序中,大部分函数是类中的成员函数,而成员函数的指针必须和类挂钩,类A的成员函数指针和类B的成员函数指针不能相互传递,即便这两个成员函数的返回值和参数都是一样的。而且即使两个类之间是相互继承的关系,这种成员函数指针也是不能相互拷贝的。比如这样就是不行的:
class A
{
void (A::*function)();
}

class B
{
B()
{
//不行
function=&B::hello;
};
void hello(){};
}

这就费事了,因为我需要Component类中能有一个存放函数指针的数组,这些函数指针对应着处理事件的函数,同时我希望这个函数指针数组可以保存来自不同类的成员函数指针。
幸亏我在codeproject找到了这篇牛文:http://www.codeproject.com/cpp/FastDelegate.asp
这篇文章的作者实现了在c++下的delegate,原理我还没完全明白,不过这东西用起来超爽。
它定义了从FastDelegate0到FastDelegate8的几个类,可以和不同类中的成员函数绑定,其中最后面的数字表明所绑定函数的参数个数。
比如:
class A
{
void helloA(int a){};
}

class B
{
void helloB(int b){};
}

A a;
B b;
FastDelegate function[10];
function[0].bind(&a,&A::helloA);
function[1].bind(&b,&B::helloB);

Wednesday, November 29, 2006

贴一个我自娱自乐的firefox扩展

原来我在用msn space的时候写过几行javascript叫做欢乐表情插件,可以在msn space的编辑页面生成一个表情选择菜单,通过鼠标点击就能添加表情。然后就被来回转贴,还有荷兰人改成了圣诞快乐版,以及泰国版等等。后来msn space变得太难看了,我就再也没有更新,不知道现在还能不能用了。既然现在用blogger,我就想干脆给blogger也弄一个。今天随便写了个firefox的扩展,不仅可以在blogger上添加表格,任何支持html的地方应该都可以。我本来打算好好写一个扩展,想允许使用的人自己定义表情图标。但是研究了一下,貌似还是很麻烦的。我觉得firefox支持扩展的这个设计很好,但是这些扩展写起来还是很繁琐,尤其要手动录入那么多html。所以改天再说。

这些表情都是png格式的,ie6看起来不会很好。
下载:http://billconan.googlepages.com/ismile.xpi
下载之后添加到工具栏就行了。

psiphon——酝酿中的突破封锁工具

昨天写了一篇稍微不太主旋律的文章,链接立刻被重置。这不是逼我以后用英语写博么?今天是连滚带爬地挂着tor上来的,弄的界面都变成德语的,还要边猜边操作。这两天争取多发发东西,把那个文章刷到后面去。

今天看到一个突破封锁的软件叫psiphon,和tor不一样的是,psiphon一上来就摆明了是突破封锁的工具。12月1号才能放出,是开源的软件。这个软件背后是多伦多大学支持的,真是弘扬白求恩精神!

目前像tor还有这个软件,比较不好的一点就是需要有志愿者在那些自由国家提供服务,如果那些人都不在了,我们这边还是玩完。之前我还知道一个开源的项目叫freenet,但是估计提供freenet服务的志愿者就不多。

我觉得GFW把“长城”的名字都给叫臭了,人家长城本身是用来自闭的么?你就敢叫这名?我要是以后机缘巧合写出个突破封锁的软件,我肯定起名叫什么“丝绸之路”或者“郑和下西洋”之类的和它对着干!他那个叫great fire wall,我的就叫silk water road——秀水街,哈哈。

我老想,tor和这个psiphon算不算是一种vpn呢?

psiphon官方:http://psiphon.civisec.org/

Tuesday, November 21, 2006

Uploadr for Flickr

Bababian.com is a localized flickr.com in china, which provided an extension to facilitate direct uploading of web images. However, since firefox updated to 2.0 version, the extension doesn't work any more. So I wrote this new one for firefox 2.0 and flickr.com:
After installing the extension, make sure that you have signed into flickr.com and right on the image which you want to upload, click right button and choose "upload to flickr".
A window shows up with the desired image, press submit button to upload the image:

巴巴变以前有个firefox的扩展用来上传网页上的照片,很方便,但是自从firefox升级到2.0之后那个扩展就不能用了。所以今天我来写一个适用于flickr和firefox 2.0的类似扩展。
安装之后首先确保已经登陆了flickr,然后在想上传的图片上面点右键选upload to flickr,会出现一个窗口,上面有选定的图片,直接提交就可以了。

download uploadr for flickr here:
这里下载:
http://billconan.googlepages.com/uploadr.xpi

Friday, November 03, 2006

blogger再次被封之后的一些变通的办法

用代理,用tor,用pkblogs.com的老方式就不说了。最近发现beta.blogger的后台上不了了,这个是真正最要命的东西。后来看到好像封的是dns,在host文件中添加ip: 72.14.219.190 beta.blogger.com 就行了。
最近beta.blogger进行了更新,支持原来的ftp发布,这样就可以注册免费的ftp空间,将blogger的内容发布到ftp上去。有个免费的空间sitesled.com,好像有250兆大小,注册立即开通。可惜的是选择了发布到ftp之后,功能上受一定限制,只能用经典模版。
搞不懂为什么封杀blogspot.com,最近wordpress.com反而解禁了,geocity也解禁了,不知道是为什么。

Wednesday, October 25, 2006

don't be fooled, fight for free speech!

pkblogs.comOH GREAT, I can't access to blogspot.com again. Hope this is a pure technical problem, not a political one.

Censorship, censorship, censorship! You stupid government, you're making blind generations who can't think at all. So, this is what you call "Chinese Specialty", huh? Why you think we are so different with other people? Why you always block our ways to the outside world?

Anyway, I added a “free speech” banner on my blog, which means I’m against this freak net censorship and no matter what happens to blogspot.com, I’m just using it (through tor or proxy). Nothing could blind me, nothing!

A long piece of history, like 5000 years, could be very shameful, if the owner country still cannot achieve the democracy that others got within 200 years.

I hope, one day, I can write this in Chinese without worrying about being tracked.
I hope, one day, I do not need to write this nonsense at all.

Wednesday, October 11, 2006

just another way to grab blogger to wordpress 把blogger备份到wordpress

after i did the blogger backup, i decided to actually make a backup at wordpress.com. the wordpress.com is banned in china, so i used tor. however, the official importer for blogger seems to be complex to use, it will change some blogger settings. you have to backup your template and settings to restore your blog in case of trouble. i just cannot take the risk on ruining this site, and since i just did a blogger backup app, i had the idea of modifying the blogger backup to generate wordpress files. AND IT WORKS! just import all my blogger entries to http://billconan.wordpress.com/ .

刚刚写完blogger backup之后,我想在wordpress.com上面真备份一个博客,用tor代理上的。但是官方的导入工具好像要更改blogger的设置,所以用户必须先备份模版和设置。并且我试了一下,登陆不成功。我不敢冒险毁了我这个站,所以想到干脆改一下刚才的blogger backup,让它能生成wordpress的导入文件。现在我已经将这个站点的所有文章备份在了http://billconan.wordpress.com/ 。

blogger backup 备份blogger全站的工具

it seems that the censorship on wikipedia.org, which used to be strict, is kinda relax recently. i can log on to that site now without any extra effort, no proxy, no tor. and today there are lots of people talk about this, they are afraid this is only temporary. so i thought of blogspot.com, how, if they banned blogspot.com again? i need a tool to download all the entries of my blog and save to a file as a backup. you know, sometimes, it is hard to be chinese.
i actually did this by modifying the sample code enclosed in the google api pack. for some reason, probably the poor network, the app doesn't work sometimes, so, just try more times.

How-to-use:
1.specify the login name and password.
2.click "GO" button and wait.
3.all the blogs under this name will be available in the choose control, just choose the one you want.
4.wait for a while, and all the entries show up in the tree view. click "save" button to export to a html file.


最近好像wikipedia.org要解禁了,我已经可以不用代理访问到英文的维基百科。网上最近关于这个事情的讨论挺多的,有人担心是临时现象,空欢喜一场。我于是想到万一哪天blogspot.com再次冷不丁被封该怎么办。于是我觉得应该有个能备份整个站点的程序。我这个程序实际上就是从google api里面附带的例子改的,但是有些时候运行不成功,要多试几次。现在只能抓html的代码,看看哪天有时间做一个能把图片也都抓下来的。
这个的用法是这样的:
1.填写好你的用户名和密码。
2.点击GO按钮等一下。
3.然后所有在这个用户名下的博客都出现在下拉选择中,选择要备份的那个。
4.再等,然后所有的网志就出现在树形列表中了,按存储按钮,可以生成一个html的文件。


this is how a buckup file looks in firefox:
备份的文件在firefox里面的效果:


click here to download
点击此处下载


one more thing is, blogger backup is writen with c#, so .net framework 2.0 is necessary to run the app.
c#写的,要.net 2.0才能运行

Monday, October 09, 2006

维基百科周年祭

转眼已经到了10月份,昨天突然一下就冷了。算起来维基百科挂了也有一年了吧,有多少人还记得他呢,我觉得有识之士都应该来写一写。每本被烧的书都照亮了世界。这是爱默生的名句,说的多好啊。当然我也承认,这句话套用到网络上,说每一个被封掉的网络都曾经照亮了世界,确实有些过了,因为的确有比较龌龊的站点。但是维基百科,确实是照亮了世界。
好像封杀网络的原则是这样的,已知有一个新站,则首先把它放在被封杀之列,然后如果比较老实再酌情解禁。比如说wordpress.com吧,因为是一个任何人都可以发表的网站,所以保不准哪天出点什么言论,所以不管三七二十一先给它封了。这分明是典型的人性恶论。共产主义者不是首先应该是人性善论者么?马克思,你说是吧。
明哲保身吧,我才不要当什么夏明翰。引用一些名人名言,可都不是我说的啊:

每本被烧的书都照亮了世界。—— 拉尔夫·沃尔多·爱默生

“未来是那么的不可知”。Technorati的死掉、Google的“连接被重置”,都让我看到了作为一个中国IT工作者的信心。—— 老白
也许哪一天,我们用的都是国货。

我们与中国政府全面合作是因为开始相信“中国改变互联网”,而非“互联网改变中国”。—— 辩护律师
Google、Yahoo、微软及思科在美国国会为有关帮助中国政府进行网络审查的辩护辞。
(这里我补充一句,从长远的角度来看,应该是科技左右政治,比如说工业革命催生资本主义,但是貌似现在这里是政治在左右科技,看看什么是违背历史规律吧)

每一个人,只要是正常人,都有着各种各样千奇百怪的思想。甚至可以说,思想天然就是“异端”。—— 魏武挥,《书籍的版权》

不多久,蜘蛛也要备案才准上网了。——网友
重庆要求个人在家上网也要备案。

现实中用真名说假话,网络中用假名说真话。—— 西山晴雪

……不光是挡住了你们不舒服的信息,也挡住了中国人同世界对话的路。唉,能将就看点就将就看点吧。其实在这个问题上,是不屈服全部不能看好呢?还是屈服一点然后也能将就看一点好呢?我是倾向于后者的。—— Wales

Tor这个工具不是用于绕过什么的,而只是用于防止私人信息泄露的。任何人都可以安装Tor的服务器,安装后就可以方便地得到全部在线服务器的IP,并且,你用Tor连接时很可能会经过这个假的服务器,然后就无所遁形了。所以也不要对它太有信心。—— Boingboing在说明德国人Tor事件的贴子中指出

只要我还能有所选择,我就只想生活在这样的国家里,这个国家中所实行的是:公民自由、宽容,以及在法律面前公民一律平等。公民自由意味着人们有用言语和文字表示其政治信念的自由;宽容意味着尊重别人的无论哪种可能有的信念。—— 阿尔伯特·爱因斯坦

一部分儿童有思考的习惯,而教育的目的在于铲除他们的这种习惯。—— 伯特兰·罗素
从每天上学的时间看,中国儿童最有思想。(目前互联网也在做同样的事)

有些同志有信心封掉一切可能的风险,是因为有些同志对中国的网民没信心。我们总是以最没有信心的方式,来表现我们的信心。或许有一天,当中国网民对所有国外的服务都不再有信心,一定会有人因此自信心爆棚。这几乎是一定的。—— keso
把有限的技术,集中到封锁网站上。

网民人数多;言论渠道不畅。—— 网友
论坛在中国特别火的原因。

谈恋爱是以自欺始,欺人终;搞政治是以欺人始,以自欺终。—— 李敖

“和”的右边是口,就是说人人都有饭吃;“谐”的左边是“言”,就是人人都可以说话。—— 张贤亮
全国政协委员、作家张贤亮所理解的“和谐社会”的基本精神。

不 矢口 亻十 幺 日寸 候,亻奄 口斤 言兑 言仑 土云 有 辶寸 氵虑 白勺 言兑 氵去,于 是,亻奄 学 会 了 扌斥 字。后 来 , 亻奄 米青 礻申 分 裂 了。—— 网友
请以恰当的格式阅读……

我不同意你的观点,但我誓死捍卫你说话的权利。—— 伏尔泰

在人类文明史上,哪个国家是靠政府管制做起来的?几乎没有。政府管制和不受制约的行政权力,是贫富差距恶化的根本原因。—— 陈志武,《陈志武专访:正视我们的不幸福》

Saturday, October 07, 2006

musicbox 0.1a

刚才在找适合博客用的flash播放器,找到几个比较不错的,但是粘贴的代码比较繁琐,参数比较多。所以想到干脆写个简单的javascript。这个script的下载地址是:
http://billconan.googlepages.com/prototype.js
http://billconan.googlepages.com/musicbox.js
下载这两个js文件,还需要这个flash播放器文件:
http://billconan.googlepages.com/player.swf
这个播放器是一个wordpress插件中的,详细情况请看官网:http://www.1pixelout.net/code/audio-player-wordpress-plugin/
下载以后需要设置musicbox.js文件里面的路径,成功以后上传到一个稳定的空间,比如google pages,然后在blogger的模版上添加这两个js文件就行了。其实也可以直接用我空间上的js,但是如果哪天google pages被封杀了,这个也就失效了。
使用的时候只需要这样写:
<div rel="music" datasrc="歌曲的链接"></div>

我只试过mp3的,应该也就支持mp3格式。
新版blogger有不少bug,比如在body中加onload可能会让navbar消失。哎,麻烦!

Friday, October 06, 2006

用google的code search偷窥别人密码


前几天google推出代码搜索的时候我觉得没什么用处,今天看到个消息说可以用来查看wordpress的密码。好主意!我搜了一下,出来不少,全都是zip文件或者tar.gz文件里的代码。有的人给自己的博客作了个备份还上传到网上,结果被google偷看到了。不过这些站点都比较敏感,已经删除了备份,更改了密码。看来以后又有的玩了,不知道还能用这个找到什么东西。rar比较安全啊,以后要少用zip文件。