2008年11月28日星期五

[转载] Python : 50个能够满足所有需要的模块

catswhocode.comjbj 写道:我很喜欢Python,Python具有强大的扩展能力,我列出了50个很棒的Python模块,包含几乎所有的需要:比如Databases,GUIs,Images, Sound, OS interaction, Web,以及其他。推荐收藏。

Graphical interface wxPython http://wxpython.org
Graphical interface pyGtk http://www.pygtk.org
Graphical interface pyQT http://www.riverbankcomputing.co.uk/pyqt/
Graphical interface Pmw http://pmw.sourceforge.net/
Graphical interface Tkinter 3000 http://effbot.org/zone/wck.htm
Graphical interface Tix http://tix.sourceforge.net/
Database MySQLdb http://sourceforge.net/projects/mysql-python
Database PyGreSQL http://www.pygresql.org/
Database Gadfly http://gadfly.sourceforge.net/
Database SQLAlchemy http://www.sqlalchemy.org/
Database psycopg http://www.initd.org/pub/software/psycopg/
Database kinterbasdb http://kinterbasdb.sourceforge.net/
Database cx_Oracle http://www.cxtools.net/default.aspx?nav=downloads
Database pySQLite http://initd.org/tracker/pysqlite
MSN Messenger msnlib http://auriga.wearlab.de/~alb/msnlib/
MSN Messenger pymsn http://telepathy.freedesktop.org/wiki/Pymsn
MSN Messenger msnp http://msnp.sourceforge.net/
Network Twisted http://twistedmatrix.com/
Images PIL http://www.pythonware.com/products/pil/
Images gdmodule http://newcenturycomputers.net/projects/gdmodule.html
Images VideoCapture http://videocapture.sourceforge.net/
Sciences and Maths scipy http://www.scipy.org/
Sciences and Maths NumPy http://numpy.scipy.org//
Sciences and Maths numarray http://www.stsci.edu/resources/software_hardware/numarray
Sciences and Maths matplotlib http://matplotlib.sourceforge.net/
Games Pygame http://www.pygame.org/news.html
Games Pyglet http://www.pyglet.org/
Games PySoy http://www.pysoy.org/
Games pyOpenGL http://pyopengl.sourceforge.net/
Jabber jabberpy http://jabberpy.sourceforge.net/
Web scrape http://zesty.ca/python/scrape.html
Web Beautiful Soup http://crummy.com/software/BeautifulSoup
Web pythonweb http://www.pythonweb.org/
Web mechanize http://wwwsearch.sourceforge.net/mechanize/
Localisation geoname.py http://www.zindep.com/blog-zindep/Geoname-python/
Serial port pySerial http://pyserial.sourceforge.net/
Serial port USPP http://ibarona.googlepages.com/uspp
Parallel Port pyParallel http://pyserial.sourceforge.net/pyparallel.html
USB Port pyUSB http://bleyer.org/pyusb/
Windows ctypes http://starship.python.net/crew/theller/ctypes/
Windows pywin32 http://sourceforge.net/projects/pywin32/
Windows pywinauto http://www.openqa.org/pywinauto/
Windows pyrtf http://pyrtf.sourceforge.net/
Windows wmi http://timgolden.me.uk/python/wmi.html
PDA/GSM/Mobiles pymo http://www.awaretek.com/pymo.html
PDA/GSM/Mobiles pyS60 http://sourceforge.net/projects/pys60
Sound pySoundic http://pysonic.sourceforge.net/
Sound pyMedia http://pymedia.org/
Sound FMOD http://www.fmod.org/
Sound pyMIDI http://www.cs.unc.edu/Research/assist/developer.shtml
GMail libgmail http://libgmail.sourceforge.net/
Google pyGoogle http://pygoogle.sourceforge.net/
Expect pyExpect http://pexpect.sourceforge.net/
WordNet pyWordNet http://osteele.com/projects/pywordnet/
Command line cmd http://blog.doughellmann.com/2008/05/pymotw-cmd.html
Compiler backend llvm-py http://mdevan.nfshost.com/llvm-py/
3D VPython http://vpython.org

还有其他好的模块需要加入这个列表吗?欢迎留言。


--
郎啊郎别太忙 | langalang.blogspot.com

2008年11月24日星期一

Komodo is using Scintilla

Komodo是一个基于Mozilla XUL平台的优秀的程序代码编辑器,免费版是Komodo Edit,收费版是Komodo IDE。
收费版多了项目管理、代码仓库等团队协作的功能,比如svn,git;还有代码自动美化等等。
闲来无事,用Spy++看了看他用的什么编辑器框架,居然是Scintilla

我说新版Komodo为什么这么强大了,原来,原来......
暗渡陈仓!

用开源的代码编辑器的工具还有很多,比如Notepad++,Notepad2等,还有wxWidget(wxPython)所用的editor部件,都是基于Scintilla。商业化的e-texteditor也是用的Scintilla(通过wxWigdet封装了)。

开源的力量是强大。并且强者恒强,有限的力量都集中到相关领域第一的项目上去。其他的,渐渐被人遗忘。

今天是在找一个轻巧但是强大的代码编辑器,本来e-texteditorTextMate的win平台的替代品,基本上绑定了王道的TM宏,但是他是商业产品。本来还有一个也是号称TextMate的替代品,intype,也是完全兼容TextMate的宏,开源产品,无奈,开发的就一个人,一年更新一次,问题还很多,基本也就是看看代码。

jEdit基本无人问津了,Eclipes太笨重了,Netbeans开发LAMP又太臃肿了。

Vim定制性是很强,但是对于它的键盘设定、整套哲学无法水乳交融的融入。曾经花了大力气学习快捷键,学了忘,忘了学。现在基本上就用它看看代码。免得忘记了linux下的vi命令。保持一个联系的渠道。

其实Mac平台的TextMate很好的,可惜,Mac这个big toy目前玩不起。
Mac平台的兄弟们,还是你们幸福啊。

其实,我对脚本程序编辑器要求不高,就两点:
1、兼容TextMate的宏;
2、编辑器能调成美观养眼的黑色theme。

Windows下的TextMate,你在哪里?


附:E - Windows版的TextMate终于来了!

--
郎啊郎别太忙 | langalang.blogspot.com

Google App Engine 的限制



CPU Used
0%
0.00 of 199608.00 Gigacycles (0%)
Data Sent
0%
0.00 of 2048.00 Megabytes (0%)
Data Received
0%
0.00 of 2048.00 Megabytes (0%)
Emails Sent
0%
0.00 of 2000.00 Emails (0%)
Megabytes Stored
0%
0.01 of 500.00 Megabytes (0%)
Data Sent (HTTPS)
0%
0.00 of 2048.00 Megabytes (0%)
Data Received (HTTPS)
0%
0.00 of 2048.00 Megabytes (0%)
以上是app engine的限制。CPU的是Gigacycles,么样衡量?

