良's profileTang Liang's notebookPhotosBlogLists Tools Help

Tang Liang's notebook

Enjoying life
June 15

6.14游黑龙滩

   又到一年毕业时节,唐老师带领全实验室的同学们一起游黑龙潭。今年轮到我们毕业了,加上博士师兄,大家一共近30人包车去成都附近的黑龙潭水库。黑龙潭位于眉山附近,丘陵地形,加上一条人工水坝,于是这里就形成了一个巨大的水库。传说里面还有食人鱼和水怪出没。不用多说,先上图片。

DSCN2964

DSCN2965

DSCN2990

DSCN2994

DSCN2975

May 29

朋友在一广告公司搞人事,刚传来几张图片,是一位相当NB的应聘者,据说把他们一公司人雷翻了(转帖)

今天收到一位agency朋友的信,与大家分享。顺祝大家端午节快乐!

朋友在一广告公司搞人事,刚传来几张图片,是一位相当NB的应聘者,据说把他们一公司人雷翻了。他们估计这们兄弟是狮友,发上来大家鉴定一下!

人家公司是招策划人员(Planner), 我个人觉得他还是应聘美术指导(Art Director)比较合适.

 0826baa0b48446bc87e3ca1ede71118c

95b6ff37c3034b61bd69f37ee4320a22

March 20

