Wednesday, December 06, 2006

ภาษาไทย กับ Squeak

post ครั้งก่อนที่พูดถึงเรื่อง squeak
คุณ Vee post ถามว่า ได้ลองเล่นภาษาไทยบ้างหรือยัง
อืมม์จริงแฮะ เรายังไม่ได้ลองภาษาไทยเลย
ช่วง 2 วันมานี่ก็เลยนั่งค้น net ดู

เบื้องต้น ผมทดลองเขียน web application ด้วย seaside
แล้วทดลอง pass parameter เป็นภาษาไทยไปกับ query string
โดยให้ component มัน extract parameter ออกมาแสดงบน page
ก็พบว่ามันแสดงผลได้ถูกต้องดี

เมื่อไปค้นใน net ดู ก็เห็นว่าใน squeak3.8+
มีการรวม class ที่ support unicode ลงไปแล้ว
มีเอกสาร design คร่าวๆที่นี่
The Design and Implementation of Multilingualized Squeak
Note: เอกสารน่าจะ outdate แล้ว แต่พออ่านเป็นแนวทางได้

เมื่อ structure ภายใน support unicode แล้ว
ก็มาถึงประเด็นว่าเราจะ input ภาษาไทย
กับ display ภาษาไทย ได้อย่างไร

ผมทดลอง input ภาษาไทยเข้าไปที่ workspace
พบว่า ถ้าใช้ virtual machine ที่อยู่บน mac
จะสามารถ key ข้อมูลเข้าไปได้ (cursor ขยับ แต่ไม่แสดงตัวอักษร)
ส่วน virtual machine ที่อยู่บน linux ubuntu
ไม่แสดงอาการว่ามี keyboard event วิ่งเข้าไปเลย
ซึ่งลองค้นๆดูแล้ว เห็นมีคนที่ทำเรื่องภาษา russia
พูดถึง key input error ของ virtual machine
ที่อยู่บน Linux ไว้แบบนี้ (ผมยังไม่ได้ลองดูนะว่าทำได้จริงหรือไม่)
I 've found that stock VM doesn't work for me (I've tried FreeBSD and Kubuntu).
...
When I'm changing x2sqKey (it is x2sqKeyPlain) to x2sqKeyInput it starts
working:

///in sqUnixX11.c
typedef int (*x2sqKey_t)(XKeyEvent *xevt);

static int x2sqKeyPlain(XKeyEvent *xevt);
static int x2sqKeyInput(XKeyEvent *xevt);

static x2sqKey_t x2sqKey= x2sqKeyInput;

(อ้างอิง จาก [HACK] Unicode keyboard input and fonts)

กลับมาเรื่องแสดงผลต่อ
ผมทดลอง import "True Type Font" ที่มีภาษาไทย เข้าไปใน squeak
แล้วลองเปลี่ยน font ในการแสดงผลดู
ดีขึ้นแฮะ จากที่แสดงผลเป้น blank ก็ขึ้นเป็น กรอบสี่เหลี่ยมว่างๆแทน
ลองลง package MorphicTTFReader แล้วลอง browse TTF file ดู
ก็พบว่ามันขึ้นภาษาไทยได้



ลองใล่ดูใน browser บ้าง
ก็พบว่ามันมี class ที่ชื่อ LanguageEnvironment อยู่
ซึ่งมี class ที่ extend ตัวนี้อยู่หลายตัวที่เดียว เช่น
JapaneseEnvironment, GreekEnvironment, ...
ถ้าอ่านดูใน code จะเห็นว่า class นี้รับผิดชอบเรื่องใหญ่ๆอยู่ 3 เรื่องคือ
  • การ interpret Keyboard input
    อันนี้มี class หลักคือ KeyboardInputInterpreter
  • ClipboardInterpreter
  • TextConverter
    ใช้ในการแปลง stream


ดูแล้วการ custom ให้ใช้ภาษาไทย ก็ไม่น่าจะยากเกินไปนัก
(คุณ Vee เสร็จ thesis เมื่อไรก็บอกด้วยนะครับ
ผมจะชวนทำเรื่องนี้ด้วยกัน)

Note: ใน OLPC ก็มี squeak ฉบับ Etoys ลงไว้ด้วยเหมือนกัน
ไม่รู้ทางทืม nectec ได้เตรียมเรื่องภาษาไทยไว้บนนั้นหรือยัง

Related link from Roti

Monday, December 04, 2006

ทดสอบ concurrency บน Seaside

ในการเรียนรู้ Web application framework ตัวใหม่ๆ
ประเด็นแรกที่ผมต้องการรู้ก็คือ
performance ในส่วน concurrency มันเป็นอย่างไร
จะได้ใช้เป็นเกณฑ์ตัดสินได้ถูกว่า solution ไหน ควรจะใช้ framework อะไร

seaside ก็เช่นเดียวกัน
เนื่องจากมันเป็น component oriented ของแท้
ผมก็เลยอยากรู้ว่ามันจะ handler load ได้ดีแค่ไหน

ผมทดลองสร้าง helloworld component ขึ้นมา
(แบบเดียวกับตอนที่ทดลอง yaws)
โดยมี method สำคัญๆแค่ 2 อันคือ
initialRequest: aRequest
name := (aRequest at: 'name')

ใช้ extract parameter ที่ส่งเข้ามา
โดยเก็บค่าที่ได้ไว้ใน instance variable ที่ชื่อ name
renderContentOn: html
html heading: 'Hello ', (self name)

อันนี้เป็น method ที่ใช้ในการ render

ทดลองสั่ง ab -n 300 -c 100
ผลลัพท์ที่ได้ ถ้า run บน squeak
ก็จะเกิด exception บานตะไท
ลดเหลือ -c 10 ถึงจะ run ผ่าน

ด้วยความอยากรู้ว่าถ้าเป็น commercial product หล่ะ
จะเป็นอย่างไร
ก็เลยไป load VisualWorks
ของ Cincom Smalltalk มาลองดู
(มันเป็น dual license, ถ้าเป็น research, learning
ก็จะ free)
ได้ผลลัพท์ดังนี้

Server Software:
Server Hostname: 127.0.0.1
Server Port: 8008

Document Path: /seaside/go/hello?name=world
Document Length: 1644 bytes

Concurrency Level: 100
Time taken for tests: 2.806422 seconds
Complete requests: 300
Failed requests: 0
Write errors: 0
Total transferred: 580056 bytes
HTML transferred: 493200 bytes
Requests per second: 106.90 [#/sec] (mean)
Time per request: 935.474 [ms] (mean)
Time per request: 9.355 [ms] (mean, across all concurrent requests)
Transfer rate: 201.68 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 6 9.8 0 25
Processing: 633 874 98.2 900 992
Waiting: 631 873 98.1 899 991
Total: 658 880 89.2 900 992

Percentage of the requests served within a certain time (ms)
50% 900
66% 933
75% 962
80% 963
90% 968
95% 977
98% 984
99% 985
100% 992 (longest request)

ข้อสังเกต
  • document length ที่ได้ใหญ่มาก
    เพราะว่า seaside มัน generate อะไรต่อมิอะไรให้เยอะแยะเชียว
  • ช่วงเวลาระหว่างกลุ่ม 50% แรก กับที่เหลือ ต่างกันนิดเดียว?

Related link from Roti

New way to config spring bean.

Rod Johnson เสนอ Idea ใหม่ในการ config spring bean
โดยใช้ annotation เข้ามาช่วย
ฟังเผินๆ ก็ดูไม่มีอะไรใหม่
แต่ลองดูวิธีที่เขา config ดูเสียก่อน
@Configuration
public class MyConfig {
@Bean
public Person rod() {
return new Person("Rod Johnson");
}
@Bean(scope = Scope.PROTOTYPE)
public Book book() {
Book book = new Book("Expert One-on-One J2EE Design and Development");
book.setAuthor(rod()); // rod() method is actually a bean reference !
return book;
}
}

จะเห็นว่าเขาไม่ได้ปน annotation เข้าไปกับ bean code ตรงๆ
แต่เป็นการแยก configuration ออกมาต่างหาก
ทำให้ออกไปในแนวของ DSL

ข้อดีที่แน่นอนอย่างหนึ่ง ก็คือ spelling
เป็น java class อย่างนี้แล้ว
ไม่มีกรณีสะกดผิดแน่นอน

Related link from Roti