ultisnips/vim-snippets

本來是打算用 snipmate 的,但看到這篇 UltiSnips 让 Vim 飞起来 – 吕小荣 ,馬上轉投 UltiSnips 。XD

安裝與設定上沒什麼困難。

" Install ultisnips using Vundle
Plugin 'SirVer/ultisnips'
Plugin 'honza/vim-snippets'

裝好以後,輸入特定的關鍵字 (關鍵字要自己去挖 vim-snippets 下的 UltiSnips/snippets 資料夾裡的檔案),再按 tab ,就會自動出現 snippet,如果 snippet 有指定 ${1:pass} 之類的,可以在輸入完畢以後,用 ctrl + j 或 ctrl + k 來切到上一個或下一個位置。

我卡到的問題是自訂的 snippets 沒被載入。找了半天,才發現我把 UltiSnips 資料夾放錯位置。(把我的時間還來!!)

UltiSnips 的 python docstring 可以自訂,看格式是要用 google, sphinx, doxygen, numpy 還是 jedi 的格式。在 .vimrc 裡放下面這行就可以了:

let g:ultisnips_python_style="google"

pycryptco in python3

最近需要做 public/private key 的加解密,所以找到 pycryptco 。

使用的例子可以參考 Python and cryptography with pycrypto

但使用時,卻遇到 unsupported operand type(s) for pow() 的問題,經過一番查找,才找到問題所在,詳情可以看這篇:Error with encrypt message with RSA python – Stack Overflow

主要是因為 Python 3 的字串預設是 unicode 字串,而 encrypt 沒辦法處理,所以得先 encode 為 utf-8 字串才行:

# -*- coding: utf-8 -*-
import os
import base64
from Crypto.PublicKey import RSA
from Crypto import Random
from Crypto.Cipher import PKCS1_OAEP, AES
from pprint import pprint


# Generate key
if os.path.exists('mykey.pem'):
    with open('mykey.pem', 'rb') as fin:
        key = RSA.importKey(fin.read())
else:
    random_generator = Random.new().read
    key = RSA.generate(1024, random_generator)
    with open('mykey.pem', 'wb') as fout:
        fout.write(key.exportKey('PEM'))

# Display key information
print("key = {}".format(key))
print("can_encrypt = {}".format(key.can_encrypt()))
print("can_sign = {}".format(key.can_sign()))
print("can_private = {}".format(key.has_private()))

# show public key
pprint(dir(key.publickey()))

# Encrypt
enc_data = key.publickey().encrypt("abcdef".encode('utf-8'), 32)
pprint(enc_data)

# Decrypt
print(key.decrypt(enc_data))

Jenkins EnvInject

Jenkins 裡能用的環境變數可以參考:

  1. Jenkins 架設好以後的 /env-vars.html/
  2. https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-JenkinsSetEnvironmentVariables

但是有時候,就是覺得少了那麼一些。我們可以使用 EnvInject plugin 在建置時,插入需要的環境變數,讓後續的建置步驟使用。

使用方法:

  1. 在 EnvInject 之前的步驟產生出類似這樣格式的檔案 key=value ,假設檔名是 build.properties
  2. 加入 EnvInject,在 Properties File Path 這欄位放入步驟 1 產出的檔名 build.properties ;Properties Content 不填。
  3. 在 EnvInject 之後的步驟欄位裡,就可以使用 ${key} 了。

參考資料:

電影流水帳(2017/5/10~2017/6/5)

