Archive for November, 2009


[zz]在Ubuntu下使用Eclipse的svn客户端报unable to load default svn client

这个不仅仅在8.04和Eclipse3.4下管用,在最新版本同样适用。

If you are running Ubuntu 8.04 and you install Eclipse 3.4 with subclipse 1.4, you will probably get the “unable to load default svn client” error when trying to add a repository.

Here it is how I solved this problem. I assume that you have the ’subversion’ and ‘libsvn-java’ packages already installed (if not, please do install them, and then follow the instructions).

1) Go to System –> Administration –> Software Sources
and under the “Updates” tab, check the hardy-backports updates. Close the window and update the package lists.
2) Run the update manager and update all packages (subversion will be updated from version 1.4 to version 1.5)
3) Edit the eclipse.ini file (it is located into the directory where you installed eclipse) by adding the following two lines, immediately after the “-vmargs” line

Code:
-Djava.library.path=/usr/share/java/
-Djava.library.path=/usr/lib/jni/

This should do the job, next time you start eclipse, it should correctly add your existing repository.

Please post comments if you have any trouble.

Cheers!

在Ubuntu上用Chrome

最近越来越鄙视FireFox同学了,在Windows上已经基本上抛弃了FF,在Ubuntu上也想如此一番,GOOGLE了一下,一个简单的教程如何在Ubuntu上安装Chrome。

sudo gedit /etc/apt/sources.list

加上以下两句:

deb http://ppa.launchpad.net/chromium-daily/ppa/ubuntu karmic main
deb-src http://ppa.launchpad.net/chromium-daily/ppa/ubuntu karmic main

然后:这句话是对我目前的版本9.10 Karmic有效

deb http://ppa.launchpad.net/chromium-daily/ppa/ubuntu karmic main
deb-src http://ppa.launchpad.net/chromium-daily/ppa/ubuntu karmic main

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xfbef0d696de1c72ba5a835fe5a9bf3bb4e5e17b5

sudo apt-get update

sudo apt-get install chromium-browser

这样就好了。

数据库ACID中的Isolation以及各种LOCK

说实话,这方面内容和我的兴趣毫无任何关系,本人天性就讨厌这些相对而言理论化的东西,特别是在如此的复杂环境之下更是让人头疼。不过明天就要考试了,也许是我历史上的倒数第二次考试,没有办法,潜下心来啃啃这本传说中的经典书籍Jim Gray的Transaction Processing: Concepts and Techniques.

这里主要谈一谈Isolation。

在ACID中,Isolation就是里面的那个I,其实本来这个词应该有更多更好的理解方法,比如书上说从解决问题的角度来讲,可以考虑其为Concurrency Control,从技术的角度上来说,就是一个locking的机制。Isolation的本来含义是希望在有很多很多不同的线程进行调用时,确保每一个线程的执行都相当于它是一个人在单独进行,没有受到其它线程的干扰,得到其应该得到的值。

在这里,我们可以将所有对数据库的操作分为两大类型,读和写。对于读而言,它的操作仅仅只是获取值,而不会更改值,而写操作则是要更新数据的状态,带来副作用。一般而言,对于很多线程同时进行读操作,是不会产生任何问题的。但是只要其中嵌入了一个小小的写,那么一切就变得复杂起来了。不同的顺序的操作会带来很多不同的问题。我们主要将其归纳为以下三类问题:(从这个翻译可以看出中文显得有多尴尬了吧:))

1)遗失更新(Lost Update):T1读-》T2写-》T1写

对于某个操作,T1首先读取,然后根据读到的值,进行操作之后,把结果写回到这个值中去。但是在T1读完这个值后,T2对其进行了操作更新,也就是说T1这个时候的计算的依据已经不是最新的数据了,T2写的这个值就直接等于遗失掉了。举个通俗的例子,比如我给你的银行账户的值翻倍,你有100块可以变成200块。但是在我读了100以后,有个人给你打了50块,你的账户应该是150了,但是我翻倍之后直接吧200写了进去。那个50块的操作就没影了。也就是所谓的遗失更新。

2)脏读取(Dirty Read):T1写-》T2读-》T1写

脏读取更加好理解,T1对数据更新是需要一个过程的,我们假设其中有两部分。结果在第一个和第二个之间的时候,T2对数据进行了读操作。显然其读出来的值不是最新的值,是一个脏数据,这个数据是马上需要被替换掉的。还是用账户的例子,账户里本来有100块,我要给A汇出50,然后B给我打进60,所以最终我应该是110。但是由于刚汇出A,就进行了读取,结果读到的账户的值就只有50了。显然是个错误的脏的读取。

