企業內 P2P 網路架構設計要點簡易分析
目前常見的 BT (BitTorrent), eMule (EDLink) ,都是屬於公開匿名式 P2P 網路。它們的檔案分享關係網路是公開的,任何人都可以加入,並不適合企業內部的檔案散佈需求。
但也存在私有 P2P 網路架構(Private P2P)。有發展時間長久、支援軟體眾多的 Direct Connect,以及從匿名式 P2P 網路擴充過來的 Freenet 等。
目前常見的 BT (BitTorrent), eMule (EDLink) ,都是屬於公開匿名式 P2P 網路。它們的檔案分享關係網路是公開的,任何人都可以加入,並不適合企業內部的檔案散佈需求。
但也存在私有 P2P 網路架構(Private P2P)。有發展時間長久、支援軟體眾多的 Direct Connect,以及從匿名式 P2P 網路擴充過來的 Freenet 等。
我前天想要修改我寫的一個精簡型 PHP RESTful 框架 (「CommonGateway」),將它由外部設定(注入)控制項屬性內容的動作,改的更有使用彈性。最好像 Java Spring framework 那樣,可以透過注記(annotation)方式,讓使用者指定要注入的項目。
雖然 PHP 的語法並不支援注記符號,但是我可以變通一下,把注記內容寫在 doc 區,然後再自己解析 doc 的內容。 PHP 的 phpDocumentor 和 PHPUnit 工具就是這麼做的。這個工作倒也不難,只需要用到 PHP Reflection 功能的 getDocComment() 就可以了。
我之前在「JavaScript 與 Desktop - DBus」說明 gjs 如何調用 D-Bus 服務時,提到 gjs 提供的 D-Bus 實作內容相當低階,以致於我們必須要自己定義我們想要調用的 D-Bus 代理個體的介面原型。在該文中我也提到,大部份的 D-Bus 服務都會實作 org.freedesktop.DBus.Introspectable 介面,提供 Introspect 方法(D-Bus 的 introspect 在 Java/C# 中採用的說法就是 reflect),讓其他人可以藉由這個方法查看介面規格。我們查詢的結果會是一份 XML 文件,若我們進一步分析該文件,就可以直接將分析結果交給 DBus.proxifyPrototype() 注入指定的代理類別。
本文就是想要利用 gjs 實作的 E4X 能力,去解析遠端個體傳回的內觀資訊(introspection),由程式自行產生 gjs dbus 模組所需的介面原型敘述,再注入成為新的類別。免除由程序員自己手寫介面原型敘述的不便。
今天我來說個新的程式語言,CoffeeScript 。 CoffeeScript 的編譯器會將它的程式碼轉譯成 JavaScript 程式碼。它產生的 JavaScript 程式碼基本上可以在任何 JavaScript 環境中運行。
我沒有用過這玩意,只是它的語法令我覺得有點意思。CoffeeScript 的設計目的,在為 JavaScript 環境提供一個「更整潔的語法」。我大致看了一下它的程式碼範例,它大部份的語法混合了 Python 與 Ruby 的風格,但程式碼區塊(匿名函數)這部份則是採用 C# 語法。 我們來看看「Your first cup of CoffeeScript, Part 1: Getting started」這篇文章中的範例程式碼,初步認識 CoffeeScript 的語法。
介紹 JavaScript 關於函數與建構者的基礎知識。理解此一基礎,將建構者內容參數化。 透過參數化的技巧,實作一個產生新類別的類別。
JavaScript 沒有類別定義的關鍵字。"定義類別"這句話在 JavaScript 中的意義, 等於是定義一個新的建構者(Constructor)。
週日閒來無事,得知高雄駁二藝術特區有一場「繪師100人展」,展示日本100人著名繪師的畫作。 展示內容正好是我感興趣的 ACG 萌系畫作,所以我就跑去參觀了。單人票價250元。
以庶民的娛樂「浮世繪」為題,抓住現代人心靈的寄託,並集合介紹100位現代「繪師」的新作,從人氣繪師所描繪的獨特世界觀,展現高超的繪畫技巧、質感、與潛力,不斷地帶給世界最新的日本價值觀。
畫展活動資訊:
在上一篇《SOD 安全文件概論》中,我直接使用工具 openssl 解讀 SOD 的內容。但它只是按照各項資料的結構順序,用粗略的格式顯示資料內容。本文則是直接用 OpenSSL C 函數庫解讀 SOD 內容。
由於本文案例中的 SOD 採用 ASN.1 格式儲存,所以解讀 SOD 的工作實際上就是 ASN.1 文件的解讀工作,需要利用 OpenSSL C 函數庫中與 ASN.1 相關的函數。不幸的是,在已經很貧乏的 OpenSSL C 函數庫文件中, ASN.1 函數更是連份說明文件都沒有。如果不直接去讀 OpenSSL 的 C 源碼,可能根本寫不出 ASN.1 解讀程式。在此提供大家一個指引方向,想要進行這項挑戰的人,只需要去讀 OpenSSL C 源碼的 crypto/asn1/asn1_par.c 這份源碼文件。本文也沒有足夠的資訊仔細說明那些 C 函數的用法。
Google Android 4.0 (Ice Cream Sandwich) 上月發佈,其中被當作主要賣點的「臉部辨識解鎖」(Face Unlock)功能,在我們公司中,基本上是當作笑話在看的。我的 twitter 中,也推了4則訊息提到 Android 4.0 的臉部辨識解鎖。
我九月份在部落格上發了一篇《因為影像左右相反,導致識別系統軟體專案失敗的例子》。臉部辨識就是該案例的軟體系統中的主要軟體項目。我們公司身為該專案眾多協力廠商的其中一員,對臉部辨識功能於實際佈署運用時會碰到的諸多狀況,也累積了不少經驗。而 Android 4.0 臉部辨識被發現的兩個狀況,不過是我先前就知道的其中兩件事罷了。
在 RFID 或其他微型儲存媒體的應用情境中,我們會將使用者的相關資訊儲存在 RFID 內。再透過讀取 RFID 的內容,快速判讀使用者的識別資訊,完成所需的工作。例如我們將員工的識別資訊存入 RFID 。員工持卡刷過門禁系統上的讀卡區後,門禁系統就可取得持卡人的身份,判斷是否允許進入。
但是我們要如何確認這張卡的內容是由我們發出的呢?再者,RFID 是可重覆寫入的儲存媒體,亦即他人可以自行修改裡面的內容。我們又要如何保證 RFID 的內容沒有被使用者自行竄改呢? 這些議題,可以藉由 OpenSSL 滿足其安全需求。
我今天買了台 AXIMCom MR-105NL 的無線網路分享器,主要是看在價格便宜還支援 3G 網路分享。只是我的用法有點特別,不是它原來預設的方式,所以我調整了一些它的設定。
AXIMCom MR-105NL 的預設工作模式是網路分享器暨 AP 。但我原先已經有一台 MikroTik RouterBoard RB750G 網路分享器,它的功能更穩更好。所以我不需要使用 MR-105NL 的網路分享器功能。我只需要 MR-105NL 接在 RB750G 上,做一台單純的乙太網路集線器暨 AP 。各網路設備的連接情形如下所示。
手機、筆電 -> Wi-Fi 訊號 -> MR-105NL -> 網路線 -> (DHCP) RB750G -> ADSL Modem -> Internet
我上週整理我幾年前開發的一個具備簡單 Active record 與 ORM 功能的 PHP 資料庫函數庫 schema-database 。我想要為查詢函數加上一個參數,讓編程人員選擇查詢結果的型態為陣列或個體。因為 schema-database 的底層是 PDO ,所以要調整 PDO 汲取方法(fetch)的選項。
在改寫動作中,我注意到 PDO 有一個選項叫 PDO::FETCH_CLASS 。它與 PDO::FETCH_OBJ 的差別在於 PDO::FETCH_OBJ 汲取出的資料型態是標準類別的個體(stdClass),也就是單純的屬性集合體。而 PDO::FETCH_CLASS 汲取出的資料型態則是指定的類別的個體;這個類別可由使用者自己定義。 PDO::FETCH_CLASS 的用途,很明顯可以搭配 ORM 類,讓 PDO 直接幫使用者配置 ORM 實體。
我最近聽到一件失敗的軟體專案例子。內政部某單位,建了一套基於生物特徵辨識的身份識別與出入管制系統。這個系統會收集一般人的臉部與指紋特徵,建立特徵資料庫。並結合門禁與監視器設備,管制人員出入。聽說還會與走道的監視鏡頭結合,隨時識別進出人員的身份。簡單地說,從你進入該單位管轄區域之後,你都一直處於被識別的狀態,直到你離開為止。一但區域內監視器中的人員影像,被識別為黑名單人員,或是沒有進入記錄,都會通報管理人員。
這種系統,可以說是小型的天眼系統,或說是人肉搜索系統。不但錄影,還會識別身份。多少都會觸及人民隱私權的議題。不過這不是本文重點,就不多談。
9月1日到台北參加了每年慣例的 IBM 開發者大會,活動主頁見此「Innovate 2011 IBM開發者大會」。今年的活動主題是「Software, Everyware」,台灣則取為「創意無所不能╳軟體無所不在」。我個人覺得英文主題寓意較佳。中文實在翻得太長了,「創意無所不能」這句話甚至沒有點到會議的另一項主題:「Software driven innovation」。現場的口譯人員好像譯為「軟體驅動創新」。今年的議程主題,圍繞在軟體開發的生命週期(Lifecycle)之上。切入點是從「Everyware」開始,再延伸到生命週期管理,進一步追求創新的可能性。
我前陣子打算把我的 ThinkPad X200s 的系統從 Ubuntu 10.04 轉移到 Debian 6。 安裝 Debian 6 之後的使用過程中,大部份的硬體裝置都沒有什麼問題,就是 WiFi 網卡未驅動,以至於無法使用 WiFi 連接網路。我這款 ThinkPad X200s 配的 WiFi 網卡是 Realtek 8192SE。上網查了一下,原因出在 Realtek 提供的 Linux 驅動程式碼是專屬授權,故 Debian 預設不使用。在 Debian wiki 有一份關於「rtl819x」的條目提到 Realtek WiFi 網卡的支援內容,使用者必須勾選 non-free (受版權限制的項目)才會看到相關套件。根據那項條目,RTL8192SE 的支援套件被收錄在 Wheezy (testing) 套件庫。不過我曾試過混用 Squeze 與 Wheezy 套件庫的套件,但衝突太多,搞得系統不太穩定。所以我不想用 testing 的內容,故我選擇了自行下載源碼編譯安裝的方式。
我個人有幾個 e-mail 信箱,一直以來都按照用途來區分。 就像有些人的手機總是要用雙卡雙待,一卡公事,一卡私事。 我在個人部落格以及參與自由軟體社群討論時,以往使用的 e-mail 信箱是 shirock@educities.edu.tw。 這是我在大學時期申請的亞卓市服務項目之一。 然而就在這個月底,這個陪了我超過十年的信箱,隨著亞卓市關閉電子郵件系統相關的所有主機之後,正式走入歷史。 因此我今天將部落格上的個人聯絡信箱,改為 gmail 信箱。
在幾個月前,亞卓市服務中心就開始通知用戶在今年7月底前,就要停止電子郵件服務了。 不過我先前疏忽了,一直到上週發現亞卓市的郵件系統主機的網域名稱整個消失了,我才注意到這件事。 所幸我在上面的郵件都有整理,重要的都有備份。 不過八月份以後,寄送給這個信箱的自由軟體電子報及部落格上的讀者回應等內容,我就漏收了。
網際網路早期,e-mail 地址也代表著一個人在網路上的識別記號。 雖然近幾年隨著社群網站的興趣,晚近的網路使用者更常用的網路識別記號可能是 Twitter, Facebook 等帳號。 但對我這不用 Facebook 的人而言, e-mail 仍有其識別意義。 在瞬息萬變的網路環境中,十年是相當長的時間。 我由衷感謝 shirock@educities.edu.tw 信箱伴我走過這麼長的日子。
某日,我與強者我朋友閒話時,強者我朋友說他某日和梅友仁閒話時,梅友仁告訴他一則我一定感興趣的江湖傳言。江湖傳言道:國內某系統大廠把 Android 的 Dalvik 移植到 Linux 作業系統,並且運行在x86平台。
我說,該不會是 Android-x86 吧?那不是什麼新聞了。強者我朋友說「非也」。傳言所說是無修無改的 Linux 核心配上 Dalvik ,不是用 Google 修補過再被其他人移植的 Android-x86 。
我先前在「PHP DBus client」一文中,只粗略地提到某些 DBus 方法或信號傳回的資料項目,要調用其方法 getData() 取值。 沒有說明為什麼,因此其他人在使用時,經常又再問我如何取用某某 DBus 方法的回傳值。 那些不能直接取值的資料項目,其實都是被封箱的(boxed)。
Variant, Struct, Dict, Array 等型態,在 DBus 規格中皆歸類為封箱型態 (Boxed type)。
封箱型態的意義可參考 Boxing and Unboxing (C# Programming Guide) 之解釋。
PHP DBus 模組從遠端個體取得封箱型態的內容時,會將它們配置為 DbusVariant, DbusStruct, DbusDict, DbusArray 等類別個體。
這些被封箱在冠上 Dbus 之名的型態裡的內容,需要先拆封 (unboxing) 為 PHP 基本型態後,才能得其值。
拆封方法便是 $obj->getData()
。
EVP 是 OpenSSL 提供的高階資料編碼函數群,參見[evp(3)]。OpenSSL 的 crypto 函數庫實作了許多資料編碼方法,例如:
程序員可以直接調用那些函數處理資料。但是 EVP 提供了更高一層的抽象化介面,讓我們可以寫完一遍程式碼後,僅需抽換編碼模組,就可以支援多種編碼方法。在實際應用中,透過 OpenSSL 交換資料的雙方,並非事先談好要用什麼編碼方法,而是將自己使用的編碼方法之代號加註於資料檔頭。接收方解密資料時就是根據此編碼代碼,用 EVP 載入相同的編碼模組。
BIO 是 OpenSSL 庫為了處理資料輸出入所設計的輸出入抽象層,參考《bio(3)》的說明。 OpenSSL 的程式碼經常利用 BIO 的多形性,故在使用 OpenSSL 開發應用程式時,必須先熟悉 BIO。
BIO 的設計模式是 C 語言 (不是C++) 實作個體導向程式設計多形性(polymorphism of OOP)時常見的設計方式。 在早期,程序員學了 OOP 的觀念可是還是要寫 C 程式的時代,我們需自己用 C 語言實作類別繼承、動態連結等內容。但我們用的是 C compiler 而非 C++ compiler ,所以很多事我們必須自己處理。 因此它們的程式碼與近代 C++ 式的表達方式有所差異。 例如我在《程式語言中的介面,在個體之間協議互動行為的多種形式》說的作法就是一例;GNOME Library 也是這種用 C 語言寫出來的「類別庫」。 所以 BIO 實際上是一種類別庫。