又是年终,2013年就要过去了。

眼睛的情况暂时稳定住了,买了个屏蔽蓝紫光的夹片,又戴了个帽子,把那些波长短能量高的伤害眼睛光线阻挡了大部分,至少最近疼痛没有那么厉害了。

想做的几件事情都不了了之,几点原因:找不到合适的人,自己决心不够,健康和惰性因素的影响。

上周末冬至,才意识到自己已经二十八岁了,时间流逝,不经意间已经快步入中年了。看看自己还是一事无成,上学时那些理想志向,几乎已消磨殆尽。现实中到处受挫折,当年那些妄图改变世界的想法,现在想起来不禁苦笑,笑自己年少轻狂。但我知道,这些想法还隐藏在内心深处,只是在逐渐淡去,

“年与时驰,意与日去,遂成枯落,多不接物,悲守穷庐,将复何及”,我还清晰记得父亲当年在黑板上写下来诸葛亮的诫子书时的情景,是在讲出师表的那堂课上。直到今天才深刻咀嚼出这段话的意义。

我曾不止一次思考,人活着的意义到底是什么。有人想做一番大事业,有人选择嘻嘻哈哈过一辈子,有些人过一天是一天,自己都不知道在干嘛。我以前很看不起后面的几种人,现在却觉得没啥不同,五十步笑百步罢了。作为一种复杂的碳基化合物,大脑都是天天在发生化学反应,结果没啥意义可言。我们活着,不都是为了刺激大脑,获得我们称之为愉悦满足的化学状态么。什么高尚,荣耀,真理,不过是我们称为地球的大石头表面上的微尘般的化合物体间冲突交互的微不足道的表现罢了。

记得看过Daniel Dennett的一个演讲的视频,具体内容找不到了,他当时大致是说:作为一名哲学家,我最被经常问道的问题就是我们活着到底有什么意义,所以我就准备了一个到处都可以应付的标准答案,那就是选择一件你认为对的事情,并坚持做下去并从中获得乐趣。

说实话他的解释等于没说,或者太宽泛,用来敷衍广大的提问者。

最终决定我们行为的还是大脑底层机制,那些激素化合物,如何使大脑获得愉悦而不是悲伤才是奠定我们行为的最基本的因素,或者说趋利避害的生物本能。只是人类的高层次理性把这些底层因素巧妙的隐藏了起来。

那么我认为正确而该从事的事情是什么呢?可以罗列一排,人工智能,机器人,新能源,意识的本质,室温超导……..

那为什么我现在不义无反顾的去做呢?那是因为这些东西离现实还有很远,在这个世界上,首先要谋生,其次才能从事爱好。这些东西偏重研究,除非有人开工资才行,但作为业余爱好,每天都可能会去思考可行的解决方案。

这就涉及到一个很重要的问题,那就是必须拥有足够的财力物力才能引导社会的走向,比如投入几十亿进行人工智能相关的研发,而这是政府才有能力做的事情,这正是权力的力量。

但是谁又能看清楚未来的走向呢?大部分努力不过是徒劳罢了,只有少数才能成功。也许人工智能是不可实现的,也许能源解决方案受到理论物理的制约。生活在1900年左右的人们预料不到100年后芯片对我们社会的影响,我们也很难预测100年后该有什么技术或者事物形态出现,只能把自己的时间精力花到看似可能性最大的事物上,尽管是徒劳,但总要去选择。

现在炒的比较热的,更现实具体一些的几个方向:移动互联网,无人机飞行器,智能穿戴/家居设备……大部分看起来竞争激烈并且不太靠谱,但是,除了这些更好的选择似乎不太多,当找不到更好的目标的时候,总要做些努力。

夜晚的昏暗中金星太白闪烁于群星间,
无数星辰繁灿于天空,数它最明亮.

荷马史诗 伊利亚特

在一个晴朗的夜晚,也就是昨天晚上,我拿望远镜对准了金星。

金星处于太阳的内侧轨道,所以从地球上看去,就如月亮般,有圆缺变化,昨晚映入我眼睛的,是弯弯的圆弧。

我开始思考人类知识经验的结构和处理方法,早上升起来的太阳,我们认为就是昨天的那个太阳,这种很自然的推理,是否存在缺陷?在一些动物看来,比如狗,今天的太阳跟昨天的太阳也许是另一个物体。

金星在黎明升起来的时候,我们称之为启明星,古人有东启明,西长庚之说,认为是两颗不同的星星,跟傍晚那一颗不同。

一颗星星只是一个闪亮的点状物体,要把它从夜晚灿烂的星空中单独识别出来确实有难度,除非我们看清楚更细节的结构,否则认为在不同时刻出现的同一颗星不同也是很自然的。太阳拥有可识别的唯一性,也没有其他众多干扰。

我们把一个物体的若干特征提取出来,每一个不同的单独事物都用一个概念名字来标记他,再次遇到同种事物的时候就把它识别出来。大脑的组成单元应该是特征概念组成的集合,若干概念组成一个新的概念,新的概念又用来作为其他概念的组成部分,神经元之间的连接大致也是如此,或许大脑的基本数据结构就是这个样子。

知识和经验作为静态存储存在于大脑中,操作这些数据的过程才是真正人类智能的起源,这个动态过程就是我们的自我意识,就是我们称之为“我”的那个东西。

意识是从神经元之间的电脉冲信号和突触间递质传递构成的复杂网络之中产生的,还是另外的其他东西?或者说,自然界物质的复杂化学反应中能产生出来意识吗?

这几乎是从笛卡尔以来所有哲学问题的中心,它的答案绝不简单。时间的本质、以及我们称之为灵魂的那些东西都与之牵连。

引用康德的话,时间不过是我们内感官的一种表现形式罢了。

正是思考的自我,才有了时间的观念,正是由于我们的观察,时间才有了存在感,意识肯定跟时间有关联,或者时间只是意识的表象或组成。

笛卡尔认为松果体是大脑的中心,通过它跟另一种思维的特殊物质来交互,并认为这种思维之物存在于脑脊液中。他的论断似乎有些荒谬,但仅仅是所处时代的医学水平所导致的。这个观念背后的概念思想有很大的价值。柏拉图说,灵魂禁锢于肉体之中,笛卡尔认为思维和物质是两个不同的存在,思维通过人类大脑作用于物质世界,或者可以说,这种思维之物,笛卡尔所谓的res cogitans,就是灵魂。

如果笛卡尔的二元论成立,也就是物质世界无法产生自我意识,那么我们就没有办法通过机器来产生真正的智能,无法通过计算机的某种算法来产生可以自我思考的东西。这似乎是人工智能研究人员的悲哀,但是,谁又能证明呢?

许多人经过仔细思考之后都会给出结论:机器无法产生自我意识。直觉上的自我意识,明显有别于物质世界。

物理学家罗杰彭罗斯给出了另一个解释,在他的《The Emperor’s new mind》那本书里做了详尽的论述,他认为大脑中的细胞神经元的一些部分足够的微小,以至于量子效应会产生出显著的影响。他没有给出答案,反而引入跟多有趣的东西,我们知道,量子效应产生的结果取决于观察者的方式,本身就需要思维意识的参与。似乎让我们看到了解决问题的一些门道。

似乎所有困扰我们的“终极问题”都汇集到了自我意识上。

先指出一点,select的设计存在很多问题和缺陷

select的几个参数都很诡异。

许多人经常遇到的问题是每次调用过后没有重新FD_SET一下文件描述符列表,我刚接触这个函数的时候就被这个问题困扰过。

今天又遇到了个问题。

下面这段代码在我上大学的时候就写下了,一直工作的很好
[code]
int status()
{
FD_SET(fd,&fset);
return ::select(1,&fset,NULL,NULL,&s_timeout);
}

