Jun 17, 2014

The Angels' Share

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

... ไปแบบไม่รู้อะไรซักอย่างจนกระทั่งเข้าโรงเนี่ยแหละ ถึงรู้ว่ามันคือเรื่อง The Angels' Share ครับ


เนื้อเรื่องกล่าวอันธพาลหนุ่มนายหนึ่งที่ดันไปทำร้ายร่างกายนักศึกษาเข้า แต่ศาลตัดสินลดโทษเหลือแค่ทำงานบริการชุมชน 300 ชั่วโมง เพราะตอนนั้นเขากำลังจะกลายเป็นพ่อของเด็กชายตัวน้อยๆ

ครับ นี่ไม่ใช่หนังบู้ระห่ำแอคชั่นแฟนตาซีชวนฝัน แต่มันคือการต่อสู้ในชีวิตจริงที่ไม่หอมหวานเดินทางเป็นเส้นตรง และไม่แน่ว่าซักวันหนึ่งเราก็อาจต้องประสบพบเจอ

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

ชื่อหนังได้มาจากตอนที่หัวหน้างานพาตัวเอกและผองเพื่อนไปเที่ยวโรงบ่มวิสกี้ ที่ซึ่งคนงานแถวนั้นบอกว่าวิสกี้ในถังไม้โอ๊คจะระเหยหายไปปีละ 2% เปรียบดังเช่นส่วนแบ่งที่มอบให้แก่นางฟ้า

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

สิ่งที่ชอบที่สุดคงหนีไม่พ้นประโยคที่ว่า "หนึ่งเพื่อลิ้มลอง หนึ่งเพื่อสะสม หนึ่งเพื่อแบ่งบัน"

เพราะแม้ชีวิตต้องดิ้นรน แต่ก็อย่าลืมที่จะแบ่งบันสิ่งดีๆ บ้างนะครับ

Jun 7, 2014

ได้ Google+ Custom URL ซักที

จริงๆ Google+ Custom URL นี่ไม่ใช่ของใหม่ มันเปิดตัวตั้งแต่ปลายปี 2012 และขยายวงให้ผู้ใช้ทุกบัญชีตอนปลายปี 2013 อันที่จริงผมก็ได้หลังจากเปิดตัวไม่กี่เดือนนะ แต่ตอนนั้นดันปรับชื่อตามใจไม่ได้ (ใช้ได้อย่างเดียวคือชื่อและนามสกุลจริง) เลยงอน Google ไม่ยอมกดรับชื่อ แล้วก็ดองมาตั้งแต่นั้น

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

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

ก็เลยจัดการเปลี่ยนชื่อจริงเป็น nei และนามสกุลเป็น zod เพราะตอนนั้นเดาว่าตาม policy แล้ว อาจจะปรับตัวอักษรตัวแรกของชื่อ/นามสกุลให้เป็นตัวพิมพ์ใหญ่ ก็เลยแบ่งคำกันไว้ก่อน (จะว่าไป จริงๆ ก็น่าจะแบ่งว่า neiz กับ od นะ :P) หรือถ้าขี้เกียจตัดแบ่งคำ จะใช้นามสกุลเป็นจุดตัวเดียวเพื่อบอกว่าไม่มีนามสกุลก็ได้

ปรากฏว่ารอแค่ 3 วัน ก็ได้ Custom URL อย่างที่ต้องการครับ (ตอนแรกนึกว่าจะนานกว่านี้เสียอีก) ส่วนเรื่องที่เดาว่าอักษรตัวแรกของชื่อ/นามสกุลจะถูกเปลี่ยนเป็นตัวใหญ่นี่คิดผิดแฮะ ให้มาเป็นตัวเล็กหมดเลย ดีมากๆ

ก็เจอกันได้ที่ google.com/+neizod ครับ แม้จะไม่ค่อยได้เล่นเท่าไหร่ แต่เล่นเยอะกว่า Facebook แน่นอน ฮาาา

Jun 1, 2014

การสอนด้วยตัวอย่างที่ดีนั้นยาก

ถ้าช่วงนี้ใครเข้าเว็บ Python.org คงจะเห็นตัวอย่างโค้ดนี้
list = [2, 4, 6, 8]
sum = 0
for num in list:
    sum = sum + num
print("The sum is:", sum)
เรียบง่ายและงดงาม...

แต่ถ้าไปถามคนที่เขียน Python ประจำนี่ด่าตรึมเลย เพราะโค้ดด้านบนนี้มีจุดอ่อนอยู่ 2 ประการ
  1. มีการประกาศชื่อตัวแปร list กับ sum ซึ่งทั้ง 2 ชื่อนี้ เป็นชื่อของฟังก์ชันมาตฐาน ถึงแม้ว่าจะไม่มีข้อห้ามให้ประกาศชื่อซ้ำได้เหมือนกับพวก reserved keyword แต่การทำเช่นนี้ก็บาปมากเพราะ 2 ฟังก์ชันนี้จะไม่สารมารถถูกเรียกใช้ได้โดยง่ายอย่างที่ตัวภาษาออกแบบไว้
  2. Python มีฟังก์ชัน sum สำหรับหาผลรวมของชุดตัวเลขให้ใช้งาน นอกจากจะเขียนได้ง่ายและทำงานเร็วกว่าแล้ว มันยังสร้างสุขลักษณะที่ดีต่อการเขียนโปรแกรมสำหรับใช้งานในโลกจริงด้วย
  3. (ข้อนี้เพิ่มให้ในฐานะนักทฤษฎีคณิตศาสตร์และคอมพิวเตอร์) ขั้นตอนวิธีข้างต้นสามารถพิสูจน์ลดรูปให้เป็น O(1) ได้ ถ้าลำดับเลขนำเข้าเป็นเลขจำนวนเต็มเรียงกันทั้งหมด หรือเป็นเลขคู่เรียงกัน หรือเป็นเลขคี่เรียงกัน
ตัวอย่างนี้จึงเป็นตัวอย่างที่ไม่ค่อยดีในการนำมาสอนเขียนโปรแกรมที่จริงจังหน่อย เพราะว่าโค้ดแบบนี้ไม่ควรเกิดขึ้นในโลกจริงเลย (แน่นอนว่าคนที่ยกตัวอย่างนี้มา อาจแก้ต่างว่าโค้ดนี้มีเจตนาที่จะยกตัวอย่างลูปให้มือใหม่หัดเขียนโปรแกรม ซึ่งโดยส่วนตัวผมไม่ค่อยเห็นด้วยเพราะนี่คือหน้าเว็บที่มีทุกระดับฝีมือมาเยี่ยมเยียน ไม่ใช่บทที่ 1 ในหนังสือ Programming 101)

ถ้าเช่นนั้น แล้วจะมีตัวอย่างแบบไหนที่ดีพอหละ?

ผมคิดว่าตัวอย่างที่ดี เข้าเกณฑ์แค่ข้อเดียวก็พอ คือต้องไม่ทำหน้าที่ซ้ำซ้อนกับสิ่งที่มีอยู่แล้ว (do not reinvent the wheel)

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

โชคดี (?) ที่ Python ยังไม่มีฟังก์ชันผลคูณรวม (product) ทำให้โค้ดในโลกความจริง ที่สามารถนำมาสอนเขียนได้ดังนี้
numbers = [2, 4, 6, 8]
product = 1
for number in numbers:
    product = product * number
print("The product is:", product)
เพราะการสร้างตัวอย่างที่ดีไม่ใช่เรื่องง่ายๆ