企業內 P2P 網路架構設計要點簡易分析

目前常見的 BT (BitTorrent), eMule (EDLink) ,都是屬於公開匿名式 P2P 網路。它們的檔案分享關係網路是公開的,任何人都可以加入,並不適合企業內部的檔案散佈需求。

但也存在私有 P2P 網路架構(Private P2P)。有發展時間長久、支援軟體眾多的 Direct Connect,以及從匿名式 P2P 網路擴充過來的 Freenet 等。

PHP 自訂注記與屬性注入功能

我前天想要修改我寫的一個精簡型 PHP RESTful 框架 (「CommonGateway」),將它由外部設定(注入)控制項屬性內容的動作,改的更有使用彈性。最好像 Java Spring framework 那樣,可以透過注記(annotation)方式,讓使用者指定要注入的項目。

雖然 PHP 的語法並不支援注記符號,但是我可以變通一下,把注記內容寫在 doc 區,然後再自己解析 doc 的內容。 PHP 的 phpDocumentorPHPUnit 工具就是這麼做的。這個工作倒也不難,只需要用到 PHP Reflection 功能的 getDocComment() 就可以了。

GJS - D-Bbus 自動內觀(Introspect)與配置代理個體

我之前在「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 。 CoffeeScript 的編譯器會將它的程式碼轉譯成 JavaScript 程式碼。它產生的 JavaScript 程式碼基本上可以在任何 JavaScript 環境中運行。

我沒有用過這玩意,只是它的語法令我覺得有點意思。CoffeeScript 的設計目的,在為 JavaScript 環境提供一個「更整潔的語法」。我大致看了一下它的程式碼範例,它大部份的語法混合了 Python 與 Ruby 的風格,但程式碼區塊(匿名函數)這部份則是採用 C# 語法。 我們來看看「Your first cup of CoffeeScript, Part 1: Getting started」這篇文章中的範例程式碼,初步認識 CoffeeScript 的語法。

自動查驗系統的圈內消息

更新:我說的太多,你知道的也太多了。所以這篇文章要河蟹。

昨天看報紙,看到「Permission deny!」這篇消息。 自動查驗系統是在 Linux 平台上建構的,所以我知道一些圈內消息。

產生新類別的類別

介紹 JavaScript 關於函數與建構者的基礎知識。理解此一基礎,將建構者內容參數化。 透過參數化的技巧,實作一個產生新類別的類別。

JavaScript 定義類別的基本方式

JavaScript 沒有類別定義的關鍵字。"定義類別"這句話在 JavaScript 中的意義, 等於是定義一個新的建構者(Constructor)。

參觀繪師100人展

週日閒來無事,得知高雄駁二藝術特區有一場「繪師100人展」,展示日本100人著名繪師的畫作。 展示內容正好是我感興趣的 ACG 萌系畫作,所以我就跑去參觀了。單人票價250元。

以庶民的娛樂「浮世繪」為題,抓住現代人心靈的寄託,並集合介紹100位現代「繪師」的新作,從人氣繪師所描繪的獨特世界觀,展現高超的繪畫技巧、質感、與潛力,不斷地帶給世界最新的日本價值觀。

繪師100人展 - 「椋本夏夜」作品
引用自寬宏藝術網頁圖像。 © 椋本夏夜

畫展活動資訊:

OpenSSL - SOD 與 ASN1 解讀

在上一篇《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 函數的用法。

Android 臉部辨識解鎖的兩件事

Google Android 4.0 (Ice Cream Sandwich) 上月發佈,其中被當作主要賣點的「臉部辨識解鎖」(Face Unlock)功能,在我們公司中,基本上是當作笑話在看的。我的 twitter 中,也推了4則訊息提到 Android 4.0 的臉部辨識解鎖。

我九月份在部落格上發了一篇《因為影像左右相反,導致識別系統軟體專案失敗的例子》。臉部辨識就是該案例的軟體系統中的主要軟體項目。我們公司身為該專案眾多協力廠商的其中一員,對臉部辨識功能於實際佈署運用時會碰到的諸多狀況,也累積了不少經驗。而 Android 4.0 臉部辨識被發現的兩個狀況,不過是我先前就知道的其中兩件事罷了。

OpenSSL - SOD 安全文件概論

