第 183 期 GPL 條款對於衍生程式的判定標準與其授權拘束性的擴散範圍(下)─自由軟體鑄造場電子報─智邦公益電子報
enews.url.com.tw · February 07,2012[源碼快訊] 「維基化話維基」系列即將登場
陳瑞霖/編述
近年來維基百科的資料量越來越龐大,已經成為查詢資料時的利器,甚至媒體還會引用維基百科的內容。但一般人對於維基百科的運作模式,卻可能摸不著頭緒。許多人知道維基百科是人人可編輯的百科全書,興沖沖的按下條目上的編輯鍵,卻被出現的維基代碼嚇到;或者是好不容易在條目裡加上大量內容,卻被人提交刪除,說輸入的資料侵犯版權;還有被不知道那裡跑來的維基人說違反某一條方針,然後改天又被人說違反另一條規定。其實上述情形都能夠避免。
台灣維基人 Reke 先前在自由軟體鑄造場電子報刊載的「自由的危機與維基的自由」以及「維基經驗教給我們的事」這兩篇文章,有零星的帶到維基百科的運作模式,還有一般人對維基百科常見的疑問。自由軟體鑄造場長期支持開放內容,自然也對維基百科相當關注,以前曾經參與 2007 年在台北舉辦的維基年會。接下來幾期電子報,Reke 將會系統性的講述參與維基百科編輯時該有的認知與態度,讓有興趣的讀者能悠遊於維基百科的世界。
[法律專欄] GPL 條款對於衍生程式的判定標準與其授權拘束性的擴散範圍(下)
林誠夏/文
本文上篇的文章連接頁面如右:http://www.openfoundry.org/tw/legal-column-list/8446-the-license-inheritance-bounds-of-gnu-gpl-01
綜上所述、關於 GPL 衍生程式的判定標準,以及其授權拘束性的擴散範圍,可以歸納出三個可資操作的基本判別流程:
- 該軟體專案中是否內含 GPL 授權元件的程式碼?若是如此,該專案是否已明確適用該 GPL 元件授權人認同的獨立與可區分機制,來利用這個元件?
- 軟體專案裡的其他元件是透過靜態連結,抑或是動態連結的方式與該 GPL 授權元件進行互動?
- 若是採用動態連結的互動方式,則此 GPL 授權元件所提供的功能是否居於整個軟體專案的核心地位?是否失去此一 GPL 授權元件的連結,則整個軟體專案的多數功能便不復完整?
以上三個基本判別流程可以用「原則 VS. 例外」的比較邏輯來理解,第一階段、軟體專案中若是內含 GPL 授權元件的程式碼,則原則上 GPL 元件的授權拘束性已經啟動,該軟體專案裡的其他元件會受到 GPL 授權條款所拘束,然而、例外的狀況是,雖然該軟體專案內含 GPL 授權元件的程式碼,但是其他元件得以主張是以「獨立與可區分」的方式來利用這個 GPL 授權元件,便可例外地不受到 GPL 授權拘束性所及;接著、進入了第二階段的判別流程,軟體專案裡的其他元件究竟是透過靜態連結的方式,抑或是動態連結的方式來與 GPL 授權元件互動?原則上若是靜態連結的互動方式,則因為元件與元件之間傾向是高度相依的融合 (merge) 關係,此時整個軟體專案會被認定是 GPL 授權元件的衍生作品,而在後續散布時會被要求全部得依照 GPL 授權條款的方式,提供整體專案的程式源碼;而若是其他元件是以動態連結的機動方式呼叫 GPL 元件的功能表現,那麼這時候才會進入第三階段的判別流程,個案的去判別該 GPL 授權元件所提供的功能,在質的一方面,於整個軟體專案裡是否居於重要的核心地位?或是就量的方面,是否 GPL 元件一經抽離之後,就會造成軟體專案多數的功能不復完整?如果此二個子問題的答案皆為「是」,則此 GPL 元件的授權拘束性仍然有可能及於整個軟體專案,而若此二個子題的答案皆為「否」,則此元件的授權拘束性原則上不及於其他元件,但使用者在散布它時,仍應提供其他元件與此 GPL 授權元件間,連結呼叫與互動對應程序方面的必要資訊。透過以上三個流程的自我檢驗,GPL 授權元件的使用者便可知悉該元件,所可能為整個專案帶來授權拘束的基本可能性與風險性,其實際的操作步驟請參照下圖所示:
▲ 圖2:GPL 授權拘束性基本判別流程示意圖
Android 因中介隔層例外地主張獨立性與可區分性
此外、關於 GPL 對於衍生程式的判定標準還有一個時興的子議題,那就是近年業界不乏利用中介隔層 (middle layer) 的方式,來區隔 GPL 元件所可能帶來的授權拘束性,最顯著的例子、就是 Google Android 所規劃出來的中隔平台。Google Android 平台的授權架構,底層為 GPL-2.0 授權的 Linux Kernel,而中介隔層採用的是 BSD 類別或是 LGPL-2.1 類別授權的函式庫 (library),以及 Apache-2.0 授權的 runtime system,而此中介隔層之上還有中介應用程式及函式庫的溝通框架 (application framework),最上層才是讓個別廠商自行開發的應用程式 (application program)。透過這樣中介隔層的機制,Google Android 平台上層的應用程式僅與中層的函式庫溝通與互動,而底層 Linux Kernel 也僅與中層的函式庫溝通與互動,從而上層的應用程式並不會直接與底層的 Linux Kernel 直接溝通,故而以此點來主張這些應用程式在執行上與功能表現上,具有不一定受到 Linux Kernel 影響的「獨立性與可區分性」;除此之外、更重要的一點是:Google Android 中介隔層的函式庫與 runtime system,完全以無授權拘束性或是弱授權拘束性的自由軟體元件來營建。也就是說、中介隔層部份依其授權方式,對外是可以提供程式源碼並允許後續散布的,理論上這樣的中介隔層便具有實作上「可移植的可能性」,若是有程式開發者願意花費時間將此中介隔層移植至其他非 Linux Kernel 的作業系統上去運作,並非完全沒有可能,而既然中介隔層與採用 GPL-2.0 授權的 Linux Kernel 之間具有「可移植、可拆解」的「獨立性與可區分性」,那也就有機會被認定為除外於 GPL 授權元件的衍生程式範圍,而不用受到 GPL-2.0 授權條款的擴散拘束(註七)。
▲ 圖3:Google Android 平台中介隔離的授權架構圖
Google Android 平台這種中介隔離 GPL 授權拘束性的作法,在業界也不乏見其他的類似作法(註八),然而這些中隔手法、也並非完全不會引發授權爭議,舉 Google Android 平台為例,其之所以可以成功運行,第一點是由於 Google Android 平台中介隔層的架構完整、佈局嚴密,所以不易被自由開源軟體社群的參與者,直接視之為以簡陋的中隔介面惡意規避 GPL 授權條款的義務性規定;第二點、也是最重要的一層因素,是因為 Linux Kernel 核心開發群與其精神領袖 Linus Torvalds,對於 GPL-2.0 授權條款在衍生程式範圍上的解釋態度較為寬鬆,其認為 Linux Kernel 之上存有不必然受到 Kernel 授權狀態拘束的獨立使用者空間 (user space),所以取用 Linux Kernel 的 Google Android 平台便可依此觀點對 Linux Kernel 進行中隔處理。而雖然 Linux Kernel 多數核心開發群同意這樣的觀點,但並不能類推其他以 GPL 授權其軟體元件的自由開源軟體社群,都會同意以此種中介隔層的方式,能將 GPL 元件的授權拘束性完全隔離掉,所以、若是要將日後可能產生的法律爭訟與侵權風險降到最低,在很多不同狀況的案例上,還是得依所使用 GPL 授權元件的細部資訊,來進行個案式的判斷。
是否開啟 GPL 授權拘束性仍需考究實務的個別情況
單純在專案裡利用 GPL 授權元件並不必然會開啟其授權拘束性,有時候授權拘束性的疑慮和恐懼,其實是被使用者誤解並且過度擴大解讀了(註九)。本文初始之所以採用「牽一髮而動全身」這樣的說法來比擬 GPL 元件的授權拘束性,便是利用簡明的比喻提醒讀者,個別的 GPL 元件若是採用動態連結的方式來與其他元件互動,或是專案開發者也能夠找到其他授權方式的元件將其所負責的功能代換掉,這些跡象都可以證明該元件實際上與整個軟體專案在開發上的關聯不深,就像一拔而起的單一毛髮,並不會將其 GPL 的授權拘束特性傳導到專案的其他部份;然而、若是該 GPL 授權元件是採用靜態連結的方式來與其他元件互動,或是在功能表現上居於專案的核心定位,那麼此一 GPL 授權元件在運作上便與整個軟體專案密不可分,從而並不是那麼輕易地可以被更換、代替,此時就像是一串與頭皮緊密連結 (link) 的毛髮,無法輕易拔除並且關聯撼動全身,那麼該軟體專案的其他元件便會被視為是 GPL 授權元件的衍生作品,從而整體專案便進入了 GPL 授權拘束特性的擴散範圍。
但無論如何,目前關於 GPL 授權拘束性的擴散範圍,全球仍然沒有確定的司法判決是就此議題進行細節釐清與範圍界定的。所以此議題相關的評論與看法,並沒有一個完全權威並可據以簡單判斷的遵循法則,有時複雜的狀況、也仍然處於「一個 GPL 授權拘束性、個自解讀」的灰色地帶。本文僅先就此議題原則性的重要指南進行論述,提供一至三個基本步驟來讓讀者自我完成簡易驗證之用,而若是特定 GPL 授權元件的採用關係,是涉及大型商用專案或是元件互動性複雜的狀況,則建議還是應該個案式的依元件實際互動的方式,以專案分析的方式來做細節上的評判。
其他與此議題相關的重要參考文章羅列如下,以供對此議題有興趣的讀者,可以據此查證原典:
- Linus Torvalds 於網路討論串裡,發表其對 GPL 授權拘束性的意見與立場:http://linuxmafia.com/faq/Kernel/proprietary-kernel-modules.html。
- Lawrence Rosen 所著專文「General Public License, Explained」,說明 GPL 授權元件的授權拘束性範圍,以及推廣「License Inheritance」此一嶄新名詞:http://www.sitepoint.com/public-license-explained/。
- Carsten Emde 於 2008 年 11 月的演講簡報,綱舉目張的解釋了運作在 user space 下的驅動程式與 Linux Kernel 之間的授權拘束性關係:http://www.osadl.org/fileadmin/dam/presentations/FAPI-UIO-SPS-2008.pdf。
- Greg Kroah-Hartman 於其 2006 年提供的演講中,批論不提供程式源碼的專屬驅動程式,違反了 GPL 條款的授權拘束性:http://www.kroah.com/log/linux/ols_2006_keynote.html。
- Greg Kroah-Hartman 於 2006 年 8 月發表 UIO 作法的說明頁面:http://lkml.indiana.edu/hypermail/linux/kernel/0608.3/1908.html。
- Jonathan Corbet 2004 年 1 月 於 LWN.net 的報導,討論 user space 驅動程式的技術內容:http://lwn.net/Articles/66829/ 。
註七:此種中介隔離的互動架構在 GPL-2.0 授權條款裡並沒有明文述及,但在 GPL-3.0 裡開始有簡要的描述,一般對此機制的通俗用語為「well defined interface」,其於 GPL-3.0 授權條款的主要描述位於第 1 條第 3 項 (b) 款:serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form.
註八:另一種硬體裝置驅動程式 (driver) 方面的 UIO 中介隔離模式 (the user space I/O system),其實也與 Google Android 平台的作法十分類同,其也是在應用程式及 Linux Kernel 之間隔一層以 LGPL、BSD、MIT 等,可以為 GPL-2.0 授權方式「吸納同化 (merge)」的函式庫程式做為中介,然後再將驅動程式內含的重要演算法撰寫在應用程式的層級,以運作在 user space 的方式,間接透過中介的函式庫來與 Linux Kernel 進行互動與存取,透過這樣的區隔方式,也有許多自由軟體專案的程式開發者認為,寫在應用程式層級的驅動程式,有機會不被列入 Linux Kernel 授權拘束性的擴散範圍。
註九:相關的評論與說明,可參照 Lawrence Rosen 所著專文「General Public License, Explained」:http://www.sitepoint.com/public-license-explained/。
[源碼快訊] 中央研究院 10 月 22 日盛大舉辦「100 年院區開放參觀活動」
OSSF/編述
中央研究院自民國 87 年以來,每年秋天皆舉辦院區開放參觀活動 (Academia Sinica Open House),活動內容涵蓋了數理科學、生命科學、人文及社會科學等不同研究領域的活動,並設計了「電腦學習單」與「紀念章戳」集章活動,讓參與的民眾,有機會獲贈限量的紀念獎品。本年度的院區開放參觀活動,承接傳統精心規劃了 200 餘場精采活動,包括邀請曾志朗院士主講「透視文明:眼動,腦活,心靈通」,並且安排高雄市六龜山地育幼院合唱團演出「2011 歌中之雅歌」音樂會。這些兼具知性與感性、動態與靜態的活動,不僅拉近了民眾和學院式研究的距離,也激發了年輕學生更進一步探索人文社會與自然科學的研究興趣。
「自由軟體鑄造場 (Open Source Software Foundry, OSSF)」設立於中央研究院資訊科技創新研究中心轄下,亦協同與中央研究院其他單位,於 100 年院區開放參觀活動當天,假中央研究院資創中心大樓,就 OpenFoundry 平台操作以及自由軟體常用程式集進行實機展示,活動內容豐富有趣,歡迎自由軟體鑄造場電子報的讀者們,在當天參與中央研究院院區開放參觀活動之餘,亦可撥冗至鑄造場所設置的攤位前,與本計畫各個輪班的同仁們談天敘舊,或是您對於自由軟體研究應用方面有任何合作推展的想法,亦可透過 Academia Sinica Open House 這個場合與我們當場磋商研議!
◎ 活動時間:2011 年 10 月 22 日 上午 9:00-下午 4:00
◎ 活動網頁:http://www.sinica.edu.tw/openhouse/2011/
◎ 活動地點:中央研究院院址 – 台北市南港區 11529 研究院路 2 段 128 號
◎ 院區地圖:http://www.sinica.edu.tw/openhouse/2011/pages/a2.html
◎ 導覽手冊 PDF 檔下載:http://www.sinica.edu.tw/openhouse/2011/2011openhouse.pdf
[源碼快訊] 十一月份台灣自由軟體社群活動列表
OSSF電子報團隊/整理
十一月份的活動列表出爐囉!各位有興趣的朋友記得先把時間預留下來唷,找尋同伴一起討論、一起吸收新知。另外,由於活動列表出來的時間比較早,若後續有活動希望也能一起做宣傳的朋友們,記得來信:ossfepaper@openfoundry.org。
2011 年 11 月活動
Hacking Thursday(11/3)地點:台北市中山區南京西路 86 號(101 迎風城咖啡主題美食館)
時間:19:30~22:30
活動資訊:http://www.hackingthursday.org/
台灣維基人臺北定期聚會(11/4)
地點:台北市松山區民生東路三段 140 巷 11 號(果子咖啡)
時間:18:00~20:00
活動資訊:http://zh.wikipedia.org/wiki/Wikipedia:WPTP-Social
MozTW Lab @ TP(11/7)
地點:台北市八德路一段 33 號 (HTC 八德專賣店二樓)
時間:19:30~22:00
活動資訊:https://groups.google.com/group/moztw-general
Moz.TW:http://moztw.org/
Rails Tuesday(11/8)
地點:台北市松江路 273 號(法其曼第咖啡)
時間:19:30~22:00
活動資訊:http://ruby.tw/post/5658520519/rails-tuesday
TOSSUG 社群聚會(11/8)
地點:台北市南昌路二段 200 號(Mix Coffee & Tea)
時間:18:30~22:00
活動資訊:http://www.tossug.org/
RGBA 網路設計師聚會(11/9)
地點:台北市松江路 273 號(法其曼第咖啡)
時間:19:30~22:00
活動資訊:http://rgba.tw/about
Taipei GTUG(11/9)
地點:台北市中山區民生東路三段 140 巷 11 號(果子咖啡)
時間:19:30-22:30
活動資訊:http://www.taipei-gtug.org/
Hacking Thursday(11/10)
地點:台北市中山區南京西路 86 號(101 迎風城咖啡主題美食館)
時間:19:30~22:30
活動資訊:http://www.hackingthursday.org/
PHP Conf Taiwan 2011(11/12)
地點:台北市南港區研究院路 2 段 128 號 人文社會科學館 第二會議室
時間:9:00~16:30
活動資訊:http://phpconf.tw/2011
報名日期:10/21(五) 13:30
Taipei Wikipedian Moonthly Meetup: Writing Day 維基台北定期聚—假日寫作月聚(11/12)
地點:台北市大安區泰順街 60 巷 11 號(小哲食堂)
時間:14:00~16:00
活動資訊:http://zh.wikipedia.org/zh-tw/WP:WPTP-W
MozTW Lab @ TP(11/14)
地點:台北市八德路一段 33 號 (HTC 八德專賣店二樓)
時間:19:30~22:00
活動資訊:https://groups.google.com/group/moztw-general
Moz.TW:http://moztw.org/
Rails Tuesday(11/15)
地點:台北市松江路 273 號(法其曼第咖啡)
時間:19:30~22:00
活動資訊:http://ruby.tw/post/5658520519/rails-tuesday
TOSSUG 社群聚會(11/15)
地點:台北市南昌路二段 200 號(Mix Coffee & Tea)
時間:18:30~22:00
活動資訊:http://www.tossug.org/
RGBA 網路設計師聚會(11/16)
地點:台北市松江路 273 號(法其曼第咖啡)
時間:19:30~22:00
活動資訊:http://rgba.tw/about
WoFOSS 好自由小組聚會(11/16)
地點:伯朗咖啡-北科大店(台北市忠孝東路三段 52 號 1 樓)
時間:19:00~22:00
活動資訊:http://wofoss.blogspot.com/2011/08/wofoss-921.html
Hacking Thursday(11/17)
地點:台北市中山區南京西路 86 號(101 迎風城咖啡主題美食館)
時間:19:30~22:30
活動資訊:http://www.hackingthursday.org/
台灣維基人臺北定期聚會(11/18)
地點:台北市松山區民生東路三段 140 巷 11 號(果子咖啡)
時間:18:00~20:00
活動資訊:http://zh.wikipedia.org/wiki/Wikipedia:WPTP-Social
MozTW Lab @ TP(11/21)
地點:台北市八德路一段 33 號 (HTC 八德專賣店二樓)
時間:19:30~22:00
活動資訊:https://groups.google.com/group/moztw-general
Moz.TW:http://moztw.org/
Rails Tuesday(11/22)
地點:台北市松江路 273 號(法其曼第咖啡)
時間:19:30~22:00
活動資訊:http://ruby.tw/post/5658520519/rails-tuesday
TOSSUG 社群聚會(11/22)
地點:台北市南昌路二段 200 號(Mix Coffee & Tea)
時間:18:30~22:00
活動資訊:http://www.tossug.org/
RGBA 網路設計師聚會(11/23)
地點:台北市松江路 273 號(法其曼第咖啡)
時間:19:30~22:00
活動資訊:http://rgba.tw/about
Taipei GTUG(11/23)
地點:台北市中山區民生東路三段 140 巷 11 號(果子咖啡)
時間:19:30-22:30
活動資訊:http://www.taipei-gtug.org/
Hacking Thursday(11/24)
地點:台北市中山區南京西路 86 號(101 迎風城咖啡主題美食館)
時間:19:30~22:30
活動資訊:http://www.hackingthursday.org/
MozTW Lab @ TP(11/28)
地點:台北市八德路一段 33 號 (HTC 八德專賣店二樓)
時間:19:30~22:00
活動資訊:https://groups.google.com/group/moztw-general
Moz.TW:http://moztw.org/
Rails Tuesday(11/29)
地點:台北市松江路 273 號(法其曼第咖啡)
時間:19:30~22:00
活動資訊:http://ruby.tw/post/5658520519/rails-tuesday
TOSSUG 社群聚會(11/29)
地點:台北市南昌路二段 200 號(Mix Coffee & Tea)
時間:18:30~22:00
活動資訊:http://www.tossug.org/
RGBA 網路設計師聚會(11/30)
地點:台北市松江路 273 號(法其曼第咖啡)
時間:19:30~22:00
活動資訊:http://rgba.tw/about
[源碼快訊] 「PHPConf Taiwan 2011」11/12 中研院盛大舉辦!
OSSF/編述
在台灣,網站開發最常使用的程式語言就是 PHP 了,但台灣卻沒有專門的 PHP 相關研討會。今年 2011 年不會再有這種情形了!在各方人士奔走下,11 月 12 日,PHPConf Taiwan 將在中研院隆重登場。研討會中除了各方好手的技術講場外,由於 PHP 屬於自由軟體,自由軟體鑄造場自然也不會缺席。鑄造場法政研究林珈宏,也會就網站開發須注意的程式碼授權問題,說明相關的法律授權議題。歡迎想交流 PHP 技術的同好報名參加。
主辦:pct、高見龍 、自由軟體鑄造場
活動官網:http://phpconf.tw/2011
活動時間:11/12 (六)
活動地點:中研院「人文社會科學館」第二會議室
報名時間:10/21 (五) 下午 01:30 ,報名上限︰100 人
[技術專欄] 基於 Samba 的網路儲存系統
老薯條 (http://vulscan.wynetech.com.tw)/文
前言
網路儲存設備 (Network-attached storage, NAS) 的基本功能,不外乎資料儲存,以及利用權限來控管資料的存取,高階的型號更支援惡意程式掃描及 RAID(磁碟陣列)功能。在本篇文章中,筆者將簡介開放源碼社群中著名的 Samba 伺服器,並實作具有帳號控管及資料儲存功能的 NAS 系統。
下表為本篇教學的系統環境:
軟體名稱 | 官方網址 | 說明 |
---|---|---|
Fedora 11 |
http://fedoraproject.org | Linux 作業系統。 |
Samba | http://www.samba.org | 檔案伺服器,為了預留後續新增病毒掃描的功能,因此在此使用 Samba 3.0.23 版本,而不使用最新版本。 |
▲ 表1: 本篇教學的系統環境
Samba 的簡介
Samba 是架構在 NetBIOS (Network Basic Input/Output System) 系統基礎上的開放源碼軟體。主要用來連結 Microsoft Windows 系統的 SMB/CIFS (Server Message Block/Common Internet File System) 網路協定。自 1992 年 Samba 發表第一代版本以來,成為 Microsoft Windows 系統與 Linux 系統之間常用的溝通橋樑。
在最新的版本中(目前的版本為 V3),Samba 除了可與 Microsoft Windows 系統分享資料夾及印表機資源外,也可整合於 Windows Server 的網域、扮演網域控制站 (Domain Controller),以及加入 Active Directory 成員等功能。
為了讓後續 Samba 伺服器支援即時掃毒模組,本篇文章將以原始碼編譯的方式來安裝 Samba。
首先,移除系統內建的 Samba 伺服器,
$ yum erase samba*
接著請讀者至 Samba 的官方網站取得原始碼,並依序執行下列指令編譯:
取得原始碼
$ wget http://www.samba.org/samba/ftp/stable/samba-3.0.23.tar.gz
進行配置
將下載的檔案解壓縮後,可使用 --prefix 參數指定程式安裝的路徑(本例為 /usr/local/samba),並記得啟用 pam 認證 (--with-pam)。若在編譯過程中,出現找不到 iniparser.h 的錯誤,讀者可將 /iniparser/src/ 中的 iniparser.h 複製至 /usr/include 目錄即可解決。
$ ./configure --prefix=/usr/local/samba --with-pam
開始編譯
$ make proto
$ make
正式安裝
$ make install
安裝的路徑為先前設定的 --prefix 參數值。
Samba 的指令說明
下表為 Samba 重要執行檔的說明,
程式名稱 | 說明 |
---|---|
smb | 此程式用來管理 Samba 主機分享的目錄、檔案與印表機等相關資源。主要利用 TCP 埠 139 及 445 來傳輸資料。 |
nmbd | 此程式用來管理工作群組、 NetBIOS 名稱等等的解析工作。主要利用 UDP 協定開啟埠 137, 138 負責名稱解析的任務。一個完整的 Samba 服務需同時啟動 smbd 及 nmbd 程式。 |
testparm | 此程式用來檢驗 Samba 設定檔 smb.conf 的語法是否正確,當編輯完成 smb.conf 後,建議使用這個指令檢查以確定設定檔的語法皆正確。 |
smbstatus | 列出目前的 Samba 的執行狀態。 |
smbpasswd | 如果 Samba 伺服器所分享的資源需設定帳號/密碼的控管,即可使用此指令來建立所需的帳號/密碼。 |
smbclient | 欲查看別台電腦所分享出來的目錄與裝置時,就可以使用 smbclient 來查看啦!這個指令也可以用在自己的 Samba 主機上面,查看是否設定成功。 |
smbmount | 在微軟的 Windows 系統上,我們可以利用「網路磁碟機」的功能來連接到自己的主機,而在 Linux 系統上,即可以透過 smbmount 將遠端主機分享的檔案與目錄掛載到自己的 Linux 系統。 |
smbtree | 有點像 Windows 系統的「網路上的芳鄰」顯示的結果,可以查到工作群組與電腦名稱的樹狀目錄分佈圖。 |
▲ 表2: Samba 重要的執行檔及其說明
Samba 的設定說明
Samba 伺服器的主要設定檔為 smb.conf。下表為常見的設定及說明,
Section(區間) | 屬性名稱 | 說明 |
---|---|---|
global | workgroup [工作群組名稱] | 設定工作群組名稱(如 WORKGROUP),此設定要與 Windows 系統的工作群組名稱一致。 |
server string [說明文字] | 描述此 Samba 伺服器的說明文字。 | |
security [share|user|server|domain|ads] |
設定此 Samba 伺服器的管控方式,提供下列管控方式。 share: 不設定任何的認證方式來存取 Samba 伺服器所分享的資源,即完全開放任何人存取。 user: 可利用帳號/密碼的認證方式來存取 Samba 伺服器所分享的資源,這也是本文所採用的存取方式。 server: 可利用其它的認證主機來從事帳號認證,如利用 LDAP 伺服器來認證。 domain: 採用網域控制器 (Domain Controllers) 的帳號/密碼認證方式來存取 Samba 伺服器所分享的資源。 ads: 使用 AD(Active Directory) 伺服器來認證帳號 / 密碼的有效性。 |
|
smb passwd file [檔名] | 設定密碼是否要經過加密。 | |
hosts allow [ip資訊] | 限制可存取 Samba 伺服器的主機。 如設定 hosts allow 192.168.2. #僅允許192.168.2 網段中的主機存取此 Samba 伺服器。 一般建議讀者除了使用帳號/密碼認證外,還可使用此參數來限制能存取的主機,更能確保 Samba 伺服器的安全。 |
|
Client code page[code 編號] | 設定字元編碼,如果需要儲存以中文為檔名 的檔案,建議可設為 950,以避免中文檔名變成亂碼。 | |
[名稱] | 設定分享的資源區段,名稱可自取。 | |
comment [字串] | 說明此分享資源的說明文字。 | |
path [目錄名稱] | 分享資源的所在目錄 如設定 path /tmp 即其它使用者可存取 /tmp目錄下的檔案。 |
|
browseable [yes|no] | 是否可被微軟 Windows 系統的網路芳鄰瀏覽,如設為 yes 即表示利用 Windows 系統的網路芳鄰功能即可瀏覽此分享目 錄。 | |
Writable [yes|no] | 分享的目錄是否被允許寫入。 | |
read only [yes|no] | 分享的目錄是否為唯讀。 | |
public [yes|no] | 是否要公開分享的目錄。 | |
valid users [使用者名稱] | 白名單設定,設定可使用此 Samba 伺服器所分享資源的使用者。 | |
invalid users [使用者名稱] | 黑名單設定,設定不可使用此 Samba 伺服器所分享資源的使用者。 |
▲ 表3: Samba 常見設定及說明
接下來將以 /share 為 Samba 伺服器的分享目錄,權限僅允許 admin 得以存取。
I. smb.conf 的範例設定
[global]
#指定工作群組的名稱,此名稱需與使用者所使用的工作群組名稱相同。
workgroup = WORKGROUP
#說明 Samba 伺服器的文字。
server string = Samba Server
#指定使用帳號/密碼的認證方式來控管。
security = user
#設定帳號/密碼資訊所存的檔案位置,在此為 /etc/smbpwd 。
smb passwd file /etc/smbpwd
#設定密碼需為加密過的型式,不得為明碼型式。
encrypt password true
#設定文字編碼為 950,支援繁體中文,以避免中文檔名發生亂碼。
Client code page 950
#描述此分享資源的說明。
comment = virus-protected /public directory
#分享目錄為 /share 。
path = /share
#可以利用網路芳鄰的功能來瀏覽此分享資源。
browseable = yes
#設定可寫入此目錄。
writable = yes
#設定可使用此分享資源的使用者,在此例中為只有 admin 使用者可使用。
valid users admin
#設定是否為唯讀 。
read only = no
#是否要公開此分享資源,在此例中設定為公開。
public = yes
設定帳號及密碼
建立名為 smbpasswd 的密碼檔案:
$ touch /etc/smbpasswd
記得將該密碼檔設定為只有 root 才有讀寫的權限:
$ chmod 600 /etc/smbpasswd
利用 smbpasswd 指令建立名為 "admin" 的使用者:
$ /usr/local/samba/bin/smbpasswd -a admin -c /usr/local/samba/etc/smb.conf
接下來,請按照指示設定相關資訊。
設定完成後可利用下列指令檢查是否已寫入相關的帳號及密碼。
$ cat /etc/smbpasswd
啟動 Samba 伺服器
在重新啟動 Samba 伺服器之前,讀者可利用下列指令檢查 Samba 伺服器設定檔是否有錯誤。
$ testparm -C /usr/local/samba/etc/smb.conf
如果沒有錯誤,則用下列指令以常駐程式的方式啟動 Samba 伺服器。
$ nmbd -D -s /usr/local/samba/etc/smb.conf
$ smbd -D -s /usr/local/samba/etc/smb.conf
啟動完成後,讀者可利用「網路芳鄰」瀏覽分享的資源(本例的分享資源為 /share 目錄),並以先前設定的帳號及密碼(僅允許 admin 帳號登入)登入。
安裝 Samba 的圖形化管理介面 - SWAT
對於不習慣文字介面編輯設定檔的讀者,Samba 伺服器貼心提供 Web 管理程式 - SWAT。
SWAT 依賴超級常駐程式 (super-daemon),如 inetd 或 xinetd 來啟動。由於目前 Linux 系統大多使用 xinetd 程式,所以接下來將以 xinetd 為範例。
xinetd 主要利用 /etc/xinetd.d 目錄下的設定檔決定啟動的服務,因此我們在 /etc/xinetd.d 目錄下新增一個名稱為 "swat" 的檔案如下:
service swat
{
port = 901
socket_type = stream
wait = no
only_from = 192.168.2.0 # 允許使用的來源IP資訊,讀者可自行針對本身實際系統環境設定。
user = root
server = /usr/local/samba/sbin/swat # 指定 SWAT 主程式的所在位置。
log_on_failure += USERID
disable = no #啟動此服務。
}
設定完成後,僅需利用下列指令來重新啟動 xinetd 即可。
$ /etc/init.d/xinetd restart
接下來,讀者可利用瀏覽器開啟 URL 瀏覽,如 http://192.168.2.1:901(SWAT 是運作在 901 埠),正常可看到如下畫面:
▲ 圖1: SWAT 的畫面
結論
筆者僅簡單說明 Samba 伺服器,其實 Samba 可搭配其他相關模組,如利用 Clamav(Linux 系統下著名的防毒軟體)實作 Samba 伺服器的即時病毒掃描功能,或利用 Linux Software RAID 實作磁碟陣列。甚至組合相關開放源碼社群的資源,也可以實作出媲美商業化的 NAS 系統,或者直接採用開放源碼社群成熟且完整的 FreeNAS 解決方案。
後續文章將繼續為讀者介紹如何擴充 Samba 的功能,例如即時惡意程式掃描等。
[技術專欄] Mail Server 多功能記錄檔分析工具─SendmailAnalyzer
翁卓立/文
官方網站:http://sareport.darold.net/
下載網址:http://ncu.dl.sourceforge.net/project/sa-report/sa-report/8.0/sendmailanalyzer-8.0.tar.gz (118KB)
前言
許多電子郵件軟體都有內建管理功能,熱門的軟體更不乏網路熱心人士提供延伸套件。這些軟體中有的是全面性的管理工具,從調整設定檔到監控伺服器運作狀況一手包辦;有的則補強特定功能,例如分析記錄檔、統計流量程式等等。
本文推薦的 SendmailAnalyzer,是一套郵件伺服器記錄檔分析軟體,其功能主要著重於解析記錄與產生報表。
▲圖1:SendmailAnalyzer 的操作畫面
SendmailAnalyzer 的特色
支援雙主流的開放郵件伺服器
SendmailAnalyzer 提供的功能不僅能處理 Sendmail,也可以處理著名的 Postfix 郵件伺服器的記錄檔。執行時優先處理系統上現有的電子郵件伺服器記錄檔(可經由參數指定是否要處理過去備份檔,或目前未使用的郵件伺服器記錄檔),再以 HTML 格式搭配圖形化的結果輸出,並產生動態的分析與統計報表。
由於流程可以依照需求配合背景程式自動執行,因此系統管理員得以在指定時間,進行自動化的分析工作。另外,參數還可以指定查詢的時間範圍,因此也可依據天數或週數來產生特定期間的報表。
整合主流的郵件過濾系統
除了使用便利外,安裝過程也只需要啟動 SendmailAnalyzer 的 deamon(常駐程式),再配合修改 Apache 的設定檔,讓 SendmailAnalyzer 所在目錄加入 CGI 程式的執行權限,並以 crontab 指令定期進行分析。另外,SendmailAnalyzer 也能處理其它電子郵件過濾程式的資訊,例如 SpamAssassin、MailScanner、ClamAV、Amavis 等,整合的範圍包含病毒掃描與廣告信攔截等,使得系統管理員得以整合數種相關程式,達到集中分析處理的效果。
磁碟空間管理與快取設計
SendmailAnalyzer 處理過的資料,會以檔案的型式儲存在系統磁碟之中。若擔心過多的資料佔用磁碟空間,SendmailAnalyzer 支援自動將舊的檔案備存,或是在適當時機刪除。而為了確保報表的處理速度,SendmailAnalyzer 會將超過一天的資料進行快取處理,如此可以有效降低系統資源佔用,也能加快報表處理的時間。
多樣式呈現的統計報表
除了上述的功能外,SendmailAnalyzer 也可以針對不同的項目進行查詢。統計報表區主要為三大類,分別是全域統計資料、最高統計,以及各種過濾器的統計功能,另外還提供適用於 ISP 網路環境等級的功能。
▲圖2:SendmailAnalyzer 支援指定報表查詢的日期範圍
▲圖3:SendmailAnalyzer 支援圖形化報表呈現
支援多國語系
雖然目前 SendmailAnalyzer 僅支援三種語言,英文、法文與西班牙文。但由於 SendmailAnalyzer 設計時已經考慮到多國語系的問題,因此使用者可以自行擴充語系,甚至可將語系的翻譯檔案提交給 SendmailAnalyzer 團隊。
結語
有些電子郵件伺服器規模較小,需要處理的電子郵件不多,而有些電子郵件伺服器則需要負擔公司全體人員的電子郵件使用需求。但無論應用的環境為何,SendmailAnalyzer 都能有效協助分析記錄檔。
作者簡介
翁卓立,逢甲大學資訊工程學系、台灣科技大學電子所畢業,目前擔任韌體研發工作,主要使用 Embedded Linux 進行產品開發。著有「Linux 進化特區:Ubuntu 10.04 從入門到精通」等書。
[技術專欄] 麥克阿忠的 Ruby on Rails 真功夫─手刻 CRUD
麥克阿忠/文
前言
上篇我們介紹 Ruby on Rails 的快速上手方式,使用 scaffold 指令開發出完整的資料庫基礎操作的應用介面。但針對實際上的需求,仍需根據實務再作修正修正,為了使初學者能夠從中理解 Ruby on Rails 的運作過程,以打下 Ruby 的功夫底子,本篇特別示範真功夫教學。
什麼是 CRUD ?
CRUD 意指在資料庫的四個資料基本異動動作,分別為:
- Create:建立資料
- Read:讀取資料
- Update:更新資料
- Destory:刪除資料
一般而言,傳統資料庫的組成是各資料列結合成資料表,再由資料表集合成資料庫。如同手上的電話簿,欲加上朋友的聯絡人,就必需 Create(建立資料),若要打電話讀取電話號碼則 Read(讀取資料),若某人的電話更新了就要 Update(更新資料),而不再聯絡者就 Destory(刪除資料)。設計資料庫應用程式介面原則上不離這四個基礎操作。設計一項表單就要開發出建立、檢視、更新、移除。
所以,有經驗的程式設計師會花許多時間建立屬於自己的 MVC,或是使用現成流行的 MVC Framework 以簡化開發的流程。如上述的狀況,網頁表單的設計可以簡化為類似 Partial 的方式以重複利用。
準備
在實作手刻 CRUD 前,請先確定目前的環境。例如檢查 Ruby 的版本,
$ ruby -v
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2011.03
以及檢查 Ruby on Rails 的版本,
$ rails -v
Rails 3.0.7
還有 Rake 的版本,
$ rake -V
rake, version 0.8.7
實作
規畫資料庫
在前兩篇系列文章中,我們提到 Ruby on Rails 中的 new 用法,現在我們需要再建立一個新的專案來實作這次的手刻 CRUD 的內容。在本例中我們將以「電話簿」的實例來建立一個 Web 應用程式,首先我們必須規劃資料庫的結構,然後一步步建立資料庫介面所需的 Ruby 程式碼。
▲ 圖1:電話簿範例的資料庫結構
如上圖,規劃出的欄位有 id、name、phone、birthday 等四個欄位,而型態皆是平常使用到的整數型態(INT),文字型態 (TEXT) 以及日期型態 (DATE)。MySQL 的使用者可參考此表中的長度欄位,若是使用 SQLite3 則可忽略。
建立新專案
輸入下列指令以建立本篇所需的檔案:
$ rails new phonebook
然後進入工作目錄開始上工囉,
$ cd phonebook
註:如果您升級至 rails 3.1.0,會遇到 Could not find a JavaScript runtime 錯誤,解決方法是到該目錄下的 Gemfile 檔加入二行:
gem 'execjs'
gem 'therubyracer'
然後執行下列指令即可,
$ bundle install
資料庫與 Ruby on Rails 的連結
應用程式的資料庫函式可以透過 Database adapter 介面來連結不同的資料庫,不過前提是該程式語言有提供這樣的連結方式。如同 PHP 除了會搭配 MySQL 之外也提供 ODBC 函式庫連結 MS SQL。
在 Ruby on Rails 中預設的資料庫是 SQLite3,因此不用特別連結其它資料庫。如果偏好 MySQL,可在建立新專案時下指令:
$ rails new myproject -d mysql
"-d" 的參數就是指定特定的資料庫,目前 Rails 可指定的資料庫選項有:mysql / oracle / postgresql / sqlite3 / frontbase / ibm_db / jdbcmysql / jdbcsqlite3 / jdbcpostgresql / jdbc。
如果有特別的資料庫則必須先以下列指令查詢是否已安裝,
$ gem list
*** LOCAL GEMS ***
......
jquery-rails (1.0.14)
json (1.6.1)
......
......
mysql (2.8.1)
mysql2 (0.3.7, 0.3.6, 0.2.13, 0.2.7)
......
......
rack (1.3.3, 1.3.2, 1.2.3)
......
只要看到有 mysql 字眼,就表示你的 Ruby on Rails 有支援,若沒看到,可下指令安裝,
$ gem install mysql2
不過在一般 Linux 套裝作業系統環境下,有時不只需要上述指令,還需另外安裝套件才能運作。
開設完新專案之後,讀者可以到 config/database.yml 檢視資料庫的設定。
▲ 圖2:MySQL 的設定範例
頁面與網址的關係
建立頁面前我們要先了解網址的結構,例如以瀏覽器開啟此網址 "http://localhost/phone/show/1",此段的網址可解釋如下:"http://DomainName/controller/action/id"。
我們所要建立的頁面是由一個 controller 跟一個 action構成,因此網址也必須這樣呈現:"http://localhost/phone/index"
以下列指令產生上述的頁面:
$ rails generate controller phone index
其中 phone 是 controller,index 是 action,而 action 在一般說來它是所謂的某個頁面,並對應於 app/views/index.html.erb 檔,副檔名必需是 erb。而 controller 是 action 的集合,控制 action 跟資料庫間輸出的程序。
註:rails generate 指令可以用簡化作 「rails g」。
▲ 圖3:以 Rrails generate 指令來產生相對應的程式
產生的檔案如圖 3,這樣子就開設好了一個如網址 phone/index 的頁面。請記得用下列指令開啟虛擬伺服器。
$ rails server
▲ 圖4:網頁呈現於瀏覽器上的畫面
如圖 4,我們就可以在此修改頁面。在圖 3 中,Ruby on Rails 已提示我們到哪個路徑修改網頁。所以開啟 phonebook/app/views/phone/index.html.erb 可以看到以下的內容:
Phone#index
Find me in app/views/phone/index.html.erb
有興趣的讀者可以試著修改頁面。
建立 Rails 與資料庫互動的模組
Ruby on Rails MVC 架構的 M 指的是 model,而此 model 是處理資料庫的程序,因此我們要輸入指令來產生資料表:
$ rails g model pbook name:string phone:integer birthday:date
註:若使用 MySQL 必須先下 "rake db:create" 指令,讓 Ruby on Rails 建立相關的資料庫結構。若使用 SQLite3 則可跳過這步驟。
▲ 圖5:rake db:create 指令的輸出結果
如圖5,產生若干檔案。其中較常更改到的檔案為 pbook.rb 以及 20110928100041_create_pbooks.rb。
pbook.rb 是 Rails 中與資料表 pbook 互動的程式,該資料夾的每個資料欄位都會由 pbook.rb 來定義程式與頁面間的邏輯運作。如果沒有關聯式的資料表,通常該檔會保持空白。
20110928100041_create_pbooks.rb 是資料表定義用的檔案,可以在目錄 db/migrate 找到,當配合團體開發時,與此類似的檔案就極為重要。
開啟 20110928100041_create_pbooks.rb 檔案內容如下。
▲ 圖6:20110928100041_create_pbooks.rb 的檔案內容
以上確定產生 model 後,再輸入指令:
$ rake db:migrate
▲ 圖7:rake db:migrate 指令的輸出結果
Ruby on Rails 就會針對 db/migrate 所產生出的 20110928100041_create_pbooks.rb 開始變更資料庫的資料結構。若想要了解 Ruby on Rails 在資料庫做了哪些異動,可以下指令 tail -f log/development.log 查看。
▲ 圖8:rake db:migrate 的底層操作記錄
用 rails console 來測試跟資料庫互動的狀況
使用 MySQL 的讀者大都習慣使用 phpmyadmin 或是 mysql 的 console 來檢視資料庫的異動情形。Ruby on Rails 也提供以 console 的方式直接異動資料庫。在建立網頁之前,剛建立好的資料庫沒有任何資料,因此先運用 console 的方式建立一些測試資料,以方便設計網頁的後續工作。
$ rails console
輸入方式有兩種,第一種是逐行輸入資料:
pbook.name = "Merry"
pbook.phone = "0922123123"
pbook.birthday = "1999/01/01"
pbook.save #資料新增完成之後會返回true。
pbook.id #新增完成會返回該資料的id值。
新增情形如下圖,
▲ 圖9:rails console 指令的輸出結果
第二種使用類似 HASH 的格式將資料置入同一行:
pbook=Pbook.new(:name=>"John", :phone=>"0988138138", :birthday=>"1995/05/05")
pbook.save
pbook.id
新增情形如下圖,
▲ 圖10:Hash 格式的輸出結果
新增完之後,可以直接用 Pbook.find(id) 查詢目前資料新增的狀況,我們已完成網頁設計前的處理工作。
開始設計網頁
開啟 app/controllers/phone_controller.rb 寫一些程式碼將剛剛輸入的資料呈現在網頁上。
▲ 圖11:app/controllers/phone_controller.rb 的程式碼
然後再修改 app/views/phone/index.html.erb 檔案,並依照需要寫入來自 phone_controller.rb 的程式碼。
▲ 圖12:在 app/views/phone/index.html.erb 新增的程式碼
依照圖 12 的範例輸入完成後,重新整理網頁,呈現結果如下:
▲ 圖13:app/views/phone/index.html.erb 修改後的結果
其中在 phone_controller.rb 的第一個 def 區段裡,我們定義了 index 的類別,而
@phones = Pbook.all
這一行程式碼,其用意是將資料表 Pbook 裡頭的資料用 all 的物件操作把資料全部倒出來,並指派給 @phones 這個實體變數。然後在 view 裡的 index.html.erb 就會接收到 @phones 的實體變數,用 code block 的方式逐一列出資料。
詳見:
<% @phones.each do |p| %>
<tr><td><%= p.name %></td><td><%=p.phone%></td><td><%=p.birthday%></td></tr>
<% end %>
在上述程式碼中 @phone.each 的 each 會把 @phones 的資料傳給 p,之後 p 將得到各個資料陣列,然後用 p.name、p.phone、p.birthday 的欄位操作予以列印至網頁上。
於是,我們完成 CRUD 的 R。
建立輸入表單
過去在設計表單時,除了要對應文字輸入框跟資料庫外,也要寫 SQL 語言從表單頁一一對應導入程式碼,而會耗去許多時間,且每一個動作都要配合不同的 SQL 語法,如 UPDATE、DELETE、INSERT 這三個動作。
在 Ruby on Rails 中,表單與 SQL 相對應的設計方式比較容易,過程如下:
先打開 config/routes.rb 並依照下圖設定「網址」
▲ 圖14:config/routes.rb 的設定畫面
然後在 phone_controller.rb 建立一個 newphone 與 create 的類別,並照下圖輸入幾行程式碼。
▲ 圖15:修改 phone_controller.rb 程式碼
利用在 views/index.html.erb 加入 link_to 的方法連結下一個頁面,結果如下圖:
<%= link_to "edit" , :action => "modify", :id => p%> /
<%= link_to "del" , :action => "del", :id => p%>
並在最後一行加入 "add new phone number" 的連結,
<p><%= link_to "add new phone number" ,phone_newphone_path %></p>
▲ 圖16:於 views/index.html.erb 中加入 link_to 的結果
由於我們設定的 modify 與 del 頁面尚未建立,因此連過去時顯示為錯誤,不過,目前要先建立 add new phone 的表單頁面。
在目錄 views 中建立一個名叫 newphone.html.erb 的檔案,並輸入如下圖的程式碼:
▲ 圖17:newphone.html.erb 的程式碼
輸入完成後重新整理網頁,並使用瀏覽器瀏覽 "http://localhost/phone/newphone" 就可得到如下圖的結果。
▲ 圖18:newphone 的瀏覽器呈現畫面
如此,我們就完成建立表單的步驟。記得在 phone_controller.rb 建立一個 create 的類別並加入處理送往資料庫的程序。至此我們完成 CRUD 的 C。
關於 routes.rb 與 URL Rewriting 的設計,可以回頭看 config/routes.rb 的程式碼。routes.rb 的作用是以 URL Rewriting(重寫網址)技術將上述網址列的各個頁面都導入 rails 的類別裡,而 get、 put、post 在瀏覽器中會發出指令動作向 web server 做出「要求」與「回應」。get 是向伺服器做一般的資料請求並輸出 HTML,而 put 與 post 是表單按下「送出」(submit) 時伺服器會接受表單內的資料,並導入資料庫中。
get "phone/newphone"
get "phone/index"
get "phone/modify/:id" => "phone#modify"
post "phone/create"
上述程式碼都有相對應的 controller 跟 action ,如果後面還需 id 以檢視資料庫中個別的資料,則必須再自定如上的結構。
如在 index.html.erb 的
<%= link_to "edit" , :action => "modify", :id => p%>
<%= link_to "del" , :action => "del", :id => p%>
以及
<%= link_to "add new phone number" ,phone_newphone_path %>
Ruby on Rails 會將 link_to 操作的方法,在 HTML 中轉換為如下的超連結:
▲ 圖19:link_to 實際對應的 HTML 輸出
在Ruby on Rails 的 MVC 概念下,controller 與 views 通常密不可分,幾乎 controller 中的每一個類別都會對應一個 views/phone/****.html.erb,如 def newphone 與 def index 等等。
因此,我們在建立表單時,進入 newsphone 後,先將 Pbook.new 的操作導至 @pbook 的實體變數,如:
@pbook = Pbook.new
然後,在 newphone.html.erb 設計表單時,form_for 的程式碼會幫助處理表單的介面,只要把 f.text_field 的物件照資料表欄位名稱對應好即可。
<%= form_for @pbook , :url => {:controller => "phone", :action => "create"} do |f| %>
<
%= f.label :name %
>
<%= f.text_field :name %>
......
......
<%end%>
form_for 可提供的物件,在經過 code block 傳至變數 f 之後,除了 f.text_field 會輸出成文字輸入框之外,也有其它如 check_box、text_area 等等其它不同型別的表單元素。而 form_for 屬性設定除了接受 @pbook 的實體變數相關變數之外,url 的屬性也必須依照 routes.rb 的設定,傳送至資料庫的處理程序,因此轉變為 HTML 如下圖:
▲ 圖20:form_for 實際對應的 HTML 輸出
或許有讀者會問 SQL 語法在哪?由表單按下 Submit 送入後端資料庫的程式端,在圖20 HTML 的
<form> 屬性是指定至 /phone/create,也就是在 phone_controller.rb 中所定義的 def create 區段,我們輸入如下的程式碼:
def create
@pbook = Pbook.new(params[:pbook])
@pbook.save
redirect_to (:action => "index")
end
第二行的程式,是將 Pbook.new 的操作用 params[:pbook] 引入 pbook 表單的各個輸入框,然後在第三行用 save 的方法儲存至 Pbook 的資料表中。完成之後 redirect_to 就會令該頁轉至 index。
因此不需輸入任何 SQL 語法, Ruby on Rails 已經為開發者妥善處理 SQL 與表單間的程序了。
</form>再完成其餘 CRUD 的 U 跟 D
在前幾段詳細說明了表單的設計、HTML 與 routes.rb 的原理,資料的異動還需要「更新」與「刪除」的動作,接著我們將完成本篇電話簿設計的範例。
接著在 phone_controller.rb 再新增 modify、updating、del 的 action,程式碼如下圖所示:
▲ 圖21:phone_controller.rb 再新增 modify、updating、del 的 action
再從目錄 views/phone 新建一個名為 modify.html.erb 的表單,程式碼如同 newphone.html.erb 一樣,但有一個地方不同,如下圖:
▲ 圖22:從views/phone 新建一個名為 modify.html.erb 的表單
記得更改為:action => "updating", :id => @pbook,如此一來點選 edit 即可在網頁上看到文字輸入框已經有相關的資料在裡頭了。如下圖:
▲ 圖23:瀏覽器的輸出結果
記得在 phone_cpntroller.rb 中的 def updating 鍵入完成程式碼,至此我們就完成了 CRUD 的 U 了!
接著在 phone_controller.rb 加入 def del 的類別,但這個類別的刪除方式不必再用 del.html.erb 頁面顯示任何資料,所以重點在於 @pbook.destroy,再導回首頁。
最後,完成了 CRUD 的 D,本篇的線上電話簿範例就宣告完工了。
表單:另外值得一提的是更新資料與新建資料的差異性。在前段文章有提到 form_for 的操作方法,其中 Create 跟 Update 的動作略有不同。Create 資料是新建立過去不存在的資料,而 Update 資料是修改己存在的資料,因此 form_for 在 Create 中所顯示的程式碼如下:
<%= form_for @pbook , :url => {:controller =>"phone", :action => "create"} do |f| %>
而 Update 的程式碼則為:
<%= form_for @pbook , :url =>{:controller =>"phone", :action => "updating", :id => @pbook } do |f| %>
其中 :action => "updating" 要經過 Submit 後再導入 updating 的區段,而 :id => @pbook 會把 routes.rb 中的 get "phone/modify/:id" => "phone#modify" 之 id 值,幫忙將 Pbook 資料庫的資料導入 f.text_field 各個欄位中。
而 modify、updating 與 del 又是什麼?在 phone_controller.rb 裡,modify 的程式碼很簡單。由 index 裡的 edit 點選之後,會傳送這串網址 http://localhost:3001/phone/modify/13,而 modify 後的 13 就是 id 值。所以使用 Pbook 的 find 操作物件,就可以查詢該 id 值的相關資料。如下方的程式碼:
@pbook = Pbook.find(params[:id])
Pbook.find 的用法是 Pbook.find(13),因此要接受從網址而來的參數就用 param[:id] 即可。
而 updating 的類別中,是由 modify.html.erb 按下表單中的送出鈕而觸發 updating 類別,經過 find id 之後,再透過 update_attributes(params[:pbook]) 將更改過的資料回送至資料庫。如下方的程式碼:
@pbook.update_attributes(params[:pbook])
刪除資料的 del 也是如類似的方式查詢該 id,然後照 id 內的參數,完成刪除資料,如下:
@pbook.destroy
▲ 圖24:詳細的程式碼。
總結
最後為讀者整理手刻 CRUD 的一些重點步驟。
- 建立資料庫相關的連結設定:config/database.yml,如要指定其它資料庫,就在建立新專案時加上 -d SqlServerName
- 建立操作資料表相關的 model:$rails g model table columnA:string columnB:integer birthday:date
- 設定相關路由:config/routes.rb 可先在建立 conroller 的過程中修改 routes.rb,注意改完之後要重啟 server。
- 建立 controller 的 def action 跟 views 裡的 *.html.erb 相對應的網頁或表單。
完成以上的範例後您的 Ruby on Rails 的功力即提升五成以上,敬請期待下篇剖析 Rails MVC 概念的文章。
作者簡介
麥克阿忠,資深網站程式開發者,興趣是攝影。目前擔任 Ruby on Rails 網站開發員,主要使用 Ubuntu Server 進行 Web 應用程式開發。
作者部落格 http://about.me/MichaelChen520
歡迎對 Ruby 有興趣的同好前來交流指教。
[技術專欄] 利用 FreeNAS 打造儲存設備 (6) 網路設定篇─基礎設定
Weithenn (http://www.weithenn.org/)/文
前言
本文主題為 FreeNAS 基礎網路設定。教學涵蓋主機名稱、IP 位址、網路遮罩、預設閘道、網域名稱解析伺服器等,並且分別以 Console 及 GUI 圖形介面進行說明。
實作環境:
- 實體伺服器:IBM System x3250 (MT 4365)
- 作業系統:FreeNAS-8.0.1-RC1 (64位元版本)
- 網路卡:內建 Broadcom 5721/加裝 Intel Pro 1000 PT Dual Port Server Adapter
- 區域網路 IP 網段:10.10.25.0 / 255.255.255.0
- 預設閘道:10.10.25.254
- DHCP 伺服器:10.10.25.198
- 網域範圍:10.10.25.1 ~ 10.10.25.100
Console 設定篇
Console:DHCP 伺服器環境下的網路設定
FreeNAS 主機開機後預設會自動啟用 DHCP Client 服務,尋找區域網路中的 DHCP 伺服器並試圖取得自動配置的 IP 資訊。
如下圖所示,FreeNAS 開機流程至網路卡時(如本篇網路卡為 em0),因為順利啟用 DHCP Client 服務且網路連線正常,所以在畫面中可以找到主機與 DHCP 伺服器的溝通,如 Discover、DHCP Offer、DHCP Request、DHCP Ack 的四個流程。
▲ 圖1:開機過程中發出 DHCP Discover 封包
當順利取得 IP 位址(如本篇的環境為 10.10.25.36),您可以使用瀏覽器開啟 http://10.10.25.36 以登入 FreeNAS 圖形化管理操作介面。如下圖
▲ 圖2:順利租用 DHCP 伺服器發出的 IP 資訊
Console:自行指定網路設定
若區域網路中沒有配置 DHCP 伺服器,也可以透過 Console 介面來設定 IP 位址、預設閘道、網域名稱解析伺服器。
您可以參考隨後的圖例,以進行接下來的設定步驟:
- 輸入「1」進入「Configure Network Interfaces」:設定網卡 IP 位址
- Select an interface (q to quit):系統會顯示於開機流程中偵測到的網路卡清單,請選擇要設定固定 IP 位址的實體網路卡編號,此例輸入「1」選擇「em0」網路卡。
- Delete existing config? (y/n)。是否要刪除已存在的 IP 位址設定內容,此例輸入「n」表示 No。
- Configure Interface for DHCP? (y/n)。是否要啟用此網路卡的 DHCP Client 功能,此例輸入「n」表示 No。
- Configure IPv4? (y/n)。是否要設定此網路卡的 IPv4 位址資訊,此例輸入「y」表示 Yes。
- Interface name:您可以輸入此網路卡的別名,若直接按下 Enter 則套用網路卡編號,此例輸入「lan」作為此網路卡的別名。
- IPv4 Address:請輸入 IPv4 位址格式,其中網路遮罩設定支援 Subnet mask 表示方式「 255.255.255.0」 以及「CIDR 表示方式/24」,此例輸入「10.10.25.115/24」設定固定 IP 位址。
- Configure IPv6?(y/n)。是否要設定此網路卡的 IPv6 位址資訊,此例輸入「n」表示 No。
- Restarting network:ok。設定完成後 FreeNAS 會重新啟動網路服務,並回到 Console 畫面
- 輸入「4」進入「Configure Default Route」:設定主機預設閘道 IP 位址
- Configure IPv4 Default Route? (y/n)。是否設定 IPv4 預設閘道資訊,此例輸入「y」表示 Yes。
- IPv4 Default Route:請輸入區域網路中預設閘道的 IP 位址,此例輸入「10.10.25.254」。
- Configure Ipv6 Default Route? (y/n)。是否設定 Ipv6 預設閘道資訊,此例輸入「n」表示 No。
- Restarting routing:ok。設定完成後 FreeNAS 會重新啟動路由服務,並回到 Console 畫面
- 輸入「6」進入「Configure DNS」:設定主機使用網域名稱解析伺服器 IP 位址
- DNS Domain [local]:請輸入主機的網域名稱,如本篇使用「weithenn.org」。
- DNS Nameserver 1:請輸入主機使用的第一台 DNS 網域名稱解析伺服器 IP 位址,本篇為「8.8.8.8」。
- DNS Nameserver 2:請輸入主機使用的第二台 DNS 網域名稱解析伺服器 IP 位址,本篇為「168.95.192.1」。
- DNS Nameserver 3:請輸入主機使用的第三台 DNS 網域名稱解析伺服器 IP 位址,本篇為「168.95.1.1」。
- Reloading network config: ok。設定完成後 FreeNAS 會重新載入網路設定,並回到 Console 畫面。
- 輸入「10」進入「Reboot」選項,準備重新啟動主機
- Confirm reboot (y/n):是否確定要將主機重新啟動,此例輸入「y」表示 Yes。
▲ 圖3:設定 em0 網卡固定 IP 位址
▲ 圖4:設定主機預設閘道 IP 位址
▲ 圖5:設定主機使用網域名稱解析伺服器 IP 位址
▲ 圖6:重新啟動 FreeNAS 主機
GUI 設定篇
GUI:DHCP 伺服器環境下的網路設定
您需要先由 Console 介面中設定 DHCP 自動取得或設定固定 IP 位址,才能連結至 GUI 圖形介面,若您想要在圖形介面中設定網卡取得 DHCP 伺服器分配資訊請依如下步驟:
- 區域網路中已有架設 DHCP 伺服器,主機由 em0 網路卡取得 IP 位址 10.10.25.36。
- 開啟瀏覽器後於網址列輸入「http://10.10.25.36」,自動登入 FreeNAS GUI 圖形介面。
- 切換至「Network > Interfaces」項目後按下「Add Interface」鈕,於 Interface Name 欄位填入網路卡別名,此例為「lan」(此為必填欄位不能忽略!),接著勾選「DHCP」項目後按下「OK」鈕即可。
- 您可切換至「Network > Network Summary」查看由 DHCP 伺服器所得到的 IP 位址、預設閘道、網域名稱解析主機資訊。
▲ 圖7:GUI 圖形介面設定 em0 網卡啟用 DHCP 功能
▲ 圖8:em0 網卡啟用 DHCP 功能成功
▲ 圖9:查看 DHCP 自動取得 IP 位址資訊
GUI: 自行指定網路設定
若想要在 GUI 圖形介面下設定網路卡中自行指定 IP 位址請依如下步驟:
- 區域網路中已有架設 DHCP 伺服器,由 em0 網路卡取得 IP 位址 10.10.25.36,或者由 Console 介面自行設定區域網路中的固定 IP 位址。
- 開啟瀏覽器後於網址列輸入 FreeNAS 主機暫時的 IP 位址「http://10.10.25.36」,此時將自動登入 FreeNAS GUI 圖形介面。
- 切換至「Network > Interfaces」項目後按下「Add Interface」鈕,選填相關資訊:
- NIC:請於下拉選單中選擇欲設定固定 IP 位址的網路卡,此例選擇「em0」網路卡。
- Interface Name:請輸入此網路卡的別名(此為必填欄位不能忽略!),此例輸入「lan」作為此網路卡的別名。
- IPv4 Address:請輸入設定於此網路卡上的固定 IP 位址,此例輸入「10.10.25.115」
- IPv4 Netmask:請於下拉選單中選擇適合的網路遮罩值,此例選擇「/24(255.255.255.0)」
- 確認上述設定無誤後按下「OK」鈕,套用後於 Console 會跳出訊息,顯示刪除原先 DHCP Client 服務所取得的 IP 資訊,此時您會發現瀏覽器無法控制 GUI 圖形介面,因為 IP 位址已經改變了!請於網址列輸入剛才設定的固定 IP 位址「http://10.10.25.115」即可。
- 切換至「Network > Global Configuration」項目,選填相關資訊:
- Hostname:輸入此台 FreeNAS 的主機名稱,此例為輸入「nas」。
- Domain:請輸入主機的網域名稱 (DNS 尾碼),此例輸入「weithenn.org」。
- IPv4 Default Gateway:請輸入區域網路中預設閘道的 IP 位址,此例輸入「10.10.25.254」。
- Nameserver 1:請輸入主機使用的第一台 DNS 網域名稱解析伺服器 IP 位址,此例輸入「8.8.8.8」。
- Nameserver 2:請輸入主機使用的第二台 DNS 網域名稱解析伺服器 IP 位址,此例輸入「168.95.192.1」。
- Nameserver 3:請輸入主機使用的第三台 DNS 網域名稱解析伺服器 IP 位址,此例輸入「168.95.1.1」。
- Save:確認上述設定無誤後按下「Save」鈕確定套用設定值。
- 切換至「Reboot」項目,並按下「Reboot」鍵,重新啟動 FreeNAS 主機。
- 主機重新啟動完成後請切換至「Network > Network Summary」項目,查看所設定的固定 IP 位址、預設閘道、網域名稱解析主機資訊是否正確。
▲ 圖10:設定 em0 網卡固定 IP 位址
▲ 圖11:設定主機名稱、預設閘道及網域名稱解析伺服器 IP 位址
▲ 圖12:重新啟動 FreeNAS 主機
▲ 圖13:查看固定 IP 及相關資訊是否正確套用
測試主機網路連通狀態
請於 Console 介面輸入「9」進入「Shell」指令模式,接著利用「ping」指令配合參數「-c2」─也就是 ping 2 次(預設動作為持續 ping)─及相關 IP 位址,以了解主機的網路連通狀態,或者是主機卡在哪個環節上,以下以主機設定固定 IP 10.10.25.115 為例:
# ping -c2 127.0.0.1 // 檢查 Loopback IP Address
# ping -c2 10.10.25.115 // 檢查設定的 IP Address
# ping -c2 10.10.25.254 // 檢查主機與預設閘道間的通訊
# ping -c2 8.8.8.8 // 檢查主機與網域名稱解析器的通訊
# ping -c2 tw.yahoo.com // 檢查主機是否能夠正常解析網域名稱
▲ 圖14:測試主機網路連通狀態(1)
▲ 圖15:測試主機網路連通狀態(2)
結語
本文主要介紹 FreeNAS 主機的基礎網路設定。在下一篇文章中將分享如何實作 FreeNAS 的進階網路功能「網卡容錯 (Failover)」。
[自由專欄] 專利勒索是否將取代軟體開發成為生財之道?
洪朝貴/文
◎ 本篇文章傳達作者意見,不代表自由軟體鑄造場電子報立場,回覆意見請見部落格原文網址:http://ckhung0.blogspot.com/2011/05/android-windows-mobile.html
Zdnet 報導,HTC 每售一台 Android 手機,微軟進帳 5 美元。事實上,若以量價相乘,Android 幫微軟賺的錢,是 Windows Mobile 的五倍。奇怪,寫程式碼的明明是 Linus Torvalds 等網友和 Google 等公司,為什麼 Microsoft 也可以收錢?難道 Microsoft 違反了智慧財產權,偷竊其他作者的成果嗎?
正好相反,是 Microsoft 反用「美國軟體專利制度」,向那些真正在創新的公司和作者敲詐保護費。請容我直接切換到「良知放兩旁,利字擺中間」的資訊教授標準模式。大學資訊科系如果不願意拋棄 Microsoft,至少也應該看一下,Microsoft 在失去創新競爭力之後,還能如何賺錢。
利害分析模式
從這件事可以看出來:今日的智慧財產權已經走火入魔,鼓勵專利勒索,而不是專利創作。靠著寫程式販賣著作權的商業模式早在式微;今天 Microsoft 已正式帶領資訊產業進入專利勒索年代。真正能夠讓老闆們輕鬆賺大錢的,不是辛苦地寫程式,而是步 Microsoft 後塵,用專利地雷向其他真正從事軟體創作的公司進行敲詐。
如果我是 Steve Ballmer,你猜我接下來要僱用更多的 Windows Mobile 開發者,還是略懂程式設計的專利申請律師? 答對了。如果臺灣的資訊產業一定要追隨 Microsoft,也應追隨它的「策略」而不是「產品」。資訊科系的同學們也不必再傻傻地用 asp.net 與 VB,像個苦行僧一樣地開發軟體。 在後 PC 時代,連 Microsoft 都打算靠 Android(Linux 的分支)賺錢;你卻還在學那些無法跨平臺的東西,這不是前途無光嗎?不過改用 Java 也沒有抓到賺大錢的重點。Microsoft 以及專利瘋狂廝殺的整個手機市場已經清楚地告訴我們:現在真正值得學的,是專利攻防術。只要學得一點計算機概論的皮毛,就趕快轉唸法律系,這才符合資訊產業未來的需求。當然,Microsoft 所需要的新律師恐怕不多;它已經有太多閒置的軟體工程師,透過教育訓練既有員工,讓他們在內部轉換專長與工作性質,可能更為實際。另一方面,其他那些真正在生產程式碼卻被勒索的公司,不論是否決定對抗 Microsoft,對於專利工程師的需求可能也會增加─因為他們也要建立專利庫自保。
良知模式
不過我很懷疑這個病態的就業市場能有多大,再過多久就會崩盤或泡沫化?還在唸中學的同學們比較幸運,請別再對資訊科系存有幻想。但也別以為進法律系學專利攻防是取代程式設計的新興黃金選擇─對人類社會而言,那是一個沒有實質生產的「內耗型」產業(上述 fair troll 之類的努力是例外,因為此行業的目標是瓦解現行的病態專利系統)。
網路時代的就業市場與大學裡恐龍科系的想像很不一樣。這大概也是為什麼現在掀起一股新潮流勸大家不必執著學歷。如果你不想加入專利纏鬥的戰局,那麼請多觀察網路趨勢,把自己變成一位「未來在等待的人才」,做一些對人類社會整體而言真正有長遠意義的事。
記住:我們都只有一輩子可活。所以你最好認真看待人生;而傳承計畫可以保證你為世界所帶來的事物在久遠的未來依舊有其寶貴的價值。
─Chris Guillebeau《不服從的創新》
「申請專利,勒索他人,阻止創新的擴散」顯然不是一種有益世界的傳承。人生只有九百個月,做點有趣、有意義的事吧。
[源碼快報] Richard Stallman 針對 Jobs 過世發言惹爭議
謝良奇/編譯
Richard M. Stallman 對於 Apple 共同創辦人 Steve Jobs 過世的回應,正如他以往針對技術議題的發言,充滿挑釁意味。身為自由軟體擁護者與 GNU 創造者的 Stallman,日前在個人部落格發表給 Jobs 的悼文中,將 Steve Jobs 描述為把電腦打造成新潮監獄的先鋒,藉以攫取笨蛋們的自由。
Stallman 引用芝加哥市長 Harold Washington 的話「他死了,我不感到高興,但我很高興他走了。」認為 Jobs 對用戶計算環境的有害影響可以從此告一段落。
從這些話可以看出,Stallman 與 Jobs 對於軟體商業的看法有著南轅北轍的差異。身為電腦科學先鋒與 MIT 的不支薪研究員,Stallman 對於軟體專利,以及今日多數行動裝置中侵害使用者隱私的功能,都採取反對態度,Apple 的 iPhone、iPad 正是這些行動裝置中的佼佼者。Apple 嚴密控制用戶應用程式的做法,同樣也踩到了 Stallman 的地雷。
事實上 Steve Jobs 與開放源碼或自由軟體之間的複雜關係由來已久。電腦產業在 1990 年代初期仍以自行開發為主,這意味著軟體開發者必須不斷重覆其他人早已做過的事,也就是俗稱的重新發明輪子。直到 Jobs 在他的 NeXT 公司使用了開放源碼軟體,這一切才有所改觀。
當 Jobs 被迫離開 Apple 時,他帶走了 6 名員工並成立 NeXT。像這樣一家不到 10 人的小公司,沒有預算來重新發明輪子,為了確保公司的存續,一切都得迅速完成。Jobs 於是轉向開放源碼軟體。
Jobs 回到 Apple 後,這種做法也影響了 Apple。儘管 Apple 在開放源碼軟體協助下,在市場上占有一席之地,該公司卻無法轉而回饋開放源碼。因為 Apple 大多數的銷售都來自其硬體,儘管其硬體中的作業系統才是 Apple 的特出之處。
無論出於何種原因,Apple 一向死命固守其產品機密。每當發表新產品時,開發者會收到警告,一旦洩漏任何資訊,將被逐出計畫之外。慣於開放源碼開發與協同合作的人,顯然會對該公司的做法感到訝異。
除了對自家產品守口如瓶之外,只要不影響其營收,Apple 倒是樂意與開放源碼開發者共事。該公司網站有好幾頁程式碼,都是用來協助開發者創造自己的專案。此外,Safari 賴以執行的 Webkit,也被廣泛認定為最好的開放源碼瀏覽器之一。
另一位自由軟體支持者 Eric S. Raymond,也談到 Jobs 的過世。儘管較為婉轉,Raymond 的看法和 Stallman 基本上是相似的。他說,Jobs 創造了一個圍牆高聳的美麗花園,這是真正的問題所在,他聚集了龐大的群眾,這群人放任自己的選擇受到限制,並且只因為有著漂亮的窗簾,就讚美起監獄的鐵窗。
Stallman 與 Raymond 這種將 Apple 與其用戶視為監獄和囚犯的隱喻,特別是把 Apple 用戶視作被剝奪了自由的笨蛋這一點,引來許多人的不滿。
雖然正如 Raymond 所提到,原始的 Mac 不打算讓用戶打開機殼,iPhone 和 iPad 只能使用 Apple 認可並透過其 App Store 散佈的軟體,客製化與黑客從來就不是 Apple 產品的主要設計目標。然而,這些都不能限制用戶對技術產品的選擇。Apple 的產品和 Windows、Linux 一樣,只是一種選擇,使用者不是非得使用 Apple 產品不可。即使 Raymond 擔憂 Apple 產品會讓 Apple 用戶對於被剝奪自由一事放鬆戒心,但反對者認為,一旦用戶反悔,他們隨時可以放棄。
況且 Apple 的產品並未扼殺開源產品的發展與散佈,使得 Stallman 與 Raymond 以及其他不喜歡 Apple 產品的人沒有其他選擇。假如認為使用 Apple 產品的人是囚犯,基本上你是在控訴他們笨到無法自己做決定。
儘管如此,Stallman 對 Jobs 的商業模式的批評,仍有可取之處。不管是 Jobs 對用戶親和力裝置的注重、Apple 對其軟體採取的保守策略,或是該公司行動裝置違反用戶隱私權的做法,都值得世人深思。Stallman 致 Jobs 的悼文或許因為含挑釁意味而廣為傳播,但其對於數位世界的潛在觀點的確值得關注。
Jobs 的過世連帶使得 Samsung、Google 取消了原定在本月 11 日於聖地亞哥舉行的 Samsung Mobile Unpacked 大會。外界預料這兩家公司將於該活動上,公開 Android 4.0 作業系統 Ice Cream Sandwich,以及第一支執行該作業系統的 Google 新一代 Nexus 手機 Samsung Nexus Prime。Samsung、Google 在其聲明中證實外界的猜想,他們不願在 Steve Jobs 過世的此刻宣佈新產品的訊息。
相關網址:
-
Steve Jobs 與開放源碼的複雜關係
http://www.muktware.com/news/2599
Richard Stallman 對 Steve Jobs 的不同意見
http://latimesblogs.latimes.com/technology/2011/10/steve-jobs-stallman-dissenting-view.html -
囚禁、自由?界線何在
http://technologizer.com/2011/10/09/apple-steve-jobs-stallman/ -
向 Steve Jobs 致敬,Samsung 與 Google 延後發表日
http://arstechnica.com/gadgets/news/2011/10/samsung-and-google-postpone-launch-event-out-of-respect-for-steve-jobs.ars - Samsung、Google 延後 Nexus Prime 'Ice Cream Sandwich' 發表
http://www.pcmag.com/article2/0,2817,2394290,00.asp
[按案/工作] 自由軟體鑄造場 誠徵工讀生
洪華超/文
【職 務】工讀生
【需求人數】1名
【工作內容】交辦事務處理,例如︰影像處理、網頁編輯、資料整理...等等
【學歷要求】專科以上(夜間部佳)
【工作經驗】不拘
【工作地點】11529 臺北市南港區研究院路 2 段 128 號 402 室(中央研究院 資訊科學研究所)
【必備條件】
- 具電腦基本操作能力
- 需具備HTML語法編輯能力
- 英語能力具一定的基礎
- 負責任的工作態度,以及有學習意願者佳
【工作時段】每週安排約 2~3 個工作天(09:30~17:30)
【應徵方式】
- 請檢附履歷、基本資料(學經歷、照片、可安排之工作時間、聯絡方式等),寄至rockhung@citi.sinica.edu.tw,洪先生收,標題請註明:應徵工讀生。將擇優通知面試,不適任者恕不退件及函覆。
報主的話
報主的話: 更多自由軟體相關新聞及文章,請按此閱讀或訂閱。 |