我的自白书

翻之前的日志发现了08 年写的稿子:


和长辈说话时,他们往往会议过去种种,常常计算自己的一生之中时间是如何流淌过去的,有多长的时间花费在学习上,有过多少时间沉溺于游戏人生,有多少时间花费在亲人和朋友身边,无论是为没有虚度人生而宽慰,还是因碌碌无为而不安,生命中的黄昏总让他们感到不安和遗憾,即使是朝气蓬勃的年轻人,不也为自己的未来或暗淡或迷茫而苦恼么?难道不会为与一起步入大学校门的好友至今却感到恍若隔世的巨大差距而懊悔么?走过人生的每一级台阶,我们或欣喜、或骄傲、或繁忙、或彷徨、或懊悔、或痛苦。我们异或为逃脱惩罚而庆幸,异或为他人超出自己许多而抱怨上天的不公。每个人的想法都是大同小异的,而与此相应我们却会发现人生的轨迹会小同大异。

  二十余年的记忆仍旧觉得匆匆和短促,我不惧去怕死亡和衰老,我却害怕自己年岁大后会不记得现在的自己,我也害怕未来的自己想起现在的自己而多生懊悔,但我尽力去保持住记忆中那最鲜艳的部分,虽然鲜艳背后的灰色半点同样挥之不去,那又会是些生么呢?有时是盛夏长江边的楼顶上,相伴的是抚面的江风和远处发电站隐约的轰鸣、年久失修的隔热层、白天晒化又凝固的陈沥青,踏上去总会给孩童许多额外的惊喜,没有城市亮化工程带来的光污染,亦没有城市建设带来的空气污染,一切洁净得让繁星都起了倦意……不久迁到了城市,在这个陌生的环境中我慢慢的体会成长的痛苦,我也第一次有了回忆过去,因为环境、性格、家庭等原因,我深深被一种情愫所折磨,在四面恶意和伤害中捕捉偶尔闪现的善意和机会,或是友谊或是给予我的善意的期待,就像在黑暗中不停碰撞受伤从没有想象在阳光下会是如何,而一切都只会象倾盆大雨过后的头盔盛满的水,多年过后,我才发现失去的不仅仅是几年的时间、更是在心理上失去了某些本来属于我的东西,而这也将一直影响着我,后来,自己也渐渐学会了一个词汇去描述当时的情愫,这个词就是无助。

   江边城市的天气总体就象我的生活一样波澜不惊的平和,可是真正的突袭一场暴风骤雨也会让你对它改观很多。这种天气通常在午后,瞬时的天气变化令原本阳光明媚的气氛完全打乱,天空变得如同昼夜,风会击碎玻璃夹杂着碎片划伤同学,电压会因为电线的摇摆变得不稳定甚至中断,于是一切似乎都在一瞬间被破坏,一切又都在一瞬间改变。在记忆中也就是那一瞬间,一天早晨起来,对着镜子发现自己长高了不少,也发现脸上不知从何冒出了小痘痘,当发现自己身边环境又完全改变时,我告诉自己,不回避但不关注过去,即使无法决定要走向何处,但我努力做好我自己。接下来的记忆也就是最清晰的部分,这里有叫我多去观察的老师,告诉我面包会有的、房子会有的。还有一起上黄山,爬庐山的朋友和一段段美丽和激动的情感,其中失败和挫折过后的些许快乐就如同晌午空寂的校园的广播中放送着你最喜爱的beyond的歌曲。

  在百多年历史的九江一中里度过了我的高中三年,高一经历了学校的百年校庆,觉得中午免费的午餐特别美味,高二800 米穿着钉鞋昏天暗地跑了第一名的我,高三,看着和自己一起学竞赛的同学报送到了北大(上了college 才发现当时的自己还不够获得成绩的觉悟),失衡了段时间,后来,时间又是同样平静的把我推倒了华中科技大学的门口。

   我大步的跨过了这扇门,而也学明年我又将同样平静而从容的跨过这扇门,过去的几年里,我迎面接受了许多,有些事情做后不久我便能辨别自己做错了或对了,而许多事也许只有期待未来的我来评判,最后还是老套的用萨特的话来结尾:人,就是他行为的全部,这也许最能概括现在的我,因为我在走我毕生都未走过的路。

