ช่วงนี้มีเวลาว่าง ก็เลยลองเล่น Seaside
ซึ่งเป็น web application framework บน smalltalk
,ตัว smalltalk ที่ใช้ก็คือ Squeak
หลังจากทดลองพัฒนา program บน squeak ดู
ก็พบว่า มันให้ความรู้สึกแบบเดียวกับ emacs
นั่นคือความรู้สึก powerful
ที่เกิดจากความสามารถในการ extend สภาพแวดล้อมได้ทันที
ไม่ต้องเข้า cycle แก้ไข -> ปิดโปรแกรม -> เปิดโปรแกรม
ที่เป็นเช่นนี้เพราะ squeak ไม่แยกความแตกต่างระหว่าง
program code กับ program state
ทุกอย่างผสม และทำงานอยู่บน virtual machine เดียวกัน
การ save snapshot ลง image file
นอกจากจะ save program code แล้ว
พวก program state ต่างๆ เช่น undo history
ก็เก็บลง image file ไปด้วย
ทำให้เราสามารถทำแบบนี้ได้ เช่น
วันนี้ save บน mac, พรุ่งนี้เอาไปเปิดบน linux
ไม่พอใจอะไรบางอย่าง เลบสั่ง redo สิ่งที่ทำไปเมื่อวาน
ในช่วงหลังๆที่ concept virtualize เริ่มเป็นที่นิยม
เราเริ่มจะได้ยินคนพูดถึงประเด็น
ของการเก็บสภาพแวดล้อมการพัฒนาลงใน image file
(อาจจะใช้ vmware หรือ xen)
พอจะเขียนโปรแกรม ก็เปิด image file ขึ้นมา
เขียนๆๆๆ จบวันก็ save image file
วันถัดไป พอเปิดขึ้นมาสภาพแวดล้อมทุกอย่างจะเหมือนเมื่อวานหมด ทำงานต่อได้ทันที
หรือวันดีคืนดี อยากย้ายเครื่อง ก็เอาไปแต่ image file
ไม่ต้องไปนั่ง setup เครื่องให้ยุ่งยาก
หรือถ้ามีพนักงานใหม่เข้ามา ก็ copy image file ไปให้
จะได้เริ่มทำงานได้เลย
กลับมาที่ squeak ต่อ
ปัญหาที่พบใน squeak ก็คือเรื่อง version conflict ของ package ต่างๆ
เช่นผมอยากได้ feature x, y แล้วก็ z
โดย x ทำงานได้กับ y version 2.0
แต่ก็ไปติดตรง z จะทำงานได้ต่อเมื่อ y เป็น version 3.0 เท่านั้น
เกิดอาการรักพี่เสียดายน้องขึ้นมาทันที
เล่นมา 2 วัน
ได้ bad knowhow มาอื้อเลย
Friday, December 01, 2006
Wednesday, November 29, 2006
[haskell] currying อีกที
พอรู้จัก currying ก็เลยเริ่มสนุก
ใน tutorial เขาบอกว่า
ดังนั้นประโยค f x y
เวลา evaluate จะทำตามลำดับแบบนี้
((f x) y)
เครื่องหมาย + ก็เป็น function ด้วย
3 + 2 เวลา run ใน haskell
ก็ควรจะเริ่ม evaluate (3 +) ผลลัพท์ที่ได้คือ function
จากนั้นค่อย call function นั้น ด้วย parameter 2 อีกที
ลองดูสิว่าประโยค 3 + 2
เขียนแบบไหนได้อีกบ้าง
Note: ขออภัยแฟนๆ python ที่เอา "many way to do one thing" มาให้ดู
ส่วน statement แบบนี้
เห็นแล้วอย่าสับสน
ใน haskell, (3,2) คือ datatype ชนิด tuple
ไม่ได้เป็น parameter syntax แบบที่เรารู้จัก
ใน tutorial เขาบอกว่า
Haskell only supports one-argument functions.
ดังนั้นประโยค f x y
เวลา evaluate จะทำตามลำดับแบบนี้
((f x) y)
เครื่องหมาย + ก็เป็น function ด้วย
3 + 2 เวลา run ใน haskell
ก็ควรจะเริ่ม evaluate (3 +) ผลลัพท์ที่ได้คือ function
จากนั้นค่อย call function นั้น ด้วย parameter 2 อีกที
ลองดูสิว่าประโยค 3 + 2
เขียนแบบไหนได้อีกบ้าง
(3+) 2
(+3) 2
(+) 3 2
Note: ขออภัยแฟนๆ python ที่เอา "many way to do one thing" มาให้ดู
ส่วน statement แบบนี้
add(3,2)
เห็นแล้วอย่าสับสน
ใน haskell, (3,2) คือ datatype ชนิด tuple
ไม่ได้เป็น parameter syntax แบบที่เรารู้จัก
Related link from Roti
Tuesday, November 28, 2006
Prototype Parameter?
คุณ pete ถามมา
ถ้าใช้ method serialize ใน Form object
มันจะทำให้เราเองครับ
ลองไปทดสอบดูได้ที่ web นี้ครับ
Prototype: Form Serialization and Deserialization
มีหน้าจอให้เราลอง submit ดูด้วย
method ข้างบน มันจะให้ค่าทั้งหมดใน form กลับมา
แต่ถ้าเกิดเราอยากได้แค่ array ของเฉพาะตัวแปรนั้นๆชุดเดียว
ก็ลองดูที่ blog นี้ครับ
Quick Tip: Getting array of checked values using prototype
คือเวลาผมใช้ prototype ส่ง parameter เนี่ยมันก็จะอยู่ในรูป 'name=abcd&surname=refd' ใช่ไหมครับ ที่อยากถามคือถ้าหากผมมีตัวแปรชื่อ check เป็น array รับค่ามาจาก checkbox ในเว็บเพจเนี่ย
การส่งตัวแปรแบบ array สามารถทำได้หรือเปล่าครับ
ถ้าใช้ method serialize ใน Form object
มันจะทำให้เราเองครับ
ลองไปทดสอบดูได้ที่ web นี้ครับ
Prototype: Form Serialization and Deserialization
มีหน้าจอให้เราลอง submit ดูด้วย
method ข้างบน มันจะให้ค่าทั้งหมดใน form กลับมา
แต่ถ้าเกิดเราอยากได้แค่ array ของเฉพาะตัวแปรนั้นๆชุดเดียว
ก็ลองดูที่ blog นี้ครับ
Quick Tip: Getting array of checked values using prototype
Related link from Roti
Maven vs. Ant
ช่วงนี้ mk, community builder ของเรา
เกิดต้องหันมาจับ java
ก็เลย post ตั้งคำถาม ไว้จำนวนหนึ่ง
ผมจะค่อยๆหยิบมาทยอยเขียนตอบ
โดยเริ่มที่คำถาม "Ant กับ Maven ต่างกันอย่างไร"
เริ่มที่ Ant ก่อน
Ant คือ build tool ตัวหนึ่ง
เขียนโดย James Duncan Davidson ซึ่งเป็นคนเขียน Tomcat
วัตถุประสงค์ในตอนแรกที่เขาเขียน ก็ชัดเจนมาก
นั่นคือ ใช้ในการ build tomcat
การทำงานของ ant ก็คล้ายๆพวก makefile ของพวก unix
มีหน้าที่คำ build ให้ได้ target file
ซึ่งอาจจะเป็น jar file, war file, javadoc file, ฯลฯ
ซึ่งแน่นอนว่าประเด็นที่สำคัญในการ build ก็คือ ลำดับการทำงาน
ดังนั้นการเขียน ant ก็คือ การร้อยเรียงลำดับการทำงานต่างๆเข้าด้วยกัน
ที่นี้แล้ว maven หล่ะ
maven ก็มีที่กำเนิดคล้ายๆ ant
โดยเกิดในระหว่างการพัฒนาโปรเจค jakarta turbine
(อันนี้เป็น web framework รุ่นแรกๆของ java)
สาเหตุก็คือเมื่อ project ใหญ่ขึ้นมาก
เรามักจะ split project ออกเป็น sub project ย่อยๆ
project structure มีลักษณะเป็น hierarchy structure
แต่ละ sub project ก็มี team ทำงานแยกกัน
คนที่เคยใช้ ant กับ project ที่มีลักษณะแบบนี้
จะรู้ว่าการ maintain ant file เป็นเรื่องน่ารำคาญใจเรื่องหนึ่งทีเดียว
การเขียน ant script จะใช้วิธี copy & paste ไปมา
ถ้าเปิดดู build file แต่ละตัว ก็จะเห็นว่ามีส่วนที่ซ้ำกันไปซ้ำกันมาเต็มไปหมด
jar file ของ subproject ก็ซ้ำๆกัน
แถมยังถูก check-in เข้า version control
นอกจากนี้ยังต้องทำ ant script ตัวใหญ่
ไว้คอยคุมลำดับการ build ของโปรเจค, ฯลฯ
maven ก็เลยเกิดมา เพื่อเติมรอยโหว่ในจุดนี้
ลองดูวัตถุประสงค์ของ maven
feature ที่ผมชอบใน maven ก็มี
ส่วนที่ไม่ค่อยชอบ
ที่นี้ก็มาถึงคำถามสำหรับการเลือกใช้
สำหรับผมนะ
project เขียนคนเดียว ไม่ยั่งยืน ผมใช้ build ของ IDE
project เล็กๆที่เผยแพร่ให้คนอื่น ใช้ ant
project กลางๆ ถ้ารีบก็ใช้ ant, ถ้าไม่รีบก็ maven
(เนื่องจากการเรียนรู้ maven ใช้เวลามากกว่า ant)
project ใหญ่เป็นเรื่องเป็นราว ใช้ maven
เกิดต้องหันมาจับ java
ก็เลย post ตั้งคำถาม ไว้จำนวนหนึ่ง
ผมจะค่อยๆหยิบมาทยอยเขียนตอบ
โดยเริ่มที่คำถาม "Ant กับ Maven ต่างกันอย่างไร"
เริ่มที่ Ant ก่อน
Ant คือ build tool ตัวหนึ่ง
เขียนโดย James Duncan Davidson ซึ่งเป็นคนเขียน Tomcat
วัตถุประสงค์ในตอนแรกที่เขาเขียน ก็ชัดเจนมาก
นั่นคือ ใช้ในการ build tomcat
การทำงานของ ant ก็คล้ายๆพวก makefile ของพวก unix
มีหน้าที่คำ build ให้ได้ target file
ซึ่งอาจจะเป็น jar file, war file, javadoc file, ฯลฯ
ซึ่งแน่นอนว่าประเด็นที่สำคัญในการ build ก็คือ ลำดับการทำงาน
ดังนั้นการเขียน ant ก็คือ การร้อยเรียงลำดับการทำงานต่างๆเข้าด้วยกัน
ที่นี้แล้ว maven หล่ะ
maven ก็มีที่กำเนิดคล้ายๆ ant
โดยเกิดในระหว่างการพัฒนาโปรเจค jakarta turbine
(อันนี้เป็น web framework รุ่นแรกๆของ java)
สาเหตุก็คือเมื่อ project ใหญ่ขึ้นมาก
เรามักจะ split project ออกเป็น sub project ย่อยๆ
project structure มีลักษณะเป็น hierarchy structure
แต่ละ sub project ก็มี team ทำงานแยกกัน
+ project X
+ sub project Domain
+ sub project Service
+ sub project Web App
+ sub project Main App
+ sub project Admin App
คนที่เคยใช้ ant กับ project ที่มีลักษณะแบบนี้
จะรู้ว่าการ maintain ant file เป็นเรื่องน่ารำคาญใจเรื่องหนึ่งทีเดียว
การเขียน ant script จะใช้วิธี copy & paste ไปมา
ถ้าเปิดดู build file แต่ละตัว ก็จะเห็นว่ามีส่วนที่ซ้ำกันไปซ้ำกันมาเต็มไปหมด
jar file ของ subproject ก็ซ้ำๆกัน
แถมยังถูก check-in เข้า version control
นอกจากนี้ยังต้องทำ ant script ตัวใหญ่
ไว้คอยคุมลำดับการ build ของโปรเจค, ฯลฯ
maven ก็เลยเกิดมา เพื่อเติมรอยโหว่ในจุดนี้
ลองดูวัตถุประสงค์ของ maven
- Making the build process easy
หลักการของ maven ก็คือ ทำอย่างไรให้ช่วงเวลาที่ใช้ในการ setup
build file น้อยที่สุด
อันนี้ก็เลยมี feature พวก archetype,
library repository ที่ช่วยแยก library ออกจาก project - Providing a uniform build system
ถ้าเราเข้าใจกลไกการ build ของ project ที่ใช้ maven อันหนึ่ง
เราก็จะเข้าใจ project อื่นๆที่ใช้ maven ทันที - Providing quality project information
maven ให้ความสำคัญของ กลไกการ generate document จาก code - Providing guidelines for best practices development
อันนี้ค่อนข้างสำคัญ, สมัยแรกๆที่ใช้ ant
project แต่ละ project ก็จะมี idea การวางโครงสร้าง directory, การตั้งชื่อ
กันหลากหลายมาก
ส่วนของ maven ก็เลยกำหนดมาตรฐาน (default, best practices) ขึ้นมาอันหนึ่ง - Allowing transparent migration to new features
ตรงนี้ประสบการณ์ผมไม่ตรงที่โฆษณาไว้
จำได้ว่า maven1.x เคย upgrade version แล้ว build มันมั่ว
ต้องลบทิ้งลงใหม่
feature ที่ผมชอบใน maven ก็มี
- share repository
library ที่เราใช้ใน project ต่างๆ จะรวมเก็บไว้ที่เดียว - transitive dependency
ระบุ dependency เฉพาะตัวที่เราต้องการ
พวกที่เหลือเดี๋ยว maven จะหามาให้เอง - การเขียน build file ในลักษณะ extend
พวก sub project จะ extend คุณสมบัติจาก parent project
ส่วนที่ไม่ค่อยชอบ
- เริ่มต้นไม่ถูก ไม่รู้จะเรียกคำสั่งไหน เมื่อไร
จะรู้ได้ไงว่ามีคำสั่งอะไรใช้บ้าง - การ integrate project ที่มีโครงสร้างแบบ hierarchy
เข้ากับ eclipse (IDE) นี่ มันไม่ธรรมดาเหมือนกัน
ไม่ยาก แต่ก็ไม่สนุก
ที่นี้ก็มาถึงคำถามสำหรับการเลือกใช้
สำหรับผมนะ
project เขียนคนเดียว ไม่ยั่งยืน ผมใช้ build ของ IDE
project เล็กๆที่เผยแพร่ให้คนอื่น ใช้ ant
project กลางๆ ถ้ารีบก็ใช้ ant, ถ้าไม่รีบก็ maven
(เนื่องจากการเรียนรู้ maven ใช้เวลามากกว่า ant)
project ใหญ่เป็นเรื่องเป็นราว ใช้ maven
Related link from Roti
Monday, November 27, 2006
Currying
Christopher Diggins เขาเขียนเรื่อง Typing like a Functional Programme
article นี้ช่วยเฉลยให้ผมเข้าใจเรื่อง currying ขึ้นอีกหน่อย
(เห็นศัพท์นี้บ่อย แต่ไม่ get ว่ามันคืออะไร)
ตัวอย่างที่เขาอธิบายก็คือ
function
ปกติเวลาเราเขียน imperative language เช่น java
ถ้าจะเขียนเป็น functional language (ocaml, haskell, ...)
เราต้อง declare type ก่อน
ซึ่ง type ของ add_ints เขียนได้ดังนี้
อ่านได้ว่า add_ints รับ parameter ชนิด int 2 ตัว
แล้ว return ค่าเป็น int
จะเห็นว่ามันดูแปลกๆ เพราะในความคิดแบบ imperative ของเราแล้ว
มันควรจะเขียนแบบนี้มากกว่า
ที่เป็นเช่นนี้เพราะ ใน Haskell (ขอยกตัวอย่างเฉพาะ haskell) มันพิสดารตรงที่ว่า
ถ้าเรา pass parameter แค่ตัวเดียวให้กับ add_ints version java
ผลก็คือ code จะ compile ไม่ผ่าน
แต่สำหรับกับพวก haskell แล้ว
การ pass parameter ตัวเดียวให้กับ add_ints
มันจะ return กลับมาเป็น function อีก function หนึ่งแทน
โดย function นั้นจะรับ parameter ที่เป็น int ตัวเดียว
และเมื่อเรา call function นั้นอีกทอด เราก็จะได้ผลบวกที่ต้องการ
ลองดูตัวอย่าง
ลอง run ดู
ใครสนใจอ่าน currying ต่อได้ใน wikipedia
article นี้ช่วยเฉลยให้ผมเข้าใจเรื่อง currying ขึ้นอีกหน่อย
(เห็นศัพท์นี้บ่อย แต่ไม่ get ว่ามันคืออะไร)
ตัวอย่างที่เขาอธิบายก็คือ
function
add_ints
ปกติเวลาเราเขียน imperative language เช่น java
add_ints
จะเขียนแบบนี้public int add_ints(int x, int y) { return x + y; }
ถ้าจะเขียนเป็น functional language (ocaml, haskell, ...)
เราต้อง declare type ก่อน
ซึ่ง type ของ add_ints เขียนได้ดังนี้
add_ints: int -> int -> int
อ่านได้ว่า add_ints รับ parameter ชนิด int 2 ตัว
แล้ว return ค่าเป็น int
จะเห็นว่ามันดูแปลกๆ เพราะในความคิดแบบ imperative ของเราแล้ว
มันควรจะเขียนแบบนี้มากกว่า
add_ints: (int , int) -> intadd_ints: (int -> int) -> int
ที่เป็นเช่นนี้เพราะ ใน Haskell (ขอยกตัวอย่างเฉพาะ haskell) มันพิสดารตรงที่ว่า
ถ้าเรา pass parameter แค่ตัวเดียวให้กับ add_ints version java
ผลก็คือ code จะ compile ไม่ผ่าน
แต่สำหรับกับพวก haskell แล้ว
การ pass parameter ตัวเดียวให้กับ add_ints
มันจะ return กลับมาเป็น function อีก function หนึ่งแทน
โดย function นั้นจะรับ parameter ที่เป็น int ตัวเดียว
และเมื่อเรา call function นั้นอีกทอด เราก็จะได้ผลบวกที่ต้องการ
ลองดูตัวอย่าง
add_ints :: int -> int -> int
add_ints x y = x + y
ลอง run ดู
Main> add_ints 1 7
8
Main> (add_ints 2) 4
6
ใครสนใจอ่าน currying ต่อได้ใน wikipedia
Related link from Roti
Emacs Register
สงสัยเรื่อง feature register ใน emacs มานานแล้ว
วันนี้ได้ฤกษ์หาคำตอบสักที
register ใน emacs ก็คือตัวแปรที่เราสามารถ save ค่าต่างๆลงไปได้
โดยปกติเราจะตั้งชื่อให้กับแต่ละ register ด้วยตัวอักษรหนึ่งตัว
ที่นี้ก็มาถึงคำถามถัดไป
แล้วอะไรหล่ะที่เก็บลง register ได้บ้าง
ตรงนี้แหล่ะที่มันดูดี
เนื่องจากเราสามารถเก็บ content ได้หลากหลายเช่น
short-cut ที่เราใช้สร้าง register จะค่อนข้างหลากหลาย
เนื่องจากมีประเภท content ที่เก็บได้หลายแบบ
เช่น ถ้าจะจำหน้าต่างที่เปิดในปัจจุบัน เราจะใช้
ตามด้วยชื่อ register
หรือถ้าจะจำตำแหน่งใน buffer ก็จะใช้
แล้วก็ตามด้วยชื่อ register เช่นกัน
ส่วน short-cut ที่ใช้ กระโดดไปยัง register ที่ต้องการ
จะมีตัวเดียว ใช้ได้กับทุกประเภท content
นั่นคือ
ตอนนี้ที่ผมใช้เป็นหลัก ก็คือการจำ window ที่เปิดไว้
จะได้กระโดดกลับมาที่ layout ที่ต้องการได้ง่ายๆ
วันนี้ได้ฤกษ์หาคำตอบสักที
register ใน emacs ก็คือตัวแปรที่เราสามารถ save ค่าต่างๆลงไปได้
โดยปกติเราจะตั้งชื่อให้กับแต่ละ register ด้วยตัวอักษรหนึ่งตัว
ที่นี้ก็มาถึงคำถามถัดไป
แล้วอะไรหล่ะที่เก็บลง register ได้บ้าง
ตรงนี้แหล่ะที่มันดูดี
เนื่องจากเราสามารถเก็บ content ได้หลากหลายเช่น
- เก็บ String, Number
อันนี้ธรรมดามาก - เก็บ Marker (position ใน buffer)
- Window or Frame configuration position
ใช้เก็บ ตำแหน่งและขนาดของ window หรือ frame - file
ใช้เก็บชื่อ file ทำให้กระโดดไป edit file ที่ต้องการได้ง่ายๆ
short-cut ที่เราใช้สร้าง register จะค่อนข้างหลากหลาย
เนื่องจากมีประเภท content ที่เก็บได้หลายแบบ
เช่น ถ้าจะจำหน้าต่างที่เปิดในปัจจุบัน เราจะใช้
c-x r w
ตามด้วยชื่อ register
หรือถ้าจะจำตำแหน่งใน buffer ก็จะใช้
c-x r <SPC>
แล้วก็ตามด้วยชื่อ register เช่นกัน
ส่วน short-cut ที่ใช้ กระโดดไปยัง register ที่ต้องการ
จะมีตัวเดียว ใช้ได้กับทุกประเภท content
นั่นคือ
c-x r j
ตามด้วยชื่อ registerตอนนี้ที่ผมใช้เป็นหลัก ก็คือการจำ window ที่เปิดไว้
จะได้กระโดดกลับมาที่ layout ที่ต้องการได้ง่ายๆ
Related link from Roti
Sunday, November 26, 2006
Emacs-23
ใครที่เคยใช้ emacs จะมีความรู้สึกอย่างหนึ่งก็คือ
font มันไม่สวยเอาเสียเลย
เนื่องจากมันไม่ใช่ anti-alias
ส่วนตัวผม, ปกติผมใช้ emacs บน mac
emacs บนนั้น, font มันจะเนียนสวยมาก
เวลามาใช้บน linux จะรู้สึกขัดอกขัดใจเล็กน้อย
ตอนนี้ที่ branch
(ซึ่งเขาว่ากันว่า จะเป็น branch สำหรับ emacs version 23)
มีการ merge เอา branch ที่มี feature xft เข้ามาแล้ว
ดังนั้นใครที่ต้องการ emacs xft
ก็ควรจะ checkout ออกจาก branch นี้โดยตรง
ขั้นตอนการ build สามารถอ่านได้ที่นี้
XftGnuEmacs
ผมลองบน ubuntu แล้ว สวยงามดีที่เดี่ยว
font มันไม่สวยเอาเสียเลย
เนื่องจากมันไม่ใช่ anti-alias
ส่วนตัวผม, ปกติผมใช้ emacs บน mac
emacs บนนั้น, font มันจะเนียนสวยมาก
เวลามาใช้บน linux จะรู้สึกขัดอกขัดใจเล็กน้อย
ตอนนี้ที่ branch
emacs-unicode-2
(ซึ่งเขาว่ากันว่า จะเป็น branch สำหรับ emacs version 23)
มีการ merge เอา branch ที่มี feature xft เข้ามาแล้ว
ดังนั้นใครที่ต้องการ emacs xft
ก็ควรจะ checkout ออกจาก branch นี้โดยตรง
ขั้นตอนการ build สามารถอ่านได้ที่นี้
XftGnuEmacs
ผมลองบน ubuntu แล้ว สวยงามดีที่เดี่ยว
Related link from Roti
Subscribe to:
Posts (Atom)