Xupeng's blog

Jun 14, 2006 - 1 minute read - Comments

莫非at不能定时执行图形程序?

想趁晚上没有人使用网路时用amule下载一些东西,却发现使用at并不能定时执行图形化的程序,而定时执行console程序是没有问题的,man了一下又google了半天没有任何收获,只得用python临时写一个简单的先凑合用着。

#!/usr/bin/python
#coding=UTF-8

import wx
import os

class MyApp(wx.App):
    def OnInit(self):
        self.frame = wx.Frame(None,-1,'RunAt',size=(290,77))

        self.lblCmd = wx.StaticText(self.frame,-1,'命令:')
        self.txtCmd = wx.TextCtrl(self.frame,-1,size=(150,-1))
        self.btnSelect = wx.Button(self.frame,-1,'选择')
        self.btnSelect.Bind(wx.EVT_BUTTON,self.Select)

        self.lblTime = wx.StaticText(self.frame,-1,'时间:')
        self.txtTime = wx.TextCtrl(self.frame,-1,size=(150,-1))
        self.btnSet = wx.Button(self.frame,-1,'设定')
        self.btnSet.Bind(wx.EVT_BUTTON,self.Set)

        sizer1 = wx.BoxSizer(wx.HORIZONTAL)
        sizer1.Add(self.lblCmd,0,wx.LEFT|wx.TOP|wx.ALIGN_CENTER,5)
        sizer1.Add(self.txtCmd,0,wx.LEFT|wx.TOP|wx.ALIGN_CENTER,5)
        sizer1.Add(self.btnSelect,0,wx.LEFT|wx.TOP|wx.ALIGN_CENTER,5)

        sizer2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer2.Add(self.lblTime,0,wx.LEFT|wx.TOP|wx.ALIGN_CENTER,5)
        sizer2.Add(self.txtTime,0,wx.LEFT|wx.TOP|wx.ALIGN_CENTER,5)
        sizer2.Add(self.btnSet,0,wx.LEFT|wx.TOP|wx.ALIGN_CENTER,5)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(sizer1,0)
        sizer.Add(sizer2,0)

        self.frame.SetSizer(sizer)

        self.runTime = None

        self.timer = wx.Timer()
        self.timer.Bind(wx.EVT_TIMER,self.OnTimer)
        self.timer.Start()

        self.frame.Bind(wx.EVT_ICONIZE,self.OnMin)

        self.frame.Center()
        self.frame.Show(True)
        self.SetTopWindow(self.frame)

        return True

    def Select(self,event):
        dlg = wx.FileDialog(self.frame)
        if dlg.ShowModal() == wx.ID_OK:
            self.txtCmd.SetValue(dlg.GetPath())

    def OnTimer(self,event):
        if self.runTime == None:
            pass
        t = wx.DateTime.Now()
        str = '%02d:%02d' %(t.GetHour(),t.GetMinute())
        if str == self.runTime and t.GetSecond() == 0:
            os.system('%s&' %self.txtCmd.GetValue())

    def Set(self,event):
        self.runTime = self.txtTime.GetValue()

    def OnMin(self,event):
        self.frame.Show(False)

def main():
    app = MyApp(0)
    app.MainLoop()

if __name__ == '__main__':
    main()

Jun 11, 2006 - 1 minute read - Comments

等宽字体的概念

(由linuxsir上fundawang的帖子整理)

所谓的等宽字体,应该是指同一种script下,所有字符的宽度都相等。至于中文这个script中,汉字的宽度是否是en这个script里英文宽度的 两倍,取决于制作字体时的考虑,以及pango的字体替换算法。因为在很多情况下,pango会试图使用同一种字体来显示所有的字符,所以你经常会看到 gtk2的应用把英文字符也用中文字体来显示。

如果单就解决这个问题而言,你可以告诉这个软件的作者,在进行算法设计的时候,就把中日韩字符以及标点符号算成两个字符宽就行了。说中文的开发者可以自行设定正确的字体。他如果想要测试的话,可以安装文泉驿的点阵字体,这个字体应该是标准的双倍宽度 :)

注:script是字体这个范畴内的一个术语,大概跟字符集的意思差不多,也可以理解为Unicode范围。总之不是脚本的意思了 :D

Jun 8, 2006 - 3 minute read - Comments

limodou大虾评论基于python的web框架

