2005年06月30日

今天想做一个自动登录服务器执行一些命令,然后上传一些东西进行部署的东西。看到有一个叫telnetlib的库可以使用,于是做了一个简单的小程序来登录到服务器执行一些命令。代码如下:

import telnetlib

host['ip']=’127.0.0.1′
host['user']=’test’
host['password']=’test’
host['commands']=['cd lib', 'ls']

def do(host):
    tn = telnetlib.Telnet(host['ip'])
    tn.set_debuglevel(2)

    tn.read_until("login: ")
    tn.write(host['user'] + "\n")
    tn.read_until("Password: ")
    tn.write(host['password'] + "\n")

    for command in host['commands']:
        tn.write(command+’\n’)
    
    tn.write("exit\n")
    print tn.read_all()
   
    print ‘Finish!’

上述程序只是一个示例,并不能真正运行。不过感到使用 Python 的模块真是太方便了。

但也遇到一些问题,主要就是如何判断程序执行的结果。telnetlib提供好多方法可以得到数据,象read_until()是当结果中存在想要的信息时返回,read_some()是只要有结果就返回,read_very_lazy()是返回缓冲区中的数据。经过看代码,telnetlib采用缓冲的处理方式,因此数据并不是一下子就返回的,而是先放在了缓冲区中。许多的读取处理都是围绕着这个缓冲区来的。而缓冲区的信息何时到达就不说不清楚了,也许很快,也许很慢,也许分别到达,也许一下子就收到了。因此,对于数据不一定到齐的这种情况,就采用了象read_until()来判断缓冲区中的数据是否有想要的内容,如果没有就等待,除非到达了超时时间。再有可以使用expect方法,与read_until差不多,但是它可以支持正则表达式,功能要强大得多。

在网上还有一个叫 Pexpect 它好象功能强大,它支持多种协议,它的主页就建议使用 Pexpect 来下载它的文档。不过因为网络不太好就没有下来,不知道支不支持 Telnet 协议。

上面的程序再配以 ftplib 的功能就可以做一个远程更新的维护程序。只不过如何判断后台返回的信息,我没有找到好的方法,是使用read_lazy()还是read_eager()呢?还是什么别的方法。最主要的问题是,返回的数据不一定完整。好象没有提供一个read_line()的方法。

上文说到已经可以播放英文的语音了,但不知道有没有中文的语音库。mep给了我微软的一个语音开发包下载的网址。于是上到上面下载了5.1开发包和日文和中文的语言包。东西都挺大。加在一起有139M之多。安装完毕后,写了个小程序试了试,如下:

>>> import pyTTS
>>> tts = pyTTS.Create()
>>> tts.GetVoiceNames()
[u'MSMike', u'MSMary', u'MSSam', u'SampleTTSVoice', u'MSSimplifiedChineseVoice']
>>> tts.SetVoiceByName(‘MSSimplifiedChineseVoice’)
>>> tts.Speak(u’中国人民共和国’)
>>> tts.Speak(‘中国人民共和国’)

请注意,红色背景的那行,执行后无效。不能使用unicode,需要使用国标码。

对于文本中的英文,那么就会一个字母一个字母地读出来,而不是单词。因此对于中英文混合的话可能需要分割开,以使用不同的语音进行处理。自动识别可能有些麻烦,由用户自定义标记然后解析可能要简单得多,但也不方便。谁有兴趣可以使用 Python 做一个朗读器了。

还有一个问题就是中文语音能否方便的安装,因为装得东西太多了。因为现在搞不清到底语音的安装过程是如何的,先不管它。到google上搜一搜吧。

这次发布最令人兴奋的应该是终于昐来了Windows下的GPL版权的开源版,开发开源的QT程序没有问题了。希望PyQT早点出来。

此则消息最早是在 Python.cn 邮件列表中的alang yin发布出来的,于是我连夜下载。今天在 Windows XP 下装上了,并且看了它的演示程序。真是让我看得喜不自胜。看到这样好的一个软件,又可以方便地使用真是快哉!快哉!

而且我特别发现它的演示在sql中有一个qsqlite(在demonstration->SQL browser中)的驱动可以直接访问sqlite 3的数据库。我的项目数据库用它就可以访问。感觉非常好。还有它的图形示真好看。

有时间开始学QT了。

在QT的网站上面有他们的开发团队表演的一段视频,有舞蹈、有唱歌。动作很简单,但看到他们高兴的样子,不禁也被感染了。

这里在视频中他们摆成的图案。

