使用gnuplot批量画图

处理数据使用gnuplot画图,遇到一个需要批量画图的需求,即将2年的数据,以每28天一张图绘制,一共大概绘制26张左右。

在gnuplot中,也可以使用do循环来绘制,就是在处理时间变化的时候要注意,代码如下:

set xdata time
set timefmt "%Y-%m-%dT%H"
set xtics format "%Y-%m\n%H:%M" nomirror

set term png size 1600,1200
date1=strptime("%Y-%m-%dT%H",'2015-01-01T0')
do for [t=0:25] {
outfile = sprintf('shanghai-hourly-%03i.png',t)
set output outfile
set multiplot
set size 1,0.5
set origin 0,0.5
clear
date2=date1+(14*24-1)*3600
set xrange [date1:date2]
plot 'weibonum-shanghai-hour.txt' u 1:3 w lp t ''
set origin 0,0
clear
date1=date2+3600
date2=date1+(14*24-1)*3600
set xrange [date1:date2]
replot
unset multiplot
unset output
date1=date2+3600
}

Install psycopg2 on mac sierra

需要在我的mbp上进行数据入库测试,因此就需要安装psycopg2,但安装的时候一直有提示:

ld: library not found for -lssl

clang: error: linker command failed with exit code 1 (use -v to see invocation)

开始搜索以为库的位置不对,比如之前类似的问题:http://stackoverflow.com/questions/27264574/import-psycopg2-library-not-loaded-libssl-1-0-0-dylib

后来感觉不太对,又加上sierra关键词找,果然找到一个类似问题:
http://stackoverflow.com/questions/39767810/cant-install-psycopg2-package-through-pip-install-is-this-because-of-sierra
发现解决方法非常简单,就是安装xcode-select工具。

xcode-select –install

然后再安装psycopg2就没有任何问题了:

sudo pip install psycopg2

python下非常规utf8编码处理

最近在和微博页面打交道,发现微博返回的页面数据多数都是内嵌在javascript下的,而带来的后果就是其中的中文字符是json编码后的utf8编码。
而在python程序中获取页面后得到的结果大致有这样的字符:
"\u003Cp\u003E"
在python中这样可以直接打印出来:
print u"\u003Cp\u003E"
但作为一个变量,不能这样简单处理,需要进行编码转换:
str="\u003Cp\u003E"
print str.decode('unicode-escape')

php中数组到字符串的键值变换

简单而言,遇到了这么一个需求:

$db_config=array('host'=>'localhost','user'=>'u','password'=>'p','dbname'=>'test');

 

需要将其转换为:

$pg_link="host=localhost user=u password=p dbname=test";

 

一开始是想到用imlode实现,但发现有问题,不能处理键名。搜索后发现可以用http_build_query函数实现这个需求,即:

$pg_link=http_build_query($db_config,'',' ');

 

git检出轻量分支

有时有检出轻量分支的需求,即只检出某一分支的最新版本,不需要其对应的历史信息,但以后的新的版本信息可能是需要的。

这时可以使用depth参数指定版本深度。

比如,只检出当前版本的master分支:

git clone --depth 1 git@git.westgis.ac.cn:westdc/version-multiple-update

 

若要检出非master分支,可以使用b参数指定:

git clone --depth 1 -b card git@git.westgis.ac.cn:westdc/westdc-zf1

 

git检出单独一个分支

有时候,只想从版本库中clone出一个单独的分支来(比如,网站发布的代码),其他相关分支并不需要检出。

这时直接使用 git clone出整个版本库就显得不合适了。搜索了一下,发现这个需求很多,在stackoverflow上有几个相关答案:

这个问题里,回答中最认可的是这个:

git clone <url> --branch <branch> --single-branch [<folder>]

 

但这个回答和我的实际情况稍有不同,我的代码之前是用svn管理的,在服务器上已经使用svn方法发布了,使用这个命令就提示错误了:

git clone  -b qinghaihu --single-branch .

因为当前目录上已经有对应文件了,若是发布到一个新目录下则没有这个问题。

从另一个问题中找到了答案:

即:

cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout -f $BRANCH

注意最后一个checkout命令加了一个-f参数,这样就可以强制覆盖已有文件。

基于git系统发布网站代码

网站的开发版本管理系统从svn切换到了git,之前更新网站的代码方法是ssh到服务器上,然后sudo svn update即可,但采用git后,若采用git clone的方法更新代码,会导致每个网站都是一个完整的代码系统,不是太合适。