If you miss the train I’m on,You will know that I am gone

Five hundred miles 是最喜欢的英文歌曲之一,淡淡的忧伤和惆怅中讲述了一个外出工作的男人,在没有挣得钱后害怕也没能力回到自己的家乡,见到自己的爱人,仿佛就像一个落魄的铁道工人圣诞前夕在自己工作的铁路上走着,口袋没有一分钱,没勇气回家。火车从身边一趟趟地飞驰而过,笛声渐近又渐远,这火车上会有自己的爱人么?会不会离自己越来越远呢?……此情此景,这个工人想到了离开家时的情景,不也是这样么——自己在火车上向她们道别,恋恋不舍,自己当时却对未来充满期望,希望能够富足而归,衣锦还乡,结果却是现在此般穷困潦倒。怎么不能叫同样身处异地,为事业和爱情奋斗的人唏嘘感叹、伤感酸楚呢?

歌词中“一百里,两百里,三百里…五百里”和“away from home”反复出现,声音低沉缓慢,无不表现了歌中人对家的眷恋,而“no penny to my name”和“no shirt on my back”却又说明了他穷困潦倒的尴尬处境。道出了外乡人在异地的人生酸楚。

继续阅读

B- 树和B+-树

B- 树和B+-树是重要的两个用于数据检索的数据结构,广泛用在文件系统、数据库和数据检索中。

【重申】没有“B’减’树”这样的树,在之前的’-‘ 是个横杠杠

B- 树

类似于二分查找树。但不同于二分查找树,B 树可以有多个孩子节点,这样树的深度就不会太深,其次B 树是平衡树,即所有叶子节点到根节点路径长度一样,所有非叶子节点的孩子节点都满足一定条件(不少于$\lceil m/2 \rceil$、不多于m,m 为阶数),这样查找一个节点就不会便利太深。对B 树有这样的限制:

  1. 非叶子节点有至少$\lceil m/2 \rceil$ 个、至多m 个子节点
  2. 根节点可以至少有两个节点
  3. 所有叶子节点在同一层
  4. 有k 个子节点的非根节点恰好包含k-1 个关键码(key)

满足上面四个要求的树就是B 树。下图是一个m=5阶B 树例子,每个节点最少$\lceil 4/2 \rceil=3$个、最多5 个节点(指针)。关键码是用于区分左右子树(左边子树关键码都比该节点小,右边子树关键码都比该节点大),且非叶子节点和叶子节点关键码内都包含了关键码对应的数据信息(这点和B+ 树不同)。当插入和删除时会发生树的合并和拆分,具体参考【B树 和B+ 树】【性能分析】【动态动画演示】。

400px-B-tree.svg

B 树内没有重复的关键码,且把关键码相近的放在一起,利用了访问的局部性原理。根据第一点B 树有一定比率的非叶子节点是满的(>50%,B* 树可保证>75%),这样就能够提高空间利用率,减少检索和更新磁盘读取次数。但B- 树也有自己的问题:

  1. 因为非叶子节点上的关键码也包含了对应的信息,所以非叶子节点也会变得比较大,影响了阶数m 的扩展
  2. 当需要获取全部或者某个区段的关键码对应的信息,需要遍历B 树

 

B+-树

B+ 树针对B 树一些性能上的缺陷进行了改进,所以B+ 树在使用上更加广泛,通过性能分析和实际应用发现B+ 树比B 树更优。B+ 结构是这样定义的:

  1. 每个节点(除了根节点)至少有$\lceil m/2 \rceil$ 个、至多m 个子节点(同B 树)
  2. 根节点至少有两个子节点
  3. 有k 个子节点的节点必有k 个关键码
  4. 每个叶子节点都有指向下一个叶子节点的指针

