2015/12/08

Open NCU淺談


TL;DR
Open-NCU旨在提供中央大學的開發者一個機會,替校內師生開發應用服務。這邊會談談這個計劃發展中遇到的問題和個人的一些想法。

前言


  我在中央大學擔任技師,2014年8月時與另一個同仁、五個工讀生開始了這個團隊。一開始只是為了開發一些校內使用的APP,後來開始思考將APP開源的可能性;也把資料提供的部份用NCU API代替,並且開放給校內使用。最後這些成果都以MIT License的授權方式放在github上。

  我想分享在這期間內遇到的一些問題和想法,供其他大學的教職員或學生團隊參考。


內部


使用Slack做為溝通平台

我們一開始使用電子郵件。但學生沒有回信給所有人的習慣,常常只回信給寄件者;也沒有隨時收信的習慣,在溝通效率上其實很慢。後來使用Slack,Slack非常適合用來作為團隊溝通平台的工具,並且也可以與github、Trello等其他工具溝通;分享程式碼、圖片或檔案也非常方便;也可以用瀏覽器或app參與討論;免費的額度對於一個不到十人的團隊非常夠用。

使用Slack有一個重點是分享彼此的討論過程,任何問與答的過程都可以被其他人看到,這對於實務經驗比較少的學生來說,可以更快速地提升他們的技術能力與實務經驗。

Slack雖然有即時溝通的功能,我還是建議當成留言板來使用,因為學生與社會人士不同,他們主要的工作是唸書,因此不能期待全部人都可以即時回應,必須要有點耐心。但有時還是需要適當的催促。

工作時間

對工讀生來說,寫程式很難有一個給薪的標準,所以我們的評估是一星期約8~12小時,再乘以學校規定的時數上限給薪。學生會有期中考週和期末考週,這點也必須特別注意。建議寒暑假時可以密集一點,但對於要考研究所的工讀生可能需有另外的考量。

開會時間

人一多就很難有一個共同可以開會的時間,尤其是來自不同年級或不同系所,所以建議是將小部份的問題在Slack就先解決,會議上再來討論大方向。



技術

從課程與餐廳開始規劃API

從以前辦app比賽的經驗得知,大部份學生有興趣的資料就是課程與餐廳,所以建議可以從提供課程資料與餐廳資料的api開始。但我們的課程api頂多只提供個人課表查詢(read),並未提供加退選等功能(write)。

這有兩個原因:
  1. 選課系統當初在開發時並未考量到要提供api,所以必須另外開發功能 
  2. 假設開發者使用課程api,開發了可以讓其他使用者進行加退選的服務,若因為網路不穩、介面顯示錯誤等原因導致加退選異常,這其中的責任很難歸屬。 
所以NCU API暫時不提供加退選的功能,交由下一代的選課系統在設計時把這部份功能也考量進去,做一個詳盡的規劃。

使用新技術

我們使用Jenkins來作為自動化流程的一部分,包含測試、打包與部署。一般學校並不會把Continues Integration、Continues Delivery和DevOps的概念納入課程,因此你不能期待工讀生有這樣的程度。我的建議是將基礎工具先建立好,直接讓工讀生使用。在Jenkins上的權限設定也要考慮過,避免一個工讀生有太多的權限。

集中式和分散式

一般學校是將所有功能包在一起,成為一個官方app;我們則是將不同功能分成不同的app,Google Play。這有幾個考量:
  • 節省空間:讓使用者安裝他想要的功能。 
  • 維護方便:維護只需要改動一小部份的程式碼。


法律

教職員與學生的id

我們有個API是可以利用教職員證或學生證的卡號來做簡單的身分認證,其中學生的ID是學號,教職員的ID則是由身分證字號轉換而來。這部份需注意是否會觸犯個資法。我們與法律顧問討論後的結論是應該不會,有三個原因:
  1. 並未顯示全校的id。 
  2. 用途明確。 
  3. 使用者知情。為了避免惡意開發者使用trial and error的方式,取得全校的id,必須將卡號和密碼(使用者身分證後四碼)一併傳至api進行認證,並且在一定時間內設有額度限制。 
最好要求開發者必須在使用者刷卡時進行警示。

MIT License

這是一個可以商業使用的授權,我們的考量點是,若真的有學生能夠運用我們的成果做出商業化的產品或服務也無妨,倒不如說我們就是希望學生能夠運用我們的成果,做出商業化的產品與服務。當然,是否收費需要再討論。

在Google for Education雲端硬碟儲存個資

