2006-10-30

Microsoft Physics Illustrator for Tablet PC

根据Chris Tao的消息,上次说的“不可思议机器”,其实是Microsoft Physics Illustrator for Tablet PC

Dipper
Actually this software was built by Microsoft MSR (maybe the author is intern from MIT), you can download it from following URL:
http://www.microsoft.com/downloads/details.aspx?FamilyID=56347faf-a639-4f3b-9b87-1487fd4b5a53&displaylang=en

一份关于JavaScript高级程序设计的评论

请访问:
http://shiningray.cn

2006-10-29

不可思议机器

来自MIT的一个神奇软件,一个力学设计环境,让我会想起了以前玩过的“不可思议机器”这个游戏——而我们的软件工程在什么年代?

2006-10-28

赶紧升级到Ubuntu Edgy Eft

上次说我用了一个奇怪的办法安装了Ubuntu Dapper,现在Ubuntu Edgy Eft发布了,就赶紧升级,直接在命令行下输入“gksu “update-manager -c -d””,然后点击“升级到6.10“,然后就开始了漫长的升级过程……
估计是发布之后大家都立即跟进,有很多的人在下载更新,我下载的速度只有几K,整整下载了2天才搞定……
新版的Ubuntu Edgy Eft最大的优点我觉得是使用了Firefox 2.0,浏览上不再那么卡了~

2006-10-26

丰收的季节

最近天气逐渐转凉,转眼就到深秋季节了,正是丰收的时节,接连几项重要软件的发布,Internet Explore 7.0Fedora Core 6Firefox 2.0,包括今天发现Ubuntu Linux也发布了最新的正式版6.10 Edgy Eft

而我也还有一些其他的,在酝酿之中……

2006-10-24

Mozilla is faster

上一篇之 后,我又尝试了一下Firefox的大哥Mozilla,突然发现果然流畅很多,虽然Mozilla少了很多功能,比如扩展和主题,但是性能上的提升是值 得的。Firefox由于扩展、主题都是基于JavaScript和XML的甚至是基于RDF的,而这两者对于性能的影响还是很大的。
话又说回来,我在Windows上虽然感觉Firefox并不慢,但当运行久了之后,也会出现和Linux下一样的情况,而且我总是使用标签页进行浏览, 似乎这样情况更加严重,也许是Firefox还存在某些内存泄露的问题——导致我现在又开始使用Opera了,不过Opera也没有x86 64版本的。

2006-10-23

Linux下的Firefox性能问题

Firefox的性能问题困扰我很久了,从Ubuntu Breezy开始就很奇怪。过去我曾经使用Ubuntu Breezy的时候,发现Firefox在Tab之间切换十分慢,JavaScript脚本的执行也很慢。
后来公司机器有空余(是一台Athlon64的),我就安装了一个Fedora Core 5 x86_64版,但情况也很糟糕。后来安装了Ubuntu Dapper amd64,起初觉得还挺快,后来就越来越慢了,于是我猜测是扩展和插件的问题,因为Ubuntu会给Firefox安装很多语言支持,而这些支持都是以扩展的形式安装在Firefox中的,于是我在Firefox将所有的语言支持扩展都禁用掉了,重启,才感觉性能上有所提升,但还是无法达到Windows下的效果。
而另外一个问题是,我在Windows上的VMWare中安装的Ubuntu Dapper i386的版本中的Firefox速度却相当快,难道是因为Firefox在x86_64架构下有性能问题?

2006-10-19

IE7正式发布


微软正式发布新的网页浏览器Internet Explorer 7,距离上个版本IE6,已经过去六年了(IE6是在2001年发布的),经过了N个版本的测试和用户的不满之后,这次会如何?

而现在趁江山还在,发布个IE7,不然,浏览器江山就要三分了。

基本觉得用着没什么不好的,除了经常会内存占用到100MB……另外,Live Mail也升级了。

2006-10-18

规则与规律[转]