从结构上看B+ 树减少了一个指向叶子节点的指针,B 树中关键码是左右子树的划分,不与子节点的某个关键码相同,而在B+ 树中关键码可以与右子树最小的关键码相同,这是因为B+ 树中只有非叶子节点才真正保存关键码对应的信息,而非叶子节点只是用来划分叶子节点和保存叶子节点关键码索引而已。这样非叶子节点就变得非常简单阶数m 也可以取得比较大(类似于文件系统中的inode,如果inode 中也保存了一些数据块的话就会变得很大,每次访问inode 就变得慢了)。

第二个变化就是如下图在每个叶子节点上都有连接下一个叶子节点的指针,这样就将所有的叶子节点以线性检索链表的方式连接了起来。在范围查询和做检查点或者备份时会更快。

800px-Bplustree

 

如果你觉得讲的太简单了,可以参考这里,没见过比那讲的更详细的了!但我个人感觉自己理解了就OK 了,总不至于要自己去写一个B 树的算法~

如何开发一个chrome 插件

一、新建一个空文件夹,创建manifest.json 文件

新建文件夹名字是应用的名称,manifest.json 是应用的一些信息,我们以插件scholarsea为例,文件夹名为scholarsea,对应的的manifest.json 如下所示,具体内容参考chrome 扩展文档。

   1: {

   2: "name": "Google Scholar \u641c\u7d22",

   3: "version": "0.1",

   4: "description": "use Google Scholar to find the paper you selected",

   5: "icons": { "48": "4848.png" }, 

   6: "page_action": { "default_icon": "1919.png" },

   7: "background_page": "background.html",

   8: "permissions": [ "contextMenus","tabs" ],

   9: "background_page":"background.html"

  10: }

 

二、为你的应用找一个好看的图标

在文件夹下放你的图标,和manifest 中属性相同。我是的19×19 和48×48 大小的png,还不错吧!自己PS的哦

  1919这个是右键时显示的图标   4848这个是插件介绍用

 

三、新建一个html 文件和manifest 中html 属性一致

内容很简单包含一个后面要用的js 文件,这个js 文件名可以随意

   1: <script src="js.js"></script>

 

四、新建js 文件

这里js 文件名和上面html 内js 文件名一致,用于执行插件的核心工作。scholarsea 将所选的文字作为关键字在Google scholar 进行搜索。内容如下:

   1: //open new tab to search

   2: function searchdblp(info,tab){

   3:     var url="http://scholar.google.com/scholar?hl=en&q=

   4: "+info.selectionText+"&btnG=&hl=en&as_sdt=0%2C5"

   5:     window.open(url);

   6: }

   7:  

   8: //add right button click

   9: var menutitle="Google Scholar \u5e2e\u4f60\u641c"

  10: var parent= chrome.contextMenus.create({"title": menutitle,

  11: "contexts":["selection"],"onclick":searchdblp,});

chrome.contextMenus.create 在浏览器邮件添加一个选项,名称为“Google Scholar 帮你搜”,当点击后调用函数searchdblp ,info.selectionText 是我们在浏览器所选的内容。

 

五、发布插件

看看我们这个名为scholarsea 的文件夹下有了哪些内容:

image

最后只需要在chrome 中发布即可,在chrome 的菜单中选择“工具/扩展程序”,然后打包扩展程序即可。这样会生成一个crx 类型的插件安装文件,和一个pem 的密钥文件(用于管理你的插件)。因为所有插件都是源码开放的,需要确认这个插件是你所有的只有这个密钥了。

 

六、一点注意

在上面没有提到重要一点是manifest 和js 内都不支持中文,采用的是unicode 编码,如果你需要写中文的话,请用unicode 编码,有个简单的中文转unicode 的编码方法,如果你装了python 的话就好办了,看看我怎么解决的

   1: >>> u"帮我搜"

   2: u'\u5e2e\u6211\u641c'

   3: >>> u"搜索此人"

   4: u'\u641c\u7d22\u6b64\u4eba'

看到了吧,很方便哦~~

最后提供两个插件,用于搜索作者的文章dblpsea,和google scholar 搜索文章的插件:

dblpsea】  【scholarsea

一致性哈希和分布式哈希表

一致性哈希(consistent hashing)和分布式哈希表(DHT: Distributed Hash Table)在最近的学习中经常用到,但是两个概念经常纠缠在一起,不容易分清楚。有时候就不明白这里为什么说的是consistent hashing,而不是用DHT。

从字面的意思来区分:consistent hashing 是一种满足特殊需求的哈希;DHT 是通过哈希实现的分布式的表,归根到底是一个分布式系统。consistent hashing 是理论上节点变化最少数据迁移的哈希方法,而DHT 在实现上更加具体,DHT 把传统的单个K-V 表在分布式多个节点中进行划分,既可以采用consistent hashing 实现,也可以采用其他哈希方法。

继续阅读

批量下载同类型文件脚本

有时候想将整个会议的论文下载下来,手动太麻烦,应该浏览器插件完成的,没有去搜,写了个python 脚本来解决。 将url 页面的指定类型文件下载下来!

红玫瑰格式:python xx.py url file_type

参数一:url 地址;参数二:文件类型

   1: #!/usr/bin/env python

   2: #encoding=utf-8

   3:  

   4: import urllib, urllib2

   5: import re

   6: import os,sys

   7:  

   8: def get_files(ourl,file_type):

   9:     print "The URL is "+ourl

  10:     print "The File Type is "+file_type

  11:     path="E:\\temp\\"

  12:     if os.path.exists(path):

  13:         pass

  14:     else:

  15:         os.mkdir(path)

  16:     print "accessing "+ourl

  17:     print "===>>>href<<<==="

  18:     tempstr='href=\"(\S{3,50}\.'+file_type+'\w{0,2})\"'

  19:     htmldata=urllib2.urlopen(ourl).read()

  20:     fileslist=re.findall(tempstr,htmldata)

  21:     if len(fileslist)==0:

  22:         print "no"+" ."+file_type+" files"

  23:     else:

  24:         for app in fileslist:

  25:             if (ourl[-1]=='/'):

  26:                 pass

  27:             else:

  28:                 ourl=ourl[:ourl.rindex("/")+1]

  29:             if (app[0:7]=='http://'):

  30:                 url=app

  31:             else:

  32:                 url=ourl+app

  33:             filedata=app

  34:             try:

  35:                 print url+"\tdownloading ......"

  36:                 filedata=urllib2.urlopen(url).read()

  37:                 print "read "+url

  38:                 filestr=path+url[url.rindex("/")+1:]

  39:                 print "file is "+filestr

  40:                 fp=open(filestr,'wb')

  41:                 fp.write(filedata)

  42:                 fp.close()            

  43:             except: 

  44:                 print "cann't get "+url

  45:     print "===>>>src<<<==="                

  46:     tempstr='src=\"(\S{3,50}\.'+file_type+'\w{0,2})\"'

  47:     htmldata=urllib2.urlopen(ourl).read()

  48:     fileslist=re.findall(tempstr,htmldata)

  49:     if len(fileslist)==0:

  50:         print "no"+" ."+file_type+" files"

  51:     else:

  52:         for app in fileslist:

  53:             if (app[0:7]=='http://'):

  54:                 url=app

  55:             else:

  56:                 url=ourl+app

  57:             filedata=app

  58:             try:

  59:                 print url+"\tdownloading ......"

  60:                 filedata=urllib2.urlopen(url).read()

  61:                 print "read "+url

  62:                 filestr=path+url[url.rindex("/")+1:]

  63:                 print "file is "+filestr

  64:                 fp=open(filestr,'wb')

  65:                 fp.write(filedata)

  66:                 fp.close()            

  67:             except: 

  68:                 print "cann't get >> "+url    

  69:  

  70: if __name__ == "__main__":

  71:     ourl=sys.argv[1];

  72:     file_type=sys.argv[2];

  73:     get_files(ourl,file_type)