?

Log in

python学习 Django

在近几个月中,系统地看了些Python WEB开发的文档。bottle, flask, wsgi, werzburg,django等。最后发现django的文档做的很详细,功能也正是我我想要的。从昨天开始正式开始用djiango来开发些小应用。前面一段时间也正好对一些前端的UI库做了一番调查,今天仍旧对选择YUI还是JQueryUI犹豫不决,最后决定了用JQueryUi作为前端UI库。

Tags:

AS400,AIX, RSH相关

结合这两天的调查结果,整理了一下。

1)AS400用RUNRMTCMD来调用AIX中shell。AIX中应该启动rexecd服务。
2)AIX中可以启动rshd,在windows系统中可以用rsh.exe来调用AIX中shell
3)AS400中的FTP服务可以支持RCMD,可以用FTP quote rcmd来调用AS400中的CL,但是AIX中的FTP不支持RCMD,所以不能用FTP quote rcmd的方式来调用AIX中的shell, 判断FTP是否支持RCMD的方法是用FTP quote help来检查。
4)用rexec和rsh来调用AIX中的shell时,.profile是不会自动执行的,要在shell中增加 . ~/.profile行。

Tags:

Xen中的网卡驱动的问题

前面些日子把CVS服务从主机迁移到VM中,后面就发现用CVS的客户端连接CVS服务的时候,有些机器就很快,有些机器就很慢,并且如果碰到大的文件要checkout的时候,需要等待很长的时间。曾经出现过一个项目3个小时还没有checkout下来的情况。 今天用wireshark跟踪了一下,发现有很多丢包和out of sequence的现象。 后来,对CVS服务设置了一番仍旧没有解决问题。最后才发现在网卡驱动中有个属性“large send offload"的属性,这个属性竟然是enabled. 在把这个属性修改为disabled,问题解决了。由于这个VM不是我自己安装的,不知道这个enabled是否是Xen网卡的缺省选项,如果是的话,还真是个问题。

AIX ftp中的timeout

今天差点为这件屁大的小事吓出一身的冷汗。本来是准备在AIX的shell中用ftp -n来发送文件的,在主机和密码都正确的情况下,测试很顺利,但是在测试错误主机和密码的情况下,却发现ftp命令却停在了那里,只能中断SHELL的处理,当时那个汗呀,难道要自己写段程序来ftp,这个也太折腾了,后来拿着那段FTP命令在Linux中试了一下,发现只要几秒钟就返回了错误消息并自动能退出ftp,这时候才开始怀疑AIX中的FTP Open是否也会timeout,于是就耐心的等待了一下,AIX的ftp open原来也是会自动timeout的,不过这个timeout的时间也真是够长的,2分半钟。耐心,原来是耐心。

Tags:

require.paths这个全局变量直接影响到了module的加载时的查找路径,但是我发现nodejs(我的是0.4.7)在Windows平台上是有缺陷的。

缺陷的地方如下:

module.js中的源代码:

Module._initPaths = function() {
var paths = [path.resolve(process.execPath, '..', '..', 'lib', 'node')];

if (process.env['HOME']) {
paths.unshift(path.resolve(process.env['HOME'], '.node_libraries'));
paths.unshift(path.resolve(process.env['HOME'], '.node_modules'));
}

if (process.env['NODE_PATH']) {
paths = process.env['NODE_PATH'].split(':').concat(paths);
}

Module._paths = paths;
};

其中的第一句process.execPath和后面的NODE_PATH都有问题。

1)在代码platform_win32.cc中函数GetExecutablePath未真正实现。这样就造成了在node中执行process.execPath时总是返回argv[0],也就是node(或者node.exe). 从而造成path.resolve不正确。

2)NODE_PATH这个系统环境变量的路径分割方式有缺陷,都是按照×NIX平台上的“:"来分割的。在Windows下应该是”;“, 否则盘符会有问题。

由于问题1造成node.exe根本无法认出自己所在的目录,所以也就无法加路径lib\node到路径中,同时由于问题2,又无法设置NODE_PATH,这样就造成只有把lib放到HOME中的指定folder或者放到单独的project下面了。

这两处的修改方法很简单。

