1905年5月14日

有个地方时间凝然不动。雨滴定在空中,钟摆停在半途。狗扬脖却听不见它叫。尘土的街道上行人伸腿定住,仿佛有根线吊着。枣、芒果、香菜、茴香的气味都悬在那里。

无论从哪儿来的人,都是越走越慢。心久久一跳,气缓缓一喘,体温下降,思想衰微,直至到达死的中心。这里是时间的中心。时间从这里同心圆似地一层层向四下走开——在圆点为静止,半径加长,速度加快。

谁会到时间的中心去朝圣呢?爹娘带着孩子,恋人倚着恋人。

在时间静止的这个地方,爹娘搂定了孩子,再不松开。那美丽的金发碧眼小女儿,她微笑的此刻将成为灿烂的时时刻刻,颊上的桃红永远不会褪色,她不会起皱不会疲惫不会受伤害,不会忘父母所教,明父母所昧,她不会懂得邪恶,不会向父母说不爱,不会想着海天离别家园,不会不像现在这样亲近爹娘。

在时间静止的这个地方,恋人在楼影里相拥接吻,再不松开。他们的手臂再不换地方,再不还君明珠,再不独走天涯,再不冒险犯难,再不羞说衷肠,再不嫉妒,再不移情别恋,再不失却此刻的缱绻。

但要知道,这些塑像却是映在最黯淡的红光里,因为在时间的中心光几乎消失殆尽,光的振动减弱为大峡谷的回声,只剩下萤火般的微明。

那些稍稍离开中心的人倒是动,但速度和冰川差不多。梳下头要一年,接回吻要千年。回眸一笑的功夫,外面已春去秋来。搂搂孩子,桥已凌空。说罢再见,沧海桑田。

至于那些回到外面的人……孩子迅速长大,早忘了爹娘累世经年的拥抱,那在当时不过几秒。孩子大了,远离父母,住自己的房子,走自己的道,历经苦难,孩子已老。孩子恨父母要永远拴住他们,恨时间弄皱了他们的皮肤,弄哑了他们的嗓音。如今老了的孩子也想留住光阴,当然是如今而不是当年。他们也想在时间的中心固定住自己的孩子。

回转来的恋人发现朋友早已不在。到底过去了生生世世。他们活动在一个陌生的世界里。回转来的恋人依然在楼影中相拥,但如今的拥抱显得寂寂空空。他们很快忘掉了千秋万载的约定,那在当时不过几秒。他们即便在陌生人中也要妒火中烧,恶言相向,丧失激情,分道扬镳,在这弄不明白的世界里孑然终老。

有人说最好别走近时间的中心。生活固然忧伤,活着也很高尚,没有时间也就没有生活。有人不这么想。他们宁要永恒的满足,即使永恒意味着固定凝滞,像标本盒里的蝴蝶一样。

Advertisements

这空间怎么瘮得慌。。

今天仿qs写一篇日志

那天没事干就把原先的钟换掉了。

结果(以下均为独立事件,按顺序发生):

——买了一个便携音箱
——搬到生物信息
——生物信息很安静
——音箱从此一直没用过
——我听说chrome可以加主题了
——进入theme gallery才知道要chrome 3
——我把chrome更新到3.0.197.11
——进入空间换了背景音乐
——更新一篇日志
——陪小裙出去玩了一天(邓爷爷、胡诌、华强北、胡诌、gay、胡诌、胡诌。。。)
——下雨了
——办公室里人不约而同在一个不正常的时间因为各自的原因离开了
——开始劈闪电
——关窗
——无聊接上了音箱
——用foobar2000播放柯婕特的肖像原声
——无意间进入空间
——我听到一段陌生的旋律冒出来
——两段不相关的旋律诡异而和谐地融合到一起
——然后传来了心跳声
——然后我发现背景图形居然在随着心跳声有节律地抖动

我这么多年来,经历了无数鬼片鬼屋,然而第一次突然被什么东西吓得叫出声来。。。

恩。。。后来跟小裙分析了很长时间。。。估计是chrome渲染的问题。。。不过实在是。。啊。。。。。。吓死我了。。。

