登录

Google App Engine 文件代码备份

June 16th, 2008

Google App Engine 不支持直接下载代码文件,所以我们无法直接将服务器上的代码进行备份。如果本地的代码一旦丢失,就很难找回,这点对GAE的用户来说,是相当麻烦的。

好在有人编写了一个工具,用于将GAE站点的代码打包成zip格式并下载

步骤如下:

1.在根目录下根据manatlan的代码建立zipme.py

2.在app.yaml中加入

- url: /zipme
  script: zipme.py

3.访问youapp.appspot.com/zipme

zipme.py脚本

#!/usr/bin/env python # -*- coding: UTF-8 -*- """ ########################################################################## ZipMe : GAE Content Downloader ########################################################################## Just add this lines in your app.yaml : - url: /zipme script: zipme.py ########################################################################## """ # manatlan from google.appengine.ext import webapp from google.appengine.api import users import wsgiref.handlers import zipfile import os,re,sys,stat from cStringIO import StringIO def createZip(path): def walktree (top = ".", depthfirst = True): names = os.listdir(top) if not depthfirst: yield top, names for name in names: try: st = os.lstat(os.path.join(top, name)) except os.error: continue if stat.S_ISDIR(st.st_mode): for (newtop, children) in walktree (os.path.join(top, name), depthfirst): yield newtop, children if depthfirst: yield top, names list=[] for (basepath, children) in walktree(path,False): for child in children: f=os.path.join(basepath,child) if os.path.isfile(f): f = f.encode(sys.getfilesystemencoding()) list.append( f ) f=StringIO() file = zipfile.ZipFile(f, "w") for fname in list: nfname=os.path.join(os.path.basename(path),fname[len(path)+1:]) file.write(fname, nfname , zipfile.ZIP_DEFLATED) file.close() f.seek(0) return f class ZipMaker(webapp.RequestHandler): def get(self): if users.is_current_user_admin(): folder = os.path.dirname(__file__) self.response.headers['Content-Type'] = 'application/zip' self.response.headers['Content-Disposition'] = \ 'attachment; filename="%s.zip"' % os.path.basename(folder) fid=createZip(folder) while True: buf=fid.read(2048) if buf=="": break self.response.out.write(buf) fid.close() else: self.response.headers['Content-Type'] = 'text/html' self.response.out.write("<a href=\"%s\">You must be admin</a>." % users.create_login_url("/zipme")) def main(): application = webapp.WSGIApplication( [('/zipme', ZipMaker)], debug=False) wsgiref.handlers.CGIHandler().run(application) if __name__ == "__main__": main()

这段代码会通过google的身份认证来判断访问者是否可以下载代码,所以不用担心代码泄漏。不过还是希望Google可以提供代码备份和数据库备份的功能。

LAX - Logilab App engine eXtension

June 15th, 2008

什么是 LAX ?

LAX (Logilab App engine eXtension) 运行在 Google AppEngine 环境的一套网站开发框架。

LAX 项目从2001年就开始开发了,最初是作为Logilab网站的一部分进行设计的。这个框架可以支持从不同的数据源获取数据,如数据库, LDAP ,版本控制系统等。. 现在他又可以直接支持 Google AppEngine了. 这个框架的内核据说是直接使用了Google提供的datastore api,而不是使用db.model或GQL,所以在GAE上使用时,性能相当不错。LAX是一个相当纯粹的Python框架,不依赖于其他第三方的组件。

我目前还没有太明白其有何优越之处,只是对如何使用datastore api提高生成数据模型的效率有点兴趣。

现在还没有很好的在线的例子,不过LAX将在随后发布一款社会网络风格(social-network-style)的网站作为实例,可以小小的期待一下。

这里是英文文档,感兴趣的朋友可以看看。

也可以看看现在官方的例子: http://lax.appspot.com

范跑跑之十不该(视频+歌词)

June 14th, 2008

范跑跑之歌II:范跑跑的十不该