关于数据库系统的学习

  前段时间加入TopLanguage的Group,发现这里圈子的还有不少朋友认得我。不少朋友从本科就开始关注,虽然我们并不相识。原以为我的blog会是孤岛,看来自己还是应该花不少时间去更新一下自己的blog了。写blog更多也是对自己生活,学习和工作的总结。记得最早接触blog的还在是04年初,还记得那个时候因为获得了Microsoft的MVP,认识了微软的Grace,在和她的交流中才知道原来这个世界上有个叫做blog的东西。

  这段时间一直都很忙,因为除了毕业论文外,还在准备参加一个数据库开发的比赛。不过我们可不是用数据库,而是真正地开发数据库系统DBMS。硕士阶段做的东西主要是Data Mining,KDD方面的比较多。而数据库DBMS应该更多倾向于是System方向。港科大的同学也提议我应该可以去尝试做做System方面,因为我在做系统实现方面还是有一定的经验和技术。07年在微软的时候,做的东西也是偏向于System,这块领域的确是很实在,做出来的东西都是直接影响工业界和社会的。后来发现,诸如MIT,Berkerley等牛校在数据库方面都是做System较多。Data  Mining,KDD则更多是偏向于机器学习,需要更多的数学理论,而非编程技巧。我本人在此之前发表的3篇学术论文也都是Data Mining方面(我的主页http://cs.scu.edu.cn/~tangliang上可以直接下载到pdf)。虽说自己的研究方向是数据库与数据挖掘,其实学了3年下来,感觉无论是数据库还是数据挖掘都学得不太好。数据挖掘是一个很大的领域,硕士3年学不好情有可原。而数据库系统,从本科就在学习,到了硕士阶段又学了一次,可是自己也不敢说真的理解清楚数据库系统。为了参加数据库的开发比赛,又重新拿起那本经典的教材《Database System Concepts》反复研究,逐步体会到了数据库系统很多以前没有体会到的精髓。

  以前的数据库学习,把过多的精力放在了关系代数,关系表设计,范式,SQL等等。而真正属于数据库系统的就只有B+Tree。我相信,现在很多人都写不出来真正的B+Tree。B+Tree的Insert和Search都比较简单,而最复杂的还是Deletion。在SIGMOD1995上甚至还有一篇专门讲解B+Tree的Deletion的论文,《Implementing Deletion in B+ Tree》,这篇文章可以在Stanford的著名女大牛教授Jennifer Wisdom的网站可以下载http://infolab.stanford.edu/~widom/cs346/jannink.pdf

  除开B+Tree外,数据库系统另外一个复杂而重要的部分就是concurrency control。之前参加比赛之前,港科大的同学就劝我去看看Postgres SQL源代码。其中最复杂的部分不是Indexing,而是Concurrency Control混合的代码。记得当年Berkeley的Micheal Stonebraker开启了这个Postgres的项目,后来霸占了数据库最顶尖的SIGMOD八十年代无数篇papers,于是PostgresSQL也获得一个学院派的数据库称号。而我个人是在看不过来PostgresSQL的源代码了,自从在cygwin上编译成功之后,看了一些heap file之后,就再也没有碰过了。这次参加的数据库开发比赛的发起人也是这位传说中的神人Micheal Stonebraker,不过他现在已经到了MIT。这里的concurrency control应该分成两部分来看,一部分是indexing,cache, heap file的同步访问,另外一部分就是保持ACID(Atomic,Consistent,Isolation, Duarable)的事务(Transaction)控制。说到Transaction事务的提起,就不得不提到曾经为此拿到图灵奖的微软的另一位神人,Jim Grey。可能很多人提到这位神人,都会想起他前年在太平洋上失踪的事件。我想,或许他真的是某个外星球派到地球上的神人,帮助人类完成数据库上Transaction的设计,大功告成后回到自己的星球去了。官方的可信的说法是,他在太平洋上遇到了海盗。海盗可不管他是不是什么数据库神人,还是微软的首席科学家什么的。在第一部分的数据部分的同步访问,主要涉及到对复杂的数据结构加锁,多线程的技巧等等。它是提高并发性的关键。在网上有很多关于索引加锁的PPT教程,需要注意的就是加锁的顺序。因为保持加锁顺序是防止死锁的根本保障。比如说,我在实现我们的数据库系统的时候,对索引树加锁的顺序始终保持从根结点到叶子结点。这里还会涉及到“乐观锁”和“悲观锁”的加锁策略。这些在数据库的教材上都有详细讲解。在控制事物的ACID方面,数据库的书上主要讲解了两阶段锁(Two-Phase Locking)的策略。这也是现在大部分数据库,SQL SERVER,ORACLE等默认的事物控制原则。一般的教材都有比较严格的讲解。两阶段的协议本身是很简单的,不过要证明两阶段能够实现真正的ACID却要花掉教材上很多篇幅的讲解。个人感觉两阶段锁在很多时候都过于严格。去年2008年的SIGMOD best paper: Serializable Isolation for Snapshot Databases(http://www.sigmod.org/sigmodinfo/awards/#bestpaper)都还在研究多版本控制,snapshot的事物控制方式。其实说到多版本控制的事务实现,最直观的体会就是大家常用的源代码版本控制软件CVS,SVN。它能够保证大家任何时候都能读和写其中源代码,只是最后commit的时候提示你冲突。对于数据库系统来说,如果commit冲突了,无非也就abort其中一个transaction,再执行一遍。而CVS,SVN则要求用户自己去解决这个冲突。

  除开索引和事务控制外,数据库系统其他部分的东西就是Cache和Heap file,而这两部分相对简单一些。因为在其他很多存储系统上,Cache都经常用到,诸如什么最近最少的替换原则,在操作系统的课程上都讲了很多。其实,国外某些大学甚至把操作系统和数据库系统两门课程放到一起来讲解。而Heap file似乎很少在国内的数据库教材上看到。Heap file本身也没多大的技术含量,只是我们不能忘了,真的数据都是存在heap file内的。以前还有人提出sort file。不过sort file虽然search时候更快,但是插入删除的时候需要移动的数据实在太多。不要忘了Heap File和Sort File都是在外存的介质上,移动数据的效率是十分低的。所以现在所有的数据库系统SQL SERVER,ORACLE,MYSQL等都用Heap file。

国内的数据库系统课程设计,几乎都只是讲讲书本上的东西。而国外诸如MIT这些牛校,将每门课程的时候都要求学生动手去做一个实际的系统出来。MIT在他们的OpenCourse网站上的Database System课程里面,就要求学生动手实现一个叫做TinyDB的小数据库系统

February 03

朋友说我不应该喜欢《Revolutionary Road》

11688246_20142337其实《Revolutionary Road》在刚出来不久,我就认真看过了。光说《泰坦尼克号》的原班男女主角就足够吸引人了。想起10年以前,杰克和露丝那那么年轻,而今的他们,都快步入中年了。特别是莱昂纳多·迪卡普里奥,从一个奶油男生的荧幕形象已经变成一个满脸胡渣的《无间风云》里面的正派卧底。或许欧美的男演员都不喜欢被当做奶油小生,一旦演技成熟之后,就会朝满脸胡渣的成熟中年男人的角色转变。而欧美影视界也总是对成熟的老男演员偏爱有加,看来男人还是越老越吃香。而当初扮演露丝的凯特温丝莱特已经远没有《泰坦尼克号》时候的惊艳,但是《Revolutionary Road》里家庭主妇的角色却很是适合。

《Revolutionary Road》是一部很平常的生活片,没有惊险刺激的剧情,浪漫的爱情邂逅,但是却有任何人都能体会到的中年压抑。影片开头展现出来的boring的工作,没有了新鲜感的婚姻,家庭子女的负担,几乎是每个中年人都经历过的困惑。唯一的出路就是为生活寻找新的方向。这个方向或许是工作上的突破,也或许是居地的搬迁,孩子的诞生,甚至可能是婚姻的出轨。不同的选择造就了家庭的冲突,而在欧美男女平等的家庭里面,这种冲突并非是那么容易解决的,必需有一方的妥协。

我始终觉得,《Revolutionary Road》里面最好的角色是老邻居家里的精神病儿子。一个Mathematics的PhD,绝对的天才,但却始终被精神病困扰着,被锁在家或者精神院里。其实,大家都可以想到这种人恰恰是因为严重自闭,导致了思想与外界脱离,就正如《飞跃疯人院》里面的诸多病人。然而,导演的巧妙之处,却恰恰是让这个看似自闭与外界脱离的精神病人,道出了对男女主角的选择的评判。是“众人皆醒,唯我独醉”,还是“众人皆醉,唯我独醒”?

February 02

《亡命之徒》的名字其实取得很好

纵贯线在春晚压轴的节目表演的歌曲明明是《亡命之徒》,而CCTV居然把别人歌曲的名字改成《出发》。或许《亡命之徒》这个名字是在不太和谐,但是如果细细听一下这首歌曲的词意,其实还是很上进健康的意义,而且特别真实。个人感觉还是《亡命之徒》更合适。这个世界的确有太多疯狂的地方,如果想一个人已经开始出发了,他必须得跟这个世界一样疯狂,在外人眼里必然一个亡命之徒。

不知道从什么时候开始,本人听歌曲更喜欢现场演唱会了。因为现场演唱会不会带有录音棚,苹果软件的调整,音乐更接近真实的情感。纵贯线,还有伍佰们,现场的歌曲始终比出来的唱片更有激情。

January 31

Google居然也中毒了

I{IFYWDP5MG(Y~)XY34ES~O

首先声明一下,图片是群里面的同学发的。

January 20

The Road of Hacking PostgreSQL (1)

最近在写一些大规模数据存储和查询的小程序,发现很多核心的技术还是来自于我们的数据库技术。然后,真正到做的时候才晓得原来自己对于数据库很多本质的东西的理解并不透彻。我感觉,数据库技术真正核心的是数据的物理存储,外存内存交互,索引这些东西。而关系代数,SQL语言这些都是其次的。诸如现在的Google的bigTable等东西,其实最本质的技术还是在数据库领域。和真正做数据库的同学聊了一会,觉得自己真的应该好好研究一下现在已经成熟的数据库产品。作为学习数据库的同学都知道PostgreSQL在数据库界的地位了,同时它又是开源的。

在Windows上安装PostgreSQL已经很简单了,因为官方网站已经提供了Windows版本的下载。不过我的目的是学习PostgreSQL的源代码,那么肯定是要下原始的代码,然后自己编译,安装,运行。整个编译运行环境还是必须得是Unix/Linux,所以我首先尝试再Cygwin下安装。

Cygwin的安装最好齐全,诸如什么flex,bison,g++,readline,cygserver,perl这些肯定是要安装的了。我下的PostgreSQL版本是最新的postgresql-8.3.5。接下来的configure,make和make install都比较正常。不过奇怪的是,cygwin的bash执行时间长了,居然和卡巴斯基2009冲突,卡巴斯基的avp.exe一直占用50%左右的CPU,并且使得cygwin的bash始终卡住。后来我关掉卡巴斯基就OK了。编译过程也不算太长,比起之前编译的insight好短很多了。

网上有很多《Cygwin下面安装postgreSQL》文章,都抄来抄去的那一篇。于是我也按上面的办法开始安装。不过有点奇怪的就是我执行cygserver-config的时候居然找不到cygrunsrv.exe。通过Google找到它,然后copy都cygwin/bin目录下。initdb都OK了。接下来又发生奇怪的事情。pg_ctl.exe,createuser.exe,createdb.exe执行之后都直接返回,没有任何提示信息。但是数据库并没有启动起来。后来在Windows命令控制台下执行,提示说什么PQMesssege**函数再cygpg.dll定位不到。在cygwin/bin目录的确已经有cygpg.dll啊。难道是PostgreSQL和当前的cygwin版本不匹配?

然后我又从cygwin的setup下了cygwin自带的postgreSQL-8.2.9。似乎它要通过什么cygport来打patch,compile,install。敲入命令之后,再执行,结果到了后来还是遇到error了,中止了。这个时候我就快崩溃了。。。

我能想到唯一的解决方案就是装一个纯正的Linux算了。于是下了Ubuntu 8.10和VMWare。不过我没有装VMWare Workstation,那个家伙光是安装文件都有500MB,而且盗版还要招破解序号,太麻烦了。我装的是VMWare Player 2.5.1,只有40多M,免费软件。它除了不能制作vmx虚拟机文件外,其他的功能都齐全。至于vmx虚拟机文件可以从http://www.easyvmx.com 在线订做,1分钟就搞定了,下载之后也只有几K的空文件。用VMWare Player打开就可以安装Ubuntu了。下面就是我的VMWare Player跑起来的一个截图,做得小巧,不错!

image

默认的Ubuntu安装之后,还有很多软件没有安装齐备。就连g++都没有,VIM也只有tiny common文件。那么又要开始漫长的下载和安装必要的Ubuntu程序文件了。。。这个时候我再回到Windows下试试我的cygwin。发现,pqsql目录下,除了bin外,还有一个lib,里面有很多dll,而且居然还有刚报错的那个cygpq.dll。我估计pg_ctl.exe等需要的应该是这里面的dll,于是拷贝所有的dll到了bin目录下。然后pg_ctl.exe,createuser.exe,createdb.exe都work了!!!

image

搞了我一个晚上和一个上午,总算把postgreSQL跑通了。这里附带一篇psql的用法(http://www.chinalinuxpub.com/doc/psql/app-psql.html),否则进入psql都还不知道怎么敲命令呢。

好了,从下一篇《The Road of Hacking PostgreSQL》开始,我就深入PostgreSQL源代码的内部做分析和介绍了。最近我还再继续看我最钟爱的《X档案》,最后借用它的结束语也是:To be continued….

January 17

做一个专业的coder(1)

学习coding技能数十载,大部分局限于Windows与Java平台。趁现在有点时间,还是从专业点的Linux C/C++开发以及环境学习。其实早在几年前,本人还是接触过Linux平台下的C/C++开发,不过始终没有做过什么正式项目,所以不足挂齿。最近一直在写一个开源的高维空间的近似搜索引擎,于是就拿这个开源项目作为练手的项目了。

首先汇报一下自己的开发平台:
1) Cygwin,在http://www.cygwin.com下载,只装了开发需要最小环境,下载包总共不到70MB。
2) Vim 7.2。下载的是Windows平台下的gvim。装的插件有: ctags, taglist,MiniBufExplorer。

下面是我配置的第一个_vimrc:

set nocompatible
set guioptions-=T "no toolbar
set guioptions-=m "no menu
set langmenu=en_US
language message en_US
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
  let opt = '-a --binary '
  if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
  if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
  let arg1 = v:fname_in
  if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
  let arg2 = v:fname_new
  if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
  let arg3 = v:fname_out
  if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
  let eq = ''
  if $VIMRUNTIME =~ ' '
    if &sh =~ '\<cmd'
      let cmd = '""' . $VIMRUNTIME . '\diff"'
      let eq = '"'
    else
      let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
    endif
  else
    let cmd = $VIMRUNTIME . '\diff'
  endif
  silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction

set nocp
filetype plugin on
set guifont=consolas:h10:cDEFAULT
colorscheme desert
set number
set cindent
set smartindent
set shiftwidth=4
set tabstop=4
set hlsearch
set clipboard+=unnamed
map <F10> : Tlist<CR>
map <F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q * <CR>
map <C-lt> : bn<CR>
map <C-gt> : bp<CR>

 

现在一方面要学习VIM的编辑方式,还要学习GDB的调试。幸好以前学习ucLinux的时候,对Makefile,gcc的使用还比较了解。最后贴上一张GVIM开发工作时候的贴图作为纪念:

image

 

良 唐

Occupation
Location
Interests
Research: Data mining and Machine Learning:
Homepage: http://cs.scu.edu.cn/~tangliang

Custom HTML

Photo 1 of 102