27 April 2012

The Help

คืนนี้เปลี่ยนบรรยากาศมาเขียนเรื่องที่ไม่เกี่ยวกับภาษา C บ้างดีกว่า ที่พยายามเขียนเรื่องภาษา C เยอะ ก็เพราะเห็นว่ามันน่าจะมีประโยชน์กับหลายๆ คน แต่ผมก็อยากเขียนด้วยแหละ ผมเป็นพวกเห็นแก่ตัว ถ้าไม่อยากก็ไม่ทำหรอก ถ้าอยาก แล้วสิ่งที่มันไปพ้องกับประโยชน์คนอื่น ก็ถือว่าโชคดี



วันนี้จะเล่าเรื่องหนังชื่อ The Help ที่ @cutiening แนะนำให้ดู แล้วก็ไปเดินหาซื้ออยู่หลายร้านกว่าจะซื้อ DVD มาได้ หนังเรื่องนี้เป็นหนังฟอร์มเล็กๆ ไม่ค่อยดังเท่าไหร่ เล่าเรื่องราวของสังคมอเมริกันในยุคที่กฎหมายแบ่งแยกสีผิวยังใช้บังคับอยู่ ทำให้คนผิวดำมีสิทธิไม่เท่ากับคนผิวขาวที่อยู่ร่วมในสังคมเดียวกัน

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

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

ดูหนังเรื่องนี้แล้ว รู้สึกว่าหนังสะท้อนอะไรหลายๆ อย่างให้เราเห็น ทำให้รู้สึกเปรียบเทียบกลับมาที่สังคมไทย ซึ่งเราไม่มีสีผิวให้เหยียด แต่ก็มีอะไรให้เหยียดมากมาย อีกอย่างหนึ่งที่ได้จากหนังเรื่องนี้ คือ หนังทำให้รู้ว่า สำเนียงอเมริกันทางใต้นี่คล้ายกับสำเนียงอังกฤษอยู่พอควรเลย

26 April 2012

[C] จัดการ Source code หลายไฟล์ ตอนที่ 3

วันนี้มาเล่าต่อว่า จะทำยังไง ถ้าต้องการแลกเปลี่ยนข้อมูลระหว่างโปรแกรมที่เขียนแยกไว้หลายๆ ไฟล์ หรือต้องการมีตัวแปรแบบ global ที่สามารถเรียกค่าของตัวแปรจากฟังก์ชันหลายๆ ฟังก์ชันที่อยู่คนละไฟล์

ภาษา C ยอมให้ประกาศตัวแปรแบบ global โดยใช้ keyword "extern" เพื่อระบุว่ามีตัวแปรนี้อยู่แล้ว เพียงแต่อ้างถึงตัวแปรตัวเดียวกันนี้ที่ถูกประกาศไว้ที่อื่น ลองดูตัวอย่างโปรแกรมข้างล่างนี้

/* foo.c */
#include<stdio.h>
void func();
int i = 10;
main() {
 printf("i = %d\n", i);
 func();
 return 0;
}

/* bar.c */
#include<stdio.h>

extern int i;

void func() {
 printf("i = %d\n", i);
}

เมื่อคอมไพล์โปรแกรมนี้ gcc foo.c bar.c จะได้ผลเป็น

i = 10
i = 10

เพราะตัวแปร i ที่อ้างถึงทั้งในฟังก์ชัน main และ func เป็นตัวแปรเดียวกัน จึงแสดงค่า เท่ากับ 10 เหมือนกันทั้งสองบรรทัด มีข้อกำหนดเกี่ยวกับตัวแปร extern อีกเล็กน้อย คือ ตัวแปรที่ประกาศเป็น extern จะไม่สามารถกำหนดค่าเริ่มต้นให้ได้ เนื่องจากตัวแปรนั้นไม่ใช่ตัวแปรจริง เป็นแค่การอ้างถึงตัวแปรที่ประกาศไว้ที่อื่น

นอกจากนี้ถ้าประกาศตัวแปรแบบ extern นี้ไว้คนละไฟล์ โดยระบุ type ไม่เหมือนกัน คอมไพเลอร์จะไม่สามารถตรวจสอบ type ของตัวแปรว่าตรงกันได้ อาจจะทำให้การทำงานเพี้ยนไปได้ ซึ่งเป็นสิ่งที่ต้องระวัง ทางที่ดีเราจึงควรจะกำหนดตัวแปรแบบ extern ไว้ใน header file แล้วใช้แบบเดียวกันไปทุกที่

25 April 2012

[C] จัดการ Source code หลายไฟล์ ตอนที่ 2

ต่อจากตอนที่แล้ว ต้นเหตุที่ทำให้ได้ผลไม่ถูก ก็คือการไม่กำหนด function prototype ถ้าคอมไพล์โปรแกรมนี้ใหม่ แต่ใช้คำสั่งเป็น

$ gcc -Wall -o prog2 main2.c func2.c