3)不可重复读(Unrepeatable Read):T1读-》T2写-》T1读

不可重读的意思不言自明就是两次读取的值不相同。T1在一次操作中需要连续读取两次数据,结果在读取之中的时候,T2进来对数据进行了更新,于是T1读取的数值就不一致了。

注意以上所有的T1和T2都是指的单一一个事务,如果是多个事务的话,就不存在这些问题了。

根据上面的这些概念,我们可以按照数据库是否能够处理以上这些问题将其分类:

一般来说分为四个级别:

级别3:所有的并行化处理都被串行化了,于是任何的以上问题都不会出现。

级别2:没有遗失更新和脏读取的问题,但是可能会存在不可重复读的问题。

级别1:没有遗失更新的问题,但是可能会存在脏读取和不可重复读的问题。

级别0:可能会出现任何一种问题,但是如果另外一个事务的级别在1或者1以上,则该事务不会去读取其脏数据。

在理清楚了Isolation的问题之后,我们来看一下Lock的问题。最常见的Lock有两种,一种是共享锁(SLOCK),一种是专有锁(XLOCK)。在持有共享锁的时候,其他的事务可以对这个数据可以读不能写,也就是说可以给它附加共享锁但是不能加上专有锁。而如果一个事务持有某个数据的专有锁,则任何其他事务都不能对这个数据附加任何锁。

在这之前,有个简单的概念可以讲一下。我们可以吧对数据库的一系列操作视为这些操作的序列:BEGIN,COMMIT,ROLLBACK.READ,WRITE,XLOCK,SLOCK,UNLOCK。对于任何一个操作序列,我们可以将其简化为只含有后面五个操作的序列:

比如BEGIN->SLOCK A->XLOCK B->READ A->WRITE B->COMMIT
我们可以吧BEGIN和COMMIT去掉,然后将COMMIT改换为所有对LOCK操作的解锁,即:
SLOCK A->XLOCK B->READ A->WRITE B->UNLOCK A->UNLOCK B

在比如BEGIN->SLOCK A->READ B->XLOCK B->WRITE B->ROLLBACK
对于所有的ROLLBACK操作,我们需要将序列中的WRITE操作再次进行,相当于滚回原状态,然后再释放锁,即:
SLOCK A->READ B->XLOCK B->WRITE B->WRITE B->UNLOCK A->UNLOCK B

但是在这些操作过程中,我们还可能会碰到另外一个问题,所谓的虚读(Phantoms)。

这个问题会发生在上锁的时候,我们对于一个学生数据库中的所有男生进一个UPDATE操作,但是这个时候又转学来了一个学生,于是无论如何上锁,这多出来的一个男生始终无法受到约束。在这种情况下,我们需要使用谓词锁(Predicate Lock)。在使用谓词锁的时候,任何插入或者删除数据的事务,只要满足这个谓词,就无法进行操作。从某个层面上,我们可以看到这个锁对数据进行了进一步的细化。

但是谓词锁也存在几个问题,最主要的一个问题就是计算量的巨大,因为每次在操作之前,都需要对所有的谓词进行比较判断。这样即严重的影响了数据库的效率。

另外一个可以解决的办法和谓词锁很相似,被称之为粒度锁(Granularity of Locks)。这个概念实际上是在谓词锁的基础之上,在操作之前,首先定义好了所有的谓词结构,将其排放成一个树状。这样任何的操作都可以很迅速地找到自己的位置。比如一个数据库,我们将其分为三层,分别是地点,文件和记录。每一层都有父子关系:

最上一层是数据库,所有的数据都属于这一层,因此这一层的PREDICATE永远是TRUE。
下面一层是地理位置,分为中国,澳洲,美国。那么分别满足这个谓词的可以在这层上是TRUE。
接下来是文件层,每一个地理位置都有不同的文件层。比如在中国有档案文件,户口文件。
然后最下面一层是记录,比如户口文件中有张三的记录,有李四的记录。

于是我们在上锁的时候,只需要按照层次进行划分即可。比如我现在需要操作的是所有的中国的档案文件,那么谓词就是地点=“中国” AND 文件=“档案”,如果我需要的是李四的户口,那么谓词就是地点=“中国” AND 文件=“户口” AND 记录=”李四”。

通过对粒度的控制,我们可以随意的掌握锁的大小来更好的调整资源。但是在这个状况下,我们又产生了一个新的问题,比如我锁定了某个儿子,但是如果其父亲要求更改其值怎么办?于是我们定义一种新的锁,称之为意向锁(Intent Lock)。当我们需要锁定一个儿子的时候,我们需要将其之上的祖先全部附加意向锁。比如我们需要给中国的户口文件附上共享锁,在这之前我们需要对整个数据库,地点=“中国”这两个谓词附加上意向锁,最后才对户口文件附加共享锁。而当一个数据被赋予意向锁之后,它不能在被附加任何的共享锁或者专有锁,当然其他的事务也可以继续对其附加意向锁。