Jennifer Garner Jennifer Garner ,少了她,夜魔俠會失色不少。後來她這個角色還出了獨立的電影,有機會要找來看看。

  • Little Miss Sunshine (IMDB, Wikipedia),台譯:小太陽的願望。某天要上班前,打開電視,結果看到一直想看的「小太陽的願望」,於是就把這部電影看完了。上班遲了,不過這部電影值得。裏面有一幕特別讓我覺得感動,路上長男因為色盲無法上飛行學校而對未來感到失望,忿怒的下車發洩,不願意繼續陪著妹妹 Oliva 去參加比賽,媽媽怎麼勸都勸不聽,後來爸爸要Oliva去試試看,Olivia走到哥哥旁邊,什麼也不說,只是靠在他身上並抱著他。過了一會兒,哥哥說,走吧,我們趕快趕去比賽會場。有時候,家人跟朋友需要的只是你陪在身邊,不需要多說建議什麼的。
    故事相當的簡單,Oliva 接到通知說可以參加陽光小公主的比賽,全家人在媽媽的威脅利誘之下都跟著去了。由於沒錢不能搭飛機,只能租車開過去。在這趟公路旅行裡,發生了許多有趣的事,每個人也都在自己家人前攤開了自己的事。最後,通力合作讓 Oliva 參加比賽,雖然爺爺在旅行中因為吸毒掛了,但全家人找到了一個新的平衡,能在往後的路上相互支持。
  • Independence Day: Resurgence (IMDB, Wikipedia),台譯:ID4 星際重生。我只看了後半部,基本公式的確跟前作很相似,沒什麼印象深刻的地方 (也可能是隔了太久,所以劇情都忘光了)。
    在上次 ID4 之後,地球的國家都積極準備,以便抵抗外星人。但是真的到了外星人來的時刻,大家才發現準備的不夠,了解的還不夠多,於是被打趴。後來也是意外發現了外星人要的東西以及弱點,於是展開反擊,最終就是快樂的大結局。
  • 걷기왕 (IMDB, Wikipedia),台譯:競走女王。原本以為是勵志片,但看到後來才發現不是。電影的前面有漫畫的感覺,一邊有旁白介紹,一邊女主角逗趣的演出,相當有趣。
    滿福是個體質容易暈車的女孩,從小就暈車,長大以後還是暈車,所以沒辦法出遠門,上學也只能用走路的去。某天班導師想了解滿福的狀況,就決定去滿福家裡做家庭訪問。家庭訪問之後,她覺得滿福應該適合田徑,就推薦她進了田徑社。
    滿福在社團裡認識了練競走的學姊,跟學姊慢慢的從討厭到有情誼,滿福也從漫不經心,到認真的練習競走。為了參加首爾的全國比賽,滿福決定跟學姊用走的走到首爾參加比賽。可是在路上,她因為自己的傷跟學姊起了小衝突,害學姊進了醫院。隔天比賽,她一開始就拼命的走,這個舉動打亂了其他選手的節奏,也讓她取得領先。就這樣沒休息拼命的走,走到跌倒,她看著天空,突然放下了要完成比賽的懸念。電影的最後,滿福跟學姊成了好朋友,決定用走的走遍全世界,電影就這樣收了尾。
  • Daredevil (IMDB, Wikipedia),台譯:夜魔俠。自從夜魔俠影集出來以後,就蠻想找之前的電影來看看。後來有 Netflix,在 Netflix 上看完以後,覺得女主角 Jennifer Garner 飾演的 Elektra 與 Colin Farrell 飾演的 Bullseye 救了這部電影,讓這部電影不至於太過枯燥。男女主角認識對打的那場戲可惜了,一出場時頗讓人有眼睛一亮的感覺,但武打場面應該可以更精彩才是。
    電影一開始帶出夜魔俠的重傷,然後開始倒敘他的過去。Matt 小時候意外目睹父親的惡行,受不了這打擊,在奔跑的路上撞到毒物,導致眼睛失明。父親也因此改惡向善,努力打拳。但冠軍賽時不願意配合打假拳,比賽結束時,被打死。Matt 決心努力唸書當律師,並且以失明換來的敏銳感覺練就了一身好功夫。長大以後,Matt 白天當律師,晚上則是當夜魔俠打擊犯罪。跟他一起開律師事務所的合伙人就是飾演鋼鐵人裡 Hogan (就保鏢,也是鋼鐵人的導演) 的 Jon Favreau。某天遇到 Elektra ,Elektra 是大魔王  The Kingpin 合伙人的女兒, 兩人開始有情愫。The Kingpin 是地獄廚房的魔頭,他想要拔掉他的合伙人以及夜魔俠,於是找了 Bullseye 來殺掉他們。Bullseye 成功的殺掉 Elektra 的父親,並讓 Elektra 以為是夜魔俠下的手。Elektra 決心殺掉夜魔俠,於是跟夜魔俠大打出手,夜魔俠試著說明,但 Elektra 不聽,直到她刺了夜魔俠依劍,拿下夜魔俠的面具才知道他是 Matt。Bullseye 黃雀在後,殺了 Elektra,夜魔俠逃到教堂,接到電影最前面的地方,跟 Bullseye 在教堂大戰一場,並且僥倖取勝。最後,再拖著受傷的身軀,去找 The Kingpin ,並將他打敗。故事的結尾,Matt 上到 Elektra 死去的樓頂,發現居然掛著有點字的牌子,似乎是留下 Elektra 還活著的伏筆。

 

Ubuntu trusty python2 與 python3 的 PYTHONPATH

python2 的 sys.path 是

['',
 '/usr/local/lib/python2.7/dist-packages/python_nghttp2-1.3.5.dev0-py2.7-linux-x86_64.egg',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/home/ellery/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/pymodules/python2.7',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client',
 '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']

 

python3 的 sys.path 是

