Python 2.5 alpha 1

by pittaya

Python ขึ้นเลข minor เวอร์ชันใหม่แล้ว จาก 2.4 มาเป็น 2.5 มีฟีเจอร์น่าสนใจ (แต่ไม่รู้จะได้ใช้หรือเปล่า) เพิ่มมาเยอะเหมือนกัน

  • Conditional Expression - อันนี้น่าจะได้ใช้ คือเรื่องมีอยู่ว่า ในภาษา C เวลาเขียนเงื่อนไขแบบสั้นๆ เราเขียนง่ายๆ คือ x = condition? a:b แต่ใน python เขียนสั้นๆ แบบนี้ไม่ได้เสียที จนกระทั่งเวอร์ชันนี้สามารถเขียนได้แล้ว แต่หน้าตาจะต่างจากของ C นิดหน่อย คือ x = a if condition else b ดูแล้วก็อ่านง่ายดี
  • Partial Function - เค้าว่าเป็นการเขียนสไตล์ functional programming เท่าที่ดูก็ไม่เห็นมีประโยชน์เท่าไหร่ ยกเว้นเวลาเขียน app ที่มันมี function ที่รับ argument เยอะๆ (น่าจะได้ใช้ตอนเขียนพวก PyGTK) คือสมมุติว่าเรามี function f(a, b, c) เราสามารถสร้าง function g(b, c) ที่ equivalent กับ f(1, b, c) ได้ (รู้สึกเหมือนตอนเรียนเลข ม.ปลาย เรื่อง function เลย)
  • try/except/finally - ในเวอร์ชันก่อนๆ เราจะมี statement try…except กับ try…finally แยกกันเป็นคนละอัน ใน python 2.5 เราสามารถเขียนรวมกันได้แล้ว เป็นแบบ
    try:
      do something
    except Exception:
      handle something
    else:
      do another thing
    finally:
      always do this
  • ‘with’ statement - ใช้สร้าง context manager (มันคืออะไร ?) ยังไม่ค่อยเข้าใจ ดูเหมือนจะเป็น idiom ใหม่ เอาไว้เขียน try…finally ให้สวยๆ
  • New packages - ctype เอาไว้เรียก function จาก shared lib หรือ dll ได้เลย, ElementTree เป็น package ย่อยอยู่ข้างใน package xml อีกที, hashlib เอาไว้ใช้แทน Module md5 และ sha เดิม พร้อมทั้ง support hash แบบอื่นๆ อีกด้วย
  • Other - มีปรับปรุงอย่างอื่นอีกเล็กๆ น้อยๆ เช่น function any(), all() หรือเพิ่มความสามารถให้ function min(), max() แล้วก็ฟีเจอร์อื่นที่อ่านแล้วงง คาดว่าคงไม่ได้ใช้อย่าง relative import กับ generator แบบใหม่

เวอร์ชันนี้เป็นแค่ alpha 1 เท่านั้น ตัวจริงออกประมาณ June-July

Zend Framework

by pittaya

Zend Framework ออกแล้ว
เท่าที่ดูจาก manual ก็พอจะมีอะไรดีๆ ให้ใช้พอสมควร

จุดด้อยอย่างนึงของ PHP คือว่าภาษามันไม่มีอะไรที่เป็น official framwork ทำให้มีคน implement framework ออกมาหลายเจ้ามาก ซึ่งแต่ละเจ้าก็ต้องมาเขียนฟีเจอร์อย่างพวก database adapter, object relational mapping กันเอง ซึ่งมันซ้ำซ้อน, reimplementing the wheel, ไม่ efficient โคตรๆ

ฟีเจอร์ที่น่าสนใจ

  • Object-Relational Mapping - ไม่ต้องมานั่งเขียน Insert(), Update(), Delete() เองแล้ว
  • Input Validator - อันนี้ก็ได้ใช้บ่อย
  • View - ก็คือ view ใน MVC น่ะเอง
  • JSON - ย่อมาจาก JavaScript Object Notation เหมาะมากที่จะเอาไว้ใช้แทน XML ตอนเขียน AJAX
  • Web service - สนับสนุน REST แล้วก็มีฟังก์ชันสำหรับ web service ฮิตๆ อย่าง amazon, flickr มาให้ด้วย