BTW: QT在中国也有公司,网站在这里。但这里到目前为止还没有发布关于QT 4.0的任何消息,反应好慢呀。

2005年06月29日

看到这样一篇文章:Synthesizing speech with pyTTS

这篇文章写得非常清楚。于是按照上面的指示,我给我的一个程序加上了:当你点击按钮时它会读出来。虽然没什么用,但是很有趣。

不过现在微软只有英语的语音,如果还有中文的就更好了。

在使用 PySqlite 中经常创建新的连接是很常见的。不过在使用过程中我的确也遇到了一些小问题,记录在下面。

问题就是在事务处理过程中,对于已经插入的数据,尽管没有提交但仍然是可以访问的,只要是使用同一个数据的连接对象。在对某些递增字段的处理,我曾经写过一个方法,它的作用就是从已经插入到数据库中的数据中最一个值最大的并回。然后我就可以使用这个最大值加1就得到新的值。想法的确很简单,实现也简单。

但我发现我得到的最大值总是一样的,为什么呢?后来才知道,因为我是使用了自已封装过的一个数据库对象,它在创建时会自动创建连接。也就是说,每创建一个新的对象会创建一个新的连接。而这个函数就是创建了新的连接对象,因此才会取不到别的连接对象所插入的数据。后来使用同一个连接对象来处理就对了。

因此数据库连接最好是使用同一个。对于不同的数据集的处理可以在使用同一个连接对象创建不同的游标,以免数据混在一起出问题。

2005年06月26日

因为学习 Ajax, 需要使用web server,因此就使用起Karrigell。不是为它做广告,的确是非常方便的一个web framework。做些东西太方便了,就象随手写一个小的 Python 程序一样,非常容易地可以体验web开发。我这个有一个毛病,觉得什么东西好就喜欢向别人推销,就象我向我的同事推销 Python 一但,不过他们是坚决的反对,没有一个心动。不过我也无所谓,你不学我照样学,在网上不是还有许多的同好可以交流嘛。我想他们不想学也是有理由的,编程是件痛苦的事情,如果你无法投入,你基本上就编不了程序了。许多人架构理论一堆,让他编个程序实现一下子就不行了。但一个精通编程的人却依然可以提出架构理论来。只不过现在这个世道,如果你是一个程序员,那好,我提出架构你去实现就行了。至于你提出的什么架构,对不起,我可没功夫与你交流,因此你也别向我提。当然事情未必就是这么极端,绝大多数情况是,做架构理论的人基本上不会征求程序员对架构的看法。我感觉是这样的,因此上别人不找我我也绝对不发表什么意见。真是有些道不同不相为谋。我怎么就这样了呢?是被谁逼的呢?

呵呵,以上的话是从做广告想到的,无聊的东西。

那么关于 Karrigell 有什么事情我想说得呢。一个就是关于 Karrigell 与 Apache的结合的问题。在我以前的Blog中曾经写到 Karrigell 可以通过mod_python与Apache紧密结合,但后来有人说文档中根本没看到。于是我仔细查了不同版本的 Karrigell 的文档,然后又在它的maillist中提问最后明白是这样的:

在2.1.2的文档还是通过mod_python与Apache相结合,但在最新的2.1.5版本已经变成了使用反向代理的方法,与CherryPy, Snakelets所使用的方法一样。为什么会这样,这是作者(Pierre Quentel)的回答:

 There was a problem with mod_python. It worked fine on Windows, but on
Linux, Apache works on a multi-process mode, creating different
instances of the Python interpreter. For the scripts that use sessions,
since Karrigell stores them in memory, if a request is handled in a
different process than the previous ones by the same user-agent, the
session object can’t be found

I tried to fix that with persistent sessions but couldn’t come to a good
solution. So I finally decided to drop the mod_python integration and
recommand to configure Apache as a proxy to the built-in server in
Karrigell. This is the approach of many other Python web frameworks
(Snakelets and WebWare for instance)

If you have a Windows machine you can still use mod_python as described
in version 2.1.2, with ApacheHandler

可以看到是由于Apache多进程的问题造成的,由于 Karrigell 的session的管理是在内存中,在多进程的情况下不好处理,他正在解决这个问题。因此目前建议是使用反向代理。但在windows下还是可以继续按2.1.2中的说明进行配置,使用mod_python。我试了的确也是可以的(因为我就是在windows下试的),不过好象有问题。不过关于这个问题的答案已经知道了,下面要看作者是如可解决它。

