爬山!

今天是2月1号,本人决定从今天开始到月底的每个工作日中午去爬山锻炼身体,以摆脱目前体重极速增长的困局。口说无凭,立此为据。

CuiPing_Hill 31.929620, 118.780457 山顶,海拔68米

Finished my machine learning courses

经过三个月的时间,终于看完了ml-class的所有视频课程,完成了所有review questions,提交了所有programming exercises.感觉不错,之前一直对数据挖掘相关的方面感兴趣,回想一下大学时候一些地统计分析甚至遥感图像数据处理的课都跟机器学习相关,但是毕竟不是这方面的课程,所以介绍的不是很系统。今年秋天斯坦福推出这个在线课程,机器学习作为其中之一真算是弥补了我们民间科学爱好者的遗憾了。

这个课程在有限的篇幅里涵盖了linear regression, logistic regression, ANN, SVM, PCA, K-Means, Anomaly Detection等等知识,基本上算是一个完整实用的导论。Andrew Ng教授的讲解也算是通俗易懂深入浅出,完全感觉不到什么门槛。

对于online course这种形式,今年秋天斯坦福的人工智能、数据库、机器学习也算是首开先河,目前这三门课程都已经结束,网上的反响非常强烈。好消息是明年Q1斯坦福还有更多数量更多方向的课程。今天MIT也宣布了明年的online course计划,他们也将加入提供在线课程的行列。而且,MIT的在线课程还会颁发一个名叫MITx的certification。开放式课程已经成为大势所趋,信息本应自由传播。

对于对机器学习感兴趣的朋友,除了ml-class.org上的资源,你还可以在academic earth上找到ANG教授的授课视频。这套视频涵盖的内容比ml-class上的更详细完整:
http://academicearth.org/courses/machine-learning

课程结束,我在ml-class上所有的编程作业都已经放在bitbucket上,如果有兴趣可以参考这些octave程序:
https://bitbucket.org/sunng/ml-class

明年一月斯坦福还会开放更多跟机器学习相关的课程,包括:

Thank you, Professor Ng and your team for this well-prepared, high-quality online course.

普通青年、二逼青年与文艺青年的Java代码缩进

普通青年

while(true) {
    if (something) {
        System.out.println(something);
        break;
    }
}

特点: tab与空格混用,无其他特点。
常见于:各类代码仓库。

二逼青年

while(true)
{


    if (something)
    {
        System.out.println(something);
        break;
    }

}

特点:总担心代码不够长
见于:各类劣质技术书籍

文艺青年

while(true)
  {
  if (something)
    {
      System.out.println(something);
      break;
    }
  }

特点:普通Java青年永远不会理解的缩进,lisp程序员会心一笑
见于:Clojure源码

流水帐

最近没有什么特别值得一提的事情,或者说都还在进行中还没有到值得一提的时候。

中秋节休息之后的第一天清早去驾校考交规理论,这个事没什么可说的,除了在4sq上又拓展了一点疆土,后来我又后悔没把GPS带着错过了一些还没有数据的道路。倒是那天去和回分别坐错了车,想十年前本人对城市交通网络了然于胸,除了视力不好把48路看成46路就没有坐错过车走错过路。结果现在公交线路的数量翻了一番,城市的交通网络也更复杂了。人脑则不具备scalability,活地图的时代一去不复返了。

第二件值得一说的是我在VirtualBox里成功安装了ArchLinux和GNOME Shell桌面。我工作的机器是有点古老的Dell OptiPlex 760,显卡还是ATI的Radeon HD 3420。为了开发的方便,我们装的都是CentOS 5,没错是5!!这周上班后升到了8G内存我就开始琢磨开个虚拟机体会一下现代生活。多余的不说了,几个注意事项:

  • Host要装ATI的fglrx驱动,xorg-x11-drv-ati直接也能用,但是性能非常差
  • VirtualBox要在4.0.4以上,我看网上说的,具体能个版本也不知道,但是用最新的就可以
  • 3D加速要开,在虚拟机的设置里
  • 最最重要的一点!不要从虚拟机的菜单里安装Guest Addon,那个对Arch不管用。要用pacman安装仓库里,包名我忘了,请自行-Ss
  • 别忘了把rc.vboxadd加入rc.conf的Deamons里

这周最诡异的问题是在配Netty的Pipeline时,我用了:

Channels.pipeline(new HttpMessageDecoder(), new HttpMessageEncoder(), myhandler);

结果稍微上一点压力居然出现了很多decoder异常,什么包不全、头不全、空指针什么的。不明真相最后改用例子里的:

ChannelPipeline cp = Channels.pipeline();
cp.addLast("decoder", new HttpMessageDecoder());
cp.addLast("encoder", new HttpMessageEncoder());
cp.addLast("handler", myhandler);

就成功了。也许是顺序的原因也许是名字的原因,可如果这个名字真的具有意义的话为什么没有常量可用呢?不去追究具体原因了,记住就好。

此外遇到的bug还包括clojure中transient数据结构的问题,我有一个transient的map,但是persistent之后发现只有前9(依稀好像是)次assoc!的内容保存了,后面却都丢失了。1.2里的transient都被标记了alpha,不过印象1.3的changes里好像也没提transient。

另一件与clojure有关的诡异事件是一个test case的failure report:

FAIL in (test-read-job) (wal.clj:61)
expected: (= (job k) (rjob k))
actual: (not (= “tomcat” “tomcat”))

不过最后好在是冤有头债有主,睁着眼有时也要说下滑。在从stream中读字节流多读了一个byte,后来用这一组byte去new String的时候,就变成了一个不可见字符。结果在命令行里的输出就是这么骇人听闻,还是在IDEA里跑这个测试才发现错误的那个字符串后面跟了一个方块。至于为什么多读了一个byte,copy/paste害死人啊。

以上这些牢骚是关于clojure的,但是这篇就不加clojure的tag了,否则被planet clojure收录去我又给中文世界丢脸了。

周五晚上我又更新了sunng.info的首页,以后也许我会定期的放一些得意的照片(或者照片上有得意的东西)上去做背景,以免被人看到后发现太单调乏味。

最后还要感谢一下twitter网友Kymair这周将Rage Viewer部署到了Heroku上。