bool avail(){
int x= status();
if (x==-1){
perror("select()");
}
// char buf[4];
// int err = recv(fd, buf, sizeof(buf), MSG_PEEK);
// if(err == 0 || (err < 0 && errno != EAGAIN))
// throw 1;

return x>0;
}
[/code]
直到今天我把它移植到mac系统上

程序可以正常的发数据包,但一直没有收到任何数据,花了一段时间折腾才定位到select一直返回为0

但是这段代码在windows下工作的很好,为什么到了OS X上就失败呢?

仔细的看了看文档

int
select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict errorfds, struct timeval *restrict timeout);

DESCRIPTION
     Select() examines the I/O descriptor sets whose addresses are passed in readfds, writefds, and errorfds to see if some of their descriptors are ready for reading, are ready for writing, or have an exceptional condition pending, respectively.  The first nfds descriptors are checked in each set; i.e., the descriptors from 0 through nfds-1 in the descriptor sets are examined.  (Example: If you have set two file descriptors "4" and "17", nfds should  not be "2", but rather "17 + 1" or "18".)  On return, select() replaces the given descriptor sets with subsets consist-ing consisting of those descriptors that are ready for the requested operation.
Select() returns the total number of ready descriptors in all the sets.

第一个参数nfds代表的并不是所要观察的文件描述符的个数,而是最大的文件描述符加一,上面那个函数调用应该写成
[code]::select(fd+1,&fset,NULL,NULL,&s_timeout);[/code]
才行。

那么,为什么windows下能够工作正常呢?msdn上给出的说法简单粗暴

nfds [in]
Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.

windows保留这个参数只是为了跟bsd socket兼容,直接忽略掉了。

也就是说,当初我把这个参数误认为了个数,windows也忽略了,所以一直能够正常使用。而mac系统是基于freebsd内核的,是标准的bsd实现,问题才浮出水面。

select的最后一个参数timeout是个struct,使用起来需要填充各个值,很不方便,其实直接用一个int表示毫秒数就行了。

总之,这个函数的每个参数都存在陷阱和缺陷,unix的设计哲学是简洁统一,而select是个十足的反面例子。

另一个经常被人诟病的问题是性能,在服务器端已经是很经典的问题了,由于select每次都要轮询整个列表,对于一个多人在线的服务器会造成很大的性能开销,另一个poll函数也类似,为了解决这个问题,linux在2.6版本内核引入了epoll机制,epoll_wait函数并不轮询,当数据到达的时候内核会把这些描述符放入一个完成队列,检查下它就行了。

对于客户端应用来说,select的性能问题并不存在,而且在windows下,异步socket一般需要个消息循环,所以对于一些命令行程序来讲,select就是唯一的选择了,这也是我一直在使用上面这段代码的原因。

吃饭的时候有一个问题浮现在我的大脑中,我们通过摄取食物提供生存的能量,而所有食物的根源来自于植物,以当今的科技水平,是否可以脱离植物,人工合成所需要的食物呢?

人类需要从外界获取的物质可分为几类,糖类,无机盐类,氨基酸,以及一些维生素之类的小分子。其中所需的钠钾离子之类的无机盐类是广泛存在于地球之上的,剩下的几种,糖类是提供能量的,需要仔细讨论。

普通存在于人类体内并起着重要作用的是葡萄糖,葡萄糖是一种单糖,分子式为C6H10O6,植物通过光合作用来合成,但并不是直接以葡萄糖的形式存储下来。

能量来源于何处?归根结底,一个答案,太阳。上帝把这个核反应堆放置于距离地球1.5亿公里以外的地方,通过电磁波把能量传递到自由空间,而地球所接收的极小截面提供了所有生物赖以生存的能量。

直接利用阳光的能量是不明智的,因为单位面积内的光线的能量密度很低,必须用一个特别大的接受装置才能提供发动机的动力。而且晚上没有阳光。

其实在能量利用上,最大的问题不是如何产生能量,而是如何有效的储存能量。

我们通常意义上讲的储存,一般都是通过分子间的电势能来实现的,比如,氢气燃烧释放出能量,这个过程涉及到跟氧气结合形成势能更低的水分子。相对的说,能量可以储存成氢气的形式。葡萄糖也是一样,通过跟氧气反应结合成二氧化碳和水,降低了静电势。显然,葡萄糖由于本身就是多个分子结合的状态,碳原子质量也比氢高很多,所以储存的能量密度比氢气低许多,但是氢气是气态,也容易爆炸,不易安全的储存使用。

覆盖整个地面的植物,每天都通过光合作用,把阳光中的能量固定存储下来。储存形式多种多样,比如纤维素,淀粉。

有个有趣的事,看一下羊肉串,我们为什么要把它串起来吃呢?因为一个一个的不容易烤,拿起来也不方便,串到一起就方便多了。淀粉和纤维素也是如此,都是葡萄糖这些简单的小分子成千上万的串联起来。这样能量就储存在其中,运输和使用就很方便了。

可以看一下我们人类储存能量的一种形式,存在于肝脏内部糖原的结构。

让人不得不惊叹生物是伟大的编织者,把一个个简单的分子组装成复杂的图样

现在量产葡萄糖的方法是把淀粉之类的大分子链打断,也许单分子的葡萄糖我们可以也从无机界人工合成,但那肯定要耗费大量能量。要是再把这些单糖分子组装成淀粉纤维素之类的大分子链,几乎是不肯能。其实关于开头问题的结论很简单,谁都能凭直觉给出,人类目前还是无法脱离植物产生食物,换句话说,不能直接通过阳光生产面包。

从能量密度的角度来看,目前可行的储存能量方式,氢气是最高的,每千克可以达到123百万焦耳,汽油可以达到46,而前面讨论的糖类只有17左右,这就是为什么现在汽车广泛使用石油作为燃料的原因。

我们使用的手机里的锂电池,能量密度只有0.8左右,要提升它的续航时间,也许可以考虑使用汽油或者氢气,但是这些能源利用起来需要沉重的反应装置比如内燃机,所以就限制了他们在手机这些便携设备上的使用,如果能够找到轻便的释放方式,也许我们的电池技术就会有突飞猛进的发展。

现在鼓吹的很火的新能源汽车,比如tesla,其实就是一大堆锂电池带动电动机,显然锂电池的能量密度限制了它们的最大行驶里程,不过使用油电混合动力的方式可以很大程度上弥补这一点,比如大众XL1。

从产业的角度看,能量的储存方式是改变产业结构的基本力量。人类的文明程度几乎可以用使用能源多少来衡量,在生活的每个角落,电视机,冰箱,燃气灶,汽车,手机……随处一瞥便能看到能源需求。

更高的能量密度和更好的能量释放方式,可以带动电池和发动机的变革,所有智能手机用户都对电池使用时间表示过不满,石油危机也导致汽车产业对新能源的尝试,需求不可谓不强。

单从化学能方面我们很难获得比石油更高的能量密度,除非基础物理有进展可以和平释放原子能,但是上帝把太阳放到离我们如此远的地方仅仅让世界以分子间电势能的形式运行应该有一定道理的,就像大人把刀枪放在远离小孩子的地方一样。

对于能源枯竭,最好的解决方案也许是从阳光来合成石油,比如利用基因工程的方法,改造利用某些植物,合成相应生成石油的原料,虽然我们很难获得比石油更高的储存能量方式,但可以通过寻找再生石油的方法来解决耗尽的危机。

理论上说,太阳的能源利用率很低,大部分都被反射和吸收后热辐射出去了。有句话叫开源节流,对于能源节流意味着文明倒退,开源才是注意力的重点,要尽可能的有效利用阳光。

个人认为,解决能量问题,应该把更多的精力花在生物学和基因工程上。

先罗列下我的需求,有两台机器,一台windows 7,另一台mac,现在想在这两个机器间自动同步文件。两台机器位于不同的私有子网段,也就是说,躲在两个不同的路由器后面接入公网。

因为nat的存在,使得两台机器间直接建立tcp连接成为不可能,想了几个方案:

第一,通过一台有公网ip的机器中转,两台机器同时跟这台服务器建立tcp连接,定时交换文件时间戳并相应的更新。这种方案存在巨大的弊端,我的服务器在美国,两台挨在一起的机器,传送数据居然需要绕过层层路由跨过海底光缆传送到大洋彼端然后再传回来,速度慢,占带宽,太折腾。

第二种就是udp打洞了,假设两台机器分别为A和B,中转机器为S,这样A和B都可以向S发送UDP数据包了,S可以得到NAT转换后的ip和端口号,由于UDP不是面向连接的,任何主机都可以向这个ip和端口号发送数据。理论上讲,只要S把这些信息告诉A和B,这两台机器就可以直接通信了。但是因为安全性的考虑,如果这个数据包的ip和端口号不是先前发给S的那个地址,就会被路由器丢弃。如何取得路由器的信任,是打洞最需要解决的问题。一个简单的想法是,A向B的NAT转换后的地址发送一个udp包,这样A的NAT对于B的这个地址就是敞开的了,如果B能发出具有这样地址的包,二者之间的连接就能建立起来。

今天花了一个下午编写调试相应的代码,A和B之间的数据包始终不能成功接收,后来才意识到,A向B再次发送数据包的时候,NAT路由器会重新生成不同的端口号,换了个端口向S发包测试打印地址印证了这个想法,这个端口号似乎是随机生成的。

google了下,有些路由器确实是这样实现的,这种情况下UDP打洞基本不可行。

总之,问题没那么圆满的解决,最终还是使用方案一中转,先只同步小文件吧,至少比手动拷方便些。

客观评价下NAT对互联网的影响吧,好的方面:解决了ip地址快速耗尽的问题,估计延缓了一二十年。也提高了安全性,某种程度把病毒隔离在一个个子网范围内。

另一方面,把端口号扩展为ip地址的一部分,本身就是一种很踅脚的做法,增加了软件的复杂度。一个好的设计应该简单统一,不应该让人在实现的时候感到头疼。

在已有系统上缝缝补补,用最简单的改变来适应环境,是生物的进化的基本特征。互联网在遇到问题时的解决方案似乎也在重复着大自然的脚步。

还是希望ipv6早日普及吧。

最近想买辆车,相关的东西大致都看或者了解了下,以前对机械相关的专业了解的不多,甚至有些偏见。机械是个成熟复杂的领域,积累了很多研究理论,大量的极具巧思的器件。单单是对这些相关的器件的理解,足以对大脑的思考模式产生重大影响。

举一个简单的例子,汽车在行进当中进行转弯的话,内侧和外侧的轮子的速度是不同的,这时候发动机的输出就要对不同的轮子进行适当调整,如何动态的做到?方法有很多种,最简单的方法,只用一个轮子作为驱动轮,这样其他轮子就只在地上滚动了,早期汽车用的就是这种方法,这种方法其实是在逃避问题,一个轮子驱动有很多弊端。现在的汽车都使用一种叫做差速器的简单装置,可以巧妙的处理这个问题,具体细节用文字解释起来比较麻烦,感兴趣的话可以到youtube上看相关的视频解说。

现代的发动机是个复杂的装置,通过厂商鼓吹的一些技术特点,比如涡轮增压,可变气门正时,缸内直喷等,我们就可以猜测它里面的复杂性了,要通过经年累月的技术积累,不断的调整演化,才能成为一项成熟的产品技术,这也是国产发动机跟国外有很大的技术差距的原因。

