052013
 

装了wxPython用于GUI程序的开发,照例打开Eclipse+Pydev的开发环境,发现输进去示例程序也是祖国山河一片红。

什么wx.App,什么wx.Frame之类的,全被标注了红色提示下滑波浪线。报错“undefined variable from import: App”之类的。但是直接运行,完全木有问题,无语凝咽了我就。

请出StackOverflow大神,想必我遇到的任何问题大神们都遇到过了。果然,找到了一篇问答。

Undefined variable from import when using wxPython in pydev

其中的前面几个试了一下,没有立竿见影的效果。而倒数第二条则很有趣:

Try
wx = wx
Don’t ask why. This approach (that I found when trying to break the problem in smaller parts) just seems to remove the wx undefined variables problem.

看上去很没意义,结果一试就灵,红色提示立马就没了。回头来删掉这句,错误提示没再出现。问题解决。

262012
 

原创文章,转载请注明来自Sean的技术博客

经过之前的需求分析,整个软件的架构基本可以确定下来。考虑到用户对于存储方式的需求可能再次发生变化,在实现过程中,把整个程序分成若干模块,主程序仅提供互操作的接口。一旦需求变动,只需改动部分模块或者增删部分模块,而不必影响其他部分的代码。使得各个模块间的耦合度降低。

image

整个程序的流程图如上图,需要被加载的模块信息存储在一个配置文件中,每次执行数据抓取和存储之前,先通过配置文件获得要加载的模块。这些模块包括:

  1. mod_utils:通过基本库实现日志功能,网址生成,邮件发送,单位转换和配置文件读取。
  2. mod_rawdata:定义了数据获取,处理和存储的接口。由于本次需求对抓取的来源非常的单一,所以在内部实现了获取和处理两个接口,解析得到的JSON数据,过滤出有价值的信息,并把它们处理成便于存储的格式放在内存中。同时留出存储接口供下面的模块使用。
  3. mod_text:将内存中的数据以txt文件的形式存储。
  4. mod_excel:将内存中的数据以xls文件的形式存储。
  5. mod_sqlite:将内存中的数据存储到SQLite数据库中。

配置文件包括:

  1. zone.xml:储存区域的信息,不同的区域对应的URL是不同的,mod_utils中提供一个函数,将每个Zone映射到一个URL上。
  2. config.ini:里面包括三个字段,module字段指出哪些存储方式将被使用;interval字段指定了在非单次执行模式中,两次抓取之间的时间间隔(秒);email字段指定一个或多个电子邮件地址,将在程序的log模块中记录到异常时候发送邮件通知。

全局的模块就是Log模块,它在程序启动的第一时间加载,并全程记录信息抓取、数据存储的过程。如果过程顺利,则每次仅简单的指出Success信息;如果出错,将按照调用栈反向输出错误信息,便于分析问题的出处。

目录结构如下:

捕获

252012
 

原创文章,转载请注明来自Sean的技术博客

去年的十一月份,结束了在某杀毒软件公司中国研发中心为期半年的实习后回到学校。论文开题已经结束,手头事情不太多。刚好有位国内名校的教授需要做一个从Web站点抓取每小时滚动的数据,并保存成Excel表格形式的文件这样一个程序。凑巧找到了我,于是就有了这么一个项目。

整个项目从需求分析,到软件架构设计,再到编码、测试以及最后的部署,都是自己一个人独立完成。也算是一个小小的锻炼,让我知道了为何对需求的理解是如此重要,因为这是客户唯一需要的东西……因为项目还在运行之中,所有有些设计项目具体内容的部分就只能隐去了。这一篇博文和后续的几篇用来讲一下项目中碰到的一些问题和解决思路。

需求概述

从某Web站点抓取数据,每小时一次。数据分两类,一类是“区域”的小时平均值(3个);第二类是“区域”中“点”的每小时取值(3个)。区域共有约15个,每个区域包含2个到10个不等的点,每个点提供3个数值。数据最终格式应为Excel表格,表格包含上述数据在一年内的所有值。

