2012年12月30日 星期日

回顧2012年展望2013年 - CIO雜誌雲端運算十大預測

圖片來源:網路

2012年是充滿了變數的一年,不過也即將接近尾聲了,我想應該趁這個機會,對這一年作個回顧與檢討,然後展望未來立下新目標與新希望。

回顧2012年


話說當初創立這個blog時想說一來可以寫寫遊記(結果越來越少機會出去玩),二來平常就有再整理一些筆記應該可以分享出來(但是太懶了,又怕內容沒啥營養變成野人獻曝),所以從開站以來都處於半休止的狀態,每年幾乎都只有零星的文章產出。直到今年四月開始,為了要推銷自己做的產品,以及想藉著寫文章強迫自己整理思緒 (應該是受到Mr. Jamie的幾篇文章影響:我的成長磨練:天天寫網誌你必須開一個網誌,現在 ) ,就這樣開始過著拼命逼自己寫文章的日子。

一開始真的蠻痛苦的,每天都要努力找題目和想梗,就算想到能發揮的梗,還得花更多時間整理資訊和撰寫文章,在這邊要推薦電腦玩物的文章:零碎時間最佳化:我如何堅持每天寫完一篇部落格文章,因為我本來在Google Reader就有訂閱大量的國內外科技與產業資訊,所以我每天會利用零碎的時間閱讀 (比如說捷運通勤時...),然後看到有趣的文章,或是可以討論的梗,就把它存到Evernote,然後再另外找時間把這些梗整理成文章。先不討論文章的質量,就這樣半年下來居然也累積了100篇文章!現在回想起來我都要感動的落淚了~XD

這100篇文章,我覺得寫起來最輕鬆的大概就是技術文章,因為這是每天的工作內容 - 遇到問題Google找Solution,現在只是順手把他整理成教學文件。而最痛苦的文章就是要想辦法寫出一些自己的看法,一些insight的文章,這方面我還是還太弱(到底是腦袋太空,還是文筆太弱呢...),希望未來再多加練習後可以有所進步。

寫Blog雖然蠻痛苦的,得花許多時間與代價,但是意外的收穫真的也不少,比如說:
  • 為了寫Blog和行銷產品,才會主動花時間去了解網站經營和SEO等玩意,因此還觀察到許多有趣的現象:
    • 由於我談論的題目可能還蠻新的,所以將近有1/3的訪客來自於美國?(但是我寫的都是中文的啊,所以是在美國的華人??)
    • 學習到接近下班時間和晚上po文章會比較多人看,然後假日看文章的人就會銳減(因為我這邊主要都是比較硬的東西?)
    • 原來每個月固定有一千多pv的網站,就算沒有點擊廣告也是會有0.x美金的收入的~XD (真的很佩服可以靠寫blog吃飯的人)
    • 結果還是越輕鬆簡單的題目越多人看,比如說旅遊相關的資訊情報最多人看~:P
  • 認識了許多新朋友
    • 原本以為寫的東西都是我再自言自語沒啥人在看,但是意外的似乎有了一些固定的觀眾,也開始有人來留言,甚至還認識了許多新的朋友。
    • 因為參加了許多活動,也有寫了參加感想,居然也因此認識了更多網路圈子的名人,也加入了幾個社團(如:Scrum Community in Taiwan)
  • 最大的收穫當然還是,自我能力的提升:
    • 強迫自己養成習慣,所以紀律很重要 (運動也需要這種紀律啊!! Orz...)
    • 透過撰寫文章訓練自己的文字的組織與表達能力
    • 藉著寫文章整理自己的思緒,想辦法把不成熟或是天馬行空的想法收斂,試圖可以淬鍊出一些有用的東西,不過這仍在努力中,畢竟學習成長之路是漫長與伴隨著痛苦啊.....Orz..
所以開站到現在,有哪種類型的文章和哪幾篇文章最多人閱讀和搜尋呢?在這邊做個簡單的分類與整理:
不過我想旅遊情報的文章應該會後來居上吧,畢竟這類的文章收視觀眾還是比較廣,當初還自以為的開了一個分站想要專門用來寫遊記,結果只是分散流量...Orz..

展望2013年


展望2013年,我希望能寫出更多有內容的文章,而且是真對別人有幫助的,甚至會讓人想要轉錄分享的文章(像是iThome的等級!?),主要的題目應該還是會圍繞在雲端運算(CloudStack 、BigData、SDN...等)、軟體工程- Agile產業觀察...等議題。

