2018年4月10日 星期二

到 floydhub 租用雲端 GPU 玩人工智慧

想玩一點 AI, 又不想自己直接面對 封閉的 nVidia 顯卡驅動程式 嗎? 如果你的訓練資料沒有隱私或機密的問題, 那就上雲端租用 GPU 吧。 我採用的是 floydhub。 根據 這一篇比較文, floydhub 的效能比 AWS 跟 paperspace 略遜一籌; 不過他們以軟體環境取勝: 有許多現成的深度學習 docker 環境 可選。 而且當初我起步機器學習, 就是靠他們做的一些 docker images, 所以就寫介紹文來回饋囉。

2018年4月2日 星期一

overlayfs 練習: 小改光碟 iso 檔, 何必大手筆複製?

overlayfs 示意圖 以下三件事有什麼共通處?

  1. debian-live 光碟的 persistence 機制 用一層薄薄的 (例如 2G) 可讀寫空間來製造 「從 live CD 開機, 後來卻竟然可以將工作階段寫入硬碟」 的假象。
  2. 撰寫 dockerfile 時第一句 from 拿某個 (即使很厚重的) base image 當作地基, 如果後面的變動沒很多, 那麼在 docker build 時, 扣除下載 base image 的時間, 你的 docker image 本身的建立其實花不了多少時間。
  3. 有一個 4G 大小的 iso 檔, 我想改它的開機圖片跟選單, 可以不要把整張光碟的內容複製到硬碟上修改嗎?

答案: 它們都可以用 overlayfs 來實現。 把玩 overlay 文件系統 這篇簡中文章有很詳細的解說。 單純從 end-user 的角度來說, 其實沒有細讀也 ok, 只需要想像 gimp 或 inkscape 編輯圖片時的 「圖層」 概念, 再圖片搜尋一下, 對 overlayfs 就可以理解八九成了。 本文就不解釋原理, 直接實作第三項工作來認識 overlayfs。 (插圖取自 Data and Network Management for Containers -- Docker Tutorial)

2018年3月24日 星期六

scrcpy 透過 adb 把手機投影到電腦上, 連影片也能看!

scrcpy 從電腦上看手機播影片 先前寫過 用 adb 把手機變身實物投影機, 那招不需要安裝任何軟體, 但只能秀出靜態的手機畫面快照。 最近發現 scrcpy 連手機上播放影片, 電腦都可以跟得上、 即時顯示, 對老師上課示範 android 手機/平板操作來說真是太方便了!

最終執行時只需要兩個檔案: 在電腦上的 scrcpy 執行檔, 以及會被它透過 adb 傳到手機上的 srcpy-server.jar (算是在手機上跑的伺服器)。 也就是說, 不需要在手機上安裝 apk。 手機也不需要 root。

2018年3月10日 星期六

用 noscript 阻斷不明程式、 保護瀏覽器的安全與隱私

NoScript 操作介面 瀏覽器是你的電腦與外面廣大網際網路的最直接接觸面。 即使是你從來沒聽過、 不小心第一次造訪的網站, 它的 javascript 程式碼也都會進入你的瀏覽器執行。 這也是病毒、勒贖軟體、挖礦軟體最常走的入侵管道。 所以保護瀏覽器安全的最基本方式, 就是只允許部分 javascript 執行。 Adblock Plus 適用於多種瀏覽器, 它比較寬鬆: 「原則上放行; 只阻擋黑名單」; 而這篇要介紹、 最近 UI 大改版的 NoScript 僅適用於 firefox, 它比較嚴格: 「原則上阻擋; 只放行白名單」。

2018年2月25日 星期日

老舊電腦救星 antix

antix 17 桌面 Antix 是專為老舊電腦設計的 linux; gantix17 是貴哥版的 antix 17, 可以從 朝陽科大 朝陽資管 的伺服器下載。 它讓你用 2017 年的作業系統啟動 (二十世紀末等級?) 32bit、 256MB 記憶體的電腦。 如果要正常使用, 建議至少要有 1G 的記憶體。 若有 2G 的記憶體, 還可以退出開機光碟或拔掉開機隨身碟, 表演豪邁帥氣裸奔!

2018年2月2日 星期五

連鑰匙孔都藏起來的 ssh 完全防禦: SPA

如果說 ssh 服務是進入伺服器的鎖頭, 那麼帳號密碼就是開鎖的鑰匙。 你可以用 密不透水的設定 來保護鎖頭, 或是用 fail2ban 把企圖開鎖但履試履敗的可疑份子擋在庭院之外一陣子, 讓他連試鑰匙的機會都沒有。 但其實另外還有一個中文世界鮮少人知道的終極絕招: 把鎖頭/鑰匙孔整個藏起來, 只當懂門路的人 (你自己) 用特定暗號敲門時, 才讓鎖頭/鑰匙孔短暫出現一兩分鐘。 今天要介紹的伺服器完全防禦機制叫做 Single Packet Authorization (SPA)

2018年1月30日 星期二

用 logrotate 實現 「近密遠疏」 的備份計畫

Logrotate 本來是拿來備份系統 log 檔用的; 不過被我拿來充份利用、 備份自己的資料 :-) 我每天都會 (至少一次) 把最近幾天內更動過的檔案 (文件/圖片/...) 備份起來, 比方叫做 backup.zip 。 因為這個檔案很小, 所以可以不時上傳到雲端、 下載到隨身碟上。 但偶爾還是會需要挖出較舊的備份, 把檔案還原到舊版。 所以我會用 logrotate 把過去一週的 backup.zip 每天保留一個版本。

