Ming-Zhe

“大国空巢”

挑来挑去,来聊一下计划生育这个问题。很有意思的一个话题,市面上有一本书叫做《大国空巢》,讲的就是这个问题,在这里我觉得很应景,正好把题目借来用一下。

计划生育对不对?

如果站在人类观察外在世界的“直觉”的角度上,计划生育那肯定是对的。我们可以假设一个情景,一个科学家在一个培养皿里滴几滴营养液,抓来几个细菌放里面。这细菌一下子跑到一个丰衣足食的温和环境里,肯定高兴坏了,开始玩命繁殖,然后种群数量就成指数级增长。这个时候,站在培养皿外的科学家心里很清楚啊,真的是no zuo no die啊,生什么生啊,就这么几滴营养液,很快你们就会灭绝啦。

联想到我们人类,我们知道只有一个地球,资源有限,生到最后不是和培养皿里的细菌一个结局吗?我们不应该傻到最后落得细菌和老鼠的结局,不能亲手制造大规模的人道主义灾难,要用我们强大的理性思维来控制我们的人口总量和生育节奏才对嘛。所以,这一套想法其实就是最初计划生意政策的最重要的理论基础。

可是这套理论基础,如果我们放到工业革命之前那肯定是对的。因为当时人们所面临的情况就是有一道所谓的“马尔萨斯陷阱”,解释一下,就是人类所有的财富增长不能转化为别的东西,跟老鼠一样,最终就是转化为人口。所谓的繁荣,就是人口的增加,每一个单个人的生活水平并不因为繁荣而提升。可以想象,这几乎是古今中外的通理,中国从战国末年一直到清朝前期,其实劳动生产力水平没有多大变化,每个人的生活水平也几乎就那样。所谓的盛世,就是人口多嘛,所谓的乱世就是人口少嘛,各种战乱死的不剩下几个,然后从头再来。这几乎就是这么长一段时间的中国历史。所以,从单个人的角度来看,这个历史是停步的,似乎没有什么进展。欧洲也是一样的,13世纪整整一百年的风调雨顺,结果就是人们在家生娃,单单英格兰地区就从200万人口增长到500万人口。但结果呢,大自然承受能力有限,粮食系统非常脆弱,一旦有个风吹草动,直接打回原形。很多人说13世纪这一轮繁荣的结束是因为黑死病,其实,这并不全是。黑死病是1330年左右才在欧洲爆发,实际上在14世纪初北欧3年连续的大暴雨已经导致欧洲北部的小麦绝收,这个时候,人口已经停止增长了。当时欧洲的惨状这里就不多描述了,跟中国古代遇到的慌灾情景都是类似的。所以那个时候的繁荣,只能转发为人口,而人口最终又会被打回原形。我们不难对比得到,人类和老鼠这不是有着共同的命运嘛,于是在1798年的时候,著名的马尔萨斯发表了那本著名的《人口论》,它里面各种理论其实就是在告诉我们一个道理,那就是人口的增长是成指数级的,而粮食增长是线性级的,怎么能用线性增长的粮食来喂饱指数增长的人口呢?

这一套理论在过去这200年间,那可真是深入人心啊。你可不要以为计划生育是中国人的专利,计划生育是一个政策的执行措施,而它的理论基础是全世界都接受的。

但是

上个世纪60年代之后,大家突然发现,情况变了。不管是什么文明,什么文化,在什么地点,用什么样的制度,全世界统一的人口出生率猛降。像孟加拉、印度等国,都是从原来的每个妇女生六、七个孩子一直降到了两点多个孩子。说白了,就是不实行计划生育政策的国家,也出现了人口出生率猛降的事实。这是为什么呢?

后来很多人去研究这个问题的原因,人们发现居于第一位的原因竟然是儿童死亡率下降。其实想一想,我们也可以理解,对于一个家庭来讲,如果我生的孩子,生一个死一个,那怎么办?我应对这种不确定性的风险,唯一的对策就是拼命生。现在的阿富汗还基本是这个情况,孩子的死亡率在15%以上,他们的每一个妇女平均生孩子就在7个以上。旁边的尼泊尔,虽然一样穷,但是他的婴儿死亡率在被控制在了5%一下,所以尼泊尔的妇女就不怎么生。

第二个原因,就是有钱了嘛,全世界经济在过去几十年里是增长的。要知道生孩子这个事情,对于一个家庭来说,从某种角度上来看,可以看作是一个“消费品”,如果是穷,没什么别的消费品可买,那就生娃呗,反正多一个人多双筷子。可是一旦有了钱,他就有了其他的消费品可买,尤其是奢侈品作为替代的消费品。而且往往家里越有钱,养一个孩子所花费的代价就越大。今天在北京上海这样的城市生一个孩子所带来的代价,跟30年前在农村生一个孩子相比,那差距太大了。所以这种消费品,人们越有钱,反而越消费不起。

第三个原因,妇女解放运动,之前的女人在家,夫权为大,自己也没什么太多的办法。现在女性在社会上的地位完全不同,谁在家天天给你生孩子玩。

最后,城市化。在农村的时候,农民伯伯一算账,多生一个娃,没准5岁的时候就能到田里帮帮忙了。可是到城里再试试?没田种,小孩儿再多也帮不上忙,房租还贵。

其实说到这里,就是一个意思,计划生育搞与不搞,只要社会发展,人口问题并没有那么可怕。

人口多是坏事吗?

刚刚我们说的,计划生育基于的那一套理论在工业革命前还算凑效,工业革命之后的情况就完全不一样了。因为工业革命点燃了人类生产方式的一次大切换、大爆炸。此后,人口和资源之间的矛盾和原来就不一样了。要想讲清楚这个人口问题,对于工业革命到底改变了人类财富增长方式的那个方面,我们心里要有数。其实整个问题的答案就在1776年亚当斯密的《国富论》里面,这本书的第一页就写到,一个做针的工厂,十几个人分成十几道工序,每天可以生产48000根针,但是如果让一个人脱离分工,负责所有的工序,那可能一天连一根针都生产不出来。所以,财富的创生并不是像我们教科书里写到的那样,劳动人民用劳动创造的,劳动不见得产生财富,财富的产生是基于一个精细的分工系统。工业革命就是这样点燃了技术革命,点燃了社会革命,让人类渐渐的走入了一个巨大的全球化的分工系统之中。从而带来我们这过去的二百年长足的人类财富增长。

