Friday, August 04, 2006

Tapestry Asset

Asset ในความหมายที่ Tapestry ใช้ ก็คือ binary หรือ text file ที่ browser ต้องการใช้
ไม่ว่าจะเป็น image file, javascript file, css file ฯลฯ

การที่ Tapestry define Asset ออกมาเป็นเรื่องเป็นราวแบบนี้
อย่างน้อยก็ช่วยให้เราจัดการกับ Resource File ได้ง่ายขึ้น
เช่นแทนที่จะยุ่งกับ physical file โดยตรง ก็ไปจัดการผ่าน Logical file แทน
ทำให้จัดการเรื่องพวก internationalize ได้ง่ายขึ้น
(พวกเปลี่ยนรูปที่แสดง ตาม locale ของ user)
รวมทั้งทำเรื่อง dynamic asset ณ runtime ได้ง่ายขึ้น

Tapestry แบ่งที่มาของ Asset ออกเป็น 2 ประเภทคือ
  • Context Asset
    asset ที่อยู่ใน Context Directory ของ Web application
  • Classpath Asset
    asset ที่อยู่ใน classpath ไม่ว่าจะเป็นใน WEB-INF/classes หรือใน jar ต่างๆ

asset ประเภท Context Asset ถือเป็นเรื่องปกติธรรมดาอยู่แล้วไม่มีประเด็นให้พูดถึง
แต่ asset ประเภท classpath นี่สิ มีประโยชน์มากในแง่ของการ reuse
เพราะช่วยให้เราเขียน component เป็น module (ภายในมีทั้ง html, gif, javascript, ฯลฯ)
ที่นำมาใช้ใหม่ได้่ง่าย

การเข้าถึง Classpath Asset จะทำผ่าน AssetService
โดย url ที่ใช้เข้าถึงจะมีหน้าตาแปลกๆแบบนี้

http://localhost:8080/fin/app?digest=ff8e3332b16d745764befd7c6956ad9a&path=%2Fwcf%2Fweb%2Fjs%2Fwcfutil.js&service=asset

สังเกตว่ามี parameter ที่ชื่อ digest อยู่ด้วย
ทำไมต้องมีค่า digest ด้วย?

มูลเหตุที่ต้องมี digest แปะมา ก็เพื่อป้องกันไม่ให้ผู้ไม่หวังดี
ใช้ service นี้ไปดึงเอาพวก class file ออกมาตามใจชอบ
(เนื่องจาก service นี้สามารถดึงเอาอะไรก็ได้ที่อยู่ใน classpath)

ประเด็นหนึ่งของการมี checksum แปะแบบนี้ก็คือ
มันจะกิน cpu time ทุกครั้งที่มีการ request asset นี้
Tapestry ก็เลยออกแบบให้มี cache ในส่วน generate digest

ผลพลอยได้ที่มาโดยไม่ตั้งใจ ก็คือ เมื่อเนื้อหา file เปลี่ยน
ค่า digest ก็จะเปลี่ยนไปได้วย (แต่ต้อง clear cache ก่อน)
ทำให้เราไม่เจอปัญหาเรื่อง browser cache
(เหมือนกับที่ rails generate timestamp แปะท้าย url
ที่ request ขอ javascript ก็เพื่อป้องกันปัญหานี้เหมือนกัน)

ปัญหาของการมี digest อีกอย่างก็คือ
link ทุก link ต้องเกิดจากการ generate ของ server
(เพราะ server จะต้องแปะค่า digest ให้)
ทำให้เราไม่สามารถใช้ javascript load ข้อมูลแบบ dynamic ได้
(dojo ใช้กลไกการ load แบบ dynamic)

เพื่อแก้ปัญหานี้ Tapestry4.1 ก็เลยมีการเพิ่ม feature UnprotectedAssets
เพื่อให้เราเลือก config ได้ว่า Asset กลุ่มไหนต้องมี Digest
กลุ่มไหนที่ไม่ต้องมี Digest

Related link from Roti

Wednesday, August 02, 2006

Tapestry4.1