词:刘蜀秋
曲:佚名
唱:慕容萱
一不该啊二不该,你不该地震时候跑那么快,
跑得快其实也没有关系呀,你不该不管学生让他们留下来。
三不该啊四不该,你不该跑了以后乐开怀,
乐开怀其实也没有关系呀,你不该洋洋得意把它写出来。
五不该呀六不该,你不该在网上发出来,
发表出来其实也没关系呀,你不该标榜自己有高尚情怀。
七不该呀八不该,你不该跑到网上为自己辩白,
自我辩白其实也没有关系呀,你不该得了便宜还要卖乖。
九不该呀十不该,你不该说你只把女儿来爱,
爱你女儿我们都支持你呀,你不该连你妈妈也不爱。
范跑跑啊你不该,你不该不管学生跑那么快,
你不该说自己有高尚情怀呀,你不该连你妈妈也不爱。
中国人我们该不该,搞清楚范跑跑的是非黑白,
一屋不扫何以扫天下的尘埃呀,美好世界不会自己从天上掉下来

范跑跑之歌(视频+歌词)

June 14th, 2008

歌词:
  范跑跑之歌
  有一个人,名字很奇怪
  他假装爱,自由自在
  爸爸妈妈,他都不爱
  他跑起来,比兔子还快
  你也许不知道,他爱坐而论道
  他的职业却是为人师表
  有一天正上课,突然间地震了
  所有学生他都不管了
  他冲出教室,撒丫子就跑
  范跑跑,他跑啊跑啊跑
  范跑跑,他跑啊跑啊跑
  范跑跑,他跑啊跑啊跑
  范跑跑,他跑啊跑啊跑

范跑跑和郭跳跳(二)

June 14th, 2008

郭跳跳

郭跳跳,又称“郭道德”,原名郭松民,法学硕士,因其在《一虎一虎谈》中与范跑跑的激烈交锋,一战成名。

其实,事前,几乎所有人都认为郭跳跳将以压倒性的优势将范跑跑贬的无地自容。估计,郭本人也是这样认为的,所以,在他认为这次访谈,只是过去怒骂就可以了。但这一点,显然不是《一虎一虎谈》节目组所需要的效果,“一虎谈”要的是辩论,是争锋相对,从节目组组织的论辩双方的阵容就可以看出来,重量级的人物几乎都是帮范跑跑来开脱说情的。很明显,节目组是怕范跑跑无力独自面对郭的指责,怕形成不了相互辩论的场面。

郭大侠,就这样上场了,期待着痛快淋漓的一场怒骂。可惜的是,他实在是小看了范的实力,几乎是没有做什么准备,或许在他纯理想主义的脑子里,根本就无法想象,范这样的落水狗,还有什么可以辩驳的地方,几乎就应该是让他来代表广大人民群众痛打的。

没有料到的是,范跑跑,虽然无耻,但竟然还是一个文化人,怎么说也是北大毕业,据说当年还是高考状元。第一个回合下来,郭大侠就相形见拙了,于是郭怒了,这是不应该的,你是不应该和我辩论的,你应该是来接受我的批判的,于是“畜生","杂种”之类的话,喷薄而出。于是我惊讶了,这人怎么这样啊,素质,注意素质!

其实,素质是一个问题,郭表现出来的辩论能力确实大有问题。从头到尾,他所辩驳的论据都相当的不知所谓,期间还不断的打断其他人的发言,更甚至于一度中途离场,特别是在辩驳一个女士的观点时,竟然举出如果“老师强奸女学生”的例子,老师强奸女学生,那是犯法的,范跑跑地震时逃命,能算犯法吗?根本就不值得一辩。而且这样粗俗的话,竟然能不加思索的脱口而出。我很怀疑他的法学硕士是如何得来的。我无语了,郭跳跳啊郭跳跳,你怎么就这么让我们失望呢?

我严重质疑凤凰卫视,组织这个节目的动机,更质疑其为什么要找郭跳跳,难道天底下的正义人士就只有郭这样的了吗?唯一的解释,只能是收视率。对,要的就是轰动,语不惊人死不休,郭和范,只是凤凰卫视的棋子而已。而最失望的肯定是郭,他在随后的文章"做客凤凰卫视:无悔愤怒"中写到:"当然,我在节目的录制现场,感觉不是这样的。那天我觉得自己像个敢于刺刀见红的战士,观众也给了我很多的掌声。节目录完后,还有不少观众围上来要求合影,签名,称赞我讲的好。但,为什么现在看起来不是这样呢?"