举个简单的例子,刚开始的时候,一个铁匠铺基本就需要俩人。师傅摆弄手里的刀,徒弟负责抡大锤。虽然也是分工,但是过于简单。到了现代化钢铁厂呢,动不动就几万人,这里面的分工细化程度,如果不是一个内行人,很多工种连名字都叫不上来。政府也是一样,过去武都头带上几个小弟,整个县里所有警察的事情全都干了。可是今天的政府光警察这个领域就有多种分工,刑警、交警、户籍警、缉毒警,在中国还有个特产“城管”,分工越来越细。

为什么说城市化是经济发展后的一个必然结果,就是因为城市是一个更好的分工和协作系统,不像乡村里,人们把门一关,在家什么都可以自己干,城市里,即使你讨厌喧嚣,你也被嵌入到这个大的协作系统当中,参与到具体的分工,每个人都离不开。就像很多北京市民讨厌外地人,可要真把外地人都撤了,他也活不下去。

可能比较奇怪,我们说人口怎么就跑到分工上来了。一个国家的经济发展水平如果取决于分工的话,那这个国家人口的上限,就是分工可能达到的上限。一个八千万人口的国家,最多最多也就是八千万种分工吧,只有人口基数很大的情况下,国家的发展才有无穷的可能。很多国际政治专家在分析中东政治局势的时候,为什么这么重视伊朗,不是什么别的意识形态、制度这些问题,就是因为它人口多,而且资源也并不短缺。它的经济想要发展,只要制度环境稍微一变化,这个国家非常有前途。相反那些中东现在的产油国,似乎是富得流油,但是没有人口,没有东西,很多工作都是外来工给他们干。假设说未来人类能源发生一次大切换,比如太阳能什么的,这些国家马上就会沦为赤贫。当我们再观察整个人类的近代史,有一个基本的轨迹,就是人口规模大的国家会崛起,干掉之前虽然拥有创新但是人口规模小的国家。这种大国崛起的替代的次序是非常清楚的。这样看来,人口多似乎是一件好事。

再来说一个发生在中国的例子。其实中国在清朝以前,所有的盛世,几乎人口都没有超过过1亿,这似乎就是一个瓶颈了,而到了乾隆50年的时候,中国的人口就已经超过3个亿了,我们今天的人口,很大程度上都是清朝奠定下来的基础。当时的清朝政府已经意识到了这一点,“太平日久,生齿日繁”,人口过多,不稳定因素太大。但他们的解决方法可不是什么计划生育,而是选择发展生产。后来的人回过头来看当时取得的成果其实是很瞠目结舌的。当时的江南就从原先单一的粮食产业结构中解放出来,开始种植更多的棉花,发展更多的家庭手工纺织业、蚕丝业等等。所以,他们的现金收入已经远远超出了非现金收入。解释一下,就是不是光吃饱就算了,更多是有钱花,这算是对富裕的最狭隘定义了吧。这个时候江南地区已经成为一个粮食输入地带,要从当时的粮仓,湖广一代引入粮食。在清代这样一个大规模人口挤压下,它内部也孕育出了一个市场经济的分工系统。

广东也是这样,原来的广东也是稻米自足,但是到了清代后期,广东的稻米居然需要广西来输入。广东人民发明了非常著名的“桑基鱼塘”,原来的稻田挖掉养鱼,稻田的旁边种桑树,桑树可以用来养蚕,蚕的粪便又投入鱼塘接着喂鱼,非常科学的鱼桑产业。所以广东人也一下子非常有钱了。这个传统一直留到今天,现在说中国哪最富,还是长江三角洲,珠江三角洲嘛。在这里又印证了之前的理论,人参与到分工中,你种粮食,我就不种了,我种棉花,养蚕,养鱼,发展手工业,然后拿来和你交换,所以大家的财富都得到了增长。而所有的这一切,都是建立在人口规模足够的基础上。基于这样的经济学分析,我们还能说人口多一定是一件坏事吗?

抬杠

这会儿估计已经有人出来反对了,难道说人口越多越好吗?地球表面每一平米都挤满了人,那还像话吗?

其实说出这样的话,八成在学校就是辩论会出身。我们要关心的是真实世界,而不是那些极端推论。话说,这世界上什么东西就一定是越多越好呢?任何东西往极限了去推都会产生反作用,正所谓物极必反嘛。所以极端推论从来都是用来抬杠的,而不是讨论问题的。今天我们要关心的是,在当前的历史时点,我们人类面对的人口问题,到底是人口过多还是人口出生率不足?

很多发展中国家现在其实已经在警惕这个问题了,据联合国统计的人口出生率,巴西1.8,泰国1.6,印度最发达的城邦也都在2.0以下。而中国呢?已经是1.4,比联合国公布的超低人口出生率的红线1.5还要低。这个时候还不应该着急吗?因为人口问题有一个特点,把它打下去容易,想要反弹回去,那就难了。比如新加坡政府都急死了,经常政府出钱组织男女大龄青年的聚会,或者是派出一些像星探一样的人物到周围国家,尤其是中国,找一些看上去不错青少年,试图将其移民引进到新加坡去。所以,纵观全球,中国现在所面临的已经是严重的人口出生率不足。

还是拥挤

可能有的人觉得,不管人口出生率高不高,现在中国人口就是太多,太拥挤,满眼望去全是人。事实真的是这样吗?在中国有大片大片的无人地带,为什么就没有人去,反而都集中在北上广深这样的大城市呢?其实,人口拥挤本质是一个资源配置的结果,而不是人口过多。假如说中国能降到现在人口的一半,是不是就会解决现在看起来是人口过多引发的问题了呢?答案其实很明确,依然不会。

不妨我们就设想一下,人口真的就变成了6亿左右,就像刚才说的,无非是生产力不足了嘛,经济发展慢了点嘛,我们虽然穷了,但是心里舒服啊,不挤啊。可惜的是,计划生育连这个目的也达不到。为什么呢?地球表面没人住的地方多了去了,大家为什么不去。俄罗斯的西伯利亚,从两百年前没人住到现在还是没人住,为什么?没有基础设施啊。而中国现在的基础设施,是按照十几亿人口来配置的。什么是基础设施,那可不是死东西,它是产生财富的工具,是人和人协作的纽带,这些东西只要在,它就会不断的吸引人来利用这些基础设施。

我们切换到一个微观的场景,一个企业主,机器设备什么都准备好了,市场也有,客户等着拿产品,但是就是没有工人,怎么办?这个时候,有人说“外籍劳工要不要?我给你找一卡车黑人兄弟来,要不要?”当然要啊,哪怕是非法移民也要。在美国不就可以看到这样的情况嘛,政府虽然禁止非法移民,但是有些企业主贪便宜还是会使用啊。类似这种场景生活中将到处都是,这种跑冒滴漏的渗透现象是很难用军事武力把它阻挡在外面的。别说中国不行,美国也做不到。一旦这些人进来,那计划生育的作用不就是导致原来生活在这片土地上的人,给其他人腾地吗?人还是那么多,只是原来我们这些拥有共同文化的人变少了。

