使用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
}

csvquote: smart and simple CSV processing on the command line

在处理csv文本发现awk不能直接处理引号内包括逗号的数据,比如:

field1,"field2, has a comma in it","field 3 has a ""Quoted String"" in it"

这是可以使用csvquote工具来处理了,此工具需要源代码安装,代码地址:https://github.com/dbro/csvquote

Are you looking for a way to process CSV data with standard UNIX shell commands?

Are you running into problems with embedded commas and newlines that mess everything up?

Do you wish there was some way to add some CSV intelligence to these UNIX tools?

awk, sed
cut, join
head, tail
sort, uniq
wc, split
This program can be used at the start and end of a text processing pipeline so that regular unix command line tools can properly handle CSV data that contain commas and newlines inside quoted data fields.

ubuntu @aliyun 缺少syslog问题

之前使用过程中一直没有注意,今天在调试incron的时候才发现/var/log下没有syslog日志。

搜索到这个帖子:https://bbs.aliyun.com/read/286708.html

看了后,发现问题在rsyslog的配置文件中:/etc/rsyslog.d/50-default.conf

注意这一行:

*.*;auth,authpriv.none -/var/log/syslog

把/var/log/syslog前面的减号去掉就可以解决此问题。

同时,帖子里还提到了目录权限问题:

chown -R syslog:adm /var/log

使用exiftool提取照片中的经纬度

exiftool工具可以对exif信息进行很多的操作。默认情况下:

exiftool a_geo.jpg

会显示各种默认的exif信息,包括经纬度。但默认显示的经纬度是度分秒格式,而我现在需要dd格式的经纬度,则可以这样提取:

exiftool -n -gpslatitude -gpslongitude IMG_3545.JPG

显示的结果为:

GPS Latitude : 42.3176472222222
GPS Longitude : -83.7321083333333

遭遇QGIS的一个crash bug:control feature rendering order

“Control feature rendering order”是QGIS一个很好的特性,特别是在点位密集的时候,若要根据不同属性展示重要性程度的时候。
但在点位数据量较大的时候,会引起QGIS崩溃。之前也遇到了一次,但当时是想办法绕过了(让点位按照真实世界的尺寸进行绘制,从而避免重叠问题)。这次遇到同样的问题,就仔细测试了一下,看看到底是什么问题。
1. 是否是数据格式的问题
原始数据是csv格式,尝试将其转换为shape file以及导入到postgis数据库。发现依旧是崩溃。

2. 是否是数据排序的问题
将原始数据按照期望的顺序进行事先排序,在不选择control feature rendering order时,绘图结果是满足需求了。但选择此绘图特性后,结果依旧。

3. 是否是数据大小的问题
将原始数据逐步缩小数据量,发现在3.05万行-3.1万行之间是个分水岭(大约1M数据量)。3.05万行不崩溃,3.1万行崩溃。说明此问题和内存相关?

4. 是否版本的影响?
尝试了2.18-0,2.18-2两个版本,以及mac sierra 10.12.2, 10.12.3两个版本,不影响测试结果。

5. 是否受操作系统的影响?
在virtualbox虚拟机里的ubuntu 16.04,QGIS 2.14版本,虽然很慢,但不崩溃。

尝试将此bug汇报给qgis开发组,但找了很久file bug的地方,最终发现还需要osgeo的账号,幸亏很久之前注册过账号,找回密码后提交了:

http://hub.qgis.org/issues/16025

BTW:祝新年快乐!

QGIS中TimeManager的一个问题修复

在QGIS中使用TimeManager时遇到一个问题,即满足时空要素要求后,时空数据展示不出来。点击数据的layer查看发现其对应的sql语句大概是:
dbname='citybigdata' host=localhost port=5432 sslmode=disable key='id' srid=4326 type=Point table="qqheat"."milocal" (geom) sql=cast("ts" as character) < '2016-11-09 21:05:00' AND cast("ts" as character) >= '2016-11-09 21:00:00'
将类似的语句直接在psql中发现执行的时候有问题,无法返回结果。但将语句修改一下即可解决:
dbname='citybigdata' host=localhost port=5432 sslmode=disable key='id' srid=4326 type=Point table="qqheat"."milocal" (geom) sql=cast("ts" as text) < '2016-11-09 21:05:00' AND cast("ts" as text) >= '2016-11-09 21:00:00'
即将其中的character改成text即可。
为了使插件工作正常,就需要修改timemanager的代码,使用grep工具找到该代码的位置:

cd .qgis2/python/plugins/timemanger
grep -rnw ‘.’ -e ‘character’

发现是如下代码的问题:

./.git/hooks/pre-commit.sample:26:# printable range starts at the space character and ends with tilde.
./CONTRIBUTING.md:13:* Go to http://www.loc.gov/standards/iso639-2/php/code_list.php and find the 2-character ISO 639-1
./docs/Doxyfile:586:# This tag can be used to specify the character encoding of the source files
./query_builder.py:9:STRINGCAST_FORMAT = ‘cast(“{}” as character) {} \'{}\’ AND cast(“{}” as character) >= \'{}\’ ‘
./query_builder.py:56: return ‘ cast(“{}” as character) LIKE \’%BC\”.format(attr)
./query_builder.py:63: return ‘ cast(“{}” as character) LIKE \’%AD\”.format(attr)
./query_builder.py:79: return ” ‘{}’ {} cast(\”{}\” as character) “.format(val, comparison, col)
./query_builder.py:87: return ” ‘{}’ {} cast(\”{}\” as character) “.format(val, comparison, col)

将具体的代码修改,然后重启qgis,即可工作正常。

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')

shell下定时监测程序的死锁

这几天在处理微博爬虫。由于各种原因,爬虫经常为会出现网络错误断开连接,有时莫名其妙的程序锁死(程序在运行,但其实没有任何输出结果显示在运行)。因此就产生了一个定时检查所运行脚本的脚本,或者就在脚本中定时检查。但又不能将检测程序放入cron中,因为程序kill掉后还要继续向前运行。

处理方法如下:
1. 爬虫脚本将结果输出到某log文件中
2. 若log文件在一定时间内未发生变化,而且爬虫脚本还在运行,那可以认定此时程序锁死。
3. 处理锁死程序,直接kill掉,然后继续时间循环。

脚本运用了pgrep(获取某运行程序的pid)、pkill(杀死某程序)。

#!/bin/bash

#only works in Linux shell
startdate='2016-07-03'
for i in {0..7};do
echo "Running time:"`date`
tododate=`date -d "${startdate} $i days" +%Y-%m-%d`
logfile="weibo-${tododate}.log"
python -u weibo-num.py $tododate >$logfile 2>&1 &
while sleep 120;do
cmd=`pgrep -f "weibo-num.py ${tododate}"`
delta=$((`date +%s`-`date -r $logfile +%s`))
if [ ! -z $cmd ] && [ $delta -ge 900 ];then
pkill -f "weibo-num.py ${tododate}"
break
elif [ -z $cmd ]; then
break
fi
done
done