星期一, 10月 16, 2017

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;}
    }
    
    
    
    編號 姓名
    1 王小明

星期一, 10月 09, 2017

電影流水帳(2017/8/4~2017/9/9)

The Shallows poster.jpg
By Source, Fair use, Link
Blake Lively 是絕鯊島的女主角,演過蠻多電影,這次獨挑大樑。她的配偶是演綠燈俠跟死侍的 Ryan Reynolds ,真的是郎才女貌。
  • Central Intelligence (IMDB, Wikipedia),台譯:中央情爆員。之前看預告蠻好笑的,終於等到第四台上映。整體還可以,蠻適合打發時間。
    某天 Calvin 接到之前老同學 Robbie 的電話,兩人聊了起來,並約了要出去吃飯。吃了飯才知道 Robbie 變化很大,而且改了名,現在叫作 Bob。豈料,跟 Bob 的飯局成了奇遇的開始。原來 Bob 是情報員,跟 Calvin 聯繫,是因為 Calvin 在學校時幫助過他,他認為只有 Calvin 能相信。接下來,兩人一同處理、調查情報局裡的內鬼事件。在調查的過程裡,兩人更加了解彼此,最後也順利的解決了案件,並且讓 Bob 走出學生時代的陰影。
  • Jack Reacher: Never Go Back (IMDB, Wikipedia),台譯:神隱任務-永不回頭。個人覺得第一集比較好看,這集雖然也延續了之前動作性,但感覺就有點為賦新詩強說愁的感覺。神盾局副局長 (女主角 Susan )的表現不俗,相當的不錯。
    Jack 陸續跟軍中的 Susan 合作解決案件,兩人慢慢有了感情,直到 Jack 去華府找她時,發現 Susan 昨天被關了起來。Jack 直覺不對,於是不顧接任 Susan 的人的阻撓開始調查。他先找了幫 Susan 辯護的律師,然後將調查到的線索交給他,但是辯護律師隨即被殺死。Jack 趕緊潛入獄中,救出 Susan。在此同時,Jack 也遇到了聲稱是他女兒的 Samantha。三人邊逃邊調查,終於查出真相。原來是某公司因為瀕臨破產,就利用運美國軍火的機會進行運毒。Susan 派出的探員調查發現了,某公司就派人將探員殺死,並且擔心報告寄給 Susan ,所以一不做二不休的,回美國境內誣害 Susan。總之,最後是水落石出了,Samantha 坦白自己是冒充 Jack 的女兒,Susan 恢復清白,Jack 則繼續流浪。
  • Mr. Holmes (IMDB, Wikipedia),台譯:福爾摩斯先生。這次的故事蠻特別的,講的是福爾摩斯的老年。飾演管家 Mrs. Munro 的 Laura Linney 跟飾演福爾摩斯的 Ian McKellen 有相當精彩的對手戲。
    福爾摩斯老了,被老年痴呆症困擾,但他不認輸,試著以蜂王乳跟東洋草藥來挽回。在老年痴呆症的困擾與管家小孩的陪伴裡,他慢慢回想最後一件案子的經過,並試著解開謎底。到最後他終於回想起來,並且串連起所有線索,拼湊出全貌。
    原來最後一件案子,福爾摩斯在受到丈夫 Thomas 的委託進行調查其妻 Ann 以後,確定是 Ann 因為喪子之痛而買了毒藥,原本以為毒藥是要毒害 Thomas ,但之後 Ann 故意走到鐵路上讓火車撞死了。福爾摩斯看到報紙,頓悟到自己大錯特錯,受到打擊,躲到鄉下十幾年,從此一蹶不振。
    就在此時,管家的兒子被胡蜂叮咬過敏,送他到醫院的時候,福爾摩斯跟管家把心結打開了,福爾摩斯很慷慨的將身後所有的財產留給管家以及他的兒子,同時也運用才智解開了管家兒子被叮咬之謎。
  • The Shallows (IMDB, Wikipedia),台譯:絕鯊島。網路評價不錯,剛好第四台有播映,就趁機看完了。
    Nancy 是個醫學院學生,為了忘卻喪母之痛,孤身來到母親以前的海灘衝浪。想不到她在這裡卻遇到了鯊魚,受了傷被困在礁岩上。她運用在醫學院學到的知識,縫合自己的傷口並試圖利用之前衝浪愛好者的運動攝影機錄影,來找到救援。她在錄完影之後,運用之前對鯊魚的觀察,逃到了浮標平台之上,運用這個平台,智取鯊魚。她被海浪沖到岸邊,在此之前沒多久,來沙灘玩的小男孩看到攝影機的影片,找來父親幫忙,正巧就遇到被沖到岸邊的 Nancy,Nancy 因此得救。經過一年的時間,Nancy 終於復元,並和父親跟妹妹一起到海邊衝浪。
  • Cars 3 (IMDB, Wikipedia),台譯:Cars 3-閃電再起。隨著時間的過去,麥坤的寶座被新人挑戰,麥坤失去自信,發生了重大車禍。但是麥坤不肯認輸,決定在新東家的幫忙下,繼續努力。在新東家這兒,他認識了訓練師 Cruz ,但是訓練成效不彰,新東家不想讓他繼續比賽。於是麥坤跟新東家老闆打了賭,他必須在佛羅里達500競賽裡得到冠軍。麥坤以自己的訓練方式進行訓練,Cruz 跟著他進行。他們一路到了韓大夫的老家,遇到了韓大夫的老伙伴們,從他們身上學到了不少技巧。然後他們趕赴佛羅里達參加比賽,但麥坤並沒有在訓練裡得到自信。在比賽的前半段,麥坤突然認知到該交棒了,身邊的 Cruz 正是一個奇才,於是換手讓 Cruz 跑。最後 Cruz 得到冠軍,麥坤也退居到總機械師的位置。


