开讲。
做一个Web游戏外挂需要的准备知识: 1) 需要有耐心 2) 熟悉HTML, JavaScript,特别是FORM 3) 熟悉HTTP协议,特别是Cookie, URL的编码方式和POST, GET内容格式 4) 熟悉游戏本身,能抽象出最优的赚钱/升级的数学模型 5) 掌握一门语言,白菜萝卜都可以,我比较喜欢用Python和C# 6) 需要一些抓包的工具,比如Fiddler
好了,来个例子,开心网争车位.
首先,我们看看一个正常用户玩的时候是怎么玩的。 1) 浏览器输入 www.kaixin001.com ,输入用户名,密码,点登陆 2) 登陆后选择左侧的“争车位”,进入到争车位 3) 看看谁在我的车位里,一一贴条 4) 看看自己的车哪些停车时间操作15分钟了,一一找个空的不免费的车位挪过去 5) 登出开心网,关闭浏览器
看看让程序怎么来实现1-6。 1) 登陆开心网 在Fiddler的帮助下,我们知道登陆是把FORM提交到/login/login.php,POST内容是url=%2F&email=xxx@xxx.com&password=xxx 用C#可以方便的完成这个POST操作,然后得到服务器的返回,然后根据返回的内容里找一个关键字就可以判断这次登陆操作是否成功了。(比如我找的就是”
2) 登陆争车位 这次是一个GET操作,URL是/app/app.php?aid=1040。 需要说明一下的是,这里没有提供用户名密码,服务器怎么能知道是哪个用户呢?Cookie在这里就发挥了它的作用。 C#里存放Cookie的方法是new 一个CookieContainer,然后所有的HttpWebRequest的CookieContainer都用它。 好了,取得这个页面以后,我们能得到很多信息:(这些信息是JSON格式) a) 好友列表,每个好友的状态(在线/车位满) b) 自己的车库信息,停了那些好友的哪些车,分别赚了多少钱 c) 自己的汽车信息,多少辆车,分别停在哪里,赚了多少钱 根据这些信息,我们可以得到一个停放的列表(车位不满的好友列表)
3) 贴条 贴条是一个POST操作,URL是/parking/post.php,内容是verify=xxx&parkid=yyy&p=1&_= parkid很好理解,车库信息里直接可以取到,那么verify怎么得到的呢? 我当初的第一反应是Cookie数据通过某种运算得到的,不过后来我看了登陆争车位的html后才发现原来这个verify是这样写的: … <script language=javascript> var fs2_pars = “f1”; var g_verify = “383639_1040_383639_1221703779_49963b942199e94b88e405d0f7b1651d”; var g_first = parseInt(“0”); var g_touid = parseInt(“0”); var g_checkswf = 0; ….. 很好,直接去这个从HTML取得的值就好了。
4) 挪车位 这个操作稍微复杂了一点点,具体的HTTP请求大家可以去分析一下,我分析的结果如下: a) 是否是免费车位 在JavaScript里有代码: v_park_free = (v_parkid » 16) & 0xff; if (v_park_free) { v_mycar += ‘免费车位’; } else { v_mycar += ‘私家车位’; } c) 读取邻居家车库信息 URL: /parking/neighbor.php POST内容: verify=xxx&puid=yyy&= d) 读取邻居家车库信息 URL: /parking/user.php POST内容: verify=xxx&puid=yyy&= e) 停车 URL: /parking/park.php POST内容: verify=xxx&park_uid=xxx&parkid=xxx&carid=xxx&neighbor=xxx&a=1&first_fee_parking=0&_=
5) 登出 GET URL: /login/logout.php
恭喜你,基本的操作你都明白了。
时间晚了,该睡觉了,一些高级主题改天再写~
————–Google Code 分割线————- http://code.google.com/p/kaixin/ ————————————————— 所有代码都上传到了 http://code.google.com/p/kaixin/ 大家可以发信给我申请writer权限,或者直接把写好的代码发给我由我来merge。 我的Email: turbozv(at)gmail.com
在终端执行命令 备份当前的源列表,以便日后需要时恢复: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 编辑源列表 Ubuntu 和debian 中执行: gedit /etc/apt/sources.list Kubuntu 中执行: kdesu kate /etc/apt/sources.list Xubuntu 中执行: gksu mousepad /etc/apt/sources.list 适用于所有版本: sudo vim /etc/apt/sources.list 从以下各服务器列表内容中选择一段替换文件中的所有内容,一般来说加入一至两组即可,加多了影响更新速度。为防止非官方源中软件包不全的问题,请在sources.list文件中尾部添加一组官方源。 # deb file:/cdrom/ etch main contrib
#deb http://mirrors.cn99.com/debian/ lenny main non-free contrib
#deb-src http://mirrors.cn99.com/debian/ lenny main non-free contrib
deb http://mirrors.163.com/debian stable contrib main non-free
deb-src http://mirrors.163.com/debian stable contrib main non-free
deb http://mirror.dlut.edu.cn/debian/ lenny main non-free contrib
deb-src http://mirror.dlut.edu.cn/debian/ lenny main non-free contrib
deb http://debian.ustc.edu.cn/debian/ lenny main non-free contrib
deb-src http://debian.ustc.edu.cn/debian/ lenny main non-free contrib deb http://ftp.tw.debian.org/debian lenny main deb-src http://ftp.tw.debian.org/debian lenny main 以上是目前debian lenny 速度稳定的源 编辑保存后执行 apt-get update apt-get upgrade apt-get dist-upgrade
Debian Lenny 终于于2009-02-14情人节正式发布!本文从实践出发,根据自己需要将Debian Lenny的硬盘安装过程记录下来,供有同样爱好的朋友参考。欢迎转载,但请注明出处:http://www.qpsoft.com/blog/debian-lenny-disk-install
一、下载硬盘安装所需要的文件 进入http://www.debian.org/releases/lenny/debian-installer/,下载以下文件(i386版): ⒈ netinst CD image (generally 135-175 MB) http://cdimage.debian.org/debian-cd/5.0.0/i386/iso-cd/debian-500-i386-netinst.iso 此版本可以安装最基本的Debian系统。
⒉ full CD/DVD sets http://cdimage.debian.org/debian-cd/5.0.0/i386/iso-dvd/debian-500-i386-DVD-1.iso 下载DVD版本的第一个光盘就可以包括大量的常见软件了。
⒊ other images (netboot, usb stick, floppy, etc) http://ftp.nl.debian.org/debian/dists/lenny/main/installer-i386/current/images/hd-media/initrd.gz http://ftp.nl.debian.org/debian/dists/lenny/main/installer-i386/current/images/hd-media/vmlinuz 这两个文件是硬盘安装所必备的!
⒋ Grub for DOS http://download.gna.org/grub4dos/ http://download.gna.org/grub4dos/grub4dos-0.4.4-2009-02-15.zip 进入DOS的,必备!
翻译Python历史:微软于1996年发布Python代码 19 February, 2009 (14:15) | Translate | No comments This post a a Chinese translation of Greg Stein’s article “Microsoft Ships Python Code… in 1996” on a blog named “The History of Python”, which is started by Guido van Rossum. 原文地址:http://python-history.blogspot.com/2009/01/microsoft-ships-python-code-in-1996.html 非常感谢Guido让我分享我自己关于Python的历史! 我把我对Python的介绍放在另一篇文章里,结尾介绍了我们几个人在1991年的开始。那时我们在制作一个大型的处理B2C电子商务的客户端/服务器系统。客户TCP协议运行在旧的X.25网络上,是非常旧时代的东西了。 在1995年,我们认识到,与我们过去所相信的相冲突的,越来越多的客户实际上是联网的,我们需要给我们的客户(计算机销售商)提供一个系统可以访问连接到互联网上的客户。 我们的第一个问题就是要转换到一个完全基于浏览器的环境。我们的客户端不再使用了,所以我们要给客户们提供一个新的购物体验,而且服务器的基础结构 要提供支持。那时,控制一个网络浏览器意味着为Apache和Netscape的HTTP服务器编写CGI脚本。通过CGI,我连接到我们已有的服务器后 端来处理订单、维护购物篮、以及抓取商品信息。这些CGI脚本生成纯的、vanilla HTML(1995年还没有AJAX!)。 这项计划非常不理想,因为每一个请求花费很长时间来生成一个新的CGI进程。反应能力非常弱。因此,在1995年十二月,当我参加在华盛顿特区举办 的Python研讨会时,我(从Digital Creations,最了解Zope的人)那里得知了一些Apache和Netscape模块在服务器进程运行的比较稳定。这些模块使用一个名为ILU的 RPC系统来与后端的一直运行的进程交互。把这个系统替换进去后,CGI派生的高额开销就解决了,而且购物体验相当舒适!我们开始把原型转换成实际的代 码。随着我们的投入,我们的系统看上去越完善,而且有更多的人加入这个项目。以后几个月的开发变得非常迅速(感谢Python!)。 在1996年一月,微软敲了我们的门。他们内部的电子商务系统的开发不断失败,他们需要一些懂得行业(那时我们做电子商务已经好几年了)而且聪明的人。当谈判开始时,我们在整个春天继续开发软件,在1996年六月完成了工作。 当我们带着我们的短小的Python代码到了微软,我们要完成如何把产品发布到Windows NT上。我们加入的小组里有很多Windows经验,我们制作了一个IIS插件通过管道来与嵌入我们的Python服务代码的后端NT服务器进行交互。经 过从七月开始的疯狂冲刺,我们在1996年十月发布了微软商业服务器1.0版本(Microsoft Merchant Server 1.0)。 是的,如果你把外面的封装解开,隐藏在系统下面的,是一个Python解释器、一些扩展DLL文件、以及一堆.pyc文件。微软当然没有宣传这一点,但如果你知道从哪里寻找的话,它们确实在那里。 翻译Python历史:个人历史 - 第二部分,CNRI和之后 27 January, 2009 (21:16) | Translate | No comments This post a a Chinese translation of Guido van Rossums’s article “Personal History - part 2, CNRI and beyond” on his blog named “The History of Python”. 原文地址:http://python-history.blogspot.com/2009/01/personal-history-part-2-cnri-and-beyond.html Python研讨会(参看之前的文章)的结果是一份在CNRI(the Corporation for National Research Initiatives,国家研究研发公司)的工作。CNRI是位于维珍尼亚州来斯顿的一个非盈利的研究实验室。我在1995年四月份加入。CNRI的主 管Bob Kahn是第一位向我指出Python与Lisp之间共同点的人,尽管两者从外表(语法)上完全不同。在CNRI,DARPA授权的移动媒介研究间接的给 Python工作提供经济支持。尽管有DARPA支持的项目在使用Python,但没有太多对编程语言本身的直接支持。 在CNRI,我领导并帮助雇佣了一个小的开发小组来用纯的Python语言开发一个移动媒介系统。最初的小组成员是Roger Masse和Barry Warsaw,他们在NIST的Python研讨会上指出Python的bug。另外,我们还雇佣了Python社区的成员Ken Manheimer和Fred Drake。MIT的毕业生Jeremy Hylton原本是被雇佣来做文本检索工作的,也加入了团队。最初团队由Ted Strollo和Al Vezza管理。 这个团队帮助我创建和管理了另外的Python社区的基础,比如python.org站点,CVS服务器和不同的Python特殊兴趣小组的邮件列表。Python的1.3到1.6版本都出自CNRI。在很多年里Python 1.5.2版本是最流行和最稳定的版本。 GNU mailman也在这里诞生:我们最早用一个叫Majordomo的Perl工具,但Ken Manheimer发现它不容易管理,于是就找一个Python方案。他找到John Viega写的一些东西并接手管理。当Ken离开CNRI去了Digital Creations,Barry Warsaw接手了它,并说服了自由软件基金会(Free Software Foundation)采用它作为官方的邮件列表工具。因此Barry把它按照GPL(GNU Public Licence)许可发行。 Python研讨会仍然继续着。开始是一年两次,但由于工作量呈指数性的增长,它编程了年会。最初这些研讨会是自愿组织的,就像NIST(第一 次),USGS(第二次和第三次),以及LLNL(第四次,并且开始了年度系列)。最终CNRI接手了组织任务,后来(和WWW及IETF会议一起)这些 成为了Fortec商业行为的副产品。很快的参与人数达到了数百人。当我离开CNRI后一段时间后Fortec逐渐消失,全球Python会议成为了 O’Reilly开源会议(OSCON)的一部分,但同时Python软件基金会(Python Software Foundation,见下)开始了一个名为PyCon的新的草根研讨会。 我们也在CNRI建立了第一个Python周边协会。为了回应Mike McLay和Paul Everitt创建一个后来结束在法规起草流沙中的“Python基金会”的努力,Bob Kahn出钱成立了“Python软件行动”(Python Software […] 翻译Python历史:个人历史 - 第一部分,CWI 20 January, 2009 (21:28) | Translate | No comments This post a a Chinese translation of Guido van Rossums’s article “Personal History - part 1, CWI” on his blog named “The History of Python”. 原文地址:http://python-history.blogspot.com/2009/01/personal-history-part-1-cwi.html Python的早期开发始于位于阿姆斯特丹的一个名为CWI的研究机构。CWI是Centre for Mathematics and Computer Science的荷兰语拼写的首字母。CWI是个有趣的地方,它接受荷兰政府的教育部门和其它研究拨款,做学术等级的计算机科学和数学研究。任何时间那里 都有很多博士生,老辈的人或许还能记得它的原始名称:数学中心。在这个名字下,最有名的发明或许就是Algol 68了。 1982年晚期我大学毕业后开始在CWI工作,在Lambert Meertens和Steven Pemberton领导的ABC小组当程序员。四、五年后ABC项目被终止,因为它缺乏显著的成就。然后我又到了Sape Mullender领导的CWI的Amoeba小组。Amoeba是一个基于微内核分布式系统,由CWI和阿姆斯特丹VU大学联合开发,由Andrew Tanenbaum领导。1991年Sape离开CWI去Twente大学当教授,我结束了CWI的由Dick Bulterman领导的一个新生多媒体小组的工作。 Python是我在CWI的一个直接产品。正如我将会在后面介绍的那样,ABC给了我Python的关键灵感、Amoeba给了我马上的动力、多媒 体组让它成长。然而,就我所知,没有任何一笔CWI的基金是正式赞助Python的。事实上,Python仅仅是Amoeba和多媒体小组的一个重要工 具。 我最初想创建Python的动机是Amoeba项目需要一个高级语言。我意识到用C语言来开发系统管理工具太费时间了。而且,在Bourne shell下做这个不能保证在其它的shell下也能正常工作。最重要的是作为一个完全新设计的分布式微内核系统,Amoeba的原子操作和其它能运行 Bourne shell的传统操作系统相比是非常不同(而且更出色)的。所以我们需要一个语言来作为“C语言和shell之间的桥梁”。很长一段时间里,这就是 Python的主要任务。 在这一点上,你或许会问“为什么不移植到已经存在的语言上?”我的观点是,那个时候没有许多合适的语言。我比较熟悉Perl 3,但它与UNIX的联系比与Bourne shell还要紧密。我也不喜欢Perl的语法──我对编程语言的口味受Algol 60样式的语言比如Pascal、Algol 68(都是我早期学的语言)和ABC这个我花费了生命中四年时间的语言影响很大。所以我决定设计一门我自己的新语言,借鉴所有ABC中我喜欢的东西并且修 正我意识到的所有问题。 我第一个决定修正的是名字!就像事实那样,ABC小组没有给他们的语言取好名字。他们最初的名字是B,后来被放弃,因为会和另一个也叫B的语言混 淆,而且那个B更古老,也更有名的。无论如何,B代表只是一个意义上的工作标题(这是一个玩笑,B是包含语言名字的变量名称,因此用斜体)。小组曾经举办 过一个公开竞赛来征一个新名字,但没有一个是满意的。最后选用了内部的备用方案。这个名字想传达一个让语言和字母表一样简单的想法,但它从来没有让我感到 信服。 所以,没有在上面分析名字问题,我决定在下面分析它。我选择了第一个想到的名字,从Monty Python’s Flying Circus来的,那是我最喜欢的喜剧演出之一。这点引用让我感觉非常适合一个“实验项目”。“Python”一词也是一个好记的不错的名字,而且也适合 用名人命名语言的传统,就像Pascal、Ada、Eiffel那样。Monty Python团队或许在科技人群中不那么著名,但他们是极客们的最爱。它也同样适合CWI的传统──Amoeba小组用电视节目的名字来命名语言。 很多年我都抵抗住要把语言和蛇联系起来的诱惑。当O’Reilly想在他们的第一本关于Python的书《Programming Python》的封面上放上一条蛇的时候,我最终放弃了。用动物图像做书籍封面是O’Reilly的传统,如果要在Python的书的封面上印上动物,蛇 是最合适的了。 决定了名称后,我于1989年十二月末开始了Python的工作,在1990年的头几个月有了一个可以运行的版本。我没有记笔记,但我清楚的记得我 为Python写的第一份代码是一个我称作“pgen”的简单的LL(1)语法分析生成器。这个语法分析生成器仍然是Python代码的一部分,而且或许 是所有代码中需要修改的最后一部分。Python的早期版本被CWI的一群人使用,但在1990年时还仅限于Amoeba小组内部。除我之外的核心开发者 是我的同事Sjoerd Mullerder(Sape的弟弟)和Jack Jansen(在我离开CWI多年后他仍然领导Macintosh移植的开发)。 在1991年二月20日,我第一次通过alt.sources新闻组向世界发布了Python(我用uuencode分成21个包发布然后用户要用 uudecode来合并成一个压缩的tar文件)。这个版本被标记为0.9.0,几乎是原字照抄了当时MIT给X11项目用的许可证,署名 “Stichting Mathematisch Centrum”(CWI的上级组织)作为法律实体。所以,就像我写的其它东西一样,Python在Eric Raymond和Bruce Perens在1997年末推广“开源”一词之前就开源了。 当时立刻就有了很多回复。在这些回复的鼓励下,我在后几年定期的发布新版本。我开始使用CVS来跟踪更新和更容易的管理Sjoerd和Jack贡献 的的代码(CVS最初是Dick Grune开发成一组shell脚本,他是ABC小组的早期成员)。我写了FAQ,定期发布到某个新闻组,来回答在web上常见的问题,并建立了邮件列 表。1993年三月comp.lang.python在我的鼓励下建立了,但不是我亲自参与的。新闻组和邮件列表通过现在还在的一个双向网关联系在一起, 尽管现在是mailman的一个功能了──mailman是一个优秀的开源邮件列表管理器,它本身也是用Python写的。 在1994年夏天,新闻组上的一篇名为“如果Guido被车撞了”的文章引起了关于成长中的Python社区对我本人贡献的依赖的讨论。讨论以Michael McLay邀请我到NIST做两个月的客座研究院而告终。NIST是the […] 翻译Python历史:Python的简要时间表 20 January, 2009 (17:34) | Translate | No comments This post is a Chinese translation of Guido van Rossum’s article “A Brief Timeline of Python”. 原文地址:http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html Python的开发和流行是和许多其它的动态(和开源)编程语言如Tcl、Perl和后来的Ruby的同时代的。为了给Python一个更好的历史看法,下面这张表展示了Python的发布历史。在早期我没有严格的记录每件事,因此那时的日期并不精确。 发布日期 版本 December, 1989 开始实现 1990 CWI里内部发行 February 20, 1991 0.9.0 (发布到alt.sources) February, 1991 0.9.1 Autumn, 1991 0.9.2 December 24, 1991 0.9.4 January 2, 1992 0.9.5 (只在Macintosh上) April 6, 1992 0.9.6 Unknown, 1992 0.9.7beta January 9, 1993 0.9.8 July 29, 1993 0.9.9 January 26, 1994 1.0.0 February 15, 1994 1.0.2 May 4, 1994 1.0.3 July 14, 1994 1.0.4 October 11, 1994 1.1 November 10, 1994 1.1.1 April 13, 1995 1.2 October 13, 1995 1.3 October 25, 1996 1.4 January 3, 1998 1.5 October 31, […] 翻译Python历史:介绍与概述 16 January, 2009 (22:26) | Translate | No comments This post is for translating an article named “Python’s Design Philosophy” by Guido van Rossum. 原文地址:http://python-history.blogspot.com/2009/01/introduction-and-overview.html 介绍 Python是目前最流行的几种动态编程语言(包括Perl、Tcl、PHP,以及新成员Ruby)之一。尽管它经常被认为是一门“脚本式”语言, 但它确实是一门通用的编程语言,就像Lisp和Smalltalk以及其它语言一样。在今天,Python被用于从用一次就扔到的脚本到提供24×7小时 不间断服务的大型服务器的各个领域中。它被用于GUI和数据库编程、客户端和服务器端的网络编程,以及程序测试。它既被科学家用来给世界上最快的超级电脑 写程序,也被儿童用来学习编程。 在这个blog里,我将把焦点放在Python的历史上。特别是关于Python语言如何被开发、设计上的主要影响,犯的错误、学到的教训、以及未来的方向。 鸣谢:我欠了Dave Beazley很多这个blog的好的句子。(关于这个blog的更多的起源,请看我的另一个blog。) 鸟瞰Python 当人们第一次看Python时,他们常常对于代码的样子感到冲击,至少从表面上来看,很像常规的程序设计语言,比方C或Pascal。这并不是意外 ──Python从C上借鉴了很多语法。例如,许多Python的关键字(if、else、while、for等等)和C一模一样;Python的标识符 和C有着同样的命名规则;大多数的基础操作符和C有着相同的含义。当然,很明显Python并不是C,一个主要的不同就是Python不是用括号而是用缩 进来分组语句。例如,不是像C一样这样写语句 if (a < b) { max = b; } else { max = a; } Python完全抛弃了括号(同样抛弃了句尾的分号)并且使用如下的结构 if a < b: max = b else: max = a 其它Python和C样式的语言的不同是它使用动态类型绑定。在C中,变量永远必须被显式的定义像成某些特定的类型,比如说int或double。 这个信息被用在进行程序的静态的编译期检查和分配用来存储变量值的内存地址。在Python中,变量只是简单的只想对象的名字。变量不需要在赋值前被定 义,而且它们甚至可以在程序运行中间改变类型。像其它动态语言一样,所有的类型检查都是解释器在运行的时候进行的,而不是在每次的编译的时候。 Python的基本内建数据类新有布尔、数值(机器整数、任意精度的整数、以及实数和复数类型的浮点数),和字符串(8比特和Unicode)。这 些都是不可变的类型,意思是他们是用创建后就不能改动的对象描述的。内建的复合数据类型包括元组(不可变的数组)、序列(可以改变体积的数组)和字典(哈 希表)。 Python通过支持包(一组模块和/或包)、模块、类、方法和函数来组织程序。它提供if/else、while和可以循环所有“可迭代的”对象 高级for语句来控制程序流程。错误处理方面,Python使用了(不可恢复的)异常。一条语句抛出了一个异常,try/except/finally语 句来指定如何处理这个异常。当错误发生时,内建的操作就会抛出异常。 在Python中,所有可以被命名的对象都被称为“first class”。这意味着函数、类、方法、模块和所有其它的有名字的对象都可以在运行的时候被任意的传来传去、检查、并放在不同的数据结构(例如序列或字 典)里。而且谈到对象,Python也有对面向对象编程,包括用户定义的类、继承、和运行期方法绑定的全面支持。 Python有多方面的标准库,是它能够流行的主要原因。标准库有超过100个模块而且还在继续增长中。这些模块包括正则表达式配对、标准数学函 数、线程、操作系统接口、网络编程、标准互联网协议(HTTP、FTP、SMTP等等)、电子邮件处理、XML处理、HTML解析和GUI工具箱 (Tcl/Tk)。 此外,还有数量相当庞大的第三方提供的模块和包,其中多数是开源的。其中有网络框架(要列出来就太多了)、更多的GUI工具箱、高效率数值库(包括 对许多流行的Fortran包的封装)、关系型数据库接口(Oracle、MySQL和一些其它的)、SWIG(可以让任意C++库编程Python可使 用的模块的工具)和更多。 Python(和其它动态编程语言)的一个主要的吸引力是看上去复杂的任务通常可以用非常短的代码表达。举例来说,这是一段简单的Python脚本,它抓取一个网页、扫描它并获取URL地址,然后输出其中的前10个: # Scan the web looking for references import re import urllib regex = re.compile(r’href=”([^”]+)”’) def […] 翻译Python历史:Python的设计哲学 16 January, 2009 (17:58) | Translate | No comments 从LinuxToy上看到了Python的作者开blog写史的消息,马上进去看看,发现现在一共有两篇文章。因此想到现在做一个粗略的翻译可能会 对中文读者有帮助,就抽了点时间翻译了其中的第二篇文章。我翻译的很不正规、也很不严谨。但对于不想做Python历史学家的普通读者应该能看通大略意 思。 This post is for translating an article named “Python’s Design Philosophy” by Guido van Rossum. 原文地址:http://python-history.blogspot.com/2009/01/pythons-design-philosophy.html 后面的blog文章会讨论Python历史的(血淋淋的)细节。然而在那之前,我想详细的说一下在我设计和实现Python时帮助我做出决定的哲学上的指导方针。 首先,Python最初是被构思成一个个人的“实验”项目──没有官方预算,我希望能很快得到结果,以便说服我的老板支持这个项目(我做的相当成功)。这样产生了一些节省时间的规则: 从任何可以的地方借鉴思想。 “任务应当尽可能简单的完成。”(爱因斯坦) 做好一件事(“UNIX哲学”)。 别过于担心效率──在最后需要的时候再优化。 不要随大流。 不要试图做到最好因为“足够好”就足够了。 (因此)抄近路是可行的,特别是当你可以在将来再完善。 其它的原则不是为了节省时间。有时它们反而是恰恰相反的。 Python的实现不应当限制在一个平台上。部分功能可以不跨平台,但核心一定要可以随处工作。 不要用机器可以处理的细节去打扰用户(我不总是遵守这点,后面的章节会讲一些惨痛的后果)。 支持、鼓励平台无关的用户代码,但不要切断访问平台特性的功能(这点与Java完全不同)。 […] |
World of Goo(中文名为“粘粘世界”)这款由 2D Boy 所开发的另类益智游戏在最近移植到了 Linux 平台。笔者下载其 demo 版玩了一会儿,感觉该游戏蛮有意思。游戏要求玩家通过搭建结构来让 Goo 到达终点,画面精美,音效也不错。 World of Goo 的 demo 版本目前提供有 tar.gz、deb、rpm 等格式的安装包,其中 tar.gz 解包后就可以玩。World of Goo 的正式版本要价 20 美元。 World of Goo
最近正在研究Flash RIA,经人推荐到sf上面下载了一个开源免费的AS IDE,叫做SEPY,不经意之间发现SEPY竟然是用Python写的!于是又下载了SEPY的源代码观摩了一下,结果更吃惊,惊叹Python做图形 桌面应用程序代码竟然如此简洁,表现力竟然如此丰富,如果不是特别留意,绝想不到SEPY竟然不是Windows本地代码编写的软件。就此关注了一下 Python的桌面应用程序开发,这一下更加吃惊,发现现在使用python写的桌面应用程序已经非常丰富了,sf上面一抓一大把。然后还找到了 Python的几个IDE,其中BOA给我极大的震撼,安装跑起来一看,俨然就是Delphi!可视化的托拽方式放置桌面控件,完全面向对象的编程。
经过半天时间简单的了解,我得到了如下的结论:Python做桌面应用程序的前景非常好,而相形之下,已经事实上宣判了Java做桌面应用程序的死刑!
Java 做桌面应用程序,无法脱离JRE,这是一个很大的限制,你必须下载安装很大的一个JRE运行环境,并且一旦安装那就涉及到了JRE版本的问题,你基于 JDK5.0开发的应用就没有办法在人家JRE1.4上面正常的跑。虽然JWS可以做到应用程序的Online update,但是终究无法做到JRE的online update!
此外,Java的图形API严重分裂为Swing和SWT。 Swing是一个扶不起的阿斗,bug很多,做出来的界面不伦不类, 而且无法处理一些类似系统托盘之类和操作系统关系比较大的功能,并且性能非常糟糕,可以这样说,Java成也Sun,败也Sun;SWT要比Swing好 得多了,但是可惜的是, Sun拒绝接受SWT,这样就使得SWT始终处在地下状态,得不到良好的发展。并且SWT也无法脱离JRE运行,而且API直接封装操作系统调用,很多地 方有MFC痕迹,没有办法OO起来,受到很大的限制,但不管怎么说,SWT总算是给Java图形编程留下了一线希望。
而Python从一开始就是走SWT的思路,绝不愚蠢的自己去构建桌面组件,而是用C++编写组件,用Python去调用,这样的思路走到现在,已经有了 良好的回报。现在 Python编写的应用软件,可以脱离Pthon运行环境,单独编译为pyd(Python DLL)和exe直接运行在Windows操作系统上。其速度表现和内存占用两个方面都要比Java好,就我现在的用下来的感觉,和VB开发的桌面应用程 序,或者和dotnet开发的桌面应用程序处在同一个级别。
其实现在Windows桌面应用程序开发处在一个告别旧的时代,但是又没有迎来新的时代的尴尬时期:MS力主推出的dotnet winforms并没有取得预期中的成 功,至今仍然使用者寥寥,推了那么多年都没有普及开来,并且又是注定的一个过渡时期技术,这些都说明 winforms不会有更好的前途;而MS下一代桌面应用技术尚未拉开神秘的面纱,至于普及,也是n年以后的事情了;所以现在就很尴尬,经过几年 Internet Application和dotnet winforms的喧嚣之后,传统的Desktop Developer又重拾昔日的Delphi利器,然而连Borland自己都不再对自己保存足够的信心,而去搞Delphi.net去了,于是大家只好拿出来怀旧的Delphi7,VB6,VC6来应付桌面应用技术开发。
在有像BOA这样IDE的强力支持下,Python也当仁不让的加入了这一行列,以现在的桌面应用开发技术来说,Python在开发效率,执行性能,学习 曲线方面全面不落下风,甚至在很多方面有优势,特别是在跨平台这一点上,做到了Java多年都做不好的方面。由于Python的出色表现,我已经找不出来 用Java编写桌面应用程序的任何理由了。我可以理直气壮的宣布, Java桌面应用开发已死!
Python在服务器应用开发方面,也同样非常强大,不过考虑到Java在服务器领域多年的成绩和诸多大公司的投入,显然还无法取代Java的地位,但是我可以预言,将来淘汰Java的必定是Python,而不是dotnet!
随着RIA和RCP的流行,大家都在寻找下一代客户端技术。MS自成体系的一套自然也是其中之一,但是离问世还有几年,离普及就更遥远,在当前出现的所有的技术当中,我断定两种技术肯定会成为主流:
Flash会成为RIA的主流;Python会成为RCP的主流!
从dengjie.com上面看到SEPY ActionScript Editor出中文版了,从网上下了一个非常不错! 版本号是1.0.6.67及以上才有中文版,别下错了!(安装时没有中文的选择,安装以后可以从菜单中设置,设置方法(需重启软件):http://www.dengjie.com/temp/sepy_cn.gif) 以前一直觉得SEPY ActionScript Editor,有一点不是很好,没有FLASH的自动套用格式(),书写的很乱的文档,按CTRL+ALT+F就可以马上变个格式清楚,不过看《AS2与 RIA》中LUAR介绍说SEPY ActionScript Editor 也有这个功能,可是我在中文版中还是没有找到。 下载地址:http://sourceforge.net/project/showfiles.php?group_id=90749&release_id=192540 从更新日志中可以看出,这个中文包是出自Dengjie兄,在这里感谢Dengjie!
修改pidgin 让鼠标覆盖用户时候不出现详细信息 pidgin-2.5.2/pidgin/gtkblist.c
注释掉3037行到3046行。
Python代码 #!/usr/bin/python #--coding=utf-8-- import os,sys,re,time; odir = raw_input(‘请输入目录:’); ext = raw_input(‘需要替换的文件后缀:’); sta = raw_input(‘请输入正则表达式:’); strb = raw_input(‘替换厚的字符串:’); os.chdir(odir); c1 = os.walk(os.getcwd()); filelist = []; stra = re.compile(sta,re.DOTALL); for c2 in c1: for c3 in c2[2]: c4 = os.path.join(c2[0],c3); c5 = os.path.splitext(c4); if c5[1] == ext: filelist.append(c4); else: pass; print filelist; for filename in filelist: fileread = open(filename,’r’); filer = fileread.read(); sub = re.sub(stra,strb,filer,0); #替换stra 为 strb fileread.close(); fileok = open(filename,’w’); fileok.write(sub); fileok.close(); print filename,’替换成功!’;
google发布了gae(google appengine),允许开发者直接在上面做各种网站和互联网运用。gae的主页以helloworld,example以及api的方式介绍了gae 的开发模式,对于开发来说,gae提供的文档明显不够。好在gae是搭建于python之上的,很多python的东东都是适用于gae的。 gae的介绍中,对于程序的调试涉及甚少,以至于很多入门者不知如何调试程序,特别是那些一直依赖于集成开发环境(IDE)的同志更是如此。从这点上看,我觉得gae在这方面做的非常之不够。 本文将介绍如何使用elipse搭建gae开发环境,如何进行单步跟踪调试。 1.准备工作1)假定你已经装了python,elipse和google app engine,这个步骤不在本文描述之内 2)在eclipse上安装pydev 从 Eclipse 中选择 Help > Software Updates > Update Manager,启动 Install/Update 视角。在左下角的 Feature Updates 视图中,将 PyDev 插件更新站点作为新的 SiteBookmark 添加到“Sites to Visit”文件夹下。Eclipse 的 PyDev 更新站点 URL 为http://pydev.sf.net/updates/。现在,Feature Updates 编辑器中应该显示出“PyDev”这一特性。在Feature Updates 编辑器中,展开 PyDev > Other,选择其中显示的 PyDev 特性(至少应该是 0.4.1)。然后选择 “Install Now”安装该特性。Eclipse 将下载 PyDev 插件,并将其安装到 Eclipse 中。 如下图所示: 在pydev安装完毕后,根据要求,重新启动eclipse 2.配置pydev1)eclipse重新启动后,点菜单Windows -> Preferences
2)点击dialog中的PyDev -> Interpreter - Python 部分
3)点击“Python interpreters” ”正右边的New按钮
4)找到你的python的安装目录,选中python.exe,比如我的是C:\Python25\python.exe
5)此时pydev后搜索相关的dll,显示如下页面
6)按ok接收系统pythonpath条目
7)按ok确认修改 3.开始你的第一个project1)在eclipse 的package explorer区域的右键下拉菜单中点击New -> Other
2)在弹出的对话框中,选pydev类中的Pydev project
3)点next,在下一个窗口中,输入project name(helloworld),注意project type选Python 2.5 (非常重要)
4)点finish,eclipse会切换到eclipse view
5)右键单击helloworld project,在下拉菜单中选 Properties
6)在属性对话框中选择PyDev - PYTHONPATH ,添加gae的lib
7)点击external source folder一栏右边的Add source folder 添加如下folder
8)选ok确认修改
9)在src目录下书写代码(或者将已经写好的代码放到src目录下)
4.配置run configuration和debug configuration1)Run -> Open Run Dialog
2)选择Python Run ,加入一个新的configuration
& 3)命名configuration 在“Project”栏,加入你的google app engine python project “Main Module”栏, 键入你的dev_appserver.py的路径(比如我是C:\Program Files\Google\google_appengine\dev_appserver.py). 切换到argument属性页,program arguments一栏键入${workspace_loc:helloworld/src/}作为第一个参数,注意参数中的helloworld要根据自己的情况改变。在这个参数后面,你可以加入 Dev Webserver documentation page. 列出的可用的参数。
5)点apply保存修改
6)点击debug的configuration设置,可以看到已经自动设好了
7)可以运行及调试了,点run,可以看到控制台有如下输出
点debug,设置断点,在ie或者opera中登录http://localhost:8080,就可以进行单步跟踪
如有任何疑问,可以回帖