Programming

อัดรูปดิจิตอล ทำสมุดภาพของคุณเอง
รอรับได้. ท่องเที่ยว แต่งงาน ฯลฯ

www.tanabutr.co.th/photobook


Qt way - 3 นาทีกับการเขียนโปรแกรม GUI ง่ายๆบนลินุกซ์

ว่าจะไม่เขียน Blog ต่อแล้วแต่อดไม่ได้. เขียนหน่อยแล้วกัน, เป็นการแบ่งความรู้สำหรับคนที่ต้องการเริ่มเขียนโปรแกรมด้วย Qt. อันนี้พอจะเป็นจุดเริ่มต้น (きっかけ) ได้ครับ.

ตัวอย่างต่อไปนี้เป็นการเขียนโปรแกรมด้วยภาษา C++ โดยใช้ Qt library. ในระบบที่ต้องการลองต้องมี Qt library 3.x อยู่. ถ้าเป็น Gentoo ก็ติดตั้ง Qt ได้ด้วยคำสั่ง emerge.

Code less. Create more. - Qt

ช่วงนี้อ่านหนังสือ C++ GUI Programming with Qt 3 อยู่เพราะมีเหตุต้องเขียนโปรแกรม C++ แบบ GUI บนลินุกซ์ (bias). ยิ่งอ่านยิ่งรู้สึกจะกลายเป็นสาวก Qt ซะแล้วเพราะรู้สึกว่าดีและสร้างโปรแกรมด้วย Qt ง่ายจริงๆ. มีแนวคิดที่ต่างจากการสร้าง GUI เรื่อง moc (meta-object complier), signal/slot (ใช้แทน callback function) ทำให้เขียนโปรแกรมได้ง่ายขึ้น.

หนังสืออ่านอยู่เป็นฉบับดาว์นโหลดแล้วเก็บไว้อ่านในรถไฟเวลาเดินทางไปทำงาน. เนื้อหาก็เหมือนกับหนังสือที่ขายแหละครับ. หลายคนอาจจะสงสัยแล้วจะขายหนังสือไปทำไม? ตอนแรกผมก็คิดอย่างนั้นเหมือนกัน. หนังสือเล่มนี้แถม CD-ROM ข้างในมี

  • Qt 3.2.1 Non-Commercial Edition for Windows
  • Qt 3.2.1 Free Edition for Mac OS X
  • Qt 3.2.1 Free Edition for Unix/Linux with X11
  • Borland C++ Builder 5 Non-Commercial Edition
  • Borland C++ Builder 6 Trial Edition
  • Source code for the book's examples

ถ้าคนใช้ที่ลินุกซ์โดยปรกติเช่นผมดาว์นโหลดหนังสือมาอ่านก็เพียงพอแล้ว. แต่ยิ่งอ่านแล้วอยากซื้อเพื่อเอา CD-ROM ครับ. สาเหตุที่สำคัญคืออยากใช้บนวินโดวส์ดูว่าเป็นอย่างไรและผมไม่มี compiler สำหรับบนวินโดวส์ด้วย. อีกอย่าง, ทาง Trolltech เองก็มีให้ดาว์นโหลด Qt สำหรับวินโดวส์เหมือนกันแต่ต้องการ Microsoft Visual C version 6 เท่านั้น (? ไม่แน่ใจ). แถมไม่ค่อยเปิดเผยเท่าไหร่ไม่เหมือนกับ Qt บนลินุกซ์. อย่างนี้ซื้อหนังสือดีกว่าได้ทั้งหนังสือและ Borland C++ Builder 5 มาใช้ด้วยกันเลย. มีคนเขียนสรุปการติดตั้ง Qt บนวินโดวส์ที่มากับหนังสือให้ดูแล้วด้วย.

ที่หนังสือแถม Borland C++ Builder นี่น่าจะเป็นเพราะ Borland ถือหุ้นของ Trolltech อยู่ด้วย 8.3 %. สรุปว่าหนังสือเล่มนี้ดีครับ. ดาว์นโหลดอ่านได้ฟรี, ใครอยากลองใช้ Qt บนวินโดวส์เช่นผมก็อาจจะซื้อหนังสือเป็นเล่มเก็บไว้, เป็นการระดมผู้พัฒนาซอฟต์แวร์แบบหนึ่ง, โฆษณา Qt, Borland ไปในตัว.