http://www.newmind40.com/law_gb.htm
规则是制定的或是形成的,而规律是天然的。

  • 规则可以是个别的,而规律是公共的。
  • 规则可以包括规律,但规律不能包括规则。
  • 规则可以被改变,但规律不能被改变。规律可以与其他规律和规则结合形成
    一个新的规则并成为这个规则的一部分。
  • 规则和规律都是具体的,精确的,可重复的和可程序化的。
  • 规律在条件具备时一定发生作用,无论它是否被列入程序。
  • 规律在一个自动系统中不一定是它规则的一部分,尽管它在一定条件下会发
    生作用,因为宇宙中万物的存在和运动都有某种规律伴随。
  • 如果规则与规律不符或背离,人们称之为荒谬。
    假定一个非生命系统能够靠经验和学习发现规律,它就必须要把它引入
    自身的规则之中以形成一个新的规则,并且在这个过程中不能选择其他规则。
    这就产生了以下问题:
    1. 这个系统如何知道在它的经验中包含新的规律以及这个规律对它是否有
    用?因此我们必须提前向它提供包括这种判断和选择能力的程序,然而根据
    规则之悖论,这种程序是根本不存在的。
    2. 这个系统如何把这个新的规律与它自身现有的规则结合?而且这个结合
    过程只能利用自身的规则。否则的话,它又会面临选择规则这一悖论。
    3. 一个非生命系统如何具有自己要达到的目标?这个目标是什么?它是怎
    么来的?如果是人赋予的,它和现在的电脑有什么区别?
    4. 当这个系统从经验中发现规律以及从其他系统中收到规则时,它如何在
    不能选择其他规则的情况下判断和翻译这些东西?难道它不分青红皂白地把
    这些东西插入到它的自身规则之中吗?或者它如何过滤接收的所有输入或感
    受的信息以选择对它有用的部分?难道就象电脑那样事先由程序精确地规定
    所能接受的信息输入和感受?
    5. 这个系统如何在不能选择其他规则的情况下学习规律和其他规则呢?只
    有当这个系统获得现有规则不具备的能力时,我们才能认为它具有学习能力。
    否则的话,这种"学习"就是一种程序化模拟,让人看上去好象具有学习能力。
    6. 是否存在这样一种可能,那就是一个非生命或非人工生命的系统仅仅靠
    能学习规律和其他规则就能够使自身形成或者获得选择规则的能力?如果能
    的话,就必然存在一种规律或规则能够帮助选择规则。不幸的是这种规律和
    规则都是不存在的。如果存在的话,它就能够帮助自己选择规则,这又进入
    了规则之悖论。
    7. 有人说,这个系统可以不用规则来达到自身的目标。那么它用什么方式
    工作呢?一个无序的系统能干什么呢?智能的解释是人类的概念。决定一个
    系统是否有智能必须能被人类所解释, 人类只能按照人类自身的规则和掌握
    的规则来解释。人类无法解释人类自认为无序的系统的"智能行为"。
    以上推论可以完全否定以下学术界流行的对智能的错误概念:
  • 智能可以仅仅通过外部指令和给定程序人工实现。
  • 人类提供的程序可以使电脑具有学习能力。
  • 人工智能不一定是生命形式。
  • 目前的电脑和电脑系统具有智能。
  • 目前电脑可以具有经验。
  • 智能过程不一定是自发的。
  • 智能可以与欲望、情感和意志分离。
  • 智能可以用数字化方式实现。
  • 智能可以用数学模型方式进行模拟。
  • 智能可以是一种结果表象而不是过程。
  • 人工智能可以被复制,读出和改写

2006-10-17

Run Perl 6 now -- in your browser!

pugs web terminal
上一篇Try Ruby in Your Browser没过多久,发现Perl 6也搞了个Web终端给大家提前尝鲜,可惜Perl 6依然在试飞阶段,现在的编译器都是基于Audrey Tang主持开发的Pugs
但这个Web终端并不十分友好,看上去没有Try Ruby酷,同时也没有提供一步步的教程,看来关注Perl 6的都是高手了。最头疼的是,常常会说:

Sorry, I can't run any more sessions.
Please try again later.

2006-10-13

Python MySQLdb的重大疑问

请访问:
http://shiningray.cn/2006/10/13/python-mysqldb/

今天是黑色星期五

今天10月13号星期五,一个黑色星期五,特此纪念一下,不过我却是在睡梦中度过的,昨晚熬了个通宵做东西。最近公司的一些任务,我基本都使用Python来完成,因为这些任务本身就是一些人的手工任务的自动化。
今天0:00之前和老板还有几个同事一起去路边的夜排档吃宵夜,啃了两个鸭腿,味道真不错——不知道什么时候还能吃到南京的鸭子。而那个金华火腿,虽然金华的火腿很有名,但是金华火腿这个商标被杭州一家公司给注册了,金华人就不能公开叫卖金华火腿了~。

神奇的Wikipedia

最近被公司放到金华,最近一直很忙。今天得到一个消息,英文的Wikipedia开禁了!真是太神奇了,在这里要歌颂一下我们的Dǎng、ZhengFu,这是伟大的进步!
还发现一个很有趣的现象:除了中文简体、繁体版的Wikipedia之外,还有粤语吴语文言文的版本。据说是机器转换的……

