2008年12月22日星期一
2008年12月1日星期一
AIX UNIX 平台安装 NC oracle 和 WAS 经验数则
硬件方面,四台IBM Sytem P5 小型机,两台SNA盘阵,一个带库。分成两组,每组一台数据一台应用,一组在线,另一组灾备,HACMP群集。折腾oracle、nc、WAS遇到几个问题。问题虽然都解决了,对于不熟悉的人来说还是很费劲的。
随便写几点,想到哪里,写到哪里。
- NC连接不上oracle,用任何客户端都连不上,监听ping得通,但是就是不正常。原因是由于oracle装在盘阵上,而ha还没有配置好,监听配置指定IP的话,解析不到,只能写hostname。这个折腾了一下午,鄙视一下Oracle的经销商。
- AIX自带了一个java1.5,位于/usr/java5,直接export JAVA_HOME=/usr/java5就可以。公司流传的那个版本是linux平台的,在aix ppc 64平台上没法用。
- AIX环境的LANG设置:export LANG=Zh_CN。和linux平台不一样,注意大小写。这个不写对,nc是乱码,日志"报无法解析语言配置文件"错误。
- System P5的机器,WAS要使用AIX PPC 64的版本,如果跑NC502,要使用.11的补丁,.07的不行,补丁和tools也要相应的版本。在这里强烈谴责一下集团办事的人,3张WAS盘,补丁和tools盘都发错了,去ftp上下载,要下一天。怎么在办事啊?浪费时间。
- AIX 平台 umount 光驱的问题,大活人被那个什么憋死,怎么都umount不了cdrom,总是说资源忙。上网查,有大把的同病相怜的兄弟姐妹。光驱不umount的话,光盘弹不出来,换不了盘,WAS可是有三张盘的哦。被折腾的火大,大叫一声FUCK user,谁在使用光驱啊,使用这个命令,他可以显示出谁在使用光驱:fuse -uck /cdrom,看到是root在用,root不就是自己吗?FUCK到自己头上了。高。但是就是kill不掉这个root进程,没办法,惹不起,我还躲不起,关掉所有的连上去的远程端,再重新进,fuse -uck /cdrom,这次ok 了,umount /cdrom,跑到机房换光盘去。这个问题折腾了老半天。晕死。
- 装WAS的时候,直接进cdrom的WAS目录,运行setup.sh安装。刚开始的时候,想和win下面一样,运行launch.sh,结果说必须在浏览器里运行,机器上又没有mozilla,搞死个人。
- 宁可麻烦一点,mount光驱,拷贝WAS安装文件到硬盘再装,要不然10倍数的cdrom,装的慢死。装第二台时,速度刷刷的。
- smitty是个好东西。
- smitty jfs2,可以进去调整挂载的硬盘分区的大小。这台机器由于要做磁带备份,默认只备份根分区,根分区搞的很小,只有3G、太小了。
- 待续。。。
--
郎啊郎别太忙 | langalang.blogspot.com
2008年11月28日星期五
[转载] Python : 50个能够满足所有需要的模块
catswhocode.com 的 jbj 写道:我很喜欢Python,Python具有强大的扩展能力,我列出了50个很棒的Python模块,包含几乎所有的需要:比如Databases,GUIs,Images, Sound, OS interaction, Web,以及其他。推荐收藏。
还有其他好的模块需要加入这个列表吗?欢迎留言。
--
郎啊郎别太忙 | langalang.blogspot.com
2008年11月24日星期一
Komodo is using Scintilla
收费版多了项目管理、代码仓库等团队协作的功能,比如svn,git;还有代码自动美化等等。
闲来无事,用Spy++看了看他用的什么编辑器框架,居然是Scintilla!
我说新版Komodo为什么这么强大了,原来,原来......
暗渡陈仓!
用开源的代码编辑器的工具还有很多,比如Notepad++,Notepad2等,还有wxWidget(wxPython)所用的editor部件,都是基于Scintilla。商业化的e-texteditor也是用的Scintilla(通过wxWigdet封装了)。
开源的力量是强大。并且强者恒强,有限的力量都集中到相关领域第一的项目上去。其他的,渐渐被人遗忘。
今天是在找一个轻巧但是强大的代码编辑器,本来e-texteditor是TextMate的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 | |
---|---|
Data Sent | |
Data Received | |
Emails Sent | |
Megabytes Stored | |
Data Sent (HTTPS) | |
Data Received (HTTPS) | |
--
郎啊郎别太忙 | 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/)
--
郎啊郎别太忙 | 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
需要使用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.匹配邮件自动发送
联系方式 QQ:1062802349 邮箱:istep@163.com
我觉得,这完全是公益网站,为人们找到失去的东西,多一个途径。
祝贺我的兄弟水华,做自己想做的事情。希望他能帮助需要帮助的。
--
郎啊郎别太忙 | langalang.blogspot.com
2008年11月19日星期三
近代苦难的中国
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 发布
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
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 里面运行
晚上做一个报表,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日星期二
VMware 启动截图
本文目的有两个:
1、记下VMware启动时如何选择启动介质:按ESC建。(总是记不住)
2、测试我的两个支持email post的blog能不能发送图片。附件是VMware启动时的截图。
--
郎啊郎别太忙 langalang.blogspot.com
2008年11月5日星期三
ubuntu install gcc build essential
sudo apt-get install build-essential
感叹啊。有一个好的包管理系统,是多么方便、多么重要的一件事情啊。
昨天在linuxtoy看到消息,rpm包的收集网站整合了。那个yum如果能好好利用这个rpm库,该多好阿。
消息来源:RPM Fusion 已经正式启动
RPM Fusion 是为 Fedora 及 Red Hat Enterprise Linux 用户提供的一个软件包仓库。各位 Fedora/RHEL 朋友要是想要安装的软件在官方的仓库中找不到,不要泄气,兴许通过 RPM Fusion 你就找到了。Freshrpms这个网站是我用的比较多的。上次在RHEL4下面装Oracle,找缺少的rpm包全靠它了。新启动的 RPM Fusion 合并了原有的 Dribble、Freshrpms、Livna 等软件包仓库,将成为最大的第三方软件包仓库。
通过 RPM Fusion 软件包仓库,你将找到 ATI/NVIDIA 显卡驱动、私有的音频/视频编码/解码器、游戏、模拟器、以及其他软件包等。
RPM Fusion 网站位于:http://rpmfusion.org
使用前,请参阅配置指南。
--
郎啊郎别太忙 | 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
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。
今天系统维护手册写完了。想把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...最后运行locale -a检查一下:
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.
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
2008年10月26日星期日
Sql server缩小日志文件的方法
方案一、
1.打开查询分析器,输入命令 DUMP TRANSACTION 数据库名 WITH NO_LOG
2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至5M。
方案二、最常用的方法,不建议使用。要停止sql应用服务。
1、分离数据库
2、删除日志文件,既同名的ldf文件(mdf是数据库)
3、重新附加数据,只指定数据库,无日志。这样会用单文件附加方式附加上去。
方案三、直接去企业管理器,在数据库上点属性,把数据库改成当用户模式,再执行收缩数据库-》收缩文件,选择日志。这个方法在客户那里有效,在我这里没有效果。不知道原因。
其他更复杂的方法,需要比较复杂的sql操作,常见的如下:
BACKUP LOG 库名 WITH NO_LOG
DBCC SHRINKFILE( '日志文件名',新的大小数值型如1)
dbcc shrinkdatabase (database_name,[,target_percent])
等等。以前在东风本田用过。dbcc那个命令要交替使用柴油效果。
--
郎啊郎别太忙 langalang.blogspot.com
LiuRen被抓,博客搬家
好,你狠!
早上起来写了一搏:《LiuRen被抓,博客搬家》。正式宣告搬家到此。
就是不希望blogger什么时候再被ban了。
现在使用的Firefox是便携版的。装的插件会保留下来,即使我格式化系统。偏偏现在格式化系统又是非常的频繁。比如Oracle安装、Linux硬盘安装卸载、中病毒,都会导致重来。
换回Firefox而不继续使用Google的chrome是因为chrome没有书签备份机制或者是网络同步备份功能。等到他有了这个功能再说吧。
不使用opera,是因为这个东西很多时候还是废柴一个。参见我的twitter唠叨。它虽然有了很完善的书签、设置网络同步功能,并且是内置的,但是,还是不方便使用它。
早上起来写了一搏:《LiuRen被抓,博客搬家》。正式宣告搬家到此。
就是不希望blogger什么时候再被ban了。
维基百科上的Blogger词条
被ban的历史:
- 2006年8月9日,Blogspot.com在中国大陆大部分地区都能正常访问了。
- 2006年10月29日开始,Blogspot.com在中国大陆大部分地区再次无法正常访问了。
- 2006年11月25日后,Blogspot.com在中国大陆大部分地区都能正常访问了。
- 2007年3月20日至28日下午4点,Blogspot.com在中国大陆大部分地区再次无法正常访问,于28日下午4点至30日上午10点短暂解封,接着再次封锁,并于4月2日至5日早上10点解封,现已被重新封锁。(之后有部分时候偶尔能从中国网通网络访问,但时间不长,而中国电信则一直维持无法访问的现象)
- 2008年4月1日开始,Blogspot.com在中国大陆部分地区都能正常访问了。
- 2008年8月开始,大陆用户无法使用例如Windows Live Writer一类的离线编辑器来上传博客文章,有网民认为这是由于GFW封锁了部分Blogger的文章发布API。
--
郎啊郎别太忙 | langalang.blogspot.com
2008年10月25日星期六
装上了ubuntu8.10_RC
同样的,利用iso光盘里面自带的wubi.exe程序,在windows下无痛硬盘安装,无须分区,不损坏文件,重启动后就可以用了。
装之前到ubuntu.org的中文论坛逛了一圈,发现cn99的源不能用了,挂掉了。按照说明,选择了台湾的源,果然更新速度飞快。基本全速度下载。
KDE的默认主题还是很赞的。
firefox的程序菜单字体无法改过来。
文泉驿的正黑字体,果然不服盛名,很漂亮,无需任何美化,已经非常棒了。
另外,一切都是自动的,很傻瓜化了。桌面linux这两年进步很多。
本文发于kubuntu8.10下。用gmail邮件发布。
--
郎啊郎别太忙 | langalang.blogspot.com
2008年10月20日星期一
NC_Oracle_backup_restore
exp nc50/nc50@orcl owner=nc50 file=nc50bak.dum log=exp.log
exp iufo/iufo@orcl owner=iufo file=iufobak.dmp log=iufoexp.log
imp nc50/nc50@orcl fromuser=nc50 touser=nc50 file=nc50bak.dum log=imp.log
imp iufo/iufo@orcl fromuser=iufo touser=iufo file=iufobak.dum log=iufoimp.log
郎啊郎别太忙 | langalang.blogspot.com
Oracle设置归档模式
$ sqlplus "/ as sysdba"
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> archive log list;
SQL> archive log list;
--
郎啊郎别太忙 | langalang.blogspot.com
安装NC要用到的常用Linux命令
--
郎啊郎别太忙 | langalang.blogspot.com
NC脚本的JAVA_HOME设置
export LANG=zh_CN.gbk
export JAVA_HOME=/home/jdk1.5.0_06
--
郎啊郎别太忙 | langalang.blogspot.com
linux下远程启动NC应用服务器的方法(nohup命令)
$nohup /home/ufsoft/startup.sh &
linux下手动启动oracle,及Oracle常用命令
$cd /home/oralce
$gedit .bash_profile
export ORACLE_BASE=/home/oracle/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=orcl
export PATH=$PATH:$ORACLE_HOME/bin
# $ORACLE_HOME/bin/dbstart
# $ORACLE_HOME/bin/lsnrctl start
A.#dbstart //启动数据库
#dbshut //关闭数据库
B.#emctl start dbconsole //开启企业管理器
#emctl stop dbconsole //关闭企业管理器
C.#lsnrctl start //启动监听
#lsnrctl stop //关闭监听
D.#emctl start agent //开启代理
#emctl stop agent //关闭代理
E.#sqlplus /nolog
conn / as sysdba
startup //启动实例
shutdown immediate //关闭实例
F.#tnsping 192.168.1.104 //测试Oracle数据库是否通
G.http://10.0.0.77:5560/isqlplus //isQL*Plus URL
http://10.0.0.77:5560/isqlplus/dba //isQL*Plus DBA URL
http://10.0.0.77:1158/em //Enterprise Manager 10g Database--
郎啊郎别太忙 | langalang.blogspot.com
linux下开机自动启动Oracle脚本
#!/bin/bash
#alang 2008-10-19
#root
#chkconfig: 345 51 49
#description: starts the oracle dabase deamons
#
#ORA_HOME=/home/oracle/oracle/product/10.2.0/db_1
#ORA_OWNER=oracle
case "$1" in
'start')
echo -n "Starting oracle10g ... "
su - oracle -c "/home/oracle/oracle/product/10.2.0/db_1/bin/dbstart"
echo "Done."
echo "Starting Oracle Listeners ... "
su - oracle -c "/home/oracle/oracle/product/10.2.0/db_1/bin/lsnrctl start"
echo "Done."
#启动web管理界面:http://host_ip_address:1158/em
#su - oracle -c "/home/oracle/oracle/product/10.2.0/db_1/bin/emctl start dbconsole"
touch /var/lock/subsys/oracle10g
echo ""
;;
'stop')
echo -n "shutting down oracle10g ... "
su - oracle -c "/home/oracle/oracle/product/10.2.0/db_1/bin/dbshut"
echo -n "dbshut ok !"
su - oracle -c "/home/oracle/oracle/product/10.2.0/db_1/bin/lsnrctl stop"
echo -n "lsnrctl stop ok !"
#su - oracle -c "/home/oracle/oracle/product/10.2.0/db_1/bin/emctl stop dbconsole"
su - root -c "/home/oracle/ufsoft/stop.sh"
rm -f /var/lock/subsys/oracle10g
echo
;;
'restart')
echo -n "restarting oracle10g ... "
$0 stop
$0 start
echo
;;
*)
echo "Usage: oracle {start|stop|restart} "
exit 1
esac
exit 0
[root@cwserver ~]# gedit /etc/rc.d/init.d/oracle10g
[root@cwserver ~]# chmod 755 /etc/rc.d/init.d/oracle10g
$ ln -s /etc/rc.d/init.d/oracle10g /etc/rc.d/rc2.d/S99oracle10g
$ ln -s /etc/rc.d/init.d/oracle10g /etc/rc.d/rc3.d/S99oracle10g
$ ln -s /etc/rc.d/init.d/oracle10g /etc/rc.d/rc5.d/S99oracle10g
$ ln -s /etc/rc.d/init.d/oracle10g /etc/rc.d/rc0.d/K01oracle10g
$ ln -s /etc/rc.d/init.d/oracle10g /etc/rc.d/rc6.d/K01oracle10g
============添加并启动察看服务=============================$/sbin/chkconfig --add /etc/rc.d/init.d/oracle10g$/sbin/chkconfig --list /etc/rc.d/init.d/oracle10g
$ gedit /etc/oratab
orcl:/home/oracle/oracle/product/10.2.0/db_1:Y
--
郎啊郎别太忙 | langalang.blogspot.com
2008年10月12日星期日
2008年10月11日星期六
最近在玩的东西
blogger最大的好处是可以用邮件自动发布文章。不用我登录,随便写一份邮件过去,就可以发布出来。
我的微软的博客也接受邮件发博,正好,可以写同时给这两个地址发邮件,一篇博就方便的发在两个地方。国内的还没有哪一家支持这个服务吧?百度的是不行的。donews的wordpress的也不支持,那一些使用dot net的TEXT系统的比如csdn、博客园等,统统不行。新浪、sohu支不支持,那就更悬了,这一些网站就是要赚流量放广告的,他生怕你不来他的页面访问,远程发博,想都不用想。
目前有一个最大的问题,blogger的抄送功能不能用,就是BlogSend功能,BlogSend地址是另外一个电子邮件地址,只要一发布文章,系统会将其邮寄文章到此地址。但是就是不能寄送到msn livespace。
这里有两篇重要的参考文章,估计网上的搜官都看过:
看了就明白如何邮件发博。
另外,在goolge上搜索"邮件发布博客",可以证明,国内提供这个邮件发博功能的真是不多啊。
当仁不让,本文同时通过Gmail发送到另外一个蜗居:http://anuxs.spaces.live.com/
--
郎啊郎别太忙 | langalang.blogspot.com
2008年10月10日星期五
Fwd: 鉴别真正牛奶生产日期方法 == 很实用
Subject: 转发: 鉴别真正牛奶生产日期方法 == 很实用
提供给大家一个鉴别真正牛奶生产日期方法,一般牛奶包装上会有一个生产日期(那是给消费者看的)。还有一个英文和数字组成的暗号,这组暗码才是真正的牛奶生产日期。
生产日期:08 05 10(给消费者看的)
暗码:HDC8
H(代表年份)
A:01年 B:02年 C:03年 D:04年 E:05年以此类推 H:08年...有的时候年份会省略,只显示几月,几日
D(代表月分)
A:01月 B:02月 C:03月 D:04月 E:05月...K:11月 L:12月
C8(代表日)
1-9日前面加A:A1,A2,A3,A4,A5,A6,A7,A8,A9;
10-19日前面把1变成B:B0,B1,B2,B3,B4,B5,B6,B7,B8,B9;
20-29日前面把2变成C:C0,C1,C2,C3,C4,C5,C6,C7,C8,C9;
30-31日前面把3变成D:D0,D1
这就说明牛奶HDC8的真正生产日期其实是08年4月28日
再举一例
生产日期 07 06 01(给消费者看的)
暗码:JEB4 就表示真正的生产日期其实是07年5月14日
我们一天可以生产好几个日期,举例:
生产日期 08 09 19 暗码:HIB1(08年9月11日)
生产日期 08 09 23 暗码:HIB1(08年9月11日)
以上两个包装上的生产日期不同,但是真正的生产日期是一样的,都是9月11日。到9月17日左后就先把包装上的9月19号的牛奶送到各个超市,卖完后到9月21日左右再把包装上是9月23号的牛奶送到超市,其实都是9月11日生产的。也就是说我们在9月11日这一天同时生产了9月19日和9月23 日的牛奶。有时一天生产4,5种不同的日期。。。
--
郎啊郎别太忙 | langalang.blogspot.com
几年过去了我还是穷人
我自己是穷人,转载这样的文章,提醒自己。
以前看过,没想到几年过去了,我还是穷人。
警醒。
《决定你是富人还是穷人的12法则》
1、 自我认知
穷人:很少想到如何去赚钱和如何才能赚到钱,认为自己一辈子就该这样,不相信会有什么改变。
富人:骨子里就深信自己生下来不是要做穷人,而是要做富人,他有强烈的赚钱意识,这也是他血液里的东西,他会想尽一切办法使自己致富。
2、休闲
穷人:在家看电视,为肥皂剧的剧情感动得痛苦流涕,还要仿照电视里的时尚来武装自己。
富人:在外跑市场,即使打高耳夫球也不忘带着项目合同。
3、交际圈子
穷人:喜欢走穷亲戚,穷人的圈子大多是穷人,也排斥与富人交往,久而久之,心态成了穷人的心态,思维成了穷人的思维,做出来的是也就是穷人的模式。大家每天谈论着打折商品,交流着节约技巧,虽然有利于训练生存能利,但你的眼界也就渐渐囿于这样的琐事,而将雄心壮志消磨掉了。
4、学习
穷人:学手艺
富人:学管理
5、时间
穷人:一个享受充裕时间的人不可能赚大钱,要想悠闲轻松就会失去更多赚钱的机会。穷人的时间是不值钱的,有时甚至多余,不知道怎么打发,怎么混起来不烦。如果你可以因为买一斤白菜多花了一分钱而气恼不已。却不为虚度一天而心痛,这就是典型的穷人思维。
富人:一个人无论以何种方式赚钱,也无论钱挣得是多还是少,都必须经过时间的积淀。富人的玩也是一种工作方式,是有目的的。富人的闲,闲在身体,修身养性,以利在战,脑袋一刻也没有闲着;穷人的闲,闲在思想,他手脚都在忙,忙着去麻将桌上多摸几把。
6、归属感
穷人:是颗螺丝钉。穷人以为出身卑微,却少安全感,就迫切地希望自己从属于并依赖于一个团体,于是他们以这个团体的标准为自己的标准,让自己的一切合乎规范,为团体的利益而工作,奔波,甚至迁徙。对于穷人来说,在一个著名的企业里稳定的工作几十年,有实习生一直干到高级主管,那简直是美得不能在美的理想。
富人:那些团体的领导者通常都是富人,他们总是一方面向穷人灌输:团结就是力量,如果你不从属于自己的团体,你就什么都不是,一名不文。但另一方面,他们却从来没有停止过招兵买马,培养新人,以便随时可以把你替换掉。
7、投资及对待财富
穷人:经济观点就是少用等于多赚,比如开一家面馆,收益率是100%,投入2万,一年就净赚2万,对于穷人来说很不错了。穷人即使有钱,也舍不得拿出来,即使终于下定决心投资,也不愿意冒风险,最终还是走不出那一步。穷人最津津乐道的就是鸡生蛋,蛋生鸡,一本万利......但是建筑在一只母鸡身上的希望毕竟是那样的脆弱。
富人:富人的出发点是万本万利。同样的开面馆,富人们会想,一家面馆承载的资本只有2万,如果有一亿资金,岂不是要开5000家面馆?要一个一个管理好,大老板得操多少心,累白多少根头发呀?还不如投资宾馆。一个宾馆就足以消化全部的资本,哪怕收益率只有20%,一年下来也有2000万利润啊。
8、激情(能不能干成事,首先要看有没有激情)
穷人:没有激情。他总是按部就班,很难出大错,也绝对不会做到最好。没有激情就无法兴奋,就不可能全心全意投入工作。大部分的穷人不能说没有激情,看他的激情总是消耗在太具体的事情上:上司表扬了,他会激动;商店打折,他会激动;电视里破镜重圆了,他的眼泪一传一串往下流,穷人有的只是一种情绪。
富人:"燕雀安知鸿鹄之志?王侯将相,宁有种乎"?有这样的激情,穷人终将不是穷人!激情是一种天性,是生命力的象征,有了激情才有了灵感的火花,才有了鲜明的个性,才有了人际关系中的强烈感染力,也才有了解决问题的魄力和方法。
9、自信
穷人:穷人的自信要通过武装到牙齿,要通过一身高级名牌的穿戴和豪华的配置才能给他们带来更多的自信,穷人的自信往往不是发自内心和自然天成的。
富人:李嘉成在谈到他的经营秘诀时说:"其实也没什么特别的,光景好时,决不过分乐观;光景不好时,也不过度悲观"。其实就是一种富人特有的自信。自信才能不被外力所左右,自信才可能有正确的决定。
10、习惯
穷人:有个故事,一个富人送给穷人一头牛。穷人满怀希望开始奋斗。可牛要吃草,人要吃饭,日子难过。穷人于是把牛卖了,买了几只羊,吃了一只,剩下来的用来生小羊.可小羊迟迟没有生出来,日子又艰难了。穷人把羊卖了,买成了鸡,想让鸡生蛋赚钱为生,但是日子并没有改变,最后穷人把鸡也杀了,穷人的理想彻底崩溃了,这就是穷人的习惯。
富人:根据一个投资专家说,富人成功的秘诀就是:没钱时,不管多困难,也不要动用投资和储蓄,压力会使你找到赚钱的新方法,帮你还清帐单。这是个好习惯。性格决定了习惯,习惯决定了成功。
11、上网
穷人:去163/sohu/上网聊天,穷人聊天,一是穷人时间多,二是穷人的嘴天生就不能闲着;富人讲究荣辱不惊,温柔敦厚,那叫涵养,有涵养才能树大根深。穷人就顾不了那么多,成天受着别人的白眼,浑身沾满了鸡毛蒜皮,多少窝囊气啊,说说都不行?聊天有理!
富人:去rmic.cn上网找投资机会。富人上网,更多的是利用网络的低成本高效率,寻找更多的投资机会和项目,把便利运用到自己的生意中来。
12、消费花钱
穷人:买名牌是为了体验满足感,最喜欢试验刚出来的流行时尚产品,相信贵的必然是好的。
富人:买名牌是为了节省挑选细节的时间,与消费品的售价相比,他更在乎产品的质量,比如会买15元的纯棉t恤,也不会买昂贵的莱卡制品。
不谋万世者,不足谋一时;不谋全局者,不足谋一域.
当思考成为习惯,成功将不期而至。
--
郎啊郎别太忙 | langalang.blogspot.com