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

Margot Robbie Margot Elise Robbie ,飾演 Suicide Squad 裡的小丑女,造型實在太出色,很難讓人忽視。後來才發現,她也有在華爾街之狼、決勝焦點與大賣空裡演出。

  • Suicide Squad (IMDB, Wikipedia),台譯:自殺突擊隊。天眼局阿曼達·華勒利用了這些被捕入獄壞蛋的弱點,在這些人的脖子裡埋入小型炸彈,將這些人納入組織裡使用。但是人算不如天算,媚惑女巫意外遇到了哥哥,脫離了掌控,透過哥哥的幫助,要報復人類。於是天眼局就讓這些壞蛋組隊去打媚惑女巫,經過一番苦戰及糾結之後,終於打敗媚惑女巫,但壞蛋仍然沒能脫離天眼局的控制,只是交換到比較人性一點的條件。
    說真的,裏面除了小丑女、媚惑女巫跟燄魔的故事讓我比較有印象之外,其他好像就沒了。個人覺得普普,但蠻適合用來打發時間。
  • 運轉手之戀 (IMDB, Wikipedia)。一個關於計程車駕駛的故事,從駕駛父母相識到生下他跟妹妹,再帶到妹妹跟自己認識警察太太並結婚的故事,故事中穿插了他目前遇到的狀況,非常的有趣。這部電影我看了超過十次以上,每次都覺得這故事真的很妙。
    故事的最後雖然是車禍,但我覺得是一個帶有開放性的結局,很難說駕駛怎麼了,因為他的父母、妻子、孩子在家殷殷期盼著,而他掙扎著爬出車外,雖然受了傷,但看起來應該還行,而且有聽到救護車的聲音,所以駕駛最後到底怎麼了呢?希望他沒事。
  • Doctor Strange (IMDB, Wikipedia),台譯:奇異博士。交代奇異博士起源的故事。
    Strange 本來是一個技術高超的外科醫師,但是一場車禍 (開車真的不要分心拿手機什麼的,太容易出意外) 使得他的手無法再像以前一樣開刀,醫師生涯等於是毀了。Strange 從復健師那兒意外得知有個人之前也是半身癱瘓,去了某個地方回來之後就一切如常了,於是他前往西藏尋訪卡瑪泰姬。在尋訪時,Strange 被搶劫,透過莫度的幫忙,Strange 沒事,而且找到卡瑪泰姬。卡瑪泰姬的古一原本是不想收他的,但是後來 Strange 的固執,讓他能留下學習魔法。在學習魔法的過程裡,他慢慢得知之前卡西流斯搶走了魔法書的一頁,想要讓多瑪暮來到地球。沒多久,卡西流斯就開始破壞三個聖殿,以便打破三個聖殿所組成的用來防禦多瑪暮的咒語。Strange 只能加入戰鬥阻止卡西流斯,在一場戰鬥中,古一受了重傷,Strange 看到古一的靈魂出竅,於是跟古一對談。古一終究沒有留下,將事業傳承給 Strange。Strange 協同莫度跟王前往最後的聖殿 – 香港阻止卡西流斯。在香港戰鬥時,Strange 從之前跟卡西流斯戰鬥中得到的靈感,使用了時間魔法消耗多瑪暮,以一種截然不同的方式讓多瑪暮知難而退,拯救了地球。
    片尾的彩蛋是雷神來請求協助找父親的,正好是最近上映的雷神3-諸神黃昏的引子。
  • The Great Wall (IMDB, Wikipedia),台譯:長城。歐洲來的一行人來到中國,想尋找黑火藥,但是意外遇到可怕的怪獸,只剩下威廉與托瓦爾僥倖逃出,來到長城。駐守長城的無影禁衛軍正是為了防禦這怪獸而在此的,捉到這兩人,非常懷疑這兩人能從怪獸攻擊下逃出。但這兩人展露本事後,確實地讓禁衛軍信服了。原本兩人打算串通之前來到此的外國人偷取黑火藥之後就離開,但是一段時間相處下來,威廉動搖了,反而留了下來幫助禁衛軍抵禦怪獸。總之最後就打敗了怪獸的頭頭,一瞬間所有怪獸都失去了控制而倒下來。大戰結束,威廉跟托瓦爾之後帶著黑火藥順利離開。
    特效是很棒,但是電影裡的突兀感很讓人不小心笑出來。像威廉兩人被逮住,禁衛軍傳了懂外國語言的林將軍來問話,講了半天,殿帥叫人押他們兩人下去。在往監牢途中,他們在談話,這時剛剛明明也在場的軍師突然也用外國語言插了話。明明就懂外國語言,為什麼剛剛都不作聲,還硬要傳林將軍上來,擺明就是給景甜(林將軍)戲份。
  • Kong:Skull Island (IMDB, Wikipedia),台譯:金剛骷髏島。還不錯看的電影,故事跟之前的金剛不同,但保留了金剛、美女的元素。
    越戰結束,一個冒險家跟一個科學家爭取到經費,找了打完越戰的軍人,一起到南美洲附近的島嶼探險。
    這些人開直昇機一上島就開始亂炸,炸彈導致金剛的不悅,將直昇機都打了下來。帶頭的長官帕卡德因為下屬死去,很不開心,決定要幹掉金剛,於是帶著剩下的人去找有重裝備的直昇機墜落點。另外,康拉德一行人則是意外在島上遇到之前漂流至此的二次大戰軍人與原住民,得知了金剛只是要避免地底的大蜥蜴出來作亂,維持島上的平衡。於是兩票人會合以後,康拉德一票人主張要前往預定的集結點離開這個島,而帕卡德一票人主張要幹掉金剛,兩方談不攏,就各自表述。
    康拉德一行人到了集結點以後,覺得應該回去救金剛,就又回去阻止帕卡德。帕卡德見到金剛,就以武器攻擊,康拉德等人還來不及阻止,金剛就被打到倒地不起。這時候地底的大蜥蜴出來咬金剛,帕卡德才知道自己錯了,也幫忙打蜥蜴。總之一場大戰以金剛甦醒,在人類幫助下打敗大蜥蜴告終。
  • 名探偵コナン から紅の恋歌 (IMDB, Wikipedia),台譯:名偵探柯南-唐紅的戀歌。這次主題是競技歌牌,像我不了解歌牌,就不太容易融入劇情,只感覺這個似乎跟夏日大作戰裡的花札有相似之處。
    劇情跟平次的女友-和葉比較有關係,因為競技歌牌比賽,平次一行人遇到大岡紅葉,紅葉明顯的對和葉表現出敵意。表現出敵意的原因是平次在小時候為了安慰紅葉說出了要娶她的話,紅葉一直記在心裡,並且努力練習競技歌牌。在比賽的過程中,陸續出現爆炸事件,有一次平次、和葉跟柯南差點就被炸死。經過柯南與平次的調查之後,終於找到凶手,而比賽也到了總冠軍戰,柯南跟平次就騎著機車到位於瀑布頂端的比賽場地揭露真相,解決這次事件。
  • Mechanic: Resurrection (IMDB, Wikipedia),台譯:極速秒殺2。沒看過極速秒殺,劇情看起來是接著演。
    Arthur Bishop 過著退休的生活,但是卻被昔日的伙伴 Riah Crain 找到,逼他幫忙殺了三個人,Bishop 不肯,逃到泰國找 Mei,Mei 是他以前幫助過的人,在泰國開渡假村。在渡假村,Bishop 遇到一個疑似被暴力對待的女子 Gina ,Mei 要求 Bishop 幫她,於是就認識了。Bishop 對 Gina 起了疑心,於是打開天窗說亮話,才知道 Gina 是為了人道慈善世界而不得不聽 Riah 的話。這時 Riah 的人馬趕到,擄走 Gina ,Bishop 為了救 Gina 只好聽命 Riah ,去殺三個人。暗殺的過程相當精彩,但是暗殺到最後一個人時,Bishop 決定幹掉 Riah 以絕後患,於是劇情出現轉折。
    除了 Bishop 跟 Gina 相識相愛的過程有點不大合理之外,其他倒是還可以。我必須承認,我只是要看 Jessica Alba ~
  • The Darkest Hour (IMDB, Wikipedia),台譯:黑暗時刻。兩個去俄羅斯尋求創投資金的美國人,尋求失敗以後,去酒吧喝酒。人運氣差的時候,連喝酒都會遇到外星人。他們認識了兩個來俄羅斯玩的女生以後,遇到外星人入侵,於是一路逃,很幸運的逃過一劫。之後為了尋求援助,就開始一路邊走邊逃,在這過程裡觀察到外星人的模式。後來又遇到俄羅斯的電工,進而找到弱點。他們意外的收聽到收音機,得知可以搭潛水艇逃出,就決定要穿過市區。應該是他們開始轉運了吧,他們遇到了當地的游擊隊,透過游擊隊的幫助,他們一同消滅了幾個外星人,並且順利搭乘潛水艇離開俄羅斯。

