Hôm nay mất ngủ vào spiderum thấy có bạn không thấy mình post bài mới nên comment post cũ bảo mình drop nghề này rồi thì phải. Vậy để chứng minh mình vẫn còn try hard code thì mình xin tạm dừng series Javascript để bắt đầu series Mất ngủ với Elixir/Phoenix. :D
Trước khi bắt tay vào khởi tạo project với Phoenix. Có lẽ chúng ta cần giới thiệu qua cho những bạn chưa biết đến Phoenix hay Elixir.

Elixir

Elixir là một ngôn ngữ lập trình hướng function (FPL) được tạo bởi José Valim và nó được chạy trên máy ảo của Erlang (BEAM - Erlang VM). Điều đó có nghĩa Elixir được thừa kế sức mạnh tuyệt vời của BEAM. Ứng dụng Elixir có thể chạy hàng trăm nghìn process trên cùng 1 server và chúng là micro process chiếm cực ít tài nguyên (đừng nhầm lẫn khái niệm process của elixir với process của OS).

Phoenix

Phoenix là một backend framework của Elixir được phát triển lần đầu tiên bởi Chris McCord. Thừa hưởng những ưu điểm vượt trội của Elixir thì Phoenix có những ưu điểm gì?

Nhanh

Để thấy Phoenix nhanh cỡ nào, hãy so sánh hiệu năng của Phoenix với các backend framework khác. 

Bạn có thể thấy Phoenix có lẽ chỉ thua benchmark của Gin (Go framework)

Concurrent

Như đã nói với Elixir. Phoenix có thể handle hàng trăm nghìn process với chỉ 1 server. Nếu process không được dùng đến thì gần như không chiếm nguyên hay tốn cực ít tài nguyên (lightweight process), và thời gian để process sống lại thì rất nhanh. Bạn có thể khởi động và giám sát process, khi một process bị chết, Elixir có thể khởi động lại process đó gần sát với trạng thái cuối của process. Hơn nữa, bạn có thể thấy ví dụ như Nodejs chỉ có thể sử dụng 1 CPU nhưng Elixir có thể sử dụng đến tất cả các CPU core khả dụng .Vậy nên bạn có thể tin tưởng tốc độ và hiệu năng của Elixir/Phoenix.

Cú pháp đẹp, gọn gàng, hiện đại

Elixir được biết đến như 1 functional programming language đầu tiên hỗ trợ Lisp-style macros với cú pháp tự nhiên hơn
pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :protect_from_forgery
end
pipeline :api do
    plug :accepts, ["json"]
    plug MyApp.Plug.Auth
end
scope "/", MyApp do
    pipe_through :browser
    get "/index", PageController, :index
end
scope "/api", MyApp do
    pipe_through :api
end
Lúc đầu mình bắt đầu lập trình hàm với Elixir thì quả thực có chút bối rối. Nhưng khi đã quen với cú pháp của Elixir thì mọi thứ trở nên dễ dàng với những immutable, pattern matching, pipeline...
Bạn có thể tìm hiểu thêm về Elixir và Phoenix tại trang chủ của chúng:
First Init
Để bắt đầu khởi tạo project phoenix đầu tiên. Bạn cần cài đặt elixir > 1.5 và phoenix 1.3, node > 7.0, docker và docker-compose. Mình đang sử dụng macOs nên các lệnh và kết quả dựa trên hệ điều hành mình đang sử dụng.
Với phoenix 1.3 bạn có thể khởi tạo phoenix app với lệnh:
$> mix phx.new yourapp
Ở đây mình tạo app tên là teelog
$> mix phx.new teelog
Sau khi bạn nhấn `y` thì các dependencies sẽ được cài đặt và compile.

Dockerizing

Để cài đặt môi trường bớt phức tạp. Mình sẽ đóng gói app với docker cùng các images có sẵn. Nếu bạn chưa biết docker. Bạn cứ tưởng tượng là công việc này mình sẽ tạo một môi trường ảo có những thứ cần thiết để app của bạn có thể chạy mà không cần cài đặt thủ công môi trường cho nó.
Bắt đầu bằng việc thêm file docker-compose.ymlDockerfile vào root-directory
/docker-compose.yml

/Dockerfile

Ở đây bạn có thể thấy database sử dụng là postgresql. Cần config để phoenix app của chúng ta nhận môi trường được tạo. Mở file /config/dev.exs sửa thành:

Vậy cây thư mục của chúng ta sẽ như thế này:

Để khởi tạo và chạy các services trong background. bạn thực hiện:
$> docker-compose up -d
Để thao tác với bash shell của phoenix app qua môi trường docker. Bạn thực hiện: 
$> docker-compose run phoenix bash

Tạo database

Bước tiếp theo ta tạo database teelog_dev như đã khai báo trong config. Bạn vào bash shell ($> docker-compose run phoenix bash) rồi thực hiện:
[email protected]:/app# mix ecto.create
Kết quả nếu thành công :'The database for Teelog.Repo has been created'
Để thoát bash shell bạn dùng lệnh 'exit'

Khởi động server

Trong file docker-compose.yml mình đã expose các cổng của phoenix app ra ngoài là phoenix là 6600 và postgres là 5436. vậy khởi động server mình dùng lệnh sau:
$> docker rm -f teelog_app; docker-compose run --name teelog_app --rm -p 6600:4000 phoenix iex -S mix phx.server
Nếu thành công kết quả sẽ được như sau:

Để đơn giản khi chạy các lệnh khởi động ứng dụng. Mình viết 1 file script để đơn giản cho việc chạy các lệnh này:
/Makefile

Bằng Makefile bạn có thể khởi động app của mình một cách đơn giản hơn:
$> make app
Giờ bạn có thể mở browser và truy cập vào địa chỉ localhost:6600  để tận hưởng thành quả:

Có gì sai sót, mong nhận được sự phản hồi của các bạn. Mình dự định sẽ viết 1 series về Phoenix mỗi khi mất ngủ. Mục tiêu sẽ là 1 trang web đầy đủ các tính năng với Phoenix. Link github: 
Cám ơn các bạn đã đọc bài viết của mình.