Fox's profileFox涂鸦PhotosBlogListsMore ![]() | Help |
|
|
October 19 没有目标
本文同步自游戏人生 ------------------------------------------------------------------- 自从工作之后,暂时的,没有了学习的压力,没有了找工作的压力。在很多人眼里,我成了一个『有为青年』。久而久之,潜意识里还真有把自己往高远处推的迹象。说话的口气就像现在这样,喜欢用过去式,以彰显自己那幼稚的沧桑感和浅薄的厚重感。每当和别人谈起如何做事的时候,动辄大放厥词,畅谈目标的重要性,讲什么要有明确的目标。 前几日在和明轩聊天时提到他今后的目标,他很坦诚地说没有目标。这令我很不爽,已经进入大学的人了,怎么可以没有明确的目标? 后来,和老婆提起这件事,老婆反问:你大学的时候有目标吗? 是啊,我不仅大学的时候没有目标,大学毕业的时候没有目标,甚至工作了很久依然没有目标。仅仅因为自己现在似乎好像有了一个似乎好像可以叫目标的东西,就急于让一个刚踏入大学校门的小伙子必须有一个明确的目标,的确是很可笑的一件事情。 想想读书的时候,已经大三了还在试图转学新闻、传播、经济的我,以及后来虽转回本专业却立志于并行计算方向的我,以及读研之后依然徘徊在应用和研究之间不知所谓的我。要不是突然来到的一份工作使我的两只脚突然站到了地上,我可能到现在都不知路该怎么走,又该走到哪里。就这样,算是把以前自己辛辛苦苦树起的目标一个个推倒,又冷不丁的撞上了一个目标。我甚至不知道这个目标多久又会倒下,又怎么好去强求别人呢? 在这十年里,现实跟我开了一个不大不小的玩笑:大一开始学写代码,现在还是在学写代码。和大多数人不一样的是,这段时间对我来说是分段连续的,每一个间断点处都有一个不为人知的故事。 从这一点看,我不仅算不上一个好的例子,简直就是失败的典型。 看来人真的会很容易选择性失忆,哪怕这事儿就发生在昨天。 如果我看见你一直在路上走,又何必太在意你走向哪里?即使停下来的时候,也不必催促你快点上路。 或许,我需要做的只是在你累了的时候陪你说说话;在你困了的时候就选择闭嘴。 而所谓目标,不过是一个玩具,既然你有一个感兴趣的东西可以玩,我怎么能扫你的兴? 下面这段话,不知道是什么时候写下的,似乎是为了强调目标需要明确。现在保留在这里,只是为了可以缓解一下紧张的情绪。 ----------------------------------------- 又是一年校招时,脑子里闪过几句话,不知所谓。 没有哪个游戏研发团队在招聘程序员时,会从网络到数据库,从图形到声音,从AI到UI,对一个求职者要求的面面俱到,除非他们是在寻找救世主。 所以如果你瞄准的是一个基本的服务器端programmer,你没有必要为不知道truncate和drop的区别而难堪。当然,你也没有必要为了申明这一点,非得面对面试官(说不定就是你未来的leader)强调你不知道也无所谓。 对于在校学生,一般公司看重的就是他们身上的这种可塑性。而所谓可塑,不是指一张白纸,而是指一块璞玉。因此对于一个coder,基本数据结构、基本语言特性、基本算法理论、基本知识结构就是公司最看重的。 请移步至此阅读全文» October 13 数学史上的一些人
本文同步自游戏人生 ------------------------------------------------------------------- 很多对于科学史知之甚少的人,往往对于爱因斯坦、特斯拉等人进行着神化。 我属于对科学史知之甚少的那一部分人,但我脑子里一直有一个观点:历史是人类史,而不是个人史。同样,在个性色彩鲜明的科学发展上,我依然坚持认为一个时代的历史是一个时代(甚至几个时代)的科学家(甚至包括整个人类)共同创造的。 这个过程就像制作一顶皇冠,不能因为我们只看到了为其镶嵌璀璨宝石的那最后一个工匠,就想当然的认为是他制作了整个皇冠。每当我们提起这顶皇冠的时候,除了想到他,至少我们还需要能够承认其他人的伟大贡献。 如果希望解决无知带来的各种荒唐的观点和成见,最好的方法是多读书,少说话。 我不指望自己把这些历史能够理的多么条分缕析,至少我现在还有其他事情去做。单是下面的东西如果能让你明白一些道理,也就够了。我只是提到了几个路标,至于发现更多的路标和路到底怎么走,是不需要别人教的。 ------------------------------------------------------------ 一直以来,我心里都有对于二弟明轩同学的愧疚,这种愧疚源于亲为兄弟却少之又少的交流。今年高考之后,听从我的建议,他选择了在临沂师院读信息与计算科学。因为我一直认为,数学对于理工科学生是终身受益的一门艺术。如果他以后希望做软件,这也是一条比较好的路线。 下面的所有内容均来自华东师大数学系的网站,因为明轩不能上网,我只好整理一下,同步到空间里了,所以本文算是转载。 ---------------------------------- 惠特尼 H.Whitney(惠特尼)的本科时候读的不是数学,话说他学业完成,到欧洲大陆去玩,大概是到了Gottingen(格廷根)还是什么地方了,反正是个很有名的地方,当时有一个很牛的物理学家(不是海森堡就是薛定谔)正在做一个关于量子力学的讲座。 等得讲座结束之后,Whitney什也么没听懂,感觉及其不爽,于是找到了那个主讲的人,说,先生,我觉得你做的讲座很不成功。主讲的教授很纳闷,就问他说为什么。Whitney回答说,我可是Yale(耶鲁大学)大学的优等的毕业生,你讲的东西我竟然听不懂,这难道不是你讲的有问题么。那个教授继续问,你是读什么专业的。Whitney回答说,我是读小提琴的……教授无奈了,说这个我也没有办法,你要想懂的这些东西的话你应该学一点基础的课,于是告诉他这个世界上还有数学分析和线性代数等等…… Whitney回美国之后就开始发奋学习数学,据说半年之后就可以参加很高级的讨论班了。当然他是非常刻苦的,数学的历史上还是有很多这种大器晚成的例子的。 ---------------------------------- A.Coble A.Coble是上个世纪美国的院士,做代数几何,一度很有影响。据称,他有无穷多个博士论文的题目:当你证明了一个2维的情况的时候,他叫下一个博士生去证明3维的情况,然后叫下下个博士生去做4维的。后来有个叫Gerald Huff的博士,不但做了5维的情况,而且对一般的n也解决了。这就让Coble的未来的无穷个博士无所事事了。Coble很怒。 ---------------------------------- 爱因斯坦 关于这个宇宙最让人难以理解的地方就是她竟然是可以被理解的。——Albert Einstein (1) Einstein构思广义相对论的时候,尽管他的数学家朋友教了他很多Riemann(黎曼)几何,他的数学还是不尽如人意。后来,他去过一次Gottingen,给Hilbert(希尔伯特)等很多数学家做过几次报告。他走不久,Hilbert就算出来了那个著名的场方程,Hilbert的数学当然比Einstein好很多。不久,Einstein也得出来了,有人建议Hilbert考虑这个东西的署名权问题,Hilbert很坦诚的说:“Gottingen马路上的每一个孩子,都比Einstein更懂得四维几何,但是,尽管如此,发明相对论的仍然是Einstein而不是数学家。” (2) Eddington(爱丁顿)是一个伟大的天文物理学家,下面这个故事是讲他如何吹牛的。Albert Einstein的广义相对论发表没有多久,有记者去采访Eddington,说听说世界上只有三个人懂得这套高深的理论,不知这三个人都是谁?Eddington低头沉思,很久没有回答。那个记者忍不住又问了一遍,Eddington说:“我正在想谁是第三个人……” (3) 似乎每一个伟大的人物都以和Einstein交谈过感到无比的光荣。杨振宁提到他当初见Einstein的时候,过于激动,以至于事后根本不知道自己说过什么Einstein又说过什么。Lev Landau(朗道),苏联最伟大的那个物理学家,就说自己当年参加某会议的时候,有幸和Einstein说过几句话,而有某个认识Landau(E.朗道)的人说Landau纯属幻想,当时此人和Landau一起,坐在那次开会的大厅的最后几排,连听都听不清,根本不可能谈话。可见Landau对Einstein的景仰程度。 不过另一个版本说Landau在下面指出了爱因斯坦犯了一个错误,Einstein说他不需要听他的演讲了。这是一位英国物理学家后来回忆当时的情景。 (4) 讲几个Einstein和数学家的事情。 Einstein描述广义相对论,用的数学就是弯曲空间上的几何学,意大利的数学家Levi-Civita(勒维-契维塔)在这种几何学上做出了突出的贡献。所以,有人问Einstein他最喜欢意大利的什么,他回答是意大利的细条实心面和Levi-Civita。 Einstein是Minkowski(闵可夫斯基)的学生,旷了无穷多的课,至于多年以后,Minkowski知道了Einstein的理论的时候,感叹道:“噢,Einstein,总是不来上课——我真的想不到他能有这样的作为。” 一次,P.Halmos(哈尔莫斯)和妻子遇到了Einstein和他的助手,Einstein很想知道“她”是谁,助手就说是Halmos的妻子,然后Einstein又问Halmos是谁……Halmos最没有面子的一次。 ---------------------------------- 希尔伯特 “我们必须知道,我们必将知道。” 1) Hilbert(希尔伯特)曾有一个学生,给了他一篇论文来证明Riemann(黎曼)猜想,尽管其中有个无法挽回的错误,Hilbert还是被深深的吸引了。第二年,这个学生不知道怎么回事死了,Hilbert要求在葬礼上做一个演说。那天,风雨瑟瑟,这个学生的家属们哀不胜收。Hilbert开始致词,首先指出,这样的天才这么早离开我们实在是痛惜呀,众人同感,哭得越来越凶。接下来,Hilbert说,尽管这个人的证明有错,但是如果按照这条路走,应该有可能证明Riemann猜想,再接下来,Hilbert继续热烈的冒雨讲道:“事实上,让我们考虑一个单变量的复函数.....”众人皆倒。 2) 一次在希尔伯特Hilbert的讨论班上,一个年轻人报告,其中用了一个很漂亮的定理,Hilbert说:“这真是一个妙不可言的定理呀,是谁发现的?”那个年轻人茫然的站了很久,对Hilbert说:“是你……”。 3) 这一个是因果循环的。Hilbert写的第一篇关于Dirichlet(狄利克雷)原理的文章,希望Fredholm(弗莱德霍姆)能够欣赏,但是Fredholm根本就没看;F.Riesz(F.里斯)写了很多文章,希望Hilbert能够欣赏,但是Hilbert根本就没看;M.Riesz(里斯)写了很多文章,希望F.Riesz能够欣赏,但是F.Riesz根本就没看…… ---------------------------------- 棣莫佛 de Moivre(棣莫佛) 21岁的时候,已经靠教数学为生,并且深信自己完全精通了这门学问。一个偶然的机会,他在一个公爵家里做客,恰好Newton(牛顿)送来了自己的《原理》,他信手翻了一下,惊奇的发现,数学竟然如此精深如此美丽的一门学问。这样,他买下了这本书,尽管为了教学需要四处奔波,他还要撕下书页,以便能够带在口袋里,空闲时进行研究。 ---------------------------------- 克莱茵 1)Klein(克莱茵)上了年纪之后,在Gottingen的地位几乎就和神一般,大家对之敬畏有加。那里流行一个关于Klein的笑话,说Gottingen有两种数学家,一种数学家做他们自己要做但不是Klein要他们做的事;另一类数学家做Klein要做但不是他们自己要做的事。这样Klein不属于第一类,也不属于第二类,于是Klein不是数学家。 2)Wiener(维纳)去Gottingen拜访这位老人家,他在门口见到女管家时,问到教授先生在么?女管家训斥道,枢密官先生在家。一个枢密官在德国科学界的地位就相当于一个被封爵的数学家在英国科学界的地位,譬如说Newton(牛顿)。Wiener见到Klein的时候,感觉就像去拜佛,后者高高在上,Wiener的描述是“对他而言时间已经变得不再有任何意义”。 3) 当初王诗宬(宬-chéng)老师请了一个法国的拓扑学家来北大做报告,他讲的东西和双曲几何有些关系,半路上,突然讲到了Klein和Poincare(庞加莱)的故事,说是Klein和Poincare都在研究自守函数什么的,对于2维的的情况,Poincare把自己的结果用Fuchs(富克斯)的名字来命名,因为这个人的东西他曾经看过,并且有很大的影响,Klein感到特别的不爽,他也得到了这样的结果然而Fuchs本人对此却一无所知,如此冠名,他自然觉的很不妥。后来,他和Poincare分别做3维的情况,无奈自己不是Poincare那样的天才,用功过度,体力不支,身体都垮了,从此结束了自己创造性的数学生涯。Poincare自己也不在乎这么东西,于是把3维自己得到的群命名为Klein群。 ---------------------------------- 庞加莱 Poincare也曾去Gottingen演讲,顺便攻击了一下Cantor(康托尔)的集合论,Zermelo(策梅洛)当时恰好证明的每个集合都可以良序化,Poincare演讲的时候他恰好坐在靠近Poincare脚边的位子上,然而Poincare并不认识Zermelo,他大喊道:“Zermelo那个几乎独创的证明也应该彻底的毁掉,扔到窗外去!”Zermelo本来就性情古怪暴躁,那天更是绝望盛怒。Courant甚至认为Zermelo一定会在那天吃正餐的时候杀死Poincare。 ---------------------------------- 伯努利家族 伯努利(Bernoulli) 家族 (1) 这是一个生产数学家和物理学家的部落,有着十几位优秀的科学家都拥有这个令人骄傲的姓氏。 John Bernoulli(约翰·伯努利)在1696年把最速降线问题在一个叫做《教师学报》的杂志上面提出,公开挑战主要是针对他的哥哥Jacobi Bernoulli(加可比·伯努利),这两个人在学术上一直相互不忿,据说当年John求悬链线的方程,熬了一夜就搞定了,Jacobi(加可比·伯努利)做了一年还认为悬链线应该是抛物线,实在是很没面子。那个杂志好像是Leibniz(莱布尼兹)搞得,很牛,欧洲的牛人们都来做这个东西。到最后,John收到了5份答案,有他自己的,Leibniz的,还有一个L.Hospital(洛比塔)侯爵的(我们比较喜欢的那个L.Hospital法则好像是他雇人做的,是个有钱人),然后是他哥哥Jacobi的,最后一份是盖着英国邮戳的,必然是Newton(牛顿)的,John自己说“我从它的利爪上认出了这头狮子。”据说当年Newton从造币厂回去,看到了Bernoulli的题,感觉浑身不爽,熬夜到凌晨4点,就搞定了。这么多解答当中,John的应该是最漂亮的,类比了Fermat(费马)原理,用光学一下做了出来。但是从影响来说,Jacobi的做法真正体现了变分思想。 伯努利(Bernoulli) 家族 (2) Bernoulli一家在欧洲享有盛誉,有一个传说,讲的是Daniel Bernoulli(丹尼尔·伯努利)(他是John Bernoulli的儿子)有一次正在做穿过欧洲的旅行,他与一个陌生人聊天,他很谦虚的自我介绍:“我是Daniel Bernoulli。"那个人当时就怒了,说:“我是还是Issac Newton(牛顿)呢。”Daniel从此之后在很多的场合深情的回忆起这一次经历,把它当作自己曾经听过的最衷心的赞扬。 伯努利(Bernoulli) 家族 (3) John & Jacobi这两个Bernoulli人,都算不出来自然数倒数的平方和这个级数,Euler从他老师John那里知道的,并且给出了π^2/6这个正确的答案。 ---------------------------------- 欧拉 1)欧拉著作的惊人多产并不是偶然的,他可以在任何不良的环境中工作,他常常抱着孩子在膝上完成论文,也不顾孩子在旁边喧哗。他那顽强的毅力和孜孜不倦的治学精神,使他在双目失明以后,也没有停止对数学的研究,在失明后的17年间,他还口述了几本书和400篇左右的论文。19世纪伟大数学家高斯(Gauss,1777-1855年)曾说:"研究欧拉的著作永远是了解数学的最好方法。" 2)1735年,欧拉解决一个天文学的难题(计算慧星轨道)。 3)过度的工作使他得了眼病,并且不幸右眼失明了,这时他才28岁。1741年欧拉应普鲁士彼德烈大帝的邀请,到柏林担任科学院物理数学所所长,直到1766年,后来在沙皇喀德林二世的诚恳敦聘下重回彼得堡,不料没有多久,左眼视力衰退,最后完全失明。不幸的事情接踵而来,1771年彼得堡的大火灾殃及欧拉住宅,带病而失明的64岁的欧拉被围困在大火中,虽然他被别人从火海中救了出来,但他的书房和大量研究成果全部化为灰烬了。欧拉具有惊人的记忆力,他就凭着惊人的记忆,口授发表了论文400多篇、论著多部。 4)沉重的打击,仍然没有使欧拉倒下,他发誓要把损失夺回来。在他完全失明之前,还能朦胧地看见东西,他抓紧这最后的时刻,在一块大黑板上疾书他发现的公式,然后口述其内容,由他的学生特别是大儿子A?欧拉(数学家和物理学家)笔录。欧拉完全失明以后,仍然以惊人的毅力与黑暗搏斗,凭着记忆和心算进行研究,直到逝世,竟达17年之久。 5)欧拉充沛的精力保持到最后一刻,1783年9月18日下午,欧拉为了庆祝他计算气球上升定律的成功,请朋友们吃饭,那时天王星刚发现不久,欧拉写出了计算天王星轨道的要领,还和他的孙子逗笑,喝完茶后,突然疾病发作,烟斗从手中落下,口里喃喃地说:"我死了",欧拉终于"停止了生命和计算"。 6)法国有一个哲学家,叫做Denis Diderot(丹尼斯?狄德罗),中文的名字叫做狄德罗,是个无神论者,这个让叶卡捷琳娜女皇不爽,于是他请Euler来教育一下Diderot(丹尼斯?狄德罗),其实Euler本来是弄神学的,他老爸就是的,后来是好几个叫Bernoulli的去劝他父亲,才让Euler做数学了。Euler邀请Diderot来了皇宫,他这次的工作是证明上帝的存在性,然后,在众人面前说:“先生,( a + bn ) / n = x,因此上帝存在;请回答!”Diderot自然不懂代数,于是被羞辱,显然他面对的是欧洲最伟大的数学家,他不得不离开圣彼得堡,回到了巴黎…… ---------------------------------- 费马大定理 1)Fermat(费马)写下费马大定理的同时,就写下了这句话“Cuius rei demonstrationem mirabilem sabe detex marginis exiguitas non caparet”。翻译成中文就是“我有一个对这个命题的十分美妙的证明,这里的空白太小,写不下”。 不知是真是假。后来,Hilbert(希尔伯特)也会了类似的技巧,有人问Hilbert为什么不去证明Fermat大定理,他说为什么要杀死一只下金蛋的母鹅,因为这样的一个对整个数学发展有着如此深远推动的问题太少了。 2)由于Fermat(费马)大定理的名声,在New York的地铁车站出现了乱涂在墙上的话:X^n+y^n=Z^n(n大于或等于3) 没有解,对此我已经发现了一种真正美妙的证明,可惜我现在没时间写出来,因为我的火车正在开来。 3)有一个人叫做Paul Wolfskehl(沃尔夫斯凯尔),大学读过数学,痴狂的迷恋一个漂亮的女孩子,令他沮丧的是他被无数次被拒绝。感到无所依靠,于是定下了自杀的日子,决定在午夜钟声响起的时候,告别这个世界,再也不理会尘世间的事。Wolfskehl在剩下的日子里依然努力的工作,当然不是数学,而是一些商业的东西,最后一天,他写了遗嘱,并且给他所有的朋友亲戚写了信。由于他的效率比较高的缘故,在午夜之前,他就搞定了所有的事情,剩下的几个小时,他就跑到了图书馆,随便翻起了数学书。很快,被Kummer(库默尔)解释Cauchy(柯西)等前人做Fermat大定理为什么不行的一篇论文吸引住了。那是一篇伟大的论文,适合要自杀的数学家最后的时刻阅读。Wolfskehl竟然发现了Kummer的一个错误,一直到黎明的时候,他做出了这个证明。他自己狂骄傲不止,于是一切皆成烟云……这样他重新立了遗嘱,把他财产的一大部份设为一个奖,讲给第一个证明Fermat定理的人10万马克…这就是Wolfskehl奖的来历。 ---------------------------------- 哈代 Hardy(哈代)这个人有着各种怪癖,譬如永远不会希望见到镜子之类的,每次到一个旅馆,总是用毛巾把各个地方的镜子都遮将起来。不说这些乱七八糟的,说一下子他用“数学”解决的恐船症。Hardy每次坐船的时候,总是怕沉了。克服这个东西的一个方法是,每次不得不坐船航行的时候,他会给同事发个电报或者明信片什么的,说已经搞定了Riemann(黎曼)猜想回来之后会给出细节的。他的逻辑是,上帝不会允许他被淹死,否则这又将是第二个类似于Fermat(费马)大定理的事情。 ---------------------------------- 毕达哥拉斯 万物皆数 1)毕氏学派将抽象的数作为万物的本源,研究数的目的不是为了实际应用,而是通过揭露数的奥秘来探索宇宙的永恒真理 。无理数的发现,也许是这个学派最重大的贡献,是数学史上重要的 里程碑。但这一发现却和他们的会条相抵触,它不仅推了"每一事物都依赖于整数"这一基本假定,而且因为毕氏学派关于 比例的定义假定了任何两个同类量是可通放的,所以其比例理论中的所有命题都局限在可通约量上,而他们关于相似形的 一般理论也因此失效了。『逻辑上的矛盾』是如此之大,以致于有一段时间,他们费了很大的劲将此事保密,不准外传。 大约在公元前 370年,这个"矛盾"被毕氏学派晚期的重要成员 阿尔希塔斯的学生,杰出的 欧多克斯通过给比例下新定义的 方法解决了。 2)传说他是一个非常优秀的教师,他认为每一个人都该懂些几何。有一次他看到一个勤勉的穷人, 他想教他学习几何,因此对此人建议:如果这人能学懂一个定理,那麽他就给他一块钱币。这个 人看在钱份上就和他学几何了,可是过了一个时期,这学生对几何却产生了非常大的兴趣,反而 要求毕达哥拉斯教快一些,并且建议:如果老师多教一个定理,他就给毕达哥拉斯一个钱币。不 需要多少时间,毕达哥拉斯把他以前给那学生的钱全部收回了。 还有另一个版本是说,曾有一个小孩在听毕达格拉斯将数学的时候问道学数学有什么用?毕格拉斯给了小孩两个钱币就叫他走了,并对别人说,他居然问学数学有什么用! ---------------------------------- 高斯 1)高斯最出名的故事就是他十岁时,小学老师出了一道算术难题:「计算 1+2+3…+100=?」。 这可难为初学算术的学生,但是高斯却在几秒后将答案解了出来,他利用算术级数(等差级数) 的对称性,然后就像求得一般算术级数和的过程一样,把数目一对对的凑在一起:1+100,2+ 99,3+98,……49+52,50+51 而这样的组合有50组,所以答案很快的就可以求出是: 101×50=5050。 2)听说过一件不太正常的事情,但是从另一个侧面我们也可以知道他不仅仅是天分出众,更重要的是努力。Gauss中年的时候妻子就死去了,那个时候,Gauss就很有名望,家里有保姆。妻子病的一塌糊涂,不过他还是专心自己的研究。这个当然不是一个值得称道的品质。就是妻子的弥留之际,他还是没有去她的身旁,保姆实在看不下去,就去Gauss做研究的地方去找他说让他赶快过去,Gauss随口答应了,但是依然做自己的东西。保姆又来了一次,痛斥了他一番,岂知Gauss告诉她说:“我马上就过去,你让她再等一会……” ---------------------------------- 闵可夫斯基 Gottingen广为流传的一个关于闵可夫斯基(Minkowski)的故事,说是他在街上散步,发现一个年轻人正在默默想着某个很重要的问题,于是Minkowski轻轻的拍拍他的肩膀,告诉他“收敛是肯定的”,年轻人感激而笑。 ---------------------------------- 莱布尼兹 关于微积分创立的优先权,数学上曾掀起了一场激烈的争论。实际上,牛顿在微积分方面的研究虽早于莱布尼兹,但莱布尼兹成果的发表则早于牛顿。莱布尼兹在1684年10月发表的《教师学报》上的论文,“一种求极大极小的奇妙类型的计算”,在数学史上被认为是最早发表的微积分文献。牛顿在1687年出版的《自然哲学的数学原理》的第一版和第二版也写道:“十年前在我和最杰出的几何学家G、W莱布尼兹的通信中,我表明我已经知道确定极大值和极小值的方法、作切线的方法以及类似的方法,但我在交换的信件中隐瞒了这方法,……这位最卓越的科学家在回信中写道,他也发现了一种同样的方法。他并诉述了他的方法,它与我的方法几乎没有什么不同,除了他的措词和符号而外。”(但在第三版及以后再版时,这段话被删掉了。)因此,后来人们公认牛顿和莱布尼兹是各自独立地创建微积分的。牛顿从物理学出发,运用集合方法研究微积分,其应用上更多地结合了运动学,造诣高于莱布尼兹。莱布尼兹则从几何问题出发,运用分析学方法引进微积分概念、得出运算法则,其数学的严密性与系统性是牛顿所不及的。莱布尼兹认识到好的数学符号能节省思维劳动,运用符号的技巧是数学成功的关键之一。因此,他发明了一套适用的符号系统,如,引入dx 表示x的微分,∫表示积分,dnx表示n阶微分等等。这些符号进一步促进了微积分学的发展。 1713年,莱布尼兹发表了《微积分的历史和起源》一文,总结了自己创立微积分学的思路,说明了自己成就的独立性。 ---------------------------------- 柯西 在一次国王接见Cauchy的时候,他有五次回答国王的问题是都这样说:“我预料陛下将问我这个问题,所以我准备好了答案。”然后,他从口袋里拿出笔记本,昭本宣读。 doubanclaimd66037a328afd0e2 请移步至此阅读全文» October 09 国庆2009
本文同步自游戏人生 ------------------------------------------------------------------- 10月1日上午,通过电视与全国主要观众一起检阅三军;下午到春熙路,来到群众中间,与近6万名观众构成人山人海。每个人的脸上都洋溢着幸福的笑容,整个春熙路成为一个欢乐的大舞台。 10月2日和几个朋友去宽窄巷子转了转,人太多,没什么景致,还是适合人比较少的时候去。找一个茶馆坐下,喝喝茶,聊聊天。晚上在天府广场西侧见到一个书店,感觉不错,就进去看了一会儿书,人文社科类的书比较全: 溜达到天府广场,随后和老婆在附近商场逛了一会儿回家。 10月3日在家休息。 10月4日到金沙遗址博物馆。成都难得有真正的晴天,更是极少能见到蓝天白云,真不敢想象这是在成都市区: 乌木林 蓝天白云绿树 草地上的儿童 金沙遗址 金沙出土的光盘? 傍晚 其他时间则大半宅在家里玩游戏,虽然有半天时间窝在图书馆里,在家的时候却没有怎么看书。 吃 受同名记录片启发,和朋友再次光临老妈蹄花,结果到最后只剩下我一个人在那儿埋着头吃。 蹄花、爬爬虾、香辣蟹,突然就十分想念青岛的蛤蜊和阳澄湖的大闸蟹…… 请移步至此阅读全文» September 16 [古文今读] 袁枚《黄生借书说》
本文同步自游戏人生 -------------------------------------------------------------------
以前读书大多都是借书,工作后,俸去书来,捧卷在手也是人生一乐。况时代不同了,现在读书,既为扩充知识,也有工作需要,想读的时候,电子书翻起来还是不如纸质舒服。 最近买书买爽了: 9月1日,拿到了《代码大全》; 9月11日,拿到了《UNIX网络编程》v1; 9月16日,拿到了《TCP/IP详解》v2。 加上之前的《TCP/IP详解》v1、v3和《UNIX环境高级编程》,Stevens的几本经典著作就剩《UNIX网络编程》v2,但因为我不喜欢中文版第二版科海培训做的那个业余的封面(看到这个封面我就想起了读大学时的那几本教材辅助),最后第一卷选了清华大学的第三版,但第二卷好像还没有。权衡再三,还是拿下了第二版。毕竟Stevens不可能再为我们写新版了。 看了一下,只有蔚蓝书店才有这本书,为了免5元运费(满100元,是不是特傻?),加了一本《人月神话》和《人件》,虽然读大学的时候看过这两本书,但毕竟那时缺乏工程的思想,现在再读一读,还是蛮清爽的,也当收藏了。还可以弥补一下当年『黄生只能借书』的遗憾。 后面忽然发现蔚蓝书店居然还有《UNIX编程艺术(英文版)》,只好再下一单,谁让刚才那么激动呢?本来还想把K & R的《The C Programming Language》、Bjarne Stroustrup的《The Design and Evolution of C++》和《The C++ Programming Language》一并收藏的,后来纠结要不要,因为买回来真的就成收藏了,轻易自然不会再去翻了,最终还是算了,好书看过了就看过了,没有必要非得留一本。钱钟书不是说过『假如你吃了个鸡蛋觉得不错,何必认识那下蛋的母鸡呢?』 最后,为了凑齐新的一单,拿了本《深入理解计算机系统》,因为手上现在没有这样一本书。 大概瞄了一下,感觉蔚蓝书店的书还要多一些,像《UNIX网络编程》、《UNIX编程艺术》各地都缺货,它那儿居然有,而且价格没有高出去,还是等拿到书再看吧。 请移步至此阅读全文» September 15 [古文今读] 梁启超《少年中国说》
本文同步自游戏人生 -------------------------------------------------------------------
----------------------------------------------------------------------- 欣赏任公写作此文时的英姿勃发。行文犀利,气吞万里。以前途似海的年少和天下为公的担当,面对“凋尽朱颜”的西风老朽发出自己的声音,似可涤清世间陋习恶俗。 年少的时候,每个人都曾有一段“指点江山”的梦想。然人食五谷,终难免俗。到最后,只留下最初的文字在激励着一代一代的后来少年。 此处发挥五千字,暂时挥发掉。只留一个记号,以后另行说明。 ----------------------------------------------------------------------- 成都这几天忽然就降温了,上周还要整天吹冷气,现在已经需要穿秋装了,被子还没来得及加厚,结果昨晚一觉睡得有些恍惚,早上七点醒来之后,再也没睡好,以致今天一天状态都不好。今晚早点休息,一会儿躺床上看看书就睡了。 夏天快过去的时候,在老婆的压迫下,把含辛茹苦、呕心沥血留了两年的头发剪了。时间过去两周了,我这心里依然是痛不欲生。不过也好,以后再也不会理会她这种无理的要求了,我爱怎么留怎么留。 blog最近作了几点改动: o 去掉了几个多余的分类; o 加了twitter @yulefox; o 加了豆瓣(读书) @yulefox; o feed使用feedburner。 请使用GR或其他工具订阅的同学将RSS改成 http://feeds.feedburner.com/yulefox 请移步至此阅读全文» September 11 IOCP使用时常见的几个错误
本文同步自游戏人生 ------------------------------------------------------------------- 在使用IOCP时,最重要的几个API就是GetQueueCompeltionStatus、WSARecv、WSASend,数据的I/O及其完成状态通过这几个接口获取并进行后续处理。 GetQueueCompeltionStatus attempts to dequeue an I/O completion packet from the specified I/O completion port. If there is no completion packet queued, the function waits for a pending I/O operation associated with the completion port to complete. If the function dequeues a completion packet for a successful I/O operation from the completion port, the return value is nonzero. The function stores information in the variables pointed to by the lpNumberOfBytes, lpCompletionKey, and lpOverlapped parameters. 除了关心这个API的in & out(这是MSDN开头的几行就可以告诉我们的)之外,我们更加关心不同的return & out意味着什么,因为由于各种已知或未知的原因,我们的程序并不总是有正确的return & out。 If *lpOverlapped is NULL and the function does not dequeue a completion packet from the completion port, the return value is zero. The function does not store information in the variables pointed to by the lpNumberOfBytes and lpCompletionKey parameters. To get extended error information, call GetLastError. If the function did not dequeue a completion packet because the wait timed out, GetLastError returns WAIT_TIMEOUT. 假设我们指定dwMilliseconds为INFINITE。 这里常见的几个错误有: WSA_OPERATION_ABORTED (995): Overlapped operation aborted. 由于线程退出或应用程序请求,已放弃I/O 操作。 MSDN: An overlapped operation was canceled due to the closure of the socket, or the execution of the SIO_FLUSH command in WSAIoctl. Note that this error is returned by the operating system, so the error number may change in future releases of Windows. 成因分析:这个错误一般是由于peer socket被closesocket或者WSACleanup关闭后,针对这些socket的pending overlapped I/O operation被中止。 解决方案:针对socket,一般应该先调用shutdown禁止I/O操作后再调用closesocket关闭。 严重程度:轻微易处理。 WSAENOTSOCK (10038): Socket operation on nonsocket. MSDN: An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid. 成因分析:在一个非套接字上尝试了一个操作。 使用closesocket关闭socket之后,针对该invalid socket的任何操作都会获得该错误。 解决方案:如果是多线程存在对同一socket的操作,要保证对socket的I/O操作逻辑上的顺序,做好socket的graceful disconnect。 严重程度:轻微易处理。 WSAECONNRESET (10054): Connection reset by peer. 远程主机强迫关闭了一个现有的连接。 MSDN: An existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt for more information on the SO_LINGER option on the remote socket). This error may also result if a connection was broken due to keep-alive activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET. 成因分析:在使用WSAAccpet、WSARecv、WSASend等接口时,如果peer application突然中止(原因如上所述),往其对应的socket上投递的operations将会失败。 解决方案:如果是对方主机或程序意外中止,那就只有各安天命了。但如果这程序是你写的,而你只是hard close,那就由不得别人了。至少,你要知道这样的错误已经出现了,就不要再费劲的继续投递或等待了。 严重程度:轻微易处理。 WSAECONNREFUSED (10061): Connection refused. 由于目标机器积极拒绝,无法连接。 MSDN: No connection could be made because the target computer actively refused it. This usually results from trying to connect to a service that is inactive on the foreign host—that is, one with no server application running. 成因分析:在使用connect或WSAConnect时,服务器没有运行或者服务器的监听队列已满;在使用WSAAccept时,客户端的连接请求被condition function拒绝。 解决方案:Call connect or WSAConnect again for the same socket. 等待服务器开启、监听空闲或查看被拒绝的原因。是不是长的丑或者钱没给够,要不就是服务器拒绝接受天价薪酬自主创业去了? 严重程度:轻微易处理。 WSAENOBUFS (10055): No buffer space available. 由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。 MSDN: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full. 成因分析:这个错误是我查看错误日志后,最在意的一个错误。因为服务器对于消息收发有明确限制,如果缓冲区不足应该早就处理了,不可能待到send/recv失败啊。而且这个错误在之前的版本中几乎没有出现过。这也是这篇文章的主要内容。像connect和accept因为缓冲区空间不足都可以理解,而且危险不高,但如果send/recv造成拥堵并恶性循环下去,麻烦就大了,至少说明之前的验证逻辑有疏漏。 WSASend失败的原因是:The Windows Sockets provider reports a buffer deadlock. 这里提到的是buffer deadlock,显然是由于多线程I/O投递不当引起的。 解决方案:在消息收发前,对最大挂起的消息总的数量和容量进行检验和控制。 严重程度:严重。 本文主要参考MSDN。 ************* 说明 ************* Fox只是对自己关心的几个错误和API参照MSDN进行分析,不提供额外帮助。 请移步至此阅读全文» September 10 Amdahl 定律 = Gustafson定律
本文同步自游戏人生 ------------------------------------------------------------------- 周伟明老师应该是多核计算领域的老人了。 这几日因为想找找无锁(lock-free)方面的信息,就打开了周老师的blog。看到多核系统中三种典型锁竞争的加速比分析这篇文章时,觉得老师强调多核计算效率是有必要的,但拿Amdahl 定律和Gustafson定律作对比有点不恰当。 按照我的理解,这两个定律所刻画的内容是完全一致的,只是对加速比的定义不一样罢了。这里,我们都以S(n)表示n核系统对具体程序的加速比,K表示串行部分计算时间比例。 Amdahl 定律的加速比:S(n) = 使用1个处理器的串行计算时间 / 使用n个处理器的并行计算时间 S(n) = 1/(K+(1-K)/n) = n/(1+(n-1)K) Gustafson定律的加速比:S(n) = 使用n个处理器的并行计算量 / 使用1个处理器的串行计算量 S(n) = K+(1-K)n 通俗的讲,Amdahl 定律将工作量看作1,有n核也只能分担1-K的工作量;而Gustafson定律则将单核工作量看作1,有n核,就可以增加n(1-K)的工作量。 这两个计算公式都没有将锁开销考虑在内,是理想化的。周老师提到设计不当造成并行变串行的问题与这两个公式计算无关。因为任何多核计算都存在对串行和并行的设计考量,这正是程序员在使用多核并行时最关心的事情。 总之,二者的区别只在于态度的不同:一个消极悲观,一个积极乐观,充其量是一个冷笑话,而于多核计算没有任何关联。 我说这些也与多核计算没有关联,丝毫没有质疑多核效率的意思。相反,我期待能够通过技术层面提高多核的有效负载。 最后一句题外话,周老师使用Word的水平一般:所有来自Word的截图都是在页面视图直接截,换行符和光标随处可见。请移步至此阅读全文» September 09 W. R. Stevens十年
本文同步自游戏人生 ------------------------------------------------------------------- W. R. Stevens是我敬仰的几位计算机领域的知名学者之一,先生辞世(1999年9月1日)已整整十年了。他留下的几部著述在世界范围内产生过并将持续产生深远的影响: Unix Network Programming v1-2, 1990-1998; Advanced Programming in the UNIX Environment, 1992; TCP/IP Illustrated V1-3, 1994-1996. 其中,UNP原定出版三卷,先生英年早逝,这不能不说是一个遗憾。所幸,除TCP外,UNP和APUE均有人续写或编写新版。 读书的时候虽然粗浅学习过TCP,但离开学校之后也就渐渐忘却了,而对TCP实战经验也仅仅停留在Win API使用上。这次因工作和兴趣使然,慢慢发现理论的效用,希望可以将这几本经典之作细细读一读。 上次在书店只是购回了TCP v1, v3,这几日终于看到UNPv1(cn E3)到货,立马入手,顺便把TCP v2一起买了。 晚上在家便翻看一会儿,大热天的,说不上如沐春风,怎么也算是苦热中的一件乐事了。 请移步至此阅读全文» September 01 ACE: Socket封装(01)
本文同步自游戏人生 ------------------------------------------------------------------- o *__ 序 __* o 在阅读ACE代码和C++NPv1, v2, APG的时候,我意识到一个问题:虽然稍有C++和网络基础的同学都可以读懂ACE,但如果你对OS(五大管理模块都包含在内)、TCP/IP、C++、Design Patterns了解越多,你就越能体会ACE为什么需要这么庞杂,虽然它不够完美(但至少我还没有资格来批评这一点,我现在最常想做的一个动作就是五体投地)。 而且我隐约感觉到,我现在所写的很多东西在以后(对于有些人或许就是现在)看来会相当不深刻、相当不严谨,但对于一段学习历程,这个过程是必然的、必需的。 在C++NPv1中,Douglas C. Schmidt把原始socket及其API的缺陷有些妖魔化了,比如一段加上注释、空行在内的35行的代码,被指出有10处错误之多。这就像很多其他语言的倡导者或反传统C/C++指针者在批评指针时的说法一样。长期使用原始socket和指针的同学对此感觉很不舒服,何况socket API提供了大量错误检测的接口,至多是不够友好罢了。你好就好了,没必要抓住别人一顿痛批吧,『本是同根生,相煎何太急』。 虽然Solaris、Linux的很多版本及Windows对起源于Berkeley的socket API进行了重写,但不可否认,由于历史原因和POSIX标准的存在,对于使用者而言,我们可以无视这些API的实现差异。只是一旦我们从socket通信扩展到其他IPC通信的话,就需要正视各种I/O细节的差异了。 由于UNIX中,对于socket, file, pipe, device的大多数操作,描述符都是通用的(这一点,OS上面讲的更清楚些)。而Windows中,句柄大多不能互换(socket对于MS来说是舶来品)。系统和标准的不一致导致地址、协议和API的混杂甚至混乱。 UNIX下的描述符和Windows的句柄可以看作是同一个概念,只是应用环境不一样,所描述的内容也时常不一样,再简单了说,它们都是一个整型的ID。 ACE的源码中使用了大量预处理指令,尤其在跨平台/编译环境的部分更加明显。鉴于C/C++标准的博大胸怀,有些指令需要阅读相关编译器提供的帮助文档: o #define (#, #@, ##) : GCC, MSVC 其中有若干代码文件以.inl为后缀,里面是对部分函数的内联实现,以使代码结构看上去更加简洁。如果确定使用内联函数的话,*.inl将被包含于*.h的最后,如果不使用,则像*.h一样,包含于*.cpp的头部。 ACE采用doxygen输出文档,在阅读代码注释时能够感受到差异,但基本不会影响阅读。 o * __ 关于第3章(C++NPv1)__ * o ACE抽象的地址类ACE_Addr拥有ACE_DEV_Addr, ACE_FILE_Addr, ACE_INET_Addr, ACE_SPIPE_Addr, ACE_UNIX_Addr五个子类。对于狭义上的网络通信(TCP/IP)而言,ACE_INET_Addr对应于我们熟悉的sockaddr_in。 ACE_IPC_SAP是IPC(interprocess communication)I/O操作类的root类。 从编码的角度看,这个类漂亮的地方在于示例了抽象类的另一种实现方式。 一提到抽象类,大多数人的第一反应是pure virtual function。当一个基类确定需要使用virtual function时,这是一个不错的选择。但我们都知道虚拟函数有开销。而且对于一个结构简单的抽象基类和其继承子类(尤其是大量使用时),一个虚函数表带来的开销会让整个设计显得十分蹩脚。 我们都知道如何强制让一个类无法使用default constructor(protected)。如果对基类使用该方法,仅使子类具有public的default constructor,这就达到了定义抽象基类的效果。 virtual destructor的意义在于防止delete父类指针(指向子类对象)时未调用子类destructor。在此例中,为避免这种情况,同样将destructor声明为protected即可。 从设计实现的角度看,相较于socket API,ACE_IPC_SAP的子类ACE_SOCK提供了编译时对句柄合法性的检测。 从逻辑功能层面划分,socket有三种角色: o active connection role (connector):主动连接 o passive connection role (acceptor):被动连接 o communication role (stream):数据通信 但socket API毕竟不是OOD出来的,对于一个socket描述符,也完全没有必要去限制其担负的功能,更不可能搞成三种不同的socket。而OOD的ACE则可以轻易实现对socket对象及其操作的封装。 工厂类ACE_SOCK_Connector是一个主动创建通信端的工厂类。socket API中的connect接口只是为一个socket建立与其它peer的网络连接,而不产生新的socket实例,也不依赖于任何其它socket。同样,ACE_SOCK_Connector只是为一个ACE_SOCK_Stream对象(对用于数据通信的socket的封装)连接到ACE_Addr(对struct sockaddr的封装)提供接口,也不含对ACE_SOCK_Stream对象的其它操作。 工厂类ACE_SOCK_Acceptor是一个被动创建通信端的工厂类。当监听到新的网络连接后,为该连接初始化一个ACE_SOCK_Stream对象。和connector不同的是,acceptor依赖于一个已经存在的充当监听功能的socket句柄(ACE_SOCK),因此,ACE_SOCK_Acceptor是ACE_SOCK的一个子类。 ACE_SOCK_Stream是只负有通信传输功能的socket,对应connection-oriented的TCP通信格式stream,和UDP的CE_SOCK_CODgram相呼应。ACE_SOCK_Stream只是socket的通信载体,在两个工厂ACE_SOCK_Connector和ACE_SOCK_Acceptor中初始化。这样一个类除支持最基本的数据发送(send)和接收(recv)和阻塞(blocking)、非阻塞(nonblocking)及定时(timed)的I/O模式外,还支持分散读取(scatter-read)和集中写入(gather-write)。 对于一个简单的『网络课程作业:写一个有连接的IM小程序』,上面这些内容已经足够了。当然即使使用对应的几个socket API也已经足够了。但我们显然更加关心如此庞大的一个库,是如何解决复杂的网络应用的,我尤其关心的是多线程并发如何更好的处理。 所以,我准备跑到第8、9章了。 请移步至此阅读全文» August 28 Doxygen在Cygwin下的使用
本文同步自游戏人生 ------------------------------------------------------------------- 我发现我最近成了Cygwin下的小白鼠,写完Cygwin下安装ACE,写ACE在cygwin下的使用。现在又写doxygen。 之前提到在Cygwin下读代码的不习惯,后来回到VS下看。没过几天,觉得VS下还是不够直观,于是就直接看ACE的doxygen了…… doxygen好是好,用起来还是要慢慢习惯才行,需要在写注释和代码的时候注意一些,掌握的细节和技巧越多,出来的文档越丰富(当然,这和代码质量是两码事)。 我自然是把doxygen安装在Cygwin下了,由于doxygen没有提供info,Info doxygen时就自动打开了doxygen的man,和man doxygen、doxygen --help一个效果。 如果希望阅读更详尽的使用方法,只有自己down一个manual了。 在Cygwin下,doxygen采用GNU的libiconv进行文字编码的转换,以UTF-8作为默认编码。 使用doxygen生成config-file模板后,可以在config-file中进行一些项目设置(有注释的,看的懂)。 为了支持中文,我DOXYFILE_ENCODING用的是EUC-CN,但输出文档的语言OUTPUT_LANGUAGE却选了English。两点原因: o EUC-CN(各种汉字编码知识就不在此普及了,你可以认为简体字编码都是EUC-CN)和UTF-8不同,但OUTPUT_LANGUAGE的各种语言都是使用的UTF-8,所以两种编码不可能同时显示,当然,你可以把EUC-CN全转成UTF-8。编码不是高级的技术,但对于非英语用户绝对是一个噩梦。 o 虽然我的英文很蹩脚,虽然我的文档中多有中文注释。但像doxygen中文输出的文档中把class、public都给你翻译成中文,你也受不了,这也英文水平无关。 config-file中的其他内容我现在也用不到,就没有仔细看。 因为Kevin会在公司里讲一下doxygen,doxygen的manual也讲的很详细,我就省点时间,不翻译文档了。 简单的一个Doxygen的测试在这里。 请移步至此阅读全文» August 24 ACE之Cygwin vs Win
本文同步自游戏人生 ------------------------------------------------------------------- 我屈服了,还是VS用的方便。 之前在Cygwin下已经可以使用的ACE,因为阅读代码太不方便(对于一个WinEr来说),上午在VS下面花了几分钟就把ACE配好了,而且使用$(ACE_ROOT)\examples\C++NPv1的代码跟踪调试,太习惯了。 按照$(ACE_ROOT)\ACE-INSTALL.html的安装说明: o 选择并打开$(ACE_ROOT)\ace\ace_vc9.sln o 添加config.h并加入以下内容: #include "ace/config-win32.h" o F7 ----------------------------------------------- OK,现在$(ACE_ROOT)\lib下面已经生成了ACEd.dll、ACEd.lib,再设置一下系统环境变量(运行程序必需)和VC++目录(调试程序必需)。可以使用了: o 选择并打开$(ACE_ROOT)\examples\C++NPv1 o F7 o for (; ; ) { F12, F9, F5, F10, F11 } ----------------------------------------------- 半个小时就搞定了当时一个星期的折腾…… 结论:对于一个不忠实的Win Coder,在MinGW, Cygwin, UNIX…下面装B是要付出代价的。 当然,家里的机器就让它还一直跑Cygwin吧。请移步至此阅读全文» August 19 ACE在cygwin下的使用
本文同步自游戏人生 ------------------------------------------------------------------- /*--------- Hello.cc ---------*/ /** Hello.cc: #define ACE_NTRACE 0 /// trace the calling position #include "ace/Log_Msg.h" /// include log module int ACE_TMAIN(int, ACE_TCHAR *[]) ACE_DEBUG((LM_INFO, ACE_TEXT("%IStart\n"))); return 0; /*--------- makefile ---------*/ BIN = hello # src & exe file name include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU /*--------- Compilation ---------*/ GNUmakefile: /home/fox/ace/GNUmakefile MAKEFLAGS=k g++ -Wpointer-arith -mthreads -mtune=pentiumpro -O3 -g -pipe -pipe -I/usr/\ Compilation finished at Wed Aug 19 00:35:42 /*--------- Result ---------*/ $ ./hello.exe ------------------------------------------------------- 更多内容请参考C++NP(C++ Network Programming) vol.1 & vol.2和APG(The ACE Progrmmer's Guide)。 忙活了一晚上,终于知道怎么包含头文件了,在gcc的编译选项中用 -I或/I$(ACE_ROOT): 本例中是:-I/usr/share/ace 结果后面库又链接不上,联想以前使用OpenGL库的LIBS,终于靠一个-lACE搞定。 因为不愿意用MPC,总感觉再多花些时间去弄又只是离题更远了,有兴趣的同学自然是可以通过ACE的官网找到所有问题的答案。 这样一来,ACE在cygwin下从安装到使用也就告一段落了,后面的问题就比较easy了,无非是你用ACE做什么。而我也不会再就ACE && cygwin写什么心得了,总算见证了这两天的捣腾。
请移步至此阅读全文» August 18 Chrome 4.0 vs. IE 8.0
本文同步自游戏人生 ------------------------------------------------------------------- 我一般只是用浏览器浏览网页,很少在线看视频之类的,平时用Chrome的时间居多,Chrome的书签、页面元素审查和下载管理是我最常使用的功能,Chrome的进程拖拽模式也比较舒服。 但Chrome一直有几个软肋: o 不(被)支持电子银行; o 不(被)支持金山词霸(连谷歌金山词霸都不支持,真是极大的一个讽刺,谷歌和金山的工程师们任重道远啊); o 很多花哨的网络应用在UI上(被)支持都不够好; o 另一点不爽的是:像cygwin下很多文本文件没有后缀名,可以用IE打开,却无法直接拖到Chrome里面打开。 而IE一直是(被)支持的(毕竟是占有率第一的浏览器),但我不喜欢IE(纯属个人情愫): o 6.0的时候缺点海了去了; o 7.0不支持我常用的动态缩放(放大后不能动态调整文本,水平滚动条影响阅读); o 我更喜欢Google和它的产品,Google给我的感觉就是:不把用户当弱智。 现在8.0支持动态缩放了,我还是会安装一下。当然8.0有一个加速器,做的感觉还是比较人性化,而且明显是针对中国市场和Google系进行对抗,别忘了,MS有一个Live系。 ------------------------------- 随便写了一点,主要是因为: Windows 版 Chrome Dev 升级 4.0.201.1,增加书签同步功能!请移步至此阅读全文» August 17 与君共勉
本文同步自游戏人生 ------------------------------------------------------------------- 现在有些年轻人的心态比较浮躁,大致总结以下『四点表现』: 1. 眼高过顶; 2. 垂手过膝; 3. 期望值高; 4. 积极性低。 深层次的客观原因大致是『四个没有』: 1. 没有吃过苦; 2. 没有干过活; 3. 没有说过话; 4. 没有当过家。 一般都具有『四个特征』: 1. 独生子女; 2. 毕业新人; 3. 沉默寡言; 4. 半瓶开水。 --------------------------------- 1. 你想要什么? 参考:一个有影响力的人。(@李开复) 2. 那是否是你想要的? 参考:你的眼光有多远,决定了你能走多远。(@Fox) 3. 你需要做什么? 参考:高筑墙,广积粮,缓称王。(朱元璋) 4. 你还需要做什么? 参考:平和的心态,进取的态度,坚定的目标,不懈的努力。(@Fox) 5. 你是否做到了? 参考:没有,但我一直在努力。(@Fox) 请移步至此阅读全文» Cygwin下安装ACE
本文同步自游戏人生 ------------------------------------------------------------------- -----------------------读书----------------------- 想读《UNIX Network Programming》很久了,只是这种愿望一直没有特别强烈。用的笔记本换了之后强迫自己只是装了cygwin,没有安装VS,平时写些代码就只能在cygwin下用gcc了。最近对UNIX环境编程和网络基础比较感兴趣,于是读这本书终于提上了议事日程,可是大多数书店都没有这本书了。 工作之后,对于自己喜欢的书,就很少会去看电子版,觉得还是捧卷在手的感觉舒服一些,想怎么看怎么看,享受拿笔在上面写写画画的感觉。因此对于想读但买不到的书,第一反应是等待。在翻电脑上面一些资料的时候才反应过来我已经很久没有down过电子书了,结果就从网上down了很多想读(豆瓣)的书,forgive me, Richard Stevens and anybody. -----------------------动手----------------------- 之前只是在Windows下用过ACE,因为ACE提供了VS各种版本的解决方案,编译过程比较简单。这次放在cygwin下编译的时候,因为环境变量设置问题,并不是非常顺利,参照了源码目录下的ACE-INSTALL.html的描述才将问题解决。现在将过程给出来,仅供google到这里的同学参考: 友情提示:我目前对于cygwin和UNIX类系统的了解停留在知其然(还是在google之后)的水平。 1. 增加环境变量 o 修改/etc/profile文件读写属性: $ chmod 777 /etc/profile cygwin下的环境变量可以在该文件中配置,由于该文件默认具有写保护属性,因此需要修改使之可写,修改完成之后应该记得对其进行写保护: $ chmod 555 /etc/profile o 打开profile文件(本人使用emacs进行编辑,读者也可以使用vi、vim等,在此不再赘述): $ emacs /etc/profile o 往profile中修改和添加环境变量: 将以下五行添加到文件中,ACE_ROOT为ACE源码目录,本文用到的目录是/usr/share/ace: ACE_ROOT=/usr/share/ace LD_LIBRARY_PATH=$ACE_ROOT/ace:$LD_LIBRARY_PATH # export PATH=$ACE_ROOT/ace:$PATH 这个操作等同于在VS下修改库文件目录,我是直接修改了PATH变量的: PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:$ACE_ROOT/ace:$PATH o 执行/etc/profile $ /etc/profile 执行修改后有可能需要重启cygwin,可使用下面的命令查看ACE_ROOT设置是否正确: $ echo $ACE_ROOT 2. 创建若干文件: o 在$ACE_ROOT/ace 文件夹中创建名为 config.h 的文件,并加入以下内容后保存关闭: #include "ace/config-cygwin32.h" o 在$ACE_ROOT/include/makeinclude 文件夹中创建名为 platform_macros.GNU 的文件,并加入以下内容保存关闭: include $(ACE_ROOT)/include/makeinclude/platform_cygwin32.GNU 3. 编译ACE: $ cd $ACE_ROOT/ace 大概会花掉十几分钟时间吧。 4. 测试ACE: $ cd $ACE_ROOT/tests 大概又会花掉十几分钟时间吧。 接下来就可以使用perl脚本完成所有测试,我没有使用过perl,临时安装了一下。 $ perl run_test.pl 这个脚本在我一位同事的机器上跑了很久(十几分钟 or 几十分钟?),不幸的是,Windows竟然抛出了一个内存读写错误,更加不幸的是,我现在没有能力去确定。 结果周末后面的时间又花在熟悉EMacs上了,还没有看ACE的代码,只有下周才能看了。 -----------------------结束----------------------- 这种小学生的东西拿出来讲确实是很难为情的,然而,于我现在却又算是极大的一个收获。真等我熟悉了其中的很多内容,又未必会再有耐心说了。所以还是记录一下,既是鼓励,也是督促。 晚上睡觉之前翻了一下《ACE程序员指南:网络与系统编程的实用设计模式》,发现里面2.3节也讲到了怎么安装。 请移步至此阅读全文» Cygwin下安装ACE
本文同步自游戏人生 ------------------------------------------------------------------- -----------------------读书----------------------- 想读《UNIX Network Programming》很久了,只是这种愿望一直没有特别强烈。用的笔记本换了之后强迫自己只是装了cygwin,没有安装VS,平时写些代码就只能在cygwin下用gcc了。最近对UNIX环境编程和网络基础比较感兴趣,于是读这本书终于提上了议事日程,可是大多数书店都没有这本书了。 工作之后,对于自己喜欢的书,就很少会去看电子版,觉得还是捧卷在手的感觉舒服一些,想怎么看怎么看,享受拿笔在上面写写画画的感觉。因此对于想读但买不到的书,第一反应是等待。在翻电脑上面一些资料的时候才反应过来我已经很久没有down过电子书了,结果就从网上down了很多想读(豆瓣)的书,forgive me, Richard Stevens and anybody. -----------------------动手----------------------- 之前只是在Windows下用过ACE,因为ACE提供了VS各种版本的解决方案,编译过程比较简单。这次放在cygwin下编译的时候,因为环境变量设置问题,并不是非常顺利,参照了源码目录下的ACE-INSTALL.html的描述才将问题解决。现在将过程给出来,仅供google到这里的同学参考: 友情提示:我目前对于cygwin和UNIX类系统的了解停留在知其然(还是在google之后)的水平。 1. 增加环境变量 o 修改/etc/profile文件读写属性: $ chmod 777 /etc/profile cygwin下的环境变量可以在该文件中配置,由于该文件默认具有写保护属性,因此需要修改使之可写,修改完成之后应该记得对其进行写保护: $ chmod 555 /etc/profile o 打开profile文件(本人使用emacs进行编辑,读者也可以使用vi、vim等,在此不再赘述): $ emacs /etc/profile o 往profile中修改和添加环境变量: 将以下五行添加到文件中,ACE_ROOT为ACE源码目录,本文用到的目录是/usr/share/ace: ACE_ROOT=/usr/share/ace LD_LIBRARY_PATH=$ACE_ROOT/ace:$LD_LIBRARY_PATH # export PATH=$ACE_ROOT/ace:$PATH 这个操作等同于在VS下修改库文件目录,我是直接修改了PATH变量的: PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:$ACE_ROOT/ace:$PATH o 执行/etc/profile $ /etc/profile 执行修改后有可能需要重启cygwin,可使用下面的命令查看ACE_ROOT设置是否正确: $ echo $ACE_ROOT 2. 创建若干文件: o 在$ACE_ROOT/ace 文件夹中创建名为 config.h 的文件,并加入以下内容后保存关闭: #include "ace/config-cygwin32.h" o 在$ACE_ROOT/include/makeinclude 文件夹中创建名为 platform_macros.GNU 的文件,并加入以下内容保存关闭: include $(ACE_ROOT)/include/makeinclude/platform_cygwin32.GNU 3. 编译ACE: $ cd $ACE_ROOT/ace 大概会花掉十几分钟时间吧。 4. 测试ACE: $ cd $ACE_ROOT/tests 大概又会花掉十几分钟时间吧。 接下来就可以使用perl脚本完成所有测试,我没有使用过perl,临时安装了一下。 $ perl run_test.pl 这个脚本在我一位同事的机器上跑了很久(十几分钟 or 几十分钟?),不幸的是,Windows竟然抛出了一个内存读写错误,更加不幸的是,我现在没有能力去确定。 结果周末后面的时间又花在熟悉EMacs上了,还没有看ACE的代码,只有下周才能看了。 -----------------------结束----------------------- 这种小学生的东西拿出来讲确实是很难为情的,然而,于我现在却又算是极大的一个收获。真等我熟悉了其中的很多内容,又未必会再有耐心说了。所以还是记录一下,既是鼓励,也是督促。 晚上睡觉之前翻了一下《ACE程序员指南:网络与系统编程的实用设计模式》,发现里面2.3节也讲到了怎么安装。 请移步至此阅读全文» August 13 拱卒的修炼
本文同步自游戏人生 ------------------------------------------------------------------- -----------------------读书----------------------- 最近在读的一些书里,有一些是第一次读,有一些是以前翻过的。这次拣这本读起来容易做起来困难的《程序员修炼之道》,我手里的这本《程序员修炼之道》(The Pragmatic Programmer,以下简称PP),其拥有者是Soft(等我仔细阅读完了再还你吧:D)。这样一本书,让我想起了《春秋》,所谓『微言大义』,这本书当之无愧。晚上重读了前面几章,抛开书中讨论的具体技术和开发细节,简单说几点。 1. 关于承担责任 最低层次的是对自己负责,这是作为一个coder起码的素质,能够勇敢的承认自己所犯下的错误,并努力改正和避免。他们循规蹈矩、战战兢兢的做着份内的事儿,轻易不拿源码去喂猫。安得广厦千万间,靠的就是他们。 稍微有担当一些的老员工还会做到对正在参与的项目和产品负责,当问题出现的时候,他最先想到的并不是追问这是谁犯的错误。因为他知道错误总会出现,他们存在的意义之一就是想办法解决,从而保证整个项目和产品的稳健。他们是大裤衩被烧之后的救火队员。 当一个人可以为某个公司甚至是某个领域的问题牵肠挂肚、孜孜以求的时候,他不是一个人在战斗。更多的时候,他不是在充当救火队员,而是以实际行动带领其它人树立防火意识,给你足够的安全感。在现实当中,他们以自己敏锐和独到的眼光,将更多的新兴技术带给业界。他们不仅获得同事和公司的尊重,也获得了整个业界的尊重。他们是谁,你一定曾经在twitter或者googlegroup中经常能看到。 2. 关于知识资产 我完全赞同Andrew和David关于知识资产的论述,因此这里不吝做一做文抄公: o 每年至少学习一门语言; o 每季度阅读一本技术书籍; o 也要阅读非技术书籍; o 上课; o 参加本地用户组织; o 试验不同的环境; o 跟上潮流; o 上网。 3. 关于交流(WISDOM) What do you want them to learn? What is their interest in what you've got to say? How sophisticated are they? How much detail do they want? Whom do you want to own the intormation? How can you motivate them to listen to you? 4. 关于设计 GoF的DP对重构的好处和方法都提供了很好的指导,PP关于避免编码的重复和提高设计的正交性(解耦)都已经论述了太多。 其实,无论是开发之中还是开发之外,最困难的事情大概就是改变自己的习惯了,这本书里每一节的最后大都提供了『挑战』项。简单来说,就是不断提升和反省,在提升中反省,在反省中提升。 在去年年底写的《2009年的十大》中,为自己这一年定了十个目标。时间过去一半多了,虽然没有用心去读存在磁盘上的《胡适文集》,倒也没有放弃对人文的关注。最主要的是,一直保持不间断的阅读。 -----------------------动手----------------------- 一直活在Windows的『阴影』下,家里怎么也不想装Windows下的IDE了。搞了Cygwin来玩,在不同的开发环境下来回切换,对于我这种擅于在一棵树上吊死的惰性分子来说,还是很痛苦的。 之前直接运行info程序(info reader),没有高亮看起不舒服。后来才发现可以直接在Emacs下运行info命令的,只是和使用info reader时有些命令差异。 这几天晚上不看书的时候,就是随便看看gdb和Emacs的man和info,重新回到了读书查单词的大学时代。如果英语阅读能力再好些,就可以凭一方键盘驰骋沙场了,饶是如此费劲,倒也不失酣畅淋漓。 总结了一下: 1) 打开Emacs,『欢迎词』很关键,它会告诉你怎么往下爬,尤其是如何打开帮助,这是第一步; 2) Emacs下运行info命令,并分别查看Info的使用和Emacs的使用; 3) 学会Emacs和Info基本使用方法后,学习使用gdb。 慢慢熟练之后,基本就可以在新的环境下编写、调试代码了。 在Google Doc中放置了一部分翻译的文本: o 常用 Info 命令键 o LESS命令概述 o GNU 工具(LESS) -----------------------提示----------------------- 翻译内容纯属个人喜好,不以任何方式保证内容的准确,不以任何方式承诺后续内容的跟进,谢绝任何方式的挟迫。请移步至此阅读全文» August 11 使用flickr发表图片 |
|
|