另一件关于 Karrigell 的事就是作者开始提议也开发一个Blog系统,我是很支持的。我想开发Blog系统并不是为了跟风,而是增加在 Karrigell 上的应用,同时可以很好的宣传 Karrigell,如果在这个过程中又可以学到东西不是非常好的一件事情吗。我要继续关注此事。也希望有兴趣地朋友也一起来关注此事。

2005年06月24日

现在信息垃圾的形式是越来越多。比如垃圾邮件。写Blog有段时间了,突然就发现有垃圾评论了,还有大量的网址。然后就是donews提供了认证码输入。垃圾没了,但有时还是有漏网之鱼。结果发现这群垃圾制造者们开始通过ping/traceback的方式创建链接,一般人的确是看不到,但我打开评论管理就可以看到。又是一顿删除操作,但donews不支持批量操作。好在坚持了一段时间,垃圾ping也少了。但打开统计看一看都有谁访问吧,结果看到的满眼都是垃圾网站的爬虫,这个我就没办法了。如果donews允许个人设置网站黑名单就好了,垃圾网站你也别来。

不知与信息垃圾的斗争要到何时。Blog垃圾也一度影响到许多wiki,结果许多wiki都加上了用户认证才允许编辑的设置。象我创建的邮件列表为了禁止广告垃圾也不得不加上订阅的审批流程。唉,生命不止斗争不熄。

请不要在首页转载文章”这句话不是我说的,而是我从博客园看到的。具体内容如下:

     今天早上起床后, 打开电脑访问博客园,竟然在博客园首页看到两篇昨天夜里发表的转载文章!很是气愤!! 这两篇文章分别是:如何在自己的系统中打开并关闭外部程序程序员换灯泡,作者分别是萨维奥拉potter 。相信所有在首页看到这两篇文章的人都很气愤!我真想限制这两个人的帐户,可是考虑到他们刚注册不久,对情况不太了解,也就算了。
    原创是Blog的灵魂!如果只是想转载文章请回论坛去吧, 你不合适做博客!博客园严禁在首页转载文章,我想大家也非常反对这种恶意破坏博客园氛围的行为!
    请不要在首页转载文章!!

很佩服也很支持博客园管理员的作法,我几乎每天都看一看博客园,因为它的更新与质量是相当高的。尽管我不研究.Net,而且上面的好多东西我也不懂,不过看一看也挺有意思,了解一下别人都在研究什么。它在保持原创方面做得相当好,自然会有一些门槛,但同时也带来的声誉。

不过这样也让我想到别的博客站点能做到吗?现在转贴已经成风,donews上排名高的绝大部分是转贴,虽然这种做博客的做法也不能说什么,只是我不会这样做,那是别人的事。只不过真心希望还是原创好一些。

2005年06月22日

VenkMan 是 Firefox 的一个扩展,它可以用来调试 Javascript。其实在以前看到的有关Ajax的文章也提到过,不过那时没太注意。这才从 Firefox 扩展中找到了它。

它的安装与一般的扩展没有什么区别。安装好后可以在 Tools->Javascript Debugger中启动它。启动后是一个独立的窗口。说实在的我还不太会用。感觉应该是这样的。先在浏览器中打开你要调试的URL,然后在VenkMan中也打开这个URL。于是你会看到它的代码。接着在想要调试的代码前加断点。再回到 Firefox 中执行相应的功能,当执行到断点处就会激活 VenkMan 了。好象不在浏览器中预先打开URL就无法调试。其实这个调试器是与 Firefox 主窗口相关联的。

当进入单步状态时,你可以在命令行(右下角的窗口)输入一些以/开头的命令,还可以直接输入Javascript语句看执行结果。在Watches窗口可以加入观察的对象,看一看它都有哪些属性。我刚刚使用,而且调试Javascript也不是我主要的工作,因此许多东西还不会用。目前只会调试这些了。

这是我在 Karrigell 邮件列表看到的:

 I often google to search mentions of Karrigell and I recently found that
is is used as an example of web framework in a new book published by
O’Reilly in French : Apprendre à programmer avec Python (Learning to
program with Python)

See http://www.ulg.ac.be/cifen/inforef/swi/python.htm

The book explains how to install the software, launch the server, write
static files, then it gives examples of programs in Python, using
session management, etc. By permission of O’Reilly, the book can be
dowloaded at
http://www.ulg.ac.be/cifen/inforef/swi/download/python_notes.pdf

Champagne !
Pierre

看到O’Reilly的书提到了Karrigell感到很高兴。尽管下载了pdf文件,但因为是法语根本看不懂。希望Karrigell越来越好。