2006-10-11

Linux各种文件系统比较

请访问:
http://shiningray.cn/2006/10/11/linux-ge-zhong-wen-jian-xi-tong-bi-jiao/

关于字体的一些基本概念

点阵字体与矢量字体

点阵字体也叫位图字体,其中每个字形都以一组二维像素 信息表示。由于位图的原故,点阵字体很难进行缩放,特定的点阵字体只能清晰地显示在相应的字号下。但对于 12-16px 这样小的汉字,点阵字体常常比其它类型的字体在屏幕上更好的显示效果。常见的点阵字体有 bdf,pcf,fnt,hbf 等格式。 对于常见的计算机操作系统,字体的显示算法需要一些字体的信息来优化屏幕显示效果,英文称为 hinting。汉字由于笔画复杂,所以 hinting 的方式与西文截然不同。使用在汉字字体中嵌入预先制作的点阵位图既可以有效地避免 hinting 算法带来的计算开销,同时屏幕上显示的汉字边缘清晰,易于阅读。
矢量字体中每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连线的导数信息等,字体的渲染引擎通过读取这些数学矢量,然后 进行一定的数学运算来进行渲染。这类字体的好处是字体可以无限放大而不产生变形。矢量字体主要包括 Type1 和 TrueType 等几类。

内嵌点阵字的字体

由于CJK字体的结构复杂,在小号字体只有使用点阵才能有清晰的显示效果,但是点阵字体很难进行缩,而且线条单一,在大号字体显示时就显得苍白无力。把点阵字体内嵌到矢量字体就能发挥两者的优点,并且也弥补了两者的不足。小号字体时清晰明朗,大号字体时字型饱满,形态丰富。常见的内嵌点阵字的字体有:北京中易电子公司宋体SimSun 、方正宋体(FZSongti)、文鼎PL上海宋(Uming)、Firefly的文鼎PL新宋(AR PL New Sung)等。

Hinting 与 Autohint

Hinting 用来最佳化字型显示的方法。由于屏幕的像素有限,向量字型的缩放需要有更多的考虑, 例如当一条线位在两个像素格子中间时, 该取左边的格子还是右边的格子? 如果这方面的控制没有做好,就常常会出现字型的衬线没有对齐,或是小字歪七扭八的情况。 Hinting 是额外的信息, 它告诉 renderer 该如何处理这些细节的部份,使得向量字在小字的时候能够好看。也因此 Hinting 是非常费时费人力的工作,TrueType 字型很多,但是有良好 Hinting 的字型不多。拙劣的 Hinting 就会让字变得很难看。
为了稍微改善这个问题,freetype 有 autohint 的功能,可以自动为没有 hint 的字型做 hinting 的工作。另外由于 TrueType 的 hinting 是有专利的,不能完全自由地使用, autohint 就不受这个限制。autohint 自然无法做得像人力的 hint 一样好,不过至少比没有 hint 要好些。话虽如此,对于许多笔划复杂的文字 (如中文) 目前 freetype 的 autohint 还做得不甚完美,而因为建立完整的 hinting 的难度,即使是英文字,原本就很高,内建有 hinting 的中文字型就少之又少了。所以常常有人抱怨中文字在屏幕上很难看,就是没有理想 hinting, 或者是使用了 autohinter 所造成的一些反效果。

AA(Anti-aliasing)


Antialiasing 是将字体在后台先以数倍的大小来绘画,然后再缩成想要的大小,未满一格的格子用灰阶补点。由于原本 X 所支持的 logic 运算不敷使用,所以才用 XRender 的 extension 来达成目的。 Antialiasing 会给人一种朦胧的感觉,习惯了Windows XP 下清晰,锐利的字体显示时,Antialiasing 会让人不太适应,会让用户觉得Linux下的字体显示不如Windows XP。但是,其实 Antialiasing是一种很先进的显示技术,当长时间显示器上阅读的时候,Windows XP 下的锐利的字体显示风格,会让眼睛更加容易疲劳,使用Antialiasing,字体的显示更加柔和,更加适合长时间的在显示器上阅读文档,减少眼睛的疲劳。
微软的下一代OS Windows Vista 也将用ClearType 来取代传统的黑白,锐利的英文字体显示和点阵CJK 显示。ClearType的渲染效果和Linux下的 Anti-aliasing 效果很相似。

2006-10-10

通过BitTorrent来更新Ubuntu?