从网上搜索了几个基于git发布网站代码的文章,多数都是采用的这个blog里提供的方法:

http://sebduggan.com/blog/deploy-your-website-changes-using-git/

但是这个blog的方法测试下来也有问题,即通常网站代码的发布的用户会是www-data,而此blog的方法会产生写权限问题。

继续搜索到另一个blog,解决了这个问题:

https://halfthetruth.de/2011/09/13/using-git-to-deploy-a-website/

即将git放到sudo里,让其可以自动指定用户进行更新,最终按照这个blog的方法进行了部署。

主要方法记录如下:

1. Web服务器端

建立一个空git目录,

mkdir website.git && cd website.git
git init --bare

并创建hook脚本:

$> cat website.git/hooks/post-receive
#!/bin/bash
GIT_WORK_TREE=/var/www/domain.com/ git checkout master -f 
$> chmod +x website.git/hooks/post-receive

同时也要修改sudoers文件:

username ALL=(ALL) NOPASSWD: /usr/bin/git

2. 本地机器

在git版本库中指定一个remote,并push某一个branch到web服务器。

git remote add web ssh://webserver/path/to/website.git
git push web master

 

 

php的数组与postgresql中的数组之间的转换处理

数据中心的DOI在设计时采用了PostgreSQL的数组类型来进行处理,因此在代码中涉及到PHP的数组和PostgreSQL数组之间的转换。其中比较麻烦的就是字符串数组之间的相互转换,因为涉及到转义的问题。

PostgreSQL的数组是这样存储的:
{"a1 a2","a2 a3","a3,a4"}
这就是PHP从PostgreSQL中直接读取出来的结果。要是不考虑逗号的转义,通常可以用函数来处理:
$phparray=explode(',',substr($pgarray,1,-1));
要考虑逗号的转义,网上通常有两种方法,一种是正则方法进行处理,一种是在PostgreSQL中转换为json进行处理(9.2版本以后支持)。个人推荐采用json转换的方法进行处理,应用范围更广。即:
在sql中使用array_to_json()函数转换为json字符串,然后在php代码中使用json_decode()函数转换为字符串。

而从PHP数组转换为PostgreSQL数组则稍显麻烦一些,可以用字符串方法进行(即组合成pg中的数组形式),也可以用array数组函数来组合。推荐采用array数组进行组合,这样可以避免处理逗号转义的麻烦(非常麻烦)。
SQL示例如下:
insert into table1 (id,pgarray) values(10,array['a1','a2,a3','a4,a5']);

在ubuntu 14.04下升级gitlab

之前在服务器上安装了gitlab 7.2.1版本,目前gitlab已经升级到7.5.3版本了,因此需要进行升级。

按照官方的升级说明,首先下载新版本的软件包,然后:

sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq 
sudo gitlab-rake gitlab:backup:create 
sudo dpkg -i gitlab_7.5.3-omnibus.5.2.1.ci-1_amd64.deb 
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

然后按照之前的办法修改端口,不过注意nginx的配置文件换了一个目录下:

/var/opt/gitlab/nginx/conf

之前是在etc目录下。

解决一个使用天地图中的bug

此前曾在使用地图搜索过程发现一个天地图的Bug,见此地址。今天重新翻起此Bug,看能否解决,测试了几个失败的方法后,在调试中发现中此图的空间位置数字都带引号:
tbounds-bug
突然想到会不会和变量类型有关系,即纬度的变量可以从字符串转换为数字,而经度没有能转换,所以导致了这个Bug呢?
于是修改代码,强制类型转换:
function InputValueChange(){
if(MapInputValueCheck() == true)
{
map.clearOverLays();
var p1=new TLngLat($(input.west).val(),$(input.south).val());
var p2=new TLngLat($(input.west).val(),$(input.north).val());
var p3=new TLngLat($(input.east).val(),$(input.north).val());
var p4=new TLngLat($(input.east).val(),$(input.south).val());
map.setViewport(new Array(p1,p2,p3,p4));

var west=parseFloat($(input.west).val());
var east=parseFloat($(input.east).val());
var north=parseFloat($(input.north).val());
var south=parseFloat($(input.south).val());
var bounds = new TBounds(west,south,east,north);
rect = new TRect(bounds);
map.addOverLay(rect);
}
}

然后重新测试,发现问题果然解决!

回头来看,说明这个bug应该还是天地图的问题,其应该在输入变量中进行强制类型转换。