不過在還沒達到擲地有聲的境界前,還是只能先拾人牙慧一番,剛好 CIO 雜誌的這個Slide  "10 Cloud Predictions for 2013",列出了對於雲端產業2013年的預測,跟我觀察到的很相近,所以就直接拿來用,順便跟我之前的文章做對照。

  1. Hybrid clouds will take off  (2013年 Hybrid Cloud才是王道 )
  2. Amazon competitors will begin to fall (在IaaS 要跟Amazon 競爭將會越來越困難)
  3. Hybrid cloud management becomes key  (Hybrid Cloud 管理工具將是關鍵)
  4. Cloud brokerages and integration hubs will explode (如何有效整合雲端服務)
  5. Big Data gets bigger  (BigData應該會持續Big下去~XD)
  6. Software defined networking (SDN) becomes mainstream (SDN會是我的新作業)
  7. Hybrid cloud security options will increase  (既然是跨雲安全議題就會更加重要)
  8. IaaS-based services will expand (只有虛擬化服務的IaaS已經過時了!)
  9. Outages will occur (斷電停機還是會發生,如何設計高可靠的系統架構仍是顯學)
  10. Gamification will drive sales and customer service


嗯正好由這第101篇文幫民國101年畫下句點~XD
最後再這邊祝大家新年快樂!!


 圖片來源:萌貓美術館

2012年12月26日 星期三

[筆記] 如何在maven裡面設定不同作業系統的 JDK tools.jar dependency

Source:network


最近每天在這三個作業系統中切換,常常會腦袋轉不過來卡住,不然就是在鍵盤對應上卡住,這次遇到的問題則是三個作業系統的JAVA_Home設定都差很多......(引言都呈現碎碎念狀態..囧rz..)

話說今天按這篇文章How-to: Develop CDH Applications with Maven and Eclipse在照表操課 ,結果遇到這個問題 Buiding Hadoop with Eclipse / Maven - Missing artifact jdk.tools:jdk.tools:jar:1.6
原因就是Windows 和 Linux 和 Mac對於 JDK的目錄結構不太一樣 (其實只有Mac愛作怪....),所以我在網路上找到一篇利用Profile的方式,分別設定兩種對應的路徑。

  <profiles>
    <profile>
      <id>windows_profile</id>
      <activation>
        <os>
          <family>Windows</family>
        </os>
      </activation>
      <properties>
        <toolsjar>${java.home}/../lib/tools.jar</toolsjar>
      </properties>
    </profile>
    <profile>
      <id>osx_profile</id>
      <activation>
        <os>
          <family>mac</family>
        </os>
      </activation>
      <properties>
        <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
      </properties>
    </profile>
  </profiles>


Reference:
[1] jdk tools jar as maven dependency
[2] Apple Developer Tools for Java

2012年12月25日 星期二

物聯網應用網站 - cosm

 圖片來源:cosm

話說前一陣子跟前同事聚餐,而一群工程師的聚餐一定會聊聊最近有啥好玩的新玩具( 通常有在紅茶店工作的朋友在場的話,照例就會拿出許多神秘新機型給大家把玩一下,順便幹樵一下用他們家手機遇到的Bug)。

此外還可能聊到最近有看到啥有趣的技術,其中剛好聊到了這個cosm這個網站,我覺得這個網站很有指標性,非常值得持續關注與討論,因為一個屬於物聯網 C2C 或 B2C 的 Business Model可能正在產生中,不過在在進入主題前,我們先來復習一下什麼是物聯網,以及物聯網的定義。

物聯網的定義


話說物聯網(Internet of Things, IOT) 名稱的來源,它最早由國際電信聯盟(International Telecommunication Union, ITU) 於2005年所發布的報告「The Internet of Things」中提出,係指在網路化的時代下,除了人跟人之間可以透過網路相互聯繫、人也可透過網路取得物件的資訊外,物件與物件之間可以互通的網路環境。

而參考Wiki上對於物聯網的定義:
物聯網就是把感測器裝備到電網、鐵路、橋樑、隧道、公路、建築、供水系統、大壩、油氣管道以及家用電器等各種真實物體上,通過網際網路聯接起來,進而運行 特定的程序,達到遠程控制或者實現物與物的直接通信。物聯網,即通過裝置在各類物體上的射頻識別(RFID)、感測器、二維碼等,經過介面與無線網路相 連,從而給物體賦予「智能」,可實現人與物體的溝通和對話,也可以實現物體與物體互相間的溝通和對話,這種將物體聯接起來的網路被稱為「物聯網」。
由上面這段話,可以幫物聯網整理出幾個重點:

四大關鍵技術:

(一)射頻識別技術(Radio-frequency Identification, RFID)
(二)無線感知網路(Wireless Sensor Network, WSN)
(三)嵌入式技術(Embedded Intelligence)
(四)奈米與微機電技術(Nanotechnology and Micro Electro Mechanical Systems)

