在ubuntu 16.04上安装vpn:l2tp/ipsec

有一台海外主机,之前都是用ssh -D来翻墙,结果最近不太好用了。于是就尝试在服务器上安装一个vpn。
第一次搜索尝试了pptpd,安装是非常简单。但在客户端测试的时候傻眼了,mac osx 10.12现在不支持pptp了,需要用l2tp/ipcsec。
在网上找到了一个安装脚本:
https://github.com/hwdsl2/setup-ipsec-vpn
安装非常简单:
wget https://git.io/vpnsetup -O vpnsetup.sh && sudo sh vpnsetup.sh
但要注意,加入服务器默认的外部网卡接口不是eth0,可能需要进一步修改。在我的这台机器上,对外网络接口是在eth1,因此需要将/etc/iptables.rules文件中的eth0都替换为eth1,然后重启服务器。

客户端也可以考虑一个分流方案,即国内网站不走vpn,国外网站都走vpn,参考:
https://github.com/ranmocy/chnroutes
安装比较简单:

  1. 在终端中执行python chnroutes.py -p mac -t ipsec,这将生成phase1-up.sh和phase1-down.sh两个文件;
  2. Mac OS X 系统支持 Cisco IPSec 的后台使用的是 racoon,但是不会像 PPTP 一样自动调用启动脚本,如果需要自动调用脚本,需要自己修改配置文件,并自己从命令行启动;
  3. 推荐手动执行phase1-up.sh设置路由表;而只有在网络环境变化的时候,需要运行phase1-down.sh再运行phase1-up.sh来重新设置路由表。

使用letsencrypt激活网站https

现在使用letsencrypt来激活https已经非常简单了。ubuntu 16.04下可以使用certbot工具来快速激活。

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-apache

然后,激活某网站的https:
sudo certbot --apache -d example.com
letsencrypt默认90天生命期,可以使用cron每月更新一次:
0 2 1 * * /usr/bin/certbot renew --quiet

使用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,即可工作正常。