就像现在广州的核心区已经有几十万黑人兄弟在那里安营扎寨了。这几年,我们还可以说把他们礼送出国,哪来的回哪去。但是如果过几年,他们在这里娶妻生子,孩子也长大,说着一口流利的普通话,广东话,还怎么把人礼送出国呢?这么一看,人口问题可不仅仅是经济的上算计,而且还是在保卫我们的文化。文化的承载者就是一个一个最具体的人,没有人哪还有文化。现在的美国就在天天担心他们那种WASP(详情请google)文化会被大量移民文化所冲击。包括欧洲也在做出相应的措施,而唯独中国,还有点后知后觉的意味。

思想的转变

其实在过去的几十年里,整个世界对于人口问题已经出现了一个思想观念的大转向,在俄罗斯,孕妇的地位是相当高的,很多有关“英雄母亲”的说法相信我们也都知道。许多国家的领袖到民间都要抱孩子,也算是有鼓励人们生育的意味。包括中国现在虽然仍在推行计划生育,不过态度已经有所缓和,包括最近几次大的会议对生育政策做出的调整,也让人们看到了,情况似乎有所不同了。估计说这么多,大家已经对于人口问题有所认识,而真正的思想的转变这还要经过一个比较漫长的历史。

各种缝隙里挤时间写的,匆匆结尾,累坏了。




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

活在当下

定这么一个题目其实有点傻,这篇文章主要想说的,就是通过对一百多年前当时中国几个重要的人物角色的分析,找到一些对我们现代人的一点点启发。不错,说的就是晚清那一票子重要大臣。

李鸿章

在李鸿章活着的时候就已经挂上这两个大的帽子了,一个是“汉奸”,一个是“误国权臣”。但是从我们现在回头看100多年前的这个问题,客观的讲,真要给李鸿章按上这俩帽子,其实是有点不公平的。在这一点上,是个明白人都清楚的很,也和今天我们要说的主题有点不符,不多说。就记住一点吧,李鸿章还是很不错滴。

丑闻

再来说说李鸿章的丑闻,在当时来讲,老李也已经算是当时的高富帅了。但是在国际场合里,经常就把老土的一面给露出来,留下各种笑料。比如美国现在还有一道菜,叫李鸿章杂碎,因为他当时吃鸡嘛,直接用手而不用餐具什么的。美国人看着也没办法,为了外交礼仪也只好学他用手,后来就干脆把西餐中餐炖一起,发明了这么一道菜,据说现在纽约的餐馆还有这道菜。

像这样的丑闻也是多了去了啊,当时俄国主要和李鸿章打交道的维特伯爵后来写回忆录的时候就说“李鸿章可能在他们国家算是受过高等教育的人了,但是在我们国家人民的眼里,他是没有文化的”。在李鸿章死后两个月,梁启超还给他写了一篇传记,叫《李鸿章传》。里面有这么一句话“我敬李鸿章之才,惜李鸿章之识,悲李鸿章之遇”,意思就是说,李鸿章你很有才能,但是我很可惜你的见识不够,也很为你一生的遭遇感到悲哀。

愚人船

这个话当然可以这么说啊,也确实像我们现在人看到的一样,不过在我们说出这样的评价的时候,是不是缺少了一份谅解呢?什么叫“识不够”呢?每个人都是在具体的经验中,具体的传统中和具体的境遇中,作为一个外面的人,不管是敬也好,悲也好,惜也好,这都是旁观者的角色。一旦我们置身到他的境况中,遇到的全部是每一刻最具体的选择。这可不像从现在回过去看李鸿章,你们改革啊,你们维新啊,说当然好说,可就是眼前这一小步遇到的这最具体的一个决策,怎么搞。这可不是说造这造那,推动市场经济,马上国家就繁荣了,具体的人有具体的难处。包括这个梁启超,后来民国的时候也当过司法总长,财政总长,结果呢,文章写的好,干政治干得一塌糊涂嘛。

这里就想到一个寓言,叫愚人船。有这么一种船,船舱密闭驾驶这艘船的所有一起都在这个船舱里。一个陌生人,走进这个船舱里,一片漆黑,只能靠一点点的摸索搞出星星亮光,慢慢的学会怎么操作这个船。这个时候,他仍然被封闭在这个船舱里,得不到外面的信号。而船甲板上有一帮人很清楚啊,必须往哪边开,哪边有礁石,但是喊破喉咙,船舱里的他也听不到。他也很着急,突然撞到东西剧烈的晃动,他也想把船开好。这里就非常像我们今天和李鸿章对话的困境。

今天我们就是想说一下,就在这样一艘愚人船上,就在这样一种前景不分明,现状很纠结的情况下,李鸿章是怎么干的,而他的干法,对于我们今天的人,有什么启发呢?

对比

单独拉出来说一个人很没有意思,我们通过对比的方式,来进一步诠释我们想要阐明的理念。下面就把下面这两尊给请出来晒晒。

左宗棠

左宗棠了不得了啊,湖湘大才子,早起参加镇压太平天国,后来又带兵收复新疆,战功卓著。

但是,这人有个毛病。他一生都生活在自己过去的辉煌历史和人情恩怨中。他跟曾国藩有恩怨,当年西征的时候,每天升帐之后,跟将领们三言两语就岔到骂曾国藩的话题上去了。后来西征结束,新疆也收复了,在北京恭亲王这边一听,哎呀,左宗棠不得了啊,人才啊,咱爷们儿把他弄军机处来得了。没想到这可是请神容易送神难,这哥们儿一天坐在朝房里就是吹嘘自己西征的战绩。后来实在受不了了,把左宗棠外派当封疆大吏去了。所以左宗棠就出了军机处,去两江当总督。到总督任上还是这样,不管来了什么客人,三言两语他老人家就有本事转到两件事上,第一,西征,我多牛,第二,曾国藩有多坏,开始骂。从早骂到晚。搞的客人事没办,第二天还得来,接着又是一天。左宗棠的晚年基本就这样过的。

反过来我们再看李鸿章,李鸿章就不一样,他虽然有敌人,也有恩怨。但他从来不沉在里面无法自拔。比如说,李鸿章和曾国藩就曾经闹过矛盾。李鸿章曾经有段时间入了曾国藩的幕府,和湘军一起打仗,给曾国藩起草一些奏折。后来在跟太平天国作战的时候,曾国藩不顾李鸿章的反对硬生生的执行一项决策,还把李鸿章赶走了。后来证明李鸿章确实是对的,这个时候曾国藩缓过劲来了,就给李鸿章写信,希望他回来。李鸿章接了这个信,做好安置,就回到了曾国藩的大营。所以后来也才和曾国藩形成了这种师徒父子的关系。曾国藩一生有一句非常重要的名言,“办大事,第一是找替手”。他也就找了李鸿章这么一个替手。

张之洞

张之洞河北人,也是一个词臣,文章写的好,跟慈禧太后关系紧密。同样的要开始说他这个人了。

张之洞虽然没有左宗棠那个老往后看的毛病,他往前看的时候,却经常给自己设定一个特别宏大的目标。至于能不能办到,不管。张之洞有一个好处,就是不贪污,特清廉,甚至还在自己府衙的后面开片菜园子,自己种田。这就要看怎么去理解贪官清官的问题,有的时候,清官比贪官还要可怕。贪官嘛,无非就是贪点钱,但他毕竟要找各种机会让钱生出来,他贪一点。清官不一样,清官就仗着自己不贪钱,带有强大的道德正确感,甚至胡作非为。张之洞就是这样,他在湖广总督任上听说要办洋务,琢磨着这事是好事,那就办啊,然后就办了一个汉阳铁厂。于是,汉阳铁厂就在规划不清楚,路径不明确,技术不成熟,市场不知道的情况下,仓促上马。上马之后,亏的一塌糊涂,最后底儿掉。后来把汉阳铁厂救回来的还是李鸿章的一个小兄弟。

除此之外,张之洞还有一个毛病,就是对未来永远怀着一种小心谨慎的恐惧。当然,这也不能全怪他,这也是他在风涛险恶的官场里的一种生存法则。比如说,戊戌变法的时候,张之洞的表现就很让人齿寒,他觉得这是一个特别好的投机机会,所以干了几件事,第一、想方设法把自己的一个叫杨锐的门生安插到四京卿,(和后来被杀的戊戌六君子中的杨锐是同一个人),也就是说,搞改革,这里得有我的人。第二、改革我得支持,但是怎么支持呢,这个时候就开始绕弯了,你们改革不是要办会吗?我捐钱,但是入会这事,别写我名,我不入会。永远是这种首鼠两端的态度。包括后来,他发现维新变法已经感觉有点味道不对了,于是赶紧写了一本书,叫《劝学篇》。张之洞的《劝学篇》在中国近代学术史上是有非常高的地位的,这一点上我们要有一说一,有二说二。可是如果你回到这本书当时的背景,就确实像前面说的,齿寒啊。他这本书里就说到一个意思维新变法就是要用新的方法,维护祖宗的纲常。中学为体,西学为用嘛。这样以来,变法一旦失败,自己也是胜利方的中流砥柱啊。

总得来说,张之洞这个人,对于未来,他确实是一个眼光很超拔的人,是可以看到未来的。但是你会发现,当他面对未来的时候,他是有两种心态,第一种贪婪、第二种恐惧。

同样的,我们再回来对比李鸿章,他这个人从来没有什么伟大的规划,也从来不提什么伟大的设想。他搞洋务运动跟张之洞完全不一样。没有一上来就是巨大的动静,而是一步一步的往前拱。最著名的就是他修铁路的例子。很早的时候,李鸿章就曾经提起过要修铁路的事,苦于当时各种舆论压力,没人能主持这么一个项目,慈禧都不敢牵头干,所以提议就搁置了。五年后,他又提出来了,这一次他是让一个手下叫刘铭传的人提了出来。这一次的结果是,太后拿不定注意,让各位大臣商量。这也给李鸿章一个信号,“老太后不是反对,是让大家商量,说白了,老太后是站在我这头,试探大家的意见啊”。于是他偷偷摸摸干了一件事,在唐山的煤矿修一条唐胥铁路,运煤用。为了堵住众人的反对声音,火车都不要火车头,就铺了铁轨,让驴拉火车。后来又各种公关,很快就装上火车头,也慢慢的被大家接受了。甚至后来,还在宫里给慈禧太后修了一条铁路,没有火车头,一堆太监拉着走的。这样一来,铁路的阻力瞬间变小了。

到这你基本就发现了,李鸿章在这里面,他都是随时改变方案,从来没有激进的口号,只要发现哪好像松动了一点,他就往前拱一点,也就是用这种日拱一卒的方法,推动着中国的进步。

总结

刚刚对比了两个人,一个人沉浸在历史里,一个人对未来充满了贪婪和恐惧。而唯独李鸿章,既不跟历史叫板,也不跟未来较劲,简单的说就是活在当下。这可能也就是李鸿章给我的最重要的启发。

延伸思考

说到这里,历史方面的内容也基本写完了。剩下的我们将从历史上学到的东西尝试着用到我们现在人的身上。

现在很多人,在办公室打工的人,心里就可能会很不爽,觉得工资也少,也没有什么前途。然后就有可能生出很多妄念出来。如果说,每天想着的就是自己现在跟上一份工作相比少了什么,遇到什么什么不如意,还不如之前怎么怎么样。这就是上面说的左宗棠的教训。如果说,天天想着我要创业,我要有一个什么想法,我要拿风险投资,对不起,这也许就犯了张之洞的毛病。

这个时候,我们想一想,是不是可以更多的学习李鸿章的某些做法,不单单是活在当下,更重要的是利用好现在资源,做一件在现在这个岗位上最漂亮的事。这不仅会在现在的岗位实现应有的价值,更重要的是,这样做的同时也在打造自身品牌。让下一个能够赏识你的人看到这一点,机会就有可能自己找上门来。其实李鸿章就是这么办的,他后来在国际上的也算是声名浩荡,1896年,中国战败,但是李鸿章在环球访问的时候,在各国都受到了极高规格的接待和礼遇。尤其是到美国,都快把他捧到天上去了,就是这么一个战败国的老头子,你会想,为什么呢?因为李鸿章就办一件事出了名,导致全球都知道,李鸿章是中国办洋务最棒的人,是中国睁眼看世界看的最远的人。这个品牌树立起来了,整个市场就都认他了。

为什么这样做在这个时代愈加重要,因为我们正处在一个时代变化的惊涛骇浪之中,我们今天所处的这个时代,和一百多年前,李鸿章所处的那个时代其实差不多,都是愚人船,我们在船舱里都不知道未来怎么样,也没有人隔着船舱的甲板告诉我们应该往哪里走。我们这一代人也都是趟着水往前试探这走。就像去年,诺基亚卖给微软,最后一次新闻发布会,他们的老总有一句话,很让人心疼,他说,“我们其实也没犯什么错,但是不知道怎么就输了”。这就是这个时代的特点,过去的很多经验不管用了,对未来的预测基本也都是瞎扯。这也就是为什么我们要学习李鸿章,把所有的注意力放在当下,不管过去,不管未来,做当下最该做的事。

最后引用胡适先生的一首诗,做了过河卒子,只能拼命向前。




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

Look Backward

又是一年

今天是大年三十,对这一年进行回顾。。。有些事情吧,不好一一说,还是说些和专业有关的吧。就想把这学期看的几本书在这里展示一下吧。。。

最近只有两个任务,node.js还有iOS开发,另外穿插这一下服务器相关技术,nginx是我主要学习的。

当然,看书并不是全部内容,有机会把所有的项目也要拿出来,其实都在我的github上,能来赏脸不胜欢迎。。。






爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

iTerm2 配色攻略

终于把 iTerm 的配色搞完了,之前因时间不够半途而废了。网上有几个 iTerm 的配色教程,跟着试了试,都不行。终于找到了解决方案。


预览

这是我的配色结果,还有多种配色方案可供选择。


一步一步来

首先打开home目录下的 .bash_profile 文件

$ vim ~/.bash_profile

粘贴进去一下内容:

1
2
3
CLICOLOR=1
LSCOLORS=gxfxcxdxbxegedabagacad
exportPS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '

保存退出后。

接下来,打开 iterm 确认一下在 Preferences->Profiles->Terminal 标签下的 Terminal Emulation 选择的是 xterm-new,这个一定要确定(有可能需要重启 iTerm ),网上有的版本说的是 xterm-256color,亲测结果不对,一定要是 xterm-new 才可以。

之后在 Preferences->Profiles->Colors 标签,点击 Load Preset 列表中的 Import 进行导入,然后选择一种即可。




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

茗记(一)

还是这几天

一直没有时间写博客,只能每次来写这种来回顾这几天了。


vim初体验

本来写了一篇有关配置vim了博客,结果发现和网上的重复率太高就懒得传上来了,展示下最终vim的样子就OK了。

用vim,就像一位小伙伴说的那样,是一种精神。是对代码的执着,对技术的热情。开始做一个伪高手吧。。。呵呵


KOA

之前用express,这也是我接触node.js只有使用的第一个框架。感觉很好,同样还是那帮人开发,koa自然我也不会放过。学习的同时,帮着做了一下koa的翻译工作。欢迎小伙伴们来指点。网站在这里

还是那句话,技术没有止境,我在探索的路上,永不停歇。


python

同样是为了可视化的报告,帮同学做了一个三围的地理可视化界面,用python实现的。

python确实相当强大,有各种库的支持,全球的开发者在为这个语言添枝加叶,用起来得心应手。。。


gnuplot

也是在帮小伙伴做可视化报告时发现的一个很不错的小工具。gnuplot是用来做科学视图的,可以对函数或者数据进行2D/3D的可视化。

上图是对f(x,y)=sin(sqrt(x∗x+y∗y))/sqrt(x∗x+y∗y)函数的可视化。

上图是对一组数据进行的可视化,可以抽象的想成是某地地形,或者是地域降雨量分布什么的。

这是从立体图中抽取出来的一个截面,用等高线表示。

这个工具十分轻巧,功能比着matlab也一点不差,非常适合轻量级的科研或者教学使用。而且安装方便,用mac的小伙伴们只需要在macport下安装即可。


向前看

接下来,除了几门考试,时间就比较充裕了,有几个大任务一定要抓紧了。不想给自己强加什么硬性的目标,觉得不现实,这样的学习节奏也不科学。只有几个大方向,一个是IOS的学习,一个是node.js的加强。这两块工作所需的内容其实是蛮多的,脑子里已经基本有了思路。另外穿插的,还有一些服务器的知识,包括nginx,和一些服务器编程。


现在回过头来看,还真的不容易。。。




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

基于Node的下一代Web开发框架--koa

由 Express 原班人马打造的 koa,致力于成为一个更小、更健壮、更富有表现力的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升常用错误处理效率。Koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。


安装koa

koa 依赖支持 generator 的 Node 环境,也就是说,node的版本要在 0.11.9 或者更高,否则将无法执行。

用npm:

1
$ npm install koa

或者,选择安装在全局:

1
$ npm install -g koa


Example

这是一个koa的简单例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var koa = require('koa');
var app = koa();
// logger
app.use(function *(next){
var start = new Date;
yield next;
var ms = new Date - start;
console.log('%s %s - %s', this.method, this.url, ms);
});
// response
app.use(function *(){
this.body = 'Hello World';
});
app.listen(3000);

与普通的 function 不同,generator functions 以 function* 声明。以这种关键词声明的函数支持 yield。在后面会讲到 yield 的用法和意义。


执行koa

执行koa时需要在 —-harmony 模式下运行,为了方便可以将 node 设置为默认启动 harmony 模式的别名:

1
alias node='node --harmony'

这样在执行相关js的时候就可以直接使用了。


Cascading

这是一个比较抽象的概念。Koa 中间件以一种非常传统的方式级联起来,也就是这里所谓的Cascading。

在以往的 Node 开发中,频繁使用回调不太便于展示复杂的代码逻辑,在 Koa 中,我们可以写出真正具有表现力的中间件。与 Connect 实现中间件的方法相对比,Koa 的做法不是简单的将控制权依次移交给一个又一个的中间件直到程序结束,Koa 执行代码的方式有点像回形针,用户请求通过中间件,遇到 yield next 关键字时,会被传递到下一个符合请求的路由(downstream),在 yield next 捕获不到下一个中间件时,逆序返回继续执行代码(upstream)。

下边这个例子展现了使用这一特殊方法书写的 Hello World 范例:一开始,用户的请求通过 x-response-time 中间件和 logging 中间件,这两个中间件记录了一些请求细节,然后「穿过」 response 中间件一次,最终结束请求,返回 「Hello World」。

当程序运行到 yield next 时,代码流会暂停执行这个中间件的剩余代码,转而切换到下一个被定义的中间件执行代码,这样切换控制权的方式,被称为 downstream,当没有下一个中间件执行 downstream 的时候,代码将会逆序执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var koa = require('koa');
var app = koa();
// x-response-time
app.use(function *(next){
// (1) 进入路由
var start = new Date;
yield next;
// (5) 再次进入 x-response-time 中间件,记录2次通过此中间件「穿越」的时间
var ms = new Date - start;
this.set('X-Response-Time', ms + 'ms');
// (6) 返回 this.body
});
// logger
app.use(function *(next){
// (2) 进入 logger 中间件
var start = new Date;
yield next;
// (4) 再次进入 logger 中间件,记录2次通过此中间件「穿越」的时间
var ms = new Date - start;
console.log('%s %s - %s', this.method, this.url, ms);
});
// response
app.use(function *(){
// (3) 进入 response 中间件,没有捕获到下一个符合条件的中间件,传递到 upstream
this.body = 'Hello World';
});
app.listen(3000);

在上方的范例代码中,中间件以此被执行的顺序已经在注释中标记出来。你也可以自己尝试运行一下这个范例,并打印记录下各个环节的输出与耗时。

1
2
3
4
5
6
7
8
9
10
11
12
.middleware1 {
// (1) do some stuff
.middleware2 {
// (2) do some other stuff
.middleware3 {
// (3) NO next yield !
// this.body = 'hello world'
}
// (4) do some other stuff later
}
// (5) do some stuff lastest and return
}

上方的伪代码中标注了中间件的执行顺序,看起来是不是有点像 ruby 执行代码块(block)时 yield 的表现了?也许这能帮助你更好的理解 koa 运作的方式。


中间件(Middleware)

实际上,这些只是初步理解了koa基础,koa有很多第三方开发的中间件,这些中间件的熟练运用才是关键,github有很多这方面的库,每个都有详细的例子解释。以下是常用的一些:


小结

这些天确实做了写有关koa的工作,集合开源的力量做了一个 中文文档 有更详细的API说明。

在这里要感谢 一米 对网站建设的大力贡献,还要感谢 郭宇 对翻译工作的大力贡献,此中文文档遵循MIT协议,转载著名出处即可。




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

这几天

这几天一直在忙,没有时间写东西。翻译了一篇将近三万字的论文;上党课,做十八届三中全会的报告;为了老师的实验从头学了python,就为了证明一个错误的数学公式是错误的。。。今天把这几天做的东西写一个小结。


前两篇博客所写的WebGL最终做的结果


用python生成的高斯模糊矩阵

实验室要做卷积与反卷积实验,坚决杜绝用matlab,果断python走起。。。说实话python也是现学现卖,还在慢慢进步中。希望以后能陆续传一些python的项目上来。


几种licence的比较

做开源的,这些一定要熟记于心啊。。。


写的几篇文章被简书收录


看到一个图片

可能很多人觉得这图是在讽刺什么,在我看来,这图是告诉我有哪些书是经典之作,需要在将来仔细读一读的。在这里把图贴出来,与君共勉。


最后

现在的实验室,已经被我收拾成这个样子了。。。对于实验室落后的设备,我实在无力吐槽,都搬来用自己的。什么时候能给我配一个好点的显示器,难道还要自己买?




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

First Journey In WebGL(二)

承接上次讲述,这次我们要实现一个功能。在程序中引入一个obj文件,在页面中以三维形式展现出来。并且,实现互动式的三维旋转,即随着鼠标的移动,图像在三维立体空间里进行相应的动作。


引入相关js文件

1
2
3
4
5
6
7
8
9
<body>
<script src="Three.js"></script>
<script src="OBJLoader.js"></script>
<script src="Detector.js"></script>
<script src="RequestAnimationFrame.js"></script>//最大可能的兼容老版本浏览器
<script>
// your code here
</script>
</body>

所有的js文件在源码中都能找到,在 OBJLoader.jsexamples/js/loaders/ 中。


OBJLoader.js

这个是我们主要用的一个js模块,它实现了我们所要的引入obj文件的功能。

1
2
3
4
5
var loader = new THREE.OBJLoader();
loader.load( "1.obj", function ( object ) {
2object.position.y = -30;
2scene.add( object );
} );

代码浅显易懂,基本没什么好说的。


设定环境光和直接光源

1
2
3
4
5
6
var ambient = new THREE.AmbientLight( 0x101030 );
scene.add( ambient );
var directionalLight = new THREE.DirectionalLight( 0xffeedd );
directionalLight.position.set( 0, 0, 1 ).normalize();
scene.add( directionalLight );

three.js提供了多种环境光和光源可供选择。从官网或者github下载原文件后,里面的doc有全部的解释,其实玩javascript是一个体力活,相信你也发现了。


设置动画效果

1
2
3
4
5
6
7
8
9
10
11
function animate() {
requestAnimationFrame( animate );
render();
}
function render() {
camera.position.x += ( mouseX - camera.position.x ) * .05;
camera.position.y += ( - mouseY - camera.position.y ) * .05;
camera.lookAt( scene.position );
renderer.render( scene, camera );
}

requestAnimationFrame() 的主要作用是,当此时页面所在浏览器的tap或者window不可见时,就停止渲染,这样更加节省系统资源和电量。在 render() 中,有两个全局变量 mouseXmouseY ,需要添加监听器进行监听,随时改变 camera 的位置,从而实现动态图像的动态显示。下面来添加监听器。


添加监听器

1
2
document.addEventListener( 'mousemove', onDocumentMouseMove, false );
window.addEventListener( 'resize', onWindowResize, false );

相应的响应函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function onWindowResize() {
windowHalfX = window.innerWidth / 2;
windowHalfY = window.innerHeight / 2;
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
}
function onDocumentMouseMove( event ) {
mouseX = ( event.clientX - windowHalfX ) / 2;
mouseY = ( event.clientY - windowHalfY ) / 2;
}

这里还添加了另外一个监听器,是用来相应窗口变化,这也是为了适应多种显示器比例不同,以及在浏览过程中窗口大小变化,物体总是呈现在窗口的正中间。


最后,全部代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<!doctype html>
<html lang="en">
<head>
<title>three.js webgl - loaders - OBJ loader</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
body {
font-family: Monospace;
background-color: #000;
color: #fff;
margin: 0px;
overflow: hidden;
}
</style>
</head>
<body>
<script src="Three.js"></script>
<script src="OBJLoader.js"></script>
<script src="Detector.js"></script>
<script src="RequestAnimationFrame.js"></script>
<script>
var container;
var camera, scene, renderer;
var mouseX = 0, mouseY = 0;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;
init();
animate();
function init() {
container = document.createElement( 'div' );
document.body.appendChild( container );
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera( 65, window.innerWidth / window.innerHeight, 1, 2000 );
camera.position.z = 100;
scene.add( camera );
var ambient = new THREE.AmbientLight( 0x101030 );
scene.add( ambient );
var directionalLight = new THREE.DirectionalLight( 0xffeedd );
directionalLight.position.set( 0, 0, 1 ).normalize();
scene.add( directionalLight );
var loader = new THREE.OBJLoader();
loader.load( "1.obj", function ( object ) {
object.position.y = -30;
scene.add( object );
} );
// RENDERER
renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
container.appendChild( renderer.domElement );
document.addEventListener( 'mousemove', onDocumentMouseMove, false );
window.addEventListener( 'resize', onWindowResize, false );
}
function onWindowResize() {
windowHalfX = window.innerWidth / 2;
windowHalfY = window.innerHeight / 2;
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
}
function onDocumentMouseMove( event ) {
mouseX = ( event.clientX - windowHalfX ) / 2;
mouseY = ( event.clientY - windowHalfY ) / 2;
}
function animate() {
requestAnimationFrame( animate );
render();
}
function render() {
camera.position.x += ( mouseX - camera.position.x ) * .05;
camera.position.y += ( - mouseY - camera.position.y ) * .05;
camera.lookAt( scene.position );
renderer.render( scene, camera );
}
</script>
</body>
</html>


注意

如果只写一个html文件并把所有的js文件引入进来,依然是无法在浏览器中显示的,这是许多浏览器为了安全性考虑,对于本地的html显示有所限制,具体原因还没有深究,有两种解决方案,一种是改变浏览器的配置,另一种是搭建一个本地服务器(推荐),这是用python搭建的方法。

$ python -m SimpleHTTPServer 8080

用node.js:

(sudo) npm install http-server -g

然后在任意目录下

http-server [-p] [端口号]

然后访问 localhost:8080,会进入到到自己搭建的本地服务器,就可以实现obj的引入了。


小结

WebGL还是内容还是相当丰富的,javascript更是如此,再多的教程也都只能作为抛砖引玉,真正的老师是谷歌,还有一个强大的资料库github,善用这两个资源,再到几个社区活跃一下,学技术很简单了。。。




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

First Journey In WebGL(一)

由于一门课程的需要,要做一个三维可视化的presentation,想来想去,也就WebGL我还有点感兴趣,于是开始对这一领域的研究。这两天的时间也算是小有收获吧。在报告中我就是打算带着大家一起从零写一个WebGL程序的,让所有人也都感受一下这么一个创作的过程,再分享一下学习的经验。不过可能时间不够,就在这写吧。


three.js

要说玩WebGL怎么可能不说three.js,这可是对WebGL的完美封装。源码官网,要学three.js这两个地方是必去之处。我简单说一下three.js起步。


在进行开发之前

由于我们最终的结果是要呈现在web端,所有在在前端的展示框架要先搭建好,同时还要事先下载three.js文件,或者就像我这里一样,用three.js的官方cdn。

1
2
3
4
5
6
7
8
9
10
11
12
<html>
<head>
<title>My first Three.js app</title>
<style>canvas { width: 100%; height: 100% }</style>
</head>
<body>
<script src="https://rawgithub.com/mrdoob/three.js/master/build/three.js"></script>
<script>
// Our Javascript will go here.
</script>
</body>
</html>


创建场景(scene)

用three.js呈现的内容需要3样元算:scene, camera, renderer .

1
2
3
4
5
6
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

解释一下,这里的 camera,我们使用的是 PerspectiveCamera(three.js还提供了很多其他类型的camera以供选择),它有4个参数,第一个表示视野大小;第二个表示成像比例,一般都是按照浏览器窗口比例来进行设定;第三和第四个分别是最远和最近的camera作用范围。下面的renderer比较容易理解,需要注意的是在最后要append到document中。

下面创建一个物体出来。

1
2
3
4
5
6
var geometry = new THREE.CubeGeometry(1,1,1);
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );
camera.position.z = 5;

这里 CubeGeometry 为了创建一个 cube 出来,由 geometry 变量存储。除此之外还有需要 material 给我们的 cube 着色(同样的three.js由很多material可供选择)。然后就是 mesh 了,这个过程可以抽象的理解为融合过程,有了geometry和material融合后就是我们需要的最终 bject 了。最后把物体 add 进之前声明好的 scene 中去。

渲染(render)

1
2
3
4
5
function render() {
requestAnimationFrame(render);
renderer.render(scene, camera);
}
render();

如果要深入解释 render 的原理,这就是另外一本书的内容了。。。这里,浏览器接到指令后,大概会做的事情就是每秒对要显示的内容进行60次着色。

制作动画效果

如果渲染出的图像不会动,可能也看不出三维效果来。因为我们用的只是一个生成的简单cube,本身是没有办法呈现出立体感的。所以我们加点动态以展示出,我们做的确实一个三维的object。

1
2
cube.rotation.x += 0.1;
cube.rotation.y += 0.1;


最终代码展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<html>
<head>
<title>My first Three.js app</title>
<style>canvas { width: 100%; height: 100% }</style>
</head>
<body>
<script src="three.min.js"></script>
<script>
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
var geometry = new THREE.CubeGeometry(1,1,1);
var material = new THREE.MeshBasicMaterial({color: 0x00ff00});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 5;
var render = function () {
requestAnimationFrame(render);
cube.rotation.x += 0.1;
cube.rotation.y += 0.1;
renderer.render(scene, camera);
};
render();
</script>
</body>
</html>



这次先写这么多,下次介绍怎么再一个 WebGL 程序中 load 一个外部 obj 模型。哈哈,给力的实例来了。。。




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

再次造访GDG

先附上一张现场照,没有照人,就是照了屏幕,时间有点紧,没顾得上多照。



距离上次参加gdg的活动已经一个多月了。这一个月后,确实学到不少东西,也认识了一些有共同语言的小伙伴。回头有时间会写一篇文章讲述这一个学期回顾。先来说一说这次的活动吧。


地点选在了一直炒的很热的车库咖啡,这也是我第二次来到车库了,还是那个样子。。。
主题就是从零基础到写一个安卓程序,能跑通,有逻辑,最后能上传的网上。


晚上到了会场后,就看到了人山人海的一幕,其中还混在了好多大叔大妈,都带着孩子来的,这。。。好吧,我确实被雷到了,如果中国的it行业真的已经波及到如此之广的范围,那。。。也不知道是好是坏。


其实,这样的环境下,你要是真的是来学安卓开发。。。不好意思,你选错地方了,来这里真的不能算是来学习的,应该说是来看看圈子里的各类现象。在这一晚上的时间,整个车库基本上就形成了中国软件行业的一个小的缩影,其中有菜鸟,有大牛,有民间高手不显山露水,有江湖郎中坑蒙拐骗。。。总之吧,来这里稍微感受下软件这个圈子,认识点道上的朋友,还是有点好处的。