三種面向:

(一)Device to Device (Machine to Machine)
(二)Device to Person
(三)Person to Device

不過隨著技術的演進以及更多商業應用的產生,現在物聯網更被擴大泛指所有俱有網路連線功能的裝置(IP-enable Device),所以除了一開始定義的RFID tags, wireless sensor networks, machine-to-machine (M2M) communications,更把 iPhone apps, Smart TV 以及現在最火紅的雲端運算,都納入物聯網討論的範疇。

Ps.
反正這些名詞就跟撒尿牛丸一樣,混在一起用就看起來很威,舉例:
我最近正在搞O2O的微創業,使用奈米雲端物聯網的技術收集資料,可以在海量之料中建立推薦模型,非常有搞頭,要不要來參一腳~ (誤)

物聯網的應用


好回到重點,來討論 cosm 這個網站,為什麼會覺得他很經典值得討論呢?他的概念很簡單就是一個收集各種Sensor資料的共通化平台,並且提供視覺化的Web介面

廣義的Sensor其實包含實體的和虛擬的,舉例來說,實體的Sensor 就是收集真實世界的資料比如說溫度計,濕度計...等,而虛擬的Sensor就是收集虛擬世界的資料,比如說網站記數器,網站流量...等,所以要建立一個共通化的資料收集平台其實不是一件容易的事情,而cosm做到了,它API example 就提供了兩個範例,一個是實體的,一個是虛擬的(twitter),透過cosm網站提供的SDK你可以把你的data 以Json的格式上傳到這個網站,這個網站就會根據你的資料顯示圖表,下圖收集一段時間後的資料顯示 (顯示溫度/濕度的變化)

Business Model

像這種網站/平台到底要怎麼營利呢?目前看到的資訊就只有,這平台式免費的,但是你的資料都必須要public出來,讓人家可以搜尋的到。但是如果不想public出來呢?是否有類似GitHub的付費機制?目前還看不出來。

另外官網也有提到,商業用途:
The Cosm platform is not just an easy way to prototype new Internet-enabled products, it's also a service that helps companies bring products to market at scale. Cosm's provisioning service allows end users to pair their device with applications to control it or use its data. If you are interested in finding out more about the Cosm platform, email us at biz@cosm.com.
所以目前可能的商業模式就是顧問和系統整合?我猜測,這個網站使用者可能有兩類:
  • 一種是有Sensor和資料,但是沒能力或時間建立一個這種平台的使用者(研究機構/小公司), 所以可能願意付費使用這種服務,或是基於這個平台再客製化的需求。
  • 另一種就是一般大眾與開發者,基於好玩的心態把東西和資料傳上去
我想這個網站初期應該蠻難賺錢的,必須想辦法撐到他的資料量夠大,使用者夠多,等到那個時候,可能就會有許多好玩的應用或是可以賺錢的應用產生出來。
比如說我可能要做研究分析,或是某種應用,但是卻沒辦法大量佈建Sensor,但透過這個網站我可以使用別人免費提供的資料,甚至還可以跟別人買資料,這時候可能就會有商機.....
不過這都是我的不負責任亂猜測,就讓我們持續觀察這個網站的發展吧~:P

有興趣的可以去他們網站參考以下資料:

2012年12月24日 星期一

如何在Eclipse 設定 static import

圖片來源:網路

一直以來我都有一個小小的疑問,就是網路上的許多程式範例,在遇到static function的時候為什麼都可以直接呼叫function名稱,而不用把前面的物件名稱都寫出來,舉例如下:


圖片來源:mockito

像是Mockito 的所有程式範例都是直接呼叫static function
Foo foo = mock(Foo.class)
而不是寫成
Foo foo = Mockito.mock(Foo.class)

雖然就只是多要打Mockito但是就覺得很礙眼不舒服,而且明明範例都不用這樣寫啊?在偶然的機會下看到這篇文章 Working With Static Imports in Eclipse 才頓時恍然大悟,原來是要先在Eclipse 裡面動手腳,讓Eclipse 認的出來(只能說Eclipse 真的還有好多秘技功能我都不知道...@@)

設定Static Import


打開Eclispe,然後設定的路徑如下:Window » Preferences » Java » Editor » Content Assist » Favorites,先要確認Content Assist 的部份有把Add import instead of qualified name 和 Use static imports 有勾起來。





然後在Favorites 的部份填入你常用的Static import library package 名稱 




建議可以加入常用的Static function如下:

org.junit.*
org.junit.Assert.*
org.junit.Assume.*
org.junit.matchers.JUnitMatchers.*
org.mockito.Mockito.*
com.google.common.base.*


第一次使用時,記得最好先使用alt+/ 去產生 code completion,看看設定有沒有成功,如果看到以下畫面就代表成功了。





