| Siyao's profile火星猫PhotosBlogLists | Help |
|
|
August 15 用Python给Gimp写插件原由:好不容易从emule上拖了一本“LaTeX Companion”下来,结果发现排版实在是感觉不爽。下载下来的电子档是扫描版的,但是扫描者似乎为了节省页面,将对开的两页书扫描到一个页面上,所以pdf文档的一个页面就有左右两面书,看起来很不方便,于是想办法把这些页面裁开。不知道有什么pdf工具能完成这样的任务,所以我采用的是比较麻烦的办法。 Linux下暂时没有找到提取pdf文件的工具,所以我先在虚拟机下运行Acrobat Professional,将每一个页面保存为一个jpg文件。这样,下面的任务就是将每一个文件一左一右对半裁成两个文件,一共有280多个这样的页面,几乎是不可能手工完成的,就算可以,也不愿意。原来处理数码照片的时候比较满意一个windows软件“光影魔术手”中的批处理功能,可是遗憾的是这个软件不能按照我需要的方式批量裁减这些文件,所以要另想办法。 回到Linux下,研究传说中Photoshop的替代者Gimp,具有比较合适的裁减功能,但遗憾的是不具有批处理的功能。在菜单里翻来翻去,发现一个叫python-fu的东东,貌似Gimp提供给python的接口。查了相关资料,这是Gimp提供给Python语言写插件的一个接口,功能很全面,而且非常简洁,写插件非常方便。在http://www.gimp.org/docs/python/index.html 有用Python写GImp插件的文档。用下面这些代码就完成了我的需要: #!/usr/bin/env python from gimpfu import * import os def python_batch_clip( xorg = 0, yorg = 0, width = 400, height = 300, directory = "/home", savedirectory = "/home", filename_postfix = ""): for entry in os.listdir(directory): if directory[len(directory)-1] == "/": fullpath = directory + entry else: fullpath = directory + "/" + entry if fullpath[-4:len(fullpath)] == ".jpg": # we assume this is a jpg file print "Processing file ", fullpath image = pdb.file_jpeg_load(fullpath, fullpath) pdb.gimp_image_crop(image, width, height, xorg, yorg) if savedirectory[len(savedirectory)-1] == "/": savepath = savedirectory + entry[:-4] else: savepath = savedirectory + "/" + entry[:-4] if filename_postfix != "": savepath = savepath + "_" + filename_postfix savepath = savepath + ".jpg" print "Saving file ", savepath pdb.file_jpeg_save( image, pdb.gimp_image_get_active_drawable(image), savepath, savepath, 1, 0, 1, 0, "", 0, 0, 0, 0) register( "python_fu_batch_clip", "Crop the jpg files in a directory", "Crop the jpg files in a directory", "Zheng Siyao", "Zheng Siyao", "2006", "<Toolbox>/Python-Fu/zsy/batch_clip", "RGB*, GRAY*", [ (PF_INT, "x_origin", "X origin", 0), (PF_INT, "y_origin", "Y origin", 0), (PF_INT, "width", "Width", 400), (PF_INT, "height", "Height", 300), (PF_FILE, "dir_path", "Directory", "/home"), (PF_FILE, "save_path", "Save to", "/home"), (PF_STRING, "postfix", "Filename Postfix", "") ], [], python_batch_clip) main() python_batch_clip()这个函数遍历目录下所有.jpg结尾的文件,读取每一个文件到image对象中,对每个image对象进行裁减操作,最后将image对象写入文件。 register函数有固定的格式,通过这个函数向Gimp注册插件,最后的main运行插件。Gimp启动的时候会在插件目录下寻找可用的插件,因此在使用之前必须给这个文件添加可执行属性。这个插件不是对一个文件的滤镜,属于一种工具,因此将其规为<Toolbox>类,这样,启动Gimp后,不打开任何文件,就能使用这个插件了。 运行插件的时候如下图所示,可以看出,python-fu还提供了一个输入参数的图形界面,同时,插件运行的进度也反应在这个界面上。当然,也可以用print向终端输出自己需要的信息。 June 22 开始暑期项目毕业论文改来改去终于改完了,迎合不同老师的胃口,做了不少修改,也浪费了不少大树。对于学校的办事规定,都要毕业了,也懒得发太多的牢骚了,反正毕业设计这事过去了就算是一个了解了。优秀也申请了,算是对得住自己一个学期来的辛勤劳动。 SoC已经开始了快一个月了,我才能有时间开始做了,刚开始就得面对Google的Mid-Term Evaluation,看样子有得熬几天才能混过这个evaluation,然后才算是正式开始这个项目。今天准备好了要看的资料,装好了要用的软件,看了看代码,算是开头了。创建了soc专用英文blog,发布了第一篇文章: http://www.planet-soc.com/blog/107 另一个深渊开始了。。。 March 06 python虚拟机毕设能够自己选题真好,于是就选了语言实现作为主题,于是就选了python语言作为一个目标进行实现。为什么选python呢,也许纯粹是因为喜欢,喜欢它的编程的自由,喜欢它的duck typing。按照python主页上的说法,Python is an easy to learn, powerful programming language. It has efficient high-level data structures and a simple but effective approach to object-oriented programming. Python's elegant syntax and dynamic typing, together with its interpreted nature, make it an ideal language for scripting and rapid application development in many areas on most platforms. 看着多诱人啊,简单易学,功能强大,支持面向对象,弱类型的脚本语言。和现在很多流行的语言一样,Python是跨平台的,运行在虚拟机之上。什么Java啦,C井号啦,VB.NET啦,本质上都被编译成了字节码跑在虚拟机上。所以Python语言的实现的关键就是虚拟机。虚拟机可以分为两大部分,从源代码到字节码的编译器和解释执行字节码的引擎。
总的说来,要实现Python语言,应该有如下理论筹备:1)高级语言编译的基本理论,包括词法分析,语法分析,语义分析和代码生成;2)Python对象模型的实现,要实现OO的重要特性,如继承。在实现过程中,以“一切皆对象”的思路进行,可以使问题得到一定的简化;3)执行引擎的架构。 首先说解释引擎的架构。这个就相当于JVM之类的虚拟机,主要工作就是一条一条地执行字节码。根据字节码的指令需求,进行一切操作,如算术操作,存储器的管理,对象的管理。因此,对象模型的核心部分就实现在虚拟机。要实现Python的动态类型,代价就是会在对象内产生比较多的冗余数据。所有类型的对象都是统一的内存模型,只是根据元数据来区分各个对象,通过统一的指针指向各自的成员列表。当然还有一个重要的参数,就是引用计数,这是垃圾回收的关键。另外,虚拟机还牵涉到一个字节码指令架构的问题。很多跨平台语言的虚拟机采用的都是堆栈架构的指令集,比如说JVM,也就是表达式的运算有点类似于逆波兰表达式的结构,这样的指令比较冗长,因为对内存的访问仅限制于堆栈顶部的几个元素。还有一种架构就是寄存器指令,这种架构的虚拟机理论上有无穷多个寄存器可以使用,这样指令就可以比较简洁灵活,任意一个寄存器都能随意访问,印象中.Net平台的虚拟机是寄存器架构的。Python的字节码规范表明,它的虚拟机也是堆栈架构的。但是我会选择的架构是寄存器架构,因为代码生成比较方便,任何一本教科书都是介绍寄存器代码的生成,所以,这也就意味着字节码的规范需要根据我的需要修改。
编译器部分就是按照龙书的经典描述进行。词法分析和语法分析采用parser generator ANTLR自动生成,在生成规则上需要下很多功夫。剩下的主要难点就在于代码生成了。要根据前面规定的字节码规范进行。由于前面的字节码规范要修改为基于寄存器的规范,所以代码生成也可以按照龙书上面的描述进行。
要做的事情还有很多,有点紧张了。 November 21 What does YAHOO mean?[转载]
Yahoo! The word was invented by Jonathan Swift and used in his book Gulliver's Travels. It represents a person who is repulsive in appearance and action and is barely human. Yahoo! founders Jerry Yang and David Filo selected the name because they considered themselves yahoos. Xerox The Greek root "xer" means dry. The inventor, Chestor Carlson, named his product Xerox as it was dry copying, markedly different from the then prevailing wet copying. Sun Microsystems Founded by four Stanford University buddies, Sun is the acronym for Stanford University Network. Sony From the Latin word 'sonus' meaning sound, and 'sonny' a slang used by Americans to refer to a bright youngster. Sony "Systems, Applications, Products in Data Processing", formed by four ex-IBM employees who used to work in the 'Systems/Applications/Projects' group of IBM. Red Hat Company founder Marc Ewing was given the Cornell lacrosse team cap (with red and white stripes) while at college by his grandfather. He lost it and had to search for it desperately. The manual of the beta version of Red Hat Linux had an appeal to readers to return his Red Hat if found by anyone! Oracle Larry Ellison and Bob Oats were working on a consulting project for the Central Intelligence Agency (CIA). The code name for the project was called Oracle (the CIA saw this as the system to give answers to all questions or something such). Motorola Founder Paul Galvin came up with this name when his company started manufacturing radios for cars. The popular radio company at the time was called Victrola. Microsoft It was coined by Bill Gates to represent the company that was devoted to MICROcomputer SOFTware. Originally christened Micro-Soft, the '-' was removed later on. Lotus Mitch Kapor got the name for his company from the lotus position or 'padmasana.' Kapor used to be a teacher of Transcendental Meditation of Maharishi Mahesh Yogi. Intel Bob Noyce and Gordon Moore wanted to name their new company 'Moore Noyce' but that was already trademarked by a hotel chain, so they had to settle for an acronym of INTegrated ELectronics. Hewlett-Packard Bill Hewlett and Dave Packard tossed a coin to decide whether the company they founded would be called Hewlett-Packard or Packard-Hewlett. Hotmail Founder Jack Smith got the idea of accessing email via the web from a computer anywhere in the world. When Sabeer Bhatia came up with the business plan for the mail service, he tried all kinds of names ending in 'mail' and finally settled for Hotmail as it included the letters "html" - the programming language used to write web pages. It was initially referred to as HoTMaiL with selective upper casings. The name started as a jockey boast about the amount of information the search-engine would be able to search. It was originally named 'Googol', a word for the number represented by 1 followed by 100 zeros. After founders - Stanford graduate students Sergey Brin and Larry Page presented their project to an angel investor, they received a cheque made out to 'Google Cisco The name is not an acronym but an abbreviation of San Francisco. The company's logo reflects its San Francisco name heritage. It represents a stylized Golden Gate Bridge. Apple Computers Favourite fruit of founder Steve Jobs. He was three months late in filing a name for the business, and he threatened to call his company Apple Computers if the other colleagues didn't suggest a better name by 5 o'clock. Apache It got its name because its founders got started by applying patches to code written for NCSA's httpd daemon. The result was 'A PAtCHy' server - thus, the name Apache. Adobe
November 12 封闭zhengsyao@163.com,使用gmail!封闭使用了6年的163的邮箱,使用 zhengsyao@gmail.com
了。原来的那个邮箱容量倒是一直在涨,原来还花了10万个泡币将容量扩充到2G。现在问题来了,发现突然每天100多封的邮件列表突然安静了,又发现原来
什么邮件都收不到了。调查一番,才发现邮件数量限制在5000了,再也不能收邮件了。一气之下,换了gmail,一个字,爽!功能强大,界面清爽,速度也
比较快。强烈推荐! October 28 linux校园网客户端的严重bug在做这个客户端之前,安装了一个xsupplicant,也就是linux下的一个比较流行的802.1x客户端,但是不能通过认证,服务器总是返回失败
信息,但是我没注意这个客户端实际上一直在后台运行。昨天做好了我的这个客户端之后,就没有管xsupplicant了,以为我这个客户端一直工作的很
好。 今天早上,发现这个xsupplicant一直在运行,就把它给删了,问题就来了,发现我的客户端非常容易掉线。怀疑是xsupplicant在后台对服 务器的一些请求应答。于是用ethreal抓包,发现果然如此。我的客户端对于认证成功后的一些请求就没有做很好的回应,所以服务器返回了失败信息。而装 好了xsupplicant后,它就一直在后台应答服务器,虽然内容和windows下的客户端的内容不一致,但是也是符合802.1x协议的,所以服务 器还是可以接受的,所以就可以一直不掉线了。 现在我的作法就是,装上xsupplicant,用我的客户端认证后就可以关了,反正xsupplicant可以在后台响应服务器,所以目前是两个客户端 配合工作。如果以后还有时间的后,就考虑完善一下这个客户端,让它可以一直工作,到时候可能就要详细阅读文档rfc3748了,把它做成一个通用的客户 端,而不只是我一个人可以用。现在能工作就行了,hoho 搞定校园网Linux下的客户端这段时间玩debian感觉还是很不错的,唯一郁闷的就是没有校园网的客户端,所以不能上网。用虚拟机感到郁闷至极,所以恨下心来要写一个linux下的客户端。今天一个下午加一个晚上搞定了。 分析一下任务,这是一个802.1x协议的客户端,直接在数据链路层发送接收数据。在Windows下需要一个第三方的库来完成对网卡的直接收发操作,华 为的客户端用的就是第三方的库,名字不记得了。在Linux下面这还是比较简单的,创建socket就可以读写网络设备了。至于这个协议如何加密的,完全 不用理会,只需要照葫芦画瓢,windows上的客户端怎样和服务器交换数据的,linux下只需要模拟就行了。因此,先在windows下用 ethreal抓完整的登陆过程的包,记录下来,在linux下模拟。具体的协议可以参照rfc3748。 认证有一个过程比较特殊,就是MD5-Challenge的过程。这个过程每次传输的数据都是不一样的。要根据服务器请求的一个challenge值,然 后和密码和identifier拼接计算MD5的值,然后再回应给服务器才行,否则就认证失败了。这个过程类似于PPP协议认证的过程,可以参照 RFC1994。 October 22 不用Fedora兴冲冲装上了Fedora Core 4, 发现实在是太不稳定了。虽然有些功能比如说自动挂载移动存储设备的分区很人性化,但是稳定性让我放弃它。
今天下载Debian的14个iso,明天刻盘安装。一心一意用Debian了。
好像最近很流行装Linux...看到一伙人好热情地装了Linux,然后又跑到Windows下去玩了。希望我不要这样,所以我把Windows给删了。。。 October 19 学习unix这个学期开了unix这门课,我象征性地去上了10分钟,就再也不想上这门课了。老师看上去很卖力,也比较负责任的样子,但是,对不起,她不懂unix文化。像教DOS一样教有30多年历史的unix。
我也不懂unix文化,但是我知道,对于这样一个历史悠久的贝尔实验室几个天才科学家开发出来的软件艺术品来说,像教DOS命令一样教是一种亵渎。那些命令只是表面上的东西,背后隐藏的却是unix深厚的底蕴和设计哲学。
刚从图书馆淘到一本书"The Art of Unix Programming",很早就知道有这么一本书,现在有时间可以好好看看了,还是蛮有意思的一本书。 October 02 在家没事,开始研究linux国庆在家里无聊,打算玩一玩linux,体会另一种文化。
在虚拟机上装了debian(http://www.debian.org),感觉速度非常慢,所以还是先在windows上装cygwin,玩熟了再看能不能在电脑上装debian,据说debian是一个比较好的适合个人使用的linux发行版 July 14 做好了网络的课程设计每次做课程设计都是一件异常痛苦的事情,因为总想在很短的时间内完成很棒的作品。
这次做得是一个动态路由算法演示,RFC1058对算法有详细的描述。只是我傻傻地自己琢磨了半天这个算法该怎么实现,却没有先去研究已有的文档,这算是一个教训了,以后有想不通的事情还是先去找文档吧。不过不管怎样,算法最终还是实现出来了。
界面是用wxWidgets做得,算法用多线程模拟,用XML保存文件。可以用鼠标添加删除路由器,拉线连接路由器,路由器位置可以用鼠标拖来拖去,还蛮好玩的。
|
|
|