2004年10月29日

因为要试别的软件,于是我安装了vmware,我分配了10G的空间(听别人的建议),其实我的硬盘已经不多了,不过,vmware有一个好处就是当虚拟机硬盘不够会自动扩充。但当我装好软件,我发现我不想用10个G,而此时实际的文件大小已经是7G了。在网上查了查,都是说vmware一旦设定硬盘大小是无法改的。怎么办。我试了试Partition Magic分区管理软件,把我的虚拟机硬盘大小改变成了5G。但虚拟机文件竟然又长到了9G,越来越多了。怎么办?最后我想出了使用Ghost将改变后的虚拟机克隆,然后拷出来。删除虚拟机。建一个新的虚拟机,这次分配了5G。然后再利用Ghost镜像恢复。于是,按我的想法开始实施。

  1. 如何克隆?

    Ghost要在Dos环境下运行,网上许多Ghost的工具都是生成一个软盘镜像。于是我在虚拟机中添加了一个软驱。但发现,要生成这个镜像不知有多困难。软驱读个不停,什么都出不来。后来我注意到这些镜像文件都是使用winimage生成的,而且vmware可以把一个镜像作为软驱。这样,我使用winimage打开这些镜像文件(是.exe文件),然后另存一下,文件后缀改为.flp。然后在vmware中把这个文件作为软盘的映像文件。启动虚拟机,注意在启动时要进入虚拟机,按F2以便进入CMOS,然后修改启动顺序,允许软盘启动。改好后,保存退出,系统会进入Ghost。然后开始克隆吧。当然在克隆前你需要虚拟机有多余的分区用来保存ghost文件。因为我的有10个G,使用Partition重新划分后,多了一个分区,我将其格式化为Fat32格式,它可以用来保留ghost文件。

  2. 上面我们克隆完了。然后进入虚拟机,连通与主机的网络,把ghost文件拷贝到主机上。
  3. 删除你的虚拟机文件,创建一个新的虚拟机。
  4. 现在的问题是,如何把ghost文件可以让虚拟机看到。如果新建一个虚拟机,上面是空的,肯定是没有办法。我的麻烦的方法就是先装一个windows 2000,硬盘大小5G。装好系统联通网络。然后再虚拟机上增加一个虚拟硬盘,格式化一下,然后启动虚拟机,通过网络把ghost文件拷贝到新的硬盘上。
  5. 然后再用软盘启动虚拟机,启动ghost,进行恢复。
  6. 恢复成功的,把新建的硬盘文件删除即可。

上面这几步返返复复有许多步。我的方法的确很麻烦,但终于实现了我将虚拟机硬盘空间变小的要求。因此建议使用vmware不要分配太多的硬盘空间,因为以后不够还可以再加。另外,中间再安装windows 2000的目的是联通网络把ghost文件拷贝到虚拟机可认的硬盘上。在网上看到可以生成网络启动盘,这样在dos下也可以共网络连通。不过用软驱在虚拟机中有些麻烦,如果做成启动盘然后生成个映像,再vmware中设成使用映像应该会节省不少的时间。

反正是成功了,也不知道还有没有别的方法。总之,空间不要太大,不够再挂。不然后悔可就麻烦了。 

2004年10月28日

问题一:

创建新文件有什么说法么?..比如和被扩展的槽类在同一个目录下? 命名有什么规则么?通过什么方法讲这两部分连起来?

我的回答如下:

创建新文件没有什么特殊的。可以和槽类放在同一目录,也可以不放在同一目录。命名随意。它的技巧就是,在主模块中将把所有Mixin文件导入,这样,利用python的特性,所有定义在顶层的语句都将被执行,而且这个模块只会导入一次。为了方便,我在NewEdit将所有Mixin模块放在了一个目录下mixins,并且将mixins变成一个包,这样我加入了一个__init__.py文件。然后在__init__.py文件中把所有mixin导入。这样,在主程序中我只要把这个包导入就可以了。以后每增加一个新的Mixin模块,就只要改mixins/__init__.py就可以了。