Tapestry 4.1 release ออกมาแล้ว
version นี้มีจุดที่น่าสนใจก็คือ
  • integrate dojo toolkit เข้าไปใน framework เลย
    ลองดูตัวอย่างในเอกสารเขา

    สมมติเรามี html นี้อยู่
    <div id="foo">Hello</div>

    ถ้าเราอยากดัก event onMouseOver
    โดยถ้า event เกิดแล้วให้ไป trig listener ที่อยู่บน server side
    @EventListener(elements = "foo", events = "onMouseOver")
    public void watchText() {
    ...
    }

    แค่นี้เอง

    กลไกภายในที่เกิดขึ้นข้างใน
    ก็ประมาณว่า จะมีการร้อย event ที่เกิดใน DOM
    เข้ากับ dojoEvent ซึ่งจะทำการ trig ไปยัง tapestry service
    ซึ่งจะ call เข้าหา method ที่ต้องการให้
  • สามารถ render ผลลัพท์เป็น JSON ได้
  • bundle dojo อยู่ใน tapestry.jar เรียบร้อย
    ไม่ต้อง download ติดตั้ง
  • กลไกในส่วน client validation เปลี่ยนไป implement ด้วย dojo
  • มีการ map dojo widget เข้าเป็น tapestry component จำนวนหนึ่ง
    ทำให้สะดวกในการใช้มากยิ่งขึ้น

ฮ่วย ออกช้าไปสองเดือน
เมื่อสองเดือนที่แล้ว ผมนั่งปวดหัวกับการ integrate dojo + tapestry4.0 + JSON

Related link from Roti

Tuesday, August 01, 2006

Programming by Coincidence

เห็นที่ bact' comment ไว้ใน Prototype กับ Legacy javascript project
ก็เลยนึกถึงประโยคนี้ "Programming by Coincidence"
(อ่านเจอในหนังสือ The Pragmatic Programmer)

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

ปัญหาก็คือ บางทีเราไม่รู้ว่า ทำไมมันถึง run ได้
อันนี้เป็นที่มาของคำว่า Coincidence (บังเอิญ, ประจวบเหมาะ)
ที่แย่กว่านั้น ก็คือด้วยความเร่งรีบ หรือความชุ่ยก็แล้วแต่
แทนที่จะทำความเข้าใจว่าทำไมมันถึงทำงานได้
กลับถือโอกาสข้ามมันไปเสีย
ที่สนุกกว่านั้น ก็คือคนใหม่ๆที่ตามมา เห็นพี่ๆเขียนอย่างนั้น
ก็ลอกๆกันต่อ

มาช่วงนี้ ผมมีงานที่ต้อง port โปรแกรมเก่า ขึ้นมาสู่ technology ใหม่
ทำให้ได้มีโอกาสกลับไปนั่งแกะโปรแกรมที่ตัวเองและน้องๆเขียนไว้เมื่อ 7-8 ปีก่อน,
คราวนี้แหล่ะเห็นชัดเลย
"programming by coincidence" เต็มๆ
บอกได้คำเดียวว่า "น่ากลัวมาก"

ปล. ว่าจะเอาพวก JML มาแก้ทางพวกน้องๆที่บริษัทฯ
ที่มีแนวไปในทาง Programming by Coincidence

Related link from Roti

นิ้ว

ช่วงนี้โปรเจคที่ผมทำมา 2 เดือน เริ่มเกิด Momentum แล้ว
วันนี้นั่งเขียนโปรแกรมจนเมื่อยนิ้วเลย
(ถ้าเป็นช่วงแรกๆ ต้องเสียเวลาไปนั่งไตร่ตรอง
กับนั่งเปิดเอกสารเยอะหน่อย)

ตอนนี้เส้นเอ็นที่ต่อจาก forearm ไปนิ้วก้อย เริ่มเกิดอาการตืงๆแล้ว
นี่ขนาดย้ายปุ่ม ctrl ขึ้นมาอยู่ที่ caps lock แล้วนะ

พอปวดนิ้วที ก็เริ่มเปิด net ดู keyboard Kinesis ที
แต่ด้วยราคาระดับ $300 ก็ทำให้ยังตัดใจซื้อไม่ลง

เฮ้อ แก่แล้วก็ยังนี้แหล่ะ
ใช้ linux ก็เมื่อยนิ้วก้อย (ctrl)
ใช้ mac ก็เมื่อยนิ้วโป้ง (cmd)

Related link from Roti

เบรุต



ก่อนและหลังจากโดนยิวโจมตี

ภาพนี้ได้จาก workshop.evolutionzone.com
ตามไปอ่านได้ที่นี่ Geopolitics: Beirut before & after

Related link from Roti