找 git repository commits 裡的特定字串

因為在目前的程式碼裡找不到特定的字串,但是之前應該有,可能被移掉了,所以想找找之前提交的程式碼有沒有特定的字串。

請 Google 大神幫忙了一下,在 StackOverflow 上找到答案:How to grep (search) committed code in the git history? – Stack Overflow ,原來用 git grep 搭配 git rev-list 就可以做到:

# 找全部
git grep <regexp> $(git rev-list --all)

# 只找特定目錄下的
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util

sudo 免輸入密碼

這篇 command line – Execute sudo without Password? – Ask Ubuntu 講的很仔細,簡單說就是用 visudo 加入

username ALL=(ALL) NOPASSWD: ALL

就可以了。

我的作法是:

  1. 新增 sudo_nopass 的 group:
    sudo groupadd sudo_nopass
  2. visudo 之後,加入:
    sudo_nopass ALL=(ALL) NOPASSWD: ALL
  3. 將 user 加入 sudo_nopass 群組:
    sudo usermod -a -G sudo_nopass user
  4. 重新登入或重開機

這樣 user 用 sudo 時,就不需要再輸入密碼了。

在 javascript 裡將 dict/object 轉換為 xml

照一般的作法,會是用操作 DOM 的方式來產生出 XML,但這樣很繁瑣,找了好幾個函式庫,最後是找到 object-to-xml (Github網址),使用方法很簡單:

