Tag Archives: hack

เรามาเขียนโค้ดได้ไง

ปี 2529 อยู่ ม.2 ไม่เคยเล่นเกม ไม่เคยใช้โปรแกรมสำเร็จรูป แตะคอมพิวเตอร์ครั้งแรกก็หัดโค้ดเลย

มันคือเครื่อง VTech Laser 200 (https://en.wikipedia.org/wiki/VTech_Laser_200)

ROM เป็น BASIC interpreter สมัยนั้นเรียกของพวกนี้ว่า home computer ก็ไม่แน่ใจว่าเครื่องนี้เป็นของใคร แต่มันวางอยู่ที่บ้านที่ไปอาศัยอยู่ช่วงนั้น หัดจากคู่มือของเครื่อง (ภาษาอังกฤษ) หนังสือตัวอย่างโปรแกรมที่แถมมา จนเขียน BASIC เป็น

ม.ปลาย ที่โรงเรียนสอนภาษา Logo .. ช่วงนั้นมีเครื่อง PC ที่บ้านแล้ว รับจ้างเขียนโปรแกรม พิมพ์รายงาน

ป.ตรี รับจ้างเขียน inventory ให้ รพ.ศรีนครินทร์ (Clipper/Netware) โปรเจคจบเขียน C/C++ เป็นโปรแกรมบน Windows

ป.โท ระหว่างเรียนเขียน C, C++, CLIPS, LISP, Prolog, OCaml, Smalltalk, YACC, Lex, Java

ป.เอก เข้ารีต F/OSS ทำ packages ให้ LinuxTLE เขียนตาม upstream ใช้ภาษาไหนก็โค้ดภาษานั้น coding style แบบไหนก็ต้องตามนั้น เพลินมากจนเกือบเรียนไม่จบ 555+

อืม .. เดี๋ยวนะ ผมอยู่สาย sysadmin/ops มาตั้งแต่เรียน ป.ตรี นะหนิ (^^)a

orphan-thumbnail

ปกติ GNOME จะสร้าง thumbnail ของภาพ วิดีโอ และไฟล์เอกสารอื่นๆ เพื่อแสดงแทน icon เวลาใช้งาน file browser ดู thumbnail เอาก็จะได้หาไฟล์ได้ง่าย .. thumbnail พวกนี้เก็บใน ~/.thumbnails พอกพูนไปเรื่อย ไม่มีการลบออก เว้นแต่ผู้ใช้จะลบเอง ตั้งแต่มี thumbnail มา ก็พยายามหาทางลบ orphan thumbnail แต่ก็ยังไม่มีเครื่องมือเสียที ได้แต่อาศัย rm -rf ~/.thumbnails หรือดีหน่อยก็ find -atime ... | xargs rm -f เป็นที่อนาถใจ

กระทั่งเมื่อวันศุกร์มาค้นหาโปรแกรมสำหรับล้าง orphan thumbnail ก็ยังไม่เจอว่า GNOME ทำไว้ .. แต่ไปเจอว่าใน thumbnail จะมี comment เป็น URI ที่อ้างอิงกลับไปยังไฟล์เอกสาร .. โอ้ว นี่แหละที่ต้องการ ! แค่เช็คจาก URI ว่าไฟล์ไม่อยู่ ก็ลบ thumbnail ได้ละ :D

หลังจากคิดออก แรกๆ ขี้เกียจ ก็กะจะใช้ script ประมาณ exiftool ... | grep ... | awk ... | sed ... | ... มันก็พอไหวนะ แต่ลองรันดู .. โอ้ ช้าโคตร .. เย็นศุกร์กลับบ้าน ตั้งใจว่าตูจะเขียนเป็น C ให้ดู

บ่ายแก่ๆ + ดึกๆ วันเสาร์ ก็เคาะ code เวอร์ชันแรกออกมา ดูรายละเอียด + ดาวน์โหลด ได้ที่หน้า orphan-thumbnail comment / report bugs ได้ที่ห้อง #tlwg @ irc.linux.in.th หรือ เมลมาเช่นเคย

/me … รีบๆ ลวกๆ ไปหน่อย ไม่ได้จัด code สวยๆ .. ไว้เวอร์ชันหน้าละกัน :P

Kitty HTTPD

ปกติเวลาโอนไฟล์ใหญ่ๆ ข้ามเครื่อง จะใช้ Port-FTP ไวดี แต่ก็มีข้อด้อยตรงไม่ support file > 2 GB .. บางครั้งเลยต้อง scp เอา ซึ่งกรณีนี้เสีย CPU ไปกับ encryption ไปเปล่าๆ .. อยากได้ web server อย่างง่ายๆ ที่เรียกแล้วทำ index current directory ได้เลย จะได้ wget เอาได้ง่ายๆ … ให้ นศ เขียนส่งก็ไม่ได้เรื่อง .. เลยเขียนเองดีกว่า (ไม่รู้โง่หรือฉลาด แต่ก็ทำไปแล้ว) .. จริงๆ เขียน web server ง่ายๆ ด้วยภาษา C ใช้แค่ 1-200 SLOCs ก็ได้แล้ว … จากนั้นก็เพิ่มฟีเจอร์เข้าไปเรื่อยๆ จนพอใจในระดับนึง (หลักๆ ก็ 64-bit large file, IPv6, multithread, syslog, …) และคิดว่าพอจะรีลีสได้แล้ว

ดูรายละเอียด + ดาวน์โหลด ได้ที่หน้า Kitty HTTPD

comment / report bugs ได้ที่ห้อง #tlwg @ irc.linux.in.th หรือ เมลมาก็ได้ … หวังว่า code ที่รีลีสจะไม่ทำขายหน้านะ :P

Cross Processing Script-Fu for GIMP 2.6

เขียน Cross Processing โดยใช้เทคนิคปรับ curve แบบเดียวกันกับหลายๆ ที่เขาใช้

ลอง mouse over เทียบกับต้นฉบับดู (รอโหลดนิดนึง)

สนใจใช้งาน ดาวน์โหลด kitty.in.th – cross processing เอาไปลงใน ~/.gimp-2.6/scripts/ จะปรากฎเมนูใน Filters -> kitty.in.th -> Cross Processing :)