还有就是,因为所有Mixin都将被导入,因此尽可能减小它的大小,这样导入时可以快一些。因此在NewEdit中,能独立的东西都单独出来,并且不需要马上导入的东西都在局部作用域中进行处理。再有NewEdit做了一种融合的特殊处理,就是在运行将把所有Mixin模块变成一个文件,这样也应该可以减少读文件的个数,提高一些效率。这些在NewEdit都已经体现出来了。

两者的关联就是你在每个Mixin或Plugin定义后面加的Mixin.setPlugin和Mixin.setMixin这样的语句来完成的。详细的在设计说明已经有了。

如果大家对NewEdit中的Mixin有什么不明白,不清楚的都可以提问。

再有Mixin只是一种技术,没有一定的标准,大家可以根据实现Mixin的方法实现适用于自已的Mixin组织结构,因此可能NewEdit所用的技术不一定适用你。这样,你完全可以定义出一种更好,更实用的方式来。

问题二:

关于 mixin 的部件放到了 mixin 目录下了 ..把插件放到了 plugin 目录下.. 每个 plugin 有个自己的 pin 描述我看到把 Mixin.py 放到了 module 目录下了..  这个 module 在整个框架中什么类型的代码放到这里?…

其实在NewEdit中Mixin和plugin本身不是很细分,我说的是从模块一级来说。只有在具体实现才细分是mixin方式扩展还是plugin方式扩展。因为一般一个扩展模块中,可能mixin和plugin两种扩展都有,因此叫什么都不是特别合适。因此,我把NewEdit核心要使用的叫做了Mixin,把不是必须,而且可以由用户自已来编写的叫做了Plugin。同时在管理上采用了不同的目录。你可以不这样做。

在NewEdit中modules目录都存放一些公共模块。你也可以不这样放。

也就是说,你可以随意组织你的目录结构,不一定和NewEdit相同。只要你能找得到就行。:)

2004年10月27日

在我提交Bug报告给Irmen De Jong,他反应很快推出了 frog 1.0Beta2版。于是我下载并删除了老的 Frog 目录,安装了新的 Frog ,但启动web server时报错。于是在列表里报告,得到的答复是,需要把以前在 Frog 目录下保存Blog的blogdata转换到Snakelets的安装目录下,不再放在Frog目录下。这点的好处是以后升级不会影响以前的数据。的确应该这样,原来的安装是数据与程序在一起,可能给人的感觉好一些,但一旦生级可能就不行了。以后的 Frog也许不带blogdata目录。还有要强调的一点时,出现这样的问题是因为我使用缺省的配置,如果你是自定义了Frog/__init__.py中关于blogdata的设置,就不用再拷贝blogdata目录了。不过,因为新的版本带有__init__.py,因此如果你直接拷贝可能会覆盖掉以前改好的配置,这样就需要重新设置一遍了,这样可能有些麻烦。在__init__.py中要改的目录设置代码为:

“storage” : “blogdata”,

注意,目录是从 snakelets 的安装目录开始计算的。

新的版本改正了路径分隔的错误,使用os.path.sep来进行处理。同时分类支持Unicode。

2004年10月25日

上文说到我不知道怎么关闭 snakelets ,这次尝试知道了。当你启动 snakelets 后,会进入它的首页,点击上面的Manage Server链接就会进入管理界面。在左边side bar的server info上点击,然后进入server信息页面,在Actions的中间有一个shutdown的链接,点它就可以关掉 Snakelets 了。