['',
 '/usr/local/lib/python3.4/dist-packages/onedrive_d-1.1.0dev-py3.4.egg',
 '/usr/local/lib/python3.4/dist-packages/daemonocle-0.8-py3.4.egg',
 '/usr/local/lib/python3.4/dist-packages/Send2Trash-1.3.0-py3.4.egg',
 '/usr/local/lib/python3.4/dist-packages/certifi-2015.11.20.1-py3.4.egg',
 '/usr/local/lib/python3.4/dist-packages/psutil-2.1.1-py3.4-linux-x86_64.egg',
 '/usr/lib/python3/dist-packages',
 '/usr/lib/python3.4',
 '/usr/lib/python3.4/plat-x86_64-linux-gnu',
 '/usr/lib/python3.4/lib-dynload',
 '/home/ellery/.local/lib/python3.4/site-packages',
 '/usr/local/lib/python3.4/dist-packages']

 

會發現兩邊的 $HOME/.local/lib/pythonX.Y/site-packages 順序是不一樣的,照理來說,應該是要以 $HOME/.local/lib/pythonX.Y/site-packages 為優先,這樣才有機會安裝最新版本的 package 而無需更動到系統的 package。

那該怎麼辦呢?這可以修改 /etc/python3.4/sitecustomize.py 來解決這問題。

在 /etc/python3.4/sitecustomize.py 的最後加入

import os
import sys

sys.path.insert(0,
        os.path.join(
            os.path.expanduser("~"),
            ".local",
            "lib",
            "python3.4",
            "site-packages"))

Python3 在執行前,會先執行這個檔案,這裡在 sys.path 串列最前面插入 $HOME/.local/lib/pythonX.Y/site-packages ,就能解決這問題了。

參考資料:

Python on Visual Studio Code 初步設定

Visual Studio Code 有獨立一個頁面介紹 Python 的部份:Python with Visual Studio Code

基本有4個 extension 要裝:

  • Python
  • Code Runner
  • MagicPython
  • Python for VSCode

Python 這個 extension 可以設定的東西很多,設定可以參考它的 Wiki ,可是知道有這些設定以後,該怎麼設定呢?你得先在專案資料夾下建立一個 .vscode 的資料夾,然後在裏面新增一個 settings.json ,這邊再參考 Wiki 去填入設定就可以了。

目前我的 Django 專案用的設定是這樣:

{
    "python.pythonPath": "/home/user/.virtualenvs/myproject/bin/python",
    "python.linting.flake8Enabled": true,
    "python.formatting.provider": "autopep8",
    "name": "Django",
    "type": "python",
    "request": "launch",
    "stopOnEntry": false,
    "program": "${workspaceRoot}/manage.py",
    "args": [
        "runserver",
        "--noreload"
    ],
    "debugOptions": [
        "WaitOnAbnormalExit",
        "WaitOnNormalExit",
        "RedirectOutput",
        "DjangoDebugging"
    ]
}

 

因為我用的是 virtualenv ,所以 python 執行檔跟相關的 library 都是在 $HOME/.virtualenv 這裡,把 python.pythonPath 設到這裡以後, intellisense/autocomplete 就可以正常運作。此外我也加上了 linting 與執行、除錯的相關設定。

其他還有 Jupyter 等等的,還沒去深入了解,再找時間來看。

電影流水帳(2017/3/20~2017/5/9)

