Lua cheat sheet

lua_cheat_sheet

http://coffeeghost.net/images/lua_cheat_sheet.png

做一些简单说明。

关于所有数字都是double,在《programming in lua》第二版中有详细说明。除了极少数情况,可以满足大部分数值计算的需求。

对于table的说明比较详细。但是对于一些高阶问题没有涉及。比如协程,算是Lua的一大特色。还有函数作为first-class value,也可以做出很多有意思的东西。另外还有meta-table,是Lua模拟OO的关键。另外限于篇幅C API也没有介绍,相比其它编程语言,Lua与C的配合几乎可以说是无缝的。

相比而言,维基百科上对于Lua的介绍更为全面,而且篇幅也不长。感兴趣的可以参考这个链接作为补充 http://en.wikipedia.org/wiki/Lua_%28programming_language%29

lua用于web开发的服务器配置

有两种方式,一种是apache2.3以上会内置的lua module,大家可以下载apache httpd 2.3.8的代码,在modules目录下有lua这个目录。

另外一种是今天要介绍的,使用wsapi方式。

我们使用ubuntu服务器,先确保lua5.14以及apache2都安装成功。

然后

sudo apt-get install apache2-mpm-worker liblua5.1-0-dev luarocks

sudo apt-get install libfcgi-dev libapache2-mod-fcgid

sudo luarocks install wsapi-fcgi

然后修改.htaccess或者httpd.conf或者你的vhost配置,添加下面部分。

Options ExecCGI
AddHandler fcgid-script .lua
FCGIWrapper /usr/local/lib/luarocks/bin/wsapi.fcgi .lua

要注意的是wsapi.fcgi也许是在不同目录下,用find自己找吧。

在var/www下你的站点中新建一个luacgi目录,然后建立两个文件。

launcher.fcgi:

#!/usr/bin/env lua

require "wsapi.fastcgi"
require "hello"
wsapi.fastcgi.run(hello.run)

index.lua:

module(…, package.seeall)

function run(wsapi_env)
  local headers = { ["Content-type"] = "text/html" }

  local function hello_text()
    coroutine.yield("<html><body>")
    coroutine.yield("<p>Hello Wsapi!</p>")
    coroutine.yield("<p>PATH_INFO: " .. wsapi_env.PATH_INFO .. "</p>")
    coroutine.yield("<p>SCRIPT_NAME: " .. wsapi_env.SCRIPT_NAME .. "</p>")
    coroutine.yield("</body></html>")
  end

  return 200, headers, coroutine.wrap(hello_text)
end

然后用chown –R www-data:www-data luacgi修改目录owner。

这时候应该就能用xxx.com/luacgi/index.lua访问了。

如果你用nginx,也有现成的lua mod可以使用(作者是淘宝的程序员),这里就不多说了。

闲聊-完成的很快却完成度很低

由于已经是历史了,所以这篇文字可以放出来了。2010年10月31日的草稿。

 

===========================================

这是一个很有意思的问题,算是”软件工程”的一个很好实例。

听人提到某个项目,开发人员很早就声称feature完成,等待release。可是不幸的是,测试以后发现种种问题,而且与硬件平台配合以后发现很严重的bug,导致这个项目迟迟不能release。

问题是很多,主要是从当事人那里得来,简单列举一下。

比如现在这个release已经包含了很多以前release版本commit过来的bug,本身就是很不稳定的产品,只是可以用罢了。

还有一个很严重的问题是硬件平台firmware的不稳定导致软件平台无法稳定测试,出现问题很难判断,另外firmware的变动也会导致嵌入软件必须随之变动。firmware常常号称已经OK,但是却充斥了bug,动辄还是需要返工。

再就是需要添加的feature太多,完成也不仔细,测试也不够。甚至在临近code freeze的时候还有新需求提出。

再比如平台升级到CE6.0系统,对平台不熟悉,也是引入了很多新问题,原来OK的不OK了,甚至产生严重的Memory leak等等。

还有比如文档不够,软件开发人员水平不够对产品不了解(导致新特性加入新bug),流程不完善,或者某个决定推来推去,谁都不拍板等问题。

总而言之,貌似开发人员做的很快,但是快将近一年半以后依然没有release。这个问题一定不是第一次发生也不是最后一次发生。

那么,该如何解决呢?

必看!IT好书101

http://www.ithome.com.tw/itadm/article.php?c=63952&s=2

由IThome组织的一次调查。被调查的专家群(这里面很多人的确可称为专家)

其中1)《人月神话》

2)Unix环境高级编程

3)计算机编程艺术

4)掌握正则表达式

5)有效用户界面(effective UI)

6)算法导论(introduction to algorithms)

7)计算机算法(computer algorithms)

8)数据结构基础-C语言 ( fundametals of data structures in c)

9)设计模式

10)代码大全2

11)重构

12)编程技艺(code craft)

13)applying and patterns

14)持续集成 – improving software quality and reducing risk

15)how we test software at microsoft

16)had first html with css & xhtml

17)designing web interfaces

18)javascript:the good parts

19) jquery in action

20) jquery cookbook

21)learning python 4th

22) complete web monitering

23) high performance web sites

24) even faster web sites

25) web operations: keeping the data on time

26) web analytics 2.0

http://sunxiunan.com

27) website optimization: speed search engine & conversion rate secrets

28) the art of community: building the new age of partication

29) building web reputation systems

30) the c programming language (K&R)

31) C名题精选百则-使用C语言-技巧篇

32)C++ primer plus 5th

33) effective c++

34) thinking in c++

35) programming – principles and practice using c++

36) programming the mobile web

37) tapworthy – design great iphone apps

38) building iphone apps with html, css and javascript

39) WPF4 unleashed

40) C# 4.0 in a nutshell

41) C# in depth

42) CLR via C# 3rd

43) head first C#

44) asp.net mvc2 实战开发

45) asp.net3.5 最佳实务讲座using c#

46)thinking in java 4th

47)effective java programming language guide

48) java puzzlers

49) head first java 2nd

50) core j2ee patterns

51) programming in scala

后面的书没啥意思,不录了。

到了日本才知道

在Greader上看到一篇《到了日本才知道》,心有所感。

这篇文章可以在这里看到“http://bbs.runsky.com/viewthread.php?tid=7156018

首先根据这篇文章说说一下我自己的看法,破折号后面是我的评论:

来了日本才知道,想要在12点之前睡觉是不可能的 — 很多国内的年轻人其实也差不多这样,比如港台那边的夜店,就是我们少有的,天上人间啥的也不是给我们开的。

来了日本才知道,不论你买什么都是要加5%的税的 — 这个税美国也有,大部分洲购物都有百分之七的税,除非是免税店。我们国家没有也不见得是什么优越性,因为很多进口商品在入海关的时候已经征收了高额税金,店家都给你加到价钱里了。还有一种怪现象是国内生产的电器,很多时候在国内买要比国外还贵,比如苹果Iphone、Ipad,比如笔记本。

来了日本才知道,水果都是论个卖的 — 这个没错,但是西瓜都是无籽非常好吃,另外也不用担心农药超标什么的。

来了日本才知道,老太太也是喝可乐的 — 这个是什么玩意?
来了日本才知道,天气再冷饭馆的水也是加冰的 — 美国也是如此,好像是西餐的习惯,他们喝牛奶也是不加热的

来了日本才知道,水龙头里面流出来的水不用烧开,是可以直接饮用的 — 美国也是如此,水质干净
来了日本才知道,吃面条是要出声的 — 这是一种习俗,好像古代日本也是如此,我记得是表达对厨师的尊敬以及面条好吃的意思
来了日本才知道,老太太化妆是正常的 — 让别人感觉到美也是一种礼貌,这种事情也觉得大惊小怪,只能说中国已经称不上礼仪之邦了
来了日本才知道,垃圾是要分类的 — 国内虽然在推行,但是非常没戏,还是素质问题
来了日本才知道,扔垃圾也是有时间规定的 — 因为丢垃圾要保证垃圾车能回收,你晚上丢,那不污染环境么
来了日本才知道,乱扔电视,冰箱,洗衣机是要被抓的 — 还是素质问题
来了日本才知道,钱包是可以随便塞在口袋里的 — 和后面几条关于小偷的一样。主要原因不是日本没有小偷,而是日本自古对小偷就有很严重的刑罚。现在日本大城市里面中国人多了,一样多了很多小偷。

来了日本才知道,乞丐是可以领钱的 — 社会保障做的好,这是资本主义的腐朽啊!
来了日本才知道,第二天穿的衣服和前一天的不能是一样的 — 应该是一种基本的社交礼貌吧
来了日本才知道,公用厕所是可以用来刷牙的 — 还是素质问题
来了日本才知道,找个蹲便厕所是很难的 –
来了日本才知道,所有的坐便都是发热的 — 这种电加热坐便盖还很贵的
来了日本才知道,所有公用廁所里都是有专用纸的 — 因为日本人和欧美人一样不会把公厕里面的纸带回家
来了日本才知道,看病的钱是只交30%的 — 看这社会保障,太腐朽了!
来了日本才知道,政府经济房是只租给穷人不买的 — 这也是,太腐朽了!
来了日本才知道,人民是可以随便换首相的 — 太落后!
来了日本才知道,土地是农民的,国家征用是要掏钱的 — 腐朽!
来了日本才知道,政府是给人民办事,不是收钱的 — 落后!
来了日本才知道,生孩子是可以拿钱的 — 腐朽!
来了日本才知道,保险理赔是很容易 — 落后!
来了日本才知道,顾客永远是对的 — 不可理喻!
来了日本才知道,河里的鱼,是没人吃的 — 这一点和欧美一样,还是中国人少,多了都给你捞回家去
来了日本才知道,去别人家是要脱鞋的 — 基本礼貌
来了日本才知道,别人今天送你的东西当时要道谢,改天见到人家还是要再次道谢的  — 腐朽!繁琐!虚伪!
来了日本才知道,图书馆和教室都是铺地毯的 — 浪费!

来了日本才知道,日本盖房子不分东南西北的 — 这一点要特别说明,其实日本人均住房面积相比国内大城市要高很多,小日本房子住的憋屈,那是一种自我安慰罢了,关于这一点,可以看看萨苏相关买房的博客文章。

来了日本才知道,不管多小的房子里面都是有浴缸的 — 还要说明的是,日本大部分房子厕所和浴室是分开的,这不是现在才有的,我姥姥家是日本房(在现在万达华府附近)就已经是这种卫浴分离的样式了。

来了日本才知道,新租的房子进去是啥都没有的
来了日本才知道,车道是那么窄的 — 但是不怎么堵车,因为大家都坐地铁了
来了日本才知道,人行道和自行车道是一起的 — 没错!
来了日本才知道,这么窄的路还是照样骑自行车的 — 02年我去日本就弄了一辆自行车到处串
来了日本才知道,骑自行车是要开灯的 — 这一点要说明,日本的自行车都会装那种磨电车灯(就是靠着车的骑行发电的车灯),这对于骑车安全来讲很重要
来了日本才知道,两个人是不能同骑一辆自行车的 — 难道不应该么?!
来了日本才知道,修自行车的钱差不多可以买个崭新的 — 人工费贵,车便宜
来了日本才知道,驾照是很贵的 — 这不知道
来了日本才知道,驾照是比身份证管用的 — 欧美也是如此吧
来了日本才知道,大小车辆都不按喇叭的 — 这是基本的礼貌吧?!
来了日本才知道,大车让小车,小车让自行车,自行车让行人,行人是最大的 — 这是基本的礼貌吧?!
来了日本才知道,汽车驾驶座都是在右边的
来了日本才知道,打的是很贵的 — 因为车辆便宜每家都有,另外大城市地铁特别通畅
来了日本才知道,公交车是按路程来算的
来了日本才知道,电车时间是不会差一分钟的 — 想想我们国家的民航!
来了日本才知道,物价是没个准数的 — 想想我们的物价,那是always上升的!
来了日本才知道,过新年原来也是这么安静的 — 到圣诞节你上街看看!
来了日本才知道,男人原来是可以那样女性化的 — 国内不也这样么?!
来了日本才知道,男人的眉毛是可以修饰的那样精致的
来了日本才知道,男人的包包是和女人一样单肩背的
来了日本才知道,女人出门都是一定化妆的 — 基本的礼貌!
来了日本才知道,女人化不化妆差别是很大的 — 其实日本女人化妆还算比较淡,这里说的是非主流吧?
来了日本才知道,女人们的腿永远是光着不怕冷的 — 这没错,冬天也不穿长筒袜的
来了日本才知道,女人抽烟的人数是比男人还多的 — 我没见识过,这一点肯定是不可能的
来了日本才知道,女人们不管裙子有多短,都是敢骑自行车的
来了日本才知道,日本的老头是很色的 — 国内的老头是没机会色吧
来了日本才知道,日本人其实是很笨的 — 真的么?中国人最大的优点和缺点就是以为自己最聪明,不少人说美国人也是非常笨
来了日本才知道,日本人是一条筋不会变通的
来了日本才知道,大声喧哗是要被告的 — 基本礼貌常识吧!
来了日本才知道,酒后驾车是罚全车人的 — 我很赞同!
来了日本才知道,不到成年是不能抽烟喝酒的 — 难道不应该么!
来了日本才知道,色情场所原来也是可以合法营业的 — 国内有差么?!
来了日本才知道,男人也是可以陪的 — 国内有差么?!
来了日本才知道,黑社会是不欺负老百姓的 — 这一点太落后了,我们这是谁都可以欺负老百姓
来了日本才知道,警察是干城管的活的 — 这一点不是很同意,但是没接触过日本警察,不评论
来了日本才知道,想找小吃摊是很难的 
来了日本才知道,打工是可以按美国时间的
来了日本才知道,年轻妈妈也是可以穿的很辣的
来了日本才知道,所有学校必须得有运动场和游泳池的
来了日本才知道,如果你不亲自来一次是永远不会了解这个国家的…

对于日本,我是抱着很好奇的态度。国内人看日本,就是从CCAV上、报纸上看到的印象,有机会,真的应该去亲眼看看。就跟老外看中国一样,不到这个地方呆上一段时间,你是不会了解它的。

如果没机会去日本,也可以看看萨苏、茂吕美耶关于日本的博客文章或者书籍,一样可以了解日本的风俗和文化,另外大连这边去日本出差工作的非常多,跟这些朋友聊聊也能得到很多亲身体验。其实,真实的日本和大多数人想象中的出入很大,别被那些媒体给糊弄了。

评《最容易被人忽略的基本代码优化技术》

这篇文字主要来自我在TopLanguage讨论组里面的发言,仅作总结留记。

首先要介绍一下原文作者Walter Bright,从他主页可见他是一个很牛的程序员,主要工作领域是写编译器。这个背景很重要,这是原文第二条的主要基础。但是也要注意到,一百个程序员里面也许都没有一个知道如何编写编译器,知道如何读写汇编的程序员比例也许会高一些,但不会很高,估计也就是百分之几的样子,比如我只会读一些简单的汇编代码,但是不会写。

这篇文章认为Profiling和看汇编语言如何被运行的是两个基本技术,我在讨论中也没有提到写汇编,因为会读的人要比会写的多出不少。但是看汇编真的不是一种基本的优化代码手段。

首先这个代码就很值得讨论,Javascript算不算代码?Ruby on rails或者Django这些框架算不算?或者Mono、Java、DotNet算不算代码?这些领域的程序员,很少有人会从汇编语言层面来做代码优化。如果你是一个类似项目的Team leader,组员说他最近在读某Rails项目的汇编代码,想找出慢的原因并加以改进,建议你立刻把他开掉,因为要么他是在磨洋工,要么是脑袋坏掉了。

Profiling是优化代码的必要手段,而不是什么可以被忽略的技术。实在无法想象没有做Profiling,如何找出系统瓶颈,如何做代码优化。换句话说,没有Profiling其实也就没有基准数据,怎么保证你修改的代码一定是优化的?!从这一点上说,忽略Profiling来进行优化,很难想象。

关于Windows下的Profiling,我以前写过一篇博客Profiling C++ performance in Windows http://sunxiunan.com/?p=1216 (名字虽然是英文的,但的确是我写的),里面介绍了一些我看到的或者用过的Profiling技术,颇为简陋,但也帮我做了不少代码优化相关的工作。

正常一个通用的代码优化过程应该是这样的:

1)用户提出性能有问题。如果没有人提出,那就尽量不要作修改,因为优化往往会带来更为混乱的代码,或者一些很难理解维护的代码关系。

2)询问用户他们期望达到的运行速度是什么。因为优化往往是在这里做做在那里改改,如果达到了期望值就要立刻停下来,否则过犹不及。

3)对当前系统做Profiling,收集运行数据。要注意Profiling会多少导致系统运行速度变慢,如何获取正确的运行数据,需要做一些编程工作。并不是拿来一个工具就一定会找到问题。另外还要确认Profiling数据本身是正确的,否则优化多半会是徒劳的。

4)取得数据以后对系统做逐步改进。这一步要注意的是每一步改进都要尽可能的独立、可回退,每做一步改进都要做一次新的Profiling,保证修改以后的代码真正有了速度上的提升。如果对性能提升效果不明显,就不要引入这个修改,哪怕你在上面投入了很多精力,要敢于舍弃。另外做代码优化要着眼全局,不能局部优化了,但是整体运行速度下降。另外要注意对于每一次修改,应该有相应的测试手段保证修改不会影响系统运行。基本上这些优化代码都会引入一些新的bug。关于性能优化,有一篇很不错的文章可以参考http://csbabel.wordpress.com/2010/04/29/interviewbible-1-speed-optimization/

5)代码优化达到期望值以后,停止优化过程,记录相关数据以及优化方法,留作以后查询。

我们这里只提代码优化,其实优化还有很多其它手段,比如添加更好的硬件,换一个快的数据库或者做做数据库调优,改改系统参数,换一个更快的webserver,优化本来就是一个系统工程,光看某一个点很难做好优化,应该有全局观点。

至于看汇编代码找问题,主要是针对C程序员或者C++程序员。但是要知道现在的编译器技术发展与8086时代是完全不一样了,编译配置是完全优化的代码,你很难从运行中看出问题,产生的汇编代码也很难读懂。这也是我很不推荐大家用看汇编来做优化的原因,有时间可以找到更多更严重的系统瓶颈。如果要从汇编层看问题,首先要看懂汇编代码,然后还要会改汇编代码,投入产出比例差太大。而且找到问题就看汇编,容易陷入细节,要时刻牢记优化应从大处着眼,抓大放小才是硬道理,我算是一个比较普通的VisualC++程序员,也做过一些简单的性能优化,基本上用不到看汇编就知道问题所在,profiling是最有用的也是唯一的工具。当然对于作者这样写编译器的程序员而言,看汇编写汇编是他们的日常工作,那就另当别论,但不能推而广之。

另外需要强调的是,虽然不建议大家在优化时看汇编,但对于程序员来说,学习时深入到汇编这一层是非常有帮助的。比如一些常见的问题如calling conversions(http://sunxiunan.com/?p=1229),i++和++i有什么区别,const一些研究http://sunxiunan.com/?p=870 都是看到汇编代码以后就比较容易理解。

总而言之,任何一个程序员要知道如何做代码优化,应该了解代码优化的基本步骤,自己相关领域的一些常见性能问题的模式,自己工作领域常见的Profiling方法和优化工具。有的放矢才能更好的工作。

KISS理论乱掰

KISS理论不是一个感情方面的娱乐节目,而是编程领域里面很重要的设计思想。

电脑编程与其它方面的科学相比,总差了一些严谨性或者理论不是那么完善,很多理论都是基于猜想说话,而没有数据支持。不过KISS这个理论我是认同的,从某种程度上讲,KISS很像是奥卡姆剃刀原理,越简单越正确。

KISS是什么意思?这个就众说纷纭,也可见电脑编程之不科学。有人说是Keep it simple, Stupid!翻译过来就是,“简单点,傻瓜!”很有一些Nerd傲视群雄的气派,但是我喜欢翻译成“要简单,要尽量傻!”(也就是stupid翻译为形容词),理由后面会解释。在维基百科上http://en.wikipedia.org/wiki/KISS_principle介绍了KISS理论的一些相关概念,还有一些人名、链接什么的让你可以跑题。

为何KISS理论很有趣很重要?我个人感觉,KISS理论让人时刻牢记,人是傻的、或者说大部分都是傻的,而编程代码是给人看的,所以复杂代码复杂算法复杂函数都会导致后续维护的困难,从软件工程角度上说,编码阶段与后期维护阶段时间基本上是1:N的关系,越复杂的软件N值越大。

以前一个编程书籍阅读小组,想用UML来描述一个网页游戏的架构,结果对于一个类应该属于这个还是那个争吵不休,看了让人觉得很好笑。一个类属于A还是属于B是不是很重要的事情?depends on,但是对于五五开的问题来说,真的没必要争论几天时间,还不如选一个简单的方案先实现出来。

还有常见的简单问题复杂化的例子是代码重用以及接口扩展。有些人觉得自己编程水平高,言必称重用。比如C语言没有类如何重用代码?都是似是而非的一些问题,连重用是什么这样基本概念都不知道,就敢张嘴乱讲,真真是2B了耶哥哥。接口扩展复杂化的例子在windows api里比比皆是,很多函数就在文档里指明,这个参数应该用NULL,这不扯么,都没有用的参数,当初怎么加进去的?!

程序员为什么喜欢把代码复杂化?当然是有原因的,首先一个就是让人看不懂,而未知的东西都让人有一种神秘感恐惧感,这样程序员就感觉自己对代码有掌控力,你们都不行就我知道怎么改,你敢让我走路么?!另外一个原因是,复杂化的概念让人觉得有价值,比如你看最近《程序员》上关于云计算的文章,国内这些砖家穴者都纷纷出来推崇云计算,但是文章内容毫无价值臭的跟狗屎一般,都是一些大词(big word)的堆砌繁衍。我在twitter上与程序员主编问过,他无奈回答是”商业需要“。另外一说数据库,一定是Oracle最好,开源的不可靠,为何?因为Oracle那多复杂,连调优都能整成一个赚钱的职业。

一个程序员要时刻牢记“简单化、傻瓜化”编程,代码要一目了然;长的函数要变短,要不怎么称得上简单;复杂的条件判断要分解,要不怎么称得上傻瓜化,太复杂还得用笔算是不是;至于变量名字,就越直白越好,比如bool IsThisGirlBeautiful(),这种函数一看就懂,连文档都不用写。