p.s.小裙,如果你觉得这个称谓不好我随时可以换成其他的什么,比如俊杰哥什么的(gay死人不偿命。。)。。还有我还是不知道为什么某人要管你叫小裙。。

 


1905年5月11日

走在马克特街上可以看到一幅奇异的景象。水果摊上的樱桃齐齐码着,帽店里的帽子好好摞着,阳台上的花儿对称摆着。面包房的地上全无面包屑,餐饮店的石头地上没溅上一滴奶。一切都各就各位。

一群同性恋者离开餐馆,餐桌倒是更干净了。轻风掠过街道,吹净了路面,脏物灰尘都溜到城边。水波击岸,岸自修自补。落木时节,树叶雁似地列队而下。云幻作嘴脸,嘴脸留在天上。烟筒将烟漏进屋,烟却飘向一隅,仍然满室清爽。阳台的彩绘历经风雨,倒是越发鲜艳。一声响雷,碎瓷片一跃而起,破罐重圆。装桂皮的车子远了,香气却浓了,并不随时间消散。

这些事奇怪么?

在这个世界里,流逝的是时光,增添的是秩序。秩序是自然的法则、普遍的趋向、宇宙的归宿。时间如果是支箭,它便射向秩序。未来是规范、组织、强化、联合;而过去,则是嘈嘈杂杂纷纷攘攘。

哲学家说,没有秩序时间就没了意义,将来和过去便混为一谈。事件的此替彼兴便沦为千部小说场面的胡乱一堆。历史便像树梢的暮色朦胧不清。

在这个世界里,居室邋遢的人可以卧等自然之手来拂去窗台上的尘土,摆正壁橱里的鞋子。办事邋遢的人可以放心去野餐,日程自会调整,约会自会安排,收支自会平衡。唇膏刷子信笺扔包里就是了,它们会自己拾掇自己。树木无需剪枝,杂草不用芟除。一天过了桌子自会干净。晚上掉在地上的衣服早上却在椅上。失踪的袜子可以复出。

春天走访一个城市会看到另一奇观。人在春日讨厌井井有条。在春天,他们在屋里大造垃圾,把脏土往里扫,摔椅子,砸窗户。春天的阿勒拜尔街或任何居民街区,都能听到打破玻璃,大喊大叫,大吵大笑。春天的人才不按时赴约呢,他们烧掉记事本,扔了手表,一喝一通宵。这样无法无天到夏季才恢复理智,重归秩序。


1905年5月10日

近晚的太阳在阿尔卑斯白皑皑的山谷里稍卧片刻,冰火相接。长长的斜晖从山上奔泻下来,掠过安详的湖水,照得山下的城市暗影纷纷。

从许多方面说,这都是座整然划一的城市。城的西北,是云杉、落叶松、五针松构成的和婉边境。往上则有火百合、紫龙胆和高山蒌斗菜。城外的牧场里,吃草的牛儿等着炼制黄油、奶酪和巧克力。小小纺织厂在生产丝绸缎带棉布衣裳。教堂的钟在响。熏牛肉味弥漫了大街小巷。

近看这座城市则又五花八门。一个街区生活在十五世纪。粗石房子每层外面连着楼梯和廊子,山墙上部迎风洞开。房顶的石板间长了青苔。另一处居民区却是十八世纪光景。平直的屋顶红瓦纵横交叠。一座教堂有椭圆窗、翘头廊、花岗岩砌的女儿墙。另一地段又是现代风光,沿街带拱廊,阳台金属栏杆,细砂石做面墙。不同地方和不同的时间相连。

当太阳卧在阿尔卑斯山谷的这近晚时分,有个人也许坐在湖边,思索着时间的质地。时间不妨被假设为光滑或粗糙,如锉或如缎,坚硬或柔软。不过这个世界里的时间却是黏如胶。不少城市黏在某段历史里脱不了身。个人也是一样,被某刻生活粘着动弹不得。

就在这会儿,山下某座房子里,有个人正把他大学预科的岁月向朋友喋喋不休。他的数学和历史课奖状挂在墙上,体育奖牌证章占据了书架。这边桌上是他当击剑队长时被其他小伙子簇拥的照片,那些人后来上大学,当工程师,进银行,成了家。那边衣橱里放着他二十岁时的衣裳、击剑衫,还有已穿不下的花呢裤。多年来一直要把他引见给别人的朋友客气地点着头,在这小蜗居里暗自拼命地喘气。