--
郎啊郎别太忙 | langalang.blogspot.com

在google appengine 上架站成功

网址在这里:
http://alang.appspot.com

Google App Engine是什么?
简单说,是google的云计算平台。什么是云计算?
和你费那么多话干什么,简单直接的说,就是google提供的500MB空间、数据库无限、2G每天流量、共享google庞大数据服务器资源的一个永远免费的建站空间。提供了本地模拟开发测试环境,一键式更新上传网站。
目前数据库使用的是google特色的Bigtable;用户管理基于google账户;默认模板系统基于django的模板。很爽,很强大。

目前暂时放了一个blog程序上去,使用的是徐明的micolog。管理界面脱胎于wordpress,可以导入wordpress的备份导出文件。
Google App Engine上的blog程序很多,并且有趣的是来自中国人的居多,但功能简单。
我最开始使用的是老外的potlatchblog,他依赖的库很多,django,demisaucepy等等,看demo功能很强,但是跑不起来,报一堆错误,一点点的搞,一点点的搞,最后放弃。特别是网站打包发布的那个版本,里面掉了django_helper.py,后来又装上git去把最新的代码clone下来,有是有了,但是django的版本问题又来了,他的网站上没有说django要用那个版本,试了试GAE自带的0.92版,不成。运行报错。

由于Google App Engine目前只能使用Python语言来开发,已经被我放弃了的python又拿起来了。
完全使用Google App Engine自带的库,太过于原始了,很多人推荐使用已有的python下的web框架,但是说实话,没有一个有Ruby on Rails那么优雅、敏捷、强大、完备的。django,算了,语法怪异,部署困难。今天看了一下web.py,卖糕的,一堆东西不支持,session/cache/flash,最新的0.3说是支持了。相对于Ruby on Rails来说,几乎是残废了,也敢出来混。

在Google App Engine的issue列表里面,希望能有java语言支持排在第一位,已经有1900多个回复了。排在后面的无一不是别的语言。

个人猜测GAE其实脱胎于Google内部的一些通用的python工具和平台,再加上google天生的负载均衡系统,导致python非常适合做一个host环境,可以应用google已有的强大的产品,比如bigtable,gmail,gtalk,search engine,opensocial等等,整合起来,开箱即用,快速的开发稳固的应用。并且,最重要的是,刚好赶上了云计算这一波热潮。

夜了,感觉说话都没有逻辑性,乱扯一通。睡觉。

提醒:使用micolog作为博客程序,不要选择xuming这个theme,那图片全是徐明的。用默认的是英文界面,改改html就成。

我准备扩展一个最看重的功能:email post,就是通过email发博,目前支持的有blogger/space/wordpress。这样非常适合我这种"一稿多投"的人。 就在这个micolog上改,目前还没有想好方案。

当然,用GAE来做blog,太浪费了,想想有什么值得去实现出来的idea。
不厚道的想,先克隆我兄弟前不久上线的寻物启事网站:完璧归赵/。我就用简单易用的脚本语言来实现笨拙的asp.net实现的功能,气死他,哈哈。

--
郎啊郎别太忙 | langalang.blogspot.com

2008年11月23日星期日

[转载]Google App Engine入门指南

译文原始出处不可考。保留译者信息。

原文网址:
http://code.google.com/appengine/docs/gettingstarted/
翻译者:
otherrrr@gmail.com

(注:转载请告知我一声,谢谢!)

(注:在我翻译的同时,版本从1.0.0升到了1.0.1,
我还没有发现文字有什么变化,但是有可能有些许不同)

入门指南

本教程描述了如何使用Google App Engine开发和部署一个简单的项目。
作为案例项目的"用户留言簿"演示如何使用各种App Engine服务,
这些服务包括数据存储和Google用户服务。

本教程包括下列部分:
・介绍
・开发环境
・Hello, World!(译注:这个不用翻译吧)
・使用webapp框架
・使用用户服务
・使用webapp处理表单
・使用数据存储
・使用模板
・使用静态文件
・上传你的程序

(译注:小节名会用"#"来标注,小小节名会用"##"来标注)
# 介绍

欢迎使用Google App Engine!创建一个App Engine程序非常容易,
而且只需要花费很少的时间。它是免费的,只需要上传你的程序,
马上就能和使用者来分享,不需要任何费用和许可。

在本教程中,会创建一个简单的用户留言簿程序,可以让用户发表
信息到一个公共的信息版。用户可以匿名发表,也可以使用他们的
Google帐户。

用户留言簿程序会演示如何使用App Engine数据仓库,如何将App
Engine程序和Google帐户结合起来,以及演示如何使用一个简单的
Python Web框架。这个Web框架已经包含在App Engine中,即:webapp。
这个程序也会演示如何使用Django模板引擎。
(译注:原文在每个小节之后会有一个"Next",有些承上启下的文字,未译)

# 开发环境

使用Google App Engine开发和上传程序需要用到App Engine软件开发包(SDK)。

SDK包括Web服务器程序,该程序用来模仿App Engine环境,包含一个本地的数据库、
Google帐户以及获取URL的能力和使用App Engine API来从你的电脑上直接发送Email。
SDK可以运行在任何安装Python 2.5的电脑上,提供的版本包括Windows、Mac OS X和
Linux。
(译注:不知道是不是应该把App Engine翻译成程序引擎?)

