ipv6域名强制解析为ipv4地址

今天使用数据中心的DOI注册功能后,突然发现后台验证的功能无法使用。代码没有动过,怀疑是服务器升级导致产生的,于是再本地升级到最新版后再进行测试发现正常,在服务器上升级后仍然有错误。看了代码,错误是在这一句导致的:

$content=@file_get_contents("http://dx.doi.org/".$row['doi']);

感觉这个代码应该没有问题,ping一下对应的网站,发现其默认是解析到ipv6网络了,同时ipv6网络不通,所以导致了这个问题。

临时解决办法:在/etc/hosts中将对应的域名直接解析为ipv4地址。

用SQL的正则处理人名的缩写问题

数据中心的数据在向期刊进行投稿时,通常需要对数据引用有一定的格式变换。比如,Nature Scientific Data期刊,对Data Citation部分的建议是:

1. Lastname1, Initial1., Lastname2, Initial2., … & LastnameN. InitialN. Repository_name Dataset_accession_number_or_DOI (YYYY).

数据中心的数据作者在数据库中是有记录的,其通过一个表存储:

CREATE TABLE datadoi
(
id serial NOT NULL,
doi character varying(250) NOT NULL DEFAULT ''::character varying,
authors text[],
uuid uuid,
author_en text[],
CONSTRAINT datadoi_pkey PRIMARY KEY (id),
CONSTRAINT datadoi_doi_key UNIQUE (doi)
)

 

可以看出,作者是通过一个字符串数据存储。在PostgreSQL中,数组是通过如下形式记录的:

{value1,value2,…}

对于数据的作者信息,数据中心则要求其通过如下的形式记录到数据库中:

Wang Yijia, Zhang Eryi,…

而为了满足期刊的投稿要求,则需要将格式转换为:

Wang Y., Zhang E.,…

在数据库里,最终通过这样的形式进行处理:

select translate(regexp_replace(datadoi.author_en::text,'\s+(\w)\w*"',' \1.','g'),'{}"','')

 

即,将数组转换为字符串,剔除大括号,用逗号区分不同作者,用空格区分作者的姓和名,提取名的首字母,然后全局替换即可。

从svn转换到git

数据中心之前的代码一直使用svn进行管理,现在team已经转换到git了。需要将之前的版本代码也全部转换到git了。
转换步骤在这本git书中有详细的说明:
但在试验过程中,发现有几处地方不能完整执行,需要进行修改。修改后的代码如下:
#clone metadata
git svn clone https://svn.westgis.ac.cn/svn/westdc/metadata --authors-file=users.txt --no-metadata --stdlayout westdc-zf1

#convert tags to local
git for-each-ref refs/remotes/origin/tags | cut -d / -f 5-| grep -v @ | while read tagname; do git checkout -b "$tagname" origin/tags/$tagname; git checkout master; git tag $tagname $tagname;git branch -D "$tagname";git branch -r  -d "origin/tags/$tagname";done

#convert branches to local
git for-each-ref refs/remotes | cut -d / -f 4- | grep -v @ | while read branchname; do git checkout -b "$branchname" origin/$branchname;git branch -r -d origin/$branchname; done

git remote add origin git@git.westgis.ac.cn:westdc/westdc-zf1.git
git push origin --all
git push origin --tags

 

国家科技报告服务系统

在去年年底收到了这个邮件:

 根据国务院办公厅转发科技部《关于加快建立国家科技报告制度的指导意见》的部署,科技部正在联合科字口部门,全面开展了国家科技报告制度建设工作,推动我国政府资助项目所产生科技成果的完整保存、持续积累、开放共享和转化应用。目前科技部开发建设了“国家科技报告服务系统”,已将科技部、自然科学基金会、交通运输部等部门资助项目的科技报告向社会公众提供开放共享服务。
科技报告全面记载了政府资助项目的研究过程、技术细节和所取得的成果,内容翔实丰富,极具参考价值。欢迎您访问“国家科技报告服务系统”(http://www.nstrs.cn/),实名注册后可免费浏览科技报告全文。

当时粗看了网站。近期详细浏览了网站,记录一下个人的使用:

地方科技包括了两个省份:辽宁、浙江、安徽、山东、四川、陕西,国家部门包括科技部、基金委、交通部,目前共收录报告4万多份,科技部最多。

网站最大的问题,搜索功能不明显,(我开始还以为不支持搜索),通过站点地图功能找到了搜索链接:

http://www.nstrs.cn/CommonPeople.aspx

其次,这个网站的数据共享策略也比较令人意外:

国家科技报告服务系统于2014年3月1日正式上线。系统开通了针对社会公众、专业人员和管理人员三类用户的服务。向社会公众无偿提供科技报告摘要浏览服务, 社会公众不需要注册,即可通过检索科技报告摘要和基本信息,了解国家科技投入所产出科技报告的基本情况。向专业人员提供在线全文浏览服务,专业人员需要实名注册,通过身份认证即可检索并在线浏览科技报告全文,不能下载保存全文。科技报告作者实名注册后,将按提供报告页数的15倍享有获取原文推送服务的阅点。向各级科研管理人员提供面向科研管理的统计分析服务,管理人员通过科研管理部门批准注册,免费享有批准范围内的检索、查询、浏览、全文推送以及相应统计分析等服务。

公众不能查看全文,专业人员给予一定初试积分(在数据库中的贡献,而且贡献是按照页数来计量),然后采用相当于积分式的方法进行全文管理。对于这种共享策略可以理解,但作为国字头的单位,感觉不够大气。

使用cloudflare CDN构建网站

cloudflare提供了免费的CDN(内容分发网络),周末实际试验了一次。

首先要注册,登陆后需要将现有的网站对应的dns解析都重新在cloudflare实现,包括A记录、MX记录等,设置完成后要将对应的nameserver解析到cloudflare的nameserver。登上一段时间后就可以自动代理内容了。

使用cloudflare存在的问题,主要是访客IP地址的解析问题,其自身提供了一个访客分析系统,但通常我们都还希望使用自己的访客分析系统,以及google analytics或piwik等,甚至直接解析apache log。google analytics有插件,可以在cloudflare上直接设置,piwiki上有一段专门的代码可以设置cloudflare访客。但apache log需要安装一个单独的mod来处理,暂时还没有试验。

解析完成后,ping对应的域名地址,就是cloudflare的ip了,同时提供了免费的ssl证书(这点不错)。

多表的合并查询SQL

数据中心的专题文献,涉及到多个表。前期是保存到mdref表,通过类型字段定义,现在又增加了一个新表,专门用来管理专题文献。而有的时候,可能两个表的专题都会涉及到。因此SQL查询比较复杂。

需求:

1. 保留两个表的数据

2. 保持文献的排序

最终SQL如下:

select  r.* from reference r right join
(
select refid,place from (
(
select sr.refid,sr.place from sourceref sr left join datasource ds on ds.sourceid=sr.sourceid
where ds.uuid='55667374-fe5c-4c98-8756-37e3b5496d5e'
order by sr.place
)  
union
(
 select mr.refid,mr.place from mdref mr where  mr.reftype=4 and mr.uuid='55667374-fe5c-4c98-8756-37e3b5496d5e' and mr.refid not in (
select sr.refid from sourceref sr left join datasource ds on ds.sourceid=sr.sourceid
where ds.uuid='55667374-fe5c-4c98-8756-37e3b5496d5e'
)
)
) a
) p on r.id=p.refid order by p.place

用到了union、临时表。

 

使用tilestache构建瓦片地图服务器

Tilestache是一款开源的瓦片地图服务器,其安装和使用较简单,但官方的文档感觉还是偏简单了些。在这儿记录一下最近安装和使用tilestache的方法。

1、 安装

在Ubuntu服务器上安装tilestache还是比较简单的:

sudo apt-get install tilestache python-pil python-gdal

tilestache默认并没有绑定python-pil和python-gdal两个库,若开始只是安装了tilestache,后面可能可能会出现返回空白地图的问题。

2. 使用

tilestache使用时要构建一个cfg的配置文件,同时若采用mapnik来进行渲染,还必须提供每个对应图层的渲染配置文件。

一个简要的配置文件示例如下:

{
  "cache": {
    "name": "Disk",
    "path": "cache/"
  },
  "layers":
  {
   "landuse2005":
        {
        "provider":{"name":"mapnik","mapfile":"landuse2005.xml"}, "projection": "spherical mercator",
        "preview":   {        "lat": 33.4,       "lon": 97.3,        "zoom": 15      }
        },
    "roads":
   {
        "provider":{"name":"proxy","url":"http://tile.openstreetmap.org/{Z}/{X}/{Y}.png"},
	"preview":   {        "lat": 33.4,       "lon": 97.3,        "zoom": 15      }
    }
  }
}

示例中有两个图层,landuse2005采用mapnik进行渲染,roads采用OSM的瓦片并直接进行代理。mapnik的渲染文件入门不易,可以采用tilemill来生成处理。

3. 预制瓦片

上述图层的landuse2005应该预先生成,用户访问时才能提高速度。tilestache同时也提供了一个程序来生成:

tilestache-seed -b 31.8 89.3 36.3 102.3 -c tilestache.cfg -l landuse2005 10 11 12 13 14 15

4. 启动

最简单的方法就是使用tilestache-server来启动对应的服务:

tilestache-server -c tilestache.cfg -i 192.168.13.13

参数比较简单,-i就是要绑定的网络接口,然后用浏览器访问:

http://192.168.13.13:8080/landuse2005/preview.html

 

 

使用SQL分析thunderbird的来往邮件

数据中心的公共服务邮箱已经积累了2万多封邮件(约4.5gb),因此想分析一下这些邮件的信息,比如,收件箱中都有哪些类型的邮件?逐年逐月的邮件分布情况如何?收件箱中的邮件是否存在什么分布规律,包括小时、周、月等?而为了解决这些问题,就需要对这些邮件信息进行分析,首先想当然的是用SQL方法来分析,但通过搜索后发现,科学院的邮箱不支持SQL操作,在WEB管理界面上可以通过高级搜索完成一些对应的搜索功能,但若搜索的邮件数量超过了1000封,则WEB界面也只能返回前1000条记录,因此不能满足我们的实际需求。

而邮件客户端,通常也没有这些功能。在搜索开源的thunderbird邮件客户端后,发现曾经也有人曾经提问过类似的问题:Query Thunderbird Inbox from a SQL database,但当时的说法是不支持。继续搜索后发现thunderbird的目录下存在一个sqlite文件:global-messages-db.sqlite,官方的说法这是一个全局搜索库。

打开后发现基于这个数据库,基本就可以满足我们的需求,主要是对其中两个表的查询:messages和messagesText_content,这两个表的结构如下:
CREATE TABLE messages (id INTEGER PRIMARY KEY, folderID INTEGER, messageKey INTEGER, conversationID INTEGER NOT NULL, date INTEGER, headerMessageID TEXT, deleted INTEGER NOT NULL default 0, jsonAttributes TEXT, notability INTEGER NOT NULL default 0)
CREATE TABLE 'messagesText_content'(docid INTEGER PRIMARY KEY, 'c0body', 'c1subject', 'c2attachmentNames', 'c3author', 'c4recipients')

其中,messages表的id字段和messagesText_content的docid字段应该是一致的(相当于外键)。经过探索,发现messages中的date字段需要先除以1000000,然后再转换为本地时间戳。

使用SQL处理逐年的邮件分布情况就可以这样:
SELECT strftime('%Y',date/1000000,'unixepoch','localtime'),count(id) FROM messages where folderid=206
group by strftime('%Y',date/1000000,'unixepoch','localtime')

Scientific Data: A comprehensive database of the geographic spread of past human Ebola outbreaks

Scientific Data上新出了一篇文章:埃博拉病毒传播数据库,估计会得到比较大的关注。
A comprehensive database of the geographic spread of past human Ebola outbreaks

数据文章的引用方式为

Mylne, A. et al. A comprehensive database of the geographic spread of past human Ebola outbreaks. Sci. Data 1:140042 doi: 10.1038/sdata.2014.42 (2014).

数据是放在figshare上的:
http://dx.doi.org/10.6084/m9.figshare.1168886

科学发布平台:期刊与数据的融合?

F1000的CEO Daniel Marovitz发表了一篇博文,唱衰科学期刊的发展前景:Science Journals Have Passed Their Expiration Date — It’s Time for the Publishing Platform

Technology has helped so many industries evolve over the past few decades, but scientific publishing, surprisingly, has hardly changed since the first journal article in 1665. They must; their day is done. Their continuing existence damages science.

其列举了几个重要原因:

  • The use of an arbiter (Editor) in science
  • Extensive delays
  • The public trust
  • Anonymous peer review
  • Missing data

匿名评审在非开放时代很有作用,但在开放的网络社会所能起到的作用并没有那么大。
其提出了一个新观点,科学需要一个新的发布平台而不是期刊。

What the world needs are publishing platforms, not journals.

文章和数据都应在发布平台进行发布,这是其对科学发布平台的期望。科学应该进入一个新时代。