八十天环游地球路线图

小乐郑重其事地向我推荐《八十天环游地球》,说这个故事非常精彩。我欣然接受,于是又重温了一下这个故事,虽然是少儿简化版,但故事的主要脉络还是比较清晰的,在时间的催促下也有紧张感。在印度拯救贵少妇,以及美国的土著劫火车,都让故事增色不少。而最后一天到达伦敦后,原以为时间已经超出,却又由于一路向东过了子午线,多赚了一天(这个小乐似乎还不太明白),而意外赢得了赌局。

看了后就萌生和小乐一起来制作一条八十天环游地球的路线图的想法,以前一般都是以思维导图的形式画人物关系图,而这本书可以以另一种角度的方式来看书,地理位置。自己都觉得这个想法很棒,哈哈。于是先买了一张世界地图,和小乐在地图上一个个点找:

从伦敦到多佛尔,穿过英吉利海峡,到法国加莱,然后来到苏伊士运河,到了红海,亚丁拐弯过阿拉伯海到了孟买,接着穿过印度大陆,到了加尔各答,继续航行过马六甲海峡,到新加坡、香港,由于风向的缘故,快飘到了上海,再到了日本横滨,穿过太平洋,到旧金山,铁路穿过整个美国,从旧金山到奥格登、奥马哈、芝加哥,最后到了纽约,然后在大西洋航行,从纽芬兰到了利物浦,最后坐火车到伦敦。(上面有些地点在世界地图上是找不到的)

好酷啊!这一趟逛得够远的。和小乐一起继续在纸上画下了艰难而有趣的旅程:

八十天环游地球

看出来没有,上面的线不同可是表示不同的交通工具哦。有铁路、轮船,还有大象和雪橇。另外在地点上小乐也特地标了两个不同的标记,那也是精彩故事发生的地方。

有了平面地图上的感受,借助于Google Earth,我们还可以再来一趟3D的环游地球,下图就是整个路线的全景了。

八十天环游地球

一起在看《八十天环游地球》的朋友可以取KML文件Google Earth中游览一番,小朋友一定会喜欢。

在safari中使用https google reader订阅RSS

之前在safari中一直使用Add To Google Reader订阅RSS,不过由于老外不必担心GFW,采用http即可,但是我使用的时候经常都很杯具的是http无法访问google,从而必须手工改成https,再刷新一次,很不爽。

就像修改一下,去找代码,codaset已经不能访问。就到github上找了个Rob Wilkerson 之前参考的版本,也就是Chupa源代码。我也clone了他的代码,做了一些修改。

一是采用https的方式访问google;

二是点击RSS按钮后直接采用google reader订阅,而不需要选择iGoogle或Reader。

你可以直接在target中下载安装即可,或者在read-in-https-google-reader中得到源代码。

解决PostgreSQL存储过程中调用c编写的动态库出错的问题

现象,存储过程调用外部c写的动态库函数decode解密偶尔会出错,原因:传递给decode的密文不能保障一定是合法解密结果。

解密函数如下:

text mydecode(text t) {

char p = decodeBytes((char ) VARDATA(t), VARSIZE(t) - VARHDRSZ);

text new_t = (text ) palloc(strlen(p)+VARHDRSZ);

SET_VARSIZE(new_t, strlen(p)+VARHDRSZ);

memcpy((void ) VARDATA(new_t),(void)p,strlen(p));

free(p);

return new_t;

}

对PG几乎也是一窍不通,下了它的文档,就直接看C Language Functions,大概了解了一下。

上面的写法是c语言函数的版本-0调用风格,已经不提倡了。

text 是一个结构,length是存储文本长度,data是起始指针:

typedef struct { integer length; char data[1]; } text;

palloc用来分配内存,用了一些宏VARDATA, VARHDRSZ, SET_VARSIZE方便书写,不易出错。

(VARHDRSZsizeof(int4) 一样, 但是我们认为用宏 VARHDRSZ 表示附加尺寸是用于变长类型的更好的风格。)

找个测试环境,在.bash_profile中增加PG环境,PATH=$PATH:$HOME/bin:/usr/local/pgsql/bin/

编译代码,超简单的makefile:

MODULES = codetest

PGXS := $(shell pg_config –pgxs)