好了,书归正传,下面说一说Frog的安装。

  1. 你已经安装好了 Snakelets 了。还要安装它的插件包。在sourceforge.net上下载Snakelets时可以看到有一个plugins的包,把它下载。解压到一个目录下。然后将它的子目录(目前有三个:cache, compress, scheduler)全部拷贝到 Snakelets 安装目录下的snakeserver/plugins下。
  2. 然后解开Frog到一个目录,把它的webapps下的frog目录拷贝到 Snakelets 安装目录下的 webapps 目录下。然后重启 Snakelets。
  3. 再进入管理界面,你会在左边的side bar看到frog。
  4. 在浏览器上执行 http://localhost:9080/frog/ 注意,frog 后面一定要有/,否则会报错,我也不知道是为什么。然后你可以以admin的身份创建新的用户了。

不过,在创建用户时,如果你在windows平台上会报错,这是因为frog中有一个小bug,就是在frog/frog/snakelets.py中第218行左右,有一句:

articles=[ article.split('/') for article in glob.glob( path ) ]

这在*inx平台下没问题,因为路径分隔符是’/',但在windows下不行。于是我改为:

articles=[ article.replace('\\', '/').split('/') for article in glob.glob( path ) ]

就没有问题了。因此如果你在windows平台下,一定要改过来。

我想以后的版本可能就会正确了。感觉这个blog系统,更适合用于一个团队。大家有兴趣可以加入它的邮件列表,不过作者好象是个德国人。

大家还可以到这个地址测试一下看一看:http://www.razorvine.net/snake/frog/

2004年10月24日

找了找如何安装的文档,没找着。配置要求最好是 Python 2.3 版本以上。

随便解开到一个目录下,其中有一个serv.py和setup.py。在命令行上执行:

python setup.py install

结果会告诉你不会做任何事情,只要运行serv.py就好了。那也就是说,根本不用安装,解开就可以运行。的确方便,连配置都不用。

执行python serv.py会启动服务。然后在浏览器中敲入:

http://localhost:9080

你会看到一个页面。可以进行基本的配置和几个web application的示例。进入管理页面,可以看到对每个web application可以进行reload, shutdown等操作。感觉真象一个web application server。而且看特性介绍(见前一个Blog),很象Java机制提供象servlet和jsp一样的功能。再仔细研究一下。

好象没有关闭的功能,直接把命令行窗口关掉,或Ctrl+C退出进程就行了。不过当我按Ctrl+C时,可以在日志输出中看到关闭的日志信息。

snakelets 是Irmen de Jong (好象是一个德国人)开发的一个web application server, frog 是他开发的一个blog系统,刚刚发布。看上去挺有意思。

