简洁强大的python 19行代码实现前摄器模式~~~

from twisted.internet import reactor
from twisted.internet.protocol import Protocol, Factory

class SimpleLogger(Protocol):

def connectionMade(self):
print ‘Got connection from:’, self.transport.client

def connectionLost(self, reason):
print self.transport.client, ‘disconnected’

def dataReceived(self, data):
print data

factory = Factory()
factory.protocol = SimpleLogger

reactor.listenTCP(1234, factory)
reactor.run()

没有一个多余的字符,i like it!!!

我所想象的未来的电子书及生态圈。

电子墨水屏,很好很强大,比如kindle,nook之类的产品已经上路,销量及反应都还不错。它们是未来吗?它们会改变我们的阅读习惯吗?我想一定会。

每次搬家的时候,望着成堆的书本,总是发愁,那个重啊,但是为什么还要坚持读呢?

深阅读,就是答案,好像只有书本才能让我深入的阅读,什么博客,微博,PDF(电脑上),我都难以深入的沉浸进去,但是电子墨水屏让人印象深刻,超长的续航时间,近似于书本的阅读体验,都让人很着迷,也让我似乎看到了阅读的未来。

我想,也许未来会在电子墨水技术上继续发展,出现完美色彩的电子墨水屏,在此基础上,一些公司开发出来伟大的产品,并在此基础上打造出一个生态圈,永远的改变人类的出版书籍的规律,比如说未来的小说:直接在电纸上阅读,购买,直接在电纸书上评论,想象一下,当你看到某一段精彩的部分的时候,这段文字下面出现几个星星的小图标,手指滑过去,叮叮叮,别人所发表的感慨就像气泡一样冒出来,并按照着读者的评价排列,你深有感触,于是也写下了你的对此时的心情的描述,恰如你的笔记一样,完成后保存一下,也或者是轻点一下分享,你的评论就上去了。。。

再比如:你阅读一本专业书籍,后面有大量的习题,看完一章后,你直接在电纸书上开始作答,完成后,保存或者分享

又比如:课堂上,老师布置了作业,通过电纸书分发到每一个学生的电纸书上,学生直接在上面作答,完成后直接点交作业。老师收到后阅读,点评,并反馈结果,啊!错了两题,当你再收到批改的时候,你再一次开始修改,再发送。一科学完后,想看一下自己的错题集,只要点一下书本的封面,并选择错题集,一个个题又出现在眼前。。。

还比如:网络作家,写好了自己的文章,也可能只开了个头,就发表了,读者看到后,直接“跟”或者买,出版社没有了,只有分发图书的电纸书企业分享一部分利润,作者很快就收到资金,于是继续写下去的动力就更强。。。

杂志的发行,就更简单,想象一下,轻点按钮就买到你想看的杂志,更主要是还更便宜,看完文章后,你还可以评论,可能小编或者作者本身还可以与读者互动,多么伟大。

再也不用搬着一大堆的书了,无论是出门旅行,搬家,上课,参加沙龙,都只需要带个阅读器而已,真心期待这一天的到来啊!

待突破的关键技术点:完美的彩色墨水屏,完美的触摸技术,强大的云服务商,当出现了这些后,一大批制作出版电子书的公司或者工作室就会涌现,在这个伟大的电纸化大潮中,中国的企业可以做什么呢?我想顶多以后做一做出版吧,前两个的研发我们做不了,但云服务可以做,目前豆瓣也是在做这方面的事情,但这要跟硬件完美的结合起来,说起与硬件结合,苹果做的最好,但苹果好像暂时没有发力在电子墨水技术方面?

拭目以待吧,或者现在就买个灰度的电子书阅读器,开始电子化体验!期待~~~

怎样成为一个称职的创业CEO

编者注: Alexander Haislip是自动云服务创业公司ScaleXtreme 市场主管和《风险投资概要》作者。文中他以一个创业CEO过来人的身份向我们倾情传授怎样成为一个称职的CEO:跟牛掰的人待一起;打造体验,而不是打造 产品;学会理财;设订大目标,采取小步伐。你可在Twitter上Follow他@ahaislip

如果你是一位创业公司的CEO,你可能刚刚募得一笔风险投资、拒掉了高薪工作、每天看看财政报告、跟你的竞争对手,同事,朋友,甚至你自己并肩作 战,你激情澎湃地鼓励他们去工作,让你的梦想更真实一点。 但现在我建议你停止称自己为CEO,把你的名片从LinkedIn商业主页上撤下来。

乔布斯早期的商业名片是: “新产品开发副总裁”,因为当时他很清楚它自己不能胜任CEO的位置;比尔盖茨一直称自己为“President”,很传统的叫法。不是每个人都能像扎克 伯格那样牛掰,如果你没有达到一个合格CEO的资质,那么停止假装你不能胜任的CEO这一称谓,从现在开始弄明白你应该干什么,你想达到什么目标。

1. 跟牛掰的人待一起

乔布斯先后有沃兹尼亚克, 马克库拉;克拉克(先后创立几家著名的硅谷计算机公司)有安德森;麦克奈利(美太阳微系统公司CEO)有贝托谢姆,乔伊,科斯拉;一个好的CEO应该如同 月亮,而旁边有很多星星在衬托他。牛掰人物会推动想法向前,清醒地执行计划,不断挑战你的高度。要真正从这些人身上受益,请保持接纳的多样性。因为来自不 同背景,不同年龄阶层的牛掰人物的意见会成为公司创造性的最佳基础和借鉴。

2. 打造体验,而不是打造产品

产品只是商业世界的“一次性演出”,而产品体验给你回忆,好的产品体验则带给你更多。如果你的产品有一个好的产品体验,接下来就是大量的销售。苹果 早期,消费者喜欢他们的电脑,因为他们花了很多钱在这个产品上,而且产品体验让他们觉得这款产品值这个价。产品的价格对你也很重要,因为它传达了一个信 息:这是对产品难忘体验的价值衡量,是唯一的。如果你提供一个免费产品,你就不要期望你的顾客在心里衡量它多有价值。

 

3. 学会理财

学习理财没有秘诀可言,有很多书可以帮你从基础财会晋升到优先投资;询问已经创业成功的朋友;在银行工作的朋友或有大公司里P&L(盈利和 亏损)经验的朋友;学着用QuickBooks 等等。因为创业公司的理财是极其重要的,能让你烧钱的期限只有几个月。真正的CEO必须心里有数而且虔诚地对待它。

4. 设订大目标,采取小步伐

许多有志成为硅谷CEO的人都读过吉姆·柯林斯(当代著名的管理专家)而且会告诉你他们的BHAG(Big, Hairy, Audacious Goal)。他们扬言要改写资料处理中心,重置移动支付系统,创造社交分享的新典范。这很好,但除了设定远大的目标,你还要有与之相匹配的能力,这样你才 是称职的CEO。而你要做的就是关注每天你在为顾客做的,而且每天取得一点点进步。

测试驱动开发的具体步骤.

1.指出需要的新我,可以记录下来,为其编写一个测试.

2.编写特性的概要代码, 这样程序就可以运行而没有任何语法等方面的错误,但是测试会失败, 没有关系, 看到测试失败很重要, 这样就能确定测试可以失败: 在试图让测试成功前, 先要看到它失败.

3.为我的概要编写虚设代码, 能满足测试要求就行, 不用准确的实现功能, 只要保证测试可以通过即可.这样一来就可以保证在开发的时候总是能通过测试了.(除了第一次运行测试的时候)

4.现在重写代码,这样它就会做自己应该做的事,从而保证测试一直成功.

在完成编码时,应该保证你的代码处于健康状态–不要遗留任何测试失败.

创业公司如何实施股权激励(转)

由于启动资金有限,很多创业公司都想通过实施股权激励方案,来吸引人才、稳定团队。但如何实施才能更有效呢?且听本期三位嘉宾将他们的实践经验娓娓道来。

 

股权激励是当然之选

文 / 宋崇宇

如何增强员工的向心力?如何稳定员工?这些问题是困扰广大创业公司的难点和重点。而考虑到创业公司很难通过提高工资和福利的方式来实现员工队伍的稳定,股权激励便是当然之选。

全面考虑双方情况

创业公司应该分析员工和公司两方面的情况,来确定较佳的股权激励方案。

从公司的角度来说,主要考虑的问题是:如何用较低的现金成本稳定员工、如何锁定和促进员工的长期贡献。从员工的角度来说,主要考虑的问题是:如何从公司的业绩增长中尽快获得收益、如何从公司未来的高成长中获得未来的利益。

解析实施方式

创业公司实施股权激励的方式有如下几种。

  • 虚拟股权。员工获得虚拟的股权比例,并不获得实际的股权,获益与对应公司股权的分红相关。
  • 股权增值权。员工按照一定的股权比例获得对应的股权增值收益。
  • 股权直接授予。在一定的条件下,直接向员工授予公司的股权。
  • 股权期权。授予员工在未来某一时间购买或获得股权的权利。

如果创业公司在短期内业绩增长有限,那么虚拟股权和股权增值权的方式均会给公司造成较大现金支付压力。而且虚拟股权的方式并不会对员工的长期表现产 生较大的激励作用,因为员工的收益与分红有关,就算业绩下滑,也可能会得到分红。尽管股权增值权方式能将员工利益与公司未来业绩的增长挂钩,但员工未得到 实际股权,并不和其他股东一起承担公司经营风险,因而获得的激励作用也有限。

采用股权直接授予方式,员工获得的是实实在在的“股权”(一般情况下授予人是公司的大股东),公司可以用这种方式代替现金支付,从而节省成本。另 外,员工获得股权后,其利益便与公司整体利益挂钩,这对锁定员工的长期贡献具有重大意义。从员工的角度来说,一旦获得真实的股权,则不仅可在公司有盈利时 获得分红,而且可以股东的身份分享公司未来发展的收益。

就股权期权而言,可以通过设定获得股权的对价从而将员工的收益与股权的增值锁定,因此在激励效果方面比股权直接授予要强许多。但获得股权的对价、获 益的评估等因素对股权期权的实施非常重要,这便涉及公司价值评估的问题。对于IT行业的创业公司来说,公司的发展可能非线性,也可能根本无规律可循,因此 公司现在价值的评估及未来价值的预估都是比较困难的问题,而且容易导致员工和公司之间出现分歧。在这种情况下,IT行业的创业公司如果实施股权期权存在一 定的不确定因素。

综上,对于IT行业的创业公司来说,建议先对员工实施一定数量的股权直接授予以实现员工的基本稳定,然后,设定业绩增长等指标或明确工作时间等条 件,分期分批实施股权期权。最后要强调的是,股权激励的工具是“股权”,其对于公司来说是一种“稀缺资源”,因此,需要严格界定被授予者的范围,同时还应 谨慎设计方案,争取用最少的成本达成最大的激励效果。

留住人才,稳定团队

文 / 郑友才

在移动互联网领域,真正的资产是人才,如何留住人才是创业成败的关键所在。本文将主要讨论创业公司如何通过实施股权激励,来留住人才、稳定团队。

创业型公司各方面的资源都非常有限,所以在分配和利用资源时一定要精打细算。加强新人的培养,不仅可为日后进行人才梯队管理做准备,还可以节约大量 的薪资成本。然而,新人会逐渐成长为行业老人,面对公司很难开出诱人的薪资的现状,难免会心理失衡。因此,创业公司需要强化公司奋斗目标,增强员工对公司 的归属感和认同感,同时应采取相应的物质激励措施。从长远发展来看,股权激励是很不错的办法。

实施股权激励一般有股份和期权两种方式。无论采用哪种方式,都要有相关条件,如员工必须在公司工作连续两年、离职后期权失效,等等。目的是让员工与公司一起成长,一起奋斗,一起分享。

创业公司可以拿出10%~30%的股份,奖励优秀员工,留住人才。有两种操作方式:一是直接无偿给予员工,通常员工占股比例较少;另一种方式是有偿给予,要求员工出部分资金来购买公司股份。出资比例因各个公司的情况而定,常见比例是1:1,即员工购买1股,公司给予1股。

期权方式是大多数互联网公司经常采用的。在公司上市或并购后,员工能从中获取相应的报酬。中国法律上没有明确承认期权这种方式,属于公司与员工之间 签订的一种民事协议。但在西方国家是予以认可的。通常的做法是拿出公司股份的5%~15%作为期权池,划分成若干股期权,对每股期权单独定价,根据员工的 贡献和职位高低配以不同数量的期权。操作起来相对简单、有效。

股权激励是一种长期激励措施,是保持员工积极性、创造性的有效手段。但人都是有惰性的,创业公司需要不断刺激员工,让员工不仅能看到长远的发展,也 能追求到短期利益。短期激励主要是奖金、福利手段。收入稳定的创业公司,可以按每个季度对员工进行奖励,最有效的方式是按月对员工予以奖励。福利手段,就 比较多了,比如来自外部的培训和交流,及公司组织的各类活动、商业补充保险等都是让员工认同公司的一种有效的短期激励手段。

巧施股权激励,招贤纳士

文 / 肖鹏

对互联网领域的创业公司来说,人才尤为重要。能否吸引优秀的人才加盟,是决定公司未来能否成功的关键。“良禽择木而栖,贤臣择主而侍”,要想吸引优 秀的人才,必然要提供足够的发展空间和比较丰厚的待遇。公司初创阶段,包括资金在内的各方面资源都比较紧张,没有能力单纯用高报酬来维持激励。这时,股权 激励就成为创业公司招募人才并激励他们努力工作的重要手段之一。

合理的薪酬是根本

股权激励只是一种激励手段。按照马斯洛的需求层次理论,股权激励更偏向于被尊重和自我实现的需求,属于高级需求。而合理的薪酬制度属于生理和安全的 需求,要优先满足。首先是基本薪酬制度设计必须合理,然后是以浮动薪酬调动核心人员积极性,最后是股权性薪酬激发管理层及核心人员与公司共同发展的积极 性。而很多创业企业一上来就讲股权激励,在没有建立起完善的基本薪酬制度的情况下,搞股权激励显然是本末倒置的。

需注意的四个问题

创业公司在实施股权激励时,最容易出现问题的地方就是创始人和公司员工对公司未来估计的不一致。尚未经历过融资的创业公司的股票价格还没有进行过公 开公平的估值,因此股票价格的确定具有主观性和不透明性。由于创始人对公司倾注了极大的 心血,很容易形成错觉高估公司的价值;而被激励对象往往因为创业公司条件简陋、各方面福利待遇和手头可供调用的资源不能与大公司相提并论,从而低估公司的 价值,认为获得的股份或期权是鸡肋,不足以补偿自己的付出。所以,与公司员工充分交流,对公司的价值有比较一致的预期是非常重要的。

其次,空头支票也要尽量避免。在实施股权激励时,有些创业公司往往把前景描绘得特别美好,但基本实现不了。因为员工不是傻子,这样的空头支票没有任何作用。即便员工一时相信了,但一旦意识到公司的真实情况,就会感到受欺骗,产生反效果。
还可能出现一种情况。在公司真正达到股权激励条件后,创始人却突然反悔,觉得当初定的条件太宽松而不愿兑现或打折扣,这样也必然影响士气。

最后,要注意免费午餐造成的不良后果。拿到股份很容易,很可能反而导致员工失去工作动力,起到反作用。

小规模公司,全员持股

在规模较小的互联网创业公司里,每个员工都很重要,所以比较适合实行全员持股计划,由实际出资创始人持实股,核心人员持干股,其他员工给以期权。至 于拿出多少股份来做激励,要依据公司的价值、员工的能力和贡献等,没有一定之规,分寸需要创始人自行把握。同时,也要参照激励员工的个人意愿。如果员工更 愿意拿高工资、低股份,在公司条件允许的范围内,也无不可。

由于创业公司的业绩具有不确定性,所以股价通常具有主观性且定价机制不透明,但要注意定价不宜超过真实股价过多。如果是无偿赠予核心人员的干股,则要考虑人员中途离职的问题。

目前市面上流行的协议时间在四年左右,因为时间太长会造成过度的压力,太短则起不到激励作用。

购买股份的资金最好由被激励对象出,因为这能将被激励对象与公司利益捆绑,有助于发挥被激励对象的积极性,同时缓解公司的资金压力。

  • 作者宋崇宇,北京市中银律师事务所合伙人律师。
  • 作者郑友才,摩安CEO。
  • 作者肖鹏,阿普创新创始人兼产品总监。

本文选自《程序员》杂志2012年04期,未经允许不得转载。如需转载请联系 market@csdn.net

Erlang学习笔记(3)–zenk

第四章 并发编程

发送消息:
pid = spawn(Module, Function, Arguments), 创建进程, 返回进程号
Pid!Message 来传递消息. 消息内容可以是任何的ERLANG数据类型
注意是感叹号来传递消息, 而不是linux习惯的管道符”|”,
Pid!Message 的返回值是 Message, 所以可以如以下这样使用
Pid3!Pid2!Pid1!Message, 消息会依闪发送给Pid1, Pid2, Pid3
BIF: self() 获得自己的pid

进程间的依赖, erlang中的进程是非依赖的, A发送消息给进程B, A并不管B是否
存在, 总是成功的, 也就是说, 它们只间并不相互依赖, 这非常重要.

接收消息: 与if语句类似,匹配到以后去执行
receive
;
end
Result = receive Msg -> handle(Msg) end, 接收消息并处理, 并且获得一个返回值.
receive 与 case语句的区别, 当receive语句中直到成功匹配一个消息前这个进程是暂停的,而在case
中则会发生运行时错误
这里可能是翻译的问题, 没有交待清楚, 实际上我这样理解:
receive语句如果没匹配的话,没有错误发生,而且这个函数的执行会因为没有消息过来而暂停, 而case则会报错.

注册进程:
register(Alias, Pid)
注册以后就可以通过 Alias!Message 传递消息
unregister(Pid), registered()返回已注册的列表.

receive

after
Timeout -> exp1, ,,. %Timeout是毫秒,这个结构表明,如果Timeout毫秒后消息还没来,则这里的语句被执行
end
%Timeout可以每次执行的时候被修改

死锁:

在erlang中,避免死锁的原则是:当进程A发送一个消息然后等待进程B响应的时候,那么进程B无论如何不允许同步调用进程A,因为这样做的话消息交叉造成死锁。

另外:不要通过调用内置函数process_flag来调整进程的优先级,在任何情况下都应该避免使用进程中的优先级别,牢记这一点,一个正确的并发模式设计将确保系统是平衡和可确定的,而没有饥饿进程、死锁或者竞争条件。

 

Erlang学习笔记(2)–zenk

第3章:Erlang顺序编程

case … of
Pattern1 -> expression1, expression2, .. ;

end
关键字是 case … of … end, 没有break, 没有default

如果表达式未被匹配,将会有一个运行时错误发生,但请不要使用
Other -> 这样的表达式来匹配这类错误,因为事后很难查错。
case语句是有返回值的,它的返回值等于第一次匹配到的值。

if 语句,if就相当于一个没有条件判断和of关键字的case语句:
注意,而不是像其它语言里面的if,if的用法。
if
Guard1 -> expression1, …;
Guard2 -> expression2, …;
end
if 表达式也是有结果的,与case类似。

保护元(guard):
用在函数的case或者receive语句中,用来限制语句的执行,放在函数头与函数体之间,->之前,由when 关键字和其后的一个表达式组成,只有当此表达式为true和模式匹配的情况下,这个语句才会被执行。
注意保护元语句中不可以是用户自定义的函数
用“,”分隔表达式,只有在所有表达式为真的时候,结果才为真
用“;”来分隔,表示只要有一个表达式为真,结果就为真.

元编程:一个函数在运行时才确定将调用哪些函数的特性叫做元编程,也就是在程序创建程序并运行。
apply/3: 说实话就是类似于PHP里面的eval(), 只不过这里已经规定了参数是3个,必须是
apply(Module, Function, Arguments).

输入和输出:
io:get_line, io:get_chars, io:read
io:write/1, io:format/2, 格式化输出要有控制序列及波形字符

递归与尾递归,现在的效率差已经不大,有时不一定尾递归比递归快。

DEBUG:原来erlang自带一个debug工具啊,哦HOHO,有时间的时候玩一下。

习题:
3-1:计算累加值。
sum(A) when is_integer(A), A > 0 ->
sum_r(1, A, 0).

sum_r(Index, Boundary, Sum) when Index =< Boundary ->
sum_r(Index + 1, Boundary, Sum + Index);
sum_r(_, _, Sum) ->
Sum.

sum_two(N, M) when N =< M -> sum_r(N, M, 0).

3-2:创建列表

make_list(N) -> make_list_cc(N, 1, []).

make_list_cc(Index, Boundary, List) when Index >= Boundary ->
make_list_cc(Index – 1, Boundary, [Index|List]);
make_list_cc(_, _, List) ->
List.

reverse_create(N) -> make_list_reverse_cc(1, N, []). %反过来创建列表

make_list_reverse_cc(Index, Boundary, List) when Index =< Boundary ->
make_list_reverse_cc(Index + 1, Boundary, [Index|List]);
make_list_reverse_cc(_, _, List) ->
List.

习题3-5:1

-module(ex35).
-export([filter/2]). %, reverse/1, concatenate/3, flatten/3).

filter(List, Num) -> filter_cc(List, Num, []).

filter_cc(List, Num, Result) when length(List) > 0 ->
[A|B] = List,
if
A =< Num -> filter_cc(B, Num, Result ++ [A]);
A > Num -> filter_cc(B, Num, Result)
end;
filter_cc(_, _, Result) ->
Result.

练习3-6:排序

快速排序的实现。

-module(ex36).
-export([quicksort/1, filter/3]).

quicksort(List) when length(List) > 0 ->
[Middle|ListDoing] = List,
%得到小于中轴的列表
ListLess = filter(ListDoing, Middle, true),
%得到大于等于中轴的列表
ListMore = filter(ListDoing, Middle, false),
%再分别调用此方法再排序
(quicksort(ListLess) ++ [Middle]) ++ quicksort(ListMore);
quicksort(List) ->
List.

filter(List, Num, IsLess) -> filter_cc(List, Num, IsLess, []).

filter_cc(List, Num, IsLess, Result) when length(List) > 0 ->
[A|B] = List,
case A < Num of
true ->
case IsLess of
true -> filter_cc(B, Num, IsLess, Result ++ [A]);
false -> filter_cc(B, Num, IsLess, Result)
end;
false ->
case IsLess of
true -> filter_cc(B, Num, IsLess, Result);
false -> filter_cc(B, Num, IsLess, Result ++ [A])
end
end;
filter_cc(_, _, _, Result) ->
Result.

%从中间劈开一个列表,返回两部分的值
list_split(List, Num, Left, Right) when length(List) > 0 ->
[A|Other] = List,
case length(Left) < Num / 2 of
true -> list_split(Other, Num, Left ++ [A], Right);
false -> list_split(Other, Num, Left, Right ++ [A])
end;
list_split(_, _, Left, Right) ->
[Left|[Right]].

%合并排序方法
joinsort(List, Res) when length(List) > 2 ->
[Left, Right] = list_split(List, length(List), [], []),
Res ++ sort_implode(joinsort(Left, Res), joinsort(Right, Res), []);
joinsort(List, _) ->
[Left|Right] = List,
sort_implode([Left], Right, []).

%组合两个顺序列表
sort_implode(A, B, Res) when length(A) > 0, length(B) > 0 ->
[A1|Aother] = A,
[B1|Bother] = B,
case A1 < B1 of
true -> sort_implode(Aother, B, Res ++ [A1]);
false -> sort_implode(A, Bother, Res ++ [B1])
end;
sort_implode(A, _, Res) when length(A) > 0 ->
Res ++ A;
sort_implode(_, B, Res) when length(B) > 0 ->
Res ++ B;
sort_implode(_, _, Res) ->
Res.

 

Erlang学习笔记–zenk

所用书籍:Erlang编程指南,机械工业出版社

第一章:跳过

第2章:Erlang基础

在开始之前要安装一下Erlang, 注意此书中未讲这部分,实际上自己安装一下非常的简单,在windows下面,可以直接去 www.erlang.org 下载windows下的二进制版本,一路next就完成了,在我所用的 Linux Mint 12 下,可以直接使用新得立软件包管理器,搜索Erlang, 并应用,搞定。

整数: -233 0, 2222, 434343434,在erlang里,整数可以无限大,不受32,64等的限制,只要你的内存有多大,就可以有多大的整数。强大了这一点。。。

表示其它的进制:2#1010 相当于十进制的10  (进制#数据),-16#EA表示整数-234, 8#34 就表示8进制的34. 非常强大的表示法。

“$” 表达式,哈哈,这个符号虽然与PHP里面的变量符号相似,但实际上意思是完全不同,它的后面只能跟一个ASCII字符,用来表示求其后所跟的字符的ASCII值,如 $a 表示的是 97, 而$A则表示整数65. $\n的ASCII数值则是10….

数学运算符:
+-*/一样,注意乘法与除法是浮点数的计算方式,结果也是浮点数.
新知识:
div : 整数除法.
rem : 整数取余, 相当于PHP,c++里面的 % , 此操作要求所给出的数是整数, 不可以是浮点数

基元(atom): 相当于其它语言里面的枚举
必须以小写字母开头(注意大写字母开头的是变量)
单引号: 用单引号包围起来的话基元可以是任何字符

布尔:
erlang中没有布尔类型, 基元 true , false 与布尔操作符一起用, 但并不是布尔型
BIF: build in function, 内建函数
is_boolean() 用来判断是否布尔型

逻辑运算符:
and : 两个都为真
andalso : and的快捷方式, 如果第一个为假, 则不判断第二个,
注:这里有疑问,其它语言里面本来 && 就是andalso, 难道erlang里面的and当第一个为假的时候还去判断第二个?
or:
orelse:与and的关系类似, 疑问也类似
xor: 异或
not: 非操作, 注意erlang里面没有 ! 求非符

元组(tuple): 复合数据类型, 用大括号围起来, 可以是基元, 整/浮点数, 其它的元组, 列表
元组的索引是从1开始,而不是PHP和C++里面的0,嗯,从1开始更直观.
BIF: tuple_size, element, setelement

列表(List):

字符串: erlang中没有字符串类型, 字符串是一个由ASCII值组成的整数列表, 比如”I am a String”
实际上就是列表[$I, $ , $a, $m, $ , $a, $ , $S, $t, $r, $i, $n, $g], 空字符串等价于空列表

基元与字符串的区别:
基元只可以用比较操作符.
而字符串可以进行多种不同的方式处理字符串.
基元在系统表中表示,它仅仅占几个字节用作索引,而与它的大小无关

列表的递归定义:
明白一条, 这几个列表都是等价的:
[1,2,3,4] [1,2,3,4|[]] [1,2|[3,4]] [1,2|[3|[4]]]]  [1|[2|[3|[4|[]]]]]

列表函数和操作:
这些函数不是内置函数.
lists:max lists:reverse  lists:split …
这里面要注意要记住一个 lists:nth 表示获得第i个元素的值
BIF: length

列表运算符: ++ 与 — , 用来表示列表的组合
[1,2] ++ [2, 3, 4] => [1,2,2,3,4]
特别注意: ++与–是右结合, 因此表达式:
[1,2,3] — [1,3] — [1,2]
是等价于
[1,2,3] — ([1,3] — [1,2])

在列表前添加一个元素,可以有两种方法
使用构造方法: [1|[2,3,4]]
使用++运算符: [1] ++ [2,3,4]
结果相同, 但是++运算符效率更低,并可能导致程序运行时速度大幅减慢.
因此当想添加一个列表头部的时候, 应该尽量使用构造器方法.

项元的比较:
注意不等于在erlang里面是 “/=”, 而不是常见的 “!=”, 注意此判断非类型敏感
“=:=” 精确等于
“=/=” 精确不等于

不同类型之间比较的顺序: 记住这个顺序. 或是有个大致印象. :)
number < atom < reference < fun < port < pid < tuple < list < binary
列表的比较, 是按字典顺序排.
[boo, hoo] < [adder, zebra, bee]. => false, 比较的时候是按顺序下来.谁先大出,则谁大
元组的比较, 是先比较元素数目,然后再一个个去比较
{boo, hoo} < {adder, zebra, bee}. => true

变量:
所有的函数的变量调用都是按值调用
变量无需申明可以直接使用, 类型无需申明, 是动态类型.
变量必须以大写字母开头, 记住小写开头的是基元.
变量的值只能绑定一次, 绑定以后不可再次绑定.
erlang中的变量没有引用的概念, 因为引用不适合于并行系统.

模式匹配:
Pattern = Expression , 简单来讲, 相当于PHP里面的 list() = array() 的结构.
List = [1,2,3,4]
[Head|Tail] = List.
Head => [1], List => [2,3,4].
通配符”_”: 相当于占位符. 它可以匹配任何东西, 而且不产生任何绑定.
{Element, Two, _} = {1, 1, 2}
_ 与 _var : _从不匹配,只占位, _var 与普通基元是一样的意义, 不同之处是如果这个变量没
有被使用, 则它不会出警告, 而普通的变量如果未被使用, 则会有警告.

函数:
参数数量叫元数(Arity)。
-> : 使用箭头来分隔函数体与申明
; : 用来隔开函数的多种匹配,有点类似于C++的多态,但erlang里面的写法更精简。
, : 用来隔开语句
. : 表示函数的结束。

模块:
一个.erl文件就可以是一个模块。
.erl文件要以 -module(Name) 开头
-export([Functionname/1]): 注意这个格式,表示导出的函数名,此函数所支持的参数个数。

Erlang的编译:
在erl终端下,可以直接输入c(ModuleName)来编译。注意先用cd(“/dir/of/your/path”)进入你的程序目录。
-compile(export_all) : 表示编译时导出所有的函数。
在命令行时可以使用 c(Mod, [export_all]) 来导出所有。
-import(Module, [Function/Arity,...]) : 用来导入外部的函数,就像内部函数一样使用,不需要在前面带上模块名称。
约定:尽量少用导入语句,以免引起代码理解的困难。

第二章习题:
前面几题不需要什么太多记录,重点记录试验一下第2-3.
习题2-3解答,这是我的代码。请保存成mybool.erl文件,再编译。
-module(mybool).
-export([b_not/1]).
-export([b_and/2]).
-export([b_or/2]).
-export([b_nand/2]).

b_not(false) ->
true;
b_not(true) ->
false;
b_not(_Other) ->
error.

b_and(true, true) ->
true;
b_and(_A, _B) ->
false.

b_or(true, _B) ->
true;
b_or(A, B) ->
b_or(B, A).

b_nand(A, B) ->
b_not(b_and(A, B)).
好了,第二章的学习暂时结束,转入下一个章节的学习。

php5.4升级的相关问题记录

1.eA加载器扩展安装不了, 这个加速器暂时还只支持5.3系列的. 如果是生产环境, 可以考虑用xcache来替代

2.xdebug暂时还没有支持最新的5.4, 只能去开发版本库去checkout出最新的版本去编译.

xdebug估计只要随着时间推移会有5.4版本的,但是ea的就扯蛋了, 这个项目从2010年以后就没有再维护了, 可能以后也会扯蛋了…