紧接着,我们又可以看到另外一个问题。如果一个事务需要对儿子附加共享锁,而另一个事务需要对父亲附加共享锁,其实这两个操作是没有冲突的,但是因为意向锁的原因,第二个事务必须等待第一个事务操作结束才能执行。于是我们通过将意向锁继续细化的办法来解决这个问题。

意向锁被分为三类分别是:

意向专有锁(IXLOCK:可能对其儿子附加共享锁或者专有锁
意向共享锁(ISLOCK):可能对其儿子附加共享锁
共享意向专有锁(SIXLOCK):自己本身是共享锁,但是希望对儿子附加专有锁

我们同时还介绍另外一种锁,称之为更新锁(UPDATE LOCK)。更新所的目的在于避免死锁。更多的关于死锁的内容下面再讨论。

将所有的这些锁进行一个图标的总结:

None

S

X

IS

IX

SIX

S

+

+

-

+

-

-

X

+

-

-

-

-

-

IS

+

+

-

+

+

+

IX

+

-

-

+

+

-

SIX

+

-

-

+

-

-

假期机票都买了

两次回国,圣诞和春节

第一程:12月22日 墨尔本-悉尼-香港 QF, 深圳-武汉 MU

第二程:1月9日 香港-布里斯班-墨尔本 QF

第三程:2月5日 墨尔本-香港-武汉 QF+CZ

第四程:2月19日 武汉-香港-新加坡-墨尔本 CZ+CX+QF

在GAE/J上玩Web服务

Web服务是GAE的主要交流工具,其中的核心部分就是RESTlet。但是目前来说,市场上还有很多很多的Web服务是只提供SOAP服务的,比如我现在正在解决的关于调用GoGrid CDN的API,在CDN这一块,他们只提供SOAP。但是想要在GAE/J上调用SOAP简直就是不可能。因为对很多类的限制,JAX-WS等一系列的传统方式,都无法在GAE/J上运行。

有一个force.com的网站,提供了一个婉转的办法。他们提供了一个WSC的类,可以将下载下来的WSDL文件,自动生成一个JAR包其中包含所需要链接的connector和类,然后在这个类的基础之上来操纵web服务。有兴趣的同志们可以直接去看看。

但是我的问题更严重,因为GoGrid CDN的SOAP API是基于.Net的,而我是用的Java,这又是一条横岗。在GAE的Issue里已经提交了这个问题,希望Google早日支持这个库,不然的话我可不想从JAXB开始手写调用Web服务。

先暂且把这个Task放一放,Azure这个服务商提供的API是支持REST的,这样总可以解决一些问题了。

09年港马柬越澳——9月9日

二.20099月9日,星期三,墨尔本-新加坡-香港-吉隆坡,雨-晴-阴-晴

09年9月9日,三个9聚在一起,当年最大的希望就是在这天去考次雅思能够考出4个9来。不过没想到这一天却成了我迄今为止坐飞机坐的跨越度最大的一次,从靠近南极的地方飞到北半球的温带,然后再飞回赤道。前人走这段路程,不知道要花费多少时间,不过对于我而言,需要的只是静坐在一个巨大的机器里面。

新航的传说在外面已经是妖魔化了,提到新航人们便会联想到好。我不知道是否之中有托的成分存在,但是就我个人坐了这么多次航班而言,新航的总体还没有达到让我惊艳的成分,至少在经济舱是没有的。从墨尔本到新加坡的航班是773ER,提前预定了海鲜餐,没想到让人大失所望,分量上,难吃,而且始终没有让我感觉到海鲜这两个字的存在。唯一的亮点在于大的显示器,清晰的画质的确非常之舒服。从新加坡到香港的A380也一样,特别是对于坐在上层的我,有了更多的空间和一个小的compartment。这两趟航班唯一让我惊艳的地方,就在于后面一餐的Hindu餐。在墨尔本吃惯了各种CURRY的我,竟然还会对这份饭如此之倾心,自己都意想不到。

在新加坡机场转机耗费了4个小时,一下飞机就意识到自己忘记了还掉还放在ICT柜子里的书。于是急忙写邮件给同学,给邻居,然后又在一辆微型的邮政车上寄出了我在新加坡的第一封信。一个Parcel,里面只有一把钥匙,一把笔我的小手指头盖还小的钥匙。看车的是一位马来妇女,那辆小车倒是十分的有创意。国内的机场可以好好地学一学。为了邮寄这个包裹,去换了十块新币。在柜台那里,我告诉他们我身上有美元,澳元,港币和人民币,哪种换新币最划算。服务员算了半天,说”Aussie is the best”,听了后心中还是十分激动,于是拿出了那仅有的本来准备为回程坐skybus用的10元,换了10多块新币。一部分邮寄用掉了,还剩下4、5块,发现旁边有卖点心的,吃了一份虾饺,吃了一份烧卖。不得不感慨,新加坡的食物卖得便宜的无法想象。在墨尔本,这样两样合起来估计要卖到至少7-8澳元,而且这还是在机场。无限羡慕那些在新加坡工作学习的人。

到香港机场的时间是下午2点多,也是我和小宝的会面地点。她正从遥远的武汉,坐飞机飞到深圳,然后转巴士到香港机场。对于两个没有手机的人,联络的方式只是一台iPhone和一台iTouch,借助着香港机场微弱的信号,用Gmail联系着。约好的地点很难确定,因为这也是我第一次到香港机场的办票点,于是在网上搜索半天,确定了一个不是很好,但是很显眼的地方,到达大厅A。终于在晚点的焦虑之下,熟悉的身影还是出现了。晚饭是在机场里随便吃的,对于我这种有着曾经在香港机场转机17个小时的人而言,里面的食物的难吃与贵,已经是永远不会再考虑的东西了。当然这次也是有发现的,T2有一家的烧腊做的还是不错的,双拼加奶茶35块还算实惠,味道也还过得去。虽然在禁区外,但是我估计这家餐厅将成为我今后在香港机场的首选。

晚上的飞机是9点起飞,原本以为亚航会安排到T2出发,结果办完票,还是把我们送回到了T1。于是等待等待,终于看到了那个红色的大家伙,而且还可以靠桥。亚航给我的感觉还是很不错的,座位不错,吃的也还可以,服务业都不差,作为廉价航空而已,何必要求那么高呢?

就这样9月9日的行程,在飞机上开始,在飞机上结束,未来的16天才是真正的旅行开始的日子。

09年港马柬越澳——9月8日

以下的文字写于2009年10月12日,在经历了17天的旅行后,又独自一人踏上了往南飞的旅程。

====================================================================

写书一般要有序,虽然我不知道有多大意义。小的时候看书,喜欢首先看序言和后记,还有那些前后角落的字,似乎只有这样才算是真正的看懂一本书。长到现在,心情的浮躁导致的直接结果是,很少能够顺利地看下一本书,连曾经最耐看的序往往也是一跃而过直接进入正题。我想这大概也是当今这个时代,所谓的信息化,所谓的高科技,给我们或者说是部分人带来的影响和后果吧。

我不是想写书,我也没有这个文采,更没有这个时间和毅力,我只是想记录下上个月将近20天的行程。在无聊之时翻翻聊以自慰,在年老时翻翻寻找梦想。坐在香港机场的61号登机口旁,太阳很大直接晒着我,旁边是一架B777的国泰航班等待飞往曼谷,背后是即将乘坐的A380到新加坡,而眼前面对的跑道上一架又一架的飞机腾空而起。刚刚还在同时同地的人们,转瞬之间就已经相隔千里,正如同上个月9号的我,一步一步的向香港迈进,而又如昨天开始的我,一步一步的远离武汉。又要开始倒数的日子了,刚刚走完了一段200多天的分离,团聚的30多天快得让人不可思议,这大概也就是牛顿相对论的精妙之处吧。人永远是不知足的,当希望时间停在那一刻时,时间却飞速的旋转;而现在的我,却又觉得秒针是如此之慢。从12点下飞机到现在,才熬过2个半小时。

明天的现在,我就可以躺在墨尔本的床上,亦或睡觉,亦或赶作业。在飞机上看书的人颇多,但是在飞机上看作业的人恐怕寥寥无几了,于是今天我便成了港龙空姐们所关注的话题。一个人在角落里,不哼不吃,看着并行计算的课件,思考着即将和导师的见面和下周的SUN公司的演讲,生活往往就是这么奇特。

回到初始,本人是个热爱旅游,热爱飞行的人。于是便精心策划了这一次长途旅行,主要旅游线路自香港起,途径马来西亚,柬埔寨和越南,最终返回澳门。不算特别的旅程,只是为了完成几个愿望,一来为我家小宝的毕业庆贺,二来独自闯荡一番,三来满足自己坐飞机的欲望。于是就此成型本次旅程。把时间倒回到98日开始吧。

一.200998日,星期二,墨尔本,雨

准确来说,我的行程是从9905分的班机开始。不过加上去机场的这段路,以及8号的故事,一起加上也不为过。

虽说是我在墨大的最后一个学期,而且只有两门课,但是时间却远远没有想象中那么轻松。特别是两个大的PROJECT压的人更是喘不过气来。于是8号的我,直到晚上5点还奋战在ICT的实验室中,调试程序写作业。最终自然发现,并行计算的作业是不可能完工了,于是收拾行李,直接奔向了回家的路。

晚上在家把剩下的一个Nando’s 鸡腿吃了,给我的时间只有5分钟。我需要在一切不可能完成的任务中,一项一项地完成,而赶上最后一班前往CITY307。结果自然是慌慌张张。直到现在我还能清楚的意识到,很多东西只是随意地收了起来,甚至碗筷还摆在桌子上经受灰尘的洗礼。晚上的墨尔本雨下的有点大,计划之中准备用相机记录下Doncaster Shopping Town的夜景的,可惜时间之下我几乎误了最后一班车。在红绿灯口拦下了已经开过的307,善良的司机还一脸歉意的告诉我说没看到我,我一边刷着车卡,一边心想我是直接过来的,你怎么可能看到我?沿路一直到CITY,畅通无阻,没有人在这雨夜的星期二前往CITY9点半,星际从David家赶来接我,直接把我送到了墨尔本机场。一切顺利的我,就这样结束了8号的行程。

附带需要提上一笔的是,我觉得我的名字进入了澳洲官方的黑名单。连续两次出境的时候,我都被拉到小黑房,审问一番。第一次我还觉得是我那天没洗脸没梳头太邋遢的原因。但是这一次,我几乎确定了我就是哪个疑似恐怖分子。这个问题如何解决,我还需要好好考虑考虑。

URL编码

URL中如果需要GET参数的话,有点时候会出现附加在后面的字符拥有特殊含义从而需要转义字符的时候。以下是一些简单的规范:

1)Letters (A-Z and a-z), numbers (0-9) and the characters “.”, “-”, “~” and “_” are left as is