Emma Watson_85 Emma Watson ,最著名的角色就是妙麗了,這次看到她,是在 This is the end 裡飾演 Emma Watson 去參加 Franco 的派對,蠻令人意外的演出。

  • 眠りの森 (IMDB, Wikipedia),台譯:沈睡的森林。由東野圭吾小說改編的故事,跟騏驎之翼,是加賀恭一郎的辦案故事。衝著阿部寬,我把它看完了,相當好看,讓我想找小說來看看了。
    芭蕾舞團發生了疑似過失殺人的意外,加賀恭一郎跟當地的刑警介入調查。在調查的過程裡,兩人發現並不是過失殺人這麼簡單,於是他們積極的與芭蕾舞團裡的人聊天,進行調查,甚至也在經費可能不足的情況下,強力要求去美國紐約查案。
    最後在恭一郎送東西去找未緒,和未緒聊完天,在大雨中要回家的時候,突然靈機一動,把前面的所有線索都連結起來,知道了真兇是誰。於是,他們讓芭蕾舞團演完這齣睡美人之後,逮捕了真正的凶手 – 未緒。未緒在亜希子與風間發生爭吵的時候,意外殺了風間,但葉瑠子、亜希子為了讓即將失聰的未緒能演出最後一齣戲,聯手隱藏了真相,偽裝是葉瑠子意外殺了風間。故事的結局不但出人意表,未緒的遭遇也令人同情。
  • Due date (IMDB, Wikipedia),台譯:臨門湊一腳。不能算好看又好笑的電影,但還蠻適合用來打發時間的。
    Peter 的妻子要生了,他趕著要回洛杉磯,在飛機上遇到要去好萊塢面試的 Ethan,兩人不對盤,對話的時候被誤會有帶炸彈,就被請下飛機,兩人從此不能搭飛機。Peter 的錢包掉了,駕照跟錢都在裏面,沒辦法租車,Ethan 伸出援手,兩人一同開車去洛杉磯。在往洛杉磯的路上,兩人從一開始的不對盤,到慢慢熟識、相互了解,最後總算是攜手回到洛杉磯,順利到醫院,大概就這樣。不過 Peter 還是沒看到孩子的出生,因為兩人從墨西哥逃回美國的路上,Peter 被槍打中,到醫院時,正好去急救,Ethan 就代替 Peter 接生了孩子。
  • This Is the End (IMDB, Wikipedia),台譯:大明星世界末日。裡面的角色都飾演自己,故事很簡單,Jay 去找 Seth,本想兩個好朋友度過一個快樂的周末,可是 Seth 拉了 Jay 去參加 Franco 的派對。Jay 在派對裡感到落寞,拉了 Seth 去外面買東西,突然天崩地裂,一堆人被藍光吸走,兩人趕緊逃回 Franco 的家。Jay 跟 Seth 正在述說外面的情況時,Franco 的家也發生了同樣的事情,一堆人奪門而出逃走,有些人掉到深淵,有些人發生了意外。Franco、Jay、Seth、Jonah、Craig 一行人逃回 Franco 的家裡,於是開始了末日求生。接著就是述說他們在 Franco 家裡的一些事情,有些很白爛,有些很有趣。電影的最後是 Jay 發現了被藍光吸走其實是被帶領到天堂,所以得做些好事才能得救。Seth、Jay 跟 Craig 幸運的以這個手法得到救贖,並上到天堂。
  • Guardians of the Galaxy Vol. 2 (IMDB, Wikipedia),台譯:星際異攻隊2。有維持前作的水準,除了故事好以外,配樂也相當的不錯,在幾個重要的場面所播放的歌曲都很搭。
    這次主要是 Peter 的尋親之旅,異攻隊一行人去幫天神族,但手賤的 Rocket 偷了天神族的電池,在逃走途中,意外被 Peter 的父親 Ego 所救。Rocket, Groot 跟 Nebula 留下修理太空船,其他人跟著 Ego 回去 Ego 的星球。經過一番確認,Peter 確信自己找到父親,非常的高興。可是父親卻別有居心,異攻隊一行人發現不對勁,跟著後來追來的 Yondu 聯手對抗 Ego。經過一番苦戰,粉碎 Ego 的野心,再次拯救世界。最後的結局有淡淡的哀傷,人真的要把握當下啊!

升級 daphne 到 1.2.0 後導致連線卡住

使用 django channels 得使用 daphne 來處理 asgi (websocket/long poll http) 請求,我遇到的情況是從 1.1.0 升級到 1.2.0 以後,整個 django 應用就無法接受服務。

查了很久,看程式也覺得應該沒問題,該處理的 request ,daphne 都有轉送給 channels 去處理,而 channels 也都有處理。心裡想,這應該是個大問題,早該有人回報吧。但用 google 查詢都沒查到,今天心血來潮查了 Daphne 在 github 上的 closed issues,總算是找到了:daphne==1.2.0 hangs forever · Issue #105 · django/daphne

解法也很簡單,升級 asgi_redis/asgi_ipc 到新版就可以了。下次升級 daphne 時,得注意。

anbox 與 snappy

Anbox 是一個以 container 來摹擬 Android 的技術,如此一來,就可以在 Ubuntu 裡執行 Android app。

按照 Anbox 的說明,得先安裝 snappy,snappy 是 Canonical 推的新的套件機制,軟體以類似 container 的方式安裝進去,不過這個技術推行快兩年了,用的人好像還是不怎麼多。安裝 snappy 的方法很簡單,只要安裝 snapd 就可以了:

sudo apt-get install snapd

安裝 snappy 以後,你還得要先登入 Ubuntu one 的帳號 (用法):

sudo snap login your_email

,之後才能依照 Anbox 的說明,進行安裝:

snap install --classic anbox-installer

。如果不先 login ,snap install 時,會不給安裝。

安裝 anbox-installer 以後,再執行

anbox-installer

就會啟動安裝程序了。

不過我還是安裝失敗了,anbox 說 Ubuntu 14.04 應該是可以安裝,但是實際狀況是有問題,我沒深究,就算了。

docker daemon socket

dockerd 預設只使用 /var/run/docker.sock,如果需要讓其他的 host 去管理,就需要額外設定。

在 Ubuntu trusty 裡,要編輯 /etc/default/docker,加入

DOCKER_OPTS="-H 0.0.0.0:2375"

然後重新啟動就可以了。

不過這樣設定以後,就等於任何人都可以透過這個 port 去控制你這台機器裡的所有 container ,官方建議加上 TLS 來保障連線的安全,晚點再來研究怎麼加上 TLS 。

參考資料: