台湾周末两日游

趁着台湾出差的机会,周末在台北、基隆玩了两天,简单写个游记。

交通:

  • 推荐在任何便利店(比如7-11)买张悠游卡,方便坐火车和捷运。
  • 在台北基本上靠捷运,在基隆基本上靠打车。
  • 台北-基隆之间的交通就靠火车了,台北火车站、松山火车站都有班车到基隆火车站。

住宿:

  • 因为平时工作的地方在七堵,离基隆比较近,所以就住在基隆了;
  • 基隆似乎是个比较老的城市,推荐住长荣桂冠酒店,目测4星;
  • 但是只能订到两晚的长荣桂冠,剩下的日子住在了欧香精品商旅,非常不推荐——小,吵,卫生状况一般,wifi等于没有,唯一的优点在于它就在基隆庙口,下楼就是夜市。

游:

周六一整天逛了台北,从台北火车站,沿着捷运的线路一路玩。

* 中正纪念堂

蒋校长在国内的宣传中一直是反动派,不过我们都知道抗日的主力军是谁。
在台湾能看到校长的另一面,显然,地位要高太多了,大概也是按最高领导人的待遇来纪念的吧。
纪念堂挺大一块地方的,好多厅都有不错的展览,推荐一逛,我在这儿有晃荡了3个小时。
中正纪念堂_1中正纪念堂_2中正纪念堂_3

纪念堂的对面,过条马路就是国家图书馆,走过去晃荡了一下,似乎要办了证才能进去,于是就到此一游了。
国家图书馆

 

* 101大楼

逛完中正纪念堂,已经12点多了,坐捷运到了101大楼。
楼底有很多吃的,看到一家”米其林北海道介绍店“的梅光轩,它家的面确实不错!
101大楼_1101大楼_2101大楼_梅光轩

本来想去101大楼的楼顶去看看风景的,但是想想已经爬过魔都的100层了,风景也就那样了,于是去周边转了一圈。
发现旁边的世贸正好有漫画展,而且有海贼王的特展,正好进去逛了一圈,买了件OnePiece路飞的衣服和小纪念品~
漫展_2漫展_3漫展_1漫展_4

 

* 国父纪念馆

捷运往回坐,然后转两条线到了国父纪念馆,国父孙中山在国内和台湾的地位都很高,作为曾经在南京呆过7年去过若干次中山陵的人,国父纪念馆也是必去的了。
插个题外话,PokemonGo正好在台湾流行中,我在这里抓到两只皮卡丘!
相比起中正纪念堂,国父纪念馆的规模似乎要小一点,展厅似乎也少了一些,不过这里还有各种其它展览(书法、绘画),还有常年都在旁边跳舞的团体,也算是个大众文化中心了。不错。
国父纪念馆_1国父纪念馆_2国父纪念馆_3国父纪念馆_4

顺便一提,这里看101大楼的视角要比在101大楼底要好太多了。
国父纪念馆_101大楼

 

* 诚品书店

从国父纪念馆出发,可以走路去诚品书店,大概不到2公里路,我逛累了,往回坐了一站捷运少走了些路。
本来以为,诚品书店总店应该是个规模很大的地方,到了才发现,”果然”跟想像得不一样。书店占了写字楼里2F一层,其实不是很大,尤其是跟南京的先锋书店里,规模还是小多了。不过书确实很多,也很多人或坐着椅子或坐在地上看着书,氛围挺好的。
B2层还有诚品的文具馆、儿童馆、音乐馆,音乐馆的感觉不错。
诚品书店_1诚品书店_2诚品书店_3诚品书店_4

逛完诚品书店,下午5点多了,跟Bob汇合吃了个晚饭,坐火车滚回基隆。。。

周日

查了一些基隆的景点,发现北边有个国立海洋科技博物馆,附近有八斗子海滨公园和著名的望幽谷,决定主要去那边玩。
这一天太阳很大,天热,正好适合室内的活动——于是先去了海洋科技博物馆。
海洋科技博物馆