如果没有安装Python 2.5,请从Python的官方网站(http://www.python.org/)下载
和安装对应操作系统的版本。Mac OS X 10.5 Leopard用户已经直接安装了Python 2.5。

下载App Engine SDK(http://code.google.com/appengine/downloads.html)。
按照下载页面的提示来安装SDK到你的电脑上。

对于本教程来说,你会使用到SDK中的两个命令:

・dev_appserver.py,Web服务器开发
http://code.google.com/appengine/docs/thedevwebserver.html
・appcfg.py,用来上传你的程序到App Engine
http://code.google.com/appengine/docs/appcfgpy.html

Windows和Mac OS X安装程序会把这些命令直接放到命令路径中。
安装完成之后,你可以直接从命令行窗口下运行这些命令。
(译注:在Windows下是命令提示符)

如果你使用SDK的Zip文档版本,你会在google_appengine目录下发现这些命令。

# Hello, World!
Google App Engine程序和Web服务器之间使用CGI标准进行交互。
(查看CGI标准:http://hoohoo.ncsa.uiuc.edu/cgi/interface.html
当服务器收到你的程序的一个请求时,它使用请求的数据来运行程序
并处理标准输入流(对于POST数据来说)。作为相应,应用程序写响应到标准
输出流中,包括HTTP头和内容。
(译注:这一段翻译的不好)

让我们来实现一个小小的程序:显示一段信息。

## 创建一个简单的请求处理器

创建一个名为helloworld的目录。本程序的所有文件都放置在这个目录中。

进入到helloworld目录中,创建一个名为helloworld.py的文件,并添加如下代码:

print 'Content-Type: text/plain'
print ''
print 'Hello, world!'

这个Python脚本响应一个请求,这个响应包括描述内容类型的HTTP头、一个空行
以及信息"Hello world!"。

## 创建配置文件

App Engine应用程序有一个名为app.yaml的配置文件。
此文件描述了哪个处理器(handler)脚本对应哪个URL。

在helloworld目录中,创建一个名为app.yaml的文件,并添加如下内容:

application:helloworld
version:1
runtime:python
api_version:1

handlers:
- url:/.*
script:helloworld.py

从上至下,配置文件依次说明了关于程序的下列信息:
・应用程序的标识符是"helloworld"。当你使用App Engine注册你的应用程序时,
在最后一步你会选择一个唯一的标识符,并更新这个值。这个值在开发阶段
可以是任意值。从现在开始,将它设置为"helloworld"。
・版本号"1"是这个应用程序的编号。如果程序更新到了新的版本,App Engine会
保留前面的版本,可以用管理控制台回溯至前面的版本。
・这个代码运行在"python"运行环境下。不久的将来会支持其他运行环境和语言。
・每一个对URL的请求的路径会匹配正则表达式"/.*"(这个正则表达式表示所有的
URL),这将会由"helloworld.py"脚本来处理。
(译注:上面的小节中引号部分在原文中均为绿色,指代上上小节中的代码)
(译注:第一行application后面不能加"_",比如"hello_world"就不行)

这个文件的语法是YAML
http://www.yaml.org/)。
若要查看完整的配置选项列表,请查看app.yaml参考
http://code.google.com/appengine/docs/configuringanapp.html)。

## 测试应用程序
使用处理器脚本和配置文件会将每个URL映射至处理器,这样程序就算是完成了。
现在你可以使用App Engine SDK中包含的Web服务器来测试这个程序了。

使用下列命令启动Web服务器,路径为helloworld的目录:

google_appengine/dev_appserver.py helloworld/
(译注:注意目录名不能包含空格,比如放置在桌面就不行)
(译注:我是在google_appengine目录下,输入:python dev_appserver.py hellworld,
然后问是否更新,我看到最新版本是1.0.1了,但是我这里因为网络问题更新不了)

这个Web服务器开始运行,可以监听8080端口的请求。
通过在浏览器中访问下面的地址来测试这个程序。

http://localhost:8080/

想要了解更多关于运行开发Web服务器的信息,包括如何修改使用的端口,
请查看Dev Web服务器参考
http://code.google.com/appengine/docs/thedevwebserver.html),
或者运行命令时附加选项:--help。

## 迭代开发

你可以在开发程序的过程中保持Web服务器一直在运行。
Web服务器会监视源程序的变化,并在适当的时候重载它们。

试一下:保持Web服务器在运行中,编辑helloworld.py文件,将其中的Hello, world!
改为其他语句。刷新http://localhost:8080/就可以看到变化。

若要关闭Web服务器,在终端窗口激活的情况下,按下Control-C
(或Control-Break)。

你可以保持Web服务器一直运行,因为教程的后面还会用到。
如果你需要停止它,你可以重启它通过运行上面的命令。

# 使用webapp框架

CGI标准非常简单,但是手写全部的代码还是非常笨重的。
Web应用程序框架就会替你处理这些细节,这样你就可以只关注于你的应用程序功能。
Google App Engine支持任何使用纯Python编写的支持CGI的框架
(以及任何使用CGI适配器的WSGI框架),包括Django、CherryPy、Pylons和web.py。
你可以选择你的程序代码绑定到一个框架,只需要将代码复制到程序目录中。
(WSGI:http://www.python.org/dev/peps/pep-0333/
(Django:http://www.djangoproject.com/
(CherryPy:http://www.cherrypy.org/
(Pylons:http://pylonshq.com/
(web.py:http://webpy.org/

App Engine包括一个简单的Web程序框架,名为:webapp。
webapp框架已经安装在App Engine环境和SDK中,所以你不需要绑定它,
可以直接在应用程序代码中使用。在教程的后续部分中,我们会使用webapp。

## Hello, webapp!

一个webapp应用程序由三个部分组成:
・一个或多RequestHandler类,用来处理请求和创建响应
・一个WSGIApplication实例,用来将输入请求连到基于URL的处理器
・使用CGI适应器运行WSGIApplication的主程序

让我们重新写我们的"友好的问候"(译注:这里指Hello world,幽默一下),
作为一个webapp程序。
编辑Helloworld/helloworld.py,并用下面的内容来进行替换:

import wsgiref.handlers

from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')

def main():
application = webapp.WSGIApplication(
[('/', MainPage)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
main()
(译注:我第一次看有人用两个空格作为缩进)

在浏览器中刷新http://localhost:8080/,可以看到新版本的运行结果。
(如果你已经停止了你的Web服务器,请重新启动它,
具体的命令在"Hello, World!"章节中有介绍)

## webapp做了什么

webapp模块在google.appengine.ext包中。
这个模块在SDK中提供,也在生产运行环境中。

代码定义了一个请求处理器"MainPage",并映射到根URL(/)。
当webapp接收到一个HTTP GET对URL"/"的请求时,它会实例化MainPage类,
并调用这个实例的get方法。在这个方法中,关于请求的信息可以被self.request
所调用。例如:这个方法为每个响应来设置self.response的变量,然后退出。
webapp在MainPage实例的最后阶段发送一个响应。

应用程序本身由webapp.WSGIApplication实例来呈现。
参数debug=true传递到构造器,通知webapp打印出浏览器输出的栈跟踪,
当然前提是如果处理器遇到错误或引发一个为捕捉的异常。
在你的程序的最终版本中,你会去除这个选项。

代码使用了来自Python标准库的wsgiref模块来运行WSGIApplication,即一个
CGI适应器。想要了解这个模块更多的信息,请访问wsgiref模块文档
http://docs.python.org/lib/module-wsgiref.html)。

在本教程的后面我们会用到webapp的一些其他功能。
想要了解webapp的更多信息,请查看webapp参考
http://code.google.com/appengine/docs/webapp/)。

# 使用用户服务

Google App Engine提供很多有用的服务,这些服务都基于Google基础构造,
(注:我将infrastructure翻译为基础构造,
但是我理解的是Google的一些基础服务及文件)
可以通过SDK中包含的库来使得程序可以访问这些服务。
其中的一个服务就是用户(User)服务,这个服务可以使你的程序和
Google用户帐户进行整合。
使用用户服务,你的用户可以使用他们已有的Google帐户来申请你的应用。

让我们看看用户服务是如何定制应用程序的个性化问候。

## 使用用户(Users)

再次编辑helloworld/helloworld.py,
使用下面的内容进行替换:

import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):
def get(self):
user = users.get_current_user()

if user:
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, ' + user.nickname())
else:
self.redirect(users.create_login_url(self.request.uri))

def main():
application = webapp.WSGIApplication(
[('/', MainPage)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
main()

在浏览器中重新加载页面。
你的程序会重定向到一个本地版本的Google登陆页面,
这个页面可以用来测试你的程序。
你可以在屏幕上输入任何你喜欢的用户名,
然后你的程序会发现一个基于这个用户名的伪造User对象。

当你的程序运行在App Engine上时,用户会被导向到Google帐户
的登陆页面,当登陆之后,或注册了一个新帐户之后,
会重新返回到你的应用。

## Users API

让我们来仔细研究一下新的代码:

user = users.get_current_user()

如果用户已经注册了你的应用,get_current_user()返回用户的
User对象。如果没有,那么返回None。

if user:
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, ' + user.nickname())

如果用户已经登陆,显示一个个性化的信息,使用和用户帐户
相关的昵称。

else:
self.redirect(users.create_login_url(self.request.uri))

如果用户没有登陆,告诉webapp重定向用户的浏览器至Google帐户登陆页面。
重定向中包含此页的网址(self.request.uri),这样Google帐户登陆机制
才能在用户登陆完成或注册完成之后将用户返回来。

想要了解更多Users API的信息,请参见用户参考
http://code.google.com/appengine/docs/users/)。

# 使用webapp处理表单

如果你想要用户提交他们自己的问候,我们就需要一个方法来处理
用户通过Web表格提供的信息。
webapp框架使得处理表格数据变得更容易。

## 使用webapp处理Web表格

使用下列内容替换helloworld/helloworld.py中的内容:

import cgi
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):
def get(self):
self.response.out.write("""
<html>
<body>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
</body>
</html>""")


class Guestbook(webapp.RequestHandler):
def post(self):
self.response.out.write('<html><body>You wrote:<pre>')
self.response.out.write(cgi.escape(self.request.get('content')))
self.response.out.write('</pre></body></html>')

def main():
application = webapp.WSGIApplication(
[('/', MainPage),
('/sign', Guestbook)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
main()

刷新页面就可看到此表格,然后试着提交一条信息。

当前版本有两个处理器(handler):
MainPage,映射到地址"/",显示一个Web表格。
Guestbook,映射到地址"/sign",显示Web表格提交的数据。

Guestbook处理器有一个post()方法,而没有get()方法。
这是因为MainPage显示的表格使用了HTTP POST方法(method="post")
来提交表格数据。
如果因为某些原因你想要一个处理器可以对同一个网址进行GET和POST
操作,你可以在相同类中为每个动作定义这样一个方法。

post()方法中的代码获取来自self.request的表格信息。
在显示给用户之前,它使用cgi.escape()来将HTML特定字符转换成
这些字符的对应体。cgi是一个标准的Python库;查看cgi文档来获取
更多信息(http://docs.python.org/lib/module-cgi.html)。

注意:App Engine环境包含完整的Python 2.5标准库。
但是,不是所有的操作都被允许。
App Engine程序运行在一个受限的环境中,
只能允许App Engine安全的进行扩展。
例如:对操作系统的低层调用、网络操作以及一些文件系统操作
都是不允许的,当尝试这些操作时,会引起错误。
了解更多信息,查看Python运行环境
http://code.google.com/appengine/docs/python/)。

# 使用数据存储

在可扩展的Web应用程序中,存储数据是非常困难的。
用户在某段时间中会和多个Web服务器进行交流,
用户的上一个请求是这个服务器进行处理的,
但是下一个请求会跳至其他的服务器。
所有的Web服务器会对数据进行沟通,
这也许会扩展到数十个服务器,
这些服务器有可能在不同的地方。

但是依靠Google App Engine,你不用过多考虑上述的问题。
App Engine的架构考虑到了数据的所有发布、分派和加载平衡,
这些都在一个简单API后面,
这就是一个强大的查询和处理引擎。

## 保存提交的问候

App Engine包括Python的数据模型API(data modelling API)。
它和Django的数据模型API比较相似
http://www.djangoproject.com/documentation/model-api/)。
但是在后端使用了App Engine的可扩展数据存储。

对于留言簿应用程序来说,我们想要去存储用户提交的问候语。
每个问候语包括作者的名字、信息的内容以及信息提交的日期和时间,
日期和时间能确保我们按照时间顺序来显示这些信息。

编辑helloworld/helloworld.py文件,
并在顶部添加下列import语句:

from google.appengine.ext import db

在MainPage类上面添加下面这个类:

class Greeting(db.Model):
author = db.UserProperty()
content = db.StringProperty(multiline=True)
date = db.DateTimeProperty(auto_now_add=True)

这个类定义了Greeting模型,该模型有3个属性:
author,值为User对象
content,值为一个字符串
date,值为datetime.datetime
(译注:datetime请参考python说明,import datetime; help(datetime))

带有参数的属性构造器可以进一步指定它们的行为。
带有multiline=True参数的db.StringProperty构造器
标明这个值可以包含多行字符。
带有auto_now_add=True参数的db.DateTimeProperty构造器
指定了当对象被创建时,如果应用程序没有赋予其他值,
那么新的对象自动被赋予一个date的时间。
查看万张的属性类型和选项列表,查看数据存储参考
http://code.google.com/appengine/docs/datastore/)。

现在我们有了一个问候语的数据模型,应用程序可以用这个模型
来创建一个新的Greeting对象,并将它们存进数据库中。
编辑Guestbook处理器,代码如下:

class Guestbook(webapp.RequestHandler):
def post(self):
greeting = Greeting()

if users.get_current_user():
greeting.author = users.get_current_user()

greeting.content = self.request.get('content')
greeting.put()
self.redirect('/')

新的Guestbook处理器创建一个新的Greeting对象,并将用户提交
的数据来设置了它的author和content属性。
如果没有设置date属性,那么date会被自动设置为"now"(当前),
就像我们在模型中制定的那样。

最后,greeting.put()保存我们的新对象到数据库中。
如果我们获取到对象的查询,put()会坑新当前对象。
因为我们使用模型构造器来创建对象,
因此put()创建了一个新的对象到数据库中。

## 使用GQL找回存储的问候语

App Engine数据库有一个优秀的(sophisticated)的数据模型
查询引擎。因为App Engine数据库不是传统关系数据库,因此查询
不是用SQL来定义的。但是你可以使用一种类似SQL的查询语言,
我们称之为GQL。GQL提供了访问App Engine数据库的查询引擎功能,
语法与SQL十分相近。

编辑MainPage处理器,代码如下:

class MainPage(webapp.RequestHandler):
def get(self):
self.response.out.write('<html><body>')

greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")

for greeting in greetings:
if greeting.author:
self.response.out.write('<b>%s</b> wrote:' % greeting.author.nickname())
else:
self.response.out.write('An anonymous person wrote:')
self.response.out.write('<blockquote>%s</blockquote>' %
cgi.escape(greeting.content))

# Write the submission form and the footer of the page
self.response.out.write("""
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
</body>
</html>""")

在浏览器中刷新http://localhost:8080/,输入一些消息来确认消息可以被
正常发送。

查询代码如下所示:

greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")
(译注:我看不出来这和SQL有什么区别)

另外,你也可以调用Greeting类的gql(...)方法,
省略查询中的"SELECT * FROM Greeting":

greetings = Greeting.gql("ORDER BY date DESC LIMIT 10")

和SQL一样,关键词(例如"SELECT")是大小写不敏感的。
但是,其他变量名是大小写敏感的。
(译注:我感觉把SQL的关键词都大写是一种很好的习惯)

因为查询返回全部数据对象,因此选择模型的特定属性没有什么意义。
所有的GQL查询都是以"SELECT * FROM model"开头,
(或应用模型的gql方法),
或者与之类似的SQL等效语句。
(译注:我其实发现了把model翻译成模型不是太合适,或者是模组?)

(译注:其实greeting翻译成祝福语也挺不准确的,问候语?)
一个有WHERE语句的GQL查询会依据一个或几个条件的属性值来过滤得到的结果。
和SQL不同,GQL查询"不"包含常量:相反,GQL使用查询中所有值的绑定参数。
例如,若只想获取当前用户的祝福语:

if users.get_current_user():
greetings = Greeting.gql("WHERE author = :1 ORDER BY date DESC",
users.get_current_user())

你也可以使用命名的参数代替位置参数:

greetings = Greeting.gql("WHERE author = :author ORDER BY date DESC",
author=users.get_current_user())

除GQL之外,数据存储API提供了使用方法创建查询对象的其他机制。
上面的查询也可以修改为下面的代码:

greetings = Greeting.all()
greetings.filter("author =", users.get_current_user())
greetings.order("-date")

查看完整的GQL及查询API描述,请参见数据存储参考
http://code.google.com/appengine/docs/datastore/)。

## 清除开发服务器数据库

开发Web服务器使用一个本地版本的数据库来测试你的应用程序,
即使用临时文件。
只要临时文件错在数据就会一直存在,Web服务器不会重置这些文件
除非你要求这么做。

如果你想要开发服务器在启动时预先清除数据库,请在启动服务器时
添加--clear_datastore选项:

dev_appserver.py --clear_datastore helloworld/

(注:我最近在找工作,但是找不到。对不起,这和本文没什么关系,sorry)

# 使用模板

代码嵌套在HTML中是很杂乱和难以维护的,最好的办法是使用模板系统。
在模板系统中,HTML被作为一个单独的文件,
使用得定的语法来表明程序中的数据从何而来。
有很多Python的模板系统:EZT、Cheetah、ClearSliver、Quixote和Django等等。
你可以使用你的模板引擎,并将它绑定到你的应用程序代码中。
(EZT:http://svn.webdav.org/repos/projects/ezt/trunk/ezt.py
(Cheetah:http://www.cheetahtemplate.org/
(ClearSliver:http://www.clearsilver.net/
(Quixote:http://www.mems-exchange.org/software/quixote/
(Django:http://www.djangoproject.com/documentation/templates/

为了更加方便,webapp模块包含了Django模板引擎。这也作为一个部分包含在
SDK和App Engine中,所以你使用的时候不需要再去绑定它。

## 使用Django模板

添加下列import语句在helloworld/helloworld.py的顶部:

import os
from google.appengine.ext.webapp import template

使用下面代码替换MainPage处理器:

class MainPage(webapp.RequestHandler):
def get(self):
greetings = Greeting.all().order('-date')

if users.get_current_user():
url = users.create_logout_url(self.request.uri)
url_linktext = 'Logout'
else:
url = users.create_login_url(self.request.uri)
url_linktext = 'Login'

template_values = {
'greetings': greetings,
'url': url,
'url_linktext': url_linktext,
}

path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))

最后在helloworld目录中创建一个index.html文件,该文件的内容如下:

<html>
<body>
{% for greeting in greetings %}
{% if greeting.author %}
<b>{{ greeting.author.nickname }}</b> wrote:
{% else %}
An anonymous person wrote:
{% endif %}
<blockquote>{{ greeting.content|escape }}</blockquote>
{% endfor %}

<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>

<a href="{{ url }}">{{ url_linktext }}</a>

</body>
</html>

刷新一下页面,然后看看。

template.render(path, template_values)有两个参数:一个是模板文件的文件路径;
一个是字典值。并返回递归文本。这个模板用了Django模板语法来访问和重申值,
以及来引用这些值的属性。在许多情况下,你可以将数据存储模板对象直接作为值,
并通过模板来访问他们的属性。

提示:一个App Engine应用程序有对这个项目所有上传文件、库文件的只读权限,
但是不包括其他文件。当前工作路径就是程序的主目录,所有index.html
的路径就是简单的"index.html"。

想要了解更多关于Django模板引擎的信息,请访问Django 0.96模板文档
http://www.djangoproject.com/documentation/0.96/templates/)。

# 使用静态文件

和传统的Web主机环境不同,Google App Engine不支持直接访问你的
应用程序源代码目录下的文件,除非制定这样做。我们将我们的模板
文件命名为index.html,但是不会自动使得文件可以通过URL/index.html
来访问。

当时,有很多情况下你希望直接通过Web浏览器访问静态文件。
例如:图片、CSS文件、JavaScript代码、影片和Flash动画就会保存在应用
程序目录下并直接通过浏览器访问。你可以告知App Engine来直接访问特定
的文件,而不需要编辑处理器。

## 使用静态文件

编辑helloworld/app.yaml,并用下列内容进行替换:

application: helloworld
version: 1
runtime: python
api_version: 1

handlers:
- url: /stylesheets
static_dir: stylesheets

- url: /.*
script: helloworld.py

新的hanlers部分定义了两个用于URL的处理器。
当App Engine接收到一个来自网址头部包含/stylesheets的请求时,
它映射文件的剩余路径到stylesheets路径,如果找到对应的文件,
该文件的内容会被返回到客户端。其他网址映射"/"路径,并由
helloworld.py脚本来处理。

默认情况下,App Engine使用基于文件名扩展的MIME类型来访问静态文件。
例如一个文件名后缀为.csss的会被认为是text/css MIME类型。
你可以通过额外的选项来制定准确的MIME类型。

URL处理期路径参数会按照它们在app.yaml中的顺序从顶到底进行处理。
在本例中,/stylesheets参数会在/.*参数映射之前找到相应路径。
想了解更多URL映射的信息,以及可以制定app.yaml的参数信息,
请查看app.yaml参考(http://code.google.com/appengine/docs/configuringanapp.html)。

创建目录helloworld/stylesheets。
在这个新目录中,创建一个新文件,名为main.css,内容如下:

#body {
# font-family: Verdana, Helvetica, sans-serif;
# background-color: #DDDDDD;
#}
(注:css内容前面每一行我都加了"#"以免显示不正确)
(注:在支持文字定义的blog中,css代码都不能正常显示)
otherrrr@gmail.com

最后,编辑helloworld/index.html文件,并插入下面的代码,
在<html>行之后:

# <head>
# <link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
# </head>
(注:每一行我都加了一个"#")

在浏览器中刷新页面,会看到使用层叠演示表的新的页面。

# 上传你的程序

你可以使用管理控制台来创建和管理App Engine的应用程序。
如果你注册了你的应用程序ID,你可以使用SDK中的命令行工具
来上传程序到网站上。这个工具是appcfg.py。

注意:在写本文时,还没有办法来删除App Enginge上的程序。
这个功能会很快添加。在预览版本中,你可以注册3个程序ID。
如果你不想为本教程分配一个程序ID,你可只是简单看看这个
部分,当你准备上传程序时在详细的了解。

## 注册应用程序

你可以通过App Engine管理平台创建和管理App Enginge的Web应用程序,
网址如下:
http://appengine.google.com

通过你的Google帐户登陆App Engine。
如果你没有Google帐户,请可以通过一个E-mail地址和密码来创建一个
Google帐户(https://www.google.com/accounts/)。

单击"Create an Applicatio"按钮来创建一个新的应用u程序。
根据指引来注册一个应用程序ID,即这个程序的唯一的名称。
如果你选择使用免费的appspot.com域名,那么这个程序的完整网址
就是:http://application-id.appspot.com/
你可以为你的应用购买一个顶级域名,也可以使用已经注册的域名。

编辑app.yaml文件,然后修改application的对应值:设置helloworld对应
你注册的应用程序ID。
(注:我发现很多人都是因为这个问题结果上传后出错或无法浏览)

## 上传程序

使用下列命令上传完成的应用程序到Google App Engine:

appcfg.py update helloworld/

在命令行(或终端)下输入你的Google用户名和密码。

现在你就可以看到你的程序已经运行在App Enginge上了。
如果你设置使用免费的appspot域名,
那么网址会是:

http://application-id.appspot.com

## 祝贺你!
你已经完成了本教程。
想要了解更多的信息,请参看App Engine文档。
http://code.google.com/appengine/docs/

otherrrr@gmail.com翻译)
--
郎啊郎别太忙 | langalang.blogspot.com

2008年11月20日星期四

Google App Engine 上海 Camp

Google App Engine Camp Shanghai

11月22日下午1点,Google上海office,Google App Engine 的开发者们,一起来Camp吧。在那里你们可以讨论、开发你的App Engine项目。我们将通过一轮发言拉开活动序幕,之后你可以和其他开发者碰头,甚至立即开始coding。食物和咖啡免费,带上你的idea和笔记本电脑奔过来吧。在这个网站可以找到完整的细节和登记信息,另为路盲准备了地图。
--
郎啊郎别太忙 | langalang.blogspot.com

gmail 正式支持皮肤主题了 theme

看看截图的效果,很漂亮。还有很多的theme主题可以选。
需要使用gmail 英文版,我选择的是beach,海滩,要求输入所在的城市,自动判断所在城市的当前时间,显示海滩日头偏西的效果。 让我想起了igoogle的主题设置。
google,总是带来惊喜。
--
郎啊郎别太忙 | langalang.blogspot.com

chmod 与 linux 简要权限表 permission

        PERMISSION      COMMAND  

U G W

rwx rwx rwx chmod 777 filename

rwx rwx r-x chmod 775 filename

rwx r-x r-x chmod 755 filename

rw- rw- r-- chmod 664 filename

rw- r-- r-- chmod 644 filename


U = User

G = Group

W = World


r = Readable

w = writable

x = executable

- = no permission


另外一种维度来看:

Permissions:


400 read by owner

040 read by group

004 read by anybody (other)

200 write by owner

020 write by group

002 write by anybody

100 execute by owner

010 execute by group

001 execute by anybody

--
郎啊郎别太忙 | langalang.blogspot.com

我兄弟的网站“完璧归赵网”

专业的挂失与招领信息交流平台【完璧归赵网】上线了。
若您或您的亲友丢失或捡到宠物、物品,或者寻人,欢迎访问并免费发布挂失、招领信息。
网站特色功能包括:

1.强大搜索功能
2.差异化表单
3.酬金设置
4.匹配邮件自动发送

即刻就去http://www.wanbiguizhao.com
联系方式 QQ:1062802349 邮箱:istep@163.com


我觉得,这完全是公益网站,为人们找到失去的东西,多一个途径。
祝贺我的兄弟水华,做自己想做的事情。希望他能帮助需要帮助的。
--
郎啊郎别太忙 | langalang.blogspot.com

2008年11月19日星期三

近代苦难的中国

来自google image提供的图片。抗战、内战。
http://images.google.com/images?hl=zh-CN&q=china+source%3Alife&btnG=%E6%90%9C%E7%B4%A2%E5%9B%BE%E7%89%87
苦难的中国近代史。

JRuby 1.1.5 发布

JRuby 1.1.5 Released

Homepage: http://www.jruby.org/
Download: http://dist.codehaus.org/jruby/

JRuby 1.1.5 是从 JRuby 1.1以来的第5个发行版。主要改进了兼容性和效率问题。我们的目标是更快的更新周期(3-4周)。我们希望在一个更快的更新周期里面解决JRuby用户提出的问题。

主要更新:

- 每个类方法缓存 (改进 _send_, respond_to?, and defined?)
- 常量缓存显著的改进了常量的搜索
- 减少了内存占用
- 几个 Java 集成的修复
- 更新到Rubygems 1.3.1 和 Rspec 1.1.11
- 更新了 ffi (Foreign Function Interface) 支持t
- 更多 1.9 mode支持
- 修复了从 1.1.4以来的113 bug

--
郎啊郎别太忙 | langalang.blogspot.com

ubuntu 替换 安装别的 java 版本

sudo update-alternatives --config java

--
郎啊郎别太忙 | langalang.blogspot.com

2008年11月17日星期一

先锋级玩家

有感于我的一个同事,老员工,公司专家级顾问。
华表的报表系统(Report Server),我看没有多少人说在工作之余去研究这个东西的。
包括我,自己公司的产品,也是安装了一下,看了看界面,很强大,一句感慨之后,就再也没有看过。
没有在用户数据上跑过,做一两张复杂的报表,看看到底能有多强大,评估一下能做到什么程度。没有。
联想到周三的那个UAP报表能不能调用存储过程的问题,专家是试过、用过,我只是听过,没动过。
有差距啊。
专家,不是"砖家",虚名不是浪得的。
以前环绕在这位员工身上的光环,原来都不是虚假的,都是实打实的学习、研究、提升得来的。
先锋级玩家,骨灰级玩家。
抱怨薪资制度不能解决问题。提升顾问能力是王道。
--
郎啊郎别太忙 | langalang.blogspot.com

UFDIA NC 薪资有用的SQL语句

--公共项目与发放项目对照表
select a.vname,a.iitemid,a.pk_wa_item,b.vname,b.cperiod,c.pk_wa_class,c.vwaclassname
from wa_item a
left join wa_classitem b on a.pk_wa_item = b.pk_wa_item
left join wa_waclass c on c.pk_wa_class = b.pk_wa_class
--where b.cperiod = '10'
--and b.vname like '实发工资'
order by a.iitemid

--导出所有发放项目公式语句
select a.vname,a.iitemid,a.pk_wa_item,b.vname,b.vformulastr,b.vformula,b.cperiod,c.pk_wa_class,c.vwaclassname,c.pk_wa_class
from wa_item a
left join wa_classitem b on a.pk_wa_item = b.pk_wa_item
left join wa_waclass c on c.pk_wa_class = b.pk_wa_class
where b.cperiod = '10' and b.vformulastr is not null --and b.vformulastr <> ''
--and b.vname = '浮动工资' and c.vwaclassname like '%四分公司司乘工资分配表%'
order by a.iitemid

--未被使用公共项目查询语句
select a.vname,a.iitemid,a.pk_wa_item,b.vname,b.cperiod,c.pk_wa_class,c.vwaclassname
from wa_item a
left join wa_classitem b on a.pk_wa_item = b.pk_wa_item
left join wa_waclass c on c.pk_wa_class = b.pk_wa_class
where --b.cperiod = '08'
b.vname is null
order by a.iitemid
--
郎啊郎别太忙 | langalang.blogspot.com

UFIDA NC Notes (NC备忘)

这是一个系列文章,记录下容易忘记、忽略的小问题。常年更新。

1、NC凭证格式分配,是对于账簿主体的分配;
2、NC自定义转账模板的分配,也是对于账簿主题的分配。可以在1虚拟公司分配;分配之前,要删除下级公司已经占用的NC自定义转账模板编码;
3、提示"NC演示期已到",原因没有加密锁或者合法的license文件,删除:\bin\license1和\lib\uf.lib两个文件。重启中间件就可以了。但是有功能限制,无法打印和导出excel。
4、在0001中修改会计科目时,注意默认有两个科目方案(体系),默认显示第一个,是老会计准则的,注意切换。别白费力气改错了。
5、NC预算管理中,tbadmin用户只能登录"管理场景",无法用于其它场景,无法做业务,注意切换用户。
6、固定资产变动单的审核,需要到"变动管理""资产变动"界面上审核。变动单管理上审不了。
7、薪资发放项目,设置为"扣税"的项目,增减属性可以为其他属性,扣税没有问题。设置为"增项"会导致实发合计翻番。
8、薪资数据接口,导入必须包含"员工编码"。导出建议也包含。否则修改了数据无法导入。
9、bd_psnbasdoc表中dr=null的员工,无法在数据接口中导出。默认条件是dr=0,没有判断为NULL的情况。
10、安装Linux版本的NC,注意,除了要替换安装文件的ufjdk目录为IBM JDK外,还必须要在生成ejb部署之前,替换/nchome/ufjdk目录为IBM jdk,否则生成的代码在linux下无法执行。(惨痛教训)
11、薪资数据导入的时候,会锁定工资表,导致其他用户无法计算(update)工资表,报事务抛弃或者Dataimpl代码错误。这是正常的。导入完成后就会解锁。

客户提出的需求:
1、常用摘要关联会计科目。


这个系列文章是不是要考虑分以下类别?分模块比较好。
--
郎啊郎别太忙 | langalang.blogspot.com

2008年11月12日星期三

NC 可以飞快的在 Firefox 里面运行

今天试了试,用友NC的确可以在Firefox(火狐浏览器)里面正常运行。速度比IE里面快。
晚上做一个报表,5千行记录,IE刷新一下很慢,并且是越来越慢。忍不住到Firefox中试了试,果真可以。
以前试过的,总是不行,打不开用友NC,今天在第一次载入的时候,多等了一下,就进去了。
Firefox是3.0.3。这样在Linux下面也可用了。实在没有理由再在windows下面办公了。
组长老吴一次在火车上看了我秀了ubutun的3D动态桌面,播放视频,编辑word文档,大发感慨,号召大家都转到linux下面去。要得哦。
不过,我建议办公使用,还是用 Fedora10 这个版本比较好,因为所有的软件都在一张DVD光盘里面了。ubuntu虽然说很方便,但是毕竟让每个人都去熟悉apt-get install命令,还是有部分人不感冒的。

老规矩,email post blog,附件发图片到博客。一气呵成。
--
郎啊郎别太忙 | langalang.blogspot.com

2008年11月11日星期二

chrom 浏览器无法发送附件

chrom无法发送Gmail附件,无法在blogger中上传图片。
估计就是这个开发版的问题。

--
郎啊郎别太忙 | langalang.blogspot.com

VMware 启动截图

前一篇文章附件没有发送成功。
是blogspot限制了吗?不可能吧?


本文目的有两个:
1、记下VMware启动时如何选择启动介质:按ESC建。(总是记不住)
2、测试我的两个支持email post的blog能不能发送图片。附件是VMware启动时的截图。

经过测试,的确不支持通过email贴图片过来。
手工贴。
更新:是我目前使用的一个chrom版本的问题。FF/IE都正常。后一帖通过附件发送图片成功。



--
郎啊郎别太忙 langalang.blogspot.com

2008年11月5日星期三

ubuntu install gcc build essential

这样安装的是最基本的编译包和库。Oracle编译还得再加包。

sudo apt-get install build-essential

感叹啊。有一个好的包管理系统,是多么方便、多么重要的一件事情啊。

昨天在linuxtoy看到消息,rpm包的收集网站整合了。那个yum如果能好好利用这个rpm库,该多好阿。
消息来源:RPM Fusion 已经正式启动

RPM Fusion 是为 Fedora 及 Red Hat Enterprise Linux 用户提供的一个软件包仓库。各位 Fedora/RHEL 朋友要是想要安装的软件在官方的仓库中找不到,不要泄气,兴许通过 RPM Fusion 你就找到了。

新启动的 RPM Fusion 合并了原有的 DribbleFreshrpmsLivna 等软件包仓库,将成为最大的第三方软件包仓库。

通过 RPM Fusion 软件包仓库,你将找到 ATI/NVIDIA 显卡驱动、私有的音频/视频编码/解码器、游戏、模拟器、以及其他软件包等。

RPM Fusion 网站位于:http://rpmfusion.org

Freshrpms这个网站是我用的比较多的。上次在RHEL4下面装Oracle,找缺少的rpm包全靠它了。
使用前,请参阅配置指南
--
郎啊郎别太忙 | langalang.blogspot.com

手动安装中文包、输入法、正黑字体的方法

在错过了第一次进入系统时安装中文包的提示后,手动安装汉化语言包、安装输入法、安装文泉正黑字体的方法:

sudo apt-get install language-pack-zh language-pack-gnome-zh
sudo apt-get install scim-pinyin sudo apt-get install ttf-wqy-zenhei

装完立马就有效果了。

我是被那个源的问题折腾坏了。第一进入时没有安装上,再进去的时候死活没有那个提示了。不得已,手工安装。

--
郎啊郎别太忙 | langalang.blogspot.com

2008年11月4日星期二

分享一个电信ADSL速度巨快的 ubuntu 8.10 source

so fast ! 120kB/s....
cn99 is down.tw is slow.

电子科技大学.great.

deb http://ubuntu.uestc.edu.cn/ubuntu/ intrepid main restricted universe multiverse
deb http://ubuntu.uestc.edu.cn/ubuntu/ intrepid-backports main restricted universe multiverse
deb http://ubuntu.uestc.edu.cn/ubuntu/ intrepid-proposed main restricted universe multiverse
deb http://ubuntu.uestc.edu.cn/ubuntu/ intrepid-security main restricted universe multiverse
deb http://ubuntu.uestc.edu.cn/ubuntu/ intrepid-updates main restricted universe multiverse
deb-src http://ubuntu.uestc.edu.cn/ubuntu/ intrepid main restricted universe multiverse
deb-src http://ubuntu.uestc.edu.cn/ubuntu/ intrepid-backports main restricted universe multiverse
deb-src http://ubuntu.uestc.edu.cn/ubuntu/ intrepid-proposed main restricted universe multiverse
deb-src http://ubuntu.uestc.edu.cn/ubuntu/ intrepid-security main restricted universe multiverse
deb-src http://ubuntu.uestc.edu.cn/ubuntu/ intrepid-updates main restricted universe multiverse

--
郎啊郎别太忙 | langalang.blogspot.com

ubuntu linux 环境下面安装 oracle 10g

在使用RHEL4 update 7安装oracle之前,曾经试过一次在ubuntu 8.04环境下安装oracle,但是可耻的失败了。因为oracle就只认那么几个linux发行版。当时想过绕过这个限制,自己改过/etc/issue里面的文字,没用。
后来为了和客户的系统保持一致,做相关的测试,以及写安装、维护手册,路径什么的都和客户的实际一致,还是用RHEL4。
今天系统维护手册写完了。想把RHEL4干掉,装上我偏爱的ubuntu linux 8.10,再装上oracle,同时做java二开练习。
刚好看到这一篇牛文,ubuntu linux 环境下面安装 oracle 10g,关键之处就一步:

创建一个文件 /etc/redhat-release:添加如下内容。
Red Hat Linux release 3.1 (drupal)
oracle将会把系统认为是redhat 3了:)

我也罗嗦了这么多了。全是废话。就一步而已。明天开干。
不过,还要测试RHEL4 64位系统,加64位oracle。

更新:

默认的ubuntu没有zh_CN.gbk的locale,要手动生成:

sudo gedit /var/lib/locales/supported.d/zh

增加:
zh_CN GB18030
zh_CN.GB2312 GB2312
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
然后运行:
locale-gen
等待几分钟,就会生成相应的locale。
Generating locales...
zh_CN.GB18030... done
zh_CN.GB2312... done
zh_CN.GBK... done
zh_CN.UTF-8... up-to-date
zh_HK.UTF-8... up-to-date
zh_SG.UTF-8... up-to-date
zh_TW.UTF-8... up-to-date
Generation complete.
最后运行locale -a检查一下:
whylang@ubuntu:~/database$ locale
LANG=zh_CN.gbk
LC_CTYPE="zh_CN.gbk"
LC_NUMERIC="zh_CN.gbk"
LC_TIME="zh_CN.gbk"
LC_COLLATE="zh_CN.gbk"
LC_MONETARY="zh_CN.gbk"
LC_MESSAGES="zh_CN.gbk"
LC_PAPER="zh_CN.gbk"
LC_NAME="zh_CN.gbk"
LC_ADDRESS="zh_CN.gbk"
LC_TELEPHONE="zh_CN.gbk"
LC_MEASUREMENT="zh_CN.gbk"
LC_IDENTIFICATION="zh_CN.gbk"
LC_ALL=

--
郎啊郎别太忙 | langalang.blogspot.com

2008年11月2日星期日

Nerd们的生活:推荐美剧《Chuck》和《The big bang theory》

最新的一集《超市特工》,哈哈哈哈。

今天偶然又看到一个类似的《生活大爆炸 The.Big.Bang.Theory》,描写geek或者nerd们的美剧,不过就不是特工题材,而是生活喜剧。
看来一集,感觉不错。有时间追着看。
《豆瓣》上的评价基本上多是力荐!
生活大爆炸 The.Big.Bang.Theory S02E05.在线观看

另外赞一下YYeTs 人人影视,他有个『免费在线观看区』追看美剧就是它了。

今天晚上应该会出霹雳游侠的第6集了。

另外,如果将来时间够的话,南方公园 South Park,想把以前的几季看完。
南方公园 South Park.S12E04.在线观看

附:nerd,呆子的意思。
--
郎啊郎别太忙 | langalang.blogspot.com