Categories

Calendar

January 2009
M T W T F S S
« Dec   Feb »
 1234
567891011
12131415161718
19202122232425
262728293031  

放弃在 Matlab 中 OOP 了

当然,做 Research ,或者说做实验,目的就是要跑出结果来,代码写成什么样子其实无关紧要,而且通常代码的生存时间(比起一般的项目代码来说)很短,大可以不必理会下面这个 tip :

不过,太乱的代码自己多少也有些看不顺眼,而且养成一个习惯毕竟也是好事,其实做实验的一些代码也是经常要重用的。特别是我现在这种状态,经常要作为苦力把各种算法拿过来跑一跑,做一个对比。其实除非是做那种完全纯理论的研究,一般都是需要实验来验证的,而做实验就必然要做对比,何老师经常说:“做 Research ,目的不是你的结果要有多好,关键的地方在于你要做得比所有现在已知的方法都要好。”其实也挺有道理的。不过这样一来,会有一些经常需要用来做比较的方法,这些代码在各个实验中其实是差不多的,也总会想着能够尽量地重用,而不是每次都重新写一遍或者 copy & paste (通常是诡异的 bug 滋生的温床)。

把 HTML 格式的文档放在 Google Code 的 svn 仓库中

之前就想把 YASnippet 的文档直接放到 svn 仓库中,把生成出来的 HTML 直接放到 svn 中,然后再给出 svn 仓库中对应的 HTML 文件的路径,在浏览器中直接打开就可以浏览了。可是试了一下发现不行。Google Code 的 svn web 有两种模式,一种是 browse 模式,会显示出高亮的源代码以及相关属性,并可以方便地添加 code review ;另一种是 raw 模式,这种模式下会直接给出原始文件的内容。本来想在 raw 模式下应该可以直接当做网页浏览了,但是试了一下发现 Firefox 直接把 HTML 代码给显示出来了,当时也没有深究,干脆就把 YASnippet 的文档放到了 lifegoo 的服务器上。

现在 lifegoo 的服务器挂掉有一段时间了,合租的 DreamHost 服务器又一直没有弄好,YASnippet 的文档也没处放,我才有想起了这个问题。依稀记得曾经看到过有人这样用的,心想也许 Google 更新过了,于是搜索了一下,找到了一些 svn 中的 HTML 文件,但是奇怪的是,有一些能当做网页显示,另一些则像我之前碰到的情况那样当做文本文档直接把 HTML 代码显示出来了。

点点

我家以前养过一只白猫,名字叫“点点”。我现在没法找它的照片,于是只好在网上找了一张白颜色的猫的图片来怀念一下。点点的头上还有一个倒着的“Y”字。突然想起它来,是因为今天碰到了另一只头上有倒“Y”字的白猫──似乎这种图案还挺常见的吧。

碰见它是下午去吃饭的时候。走到食堂,发现饭卡只剩四块钱了,充饭卡的地方贴着一张告示,要放假放到 29 号,让大家提前充好饭卡。可惜我悠哉悠哉的直到这个时候才看到这个告示。告示上还说推荐大家到自动转账机上去充值。不过经过我一直以来不断地尝试发现那个玩意从上个月开始就坏掉了──要充值的时候就会告诉我密码错误,然而我却可以凭这个“错误”的密码登录进去更改密码,而且也可以把饭卡上的钱转到 VPN 账号上交费。不管怎么说,我这几天大概要倒霉了,食堂是不接受现金的,外面的小店也早已关门了。不过至少还有四块钱,还是先去买了两个馒头一碗粥充充饥。我挺喜欢吃馒头的,只是不明白为什么食堂没有馅的馒头卖得和有馅的包子一样贵呢?

听说旁边的清真餐厅是收现金的,于是我吃完就决定绕路过去看看。刚走到门口,就看到赫赫几个字“本餐厅谢绝现金”。真是悲剧,“大概只能跟着紫金港的野猫们混了,”我想。这个时候就看到那只小白猫了,头上一个倒着的“Y”字,远远地看着我,绕来绕去的好像想走过来又很怕的样子。我冲它耸耸肩,想告诉它:“兄弟,你别盯着我看,现在我们同是天涯沦落人了。”然则我还是摸了摸口袋,最后还是没摸出什么能吃的东西来。正要转身走了,突然发现它的两只眼睛一只是白的一只是黄的,不知是生病了还是天生长成这样的。

异乡春节

特地问了一下,今天确实是春节。热衷于过年的热闹时,只会跟着大人一起闹;后来长大了,却又不关心这些事了。所以我至今一直都没弄明白春节、除夕、大年、小年、元宵之类的分别是哪天要做什么。于是就过春节吧,今年留在杭州了。本来想,咱也来平凡一把,过个普普通通的春节好了,无奈大家都不配合,走到大街上,能关的店铺都关门了,大家都过年去了,结果什么“普通”的事情都干不成,只好也盘算着怎么把这一天安排得充实一点了。