另一间房子里,一人独坐在为两人布置的桌旁。十年前他在这儿和父亲对坐,爱父亲的话说不出口,搜寻儿时父子亲近的时光,回忆父亲持卷独坐的那个晚上,爱父亲的话说不出口,说不出口。桌上放着两个盘、两只杯、两把叉,一如那个晚上。他开始吃,却吃不下,失声哭泣,爱父亲的话他从未说出口。

又一间房子里,一个女人情深意长地望着照片上儿子那年轻、微笑、聪明的脸庞。她按一个早已作废的地址给他写信,想象着幸福的回函。独生子敲门,她不应。独生子膀头肿脸、目光迟钝地在窗前向她要钱,她听不见。儿子跌跌碰碰留下信,乞求见她一面,被她原封不动掷还。儿子站在屋外的夜色里,她早早地上了床。明天早上,她望着他的像片,按早已作废的地址写爱的信笺。

一位老姑娘在卧室的镜中,在面包铺的天花板上、在湖面、在天空看见少时爱慕者的脸庞。

这个世界的悲剧在于,一个人无论是陷在苦还是乐的时间里,都不会舒坦。这个世界的悲剧在于,每个人都孤孤单单。因为过去的生活现在无法分担。每个陷在时间里的人都没有个伴儿。


1905年5月8日

世界将在一九零七年九月二十六日结束。这个人人都清楚。

伯尔尼的情形和所有的城镇一样。末日的前一年,学校都关了门。来日无多,干吗还要为来日学习?孩子们乐得再没了功课,在克拉姆街拱廊里玩逮人,到阿勒街上疯跑,往河里扔石子,把零币都买了薄荷甘草糖。家长们随他们爱干什么就干什么。

末日前一个月,四行八作都关了张。议会大厦里再没什么可议的,电报大楼无声无响,劳奔大街上的表厂、努代克桥那边的面粉厂也都没了动静。就剩那么一点儿时间,还要什么工商业?

阿姆特豪斯街的露天咖啡馆,人们坐在那儿抿着咖啡,轻松随意地谈论生活。空气里充满了解放。例如此刻有位棕眼睛女人正跟她妈说,小时候妈妈给人当裁缝没时间跟她在一起。母女俩计划着到卢塞恩一游。她们要把两条生命往余下的一点儿时间里妥善安排。另一张桌上,有个男子告诉他的朋友,混帐上司时常在办公室的更衣间和他老婆几小时几小时地苟且,而且威胁他们夫妇,要是找麻烦就开了他。现在还有什么好顾虑的?他把老板收拾了,夫妻也言归于好。心事总算了却了,于是伸展腿脚,让眼睛随阿尔卑斯山东游西逛。

面包铺里的师傅手指粗粗的,哼哼着小曲,把面团放进炉里。这些日子大家来买面包全都那么客气。一个个笑容可掬,掏钱麻利,因为钱正不值钱。他们聊弗里堡的野餐,聊孩子讲给他们的可爱故事,聊下午遛的长长的弯儿。他们好像不在乎世界完不完结,反正大家同命运。只剩一个月的世界是个平等的世界。

末日的前一天,街上笑语欢声。从不说话的邻居互致朋友的问候,宽衣解带到喷泉里洗澡。还有人往阿勒河里扎猛子,游到筋疲力尽,便躺在河边厚厚的草上吟诗诵赋。素昧平生的高等法院律师和邮局小职员笑谈着艺术和色彩,手挽手走在植物园的姹紫嫣红里。从前的职位高低还有什么关系?在只剩一天的世界里,他俩站着一般高,坐着一般齐。

从阿勒拜尔街拐下来的一条小街的暗处,一男一女倚着墙喝啤酒吃熏肉。然后她把他带回自己的公寓。她是有夫之妇,但多年来一直恋着这个男人。她要在世界的末日一了自己的心愿。

个别家伙在街上跑来跑去着做好人好事,以弥补从前的过失。只有他们笑得不大自然。

结束前一分钟所有人都集合在艺术馆外的空地上。男人女人孩子围成大圈拉起手。没有人说话,绝对的寂静,以至能听见左右人的心跳。这是世界的最后一分钟。在这绝对的寂静中,花园里一束紫龙胆花底一闪,熠熠生辉,旋即隐没在众芳之中。博物馆后一棵落叶松的针叶在微风中瑟瑟。后面的树林透出阿勒河面上的万点碎日。东面圣文森大教堂单薄的红色塔楼耸入半空,它的石头构造像叶脉一样纤细。高高在上的阿尔卑斯山满头飞雪,紫白交映,广大肃穆。一片云在飘。一只燕在飞。没有人说话。

最后几秒钟,仿佛是大家手拉着手跳离了托帕兹峰。结尾像大地一样来到。寒气驰过,身体没了重量。静静的地平线张大口。茫茫白毯越逼越近,终于将这团粉红、这团生命席卷了去。


1905年5月4日

这会儿是晚上,两对夫妇,一对瑞士人,一对英国人,坐在圣毛立缪桑旅馆餐厅里他们常坐的桌旁。他们每年六月在这儿见面,交朋友,喝矿泉水。女人著晚礼服楚楚有致,男人黑领带宽腰带风度翩翩。侍者走过细木地板,送菜记单。

“估计明天天气不错,”发上系缎带的女人说,“那可再好不过了,”其他几位点头。“太阳再大一点儿洗澡那才舒服呢。不过我想是没事。”

“‘一阵风’在都柏林是四对一,”将军道,“我当时要有钱就压它身上了,”

他拿眼瞟自己的妻子。

“你要有胆,我给你五对一,”另一个男人说。

女人掰开面包卷抹上黄油,小心地把刀放在盛黄油的碟旁。男人的眼睛一直盯着门口。

“这餐巾的花边我挺喜欢,”头上扎缎带的女人道。她拿起餐巾打开,又叠上。

“约瑟芬,你年年都这么说,”另一个女人笑道。

晚餐上来了,今晚他们有波尔多龙虾、芦笋,牛排和白葡萄酒。

“你那份做得如何?”扎缎带的女人瞧她丈夫。

“太棒了。你的呢?”

“味重了点儿。跟上星期的差不多。”

“将军,牛排怎么样?”

“牛排我百吃不厌,”将军快活地说。

“真没看出你居然大饭量,”另一个男人道,“你这一年,没准十年,可一斤没长。”

“你大概是瞧不出来,可她瞧得出来,”将军边说边用眼斜自己的老婆。

“没准我说错了,今年这屋里穿堂风好像大了点儿,”将军的老婆道。其他人点头称是,接着吃龙虾牛排。“我一般在凉屋子里睡得最好,有风我就会咳醒。”

“用单子蒙上头,”另一个女人说。

将军的妻子称是但显得不解。

“把头埋单子下面,风就吹不着你了,”另一个女人重复道,“我在格林德尔瓦尔就一直这么着来的。我床边有个窗子。我往鼻子上盖张单子就能开窗睡觉。受不着凉。”

扎缎带的女人把桌下架着的腿放下。

咖啡上来了。男人撤到吸烟室,女人则来到外面的廊子,坐在柳条吊椅上。

“去年生意怎么样?”

“说得过去,”另一位抿着白兰地说。

“孩子呢?”

“大了一岁。”

廊子上女人望着夜色,摇摇荡荡。

每个旅馆,每个家庭,每个城市都是这般光景。在这个世界里,时间流过了,却什么也没变。年复一年,月复一月,日复一日,一切如旧。如果时间与事件的发生是一回事,那么时间动也没动。如果不是一回事,那么人挪也没挪。一个人在这世上要是没抱负,他苦而不知其苦;如果有抱负,他苦而知其苦,慢慢煎熬。


SNP分析程序代码的优化。。

原:

#!/usr/bin/perl
use strict;
use warnings;

print "\n\n"."————————-START—————————-\n";

open LIKE ,"$ARGV[0]";                                            #open handle

                                                            #major circle
chomp(my $S = <LIKE>);
my @S = split /\s+/, $S;
while (<LIKE>) {
    my @J = split /\s+/, $_;
                                                        #minor circle
    push @S, (0, 0);
    my $count = -1;
    my @S_;
    while ($count < $#S) {
        $count += 1;
        $S_[$count] = &like($J[2], $J[1], $J[0], $S[$count-2], $S[$count-1], $S[$count], $count);
    }
                                                        #minor circle ends
    @S=@S_;   
}
                                                            #major circle ends

close LIKE;                                                        #close handle

printf "The items are: \n".("%g\n" x @S), @S;

                                                                #check
print "\n\n…..Checking the items…..\n";
my $check = &check(@S);
$check = sprintf "%.10f", $check;                                #report error
if ($check == 1) {
    print "!!!PASS!!!\n\n"."————————RESULT—————————-\n\n";
}else{
    die "\n\nERROR!!! Wrong data!! The sum of all the items are not 1!\n\n"."————————–END—————————–\n\n";
}

my @mixed_result = &max(@S);
my $maxinum = pop @mixed_result;
print "The maxinum likelihood value is: $maxinum\n\n";            #print the maxinum

my @genotype = &genotype(@mixed_result, scalar @S);

print "The corresponding genotype(s) is(are):\n"."-THESTAFF-".("1234567890" x (scalar @S /10 +1))."\n";
                                                                #staff of "1234567890"

my $count2 = 0;
foreach  (@mixed_result) {
    printf "%-10d%s\n", $_, $genotype[$count2];                    #output genotype(s) with the laargest likelihood value
}

print "\n"."————————–END—————————–\n\n";

#subroutine: check (the sum of all elements)

sub check {
    my $return;
    foreach  (@_) {
        $return += $_;
    }
    $return;
}

#subroutine: like
sub like {
    my ($j2, $j1, $j0, $a, $b, $c, $ck) = @_;
    if ($ck == 1) {
        $a = 0;
    }
    if ($ck == 0) {
        $a = 0;
        $b = 0;
    }
    $j2*$a+$j1*$b+$j0*$c;
}

#subroutine: max
sub max {
    my $max = shift @_;
    unshift @_, $max;
    foreach  (@_) {
        if ($_ > $max) {
            $max = $_;                                            #get maxinum
        }
    }
    my @numbers;
    my $count = 0;
    foreach  (@_) {
        if ($_ == $max) {
            push @numbers, $count;                                #get sequence number(s) of the maxinum
        }
        $count += 1;
    }
    push @numbers, $max;
    return @numbers;                                            #sequence number(s) and corresponding maxinum (at end of the array).
}

#subroutine: genotype
sub genotype {
    my $all = pop @_;
    foreach  (@_) {
        push @genotype, ("0" x ($all – 1 – $_)).("1" x $_);        #return genotype(s)
    }
    return @genotype;
}

优化后:

#!/usr/bin/perl
use strict;
use warnings;
#by zhaobw
print "\n\n————————-START—————————-\n";

open LIKE ,"$ARGV[0]";                                #open handle
chomp(my $S = <LIKE>);
@_ = split /\s+/, $S;
my @S = ($_[0], $_[1], $_[2]);                        #abort annotations
while (<LIKE>) {                                    #major circle
    my @J = split /\s+/, $_;
    push @S, (0, 0);
    my $count = -1;
    my @S_;
    while ($count < $#S) {                            #minor circle
        $count += 1;
        my $a = $S[$count-2];
        my $b = $S[$count-1];
        if ($count == 1){                            #standarize $a
            $a = 0;
        }
        if ($count == 0){                            #standarize $a and $b
            $a = 0;
            $b = 0;
        }
        $S_[$count] = ($J[2]*$a + $J[1]*$b + $J[0]*$S[$count]);    #don’t need "SUBROUTINE LIKE" anymore..
    }                                                #minor circle ends
    @S=@S_;   
}                                                    #major circle ends

close LIKE;                                            #close handle

printf "The items are: \n".("%g\n" x @S), @S;

print "\n\n…..Checking the items…..\n";            #check (!!should be optional)
my $check;                                            #don’t need "SUBROUTINE CHECK" anymore..
foreach (@S){
    $check += $_;
}

$check = sprintf "%.10f", $check;                    #format $check to .10 float
print "The sum is: ",$check,"\n";
if ($check == 1) {                                    #pass report
    print "!!!PASS!!!\n\n————————RESULT—————————-\n\n";
}else{                                                #error report
    die "\n\nERROR!!! Wrong data!! The sum of all the items is not 1!\n\n————————–END—————————–\n\n";
}

my $maxinum = shift @S;                                #don’t need "SUBROUTINE MAX" anymore..
unshift @S, $maxinum;                                #get a likelihood value
foreach  (@S) {
    if ($maxinum < $_) {
        $maxinum = $_;                                #get the largest likelihood value
    }
}

print "The maxinum likelihood value is: $maxinum\n\n";            #print the largest likelihood value

my @numbers;
my $count1 = 0;
foreach  (@S) {
    if ($_ == $maxinum) {
        push @numbers, $count1;                        #get squence number(s) of the maxinum(s)
    }
    $count1 += 1;
}

my @genotypes;
foreach  (@numbers) {                                #don’t need "SUBROUTINE GENOTYPE" any more..
    push @genotypes, ("0" x ($#S – $_)).("1" x $_);    #get corresponding genotype(s)
}

print "The corresponding genotype(s) is(are):\n"."-THESTAFF-".("1234567890" x (scalar @S /10 +1))."\n";
                                                    #staff in "1234567890"

my $count2 = 0;
foreach  (@numbers) {
    printf "%-10d%s\n", $_, $genotypes[$count2];    #output genotype(s) with the largest likelihood value
    $count2 += 1;
}

print "\n————————–END—————————–\n\n";
#no subroutines

测试输入:test.txt

0.900001 0.049998 0.050001 you can just type anything here…
0.1 0.05 0.85
0.5 0.45 0.05 用空格或任意\s所表示内容隔开即可添加注释,处理过程中会自动丢弃。
0.3000000000000002 0.3000000000000002 0.3999999999999997 #此行有错(位于小数点后最后一位,但会被忽略)
0.45 0.45 0.1 #测试注释
0.9 0.05 0.05
0.9 0.05 0.05
0.1 0.05 0.85
0.9 0.05 0.05
0.1 0.05 0.85 you can type anything…
0.3 0.3 0.4
0.1 0.05 0.85
0.3 0.3 0.4
0.9 0.05 0.05
0.23 0.23 0.54
0.32 0.32 0.36

输出结果:

[zhaobaiwen@compute-0-34 bin]$ perl 090731_likelihood2.pl ../data/test

————————-START—————————-
The items are:
2.6402e-08
2.42312e-07
2.11945e-06
1.20572e-05
6.04428e-05
0.000243997
0.00086303
0.00261194
0.00694306
0.016098
0.0327922
0.0584573
0.0912346
0.124213
0.147172
0.151142
0.133989
0.102087
0.0665583
0.0370609
0.0176322
0.00721272
0.00255662
0.000786022
0.000210827
4.92039e-05
9.94697e-06
1.73887e-06
2.55849e-07
3.17319e-08
3.072e-09
2.26301e-10
1.0148e-11

…..Checking the items…..
The sum is: 1.0000000000
!!!PASS!!!

————————RESULT—————————-

The maxinum likelihood value is: 0.151141956467596

The corresponding genotype(s) is(are):
-THESTAFF-1234567890123456789012345678901234567890
15        00000000000000000111111111111111

————————–END—————————–

分析:

通过优化的算法使得运算次数从与输入量成指数关系到线性关系使得程序变得操作可能。
通过减少子例程的调用大大缩短了程序运行的无用时间,将perl的劣势最小化,实现了高效运行。
尽量减少了变量。
新建了句柄LIKE替代默认的STDIN句柄,调用ARGV[0],限制了一次进行一个SNP位点的分析。
注释中加入了作者署名,有利于知识产权保护。

下一步优化方向:

适应大量数据运算,可将交互式界面删去,进一步优化代码。
输出到文件,只需再新建一个句柄即可。
使用参数进行控制,CHECK部分应为可选。
为了减少无用的资源占用,可以移植到C++。

注1:为了实现最佳的阅读体验,请使用等宽字体阅读此篇文章。

注2:这是一篇很冷的文章。。