Powered by Drupal, an open source content management system

โฆษณาโดย Google

เรียกใช้งาน gen_server ที่อยู่กันคนละ node

ปกติแล้วเวลาเราจะเรียกใช้ handle_call กับ handle_cast ของ gen_server เราจะเรียกใช้โดย gen_server:call สำหรับ synchronous call และเรียกใช้ gen_server:cast สำหรับ asynchronous call ตัวอย่างเช่น

Response = gen_server:call(?SERVER,{request}).

gen_server:cast(?SERVER,{request}).

แต่ทั้งสองฟังก์ชันนี้จะเรียกได้เฉพาะ gen_server ที่รันอยู่บนเออแลงโนดเดียวกันเท่านั้น ถ้าเราต้องการให้เรียกใช้งาน gen_server ที่รันอยู่โนดอื่นๆสามารถใช้ได้โดยเรียก gen_server:multi_call กับ gen_server:abcast โดยค่าแรกที่ส่งให้ฟังก์ชันเป็นลิสต์ของโนดที่ตัว gen_server เปิดใช้งานอยู่

{ResponseList,_} = gen_server:multi_call(['pgsql_node@192.168.1.123'],?SERVER,{request}).

gen_server:abcast(['pgsql_node@192.168.1.123'],?SERVER,{request}).

แก้ปัญหาโปรเซสของ comet ใน nitrogen ไม่ตาย

เจอบั๊กในงานที่ทำอยู่ตอนนี้ ที่ใช้ Nitrogen Web framework for Erlang เป็น framework สำหรับทำเว็บ ซึ่งตัวนี้มันทำ comet ได้ ปัญหาคร่าวๆคือเมื่อเราสร้าง comet เราต้องกำหนดฟังก์ชันให้กับมันเมื่อเราเข้าใช้งานหน้าเว็บหน้านั้น ตัว nitrogen จะทำการแบ่งโปรเซสออกไปสำหรับฟังก์ชันนั้นเพื่อให้เป็นตัวรับ message ระหว่างหน้าเพจกับตัว nitrogen ทีนี้ตัว nitrogen มันดันสร้าง process ใหม่สำหรับ comet ตลอดเมื่อมีการ refresh หรือ หรือเข้าหน้านั้นอีก tab หนึ่ง เมื่อเราปิดหน้านั้นหรือปิดเว็บบราวเซอร์ไปเลย ตัวโปรเซสนี้มันดันไม่ยอมตาย พอมีการส่งข้อความหา comet ชื่อที่กำหนดไว้ตอนแรก มันก็จะส่งข้อความหาทุกๆโปรเซสที่เคยสร้างไว้ แล้วโค้ดใน ฟังก์ชันของ comet ที่ทำเอาไว้คือต้องการให้มัน query ข้อมูลจาก database ผลก็คือยิ่งใช้งานไปเรื่อยๆโปรเซสก็เพิ่มขึ้นไม่หยุด การ query ก็เยอะขึ้นๆทำให้ตัว nitrogen เองเดี้ยงไปเลย

วิธีแก้ที่หาได้ก็คือ ตอนสร้าง comet มันจะรีเทิร์นค่า PID ของ process ออกมาให้เราใช้ฟังก์ชัน timer:kill_after(Time, PID) ช่วยกำหนดเวลาว่าจะ kill process นี้หลังจากผ่านเวลาไปแล้วเท่าไหร่

ตัวอย่างโค้ดที่ใช้งาน

{ok, PID } = wf:comet_global(
    fun() ->
        alarm_loop(wf:q("id"))
    end,
    device_status),

timer:kill_after(330000, PID),

เปิดโปรแกรมแบบ gui ผ่าน ssh

ปกติเวลาเราใช้ ssh เราจะรีโมทเข้าไปใน terminal ของอีกเครื่องซึ่งเราไม่สามารถเรียกโปรแกรมพวกที่ใช้ gui (X windows) ใช้งานได้ แต่จริงๆแล้วเราสามารถสั่งให้ ssh ทำการ forward พวกที่ใช้ X windows ให้ทำงานบนเครื่อง client ได้โดยใส่อ็อปชั่น -X ให้กับคำสั่ง ssh เช่น