var objectToXML = require('object-to-xml');

var obj = { 
  '?xml version=\"1.0\" encoding=\"iso-8859-1\"?' : null,
  request : {
    '@' : {
      type : 'product',
      id : 12344556
    },
    '#' : {
      query : {
        vendor : 'redhat',
        name : 'linux'
      }
    }
  }
};

console.log(objectToXML(obj));
/*
<?xml version="1.0" encoding="iso-8859-1"?>
<request type="product" id="12344556">
  <query>
    <vendor>redhat</vendor>
    <name>linux</name>
  </query>
</request>
*/

在 ‘@’ 裡的,都是屬性,而在 ‘#’ 裡的則是子 element 。

在 typescript 裡,要用

import * as objectToXML from 'object-to-xml';

來匯入使用。

sqlite3 的 alter table

sqlite3 的 alter table 不能刪除 column 或是修改 column ,只能新增!!

是故,如果要修改或刪除,只能先將原來的 table 更名,然後重新建立,再使用 insert into + select 來插入。

語法示意如下:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

寫這篇,才想到 django migration 可能也因為這限制,所以當資料庫是 sqlite3 時,有刪除或更動 model 屬性時,並沒有真的更動資料表格。

Run ansible in gitlab runner

在 gitlab runner 裡想要執行 ansible playbook 進行佈署,幾個問題以及我的應對:

  1. ansible 的安裝:是可以自己加 ansible 的 package repository ,然後用 apt 安裝,但已經有好心人打包了裝好 ansible 的 docker image ,只要在 .gitlab-ci.yml 加入 image 設定即可:
    image: williamyeh/ansible:ubuntu14.04
  2. playbook 要放在哪裡?因為要直接在專案進行佈署,所以 playbook 也要放在專案裡,我在專案裡建立了一個 ansible 的目錄,把 playbook 放在這裡。
  3. 私密資料如何保存?gitlab 在專案設定裡提供了 variables,可以用來存放這些私密的資料,在 .gitlab-ci.yml 裡,只要用 $VAR_NAME 就可以使用這些變數。.gitlab-ci.yml 裡也可以自訂 variables ,但這些 variables 是進到 git repository 的,要視情況使用。
  4. Ansible 連到目的機器需要 SSH Key:這比較麻煩一點,好在 gitlab 有提供如何使用 SSH key 的文件,步驟很詳細,簡述如下:
    1. 在專案設定的 variables 裡新增有 SSH private key 的變數。
    2. 檢查 ssh-agent ,如果沒有就安裝 openssh-client
    3. 執行 ssh-agent
    4. 用 ssh-add 匯入第一個步驟所設定好的變數
    5. 在 ~/.ssh/config 裡加入不檢查 host key 的設定:
      Host *
          StrictHostKeyChecking no

參考資料:

compodoc

前兩天看到這篇:你寫的文件別人看得懂嗎?:compodoc ,所以想來試試看。

因為想放到 Jenkins 裡去自動產生 Angular App 的文件,所以想用 docker 來避免在 Jenkins 主機上安裝 compodoc 。

首先找到有沒有已經寫好的 docker image,很幸運,找到 sdvplurimedia/lea-pulse-compodoc – Docker Hub ,github repository 在 SDV-Plurimedia/docker-images: DockerFiles public ,從 Dockerfile 可以看出就只是簡單的繼承自 nodejs 的 image ,然後用 yarn 安裝 compodoc。

所以用 docker pull 拉到本地端,就可以用 docker run 來執行了,先看看有什麼參數:

docker run -it sdvplurimedia/lea-pulse-compodoc:latest compodoc --help

然後在專案目錄下建立 doc 目錄,用 docker run 將專案目錄掛載到 /src,輸出目錄掛到 /src/documentation,再執行:

docker run -v ${PWD}:/src -v ${PWD}/doc:/src/documentation -it sdvplurimedia/lea-pulse-compodoc:latest /bin/sh -c 'cd /src && compodoc -p tsconfig.json'

就可以在執行,並在 documentation 目錄裡找到 HTML 文件了。

檢查 module 裡是否有指定的 module

好饒舌。

只是因為程式目錄下有好幾個 module ,想檢查裏面是否有指定名稱的子 module,有的話就載入,沒有的話就跳過。

在網路上找了一下,說是用 imp 就可以解決了:

程式如下:

# -*- coding: utf-8 -*-
# 依序去 module1, module2, module3, module4 看有沒有 routing,有的話就載入並取出指定的變數。
import imp


channel_routing = []
apps = ['module1', 'module2', 'module3', 'module4']
for app in apps:
    try:
        app_info = imp.find_module(app)
        module = imp.load_module(app, *app_info)
        routing_info = imp.find_module('routing', module.__path__)
        routing = imp.load_module('routing', *routing_info)
        if hasattr(routing, 'channel_routing'):
            channel_routing.extend(getattr(routing, 'channel_routing'))
    except ImportError:
        pass

其實應該再參考 django autodiscover() 或是 django test runner 原始碼的,只是在那個時間點沒想到。

pdfkit/wkhtmltopdf

wkhtmltopdf 是一個可以將網址或是 HTML 檔案轉換為 PDF 的程式。

pdfkit 則是一個 python package (或 library),用來將網址或是 HTML 轉換為 PDF,底層用的是 wkhtmltopdf 。

django-pdfkit 則是給 Django 使用的 app,主要使用 pdfkit ,提供了 PDFView 。要提供產出 PDF 的網頁,只要寫一個繼承自 PDFView 的 View,撰寫 template ,就可以了。

以下是幾個試過以後的心得:

  1. 內部處理順序是先使用 Django template 輸出為 HTML,再用 pdfkit 輸出為 PDF。
  2. 預設用 PATH 去找 wkhtmltopdf,但如果有指定 WKHTMLTOPDF_BIN 這個環境變數的話,就用這裏面的。
  3. 在網址加入 html 參數,表示顯示 HTML,例如:http://server/show_pdf/?html
  4. 在網址加上 inline 參數 ,表示直接顯示 PDF,而非下載,例如:http://server/show_pdf/?inline
  5. 要自訂 pdfkit 使用 wkhtmltopdf 的參數,在繼承的 View 裡加入 pdfkit_options (型態為 dict) 或是自訂 get_pdfkit_options method。
  6. 要自訂輸出的檔名,可以在繼承的 View 裡加入 filename 或是自訂 get_filename method。
  7. wkhtmltopdf 預設不使用 print media-type ,所以在 css 裡加的 print media-type 相關樣式都沒用,除非自訂 pdfkit_options ,加入 {“print-media-type”: “”}。雖然加了 print-media-type 可以強制讓 wkhtmltopdf 參考 print media-type,但是一般可以在網路上查到,使用 print media-type 在每頁加頁次的方法是行不通的,一樣要自訂 pdfkit_options 才行 (參考 wkhtmltopdf -h 說明):{ ‘footer-center’: ‘[page] / [toPage]’}。其他還有調頁面邊界、紙張大小的,也都是要看 wkhtmltopdf 的說明來調整 pdfkit_options 。
  8. bootstrap 3 本身就有支援 print media-type ,直接使用就會有不錯的效果。如果要更漂亮,可以參考 Natshah/bootstrap-print: To manage print media for Twitter Bootstrap v3.
  9. 表格跨頁標題主要是使用 table/thead/tbody 跟調整 css,之前參考的網頁找不到了,這裡直接貼相關的 css 跟 html:
    /* CSS */
    @media print {
      table {display:table;}
      thead {display:table-header-group!important;page-break-after:avoid!important;}
      tbody {display:table-row-group!important;page-break-after: auto!important;}
      tr, img {display:table-row!important;page-break-inside:avoid!important;page-break-after: auto!important;}
      td, th {display:table-cell!important;}
    }
    
    <!-- HTML -->
    <table class="table table-bordered">
      <thead>
        <tr>
            <th class="text-center">編號</th>
            <th class="text-center">姓名</th>
        </tr>
      </thead>
      <tbody>
        <tr>
            <td>1</td>
            <td>王小明</td>
        </tr>
      </tbody>
    </table>