如何创造出来新的生命?有人会说,一点都不难,找个女人就可以很愉悦的完成这件事情。

那么,如果不是利用我们自身的生殖系统,而是从无到有,凭空创造出来一种新的生命形式呢?这看起来就不是一般的困难了。这意味着,我们在尝试做一件上帝的工作,哈,逼格爆表了。

实际上,这也没有想象中那么困难。

先看一下我们是如何对生命进行定义的。想要找出十分具体的定义是困难的,我们可以从所有人都公认的事物入手,看一下,生命需要拥有的几个关键特征。

人是生命,一条狗,一棵树,是生命,一只蚂蚁,一株小草,也是生命。

生命并不意味着像人类一样的高级智慧,也不用像狗一样能跑会叫。最本质的性质在于,他们都能尽可能延续自身存在,能复制产生出新的个体。

下面是搜罗到的几个正式点的定义:

Life is a characteristic distinguishing physical entities having biological processes (such as signaling and self-sustaining processes) from those that do not, either because such functions have ceased (death), or because they lack such functions and are classified as inanimate.

生命,泛指一切具有稳定的物质和能量代谢现象,能回应刺激能进行繁殖的半开放物质系统

先不管怎么去深究讨论定义概念性的东西了,只要具备下面两个特点,基本就可以称为生命了:

1 利用可以获得的物质和能量维持自身的存在(self-sustaining processes)
2 自我复制,产生新的个体

下面我们就围绕着这两点下手,看看如何实现

我们可以制造一个机器人小车,上面拥有一个机械手臂,可以抓取物品,机器人靠可充电的锂电池维持动力。

当然,我们可以更进一步,直接让机器人小车背负一个太阳能光伏面板,利用阳光产生的能量运动。机器人小车同样可以换成具有类似人类运动机构的四足机器人,或者是四轴飞行器,只要能够利用能量在空间移动就可以了。

这样我们就完成了条件一,这看起来一点都不麻烦。不过第二个条件自我复制就比较棘手了,我们无法指望一个载着机械手臂的小车能够自动制造出来它自己。

看一下生物界,我们或许可以得到些启发,比如蜜蜂,它们并不是单独个体就能直接繁殖的。而是形成了复杂的分工机构,以蜂群的形式进行复制。每个蜂群只有一个蜂后,类似制造工厂,复制出新的蜜蜂,而工蜂负责采集食物,雄蜂只进行交配。

我们的机器人小车也同样可以组成类似蜂群的结构。

许多辆小车朝着太阳跑,通过光伏获得的能量,存储到锂电池内,并四处寻找采集各种物质材料,就像工蜂一样。

在这些小车的中心,有一个制造工厂,这个工厂可以加工原料,生成新的机器人小车,我们可以直接把小车的生产线放到这里,比如,加工轮子的机床,生产锂电池的车间,我们现在有技术足够的工业机器人,机械手臂等,完全离开人类自动化起来应该是可行的。

在技术细节上可以先不考虑的太细致,我们先讨论下理论上的可行性。

既然加工车间足够复杂,那么,加工车间完全可以加工出来加工本身所需要的工业机器人,机械手臂,如果找到另外足够的空间,把零部件逐个加工出来,然后由机器人小车一件一件运输过去,并把他们组装起来,那么一个新的加工车间就建立了,这一切所需要的仅仅是精妙的程序编码控制。

新的加工厂可以加工更多的小车,这些小车又获得更多的能量,足够的能量又可以创建出来新的加工厂,这样往复循环,生命的繁殖过程就建立了。

显然,这样构造出来的这个工厂和小车群体,完全满足上面我们列举的生命的两个条件。

我们无法像上帝那样在分子层级构造生命,但在我们的制造业水平上,这样的生命是完全可行的,至少理论上如此。

如果有人真的要尝试做这件事,那么就会遇到很多实际性问题,比如,技术上实现是否真的可行?构造这样的生命体有什么意义?哪里有地方有资源让我们进行这种实验?

如果没有利益驱动,甚至影响人类的利益,那么任何类似事物都无法得到发展。

我们可以换个角度来考虑,我们的地球,已经足够的美好,已经被上帝的造物所填满,而且我们对此也没有太大的不满。所以在地球上创建这样的东西是没有任何意义,也无法推行的。

可是在月球或者火星上就不一样了,这里没有人管,可以爱怎么样怎么样,甚至可以得到大多数人的支持。机器人小车不用呼吸,也不用吃饭喝水,人类在外星球上面临的生存问题对它们来讲完全不存在。只要有足够的能量,比如阳光或者其他形式,就足够了。

我们可以把一些初始需要的机器人小车,和加工厂的零部件,通过火箭,发射到月球火星,降落后,这些小车就开始采集获得能量,组装加工厂,然后繁殖过程就开始了。

我们可能下意识的,认为需要成千上万年这些机器小车才会遍布月球。事实上,只要有足够的能量,生命的力量比我们想象中要强大的多。因为复制是按阶增长的,一个复制成两个,两个复制成四个,四个到八个,八个到十六个,十六到三十二。。。。。。。

假如有足够能量,复制产生一个加工厂群体的时间是一个月,那么,一年以后,我们可以得到的是二的十二次方,也就是4096个加工厂,两年则是二的二十四次方,也就是16777216个加工厂,三年2^36等于68719476736,已经远超出地球上人类的数目了。

甚至,我们可以让他们的存在变得更有意义一些,而不是单纯的复制,假如这些机器小车采集的能量可以储存,甚至可以通过某种方式带回地球,我们就能得到无数免费的劳工了。

再者,比如火星可能含有某些地球稀缺的元素,这些机器小车可以开采这些矿物,提炼并送回地球。

再进一步,这些免费的劳工既然能够复制加工厂,那么它们为什么不能加工更加复杂的装置呢?比如,建造一个巨大的密闭玻璃半球,里面充入地球上同等成分的大气,屏蔽掉外面有害的射线,维持内部温度,完全模拟地球上的生态环境,土壤,动植物。这一切都通过特殊种类的机器劳工来维持,这些机器人不断的建造维护这些空间站,改造荒芜的星球,等条件适宜,我们就可以移民火星了。

看起来一切都很美妙,但实现起来,困难重重。首先,能量如何存储下来?锂电池会老化,且不高效,况且,火星上是否有足够的锂元素?太阳能光伏设备加工生产极其复杂精密,如何在遥远的行星上把他自动生产出来?行星上的矿物是否足够生产出来我们需要的部件?机器小车需要的芯片需要极其复杂的加工程序和苛刻的生产环境,这又怎么在火星上实现?任何一个小小的问题看起来都是巨大的技术难题。

只能说,它具有一定的理论可行性,还需等待我们的技术水平完善到足够程度。

如果我们发现这些小车不按我们的意图行事,出现了bug,又该怎么办呢?整个星球已经遍布这些生命体,我们该如何灭绝它们?这个残忍的行为也不是那么容易实施,一个核弹并不能毁灭殆尽,只要有侥幸存活下来的个体,它们很快又会布满星球。

也许我们可以留一个后门,一个终止指令序列,通过无线电波某个固定频率发射,只要机器小车接收到就会无条件停摆。或者,我们制造另一种更新的生命体,它们按照我们的意图行事,并且会自动捕杀这些初级生命体,这样我们的生态系统就越来越像地球了。

也许我们是被某种更高级的存在形式,比如上帝创造出来的。可能造物主跟我们的心态一样,是利用这些生命体达成某些他们所谓的利益诉求。谁又知道呢,也许我们就是从那些虚空无尽中冒出来的某种利用能量维持形式的一个代谢过程罢了

改变世界,是我们谈到理想时经常讲的一句话,没有人去深究它的意义,只是觉得听起来好像很厉害的样子

那具体又是怎么改变呢?

仅从字面上看,也没有什么门道,这个词只能算是中性,把这个世界变的不一样就行了,砍一棵树,种一朵花,都算对这个世界的改变,但我们不会因为路边有人把石头搬开就说他改变了世界。

除了这个字面本身,我们语言的潜意识还对它赋予了一些其他意义,就是这个改变,一定要大一些,大到一定程度才称得上改变世界。

那炸平一座山算不算改变世界?一场大地震过去,我们会说地震改变了世界吗?

显然,不会。

在字面意义的表象之下,我们赋予这个词的概念中,自然景观占少数,更多的是人类的生产生活方式。

比如,我们可以说,互联网改变了我们的世界,集成电路芯片改变了我们的世界,汽车改变了世界,飞机改变了世界。

最重要的还是人,人的生产生活方式。

这个动词的主语,也就是动作的施加主体,是人还是事物?

上面列举的更多的是事物,比如飞机汽车计算机,因为只有事物才能渗透到世界的每一个角落,形成重大影响。

但有一点,事物总是人创造出来的,归根到底,真正做出改变的还是人,人通过创造出某种事物,通过这个事物形成对世界的改变。

所以,要改变世界,必须要创造出来具有革新性的事物,这种事物可以渗透到每一个角落,影响人们的生活方式。

但这不是唯一的途径,思想理念同样可以改变我们的世界

耶稣创立了基督教,从此影响欧洲后续一两千年直到今天,可以说,宗教改变了这个世界

儒家学说影响禁锢中国文化几千年,作为中国文化的主要部分,也可以说,学说改变了这个世界

把这里东西更大的概括性词语找出来,就可以罗列出另一些更基本的概念:科学,宗教,文化

顺着这些词就可以找出另一些类似的东西了:战争,瘟疫,政体,国家

可以翻看历史书中提及的那些影响重大的人和事,这些被写进历史,一般被认为值得记录,他们对我们的社会形成了巨大影响。

马其顿的亚历山大几乎征服了除中国以外的整个欧亚大陆,建立帝国,他的这些壮举,算不算改变了世界?

希特勒发动了第二次世界大战,席卷欧洲,造成整个世界的战争混乱,死亡近亿,算不算改变了世界?

某些领袖错误决策,几千万人饿死,颠倒黑白,造成动乱,算不算改变了世界?

从近处看,这些战争,政治,国家等事物造成的影响,远远大于其他的一切,至少整整一代人的生产生活被彻底的改变。

但从远处来看,这些就像伤疤,慢慢会被时间抚平,机体照样如往常运转;风雨之后,天气放晴,万物依旧。短期内造成的剧烈影响,从时间尺度来看是不可以持续的,世界运行的方式依旧

这些在人类历史上,就像一些坑坑洼洼和上坡下坡,虽然造成短暂剧烈的颠簸流离,但却改变不了前进的大方向

虽然他们强加的意愿,造成的混乱,不能持续,但是,因为战争或者征服带来的其他事物,却在悄悄的改变着世界。

亚历山大大帝向征服地带去了希腊的文明,或多或少的影响了后续的历史进程。二战促进了飞机,导弹,原子核等相关领域和事物的研究,甚至延伸到后续的冷战阶段,计算机,互联网,GPS这些事物背后,都少不了军事国防的影子。

也可以说,战争,政治,军事,间接的改变了世界。不过,即使没有军事目的,计算机互联网GPS也会被发明或发现,只是时间的问题。

从遥远的将来回望过去,就能清晰看出来孰轻孰重,一万年以后的人类,没有人会对遥远的古代某几个国家进行的战争感兴趣,因为历史上的战争太多了,政权太多了。但他们会清晰的在历史书中标注出,“xxxx年,电磁理论被提出,接下的若干年,收音机,手机,GPS等利用电磁波的事物和技术相继出现,对后续生活造成如何如何的影响……”

引用某些理论,政体和社会组织,这些叫做生产关系,而科学技术等叫做生产力,生产力决定生产关系。

某总设计师说话用语虽然土,见解却很深刻,比如他说,“科学技术是第一生产力”,我深感苟同。

所以事情就很清晰了,想改变世界,就要从科学技术下手,其他一切不过浮云,飘过之后,啥也不剩下。

不过换个角度看,事情也没有这么简单。

人类文明一旦被引导到某个路径,就有一个不可阻挡的趋势,即使没有麦克斯韦,电磁理论同样会被其他人发现,爱因斯坦也说,即使没有他,狭义相对论也会被别人发现。

那我们所谓改变世界,是否是真的改变了世界?还是为了在世界前进趋势的重大节点上,标上自己的名字?

就像智能手机,即使当初苹果不做,其他公司一样会推出,因为各个技术已经都发展到了一个节点,把各项功能集成到手机上,只是一个水到渠成的趋势,苹果仅仅加速了它的进程。

所以仔细看下,我们所谓改变世界,就像赛跑,看谁先抢到某种能造成改变的事物的荣誉。我们能做的,只是自己定义下方程使用的符号,理论一些概念的抽象名称,事物的体验和操作方式而已。

文明进展的趋势,就像河流从中国西部山脉流向东部大海一样,地势早已把流向决定了,无论这条河流在地面上如何崎岖环绕,最终都是向东流入海中,我们做出的改变,不过是在地面上寻找到一些可以流经的途径,使得河流往前推进若干距离。

那决定文明前进的原始动力是什么呢?也许是人类的基本价值观念,谋生,繁衍,更容易的获得事物,更方便的从事活动,最终,还是如何让大脑获得快乐和正向刺激

做出改变世界尝试的人,也许就是想借此获得更多的大脑层面的快乐和刺激吧,某个阶段,都争抢着,看谁先找到或者抢到某项荣誉,看清趋势,找准动向,把能产生决定性改变的事物拿出来。

这些看起来很大很空的东西,前行河流泛起的一朵朵浪花,其实也没有多深刻多值得向往,可惜我们身在其中,不得不尽力往上冒泡,作为人,就需要按照人类的标准和价值观念来行事

导航软件作为我们技术进步可夸耀的成果,似乎给我们的生活提供了巨大的便利。我并没有怎么用过,在仅有的几次使用感受来看,目前还有很多问题。

走高速导航并不算方便,因为高速是主干道,可以在地图上清楚的看到遍布全国的高速网络,平时走也就简单的几条,一般走的比较远,先看地图规划下,在路上的路牌标志也很明显,很远之前就提示前面哪里转可以到哪里,有足够的反映思考时间。

但是在各种大路小道密集的城市中,去一个自己不太知道的地方,就很麻烦了,看地图要半天,而且因为距离短,路边标志等看清楚的时候,就已经错过了,所以可以看到分叉路口的白线上经常会有车停下来在那里看路标。这种情况下,用一下导航也是很方便的。

依赖导航有一个很不好的后果,就是自己很少主动思考,就像被人牵着鼻子走的,必须严格按照描述的方法前进,这种感觉让人很不喜欢。

地图数据不及时更新的话,很多道路信息就是错误的,把人引导到错误的道路上,浪费很多时间。特别是中国现在城市更新速度很快,地图数据,一定要跟得上才行。我就遇到过一次这种情况,当时急着赶路,就开了下导航试试,结果绕了一大圈,后来在路边买的纸质地图上,发现跟导航软件上的路是不一样的。

道路计算的方法上,也有很多问题,很多时候找到的路径并不是最优的,这个不太好解决。不过可以人为的给出一些提示信息,比如只走高速,或者避开小路,或者最近距离。最重要的还是道路信息的完善,每条路是否经常堵车,或者某个地方到某个地方,走哪条路会近一些,这些本地人比较清楚,要是通过某种方式,能够让司机集体参与更新地图,就会好很多。

我以前喜欢骑自行车,也呆了好几年,对深圳的大小道路基本了如指掌,所以平时根本没怎么借助过导航软件,出去玩的时候,基本都是看地图,到城市以后,也是随意的开,到处走走,毕竟是玩,没有急着去特定地点的需求。在仅有的几次需要使用场景中,印象一点都不好,除了添麻烦,没有带来什么便利。有一次在防城港快没有油了,着急加油,就打开找一个加油站,绕过各种小路土路,来到一个小加油站边,却发现没人营业。最后还是顺着大路一直往前走,看到了个加油站。

我有段时间曾经仔细的思考过地图导航软件如何的实现,感觉虽然不算复杂,但也不算简单。

首先是地图数据的表示,如何表示一条道路?现实世界的道路弯弯曲曲,需要把这些细节都记录下来,这意味着需要每隔一小段距离就记录一下,可以每隔五米十米,记录下这条道路的中心位置的经度纬度,以及道路的宽度,或者直接记录道路两边的经纬度,这样宽度就可以计算出来。这样每一条道路都是一个位置点的数组,然后再有一个结构描述道路的各种信息,名字,长度,限速,摄像头,等等。

另外需要单独记录道路结构的拓扑信息,交叉路口,某条道路跟另一条道路在那里相连,距离多少,这些拓扑信息,构成了一个有向图,这个图上进行广度优先搜索,或者使用dijkstra最短路径算法,就能计算出来某个位置到某个位置的最短路径了。这跟游戏里的自动寻路算法基本没多大出入。

地图上的位置景点这些可以单独出来,建一个位置列表,某某小区,某某学校,某某酒店等,这些位置点记录下坐标位置,在道路拓扑信息中也要加入他们的连接结构。

查询的时候,首先输入终点,从位置列表中查询出来这个点的坐标,然后从道路拓扑图中找到相应的节点,通过GPS得到当前的位置坐标,查询到相应的道路位置节点,然后运行寻路算法计算出来最短路径。

对于巨大的地图信息,一定要分层优化才行,可以按找地理区域划分为不同层次,或者把地图切割成若干级别的小块,每个小块下面又有更加细分的深层次小块列表。

在mmog游戏中寻路,一般是一个个小的场景地图为级别的,如果跨地图,或者跨主城,另外有单独的这些大区域连接信息,寻路的时候就是二层,先看下是否是跨主城,如果是的话,先寻找主城间的道路,然后在每个小的场景地图上单独寻路。

导航软件也是一样,比如国家的道路信息网单独列出来构成一个拓扑信息,,如果目的地跨度比较大的话,比如深圳某某地方到上海某某地方的道路,可以先在一个大的层次上,找到连接这两个城市的高速公路信息,各自的入口点,然后在城市级别,寻找当前位置到高速入口的道路。

另外的提示信息,像当前道路限速多少,前方多少米有摄像头,则是在道路描述信息的结构列表中读出来根据当前位置相应提示。这些信息也可以单独记录,记录下属于那个道路,执行的时候查询加载出来就行。

语音识别和语音合成播报,则是另外专门的技术了,有很多现成的库和模块可以使用。

如果实现一个导航软件,并不只是我们看到的这一部分,另外还要实现一套道路信息的采集和编辑系统,这个就先不讨论了吧。

其实真的实现这样一个软件,很多细节都是要考虑的,需要花很多时间精力才行,国内的这些做导航软件的团队,都是至少几十人上百人,不光技术,产品,UI,运营销售,数据采集等都需要一些人。

导航软件的未来究竟走向何方,似乎很难说,大致看来,可能跟生活结合的更紧密一些,包括周边各种吃喝玩乐景点,以及提供生活服务的设施场所结合起来,总的来说应该是个地图综合类应用,导航只是其中的一个小部分。

车载导航,长远看来淘汰的命运比较大一些,不同汽车厂商提供不同的服务,但是用户体验做的都很一般,毕竟汽车行业不是专注做IT的,而且各自为政,竞争压力以及更新速度上都比较慢。手机上的应用反而更好一些,最起码更新速度很快。不管是地图数据,还是应用体验,都在不停的发新版本。

如果在汽车上加一个中控台,类似于iphone的那种可以放到的外置音响上的底座,汽车中间的显示屏通过某个协议和接口跟手机通信,可以在上面显示信息,这样就可以直接用智能手机进行导航听音乐之类的了,没有必要单独实现一套,这个系统就是提供显示屏和音响,软件方面交给手机,手机放上去也可以充电,再制定一套基本的通信协议,比如方向盘上的按钮输入,显示屏亮度和声音大小的调节等,也没有必要像现在单独使用蓝牙接口来接听电话,手机放上去之后,车载的这些系统就是输入输出,而手机则统一控制,通过底座连接通信,某些应用甚至可以通过获取汽车的运行状态信息,生成报表统计。

这样汽车厂商就解放出来,只用专心做汽车机械部分就行了,这些上层的部分,还是交给IT公司来做好一些,IT公司对于新想法新事物接受和实现速度都快很多,而且独立出来以后,可以随时更新升级,产品体验也会好很多,不同的软件产品可以根据喜好换着使用。某些用户可能觉得林志玲语音版的导航软件听起来不错,另一些用户希望通过语音识别发送指令,还有的用户想要有旅程的各种距离,油耗,时间和和路径记录等数据统计,那直接装上相应app就可以了,app要是不好用,还有其他厂商的可以替代,这是一个完全开放竞争化的环境。

因为运动过多,左腿膝关节有了点小问题,几次来回往医院跑,最后确定,是半月板轻度损伤

第一次去,医生听我描述过轻微疼痛的情况后,用手摁了几下膝盖,说是关节软骨磨损,开了点药。回来仔细看了看关节的结构以及各种易发的疾病,后来有段时间不怎么痛了,就没太注意了

后来又去了一个专门的骨科医院,医生让验了下血,说尿酸偏高又可能是痛风,开了一堆药,其实我感觉他很不靠谱,也没吃药。

前几天仔细观察,左腿膝关节似乎有点积液,腿伸直的时候比右边大了一些。又去了趟南山医院,医生了解了以往的各种情况和症状以及就诊记录之后,说做个MRI检查下吧。于是就做了下磁共振检查,这次检测出来的结果,比较可靠一些,报告上说,“左侧膝关节外侧半月板前角内可见小片状稍高信号影”,医生说先好好休息休息,尽量避免爬山,上楼之类的运动,开了一二十盒硫酸氨基葡萄糖。

关节软骨由于没有血管,只通过关节液来输送营养物质,所以很难再生。不过好像说纯天然锯峰齿鲛软骨粉可以促进关节软骨再生,希望如此吧,如果后面的医学发展可以搞清楚具体的机制并合成相应的药物,很多疾病都能解决。

通过观察了解,我感觉门诊医生这个角色职位,完全可以用机器自动化起来,我们看病,无非是听病人描述一些那里疼痛,什么症状之类的,然后把问题范围缩小,最后使用一些检测仪器和手段,比如验血,X光,CT之类的,检测各种参数结构,最后得出来结论。

如果编写一个程序,通过问答式的交互输入,比如,问病人那里不舒服,病人输入头疼咳嗽之类的症状描述,这个程序就通过内部建好的数据来查询相应符合症状的各种问题,然后继续提示问其他症状,一一排除不必要的问题,直到最后剩下一两个,就可以给出结果,是感冒发烧之类的。如果有歧义,有好几个选择,则提示各种可能,并给出相应的检查选项,比如建议去做一下CT,然后提交报告,程序根据检测报告再进行相应的判断

这个系统可以通过全世界各地的医学专家不断的完善,不停的在数据库里加入新的描述,并修改完善已有的描述,这样专业度就越来越高,即使不能完全取代门诊医生,也可以作为医生诊断的重要辅助。

其实门诊医生是个很尴尬的职位,如果一个医生经验丰富,那么他就会处于很重要的位置,很难去坐诊挨个处理挂号病人,当然我们现在有挂专家号,就是为他们准备的,但这种资源毕竟比较少,大部分门诊医生良莠不齐,技术水平也参差有别,加上病人很多,各种问题就容易滋生,现在的医患关系紧张,也是多方面因素都有的。

人体也只是一个构造十分微妙的机器,如果能够精确检测这个机器的每一个状态,那么就能给出各种疾病和问题的可能。其实人体内部有各种各样的感应传感器的,这就是我们的疼痛系统,某个位置疼痛,就说明功能出现了异常,具体的情况,就要通过其他方式检测了,现在我们医学常规的手段,检查下外观,验血,然后就是各种成像技术,内窥镜,超声波,X光,磁共振等,这些手段检测出具体部位的内部构造结构发生的改变,确定问题所在。

现在可穿戴医疗设备炒的很热,通过传感器实时检测血压,心率等身体运行参数,统计报表分析,得出各种参考结果。

毕竟我们能够检测的参数有限,所以这些设备的功能也受到限制,但大体思路是可以看清楚的,如果能够出现更多的便携传感器,那么这些设备的功能也会变得更强大。

如果有一天我们的科技得到突破,可以用一个很小的便携设备检测身体的任意断面结构,那基本上医院就可以不用去了,简单疾病只需要通过程序测试,复杂一点的可以上传各种检测图片到某些网络医疗结构,这些机构的医生坐在电脑前跟程序员一样上班,检查那些电脑无法处理的结果,得出结论后直接通过医疗机构的网站系统,生成诊断报告,邮件通知,这样医院就成为一个做手术的地方了,只有对人体进行操作才会过去。

现实一点说,前面提到那个医疗程序,是完全可以用现在的技术实现的,在服务器端存贮各种数据信息,用web页面进行简单诊断,或者做成一个手机应用,病人只用简单的交互选择回答一些问题,甚至就是在给出的可能选项中进行选择,就像现在的某些性格测试的小游戏一样,这样就不用到医院人山人海的挂号排队了,甚至还可以保证诊断的可靠性。

早期的人工智能研究者实现过一些类似的专家系统,比如MYCIN,现在也有一些类似的诊断辅助系统,可惜都没有做大,一方面是技术原因吧,我觉得更多的是社会和经济方面的限制。如果在这个领域投入大量的金钱和人力,大量医生思想转变并进行尝试,这个领域应该大有可为。

先指出一点,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。

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

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

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

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

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

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