地方其实挺偏僻的感觉,不过这个博物馆很新很干净,7层楼,1、3、5、7有各个展厅,旁边还有剧场、探索馆之类的地方。
整体感觉,跟上海科技馆类似,分主题的展厅,但大都是模型、视频 介绍,有部分互动的可以做实验的东西(但有部分是维护中…)。但不管怎么说, 是个非常适合带小朋友过来学习的地方!
海洋科技博物馆_2海洋科技博物馆_3海洋科技博物馆_4

从博物馆出来,沿着一条小路往山上爬上1~2公里,就来到了八斗子海滨公园。
这是一个开放的公园(好评!)有各种山路和明确的指示牌,所以很方便闲逛。
在山顶上,往北就是蔚蓝的大海,往西南就是八斗子海港,风景很赞。下面的山谷,据说走到这儿,看着风景就能忘却各种烦恼,于是被称为忘忧谷,又
名望幽谷。在这里,随便用手机拍点照片,都能当桌面背景~
望幽谷_1望幽谷_2望幽谷_3

然后打车回基隆市,半路上有个叫做”海门天险”的地方,是清代台湾防守基隆港的军队驻扎地,有一些炮台。
既然叫”天险”,果然又是要爬山的(天好热!)。爬到山顶(其实也就一小会儿),能看到炮台阵地,可惜都是复原过的模型,不是实物。不过从位置看,确实是个防守的好地方——往北正对着基隆港,要是敌船来犯,正好是炮弹的火力范围。
海门天险_1海门天险_2海门天险_3

从海门天险回来,赶紧回酒店休息了,两天的行程就是这样。

Share

用gzip 1.7+配合rsync实现备份的快速传输

Backround

定期备份VPS的特定目录是一个常见的需求。一般来说,备份分为如下步骤:

  1. 会用tar来打包
  2. 用压缩工具(如gzip/bzip2/xz)压缩
  3. rsync来传输备份文件

比如说我定期备份博客目录的命令如下:

tar -cf - --exclude=/srv/www/wordpress/logs --exclude=/srv/www/wordpress/wp-content/cache /srv/www/wordpress/ | gzip - > ~/backup/wordpresss.bak.tar.gz

然后有另外的rsync脚本传输wordpresss.bak.tar.gz

Problem

只要wordpress里的任何一个文件/目录有任何改动,比如说时间戳变了,每次备份产生的tar.gz都完全不一样,这样rsync传输文件的时候每次都需要完整传输几乎所有的内容,即浪费时间也浪费流量。
比如说,我的博客备份的一次完整的传输在网络条件一般的情况下可能需要几十分钟!

Solution

gzip1.7开始正式提供 --rsyncable选项,使产生的压缩包对rsync更友好,方便rsync作delta传输。
虽然VPS上只有1.6版本,但是开源的好处就是大家可以自己编译:

  1. 到 https://ftp.gnu.org/gnu/gzip/ 下载1.7版本的gzip(最新的已经是1.8了)
  2. configure, make and install
  3. 添加--rsyncable选项到备份的命令里:
    tar -cf - --exclude=/srv/www/wordpress/logs --exclude=/srv/www/wordpress/wp-content/cache /srv/www/wordpress/ | gzip --rsyncable - > ~/backup/wordpresss.bak.tar.gz
    

Result

效果很明显,rsync的传输时间从几(十)分钟减少到几十秒钟,speedup大约在700左右。
节省了时间和流量 🙂

Share

大学毕业10周年

2006年毕业,一转眼,10年过去了。趁着2016年的校庆日,02cs也回到母校相聚。

感谢黄书剑博士的精心组织,活动搞得很不错,T恤很好玩,纪念品也很赞。
IMG_20160521_143043
话说,好多人还不知道为什么是T shirt上有蓝色的鲸鱼呢…

周老师虽然年过80,但还是那么帅!
mmexport1463834579756

506&508
mmexport1463884128199

趁这个机会,正好带着老婆女儿去南京玩一趟,还能带小依依到南大看看——姑娘,不到5个月你就已经在高等学府待过了噢 ^_^
IMG_20160520_161433

Share

Enable HTTP2 for WordPress on nginx Ubuntu 14.04

