2014/09/29

Scala vs Groovy

當全世界都在走向 functional programming 的時候,身為一個傳統的 OOP Java Programmer 也必須要面對現實,不僅僅是 JDK 本身,慢慢地加入了 FP 的元素,還有其他跟 Java 相容的新語言,可以讓我們選擇如何踏入 FP 的世界。

Java 的優勢,是將近二十年來累積而成的龐大函式庫,如果說要以跟 Java 相容為前題,跨足進入 FP 的世界,我們可以選擇的是 GroovyScala,至於 Jython 或是 JRuby,都只能算是另一個語言的 Porting,就不需要去考慮使用他們。

在面對技術趨勢的選擇時,我們可以使用 Google Trend: Groovy vs Scala 觀察搜尋的趨勢,Groovy 跟 Scala 比較起來,還是 Scala 比較吸睛,重點還是在 Scala 天生支援的 Actor 功能。

以往 Java 一直都是在 Server Side 佔據著重要的地位,當我們撰寫 Server 程式時,最重要的就是要解決多人共用的運算環境,這是 Scala 從 erlang 借來的 concurrent 運算的 Actor 所要作的事情,由於 mailbox 並行運算在 erlang 已經被驗證過是個絕佳的實做方式,我們也更容易接受,選擇 Scala 作為 Java 的下一步,會是比較好的決定。

在 google 搜尋 groovy vs scala的時候,可以看到很多人的爭執。

  1. Scala? Groovy? Why Java is the right programming language for 2014 and beyond
  2. What are the key differences between Scala and Groovy?
  3. To Scala or Groovy? Which is better for a 'mathematical' approach?
  4. Java.next(): Groovy vs. Scala

在討論時,首先被提出來的就是 static type/dynamic type 的差異,再來是談到 learning curve 的差別,通常認為學習 scala 需要花多一些時間。

如果不深入談技術本質上的差異,我們再來看看 Java 爸爸 James Gosling 的代言

During a meeting in the Community Corner (java.net booth) with James Gosling, a participant asked an interesting question:

"Which Programming Language would you use now on top of JVM, except Java?".

The answer was surprisingly fast and very clear: - Scala.

再來看看 Groovy 的爸爸 James Strachan,在 blog 文章 Scala as the long term replacement for java/javac? 所說的話:

I can honestly say if someone had shown me the Programming in Scala book by by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I'd probably have never created Groovy.

聽爸爸的話準沒錯!

2014/09/26

Bash Shell 漏洞 Shell Shock

繼上次 OpenSSL Heartbleed 漏洞之後,Bash Shell 又中獎,出現 Shell Shock 漏洞。

我們習慣使用的 CentOS 已經提供了 bash patch,直接再安裝一次 bash,就會自動更新 bash 套件。

yum -y install bash

Shell Shock 要用以下的指令檢測

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

我們實際在更新與未更新的機器上測試。
沒有更新 bash 的機器結果如下

# env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test

如果已經更新了 bash,結果如下

# env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: 錯誤,輸入的函數定義為 `x'
this is a test

Bash Shell 漏洞威脅不小於 Heartbleed!Unix-Like 作業系統請儘速更新

2014/09/24

Docker 簡介

緣由

最近在看InfoQ的新聞時,常常看到一個詞不斷出現,由於出現的頻率實在是太高了,讓我對它產生好奇心,到底是在做什麼的?怎麼會如此火熱?花了點時間去找尋相關資料,並試了一下其功能,真是特別的東西!

那個詞也就是本篇要說的主題,Docker

Docker簡介

Docker其實就是新一代的VM,只是他更加簡潔,並且更加方便。之前在使用的VM,比如說很常用VMWare,要使用VMWare來執行一個Linux作業系統,比如說要執行CentOS好了,首先必須準備一個ios檔或是安裝光碟,之後掛載它,執行完整的作業系統安裝流程,安裝結束之後才能開始執行,整個過程可能需要幾十分至幾小時之久。