需求分析

  1. 从数据发布网站每小时抓取xxx数据,并以合适的形式保存。发布网站使用的发布方式为网页嵌入Silverlight控件展示,控件无法以HTML的分析方式得到数据,必须进行抓包,如果数据包被加密,则还需要反编译控件以破解其加密算法,从而解密数据。幸而该网站使用的是明文传输,HTTP GET形式向数据服务器发起请求,返回UTF-8编码的明文字符串。因此,抓取的重点在于研究其GET命令的形式和返回字符串的结构。
  2. 使用WireShark抓包分析,忽略TCP连接的三次握手,由第一次HTTP GET请求开始追踪每一个TCP segment of a reassembled PDU。得到了:
    • 区域均值的GET请求字符串,及相应的返回值;
    • 每个点数据的GET请求字符串及相应的返回值;
    • 返回值的格式是UTF-8文本,组织方式为JSON,除了所需的三个值之外还有其他附加数据。
  3. 存储方式:根据上面的需求,使用数据库存储无疑是性能和伸缩性最佳的,然而与客户要求的Excel文件有出入。再考虑使用Plain Text存储,通过文件系统中的树形目录结构区分区域、点、日期、时间等,因为源数据格式就是普通文本,所以这种方式的优点是可以最大限度的保留原始信息,但是显然不利于数据的检索和使用等,只能是作为备份手段使用。第三种方法是直接按需求的格式保存为Excel文件,其优点不必多言,缺点却也非常明显,性能实在是低下。因此,本系统考虑用数据库存储信息,再通过额外的附加程序将数据库生成目标xls格式,同时通过txt进行数据的备份,以防原始信息的丢失。

经过上面的分析,就可以开始设计整个程序的架构了。在实际开发过程中,并非自顶向下的进行设计的,而是先建立了多个快速的程序原型,分步实现数据的①下载②分析③有效信息提取④存储为文本。基于这些小的程序片段最终合并为完整的程序,然后重构和优化和测试。

整个程序使用Python开发,用到了xlrd, xlwt和xlutils三个第三方库。

262011
 

日语元音(Japanese Vowels)问题:

Task Type

classification, speaker identification

Sources

Original Owner and Donor

Mineichi Kudo, Jun Toyama, Masaru Shimbo
Information Processing Laboratory
Division of Systems and Information Engineering
Graduate School of Engineering
Hokkaido University, Sapporo 060-8628, JAPAN
{mine,jun,shimbo}@main.eng.hokudai.ac.jp

Date Donated: June 13, 2000

Problem Description

Distinguish nine male speakers by their utterances of two Japanese vowels /ae/. Continue reading »

十二 272010
 

