为四川人民祈祷! www.onefoundation.cn
logo of kjam.org

一键部署

对于快速原型项目, 一键部署能提升开发者的效率

Google App Engine的appcfg.py就是被开发人员喜爱的工具, 只需一条命令就可以将当前开发环境的代码玩玩整整的克隆到服务器上.

不过, 一条命令部署不等于一键部署, 我们要努力让开发人员更加简单的搞定一切.
我们如何来实现更加简单的部署?

拿django开发来说, 由于自带开发服务器, 我们在项目下建立两个命令
server.bat和upload.bat 使用.bat扩展名的原因是为了兼容window开发人员
对于linux开发人员, 启动开发服务器只需要打开终端进入项目目录输入
sh server.bat
在部署的时候输入
sh upload.bat

OK. 那么拿django来说, server.bat的内容就是
python manage.py runserver

而upload.bat的内容或许就是
scp -R . user@myhost.com:/home/user/proj


重要的是约定, 团队成员在拿到每一个项目的源代码的时候, 都可以快速的启动项目的测试服务器, 无论项目采用的是什么框架, 或者采用什么样的方式部署到哪台服务器, 都可以让开发人员有机会忽略一定的细节, 省略重复劳动, 高效完成任务.

除了GAE的专用的工具支持一条命令部署以外, 大部分开发人员还在与ftp客户端一同工作. 切换到编辑器, 修改代码保存; 切换到浏览器, 观察效果; 切换到终端查看debug信息; 切换到Filezilla, 上传代码. Filezilla的图形化操作, 往往不能被写入到命令行中, 我们可以使用其他的方法:

在某些大型项目中, 常常使用的部署流程, 比如: 修改代码, svn checkin, code review, 最后在终端中ssh到服务器后svn checkout来部署. 这种方式融合了版本管理和服务器部署, 而且可以即时删除无用的代码. 这种方法, 我们可以将ssh的命令行写在upload.bat中
ssh user@myhost.com 'cd ~/proj/;svn up'

相对而言, 较小的项目通过rsync, 比起svn方式来更加简洁, 一条命令就可以实现. rsync需要服务器的支持, 不过不像我们想象的那样, 需要服务器上打开独立的tcp端口. rsync只需要ssh支持就可以工作.
rsync -avz . user@myhost.com:/home/user/project/ --exclude "*.pyc" --exclude ".*" --delete

最后, 当服务器不能安装rsync, 我们只能使用scp来覆盖服务器上的一切文件了.
comments: 1  
by kernel1983

SMTP on Leopard

Leopard 上预装了 postfix, 但是smtp 服务 25 端口没有打开, 默认只能用 sendmail 发送邮件

PHP没有问题, 发送邮件可以用 sendmail 或者 smtp.
Python 倒是没有支持的那么完善, smtp 用到 smtplib, sendmail 命令则没有包装

解决方法有两种
自己写一个函数包装一下sendmail
def sendmail():
    sendmail_location = "/usr/sbin/sendmail" # sendmail location
    p = os.popen("%s -t" % sendmail_location, "w")
    p.write("From: %s\n" % "from@somewhere.com")
    p.write("To: %s\n" % "to@somewhereelse.com")
    p.write("Subject: thesubject\n")
    p.write("\n") # blank line separating headers from body
    p.write("body of the mail")
    status = p.close()
    if status != 0:
        print "Sendmail exit status", status

或者打开 smtp 端口
sudo postfix start
测试一下
telnet 127.0.0.1 25
不用的时候关闭
sudo postfix stop
comments: 0  
by kernel1983

GAE Java

最近GAE Java横空出世, 给了我一个读读Java代码的适当理由

对于xml天马行空的Java框架世界以及J2EE我是完全一头雾水, 不过基本的Servelet/JSP我还是有点模糊印象, 下载了GAE Java SDK以后, 找了最简单的示范代码来阅读.

JSP文件会被先转为servelet, 最终被编译成class文件, servelet代码也很好认识, 看到doGet/doPost这样的方法, 就能够猜出大概含义.
另外在我们经常使用的web framework中的url dispatch, 也可以从web.xml体现出来, 不过不知道它功能上是不是可以更加灵活一点, 比如支持个正则表达式什么的.
ORM的话, 这次从GAE的文档上就可以看出, 是通过JDO来支持google datastore.
Google之前的GWT似乎也派上了用场, 要是你只擅长写java的话.
这么看来, 该有的都有了, 基本不需要其他的框架. 或许有朋友会在上面部署spring或者struts, 实现MVC, 全凭个人喜好.

另外, 我发现初学者如果在google搜索spring或者struts, 往往会被大量的口水误导, 或许这辈子都搞不清楚那些是什么玩意. 首先要打好servelet基础, 然后要去他们的官方网站, 比如struts 读它的 hello-world, 才会最快的上手.

总的来说, GAE Java还是相当 KISS 的, 通过Java Servelet支持Java世界中的everything, 和GAE Python通过支持WSGI标准来支持几乎所有的python框架一样.

Web Serverside差不多各种语言都有演绎, 大多都在重复相同的思路, 已经没有什么悬念.
相比而言Clientside前端编程只有Javascript一家独大, 并且还有较大的空间可以挖掘.
Webkit的趋势越来越好, 相信在不久的将来会一统desktop和mobile, 让我们拭目以待.
comments: 1  
by kernel1983

Sizzle

/*!
 * Sizzle CSS Selector Engine - v0.9.3
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 */

在jQurey 1.3.x 代码中找到的注释, 一个更加轻量级的js框架 Sizzle. 如果有时候你觉得 jQurey 还是太大了, 就用这个吧!

OK, 说说这次我为什么又跑去看 jQuery 代码, 主要是为了搞清楚一个问题:
首先, 如果html里面有一个div和一个span指定了相同的id怎么办? getElementById 毫不客气, 只认第一个.

在 jQurey 中, 如果你要选择后面那个元素, 那么$('span.id_name')或许是我们的另外一个选择, 这时我们享受了框架给我们提供的便利.
仔细想想, 框架一定不是简单的包装了 getElementById 这个常用函数, 它一定做了很多额外工作.

在jQuery 1.3.x 中 CSS Selector Engine 这样的工作被交给了 Sizzle 来完成, 查看 1.2.x 的代码则发现是 jQuery 自己做了这部分功能.
这也是为什么 1.3.x 宣称自己有着更好性能的原因.
comments: 3  
by kernel1983

MOD_WSGI 与 no such table

使用mod_wsgi的时候遇到了错误 OperationalError: no such table: django_session
开始还怪罪于mod_wsgi可能有未知bug

终于在google group里找到了问题所在
http://groups.google.com/group/django-users/browse_thread/thread/2d9f25383a97bc6e?pli=1

翻译一下:
出现这种问题最大的的可能是在设置DATABASE_NAME的时候没有使用绝对的路径,
如果sqlite3找不到数据库文件, 它会自己尝试创建一个空的数据库文件.

OK, 把settings.py中的数据库文件名换成绝对路径就OK了.
错怪了mod_wsgi, 现在看来mod_wsgi在hosting python项目的时候还是相当值得信赖的,
已经可以完全取代古老的fastcgi和mod_python技术, 成为apache的新一代贴身伴侣.

对于性能需求高的大型站点, 或许scgi仍然是不二选择, 服务器方面也轻装上阵, 忘掉apache选择lighttpd吧.



补充一点, 除了 sqlite 数据库以外, settings.py 中用到的路径在 mod_wsgi 下最好都不要使用相对路径, 比如 TEMPLATE_DIRS
comments: 1  
by kernel1983
1234567...26