2)  SPACE is encoded as “+”

3) All other characters are encoded as %FF hex representation with any non-ASCII characters first encoded as UTF-8 (or other specified encoding)

九点是个挺好玩的东西

最近实在无法集中注意力,虽然知道周五就要答辩,但是还是没有办法静下心来写论文。于是无聊之中,去摆弄了一下几个网站,特别是豆瓣,以前一直不知道怎么把自己的博客给换过去,现在终于在百度和GOOGLE的帮助下,做到了。

结论就是,豆瓣的程序员说水平高低我不发表意见,但是在业务流程上绝对绝对的是。。。。。。

这个网站如果好好地整整,绝对能够相当有前途,看看FACEBOOK,在某种程度上的吸引力还比不上豆瓣,不过豆瓣需要好好地修理下。特别是在customize方面,更该好好地注意注意。看来我是不是要去给豆瓣投份简历?

不知道九点这个名字怎么起出来的,不过想法是美好的,如果学习下GOOGLE NEWS,更深层次地进行下数据挖掘,效果肯定更好,毕竟首页推荐的文章,我的兴趣都不大。

自从使用Ubuntu以后,对Windows的兴趣越来越小。尽管听说过有100多刀就可以UPGRADE的版本,但是还是没有这个欲望去更新。暂且继续着吧。不过话说回来,觉得雪豹和Ubuntu在Integration方面真的是做的不错,我不知道Win7做的到底如何,但是如果真的可以吧Email, IM, LOCATION SERVICE这些全部都集成到OS里面,效果一定会好的多。

今天给Optus打电话,把我的IPhone给解锁了,省下了120刀的解锁费,至少年底回国也可以使用移动的卡在Iphone上了。

GAE-Java一些小的注意的地方

1. GAE的Eclipse在引用本地的library的时候,不会自动将其复制到WEB-INF/lib下去,结果就是如果选择直接上传到SERVER,程序会报找不到类的错。目前的开发人员正在改正这个问题,可能会在下一版得到解决。目前的最好解决办法,是首先将需要的类复制到WEB-INF/lib下,然后再引用。

2. 如果希望在本地调试程序的时候,可以查看datastore和queuetask的信息,可以通过http://localhost:8080/_ah/admin进入。里面提供了手动调控task的功能。

Older Entries
  • English Version

    • Cannot read Chinese? Please take a look at my English site, hope you can find more you need there!
  • 感谢支持

  • twitter

    facebook

    linkedin

  • Categories