Snakelets特性(简单翻译一下,但求意思准确,不求雅):

  • snakelets is written in 100% pure Python. It is small, simple and extremely portable – it runs everywhere Python runs and TCP/IP networking is available. It works on Python 2.2 but Python 2.3 is recommended.
    Snakelets是百分百纯 Python。它小巧、简单并特别容易移植 – 它可以在任何可以运行Python和TCP/IP网络可用的地方。它工作于 Python 2.2上但建议使用Python 2.3。
  • Multithreading web server that can service multiple requests at the same time, and can handle file streaming and partial reads (i.e. seeking in a streamed mp3 or resuming a download). No additional installed web server such as Apache is required to run snakelets.
    多线程web服务器,可以同时服务于多个请求,并且可以处理文件流和部分读(也就是,在流化的mp3上查寻或断点续传)。不需要额外安装象Apache这样的服务器来运行Snakelets。
  • Fully unicode compatible (can read and output pages containing all character sets), and can be run from a CD (readonly mode).
    全unicode兼容(可以读出和输出包含所有字符集的页面),并且可以从CD上运行(只读模式)。
  • Automatic discovery and installation of web services and web application. No complex configuration files needed.
    web services和web 应用的发现和安装自动化。不需要复杂的配置文件。
  • Snakelets: very easy ways of creating dynamic web content (code-centric, you write request handlers in Python). (like Java’s Servlets)
    Snakelets: 非常容易地创建动态web内容的方式(以代码为核心,用Python编写请求处理器)(象Java的Servlets)。
  • Ypages: add Python server-side scripting to a web page for dynamic content (using a page template processor). (like Java’s JSPs). Ypages are compiled to Python code (actually, to a Snakelet) that is then executed every time the page is requested.
    Ypages:为动态内容向web页面增加Python服务端脚本处理(使用页面模块处理器)。(象Java的JSP)。Ypages会被编译为Python代码(确实,为Snakelet),然后当每次这个页面被请求时执行。
  • On-the-fly-updating: Ypages are automatically recompiled if you change them on disk. So a simple reload in your browser does the trick, it is not necessary to restart the server when you want to make changes in the website.
    即时更新:如果在硬盘上改变了Ypages,它们将被自动重编译。所以当你想在网站上进行修改,不需要重启server,只要在你的浏览器上进行刷新就可以了。
  • Built-in management of the server and the web applications using the included management web application. You can see info of all web applications, reload them, disable them, delete them… from your web browser. See a screenshot of this.
    内置server和web应用的管理,使用包含的管理web应用。你可以查看所有web应用的信息、装载它们、禁止它们、删除它们…从你的web浏览器。看一下screenshot
  • Easy session and user management for your HTTP requests, using a cookie with a secure session ID.
    简单session和用户管理用于HTTP请求, 通过使用带有一个安全的session ID的cookie。
  • Easy user authentication and user login handling.
    简单的用户认证和用户登录处理。
  • Plugin mechanism to add features or intercept specific actions in the server.
    插件机制,用于在server上增加特性 或执行特别动用。
  • Good performance because of compiled page code and little memory usage.
    良好的性能,由于编译的页面代码和少量内存使用。
  • Several example web applications are included: a mp3 indexer and streamer, and a shop (and the management app).
    包括几个示例的web应用:mp3索引和流化,一个网上商店(和管理应用)。

Frog特性(简单翻译一下,但求意思准确,不求雅):

User experience(用户体验):

  • Multi-user support. Login as admin, create a new user, and a new web log site has been created.
    多用户支持。以admin登录,创建一个新用户,然后新的web log 站点已经创建了。
  • User-definable article categories for easy grouping and retrieval.
    用户定义文章分类,可以容易地进行分组和整理。
  • You can choose to allow other people to reply on your articles, or only registered users, or none at all.
    你可以选择允许其它人回复你的文章,或只允许注册用户回复,或不允许回复。
  • Preview your article or comment before posting.
    在发布文章或评论之前预览。
  • Edit your articles or comments afterwards (correct mistakes, remove insulting comments, etc).
    事后编辑你的文章或评论(修正错误,删除无理的评论,等等)。
  • Subset of “BBCode” formatting language allows some article markups, urls, image links, code blocks…
    使用”BBCode”格式化语言的子集,允许某些文章标记、url、图片链接、代码块…
  • Browsable archive in the form of monthly calendars where you can click on specific days.
    可浏览的归档,以月历的形式,可以点击某一天。
  • Full-text search for articles, between certain dates, of a specific category, etc.
    文章的全文搜索,可以限定日期,或指定分类,等。
  • Permanent links (‘permalinks’) to individual articles and comments.
    永久链接(‘permalinks’)用于独立的文章和评论。 
  • Basic page customization by just editing a few fields in your user profile.
    基本的页面定制,在你的用户配置信息中只要编辑几个字段。
  • You can choose from three default page color styles (CSS stylesheets).
    可以从三种缺省的页面颜色系统(CSS样式单)进行选择。
  • Fully Unicode compatible. Type all strange characters that you want, frog swallows them happily.
    全unicode兼容。可以敲入所有你想要的奇怪字符,Frog会很高兴地吞下它们。

