2016年3月23日 星期三

[Elixir] 安裝 erlang + elixir + phoenix framework

elixir 是架構在 erlang vm 上的語言,所以在開發程式之前,第一件事就是把 erlang 裝起。



  • Linux
    • 由於個人使用習慣,平常我個人都用 FreeBSD,linux 我大概只用 rhel/centos。
    • rpm 可以在 Erlang Solutions 下載,不過這個版本會順便將 wxGtk 也裝起來,個人並不喜歡。
    • 可以使用 rabbitmq 做好的 zero dependencies rpm
  • FreeBSD
    • 透過 ports,直接到 lang/erlang 下面 make install 就好了。
裝好了 erlang,下一步就是把 elixir 也裝好。
  • Linux
    • 我不確定有哪一個 distribution已經內建 elixir,但是同樣的  Erlang Solutions 有 package,但是只有給 debian/ubuntu 的而已。
    • 所以直接到 elixir 的 github 下載,解開之後打個 make install 就裝好了。
  • FreeBSD
    • 一樣很簡單,到 lang/elixir 下面 make install 就裝好了。
裝好 elixir 之後,基本上會有兩個東西會不停地在開發過程被用到:
  • mix - project management tool,任何你在開發過程會用到的工具或者流程,都會透過 mix 這一個 command 來執行,另外也可以自行編寫 mix task 擴充功能。
  • iex - interactive elixir shell,就是一個 elixir shell,一些簡單的想法可以直接在 iex 裡面實現及驗證。
再來就是安裝 phoenix framework,這東西有點像是蛋跟雞一樣,你要有 phoenix 的 mix task,才能夠建立一個 phoenix project,但是你也要先有相關的 package 安裝好了,才能有 phoenix mix task 能夠被使用。不過沒問題,elixir & phoenix team 都幫你想好了,透過 mix archive.install 就可以把 phoenix 裝好。

 mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez  

裝好 phoenix 之後,打 mix -h 就可以發現多了一個 mix phoenix.new 的 task 可以用。
也可以打一下 'mix phoenix.new -h' 來看看相關參數。

2016年3月10日 星期四

[Elxir] 為什麼要用 elixir 呢?

開始的開始,其實我是先知道 erlang 這個語言的。

大約在 2007/2008 左右,那時候應該還是在 erlang 13.x 的版本,我忘記我從哪邊知道這個語言,一直想好好學好它,也買了書來看。

但是大概是 perl/php 這類語言的餘毒,讓我在學習 functional language 的路上沒能好好走完。
雖然一直都沒學好,不過我都還是持續在關心著 erlang,尤其這中間很多公司,都用了 erlang 做一堆神經病等級的產品,例如 whatsapp,例如 cowboy 等等。

而 elixir 這個架構在 erlang vm 上的語言,我大概是兩三年前在 erlang 的社群略有耳聞,但是由於之前對於 erlang 一直學不好的心理因素,就一直忽視他。

那到底是什麼樣的機緣,又讓我再度擁抱 erlang 甚至開始學習 elixir 呢?應該是因為工作需要吧!因為一些先天上的限制,軟體的 dependencies 其實是困擾的所有的開發人員,尤其是開發電信機房裡面的服務。

一開始我們選擇的 golang,寫起來簡單,相關的 unit test 都具備了,但是又似乎少了點什麼,如果程式因為任意原因死掉了,你必須自己監控,必須自己想辦法。即使 golang 有了 static link 這個降低 dependencies 的好處,但那還是不夠呀。

所以大約在去年七月,經過一些評估之後,我重回了 erlang/elixir 的懷抱:

  • ecosystem 完善
    • 有 hex.pm 這一個 package management site,任何人寫的東西都可經由這個網站發布,也可以輕易的跟 project 結合。
    • elixir 內建了 mix 這一個 project management tool,任何開發期需要的東西,都可以透過這個工具去呼叫,也可以自己寫 mix task 來把複雜的事情變簡單。
  • otp
    • Open Telecomm Platform
    • erlang 內建 otp,因為 erlang 就是為了交換機而被發明的語言,所以他很多特性,都是為了電信業而產生。
    • 而 otp 本身就有很多先進的設計,就是為了確保服務儘可能地沒有 downtime,例如 supervisor 可以檢控 process,當他掛掉會自動重新叫起來。例如 code hot swap 可以讓 daemon 持續服務,但是瞬間將版本升級。
  • async
    • 在 erlang 裡面,每一個 app 都是獨立的一個 erlang process,彼此用 message passing 溝通,所以要寄信,直接將相關資料扔給寄信的 process 即可,前端的 web 可以繼續服務。
  • no side effect
    • 也由於資料並沒有 lock 這類的問題,所以儘可能地降低 side effect。
  • 接近人類思考模式
    • erlang 說真的我還是沒認真寫過,但是 elixir 幾乎已經接近人類思考模式了,人並不會做一件事情,只有一個 function 然後裡面一堆 if/else,而是在最開始,就已經把很多事情直接分開。這樣的好處是,每個 function 就只做自己的事情。
  • phoenix framework
    • 如果只有 elixir + mix 這樣的工具,其實還沒辦法好好做事,畢竟什麼東西都還是要有個漂亮的介面。
    • phoenix framework 是用 elixir 寫的 web framework,再加上 ecto 之後,資料庫什麼鬼的都抽象化了。
    • 簡單的說,elixir 就像是 ruby,phoenix 就像是 ror,而依賴著 erlang 天生的高效能,可以快速地生出很棒的服務出來。
  • exrm + rpm
    • exrm 是一個 release tool,經過 exrm 的 task 處理過後,可以生出一個 .tar.gz 檔。
    • 將這個檔案直接 copy 到機器上,解開就可以直接跑起服務。
    • 像是 erlang vm 什麼的,都會在這個 .tar.gz 裡面。根本不需要預先安裝甚麼軟體。
    • 但是只有 exrm 對很多人來說可能還是不夠,所以有人又替 exrm 衍生出 exrm_rpm。
    • exrm_rpm 在 exrm 的基礎上,可以在 task 的最後,把 .tar.gz 轉成一個 .rpm。
    • 這個 rpm 裡面連 init.d 的 script 都有了,直接 yum install xxx.rpm,重新開機就所有服務一次到位。
評估完,就開始將原本用 php 寫的 web tool 改用 elixir 寫,整個工作從去年八月開始,中間加入了一些 linter,code analyst tools,並在今年二月左右,將整個 unit test/integration test 都做完,最後的 code coverage 約 85%。

本篇為起手式,之後會開始從怎樣弄一個 elixir project 講起,到我中間有用過的工具,然後最後以包出一個 rpm 為結束。

(不保證什麼時候會做好。)