ในวันที่ 2 ของการเรียน Erlang ซึ่งเป็นวันสุดท้ายนั่นเอง
โดยหัวข้อที่เรียนประกอบไปด้วยเรื่อง
- การทำงานของ process
- การเชื่อมโยงหรือ process link
- การจัดการ process มีเกิดข้อผิดพลาดขึ้น เช่น
- ทุกๆ process ต้องตาย
- บาง process ตาย
- ทำการ restart process ขึ้นมาใหม่
- การสร้าง State machine ด้วย Erlang
- เรียนรู้การใช้งาน OTP ( Open Telecom Platform )
- แนะนำการใช้งาน Rebar สำหรับสร้าง Erlang Application structure
1. ในช่วงเช้าเริ่มเรียนรู้การทำงานของ process
ด้วยการสร้าง process มาจาก erlang shell
ด้วยคำสั่ง spawn( M, F A )
ทำการสร้าง 3 process และเชื่อนโยงกันดังรูป
เมื่อทำการทำลาย process หนึ่งแล้ว
จะทำให้ process อื่นๆ ที่เชื่อมโยงตายไปด้วย
แต่ถ้าไม่ต้องการให้ process อื่นๆ ตาย
แต่ต้องการจัดการ process สามารถใช้ trap_exit มาช่วย
ตัวอย่างเช่น
parent() -> <b>process_flag(trap_exit, true),</b> %Create process link => P1, P2, P3 P1 = spawn_link(?MODULE, child, [none]), P2 = spawn_link(?MODULE, child, [P1]), P3 = spawn_link(?MODULE, child, [P2]), receive {'EXIT', KILLID, _} -> io:format("~p~n", [KILLID]), parent() %start() end.
โดยตัวอย่างนี้เมื่อเราทำทำลาย process ใด process หนึ่งแล้ว
ระบบจะทำการสร้าง process ทั้ง 3 ขึ้นมาใหม่พร้อมกับเชื่อมโยงความสัมพันธ์ให้ด้วยดังรูป
2. ทำการสร้าง State machine อย่างง่าย
โดยตัวอย่างเป็นการเล่น Tennis
ซึ่งก่อนอื่นมาคุยกันเรื่อง State transition
ของการนับคะแนนของ tennis เป็นอย่างไร
ซึ่งได้ภาพดังรูป
ซึ่งสามารถเขียน State ต่างๆ เหล่านี้ด้วย Erlang ง่ายมาก
แถมสามารถใช้งานจริงๆ ได้อีกด้วย
ในส่วนนี้ทำให้เห็นความสามารถของ Erlang
และผมก็ชอบในความสามารถของภาษาอีกด้วย
ตัวอย่าง code
start_game() -> io:format("Love Love~n"), receive a_point -> score_15_0(); b_point -> score_0_15() end. score_15_0() -> io:format("Fifteen Love~n"), receive a_point -> a_win(); b_point -> score_15_15() end. score_0_15() -> io:format("Love Fifteen~n"), receive a_point -> score_15_15(); b_point -> b_win() end. score_15_15() -> io:format("Fifteen All~n"), receive a_point -> a_win(); b_point -> b_win() end. a_win() -> io:format("A win~n"). b_win() -> io:format("B win~n”).
3. ทำความรู้จักกับ OTP ( Open Telecom Platform )
http://www.erlang.org/doc/design_principles/des_princ.html
คือกลุ่มของแนวปฏิบัติสำหรับการจัดการโครงสร้าง
code ของ Erlang ในรูปแบบของ process, module และ Directory
แนวคิดพื้นฐานของ OTP ประกอบไปด้วย
Supervision tree
คือโครงสร้างแบบ tree สำหรับการจัดเรียง code ในรูปแบบ supervisor และ worker
ทำให้ง่ายต่อการออกแบบ และสร้างระบบทนต่อการทำงานที่ผิดพลาด fault-tolerant
โดยประกอบไปด้วย 2 ส่วนคือ
Worker คือ process ที่ประมวลผลหรือทำงานจริง
Supervisor process ที่คอยดูการทำงานของ Worker โดยสามารถสั่งให้ Worker ทำการ restart เมื่อเกิดข้อผิดพลาดได้
Behaviour
ใน Supervision tree นั้น มี process ที่มีโครงสร้างการทำงานเหมือนกันจำนวนมากมาย
นั่นหมายถึงมีรูปแบบการทำงานที่เหมือนกัน
ดังนั้น OTP จึงทำการสร้างรูปแบบมาตรฐานการทำงานขึ้นมา
โดยแบ่งออกเป็น 2 ส่วนคือ
Generic part คือส่วนการทำงานพื้นฐานทั่วไป มักจะทำงานเหมือนๆ กัน ซึ่งอยู่ในรูปแบบของ abstraction และ interface
โดยต้องทำการ implement พวก function ต่างๆ ตามที่กำหนด
Specific part คือส่วนการทำงานเฉพาะของแต่ละส่วนการทำงาน ผ่าน callback module/function
พื้นฐานของ behaviour ที่กำหนดมาให้ประกอบไปด้วย
- gen_server คือรูปแบบของ Client-server
- gen_fsm คือรูปแบบของ Finite State Machine
- gen_event คือรูปแบบ Event handling
- supervisor คือรูปแบบของ supervisor ใน Supervision tree
4. การใช้งาน Rebar
คือ build tool สำหรับ Erlang
ซึ่งทำให้ง่ายต่อการ compile และ ทดสอบ
รวมไปถึงการการติดตั้งอีกด้วย
5. แนะนำ Web Framework ต่างๆ สำหรับพัฒนาระบบ
เช่น
Cowboy
Chicago boss
Nitrogen project
สรุป
การเรียน Erlang ในครั้งนี้ถือว่า
ได้รับการเปิดกระโหลก ให้ออกจากกะลา
เพื่อให้เห็นว่าภาษาอื่นๆ ที่สร้างมานั้นมันคืออะไร
สร้างมาเพื่องานอะไร
และมันทำงานและเริ่มใช้งานอย่างไร
และยิ่งได้เรียนจากคนที่ทำมาจริง เจ็บมาจริงแล้ว
ทำให้ได้ความรู้มากจริงๆ
ขอขอบคุณมากครับ …
ตัวอย่าง code ของการเรียนอยู่ที่นี่ Up1 :: Learn Erlang
https://github.com/up1/learn-erlang
และตัวอย่างจากผู้สอน
https://github.com/iporsut/Erlang-List-App-Server
https://github.com/iporsut/ErlangCourse
https://github.com/iporsut/The-Tennis-Game-Server
Reference Website
http://learnyousomeerlang.com/what-is-otp
http://www.erlang.org/doc/design_principles/des_princ.html