Technical(技术):

  • No database required! frog stores its data as XML files in the filesystem. This is faster than you think :)
    不需要数据库!Frog以XML文件将数据存储在文件系统。它比你想象的要快得多。:)
  • No additional webserver required! Snakelets is all you need (version 1.36 or newer) .
    不需要额外的webserver!只需要Snakelets(1.36版本或更新)。
  • Easy to customize the look and feel by editing template pages and CSS files.
    容易定制外观,通过编辑模版页和CSS文件。
  • Generated pages are very efficient valid XHTML + CSS.
    生成的页面是有效的XHTML+CSS。
  • Because of div-based layout, and CSS, it’s very easy to build your own visual layout.
    使用了基于div的布局和CSS,很容易创建你自已的可视化布局。
  • Very small code base.
    非常小的代码基础。

Future plans(计划)

  • Single-user mode (with shorter URLs?)
    单用户模式(可以有短的URL?)
  • Caching (pre-generation?) of often-requested pages
    对经常请求的页面进行缓冲(预生成?)
  • Image icons for categories, and/or articles
    分类或文章的图标
  • Uploadable files (attachments), easy image-attachment inclusion in articles
    上传文件(附件),包含在文章中的简单附带图片
  • RSS feeds
    RSS feed

感到小蛇和青蛙有许多可以期待的特性。有时间好好研究一下。

2004年10月20日

在Python.cn罢工几天后,昨天我在google.com上申请了一个新的Python邮件列表,它可以做为python.cn的备份。主页地址:http://groups-beta.google.com/group/python-cn  邮件地址:python-cn@googlegroups.com

欢迎大家加入,有问题与我联系。

我已经加入了大部分原python.cn的用户,但有些漏掉了,可以自行加入。如果不行,可以告诉我把你们加入。

2004年10月18日

NewEdit 中,我一直使用locale.getdefaultlocale()来得到操作系统的缺省编码,认为它与文件系统的缺省编码应该是一致的。今天偶然查阅 Pythn 的文档发现,在sys模块中提供了得到文件系统编码的函数,因此可以直接用它。内容如下:

getfilesystemencoding( )
Return the name of the encoding used to convert Unicode filenames into system file names, or None if the system default encoding is used. The result value depends on the operating system:
  • On Windows 9x, the encoding is “mbcs”.
  • On Mac OS X, the encoding is “utf-8”.
  • On Unix, the encoding is the user’s preference according to the result of nl_langinfo(CODESET), or None if the nl_langinfo(CODESET) failed.
  • On Windows NT+, file names are Unicode natively, so no conversion is performed.

New in version 2.3.

看来 Python  文档要多看才行,很多新东西不注意就不知道呀。

Qiangning Hong 在[Python学习]使用__getattr__要注意的的留言中说,比较两个对象本身应使用is操作符,比较值应使用==操作符。的确是这样。不过,在进行一般的类对象的比较时,使用==也可以起到is的较果,这是由Python自动来完成的。而且我在第二篇Blog中提到,产生这个原因并不是我想要直接比较两个对象是否相等,而是因为使用index(),结果出错才发现的。这个问题我提交到了python.org的邮件列表中,得到了Alex Martelli的响应,他给出一种是使用new style的类声明,不过我还不会。另一种是这样:

class A:
    def __getattr__(self, name):
        if name[:2] == ‘__’ and name[-2:] == ‘__’:
            raise AttributeError, name
        else:
            return None

引发一个异常就可以了。但这个异常在碰到象__eq__之类的特殊方法时不会真正引发异常,而是按缺省情况进行处理,大家感兴趣可以自已进行试验。这样,不仅可以避免__eq__这样的错误,而且还可以处理一类这样的情况,比如避免print a 出错。

2004年10月17日

今天在网上发现一个网站 gmane ,它可以把maillist转成news的线索风格,提供一种分级的显示,很有趣。其中有 Python.cn 的邮件列表地址,可以通过 这里 进行访问。不过里面并不全,而且也不是很新,不过看一看的确有趣。中文支持还算可以。如果某个邮件列表不存在,好象还可以自已增加。同时它还提供功能的源码,有兴趣的可以下载看一看。下面是截屏: