(1)
恩,第100篇生活小记近在眼前。准备在发表第100篇后要好好庆祝一下,这样也算对得起我的勤奋和坚持(勤奋?那为啥一个月才一篇?)。如何庆祝嘛,当然是买东西啦。不过我除了买游戏机和买游戏外,似乎也没有其他东西想买了。(听说肾5C降价了?)
国庆节是回家去了,临走的当天还不忘把班翘掉。领导都不在,而且工位要装修,我自然是溜之大吉(而且把同组新来的人带坏了,她也翘班了)。老妈吩咐我回去的时候买三只烤鸭,以方便她送人。去超市转了一圈发现很便宜,于是就挑了包装最漂亮的买下了(好吃吗?显然不好吃)。
回家后第二天就和爸妈去乡下参加别人的婚礼。我一直对参加别人的婚礼没啥感觉,反正我又不要送钱,所以就当作去蹭吃蹭喝好了。比较夸张的是第二个婚礼我连新郎新娘的人都没看到,光顾着吃饭去了。
与家人待在一块的时光自然是好的,无忧无虑(当然家里也有一些私事,我还是不告诉大多数的各位了,少部分人会知道)。放假前老妈还跟我说爷爷在报纸上看到微软会在株洲开分公司的消息兴高采烈,还把这部分内容剪了下来。也自然是这样,如果M$在株洲有分部,而且我能够进去,那显然不用多虑直接回家了。不过这也不是三五天的事,目测要折腾至少两三年,所以在此之前我还是在外面好好玩玩吧。
下次回家的日期应该是一月中旬,也就是春节前一周左右。
(2)
国庆节后顺便又翘一天班,尔后又开始了日复一日的搬砖生活(背井离乡这么远挣点钱多不容易,某些人居然还说我过得很轻松)。
当然不可能会轻松,看我在公司做的东西就知道了。可以毫不客气地说我做的东西是全组最多的。做得快很明显的坏处就是别人看我闲着,又给我派新的活。刚开始还欣然接受,后来我自己想学习一些其他东西的时候就会发现明显时间不够用,所以这两周我都拒绝新来的任务。
虽然说现在是敏捷开发,但是我认为距离理想的状态还有很远——按道理应该是几个人合作完成同一个任务——而现在还是各干个的。倒不是说大家不把自己的设计思路、想法与别人讨论,只是现在的流程就是这样。把自己的东西做好就行了,管别人的干嘛?况且还有可能令别人不高兴。
但是有些问题如果和别人讨论,通常会发现更好的解决思路,毕竟一个人的思路有限,并且也不一定一直在状态。
举个例子吧。比如我们要做一个功能,就是从现有的日志文件中获取并筛选一定时间范围的日志。这个日志文件写入的时候是用的微软的Enterprise Library库,日志以一定的格式写入文本文件中(有一个明显的分隔符)。日志的大小、格式、数量都是可以配置的。
由于单个日志文件最大可能有1个G,而用户又可以选择任意时间范围内的日志(当然一次传输到客户端的数量有限,不是一次传输的)。为了加快处理速度,就要想一个比较好的办法了。设计是,先读50条,用户把页面滚动到最下方又预读10条,直到全读完为止。
开会讨论的时候就提出了这个读取速度问题。取极限情况,假如起始为止接近文件末尾,第一次顺序读的耗时肯定很大,而接下来读10条呢?
按照目前的设计,服务器端不想保存各个客户端的状态,而且HTTP请求也是无状态的,那么下次请求的时候如果是预读接下来的10条那么又得从头开始读取,速度肯定是不能保证的。当时我提出服务器可以把读取到的文件和位置返回给客户端嘛,下次请求的时候客户端把这些信息发回来,从原来的位置继续读就好了。
大家认为这个方法不错,既不要改变现有服务器的结构,也可以比较快地读取。
最后这个任务没有分给我,另一个同事实现的时候发现文本文件不能随机存储。如果想从任意位置开始读(就是上面我提到的思路),得用二进制存储方式。而采用二进制存储意味着工作量加大(至少要增加一半的工作量),所以他最终实现的时候还是每次请求从头开始读取(当然会选取其时间段所在的日志文件开始读)。那速度怎么办呢?不让用户为每个日志设置那么大就行了(比如有个客户的设置是最多5个日志文件,每个最多1G;可以更改为最多50个日志文件,每个最多100M)。
为什么不用二进制呢?其原因是没有现成的东西可以用,使用二进制存储自然不能按行读,还需要转码。而这位同事在识别时间的时候使用正则表达式来判断,如果是文本格式,那么按行读后直接用正则判断就行了,采用二进制意味着额外的工作量。
后来我想到,如果用二进制的话(我不认为二进制文件实现按行读很困难,只是没有线程的库而已。我之前写的消息内容分析早以实现了更多功能),意味着可以随意定位文件,那么为什么一定要从头开始读呢?
二分查找!对,这应该是最快最好的方式。当然每次二分的时候很可能游标会在日志文件中间或者分割符中间,但是一直往后找直到找到日志的分隔行就行了么?取下一条消息的时间进行判断就行了,这很好实现。
这样下来,假设日志文件是1G,每个日志平均5KB的话,那么大概有21万条日志。在最坏的情况下,二分查找应该在logn的次数内出解,也就是17次定位就能取到日志的起始位置,加上每次判断顶多读取10KB日志的内容并处理,时间绝对不超过0.1秒。而顺序查找的话,最坏情况下从磁盘读取就需要30秒,加上处理的时间那就更不知道了。
实现这个算法只要稍有功底,给你两天时间实现并完善并不是难事。但是在公司里我看到的是大家都是想赶快把任务完成,并不出多大问题(自己实现各种算法当然有风险!还有可能做不完。所以他们都喜欢用线程的库),这样就行了。
在这种情况下,我也不会过多地表达我的想法。等到以后真的需要改进,我才会提出来。
(3)
两个星期前KC跑到帝都来进行笔试和面试,具体情况怎样请咨询其本人。感觉KC本人还是挺萌的(TMD),大家如果要萌照(睡懒觉照)可以找我要。
回家前和以前一个同事交换了游戏玩,我把我的雷曼和KZ给他玩,他给我玩他买的胧村正和F1(当然后者我只玩了几分钟就没玩了,实在不想懂)。
上周末开始玩《行尸走肉》,结果发现不通关周末无法出门。这个游戏的剧情极其赞,具体我会在下周新写一篇日志来记述(如果他们又给我分很多活那又可能会晚几天写了)。这是白金神作,通关一次白金就到手了。第二天我还把植物大战僵尸那个铜奖杯的尾巴补上了,白金也总算到手。最后主要放一些胧村正的截图以及我白金的截图吧。
胧村正的画面极其漂亮,作为画面党的我无比爱之,下面放图。
前几周花了250多大洋买了初音的DLC(只有6首歌),千本樱的EXTREME难度没多久也PERFECT了哦。其他的歌除了Tell Your World很简单外都略难,正在修炼中。
接下来是《行尸走肉》和《植物大战僵尸》的白金截图。
最后是《行尸走肉》里截的图。这种剧情紧张的恐怖游戏也有搞笑的一面哦。
(说明:图中是一个男子在街上走,后面来了一辆车,此时我选择的是去草丛躲避这辆车。在草丛里发现了一具男尸,这具实体是在游戏中死掉的一个男人。开车的司机发现我躲在那后,冒出了这句搞笑的话。另外,在被walkers“统治”的环境下,能这样幽默还真的很不容易,当然这位司机在接下来的剧情中开玩笑有些过分了,大家有兴趣可以自己尝试去玩这个游戏,手机和PC上都有。)