而Docker就不一樣了,Docker要執行一個CentOS的作業系統,要做的步驟只有幾項,首先先下載CentOS的Image檔(CentOS官方有釋出),接著使用Docker Container執行它,就可以執行CentOS了,整個過程可能不到10分鐘吧,其中大半的時間還是花在下載Image檔上面(大約200MB),非常的神奇。

Image與Container

在開始使用之前,要先介紹兩個Docker常看到的名詞,Image和Container,這邊不討論他的實作原理與技術,而是要說明他們之間的相對關係。

Image為初始環境,而Container為執行Image時的實例。比如說今天想透過Docker用CentOS執行J2EE的服務,則先下載CentOS官方釋出的CentOS Image,下載完後要執行時,Docker會用一個Container來執行此CentOS image。你可以在Container內做任何事情,比如說安裝Tomcat、JDK、Web Application等等之類的,但是一切的行為,都只會在這個Container內,它不會影響到原本的Image。

接著你需要一個單獨安裝MySQL的CentOS服務器,則你可以在將Image透過另一個Container執行,接著在上面安裝MySQL,就完成了一個CentOS上的MySQL服務。這樣一來你就會擁有兩個Container,其中一個為J2EE的伺服器,建立在CentOS上,另一個為MySQL的伺服器,也建立在CentOS上。

下圖出自於官方對Image說明時所用到的圖片,其中可以看到Debian為Image,而Container在其上方,為執行image時的實例,由此圖可以了解他們倆之間的關係。

安裝Docker

由於本人是使用MacBook Air,因此只試了在Mac上安裝的流程。在Mac上安裝Docker非常的簡單,只要安裝Boot2Docker - OS X Installer即可。安裝完在應用程式內點開它,就會看到它開啓command line,這時他會先啟動docker deamon,我們只要等他跑完,即可在本機上使用docker了。

可以參考官方文件Installing Docker on Mac OS X來安裝,基本上就是下一步下一步一直執行即可安裝完成。其他作業系統的使用者可以參考Docker Installation選擇自己所使用的作業系統,來參考如何安裝。

開始玩Docker

在Mac的應用程式裡,點開boot2docker後,它會自己去啟動Docker deamon,等它跑完之後,就可以開始下指令與docker互動。

抓取CentOS image

Docker官方有提供一個Docker Hub網站,該網站上面存放著各種不同的開發人員與公司所提供的image檔,而我們可以透過指令,很輕鬆的從Docker Hub上抓取你想要的Image檔,在這邊要執行的是抓取CentOS官方提供的Image檔。

指令輸入:
    bash-3.2$ docker pull centos

會抓取:
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    centos              centos5             5a1ebaa356ff        9 days ago          484 MB
    centos              centos7             70214e5d0a90        13 days ago         224 MB
    centos              latest              70214e5d0a90        13 days ago         224 MB
    centos              centos6             68eb857ffb51        13 days ago         212.7 MB    

也可以只抓某個TAG,例如我只想抓取CentOS 6,則我可以下此指令:
    docker pull centos:centos6

使用Container執行CentOS Image

抓取完畢之後,接著就是用Container執行image,只要透過run的指令,即可執行。

指令輸入:
    bash-3.2$ docker run -t -i centos:centos6 /bin/bash

則畫面會變成:
    bash-4.1#

就這樣,此時你已經成功開啟了一個CentOS 6的VM,並開啟bash了。 可以透過以下指令來驗證:

指令輸入:
    bash-4.1# cat /etc/issue
印出:
    Linux version 3.16.1-tinycore64 (root@5d533df6cbc4) (gcc version 4.7.2(Debian 4.7.2-5) ) #1 SMP Fri Aug 22 06:40:10 UTC 2014
    bash-4.1# cat /etc/issue
    CentOS release 6.5 (Final)
    Kernel \r on an \m

Docker官方線上教學網站

如果你還在觀望Docker,對它有點興趣但又不想安裝到自己的電腦上的話,你可以先透過Docker Online Tutorial - Try It!這個官方提供的線上教學網站,實際操作Docker一遍,裡面會教學一些基本的操作,如搜尋Docker Hub上面的Image,用Container執行Image,還有本篇沒提到的Commit與Push指令,花些玩過一遍就會對Docker有些基本的了解。