1)platform_win32.cc
int Platform::GetExecutablePath(char* buffer, size_t* size) {
*size=GetModuleFileName(NULL,buffer,*size);

if (*size==0) return -1;

return 0;
{

(很多年没写过C了,如果写错了,大家请指出。)

2)module.js.
if (process.env['NODE_PATH']) {
if (process.platform=='win32'){
paths = process.env['NODE_PATH'].split(';').concat(paths);
}else{
paths = process.env['NODE_PATH'].split(':').concat(paths);
}
}

Tags:

Python 学习: QM 1.1

做了个小的配置窗口。在做这个小窗口中倒是学到了类的继承的方法,以及Sizer中对象的Hidden和Show的方法。

Tags:

Python 学习, QM 1.0

利用春节的休假,完成了Qm的1.0版本。并经过了第一回合的重构。和最初的设计相比,去掉了主画面右侧的信息显示和操作区,主画面变得干净多了。



由于这个小东西个性化太强,并且功能也太简单了,所以这个就不OpenSource了。
当前版本的主要功能:
报价单的增删改查,导入,导出,JIRA/RELEASE情况汇总。

以后的版本计划:

v1.1,增加一个配置的功能。可以设定系统的一些参数。
v1.2, 和公司当前的工数填报系统接起来,可以在这个小系统中查看已经花费的工数。
v1.3, 可以填写报价单的明细栏目,并自动计算金额。

Tags:

Python 学习4 窗口的taskbar Iconize

[ENV: Python 2.7, wxPython 2.8]

在wxpython中负责实现Taskbar的Iconize的类是TaskBarIcon。 最方便的方法是继承这个类,并重载里面的CreatePopupMenu方法。

下面是我实现的一个例子:

import wx

class QmTaskbarIcon(wx.TaskBarIcon):
    """this is the main frame window"""
    
    def __init__(self):
        #setup a taskbar icon
        wx.TaskBarIcon.__init__(self)
        
        self.SetIcon(wx.Icon("icons\qm.png",wx.BITMAP_TYPE_PNG))

        #self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnClick, self)
        self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnShowMe)
                

    def OnShowMe(self, event):
        
        if wx.GetApp().GetTopWindow().IsIconized():
            #wx.GetApp().GetTopWindow().Show(True)
            wx.GetApp().GetTopWindow().Raise()
            wx.GetApp().GetTopWindow().Iconize(False)
            #wx.PostEvent(wx.GetApp(),wx.FocusEvent())
            #wx.PostEvent(wx.GetApp().GetTopWindow(),wx.ActivateEvent())
            
    def CreatePopupMenu(self):
        context_menu=wx.Menu()

        menuItem_show=wx.MenuItem(context_menu,wx.NewId(), "Show Me")
        menuItem_show.SetBitmap(wx.Bitmap('icons/show.png'))
        context_menu.AppendItem(menuItem_show)
        self.Bind(wx.EVT_MENU, self.OnShowMe,menuItem_show)

        menuItem_exit=wx.MenuItem(context_menu,wx.ID_EXIT, "Exit")
        menuItem_exit.SetBitmap(wx.Bitmap('icons/exit.png'))
        context_menu.AppendItem(menuItem_exit)
        self.Bind(wx.EVT_MENU, wx.GetApp().GetTopWindow().OnExit,menuItem_exit)

        return context_menu


注意里面的被注释掉的那个Bind语句,如果打开将报错:AttributeError: 'QmTaskbarIcon' object has no attribute 'GetId'

研究了一下,发现是由于TaskbarIcon不是继承自Window这个类,而是来自于EvtHandler,所以第三个参数不能写。

在主窗体中,写如下代码:
    def __init__(self, parent, title):

        #setup a taskbar icon
        self.tbicon = QmTaskbarIcon()
        
        self.Bind(wx.EVT_ICONIZE,self.onIconize,self)

    def onIconize(self, event):
        
        if event.Iconized():
            self.Show(False)

Tags:

Python 学习(3)

今天完成了部分画面,决定模板引擎使用Mako来代替Jinja2

主画面如下:

Tags:

今天学习了在Python中读写Excel文件。发现还是蛮有意思的。

Excel的文件格式:
BIFF:http://sc.openoffice.org/excelfileformat.pdf
Microsoft Excel Releases
:
Excel version MS Windows Release year Apple Macintosh Release year
Excel 2.x Excel 2.0 1987 Excel 2.2 1989
Excel 3.0 Excel 3.0 1990 Excel 3.0 1990
Excel 4.0 Excel 4.0 1992 Excel 4.0 1992
Excel 5.0 Excel 5.0 1993 Excel 5.0 1993
Excel 7.0 Excel 95 1995 ─
Excel 8.0 Excel 97 1997 Excel 98 1998
Excel 9.0 Excel 2000 1999 Excel 2001 2000
Excel 10.0 Excel XP 2001 Excel v.X 2001
Excel 11.0 Excel 2003 2003 Excel 2004 2004

BIFF Versions for Worksheet/Workbook Documents
The following table shows which Excel version writes which file format for worksheet and workbook documents:
Excel version BIFF version Document type
Excel 2.x BIFF2 Worksheet
Excel 3.0 BIFF3 Worksheet
Excel 4.0 BIFF4 Worksheet
Excel 5.0 BIFF5 Workbook
Excel 7.0 BIFF5 Workbook
Excel 8.0 BIFF8 Workbook
Excel 9.0 BIFF8 Workbook
Excel 10.0 BIFF8 Workbook
Excel 11.0 BIFF8 Workbook
BIFF8 contains major changes towards older BIFF versions, for instance the handling of Unicode strings.


1)使用win32com, 这个对运行的系统有要求,它用ActiveX的方式要启动一个Excel的COM服务器,所以只能在Windows系统下使用,并且机器上也必须安装Excel的程序。“Python For Excel" 就是一个基于win32com上的Package。
2)pyExceleartor, 网络上的文章已经很多了,强项应该是在写Excel文件,看PyPI中Development Status是Alpha,所以这个今天没有试验。
3)openpyxl,A Python library to read/write Excel 2007 xlsx/xlsm files
4)xlrd,xlwt,xlutils, 今天学习的就是这个,现在总结一下。


xlrd和xlwt分别是exel read和excel write的意思,是同一个人所写,但是里面很多命名的方法是不一样的,而且不能直接互操作。比如里面的Style这个类,在xlrd中叫XF,在xlwt中叫XFStyle. 甚至连属性名也不一样。比如单元格的背景色,在elrd中叫pattern_colour_index, exwt中叫pattern_fore_colour。现在xlrd的文件已经比较全,xlwt的文档还没有完成,所以只能读那些example程序来学习。

xlutils是xlrd和xlwt的桥梁,里面的filter class可以实现从xlrt到xlwt的Object的转化。现在这个三个项目都hosting在http://www.simplistix.co.uk/

xlrd对BIFF<50有些限制,这个要参阅文档。

下面贴出今天的代码,供参考。

import xlrd
import xlwt

from xlrd import open_workbook,cellnameabs
from xlutils.copy import copy
from xlwt import Style


def copyXF(rdbook,rdxf):
    """
    clone a XFstyle from xlrd XF class,the code is copied from xlutils.copy module
    """
    
    wtxf = xlwt.Style.XFStyle()
    #
    # number format
    #
    wtxf.num_format_str = rdbook.format_map[rdxf.format_key].format_str
    #
    # font
    #
    wtf = wtxf.font
    rdf = rdbook.font_list[rdxf.font_index]
    wtf.height = rdf.height
    wtf.italic = rdf.italic
    wtf.struck_out = rdf.struck_out
    wtf.outline = rdf.outline
    wtf.shadow = rdf.outline
    wtf.colour_index = rdf.colour_index
    wtf.bold = rdf.bold #### This attribute is redundant, should be driven by weight
    wtf._weight = rdf.weight #### Why "private"?
    wtf.escapement = rdf.escapement
    wtf.underline = rdf.underline_type #### 
    # wtf.???? = rdf.underline #### redundant attribute, set on the fly when writing
    wtf.family = rdf.family
    wtf.charset = rdf.character_set
    wtf.name = rdf.name
    # 
    # protection
    #
    wtp = wtxf.protection
    rdp = rdxf.protection
    wtp.cell_locked = rdp.cell_locked
    wtp.formula_hidden = rdp.formula_hidden
    #
    # border(s) (rename ????)
    #
    wtb = wtxf.borders
    rdb = rdxf.border
    wtb.left   = rdb.left_line_style
    wtb.right  = rdb.right_line_style
    wtb.top    = rdb.top_line_style
    wtb.bottom = rdb.bottom_line_style 
    wtb.diag   = rdb.diag_line_style
    wtb.left_colour   = rdb.left_colour_index 
    wtb.right_colour  = rdb.right_colour_index 
    wtb.top_colour    = rdb.top_colour_index
    wtb.bottom_colour = rdb.bottom_colour_index 
    wtb.diag_colour   = rdb.diag_colour_index 
    wtb.need_diag1 = rdb.diag_down
    wtb.need_diag2 = rdb.diag_up
    #
    # background / pattern (rename???)
    #
    wtpat = wtxf.pattern
    rdbg = rdxf.background
    wtpat.pattern = rdbg.fill_pattern
    wtpat.pattern_fore_colour = rdbg.pattern_colour_index
    wtpat.pattern_back_colour = rdbg.background_colour_index
    #
    # alignment
    #
    wta = wtxf.alignment
    rda = rdxf.alignment
    wta.horz = rda.hor_align
    wta.vert = rda.vert_align
    wta.dire = rda.text_direction
    # wta.orie # orientation doesn't occur in BIFF8! Superceded by rotation ("rota").
    wta.rota = rda.rotation
    wta.wrap = rda.text_wrapped
    wta.shri = rda.shrink_to_fit
    wta.inde = rda.indent_level
    # wta.merg = ????
    #
    return wtxf

if __name__== "__main__" :
    
    #opne the excel file
    rb=open_workbook("test.xls",on_demand=True,formatting_info=True)
    
    for attr in ("biff_version","codepage","countries","encoding",
                 #"colour_map","font_list","format_list","format_map",
                 #"user_name",
                 "nsheets"):
        print "%s=%s" %(attr, rb.__getattribute__(attr))

    #show the loaded status for sheets
    for sheet_name in rb.sheet_names():
        print "%s loaded = %s" %(sheet_name, rb.sheet_loaded(sheet_name))
    
    #get the sheet1
    sheet=rb.sheet_by_index(0)
    
    print "%s has %d rows, %d cols" %(sheet.name, sheet.nrows, sheet.ncols)

    print "Shoe the file content"
    
    for rowx in range(0,sheet.nrows):
        for colx in range(0,sheet.ncols):
            
            #get the cell value
            cellvalue=sheet.cell_value(rowx,colx)
            #get the cell type
            celltype=sheet.cell_type(rowx,colx)

            #init the showable value
            showvalue=""
            
            if celltype == xlrd.XL_CELL_DATE:
                try:
                    showval = xlrd.xldate_as_tuple(cellvalue, rb.datemode)
                except xlrd.XLDateError:
                    e1, e2 = sys.exc_info()[:2]
                    showval = "%s:%s" % (e1.__name__, e2)
            elif celltype == xlrd.XL_CELL_ERROR:
                showval = xlrd.error_text_from_code.get(
                cellvalue, 'Unknown error code 0x%02x' % cellvalue)
            else:
                showval = cellvalue

            #get style

            xf=rb.xf_list[sheet.cell_xf_index(rowx,colx)]
            
            #print rb.colour_map[xf.background.background_colour_index]
            #display the cell forecolor
            color=rb.colour_map[xf.background.pattern_colour_index]

            #show the content
            print ("[%s]=%s,[color]=%s" % (cellnameabs(rowx,colx),showval,color))
            
    #show the loaded status for sheets after load sheet1
    for sheet_name in rb.sheet_names():
        print "%s loaded = %s" %(sheet_name, rb.sheet_loaded(sheet_name))
    
    #################
    #change the excel and write it out
    #################
 
    #get the xlwt object from rb object
    wb = copy(rb)
 
    #get the original excel cell style
    rbxf=rb.xf_list[sheet.cell_xf_index(0,0)]

    #copy the xlrd style to xlwt style
    wtrf=copyXF(rb,rbxf)

    #change an attribute of this style, the color index can refer to VBA document
    wtrf.pattern.pattern_fore_colour=15

    #set the new value and new style
    #wb.get_sheet(0).write(0,0,'changed!')
    wb.get_sheet(0).write(0,0,'changed!',wtrf)
    
    #output to file
    wb.save('test2.xls')

Tags: