Becomin' Charles

算法 | LNMP | Flutter | Mac

Becomin' Charles

我是一只小蜜蜂,飞到西又飞到东,嗡嗡嗡嗡嗡嗡嗡嗡,不怕雨也不怕风~~

看了了这个电影,我不由得想起来以前真的很喜欢这么一部动画片的,现在只记得主题曲的这么两句词了,嘿嘿。这部电影,真的,说什么好,真的让我对老美的想象力表示折服。蜂巢内部,纷繁复杂,却又井然有序,实在令人叹服。

感觉上,这部电影四处弥漫着老美那独特的个人主义思潮,四处都透露出一股弘扬个人主义的味道。作为一只最最普通的工蜂,原本被安排的命运就是在一个普通岗位上工作到死,但是Berry根本就对此等安排充满了怀疑。这种怀疑成为了他探索世界最强大的动力,以至于后来捅了一系列娄子,搞得世界天翻地覆。

剧情不想多讲,最后,一切终于又重归与正常,但是并非意味着集体主义,安分守己,战胜了个人主义,而是个人主义真正的胜利,世界不但重归于秩序,而且全部是按照主人公向往希望的那样去运转了。这部电影把个人主观能动对世界带来的影响夸大了极致,可以说是一部极度褒奖个人英雄主义的电影。

有的时候,真的不得不惊叹老美的单纯,如果你有一个美国同学,你一定会感叹,ta是多么地单纯可爱,至少我是这么觉得的。无论是电视剧,电影,动画片,都准确无误地给我传达了这样的思想,每个美国人都能自得其所,根本没有必要思考更多的问题,所以,经常的,你就会觉得他们真的是傻的可爱。我甚至觉得,美国人民,是世界上最容易愚弄的人民,我在这里做个大胆的假设,大部分美国人民心中攻打伊拉克的理由和bush政府是根本不一致的,明白了吧,这就是神奇之处。

扯远了,回到电影上,这部电影还是很不错的,你可以感叹一下那些惊人的想象力,可以感受一下超越了种族的烂漫情怀,你可以感受到商业大片的紧张刺激,你可以感受到完美地个人英雄主义,你当然还可以看到很多美国式的幽默,然后就是一个happy ending啦~~

阅读全文 »

已经有两类基于在覆盖图内部(intra-overlay)优化的方法被提出了,基于树状的覆盖图(tree-based overlay)和基于网状的覆盖图(mesh-based overlay)。尽管原有的组播方法得到了优化,但是仍旧困扰于较长的延迟和突然的中断,尤其是当大量的peer同时加入网络的时候(为什么这个时候会有突然的中断?)。

所以呢,基于覆盖图与覆盖图之间(inter-overlay)的优化算法被提出了。这种算法的主要思想是:不但要像早先的算法那样利用一个overlay中的网络和计算资源,但是还要利用不同的overlay中的节点的计算资源。好像记得一篇文章中提过这样的事情,就是一个正在看CNN的用户,其有宽裕的带宽资源,所以他会替一个正在收看BBC的用户转发视频流中的包。通过这样的方法可以更大限度的使用网络的带宽,均衡网络的数据流。使用户具有更好的使用体验。

接下来,我们来描述一下AnySee的工作方式,第一步,建立一个高效的,基于网状的覆盖图(使用了基于位置探测器的算法来匹配物理层的拓扑,啥意思?这里有个关键组件忘了提了,mesh-based overlay manager);第二步,单覆盖图管理器(single overlay manager关键组件之一)(利用传统的覆盖图内部的优化算法)来处理加入和离开覆盖图的节点;第三步,覆盖图间优化管理器(inter-overlay optimization manager又一个关键组件)探索合适路径,建立备份连接(backup links),裁剪QoS比较低的分支;第四步,关键节点管理器(key node manager)分配有限的资源,缓冲管理器(buffer manager)管理和调度视频数据的传输。

在AnySee中,每个节点首先要加入到基于网状的覆盖图中,每个节点都有一个标识符,该节点首先连接初始节点,然后挑选一个或者几个节点来建立逻辑连接。每个节点维护一组逻辑邻居。这个步骤的关键就是要让基于网状的覆盖图于网络节点的物理拓扑相匹配。这个mesh-based overlay manager使用一种叫做LTM(Location-aware Topoloy Matching)的技术来优化覆盖图,找到最近的邻居避免慢速的连接。主要使用两种方法flooding-based detection with limited TTL和updating logic connections。这两种算法我也没有看得太过明白,我这里就先不展开了。

接下去是Single Overlay Manager,这个组件主要是用来管理peer的加入和离开操作的。在覆盖图之间的优化开始之前,一个peer首先加入一个覆盖图,至于是接受来自于一个节点还是多个节点的数据,是取决于单覆盖图优化的结果的。在这个设计中,引入了一个新的属性,叫做LastDelay,意思就是说,从当前这个节点通过每一条去达源节点的路径中,产生的最小的那个延迟。(不过,关于这个延迟怎么计算,论文里说得很不清楚,这让我也比较疑惑)

一般来说,每个节点维护一个活跃流路径集和一个备份流路径集。最初,所有的流路径都是由Single Overlay Manager来管理的。当备份流路径小于最初的数值的时候,覆盖图间优化算法被启动了,用以在全局范围内找到一个合适的流路径。当一个活跃的流路径由于比较差的QoS或者某个节点的离开而被剪掉的时候,一个新的流路径会从备份流路径中选择出来。这也就是说,一开始,一个覆盖图还仅仅涉及到一个源,如果某条路径的断裂,或者QoS小于某个值了,将会导致发起全局范围的路径探索,最终促成了全局范围的优化。这一段后面很详细的阐述了这个算法,我现在实在是没有勇气在这里来描述,先放着。

然后我简单描述一下关键节点管理器,这个东西的作用就是帮助管理富余的资源的,还是,我掠过算法不讲,只讲思想,首先这个组件将所有的富余的资源管理起来假如有N个,然后将向本节点发起的请求也管理起来,将他们排入M个队列,然后将富余的资源逐一分配给请求队列,分配的过程遵循一些算法。

最后,缓冲区管理器用来管理收到的和发送出去的数据包,这里使用的算法和CoolStreaming里面的算法是一致的,但是由于CoolStreaming里面没有使用覆盖图之间的优化算法,为了降低延迟,其缓冲区设计得都比较大,也就意味着较高的播放延迟,而在AnySee中,这个缓冲区就可以设置得比较小,相应的在播放延迟的问题上,将要获得更好的性能。

IP层的协议是按照最小化功能的原则来设计的,只提供了最大努力(best-effort)单播(Unicast)数据报服务,而剩下的包括流控制,差错控制等一系列的功能,都扔给了终端(End System)去实现。

这种设计理念正是Internet能够长足发展的一个非常重要的技术层面的原因(到底为什么呢?)。Internet的长足发展,又刺激了大批应用的开发,而大批应用的出现,又对Internet的基础功能,有了更高的需求。

那么到底应该在IP层提供什么样的更进一步的服务呢?组播(Multicast)和QoS正是正在或者已经加入到IP层协议中的两个特性。QoS单单通过终端系统,是无法实现的,与此不同的是,组播完全可以通过终端来实现。

那么组播到底放在哪里呢?首先回顾End-to-end Arguments(这是啥玩意儿?)的两个原则:
1、功能尽可能放到上层实现
2、除非下层在复杂性上做出牺牲可以换来巨大的性能提升,否则不在下层实现功能。

Deering1989认为,他出于以上第二个准则考虑后,认为组播应该放到IP层实现,而且很多人认为这是对的。但是实际上,IP组播,有很多弊端,首先路由必须维护每个组的状态(为什么啊?),这违背了“无状态”架构设计准则,而且增加了复杂性,降低了扩展性(how?)。IP层协议原本是最大努力单播协议,在其上实现高级功能非产困难(为啥?)。基于以上原因,IP组播没有大规模发展起来。

所以呢,Yang-hua Chu等哥们儿提出了终端系统组播(End System Multicast)。简单来说,就是把组播的实现上推到了终端,在IP层仅仅依赖单播(复杂了咋说呢?)。所谓的Narada Protocol就是实现该一思想的一个协议(终于进入正题了)。

其实,在Narada协议中,还没有明确提出过P2P的概念,但是为什么称其为P2P呢,我想原因大概是这样的,P2P顾名思义,就是平等的意思,大家都是一个Peer,功能上基本相似的(其实不完全一样,对于视频流协议来说,也不可能,因为必然有一个视频源,怎么可能和别的Peer对等呢,但是除了源与众不同以外,其它的节点应该都是平等的才对),那么终端组播的思想,其实就是将高级功能分配到每个终端,以此来实现组播,这么看来,每个终端就像是一个Peer一样,由此,Narada协议是一个P2P的协议。

昨天,一直看到很晚,虽然有一肚子的问题没有搞懂,但是还是让我挡不住地认为,这个协议蛮鹾的。首先,我来回忆一下Narada的拓扑结构,说白了这个Narada也是要构建覆盖图(Overlay,真是搞不懂这个东西)的,只不过是树状的覆盖图,其构建网络的过程是,先构造一个富连接图,称之为网(mesh),当然,这个图不是胡乱构建的,要满足一些性能上的指标才行,具体的,我想是视实际应用的网络而定的,比如根据网络延迟和节点距离来决定两个节点之间是否构造一条边等,接着,在这个网上,构造生成树集合,每棵生成树都以视频源为根(注意,该协议一开始就假设有多个视频源存在,对于单一的视频源也是可以适用的,但是其可靠性,就会下降)。

在Narada协议中,突然就提出了组(group)的概念,但是没有为其下明确的定义,我想,应该可以理解成上文提到的整个网的生成树吧。为了分散由单一节点管理整个组的信息的风险,组的信息管理和维护被分散到了每一个节点(P2P的思想,但是在这个协议中,真的不是分散啊,而是每个节点维护全部的组员的信息,所以说它鹾啊)。为了获知每个节点的活跃与否,组的每个成员(Member)被要求按照一定的周期向外发送一个唯一序列号,该序列号沿着整个网络传播(高冗余)。这样,每个组员至少要维护这么几个信息,每个组员的地址,组员i上回发来的串号k,接收到串号k的时间t。可以想见,如果一个节点发现某个节点超过一定的时间(Tm)没有发来串号,那么那个节点肯定有问题了,这个时候,一般启动恢复机制(实际上,由于网络的延迟,对于每一个节点来说,传播串号的时间是不一样的,所以,一个节点,相对于每个节点的超时时间Tm是不一样的,这也是应该维护的信息啊,但是文章中没有指出这一细节,我想,我的猜测还是合理的,因为串号沿着整个网络传播,如果一个节点真的失效,那么所有节点都会发觉有节点失效,按照协议,所有节点都启动恢复机制,对于一个死掉的节点,竟然有n-1个恢复连接请求在网上传播,真的是太鹾了)。如果恢复失败,就宣告死亡,每个组成员还要保留一个成员的死亡信息足够长时间。

上面说得比较顺,就先讲了这个节点脱离的处理机制,下面来讲讲,入伙的机制,这个其实比较简单的,说白了,就是傻等,首先获取一份组员列表(论文没有详细说怎么获取,向谁获取,不过,我想这个很简单的吧,因为每个组员都有完整的一个列表的),像列表中挑选出来的几个发送入伙请求(怎么挑呢?),然后傻等,加不断重试,直到入伙成功后,开始接受所有其他组员的信息并且自己也开始发送信息。

上面一系列的机制有个说法的,叫什么被动检测,主动测量(passive monitor,active mesurement)。我好像还没有看出active在什么地方,以后还需要好好咀嚼。

然后讲讲数据流的传输,流主要是沿着生成树来传播的,有个算法叫做反向最短路径算法,复述一下那个例子,如果M通过N接受S的源的话,那么当且仅当N是从M到S的必经的最近的路径时,N才向M转发数据。(这里还有一些东西要看的。感觉自己的语言好乏力,理论基础也太过薄弱了。)

Narada协议的适用范围是非常小的。这倒是不难理解,那么冗余的结构,每个节点保存全部其他节点的信息,可以想见,规模扩大后会发生什么,对此,此协议作者倒是相当诚实,他认为这个协议适用范围在几十到数百的组规模的应用。并给出了试验数据来说明。

这些天,我经常用定时发布的功能,主要是为了好玩,发现定时发布的文章,有时候不能正确统计其数字。

今天我在Archive页面,发现3月份发表了26篇文章。而所有的分类里面的文章数量竟然只有23。那么还有3篇文章哪里去了呢?

原来是定时发布的文章,没有被分类统计进去。比如,我好几天前发了一篇文章,讲键盘的,被归到了“趣闻”一类,但是我在分类管理面看到,趣闻一类里的文章数是0,我打开那篇文章,然后直接按保存,再看,发现数字被更新了。这样我就找回了丢失的3篇文章。

顺着这个思路思考下去,我检查了tags,果然,还是同样的问题。难怪我的tag bloud看上去总是没有什么变化,原来每个tag下面统计的文章数量根本就不一样。

这个bug有一定的“随机性”(当然这是不可能的),有些文章的分类和tag更新成功了,而另一些失败了。具体原因还有待探究。

目前还没有发现有修正这个bug(30号刚刚换的WP2.5)。

今天是今年第一次去游泳,我选了早上九点的时间,水比本来估计的要热一些,很舒服。

不过遗憾的是,基本上没有同龄人,大都是些老头老太太,来锻炼身体的。

我今天游得很认真,基本游足了四十分钟。刚开始,我还比较累,游一个来回要休息一下喘口气,后来很快就适应了,就连续地游。距离上次游泳少说也有半年了,这次连续的游让我又了新的体会。我在连续游一段时间以后,会感到自己的意识从身体里出来了,在水面上漂浮着,注视着自己,想着很多奇妙的事情。比如我昨天一天干了什么,我今天打算干什么,早上背的单词还记得几个,等等等等。

不过最让我惊讶的还是我发觉自己呼吸得很认真,我就想,如果不是在水里,一定觉得空气是那么自然而然的东西,根本不会像现在这样,我盘算着还有大概5秒钟,我就可以把头伸出水面了,在此之前,一定要把现在肺里的气吐空,蹬腿完毕了,要保持住平衡飘一会儿,然后手夹水的动作要领到底是怎样的,因为一定要确保自己的头能举到水面上面,而且还要有足够的时间。每一次呼吸,我都要完成一系列的思考,当然不占用什么CPU的,但是还是有意识的,我想,我是呼吸得如此认真。那种感觉真的挺奇怪的。

然后,我又联想到了处在一段恋爱关系中,是不是也有的时候把对方当成了空气一般对待,好像觉得空气总是在身边,随时呼吸一口,深一点,浅一点无所谓,多一口少一口,无所谓。其实恋爱中的双方如果把对方当成是游泳时候呼吸的空气,每吸一口气,都那么努力认真,都那么踏踏实实,绝不会有一次偷懒,那么两个人应该都可以很享受这段关系,就好像在游泳的时候,你可以享受畅游的乐趣一样。

哈哈,扯远了呢~~还是太理想主义了呢~

周末在家,看到了关于“小神鹿”的报道,没有去记她的名字,也没有去记那个教练的名字。因为我觉得,他们终将会被人们所淡忘。

8岁,一个骨骼还没有发育健全的女孩子,被教练带着练习马拉松,又一个想要创造神话的人。

07年,中国红了两个典型,一个是刘翔,一个是丁俊辉。刘翔是科学训练的象征,他的成功使得孙海英进入了中国田径队,开创了科学训练的时代,马俊仁那套往死里练的法子终于退出了历史的舞台。

而丁俊辉,开创私人体育训练的时代。在国外,很多运动员从事体育运动都是自发性的行为,只有获得了相当的成绩,国家才开始资助参加大赛。而中国的运动员从一开始就是国家培养的,他们就像国家在外树立形象和争取荣誉的工具一样。从丁俊辉开始,标志着我国在经济进一步发展后,私人从事体育运动成为了可能。

但是丁俊辉只是一个特例,这种模式还没有形成一种可以效仿和可以再现的方式。8岁的这个孩子,玩命练习马拉松,我想只是一种对成功的痴迷的追求,甚至无视科学的规律,是非常不可取的。

使用WordPress快一年了,还有很多功能我一直一知半解。今天刚刚弄明白了后台编辑器中的“可选摘要”的作用。

接下来,就来谈谈我的体会。

可选摘要这一栏,是搭配着“设置–>输出–>Feed(联合供稿)–>日志内容显示”这个选项来设置的。如果你设置了“摘要”,那么在你博客的Feed中,将会显示摘要。设置了“全文”,那么Feed中就输出全文(并非绝对如此,有一个前提的,后面会说)。

对于Feed来说,我个人觉得是给别人提供方便的,读者订阅你的Feed,就是表示对你的博客内容比较关心,而对别的并不是那么关心,对于一个个人博客,一般来说,不会产生海量的文章,更加不会产生门类繁杂的文章,所以,如果个人博客,只输出摘要的话,那么你的Feed就会变成完全没有价值的Feed,因为到时候,读者还是需要点击一下超链接,才能到你的页面上看文章,那完全没有必要订阅的。所以,一般来说,建议能在Feed中输出全文。

那么这么一来,“可选摘要”是不是就没有用了?并非如此。

在WordPress博客中,按照给类方法的存档页面中,会以摘要的形式给出。比如月存档页面,分类文章页面,tag页面等等。这个时候,如果你的文章在写作的时候填写了“可选摘要”,那么就会使用你写的可选摘要。否则,就会自动截取你文章的前面一段,作为摘要。

但是,大家都知道,WordPress不是中国人写的,所以其内部的摘要函数,在设计的时候,没有考虑到汉语言的特点,有位前辈,曾经研究过WordPress的摘要算法,节选一篇文章中前55个字作为摘要,拉丁语系的单词之间以空格分隔,所以55个字,就是55个空格,那么对于汉语来说,可想而知了吧,我们几乎不会在文章中使用空格。解决这种问题,当然是有办法的,大名鼎鼎的“WordPress中文工具箱”,就提供了这种针对汉语的真正截断的算法,截取的是前面255个字节,然后去掉半个字产生的乱码。

或许,有些人觉得用中文工具箱就万事大吉了,但是对于写作习惯一般的XDJM们来说,前255个字节,可能就是前126个汉字,真的能摘要你的整篇文章吗?有些时候还是认真填写一下“可选摘要”吧。

然后我再来谈谈上文中括号里面的问题。在使用WordPress写文章的时候,如果文章太长,我们需要对文章提供分页,使用

阅读全文 »

白天的西湖,又是另一番风味了。

是的,第二天,我们还是选择逛西湖,因为“杭州有两张金名片,西湖——美,浙大——大!”,段治文老师如是说,哈哈。所以,西湖是怎么也逛不厌的。

这一天的起始点是苏小小墓。那是孤山路尽头,西泠桥畔的一个孤零零的小亭,曰“慕才亭”,上题“湖山此地曾埋玉,花月其人可铸金”。苏小小其人,早已不得见,但是我却又联想起杭州的女孩子,肤色白皙,面容姣好,身材丰满,从容大方, 这么想着,苏小小其人是怎样一位美人,也就可想而知了,然而这位美人后面,有个更动人的故事,听了不禁让人肃然起敬,潸然泪下。我事后查了一些,找了一个最最简陋的版本贴在这里……

阅读全文 »

上周六爸妈来杭州旅游了,带他们去看了西湖。

