12/08/2018, 14:10

Giới thiệu về Elixir on Phoenix

I. GIới thiệu Có thể các bạn đã biết đến ngôn ngữ Erlang. Nó được thiết kế để đáp ứng yêu cầu high availability của hệ thống telecom, một hệ thống lớn mà có thể dễ dàng scale, khả năng chịu lỗi cao, giảm thiểu downtime tới mức thấp nhất có thể. Và giải pháp để thực hiện việc đó trong ngôn ngữ ...

I. GIới thiệu

Có thể các bạn đã biết đến ngôn ngữ Erlang. Nó được thiết kế để đáp ứng yêu cầu high availability của hệ thống telecom, một hệ thống lớn mà có thể dễ dàng scale, khả năng chịu lỗi cao, giảm thiểu downtime tới mức thấp nhất có thể. Và giải pháp để thực hiện việc đó trong ngôn ngữ Erlang chính là bằng cách chạy song song để tận dụng tối đa các tài nguyên của phần cứng.

Hay nói một cách khác thì: "Erlang đơn giản chỉ là một ngôn ngữ lập trình như bao ngôn ngữ khác. Điểm khác biệt duy nhất là nó được thiết kế với mục tiêu chạy song song để giúp tận dụng tối đa ưu thế của phần cứng máy tính. Điều này có nghĩa rằng, nếu máy tính của bạn có càng nhiều nhân (core) thì đồng nghĩa với việc chương trình của bạn sẽ chạy càng nhanh." (1)

Lợi ích của ngôn ngữ Erlang là khá rõ ràng, nhưng mà cú pháp của nó lại khó viết và khó hiểu, nên José đã phát triển Elixir dựa trên nền tảng của Erlang và thay đổi cú pháp của nó để cho nó gần giống với ngôn ngữ tự nhiên hơn. Chính vì vậy mà Elixir có được những lợi ích của Erlang mà lại có cú pháp dễ đọc, dễ hiểu hơn rất nhiều.

II. Cài đặt

Các bạn có thể cài đặt theo link hướng dẫn tại đây Mình sử dụng ubuntu để hướng dẫn nên sẽ cài đặt với terminal như sau:

Thêm Erlang Solutions repo và update

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt-get update

Cài đặt Erlang/OTP platform và các ứng dụng

sudo apt-get install esl-erlang

Cài đặt Elixir:

sudo apt-get install elixir

Cài đặt Phoenix

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

Note: Nếu lệnh trên không cài đặt phoenix thì bạn có thể tải tại Phoenix archives, sau đó chạy mix archive.install /path/to/local/phoenix_new.ez

III. Cơ bản về elixir

Để chạy được các tương tác với Elixir trên shell ta có 2 cách để chạy.

  1. iex (Interactive Elixir)
  2. run script

III.1 iex

Các bạn mở terminal và gõ iex ở bất cứ đâu thì đều bật được giao diện thao tác với Elixir như dưới

itachi@itachi:~/git$ iex
Erlang/OTP 19 [erts-8.1] [source-4cc2ce3] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.3.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> "Le Van Ban" <> "- Hello Elixir"
"Le Van Ban- Hello Elixir"
iex(2)> 5 + 5 + 5
15
iex(3)>

III.2 Run script

Tạo một file có đuôi là .exs sau đó chạy elixir /path/to/file.exs

VD: Tạo 1 file là example.exs nội dung như bên dưới

IO.puts 5 + 5 + 5
IO.puts "Hello world"

Sau đo chạy elixir example.exs (ở terminarl chứ ko phải trong iex ta có kết quả:

itachi@itachi:~/git$ elixir example.exs
Le Van Ban- Hello Elixir
15

III.3 Các kiểu dữ liệu và phương thức cơ bản

Trong Elixir thì có các kiểu dữ liệu cơ bản sau:

iex> 2          # integer
iex> 2.5        # float
iex> true       # boolean
iex> :atom      # atom / symbol
iex> "elixir"   # string
iex> [1, 2, 3]  # list
iex> {1, 2, 3}  # tuple

Với integer thì Elixir có hỗ trợ convert từ hệ binary, octal and hexa sang hệ thập phân một cách nhanh chóng.

iex> 0b1111 # binary
15
iex> 0o111  # octal
73
iex> 0x111  # hexa
273

Với kiểu float thì Elixir hỗ trợ viết theo kiểu lũy thừa cơ số 10 với chữ e. Lưu ý: Kiểu viết này không hỗ trợ kiểu integer

iex> 2.0e2
200.0
iex> 2.0e-2
0.02
iex> 2e-2
** (SyntaxError) iex:31: syntax error before: e

Đối với các phép toán cơ bản thì Elixir nó khác với ruby ở chỗ là với 2 biến integer thực hiện phép chia thì sẽ trả ra kết quả là integer hoặc float tùy theo kết quả. Nhưng với ruby thì chỉ trả ra integer

Ruby 5 / 2 = 2

Elixir 5 / 2 = 2.5

Đối với các kiểu dữ liệu cơ bản này thì Elixir cung cấp các hàm để nhận biết xem dữ liệu đó có phải là kiểu mà mình muốn hay không:

iex(31)> is_integer 1
true
iex(32)> is_integer(1)
true
iex(33)> is_boolean(true)
true
iex(34)> is_atom(:atom)
true

Nhưng với kiểu String thì chỉ có thể check theo binary

iex(36)> is_binary("string")
true

Có rất nhiều các hàm cơ bản, các bạn có thể tham khảo thêm tại đây

IV. Tạo ứng dụng với Phoenix

Dưới đây là các bước lần lượt để tạo một project với Phoenix lần đầu tiên. Đối với phoenix thì khi tạo project thì sẽ khởi tạo mặc định luôn database. Và adapter default của phoneix chính là PostgreSQL.

mix phoenix.new /Users/me/work/elixir-stuff/hello_phoenix # chỉ rõ path
mix phoenix.new hello_phoenix                             # forder hiện tại

Hiện tại thì mình sử dụng MySQl nên mình chỉ rõ ra adapter cho database

mix phoenix.new hello_phoenix --database mysql

Đối với cả 2 adapter trên thì đều tạo ra file config/dev.exs để config database với môi trường development. Tương tự với file config/test.exs là môi trường test và config/prod.secret.exs là production.

...
# Configure your database
config :hello_phoenix, HelloPhoenix.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: "root",
  password: "",
  database: "hello_phoenix_dev",
  hostname: "localhost",
  pool_size: 10

Sau đó ta chạy lệnh

  1. mix do deps.get, compile #để lấy các dependency về và compile.
  2. mix ecto.create # Tạo database

Ngoài ra thì chúng ta cần cài node chạy brunch để build assets hoặc dùng yarm của face book. Hoặc cũng có thể bỏ qua bước đó thì khi nào project ta thêm các option như sau:

mix phoenix.new web --no-brunch --no-ecto

Tất cả đã xong giờ chỉ việc khởi động server và xem kết quả với lệnh sau:

mix phoenix.server

Screenshot from 2016-11-01 14:14:49.png

Source code: hello_phoenix

IV.

0