เคยเขียนโปรแกรม GUI บนลินุกซ์ด้วยด้วยภาษา C++ เลยเลือกใช้ Gtkmm (Gtk+ แบบใช้ C++) กับ glade (GUI builder)

หน้าจอ Glade

เชลล์สคริปต์เบื้องต้น ตอนที่ 4 - ตัวแปรพิเศษ

วันก่อนพูดเรื่องตัวแปรสภาพแวดล้อมไปนี้วันนี้ขอพูดเรื่องตัวแปรพิเศษครับ.

ตัวแปรพิเศษ

ถ้าอ่าน man bash ในช่วงของ special parameters จะเห็นว่ามีตัวแปรพิเศษอยู่หลายตัว. ตัวแปรเหล่านี้โดยปรกติเชลล์จะเตรียมไว้ให้อยู่แล้วไม่ต้องสร้างเอง, และมักจะเป็นตัวแปรที่เปลี่ยนค่าไม่ได้ (read-only). ตัวแปรที่ใช้บ่อยและสำคัญๆได้แก่

เชลล์สคริปต์เบื้องต้น ตอนที่ 3 - ตัวแปรสภาพแวดล้อม

ตัวแปรสภาพแวดล้อม

ตัวแปรที่ใช้ในเชลล์จะมีสองแบบคือตัวแปรธรรมดากับตัวแปรสภาพแวดล้อม (environment variable). ตัวแปรสภาพแวดล้อมจริงๆแล้วก็คือตัวแปรธรรมดาแต่มีผลที่โปรแกรมที่รันในเชลล์นั้นจะสืบทอดตัวแปรสภาพแวดล้อมและค่านั้นไปด้วย. ตัวอย่างตัวแปรสภาพแวดล้อมที่เราคุ้นเคยกันเช่น PATH เป็นต้น.

เชลล์สคริปต์เบื้องต้น ตอนที่ 2

ต่อจากตอนที่ 1.

รันเชลล์สคริปต์

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

เชลล์สคริปต์เบื้องต้น ตอนที่ 1

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

Firefox ICU patch ใน Gentoo