其实留在学校过年也不错,听说学校有安排年夜饭,还有红包拿。不过好像下午三点就开始了,所以早上的时间得赶紧了。早起去等公交车,只有稀稀落落的几个人,大家都拎着大袋的年货和礼品。等了好一会儿都不见车来,都有人等不及打的走了,K89 才慢吞吞地开过来了。我心想,过年了还要出来跑车,师傅们也真辛苦,道声新年好吧!可是车门一开,那师傅一脸苦相地盯着我,好像完全是我害她过不成年一样,于是我赶紧闭嘴了。

漫谈 Clustering (番外篇): Vector Quantization

本文是“漫谈 Clustering 系列”中的第 3 篇,参见本系列的其他文章。

在接下去说其他的聚类算法之前,让我们先插进来说一说一个有点跑题的东西:Vector Quantization 。这项技术广泛地用在信号处理以及数据压缩等领域。事实上,在 JPEG 和 MPEG-4 等多媒体压缩格式里都有 VQ 这一步。

Vector Quantization 这个名字听起来有些玄乎,其实它本身并没有这么高深。大家都知道,模拟信号是连续的值,而计算机只能处理离散的数字信号,在将模拟信号转换为数字信号的时候,我们可以用区间内的某一个值去代替着一个区间,比如,[0, 1) 上的所有值变为 0 ,[1, 2) 上的所有值变成 1 ,如此类推。其这就是一个 VQ 的过程。一个比较正式一点的定义是:VQ 是将一个向量空间中的点用其中的一个有限子集来进行编码的过程。

一个典型的例子就是图像的编码。最简单的情况,考虑一个灰度图片,0 为黑色,1 为白色,每个像素的值为 [0, 1] 上的一个实数。现在要把它编码为 256 阶的灰阶图片,一个最简单的做法就是将每一个像素值 x 映射为一个整数 floor(x*255) 。当然,原始的数据空间也并不以一定要是连续的。比如,你现在想要把压缩这个图片,每个像素只使用 4 bit (而不是原来的 8 bit)来存储,因此,要将原来的 [0, 255] 区间上的整数值用 [0, 15] 上的整数值来进行编码,一个简单的映射方案是 x*15/255 。

ImageMagick Tips: Shadow your picture (again)

我在之前的一篇 blog 中说过用 ImageMagick 来为图片加上好看的 soft shadow 的小计巧,我一直在用,觉得很方便,当时的脚本是这个样子:

1
2
3
4
5
#!/bin/sh
convert $1 -bordercolor white -border 6 \
-bordercolor grey60 -border 1 \
\( +clone -background black -shadow 60×4+4+4 \) +swap \
-background none -mosaic $1

不过其实由于使用了 -mosaic ,边缘的阴影被截断了,看起来很不好看,如下图,注意左下角和右上角的阴影部分:

参考 ImageMagick 的文档,也有解决办法,不过比较麻烦。幸运的是,从 ImageMagick 6.3.6-2 开始,我们可以使用 -layers merge 来完成这个任务,而且不会出现这样的不好看的边缘,脚本修改如下:

漫谈 Clustering (2): k-medoids

Samoyed

本文是“漫谈 Clustering 系列”中的第 2 篇,参见本系列的其他文章。

上一次我们了解了一个最基本的 clustering 办法 k-means ,这次要说的 k-medoids 算法,其实从名字上就可以看出来,和 k-means 肯定是非常相似的。事实也确实如此,k-medoids 可以算是 k-means 的一个变种。

k-medoids 和 k-means 不一样的地方在于中心点的选取,在 k-means 中,我们将中心点取为当前 cluster 中所有数据点的平均值:

2008 ^L 2009

^L 是 ASCII 字符中的 12 ,亦即换页符。随着 27 日 MSTC 的新年 party 和 31 日全校的灯火通明,大家一起翻过了 2008 年的最后一页。也许我们应该用一句话总结一下 2008 年走过的足迹,然后定下 2009 年的目标,可是我最后发现两件事其实都并不容易。

我在记忆里搜寻 2008 年与 2007 年的界线,2008 年的第一篇日志,还是 1 月一日下午的那篇“崭新的 2008 年”,从照片上看,当时似乎是比现在要暖和许多吧。之后就临近考试,紧张地复习了,为了能舒服地回家,还带了操作系统课的课本过去通宵排队买票;家里正是雪灾,那是从未见过的一片白;再后面就是春晚,那个时候我正坐在妈妈家里的沙发上写 RMMSeg 的代码。之后一直为 Ruby 的性能和内存泄漏问题而烦恼,也借此机会读了一些 MRI、YARV 和 Rubinius 的代码,对于我一直以来都很感兴趣的 Language VM 多少有了一些了解。到 2008 年夏为止,可以说是折腾了 Ruby 的各个方面,从语言的实现到诸如 Coroutine 、Continuation 甚至是 Y Combinator 这等奇怪的玩意,再到正常的应用诸如 RMMSeg 、Ferret 以及一些日常的脚本。总的来说这是一个很不错的脚本语言。