当我想到这个问题的时候,其实已经有人事先完成了( http://directory.fsf.org/all/apt-torrent.html ),这是因为APT可以使用好多种下载工具来做后端,但现在的问题是哪儿可以发布种子和种子文件?

暴强盗版网站

网站能盗版成这样,实在是有魄力。VMWare已经是世界上最著名的虚拟机软件的制造商,左边是它的网站,右边是所谓的VMWare中国(www.vmware.cn)

vmware-officialvmware-cn

乍一看,我还以为vmware.cn就是VMWare的中国官方网站呢,但仔细一看——全部软件免费,美国官方的要License收费的软件跑中国来就免费了呢。网站设计还有那么点像个公司的样子,不仔细还真被蒙了。

这年头,盗版都理直气壮了。

2006-10-09

时间悖论

一直想写篇关于时间的帖子,无奈本人数学功底太差,对于几位大科学家的理论几乎根本无法理解,不过,还是要在此讨论一下自己的看法。
当大家谈到时间旅行(主要指回到过去)的时候,都会提到一个著名的悖论——一个人回到过去,将其父亲/母亲/祖先杀了,那么他从哪里冒出来的呢,他又算什么“东西”呢?这个逻辑上的矛盾一直困扰着大家,记得看到书上说,霍金认为,宇宙会在对这种动作有某种程度上保护,阻止这种行为的发生。我渐渐觉得,在时间旅行的问题上深入的越久,人就越容易陷入现在认为错误的“宿命论”的泥潭中。
首先,并不一定是这类回到过去的行为是一种悖论,只要是想回到过去,其实都是为了产生这种悖论的。为什么呢?你只要问问自己,如果你能回到过去,你会去做什么事情——肯定会是一些你一直后悔的事情。比如某个人的亲人死了,所以他要回到过去,去救他的亲人,但他如果成功了,那么过去的那个他再度到现在这个时候,他就无须再次回到过去了,因为他亲人没死。再比如,机器猫上的大雄,考试没及格,坐时间机器回到考试前一天,将答案告诉过去的他,那么过去的那个他如果考试通过了,那么考试过后,就无须再回到过去完成这个“使命”。还有,周杰伦唱的那个“就回到过去,试着让故事继续……”,但若是故事按照他所期望的发展下去,那他还要这样去后悔么?
所以,要么是这种逻辑在时间的问题上不适用,要么就是,想回到过去改变过去,是不可能成功的,既然不可能成功,那么,这就是一种“宿命”。
其实还可以有另一种考虑方法,如果你回到过去了,帮助了过去的你,那么过去的你的记忆中应该知道你回去过了,而且,你知道将来的某个时刻,你还会像当时一样回去,去完成你的“使命”,这又陷入了宿命的怪圈中。
所以,我也认为,现在单纯的单向的时间旅行是不存在的,也就是说,未来的某个时刻的人,单方面要回到过去,只能是一厢情愿,必须要靠过去的那个时刻的人的共鸣,或者召唤,两个时间点上一起产生作用,才能打开时间的隧道。
另外,还有一个矛盾,就是和广义能量守恒定理之间的矛盾。它基本理论是这么说的:

“物理学宇宙(简称宇宙)是由多种形式的能量组成的,或者说宇宙的本质就是能量(广义)或物质(广义),各种能量形式可以相互转化而总量守恒。”
但如果有了时间旅行,那未来的时间来的物质,能回到过去,但这些物质回去了就不走了的话,那么这个定律就不适用了,可以需要在更广义的条件下进行定义。
还有就是那个很著名的一个人的故事,也是关于时间悖论的:
一九四五年的一天,克力富兰的孤儿院里出现了一个神秘的女婴,没有人知道她的父母是谁。她孤独地长大,没有任何人与她来往。
  直到一九六三年的一天,她莫明其妙地爱上了一个流浪汉,情况才变得好起来。可是好景不长,不幸事件一个接一个的发生。首先,当她发现自己怀上了流浪汉的小孩时,流浪汉却突然失踪了。其次,她在医院生小孩时,医生发现她是双性人,也就是说她同时具有男女性器官。为了挽救她的生命,医院给她做了变性手术,她变成了他。最不幸的是,她刚刚生下的小女孩又被一个神秘的人给绑走了。这一连串的打击使他从此一蹶不振,最后流落到街头变成了一个无家可归的流浪汉直到... ...
  一九七八年的一天,他醉熏熏地走进了一个小酒吧,把他一身不幸的遭遇告诉了一个比他年长的酒吧伙计。酒吧伙计很同情他,主动提出帮他找到那个使‘他’怀孕而又失踪的流浪汉。唯一的条件是他必须参加伙计他们的‘时间旅行特种部队'
  他们一起进了‘时间飞车 ’。飞车回到六三年时,伙计把流浪汉放了出去。流浪汉莫明其妙地爱上了一个孤儿院长大的姑娘,并使她怀了孕。伙计又乘‘时间飞车’前行九个多月,到医院抢走了刚刚出生的小女婴,并用‘时间飞车’把女婴带回到一九四五年,悄悄地把她放在克力富兰的一个孤儿院里。然后再把稀里糊涂的流浪汉向前带到了一九八五年,并且让他加入了他们的‘时间旅行特种部队' 。
  流浪汉有了正式工作以后,生活走上了正轨。并逐渐地在特种部队里混到了相当不错的地位。有一次,为了完成一个特殊任务,上级派他飞回一九七零年,化装成酒吧伙计去拉一个流浪汉加入他们的特种部队
这个逻辑相当混乱的故事中,只有一个人,其实,仔细分析,就会发现,那个特种部队中,其实他的上级就是这个人,而部队中所有人都是这个人,这个人在这种逻辑混乱中,不断通过时间悖论来复制自己,有点像那个黑客帝国中的特工Smith吧,算是宇宙这个大Matrix中的病毒吧。不知道这里面能量是否守恒。
还有关于时间裂缝,就是说某些人一直生活在某两个时间点之间,他过完了这段时间后,就重新回到起点,再过这个时间,永远没有尽头。奇怪的是,一,他是如何进入到这个时间裂缝中的,二,如果他知道自己陷入了时间裂缝,为什么不能从中跳出来呢?因为不可抗拒的“宿命”?在一瞬间时间无限制地叠加在他的身上?从无中诞生,最后又归于“无”。
写到这儿,差不多把我所知道的一些疑惑都列举出来了,不知道人类还有多久的时间,能去解决这些问题,不过,如果人都不死的话,谁去管这些事情呢,呵呵。

2006-10-07

Try Ruby in your browser!

try ruby
try ruby,
originally uploaded by ShiningRay.

这个是在线的Ruby Shell,无需安装Ruby,你就可以直接体验一下Ruby编程。地址是: http://tryruby.hobix.com/
输入help并回车,下面会逐步给出一些教学的指南,指导一步步上手。估计它是用了RoR和Prototype做的,还是很有创意的,不过因为要和远程服务器交互,反应速度慢了点。

三种人

最近Ruby来势汹汹,Java社区现在都纷纷改行讨论Ruby了,不过牛人还是牛人,新手还是新手。当这些人在不断吹捧Ruby的时候,又有两种人不屑了:

Smalltalk狂热者:这东西,二十年前Smalltalk就有了。
Lisp狂热者:哼,自从Lisp出现之后,就没有人发明过什么新的东西。
其实对于Ruby,虽然吸收了Smalltalk和Perl的优点,但就和其发明者一样所说的一样,要(Smalltalk + Perl) / 2,其实最后的结果是,Ruby就是Ruby,它既不能取代Smalltalk,也不能取代Perl,更不能取代Java,RoR也不可能成为J2EE。RoR只能成为新手入门和老鸟把玩的玩具而已,通过RoR上手的新手们还和当年用ASP、PHP的那些新手一样,要摸着RoR这块石头过河,否则,结果可能还是会产生大量廉价的ASP、PHP程序员,他们只是在不断重复使用着ActiveRecord、Controller、View,当真正需要变化的时候,反而被框架所限制。

2006-10-06

dp.SyntaxHighlighter代码高亮补遗

上一篇,我本以为这就样可以弄好了,但发现情况不对,Blogger会自动将textarea元素的内容中所有的换行改成<br />,如果光这样也好,它会在替换了多少个换行之后,就变成去掉换行,连<br />都没有了,真是奇怪。
最后研究了一下dp.SyntaxHighlighter的代码,写得十分有条理,我将代码中使用textarea标签转换为使用pre标签,这样,blogger也不会在加上讨厌的<br />了,大功告成。以下是经过修改的核心JS脚本,其他各个语法对应的高亮组件无需修改:
http://shiningray.nirvana.googlepages.com/shCore.blogger.js

dp.SyntaxHighlighter代码高亮

UPDATE:由于Blogger的一些限制,导致本文中的一些内容不正确,请查看此篇补遗
有好几个朋友问我,我用的什么语法高亮的组件,还以为我的Blogger设置有什么特别的,其实我倒没有作过什么设置,我一般是使用生成好了的Html代码,然后贴到日志中的,比如,Vim可以生成高亮的HTML代码,Eclipse,Visual Studio可以将带有样式的代码复制为RTF格式,不少编辑器都有这个功能,另外可以使用在线的代码高亮工具,如 http://www.geshi.org/
另外一个在Blogger中可以使用的高亮组件是基于JavaScript的一个dp.SyntaxHighlighter,其实不少地方都可以看到它的。可以先看看它的Demo。也支持不少常见的代码,不过和GeSHi比要少很多,但也够用了。
具体用法是这样的:先下载该组件,将Scripts中shCore.js和所需高亮的语言shXXX.js以及Styles下的SyntaxHighlighter.css上传到某个地方,如果需要自定义,可以根据TestPages.css进行修改。然后在Blogger的模版的body元素末尾加入以下代码:
〈script src="shCore.js" type="text/javascript"〉〈/script〉
〈script src="shBrush[所要加载的高亮语法].js" type="text/javascript"〉〈/script〉
…………
〈script type="text/javascript"〉dp.SyntaxHighlighter.HighlightAll('code');〈/script〉
然后,在代码中添加<textarea class="[语言]" name="code"></textarea>,其中code属性也对应前面HighlightAll('code')中的code。
由于受Blogger程序的限制,代码中部分符号使用全角表示。
测试一下:

"""
Comment\"
string
"""

cache = {}

string s = "## comments inside a string"
string str = "helllo \"world\", how things?"

def arrange(plans, lines, totalMinutes):
"""arrangements of plans taken lines times with an heuristic that the sum
of values in one arrangement is less then totalMinutes
"""
#if in cache we are done otherwise start calculating and save them to cache
if (plans, lines, totalMinutes) in cache:
return cache[(plans, lines, totalMinutes)]
if lines==1:
r = [[plan] for plan in plans]
cache[(plans, lines, totalMinutes)] = r
return r
solutions = []
for plan in plans:
for ar in sort(list(arrange(plans, lines-1, totalMinutes))):
try:
one_solution = tuple(sort([plan] + list(ar)))
if sum(one_solution) <= totalMinutes and one_solution not in solutions:
solutions.append(one_solution)
except Exception, e:
print "Error:", str(e)
cache[(plans, lines, totalMinutes)] = solutions
return solutions

if __name__ == "__main__":
import sys
lines, totalMinutes = int(sys.argv[1]), int(sys.argv[2])
plans = tuple([int(p) for p in sys.argv[3:]])
print "for", lines, totalMinutes, plans
for sol in arrange(plans, lines, totalMinutes):
print sol

在Python Tk中显示图像的一个小问题

最近在用Python做一个小东西,需要将一幅图片(JPG的)显示出来。我选择使用了Python自带现成的Tkinter库,而没有使用wxPython。这要使用PhotoImage结合Label部件来做显示,但因为Tkinter的PhotoImage支持的文件格式较少,另外又用到了PIL来读入图像并提供给部件,死活图像就是显示不出来,代码如下:


1 from Tkinter import *
2 from PIL import ImageTk, Image
3
4 class App(Frame):
5 def __init__(self, master=None):
6 Frame.__init__(self, master=master)
7 file = "C:\\Develope\\printer.gif"
8 self.ima = Label(master, image=ImageTk.PhotoImage(Image.open(file)), bd=0)
9 self.ima.pack(fill="both", anchor="w", side="top", expand=1)
10
11 root = Tk()
12 app = App(master=root)
13 app.mainloop()
14
以上这段代码虽然能运行,但无法显示图像,我百思不得其解,翻阅了很多资料,并没有发现我的代码在哪儿有问题,我还一直以为是Tk的某个开关弄错了,后来找到了一个例子,仔细对比之后,发现了一个小问题——这个例子中是将ImageTk.PhotoImage的实例作为对象的成员变量存储的,而我是直接作为引用传递过去了,知道了这一点之后,我将代码改写成这样:

1 from Tkinter import *
2 from PIL import ImageTk, Image
3
4 class App(Frame):
5 def __init__(self, master=None):
6 Frame.__init__(self, master=master)
7 file = "C:\\Develope\\printer.gif"
8 self.im = ImageTk.PhotoImage(Image.open(file))
9 self.ima = Label(master, image=self.im, bd=0)
10 self.ima.pack(fill="both", anchor="w", side="top", expand=1)
11
12 root = Tk()
13 app = App(master=root)
14 app.mainloop()
15
图像就顺利显示出来了。
但依然一些不明白的地方,原先我的图像去哪儿了呢?莫非被垃圾收集器给回收了?难道Tk的模块不使用引用?看来还得请教高手啊。

2006-10-05

Google Groups又有Beta了

想当初Nirvana Studio Groups是在Google Groups还在第一次Beta测试的时候申请的,现在Google Groups又出新版本了,可以通过以前的Beta链接看看新的样子:http://groups-beta.google.com/group/nirvanastudio
着实有了不少改进,变得不仅仅像一个Mailing List了,似乎更加像现行的论坛、BBS(可不是以前的)了。

Google Code Search

Google又推出了代码搜索,http://www.google.com/codesearch,另一个专门搜索引擎,这个搜索除了搜索的对方特别外,还有独特的使用方法,它可以使用正则表达式(POSIX extended regular expression syntax)进行搜索,除了内容,文件名也可以使用正则表达式,同时可以指定所需搜索的语言、许可证、包(package)等。
不过一时还不知道能用它搜索什么东西,光是某个代码文件,也许用途不大。

揭密明星真实身份[收藏]

本文来自北青网,http://ent.ynet.com/view.jsp?oid=16339150&pageno=1 来源:重庆晨报

  (南尘)娱乐圈向来星光熠熠,万众瞩目,衣着光鲜的明星们既有着令普通人羡慕的高知名度,又有着一般人望尘莫及的高收入,每一个明星还几乎都有着庞大的粉丝群,每到一处,他们都会受到众多粉丝的热辣追捧。难怪,有那么多的平民选秀风行一时,因为大家都有一个“明星梦”。
  但明星并不是一夜之间就可产生的,打铁还需自身硬,万丈高楼从地起。并且,明星也有落难潦倒的时候,就像《真心英雄》里所唱的那样:没有谁随随便便就能成功。在此,本报特地回放成龙、李安、梁朝伟、周星驰等巨星的最潦倒时光,想想,要是他们在潦倒时没有继续坚持的话,他们也不会成为今天这个娱乐圈里的一代巨星。
  黎明:差点进不了演艺圈
  高大帅气的黎明当年在进演艺圈时连遭打击,报考香港演艺学院却未被录取,报考无线艺员训练班遭遇训练班被无故取消。幸好他1986年参加新秀歌唱大赛获得铜奖,才如愿签约华星,撞开了演艺圈的大门。
  不过,华星并不认为黎明会红,去台湾拍戏,身高1.8米的他在与身高1.6米的某“玉女红星”演爱情戏时,结果这名女星居然当场要求黎明“蹲马步”,把自己变矮一截以屈就她的身高。
  周星驰:遭当面泼冷水
  1987年时的周星驰,刚刚结束在《射雕英雄传》中跑龙套,同时又在万梓良、郑裕玲主演的《生命之旅》中演上了大配角。在拍剧休息时,周星驰和郑裕玲闲谈,谈及自己的前途,周星驰曾问对方自己会否走红,结果郑裕玲说了一句:“你不会红。”由于当时周星驰已经被很多人看扁,但这回被人亲口说出来,实在伤心。
  成龙:被古龙看扁洗手间大哭
  30年前,成龙已经在香港电影圈混了好几年了,从武师、替身,到动作指导,再到干爹罗维捧他做男主角,他觉得自己应该红。罗维确实也费尽心思,当时古龙的武侠片最火,谁拍谁赚,谁演谁红,他就找古龙买下版权,想让成龙出演男主角。
  罗维当年是大导演,古龙自然乐意卖版权,但与成龙一见面,这位武侠名家就十分不悦,因为他觉得成龙大鼻子,长得又不帅。之后一起喝酒,古龙醉意上涌,终于忍不住:“我小说的男主角是给狄龙、尔冬升拍的。”成龙被古龙如此看扁,却也只能忍气吞声,借故去洗手间大哭一场,出来后又满脸笑容。
  王家卫:屡屡误工被炒鱿鱼
  上世纪80年代,王家卫还只是个编剧,但已经养成不按时交工的习惯。有次王家卫为新艺城电影公司写剧本,搞了数月不见动静。这下气坏了老板黄百鸣,当即把他找来。面对老板质问,王家卫的解释是,他要什么事都不做、什么人都不见,独自冷静地想出一个伟大的剧本。
  谁知王家卫的这套说词,根本无法打动同样也是编剧出身的黄百鸣,只是严令他两个星期交稿。结果王家卫拖到一个月才交剧本,而黄百鸣和导演一看,觉得根本是“废纸一堆”,于是毫不迟疑将他炒掉。
  李安:当了6年居家男人
  当年,思想传统的李安父亲认为,李安从事演艺事业有辱门风,更看扁他不会有所作为。这使得李安在美国学完电影后,在家一呆六年,经济来源全靠身为药物研究员的妻子工作,自己则做居家男人,煮饭烧菜。更让李安哭笑不得的是,岳父岳母尝了他的手艺赞不绝口,还提出干脆投资给李安开馆子。明星入行前做什么?

  • 成龙:建筑工人,在澳洲负责盖房子
  • 周星驰:帮外婆摆地摊卖小五金,卖过眼镜、电器,月薪600港币
  • 刘德华:美发院的洗头仔
  • 张学友:玩具包装工人,月薪几百港币
  • 梁朝伟:电器产品推销员郭富城:冷气技工
  • 张柏芝:茶餐厅女侍应、点心妹、地盘工人、卡拉OK侍应,为补贴家用,一天内做4份工作
  • 张曼玉:服装店售货员
  • 周杰伦:因找不到工作,曾当餐馆服务生,月薪4000台币
  • 吴宗宪:加油站工人

2006-10-04

PHP怪现象[5]

这次要说的是PHP5中的一种叫做type hinting(类型暗示)的东西,从使用上来说,接近于Java这类静态类型的类型检查,比如:

<?
interface A{
function a();
}
class AA implements A{
public function a(){
print "A";
}
}
function b(A $a){
$a->a();
}
?>

如果现在运行b(new AA());则会顺利通过,输出一个A,而使用任何其他类型的,比如b(new stdClass());b(1);b("a");之类的,都会出现这种错误:Fatal error: Argument 1 passed to b() must implement interface A, called in ....
应该说,这东西确实给OOP中的类型检测带来了福音,我们无须写if(xx instanceof xxx)这类繁琐的判断语句了。不过,这功能也有点鸡肋的嫌疑。原因有三:

  1. PHP是动态类型的,又是弱类型的,这种type hinting只是虚拟机层次上的动态类型判断,即不能做到编译时提前检查出一些类型错误,也不能给予性能上的极大的提升,
  2. 无法处理基本类型,如string, int——如果将这些东西应用在这个位置上(不过PHP5.1开始array也可以,真是很奇怪),PHP会检查有没有叫做string、int的类或接口;而同样具有type hinting的perl 6,则作的相对更好,比如Perl 6中至少可以将type hinting应用于基本类型上
  3. 不能进行函数重载,如果实现了的话,PHP可能就变成Generic Programming了,但对于PHP这种动态语言来说,这并不是必要的,但现在又具备了type hinting,为何却不能根据类型来进行一些推断(type inference)呢?

2006-10-02

Vim vs Emacs 续

这次是接续上一次,用了一段时间的Emacs,我得出的结论是:作为一个编辑器Vim才是王者,原因是,当理解了所输入的键盘指令,就可以组合出各种花样。
比如,删除一整行、一个单词、删除到某个字符出现、删除一个句子,Emacs中需要分别绑定一个按键,可能还需要分别写函数,而Vim只需要使用d或x命令,加上一些范围指令dd, dw, d/...等等。这些是单纯目前的Emacs所不能做到的——我试用了Viper,能够实现很多功能,但还不够理想。
不过我觉得Emacs的优势也是明显的,Lisp是一个完整的语言,而Vim脚本则很依赖Vim的功能。使用elisp自定义函数时,我写了一个为某个选区两边加上双引号的小程序,并绑定到某个按键,很快就搞定,通过自带的info查询了一些函数,就搞定了,而Vim的脚本,需要处理normal 模式、insert模式,需要使用execute模仿指令输入而非直接调用函数,并不很直观。使用Lisp编程感觉也更加舒服自然。
不过这次的研究,也让我对Vim的认识更上了一个台阶,过去一直没有接触过Vim的脚本,也不知道如何使用Vim定义按键,也不知道Vim的abbrev,这次通过和Emacs的对比,也让我了解不少。
不知道哪位Emacs牛人,能指点一下,让我能明白Emacs的更妙用途

新版Wallop邀请发放


Wallop是一个很著名的SNS的应用,之前在学校的时候,因为网络问题,未能享用,而后收到邀请尝试了一下,发现纯Flash的还是很卡,随后就放弃了。这次JunChen告诉我有新版的Wallop,而且改进颇多,用起来很爽。 想尝试的朋友,可以向我索取。

2006-10-01

一个生成网站页面节点的工具

nirvanastudio tree
nirvanastudio tree,
originally uploaded by ShiningRay.
左边这张奇怪的图片(看上去像某种菌落)其实是 http://www.nirvanastudio.org 的内部页面的关系图,来自 http://www.aharef.info/static/htmlgraph/