用Emacs开发Ruby on Rails的一个简单的演示视频, 虽然没有声音, 也足够获得一个初步的了解了。另外一个补充的视频, 从编辑的角度展示了Emacs的功能, 其中用到的软件这里给出了一个列表。
Rinari Screencast (Ruby on Rails development with Emacs) from Eric Schulte on Vimeo.
用Emacs开发Ruby on Rails的一个简单的演示视频, 虽然没有声音, 也足够获得一个初步的了解了。另外一个补充的视频, 从编辑的角度展示了Emacs的功能, 其中用到的软件这里给出了一个列表。
Rinari Screencast (Ruby on Rails development with Emacs) from Eric Schulte on Vimeo.
经过漫长的等待, 终于迎来了Slackware的一次重大的升级, 随着版本号步入13.0, Slackware的官方网站上已经有了四个目标平台的发行版本在同步开发, 包括: x86, x64, S390和ARM。其中, x64版本的发行是首个官方版本的64位Slackware, 之前众多的非官方64位版本应该可以退休了。
为了方便大家下载使用, 本站特地提供了DVD版本的Slackware和Slackware64供大家下载, 也同我交流Slackware的使用经验。
上次应福田科技局软件平台的邀请,做了一个简短的分布式版本控制系统的讲座从svn到hg和git。在同学员的课堂交流过程中,发现多数学员更关心管理方面的问题,这也正是我持续进行了多年的项目COKB所致力解决的问题。
碰巧的是:软件平台也要求我准备一个系列公开课的提案,就这个项目的研究成果, 我考虑可以开一个企业架构理论和实践的系列课程,一方面能够分享之前知识的累积,另一方面也可以用实践来检验这些知识。下面就是当初提案的内容:
初步计划用一个系列的课程来讲解这个问题,共分三个主题:
1、企业架构方法介绍,结合中外的企业架构框架和智慧来介绍企业架构方法,包括:TOGAF, Rational ADS, MDA, CMMI 以及《道德经》和《孙子兵法》中相关的内容,结合西方管理理念和中国文化精髓普及企业架构的知识。
2、企业架构务实,介绍企业架构的知识体系,选择和实践的依据,以CMMI和ISO-9000为起点介绍实施企业架构的方法,并初步介绍简单且容易实施的Collaboration Knowledge Management Methodology (CKMM) 方法。
3、企业架构在身边,以前面的介绍为基础,引导学员快速搭建起适合自身需求的企业架构平台,用以解决研发管理,企业管理中的问题,并用CMMI的25个过程域来对照检验企业架构平台所体现的最佳实践。
这个系列课程的好处是:理论同实践相结合,保证帮助企业学有所用,用有所成,共同提高。缺点是内容太多,怕难用三堂课讲清楚,尤其是第三部分,因为有实际操作的内容,互动的内容比较多,需要一个能够让学生自己动手操作的环境。
等待了一段时间后, 接到软件平台的通知, 拟定于09年8月1日开始这个企业架构的系列课程。听到这个消息后,自己也开始着手准备有关企业架构和软件架构方面的讲义,在整理讲义的过程中,不得不做了一些删减,去掉了Rational ADS, TOGAF和MDA方面的内容,而重点突出了业务架构和业务管理框架的内容,以避免过于理论化和太偏重于技术层面,尽量能够以MBA教育背景的管理人士为目标听众,所以,软件架构方面的比重反而大大降低了,最后,仅仅作为了补充材料而存在,以备有学员问到这个话题的时候,也能简单的讨论一下。点击讲义下载能得到PDF版本的讲义。
完成后的内容纲要如下:
- 背景资料,简单讨论一般性的常识问题,导入了架构元模型。
- 企业架构简介,以Zachman Framework和《孙子兵法》的映射对照关系,介绍了企业架构的概念;然后选择对比了一些著名的企业架构,如TOGAF, DoDAF等。
- 业务架构的框架和标准,罗列了ISO-9000, CMMI, Six Sigma,ITIL等众多的业务架构标准,尝试说明它们之间的联系。
- 选择合适的业务架构框架,从企业架构和工程的角度出发,对比了众多的业务架构框架,并选出了重点;然后,导入了EFQM和平衡记分卡(Balanced Score Card)的概念,重点介绍了集成绩效管理的框架。
- 实施方法论和最佳实践,从知识管理的角度出发,并对照知识管理同绩效管理的框架模型。
- 案例分析,先引入《道德经》同架构的关系,用以说明架构的一般原则,然后,用”MindWard研发管理平台”和”COKB - 社会性协作平台”说明,这些一般原则如何指导实践。
- 总结,提供了一个一般性的业务架构设计和实施建议。
- 在最后的部分,准备了一些”软件架构与技术架构Software Architecture & Technical Architecture”的内容,以备同技术背景的人讨论软件架构的需要。
借这个机会,也系统的整理了我个人在企业架构,软件架构和知识管理领域的认知,外化成了这篇讲义,很期望能够借这个机会多找到一些同道中人,互相交流和学习。
也欢迎到问题追踪系统中提出问题,参与开发和讨论。
收到了软件平台制作的招贴广告, 也放上来,留个纪念。
用Emacs很久了,可是,不断探索和学习的旅程远没有结束,总有新的发现在前面等着,这不,又发现了一个好用的列编辑模式。下面的内容转帖自Emacs Tip #26: CUA mode (specifically rectangle editing) ,以方便在中国查阅:
I’d heard of CUA mode, but generally dismiss it because I don’t want the “windows” bindings for cut/copy/paste/undo. But when I saw this video of CUA’s rectangle support, I knew this was the way to edit rectangles.
Emacs Column Editing from Mark Mansour on Vimeo.
To activate in emacs 22.1 - with minimal intrusion (I don't like transient mark mode): (setq cua-enable-cua-keys nil) (setq cua-highlight-region-shift-only t) ;; no transient mark mode (setq cua-toggle-set-mark nil) ;; original set-mark behavior, i.e. no transient-mark-mode (cua-mode) The *info* page doesn't have the rectangle bindings (as far as I can see), so here is the documentation from the code: ;; CUA rectangle support ;; --------------------- ;; Emacs' normal rectangle support is based on interpreting the region ;; between the mark and point as a "virtual rectangle", and using a ;; completely separate set of "rectangle commands" [C-x r ...] on the ;; region to copy, kill, fill a.s.o. the virtual rectangle. ;; ;; cua-mode's superior rectangle support uses a true visual ;; representation of the selected rectangle, i.e. it highlights the ;; actual part of the buffer that is currently selected as part of the ;; rectangle. Unlike emacs' traditional rectangle commands, the ;; selected rectangle always as straight left and right edges, even ;; when those are in the middle of a TAB character or beyond the end ;; of the current line. And it does this without actually modifying ;; the buffer contents (it uses display overlays to visualize the ;; virtual dimensions of the rectangle). ;; ;; This means that cua-mode's rectangles are not limited to the actual ;; contents of the buffer, so if the cursor is currently at the end of a ;; short line, you can still extend the rectangle to include more columns ;; of longer lines in the same rectangle. And you can also have the ;; left edge of a rectangle start in the middle of a TAB character. ;; Sounds strange? Try it! ;; ;; To start a rectangle, use [C-return] and extend it using the normal ;; movement keys (up, down, left, right, home, end, C-home, ;; C-end). Once the rectangle has the desired size, you can cut or ;; copy it using C-x and C-c (or C-w and M-w), and you can ;; subsequently insert it - as a rectangle - using C-v (or C-y). So ;; the only new command you need to know to work with cua-mode ;; rectangles is C-return! ;; ;; Normally, when you paste a rectangle using C-v (C-y), each line of ;; the rectangle is inserted into the existing lines in the buffer. ;; If overwrite-mode is active when you paste a rectangle, it is ;; inserted as normal (multi-line) text. ;; ;; If you prefer the traditional rectangle marking (i.e. don't want ;; straight edges), [M-p] toggles this for the current rectangle, ;; or you can customize cua-virtual-rectangle-edges. ;; And there's more: If you want to extend or reduce the size of the ;; rectangle in one of the other corners of the rectangle, just use ;; [return] to move the cursor to the "next" corner. Or you can use ;; the [M-up], [M-down], [M-left], and [M-right] keys to move the ;; entire rectangle overlay (but not the contents) in the given ;; direction. ;; ;; [C-return] cancels the rectangle ;; [C-space] activates the region bounded by the rectangle ;; If you type a normal (self-inserting) character when the rectangle is ;; active, the character is inserted on the "current side" of every line ;; of the rectangle. The "current side" is the side on which the cursor ;; is currently located. If the rectangle is only 1 column wide, ;; insertion will be performed to the left when the cursor is at the ;; bottom of the rectangle. So, for example, to comment out an entire ;; paragraph like this one, just place the cursor on the first character ;; of the first line, and enter the following: ;; C-return M-} ; ; C-return ;; cua-mode's rectangle support also includes all the normal rectangle ;; functions with easy access: ;; ;; [M-a] aligns all words at the left edge of the rectangle ;; [M-b] fills the rectangle with blanks (tabs and spaces) ;; [M-c] closes the rectangle by removing all blanks at the left edge ;; of the rectangle ;; [M-f] fills the rectangle with a single character (prompt) ;; [M-i] increases the first number found on each line of the rectangle ;; by the amount given by the numeric prefix argument (default 1) ;; It recognizes 0x... as hexadecimal numbers ;; [M-k] kills the rectangle as normal multi-line text (for paste) ;; [M-l] downcases the rectangle ;; [M-m] copies the rectangle as normal multi-line text (for paste) ;; [M-n] fills each line of the rectangle with increasing numbers using ;; a supplied format string (prompt) ;; [M-o] opens the rectangle by moving the highlighted text to the ;; right of the rectangle and filling the rectangle with blanks. ;; [M-p] toggles virtual straight rectangle edges ;; [M-P] inserts tabs and spaces (padding) to make real straight edges ;; [M-q] performs text filling on the rectangle ;; [M-r] replaces REGEXP (prompt) by STRING (prompt) in rectangle ;; [M-R] reverse the lines in the rectangle ;; [M-s] fills each line of the rectangle with the same STRING (prompt) ;; [M-t] performs text fill of the rectangle with TEXT (prompt) ;; [M-u] upcases the rectangle ;; [M-|] runs shell command on rectangle ;; [M-'] restricts rectangle to lines with CHAR (prompt) at left column ;; [M-/] restricts rectangle to lines matching REGEXP (prompt) ;; [C-?] Shows a brief list of the above commands. ;; [M-C-up] and [M-C-down] scrolls the lines INSIDE the rectangle up ;; and down; lines scrolled outside the top or bottom of the rectangle ;; are lost, but can be recovered using [C-z].
升级到Apache2以后,查阅了一些文档,不少人推荐用mod_fcgid来取代mod_fastcgi,据说能获得性能上的提升。国人写的fcgid据说同mod_fastcgi全兼容,同时做了一些改进。所以,决定尝试一下用fcgid来加速MovableType的cgi程序。但是,fcgid已经有一段时间没有更新了,一些apache用户论坛建议使用sourceforge上的cvs中的mod_fcgid,其中包含了一些更新。
各种不同的Linux版本安装fcgid的方法略有差异,但是,成功安装完fcgid后,还是有一些配制过程需要注意的。fcgid的配制中有不少陷阱,我经过了反复尝试,终于让fcgid正常运行起来了。
安装好fcgid模块后,重新启动apache服务器之前,需要指定正确的配制文件,Include下面 文件到httpd.conf中,能够正常的启动apache服务,其中两个重要的选项是SocketPath和SharememPath, 缺少任何一项,都会造成apache不能正常启动,而且,指定的目录需要设置成同apache进程同一个用户,好让apache能够读写该目录中的内容。
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
IPCConnectTimeout 40
IPCCommTimeout 300
DefaultInitEnv RAILS_ENV production
SocketPath /var/lib/fcgid/fcgidsock
SharememPath /var/lib/fcgid/fcgidshm
</IfModule>
按照上面的配制,虽然能够正常的启动apache服务了,但是,并不代表fcgid能够正常的工作。如果需要让fcgid能够正常的工作,还需要为每个虚拟主机配制单独指定配置参数,fcgid并不能自动的继承上面的参数。在尝试正确配制Apache2+fcgid,发现,不但需要在每个虚拟主机配制中需要重新设定参数,甚至在需要在每个IfModule fcgid_module中都需要重新指定fcgid的配制选项,通过google查到文章重点说明了这一点。解决了这个问题之后,MovableType终于能够稳定的运行在fcgid下了。建议单独设定一个包含公共配制项目的文件,在需要的地方Include该文件,以免重复。
fcgid能够正常工作之后,开始尝试用MT-Dispatch管理MovableType的进程,参考了MovableType+FCGI文章中的内容,成功让MT-Dispatch运行起来了。下面是我的Apache配置文件中同MT-Dispatch对应的部分,也可以作为如何配制fcgid的例子:
<IfModule fcgid_module>
DefaultInitEnv MT_HOME /srv/www/sites/mindward/mt/
DefaultInitEnv MT_PERIODIC 50
DefaultInitEnv PERL_FCGI_MAX_REQUESTS 250
DefaultInitEnv PERL_FCGI_CHILDREN 4
DefaultInitEnv PERL_FCGI_LOG /var/log/httpd/fcgid.log
Include /etc/httpd/inc.d/fcgid.inc
<Directory "/srv/www/sites/mindward/mt">
AddHandler fcgid-script .cgi
<FilesMatch "^mt-(add-notify|atom|check|config|feed|testbg|upgrade|wizard|xmlrpc)\.cgi$">
SetHandler cgi-script
</FilesMatch>
DirectoryIndex mt.cgi
Options Indexes ExecCGI -MultiViews
Order allow,deny
Allow from all
<FilesMatch "^mt(-cp|-search|-ftsearch|-comments|-tb)?\.cgi$">
FCGIWrapper /srv/www/sites/mindward/mt/bin/mt-dispatch.fcgi .cgi
</FilesMatch>
</Directory>
</IfModule>
其中,fcgid.inc的内容如下:
SocketPath /var/lib/fcgid/fcgidsock
SharememPath /var/lib/fcgid/fcgidshm
BusyTimeout 300
IdleTimeout 600
IdleScanInterval 240
BusyScanInterval 120
ErrorScanInterval 6
ZombieScanInterval 3
ProcessLifeTime 1200
SpawnScoreUpLimit 10
SpawnScore 1
TerminationScore 2
MaxProcessCount 250
DefaultMaxClassProcessCount 10
DefaultMinClassProcessCount 0
IPCConnectTimeout 20
IPCCommTimeout 600
MaxRequestsPerProcess 500
经过测试,Blog, Motion和Forum都能够正常工作。执行:
ps fax
能够看到启动了perl-fcgi进程。
需要注意的是,只有mt.cgi, mt-cp.cgi, mt-search.cgi这几个文件同fcgid环境是兼容的,其他文件还需要保持在cgi模式下运行,否则会出错。
fcgid存在的这些陷阱,让我花费了不少时间去定位和排除,也许,好的软件应该注意做好防错设计,健壮的软件应该在容易并可能出现错误的时候,尽量能够给出有意义的提示信息,这样才是对软件用户友好的高质量软件。
技术总在不断的进步,apache已经有一个新的mod_proxy_fcgi模块在开发中,可能会从Apache2.4版本开始正式的内置对fastcgi协议的支持,从而不在需要安装第三方模块。另一方面,perl社群设计出了mod_perlite,期望让用perl编写的cgi能够象php那样容易部署和运行,但是该项目的成熟还需要时间。
不过,国人能写出在服务端广泛部署并使用的高性能软件,还是值得钦佩的。瑕不掩瑜,综合评估上面提到的技术方案,fcgid对于在apache2下面部署cgi应用程序,到目前为止,还是最佳选择。
更新:重新调整了fcgid.inc中的参数,调低了ProcessLifeTime的值, 并对应调整了其他参数。经过实际测试,新配制对提高系统稳定性有帮助。
因为中国的网络环境使然,常常莫名奇妙的不能访问一些国外的网站,为了能够绕开由此带来的不便,也想了很多的办法。这不,在网上看到不少朋友正为这事情苦恼着,所以想把自己知道的方法写下来,也许对其他具有类似的烦恼的朋友,未尝不是一个解脱的办法。
这个方法最为大多数人所熟知,使用起来也非常的简单。google一下proxy这个关键字,能得到不少代理服务器的列表,而且,不过找到好用的代理服务器也是一个化功夫的细活,如果找到了,就赶快把地址记录下来,这不,我自己尝试了很多次,终于发现一个好用的代理服务器easyproxy.nl,大家可以自己去试一试,在表单中输入你想访问的地址,就能够访问那些之前不能直接访问的网站了。
或者,如果你有境外的服务器资源,可以自己架设一个代理服务器,google一下cgiproxy或者phproxy,能够找到代理服务器软件的下载链接,按照软件中的说明安装好后,就能够享受代理服务器带来的便利了。
使用容易,免费资源多。
兼容性差,对视频类,Flash类网站支持不好,很多富媒体网站无法浏览。安全性差,不适合商务操作。
如果你已经有一个境外服务器的账号,并能够通过ssh客户端远程登录到境外的服务器上,那么,只需要简单的配制,就能够让浏览器借助ssh客户端提供的SOCKS代理功能,通过该境外服务器做跳板,访问其他的网站,对被访问的网站来说,所见到的IP地址是境外服务器的IP地址。详细的设置方法请参考ssh client as SOCKS server。成功设置后,浏览器会将网页浏览的请求先转发给远程服务器,然后有远程服务器取得需要的内容后,再传给浏览器。
兼容性好,几乎能够支持所有类型的网站,对于境外的网站,网页浏览速度也能够得到提升。安全性好,能够支持商务应用。
需要境外服务器的账号,设置稍微麻烦了一些。
互联网长城的工作机制,大概可以分为三种,IP封锁,DNS劫持和关键字过滤。当浏览网页时,先能够访问网站,然后出现马上出现连接中断(Connection Interrupted)错误的时候,证明互联网长城识别出网页内包含敏感的关键字,向两端发送了连接重置信号。对于关键字过滤这种封锁方式,可以通过设置操作系统底层网络处理参数,让其忽略互联网长城的发来的连接重置信息,从而破除封锁,其原理和详细的设置使用方法,请参考By pass the GFW - 穿越互联网长城。
网站兼容性好,一旦设置好之后,对用户完全透明,使用容易。
目前只知道Linux和FreeBSD下的设置方法,还没有发现Windows下的设置方法,对普通用户来说,不具备可操作性。如上面的原理分析文章中所描述的,仅仅能破解关键字过滤的封锁。