我们创造的任何事物和技术都处在不断的长期演变进化当中,其中有一些已经趋于稳定,比如剪刀,钳子,它们拥有简单的结构,材料结构的调整已基本最优,更多的变化空间已不大,但是我们仍然有各种针对特殊需求的剪刀设计出来,他们并没有停滞,只是稳定下来了而已。另一些还处于剧烈的变革当中,比如电视机,手机,一方面由于它们本身的复杂度导致更多的可能,另一方面因为它们还不是很完备,需要不断的技术改进,电视机经历了黑白,彩色,阴极射线管,液晶等一代又一代的技术演进,现在仍然不能说成熟稳定,还有很多调整空间。手机同样也经过的很多代,他们都仍处于演化当中。

汽车的发动机也是在不断的进化,一个很好的类比是人类的心脏,经过了亿万年的进化,现在的人类心脏是个复杂而且高效的器官,它在历史当中必定有过不同的形式,通过自然选择的不断调整,最终趋于稳定。作为一种用金属构造的充满各种孔洞机构的燃烧装置,发动机经历了若干代的调整变革,不断的提升燃油利用效率,提高输出功率,跟大自然的进化类似.

如果我们仔细的考察一些就会发现,生物的进化跟技术的演进是何等的相似!生物通过调整改变以适应自然环境,我们创造改进技术来迎合市场需求。抽去形式概念,二者本质没有差别。

在各项技术产品中,汽车是跟生物最为类似且我认为最有进化潜力的一项东西。因为它可以在地球表面移动,这正是动物最重要的特性。

如果远古的地表拥有我们现在道路的形式,我想会有生物进化出轮子的结构,这样的行进方式最节省能量。但是崎岖不平的地表,导致腿成为现今动物界的主导。

我们认为动物之所以为动物,最主要的特征就是动物可以自由的行走移动,避开障碍,而不是具有高级思维能力。

汽车必须靠人来驾驶,但是为了便利,我们逐渐开发除了各种技术减轻人的疲劳。手动档变成自动档,简化了操作流程,定速巡航可以把脚从油门移开,自动泊车系统可以以检测周围空间把车自动倒进狭小的空间里,自适应巡航甚至可以根据前面车的距离自动调整车速跟车。这些辅助性的装置似乎都朝着一个目标,那就是自动驾驶。

想象一下,一辆汽车可以在无人的状态下自动前进,检测避开障碍,自动去加油。我们可以通过无线网络远程把车召唤到眼前,这不是不可企及的想象,未来几年极有可能实现。比如google对自动驾驶投入了很多资金进行研发,并且它的自动驾驶汽车已经安全无事故的行驶了几十万公里。

我们尝试去构造机器人,只是作为兴趣和研究,并没有强大的市场需求。同样也不会为了百分之几的性能优势去花大量时间精力去改进它的某一个部件,但是对于成熟且庞大的汽车市场就是很不同的景象了。就像语音识别随着智能手机的兴盛突然变得炙手可热起来一样,人们愿意为此去投入大量财力精力去研发。

当汽车的自动驾驶成为可能,我们就会考虑如何添加更多的自主性进去了。模式识别(比如现在一些高档车配备的交通路牌识别技术),语音识别,更高级的智能等,都会随之而来。

我可以大胆的预测,将来机器人和人工智能等技术,一定是因为汽车而发展起来,汽车本来就是一个很好的机器人。

为什么是汽车而不是手机或者电视机呢?在我们可以预见的未来,以及事物发展的趋势,我们可以清晰的看到他们各自朝前发展的脉络,以及人们对这些事物功能的期望。电视机被赋予了更轻薄便利色彩真实的期许,手机也是操作反应的功能性需求,而汽车,人类更希望下放更多的权利和自主性过去,通过自动化为生活提供便利。可以说,汽车已经被选定了一条自动化的道路,一条导致智能化自动机器的前进途径。

动物和汽车,器官和部件,形成绝佳的对应类比:心脏和发动机,轮子和脚,关节和离合器差速器,食物和燃油……零件的不断调整改进就是进化。也许有一天,就像变形金刚里,我们会引入汽车人这个称谓。