在 RFID 或其他微型儲存媒體的應用情境中,我們會將使用者的相關資訊儲存在 RFID 內。再透過讀取 RFID 的內容,快速判讀使用者的識別資訊,完成所需的工作。例如我們將員工的識別資訊存入 RFID 。員工持卡刷過門禁系統上的讀卡區後,門禁系統就可取得持卡人的身份,判斷是否允許進入。

但是我們要如何確認這張卡的內容是由我們發出的呢?再者,RFID 是可重覆寫入的儲存媒體,亦即他人可以自行修改裡面的內容。我們又要如何保證 RFID 的內容沒有被使用者自行竄改呢? 這些議題,可以藉由 OpenSSL 滿足其安全需求。

AXIMCom MR-105NL 接在網路分享器後方的用法

我今天買了台 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

schema-database - 查詢結果與 PDO~~FETCH_CLASS

我上週整理我幾年前開發的一個具備簡單 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 實體。

因為影像左右相反,導致識別系統軟體專案失敗的例子

我最近聽到一件失敗的軟體專案例子。內政部某單位,建了一套基於生物特徵辨識的身份識別與出入管制系統。這個系統會收集一般人的臉部與指紋特徵,建立特徵資料庫。並結合門禁與監視器設備,管制人員出入。聽說還會與走道的監視鏡頭結合,隨時識別進出人員的身份。簡單地說,從你進入該單位管轄區域之後,你都一直處於被識別的狀態,直到你離開為止。一但區域內監視器中的人員影像,被識別為黑名單人員,或是沒有進入記錄,都會通報管理人員。

這種系統,可以說是小型的天眼系統,或說是人肉搜索系統。不但錄影,還會識別身份。多少都會觸及人民隱私權的議題。不過這不是本文重點,就不多談。

Innovate 2011 IBM 開發者大會記事

9月1日到台北參加了每年慣例的 IBM 開發者大會,活動主頁見此「Innovate 2011 IBM開發者大會」。今年的活動主題是「Software, Everyware」,台灣則取為「創意無所不能╳軟體無所不在」。我個人覺得英文主題寓意較佳。中文實在翻得太長了,「創意無所不能」這句話甚至沒有點到會議的另一項主題:「Software driven innovation」。現場的口譯人員好像譯為「軟體驅動創新」。今年的議程主題,圍繞在軟體開發的生命週期(Lifecycle)之上。切入點是從「Everyware」開始,再延伸到生命週期管理,進一步追求創新的可能性。

Debian 6 and Realtek RTL8192SE WiFi device

我前陣子打算把我的 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 作業系統

某日,我與強者我朋友閒話時,強者我朋友說他某日和梅友仁閒話時,梅友仁告訴他一則我一定感興趣的江湖傳言。江湖傳言道:國內某系統大廠把 Android 的 Dalvik 移植到 Linux 作業系統,並且運行在x86平台。

我說,該不會是 Android-x86 吧?那不是什麼新聞了。強者我朋友說「非也」。傳言所說是無修無改的 Linux 核心配上 Dalvik ,不是用 Google 修補過再被其他人移植的 Android-x86 。

php-dbus unboxing

我先前在「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()

OpenSSL Library - EVP, Digest and Cipher

EVP 是 OpenSSL 提供的高階資料編碼函數群,參見[evp(3)]。OpenSSL 的 crypto 函數庫實作了許多資料編碼方法,例如:

  • 採用 MD2, MD4, MD5, SHA 等雜湊演算法的資料摘要函數。
  • 採用 RC2, RC4, RC5, DES, IDEA, blowfish 演算法的對稱式加密函數。
  • 採用 DSA, RSA 演算法的非對稱式(公鑰)加密函數。

程序員可以直接調用那些函數處理資料。但是 EVP 提供了更高一層的抽象化介面,讓我們可以寫完一遍程式碼後,僅需抽換編碼模組,就可以支援多種編碼方法。在實際應用中,透過 OpenSSL 交換資料的雙方,並非事先談好要用什麼編碼方法,而是將自己使用的編碼方法之代號加註於資料檔頭。接收方解密資料時就是根據此編碼代碼,用 EVP 載入相同的編碼模組。

OpenSSL Library - BIO 概論

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 實際上是一種類別庫。