2009年8月31日星期一

Ruby

Ruby

----------------------
LinFeiYu 2009,08,30

相信很多人开始接触 Ruby 都是从 Ruby on Rails 开始的。我就是这样子来的。
维基百科上介绍 Ruby on Rails 的历史上是这样说的:“于2004年7月,Rails 的创始人David Heinemeier Hanson从 37signals 公司的项目管理工具 Basecamp 里面分离出 Ruby on Rails,并且以开源方式发布。”于是对这个框架更加的有亲切感。为什么呢?因为公司的项目管理 SaaS 应用正是从 Basecamp 那里模仿汉化而来的。刚才偶尔翻阅旧文章时候发现了一篇介绍项目管理的文章:项目管理工具推荐:Redmine和DotProject ( http://www.kuangfeng.cn/blog/?p=1846 ) 。其中的 Redmine ( http://www.redmine.org/ ) 莫非就是由此而来?呵呵 :-)

学习 Ruby on Rails 当然要熟悉 Ruby 这个基本语言了。然而跟 Python 一样,中文资料还是比较缺乏的。刚又看了一个面向 Java 程序员的 Ruby 语言介绍: 脱离 Rails 看 Ruby ( http://www.ibm.com/developerworks/cn/java/j-ruby/ ) 。这篇文章中提到的 Ruby 的三个特色给我留下的印象比较深刻。

首先是迭代。 IBM developerWorks 的这篇文章中提到:“ Ruby 中支持 each 方法的任何类(比如 File)都允许以这种方式进行迭代。” Ruby 的 each 方法比较酷!而且非常常见,比如你在 Ruby on Rails 第一个教程中就可以看到它的身影。跟 Python 的链表推导式(List Comprehensions)相比复杂了一点点,还是比较好用好理解的。
Python 的链表推导式支持条件判断,那是相当的有用的。而 Ruby 也有,不过 Ruby 不仅用了 if 语句,还用到一个叫 unless 语句,估计比 Python 强一点点。可能就是在迭代出现符合条件的时候 break 跳出循环。
另外一个就是多态性了。在 Python 中我好像没找到多态性这个面向对象特性,因为默认情况下 Python 没有接口功能。尽管 zope 的组件思想中以接口为中心设计,而且把 zope 组件当成是 Python 组件,但是纯 Python 中并没有这个东西。而这篇文章中说 Ruby 中也不存在接口,但是却存在接口的功能,而且 Ruby 中的多态性只是对方法名进行匹配的问题。这是非常有趣的事情。

目前尚未真正接触 Ruby ,所以几乎一无所知。然而正如 IBM developerWorks 的这篇面向 Java 程序员的 Ruby 介绍文章中所提示的,掌握多种语言有非常多的好处。

关于 Python 和 Ruby 的细节比较,这里有一篇非常详细的介绍文章:Python vs Ruby ( http://regebro.wordpress.com/2009/07/12/python-vs-ruby/ )
确实地, Python 是一种非常优雅的语言。

关于 Ruby 的一个 web 服务器 Mongrel 作者的访谈录的中文翻译: 对SCGI/Mongrel的作者的访谈(关于Rails企业级应用、放弃SCGI等的言论) ( http://www.javaeye.com/topic/49543 )
其中提到的 “企业级应用” 这样的问题,在 Python 中也是非常的有争论的。比如在某些人的眼中,zope 就被定义为类似于 J2EE 等的 “企业级应用” ,而像 Django 等快速开发框架却被认为属于小型应用框架。然而, Django 之类的快速开发框架在 Python 社区的火爆,相对于 zope 的冷落没落,我们似乎应该改变些看法。也许只有当我们认真地去了解 Django 等快速开发框架之后我们才能作最后的结论!

Python Web Framework

Python Web Framework

---------------------------
LinFeiYu 2009,08,30

感觉 Python web 框架都在向 zope 方向进展。这是最近发现的一个地方。为什么呢?

zope 中有一个叫做注册表的东西,这个注册表分为本地注册表和全局注册表(globalSiteManager),所有的组件不是在本地注册表中就是在全局注册表中,可以通过 Python 代码方式将组件注册到注册表,也可以通过 zcml 文件直接注册组件。虽然有人跟我说过 zcml 中注册的组件是注册到全局注册表中,然而在我学习了 wsgi 中间件之间的调用之后,我发现那个说法应该是错误的。 zcml 中的组件注册应该只是注册到本地注册表,而不是注册到全局注册表!如果开发一个大型的应用的话,每个模块都有其组件注册到注册表上,这样 zope 的注册表将是非常的大的。在 zope组件架构 ( http://www.muthukadan.net/docs/zca.html#adapters ) 中提到:“局部组件是持久化组件,而全局组件是保存在内存之中。全局组件是根据应用的设置进行注册的,而局部组件是在应用启动的时候从数据库中加载到内存的。” 我想这个跟 Windows 的注册表有些神似,不过却不是真正的好方案,Windows 的注册表已经被批得一塌糊涂,比如《Unix编程艺术》中所指出的那样。使用 zcml 配置文件据说也是很多 Python 开发者拒绝 zope 的一个原因。

Django 的发展中也许遇到了类似的问题,它们必须把组件组装到一个地方,让整个框架可以方便地统一管理这些组件。于是,我们看到了 Django 的 admin 模块中也出现了一个类似注册表的东西,这篇文章中: 修正 Django Step by Step 的一些例子 ( http://www.vpsee.com/2009/07/update-examples-in-django-step-by-step/ ) 指出了这个问题。毫无疑问,注册表功能将会在 Django 中越来越多的出现,最后可能走向 zope 的注册表解决方案。

国内 Python 领袖人物之一的 limodou 在其尚未开发完成的 Uliweb 框架中更是使用了一种非常类似 zcml 的解决方案,不同的是作者使用的是 ini 配置文件。具体介绍看这里:第一章 Uliweb介绍 ( http://sites.google.com/site/learninguliweb/home/chapter1 ) 中的 “资源共享的处理方式” 一段。在资源的配置上它应该还没有做到 zope 中那样可以根据 weight 来调整合并资源文件的深度。更不用说 zope 的 viewlet 那样灵活的设计了。

总之,在这些或者非常火爆,或者尚在发展的轮子中,我们还是看到已经存在的设计,或许他们重新造轮子只是想把原来的设计简化而已。。。

今天,无意中看到同事 Youngking 很久以前的一篇文章:又一个框架-bobo ( http://blog.xmu.me/2009/06/14/framework-bob/ ),发表时间是 2009,06,14 ,而文章最后一句话,“这个框架目前还没有正式发布,Jim Fulton声称会在下周一发布。”估计这个东西已经出来很久了,那么有时间一定要去弄来玩玩,或许它带来了很多新的东西。呵呵 :-)

Fedora 11 GPRS

Fedora 11 GPRS

---------------------------
LinFeiYu 2009,08,30

刚才在 Fedora 11 试了一下连接手机的 GPRS 上网功能,非常好!

我的手机已经很老啦,是 06 年底的 MOTOROLA E770V 。以前我也试过在 Linux 发行版中将它当一个 Modem 来使用,但是都失败了。今天偶然的尝试,居然成功了,而且这个过程非常简单容易。

Fedora 11 系统中使用的网络连接程序是 NetworkManager ,这个程序还是不错的,特别是近来加入了对移动宽带、 VPN 等的支持。我使用 NetworkManager 连接 E770V 的 GPRS 上网的简单步骤:

1. 在 E770V 的 “USB设置” 中将 “默认连接” 方式设置为 “数据连接”。
2. 使用 USB数据线 将 E770V 连接到电脑的 USB接口 上。
3. 点击 NetworkManager 系统图标弹出连接选项,选择 “New Mobile Broadband (GSM) connection...” ,弹出配置向导。
4. 点击 “前进” 按钮,选择国家 “China”。
5. 点击 “前进” 按钮,选择手机卡的提供商,我使用的是中国移动的神州行卡,所以选择了 “China Mobile”。
6. 点击 “前进” 按钮,选择上网类型。在这里 NetworkManager 有个小 bug ,虽然我用的是 cmwap 的 APN ,而不是默认的 cmnet 。但是如果在这里就将 APN 改为 cmwap 的话,NetworkManager 将出错并退出!所以这时候还是选择默认的 cmnet 。
7. 拔掉 USB数据线 ,点击 “前进” 按钮,然后点击 “应用” 按钮。如果在这个时候不先拔掉 USB数据线 的话,很可能会导致接下来 NetworkManager 马上使用 E770V 的 cmnet APN 连接网络!
8. 右键单击 NetworkManager 系统图标,选择 “编辑连接”,然后选择 “移动宽带”。可以看到刚才的配置向导已经生成了一个配置,比如我的叫 “China Mobile Default” ,左键选择这个配置,然后点击右侧的 “编辑” 按钮,弹出编辑配置选项界面。这个时候将 APN 参数修改为 cmwap ,清空 Username 和 Password 参数。然后点击 “应用” 按钮。这里你也可以自定义其他参数,比如连接名称。这样配置就完成了。
9. 重新插上连着手机的 USB数据线 ,左键点击 NetworkManager 系统图标,选择刚才编辑配置中的连接名称项,比如我的 GPRS 连接名称是 “China Mobile Default” ,这时候 NetworkManager 就按照配置的内容开始连接了,连接成功后就会提示已经成功连接上了。
10. 打开浏览器或者 QQ 之类的网络应用程序,修改网络连接中的代理设置,将代理设置为:HTTP代理,IP 为 10.0.0.172 ,端口为 80 即可。然后就可以上网了。
11. Firefox 在使用以上代理的时候首次可能会出现下载 wap 什么文件之类的,只要多刷新一下或者多下就可以了。QQ 可能会出现输入什么码的,按照提示多次输入之后就可以了。我刚才上 google 搜索和 douban ,一切操作均正常。
12. 断开连接:左键点击 NetworkManager 系统图标,选择连接名称下方的 “断开” 就可以了。然后拔下 USB数据线。
13. 以后使用这个手机上网就可以直接使用这个连接配置了(从步骤9开始)。如果不使用这个手机连接配置的话,要把浏览器或者QQ之类的网络应用程序的代理设置改回原来的设置。

OK!所有操作就这些了,非常简单吧!应该比在 Windows 下还简单,因为在 Windows 下还要手动跑到 设备管理器 那里去设置 APN 。

Python

Python

----------------------
LinFeiYu 2009,08,29

Python 目前是我的工作程序语言。这个程序语言以简洁、优雅著称。
使用 Python 是让人愉快的。好像技术界的很多大牛都给了 Python 很高的评价。
然而,最近我却有些不大开心。
首先是版本的兼容问题。虽然 Python 2.x 大部分时候是向后兼容的,但是还是有一些地方让人比较难受。特别是新的版本中新增或者改进的功能在旧版本中几乎完全不能使用。而 Python 3.x 更是一下子去掉了向后兼容,大家几乎都要从头开始!当很多应用还停留在 Python 2.x ,甚至是 Python 2.4 的时候,Python 3.1 在 Python 3.0 刚发布不久之后就马上发布了。这个速度也太快了!
另外一个是性能问题。最近看《Unix编程艺术》,其中提到,不仅相对与编译语言,而且相对于其他脚本语言,Python 也是效率低下、速度缓慢的。
现在的 *nix 系统管理程序越来越多的看到 Python 的身影。这似乎是一件很鼓舞人心的事情。然而几个事情还是让我有些担忧。有一次我把 Ubuntu Server 从 6.06 升级到 8.04 ,中间出现了一个小问题,这个小问题直接导致了这个系统完全无法使用。这个问题是这样的:Debian/Ubuntu 最强劲的包管理系统 apt 是基于 Python 语言的,升级过程中,与 apt 相关的某个 python 脚本可能由于文件系统的逻辑错误导致无法使用,结果升级安装在这里失败了,整个安装升级到此为止。而此时我比较傻,重启了系统,结果进入不了系统,提示整个系统处于 Read Only 状态什么乱七八糟的。使用 single 模式进入最基本的系统还是提示缺失某些重要的命令,而这命令就跟 apt 有关。修复了 apt 软件包之后把整个系统重新升级,重启之后就完全恢复正常了。然而却浪费了我几个小时的时间。当然这似乎不能怪罪于 Python 了。然而这么重要的系统功能依赖于 Python 这样的脚本语言,我总觉得不大合适。
相信很多人都很不乐意于使用 Java 开发的应用程序,然而现在 Linux 下的很多应用程序使用的是 Python 语言。我已经看到过很多的问题,都是 Python 脚本引起的。比如 Fedora 的安装程序 Anaxxx 在分区阶段偶尔会出现一些问题,这些问题从出错的提示看都是 Python 脚本。Magic Linux 使用的 smart 程序是基于 Python 开发的,使用中也出现一些奇怪的问题。我的 Arch Linux 使用 wicd 程序管理网络,按照 Arch Linux 官方建议的设置,现在和 dbus 的通讯还是存在权限的问题,这个 wicd 也是用 Python 开发的。 PyQt 、 PyGTK 、 wxPython 等被广泛应用与 Linux 发行版的桌面程序开发,然而他们的运行缓慢,效率低下!也许 Python 真的非常适合于快速开发,然而性能问题不能不面对啊!

Python 现在是很多 Linux 发行版的一个必须的系统级脚本语言,就像 Perl 一样。这也不见得是一件好事情。Fedora 11 默认的 Python 安装了 Paste 、 setuptools 、 simplejson 等 Python 包,然而某些 Python 包,比如 Paste 和 setuptools 似乎被削去了很多东西,导致开发中出现问题,结果只能把这些包卸载了,重新从各自的源码安装。而由于 Python 版本升级的兼容问题,发行版面临另外一个问题,就是一旦 Python 版本需要升级,其他很多系统相关的包都需要重新调整编译等。一个很典型的例子是 Magic Linux ,他们在 2.0/2.1 版本中均使用 Python 2.4 版本。然而,当想将 Python 2.4 升级到 Python 2.5 的时候,他们发现好多好多的依赖,这个依赖太多了,所以他们打算等待下一个发布版本 2.5 再升级到 Python 2.5 。然而当他们开始发布 2.5 的 alpha 版本的时候他们已经将 Python 2.4 升级到 Python 2.6 了,而 Python 2.5 不见踪影。

相信我们都对“依赖”感到不爽,从 Windows 的 dll hell 到 Linux 发行版中各种软件包的依赖问题,简直不能忍受!然而,这个问题,的确很难解决啊!

想想 C/C++ 非常的稳定,根本不在乎新技术如何迅猛的发展,多年过后你还是可以用回你原来的技术创建非常高效的应用程序!

不久前,google 宣布了一项计划,将为 Python 提速。这是一件非常让人欣喜的事情。然而几个月过去了,我们没有看到 google 这项计划的半点进展。等待是痛苦的。。。

emacs 23

emacs 23

---------------------
LinFeiYu 2009,08,29

emacs 越来越好用了。特别是 23 版本的发布,对 unicode 的支持已经非常的好。应该是到时候从 vi 迁移到 emacs 了。

为什么要从 vi 迁移到 emacs 呢?
首先是缓冲区的问题,我已经有几次因为这个问题丢失数据了。或许是我太懒没有认真学习 vi ,总之如果我在 vi 中剪切一定数量的数据,保存退出 vi 之后再进入 vi 将刚才复制的内容粘贴的话,在复制的数据不大的情况下这样是没有问题的,不过数据量大的时候 vi 自动保持一定的数据去掉了多出的数据,这个做法完全没有任何提示,于是我丢失了部门的数据。在同一个 vi 进程中进行这个缓冲区之间的操作应该是没有这样的限制的,然而不同的 vi 进程中的这个操作居然有这样的提示,而且还不给任何提示!
然后是中文处理的问题。大部分情况下 vi 对于中文处理很正常,然而有些情况,比如中文标点符号,vi 就出现问题了。实在想不透为什么,中文标点符号不是和中文字符一样吗?按照中文字符的处理应该就可以了。

不过,emacs 的上手比较难。现在大概就只会 C-x C-s 和 C-x C-c 了。但是想起当初我学 vi 的时候也是很辛苦的,很多 vi 的基本操作一直都是慢慢地学习到的。那么对于 emacs 就不需要这样抱怨了。emacs 一个最大的问题应该是性能的问题,这个程序几乎无所不能,然而强大的功能带来了一个问题就是启动慢,系统资源消耗大。听说 emacs 已经开始尝试一种 daemon 运行方式,也许将来能更加快速地使用 emacs 。现在对于系统管理,恐怕还是 nano 和 vi 用起来比较合适。

什么东西都是一样的,如果你不去深入学习它,那么你很可能会在表面应用上犯下很多的错误,而你却还毫不知情。然而我们还是希望能比较快速地掌握简单的技能,快速地应用于我们的学习和工作之中。

Fedora 11

Fedora 11

---------------------
LinFeiYu 2009,08,29

自从 Fedora 11 正式发布之后,我就迫不及待地想从 Fedora 10 直接升级到 Fedora 11 。然而,却发生了很多事情,最后我还是回到了 Fedora 的怀抱。

我原来的 Fedora 10 是通过 LiveCD 媒介硬盘安装的,除了进入系统速度有些慢之外,其他几乎是无可挑剔的。为什么呢?当时由于工作的需要,我必须开启两个虚拟机来进行开发调试,我在我的 Fedora 10 上安装了 VMware Player 和 VirtualBox ,并分别运行 Ubuntu Server 和 Windows 2003 Server ,除了一次不知道搞了别的什么程序不小心挂掉之外,其他时候都是非常稳定和可靠的。Fedora 官方软件源提供了非常多已经打包的开发包,对于开发人员来说是非常好的,再加上 RPM Fusion 提供大量的非官方软件包,包括开发的、桌面媒体的等等,已经几乎可以满足需求了。再加上流行程序,像 Firefox 、 OpenOffice 等的更新非常快且稳定,于是 Fedora 已经是我的一个非常重要的选择了。Fedora 一个让人称道的地方是其技术创新性,最前沿的技术一般来自 Fedora ,像 PulseAudio ,Plymouth 等等。而 Fedora 对具有创新性的自由软件的支持更是让我非常的喜欢,像 ibus 等等。当然这些走在前头的技术并非非常完善,但是 Fedora 步调还是比较稳健的。这是我对 Fedora 的感觉。

从 Fedora 10 升级到 Fedora 11 的过程比较辛苦可能是我自己的问题。为什么呢?Fedora 官方推荐使用 PreUpgrade 的方式,然而我急于求成,经过几次在 PreUpgrade 等待过于漫长之后,居然把 Fedora 10 删除了!删除了 Fedora 10 之后我又开始了安装各种发行版的尝试。然而,“曾经沧海难为水,除却巫山不是云。”无论是哪一个发行版,虽然理论上他们的实质是相同的,但是他们还是有其各自的优点和缺点的。在重新体验了各个发行版之后,我发现 Arch Linux 和 Fedora 是比较适合我的发行版了。我一直保持安装两个 Linux 发行版的习惯,其中用于工作的是 Arch Linux ,原因非常简单,就是其 AUR 和包管理的优点,这让我可以非常容易的打包管理我需要的软件包。不过,我非常希望能将工作环境迁移到 Fedora 中。为什么这么说呢?Fedora 11 已经把 Python 升级到 Python 2.6 了,虽然我同时使用了 RPM Fusion 软件源,但是所有软件源中只有 Python 2.6 和 Python 2.4 。工作中我们已经从 Python 2.4 升级到了 Python 2.5 ,但是目前找不到 Fedora 11 的 Python 2.5 软件包。当然我可以自己手动编译 Python2.5 ,然而受 Arch Linux 的影响,我已经比较倾向于不使用手动编译的方式来安装软件包了,因为手动编译安装软件包对于关键包的管理比较麻烦。所以我最近开始学如何打包 rpm 包。在我逐步的学习中发现,其实 rpm 包的 spec 文件还是比较简单的,和 AUR 的 PKGBUILD 文件相比只是复杂了一点点。而稍微看了一下 deb 包的打包,那简直无法再看下去。当然这可能与我的智商有关。呵呵 :-) 由于打包 Python2.5 比较困难,所以我暂时使用 RPM Fusion 中的 Python 2.4 ,RPM Fusion 软件源已经提供了几个重要的 Python 2.4 的 Python 包了,有 compat-python24-libxml2 、 compat-python24-imaging 等,这两天我自己打包了一个精简的 compat-xapian-bindings-python24 ,修改了一个工作环境,终于可以在 Python2.4 下工作了。我尝试过在 Python 2.6 下进行 zope 3 的开发(工作环境),首先一个是 with 似乎开始成为一个关键词,于是我更换了一下 zope 3 中 with 所有的地方,这样在 Python 2.6 下我可以将 zope 3 的程序运行起来,然而 zope 3 却并不能正常工作,那些 adapter 等好像都不能工作。所以最后我放弃了。虽然现在我可以在 Python 2.4 上进行工作了,但是我还是希望能找到或者自己打包一个好用的 Python 2.5 的 rpm 包来。当然,我更希望 zope 3 的下一个版本 zope 3.5 能正常工作于 Python 2.6 之下,虽然这是很天真的想法,因为 zope 3.4 能正常运行在 Python 2.5 下已经是很让人欣喜的了。

这次我花了几天断断续续的时间第一次下载了 dvd 版的 Fedora 安装媒介,通过硬盘安装的方式安装了我的 Fedora 11 ,感觉良好。我又回到了这个赏心悦目的环境中!由于 Fedora 11 中 yum 对于 presto 技术的支持越来越好,于是我把 Fedora 11 的 dvd iso 镜像手动挂载到系统中,然后作为一个基础的软件源使用,这样在进行升级或者安装软件包的时候,利用 yum 对于 presto 技术的支持,升级和下载新的软件包所需要下载的体积已经大大减小。加上后来我使用多线程的插件 axelget ,安装和升级已经是比较容易的事情了。对于提高安装和升级 Fedora 软件包的速度来说,以下三个 yum 的插件是非常重要的:yum-plugin-fastestmirror 、 yum-presto 和 axelget 插件。有一个奇怪的地方是,Fedora 11 似乎默认把 keepcache 设置为0了,直接导致下载的包括 Presto 合并之后的安装包都没有被保存。这个问题有段时间让我感觉很不舒服,因为 man yum.conf 中是说这个选项默认是1.当然也可能是我不小心把它修改了。

对于工作站来说,我已经非常倾向于使用 Fedora 了。正如一些同学的观点,Fedora 相比其他某些发行版来说,是属于正规军的,而且是先锋部队!当然我这里说的是工作站,如果服务器的话,我想使用 FreeBSD 、 Gentoo 发行版会比较合适。有机会我一定会好好地学习这两种发行版,特别是 Gentoo 。 Gentoo 是我身边的同事 Youngking 最推崇的发行版,它的确也非常地吸引人。其中有一个让人印象非常好的地方是 Gentoo 提供了非常丰富的文档!无论是 Gentoo 发行版本身核心的文档,还是其他 GNU 自由软件的文档,都非常详细和准确,而且提供了非常多种语言的翻译。我还因此收藏了很多其中的文档!呵呵 :-)

非常喜欢 Fedora ,希望我能好好学习,也许将来我也能为她做点贡献,呵呵!