include $(PGXS)

引用了pg的makefile,这个真好,只需要修改MODULES的就行了。这里pg_config可以用于查看pg的配置:

[postgres@bi ~]$ pg_config –pgxs

/usr/local/pgsql/lib/pgxs/src/makefiles/pgxs.mk

然后将编译后生成的动态库复制到PG的lib目录下。

在数据库中创建函数和调用如下:

CREATE OR REPLACE FUNCTION myencode(text)
RETURNS text AS

‘codetest.so’, ‘myencode’

LANGUAGE c IMMUTABLE STRICT;

弄几个测试例子:


select mydecode(‘’);

select mydecode(‘z255’);

select mydecode(‘z2551’);

select mydecode(‘)7zED5A=’);

函数调用时会出错,数据库连接都断开了。查看后端的日志

[postgres@bi pg_log]$ tail -f /var/applog/pg_log/postgresql-2012-05-10_000000.csv

2012-05-10 13:29:50.765 CST,,,5825,,4f9dc310.16c1,126,,2012-04-30 06:39:12 CST,,0,LOG,00000,”server process (PID 20433) was terminated by signal 11: Segmentation fault“,,,,,,,,

2012-05-10 13:29:50.765 CST,,,5825,,4f9dc310.16c1,127,,2012-04-30 06:39:12 CST,,0,LOG,00000,”terminating any other active server processes”,,,,,,,,

2012-05-10 13:29:50.767 CST,,,5825,,4f9dc310.16c1,128,,2012-04-30 06:39:12 CST,,0,LOG,00000,”all server processes terminated; reinitializing”,,,,,,,,

2012-05-10 13:29:51.219 CST,,,20479,,4fab524f.4fff,1,,2012-05-10 13:29:51 CST,,0,LOG,00000,”database system was interrupted; last known up at 2012-05-10 13:27:38 CST”,,,,,,,,

2012-05-10 13:29:51.228 CST,,,20479,,4fab524f.4fff,2,,2012-05-10 13:29:51 CST,,0,LOG,00000,”database system was not properly shut down; automatic recovery in progress”,,,,,,,,

2012-05-10 13:29:51.269 CST,,,20479,,4fab524f.4fff,3,,2012-05-10 13:29:51 CST,,0,LOG,00000,”record with zero length at BF/1C615314”,,,,,,,,

2012-05-10 13:29:51.269 CST,,,20479,,4fab524f.4fff,4,,2012-05-10 13:29:51 CST,,0,LOG,00000,”redo is not required”,,,,,,,,

2012-05-10 13:29:51.278 CST,,,20479,,4fab524f.4fff,5,,2012-05-10 13:29:51 CST,,0,LOG,00000,”checkpoint starting: shutdown immediate”,,,,,,,,

2012-05-10 13:29:51.294 CST,,,20479,,4fab524f.4fff,6,,2012-05-10 13:29:51 CST,,0,LOG,00000,”checkpoint complete: wrote 0 buffers (0.0%); 0 transaction log file(s) added, 0 removed, 0 recycled; write=0.003 s, sync=0.000 s, total=0.025 s”,,,,,,,,

2012-05-10 13:29:51.304 CST,,,20482,,4fab524f.5002,1,,2012-05-10 13:29:51 CST,,0,LOG,00000,”autovacuum launcher started”,,,,,,,,

2012-05-10 13:29:51.306 CST,,,5825,,4f9dc310.16c1,129,,2012-04-30 06:39:12 CST,,0,LOG,00000,”database system is ready to accept connections”,,,,,,,,

2012-05-10 13:29:52.232 CST,”postgres”,”postgres”,20484,”172.16.15.49:61169”,4fab5250.5004,1,”startup”,2012-05-10 13:29:52 CST,,0,FATAL,42704,”unrecognized configuration parameter “”application_name”””,,,,,,,,

应该还是的内存地址的引用出了问题,原代码中缺少写日志(要写了日志文件调试会好很多)。看了代码decodeBytes 可能会返回NULL,这导致了后续的strlen()函数出错。所以简单地修改了方法,增加空指针判断,如下:

if (p == NULL) {

p = malloc(1);

*p = ‘’;

}

问题得以解决。


BTW. 好久未看代码了,没感觉。