Reference:
[1] Working With Static Imports in Eclipse
[2] Generate static imports in Eclipse on autocomplete for JUnit Assert, StringUtils and others

2012年12月23日 星期日

Google Guava - HashBasedTable

 圖片來源:Table Structure Model

 注意!此為懶人解題法,請小心服用~ (  ̄ c ̄)y·ξ

懶人解題


前幾天在幫朋友寫一個小程式,情境是這樣:
  1. 他們家有一個製作翻譯檔的軟體,(就是一堆表格,在後面填入machine的各國翻譯),填完表格後匯出的翻譯檔格式XML
  2. 資料來源是一個Excel 檔,裡面有記錄所有要翻譯的資料,以及要翻譯成的版本
  3. 任務就是把Excel 的資料轉到XML裡面
如果把XML 的以圖型來表示大概就會像最上面Table Structure Model 的格式一樣,而Excel 的格式卻只是一個一維的Array,檔案格式如下:

A#123  翻譯1 翻譯2
A#423  翻譯1 翻譯2
B#3sj   翻譯1 翻譯2

#代表分隔符號,A 代表某Row 屬性, 123 代表某 Column 屬性,所以要做的工作就是把Excle讀出來,也轉換成Table的方式儲存,然後再把資料填入XML裡面。

問題


對於懶人思考模式來說,會遇到以下問題:
  1. 我利用JAXB 得marshaller 和 unmarshaller 來處理xml,把xml 轉換成物件操作,但是這種xml物件必須用展開/掃描的方式才能找到每一個iteam,所以在使用上不好操作。
所以懶惰的想法就是把Excle 的資料讀出來,做成一個HashMap,然後透過把Xml展開的過程中,把Parent item 和 Child item的attribute ID當做Key值去HashMap取出資料填進去。

但是HashMap 是Key value 型態,如果轉成Table 型態就會變成很噁心的樣子:

HashMap<String,Map<String,String>> = new HashMap<String,Map<String,String>>();
一來不好操作,二來,如果Row 或是Column裡面有更多巢狀結構會更噁心,甚至會一層一層包下去。

懶人解法


這時候我們就請出 Google Guava 的 HashBasedTable ,使用方法非常簡單與直觀,你就想像成在操作一個Table一樣,而他底層的儲存方式其實就是Map<R,Map<C,V>>,只是他幫你處理掉許多麻煩的問題,比如說在傳統的作法,你要儲存某個資料進去前,你比需要先檢查這個Key值對應的Value 存不存在 (在這邊是要檢查Colum Map是否存在),如果不存在要去產生一個放進去。現在有了HashBasedTable,就可以很輕鬆無腦的使用:
table.put(Rkey,CKey,Value)
然後要取出值也很只要寫
table.get(Rkey,CKey,Value)

打好收工~謝謝觀看懶人獻曝~(  ̄ c ̄)y·ξ

2012年12月22日 星期六

Argument Validation ? 有請 Google Guava 和 Apache Commons







程式開發記得要有的一個好習慣,就是要記得驗證method所傳進來的參數,因為並不是所有使用者都會乖乖看API文件,很多使用者是看到參數就亂傳一通,看看到底會發生什麼事,所以一個好的Method 設計記得要寫參數驗證,範例如下:

public int doSomeCalculation(int value)
{
    if (value < 0)
    {
         throw new IllegalArgumentException("negative value");
    }
...
}



但是一旦要驗證的參數一多,一直都在寫這些驗證的東西,就會覺得很煩,這時候請出一些util library就可以節省許多時間,寫成下面這樣多簡潔啊:

Validate.isTrue(value >= 0, "negative value");
或是
checkArgument(value >= 0, "negative value");


而我腦袋中馬上浮現兩套 Util Library,一個是 Apache Commons 另一個是 Google Guava,根據快思慢想裡面所提到的系統一,我下意識就覺得Google Guava比較新也比較威,Apache Commons又老又舊....(這是啥刻板印象)

對於這種比較Lib效能的我向來就是直接請出Goolge 大神,自己做太麻煩又不一定準 (真沒實驗精神),於是我就找到這篇文章 Google Guava vs Apache Commons for Argument Validation,直接引用那篇blog的結論,這兩套Lib沒有輸贏只有在適當的時候選擇適合的來用

Apache Commons Validate


  • 適合JDK5 以前的舊版本
  • 不用 static imports 就有比較好的閱讀性 (例:Validate.isTrue() 很直觀)
  • 有 Collection 和 array 的驗證功能 (例:Validate.notEmpty(Collection collection))

Google Guava Preconditions


  • 有額外的 exception 類別可以使用
  • 對於訊息類型的參數處理比較方便 
  • 驗證玩後是直接回傳值的,方便直接assign





2012年12月12日 星期三

CloudFormation 教學 - 如何透過CloudFormer產生現有系統設定Template


相信對於許多IT和MIS來說,覺得最麻煩的應該就是要不停的做許多重複工作(比如說 Deploy service & Config network setting...等動作),而更討厭的是如果這個動作又不能被寫成Script自動化,今天要來介紹的神兵利器就是AWS 的CloudFormation。

還記得前一陣子我去參加AWS workshop 寫了一篇 "SaaS Template AWS CloudFormation" ,那時候我的結語是這個東西好威啊!但是該如何客製化產生template,或者是該如何把現有的環境設定輸出成template,是需要研究的功課。不過後來因為就都在忙其他的事情就沒有深入研究了,最近剛好跟同事提到有這個玩意,請他去研究一下,這才知道原來AWS大神已經都把工具做出來了!(謎之音:又少了一個可以周邊服務可以開發了...Orz...)


下面是我Step by Step 的貼圖教學,其實說穿了不值錢,真的很簡單!!




首先,先來到CloudFormation 的服務首頁,如果第一次使用會看到兩個選項:

第一個是Create New Stack  所謂的Stack 就是Template的意思,一個Stack會包含了你整個架構的設定,比如說你要建置一個HA 的 Web Service,內容應該會包含ELB、Instance x2、DB Server、IP設定..等 。

第二個是Lanch CloudFormer,這則是今天要介紹的重點,如何透過CloudFormer這個服務,把你目前系統的配置轉換成Template (Json的格式)。


其實產生CloudFormer也是利用CloudFormation的概念,利用AWS事先建立好的Stack去產生一台Instance,這個Instance裡面就有一個Web Service用來幫我產生template
(用自己去產生自己...很像繞口令)


在這邊他會要你選擇這個stack是不是要允許他設定IAM (權限設定),在這個案例是把它勾選起來,在其他案例就要小心了,因為如果你用了別人的template去產生一個架構,難保他不會偷偷開了一個權限和後門。


這一步可以略過,看你有沒有要加什麼tag


最後他會顯示出來,這個stack預計要產生怎樣的內容。


按下continue,就會回到CloudFormation的頁面,這時你就可以看到cloudformation 正在透過template產生你的stack (整個系統),越大的架構會需要花越多的時間請耐心等候~~


這時候你就可以來點一下下面的tab,由Event這一頁就可以看到目前正在啟動哪些Service,還有那些Service已經啟動好了。


在這邊就可以看到這個Template (Json格式的內容)



當整個Stack都啟動後,請回到EC2 找到剛剛啟動的Instacne ,並且查看他的public DNS or IP。最後連到那個網址,就會看到下面的 AWS CloudFormer 畫面。


首先你要先選擇你要產生的Template 是要Clone那個Region.


第一步:只是要你選擇一些描述這個Template是用來作什麼的

 第二步:選擇是否要clone DNS設定 (在這邊我沒設定所以是空的)

 第三步: 選擇你的網路設定,是否要有固定IP,是不是有LoadBalance...等

第四步:設定你要Clone 那些Instance 的設定 (如果你的Instance 在VPC,則他會自動把VPC的設定都一起Clone)

 第五步:是否要Clone Auto Scaling 的設定

第六步:是否要Clone EBS或是RDS..等設定
 第七步:選擇防火牆設定

 第八步:選擇是否要Clone Auto Scaling Trigger的條件


最後一頁,就是Summary,顯示出來你到底選擇那些Service要產生template,在這邊我只有選擇一個Instance跟一個防火牆設定。



將將~最後就產生出CloudFormation 的 Template啦,你可以直接Copy 這個Json下來,如果你按下Save Template,則會把這個template 存到S3裡面
如果你迫不及待想要測試你剛剛產生的Template,只要再跑依次Launch Stack就可以把你剛剛Template 所Clone的架構都產生出來,是不是很方便呢!?


感想:Amazon實在太威了,更新速度又如此之快,要其他廠商怎麼跟他拼~:P


2012年12月11日 星期二

感謝合掌村熱情贊助流量


紀念一下!!

2012年接近年底,2013年即將到來,網路上也越來越多人開始在搜尋合掌村行程,原來默默的我那篇"[旅遊情報]合掌村2013點燈日"的排名已經排到那麼前面了,難怪最近網誌的流量怎麼突然變大,而且幾乎都是衝著合掌村來的。 (話說我功課也還沒做完啊...囧rz..)

仔細想想,我的文章產量那麼低,這個blog的流量也不是很高(跟熱門部落客比),幹嘛還要自以為的開兩個blog,想把不同的主題分開呢....囧rz....這種小部落客如果想要衝人氣和流量,還是乖乖多寫些有用的文章吧...

小弟會努力作功課,把合掌村和還有周邊的攻略整理出來的!!

目前規劃的吃到飽點燈之旅行程主要如下:

1/30  直飛小松機場-->金沢
1/31  金沢--->高山
2/1    高山   (有機會先看到偽點燈)
2/2    高山--->金沢 (兼六園點燈)
2/3    金沢--->白川鄉合掌村 (點燈日)
2/4    合掌村-->金沢--->小松機場

沒辦法,點燈日的旅館太難定了,所以才會排這麼變態的行程~XD


2012年12月10日 星期一

如何加入open source 社群



人生就是不斷的在挑戰啊,以前可以裝弱(其實真的很弱不用裝),裝公司小沒資源、沒有時間,但是現在沒有藉口了,因為大老闆希望我們能加入Cloudstack的社群,成為contributor,甚至成為commiter,這下我可頭大了!!一堆問題馬上產生,如何加入?如何成為contribotor?如何成為commiter?審核機制是什麼?  

要了解這些東西,就得先從歷史開始了解,話說cloudstack 有著一段複雜的歷史背景,他一開始是cloud.com這家公司所獨立開發得產品,但是後來cloud.com被Citrix買下來,不過基於戰略考量,Citrix 又把 cloudstack open source出來捐給apache基金會,但是不是捐出來就沒事了,必須先經過好幾個階段,第一個階段就是送審查想辦法進入incubator的專案,流程如下圖所示:


也就是要完成幾項任務:
  1. 任何一個孵化器的項目, 都要在Apache中找到一個實體作為自己的Sponsor, 這個 Sponsor可以是一個具體的Apache Top-Level-Project (TLP),或者是找Apache Incubator 的 PMC (Project Management Committee)也可以作為Sponsor Sponsor會選擇合適的人選(一般三個)作為孵化器中專案的mentor, mentor必須都是Apache Incubator PMC member, mentor負責指導孵化器中專案, 確保孵化器中專案按照Apache的方式運行, 直至順利畢業。
  2. 而任何進入孵化器的項目都可以指定一批committer, 這些committer被稱之為該項目的initial committer,所以citrix 想當然耳就是cloudstack的 initial commiter,畢竟一開始就這些人最熟了。

在進入incubator的狀態後,還必須達到幾項KPI才能轉成正式的專案(畢業),所謂的 Top-Level-Project (TLP),這些指標分別是:
  1. 完成Check List 上面的交辦事項
  2. Ensure suitable project name and product names
  3. Creating an Apache Release - Release Early, Release Often  Eric Steven Raymond
  4. Creating an Open and Diverse community (這是最重要的)
    1. Recruit users, developers, committers and PMCers 
    2. Take responsible collective action 
    3. Disagree in public on technical matters without destroying personal relationship
    4. Create an open, positive and inclusive atmosphere on the mailing lists
其他詳情請參考:Guide to Successful Graduation

其中第四點是最重要的,社群必須要活絡(由 mail list上的討論情況就可以知道),貢獻者除了數量要多外,也必須要多樣化(不能只是少數公司把持)

所以老大希望我們加入的原因,應該是一來希望能加速這個社群的蓬勃發展,早日變成TLP,二來也可以增加對cloudstack發展的影響力。

由於北京有些同事已經是commiter了,所以之前有跟他們交流該怎樣參與比較容易成為commiter,他給我幾個建議
  • 追蹤 mail list 和 IRC channel 
    • 了解community 目前正在討論什麼,想要解決什麼問題
    • 參與討論,幫忙回答問題
  • 幫忙測試,回報bug
  • submit patch
  • fixing bug
  • 幫忙整理文件或是wiki  
最後才有機會成為 commiter 可以負責commit code,但是光是第一點我就快招架不著了,Mail list的討論串非常的混亂,而且每天有好幾百封的討論,真的很難插入話題。
而且我現在遇到一個很奇怪的問題,就是大家在mail list討論所顯示的名稱都是全名,比如說Erice Steve,但是只有我的是顯示完整的emial,整個感覺很怪也格格不入,不知道有沒有open source 界的大大願意指點一下。


Source: itnservice

吃了Apache Open soruce 專案那麼多年奶水,希望將來真的能有所貢獻回饋社群啊~~所以現在只能看看有沒有機會找到些bug來幫忙fix....Orz..


延伸閱讀:
[1] 什么是Apache Incubator 以及 Apache CXF的前世今生

2012年12月9日 星期日

[筆記] 如何解決在HTTPS下開發Web Service 的問題

圖片來源:fotolia


延續上一篇"透過wsimport 去產生 web service client 的程式碼" 如果你看到出現這種錯誤訊息:
SunCertPathBuilderException: unable to find valid certification path to requested target 
那就代表你遇到這個問題了,因為對方的Web Service 連線是使用HTTPS,而且是使用Self-sign SSL Certificate,所以你的jvm不信任它,而且在keystore也沒有找到相對應的key。

在stackoverflow 找了許多討論:
[1] stackoverflow - How to use wsimport when server expects client certificate?
[2] stackoverflow - Mutual SSL - getting the key/truststores in the proper formats
[3] stackoverflow - SOAP with mutual SSL - how to send over credentials?
 
主要分為幾種作法:

1. 關掉驗證的機制 (不推薦)


範例程式:

Disable Certificate Validation (code from Example Depot):
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {
    new X509TrustManager() {   
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null; //這邊就是重點
        }
        public void checkClientTrusted(
            java.security.cert.X509Certificate[] certs, String authType) {
            }
        public void checkServerTrusted(
            java.security.cert.X509Certificate[] certs, String authType) {
        }
    }
};

// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (GeneralSecurityException e) {
}
// Now you can access an https URL without having the certificate in the truststore
try {
    URL url = new URL("https://hostname/index.html");
} catch (MalformedURLException e) {
}

另外可以參考的方法 (用來暫時關閉驗證的方法) 


2. 匯入Self-sign SSL Certificate


匯入的方法有很多種,傳統的方法就是教你利用Keytool去匯入,範例如下:

\bin\keytool -import -v -trustcacerts -alias server-alias -file server.cer -keystore cacerts.jks -keypass changeit -storepass changeit

但是這個方法有一個最大的問題,就是Server.cer和cacerts.jks分別從哪裡來?該怎麼產生?根據sun 官網的描述:
If you are running the client on a different machine, you need to export the tomcat certificate and import into your trustore etc. Use those values while starting your client application.
也就是說,你必須先從跑HTTPS的 Server 匯出Key,然後再手動傳到你client所在的機器,步驟如下:

A. 在Server端匯出你的Certificate

On Windows:
%JAVA_HOME%\bin\keytool -export -alias tomcat -file file.cer

On Linux:
$JAVA_HOME/bin/keytool -export -alias tomcat -file file.cer

B. 匯入剛剛匯出的Certificate 到Client 端的 TrustStore:
 On Windows:
%JAVA_HOME%\bin\keytool -import -alias serverCert -file RootCert.crt -keystore %JAVA_HOME%\jre\lib\security\cacerts

On Linux:
$JAVA_HOME/bin/keytool -import -alias serverCert -file RootCert.crt -keystore $JAVA_HOME/jre/lib/security/cacerts

C. 匯入後 Client 端必須利用 JAVA_OPTS去指定 TrustStore:

On Windows:
JAVA_OPTS = -Djavax.net.ssl.trustStore="%JAVA_HOME%\jre\lib\security\cacerts" -Djavax.net.ssl.trustStorePassword="changeit"

On Linux:
JAVA_OPTS = -Djavax.net.ssl.trustStore="$JAVA_HOME/jre/lib/security/cacerts" -Djavax.net.ssl.trustStorePassword="changeit"

Ps.
1. 通常cacerts檔案是存在以下路徑: %JAVA_HOME%\jre\lib\security\cacerts
2. Windows 和 Linux trustStore password default 是changeit


但是如果這個Server 不是你管的該怎麼辦?所以我覺得這個方法也不好用太麻煩,目前看到最好的就是這篇"Resolve : SunCertPathBuilderException: unable to find valid certification path to requested target ",這篇的教學就是教你利用InstallCert.java這隻程式,去匯入Self-sign SSL Certificate。

也就是透過程式去連線HTTPS的網站,然後自動把它的certificate 下載下來,然後再另外儲存成java可以看的懂得cert檔,最後再匯入client 端的 keystore,所以整個步驟就會簡化成:

下載 InstallCert (Code by Andreas Sterbenz, now available on code.google.com)

java InstallCert [host]:[port]
keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert
keytool -importcert -keystore [DESTINATION_KEYSTORE] -file output.cert