(摘自python-chinese邮件列表)

web framework大多数从功能上都大同小异。从功能上分:zope/plone算大型的,而django,turbogears算是轻量级的。从学习曲线上分,zope/plone要长一些,而django,turbogears相对要短一些。对于django,turbogears来说,开发的理念有所不同,但功能是类似的。django所有东西都是自已开发的,象模板系统,url映射机制,ORM等。而turbogears则是许多相对成熟项目的集合,这一点与pylons也很象,如模板系统主要是kid,通过模板适配可以使用其它的模板(强调一下,django是松耦合的,许多组件也可以替换),webserver组件使用cherrypy,ORM使用SQLObject(还可以使用QLAlchemy)等等。关于这两种集成的方式,不同的人有不同的看法。有人认为turbogears是好的,因为没有重新造轮子。但有些人象我认为集中式更易管理和控制。所以关键看你认同哪一种设计理念。


对于ajax也有许多不同的声音。ajax本身可以与后台无关,它主要是在前端通过javascript,DOM来操纵前端数据,与后台交互。从这一点上,任何web framework都可以算是支持ajax。如果说不支持,那是从后台能否自动生成相应的html,javascript代码这一层来说的。turbogears嵌入了mochekit的js库的支持,可以通过python程序生成相应的js代码。django则是有人做过这样的工作,但要么不是成熟的东西,要么还没有成型。为什么会这样也与django的设计理念有关系。象turbogears,它的支持是针对不同的js库生成不同的包装,这样如果js库非常多,自然会有许多的包装,目前已经是这样的。而django在讨论是则不希望是这样,希望有一个中间层或无关层,但的确这一点很难。因此后来可能限定在了dojo,不过还没有相关的代码可以看到。只不过admin功能使用了dojo的一些东西。

还有pylons也很有特色。但对于我上人来说,我认为它太复杂了,不容易理解,所以也没有人研究过。目前国内对于django,turbogears, pylons都有人研究,从人数上看是比例依次递减。对于zope/plone则有专门的czug.org,有许多人在学习和研究。

总之,不同的框架从基本功能上是大同小异,在功能是各有特色的,设计理念上也是各有差异。选择一个框架不仅看它的功能是否满足,可能还有许多的因素,如人气,成熟度,是否有现实的应用,性能,设计理念等等。应用从方面进行考查,而且用着顺心可能更重要。象karrigell作为初学入门,或更轻量级的选择也是不错

Apr 10, 2006 - 1 minute read - Comments

Vmware 5.5的vmware-config.pl时找不到内核头文件的问题

我的dapper 6.06,是用官方的内核时vmware配置不存在任何问题,但是我自己编译的2.6.16内核,其他是用均正常,只有vmware在配置时出了问题,说是找不到内核头文件,错误信息如下:

What is the location of the directory of C header files that match your running
kernel? [/usr/src/linux/include]/usr/src/linux/include/

The kernel defined by this directory of header files does not have the same
address space size as your running kernel.

What is the location of the directory of C header files that match your running
kernel? [/usr/src/linux/include]


google了一下,发现是vmware自身的问题,在这里下一个vmware的补丁就好了。

这个问题是解决了,但我很不明白是用ubuntu官方的内核就没有问题呢?

Apr 10, 2006 - 1 minute read - Comments

终于解决了挂载windows共享中文乱码的问题

我使用dapper 6.06,在nautilus中直接访问是没有问题的,所有的中文显示都很正常,
但是有一个问题是,mplayer似乎并不支持smb协议,这样就没有办法直接看局域网中共
享的电影了,必须mount了以后才可以。

下面是我的解决过程:

我的locale:

代码:
aiyi@osr:~$ locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN.UTF-8
LC_CTYPE=zh_CN.UTF-8
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

代码:
sudo mount -t smbfs -o username=guest //192.168.0.38/movie /mnt/smb
这样挂载后中文文件或者目录名会是乱码。

代码:
sudo mount -t smbfs -o username=guest,codepage=utf8 //192.168.0.38/movie mnt/smb/
这样仍然是乱码,但显示的乱码看起来已经不一样了。

代码:
sudo mount -t smbfs -o username=guest,codepage=cp936,iocharset=utf8 //192.168.0.38/movie /mnt/smb/
哈哈,这回显示完全正常了。
mount windows共享老乱码的朋友不妨也试一试。