wxPython 有两种方法对窗口内的 widgets 进行布局:

  • 绝对定位(absolute positioning
  • sizers

绝对定位(Absolute Positioning

       首先必须了解一下因使用绝对定位而造成的问题:

  • 当窗口大小心改变的时候,窗口内的 widgets 的大小和位置不会改变。
  • 在不同的平台上有不同的布局表现。
  • 改变字体可能将程序的布局弄得一团糟。
  • 如果想改变布局,必须彻底地重设 widgets 的布局。

       下面的例子是一个简单编辑器的框架,使用了绝对定位布局,可以发现,当我们改变窗口大小, wx.TextCtrl 的大小并没有随之改变。



Continue reading »

132010
 

1.        在Python中使用中文

在Python中有两种默认的字符串:str和unicode。在Python中一定要注意区分"Unicode字符串"和"unicode对象"的区别。后面所有的"unicode字符串"指的都是python里的"unicode对象"。

事实上在Python中并没有"Unicode字符串"这样的东西,只有"unicode"对象。一个传统意义上的unicode字符串完全可以用str对象表示。只是这时候它仅仅是一个字节流,除非解码为unicode对象,没有任何实际的意义。

我们用"哈哈"在多个平台上测试,其中"哈"对应的不同编码是:

1.              UNICODE (UTF8-16),      C854;

2.              UTF-8,                    E59388;

3.              GBK,               B9FE。

1.1     Windows控制台

下面是在windows控制台的运行结果:

可以看出在控制台,中文字符的编码是GBK而不是UTF-16。将字符串s(GBK编码)使用decode进行解码后,可以得到同等的unicode对象。

注意:可以在控制台打印ss并不代表它可以直接被序列化,比如:

向文件直接输出ss会抛出同样的异常。在处理unicode中文字符串的时候,必须首先对它调用encode函数,转换成其它编码输出。这一点对各个环境都一样。

Continue reading »

042010
 

PyQuery是一个类似于jQuery的Python库,也可以说是jQuery在Python上的实现。pyQuery是使用lxml来实现快速的xml和html操作的。具体的PyQuery文档见:http://pyquery.org/

用这个来做蜘蛛爬数据的时候分析html并从中提取数据还是很爽的。

废话不多说,直接看一点简单的例子吧:

>>> from pyquery import PyQuery as pq

>>> d = pq("<html></html>") #可以直接拼HTML

>>> d = pq(url='http://www.powereasy.net/') #也可以打开一个url

>>> d('title') #取title元素

[<title>]

>>> print d('title').text()

动易网络 – 领先的内容管理系统(CMS)、企业级电子商务平台(B2C)和站群管理系统(SiteGroup)提供商

>>> print d("#logo").html() #根据ID获取元素

<a href="http://www.powereasy.net" title="&#x52A8;&#x6613;&#x7F51;&#x7EDC;">官方主站</a>

>>> d('.s') #根据类名获取元素

[<li.s>, <li.s>, <li.s>, <li.s>, <li.s>, <li.s>, <li.s>, <li.s>]

>>> a = d('#topNavIn li:eq(5)').find('a') #复杂点的选择器也是可以的,看来支持的不错

>>> a.attr('href') #属性操作

'http://sms.powereasy.net/'

>>> a.attr('href', 'http://qleelulu.cnblogs.com').attr('href') #修改属性值

'http://qleelulu.cnblogs.com'

>>> d('#LoginFrom').hasClass('Login_ajax') #css类操作

True

>>> d('#LoginFrom').addClass('lulu').attr('class') #css类操作

'lulu Login_ajax'

>>>

Continue reading »

032010
 

由于设计者和开源社区的共同努力,在python中有大量优秀的库可以被直接调用以高效地完成不同需求的工作。这里列举一些常见常用的库:
  Tkinter———— Python默认的图形界面接口。
  Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组。Tcl/Tk是由John Ousterhout发展的书写和图形设备。Tcl(工具命令语言)是个宏语言,用于简化shell下复杂程序的开发,Tk工具包是和Tcl一起开发的,目的是为了简化用户接口的设计过程。Tk工具包由许多不同的小部件,如一个按钮、一个滚动条等。通过Tk提供的这些小部件,我们就可快速地进行GUI开发。Perl、Scheme等语言也利用Tk库进行GUI开发。Tkinter是跨平台,在各种平台下都能使用。
  Python Imaging Library(PIL)————python提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换、打印和显示。还能进行一些图形效果的处理,如图形的放大、缩小和旋转等。是Python用户进行图象处理的强有力工具。
  Pmw(Python megawidgets)Python超级GUI组件集————一个在python中利用Tkinter模块构建的高级GUI组件,每个Pmw都合并了一个或多个Tkinter组件,以实现更有用和更复杂的功能。
  PyXML———— 用Python解析和处理XML文档的工具包,包中的4DOM是完全相容于W3C DOM规范的。它包含以下内容:
  xmlproc: 一个符合规范的XML解析器。
  Expat: 一个快速的,非验证的XML解析器。 还有其他
  和他同级别的还有 PyHtml PySGML
  PyGame———— 用于多媒体开发和游戏软件开发的模块。
  PyOpenGL———— 模块封装了“OpenGL应用程序编程接口”,通过该模块python程序员可在程序中集成2D和3D的图形。
  NumPy、NumArray和SAGE———— NumArray是Python的一个扩展库,主要用于处理任意维数的固定类型数组,简单说就是一个矩阵库。它的低层代码使用C来编写,所以速度的优势很明显。NumPy是Numarray的后继者,用来代替NumArray。SAGE是基于NumPy和其他几个工具所整合成的数学软件包,目标是取代 Magma, Maple, Mathematica和Matlab 这类工具。
  MySQLdb模块———— 用于连接MySQL数据库。还有用于zope的ZMySQLDA模块,通过它就可在zope中连接mysql数据库。
  PyGTK ———— 用于python GUI程序开发的GTK+库。GTK就是用来实现GIMP和Gnome的那个库。有了它,你完全可以自信的尝试自己制造Photoshop
  PyQt ———— 用于python的Qt开发库。QT就是实现了KDE环境的那个库,由一系列的模块组成,有qt, qtcanvas, qtgl, qtnetwork, qtsql, qttable, qtui and qtxml,包含有300个类和超过5750个的函数和方法。PyQt还支持一个叫qtext的模块,它包含一个QScintilla库。该库是 Scintillar编辑器类的Qt接口。

PyMedia ———— 用于多媒体操作的python模块。它提供了丰富而简单的接口用于多媒体处理(wav, mp3, ogg, avi, divx, dvd, cdda etc)。可在Windows和Linux平台下使用。
  Psyco ———— 一个Python代码加速度器,可使Python代码的执行速度提高到与编译语言一样的水平。
  Python-ldap ———— 提供一组面向对象的API,可方便地在python中访问ldap目录服务,它基于OpenLDAP2.x。
  smtplib模块 ———— 发送电子邮件。
  ftplib模块 ———— 定义了FTP类和一些方法,用以进行客户端的ftp编程。我们可用python编写一个自己的ftp客户端程序,用于下载文件或镜像站点。如果想了解ftp协议的详细内容,请参考RFC959。
  xmpppy模块 ———— Jabber服务器采用开发的XMPP协议,Google Talk也是采用XMPP协议的IM系统。在Python中有一个xmpppy模块支持该协议。也就是说,我们可以通过该模块与Jabber服务器通信,是不是很Cool。
  下面这些就不详细介绍,只列出名字和功能
  adodb ———— ADO数据库连接组件
  bsddb3 ———— BerkeleyDB的连接组件
  chardet ———— 编码检测
  scons ———— 项目构建工具,写好了模板用起来还是很方便的
  sendpkt ———— Python发包
  setuptools ———— 一套python包管理机制
  Cheetah ———— 构建和扩充任何种类的基于文本的内容
  pycurl ———— URL处理工具
  pydot ———— 画图的,graphiz
  pyevent ———— Python的事件支持
  pylint ———— 培养良好的编码习惯
  Pylons ———— 又一个web framework
  pypcap ———— 抓包的
  pysqlite2 ———— SQLite的连接组件
  python-dnet ———— 控制网络安全的其他设备
  pythonwin ———— Python的Windows扩展
  pywmi ———— 省了好多折腾功夫
  reportlab ———— Python操作PDF的Libary。
  scapy ———— 网络包构建分析框架,可编程的wireshark,有兴趣的google “Silver Needle in the Skype”
  simplejson ———— JSON的支持
  sqlalchemy ———— SQL数据库连接池
  SQLObject ———— 数据库连接池
  cherrypy ———— 一个WEB framework

ctypes ———— 用来调用动态链接库
  Cx-oracle ———— 连接oracle的工具
  DBUtils ———— 数据库连接池
  django ———— 一个WEB framework
  DPKT ———— raw-scoket网络编程
  docutils ———— 用来写文档的
  dpkt ———— 数据包的解包和组包
  feedparser ———— rss解析
  Kodos ———— 正则表达式调试工具
  Mechanize ———— 爬虫连接网站常用
  pefile ———— windows pe文件解析器
  py2exe ———— 用来生成windows可执行文件
  twisted ———— 巨无霸的网络编程框架
  winpdb ———— 自己的程序或者用别的库不太明白的时候就靠它了
  wxPython ———— GUI编程框架,熟悉MFC的人会非常喜欢,简直是同一架构
  PIL———— Python 的图像处理库,可以打开数十种图像格式,还提供许多图像处理函数,如图像增强、滤波算法等。
  Pyro———— Python实现与JAVA RMI类似的技术
  PLY———— 基于Python的LEX、YACC的语言工具
  Corepy———— 使用Python开发编写x86汇编程序
  LightCloud———— Python实现的分布式的键-值数据库
  Parallel Python(PP)———— 轻松开发SMP、集群并行计算的库
  开源社区的工作已经完成到这样的程度,基本上各种常见的编程需求都已经有非常成熟稳定高速的模块来实现,你所需要做的,只是去把它找出来然后阅读文档。

252010
 

介绍

  • 这篇文档所给出的编码约定适用于在主要的Python发布版本中组成标准库的Python 代码.请查阅相关的关于在Python的C实现中C代码风格指南的描述. 这篇文档改编自Guido最初的《Python风格指南》一文. 并从《Barry's style guide》中添加了部分内容. 在有冲突的地方,Guide的风格规则应该是符合本PEP的意图 (译注:就是当有冲突时,应以Guido风格为准) 这篇PEP也许仍然尚未完成(实际上,它可能永远不会结束).

一致性的建议

愚蠢得使用一致性是无知的妖怪(A Foolish Consistency is the Hobgoblin of Little Minds)

呆板的坚持一致性是傻的没边了!
-- Zoomq
  • 在这篇风格指导中的一致性是重要的. 在一个项目内的一致性更重要. 在一个模块或函数内的一致性最重要. 但最重要的是:知道何时会不一致 — 有时只是没有实施风格指导.当出现疑惑时,
    • 运用你的最佳判断.看看别的例子,然后决定怎样看起来更好.并且要不耻下问!
  • 打破一条既定规则的两个好理由:
    1. 当应用这个规则是将导致代码可读性下降,即便对某人来说,他已经习惯于按这条规则来阅读代码了.
    2. 为了和周围的代码保持一致而打破规则(也许是历史原因)
      • – 虽然这也是个清除其它混乱的好机会(真正的XP风格).

Continue reading »