在本机上安装Tor代理软件,比如vidalia,然后借助代理软件访问互联网,Tor将浏览器的请求分解到多台同样安装了该代理软件的境外客户机上,由多台客户机帮助浏览器取得需要的数据。
安全性高,使用方便,不需要集中服务器,支持Windows平台。
安装设置稍微麻烦,实际测试的时候,浏览速度不理想。
我们注意到,方法1的代理软件方案,需要有服务端配合,而方法3既适合客户端,也适合服务端,但是对操作系统有要求,安装配制不容易。那么,我们可以考虑结合这两个方法的优点,将服务端按照方法3配制并安装代理软件以方便用户的使用,这样,即便是服务器在境内,也能够破除互联网长城的关键字过滤封锁了。一旦正确配制的服务器能够顺利的访问本被封锁的网站,这时候,只需要在服务器上部署方法1所提到的代理软件,然后用代理软件来访问原本被关键字过滤阻挡的网站,而且我已经用cgiproxy软件成功的验证了这个方法的可行性,点击MindWard cgiproxy,然后在顶步的表单中输入这个地址 http://www.lightbluetouchpaper.org/2006/06/27/ignoring-the-great-firewall-of-china/ 就能够访问,而直接在浏览器地址栏输入上面的地址,会得到连接错误。
结合了方法1的优点,容易部署和使用,同时去掉了方法2中必须具备境外服务器的限制,只要有Linux或FreeBSD操作系统就都能够使用这个方法。
对比方法4,还是需要有服务器的存在。仅仅能突破关键字过滤,而对IP封锁和DNS劫持没有作用。
理论上来说,既然我们能够组合使用方法1和3,我们也应该能够组合使用方案2和3,但是,在尝试这样配制的时候,服务器端给出了 “channel 7: open failed: connect failed: Connection timed out” 错误,我需要进一步发掘问题的原因,到目前为止,这个方法还没有配制成功。
我之前尝试过一些这类软件,因为某些原因,这里就不再多说了,请自己想办法查找下载地址。
如果有大量廉价的免费的Linux或FreeBSD服务器可供使用,那么,采用方法5的原理,开发一款客户端软件,广泛的部署到大众的电脑上,那么,破除互联网长城的封锁就变成了一个异常容易的事情,而不象现在这样有一个高技术的门槛。如果从技术的角度考虑,那么方法4和5已经变成了类似的原理和架构了,也许,这正是互联网的未来发展趋势,不依赖集中服务器,成长为透明的,自适应的,完全分布式的全球网络环境。
IBM收购了Rational之后,RUP升级成了基于Eclipse的Method Composer,借助这个工具,能够自行定制RUP流程,然后发布到网站上,作为组织特定的流程库。对于需要剪裁定制RUP以适合自己组织需求的企业来说,这样的工具无疑方便了裁减定制工作,让RUP更容易的适合组织的流程需求。
这个工具是基于Eclipse的,熟悉Eclipse的朋友很容易上手,帮助系统是IBM一贯的风格,简洁而有用。参考帮助系统中的教程,简单的尝试了一下之后,创建了一个自己的Plugin,并发布了一个加入了该Plugin的流程库RUP for CKMM,这只是一个简单的尝试,证明了RMC的可用性,下一步,期望把CKMM中的流程元模型从SPEM升级到SPEM2之后,能够基于CKMM的元模型来开发自己的Plugin,并定制出适合CKMM元模型的流程库。
每种操作系统平台都有自己的风格和图形工具库,Windows有MFC,MacOSX有Cocoa和Carbon,而Linux则有GTK+和Qt。但是,也有专门开发的跨平台工具库,其中最著名的是Tk和wxWidgets。跨平台的工具库不但需要能够跨平台运行,还要能够在目标平台上行为良好,看起来不要象外星人,而应该象本地居民一样,融入本地的风格和行为习惯中。加上这些要求之后,这个列表就剩下GTK+, Qt, Tk和wxWidgets了,其中,源于Tcl扩展的Tk图形库,因为历史的原因,默认为选为流行脚本语言的默认图形库,如Perl和Python的默认跨平台图形库。然而,随着脚本语言对wxWidgets的接纳,如wxperl和wxpython这样的脚本语言同wxWidgets的绑定库使得用脚本语言写重量级的图形应用程序成为可能,这样的例子包括Perl语言的集成开发环境Padre,Python语言写的文本编辑器Editra等等。
在文档Cross Platform GUI Toolkits中,我尝试分析跨平台工具库的技术,社会以及趋势方面的因素,让大家得到一个相对清晰的视图,以了解各种图形工具库的优势和弱点,以便给出选择图形工具库的指引。
就我目前的实践经验和知识,能给出的建议如下:
忽略Tk,重量级或嵌入式开发用Qt,低成本脚本语言开发用wxWidgets
为了让非技术人员也能够开始使用版本控制系统,特地添加了一份多图版本的RapidSVN使用说明,用看图说话的方式引导大家入门。期望有了这样一份说明,有更多的人能够开始使用版本控制系统管理协作编写的文档了。
假设你有一个能够用ssh远程连接的境外服务器的账号,比如Dreamhost或其他托管服务商的虚拟主机或远程管理账号,同时,由于生在伟大的防火墙的防护之下,苦恼于某些网站被屏蔽了,而没有办法访问。这时候,参照本文提供的方法,就可以借助这个境外服务器作为代理服务器,突破伟大防火墙的封锁,访问到想看的内容了。
ssh -D 5566 username@remote.server
用你自己的用户名和服务器名来替换上面的username@remote.server,然后配制你的浏览器使用SOCKS协议,能够支持V4或V5版本。下面用firefox浏览器作为例子:

| network.proxy.socks | 127.0.0.1 |
| network.proxy.socks_port | 5566 |
| network.proxy.socks_version | 5 |
| network.proxy.type | 1 |
然后,点击http://www.whatismyip.com/,如果看到的IP Address是远程服务器的地址是一样的(而不是你本机的IP地址),那么,恭喜你了,设置已经成功了。
现在,我们试一试之前没办法访问的网站,比如: http://codelite.org,现在,不但能够浏览到网站的内容,而且,浏览的速度也提高了。
更新: 将上面参数设置部分中默认的SOCKS协议由4修改为5,原因见这里
Recent Comments