/dev/null 2>&1 这条命令可以把test用户的密码设置为test。 ">

Xupeng's blog

圆外之大,心向往之

小巧好用的浏览器:Epiphany

哎,真是……真是,怎么不早点用一下这个浏览器呢?简洁、快速、智能,实在是太合我的口味了:)

起因

使用gentoo,自己编译的firefox字体真的很漂亮,使用pango渲染的字体效果没得说,可惜真的太慢了(或许不是pango的错,而只是我的firefox有问题),尤其是在gmail中查看邮件列表时慢的一塌糊涂,动不动CPU利用率就到了100%,在linuxsir上问了半天也没有结果,只能继续忍受firefox带给我的痛苦。

尝试

突然想起来gnome带有一个很简陋的浏览器:Epiphany,不妨拿来试试,一试不当紧,查看gmail速度怎么就那么快啊,我的 firefox简直不能和它相提并论,浏览其他的页面就更不用说了:)发现字体不像firefox那么漂亮,查看一下设置,原来默认的设置下最小字体是7 号,改为9号就好了,是我最喜欢的字号,这下显示效果真的就完美了,哈哈

Epiphany的智能书签很不错,再也不用愁乱哄哄的书签了。

进阶

大家都知道firefox有很多可以选用的插件,给使用带来了非常大的便利,其实这个貌似简陋的Epiphany也是支持插件功能的,安装extensions:

#emerge epiphany-extensions

稍等片刻安装完毕,打开Epiphany,在工具菜单下就有了“扩展”项,体会Epiphany带来的快乐吧,呵呵

莫非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()

等宽字体的概念

(由linuxsir上fundawang的帖子整理)

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

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

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

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作为初学入门,或更轻量级的选择也是不错