HTTP2 is enabled on mainline version of nginx (v1.9.x), while Ubuntu 14.04 is using nginx 1.4.6.
To enable HTTP2, the simplest way is to upgrade nginx to the mainline version.
But I met several issues during the upgrade, and here’re the steps, the issues and solutions.

Upgrade to mainline nginx

Let’s use nginx’s official pre-built packages.

  • Add below lines into /etc/apt/sources.list.d/nginx.list
    sudo sh -c 'echo deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx >> /etc/apt/sources.list.d/nginx.list'
    sudo sh -c 'echo deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx >> /etc/apt/sources.list.d/nginx.list'
    
  • Add nginx apt key
    wget -q -O- http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
    
  • Update ans install nginx
    sudo apt-get update
    sudo apt-get install nginx
    

However, it fails with error that it tries to overwrite nginx-common’s file:

dpkg: error processing archive /var/cache/apt/archives/nginx_1.9.11-1~trusty_amd64.deb (--unpack):
 trying to overwrite '/usr/share/nginx/html/index.html'

The solution is to remove old nginx on Ubuntu and re-install mainline nginx.

sudo apt-get remove nginx-common
sudo apt-get install nginx

Now nginx is upgraded to 1.9.11

Config file changes

  1.   Previously the site config files are stored in /etc/nginx/site-available, and the enabled sites are soft-linked in /etc/nginx/site-enabled/.
    But mainline nginx only load config files in /etc/nginx/conf.d/*.conf.
    So either copy the old config files to conf.d, or add include /etc/nginx/sites-enabled/ in nginx.conf.
  2. Mainline nginx’s user is nginx, but Ubuntu uses www-data, so change it in nginx.conf.
    #user nginx;
    user www-data;
    
  3. Change spdy to http2 in site config.

Reload nginx, and now the site’s HTTP2 is working.
However, try to open any page of WordPress, it just shows a blank page without any error. The log shows HTTP 200 OK.

Blank page issue

After googling the issue, it’s found that a missing FastCGI param is the root cause.
Add below line in /etc/nginx/fastcgi_params:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Reload nginx again, and now everything works fine.

Share

Android M – Systemless Unroot, OTA and re-Root

Since Google is now pushing monthly security updates, it becomes a regular procedure for me to temporarily un-root my phone to get OTA updates.
This post introduces the steps of how to unroot Android M (6.0 or above), get OTA update and then re-root it.

[Update] Let’s take Nexus6p as example to OTA from angler-MHC19I to angler-MHC19Q.

Pre-condition

Preparation

  • Factory image of MHC19I
  • TWRP (e.g. 3.0.0.1)
  • SuperSU (2.60 or above, e.g. 2.68)

Steps

Unroot

  1. Extract MHC19I’s factory image to get boot.img and recovery.img
    tar -xf angler-mhc19i-factory-8c31db3f.tgz angler-mhc19i/image-angler-mhc19i.zip
    cd angler-mhc19i
    unzip image-angler-mhc19i.zip boot.img recovery.img
    
  2. Flash stock boot and recovery
    adb reboot bootloader
    fastboot flash boot boot.img
    fastboot flash recovery recovery.img
    

Now the phone is un-rooted and we get the stock Android.

OTA or Sideload

If you got OTA update from Google, just run OTA, Android does the OTA automatically.

If you did not get OTA update, you have the option to use adb sideload to manually flash the OTA package.

  1. Get the OTA package;
  2. Go to stock recovery, in recovery screen, press and hold the Power key and the Volume up key for a few seconds, and then let go of the Volume up key, but keep pressing Power.
  3. In stock recovery, run below command to do the OTA upgrade:
    adb sideload f7303e0c33450419deeb292b0887c1595fb5588d.signed-angler-MHC19Q-from-MHC19I.zip
    

After OTA, we’re now on MHC19Q (April 2016 release).

Root again

  1. Flash TWRP
    adb reboot bootloader
    fastboot flash recovery twrp-3.0.0-1-angler.img
    
  2. Flash SuperSU
    • Press the Volumn and Power key to enter Recovery
    • In TWRP, flash BETA-SuperSU-v2.68-20160228150503.zip
  3. Wipe cache/dalvik
  4. Reboot to system.

Now the phone is rooted again systemlessly.
Enjoy the new version 😉

Share