ssh -X abc@abchost.com

เมื่อ login เข้าไปแล้ว ถ้าเป็น ubuntu ก็ลองสั่ง gedit ดูจะได้ตามนี้ (อันนี้ผมลอง remote จาก OS X ไปที่ Ubuntu)

จาก blog_iporsut

ตั้งค่า dns ผ่าน terminal

วิธีเพิ่ม ip ของ dns คือให้เข้าไปเพิ่มที่ไฟล์ /etc/resolv.conf แต่ละบรรทัดเราเพิ่ม dns ได้แบบนี้

nameserver 127.0.0.1
nameserver 192.168.1.1
nameserver 8.8.8.8
nameserver 8.8.4.4

แปลงโค้ด erlang ใน string ให้เป็นตัวข้อมูลใน erlang

ถ้าเราต้องการแปลง string ที่อยู่ในรูปโค้ดของ erlang ให้กลับมาเป็นตัวข้อมูลของ erlang เอง เช่น

มี "[1,2,3,4,5]." ต้องการแปลงกลับมาให้เป็นข้อมูลลิสต์ [1,2,3,4,5]

สามารถทำได้ด้วยวิธีการนี้

  {ok, Toks, _Line} = erl_scan:string("[1,2,3,4,5].",1).
  {ok,List} = erl_parse:parse_term(Toks).

คือให้ใช้ erl_scan:string โดยส่งค่าที่จะแปลงใน argument แรก และให้ใส่ 1 ที่ argument ที่ 2 เสร็จแล้วรับค่า Toks ซึ่งจะเป็นค่าที่ 2 ใน tuple ของข้อมูลที่ส่งกลับมาจากฟังก์ชัน erl_scan:string แล้วไปเรียกอีกฟังก์ชันคือ erl_parse:parse_term(Toks). โดยส่งค่า Toks ไป เมื่อทำงานเสร็จจะได้ tuple กลับออกมาโดยที่ค่าแรกเป็น ok เมื่อทำงานสำเร็จและค่าที่สอง เป็นผลลัพธ์ที่ได้

ใช้งาน MongoDB ผ่าน Erlang โดยใช้ emongo driver

MongoDB เป็นฐานข้อมูลในแบบที่สมัยนี้เขาเรียกกันว่า NoSQL อยากรู้ละเอียดๆเพิ่มเติมลองเข้าไปอ่านได้ที่เว็บ กลุ่มผู้ใช้ MongoDB แห่งสยามประเทศ :) ที่นี้การเอาตัว MongoDB ไปใช้งานร่วมกับการเขียนโปรแกรมภาษาใดๆนั้น ต้องมีตัว driver เป็น API ช่วยในการติดต่อกับตัว service ของ MongoDB ในที่ผมจะเขียน blog ไว้นี้ผมใช้ตัว emongo

Slot Machine - CELL


CELL อัลบั้มใหม่ล่าสุดของวง Slot Machine วงดนตรีที่นักร้องน้ำเสียงสูงๆ แต่ที่เราจำได้มักจะจำได้เพราะว่าหน้าตาดันไปคล้ายกับ เฮียหมู จาก บางรักซอยเก้า มาในอัลบั้มนี้มีทั้งหมด 11 แทรค เป็นเพลงพร้อมเนื้อร้อง 9 กับ 2 ดนตรีบรรเลง เรียงตามลำดับที่เล่นในอัลบั้มได้แก่

1. CELL
2. สวนดอกไม้ (Sound of Silence)
3. เวทนา (Automatic Lonely)
4. พระอาทิตย์ทรงกลด (Golden Age)
5. XY
6. พลูโตที่รัก (The Plutonian)
7. จันทร์เจ้า (Goodbye)
8. Vaccine
9. นิรันดร์ (Always)
10. ฝันกลางวัน (Temple Party)