为什么呢,因为人都是虚伪的,在现场大多数人都会倾向于选择表现为道德的一面,而其实内心深处,并不认为自己也可以达到道德的高度(当然在郭眼里,那只是底线),所以在现场,不管你同不同意,都会选择对道德鼓掌,而不会为范跑跑欢呼。

是的,这就是大多数,总是表现得很道德而内心无视道德的大多数。

只有在网络,这个虚拟的世界,才会表现出真实的一面,所以网上贬郭的多于贬范的,也就一点都不奇怪了。

现代寓言故事:乌鸦和兔子

June 13th, 2008

一只乌鸦坐在树上,整天无所事事。一只小兔子看见乌鸦,就问:“我能象你一样整天坐在那里,什么事也不干吗?”乌鸦答道:“当然啦,为什么不呢?”于是,兔子便坐在树下,开始休息。突然,一只狐狸出现了。狐狸跳向兔子……并把它给吃了。


徐明观点:

要想坐在那里什么也不干,你必须坐(做)得非常非常高。

范跑跑和郭跳跳(一)

June 12th, 2008

范跑跑

范跑跑,是什么人?原名,范美忠,都江堰光亚中学的一个教师。因为在512汶川大地震后写博文,宣言自己不顾学生独自先跑的逃跑主义,被广大网民称为“先跑老师”又名“范跑跑”,“范没种”。

5月30日,离汶川大地震8天后,范美忠在其博客上撰文“那一刻地动山摇",其中,有些言论如:

我是一个追求自由和公正的人,却不是先人后己勇于牺牲自我的人!在这种生死抉择的瞬间,只有为了我的女儿我才可能考虑牺牲自我,其他的人,哪怕是我的母亲,在这种情况下我也不会管的。因为成年人我抱不动,间不容发之际逃出一个是一个,如果过于危险,我跟你们一起死亡没有意义;如果没有危险,我不管你们你们也没有危险,何况你们是十七,十八岁的人了!

受到网民的强烈谴责,并引起了关于教师道德和个体生命价值之间的大讨论。

我自认为没有资格去评判道德层面的东西,我感兴趣的是,范美忠,到底为什么要写这样的文章?

其实,作为人的一种本能,面对危险的时候,独自先跑,并没有太多可以谴责的地方,包括跑的时候没有叫学生一起跑,也情有可原,毕竟,扪心自问,假如我自己处在那样的环境之下,会有什么样的表现,我自己也无法判断。我知道世上有道德高尚的人,但从没有指望人人都能成为道德高尚的人,因为那是不现实的。无疑,范老师,只是一个普通人,而且是一个相当自私的人。

从我出生以来,我所受的教育,就告诉我,要当一个无私奉献的人。我们生活在共产主义的旗帜下,我们每个人都被要求要放弃私我,成就大我。这是道德层面的东西,和西方资本主义的以自我为中心是不一样的。但有一点,我必须指出,极端的自我和极端的无我,都是错误的,是不符合人性的规律的。我们宣传西方资本主义,常常把其宣传为极端的自我,极端的自由主义,其实不是这么回事,在西方只是保证个人在保护自身利益方面的权利,而并不提倡一种可以把自私作为标榜的行为。所以,范美忠老师的行为,是不符合西方主流价值观,而且是相当令人鄙视的行为。自私是不值得标榜的,那么范美忠老师为什么要冒天下的不韪呢?

有一些几点猜想:

  1. 想出名,不能流芳百世,但求遗臭万年
  2. 思想烈士,对道德绑架的反感,刺刺某些道德家
  3. 为自己的一段生命经历留下记录,一不小心,成了名人

对于第一点,是大多数的第一感觉,包含我在内,对于这样的人,这样的行为,我除了感到恶心,真的很难用其他语言来形容。但是,这样的看法,显示是高估了范同志的智慧了。你说他预感到这篇文章会使他才能为名人,这样的文章会激起社会上这么激烈的反应?我想不会。这是范美忠在灾后新建的一个博客,而那篇文章也是范老师所写的第一篇博文,这一点曾经让我非常困惑?因为这一点,很容易让人联想起,范美忠就是为了写这篇博文才建的这个博客,是为了出名有预谋有安排的行为,甚至怀疑像“兰姐姐骂90后”一样,是某些网站故意策划出来的。但仔细想想,这样的观点也靠不住脚,媒体再无耻,也还没有胆量拿地震相关的事情来恶搞吧?56的事情,就告诉我们,我们的政府是有底线的。

