Amo Chen

Python - fcntl.flock(fd, op) 檔案鎖應用範例

flock 之前,先來聊聊為什麼會需要 flock 。

如果有多個 Processes 同時對同 1 個檔案進行讀寫操作,很容易就會發生同步問題,這時候最簡單的解決的方法就是用個鎖( Lock )確保同一時間只有 1 個 Process 可以對 1 個共用的檔案進行操作。

而 flock 就是幫忙建立 Lock 的一個機制,其原理是利用 1 個檔案作為鎖(Lock) , Process 要對某個檔案進行讀寫操作時,得先獲得鎖(Lock) 才能進行讀寫操作,其他沒獲得鎖(Lock)的 Process 則會被阻擋無法執行。

另一種常見的情況是為了確保 Crontab 內定期執行的程式同一時間只會有 1 個 Process 在執行,也會利用 flock 避免因為下一次定期執行時間到而又執行一個新的 Process 。

flock 除了可以用 flock 指令之外, Python 也內建提供 fcntl 模組幫我們建立/獲取 flock 鎖。

Posted on  May 8, 2018  in  Python 程式設計 - 高階  by  Amo Chen  ‐ 2 min read

SSH 設定 - ControlMaster

在不進行任何 SSH 設定時,每次利用 SSH 連線到同一台遠端伺服器時就是建立一個全新的連線,所以相同的帳號密碼或者認證金鑰都得再認證一次,而遠端伺服器也必須為了維持這些連線而耗用系統資源。

而 SSH 有個設定稱為 ControlMaster 讓 SSH 連線使用者可以重複使用已建立好的連線,所以建立多個連線到同一台遠端伺服器時都能夠利用已經存在的連線(稱為 master connection),連帶的優點是不需要再認證一次,省下一些建立連線的時間與遠端伺服器的系統資源。

Posted on  May 1, 2018  in  SSH 設定  by  Amo Chen  ‐ 1 min read

Python - 利用 pkgutil & importlib 打造可擴充式模組

想要建立好的 Python 專案結構,模組化是免不了的過程。此外,程式 / 系統如果還需要良好的擴充性,例如可以彈性增加 Plugin ,可以考慮利用 pkgutilimportlib 模組自動載入模組的做法。

Python 知名的 Open Source 專案 Cuckoo Sandbox 就是利用類似的做法達到可擴充性,讓人可以實作一個外掛模組,然後丟到特定資料夾後,它就能夠被執行。

Posted on  Apr 27, 2018  in  Python 程式設計 - 高階  by  Amo Chen  ‐ 3 min read

SSH Port Forwarding / Agent Forwarding

最近看了 The Black Magic Of SSH / SSH Can Do That? ,深覺對 SSH 的應用超級不熟悉,所以就筆記了一些對日常工作有幫助的用法,希望可以幫助自己也幫助別人。

大部份的人都利用 SSH 進行 UNIX-like 作業系統的遠端管理工具,不過 SSH 也常常用來建立加密連線通道(也就是俗稱的 Tunnel)。 The Black Magic Of SSH / SSH Can Do That? 就提到了幾種 Tunnel 的用法。

Posted on  Apr 26, 2018  in  SSH 設定  by  Amo Chen  ‐ 3 min read

Python - 製作 JSON serializable 的類別

Python 的 json 模組十分方便,可以把 dict() tuple() list() str() int() 等資料型別轉成 JSON 字串,不過遇到像是 set() 時,就會產生以下錯誤:

>>> import json
>>> json.dumps(set())
...(略)...
TypeError: Object of type 'set' is not JSON serializable

原因在於 json.dumps() 中預設並沒有處理 set() 等型別的序列化( serialization )。

雖然如此, json.dumps() 還是有參數能夠處理這些無法被序列化的類別(class)或型別。

Posted on  Mar 29, 2018  in  Python 程式設計 - 中階  by  Amo Chen  ‐ 2 min read

Python module - jsonschema Part 3

本文為 Python module - jsonchema 一系列教學文:

Python module - jsonschema Part 2 中介紹了 number , string , array , object 等型別的複雜用法,不過絕大多數仍是單一型別資料驗證的用法,然而實際上 JSON 資料的格式可能會由多種資料型別混合而成,例如 array 裡的元素是 objectobject 裡又有可能是 object 的情況,例如以下的 JSON 資料:

[
    {
        "user_id": 1,
        "preference": {
            "cooking": True,
            "fishing": False,
        }
    },
    {
        "user_id": 1,
        "preference": {
            "cooking": True,
            "fishing": False,
        }
    },
]

本篇將介紹如何撰寫符合實際使用以及更好維護的 JSON Schema 。

Posted on  Mar 28, 2018  in  Python 模組/套件推薦  by  Amo Chen  ‐ 3 min read

Python module - jsonschema Part 2

本文為 Python module - jsonchema 一系列教學文:

上一篇 Python module - jsonschema Part 1 中,介紹了 JSON Schema 的 6 種資料型別與驗證 JSON Schema 的方法。

本篇將會更進一步介紹幾種型別( number , string , array , object )更複雜的用法。

Posted on  Mar 23, 2018  in  Python 模組/套件推薦  by  Amo Chen  ‐ 4 min read

Python module - jsonschema Part 1

本文為 Python module - jsonchema 一系列教學文:

JSON 目前資料交換格式的主流之一,然而如果要在程式中驗證 JSON 資料的格式是否正確,就需要花費一些心力撰寫驗證的程式碼。所幸現在有 JSON Schema 可以讓驗證 JSON 格式簡單化,如果是以 JSON 作為資料交換格式的 API ,可以考慮使用 JSON Schema 進行驗證。

JSON Schema is a vocabulary that allows you to annotate and validate JSON documents.

Posted on  Mar 20, 2018  in  Python 模組/套件推薦  by  Amo Chen  ‐ 3 min read