Decimal

เรื่องหนึ่งที่โปรแกรมเมอร์มือใหม่มักจะไม่ระวังกันคือ การใช้ค่าเลขทศนิยมในคอมพิวเตอร์นั้นเป็นฐานสอง ซึ่งไม่ตรงตัวกับการใช้เลขทศนิยมในฐานสิบทั่วๆ ไป ในการเขียนโปรแกรมหนึ่งๆ ที่มีการเปรียบเทียบค่าเลขทศนิยมจึงอาจจะดูดีในการทดสอบ เช่นว่า


print (0.05 + 0.05 == 0.1)
True

เมื่อการทำงานในขั้นต้นทำงานดี โปรแกรมเมอร์อาจจะเชื่อว่าส่วนนี้ทำงานถูกต้องดี จนกระทั่งการทำงานในแบบที่คล้ายๆ กันมีการทำซ้ำจำนวนมากๆ เช่น


d1 = 0.0
for i in range(1000):
d1 += 0.0001
print repr(d1)
1.0000000000000007
print (d1 == 1.0)
False

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

ใน Python 2.4 เป็นต้นมา มีการอิมพลีเมนต์เอกสาร PEP-327 ซึ่งเป็นสเปคของเลขทศนิยมฐานสิบ ที่ทำงานในส่วนนี้ได้ถูกต้องกว่า อย่างในตัวอย่างต่อไปนี้


dec1 = Decimal("0.0");
for i in range(1000):
dec1 += Decimal("0.001")
print repr(dec1)
Decimal("1.000")
print (dec1 == Decimal("1.0"))
True

เท่านี้เราก็จะได้การทำงานที่เป็นไปตามคาดโดยไม่ต้องกังวลความไม่แน่นอนของโปรแกรมอีกต่อไป

 

แก่น

จากบล็อก mk เรื่อง Support Centric Design ผมเชื่อมาเสมอว่า แท้จริงแล้ว ธุรกิจหนึ่งๆ จะดำเนินไปได้ มันเป็นไปด้วยการดำเนินการให้แก่นของธุรกิจนั้นเดินหน้าไปอย่างเต็มที่

ปัญหาคือเรามองแ่ก่นของแต่ละเรื่องไม่เห็น มากกว่าที่ว่าเราแก้ปัญหาไม่ไ้ด้

ผมเชื่อว่าแก่นปัญหาของการศึกษาไทย ไม่ใช่การที่เราจับเด็กท่องจำ หรือไม่มี Child-Center อะไรอย่างนั้น

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

ขณะเดียวกันเล่าปัญหาซอฟท์แวร์ห่วยในวันนี้คืออะไร ผมเรียน Software Engineering มา พบว่ามีกระบวนการหลากหลายที่มุ่งเน้นทั้งคนทำ หรือคนใช้ โดยส่วนตัวแล้วทั้งสองแบบมันทำร้ายคนลงทุนไม่ต่างกันเท่าใหร่เลย

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

กระบวนการที่ดี การรีวิวที่เป็นขั้นตอนต่างหากที่เราควรทำให้มันเกิดขึ้นมากกว่าจะมาเถียงกันว่าจะเอาใจใครดี

คำถามคือถ้าเราแก้ปัญหาเหล่านี้ได้ หมายถึงเราไม่ต้องมองด้านอื่นๆ แล้วอย่างนั้นหรือ….

 

idea

เคยอยากได้ driver จอเสมือนที่ทำงานผ่าน IP ตอนนีก็มีแล้วในชื่อ MaxiVista แต่ตอนนี้อยากได้อีกอย่างคือ driver เมาส์ที่ทำงานข้ามจอได้

ตรงนี้อาจจะทำผ่านโปรโตคอลของ VNC ได้ โดยหากเมาส์มันเลือกข้ามจอไปแล้ว ให้ส่งข้อมูลเข้า VNC แทน

ข้อดีคือเอาสองเครื่องมาวางข้างๆ กัน แล้วทำงานได้จากสองเครื่องเลย ไม่ต้องใช้ KVM ชีวิตน่าจะมีสุขขึ้นเยอะ….

 

Thread-Safe

เวลาเราเขียนโปรแกรมเป็น procedural ตามปรกติ มักจะมีฟังก์ชั่นต่างๆ ที่ช่วยให้เราทำงานได้ง่ายๆ อยู่เยอะ อย่างเช่น strtok ซึ่งก็ทำงานได้ดี

แต่เวลาที่เขียนโปรแกรมแบบ multi-thread การใช้ฟังก์ชั่นพวกนี้สร้างความปวดหัวได้อย่างไ่ม่น่าเชื่อ เช่น เพราะการเรียกใช้ฟังก์ชั่นที่ไม่ได้ระบุว่าเป็น thread-safe จากคนละเธรดกันนั้น อาจะสร้างบั๊กที่ยากจะจับได้ในอนาคต ซึ่งโดยมากมันเกิดอาการ segmentation-fault แบบไม่รู้สาเหตุ พวกมาก็ core dump กันดื้อๆ โดยไม่พูดไม่จา

ใน HP-UX นั้นอิมพลีเมนต์ฟังก์ชั่นที่ไม่ปลอดภันต่อเธรดด้วยการมี Mutex ไว้ในตัว ทำให้มันไม่เกิด SIGENV แต่ใช่ว่าปลอดภัยเพราะเกิด Deadlock เอาได้ง่ายๆ เหมือนกัน

ทางแก้ที่ดีกว่าคือการหลีกเลี่ยงใช้ฟังก์ชั่นเหล่านี้ หากเราไม่มั่นใจว่าฟังก์ชั่นที่เราเขียนจะไม่มีใครเอาไปใช้ในเธรดในอนาคต