awk 一行下載

為了下載投影片,但懶得一個個複製貼上、改指令,所以預先把投影片網址跟預定的檔名放在文字檔裡,然後用 awk 一次下載。

文字檔的格式是:url filename ,假定這個文字檔的檔名是 slides.txt

那麼,這樣就能搞定:

awk '{system("wget -O \"" $2 "\" " $1)}' slides.txt

參考資料:bash – awk system call – Stack Overflow

parse-server 架設小記

花了一些時間簡單的架設 parse-server,把過程紀錄一下。

  1. 安裝 docker 與 docker-compose
  2. git clone https://github.com/parse-community/parse-server.git
  3. 建立 docker image:
    cd parse-server && docker build --tag parse-server .
  4. git clone https://github.com/parse-community/parse-dashboard.git
  5. 建立 docker image:
    docker build --tag parse-dashboard .
  6. 建立 config.json,your-ip 要填你瀏覽器可以存取到的 IP ,而不是用 docker container 的 ip ,我本來是填 http://parse:1337/parse (請看 docker-compose.yml 裡的 links),但這樣 parse-dashboard 會說無法連到伺服器。
    {
      "apps": [
        {
          "serverURL": "http://<your-ip>:1337/parse",
          "appId": "APPLICATION_ID",
          "masterKey": "MASTER_KEY",
          "appName": "MyApp",
          "production": false
        }
      ],
      "users": [
        {
          "user": "user",
          "pass": "pass"
        }
      ]
    }
    
  7. 建立 docker-compose.yml
    ---
    version: '3'
    services:
      mongodb:
        image: mongo:3.4
    
      parse:
        image: parse-server:latest
        environment:
          FOO: bar
        command: --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://mongodb/test
        links:
          - mongodb
        ports:
          - "1337:1337"
      parse-board:
        image: parse-dashboard:latest
        environment:
          PARSE_DASHBOARD_ALLOW_INSECURE_HTTP: "yes"
        links:
          - parse
        ports:
          - "4040:4040"
        volumes:
          - ./config.json:/src/Parse-Dashboard/parse-dashboard-config.json
    
  8. docker-compose up

要啟用 push notification ,得調整 docker-compose.yml 裡 parse service 的 command,加入 push notification 的相關選項。從選項可以看出,parse 仍是利用 GCM/APNs 來發送通知。

LiveQuery 在佈署到 AWS 時,要用 ALB,因為 ELB 不支援 WebSocket。

在正式環境裡,要記得把 PARSE_DASHBOARD_ALLOW_INSECURE_HTTP 設為 “no” ,並且加上 SSL 。也可以參考 parse-server github 網頁上對於佈署的說明,有蠻多佈署到平台上的現成範例可參考。

參考資料:

webui-aria2-git

aria2 的 web UI,紀錄一下怎麼使用。

  1. 安裝:yaourt -S webui-aria2-git
  2. 啟動 aria2d:放在 /usr/lib/systemd/user/ 下的 service 檔案,需要額外加上 –user 參數,所以要啟動得用 systemctl –user start aria2d 。要確定是否有啟動,可以用 netstat 檢查 port 6800 是否在 listening 狀態。
  3. Web UI 部份的啟動:主要是靜態 HTML,所以只要調整 Web server 的設定,指向 /usr/share/webui-aria2/ 就可以了。

提高安全性:

  1. 修改 /usr/lib/systemd/user/aria2d.service ,在 ExecStart 那行後面加上 –rpc-secret=<your_token> ,–rpc-secret 是加上 token。
  2. 打開網頁時,在連線設定裡填入步驟 1 的 token 。

參考資料:

VirtualBox guestcontrol

VirtualBox 可以用 vboxmanage guestcontrol 來有限度的控制 VM 裡的 GuestOS。

GuestOS 是 Ubuntu 的話,得安裝 virtualbox-guest-utils, virtualbox-guest-dkms ,安裝完以後,重新開機。

在 HostOS 裡,就可以用 vboxmanage guestcontrol 指令了。

# VirtualBox 5.x
vboxmanage --nologo guestcontrol "Ubuntu 16.04" run --exe /sbin/ifconfig --username ubuntu --passwordfile password.txt --wait-stdout --wait-stderr --verbose

參考資料:

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 還活著的伏筆。