前些日子,我特意重構了一個十年多前寫的小程式,為的是看看這十幾年來在程式編寫的想法上,會有什麼變化,其中部份感想發表在〈程式碼的美與醜〉之中;我將成果放上了GitHub,並解釋著「程式實際的使用者是我當時女友、現在的老婆,她對影像處理不熟,用不了PhotoShop之類軟體提供的複雜功能,只是想要抓圖、裁剪、旋轉、鏡像、放大縮小等簡單功能」,有個網友馬上抓住了重點而留言寫道「我們把妹(誤……我是說幫助人……)的時候,頂多是找個軟體給她用,沒想到竟然會有直接寫個軟體給她用的男人」。

老實說!雖然這留言感覺是個笑話,不過我滿欣賞這個回應的,因為他確實抓住了我另一個重點,而這個重點,我也經常會在教育訓練或演講時提到:「你會為老師寫程式,為老闆寫程式,為客戶寫程式,那麼,你有沒有為自己寫過程式?為家人寫過程式?為身邊的人寫過程式?」

在用Java為身邊的人寫程式這方面,令我最印象深刻的是iHelp這個App,它的開發者出生於一個無聲家庭,大二時便將所學Android App發揮在自己家庭身上,讓聾啞人士能像常人一樣可以打110、119報案。當然,這只是個例子,你可以用任何本身熟悉的語言來做類似的事情,就這些日子接觸Maker文化以來,這樣的行為就是Maker精神的實現,而不是一定得拿起鋸子、插插控制版、銲接電路、用上個3D印表機,才能叫做Maker。

近來我也會在談及「為身邊的人寫過程式?」之後,再加上一句「為社會寫過程式?」隨著全球政府都在瘋Open Data,臺灣政府於這一、兩年也逐步跟上了Open Data的行列,如果想使用Java或其他語言生態系方面的技能,來為社會寫些程式,這也會是個可行的方向。

想要在這方面有個起頭不難,只要輸入「Open Data」在網路上搜尋,就會有相關的資料或組織,可以做為認識與加入的起點。

Java與Raspberry Pi

如果覺得不拿個電路板晃一晃,就不像個Maker,或者想要進一步將Java程式設計方面的能力,延伸至實體的世界,那麼Raspberry Pi結合Java是個不錯的起點,在Raspberry Pi建議安裝的Raspbian作業系統之中,就已經預先安裝好ARM Linux版本的JDK8,對於其他作業系統,Oracle的Java下載頁面也提供有ARM平臺的JDK8,Raspberry Pi本身可視為便宜的電腦來使用,可以在上頭撰寫Java程式,或者安裝任何基於Java而開發的應用程式,以解決身邊的需求。

若想進一步擴充Raspberry Pi的能力,可以啟用它的GPIO(General-Purpose Input/Output)腳位控制能力,這些腳位可用來銜接市面上許多感應器、電路模組等硬體,在使用程式控制GPIO腳位方面,Raspberry Pi有個常見的GPIO程式庫WiringPi,此程式庫本身是由C語言撰寫,只要透過Pi4J提供的JNI程式庫,就可以使用Java撰寫程式來控制GPIO腳位。

Java支援嵌入式系統的開發,對於Raspberry Pi這類不需要太複雜的低階硬體設備,在不需要完整的JDK功能的情況下,可以採用Java Embedded來作為執行平臺,對於基於ARM的Raspberry Pi,Java SE Embedded 6、7分別提供了是否支援硬體浮點運算(Hard Float Point)、軟體浮點運算(Soft Float Point),以及提供圖形操作介面(Headful)與不提供圖型操作介面(Headless)的版本。

由於嵌入式應用程式的多樣性,Java SE Embedded 8開始有了更有彈性的Compact Profiles架構來應對,開發者可根據嵌入式系統應用程式的需求,建立適合的Compact Profile執行環境,用以大幅減少執行環境的大小,預設的Compact有三個(compact1、compact2與compact3),可使用jrecreate指令來建立,建立時亦可以指定JVM模式,除了可指定傳統的client、server之外,還有選項minimal可建立使用最少資源的JVM。

