• 嘗試做一個 envchain 的仿品 (1)

    前幾天在公司跟同事聊「果黑」、「果粉黑」話題時順道聊到的:「Linux 上似乎還沒有一個像 envchain 這樣使用系統內建密鑰管理系統(如 OS X Keychain, GNOME Keyring, KWallet)來維護環境變數的同質產品,看是不是可以用 Rust 刻一個?」於是這幾天就在做一些基礎研究。

    其實 envchain 程式最關鍵處,就是從 Keychain 取出來環境變數,然後在呼叫 execvp() 執行程式時加上這些環境變數,原理不難懂。

    我自己使用的桌面環境是 KDE Plasma,所以預設的密鑰管理系統就是 KWallet。一開始直接去 Google 搜尋 “KWallet API”,心想大概就是要用 FFI 之類的去 call C ABI 來解,雖然很硬斗,但是也還能接受。

    再找了一下既有的 Rust crates 資源,以及瞄了一下 KWallet 的 package 內容檔案列表,發現其實不用這麼硬幹,透過 D-Bus 的介面就可以操作 KWallet API。

  • 我的自炊(書籍電子化)經驗

    由於書架滿了,且我沒有錢買間大房子,所以才決心買了這組「自炊」工具:

    • Brother ADS-2000 雙面文件掃描器
    • GREENON Meteor A3專業級裁紙機

    加起來共一萬五千多,雖然要價不斐,但還是比起某些大大買的、更強大的組合要便宜個至少五千,也比買一間房子便宜

    Brother ADS-2000 原本是看中它的可以直接插 USB 儲存裝置、直接掃成 PDF 功能,但是我手邊的任一 USB 碟它都不吃,我只好當作沒這個功能,退而求其次,回到連接電腦的方式來進行掃描作業。

    GREENON Meteor 則比我預期還要好用,但是拆書的時候,還是得先用美工刀先將書不斷對切到約十張左右的小份,才能去裁邊,這是省不下的細工。

    Brother ADS-2000 有提供 Linux 驅動程式,但是只有 *.rpm 與 *.deb 的套件格式,於是我還是上 AUR  去找好心的大德已經包好的 brscan4,順利在我的電腦上驅動這台掃描器,且 XSane 連它的雙面掃描功能 (Duplex) 都有對應支援,可以完整發揮它一次饋紙就掃雙面的功能,這台在 Linux 上功能也不打折,價格也頗實在,我很滿意。現在買還送標籤機跟印表機,真是吃撐我了,家裡都沒空間了還送我這麼多東西。

    掃描好的影像檔,再送到 Scan Tailor 去處理校正歪斜、裁去白邊、去雜點、調整輸出濃淡後,輸出成 *.tif 檔。

    接著再用

    tiffcp -a scan-*.tif book.tif

    將多個 TIFF 檔合併為單一多頁 TIFF 檔,

    tiff2pdf -z -o book.pdf book.tif

    將這個單一多頁 TIFF 檔轉為 PDF 檔,就大功告成。

    如果沒有雙面文件掃描器與裁紙機的輔助,只用傳統平台式掃描器與美工刀,我看一本紙本書轉成電子書的工作大概要花上好幾天,且很可能這些人工繁雜到會讓你想半途而廢,所以如果要搞自炊,請至少一定要買一台雙面文件掃描器,它會讓整個作業不只變快,也減少失誤。

  • 既線上又離線的 The Rust Programming Language 讀書會 (1)

    前因:強者我同事揪的讀書會,要讀 [The Rust Programming Language]。我礙於家庭因素,不便親至,所以想跟著當次進度看,遠距參與,有點像函授學校吧。(啥?)

    關於  Rust 這個語言,我不算陌生,但說嫻熟也還差得遠。因著這個機會,能促使自己把它有系統地學好,也是福氣,所以在此先感謝 BobChao 的慫恿,括號笑。

    如果不小心路過讀到這篇的您,對 Rust 還一無所知,我想先為您引介:

    • 這是 MozillaSamsung 合作的新一代瀏覽器引擎 Servo 所使用的最主要語言。能寫「瀏覽器」這個應該是當前消費者市場上最複雜的軟體,我想以一個系統程式語言來說,應該可以佐證它的能力足堪重任。
    • 另外,庄晓立先生的〈为什么我说Rust是靠谱的编程语言〉這篇文,寫得很生火(令人想躍躍一試的意思),但是論述很實在、不浮誇,我也推薦一讀。

    倘若您看完上述介紹,覺得 Rust 值得跳進來玩玩,竭誠歡迎跳坑。

    接下來就是我自己的讀書筆記了。(遠目)

  • 寫完這篇之後,我就不再挖苦 DevOops 了(立旗)

    約莫過去一年多,有幾篇改變我在 IT 工作上一些思想、甚至是待人處世之道的文章,恰巧,都是簡體中文的:

    1. 闲谈集群管理模式 – taowen – SegmentFault
    2. 怎样尊重一个程序员
    3. 架构腐化之谜 – TW洞见
    4. 开发团队的效率 | 酷 壳 – CoolShell.cn

    第一篇是讓我對 Docker、容器化技術,有更高視野的「當頭棒喝」、啟蒙文。

    第二篇教我省思「學習」與「了解」,很像是以前在圖書資訊學學到的 “Knowledge” 與 “Fast Facts” 的區別。所以,面對問題時,要知道自己或他人缺的是「學習」還是「了解」。

    第三篇教我如何用正確的「心態」去做架構設計或重構。

    第四篇我就直接引用其中一段吧:「你总需要在一个环节上认真,这个环节越往前就越有效率,越往后你就越没效率。要么你设计和编码认真点,不然,你就得在测试上认真点。要是你设计、编码、测试都不认真,那你就得在运维上认真,就得在处理故障上认真。你总需要在一个地方认真。」很像是我們在講當兵或科層組織時常掛在嘴邊的「鐵鎚釘釘子,釘子釘木板」。

    下面沒有了。

  • AlphaGo 與李世乭的五番勝負

    對 AI, Machine Learning 這領域不熟,對圍棋也只是很粗淺的認知,這篇我只想記下幾件事情,且不要寫的像某些人趁著熱門話題在裝逼。

    1. 如果不事先告訴我這是 AI 在下棋,AlphaGo 的表現的確很像高段棋士。
    2. 第四場很經典,但是「AI 會發現自己錯誤,這點很可怕」這種論調,明顯是不懂圍棋,人類棋士在下棋,反省哪步棋為敗著是尋常之事,AlphaGo 只是一樣做到這點而已,而且我也覺得一個下棋的 AI 本就應該做到這點。
    3. 預期圍棋界將引發新一波的既有定式反思與改革。
  • 試玩了一下 Raspberry Pi & Buildroot 自己編一套系統

    強者我同事 BobChao 出清一塊 Raspberry Pi Model B,雖然我本來就有一塊,但是在拉麵店裡基於某種天外飛來的不正經念頭,想要試做一個家庭娛樂系統(唸作:「電視遊樂器」),所以就收下來當開發機板了。而原來的那一塊呢,就…另外有用途。

    其實這個不正經的念頭是這麼來的:在前不久,我苦苦哀求老婆跟我一起玩 PS3,但是她自稱除了「打飛機」(捲軸射擊)類會玩以外,其他皆不在行,所以我就開了 1942: Joint Strike 跟她玩。這圓了我這個阿宅長久以來的夢想之一:跟老婆快快樂樂開開心心打電動。

    於是我就在想,撇去市面上既有遊戲機對懷舊遊戲的舊瓶裝新酒,像是 Wii, 3DS 的 Virtual Console 之類的服務不談,Raspberry Pi 其實很適合拿來自己搞一個這樣的懷舊遊戲系統,在上面藉著模擬器玩一些早期的「打飛機」遊戲,早期遊戲由於畫面沒那麼複雜精緻,也讓輕量玩家不那麼畏懼。(好吧,說到「打飛機」這個詞呢,我知道在某些地方有特別的含義,不過這裡指的就是捲軸射擊遊戲。)

    雖然已經有 RetroPie 之類的解決方案,但是開機速度上我是不滿意的。以當前遊戲機系統愈做愈複雜、開機、載入遊戲愈來愈久、還三不五時來個線上更新的現象,簡直就像在用 Windows 一樣,等到終於可以玩到遊戲,熱血與玩心早就冷了。我希望這個「家庭娛樂系統」可以像早期的遊樂器一樣,電源打開,遊戲畫面就出現在映像管螢幕上,找回那種讓人對遊戲裡的挑戰躍躍欲試的衝勁。

    所以某種程度上,我需要自己做些髒活,讓這個「家庭娛樂系統」比較像個消費型家電,而不是望而生畏的電腦。

    經過粗略的研究後,發現其實已經有 Buildroot 這個方案,可以讓我先搭建一套具體而微的陽春基礎系統,以預設的 raspberrypi_defconfig 配置編出來的成果,兩秒多就可以完成開機:

    Buildroot-generated system boots on my Raspberry Pi

    這樣的結果讓我很滿意,如果再拔掉一些用不到的東西,應該還可以再偷一點時間,或盡早載入模擬器系統的 UI,感官上又可以騙到一點。

    Buildroot 真的是很棒的工具,從搞定有點阿雜的 cross-compilation toolchain 到 build 目標系統,整個嵌入式系統的建置流程基本上幫你做好,在這個基礎上開發自己的應用就少掉了很多苦工。