所以,我不觉得,范美忠老师是真的追求遗臭万年,也许,只是,想不到就这么臭了。

所以,范老师是不甘心就这么臭了的,在随后的我为什么写《那一刻地动山摇》中,范美忠老师俨然把自己打造成为一位思想烈士,什么对道德绑架的反感,刺刺某些道德家之类的?你有这么高尚吗?范跑跑,你不配做这样的斗士!

我清楚,所谓思想的革命,向来不是在世人所认为的高尚者中开始的.但是,范跑跑,自私和自由主义不是划等号的。西方的自由主义,强调个体的价值,但并不否定普世的价值,没有人胁迫你必须高尚,可也没有人允许你可以无耻。

对范跑跑先生的反感,其实很大一部分来自于他自己博客上公布的那张图片(请允许我以貌取人)。有网友评论,照片和行为一样的令人作呕。昨天,我看了"凤凰卫视《一虎一席谈》范美忠PK郭松民 完整版",视频上的范跑跑并没有那么不堪。所以,我的结论是,这是他故意的,他故意选择了自己最难看的一张照片,他是来恶心我们的!

范跑跑是一个愤青,是一个个人主义者,是“一头独立特行的猪”。

范跑跑是相当有追求的人,同时也是一个对现在的社会现状非常不满的人,所以他希望自己以一个另类的身份出现,所以他的头像,他的文章,必然有哗众取宠的地方。所谓语不惊人死不休,就是这样的。但是,要做思想的烈士,我相信他是没有那样的胆量的,而之所以现在被推到风口浪尖,纯属意外。

我想他的本意确实只是"为自己的一段生命经历留下记录",而因为向来的性格所致,文章中出现了一些故意的惊世骇俗的语言,被某些别有用心的人大肆宣传,成就了现在“猥名远播”的范跑跑。

我谅解临震脱逃的“范没种”,鄙视拿自私标榜自由的“范跑跑”,还有几分同情独立特行的“范美忠”。

优化Hostmonster运行环境

June 11th, 2008

Bash 配置文件

当我们要求登录Shell的时候,系统将会验证权限,设置运行环境并启动用户交互界面,在unix系统下,系统启动时一般会加载位于主目录或 /ect 目录下的bash文件。如果bash文件存在,就会接着依次查找 ~/.bash_profile, ~/.bash_login and ~/.profile, 并加载文件里的配置,如果这些文件都不存在,就使用 /etc/bashrc 

修改命令行参数

export LD_LIBRARY_PATH=$HOME/lib/
export PATH="$HOME/bin:$PATH"
source ~/.bash_profile

修改命令行提示符

只需要修改 ~/.bash_profile 文件中的PS1 变量.想要修改立即生效, 运行命令

. ~/.bash_profile

下面是命令行提示符中可用的参数意义

