世界上没有什么东西能取代持之以恒的精神。
才华不能,有才华但不成功的人随处可见。
天赋不能,天赋无回报几乎是一句谚语。
教育不能,这个世界挤满了受过教育的被遗弃者。
只有毅力和决心,才是万能的。
------Woodrow.Wilson
(美国第28届总统\1919年诺贝尔国际和平奖获得者)
星期五, 七月 11, 2008
星期五, 六月 20, 2008
指导性架构设计原则
下面的指导性设计原则描述了我们的设计理念
* 只要某一功能的缺失不会导致无法完成某个实际的应用程序, 就不新增该功能。
* 决定系统不做成什么样子, 与决定将它做成什么样子同样重要。 不去满足所有的需要,而是让系统具备可扩展性, 使其能够向上兼容。
* 尽可能抽象代码中的通用部分, 除非没有可以用来抽象的实例。
* 如果没有完全理解一个问题, 最好干脆不提供任何解决方案。
* 如果能用 10% 的工作完成 90% 的工作, 则选择较简单的解决方案。
* 尽可能隔离复杂性。
* 提供机制而非策略。 具体而言, 将用户界面策略交由客户去选定。
摘自 Scheifler & Gettys: "X Window System"
FreeBSD 开发手册
* 只要某一功能的缺失不会导致无法完成某个实际的应用程序, 就不新增该功能。
* 决定系统不做成什么样子, 与决定将它做成什么样子同样重要。 不去满足所有的需要,而是让系统具备可扩展性, 使其能够向上兼容。
* 尽可能抽象代码中的通用部分, 除非没有可以用来抽象的实例。
* 如果没有完全理解一个问题, 最好干脆不提供任何解决方案。
* 如果能用 10% 的工作完成 90% 的工作, 则选择较简单的解决方案。
* 尽可能隔离复杂性。
* 提供机制而非策略。 具体而言, 将用户界面策略交由客户去选定。
摘自 Scheifler & Gettys: "X Window System"
FreeBSD 开发手册
星期一, 六月 16, 2008
应用于 Python 的 vim 配置点滴
应用于 Python 的 vim 配置点滴(windows平台下)
http://blog.bobobook.cn/?p=42
Python是我最喜欢的编程语言,而vim也是我最常用的编辑器,所以更好的配置vim来编辑Python源程序是很有必要的。下面谈谈偶学来的一点配置技巧。以下的大部分配置都是通过修改_vimrc文件来实现的,在Windows下它存在于vim的安装目录。
1、快捷调用使用的环境变量
我习惯于把vim的可执行文件路径添加到PATH环境变量,这样平时再控制台下编程的时候可以很方便的启动vim。另外,vim使用的文件名还是略微长了一点。所以我一般将gvim.exe复制后改名为gi.exe。将vim.exe复制后改名为vi.exe。这样直接在控制台下执行gi和vi就可以分别启动vim的GUI版本和Console版本了。
2、在当前路径启动控制台
很多时候需要在控制台下调试程序需要在当前路径启动一个cmd窗口,而有些路径相当的深或者含有大量中文字符的路径让我们很恼火。所以可以写如下一个简单的批处理文件来在当前文件夹下启动cmd窗口。
@echo off
cmd .
保存为cmdhere.bat。这样将cmdhere.bat复制到想要的文件夹,直接双击这个批处理文件就可以打开想要的cmd窗口了,而且当前路径也是所在文件夹的路径,非常的方便。
3、关闭备份
安装后的vim自动是具备备份功能的,一旦一个文件被修改就会生成~filename的备份文件。尽管对发生错误修改时的恢复有用,但是偶还是很不爽。所以关掉它才比较符合偶的习惯。
在_vimrc文件末尾添加
set nobackup
即可。
4、自动开启行号
对编程的人来说行号实在是太重要的,因为很多时候调试中的错误定位就是需要行号的。在vim下直接输入:set nu可以开启行号功能,但是对于习惯于每次都开启行号功能的人来说,还是自动一些为好。编辑_vimrc文件,在末尾添加
set nu
即可。
5、运行Python脚本的键盘映射
可以在vim下按下一个快捷键来直接运行当前的Python脚本。如下的设置是使用F12键,且环境变量中已经添加了python.exe的情况。具体习惯和路径可以自己修改。这一行添加到_vimrc文件中。
map :!python.exe %
这样就可以编辑Python脚本时,随时按下F12,再按下回车键来执行当前脚本。这里的执行时还有一个很贴心的功能,就是对于控制台脚本,执行后并不是直接退出,而是请求按下任意键后才退出。
6、使用ctags功能
这个功能太强大了,只能这么说了,具体还有什么贴心功能可以自己探索。先讲讲安装。去sf.net下载一个ctags的Windows版本。注意,最新版本可能没有for win32版本的,所以需要向上推一个版本找找看。
下载后将其中解压出的ctags.exe文件放入vim的文件夹,当然,前提是vim的执行文件路径已经添加到PATH变量了。这时,按下gvim工具菜单的[建立],(by gashero)或者在普通模式输入
:!ctags -R
这样可以在当前路径下建立一个tags文件,然后就可以在vim中使用跳转功能了。其中的-R选项是递归搜索子目录下的相关符号。所谓跳转就是可以随时转到自己想要的函数、类型、结构体、类等等的定义处。比如光标处于任意位置时可以普通模式下输入
:ta func_name
就可以直接将光标定位到func_name函数处。当然,其他的命名也可以使用这种方法进行快速定位。另外就是可以在光标指向一个函数名时按下Ctrl+],马上跳转到这个函数的定义。在跳转到定义位置之后,可以按下Ctrl+o快速返回原来的编辑位置。
需要明确以下ctags和tags的区别。ctags是一个程序用于生成tags文件。tags文件是当前目录下所有源文件的标签链接文件。在一个没有ctags的vim中只是无法生成新的tags文件,但是已有的tags文件仍然可以使用。
如果tags文件不再当前目录下则用
:set tags=filename
来指定。
7、开启代码折叠
下载python_fold插件,解压后是python_fold.vim文件,放入plugin目录下。即可实现 Python代码的折叠支持。再次打开Python脚本时会发现所有的代码已经折叠了,其中还现了折叠部分拥有的行数。在折叠的行按下zo可以打开折叠,按下zc会折叠上代码。(by gashero)
使用了代码折叠以后是否感觉到了vim已经成为了一种相当现代化的编辑器了。呵呵,后面还有精彩。
8、开启taglist功能
taglist功能是在vim窗口左侧开启一个列表,提供ctags生成的tags文件中的所有符号。此时在 taglist窗口中找到需要跳转到的符号,定位光标,按下回车,即可将光标定位到右侧窗口的相关代码位置。使用十分的方便。当然要确保tags文件已经存在的情况下。另外,对于两个窗口之间的切换,我是习惯于按两次Ctrl+w的。
taglist是需要下载的一个taglist.vim文件,可以到sf.net上搜索及下载。
默认情况下taglist是不打开的。不同的是python_fold是默认打开的。手动打开,在普通模式下输入
:Tlist
默认打开taglist的方法:_vimrc中加入
let Tlist_Auto_Open=1
http://blog.bobobook.cn/?p=42
Python是我最喜欢的编程语言,而vim也是我最常用的编辑器,所以更好的配置vim来编辑Python源程序是很有必要的。下面谈谈偶学来的一点配置技巧。以下的大部分配置都是通过修改_vimrc文件来实现的,在Windows下它存在于vim的安装目录。
1、快捷调用使用的环境变量
我习惯于把vim的可执行文件路径添加到PATH环境变量,这样平时再控制台下编程的时候可以很方便的启动vim。另外,vim使用的文件名还是略微长了一点。所以我一般将gvim.exe复制后改名为gi.exe。将vim.exe复制后改名为vi.exe。这样直接在控制台下执行gi和vi就可以分别启动vim的GUI版本和Console版本了。
2、在当前路径启动控制台
很多时候需要在控制台下调试程序需要在当前路径启动一个cmd窗口,而有些路径相当的深或者含有大量中文字符的路径让我们很恼火。所以可以写如下一个简单的批处理文件来在当前文件夹下启动cmd窗口。
@echo off
cmd .
保存为cmdhere.bat。这样将cmdhere.bat复制到想要的文件夹,直接双击这个批处理文件就可以打开想要的cmd窗口了,而且当前路径也是所在文件夹的路径,非常的方便。
3、关闭备份
安装后的vim自动是具备备份功能的,一旦一个文件被修改就会生成~filename的备份文件。尽管对发生错误修改时的恢复有用,但是偶还是很不爽。所以关掉它才比较符合偶的习惯。
在_vimrc文件末尾添加
set nobackup
即可。
4、自动开启行号
对编程的人来说行号实在是太重要的,因为很多时候调试中的错误定位就是需要行号的。在vim下直接输入:set nu可以开启行号功能,但是对于习惯于每次都开启行号功能的人来说,还是自动一些为好。编辑_vimrc文件,在末尾添加
set nu
即可。
5、运行Python脚本的键盘映射
可以在vim下按下一个快捷键来直接运行当前的Python脚本。如下的设置是使用F12键,且环境变量中已经添加了python.exe的情况。具体习惯和路径可以自己修改。这一行添加到_vimrc文件中。
map :!python.exe %
这样就可以编辑Python脚本时,随时按下F12,再按下回车键来执行当前脚本。这里的执行时还有一个很贴心的功能,就是对于控制台脚本,执行后并不是直接退出,而是请求按下任意键后才退出。
6、使用ctags功能
这个功能太强大了,只能这么说了,具体还有什么贴心功能可以自己探索。先讲讲安装。去sf.net下载一个ctags的Windows版本。注意,最新版本可能没有for win32版本的,所以需要向上推一个版本找找看。
下载后将其中解压出的ctags.exe文件放入vim的文件夹,当然,前提是vim的执行文件路径已经添加到PATH变量了。这时,按下gvim工具菜单的[建立],(by gashero)或者在普通模式输入
:!ctags -R
这样可以在当前路径下建立一个tags文件,然后就可以在vim中使用跳转功能了。其中的-R选项是递归搜索子目录下的相关符号。所谓跳转就是可以随时转到自己想要的函数、类型、结构体、类等等的定义处。比如光标处于任意位置时可以普通模式下输入
:ta func_name
就可以直接将光标定位到func_name函数处。当然,其他的命名也可以使用这种方法进行快速定位。另外就是可以在光标指向一个函数名时按下Ctrl+],马上跳转到这个函数的定义。在跳转到定义位置之后,可以按下Ctrl+o快速返回原来的编辑位置。
需要明确以下ctags和tags的区别。ctags是一个程序用于生成tags文件。tags文件是当前目录下所有源文件的标签链接文件。在一个没有ctags的vim中只是无法生成新的tags文件,但是已有的tags文件仍然可以使用。
如果tags文件不再当前目录下则用
:set tags=filename
来指定。
7、开启代码折叠
下载python_fold插件,解压后是python_fold.vim文件,放入plugin目录下。即可实现 Python代码的折叠支持。再次打开Python脚本时会发现所有的代码已经折叠了,其中还现了折叠部分拥有的行数。在折叠的行按下zo可以打开折叠,按下zc会折叠上代码。(by gashero)
使用了代码折叠以后是否感觉到了vim已经成为了一种相当现代化的编辑器了。呵呵,后面还有精彩。
8、开启taglist功能
taglist功能是在vim窗口左侧开启一个列表,提供ctags生成的tags文件中的所有符号。此时在 taglist窗口中找到需要跳转到的符号,定位光标,按下回车,即可将光标定位到右侧窗口的相关代码位置。使用十分的方便。当然要确保tags文件已经存在的情况下。另外,对于两个窗口之间的切换,我是习惯于按两次Ctrl+w的。
taglist是需要下载的一个taglist.vim文件,可以到sf.net上搜索及下载。
默认情况下taglist是不打开的。不同的是python_fold是默认打开的。手动打开,在普通模式下输入
:Tlist
默认打开taglist的方法:_vimrc中加入
let Tlist_Auto_Open=1
星期日, 六月 15, 2008
The Road Not Taken
The Road Not Taken
Frost, Robert
TWO roads diverged in a yellow wood,
And sorry I could not travel both
And be one traveler, long I stood
And looked down one as far as I could
To where it bent in the undergrowth;
Then took the other, as just as fair,
And having perhaps the better claim,
Because it was grassy and wanted wear;
Though as for that the passing there
Had worn them really about the same,
And both that morning equally lay
In leaves no step had trodden black.
Oh, I kept the first for another day!
Yet knowing how way leads on to way,
I doubted if I should ever come back.
I shall be telling this with a sigh
Somewhere ages and ages hence:
Two roads diverged in a wood, and I—
I took the one less traveled by,
And that has made all the difference.
未选择的路
黄色的树林里分出两条路,
可惜我不能同时去涉足,
我在那路口久久伫立,
我向着一条路极目望去,
直到它消失在丛林深处。
但我却选了另外一条路,
它荒草萋萋,十分幽寂,
显得更诱人、更美丽,
虽然在这两条小路上,
都很少留下旅人的足迹,
虽然那天清晨落叶满地,
两条路都未经脚印污染。
呵,留下一条路等改日再见!
但我知道路径延绵无尽头,
恐怕我难以再回返。
也许多少年后在某个地方,
我将轻声叹息把往事回顾,
一片树林里分出两条路,
而我选了人迹更少的一条,
从此决定了我一生的道路。
Frost, Robert
TWO roads diverged in a yellow wood,
And sorry I could not travel both
And be one traveler, long I stood
And looked down one as far as I could
To where it bent in the undergrowth;
Then took the other, as just as fair,
And having perhaps the better claim,
Because it was grassy and wanted wear;
Though as for that the passing there
Had worn them really about the same,
And both that morning equally lay
In leaves no step had trodden black.
Oh, I kept the first for another day!
Yet knowing how way leads on to way,
I doubted if I should ever come back.
I shall be telling this with a sigh
Somewhere ages and ages hence:
Two roads diverged in a wood, and I—
I took the one less traveled by,
And that has made all the difference.
未选择的路
黄色的树林里分出两条路,
可惜我不能同时去涉足,
我在那路口久久伫立,
我向着一条路极目望去,
直到它消失在丛林深处。
但我却选了另外一条路,
它荒草萋萋,十分幽寂,
显得更诱人、更美丽,
虽然在这两条小路上,
都很少留下旅人的足迹,
虽然那天清晨落叶满地,
两条路都未经脚印污染。
呵,留下一条路等改日再见!
但我知道路径延绵无尽头,
恐怕我难以再回返。
也许多少年后在某个地方,
我将轻声叹息把往事回顾,
一片树林里分出两条路,
而我选了人迹更少的一条,
从此决定了我一生的道路。
星期五, 六月 13, 2008
Python 用 list([...]) 后的 identify
>>> L1 = ['a', 'b', 'c']
>>> L2 = list(L1)
>>> L2 is L1
False
>>> L2[1] is L1[1]
True
L1 不是 L2,不过其元素一样。
ssh 避免密码提示的参数
ssh -n -o StrictHostKeyChecking=no -o PasswordAuthentication=no -o ConnectTimeout=1 $ip "uname -sr" | sed 's/^/ /g'
星期日, 五月 25, 2008
突然发现“行路难”里有“弹剑作歌”几个字
当时想到用“弹剑而歌”几个字做博客的名字,是因为看一个电视节目,说古人造剑可以发出铿铿的悠远的声音,是因为当时铸造技术比较成熟了,可以将剑身和剑柄铸造在一起,所以声音传播没有阻隔,故能悠远而轻扬。刚才却突然发现李白在一首《行路难》里面有“弹剑作歌”几个字!
行路难
李 白
大道如青天,我独不得出。
羞逐长安社中儿,赤鸡白雉赌梨栗。
弹剑作歌奏苦声,曳裾王门不称情。
淮阴市井笑韩信,汉朝公卿忌贾生。
君不见昔时燕家重郭隗,拥篲折节无嫌猜。
剧辛乐毅感恩分,输肝剖胆效英才。
昭王白骨萦蔓草,谁人更扫黄金台?
行路难,归去来!
不过我心中的形象却不是“奏苦歌”,而是那种提三尺剑,边走边唱的高亢,是“永远自由自我,永远高唱我歌”的潇洒,是“仰天长笑出门去,我辈岂是蓬蒿人”的豪迈和决绝。
行路难
李 白
大道如青天,我独不得出。
羞逐长安社中儿,赤鸡白雉赌梨栗。
弹剑作歌奏苦声,曳裾王门不称情。
淮阴市井笑韩信,汉朝公卿忌贾生。
君不见昔时燕家重郭隗,拥篲折节无嫌猜。
剧辛乐毅感恩分,输肝剖胆效英才。
昭王白骨萦蔓草,谁人更扫黄金台?
行路难,归去来!
不过我心中的形象却不是“奏苦歌”,而是那种提三尺剑,边走边唱的高亢,是“永远自由自我,永远高唱我歌”的潇洒,是“仰天长笑出门去,我辈岂是蓬蒿人”的豪迈和决绝。
风雨如磐暗故园
住处没有电视机,平时也是个心无旁骛不怎么关心时事政治的人,所以网上的新闻看得也少,而且因为刚刚入职需要尽快融入环境,又接手了项目和临时的事情,这样手头的事情也多了,最近心中的思虑其实也颇多的,对地震的事情,虽然也捐了几百大圆,但一直都没有多少感性的认识,每天就是上下班,沉浸在自己不断演进的设想中,虽然 19 号也默哀过了,但心中的触动其实只怕也有限。
昨天从网侠会回来,倒头先睡了两个小时,起来还是觉得有些头痛,不想写东西了,想想上上网吧,看看与地震相关的新闻,那些照片、那些报导这才触动内心感性的东西,查了查伤亡人数,与非典和 98 年洪水对比了一下,发现确实相当很严重,因为这两次印象还是蛮深刻的。今天也看了很久,最新报导说下午青川又有6.4级的余震。不禁想起鲁迅的诗:
灯下漫笔
灵台无计逃神矢,
风雨如磐暗故园。
寄意寒星荃不察,
我以我血荐轩辕。
虽然表面上是温和内敛的人,但实际上却自知内心的刚硬火烈、狂放不羁,今天去理发,老板说我头发硬、头发硬的人心也硬,想想可能也说得不差,但到底硬在什么地方呢?我想也许还是那种不达目的不罢休的二杆子倔劲吧。其实又何尝不曾多次感动、流泪和痛哭呢,只是决不愿示于人前。当自己还是一个倍感绝望的少年的时候,第一次听到黄家驹的歌,我曾经哭泣;《牛虻》曾经使我痛哭;《肖申克的救赎》和《闻香识女人》也曾令我数次感动;常读历史,每每掩卷,常常感慨,有时也会觉得眼角湿润;读林达的《近看美国》的时候也是;在上海的第一个夜晚,何尝不曾绝望;在百阿培训的时候,听讲马云的创业史以及听马云版的《在路上》的时候,我都是躲在角落里抹眼角... 而今天,我觉得,鼻子发酸。
这个民族实在是多灾多难,真的不知道还能坚持多少次?这振聋发聩的响动,不知道能惊醒多少人,能否激起某种精神和信念?或者最终我们只是回到老路上,继续浑浑噩噩的过日子?我们还剩多少血性?我们还剩下多少理想?
不敢说能够“血荐轩辕”,不敢说像于谦那样“风孰于高”,但至少应该“血仍未冷”。我想我现在能做的也就是把手头的这些想法尽力去实现,而现在对我来说也正是这样一个关键时期。本来第一天上岗的时候开周例会,说有个 trouble shooting 的脚本项目,我本来对编程设计、系统架构这块就比较感兴趣,就说我来做吧。因为以前也想到过能否把 trouble shooting 做得像 xUnit 那样,所以这次就正好利用这个机会,建立了这样一个框架,将实际的 Check Points 放到框架下,只要返回结果就可以了,这样就利于将来的扩展,而且可以不仅仅使用 Python,将也可以使用 Shell/Perl 甚至 C 语言来写检查点。
写出来,在上周六加班的时候实际上部署了一次,当然还是有很多问题。而之前,冯大师也表示出兴趣,说能否和监控结合起来,包括和监控负责人和主管这些人讨论下来,甚至希望能够将现在的 Nagios 系统替换掉,因为其性能和可维护性太差。
所以上周又赶了一下具体的需求,以及结合我以前已经产生的设想、在最近 Intel 交流的时候产生的一些新的设想都加进去,实际上在考虑整合的分布式管理系统架构了。当然,事情只能一步步做,饭只能一口口吃,必须把目标步子定得小有点,这样成功的希望才更大。
所以,最近就是要把这个 SaUnit 项目完成,包括新版本的框架,和所有现在需要有的、至少在 Trouble Shooting 上的检查点,我还希望能够乘此把 caxes 的 Tree/Table 完成并集成进去,实际上这周基本上已经完成了 Tree 的重构,去掉了 treedict 这个多余的设计并重新选择数据结构后,发现效率提高了 150 倍!这个要在下个月中旬之前完成,必须考虑到各种困难,还要保证所有的测试能够通过,所以其实时间也应该是挺紧张的。
不管怎么样,我觉得我找到了这样一个可以施展拳脚的地方,一个可能实现自己理想的机会,我知道,我心中的激情仍然没有熄灭,包括昨天在网侠会,虽有有些东西听的也是一头雾水,但毕竟还是能获得新的想法和灵感,甚至可以说是更宏大的设计。虽然这些年也走了很多弯路,也发生过动摇,但最终的抉择还是把我带到了这里——历史决定了我们是谁,我们在其中的幸运和遭遇以及做出的选择,决定了我们今天是怎样的人!不是吗?
吟唱李白的那首行路难吧:
金樽清酒斗十千, 玉盘珍羞直万钱。
停杯投箸不能食, 拔剑四顾心茫然。
欲渡黄河冰塞川, 将登太行雪满山。
闲来垂钓碧溪上, 忽复乘舟梦日边。
行路难,行路难, 多歧路,今安在?
长风破浪会有时, 直挂云帆济沧海。
昨天从网侠会回来,倒头先睡了两个小时,起来还是觉得有些头痛,不想写东西了,想想上上网吧,看看与地震相关的新闻,那些照片、那些报导这才触动内心感性的东西,查了查伤亡人数,与非典和 98 年洪水对比了一下,发现确实相当很严重,因为这两次印象还是蛮深刻的。今天也看了很久,最新报导说下午青川又有6.4级的余震。不禁想起鲁迅的诗:
灯下漫笔
灵台无计逃神矢,
风雨如磐暗故园。
寄意寒星荃不察,
我以我血荐轩辕。
虽然表面上是温和内敛的人,但实际上却自知内心的刚硬火烈、狂放不羁,今天去理发,老板说我头发硬、头发硬的人心也硬,想想可能也说得不差,但到底硬在什么地方呢?我想也许还是那种不达目的不罢休的二杆子倔劲吧。其实又何尝不曾多次感动、流泪和痛哭呢,只是决不愿示于人前。当自己还是一个倍感绝望的少年的时候,第一次听到黄家驹的歌,我曾经哭泣;《牛虻》曾经使我痛哭;《肖申克的救赎》和《闻香识女人》也曾令我数次感动;常读历史,每每掩卷,常常感慨,有时也会觉得眼角湿润;读林达的《近看美国》的时候也是;在上海的第一个夜晚,何尝不曾绝望;在百阿培训的时候,听讲马云的创业史以及听马云版的《在路上》的时候,我都是躲在角落里抹眼角... 而今天,我觉得,鼻子发酸。
这个民族实在是多灾多难,真的不知道还能坚持多少次?这振聋发聩的响动,不知道能惊醒多少人,能否激起某种精神和信念?或者最终我们只是回到老路上,继续浑浑噩噩的过日子?我们还剩多少血性?我们还剩下多少理想?
不敢说能够“血荐轩辕”,不敢说像于谦那样“风孰于高”,但至少应该“血仍未冷”。我想我现在能做的也就是把手头的这些想法尽力去实现,而现在对我来说也正是这样一个关键时期。本来第一天上岗的时候开周例会,说有个 trouble shooting 的脚本项目,我本来对编程设计、系统架构这块就比较感兴趣,就说我来做吧。因为以前也想到过能否把 trouble shooting 做得像 xUnit 那样,所以这次就正好利用这个机会,建立了这样一个框架,将实际的 Check Points 放到框架下,只要返回结果就可以了,这样就利于将来的扩展,而且可以不仅仅使用 Python,将也可以使用 Shell/Perl 甚至 C 语言来写检查点。
写出来,在上周六加班的时候实际上部署了一次,当然还是有很多问题。而之前,冯大师也表示出兴趣,说能否和监控结合起来,包括和监控负责人和主管这些人讨论下来,甚至希望能够将现在的 Nagios 系统替换掉,因为其性能和可维护性太差。
所以上周又赶了一下具体的需求,以及结合我以前已经产生的设想、在最近 Intel 交流的时候产生的一些新的设想都加进去,实际上在考虑整合的分布式管理系统架构了。当然,事情只能一步步做,饭只能一口口吃,必须把目标步子定得小有点,这样成功的希望才更大。
所以,最近就是要把这个 SaUnit 项目完成,包括新版本的框架,和所有现在需要有的、至少在 Trouble Shooting 上的检查点,我还希望能够乘此把 caxes 的 Tree/Table 完成并集成进去,实际上这周基本上已经完成了 Tree 的重构,去掉了 treedict 这个多余的设计并重新选择数据结构后,发现效率提高了 150 倍!这个要在下个月中旬之前完成,必须考虑到各种困难,还要保证所有的测试能够通过,所以其实时间也应该是挺紧张的。
不管怎么样,我觉得我找到了这样一个可以施展拳脚的地方,一个可能实现自己理想的机会,我知道,我心中的激情仍然没有熄灭,包括昨天在网侠会,虽有有些东西听的也是一头雾水,但毕竟还是能获得新的想法和灵感,甚至可以说是更宏大的设计。虽然这些年也走了很多弯路,也发生过动摇,但最终的抉择还是把我带到了这里——历史决定了我们是谁,我们在其中的幸运和遭遇以及做出的选择,决定了我们今天是怎样的人!不是吗?
吟唱李白的那首行路难吧:
金樽清酒斗十千, 玉盘珍羞直万钱。
停杯投箸不能食, 拔剑四顾心茫然。
欲渡黄河冰塞川, 将登太行雪满山。
闲来垂钓碧溪上, 忽复乘舟梦日边。
行路难,行路难, 多歧路,今安在?
长风破浪会有时, 直挂云帆济沧海。
星期四, 五月 22, 2008
Python 从生成器 "return" 而不是 "StopIteration"
在 ulfs/caxes 项目中的 tree.py 的 __revision__ = 268 版本中,我打算将 __traverse__() 方法做改进,以前返回一个 treedict,所以需要使用 tuple 作为其 pathseq,但现在打算完全取消 treedict,这样用 list 作为 pathseq 要合理得多,此时 __traverse__() 应该作为 generator 不断 yield 数据。
一开始编码如下:
一开始编码如下:
def __traverse__(self)然后我在 Python 中尝试导入 tree 模块:
"""...
Comments
...
"""
id_self = id(self)
if self.__id_visited.has_key(id_self): return {}
# To avoid cyclic link problem!
Tree.__id_visited[id_self] = None
pathseq = self.__path_stack
yield pathseq, self
...
>>> import tree这个错误实际上就是由于上面使用了 return,对 iterator/generator 来说,必须使用 StopIteration 异常处理来终止!
Traceback (most recent call last):
File "", line 1, in
File "tree.py", line 399
yield pathseq, self
SyntaxError: 'return' with argument inside generator
def __traverse__(self):
id_self = id(self)
if self.__id_visited.has_key(id_self):
# return {}
raise StopIteration
# To avoid cyclic link problem!
Tree.__id_visited[id_self] = None
pathseq = self.__path_stack
yield pathseq, self
......
订阅:
博文 (Atom)