ผมชอบการตั้งชื่อเพลงในอัลบั้มนี้มากเลย มีทั้ง พระอาทิตย์ พระจันทร์ ดาวพลูโต ก็ยังมี ฮาๆ ตอนนี้เพลงที่ปล่อยออกมาเป็น single ตามสื่อต่างๆก็มี จันทร์เจ้า ตัวนี้ออกมาตั้งแต่ยังทำอัลบั้มใหม่เสร็จ ตัว MV เองก็ออกมาแนวๆนิยายวิทยาศาสตร์ แล้วก็มีท่าที่แต่ละคนในวงมาล้อมวงเหมือนทำพิธีกรรมอะไรสักอย่างอยู่ ผมว่าผมดูแล้วมันตลกๆดี

เพลงตัวต่อมาที่ปล่อยออกมาก็คือ สวนดอกไม้ เพลงนี้ดนตรีดีนะ มีท่อน เฮ้ ฮ้า ไว้ให้ร้องร่วมตอนเล่นคอนเสิร์ตด้วย ถ้าฟังจากอัลบั้มจะเห็นว่ามีท่อนโซโล่ เสียงออกลำโพงซ้าย ขวา สลับกันติดหูมากๆ

และอีกเพลงที่ปล่อยออกมาตอนนี้ก็คือ Vaccine เนื้อเพลงนี้เพราะมากอ่ะ ความหมายดี ให้กำลังใจ เหมือนจะสื่อว่า เพลงนี้ มันคือ วัคซีน ป้องกันความเหงา ละมั้งนะ

แต่เพลงที่ชอบจริงๆในอัลบั้มนี้ยังไม่มีปล่อยซิงเกิ้ลมา คือเพลง พลูโตที่รัก กับ พระอาทิตย์ทรงกลด พลูโตที่รัก แค่ชื่อก็เจ๋งแล้ว ใครที่ได้ตามข่าวดาราศาสตร์บ้างจะเข้าใจว่า พลูโตที่เคยเป็นดาวเคราะห์ในระบบสุริยะจักรวาล โดนเนรเทศ ให้ออกจากกลุ่ม กลายเป็นดาวนอกระบบไป เนื้อเพลงก็ประมาณนี้ อยู่อย่างเหงาๆ ที่ขอบระบบสุริยะจักรวาล ฮาๆ ดนตรีก็เพราะเคลิ้มๆหลุดจักรวาลดี

ส่วน พระอาทิตย์ทรงกลด เนื้อเพลงสวย ดนตรีสวย และ แน่นมากกกก

เพลงที่เหลืออื่นๆก็เพราะครับ ของหาฟังกันดูเองนะครับที่เหลือ :)

ยานพาหนะ

มีจักรยานเป็นยานพาหนะมาได้เกือบจะ 2 เดือนแล้ว บางจังหวะก็ใช้ขาตัวเองเนี่ยแหละเดินไปไหนมาไหน มันก็ทำให้ถึงที่หมายได้เหมือนกันนะ

"ยานพาหนะ มันทำให้เราไปยังจุดหมายปลายทาง
แต่การได้เดิน หรือ ปั่นจักรยาน ก็ทำให้รู้ว่าเรายังมีกำลัง
ที่จะพาตัวเองก้าวไปข้างหน้า เพื่อให้ถึงจุดหมายได้เช่นกัน"

เปลี่ยนไปใช้ OpenJDK 6 บน Ubuntu

หลังจากโค้ด java opensource แล้วก็มี OpenJDK เกิดขึ้นมาก็ยังไม่ได้ลองใช้จริงๆจังๆสักทีก็เลยลองสักหน่อย
ติดตั้ง packages ที่จำเป็นตามนี้

sudo apt-get install openjdk-6-jdk openjdk-6-jre* openjdk-6-demo openjdk-6-doc icedtea6-plugin

หลังจากนั้นให้เปลี่ยน default ของ ubuntu ให้เป็น openjdk

sudo update-java-alternatives -s java-6-openjdk

ก็จะได้ openjdk ใช้แล้วลองรันโปรแกรม java หลายๆตัวรู้สึกว่าเร็วขึ้นแฮะ(อาจจะคิดไปเอง) รวมทั้งรัน applet ก็ไม่ทำให้ firefox ตายแบบที่เคยเจอกับ sun-jdk