2009年03月10日 13:17
最近在重新研究Pylons。在读到Authorization和Authentication部分的时候,颇有些头昏脑胀的感觉。自己考虑了一下,感觉是因为关于Pylons的基础没打好。于是回过头去读了一下基础的部分。也做一点笔记在这里吧。
Pylons是一个符合WSGI规范的web framework。那么,什么是WSGI呢?
WSGI(Web Server Gateway Interface)是Python专门定义的一个用于web应用的接口。这个接口由三部分组成:
1、Server/Getaway端。负责接受客户端请求,并且调用应用实例(Application Object),并将基础的环境(environ)和对应答的初始处理方法(start_response)传递给它。最后将application返回的数据通过write方法写回给客户端。
2、Application/Framework端。Application是一个callable的object,它被server调用。根据 Server端发来的environ和start_response,做业务逻辑处理,然后调用start_response处理状态和header,最后返回body信息。
3、Middleware。Middleware相当于是一个Application的Proxy,它本身是一个Application,但是对底层的Application来说它又是Server,它被Server调用之后,可以接受server传入的environ和 start_response,可以对environ做预处理,或者替换新的start_response之后,再用新的环境context调用底层的 Application,实现一些特殊的操作。Middleware是可以级联的。
在WSGI体系中,environ是一个非常重要的数据传递媒介。几乎所有信息传递,都是通过environ来实现的。
我们可以看到,在这个架构里,整个web应用被分解成两个部分,server和application(middleware的本质还是 application),server负责和客户端交互、调用application。application可以处理业务逻辑。而且两部分通过很简单的environ(根据WSGI规范,这是一个标准的Python dict)和start_response(根据WSGI规范,这是一个callable object,返回一个write的callable object)进行交互。两部分都可以各自实现各自替换。互不干扰。而通过middleware级联的application,也为应用提供了无限的扩展性。
而pylons,就是这样一个架构的框架式的具体实现。借助WSGI的扩展性和开放性,pylons的扩展性是非常强的。
pylons并没有从0开始构建框架,它采用了一个更加底层的WSGI framework:Paste作为自己的基础。Paste是一个非常底层的WSGI framework,它实现了一系列的WSGI组件:一个server,一些工具性质的middleware,一系列辅助命令,等等。关于Paste,我在日后会再做进一步的研究。(从pylons 0.9.7开始,一个比paste更加高阶的框架webOb也被引入了,不过这个对上层是透明的。)
Pylons实质上是设计和融合了一系列WSGI的middleware。比如,routes,一个用于URL mapping的middleware;beaker,一个用于管理cookie和session的middleware;authkit,用于authorization和authentication的middleware,等等。这些middleware并非专为Pylons设计,Pylons也并不严格依赖他们。所以,所有这些东西都是可以被轻松替换掉的。我们也可以自行级联更多的middleware来实现更复杂的功能。
pylons也实现了一个自己的Application:PylonsApp,作为Pylons框架的核心。在PylonsApp中,会根据routes的结果查找controller,并会把environ和start_response也同样传递给Controller。(Controller本质上也是一个Application,它的通用实现是pylons中的WSGIController,各项目的基类实现在lib/base.py中的BaseController)。
2009年02月24日 09:46
NAS上线6天了。可以写写实践总结了。
不得不说,计划没有变化快。
原来我计划的是WD 500G绿盘。后来我的一个前同事向我推荐了性价比更高的640G绿盘。于是,立刻的,我就决定采用640Gx3的方案了。
谁知道去买的那天,商家又给了我一个很郁闷的消息。他接到通知,说Thecus和WD的绿盘有兼容性问题。因为绿盘使用的节能机制不能被Thecus识别,会造成无法唤醒和误报警什么的。我当时就觉得背后一身冷汗啊:上星期你还跟我大力推荐绿盘来着。商家也一副很委屈的神情:人家也刚接到通知……。行了,这次可不能这么冲动,我在商家那边现场上网查询了Thecus的兼容性列表,发现里面有WD5000AAKS(蓝盘)。想想同一型号的硬盘使用的技术应该是相同的,于是就选择了640G的WD6400AAKS,x3。
回家之后,因为其他的事情耽搁了两天。在这两天里,突然想到一个问题,似乎说明书上做raid的界面里,没有做2个raid的地方。我原先设想的2+1方案顿时就被蒙上了一层阴影。为了避免自己被这个问题折磨,我打算在实际使用之前先去问问权威人士。于是找到了Thecus的support站点,用拙劣的英文跟他们交流了一番之后,终于得到了明确的答案:
您打算使用的这个功能叫做 multiple-RAID。这个功能N3200pro不支持。如果您觉得这个功能对您必需的话,请选择N5200pro或以上版本。
N5200pro,6k以上,直接无视……。我还是接受现实,不用物理分割了,逻辑上分两个目录算了。
于是,装硬盘,开机。话说这个3200,安装的确还是挺方便的,不过它说免工具,起码在开始安装的时候不行,那个螺丝太紧了,用手根本拧不动,最后还是请螺丝刀出马才搞定。安装没什么问题,一切顺利。然后到Windows下做初始化,重设LAN的IP地址,然后将LAN接口接入到我现有的局域网中,通过web做设置——实际上一开始没什么好做的,先建RAID5吧。在RAID界面选择RAID5,勾选三块盘,开始。显示剩余时间,339分钟……。还好,比商家告诉我的7、8个小时好多了。软RAID么,就是这么慢,木办法。
第二天回家,RAID已经OK了。然后就开始倒腾数据。先开启NFS服务。建立两个文件夹backup和storage,前者用来做备份,后者用来做大容量存储,为他们分配好NFS权限。然后在个人电脑上建一个NAS目录,里面建立两个相同名字的文件夹,将NAS的两个文件夹分别mount过来。然后用df -h一看,1.2T,哈哈,好爽好爽。
然后开始将原先系统中的照片倒腾上去,20多G的照片,耗时1个半小时左右。然后是视频、程序、个人数据……七七八八的一通折腾,都是手工复制。
再接下来折腾服务器,因为服务器我打算将原先的emule直接下载到NAS的空间,所以在服务器上的mount结构有些不一样。我原先的下载是放在/data这个目录的(这个目录实际上是mount了另外一个本地分区),这次就先把mldonkey服务停掉,把分区umount掉,建立一个/data_local,把本地分区mount过去,然后把NAS的storage目录mount到/data。然后将/data_local里的Incoming和Temp两个目录mv到新的data下面。然后重启mldonkey服务。再用web界面看了看,嗯,一切正常,原先没下载完的东西和已经下载完的东西都迁移过来了。又加了几个新的下载,第二天也都正常的进入了NAS的对应目录,下载速度也没有什么改变。想想也是,2M网络上传输过来的东西,通过100M网络送到NAS,应该是不会有什么影响的。这一块这样就算OK了。
然后为了方便,我还在storage下面建立了几个其他的目录,将以前一些临时目录放到NAS上。比如我建立了w3_temp目录,将原先本地硬盘上的www/temp这个目录的内容迁移过来,然后删掉原来的目录,建立了一个指向w3_temp的软连接temp,这样原先用于临时文件交换的web temp目录也放到NAS了。
本来以为这样就一切OK了。结果发现,迁移之后,FTP服务出了问题。将FTP目录迁移到NAS之后,原来正常的FTP上传下载现在变得不可用了。上传可以建立文件却无法填充内容。我估计可能是ftp服务对远程目录的支持不好。无奈就将公共的FTP目录仍然放在本地硬盘,个人就用SFTP服务存取,SFTP功能一切正常。
然后试了一下远程直接播放电影。发现在百兆有线局域网的情况下,mplayer直接播放NAS上的720p都没问题,但是用笔记本通过无线网直接播放就有些疙疙瘩瘩。看来下一步就是要升级我的无线网了。
暂时这个折腾就到此结束,至于自动备份的脚本,以后根据需要慢慢写吧。
2009年02月10日 21:52
最近工作又有变动,再次忙得不可开交。
上周末终于把NAS给买了,但是因为硬盘缺货还没买,也就没有投入使用。不过既然已经定了,不妨就设想一下它的使用方法吧。
话说这个NAS,其实还是挺一波三折的。最初我看中了Thecus N3200,是因为看中了它的RAID 5。RAID 5是一个容量和安全可以兼顾的方案。后来发现N3200已经停产了,于是转向了它的后继型号N3200pro。
谁知在准备购买,跟淘宝买家交流的时候,突然想起来这个NAS应该具备分区的功能,因为NAS没有分区的概念,于是我就想到了一个词:磁盘限额。故作内行的询问之后,得知N3200pro没有限额功能,于是就鬼使神差的选择了Netgear ReadyNAS Duo。
周末去拿货的时候,正好遇到ReadyNAS Duo缺货。于是在老板那里就顺便研究了一下两个产品的说明书。结果发现一个问题:磁盘限额并没有说明是使用独立的存储空间。而我实际需要的,并不是对容量的控制,而是对两个不同的应用领域:备份和大容量存储空间的物理隔离,以保证备份部分的安全。于是灵光一现:N3200pro其实可以做这件事做得更好啊!于是,在做了一些其他的询问之后,终于还是掏钱买了N3200pro。至于那个一现的灵光,下面会说。
好吧,现在我有了一个存储设备,它可接三块SATA II硬盘,另外还有一个eSATA可以外接更多的硬盘。它有两个千兆网口,两个USB接口可以接移动硬盘、无线网卡或其他设备。
有了这个存储设备,我可以做什么事情呢?我想,主要是两大类事情:
1. 数据备份。通过建立RAID,来增加数据的可靠性。需要备份的数据主要包括:程序代码、Blog数据、自己拍摄的照片、视频等。
2. 大容量的存储。主要是为电影、电视剧下载提供更多的空间。当然其他还包括其他比如软件、音乐或无需备份的数据文件。
首先我们当然是应该做空间分配。这里我设想的策略是:500Gx3,其中两个做RAID1,一个单独放着。这样的好处是将空间分成了物理隔离的两个部分,在一个部分上做的操作完全不会影响到另一个部分。这应该比磁盘限额之类的要靠谱得多了。
然后将两个部分分别mount到我的服务器上。假设两个mount目录分别是data和media,对应RAID1和单独的硬盘。
data部分显然是用来做备份工作的。备份主要分几块:
程序代码目前我在服务器上有两种管理方式(版本控制),hg和svn。其中hg的比较容易,直接clone一份到data下,然后定时pull/merge即可(用版本控制的方式做备份)。svn的话可以用dump/load进行备份和回复。考虑到代码提交频率,一般每天做一次增量备份,每月做一次全量备份就可以了。
我的blog是用文件系统的,而且尺寸相对不大,所以采用比较简单的方式——定期打tar包然后扔到data的特定目录下即可。
照片视频尺寸大,考虑使用rsync的方式增量备份。或者使用导入时同时写本地目录和远程目录的方式做文件级的备份。到时候视方便程度和效率再定。
另外,考虑对服务器定期(一个月左右)做一个根目录tar包,以备系统恢复。考虑到这个tar包可能很大而且用的机会不多(除非服务器硬盘坏),可以不用保留历史,每次做一个最新的存在NAS上即可。
另外一个硬盘,毫无疑问就是用来做大容量存储用的,我可以将mldonkey的下载目录以及其他一些临时且对速度要求不太高的目录直接绑定到media,这样就相当于为mldonkey的下载及其他的临时应用提供了500G的大容量空间。因为这些数据对可靠性要求不高(电影没了可以再下嘛),所以用单硬盘,一方面可以提高一点IO速度并充分利用硬盘空间,另一方面也将这块硬盘的频繁读写和备份盘分离,互不干扰。
实际上N3200pro还提供一些额外的功能比如bt/emule下载管理、FTP服务之类。至于到时候是将这些工作交给NAS还是仍然维持现状用服务器做,在实际应用中再看效果了。
不出意外的话这周末就可以开始动手了。嘿嘿,兴奋ing。
2009年01月04日 15:14
本文同步发表于Go4Pro。
年前在饭否的一次聊天,提到了一些使用软件的话题。gloomy同学让我写一个我在用的软件介绍。其实我感觉推荐软件是一件很困难的工作,每个人对一件工作的要求不同,我觉得很好的东西别人未必适合。想了想,还是做一个我自己的软件使用场景描述和自己的一些个人看法好了,也许比单纯的推荐软件要更加好一点。这些场景是平时工作中的一些片断拼凑起来的,也不排除一些纯虚构的场景存在。主要还是说明问题,是吧?
OK,Let's go。
(先介绍一下我的电脑设备,我有3台电脑。一台Windows XP的笔记本主要用于工作,一台Ubuntu 8.10 desktop的台式机主要家用,上网、少许开发和影音娱乐,一台Ubuntu 8.10 server的个人服务器用于家里的共享上网(iptables+shorewall)、集中下载(mldonkey)、blog(Apache+PHP)、个人项目管理(SVN+trac+mercurial)、远程管理(sshd)、文件共享(vsftpd+samba+nfs(试验性质,为未来的共享存储做技术性试验))、其他服务及实验性工作)
早上来到公司,我首先打开Foxmail收信,Foxmail的好处是小巧,配置简单方便。我的Foxmail只配置了公司的邮箱,每5分钟检查一次信件,这样不会遗漏什么重要的东西。然后我点击快速启动栏中的Firefox图标启动Firefox,由于Firefox的启动要花上一点儿时间,我会用Win+Space快捷键呼出Launchy,然后输入pid来启动Pidgin。Launchy的快捷键是我重新配置过的,用Win键可以避免和某些其他软件的快捷键起冲突。
这时Firefox已经启动好了,我会首先在地址栏输入“reader”和"gmail"并分别按Alt+Enter,通过awesome bar的搜索功能配合“在新Tab页打开”的功能查看我的Google Reader和Gmail。通过Gmail labs中的Google Calendar Widget,我还可以顺便瞅一眼今天的日程安排(通常不会太多)。
在消灭掉为数不多的Gmail邮件,大概瞧一眼Pidgin上BT群的消息之后,开始进入工作状态。用Launchy启动vss,继续修改代码,blablabla……,好吧,工作上的常规使用就不详细说了。这时我看到一封新的来信,有人问我某份C++代码的工作原理。我想起来这个代码原来是另一个人写的,现在已经交接了,新的人对它还不算熟悉。但我也没有仔细的阅读过这份代码。好吧,现在来阅读一下。
首先我打开一个命令行,用grep命令(这个grep命令是mingW的msys里带的)查找到main函数所在的文件,这是我的起点。然后在TotalCommander里找到它,按F4,用gvim打开(在TC里可以配置用指定的编辑器打开)。然后交替使用grep和gvim,配合gvim的A插件(用于切换头文件和cpp文件)和taglist插件(用于配合ctags生成classes tree),我可以逐层深入的阅读这份代码,搞清楚它的工作原理。
中间可能需要查阅一些资料,我用TotalCommand的F3查看文本文件,用Foxit Reader查看PDF,用OpenOffice.org 3查看Word、Excel和PPT,用chm reader查看CHM文件(chm reader可以让chm阅读完全易用Firefox的强大功能——GreaseMonkey、Awesome Bar等等。而且在Linux环境下,可以方便的将chm reader设置成默认的chm阅读器——可惜Windows下不方便)。
然后我打开Foxmail,回复一封信给对方,告诉他他想知道的信息。当然,中文是用搜狗拼音输入的。
事情处理完之后,我有时间上上网了。去火星笑话小组看看吧。我事先已经点击地址栏的星标,将这个网址加入了收藏夹,然后为它设置了“joke”这个tag。因此我只要在地址栏输入“joke”,火星笑话的网址就会在很靠前的地方显示出来——对我这样的懒人,搜索真是一个不可或缺的功能啊。然后我想起来前几天看到一个不错的笑话,就点了“发言”。嗯,我自己做的那个GreaseMonkey脚本还是让加注火星这件事方便了不少。
这时我看到有人在群里推荐一部电影。我也很感兴趣。于是我进入verycd,找到了这部电影,然后复制它的下载链接,打开我服务器上的mldonkey web界面,将这部电影加入下载列表。这个下载将会在我的服务器上进行,不会占用到公司的带宽。
中午休息的时候,我会打开foobar听听歌。然后用putty连到自己的服务器上去整理一下temp目录。
下午的事情不多。我想起有个朋友托我帮他写个小软件。于是我在TotalCommand按F7新建一个目录,然后按Ctrl+G在当前目录打开一个命令行(这个是事先做了快捷键配置的),输入 hg init 将其纳入mercurial的管理。然后用putty登录到自己的服务器,建立一个文件夹同样hg init做远程同步。然后在本地的TotalCommander里shift+F4新建文件并开始编辑。我是用python写这个小工具。写完一个部分测试通过后我就hg add/hg commit一次。其中有一些部分,涉及到正则表达式的,我会用kiki先做一下正则测试。若干次commit之后,这个工具的命令行雏形已经出现了。考虑到朋友并不是那么Geek并且用惯了图形界面,我想也设计一个图形界面给他会比较好。于是我想用wxPython来做。考虑到界面元素比较复杂,于是我想用一个可视化的界面设计器。上网找了一下,我决定用wxGlade。于是我进入wxGlade的官方网站,,点击下载并选择用DownThemAll。DownThemAll的其中一个好处是,当有些网站被GFW时,我可以使用FoxyProxy配合YourFreedom进行访问,而DownThemAll可以直接利用这时的代理设置,这样就不需要重新去设置下载工具的代理了。
安装完wxGlade并设计好界面,保存为XRC资源,在程序里调用,运行,效果似乎不错。最后又用py2exe为朋友做了一个发布版本。大功告成。在TotalCommander里用Alt+F5打包发布版目录,然后用Ctrl+G打开命令行,用pscp命令(这是putty的一个附加工具,单exe,我扔到windows目录下了,这样方便得多。)将压缩包上传到我的服务器上的web临时目录。然后把网址发给朋友,通知他来下载。
最后我没忘记将源代码hg push到服务器上做备份。做完着一切一看时间已经过了下班时间了,赶紧回家。
回家吃完饭,打开家里的电脑跟朋友哈拉。在家里一样可以在Firefox里输入“joke”打开火星笑话小组的网页——Foxmarks扩展帮我同步了公司电脑和家里电脑的书签。我又到verycd去找了几部电影加入了mldonkey的下载,当然这次不需要复制地址也不需要web界面,我事先写了一个脚本通过mldonkey的telnet接口将连接作为参数上传到mldonkey服务器,然后在桌面电脑的Firefox里配置该脚本为ed2k协议的Handler。这样我只要点击链接就可以直接将它送入mldonkey的下载队列了——而且是服务器上的。
这时LP建议在客厅播放海角七号阖家观赏。于是将音频接到事先铺设好的音频连线,然后打开Gnome-Terminal,运行一个事先写好的脚本mptv -f(BTW:我自己的脚本都放在一个专门的目录,并加入了搜索路径),通过调用mplayer将电影输出到第二个屏幕(也就是客厅的电视机)上。
我看了一会儿之后想起还有些照片要处理。于是通过自己写的一个导入脚本将先前拍的一些照片导入,然后用Picasa 3浏览,并选出不错的照片做一些简单的调整,打上星标,最后导出,准备跟其他人共享。其中有几张需要做一些比较大的调整,导出之后再用Gimp进行进一步的修改。——家人当然还在继续看电影,我做工作的1号屏幕跟他们的2号屏幕完全没有任何关系。
做完这些,电影也放完了。我就看看Google Reader,看看TwitterFox推来的消息,看看Pidgin上大家的爆发。不亦乐乎。
这时朋友发消息给我,说白天的那个程序要做一下调整。我又将代码 hg pull到本地,用gvim改代码。gvim在Linux下得到的支持显然好得多,可以多用很多插件,在Windows下工作不正常的grep命令也可以正常的使用。我还装了Project插件以便更好的管理代码。修改完毕后用scp命令重新上传到服务器让他下载。
顺便说一句,Ubuntu下的中文输入,我用ibus。
这时候狗屎皮项目的例会时间到了,于是接上麦克风,打开Skype跟BTer们进行语音会议。
然后回到卧室,打开笔记本,通过Launchy启动Filezilla,从服务器上下载前两天mldonkey已经下载完成的电影,不适合阖家观赏的那种,跟LP一起分享。当然现在觉得在笔记本上看片还不够爽。我们有了进一步的计划。
看完电影,合上笔记本,一天的软件生活,结束了。
2008年12月28日 23:16
看到大家都在总结08,我觉得我的08没什么好总结的。那就来点新年的新构想吧。—— 好吧,主要还是家里的网络。
实践证明,有了小虫之后,全家其乐融融的坐在客厅看电视基本上已经是可望而不可及的奢求了。现在只能在小虫上床之后躲在卧室里看。于是很自然的,原先架构的在客厅电视上播放电脑视频的方案就没有了用武之地。而且随着在床上使用电脑机会的增加,每天背着14寸笔记本骑车上下班也不太现实。一只轻便的上网本配合无线的方案就摆到了眼前。
今天跟LP讨论了这样一个方案:
- 升级卧室的电视机——换成28寸(暂定)液晶。带数码接口。用于看电视和播放视频。预算 3000-4000
- 一只上网本,用于在卧室的上网、编程、聊天以及接到电视机看片。暂定EeePC系列(我看上了那个Eeebuntu系统。咔咔)。预算3000左右
- 一个NAS存储服务器。考虑到笔记本和服务器内置硬盘的不可靠性及容量限制,另外今天看到猛禽在饭否上的抱怨,感觉DVD刻录也是不靠谱的,所以决定把我一直设想的存储服务器付诸实践。考虑到价格因素,决定还是DIY。这样用2000左右的成本可以构建出安全快速并且大容量的系统。(目标,2T,SATA,RAID5)
- 无线键鼠。当播放电影时,用于远程控制。
- 现在的服务器仍然做本职的工作,但影音数据及关键性数据通过NFS存储到NAS上去。
- 加重了无线在网络架构中的比重,因此视情况而定,可能需要升级无线路由器。
整个方案的费用大约是10000,不包括安装调试和浪费在上面的时间和精力。但是这个架构尽量的保留了原有的组件,但比以前那个基于有线网络的架构要轻便灵活得多了,尤其是将存储分离之后,基本上可以尝试集中的影音存储,通过网络流式播放的方案,这样对播放机的要求就降了很多,也避免了文件拷来拷去的麻烦。只是带宽这一节恐怕是瓶颈。
不知道各位看官有没有意见和建议?
2008年12月18日 12:40
因为现在Linux接触得多了,但是因为工作原因不能放弃Windows平台,于是就选择在自己的机器上装了一个虚拟机,在虚拟机里安装一个小型的Linux以备日常测试使用。自从听说了VirtualBox之后,我毫不犹豫的将原先的VMware换成了它。原因很简单,第一小巧,第二免费。
但是VirtualBox至少在网络方面,的确是没有VMware方便。VMwaere在使用NAT模式的时候,主机上会有一个虚拟的IP,可以直接通过这个IP和客户机进行通讯。而VirtualBox的NAT是没有主机IP的,虽然客户机可以直接上网,主机和客户机之间却无法通过网络进行通讯。而如果采用Host Interface模式的话,客户机想上网就需要在主机配置路由或网桥,十分不方便。
后来久而久之的我摸索出了一种既方便上网又方便主机客户机通讯的方法,说白了其实很简单:就是在客户机上配置2块网卡,一块是NAT模式用于上网,这个是免配置的,另一块是Host Interface用于主机和客户机通讯,但是不用考虑上网的问题。
在以前的版本中,当你选中Host Interface的时候,会需要你在下面的Host Interfaces里添加一个“虚拟网卡”,这个网卡会在“网络连接”里增加一个连接图标,这相当于是跟虚拟机连接的网卡界面,我们可以为它配置一个静态IP地址,然后在客户机里,为对应的网卡配置一个同网段的静态IP地址,这样就可以通过这两个IP地址互相访问了。
但是这个做法有一个问题,因为那个虚拟的网卡是单独的,每次当我升级VirtualBox的时候,这个网卡就会失效,每次要重新配置一个新的才行。另外,当虚拟机关闭的时候,主机里对应的网络连接就会弹出一个“网络已断开”的消息,虽然没什么影响,总觉得不太爽。
今天VirtualBox 2.1出了,我一如既往的选择了升级。重启虚拟客户机的时候,一如既往的给出了一个网络界面不存在的错误。刚开始的时候我以为跟往常一样,只要去重新添加一下Host Interface就OK了。
谁知一看到配置界面,我就愣了。这次的界面不一样了,Host Interface不再是空空如也,而是将目前系统里已存在的连接界面都列在了里面,而且也没有了增加和删除的按钮。
感觉不对的我赶紧去查了一下ChangeLog,果然看到了一条:
* New Host Interface Networking implementations for Windows and Linux hosts with easier setup (replaces TUN/TAP on Linux and manual bridging on Windows)
然后再去看帮助,帮助里只提到使用了新的机制,却对设置方法只字未提。(这什么烂帮助啊……)最后没办法只好求助于社区。还好社区里有人碰到了类似的问题,解决方法也很简单,只要在虚拟机里绑定一个现有的网络连接,而在网络连接中,TCPIP属性,高级,增加一个IP地址就可以了。(相当于在同一个网卡上划分VLan)
这个做法并不能解决NAT的问题,因此我的双网卡方案还得继续,但是Host Interface的设置确实是简化了很多,不需要额外虚拟网卡的支持了,效率也可以提高很多。而且还解决了以前VirtualBox里无法正常使用ICMP echo的问题。后来想想,这种VLan方案,在Linux Host上配置也会方便很多的。
另外,VirtualBox 2.1的改进中,我比较感兴趣的还有:
- Support for 64-bit guests on 32-bit host operating systems (experimental; see user manual, chapter 1.6, 64-bit guests, page 16) 在32位系统上虚拟64位机器
- Experimental 3D acceleration via OpenGL (see user manual, chapter 4.8, Hardware 3D acceleration (OpenGL), page 66) 支持OpenGL的3D加速特性
可惜都还是实验功能。
2008年12月10日 22:49
今天跟猛禽碰了一次头,就一些技术问题交换了一下意见。
期间猛禽提到这次SD大会上好多牛人都在提Django,而且也出现了不少Django开发的实际应用。我和猛禽都觉得有些不可思议。
因为我不是做Web出生,对于Web技术的演变一直比较迟钝。当时听说Django和TurboGears,还是通过limodou的blog。因为大家聊得比较多,于是去看了两眼。
limodou是比较倾向于Django的,但我的第一印象则是喜欢TurboGears。原因有几个。第一,当时我正好接触到CherryPy,对CherryPy的那种风格比较喜欢。第二,我发现Django可以管理多个Application,让我立刻联想到J2EE的容器以及Java应用那极其BT的部署方法,感觉不太好。第三,正如猛禽所说,Django重新造了所有的轮子,跟我的理念完全相悖。
但是因为当时手头也没有什么Web开发的东西,于是对他们的看法,也就停留在了这极其表面的第一眼上。倒是猛禽听了我的推荐,开始用TurboGears开发一些应用。
然而一段时间下来,他发现TurboGears也有不少问题。第一,TurboGears的底层所依赖的CherryPy,每次升级,变化都很大,顺带造成了TurboGears的每个版本变化也很大(但是这个问题,早期的Django也有)。第二,TurboGears因为使用了大量第三方的组件,造成了严重的依赖,首先安装的时候很不方便,很难在离线的状态下安装完整个TurboGears,其次它所依赖的组件很容易跟其他的程序冲突。当时猛禽就碰到过因为同时安装了TG和Pylons,造成了TG应用无法正常运行的情况。
后来BT群开始狗屎皮项目的时候,我就稍微慎重了一点,最后选用的不是我原先推崇的TurboGears,当然也不是Django,而是另外一个RoR风格的开发框架Pylons。Pylons框架可以说是我第一个深入使用的开发框架。使用至今,我的感觉依然和一开始没有太大的变化。Pylons其实并不是太适合作为一个从头开发的框架使用。因为严格的说,它只是一个半成品的框架,甚至没有默认的数据库操作组件。因此要完成一个项目,先期要做大量的工作。这些工作对于一个项目的开发来说,是无谓的时间浪费,因为从根本上来说,这些工作并没有为项目本身带来任何好处。
然而Pylons的一个优点也在这里,正因为它没有绑定太多的东西,所以用它做开发的时候,选择非常的多而且灵活,你可以用你习惯的,崇尚的任何框架来配合Pylons使用,从而组合出最适合你或者最适合项目的一个完整开发框架。而且Pylons的主线流程非常简单,我在从来没有接触过的情况下,只花了大约1天的时间就大致弄清了它的运作机制——这对于需要定制的系统,是非常重要的。
有的时候我在想,如果我真的接到一个任务,我会选择Pylons吗?八成不会。除非这是一个可以长期发展并且可以衍生的项目,我才愿意花一些“不必要”的时间去完善这样一个框架并在此基础上再做真正的开发。否则,当然还是一个现成可用的框架来得更好。
这么看下来,似乎值得选择的还真的只有Django了。但是我仍然持有上面提到的那些感觉不爽的意见,但是为什么现在这么多人都选择了它呢,难道他们没想到这些?还是说,这些根本就不是问题?在我开始一个实际的Django项目之前,我希望能有一个对Django比较了解的人,能够为我深入的介绍一下Django,告诉我Django到底有什么好。
2008年12月08日 23:10
今天TR在Gtalk上对我说,我的blog留言功能有bug。他辛辛苦苦写了一大段话,结果因为里面包含了一对“<<”符号,后面的文字全部被切掉了。
我自己测试了一下的确如此。而且切掉的内容在我的后台也是没有的。无奈之下只能让他复述了一遍原先留言的内容,然后我手工帮他修改了。
初步的设想是因为留言处理HTML tag的机制而导致了问题,所有的<>应该写成<和>才对。但是不能要求留言者做这样hack的动作,于是我决定还是去修改后台代码。
首先找到后台modules目录下的modules_comments.php,看了一下handlePostComment函数的代码,看到了一句
'comment' => $comment_text;
就想当然的写了一个转码小函数
function convertHTMLtag($source){
$source = str_replace('<', '<', $source);
$source = str_replace('>', '>', $source);
return $source;
}
然后将那句改成
'comment' => convertHTMLtag($comment_text);
测试发现,无效。
正在疑惑的时候突然发现页面下面有一行小字:
Small print: All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.
这说明系统一定已经是对HTMLtag进行了处理。我处理的其实已经是经过处理之后的文字了,那里已经不含有多余的<和>,难怪改动会无效。于是再仔细的检查代码,发现原来在pvlib.php里有一个函数strip_tags_attribute,就是对留言做预处理的。这个函数的代码中,使用了PHP内置函数strip_tags对留言文字做处理。这个函数将允许的HTML tag以外的其它所有tag简单的删除。而当留言中出现<或者>的时候,因为没有转码,也被当作是HTML tag的一部分了。所以就被删除了。
因为strip_tags是PHP的内置函数,已经没有办法进一步跟踪了。思来想去,我决定写一个新的函数替换掉它。于是,就写了下面这个函数:
function e_strip_tags($source, $allowedtags) {
preg_match_all('/<([a-zA-Z]*?)>/', $allowedtags, $temp);
$allowedtags_tag = $temp[1];
$temp = $source;
foreach($allowedtags_tag as $tag) {
$temp = preg_replace('/<(\/?'.$tag.'.*?)>/', chr(254).chr(254).'$1'.chr(255).chr(255), $temp);
}
$temp = str_replace('<', '<', $temp);
$temp = str_replace('>', '>', $temp);
$temp = str_replace(chr(254).chr(254), '<', $temp);
$temp = str_replace(chr(255).chr(255), '>', $temp);
return $temp;
}
这个函数的作用是,将除了允许的tags之外的其他tag的<和>转码成<和>,而不是将tag简单的删除。这样就能尽量的保留所有文字,不会误删,又能尽可能的维持blog留言的原有功能了。
这段代码的基本原理是,将含有允许HTMLtag的<和>先替换成两个不常用的字符串,然后将剩下的<和>转码,最后将那两个不常用字符串再转回来。
最后将strip_tags_attribute函数中的strip_tags调用换成e_strip_tags,就大功告成。