Arietta & Codetta

สัปดาห์ที่ผ่านมาเป็นอีกครั้งที่ได้คุยเรื่องการแสดงผล สระอำ ที่ยังมีปัญหาบน OO.o 3.0 สำหรับคนที่ใช้ฟอนต์ TTF ของวินโดว์ส ในขณะที่ฟอนต์ของลินุกซ์แสดงได้ไม่มีปัญหา แล้วก็เกิดบรรเจิดว่า ถ้าแก้ OO.o 3.0 ไม่ได้ ตูก็แก้ฟอนต์ซะก็สิ้นเรื่อง :P .. ว่าแล้วก็เริ่มทดสอบกับ Cordia New เอา FontForge เขียน GSUB แยก สระอำ เป็น นิคหิต กับ สระอา … เกิดมาก็เพิ่งได้ใช้ FontForge นี่แหละ ! .. งมไปงมมาพักใหญ่ ได้ผล ! ตัดคำถูกแล้ว :D .. ฟอนต์รุ่นนี้อาจจะมีบางคนได้เห็นในชื่อ Cordia Newer :P

แต่ ! ก็เกิดปัญหาต่อมาคือ วรรณยุกต์ลอย (อาจจะเป็นเพราะ FontForge มันอ่านมาไม่ได้) .. งั้นยำ Umpush กับ Cordia New เลยดีกว่า ก๊อปปี้ glyph ของ Cordia ไปใส่ตาราง Umpush .. rename glyph ให้ถูกกับที่ต้องใช้ใน GSUB ของ Umpush … ก็เป็นว่า วรรณยุกต์อยู่ในตำแหน่ง .. ทั้งหมดนี้แจกไม่ได้ .. จริงๆ แล้ว Cordia Newer ก็ไม่ควรจะเกิด เพราะมัน(อาจ)ละเมิดลิขสิทธิ์ฟอนต์ และ EULA ของ Microsoft .. หลังจากทดลองเสร็จเลยลบทิ้งหมด

ในเวลาเดียวกัน .. คุยกับพี่เทพได้ความว่า Cordia กับ Angsana เขาให้ใช้ฟรีแล้ว .. แต่ต้นฉบับกับพี่เทพหายไปพร้อมฮาร์ดดิสก์ .. ไปถามเอากับ Mr.Choke ได้มาเป็น TTF ที่ distribute ใน TLE 9.0 ทดลองยำไปๆ มาๆ … ก่อนจะมาเริ่มต้นทำจริงๆ จังๆ วันนี้นี่เอง ได้เป็นฟอนต์ Arietta และ Codetta ซึ่งใช้ glyphs ของ Angsana และ Cordia ตามลำดับ ทั้งสองฟอนต์ import GSUB และ GPOS ของ Umpush มาใช้ + ปรับ Anchor สำหรับสระ และวรรณยุกต์นิดหน่อย

ดูผลได้

คำว่า “แนะนำลินุกซ์” เป็นคำที่ผมใช้ทดสอบสระอำว่าทำให้สระ/วรรณยุกต์ บน/ล่างที่ตามมาแสดงผลผิดหรือเปล่า ส่วน “วิญญูมุ่งรู้พิฆาตปื้นขี้ฝุ่นเลษฏุ” ได้มาจากพี่เทพสำหรับดูตำแหน่งของสระ/วรรณยุกต์ บน/ล่างในกรณีพิเศษๆ

เพิ่มเติม  Codetta แสดงผล pangram ภาษาไทย | Arietta และ Codetta (Regular, Italic, Bold, Bold-Italic) PDF

ฟอนต์ทั้งสองดาวน์โหลดได้ที่ ftp://ftp.kitty.in.th/pub/sources/fonts/ ไฟลที่ไม่มี -ttf จะมีทั้ง *.sfd และ *.ttf ไฟล์ที่มี -ttf จะมีเฉพาะ *.ttf

ถ้าต้องการใช้แทนฟอนต์ของวินโดว์ส แก้ ~/.fonts.conf นิดหน่อย โดยเติมข้างล่างนี้เข้าไป

<!-- Synthesize Windows AngsanaUPC and Angsana New with Arietta -->
<match target="pattern">
    <test qual="any" name="family" mode="eq">
        <string>AngsanaUPC</string>
        <string>Angsana New</string>
    </test>
    <edit name="family" mode="assign" binding="same">
        <string>Arietta</string>
    </edit>
</match>
<!-- Synthesize Windows CordiaUPC and Cordia New with Codetta -->
<match target="pattern">
    <test qual="any" name="family" mode="eq">
        <string>CordiaUPC</string>
        <string>Cordia New</string>
    </test>
    <edit name="family" mode="assign" binding="same">
        <string>Codetta</string>
    </edit>
</match>

ข้อจำกัดของทั้ง Arietta และ Codetta คือมี glyphs เฉพาะอักขระไทยเท่านั้น เพราะต้นฉบับ Angsana และ Cordia มีเฉพาะ glyphs ไทย .. อย่างที่สองคือ hint มันจะไม่สวยเท่าไหร่ เข้าใจว่าต้นฉบับ Angsana/Cordia ใช้ hints คนละแบบกับตระกูล UPC/New ในไมโครซอฟต์ (ติดลิขสิทธิ์ของ hints ?)

สุดท้าย .. Arietta และ Codetta เป็นศัพท์ทางดนตรี :P

Thanks: พี่เทพ & Mr.Choke

Luko’s Sharpening for GIMP 2.x

Luko’s Sharpening เป็นหนึ่งในวิธี sharpen ยอดฮิตในช่วง 1-2 ปีที่ผ่านมา

