uWSGI基本上是python做web服务的不二选择了,但似乎项目的开发者比较热衷于其新功能开发,对其使用文档还是相当缺乏的。 安装: Ubuntu 添加ppa,安装。 目前只有Lucid, Maverick, Natty几个版本还需要添加,以后版本都在官方原,直接apt-get install即可。 1 2 3 add-apt-repository ppa:uwsgi/release apt-get update apt-get install uwsgi-python Debian 目前Debian sid已经收录了uwsgi,一般服务器安装的testing/stable,只能自己修改apt的配置,从sid里面port过来。 注意:以下操作可能毁掉您的整个debian包系统。以下命令仅在Debian wheezy,即目前的testing运行测试安装过,如果你的是squeeze,自己修改01all那里 Pin: release a=squeeze 一行,但不保证能够正常运行。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 echo "deb http://ftp.tw.debian.org/debian sid main non-free contrib" >> /etc/apt/sources.list cat > /etc/apt/preferences.d/01all << [...]
What 在Python里面,如果你使用上Qt,SQLAlchemy,Twisted之类各种大型类库时候,有时候多重继承Multiple Inheritance是个简单的解决方法,但是多重继承的复杂性总容易造成误解和疑惑。 一般“常识”说,使用super访问父类的属性/方法,这种说法在多重继承里面是不成立的,多重继承的类并没有父类的概念(There is no superclass in a MI world)。类似的博客在过去几年被人写了无数遍了,因为过去版本里面python官方文档对super的解释非常有限而且有误导解释,直到2.6以后的文档,才详细说明了super在单继承和多继承的两种不同工作方式。当时苦逼的程序员甚至不得不去翻看Python源码才搞清楚是什么回事。以致几年来很多人对python的多重继承保持怀疑态度。 Python多重继承使用Method Resolution Order的动态算法来解决一个方法名的调用顺序,mro其实说来简单,就是一个深度优先的继承列表,很易理解,但随之来的是遇到互不相同的构造器__init__参数的问题。 Codepad运行结果:http://codepad.org/qQNiMzBl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class A(object): def __init__(self, arg1): print "init func in A, with arg1 '%s'" % arg1 super(A, self).__init__() class B(object): def __init__(self, arg1, [...]
Why 惯用版本管理的coder会发现,经常整理代码时候,要提交出一个完美的版本库还真不容易,有时候不仔细连语法错误的版本都commit进去了仓库,如果以洁癖的眼光看,这是不可容忍的: 仓库每个版本均可无错编译 每次提交的目的简单明了,不应多个不相关修改合在同一次commit 提交说明可以简单明了和修改了的代码联系起来 Mercurial 默认配置情况下不易做到这个,相比起git,hg没有git的index概念,一次commit可以经过多次记录才确认成一个版本。但是hg自带了个插件Mercurial Queue,功能上可比git更胜一筹。 考虑这么一个情况,在做新功能探索的代码,尝试到有一步成果了,但后面出现几种方案需要测试,暂时还不知道用那个。如果把目前的版本提交,又不成熟,不足以作为一个版本。有mq的话,直接qrefresh记录当前的修改,再随便折腾代码,不爽直接revert,这个记录还没有成为commit,直到最后觉得满意了,qfinish my_perfect_patch,才最后提交成一个版本。 另外一个情况,在开发新功能时候,代码改了一堆了,突然rp爆发,一眼就发现了以前版本留下的一个很隐藏的bug。 没有mq的话,你有3种方式处理: 记住!好大的BUG!完成这次功能,提交后再Fix掉! (然后忘了) 把这行代码的位置写到paster贴显示器上; 马上修正bug,继续写代码,最后提交版本的时候写: added xxxxxxx; fixed xxxxxx; 都不怎么靠谱吧,使用mq的话,这可不是什么问题: 暂停coding,记录下目前的进展,qrefresh,qpop出当前已有修改。 创建一个新的patch,qnew fix_xxx fix bug,qrefresh,qfinish fix_xxx。这时仓库里面已经有一个修好bug的版本了。 qpush回到刚才的状态,继续coding新功能。 “提交 commit”是版本管理里面一系列不可修改的历史,一旦提交后就不能修改他们的状态和顺序。mq里面的queue虽然也是历史的部分,但还没有永久成型,可以任意改变,直到成熟,可有效提高仓库中的版本质量。 不过使用mq后这个情况也有点改变,配置好mq后会有了一个邪恶的strip命令,可以从提交历史当中直接删除一个commit。虽然这显然是不尊重历史的,不过作为灵活特性,git也有这样的功能,毕竟特殊时候可以避免信息泄漏等事情。 How 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [...]
jQuery.Uploadify是个功能强大的文件上传控件,基于Flash(3.0兼容HTML5),作为前端使用是个不错的选择。 目前的前端技术中,能够实现跨域POST的成熟方案一般只有借助flash,这也是Uploadify的特点吧。 Uploadify的官方提供的是一个php的后端,后端需要做的事情相当简单,就是把POST的临时数据存放到指定路径。 有不少中文资料是把uploadify作为.net程序的上传控件,原理其实一样,所以用Python实现也是很简单的。 其实那些实现的后端(包括官方实现的php)都有安全性问题,比如限制文件类型、指定上传路径都可以在远端控制,上传个木马之类会导致服务器被入侵。当然这是因为他们提供的例子是半成品,实际使用起码应该加上session id的验证之类,因为上传时候数据是由Flash发出的,和浏览器的Session无关。 下面的Python例子中,则就如还在beta阶段的uploadify 3的开发日志讨论的,暂时忽略掉folder参数。 完整的例子代码可在我的仓库下载。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 import bottle bottle.debug(True) [...]
@felixonmars 点名要一份trac的最简易配置步骤,不过其实trac这样一个geek东西,即使按本文配置好跑起来后也依然是一套半成品,还有很多东西需要去看文档去配置,就像awesome, vim等,在一段陡峭的学习曲线之前,都不怎么好用。 所以其实本文也不会降低多少门槛,大概比直接看官方的guide安装的时候少点压力,但不一定是好事。 此前有在公司技术部内推广使用trac做项目管理的想法,做过了解,不过因为各种原因还是用不下来。赖勇浩的博客有一系列文章介绍trac,也包括了在公司环境使用的经验。 Trac作为一套web应用,其实部署步骤和此前介绍的MoinMoin, Mercurial很类似的。 以下步骤介绍安装包含多国语言的基本trac环境。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 [...]
Nginx团队维护的PPA源带有PHP 5.3.x的子源,更新迅速,现在在Ubuntu部署Nginx+PHP环境真是太容易了(虽然LAMP更容易,一句apt-get install lamp-server^搞定,别漏了最后的上尖号)。像以前那样跑cgi-fcgi简直弱爆了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 apt-get install python-software-properties add-apt-repository ppa:nginx/stable add-apt-repository ppa:nginx/php5 #Ubuntu 10.10 以后可不需添加以上源 apt-get update apt-get install nginx apt-get install php5-cgi php5-mysql php5-fpm php5-curl php5-mcrypt #或者你需要更齐全的php包: #aptitude install php5-cgi php5-mysql php5-fpm php5-curl php5-gd php5-idn php-pear php5-imagick [...]
Update Vimpress 已经升级到2.x版本,使用、配置都有改进,请关注在vim.org的插件页面: Vimpress had been updated to 2.x, usage and configurations are now different, read the officle page in vim.org: http://www.vim.org/scripts/script.php?script_id=3510 Hi guys, glad to know that many of you are having vimpress forked to improved it's power, while i'm also doing the same thing. I'm working on a version that had been refactored [...]
此前介绍用来编辑Wordpress的vim插件vimpress 现在加入了markdown支持,可以直接在vim中以markdown语法编写,使用新增的vimpress命令即可发布成格式清新的博客了。 还加入多博客支持。只需把需要管理的博客资料写到vimrc文件内,可以随时用BlogSwitch命令切换需要发布的博客。 还有加入编辑Wordpress的Page,不仅是Post,见BlogPageXXXX等几个命令。 另外是改进了插件在windows等平台的支持,自动转换gbk等为utf-8编码来编辑博客。 这次版本改进得到了Lenin Lee的代码贡献和测试,在此表示感谢! Markdown 介绍 Markdown 是一个很轻量的文本标记语言,其语法直接可翻译成HTML,便于用户编写和阅读,可以很方便地生成多级标题、链接、缩进、加粗、列表等等格式,实际上和通用的WikiText、reStructed等标记语言的语法都有一定的相通之处。 推荐:Markdown 语法 Vimpress的Markdown 命令 在Vim中用markdown书写好文章后,可以先使用:MarkdownPreview命令在浏览器里面看看编译效果。虽然这样的页面没有CSS修饰,但是文章的结构应该是清晰的,可重复修改。 然后使用:MarkdownNewPost命令,如果原文件中前10行有包含#符号开头的一行(即markdown语法中的header),会被复制成title,并跳转到vimpress的NewPost界面,就可以用:BlogSave publish发布了。 这个流程相当简单直接。 Vimpress的多帐号支持 该版本的博客信息要写入vimrc文件当中。通常, Linux下,该文件位于~/.vimrc; Windows下,C:\Program Files\Vim\_vimrc。 在该文件加入这样一行:(vimrc中的前置\是换行号) let VIMPRESS=[{'username':'user', \'password':'pass', \'blog_url':'http://your-first-blog.com/' \}, \{'username':'user', \'password':'pass', \'blog_url':'http://your-second-blog.com/' \}] 启动vim后vimpress默认使用了第一组的配置信息,使用:BlogSwitch命令可以在它们之间轮环切换。 下载 http://www.vim.org/scripts/script.php?script_id=3510 改进记录 2011 Mar. 24 [by Lenin Lee] Fix: use setl instead of set to set option value; Add: [...]
Page optimized by WP Minify WordPress Plugin