ก็พอจะน่าใช้อยู่ แต่เทียบกับ framework สำหรับภาษาอื่น คงจะยังล้าหลังอยู่
จุดแข็งหลักอันนึงของ PHP คือว่า web hosting เกือบทุกเจ้าต้องใช้ PHP ได้อยู่แล้ว แต่สำหรับ framework ในภาษาอื่นมันจะหา host ลำบาก นอกเสียจากว่าจะมี host เป็นของตัวเอง

หรือจะไปเขียน Rails ดี ?

ลองใช้ google perftools ดู
มันเป็นไลบรารีที่เอาไว้วัดประสิทธิภาพการทำงานของโปรแกรม อันนี้ google เขาแจกให้ใช้ได้ฟรี

เอาโปรแกรมที่เขียนเป็น thesis มาลองวัดประสิทธิภาพดูด้วย CPU Profile เพราะรู้สึกว่ามันช้าจนเกินจะรับได้ไปสักหน่อย จะได้ปรับอัลกอริทึมให้มันดีขึ้น

วิธีใช้งานก็เพิ่ม -lprofiler ลงไปตอน link โปรแกรม
จากนั้นก็สั่ง execute
$ CPUPROFILE=/home/pit/tmp/profile /home/pit/projects/test/program

มันจะไปสร้าง profile ให้ที่ /home/pit/tmp/profile
จากนั้นก็เอา profile ที่ได้มาวิเคราะห์ด้วย tools ที่ชื่อ pprof
$ pprof --gv --lines /home/pit/projects/test/program /home/pit/tmp/profile

จะให้มัน output มาเป็น text ล้วนๆ หรือทำเป็นกราฟ ก็ได้ทั้งแบบ Postscript แล้วก็ Gif

ปรากฎว่าผลที่ได้จากการวัดด้วย tools ตัวนี้คือ ส่วนที่ทำงานช้าที่สุดคือฟังก์ชัน cvDilate(33%), cvQueryFrame(20%) และ cvCopy(17%) ซึ่งเป็นส่วนหนึ่งของไลบรารี OpenCV

ฟังก์ชัน cvDilate และ cvCopy ทำงานได้ไม่เร็วอย่างที่คิดไว้ ทั้งๆ ที่เป็นการทำงานที่ค่อนข้างตรงไปตรงมาเมื่อเทียบกับฟังก์ชันอื่นอย่าง cvAdaptiveThreshold ที่คิดว่าน่าจะเสียเวลาการทำงานมากกว่าเยอะ

นอกจากนี้ยังเห็นได้ว่า cvQueryFrame ซึ่งเป็นฟังก์ชันที่ทำงานกับ I/O ทำงานช้ากว่าที่คิดมาก และอาจจะเป็นคอขวดของระบบได้ เนื่องจากโปรแกรมไม่ได้มีการทำงานแบบเป็น thread ดังนั้นตอนที่ fetch ข้อมูลจาก I/O จะทำให้ process ถูก block

จะว่าไปแล้ว cvDilate กับ cvCopy ถ้าได้ใช้งานความสามารถของ MMX น่าจะทำให้ทำงานได้เร็วขึ้นเป็นเท่าตัว เพราะสามารถทำงานได้พร้อมกันทีละหลายๆ pixel

แนวทางปรับปรุง - เปลี่ยนโปรแกรมเป็นแบบ thread แยกส่วนการ fetch ข้อมูล ออกจากการประมวลผลหลัก, หาทางทำ dilation ให้เร็วๆ กว่านี้

เมื่อก่อน ตอนที่ Intel ออกตัว MMX technology มาใหม่ๆ ตอนนั้นยังไม่ค่อยรู้เรื่องสถาปัตยกรรมของคอมพิวเตอร์เท่าไหร่ ทำเป็นแค่ประกอบเครื่อง ความรู้ส่วนใหญ่ก็หาอ่านจากนิตยสารคอม

ตอนนั้นในหนังสือ (ซักเล่ม) บอกว่า MMX ย่อมาจาก Multimedia eXtension คือส่วนขยายที่สามารถประมวลผลข้อมูลมัลติมีเดียได้ว่องไว ก็เลยเข้าใจไปว่ามันคือชุดคำสั่งที่คำนวณ math ที่ซับซ้อนได้เร็วๆ

จนกระทั่งวันก่อนได้เกิดความพยายามที่จะเขียน assembly ของ MMX เพื่อเร่งความเร็วการประมวลผลให้สุดๆ
พอได้ไปอ่านดูจริงๆ พบว่าที่เคยเข้าใจมาก่อนหน้านี้มันผิดหมดเลย

MMX ก็เป็นแค่ register 64 bit จำนวนแปดตัว ที่คำนวณ math ธรรมดา (เฉพาะจำนวนเต็มด้วย) ได้พร้อมๆ กันเท่านั้นเอง หาได้มีความสามารถในการแก้สมการอนุพันธ์ได้ใน cycle เดียวแต่อย่างใด
แต่ที่ MMX มันช่วยให้การประมวลผล multimedia ทำได้เร็วขึ้น ก็คือว่าข้อมูล multimedia ม้กจะเป็นข้อมูลซ้ำๆ กัน ขนาดใหญ่ ซึ่งถ้าทำได้พร้อมๆ กันเยอะๆ มันก็จะเร็ว เช่น การแปลงภาพให้เป็นขาวดำโดยใช้วิธีกำหนดเส้นขีดแบ่ง (thresholding)
วิธีการมันคือ หยิบจุดมาดู ถ้าค่ามากกว่า threshold ก็ให้เป็นสีขาว ถ้าน้อยกว่าให้เป็นสีดำ อะไรงี้ ซึ่งถ้าคำนวณตามปกติ ก็จะเสียเวลาคำนวณซ้ำๆ กันเท่ากับจำนวนจุดในภาพ แต่ถ้าใช้ MMX อาจจะสามารถคำนวณได้พร้อมๆ กันทีละ 4 จุด ทำให้เร็วขึ้น 4 เท่า !
(ฟังดูไถนาชอบกล)

กรณีของ SSE (Stream SIMD Extension) ก็เช่นเดียวกัน เหมือนกับ MMX แต่เป็น register สำหรับคำนวณเลขทศนิยม

คำสั่งพวกนี้เค้าเรียกว่า SIMD - Single Instruction, Multiple Data
คำสั่งเดียว แต่คำนวณข้อมูลพร้อมกันหลายๆ ชุด

ไปค้นๆ ใน Wikipedia ถึงเข้าใจอีกอย่างว่า MMX ไม่ได้ย่อมาจาก Multimedia eXtension ซักหน่อย แต่เป็นศัพท์ทางการตลาดที่ Intel เองยังไม่ได้บอกด้วยซ้ำว่ามันย่อมาจากอะไร

โง่อยู่ตั้งนาน

Compiling Quake III

by pittaya

Compiling Quake III arena on Linux is not quite difficult as i thought, but only a bundled README is not enough. After googling for a while i found the source files contain win32-style linebreak, so they need to be changed to unix-style ones. Moreover, default parameter in Makefile are optimized for pentium, so i need to edit it manually for my athlon cpu. The last thing is this Makefile is for gcc-2.95, some parameters are deprecated in gcc-3.3 (my default compiler) so i replaced them with 3.3 equivalent.

A brief compiling steps for my Ubuntu box (Hoary):
(adopt from here)

  1. Download the source from ftp://ftp.idsoftware.com/idstuff/source/quake3-1.32b-source.zip
  2. Unzip using:
    unzip -qa quake3-1.32b-source.zip
    (to convert file silently)
  3. chmod all perl script (*.pl) and shell script (*.sh) to be executable
  4. chmod code/unix/cons and code/unix/pcons-2.3.1 to be executable
  5. Edit code/unix/cons file, change first line from
    #!/usr/bin/env perl
    into:
    #!/usr/bin/perl
  6. Edit unix/Makefile, line 149, change it to suit machine’s architecture
  7. Edit Construct file, line 22, change from ‘debug’ to ‘release’
  8. Execute: unix/cons release
  9. Take a break, have some coffee
  10. Go to code/install, there’s linuxquake3 binary file waiting to be executed

Then i get an error message said cannot find default.cfg - What the hell !

Another 10 minutes googling, i found that, in order to run Q3A i need game data file (the so-called pak0.pak file) which can be obtained from Q3A CD which i don’t have.

Do I have to go to buy a box of Q3A ? Fortunately, Bram Cohen has invented BitTorrent. Q3A can be easily found on several trackers.

There’re still more problems.
The file i downloaded is in 7-zip format which i cannot open it with my Hoary and the p7zip package is only available for Breezy
i have to download the binary manually - Damn!,i was spoiled by Apt-get/Synaptics easiness.

After unzip it, there are quake3.mdf and quake3.mds file. What the hell are these file ?
More googling told me it’s an image file created by Alcohol 120%,
<rant>I HATE IT! why didnt’t they make it ordinary ISO file !</rant>

mdf2iso is also not available for my Hoary and its website doesn’t provide any binary packages. I grabbed the source - compile - then use it on the damn mdf file.

Finally, i got an ISO file. It seems ok and can be mounted as loopback without problem.
Then, get it burned on CD with GnomeBaker.

Let’s come back to focus on Q3A. There’s a file named pak0.pak3 on Q3A cd, copy it to code/install/baseq3 directory.
Run linuxquake3 binary and then VOILA ! Q3A started ! With 3D acceleration ! With SFX !

Enough for today…
Hacking the engine must be an energy-consumed task, should be done in another day -_-’

ID software’s developers are crazy !
Look at their code !
(Taken from source code of Quake III arena that they just GPLed.)


./unix/ChangeLog: Note: Unix CR/LF in *.dsw/*.dsp fucks up MSVC++.
./unix/ChangeLog: How the fuck did this happen?
./ui/ui_shared.c: //FIXME: this is a fucking mess
./game/q_math.c: i = 0x5f3759df - ( i >> 1 ); // what the fuck?
./release-x86-Linux-/Q3/q3_ui/q3_ui/ui_atoms.asm:;604: // fuck, don't have a clean cut, we'll overflow
./client/snd_dma.c: if (letter =='') letter = '/'; // damn path names
./game/g_combat.c: self->client->ps.persistant[PERS_PLAYEREVENTS] ^= PLAYEREVENT_HOLYSHIT;
./unix/unix_main.c:// flush stdin, I suspect some terminals are sending a LOT of shit
./cgame/cg_local.h: sfxHandle_t holyShitSound;
./game/bg_lib.c:/* this is really crappy */

Django 101

by pittaya

วันสองวันมานี้ทดลองเล่น Django อยู่
มันเป็น yet another web framework น่ะแหละ แต่ว่าทำออกมาใช้ได้เลย

ปัญหาทั่วไปสำหรับคนทำเวบก็คือว่า พอเขียนหน้าเวบเสร็จแล้ว ต้องมาทำ backend ให้กับลูกค้า สามารถมา manage ได้ ซึ่งตรงเนี้ย น่าเบื่อโคตรๆ เพราะมันไม่มีอะไรเลย นอกจาก create/update/delete เท่านั้น โค้ดก็ซ้ำๆ เดิมๆ ทำไปหลายๆ project แล้วจะรู้สึกว่า มันน่าเบื่อโคตรๆ

Django นี่เป็น Model driven framework เต็มสูบ จำพวกเดียวกับ Ruby on Rails ที่กำลังร้อนแรงอยู่ตอนนี้ แต่พอดีว่าเขียน ruby ไม่เป็น ก็เลยไม่ได้หามาลองเล่น แต่ดูแค่ Intro video (50 MB นะ) ของมันก็ต้องอ้าปากค้างแล้ว

คือ developer ทำแค่กำหนด data model ให้เรียบร้อย จากนั้น framework มันจะ generate พวก API และหน้า backend ให้เอง
พวกงานรูทีนทั้งหลายก็ไม่ต้องทำ เอาเวลาไปโฟกัสพวก business logic กับทำหน้า user interface ให้ผู้ใช้ดีกว่า

พูดไปอาจจะไม่เห็นภาพ ลองดูอันนี้ละกัน คลิกเบาๆ นะ

ใช้ x11vnc กับ vnc2swf จับภาพมา คุณภาพใช้ได้เลยทีเดียว

Language Easiness

by pittaya

เวลาที่บอกว่า ภาษาหนึ่งง่ายหรือยากกว่าอีกภาษาหนึ่ง เค้าเอาอะไรมาเป็นตัววัด ?
(อันนี้คือ Programming language นะ ไม่ใช่ Regular language, Context-free language อะไรพวกนั้น)

คือว่ามันมีงานกลุ่มที่เรียน ป.โท นี่แหละ ให้ทำเวบ (อีกแล้ว) ก็จับกลุ่มกันสามคน โดยสรุปได้ว่าจะ develop โดยใช้ asp.net เพราะสมาชิกในกลุ่มบอกว่า “มันง่าย”

จริงเหรอ ?

เพื่อพิสูจน์ความจริง ก็เลยไปโหลด Monodevelop มาลง พยายามจะลองเขียน asp.net ด้วยภาษา C#
รู้สึกว่ามันไม่ค่อยเวิร์คเท่าที่ควร เพราะว่า domain ของงาน มันคือทำเวบ แต่ Monodevelop มันเป็น IDE เอาไว้เขียนโปรแกรมทั่วไป ไม่มี GUI designer หรูหราตาแหกอย่าง Visual Studio มันก็เลยน่าสงสัยว่า ที่ว่า Visual Basic มันง่ายน่ะ ตัวภาษามันง่ายจริงหรือว่าง่ายเพราะ IDE มันดี

เท่าที่ลองเขียนดู asp.net ใช้ C# โดยไม่มี IDE ในความรู้สึกส่วนตัว มันก็ยากพอๆ กับเขียน JSF โดยใช้ Java น่ะแหละ เพียงแต่ asp.net มันไม่วุ่นวายเรื่อง XML มากเหมือนกับ JSF

IMHO, PHP/Perl/Python ง่ายกว่าแน่ๆ

Playing God

by pittaya

ตั้งแต่ป๋าแด้ให้ไอ้เข้มไปจดโดเมน cp-24.com ตอนนี้เพื่อนฝูงในรุ่นเดียวกันชักจะคึกคัก หลังจากปล่อยให้ webboard รกร้างไปนาน เป็นข้อยืนยันได้อย่างดีว่า Friendly URL มีผลกับจำนวนคนดูจริงๆ

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

ตัวโปรแกรมมันเป็น python script ที่ให้เราสามารถระบุ list ของ feed ได้ว่าเราจะไปดูดเอา feed มาจากไหนบ้าง แล้วมันจะเอามา render ยำรวมกัน generate เป็นหน้าเวบออกมา ข้อดีของไอ้ตัวนี้คือว่า มันใช้ universal parser ทำให้สามารถ aggregate feed ได้หลายหลาก format ไม่ว่าเจ้าของ blog จะเขียนอยู่เวบไหน ถ้า provide feed ที่ตรงตามมาตรฐาน มันก็สามารถ aggregate มาได้

แต่มันก็ยังมีปัญหาให้ปวดหัวอยู่ดี คือ ไอ้ planetplanet เนี่ย เวลามันอ่าน feed เข้ามา มันจะพยายามเดาว่า feed มัน encode ด้วยอะไร แล้วจะแปลงให้เป็น UTF-8 ซะ เพื่อให้หน้าเวบของ planet สามารถแสดงผลได้ถูกต้อง ฟังดูดี แต่การ implement มันถ่อยไปหน่อย คือทีแรกมันจะ assume ว่า feed เป็น UTF-8 ซึ่งถ้าไม่ใช่ มันจะไปดูต่อว่าเป็น Latin-1 (ISO-8859-1) หรือเปล่า ถ้าไม่ใช่อีก มันก็โมเมแก้ตัวอักษรที่เป็น non-ascii เอาเองเลย ดังนั้นมันก็จะมีปัญหากับพวกที่ provide feed ที่ encoding เป็นภาษาไทย

วิธีแก้ก็คือ ไปแกะไฟล์ planetlib.py มองหาส่วนที่มันเดา encoding ก็ไปเปลี่ยนให้มันเดา TIS_620 แทนที่จะเป็น ISO8859_1 ซะ แต่ก็ดันมีปัญหาต่อมาคือ python บนเครื่อง server ดันเป็นเวอร์ชันเก่าเกิน ไม่ support TIS-620 ก็เลยจำใจใช้ cp874 แทนไปพลางๆ

หลังจากนั้นไปแก้ไฟล์ template แสดงผลให้ออกมาสวยๆ ก็เนียนแล้ว

ยังมี feed ของบางคนห่วยๆ อยู่ โดยเฉพาะพวกที่เขียนบน Xanga เพราะว่า feed ของมันเป็นเวอร์ชันเก่า ไม่มีข้อมูลเรื่องวันที่ แถมยังส่งข้อมูลมาไม่ตรงตาม semantic อีก ถ้าจะแก้ให้สวยงามก็พอทำได้ แต่ทางเลือกที่ดีกว่าคือไปใช้ Blogger เหอะ ของเค้าทำดีกว่าเยอะ หรือถ้าใครมี server ของตัวเอง ลง Wordpress, Drupal หรือ MovableType เลยจะดีกว่า

« Previous Page