延伸閱讀: X.509  certificate filename extensions
Common filename extensions for X.509 certificates are:
  • .pem – (Privacy Enhanced Mail) Base64 encoded DER certificate, enclosed between “—–BEGIN CERTIFICATE—–” and “—–END CERTIFICATE—–”
  • .cer, .crt, .der – usually in binary DER form, but Base64-encoded certificates are common too (see .pem above)
  • .p7b, .p7c – PKCS#7 SignedData structure without data, just certificate(s) or CRL(s)
  • .p12 – PKCS#12, may contain certificate(s) (public) and private keys (password protected)
  • .pfx – PFX, predecessor of PKCS#12 (usually contains data in PKCS#12 format, e.g, with PFX files generated in IIS)
  • PKCS#7 is a standard for signing or encrypting (officially called “enveloping”) data. Since the certificate is needed to verify signed data, it is possible to include them in the SignedData structure. A .P7C file is a degenerated SignedData structure, without any data to sign.
  • PKCS#12 evolved from the PFX (Personal inFormation eXchange) standard and is used to exchange public and private objects in a single file.

2012年12月8日 星期六

[筆記] 利用Google Analytic 追蹤內部連結點擊情況

圖片來源:masternewmedia

這一陣子因為都有努力逼自己在寫Blog,所以每天打開電腦一定都會先到blogger看一下昨天的訪客數和瀏覽量,然後再到Google Analytic 去看一下其他數據比如說不重複瀏覽量,訪客是從哪裡來的?使用哪種瀏覽器?對哪些題目的文章有興趣,以及用什麼關鍵字搜尋來的...等。

不過Google Analytic的功能真的太多了,雖然可以產生非常多的數據報表 (幾乎把各種類型網站會需要追蹤的功能都加進去),但是如果不懂那些數值的意義,縱使產生出許多漂亮的報表,似乎也沒有辦法對自己的網站和部落格進行優化動作。

所以看樣子應該要多了解一下每個數據的意義,以及有哪些功能可以使用,剛好最近我想要了解我blog文章和網站裡面的連結點擊狀況,但是怎麼樣找都玩不出這個功能,所以上網Google了一下發現了幾篇參考的文章:

[1] Event Tracking Tracks clicks on internal links and Submit Button
[2] How To Track Internal Links as Goals in Google Analytics

看完後也順便解決我另一個問題:就是Google Analytic 裡面的Event是怎麼產生的?用來作啥的? (因為平常看這個報表都是空的,也不知道該怎麼去產生Event)


原來我們可以在網站內,針對連結(不管是聯內或是聯外),或是Submit button,可以加入一段Javascript去triger Google analytic 的Event,這樣一來,就可以透過Google Analytic 的Event 報表觀察到點擊狀況 ,有以下兩種作法:

1. 在你的連結後面增加一段js


a href="http://www.example.com/" onclick="_gaq.push(['_trackEvent', 'Category', 'Action']);"

其中  Category 代表你要追蹤物件的群組,比如說內部網站連結,Action則是這個群組裡面的動作描述或名稱。


2. 在你的submit button 後面加東西

onSubmit="_gaq.push(['_trackEvent', 'Contact Form', 'Submit']);"

加完之後,大概24hr左右,就可以去觀察Event那個報表有沒有資料啦~:D

2012年12月4日 星期二

[筆記] 透過wsimport 去產生 web service client 的程式碼



最近因為業務需求,必須要碰好久沒有寫的 SOAP Web Service,不過感覺這已經是上個世代的產物了,現在幾乎所有的應用都是用Restful和Json的組合,應該很少人還在用龐大又笨重的SOAP了吧?不過因為要跟舊系統介接所以沒辦法...╮(╯▽╰)╭

說到SOAP我第一個想到的就是找Code Gen的tool,透過wsdl去產生client和server的code,在,然後我依稀記得我以前都是用Eclipse + ( Axis2 or CXF )去產生,不知道後來還有沒有更新的技術或是更方便的方法,比如說類似Gson這種玩意?

拜了一下Google大神,才發現居然現在JDK裡面就有附工具了!! 大概是因為jax-ws已經成為標準化套件了吧?所以現在我只需要打下面那行指令就好了。

wsimport -d ./target/classes -s ./main/src/java -p com.doxa.ws.client http://localhost:8080/WebServices/services/test?wsdl


使用方法如下  wsimport -d [classes path] -s [src path] -p [target package] [wsdl url]
參數說明:
-d:產生的 class 檔要放在哪裡(不含 package 路徑)
-s:產生的 java 檔要放在哪裡(不含 package 路徑)
-p:要產生到哪個 package

打好收工!!哪有那麼好的事....因為舊系統的wsdl網址是"https",而且還是用self-sign certificate的SSL憑證...所以如果直接打上面那行指令馬上就會出現以下錯誤:
parsing WSDL...
[ERROR] sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetFailed to read the WSDL document: http://localhost:8080/WebServices/services/test?wsdl, because 1) could not find the document; /2) the document could not be read; 3) the root element of the document is not .
[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s): At least one WSDL with at least one service definition needs to be provided. Failed to parse the WSDL. Result: 1


所以下一篇在來談要怎麼解決SSL連線的問題...