เอาเมาส์ไปวางบนรูป จะเห็นว่า Luko’s sharpening ทำอะไรได้ขนาดไหน … :)

ดาวน์โหลด script ไปใส่ไว้ใน ~/.gimp-2.x/scripts แล้ว GIMP จะมีเมนู Script-Fu -> kitty.in.th -> Luko’s Sharpen ขึ้นมา (restart GIMP/refresh scripts ถ้าจำเป็น) ส่วนสูตร sharpening ของ Luko ลองถาม อ. กู้ หาไม่ยาก :P

GDictThai 0.0.4

v0.0.4 – ย้าย Berkeley DB 3.2 มาเป็น 4.7 แทน จะได้ใช้กับ distro ใหม่ๆ ได้ แล้วก็แก้ bug “About Dialog” กดปุ่ม Close ไม่ได้ อันนี้เพิ่งตั้งใจหาว่าเป็นตรงไหน จนเจอว่ามันเกิดหลังจาก GTK+ รุ่นไหนสักรุ่นนี่แหละ .. สรุปว่าต้อง handle เอง .. :P

Download: source | deb for Intrepid Ibex

P.S. .. v.0.0.3 ไม่ release เน้อะ :P

OpenOffice.org 2.4.0 workaround สำหรับ bug สระอำ – แบบใหม่

ต่อจาก ตอนที่แล้ว .. ระหว่างยืนสระผมอยู่ในห้องน้ำ นึกได้ว่าแค่แทรก word break ตู "Find & Replace …" เลยก็ได้นี่หว่า ไม่เห็นต้องมานั่งจิ้มๆ CTRL+/ ทีละตัวๆ เลย :P .. ดังนั้นวิธีการ workaround สำหรับ bug สระอำใน OO.o 2.4.0/2.4.1 อย่างง่ายๆ คือ

  1. เข้าเมนู Edit – Find & Replace หรือกด CTRL+F ก็ได้
  2. Find: สระอำ
  3. Replace: สระอำตามด้วย non-printable no-width word break character
  4. กด Replace All ตู้มเดียว จบ !

มี trick นิดหน่อย ตอนกรอกช่อง Replace จะกด CTRL+/ ใน text box ไม่ได้ .. ให้ไปกด CTRL+/ ใน document ก่อนแล้วค่อยก๊อปตัว word break สีเทาๆ มาใส่ใน text box ..

ถ้าวันหลัง OO.o fix bug ตัวนี้แล้ว จะเอาตัว word break ออกก็แค่ Find ตัว word break ไม่ต้องกรอกช่อง Replace แล้วกด Replace All ตัว word break ที่แทรกๆ อยู่ก็จะหายไป :)

ควรทราบไว้ว่าวิธีนี้สะดวกก็จริงแต่มันมีผลข้างเคียงนิดหน่อย เพราะการแทรก word break หลังสระอำดื้อๆ อาจจะทำให้มันไป break กลางคำ เช่นคำว่า "สำคัญ" มันจะ break เป็นคำว่า "สำ" กับ "คัญ" ถ้าบังเอิญคำนี้ไปตกตรงตำแหน่งท้ายบรรทัดพอดี อาจทำให้ "สำ" เป็นคำสุดท้ายในบรรทัดในขณะที่ "คัญ" โดนปัดลงมาขึ้นเป็นบรรทัดใหม่ มันก็จะผิดหลักภาษาไทย .. ผมลองเขียนเป็น regex ให้หาคำที่มีสระอำดูแล้ว (OO.o Find & Replace สนับสนุน regex มาตั้งนานแล้วนะ รู้เปล่า ?!) กะว่าถ้ามันทำได้ก็จะแทรก word break หลังคำแทนที่จะหลังสระอำดื้อๆ แต่ดูเหมือนว่า regex มัน match เป็นคำๆ ได้เฉพาะภาษาอังกฤษ ใช้กับภาษาไทยไม่ได้อะ ลองผิดลองถูกจนขี้เกียจลองแล้ว ใช้วิธีแทรกหลังสระอำดื้อๆ ไปก่อนละกัน … :P

ใครเขียน regex คล่องๆ จะลองเขียนดูหน่อยก็ดีนะครับ โจทย์คือเขียน regex ใน OO.o 2.4 ให้ match คำภาษาไทยที่มีสระอำประกอบในคำ .. เน้นว่าต้องได้เป็นคำๆ ที่ถูกตามหลักภาษาไทยเลย ไม่เอาเป็นประโยค หรือทั้งย่อหน้า .. ถ้าทำได้สำเร็จ ประกาศความสำเร็จได้ในห้อง #tlwg @ irc.linux.in.th นะครับ :)

OpenOffice.org 2.4.0 workaround สำหรับ bug สระอำ

อย่างที่เจอกันมาบ้างแล้วว่า OpenOffice.org 2.4.0 มี bug เรื่องการจัดสระอำทำให้สระบน-ล่างของคำที่ตามมาเพ้ียน (เข้าใจว่าเป็นกับ OpenType) .. สุดสัปดาห์ที่ผ่านได้อัปเกรดเป็นจนถึง 2.4.1 rc1 ของ hardy ก็ยังเจอปัญหานี้อยู่ เลยทดลองหา workaround ดู สุดท้ายคิดว่าใช้วิธีแทรก non-printable no-width word break (CTRL+/) ตามหลังคำที่มีสระอำน่าจะง่ายสุด ขยันๆ แทรกหน่อยละกัน :P

/me วันนี้เปิดเทอม

Linux Kernel 2.6.24

2.6.24 ออกแล้ว

  • CFS improvement .. เดิม context switch ของ CFS ช้ากว่า O(1) sched > 10% .. ตอนนี้ 2.6.24 (เคลมว่า) context switch ใน CFS เร็วกว่า O(1) นิดๆ
  • Fair Group Scheduling .. ตั้ง group ของ processes (ผ่าน /proc – ถ้าจำไม่ผิด) แล้วกำหนดน้ำหนัก CPU scheduling .. ถ้าประกอบกับ CFS มันก็จะประมาณ WFQ สำหรับ CPU scheduling นั่นเอง
  • Tickless สำหรับ x86-64, PPC, UML, ARM, MIPS … ปัญหาที่เคยเกิดกับ VirtualBox (กิน CPU > 10% ตลอดเวลาทั้งที่ไม่ได้รัน VM) หายแล้ว .. อย่างน้อยก็ในเครื่องที่ใช้อยู่
  • Driver ใหม่อีกหลายตัว ทั้ง 802.11 (stack ใหม่) 802.3 (10/100/GbE/10GbE) ALSA (Intel HDA แยก chipset แล้ว) PATA/SATA ฯลฯ

สำหรับคนใช้ macbook (top case แตกๆ) .. อย่าลืม co mactel patch สำหรับ 2.6.24 มา apply patch ด้วยเน้อ

wireless ใช้ ndiswrapper 1.51 ได้ ไม่มีปัญหา

iSight เอา revision 140 มาใช้ + patch อีกนิดหน่อย

--- uvc_driver.c.orig   2007-11-04 20:54:44.000000000 +0700
+++ uvc_driver.c        2008-01-28 20:35:02.000000000 +0700
@@ -1439,7 +1439,7 @@
        vdev->dev = &dev->intf->dev;
        vdev->type = 0;
        vdev->type2 = 0;
-       vdev->hardware = 0;
+/*     vdev->hardware = 0; */
        vdev->minor = -1;
        vdev->fops = &uvc_fops;
        vdev->release = video_device_release;

ก็จะใช้งาน iSight ได้ แถมได้ขนาด 640×480 และ support suspend/resume ด้วย .. ใช้ Ekiga ได้สบาย ใช้ Cheese ก็ได้ด้วย ไม่ต้องง้อ Photo Booth แว้วว :D