JDK8本身也提供jdeps指令,用以檢測編譯好的Java程式或採用的程式庫,是否符合某個Compact profile執行環境。若想用Java來撰寫應用程式控制Raspberry Pi,在IDE的支援上可以使用NetBeans,它可以建立Remote Java Standard Edition作為專案執行平臺,基於此平臺的專案,可以透過SSH將專案送進Raspberry Pi執行,而後將執行結果傳回IDE。

Java與leJOS

如果只是純粹想從「玩」來進入Maker領域,那麼作個機器人並寫程式來控制,會是個不錯的出發點,Java與Raspberry Pi的結合做得到這點,不過,機器人本體的架構必須得自己動手,若對切、削各種材質來組裝機器人架構這方面,沒有信心或感到麻煩,改為使用積木來建立機器人的架構,相對會比較容易些,實際上我最初開始接觸Maker文化,也是從玩弄積木機器人開始。

不過,積木機器人可不見得只能做做玩具,也可以是實際用來解決身邊的問題,一個著名的例子是個12歲的小孩Shubham Banerjee,用LEGO EV3做了個盲人點字列印機Braille Printer,其成本相當於350美元,相對於市面上普遍要價2,000美元以上的點字列印機,Shubham Banerjee的發明解決了個實際問題,因此還吸引了Intel的注意,獲得了Intel Capital的資助,更名列美國白宮Maker Faire發明名單。

LEGO機器人本身雖然是使用圖形化程式語言,不過,也可以使用Java語言來撰寫程式控制機器人,這個方式的歷史算是悠久,起源於第一代RCX主機開始,一群開發者於1999年提出TinyVM計畫,並於2000年重新打造為leJOS(Java for LEGO Mindstorms),後續的NXT與EV3主機,也都可基於leJOS撰寫Java來控制機器人,Oracle也為leJOS建立特定版本的Java SE Embedded(http://goo.gl/KUN4z1),目前有Java SE Embedded 7與8版本。

在IDE的支援上,可以使用Eclipse並配合leJOS plugin來進行開發,一樣地,這會透過SSH將程式送進leJOS中執行。當然,更重要的是有沒有詳細的文件,來介紹如何在leJOS上使用Java進行開發,就這點來說,leJOS官方網站本身就提供資訊豐富的Wiki或Tutorial,論壇也有相當的活躍度(http://goo.gl/auxGog),相關書籍也不少,leJOS主要開發者Brian Bagnall本身也分別為RCX、NXT與EV3出版過書籍,介紹如何使用Java來控制,leJOS官方Blog(https://goo.gl/3IUsmt)上也有不少文件可參考。

從既有能力出發解決問題

雖然標題是〈從Java到Maker〉,不過老實說,我的過程實際上卻是「從Maker回到Java」,在這段接觸Maker文化與工具的日子裏,摸索的東西經常都與Java掛不上邊,從身邊朋友們的反應來看,我玩的東西感覺就像是兩個世界的事,雖然多元探索本身很有趣,不過,我也開始會問自己,這些東西有沒有辦法與既有的能力相結合?特別是與既有的Java能力基礎結合?

實際上,找到的答案也不僅止於Android、Raspberry Pi或leJOS等的應用,即使是Arduino上,也是有些相對可行的方案,當然我相信,將標題中的Java,換成Python、JavaScript等其他程式語言,也許都能找到適當方式,例如,Raspberry Pi上其實真正推薦的入門語言是Python,JavaScript也有Tessel控制板,可基於Node.js來進行開發。

無論你是基於以上這類建議作為起點,或者是如我繞了一圈重新尋找這些方式,都可以在探索Maker領域的同時,持續強化與擴展既有的技能,那麼,該如何用這些技能做有用的事呢?為社會解決問題太遙遠的話,那麼就試著先為身邊的人或家人解決問題,或者,先至少為自己解決些問題,別擔心你目前的能力不足,你學到的東西都是有用的,重點在於開始實際地應用所學,也才能實際獲得必要的知識,而這會是Maker真正的出發點!

專欄作者

熱門新聞

Advertisement