• 让远程机器执行命令的便捷方式

    假如想查看远程机器A上的某个进程是否存在.
    通常第一步是ssh到那台机器,第二步是运行ps -ef |grep process_mon.py命.
    ssh可以将两个步骤合并在一起,让过程更轻松.

    ssh wyq@135.32.22.22 'ps -ef |grep process_mon.py'
    
  • with让数据库操作代码变得清爽

    对数据操通常都需要打开与关闭连接,而且用try-finally保证连接被关闭. 这些常规的操作会让代码变得难看.

    db = web.database(dbn='oracle', db='......', user='hy', pw='1234')
    try:
        db.query("select * from t_c_ms_interface")
    finally:
        db.ctx.db.close()
    

    用上下文协议隐藏这些操作

    class IPCCCDB:
        def __init__(self):
            self.dns = '....'
    
        def __enter__(self):
            import web
            self.db = web.database(dbn='oracle', db=self.dns, user='hy', pw='1234')
            return self.db
    
        def __exit__(self, type, value, traceback):
            self.db.ctx.db.close()
    

    然后,变得如此清爽

    with IPCCCDB() as db:
        db.query("select * from t_c_ms_interface")
    
  • python排列*号

    输出以下内容

    *
    ***
    *****
    *******
    *********
    ***********
         *
        ***
       *****
      *******
     *********
    ***********
    

    借用str的format可以方便的实现,但只有python2.6以上才支持

    f = '{:<11}'
    print '\n'.join([f.format('*' * i) for i in range(1, 12, 2)])
    f = '{:^11}'
    print '\n'.join([f.format('*' * i) for i in range(1, 12, 2)])
    
  • webpy中auto_application的cookie共享问题

    在webpy中使用auto_application划分网站的url结构, 会发现是个很好用的东西。
    使用过程中却发现每个auto_application默认有自己单独的cookie。 范例

    #encoding=utf-8
    import web
    appA = web.auto_application()
    appB = web.auto_application()
    
    urls = (
        '/save',   appA,
        '/get',    appB
    )
    
    class SaveName(appA.page):
        path = '/?'
    
        def GET(self):
            web.setcookie("name", "wyq", expires=24 * 60 * 60)
            return web.cookies().get("age")
    
    
    class GetName(appB.page):
        path = '/?'
    
        def GET(self):
            return web.cookies().get("name")
    
    app = web.application(urls, globals())
    
    if __name__ == '__main__':
        web.config.debug = True
        app.run()
        #print app.request("/save").data
        #print app.request("/get").data
    

    上面代码,生成两个auto_application appA与appB。
    appA处理所有以/save开头的url请求,appB处理所有以/get开头的url请求。

    appA = web.auto_application()
    appB = web.auto_application()
    

    发送http://0.0.0.0:8080/save请求,将name信息保存在cookie中。

    web.setcookie("name", "wyq", expires=24 * 60 * 60)
    

    发送http://0.0.0.0:8080/get请求,获取name值。
    预想是返回name值,却发现结果为空。什么原因呢?
    观察/save请求时chrome中的信息。
    替代文本

    注意上面的Set-Cookie,多了个path=/save/。原来在application中保存cookies时,会设置cookies的path属性。

    cookie的path属性,用于限制cookie的访问域,只有此域下的请求才能取到此cookie信息。
    换句话说只有url以/save/开头的请求才能,取到此cookie的信息。
    上面appA属于/save/域下的,appB属于/get/域下的。它们属于不同的域,所以appB访问不到appA中的cookie。

    如何解决呢?办法就是在设置cookie时添加path="/"的属性,即可解决。
    python web.setcookie("name", "wyq", expires=24 * 60 * 60, path="/")

  • 将[{},{}]转为dict

    经常遇到一种需求,需要把从数据库取出的数据,转为dict对象([{}, {},...]-->dict)。

    rs = [{"user_id":111, "name":"abc"}, {"user_id":123, "name":"edf"}]
    print dict(map(lambda r:[r["user_id"], r], rs))
    >>{111: {'user_id': 111, 'name': 'abc'}, 123: {'user_id': 123, 'name': 'edf'}}
    

    上面看起来比较啰嗦,换一种写法

    print dict([r["user_id"], r] for r in rs)
    

    更简洁的写法

    {r['user_id'] : r for r in rs}
    
  • IBUS-WARNING Process Key Event failed Timeout was reached

    在gvim中ibus敲字时,偶尔会在n秒之后才显示到屏幕,反应死慢。控制台会看到下面的错误信息.

    (gvim:77687) IBUS-WARNING  Process Key Event failed Timeout was reached。
    

    暂时无法搞清具体原因,所以用重启ibus的笨办法解决。

    • 杀死ibus进程
    ps -ef |grep ibus-daemon
    

    找到进程,然后kill掉

    • 启动 ibus
    ibus-daemon -d -x -r
    

    -d 作为后台程序运行

    -x 执行ibus XIM服务

    -r 替换老进程