2008年8月31日星期日

50公里

刚买的码表派上用场了,昨天骑自行车到张江一个来回跑了50公里,总体感觉还行,就是路上的灰多了些,尤其是回来时在中山南路高架下面,实在受不了,瞅准机会马上就溜到斜土路上。
运动以后的当天真的很舒服,晚上睡的很舒服。平时虽然有些困,但是脑袋总是在活动的状态,多梦,锻炼以后那个困劲抵挡不住啊,倒在床上马上呼呼大睡,一觉到天亮,怎么一个爽字了得!
出去锻炼的好处可不仅仅是为了好好睡觉。还可以去欣赏上海这个国际都市很普通的一面,弄堂,形形色色的上海人。
每次骑自行车出去的目的地,都尽量是一个有绿色,人烟稀少的地方。这样能放松心情,好好的思考一下。每日里,宅在公司和家里,思维都已经接近枯竭。做的每一件事情都觉得无聊。利用周末出去,找回灵感。

让生活在多姿多彩起来!

2008年8月28日星期四

IE 8 beta 2 貌似还不错

很久以前使用的 IE 8 beta 1 真的是惨不忍睹,这不,beta 2 出来救火了。粗略的使用下,访问了几个站点。发现速度快了些。有些网站的排版有点变型,如豆瓣,CSDN等,还好变型的不是很离谱!
样子有了些改进,比IE7漂亮。

回家在xp上安装一个 IE 8 beta 2

下载地址

2008年8月27日星期三

[转]两分钟让你明白什么是ERP

ERP(Enterprise ResourcePlanning)企业资源计划系统,是指建立在信息技术基础上,以系统化的管理思想,为企业决策层及员工提供决策运行手段的管理平台。

一天中午,丈夫在外给家里打电话:“亲爱的老婆,晚上我想带几个同事回家吃饭可以吗?”(订货意向)

妻子:“当然可以,来几个人,几点来,想吃什么菜? ”

丈夫:“6个人,我们7点左右回来,准备些酒、烤鸭、番茄炒蛋、凉菜、蛋花汤……。你看可吗?”(商务沟通)

妻子:“没问题,我会准备好的。”(订单确认)

妻子记录下需要做的菜单(MPS计划),具体要准备的东西:鸭、酒、番茄、鸡蛋、调料……(BOM物料清单),发现需要:1只鸭蛋,5瓶酒,4个鸡蛋……(BOM展开),炒蛋需要6个鸡蛋,蛋花汤需要4个鸡蛋(共用物料)。

打开冰箱一看(库房),只剩下2个鸡蛋(缺料)。

来到自由市场,妻子:“请问鸡蛋怎么卖?”(采购询价)

小贩:“1个1元,半打5元,1打9.5元。”

妻子:“我只需要8个,但这次买1打。”(经济批量采购)

妻子:“这有一个坏的,换一个。”(验收、退料、换料)

回到家中,准备洗采、切菜、炒菜……(工艺线路),厨房中有燃气灶、微波炉、电饭煲……(工作中心)。

妻子发现拨鸭毛最费时间(瓶颈工序,关键工艺路线),用微波炉自己做烤鸭可能来不及(产能不足),于是阅览室在楼下的餐厅里买现成的(产品委外)。

下午4点,接到儿子的电话:“妈妈,晚上几个同学想来家里吃饭,你帮忙准备一下。”(紧急订单)

“好的,你们想吃什么,爸爸晚上也有客人,你愿意和他们一起吃吗?”

“菜你看着办吧,但一定要有番茄炒鸡蛋,我们不和大人一起吃,6:30左右回来。”(不能并单处理)

“好的,肯定让你们满意。”(订单确定)

“鸡蛋又不购了,打电话叫小贬送来。”(紧急采购)

6:30,一切准备就绪,可烤鸭还没送来,急忙打电话询问:“我是李太,怎么订的烤鸭还不送来?”(采购委外单跟催)

“不好意思,送货的人已经走了,可能是堵车吧,马上就会到的。”

门铃响了。

“李太太,这是您要的烤鸭。请在单上签一个字。”(验收、入库、转应付账款)

6:45,女儿的电话:“妈妈,我想现在带几个朋友回家吃饭可以吗?”(呵呵 ,又是紧急订购意向,要求现货)

“不行呀,女儿,今天妈已经需要准备两桌饭了,时间实在是来不及,真的非常抱歉,下次早点说,一定给你们准备好。”(哈哈,这就是ERP的使用局限,要有稳定的外部环境,要有一个起码的提前期 )。
…… ……

送走了所有客人,疲惫的妻子坐在沙发上对丈夫说:“亲爱的,现在咱们家请客的频率非常高,应该要买些厨房用品了(设备采购),最好能再雇个小保姆(连人力资源系统也有缺口了)。
丈夫:“家里你做主,需要什么你就去办吧。”(通过审核)

妻子:“还有,最近家里花销太大,用你的私房钱来补贴一下,好吗?”(最后就是应收货款的催要)

现在还有人不理解ERP吗?记住,每一个合格的家庭主妇都是生产厂长的有力竞争者

2008年8月25日星期一

Python中的lambda函数

Python支持一种有趣的语法,它允许你快速定义单行的最小函数。这些叫做lambda函数,是从Lisp借鉴来的,可以用在任何需要函数的地方。
  • 总的来说,lambda函数可以接收任意多个参数并且返回单个表达式的值。lambda函数不能包含命令,包含的表达式不能超过一个。不要试图向lambda函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。(当然,太长的函数也是不推荐的)
  • lambda函数是一种风格问题。不一定非要使用它们;任意能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。一般将它们用在需要封装的特殊的,非重用代码上,避免令代码中充斥着大量的单行函数。
lambda示例
1 # 普通函数
2 def f(x):
3      return x*2
4
5 >>>f(3)
6 6
7
8 # lambda函数
9 func = lambda x: x*2
10 >>>func(3)
11 6
12 >>>(lambda x: x*2)(3)
13 6

2008年8月24日星期日

万里长征第一步

有些事情现在不做,也许以后永远也不会做。

第一步终于迈了出去。骑自行车出行,从徐家汇到闵行紫竹工业园。从Google地图上看距离约33公里,一个来回加上在紫竹工业园以及交大闵行校区骑行的路程一共约75公里。

一直梦想着能骑自行车出去,这次紫竹之行很成功,积累了一些自行车出行的经验。为自己自行车环中国游迈出了第一步!

一行三人,Shirley表现很出色!作为一名女生,75公里的路程硬是坚持了下来。好样的!

2008年8月21日星期四

借口是多么的苍白无力

面对犀利的询问者,无论什么样的托辞、借口都显得如此苍白。

还是认真的做好自己的工作。为自己的理想和目标工作!

2008年8月18日星期一

只有失败是不够的

更重要的是失败后总结,并修正错误。
俗话说失败是成功之母,这句话其实是概括了总结失败修正失败。只有总结失败,并修正才能不在同一个地方摔倒两次。

2008年8月17日星期日

沟通

        在我看来,读书也是一种沟通,是与作者的一次沟通。作者通过他的著作来告诉你他想要表达的思想,如果能读懂作者的表达的思想,那么这次沟通就是成功的。如果通过阅读而不能理解作者的意思,那就说明此次沟通存在问题,自己的知识水平和作者不是一个高度、自己和作者的专业领域不同、作者是个疯子?这些都是造成沟通障碍的可能原因。


        平时的工作生活中,我们也免不了要和其他人进行沟通,那每次沟通的成果如何呢?作为一名技术人员,免不了要和一些非技术员进行沟通。此时如何让他们知道自己在说些什么呢?众所周知,一些大牛们说的话都很通俗易懂,以至于人们有点怀疑他们是不是真的专家。殊不知,这才是牛的最高境界。将专业知识用平明话的语言来进行表达。什么是相对论?爱因斯坦曾经这样说过,当你和你心爱的人在一起时,一个小时好像10分钟一样的就过去了,如果让你一个人大热天的坐在火热的锅炉旁边的话,即使是一分钟,你也会觉得是像1小时或者更长一样。这样的描述,各个年龄段的人应该都能听的懂。你说不是吗?


        上面说的是大家在技术背景不同的情况下进行沟通时,当大家都是专业技术人员的话又该如何沟通呢?难道也要将专业技术术语来描述成平民化的语言?此时完全没有必要,既然大家都是在相同的背景下进行沟通,那么就尽可能的使用专业术语,言简意赅的描述有画龙点睛之妙。


        造成沟通困难的原因,大都是人的原因,个体的差异导致沟通时出现鸡同鸭讲的局面。为了保证有效的沟通,一,用平民化的语言来描述,也就是站在对方的角度来描述问题。二,进行专业沟通时要统一专业术语,当有新的专业术语出现时,大家要及时更新,保证描述的一致性。

2008年8月12日星期二

十年学会编程

著者: Peter Norvig
翻译: Dai Yuwen

为何人人都这么着急?

信步走进任何一家书店,你会看到名为《如何在7天内学会Java》的书,还有各种各样类似的书:在几天内或几小时内学会Visual Basic, Windows, Internet等等,一眼望不到尽头。我在Amazon 上做了如下的 强力检索 :
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)

得到了248个结果。前78个都是计算机类书籍(第79个是 Learn Bengali in 30 days)。我用"hours"替换"days",得到了类似的结果:更多的253书。前77本是计算机类书籍,第78本是 Teach Yourself Grammar and Style in 24 Hours。在前200本书中,有96% 是计算机类书籍。

结论是:要么人们都在忙忙地学习计算机,要么计算机比其它任何东西都容易学。没有书籍教你在几天内学会古典音乐、量子物理,或者是养狗。

让我们分析一下,象一本名为《三天内学会Pascal》的书意味着什么:

* 学习: 在三天里,你没有时间写一些重大的程序,并从成功或失败中得益。你没有时间与有经验的程序员合作,并理解在那样的环境下工作是怎么回事。一句话,你不会有时间学到太多东西。因此他们只能谈论一些肤浅的东西,而不是深入的理解。正如亚力山大教皇所说,浅尝辄止是危险的事情。

* Pascal: 在三天时间里,你可能学会Pascal的语法(如果你已经学过类似的语言),但你学不到更多的如何使用这些语法的知识。也就是说,假如你曾是个BASIC 程序员,你可以学着用Pascal语法写出BASIC风格的程序,但你不可能了解Pascal真正的好处(和坏处)。那么关键是什么? Alan Perlis 说过:“一种不改变你编程的思维方式的语言,不值得去学。” 一种可能的情况是:你必须学一点儿Pascal(或可能性更大的象Visual Basic 或 JavaScript之类),因为你为了完成某种特定的任务,需要与一个现存的工具建立接口。不过那不是学习如何编程,而是在学习如何完成那个任务。

* 三天内: 很不幸,这不够,原因由下一节告诉我们。

在十年里学会编程

研究表明 (Hayes,Bloom) 在任何一种领域内,象下棋、作曲、绘画、钢琴演奏、游泳、网球、以及原子物理学和拓扑学,等等,要达到专家水平大约都要化十年时间。没有真正的捷径:即使是莫扎特,4岁时就是音乐神童,13年后才开始写出世界级的作品。在另一方面,披头士似乎在1964年的Ed Sullivan表演上一炮走红。但他们从1957年就开始表演,在获得大众青睐后,他们的第一个重大成功,Sgt. Peppers,是1967年发行的。Samuel Johnson (塞缪尔·约翰逊,英国辞典编纂家及作家)认为要花比十年更长的时间:“在任何领域中出类拔萃都要用毕生的劳作来取得;它不可能用较低的代价获得。” 而Chaucer(乔叟,英国诗人)感叹到:“人生短暂,学海无涯。”

这是我为编程成功开出的方子:

* 设法对编程感兴趣,并且因为它有趣而编一些程序。确保编程一直充满足够乐趣,这样你才愿意投入十年宝贵时间。

* 与其他程序员交流; 阅读其它程序。这比任何书本或训练课程都重要。

* 写程序。 最好的学习方式是 从实践中学习。 用更技术性的话说,“在一个给定的领域内,个人的最大能力不是自动地由扩展了的经验取得的,但即使是高度有经验的人也可以通过有意识的努力来提高自己的能力” (p. 366) 和 “最有效的学习需要因人而异的适当难度,目标明确的任务,丰富的信息反馈,以及重复的机会和错误修正。” (p. 20-21) 此书 Cognition in Practice: Mind,Mathematics,and Culture in Everyday Life 是阐明此观点的令人感兴趣的参考文献。

* 如果愿意,在大学里呆上4年或更长(在研究生院里)。你会接触到一些需要学历证明的工作,你会对此领域有更深的理解。如果你不喜欢学校,你可以(通过一些贡献)在工作中获得相似的经验。在任何情况下,光啃书本是不够的。Eric Raymond,The New Hacker's Dictionary一书的作者,说过,“计算机科学不能把任何人变成编程专家,就象光研究刷子和颜料不会使人变成画家一样。” 我雇佣过的最好的程序员之一仅有高中程度;他做出了许多优秀的 软件,有他自己的新闻组,而且通过股票期权,他无疑比我富有的多。

* 和其他程序员一起做项目。在其中的一些项目中作为最好的程序员; 而在另一些项目中是最差的。当你是最好的,你能测试领导项目的能力,用你的观点激发别人。当你是最差的,你学习杰出者是怎么做的,了解他们不喜欢做什么(因为他们吩咐你做事)。

* 在其他程序员 之后接手项目。使自己理解别人写的程序。当程序的原作者不在的时候,研究什么需要理解并且修改它。思考如何设计你的程序以便后来者的维护。

* 学习至少半打的编程语言。包括一种支持类抽象的语言(象Java 或C++),一种支持函数化抽象的语言(象Lisp或ML),一种支持语法抽象的语言(象 Lisp),一种支持声明规格说明的语言(象Prolog或C++ 的模板),一种支持共行程序(coroutine)的语言(象Icon或Scheme),一种支持并行的语言(象Sisal)。

* 请记住“计算机科学”中有“计算机”一词。了解你的计算机要花多长时间执行一条指令,从内存中取一个字(有cache),从磁盘中读取连续的字,和在磁盘中找到新的位置。(答案)

* 参与一种语言标准化的工作。它可以是ANSI C++委员会,也可以是决定你周围小范围内的编程风格是应该两个还是四个空格缩进。通过任何一种方式,你了解到其他人在某种语言中的想法,他们的理解深度,甚至一些他们这样想的原因。

* 找到适当的理由尽快地从语言标准化的努力中脱身。

明白了这些,仅从书本中你能得到多少就成了一个问题。在我第一个孩子出生前,我读了所有的(关于育儿的)How to 书籍,仍然感觉是个手足无措的新手。30个月以后,我的第二个孩子快要出生了,我回头温习这些书了吗? 没有。相反,我依靠我的个人经验,它比专家写的数千页书更有用和可靠。

Fred Brooks在他的随笔 《没有银弹》 中定出了一个寻找优秀软件设计者的三步计划:

1. 尽可能早地,有系统地识别顶级的设计人员。

2. 为设计人员指派一位职业导师,负责他们技术方面的成长,仔细地为他们规划职业生涯。

3. 为成长中的设计人员提供相互交流和学习的机会。

此计划假设某些人已经具备了杰出设计者的必要才能; 要做的只是如何恰当地诱导他们。 Alan Perlis 说得更简明扼要:“每个人都能被教会雕刻:对米开朗其罗而言,反倒是告诉他哪些事不要做。同样的道理也适用于优秀的程序员。”

所以尽管买那本Java的书吧。你可能会从中学到点儿东西。但作为一个程序员,你不会在几天内或24小时内,哪怕是几个月内改变你的人生,或你实际的水平。

参考文献
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988. 2001年夏天典型的1GHz PC的各种操作要花的时间

答案
各种操作的计时,2001年夏天在一台典型的1GHz PC上完成:
    执行单条指令            1 纳秒 = (1/1,000,000,000) 秒
    从L1缓存中取一个word        2 纳秒
    从主内存中取一个word        10 纳秒
    从连续的磁盘位置中取一个word    200 纳秒
    从新的磁盘位置中取一个word(寻址) 8,000,000纳秒 = 8毫秒



不少人问我,他们首先该学哪种编程语言。没有绝对的答案,不过请考虑以下几点:

* 用你的朋友的。当被问起“我该用哪种操作系统,Windows,Unix,还是Mac?”,我总是回答:“你朋友用什么,你就用什么。” 你从朋友那能学到知识,这种优势可以抵销不同操作系统或语言之间本质的差异。也考虑你将来的朋友:程序员社区 — 你将成为它的一部分如果你继续往前走的话。你选择的语言是否有一个成长中的社区,还是人数不多、即将消亡? 有没有书籍、网站、在线论坛回答你的问题?你喜欢论坛里的那些人吗?


* Keep it simple, stupid. 象C++和Java这样的语言是为经验丰富的程序员组成的团队进行专业开发而设计的,他们专注于代码运行时的效率。因此,这些语言有些部分非常复杂。 而你关注的是如何编程,不需要那些复杂性。你需要的是这样的语言: 对单个的编程新手来说,它易学易记。


* 练习。你偏爱哪种学弹钢琴的方式:通常的交互式的方式,你一按下琴键就能听到音符;还是“批量”模式,你只有弹完整首曲子才能听到音符?显然,用交互模式学习弹钢琴更容易些,编程也一样。坚持用交互模式学习并使用一种语言。

有了上面的准则,我推荐的第一个编程语言是Python或Scheme。因人而异,还有其它好的选择。如果你的年纪是10岁以下,你可能更喜欢Alice。关键是你要选择并开始实践。
附录:书籍和其它资源

不少人问我,他们该从什么书籍或网页开始学起。我重申“仅从书本里学习是不够的。” 但我还是推荐:

* Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman)可能是最好的计算机科学的入门书,而且它的确把讲授编程作为理解计算机科学的一种方法。但它具有挑战性,会让许多通过其它方式可能成功的人望而却步。

* Scheme: How to Design Programs (Felleisen et al.)是关于如何用一种优美的、函数化的方式设计程序的最好的书之一。

* Python: Python Programming: An Intro to CS (Zelle)是优秀的Python入门指导。

* Python: Python.org上有许多在线指导。

* Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi) 被视为Abelson & Sussman的当代继承者。它是对编程的高层次概念的巡视。涉及的范围比Abelson & Sussman更广,同时可能更容易学习和跟进。 它用了叫做Oz的语言,不太知名,却可以作为学习其它语言的基础。


脚注
This page also available in Japanese translation thanks to Yasushi Murakawa, in Spanish translation thanks to Carlos Rueda and in German translation thanks to Stefan Ram.
T. Capey points out that the Complete Problem Solver page on Amazon now has the "Teach Yourself Bengali in 21 days" and "Teach Yourself Grammar and Style" books under the "Customers who shopped for this item also shopped for these items" section. I guess that a large portion of the people who look at that book are coming from this page.

2008年8月7日星期四

杂记

我们可爱的人民公仆,他们是在掩耳盗铃?总是限制着我们,难道整个国家都要做愚民吗?

今天终于把自己的域名转接到了Blogger上了,Google官方的设置说明需要变得有中国特色才行,通过Google找到了几个ip,作为自己域名的A记录地址才可以用过 http://blog.tairan.org 访问我的blog. CName 设置是不顶事咯,如果你也需要Google一把,准能有不错的收获。

今天还动手做了一次 SVN 版本库的同步 使用 svnsync 命令。目前只支持单向同步。这意味着写操作都要到提交到主版本库,正常的话,一定是看得比写的多,所以这种方式能满足要求。具体同步步骤如下
1. 创建一个新的空版本库,as 从版本库
2. 在从版本库的hook目录中建立一个空的文件, pre-revprop-change.bat
3. C:>\svnsync init 从版本库URL 主版本库URL
4. C:>\svnsync sync 从版本库URL

另外可以在主版本库中增加hook,让从版本库在每次主版本库改动后同步。有时间好好研究下 SVN HOOK,貌似很有意思。

now, 已经是2008年8月8日了,今天晚上奥运开幕式,期待惊喜!

2008年8月6日星期三

VIM 学习笔记

设置文件模板,通常使用两种设置文件模板的方法
在使用这两种方法之前都必须打开文件类型识别

filetype plugin indent on

1. 从模板文件中加载

autocmd BufNewFile *.py 0r $VIM/vimfiles/templates/python.tpl

文件必须存在,这里使用的是Windows版本的默认目录结构

2. 通过程序来设置文件中的模板
autocmd BufNewFile *.py
            \call setline(1, '#!/usr/bin/python')|
            \call setline(2, '# -*- coding:utf-8 -*-')|
            \call setline(3, '# $Id$')|
            \call setline(4, '# vim:set shiftwidth=4 tabstop=4 expandtab:')|
            \call setline(5, '')|
            \exe 'normal G'

在vim中一行命令如果需要折行的话在下一行的开始使用 \ 符号,| 作为管道符,把多个命令穿起来作为一组命令执行

两种设置方法采用实现 BufNewFile 事件,并自动执行特殊命令的方法来实现模板操作的