2018年1月20日 星期六

ptx 公共運輸整合資訊流通服務平台 bash 及 php 範例

公車動態地圖 去年中才知道這個好站: 交通部透過 公共運輸整合資訊流通服務平台 (PTX) 提供各種大眾運輸工具的時刻/路線/動態/...等等政府開放資料, 正好可以拿來實作我心目中理想的 具有運算思維的公車動態地圖。 最近終於有空, 用它重新寫好公車動態 geojson 查詢 (範例: 公車即時動態 geojson 文字檔之 臺中市 151 路 高雄市 100 路; 其他都市名稱請見 官網說明文件 第 4 頁; 原始碼)。 壞掉好久的 朝陽科大五路線公車動態地圖 終於又可以動了! 以下分享範例程式及注意事項給 php 程式設計師。

2017年12月31日 星期日

概念性、宏觀視野的程序/執行緒同步機制總覽

同步機制總覽 大學時代, 作業系統這門課修得破破的。 後來當助教、 甚至現在自己教書再遇到作業系統, 也都不是那麼有信心。 特別是談論 processes 及 threads 的同步機制那一章: 各種硬體指令 (test-and-set、 compare-and-swap) 各種演算法 (Peterson's algorithm、 Bakery algorithm) 各種程式結構或資料結構 (spinlock、 mutex、 semaphore、 condition variable) 都很燒腦細胞。 更糟的是, 從來沒看過一篇宏觀的文章介紹這些機制彼此之間的關係, 就算看懂個別的演算法, 還是有見樹不見林的感覺。 還好現在有網路、 有 google。 爬了很多文之後, 整理這篇文章, 從宏觀角度著眼, 不鑽研程式碼 (但有很多超連結), 自己思緒變得清晰很多, 也希望對未來的作業系統課程師生以及多執行緒程式設計師有幫助。 本文假設讀者對於 context switch、 critical section 等等名詞已有概念。 以下 processes 跟 threads 混著用不特別區分。

2017年12月30日 星期六

ImageMagick mask : 批次遮罩疊圖 (例如局部著色)

遮罩疊圖的各階段圖片 先前曾經 在 gimp 裡面採用遮罩機制 幫相片只保留主角的顏色。 遮罩疊圖不僅限用於著色。 凡是需要 「把一張圖的一部分疊到另一張底圖之上」 的動作都適用。 如果有很多張圖要用相同的方式處理, 改用 ImageMagick 指令會比用 gimp 快。 最麻煩的部分是: 每張圖的遮罩很難自動產生。 不過現在 AI 那麼厲害, 很快地就會出現各種類似 街道圖片 semantic segmentation 語義分割 的類神經網路, 到時候這篇所介紹的技巧就會很有用了: 我們要解說如何用 ImageMagick 命令列把一張原圖及它的語義分割成果圖轉換成局部著色的圖。 我已更新 範例圖檔, 裡面包含九張原圖 (orig/*) 跟九張語義分割成果圖 (result/*) 所以你不需要架設 docker 等等, 只要有安裝 ImageMagick 就可以跟著實作。

2017年12月24日 星期日

街道圖片 semantic segmentation 語義分割實作

街道圖片語義分割結果 (只有「人」的部分著色)

所謂 (圖片的) semantic segmentation 語義分割 是指 「如何辨識一張圖片當中哪些 pixels 構成了人、 哪些 pixels 構成了車子、 ... 等等」 這個問題。 理論的部分 ( 知乎簡中原文 itread01 內容農場正體中文) 我也沒研究, 呵呵, 直接省略。 幾個月前上網找到 (僅適用於分析街道圖片的) ENet Semantic Segmentation 實作, 斷斷續續花了幾個週末 建立映射 撰寫 Dockerfile、 修改外包裝 python 程式, 這個週末終於把可用的版本上傳到 Dockerhub 的 ckhung/enet 去。 嗯, 效果不太好... 大家將就玩玩看吧!

跑 AI 程式時出現 illegal instruction 錯誤

跑 AI 程式時出現 Illegal instruction (core dumped) 這樣的錯誤, 很有可能是因為 CPU 太舊/太弱, 不支援某些向量運算。 先前 玩 face_recognition 的時候 遇到的是 dlib 函式庫需要 sse2/sse4 指令; 這次則是玩 ENet 又遇到 illegal instruction。 看了一些不完全相關的文章和錯誤訊息, 包含: draw_net 的 "OpenBLAS : Your OS does not support AVX instructions" 警告、 caffe 的 issue intel 論壇 等等, 最後的結論是: ENet 版的 caffe 需要 CPU 支援 avx 指令。 可以用 grep -i avx /proc/cpuinfo 查看你的 CPU 是否符合要求。 雖然沒有力氣重新編譯 ENet 版的 caffe 所以無法百分之百確認, 不過曾在五部電腦上測試過, 三部沒有 avx 指令的電腦在 python 程式碼 import caffe 時都出現 illegal instruction 的訊息; 兩部有 avx 指令的電腦確實都能順利執行。 如果你也跟我一樣拿古老的文書機來跑 AI 程式, 而且遇到相同的錯誤訊息, 請留言確認一下這個規則是否也適用你的狀況囉!