2008年12月22日星期一

最近太忙,没有新的东西可以写。
事情太多,一些事情过了就忘记了做;
回过头去看,做出来的有价值的事情又太少。

一年快完结了,盘点些什么呢?

2008年12月1日星期一

AIX UNIX 平台安装 NC oracle 和 WAS 经验数则

一个全国性的大客户,120家3级单位,上了NC系统。运行于AIX UNIX平台,数据库Oracle,NC使用了IBM WAS 中间件做群集。
硬件方面,四台IBM Sytem P5 小型机,两台SNA盘阵,一个带库。分成两组,每组一台数据一台应用,一组在线,另一组灾备,HACMP群集。折腾oracle、nc、WAS遇到几个问题。问题虽然都解决了,对于不熟悉的人来说还是很费劲的。
随便写几点,想到哪里,写到哪里。
  1. NC连接不上oracle,用任何客户端都连不上,监听ping得通,但是就是不正常。原因是由于oracle装在盘阵上,而ha还没有配置好,监听配置指定IP的话,解析不到,只能写hostname。这个折腾了一下午,鄙视一下Oracle的经销商。
  2. AIX自带了一个java1.5,位于/usr/java5,直接export JAVA_HOME=/usr/java5就可以。公司流传的那个版本是linux平台的,在aix ppc 64平台上没法用。
  3. AIX环境的LANG设置:export LANG=Zh_CN。和linux平台不一样,注意大小写。这个不写对,nc是乱码,日志"报无法解析语言配置文件"错误。
  4. System P5的机器,WAS要使用AIX PPC 64的版本,如果跑NC502,要使用.11的补丁,.07的不行,补丁和tools也要相应的版本。在这里强烈谴责一下集团办事的人,3张WAS盘,补丁和tools盘都发错了,去ftp上下载,要下一天。怎么在办事啊?浪费时间。
  5. AIX 平台 umount 光驱的问题,大活人被那个什么憋死,怎么都umount不了cdrom,总是说资源忙。上网查,有大把的同病相怜的兄弟姐妹。光驱不umount的话,光盘弹不出来,换不了盘,WAS可是有三张盘的哦。被折腾的火大,大叫一声FUCK user,谁在使用光驱啊,使用这个命令,他可以显示出谁在使用光驱:fuse -uck /cdrom,看到是root在用,root不就是自己吗?FUCK到自己头上了。高。但是就是kill不掉这个root进程,没办法,惹不起,我还躲不起,关掉所有的连上去的远程端,再重新进,fuse -uck /cdrom,这次ok 了,umount /cdrom,跑到机房换光盘去。这个问题折腾了老半天。晕死。
  6. 装WAS的时候,直接进cdrom的WAS目录,运行setup.sh安装。刚开始的时候,想和win下面一样,运行launch.sh,结果说必须在浏览器里运行,机器上又没有mozilla,搞死个人。
  7. 宁可麻烦一点,mount光驱,拷贝WAS安装文件到硬盘再装,要不然10倍数的cdrom,装的慢死。装第二台时,速度刷刷的。
  8. smitty是个好东西。
  9. smitty jfs2,可以进去调整挂载的硬盘分区的大小。这台机器由于要做磁带备份,默认只备份根分区,根分区搞的很小,只有3G、太小了。
  10. 待续。。。

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

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

2008年10月26日星期日

Sql server缩小日志文件的方法

今天自己的硬盘被占用的非常满,看到sql版的NC又占用了4.6G的日志,这个sql日志log文件非常大。必须得腾出点空间来。

方案一、
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那个命令要交替使用柴油效果。

最后,别忘记了把数据库的属性设置为自动收缩。如果sql数据库跑在性能比较的硬件上,硬盘够大,这个也可以不设置。

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

LiuRen被抓,博客搬家

刚刚测试发现,使用Firefox的一个插件publish博文,也报错。正如维基百科说的那样,GFW把blogger的发布api给封了。
好,你狠!

早上起来写了一搏:《LiuRen被抓,博客搬家》。正式宣告搬家到此。
就是不希望blogger什么时候再被ban了。

现在使用的Firefox是便携版的。装的插件会保留下来,即使我格式化系统。偏偏现在格式化系统又是非常的频繁。比如Oracle安装、Linux硬盘安装卸载、中病毒,都会导致重来。
换回Firefox而不继续使用Google的chrome是因为chrome没有书签备份机制或者是网络同步备份功能。等到他有了这个功能再说吧。
不使用opera,是因为这个东西很多时候还是废柴一个。参见我的twitter唠叨。它虽然有了很完善的书签、设置网络同步功能,并且是内置的,但是,还是不方便使用它。

早上起来写了一搏:《LiuRen被抓,博客搬家》。正式宣告搬家到此。
就是不希望blogger什么时候再被ban了。

维基百科上的Blogger词条

被ban的历史:

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

2008年10月25日星期六

装上了ubuntu8.10_RC

这次安装的是kubuntu Linux 8.10 rc版本,比8。04的最大好处是可以认出我的interl 3495g wifi无线网卡,开机就可以上网了。
同样的,利用iso光盘里面自带的wubi.exe程序,在windows下无痛硬盘安装,无须分区,不损坏文件,重启动后就可以用了。

装之前到ubuntu.org的中文论坛逛了一圈,发现cn99的源不能用了,挂掉了。按照说明,选择了台湾的源,果然更新速度飞快。基本全速度下载。
KDE的默认主题还是很赞的。
firefox的程序菜单字体无法改过来。
文泉驿的正黑字体,果然不服盛名,很漂亮,无需任何美化,已经非常棒了。

另外,一切都是自动的,很傻瓜化了。桌面linux这两年进步很多。

本文发于kubuntu8.10下。用gmail邮件发布。
--
郎啊郎别太忙 | langalang.blogspot.com

2008年10月20日星期一

关于色彩和音乐的广告

关于色彩的广告

NC_Oracle_backup_restore

=============NC之Oracle备份恢复====================
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设置归档模式

=============Oracle设置归档模式===============
1.shutdown normal或shutdown immediate关闭数据库
$ sqlplus "/ as sysdba"
SQL> shutdown immediate;
2.启动数据库到mount状态
SQL> startup mount;
3.启用或停止归档模式。如果要启用归档模式,此处使用
alter database archivelog 命令。
SQL> alter database archivelog;
SQL> alter database open;
SQL> archive log list;
4.如果需要停止归档模式,此处使用:
alter database noarchivelog 命令

5.查看数据库是否处于归档模式
SQL> archive log list;


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

安装NC要用到的常用Linux命令

============安装NC要用到的常用Linux命令=====
.查看linux版本
$uname -r

.查看发行版本全文
$cat /etc/issue

.查看本机IP地址
$/sbin/ifconfig

.查看本机是32位还是64位版本
$getconf WORD_BIT

.查看本机机器名
$hostname

.更改了机器名后,不重启服务器就生效命令
$service network restart或者/etc/init.d/network restart

.在防火墙的设置中增加了Oracle必须的1158,1521,5560端口后,
.不重启服务器就生效命令
service network restart或者/etc/init.d/network restart

.查找指定的rpm包是否安装
$rpm -qa package_name
例:rpm -qa glibc

.安装包
$rpm -i

.卸载包
$rpm -e

.切换用户登录
$su - USERID

.设置用户的密码
$passwd USERID

.重启动linux
$reboot

.给目录执行权限
$chmod -R 775 DIRECTOR


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

NC脚本的JAVA_HOME设置

============nc脚本的JAVA_HOME设置=======
在ufsoft/bin/ncSysConfig.sh和ufsoft/startup.sh文件的头部,均加上下面两句:

export LANG=zh_CN.gbk
export JAVA_HOME=/home/jdk1.5.0_06

这是最简单的设置JAVA_HOME的方法

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

linux下远程启动NC应用服务器的方法(nohup命令)

========llinux下远程启动NC应用服务器的方法(nohup命令)==
$nohup /home/ufsoft/startup.sh &
不要忘记了后面的&。
这样就可以在windows上用ssh程序(比如secureCRT)远程登录到linux命令行下,
运行nohup /home/ufsoft/startup.sh & ,然后直接就可以关掉windows上的登录窗口。
而nc的应用服务器继续在远程的服务器上运行,不受任何影响。

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

linux下手动启动oracle,及Oracle常用命令

最近自己的NC项目跑在Linux环境下。把安装过程慢慢的写下来。

============手动启动oracle===========
#注意:例子中的oralce命令在/home/oracle/oracle/product/10.2.0/db_1/bin目录。
#你可以自己修改成自己的目录。

1.需要设置环境变量
$cd /home/oralce
$gedit .bash_profile
2.追加下面语句:
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
3.然后注销,以oracle用户登录,手工启动oracle的命令为:
# $ORACLE_HOME/bin/dbstart
# $ORACLE_HOME/bin/lsnrctl start


=============linux下Oracle 相关命令===============
#注意:例子中的oralce命令在/home/oracle/oracle/product/10.2.0/db_1/bin目录。
#你可以自己修改成自己的目录。

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脚本

最近自己的NC项目跑在Linux环境下。把安装过程慢慢的写下来。

===========linux下开机自动启动Oracle脚本============
#注意:例子中的oralce命令在/home/oracle/oracle/product/10.2.0/db_1/bin目录。
#你可以自己修改成自己的目录。

#!/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


============建立一个名为oralce10g的脚本==========
[root@cwserver ~]# gedit /etc/rc.d/init.d/oracle10g
#复制粘贴本文开头的脚本。或者直接使用附件中的oracle10g文件
#给予执行权限
[root@cwserver ~]# chmod 755 /etc/rc.d/init.d/oracle10g
#注意:例子中的oralce命令在/home/oracle/oracle/product/10.2.0/db_1/bin目录。
你可以自己修改成自己的目录。

============添加到启动、关闭、重启动服务序列中===
$ 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

============修改Oracle系统配置文件/etc/oratab=====
$ gedit /etc/oratab
最后一行更改为:
orcl:/home/oracle/oracle/product/10.2.0/db_1:Y

============end==大功告成====================

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

2008年10月12日星期日

《瓦力》--星球时代的爱情

强烈推荐《机器人总动员/瓦力/WALL-E》 。豆瓣上评论,写的文字,让我惊奇。回忆,爱情,在这一刻浮现。

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

2008年10月11日星期六

最近在玩的东西

最近除了在研究java/j2ee/jsp/Tomcat/Glassfish等技术性的等东西外,还有blogger、twitter、叽歪等玩意。

blogger最大的好处是可以用邮件自动发布文章。不用我登录,随便写一份邮件过去,就可以发布出来。

我的微软的博客也接受邮件发博,正好,可以写同时给这两个地址发邮件,一篇博就方便的发在两个地方。国内的还没有哪一家支持这个服务吧?百度的是不行的。donews的wordpress的也不支持,那一些使用dot net的TEXT系统的比如csdn、博客园等,统统不行。新浪、sohu支不支持,那就更悬了,这一些网站就是要赚流量放广告的,他生怕你不来他的页面访问,远程发博,想都不用想。

目前有一个最大的问题,blogger的抄送功能不能用,就是BlogSend功能,BlogSend地址是另外一个电子邮件地址,只要一发布文章,系统会将其邮寄文章到此地址。但是就是不能寄送到msn livespace。

这里有两篇重要的参考文章,估计网上的搜官都看过:

Google Blogger使用技巧

使用手册--安装邮件发布博客

看了就明白如何邮件发博。

另外,在goolge上搜索"邮件发布博客",可以证明,国内提供这个邮件发博功能的真是不多啊。

当仁不让,本文同时通过Gmail发送到另外一个蜗居:http://anuxs.spaces.live.com/


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

2008年10月10日星期五

Fwd: 鉴别真正牛奶生产日期方法‏ == 很实用



---------- Forwarded message ----------
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