\a     an ASCII bell character (07)
\d     the date in "Weekday Month Date" format (e.g., "Tue May 26")
\D{format}  the format is passed to strftime(3) and the result is inserted into the prompt string; an empty format results in a locale-specific time representation.
\e     an ASCII escape character (033)
\h     the hostname up to the first `.'
\H     the hostname
\j     the number of jobs currently managed by the shell
\l     the basename of the shell's terminal device name
\n     newline
\r     carriage return
\s     the name of the shell, the basename of $0 (the portion following the final slash)
\t     the current time in 24-hour HH:MM:SS format
\T     the current time in 12-hour HH:MM:SS format
\@     the current time in 12-hour am/pm format
\A     the current time in 24-hour HH:MM format
\u     the username of the current user
\v     the version of bash (e.g., 2.00)
\V     the release of bash, version + patchelvel (e.g., 2.00.0)
\w     the current working directory
\W     the basename of the current working directory
\!     the history number of this command
\#     the command number of this command
\$     if the effective UID is 0, a #, otherwise a $
\nnn   the character corresponding to the octal number nnn
\\     a backslash
\[     begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
\]     end a sequence of non-printing characters

The command number and the history number are usually different: the history number of a command is its position in the history list, which may include commands restored from the history file, while the command number is the position in the sequence of commands executed during the current shell session. After the string is decoded, it is expanded via parameter expansion, command substitution, arithmetic expansion, and quote removal.

一些有用的命令行提示符配置
export PS1='\[\033[1;33m\]\u\[\033[1;37m\]@\[\033[1;32m\]\h\[\033[1;37m\]:\[\033[1;31m\]\w \[\033[1;36m\]\$ \[\033[0m\]'
user@host:~/bin/tools $
export PS1="\e[1;31m[\h]$NC \W > \[\033]0;\${TERM} [\u@\h] \w\]"
[lifesaver] tools >
export PS1="\n\e[1;37m[\e[0;32m\u\e[0;35m@\e[0;32m\h\e[1;37m]\e[1;37m[\e[0;31m\w\e[1;37m]\n$ \e[0m"
[user@host][~/bin/tools]
$
export PS1="\n[$?]\e[1;37m[\e[0;32m\u\e[0;35m@\e[0;32m\h\e[1;37m]\e[1;37m[\e[0;31m\w\e[1;37m]($SHLVL:\!)\n\[\033[0m\]\$ "
[0][user@host][~/bin/tools](1:2130) 
export PS1='[\u@\h:\w]\$ '

设置登录欢迎信息

在你的 ~/.bash_profile 添加一些可以执行的命令,在你登录的时候就会直接显示了

# 显示文本
echo 'hello'
# 显示日历
cal $(date +"%m") $(date +"%Y")
# 显示机器状态
echo -e "Machine stats"; uptime
procinfo|head -n 13|tail -n 11

为目录列表添加颜色

使目录,普通文件,压缩文件,链接文件显示不同的颜色

命令行:

vim ~/.bash_profile

复制下面的代码到 ~/.bash_profile:

# enable color support of ls and also add handy aliases
if [ "$TERM" != "dumb" ]; then
    eval "`dircolors -b`"
    alias ls='ls --color=auto'
    #alias rm 'mv \!* ~/TRASH'
    #alias dir='ls --color=auto --format=vertical'
    #alias vdir='ls --color=auto --format=long'
fi

编辑你自己的运行环境配置

命令行

vi ~/.bashrc

添加如下代码

export PATH=~/bin:$PATH

如果你使用 .bash_profile

命令行:

vi ~/.bash_profile

添加如下代码

. .bashrc

使用以下命令是修改立即生效.

. .bashrc

使用自己的运行目录

如果你使用上面介绍的命令,在你的根目录下将会生成许多文件夹,如果你不喜欢这种凌乱的样子,你可以创建一个目录用来存放执行目录和运行时库:

mkdir packages

设置PATH 和 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$HOME/packages/lib/
export PATH="$HOME/packages/bin:$PATH"

完整的例子请查看Unix account setup

禁止新邮件提醒

添加以下代码到 .bash_profile.

unset MAILCHECK

hostmonster下安装SVN服务端和客户端

June 10th, 2008

SVN是一个十分有用的版本控制程序,但是Hostmonster的主机默认是不支持SVN的,这一点对于经常要研究开源项目,管理自己开发的网站的人来说,无疑是十分痛苦的。我经过一整天的努力,终于找到了在Hostmonster上安装并使用SVN的方法,不敢吝啬,拿出来大家共享。

目标:在hostmonster主机上部署安装SVN服务端和客户端

前提:如何您还没有申请hostmonster的ssh访问权限,请先去通过live chat或email申请

1.下载并解压缩SVN1.4.6:

$ wget http://subversion.tigris.org/downloads/subversion-1.4.6.tar.bz2 
$ wget http://subversion.tigris.org/downloads/subversion-deps-1.4.6.tar.bz2 
$ tar xjf subversion-1.4.6.tar.bz2 
$ tar xjf subversion-deps-1.4.6.tar.bz2 
$ mkdir svn

2.配置编译选项,安装SVN

    下面是选项的意义:

  • –prefix: 告诉 “make install” 要安装到哪里
  • –with-expat=builtin: 因为在hostmonster主机上 apr-utils (included in subversion deps) 不能正常安装,所以使用bulitin来代替
  • –with-ssl:  支持https .
  • –with-pic: 编译所有位置依赖代码(“Position Independent Code”)如果不设置,在Hostmonster上将会有库链接错误.

接下来

$ cd subversion-1.4.6 
$ ./configure –prefix=$HOME/svn –with-expat=builtin –with-pic –with-ssl 
$ make 
$ make install

3.看看Subversion是否正常工作 ?

$ cd 
$ svn/bin/svn --version 
svn, version 1.4.6 (r28521) 
compiled May 20 2008, 09:47:21 
…
$svn/bin/svnadmin create svntest

4.如果想要在任何地方都能使用SVN命令,请修改.bashrc 文件.增加如下行:

export PATH=~/python/bin:~/svn/bin:$PATH

注意: 请务必在.bashrc中增加,因为在svn通过ssh访问时默认只加载这个文件,而不会加载.bash_profile文件

5.接下来,做一些清理工作

$ rm subversion-1.4.6.tar.bz2 
$ rm subversion-deps-1.4.6.tar.bz2 
$ rm -rf subversion-1.4.6/

提示:
到这里,我们已经可以正常使用SVN客户端了,如果可以用svn co http://xxxx.xx.xx 这样的命令从网上直接下载开源项目的源代码;我们还不能直接从本地使用如TortoiseSvn这样的客户端软件,hostmonster上的SVN-http服务。
由于Hostmonster禁止用户为Aapche添加模块,所以我们无法为其添加SVN的http支持,唯一的办法,只能通过SVN-SSH的方式来访问版本库。

6.配置TortoiseSvn

TortoiseSvn-网络-设置-ssh客户端,使用如下参数:TortoisePlink.exe -l xxx -pw xxx

7.试试SVN检出
svn-ssh检出路径为: svn+ssh://[用户名]@[网址]/home/[用户名]/[SVN仓库路径]

如,刚刚创建的svntest路径为:svn+ssh://xuming@www.xuming.net/xuming/svntest

大功告成,现在已经可以在hostmonster上使用svn客户端,也可以将hostmonster作为自己的svn服务器了。

PS:为了更加安全,你可以使用ssh密钥来访问hostmonster主机,hostmonster的控制面板中支持ssh密钥的生成和导入

参考:
http://fitri.manzanisimo.net/2008/05/23/hostmonster-python-25-subversion-14-django-svn-mysqldb-fcgid/

http://www.bluehostforum.com/showthread.php?t=8191

http://wiki.dreamhost.com/Environment_Setup

http://tortoisesvn.net/ssh_howto

开始Google App Engine之前应该做的事

June 9th, 2008

虽然Google已经尽可能使GAE的安装和运行变得简单,但是自本博开始介绍GAE以来,还是不断有朋友反映入门教程中的例子无法运行。而有时候其实并不是很复杂的问题,所以这一篇准备说一说,在开始Google App Engine项目之前,我们应该预先做些什么准备工作。(本文以windows下的安装为例,因为我觉得既然是能搞得定unix或mac之类的用户,大概也不需要看我在这里罗嗦了)

  1. Google App Engine目前只支持Python环境,所以你先要安装好你的Python运行环境。到Python官方网站下载window版本,(当前最新版本是2.5.2)这是一个标准的windows安装程序,按照提示安装就可以了。安装完后,进入命令提示行,敲入python,应该显示如下:
    Python 2.5.2 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on
    win32 Type "help", "copyright", "credits" or "license" for more information.
    >>>
  2. 如果python命令提示无效命令,那么有可能是系统无法找到相关文件,你可以将Python的安装路径加入到系统的path路径中。
  3. 请检查.py文件是否已经和python.exe关联起来了,如果没有,您可能需要重新启动一下机器
  4. 下载 Google App Engine SDK Windows installer 并安装
  5. 添加系统环境变量‘APP_ENGINE_HOME’ 设置它的值为GAE的安装路径 (通常安装路径为C:\AppEngine)
  6. %APPENGINE%\;%APPENGINE%\lib;%APPENGINE%\lib\yaml\lib;%APPENGINE%\lib\webob;加入到系统PATH变量或PYTHONPATH变量里面,以方便自己可以在任何地方运行GAE控制程序


订阅

google reader 抓虾
bloglines my yahoo
哪吒 鲜果
* 更多订阅本站方式请看 订阅帮助