จะมี warning มาเตือนว่าไม่ได้มีการกำหนด function prototype ของฟังก์ชัน sum

main2.c:7:2: warning: implicit declaration of function ‘sum’ [-Wimplicit-function-declaration]

เมื่อไม่ประกาศ function prototype เอาไว้ คอมไพเลอร์ก็จะไม่ตรวจสอบ type ของ argument ที่ส่งไปที่ฟังก์ชัน และไม่มีการแปลง type ให้ตรงกับที่ฟังก์ชันต้องการ ดังนั้นเมื่อเรียกใช้งานฟังก์ชัน sum โดยกำหนดค่า 5.0 และ 10.0 ซึ่งมี type เป็น double ให้ ก็จะเอา binary representation ของ double ส่งไปให้ฟังก์ชัน แต่ฟังก์ชันบวกเลขแบบ int และส่งค่ากลับเป็น int ผลที่ได้ก็จะประหลาดๆ แบบนี้ที่เห็น

ถ้าต้องการให้ถูกต้อง เราก็จะต้องประกาศ function prototype ของฟังก์ชัน sum เอาไว้ใน main2.c เพื่อให้คอมไพเลอร์รู้ว่าฟังก์ชัน sum รับ argument 2 ตัวเป็น int ทั้งคู่ และจะส่งค่ากลับมาเป็น int คอมไพเลอร์ก็จะแปลงค่า 5.0 และ 10.0 ให้เป็น binary representation แบบ int ก่อนแล้วค่อยส่งไปยังฟังก์ชัน ทำให้ได้ผลลัพธ์ตามต้องการ (จริงๆ ต้องใช้ว่าใกล้เคียงกับที่ต้องการ เพราะการแปลงจาก double ไปเป็น int อาจจะทำให้ค่าของข้อมูลหายไปได้)

Function prototype นี้จะเขียนแยกต่างหาก เป็น header file (.h) ก็ได้ เพื่อความสะดวกในการนำ func2.c ไปใช้กับโปรแกรมอื่นๆ ได้อีก ไม่จำเป็นต้องยึดติดกับ main2.c เลยกลายเป็น 3 ไฟล์ใหม่นี้

/* main3.c */
#include<stdio.h>
#include"func3.h"
main() {
 int i;

 i = sum(5.0, 10.0); 
 printf("sum = %d\n", i);
}

/* func3.c */

int sum(int a, int b) {
 return a+b;
}

/* func3.h */
int sum(int, int);

เติมอีกหน่อยว่าตัวอย่างแรกในตอนที่แล้วทำงานได้ถูกต้อง เพราะไม่มีการส่ง argument ไป และค่าส่งกลับที่เป็น int นั้น เป็น type ปกติอยู่แล้ว

วันนี้เอาแค่นี้ก่อนละกัน พรุ่งนี้ค่อยมาต่อเรื่อง extern

23 April 2012

GVIM Warning

หลังจากเขียนบล็อคเมื่อกลางวันแล้ว ปัญหาก็ยังไม่หมด เวลาเรียก gvim มาใช้งาน อาจจะเจอ warning ประมาณนี้ได้

Unable to register window with path '/com/canonical/menu/xxxxxxx': Timeout was reached


คราวนี้ค้นดูแล้ว ดูเหมือนจะเป็นปัญหาของ Unity ที่ไม่สามารถดึงเมนูของ gvim มาใส่เป็น global menu ได้ เขาบอกว่าวิธีแก้คือให้เรียกใช้ด้วย gvim -f ก็เลยต้องไปแก้ .bashrc เติมอีกบรรทัดว่า

alias gvim="gvim -f"

เพื่อเรียก gvim เป็นแบบ foreground ตลอด หวังว่าจะไม่เจออะไรอีกแล้วนะ

อ้างอิง gvim occasionally shows error "Unable to register window with path... Timeout was reached"

กำจัด Gtk-WARNING ใน Ubuntu

ปกติผมชอบเรียกใช้โปรแกรมต่างๆ จาก command line ใน terminal เพราะว่าผู้ถนัดกับการใช้คีย์บอร์ดมากกว่าเลื่อนมือไปจับเมาส์ แต่เวลาเรียกใช้โปรแกรม Gtk ใน Ubuntu ผมมักจะเจอข้อความเตือนข้างล่างนี้ ซึ่งทำให้รำคาญ

Gtk-WARNING **: Unable to locate theme engine in module_path: "pixmap",

วันนี้เพิ่งเจอว่าเราสามารถแก้ได้ง่ายๆ ด้วยการลง package "gtk2-engines-pixbuf" ก็จะไม่เกิด warning อันนี้ เพราะมันจะหา engine เจอแล้ว

อ้างอิง: Gdk Gtk warnings and errors from the command line

21 April 2012

Ubuntu + XeTeX + THSarabunNew

เนื่องจากช่วงนี้จะต้องเตรียมเอกสารบางอย่างเป็นภาษาไทย และอยากใช้ LaTeX สำหรับทำเอกสาร ไม่อยากใช้โปรแกรม word processor ไม่ว่าตระกูลไหน รุ่นไหนก็ตาม วันนี้เลยลองใช้ XeTeX บน Ubuntu 11.10 เนื่องจาก XeTeX อนุญาตให้เราเอาฟอนท์ที่ติดตั้งไว้กับระบบปฏิบัติการมาใช้งานได้เลย ไม่จำเป็นต้องเตรียมอะไรให้ยุ่งยาก แถม XeTeX ยังเรียกใช้ ICU สำหรับตัดคำภาษาไทยให้อยู่แล้วด้วย

สิ่งที่ต้องเตรียม

  1. ฟอนต์สารบรรณ ดาวน์โหลดได้จาก http://www.f0nt.com/release/th-sarabun-new/ 
  2. Ubuntu ผมใช้รุ่น 11.10 อยู่ แต่อีกไม่กี่วันคงเปลี่ยนไปใช้ 12.04 ซึ่งก็คงใช้ได้เหมือนกัน
  3. TeXLive ที่มี XeTeX ผมติดตั้งด้วยคำสั่ง
    $ sudo apt-get install texlive-latex-recommended texlive-xetex


ขั้นตอน

  1. ติดตั้งฟอนต์สารบรรณ ให้ Ubuntu รู้จักก่อน โดย copy ไฟล์ ttf ที่ได้มา ไปไว้ที่ /usr/share/fonts/truetype จะสร้าง subfolder ในนั้นก็ได้ เสร็จแล้วก็สั่ง update ข้อมูลฟอนต์
    $ fc-cache -fv
  2. เตรียมไฟล์เอกสารตามตัวอย่าง
    \documentclass[12pt]{article}
    \usepackage{fontspec}
    \usepackage{xunicode}
    \usepackage{xltxtra}

    \XeTeXlinebreaklocale “th”
    \XeTeXlinebreakskip = 0pt plus 1pt
    \defaultfontfeatures{Scale=1.4}

    \setmainfont{TH Sarabun New}

    \begin{document}

    \section{ทดสอบหัวข้อ}
    ทดสอบภาษาไทยทดสอบภาษาไทยทดสอบภาษาไทย ทดสอบภาษาไทยทดสอบภาษาไทยทดสอบภาษาไทย ทดสอบภาษาไทยทดสอบภาษาไทยทดสอบภาษาไทย ทดสอบภาษาไทยทดสอบภาษาไทยทดสอบภาษาไทย ทดสอบภาษาไทยทดสอบภาษาไทยทดสอบภาษาไทย \textbf{ทดสอบภาษาไทย}ทดสอบภาษาไทย\textit{ทดสอบภาษาไทย} Test ฟุ้งฟุ้งฟุ้งฟุ้ง ฟุ้งฟุ้งฟุ้งฟุ้ง ฟุ้งฟุ้งฟุ้งฟุ้ง ฟุ้งฟุ้งฟุ้งฟุ้ง ฟุ้งฟุ้งฟุ้งฟุ้ง ฟุ้งฟุ้งฟุ้งฟุ้ง
    \end{document}
  3. สร้าง PDF จากไฟล์ LaTeX ที่เตรียม ก็จะได้ผลตามรูป


อ้างอิง

ทดสอบ MikTeX 2.9 + ฟอนต์ TH SarabunPSK

19 April 2012

Gnuplot and Lion

ผมมักจะใช้ Gnuplot สำหรับว่ากราฟผลการทดลองต่างๆ เวลาเขียนบทความวิจัย แต่ Gnuplot ก็เป็นไม้เบื่อไม้เมากับ Mac OS X มาตลอด ไม่ว่าจะใช้ Fink, MacPorts, หรือ Homebrew ก็ขึ้นอยู่กับ library มากมาย แถมบางทีก็เกิด error ระหว่างคอมไพล์ จุดนี้เป็นปัญหาหลักอย่างหนึ่งของผมที่ใช้ OS X ถ้าใช้ Ubuntu ปัญหาทุกอย่างจะคลี่คลาย เพราะติดตั้งได้สะดวกมาก แค่ apt-get install gnuplot ก็เรียบร้อยแล้ว

เมื่อวานผมเพิ่งค้นพบวิธีที่ง่ายที่สุดในการติดตั้ง Gnuplot บน Mac OS X คือ ไปเอา binary package มาจาก Octave-Forge เพราะ dmg ของ octave จะมี gnuplot มาด้วย แต่ถึงกระนั้นปัญหาก็ยังไม่จบ เพราะ Lion มีการปรับเปลี่ยน library อีก ต้องไปแก้ไฟล์ script สำหรับเรียก Gnuplot ซึ่งมีบอกไว้ละเอียดแล้ว แค่ทำตามทุกอย่างก็จบ

นิทานเรื่องนี้สอนให้รู้ว่า ถ้าจะทำงานกับ open source softwareใช้ Ubuntu ง่ายสุด