因為Google for Education雲端硬碟有無限的空間可以使用,所以我們曾經也考慮過使用Google雲端硬碟來儲存資料。但因為中央大學計中有ISO 27001的認證,在這部份因為無法掌握Google如何儲存資料,也無法掌握其備份的方式等資訊,可能會違反個資法或ISO 27001的要求,所以若有將資料儲存在雲端的需求,需特別考量。

不過Google for Education已通過ISO 27018的認證,也許可以修改該單位的資訊安全政策以達成此目的。


外部

開發者參與的比例不高

這裡指的是校內學生與教職員申請使用NCU API開發的比例不高。根據資料顯示,NCU API開放後一個學期,申請使用api的服務不到五個。

大概有幾種可能性:
  1. 目前API的種類不多 
  2. API所能提供的資料太少 
  3. 使用API開發服務的風氣沒有像國外那麼盛行 
  4. 沒有那麼多人有能力使用API來開發服務 
  5. 宣傳不足 
我認為可以藉由開源社的人數與全校人數的比例,來大致估算一間學校大約會有多少潛在開發者。

開源可以吸引人才

對於從事資訊產業的工程師來說,一個github帳號幾乎等同於一份履歷。大學計中應該都是負責處理校內的校務系統,工程師在校務系統上的貢獻很難被外界得知與量化,即使寫在履歷表內,一般企業還是會將工程師的能力打折扣;加上薪水受科技部限制難以與外界競爭;更不用說大部分都是約聘。以上種種的條件會使得一個國立大學的計中難以找到優秀的人才。

若能將成果以開源的方式分享出來,因為即便無法提供高薪正職等條件,對吸引人才還是有所幫助的。不過資料取得可能就要特別留意,避免把資料庫的位置與帳號密碼上傳,或是可以像我們一樣採用API的方式取得資料。

不能完全依賴開源

因為台灣的風氣並不像國外那麼盛行,人口的比例也有差,所以即使將程式碼公開了,也不能期待隨時有人會幫忙維護,還是必須有專人維護。


未來

機器可理解

提供有語意的API,讓機器可讀並可理解資料內容,例如將行政單位的資訊以json-ld的格式包裏起來。可能的情境為向人工智慧的公司註冊該單位的API endpoint,讓人工智慧來讀取公開資訊,甚至透過OAuth讀取個人資訊,提供更無縫的服務。
接下來將以apple的SIRI和《機械公敵》的VIKI為例子,幫助大家想像我心目中的未來情境。


VIKI

利用這些機器可理解的API來訓練人工智慧(例如IBM Bluemix Watson),使其成為理解該機關相關事務的VIKI,最後可對使用者的問題與需求作出回應。

可以與IoT結合,讓VIKI感測及管理空間內的裝置。

SIRI &VIKI

若人工智慧間有共同的通訊協定,則可以讓SIRI和VIKI彼此能夠溝通,交換資料,這樣就不用人工註冊了。


情境

一個教授將出席一場在中央大學召開的研討會,車子上的SIRI知道教授有這項行程,因此在車子快接近中央大學時,通知中央大學的VIKI(通訊協定)。

VIKI知道校內確實將舉行這場研討會(API),因此預訂距離會場最近的空車位(IoT),並將資訊回傳給SIRI,然後通知主辦單位與會者即將到達(API)。

SIRI接收到停車位資訊後傳給車子,車子則自動開到該停車位(自動導航)。

SIRI、VIKI、感測裝置和車子,都是不同單位的產品,但是透過API、通訊協定和IoT等技術被串連在一起了。


參考影片:
How to Build Linked Data APIs with JSON LD and Hydra


Optimize Your Data Architecture for an Integrated Future 

2015/05/22

Apache Usergrid 在 CentOS 7 安裝步驟

是按照筆記打的,可能和實際的狀況不一樣,少打了一些切換資料夾的指令

備註
如果用Java 8來做的話會有以下的錯誤,這時候就要確認一下所用的java版本
Failed to convert property value of type 'me.prettyprint.cassandra.service.clock.MicrosecondsClockResolution' to required type 'java.lang.String' for property 'clockResolution'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [me.prettyprint.cassandra.service.clock.MicrosecondsClockResolution] to required type [java.lang.String] for property 'clockResolution': no matching editors or conversion strategy found 

參考資料:
http://usergrid.readthedocs.org/en/latest/deploy-local.html http://usergrid.incubator.apache.org/docs/deploy-local/
http://foorious.com/devops/usergrid/install-trusty/
http://foorious.com/devops/cassandra-cluster-trusty-install/
http://www.liquidweb.com/kb/how-to-install-cassandra-on-centos-7/
http://tecadmin.net/install-tomcat-8-on-centos-rhel-and-ubuntu/
https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-a-centos-7-server