星期五, 六月 20, 2008

指导性架构设计原则

  下面的指导性设计原则描述了我们的设计理念

* 只要某一功能的缺失不会导致无法完成某个实际的应用程序, 就不新增该功能。

* 决定系统不做成什么样子, 与决定将它做成什么样子同样重要。 不去满足所有的需要,而是让系统具备可扩展性, 使其能够向上兼容。

* 尽可能抽象代码中的通用部分, 除非没有可以用来抽象的实例。

* 如果没有完全理解一个问题, 最好干脆不提供任何解决方案。

* 如果能用 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

星期日, 六月 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.

未选择的路

黄色的树林里分出两条路,
可惜我不能同时去涉足,
我在那路口久久伫立,
我向着一条路极目望去,
直到它消失在丛林深处。

但我却选了另外一条路,
它荒草萋萋,十分幽寂,
显得更诱人、更美丽,
虽然在这两条小路上,
都很少留下旅人的足迹,

虽然那天清晨落叶满地,
两条路都未经脚印污染。
呵,留下一条路等改日再见!
但我知道路径延绵无尽头,
恐怕我难以再回返。

也许多少年后在某个地方,
我将轻声叹息把往事回顾,
一片树林里分出两条路,
而我选了人迹更少的一条,
从此决定了我一生的道路。

刹那得永恒

Auguries of Innocence
William Blake

To see a world in a grain of sand,
And a heaven in a wild flower,
Hold infinity in the palm of your hand,
And eternity in an hour

一沙一世界
一花一天堂
掌中握无限
刹那得永恒

星期五, 六月 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'