星期日, 9月 24, 2017

Python profiling decorator

前幾天想知道我 Django 程式裡某段函式的瓶頸,所以查了 Django 怎麼做 profiling 。是有查到有 jazzband/silk: Silky smooth profiling for Django 這個 package ,但是有點太大。如果是用常找到的
python -m cProfile xxx.py xxx.py
,Django 程式又不太適合。畢竟我只是想查某個函式而已。所以後來查到這兩個 decorator:
使用上很簡單,程式放進去,在想做 profiling 的函式前加上 decorator 就可以了。
我用的是第一個,在加上 decorator,執行過程式(應該說是瀏覽網頁)以後,在程式當前資料夾裡會找到 .profile 的檔案,為了後續方便說明,假設產生出來是 func.profile 。有這個檔案以後,就可以用
python -m pstats func.profile
開啟,開啟以後,是 pstats 的 shell ,一般要查哪個地方花的時間最多,會用
sort time
依照執行花費時間來排序,再用
stats 10
列出前十個花費時間最多的函式。
參考資料:

星期五, 9月 22, 2017

Ansible 處理多主機不同密碼

用 Ansible 一陣子了,比較麻煩的地方是,主機不一定密碼都相同,簡單的方法當然是讓主機密碼都一樣,但這樣就降低了安全性。有沒有不需要改動密碼的方式呢?在網路上找了半天,找到這篇:ubuntu - Ansible: how to run a play with hosts with different passwords? - Stack Overflow ,裏面有個回應是建議使用 group_vars + ansible-vault + ansible_become_user/ansible_become_pass 來解決。
以下紀錄大致的步驟:
  1. 在 playbook 所在目錄或是 /etc/ansible 下建立 group_vars 資料夾 (以下簡稱 group_vars 資料夾)。
  2. 在 inventory 檔案裡,將相同密碼的主機編成一個群組,這裡假設群組名稱是 foo。
  3. 進入 group_vars 資料夾,用 ansible-vault create foo.yml ,這時候會詢問你 vault 的密碼,輸入完成以後,會開啟編輯器,請在裏面輸入
    ---
    ansible_become_user: "root"
    ansible_become_pass: "your_password"
  4. 存檔離開編輯器。
  5. 在輸入 ansible-playbook 或 ansible 指令時,帶 --ask-vault-pass 參數,也就是在執行時,會問你 vault 檔案的密碼,然後自動解密並讀入裏面的變數執行。
之後要編輯加密過的檔案,得用 ansible-vault edit foo.yml 才行。
參考資料:

星期三, 9月 20, 2017

Upgrade Jenkins plugins via SSH

之前都是啟用 CLI over remoting ,用 jenkins CLI 做更新,但前一陣子在更新 Jenkins 以後,開始該該叫,說這樣不安全。查了一下文件,發現可以用 SSH 來做。
  1. 在 http://jenkins/configureSecurity 裡啟用 random SSHD Port
  2. 在會使用 ssh 登入更新的使用者設定裡 (http://jenkins/user/YOUR_USER_NAME/configure),貼上 public key 。
  3. 參考並修改這個腳本,執行它就可以更新了。

您或許對這些文章有興趣

Related Posts Plugin for WordPress, Blogger...