Friday, October 05, 2007

java กับ erlang

วันก่อนเห็น java guy บ่นเรื่อง Erlang
แต่ก็ไม่ได้สนใจอ่าน
(คนอะไร ยังไม่ทันมีประสบการณ์เลย บ่นถึงข้อเสียได้เป็นฉากๆ)

วันนี้เห็น Aristotle Pagaltzis เขาเขียนล้อเลียนสั้นๆ
Plus ça change
มีอารมณ์ชัน และเสียดสีดี

Related link from Roti

Thursday, October 04, 2007

ประกันสังคม

อาจารย์ผมเขียนเกี่ยวกับประกันสังคมไว้ใน mail ของบริษัทฯ
เนื้อหามันไม่ได้จำกัดอยู่กับคนในบริษัทฯ ก็เลยคัดลอกมาให้อ่านกัน

ผู้ใช้แรงงาน(รวมมนุษย์เงินเดือนบางพวก) เป็นผู้มีฐานะทางสังคมระดับล่าง มีจำนวนมาก รวมกันไม่ติด อ่อนแอ ไม่มีอำนาจต่อรอง

ระบบประกันสังคม เป็นระบบลงขันตามสัดส่วนรายได้ แล้วจ่ายคืนในรูปสวัสติการพื้นฐาน เช่น รักษาพยาบาล

หลอกให้เชื่อว่า ให้หลักประกันชราภาพ (แต่สะสมเงินสมทบแบบจำกัด จึงจ่ายคืนแบบจำกัด) ทั้ง ๆ ที่ไม่สามารถดำรงชีวิตอยู่ได้จากเงินรับกรณีชราภาพ แล้วถ้าคำนวณเป็น จะรู้ว่า เงินกองทุนชราภาพจะไม่พอจ่าย เพราะ (สมทบเดือนละ 1.5% + อีกเท่าตัวจากนายจ้าง แล้วได้รับบำนาญต่อเดือน 15% ของเฉลี่ย 60 เดือนสุดท้าย สูงสุด 2,250 บาท) ส่งสมทบ 1 ปี จ่ายคืนได้แค่ 2 เดือนกว่าก็หมด ทำงานมา 30 ปี จ่ายคืนได้ 72 เดือน(6 ปี) ส่วนที่สมทบไว้หมดแล้ว ดอกผลไม่มากพอ แต่คนอายุยืนกว่า 61 ปี (สิทธิชราภาพ เริ่มได้เมื่อไม่ทำงานหลังอายุครบ 55 ปี)

เรื่องประกันสังคม ต่อไปจะเป็นปัญหาสังคม เมื่อกองทุนไม่มั่นคง แต่ตอนนี้ปัญหายังซุกตัวอยู่ใน ภูเขาน้ำแข็ง คนส่วนใหญ่เห็นเม็ดเงินสะสมมูลค่ามาก เพราะ สิทธิประโยชน์ชราภาพยังไม่เกิดเต็มที่ คนที่เกษียณตอนนี้ กรณีสมทบไม่เกิน 12 เดือน จะได้รับบำเน็จเอาเงินก้อนที่สมทบไว้ คืนกลับไปบวกดอกเบี้ยนิดหน่อย (ถ้าสมทบเกิน 12 เดือน แต่ไม่ถึง 180 เดือน ได้คืนส่วนของนายจ้างด้วย) ปลายปี 2556 จึงจะเริ่มได้สิทธิบำนาญ เมื่อถึงเวลานั้น เงินกองทุนชราภาพ จะเริ่มหดหาย ซึ่งอาจจะยังไม่รู้สึก เพราะ เงินเข้ายังมากกว่าเงินออก ต้องผ่านไป 10 ปี 20 ปี เมื่อคนเกษียณมากขึ้น แล้วไม่ตายง่าย จนหมุนเงินเข้าไม่ทันเงินออก จึงจะเริ่มเห็นอาการเงินกองทุนหด แต่เพราะเวลายังอีกนาน จะยังไม่มีใครร้อนตัวตอนนี้ พวกลูกจ้างจะเรียกร้องสิทธิประโยชน์เพิ่ม โรงพยาบาลจะเก็บเงินเพิ่ม พวกเหลือบจะมาดูดเงินจากกองทุน

ผมอายุยืนไม่ถึง ที่จะเห็นปัญหาปูดขึ้นมา

การประกันสังคม เป็นลักษณะการออมแบบหนึ่ง (กองทุนสำรองเลี้ยงชีพ ก็เช่นเดียวกัน) แต่การออมแบบนี้ บรรเทาความวิกฤตทางสังคมได้หน่อยหนึ่ง ไม่พอเลี้ยงชีพเมื่อยามแก่เฒ่า

ถ้าผู้ใช้แรงงานเป็นคนแก่ ไม่มีลูกหลานเลี้ยงดู ก็อยู่ไม่ได้ ถ้าลูกหลาน ยังไม่เปลี่ยนฐานะจากผู้ใช้แรงงาน เป็นฐานะอื่นที่ดีกว่า ก็อาจดูแลได้จำกัด เพราะ ลำพังตัวผู้ใช้แรงงาน ดูแลตัวเอง ก็ลำบาก

ยุคอุตสาหกรรม ผู้ใช้แรงงานในโรงงาน เป็นผู้หนุนความมั่งคั่งให้นายทุน

Knowledge worker คือ ผู้มีการศึกษา ต่างจากผู้ใช้แรงงานในโรงงาน พวกนี้มีพัฒนาการสูงกว่า (แต่สำหรับประเทศไทย เราขยับตัวด้านการศึกษาช้าเกินไป เหมือนกับเป็นคนหลับ ถึงตอนนี้ ก็ยังไม่ตื่น สะลึมสะลือ งัวเงีย เราหลงผิดว่าเราทำดีที่สุดแล้ว เพราะ ประเทศเราอุดมสมบูรณ์ เราจึงไม่ค่อยกระตือรือร้น )

ในส่วนที่เกี่ยวกับประกันสังคม บริษัทของเราจ่ายเงินสมทบ มากกว่ารับประโยชน์คืน พนักงานส่วนใหญ่เป็น Knowledge worker แต่พวกเราบางคนอาจจะยังไม่ตระหนักว่า เราจะต้องรู้จักออมมากกว่าที่เป็นอยู่ สังคมรอบข้าง มีวัตถุหลอกล่อให้เราหลงไหลง่าย เราต้องรู้จักอดกลั้นต่อสิ่งยั่วกิเลส ยั่วความฟุ้งเฟ้อ เราต้องนึกถึงวันข้างหน้าที่อาจไม่แน่นอน ต้องเผื่อเหนียว กลัวอด เราจะไปหวังพึ่งเงินบำนาญชราภาพจากประกันสังคมไม่ได้ อนาคตอยู่ในมือเราเอง แต่เราร่วมมือกันหนักแน่น จะแข็งแรงกว่าคนเดียวหรือจับมือแบบหลวม ๆ

ดร. สุริยัน ติษยาฐิคม

Related link from Roti

Wednesday, October 03, 2007

Dojo Tree

การใช้ dijit.Tree
ใน dojo0.9, มีการ re-design Tree Widget ใหม่
โดย copy code เดิมมาจาก TreeV3 ใน dojo 0.4
แล้วปรับเปลี่ยนวิธี define item ใน tree เสียใหม่
โดยเปลี่ยนไปใช้ abstraction ที่ชื่อ Store
เป็นผู้ทำหน้าที่ provide data ให้กับ Tree

ลองดู use case แบบง่ายสุดก่อน
เริ่มด้วยการ define Data ที่จะใช้เป็น model ในการสร้าง Tree
      var treeData = {
label: "name",
identifier: "id",
items: [
{ id: 1, name: "Micro-X", children: [
{ id: 3, name: "Developement" },
{ id: 4, name: "R&D" }
] },
{ id: 2, name: "Ingres", children: [
{ id: 5, name: "Marketing" }
] }
]
}

var store = new dojo.data.ItemFileReadStore({ data: treeData });

Attributes หลักๆที่ Store ต้องการก็คือ
  • label จะใช้กำหนดว่า เวลา render Tree Node แล้ว
    ค่าที่แสดงเป็น label จะนำมาจาก attribute ที่ชื่ออะไร
  • identifier ใช้กำหนดว่า attribute name ไหน represent unique key ใน dataset
  • items ตัวเนื้อ data ที่ represent tree node

เมื่อ define Store แล้ว ก็สามารถนำไป feed ให้ Tree Widget ของเราได้
    <div dojoType="dijit.Tree" store="store" id="tree" label="Company">
</div>


แค่นี้ก็ได้ Tree หน้าตาแบบนี้ออกมา



ตัว Tree Widget นี้ มันมี extension point ให้เรา extend functional หลายตัว เช่น
ถ้าเราต้องการ ดัก click event
เราสามารถ override หรือ connect onClick ได้ดังนี้
    <div dojoType="dijit.Tree" store="store" id="tree" label="Company">
<script type="dojo/connect" event="onClick" args="item">
console.debug(item.name);
var name = store.getValue(item, "name");
console.debug(name);
</script>
</div>

ปัญหาก็คือ ตัว Store มันเปลี่ยนรูป Data ที่เรา feed เข้าไป (นัยว่าเพื่อ optimize อะไรบางอย่าง)
ถ้าเราใช้ item.name เพื่อดึงค่าขึ้นมา, ค่าที่ได้จะได้ datatype เป็น array แทนที่จะเป็น string ธรรมดา (ตามที่เรา declare ไว้)
ดังนั้นก่อนที่จะนำค่าจาก item ไปใช้ ก็เลยต้องมี wrapper code นี้พอกลงแบบนี้
store.getValue(item, "name")
Note: อันนี้นับว่าเป็นข้อเสียของ Tree api นี้อย่างมาก, implementation ควรจะซ่อนให้พ้นสายตาจากคนใช้

จุด extension อื่นๆ ก็มีอย่างเช่น
ถ้าต้องการ customize Label
    <div dojoType="dijit.Tree" store="store2" id="tree2" label="Company">
<script type="dojo/method" event="getLabel" args="item">
return store2.getValue(item, "name") + "_hi";
</script>
</div>

ข้อจำกัดอีกอย่างของ Tree Label ก็คือ มันแสดงได้เฉพาะ Plain Text เท่านั้น
ถ้าต้องการอะไรที่ดูดีขึ้น เช่นเปลี่ยนสี
ก็ให้ไปใช้ css class ช่วยแทน โดยทำการ override method getLabelClass
    <div dojoType="dijit.Tree" store="store4" id="tree4" label="Company" childrenAttr="children,staffs">
<script type="dojo/method" event="getLabelClass" args="item">
if (item) {
if (this.store.getValue(item, "type") == 'employee') {
return "employee";
}
}
return "";
</script>
</div>

Note: ใครที่จะ test ตรงนี้ ให้ระวังว่า ช่วงนี้มีการ refactor อยู่
ทำให้ code ในส่วนนี้หายไปจาก trunk, ผมกำลังรอ submit patch อยู่

ประเด็นที่น่าสนใจของ tree model ก็คือ เราสามารถ share node ได้
โดยการใช้ _reference attribute
      var treeData2 = {
label: "name",
identifier: "id",
items: [
{ id: 1, name: "Micro-X", children: [
{ id: 3, name: "Developement" },
{ id: 4, name: "R&D" }
] },
{ id: 2, name: "Ingres", children: [
{ _reference: { id: 3 }},
{ id: 5, name: "Marketing" }
] }
]
}

node "Development" ก็จะถูก share ใช้ร่วมกัน
แต่ข้อสงสัยที่ตามมาก็คือ use case ไหน? ที่มันจำเป็นต้องทำแบบนี้

นอกจากนี้ยังมี feature แปลกๆอีกเช่น
เราสามารถกำหนด attribute name ของ child element ได้มากกว่า 1 (default คือ "children")
เช่น data ชุดนี้ มี child element อยู่ 2 แบบ (children และ staffs)
เข้าใจว่า feature นี้มีไว้ สำหรับกรณี Tree ที่ mix content จากหลายๆ class
      var treeData4 = {
label: "name",
identifier: "id",
items: [
{ type: "company", id: 1, name: "Micro-X", children: [
{ type: "department",
id: 3, name: "Developement",
staffs: [
{type: "employee", id: 100, name: "pok"}
]
},
{ type: "department",
id: 4, name: "R&D",
staffs: [
{type: "employee", id: 101, name: "kob"}
]
}
] },
{ type: "company", id: 2, name: "Ingres", children: [
{ _reference: { id: 3 }},
{ type: "department", id: 5, name: "Marketing" }
] }
]
}

เวลาใช้ เราก็ต้องกำหนด childrenAttr ให้ Tree ด้วย
    <div dojoType="dijit.Tree" store="store3" id="tree3" label="Company" childrenAttr="children,staffs">
</div>

Related link from Roti

Monday, October 01, 2007

Dojo ???

ท่ามกลางทะเล framework และ library ที่มากมาย
ในยุค information overload นี้
สิ่งที่มักจะเกิดในใจของผมก็คือ
"เราเลือกใช้ถูกตัวหรือเปล่า"
"มีตัวอื่นที่ดีกว่านี้หรือเปล่า"

ตอนที่ใช้ Dojo ก็เช่นกัน
เลือกเพราะอ่าน code แล้วมันติดใจ, เขียน code แล้วสนุก
ใช้ไปนานๆเข้า
framework ตัวอื่นๆก็เริ่ม เตะตา (เตะบ่อยด้วย)
JQuery ก็มีคนชมเยอะ
Ext ก็สวยเสียเหลือเกิน
...

แต่ความรู้สึกพวกนี้ ก็ลดลงได้
เวลาเจอคนอื่นที่ใช้เหมือนเรา
อย่างเดือนที่ผ่านมา
อย่างน้อยก็เจอ site ใหญ่ที่ใช้ dojo เพิ่มขึ้น
  • beta.bloglines.com -> ใช้ dojo0.9 แต่โทษที UI ไม่สวยเลย
  • store.apple.com -> ใช้ dojo รุ่นโบราณมาก 0.4.0
    แถมยัง load library อะไรมาเยอะแยะไปหมดเลย ซึ่งแต่ละหน้าใช้จริงๆไม่เท่าไร
    คนเขียนเขาไม่ได้ใช้ custom build ซึ่งจะช่วยลดจำนวน file ที่ต้อง load ลง

Related link from Roti