晚上漫步苏堤,当真是一种享受,尤其是在这春意盎然的日子里面。正所谓暖风熏得游人醉,微风将空气中春的味道直接带到你的鼻子里,带到你的肺里,带入你整个身心。

苏堤之上,人不是很多,尤其是在这夜晚十分。沿岸的建筑物,都用彩灯勾勒了自己的轮廓,传统的中国式建筑,那种翘起的弧线的屋檐,然后和湖面的倒影,组成一幅高度对称的美景。苏堤之上,很多地方会打出射灯,突然照亮一颗树,一枝玉兰,一座桥,总能给人眼前一亮的感觉。

然后我就想到了好像一位风姿卓越的美人,白天浓妆淡抹,固然风采照人,夜晚褪去衣衫,优美曲线,诱人胴体,又怎能不让人迷醉。没有色彩,视野很小,你就会注意到那些细微的地方,风,是有气味的,有温度,初绿的杨柳的影,是婀娜的,是柔美的。外围城市的霓虹让天际发红,而这中间一湖的水,幽静,深邃,神秘。

今天,下课回来路上,张利军又跟我说起了对中国研究生的一些感想,我听了,感触不多,为什么,我也说不上,说不定,这就叫做麻木。

一个学期过去了,现在是第二个传统意义的学期了,在浙大,这是第三个学期了。仔细想想前两个学期我在干什么?上课,实验室混混。上的课,本科基本上都上过,只不过要求稍微高了一点,但是这种要求是没有强制力的,如果自我放纵一下,像我这样,给自己找很多借口,没有好好的按照老师的要求做,其结果,就是学无所获。上课经常逃,要么开小差,要么听不懂就睡觉,从没有强迫自己跟上老师的脚步。并且总是给自己各种各样的借口,其中最主要的一条就是跟我未来的研究方向不统一,对实验室的工作没有帮助。

然后再来说说实验室的工作,总体上给我的感觉就是毫无成就感。科研不是科研,工程不是工程。项目无常,手头任务走马灯一样的换。到头来一事无成的感觉。手上的开发板一块接着一块地换,但是哪一个也不精通,到头来还是一个也不会。然后就陷入了一种恶性循环,没有激情,做不好事情,然后没有事情可作。

社会有责任,学校有责任,老师有责任,导师有责任,实验室负责人有责任。每个人,都有责任。但是,最该负责的那个人,就是我自己。而最最不负责任的那个人,恰恰又是我。我在这半年,没有肩负起这唯一的责任就是对自己负责。把一切的一切推给这个人,推给那个人,却很少静下心来检讨自己的过失。

晚上,上厕所(往往这个时候,我的思维很活跃,是不是很变态啊~~),我就想起了一个人,许三多。别笑我俗,是这么回事。他永远是最傻的那个,但是我们可以好好回忆一下,他傻不傻。一开始,就是农村里一个傻孩子,但是他读书不差。进了部队就一个傻兵,所以去了红三连,而且去了最鹾的五班。在五班,还是最傻的一个,但是等他适应了,他就出来了,去了钢七连,又是最傻的一个,等他又适应了,去了老A,又是最傻的一个,等他适应了……是啊,给人一种错觉,就是三多永远是最傻的一个,其实每次把他比下去的人都在不断地变化,而且一次比一次强,所以三多永远最傻。我想他的傻是值得尊敬的。因为不是真傻,他的傻只是相对不变而已,而他处的环境在进步。

然后我想到了,其实是我态度有问题的。三多走过了那么多路,他的态度一直都很端正,总是知道自己最傻,自己后进,总是很努力地赶上。不像我,不像更多更一般的人,不是对自己没有定位,就是对自己的后进很麻木。领先别人,就有优越感,没有领先,就觉得自己本就不擅长那一块,总是能很好的安慰自己。

越想,越觉得自己是个烂人,怎么就这样,这样下去就是注定的平庸,难怪会被人抛弃呢~~

唉,天知道我今天把自己骂了,是不是能清醒得久一点。