คุณโชครายงานมาว่าออก Firefox 1.0 ที่ลง patch ICU ไว้ตัดคำภาษาไทยในลินุกซ์ทะเลรุ่นใหม่แล้วเลยอยากมาลองกับ Firefox ใน Gentoo บ้าง. ทำแบบนี้ครับ.

  1. ดึงข้อมูลแพกเกจล่าสุดมาก่อน.
    # emerge sync
    
  2. ดาว์นโหลด patch ไปไว้ที่ได้เรกทอรี files. รู้สึกว่ามันเป็น patch สำหรับ 0.9.2 แต่ก็น่าจะใช้ได้, ต้องลองดู.

    # cd  /usr/portage/net-www/mozilla-firefox/files
    # wget -nd ftp://ftp.opentle.org/people/mrchoke/patches/firefox-0.9.2-icu-thai-lwbr.patch
    
  3. emerge icu ก่อนถ้ายังไม่มีในระบบ.

    # emerge icu
    
  4. ตรวจสอบดูว่า firefox รุ่นล่าสุดคืออันไหน.

    # emerge -pv mozilla-firefox
     
    These are the packages that I would merge, in order:
     
    Calculating dependencies ...done!
    [ebuild     U ] net-www/mozilla-firefox-1.0-r3 [1.0-r2] -debug +gnome +java +ldap 
    -mozdevelop -moznoxft -mozsvg -mozxmlterm -xinerama -xprint 0 kB
     
    Total size of downloads: 0 kB
     
    
  5. ในกรณีนี้คือ 1.0-r3 เพราะฉะนั้นไปแก้ไฟล์ mozilla-firefox-1.0-r3.ebuild ที่อยู่ในไดเรกทอรี /usr/portage/net-www/mozilla-firefox. เพิ่มบรรทัด

            epatch ${FILESDIR}/firefox-0.9.2-icu-thai-lwbr.patch
    

    ต่อจากบรรทัด

            epatch ${FILESDIR}/mozilla-firefox-1.0-kp_separator.patch
    
    
  6. ตรงบรรทัด

     mozconfig_annotate '' --enable-oji --enable-mathml
    

    แก้เป็น

     mozconfig_annotate '' --enable-ctl --enable-oji --enable-mathml
    

    คือเพิ่มความสามารถ complex text layout ไปด้วย. จะแสดงสระไม่ลอย.

  7. emerge
    # USER="xprint" emerge mozilla-firefox
    Calculating dependencies ...done!
    >>> emerge (1 of 1) net-www/mozilla-firefox-1.0-r3 to /
    >>> md5 src_uri ;-) firefox-1.0-source.tar.bz2
    >>> Unpacking source...
    >>> Unpacking firefox-1.0-source.tar.bz2 to /var/tmp/portage/mozilla-firefox-1.0-r3/work
     * Applying mozilla-firefox-1.0-4ft2.patch ...                            [ ok ] 
     * Applying mozilla-firefox-1.0-kp_separator.patch ...                    [ ok ] 
     * Applying firefox-0.9.2-icu-thai-lwbr.patch ...                         [ ok ]
    >>> Source unpacked.
    ~x86
    ...
        --enable-ctl                    mozilla.org default
    ...
    

    ดูตอนคอมไพล์ว่าต้องเป็นอย่างตัวอย่างข้างบนครับคือมีการ patch และ --enable-ctl.

  8. ขั้นสุดท้ายเกี่ยวกับ ctl ต้องไปแก้ไฟล์ /usr/lib/MozillaFirefox/res/fonts/fontEncoding.properties. เพิ่มบรรทัดต่อไปนี้
    encoding.loma.ttf = x-thaittf-0.wide
    encoding.kinnari.ttf = x-thaittf-0.wide
    encoding.tlwgtypewriter.ttf = x-thaittf-0.wide
    encoding.tlwgmono.ttf = x-thaittf-0.wide
    encoding.purisa.ttf = x-thaittf-0.wide
    

    ถัดจากบรรทัด

    encoding.norasi.ttf = x-thaittf-0.wide
    encoding.garuda.ttf = x-thaittf-0.wide
    encoding.dbthaitext.ttf = x-thaittf-0.wide
    

    ตรงนี้จะแก้ที่รหัสต้นฉบับก่อนคอมไพล์ก็ได้แต่ลืมครับ.

หน้าจอจะเป็นแบบนี้ครับ.

ขยายจอออกอีกนิดจะเห็นว่าตัดคำได้สวย, และสระวรรณยุกต์ไม่ลอย. ต้องขอขอบคุณคนทำ patch จริงๆNATTAPOL KRITSUTHIKUL สำหรับ patch อันนี้และคุณสัมพันธ์สำหรับ patch อันใหม่.

Two books today

วันนี้ไปเจอมาสองเล่มครับ.

C bookmark

เว็บนี้เคยอ่านเมื่อ 3-4 ปีที่แล้ว, นึกขึ้นได้เลยเอามาบุคมาร์คหน่อยครับ. ชื่อ Programming in C - UNIX System Calls and Subroutines using C ยาวจัง. ว่าจะซื้อหนังสือของ Richard Stevens หลายๆเล่มแต่ก็ไม่ได้ซื้อซะที. มีอยู่เล่มเดียวคือ Unix Network Programming เอดิชันเก่า.

Just Another Perl Hacker

วันนี้อ่านนิตยสารที่อ่านเป็นประจำเจอโค้ด perl แปลกๆแบบนี้ครับ.

#!/usr/bin/perl
($_,$a)=split(/\./,<DATA>);@b=(reverse)=~m@.@g;map{print $b[$_]}split(//,(reverse $a));__DATA__
!drw ,oleH.9827365432210.

ถ้ารันแล้วจะได้ผลลัพธ์เป็น

Hello, World!

ในนิตยสารเขียนไว้ว่าเป็น Just Another Perl Hacker เลยไปเปิดเว็บตามเจอที่ wikipedia ว่าเป็นการเขียนโปรแกรมภาษา perl ให้อ่านไม่รู้เรื่องแต่ผลออกมา OK.