就我个人而言,见到了一些平时在github上follow的牛人,像是见到偶像一样,心情还是有点小激动的。只是他们也充分发扬了作为标准程序员应该具备的素质--“这天没法聊了。。。”,只能这么吐槽了。谁让人家是技术达人呢。再有就是多了俩微博粉丝,哈哈,认识了俩北京科技大学的本科生,一起聊的还不错。希望他们以后也能冲进开源的圈子,为现在的软件行业做出点贡献吧。



爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

New Ipad Mini

先声明,我可不是什么事情都会往博客里写,但今天不把Mini放上来晾晾总觉得对不起它。哈哈



换了Flickr,之前的账户莫名其妙不能用了。。。很可惜。以后会慢慢多公布一些Flickr上的照片。也是为了向某些人证明下,我确实是爱生活的。




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

从Flickr外链图片

一直以来用markdown写文章,感觉上最大的问题就是外链图片实在是不方便。虽然可以放在自己服务器本地,一旦这些图片多起来,我那可怜的VPS只有20G的ssd,实在有点于心不忍。

现在新浪出了一个图床貌似用着还行,只是还没有仔细研究,貌似不能可视化管理图片,而且被SAE的收费政策惊吓过,尤其是等你过度依赖它的时候猛地捅你一刀真是有点哭笑不得。

想来想去,最终还是觉得Flickr最合适了(未来可能能发现更合适的)。简单说一下用Flickr做外链的过程吧。再附带几个例子。

永远有个第一步

不关用什么软件或者服务,上来都是要注册的。。。这个真的是爱莫能助了。

上传图片,获取连接

上传过图片后,在所有图片里会看到你刚刚上传的图片,打开后右下角有个选项按钮,点开选择检视所有尺寸,进去后选择好要的大小后,复制图片链接,这个链接就可以做为你的外部链接使用了。

亲测

  • 75-75

  • 160-240

  • 原图640-960

最后在来一张来自desktoppr的高清大图(感觉要爆了,如果刷不出来就算了。。。哈哈)

1TB

Flickr给每个用户的容量是1TB,所以完全不用考虑容量不足这种问题。




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

Set Up Nginx On Vps

先说一下,这篇文章是给那些需要在自己的VPS服务器上装Nginx的人看的。VPS版本是CentOS 6,Nginx使用是比较稳定的1.4.4版本。


Why Nginx

事实上,我是受怂恿的。。。因为本身,我的博客不论是Jekyll还是Hexo都是不需要这种代理服务器的。但是作为一个出色轻量级web服务器,Nginx是在是太优秀了:

  • 超轻量级,占用更少的资源,对于我们这种自己掏腰包买VPS的小R玩家,每一分资源都颇显珍贵,选择Nginx而非Apache还是很有必要的。
  • 并发处理,Nginx处理请求是异步非阻塞的,(这点和node.js有点不谋而合的意思。。。)
  • 社区活跃,这点相信就不用我多说了,每个程序员恐怕最看重这点了。

考虑到这些,加上为了长远考虑,说不定以后要在服务器上放点App的服务什么的,我还是装了吧。


强势吐槽

不知道是我搜索的方法不对还是怎么,搜到的资料实在有失水准,如果现在看到这篇文章的你和我遇到的情况是一样的,按照我的解决方案应该是没问题了。在此我先写表上日期,现在是2013年11月26日,自己判断本博客是否已经过时。有什么反馈或者问题可以通过下面的联系方式找到我。


言归正传

本人的VPS是CentOS系统,Ubuntu或者其他用户仅供参考,自己斟酌。


第一步,请确定,你的系统已经安装GCC等基础yum包


第二步,建立软件源配置文件

/etc/yum.repos.d/目录下建立一个nginx.repo软件源配置文件。命令如下:

1
2
# cd /etc/yum.repos.d/
# vim

然后填写如下文件内容:

1
2
3
4
5
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

执行vim命令保存文件为nginx.repo完整路径是/etc/yum.repos.d/nginx.repo

1
:w nginx.repo


第三步,运行YUM

执行yum命令安装nginx

yum install nginx 

在过程中会让你输入一个Y,回车即可。


第四步,设置反向代理

/etc/nginx/conf.d/找到default.conf,修改listen、server_name、proxy_pass内容:

1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name example.com;
location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
proxy_pass http://127.0.0.1:4000/; ##这里我用Hexo搭建的博客
}
}


第五步,启动Nginx

且看一下指令:

1
2
3
4
5
# service nginx start
# service nginx stop
# service nginx restart
# service nginx status
# service nginx reload


小结

现在回头来看,装个 Nginx 还是挺简单的,主要是反代理 Hexo 网站的时候走了些弯路。接下来我会写一些使用 VPS 的心得,以及在 VPS 上搭建 git 服务。





爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com

Try Git

I’m an egotistical bastard, and I name all my projects after myself. First Linux, now git.

林纳斯·托瓦兹自嘲地取了这个名字”git”。在英式英语中指一个愚笨或者不开心的人。

Git

说到版本控制、软件项目管理等概念,在开源时代到来的今天,Git绝对是一个绕不开的软件。更多有关Git的官方解释,我也不赘述了。

Try Git

重点来了
我们不是技术大牛,不可能上来就熟练使用git全部操作。我接触git不到1个月,用的也只是它的基本粗浅功能(在我的Github就能体现出来)。不一定有什么指导意义,还是想分享一下整个Try Git的过程。

初吻

惊艳的第一次来自于Github的Training,在小伙伴的怂恿下开始了git之旅。

用git管理Github

如果上一阶段是初吻,那这里就是XXX,应该说是比初吻要更强烈的快感。用git命令行来控制自己项目的各种操作,看上去就有种瞬间变身技术大牛的感觉(有点自欺欺人)。
这里第一步比较麻烦一些,生成SSH Keys,建立与操作电脑的链接。详细参见来自Github的帮助
之后就是从Training学来的东西,反复的操作。
如果没有记牢的话,除了可以跟着Training再来一遍,Code School里也有相应的免费教程。

Use Git

现在,我们可以用Git进行最基本的项目操作,保证你的Github每天都有动态。这个时候和你打交道的基本就是就是一下几条语句:

  • git add . 添加所有修改文件到缓存
  • git commit -m “xxx” 记录缓存内容的快照
  • git push origin master 推送你的master分支与数据到某个远端仓库的master分支
  • git pull 从远端仓库提取数据并尝试合并到当前分支

总结

耐下性子,按照步骤,一步一步来,很快就能熟练掌握git。说到底也没有多少东西。




爱生活,爱技术。
愿结识各路小伙伴。
找到我:

微博:http://weibo.com/afmz

Github:http://github.com/Ming-Zhe

E-mail:law.gravitys@gmail.com