到头了

不管这是不是30号下午我伸直了脖子期待的国庆假期,总之伴随明天早晨8点45分打卡机一声鸣音它是要见鬼去了。8号?8号用来中和后一天的周一综合症吧,不指望了。今年国庆真是无聊到一定程度了,我印象中似乎从来都还没有这么无聊过。本来还想着靠自己一些勉强存在的兴趣爱好来抵抗无聊的,后来发现是不堪一击。概括地说这六天看了整整六天的喜羊羊。上帝啊。好像也不完全是,还听了很多革命歌曲看了一些老电影。总之正经事是没有什么明显的进度,哎呦不说了,我现在连什么是正经事都说不清楚。

在上海一点出门的欲望了都没有,六天以来取得最远的地方就是旁边的超市,其中还有包括今天在内的三天连楼都没下去。豆瓣上本来还有个老电影的活动来着,结果正好是明天加班,想去也去不成。形势危急,主办方发了三封豆邮说大家快去,不然这个活动办不下去了。我想着在北京的时候还有点兴趣爱好什么的,那么严酷的斗争环境,周末还去听个讲座参加个沙龙什么的,在上海就一点胃口都没有了。要不以后还是找机会去北京吧,但是去干什么呢,真无聊。

今天突然冒出个想法,要是能重活一次的话,我马上毫不犹豫爬到楼顶跳下来reset。

好在好在,明天就回公司了,要试着配一下ehcache的集群,有时间的话比较一下RMI方式和JGroup方式的性能,再做下一步打算。对了,还有一个系统的维护指南要写。

我还是想想明天上班Syu时的情景吧。

PS:此文是用Firefox的插件ScribeFire发的

Mapping Geometry in Grails and MySQL

针对地理数据的ORM,有一个Hibernate的扩展HibernateSpatial项目可以将JTS对象映射到MySQL/PostGIS/Oracle中。这个扩展同样可以用在Grails里,这里有一篇简单的介绍,关于在Grails和MySQL中管理地理数据:
http://www.grails.org/MySQL+GIS-Geometry+with+Grails

不过按照这个文章里介绍的方法用,很可能会遭遇这样的报错:

org.hibernate.MappingException: No Dialect mapping for JDBC type: 2003

这个问题最终在这里得到了解答:
http://n2.nabble.com/No-Dialect-mapping-for-JDBC-type-2003-td1141106.html
按照邮件列表里的反映,上面的配置在Postgis里是可以work的,但是如果用Mysql还需要指定JPA的columnDefinition,对应的Hibernate属性是sql-type。虽然作者承诺会在今后的版本里修改这个问题,不过眼下的M2版本还没有修正这个问题。为此,Grails的用户特地提出在Grails中加入sql-type的支持:
http://jira.codehaus.org/browse/GRAILS-3201
现在按照下面文档的说明,可以在mapping里指定sqlType了:
http://grails.org/doc/latest/ref/Database%20Mapping/column.html

实例代码里的domain定义应该改成:

import com.vividsolutions.jts.geom.Polygon
import org.hibernatespatial.GeometryUserType

public class MyPoly {
    String name
    Polygon poly

    static mapping = {
        poly type: GeometryUserType, sqlType:"GEOMETRY"
    }

}

于是,再也没有莫名其妙的No Dialect报错了。

Reading GPS Data From EXIF Using Groovy

废话不说了,直接上code吧:

import com.drew.imaging.jpeg.*;
import com.drew.metadata.*;
import com.drew.metadata.exif.*;

file = new File("sample.jpg");
meta = JpegMetadataReader.readMetadata(file);

gpsdir = meta.getDirectory(GpsDirectory.class);
lat = gpsdir.getRationalArray(GpsDirectory.TAG_GPS_LATITUDE);
lon = gpsdir.getRationalArray(GpsDirectory.TAG_GPS_LONGITUDE);
lats = lat[0].doubleValue() + lat[1].doubleValue()/60 + lat[2].doubleValue()/3600;
lons = lon[0].doubleValue() + lon[1].doubleValue()/60 + lon[2].doubleValue()/3600;
println(lats);
println(lons);

metadata-extractor似乎是现在惟一的读取exif信息的java库。在ivy中可以添加这样一个依赖:

<dependency org="com.drewnoakes" name="metadata-extractor" rev="2.4.0-beta-1" conf="runtime"/>

Gnome Shell

续昨,好吧,这个无聊的国庆假期就献给karmic了。gnome-shell已经可以在软件仓库里找到了,apt-get安装即可。要使用gnome-shell可以执行
gnome-shell –replace

要把gnome-shell作为默认的窗口管理器,打开gnome的配置编辑器,找到/desktop/gnome/session/required_components,把panel和windown-manager全部改成gnome-shell,重新登录即可。

上个图:

当然了,还没有正式release,大家试用尝鲜注意安全第一。

libchamplain: Map Widget of Gnome Desktop

续昨,虽然昨天升级到了gnome2.28,也安装了libchamplain,但是却没有发现这个库应用。Ubuntu上的Empathy似乎是没有把location support编译进去。看不到效果怎么办,好在libchamplain的作者还提供了另一个应用。这是一个eog的插件,用于读取照片的exif信息中的gps latitude和longitude,进而将他显示在libchamplain的地图里。

安装这个插件可以follow官方网站上的做法,当然开发包、头文件之类的东西要齐备。

libchamplain使用了clutter,在载入地图的时候还有fadein的效果。clutter是将要应用在下一代桌面gnome shell中的图形特效库。

插件是用C写的,可以看成是libchamplain的一个例子,作者说已经有了其他语言的binding,如此未来在gnome桌面上开发tile地图程序会变得简单。