2015 年文章
在 MacBook 上使用 Python 作實況視訊串流
Published: 約 8 分鐘本文是山姆鍋在學習實況視訊串流(live video streaming)過程,用來驗證概念(proof of concept) 的紀錄。透過 MacBook 內建的鏡頭作為視訊源,並藉由 HTTP Live Streaming (HLS) 協定作實況串流。 雖說是實況,但因為採用 HLS 協定,先天上就會有延遲的。實驗的結果不算太成功,本來只能使用桌面環境的 Safari 瀏覽器來觀看視訊,經過高手指正後,現在手機版的也可以了。
在 Windows 64 位元電腦上編譯 Libtorrent-python
Published: 約 8 分鐘最近需要使用 BitTorrent 來實驗點對點資料傳輸功能,所以想說來玩玩 libtorrent 這個程式庫(C++),為了方便實驗,也需要它的 Python 綁定。經過三天的爬文與奮戰,終於在 Windows, OSX 以及 Ubuntu 上成功編譯或安裝,本文山姆鍋就來分享在 Windows 64 位元電腦上編譯的方法之一。
使用 Buildbot 進行持續整合與軟體打包工作
Published: 約 10 分鐘由於專案需要在幾個桌面環境建構發行包(distribution packages),不久也想在 Raspberry Pi 上面進行,需要一個可以在不同平台環境上自動執行建置工作的軟體。 基於過去比較與使用的經驗, 山姆鍋選擇了 Buildbot 來進行這項工作。
簡單好用!JQM 跟 Backbone 做 Web 用戶介面
Published: 約 8 分鐘山姆鍋對 JavaScript 大多數框架都不算熟悉,但因為《我.影化身》專案需要提供 Web 介面, 不得已也要選擇符合自己需要的框架來運用一下。幸好,我的目標只是一個相對簡單的使用者介面, 讓這個過程縮短不少時間,最後決定使用 JQuery Mobile + Backbone 這樣的框架組合。
台灣期貨指數即時報價 - 使用 BeautifulSoup4
Published: 約 2 分鐘原本只是為了作為 [《我.影化身》](https://github.com/eavatar/eavatar-me) 的範例, 嚐試使用 BeautifulSoup 來擷取「台灣期貨交易所」提供的報價網頁內容, 在過程中,覺得 Python 使用在網頁擷取(web scraping)真的是一大亮點!
在 CircleCI 上使用 Docker
Published: 約 8 分鐘本文進一步來看看如何在 CircleCI 上使用 Docker 在每次代碼提交時自動建構應用程式的映像。
使用 CircleCI 作為《我.影化身》雲端持續整合方案
Published: 約 6 分鐘CircleCI 是山姆鍋到目前為止認為最好用的雲端持續整合方案。《我.影化身》開發自然也需要利用持續整合來自動執行軟體測試與建置工作。本文便以《我.影化身》作為應用實例,說明如何簡單完成與 CircleCI 的設定。
任務自動化的多功能代理人 - EAvatar ME
Published: 約 5 分鐘本文介紹一個開發中的代理人(agent)工具程式:"EAvatar ME",中文名稱《我.影化身》,唸作我的影化身。 這個代理人程式設計來執行一些例行的工作(tasks),由於每個人的例行的工作可能大相逕庭,這個代理人自然也要能夠根據不同情境執行不同腳本。
簡單的插件框架 - 使用 pkg_resources
Published: 約 7 分鐘Python 其實擁有內建的機制來實現一個簡單的插件框架。本文山姆鍋藉由插件框架來介紹 pkg_resources 這個 Python 用來管理套件資源的套件(package)。
點對點媒體串流在行動網路的一些構想
Published: 約 13 分鐘隨著網際網路媒體串流的流行以及同時觀眾數量不斷增加,要架構出一個支援實況(live)媒體串流(streaming)的解決方案, 是一件越來越困難的技術挑戰。本文描述一個基於點對點(peer-to-peer)的方式進行媒體串流的行動網路架構,以減輕對媒體源(media origin)的負擔並減少頻寬的成本。
使用 Python 設計一個參與者模式框架
Published: 約 11 分鐘山姆鍋在過去的文章中,數次提到「參與者模式 (Actor Model)」這個名詞,也使用 [比喻的方式](/post/2015/10/what-if-i-have-shadow-clones/) 解釋它的概念。在多種分散式編程模式中,對山姆鍋來說,這是最不會讓頭腦打結的方法
如何實作簡單的持久性訊息佇列?
Published: 約 5 分鐘使用 LMDB 內嵌式資料庫實現訊息祝列。
Python 如何找到綁定的 IP 位址?
Published: 約 2 分鐘使用 Python 建立 Socket 物件並綁定(bind)到網卡後,該如何取得實際綁定的 IP 位址?這個問題多數人都會覺得簡單,但真的有這麼容易嗎?
假如我會多重影分身之術
Published: 約 3 分鐘山姆鍋從小就愛看漫畫,雖然隨著年紀看的量越來越少,不過幾部熱門的漫畫可是都有在關注。「火影忍者」雖然已經完結,但漩渦鳴人的「影分身」術 - 抱歉,是「多重影分身」之術還是留下深刻印象。常常在想,假如我有多重影分身術,那會是什麼光景!
程式人就該有個部落格
Published: 約 4 分鐘在臉書上跟大家討論為什麼沒有多少人在分享文章,我指的是原創的文章。雖然很難用單一理由解釋原因,但山姆鍋深信部落格還是有它存在的用處,也相信程式人就該有個部落格。
Python 的沙盒實驗
Published: 約 4 分鐘沙盒是一個有限制的執行環境, 用來執行不受信任的程式碼/腳本(script)。本文山姆鍋基於需要,實驗一個 Python 沙盒的開源專案。
什麼時候適合用 TimeUUID?
Published: 約 4 分鐘有時候就算是一些微不足道的程式小技巧,用到時仍舊會心存感激。
高可擴展的任務執行架構設計
Published: 約 5 分鐘山姆鍋描述了一個高可擴展的任務執行(task execution)架構的設計。針對同一組需求,不同的人會有不同架構設計,沒有所謂標準答案。 這應該跟架構通常描述的是比較抽象的概念有關。
高可擴展的任務執行架構需求
Published: 約 4 分鐘最近山姆鍋在思考一個大型網路系統架構設計的問題,為什麼是大型網路?因為沒有機會實作,只好紙上談兵幻想一下。 這裡所指的「大型網路」是指可擴展到支持上萬個以上節點(node)的網路架構,為什麼要設計這樣的架構?
利用 BitTorrent DHT 來控制殭屍網路
Published: 約 5 分鐘曾經讀過一篇關於「殭屍網路(Botnet)」透過 BitTorrent 作為命令與控制中心(command and control center)的文章。 細節雖然已經不太記得,但有天心血來潮,想說到底要如何透過 BitTorrent 來控制一群殭屍電腦?
用 Python 實作混合式邏輯時鐘
Published: 約 3 分鐘山姆鍋平常喜歡搜尋一些有趣的開放源碼專案,尤其是有提供設計文件的。有天不知道怎麼地逛到了 Cockroach DB 這個專案,它的設計文件有許多有趣的地方,但我特別注意到其中一篇論文,關於使用邏輯與實體時鐘來實現一個分散式時間郵戳(timestamp)的演算法。
山姆鍋過去常用的口試考題
Published: 約 3 分鐘面試工程師,除了一定要做的實際筆試之外,山姆鍋為了進一步了解候選人(candidate)的能力,會再口頭提問幾個問題。 這些問題對某些人來說,可能覺得不難,但山姆鍋的經驗發現,能夠正確回答出這些問題的比例比預想的少許多。 甚至可以說:會這些題目的工程師,能力已經在水準之上。
為什麼使用資料庫當作訊息佇列不是問題?
Published: 約 4 分鐘在山姆鍋頭幾年工作中,有一次的經驗讓我到現在還記得並引以為戒。話說這整件事情就跟使用關聯式資料庫當作訊息佇列(message queue)脫不了關係。
去中心化身份驗證與訊息傳遞
Published: 約 11 分鐘山姆鍋期望雲端存儲與備份服務,可以做到保護使用者的資料安全與隱私。針對要達到這樣目標, 已經說明了其中需要的兩個關鍵技術:「資訊擴散演算法」以及「Convergent Encryption」。 本文山姆鍋說明另外一片重要拼圖:「去中心化身份驗證(decentralized authentication)」
一個有創意的檔案切割演算法
Published: 約 11 分鐘版本控制與檔案同步軟體其中一個重要功能:讓來源(source)檔案的內容跟目標(target)檔案內容相同。直覺來說,最簡單的方式:將來源檔案複製(copy)到目標檔案。不過這種做法,對於像是同一個檔案的不同版本的同步,會耗用太多不必要的頻寬與儲存空間之外,時間往往也是個造成這種方式不實際的因素之一。那有沒有更有效的作法呢?
Python 的 SHA-256 以及 AES-256 CBC 程式範例
Published: 約 7 分鐘在 「Dropbox 做到資料加密又避免重複儲存的秘密」 這篇文章中,有提到使用 AES-256 對稱式加密,以及 SHA-256 雜湊演算法, 本文山姆鍋提供這兩者在 Python 的應用範例作為補充。
Dropbox 做到資料加密又避免重複儲存的秘密
Published: 約 8 分鐘Dropbox 是一個很受歡迎的雲端資料儲存與備份服務,從使用者的角度,它真的很方便,有些很大的檔案往往也能很快就能完成上載。 但您想過它為什麼可以做到這樣快速上傳,背後的技術原理是什麼?對於您的資料安全與個人隱私又有什麼影響? 山姆鍋根據自己的了解,為您解釋 Dropbox 到底是如何運作的。
很酷的糾刪碼(erasure code)技術
Published: 約 8 分鐘很早之前在寫 QR Code 解碼器的時候就接觸過「糾刪碼」(erasure code)這種技術, 因為 QR Code 有使用到 Reed--Solomon error correction。雖然知道是數學的運算結果,但至今還是對它的功用感到很神奇!背後的編碼理論已經超過山姆鍋的理解範圍,但撇除背後的數學理論,身為工程師要如何理解糾刪碼,以及作何應用呢?
使用 PyInstaller 打包 PySide 應用程式
Published: 約 7 分鐘使用 PySide 開發桌面應用,雖然開發方便,但總不能直接將程式碼給使用者,要他們裝這個套件,裝那個程式庫的。 本文山姆鍋介紹如何使用 PyInstaller 這個工具來打包 PySide 開發的桌面應用程式。
給部落格來點 SEO
Published: 約 10 分鐘在使用 Google Search Console 時,發現 Google 無法找出文章的結構化資料,原來是所使用的 Pelican-bootstrap3 主題樣板沒有設定正確的標記,為了讓部落格文章可以被搜尋引擎正確地分析,看來需要修改樣板主題來處理這個問題。
建構一個與 Ubuntu 相容的小型 Docker 映像
Published: 約 8 分鐘圍繞著 Docker 容器(container)技術所引發的風潮,一個越來越成熟的生態系正在形成。相信許多人都在關注它的發展,也可能有諸多的疑問。對於真正想把 Docker 應用在生產環境的人而言,其中一個疑問可能是:Docker 的映像(image) 非得動則幾十,上百甚至上千 MB 嗎?
使用 PySide 實現 Python 系統托盤圖示
Published: 約 4 分鐘本文山姆鍋說明 Python 如何使用 PySide 來實現一個跨平台(cross-platform)的系統托盤圖示應用程式。
解決 Django 功能測試中資料會被清除的問題
Published: 約 4 分鐘山姆鍋在使用 Django 的 LiveServerTestCase 時 發現資料庫的資料在第一個測試案例(test case)之後就會被清除,導致後續的測試無法正常運作。
如何給 Pelican 增加 Jinja2 過濾器
Published: 約 3 分鐘雖然這個部落格主要語言是正體中文,但偶爾會需要將英文轉成中文來顯示。例如:將導覽路徑(breadcrumb)轉成中文,但在網址路徑中維持使用英文。 要達到這個目的,使用 [Jinja 2](http://jinja.pocoo.org/docs/2.10/) 模板的過濾器(filter)應該是個簡單方案。本文山姆鍋說明如何增加一個客製化過濾器, 來將模板中部分的英文字串對應到中文。
如何在 PySide 顯示 QR Code
Published: 約 7 分鐘從現在來看,QR Code 的使用算是很普遍,例如用來產生網頁文章的超連結、Bitcoin 的位址等等。不管目的是什麼,產生 QR Code 已經是常有的需求。 本文山姆鍋分享如何使用 Python 的 qrcode 套件來產生 PySide 可以顯示的 QR Code 圖檔。
如何使用插件自動在 Pelican 插入預設圖檔
Published: 約 3 分鐘山姆鍋喜歡文章至少有張圖檔,沒有特別相關的主題的話,也希望可以顯示一張預設的圖。
如何讓 Tipue search 可以支援離線搜尋
Published: 約 7 分鐘Tipue search 是一個 Javascript 程式庫,可以在客戶端進行資料搜尋,對於像本站一樣的靜態網站,是一個可行的選擇。 山姆鍋為了讓網站內容可以快取在客戶端,使用了 HTML5 application cache 的技術。透過這樣的技術,網站大部份內容都可以離線觀看,但是卻發現 Tipue search 無法在離線狀態下運作。
改用 Pelican 寫部落格文章
Published: 約 2 分鐘雖然已經很久沒寫文章,但為了以後需要,還是先設定好這個網站,同時也更換 Octopress 為 Pelican。由於荒廢了 Octopress 有一段時間, 加上又決定使用 Python 作為寫程式的主要語言之一,改成 Python 的解決方案,似乎也是合情合理。過程中,也嘗試過 Hyde 以及 Nicola ,但覺得要達到自己的需求,好像缺少一些東西。在停滯一段時間後,決定重新好好整頓一下!