Elance ตลาดงานฟรีแลนซ์

Elance

ประมาณสองเดือนช่วงก่อนย้ายงาน ชีวิตสับสนมากฮะ .. ทำอะไรหลายอย่างไปหมด ตั้งแต่ไปรับงานจากเพื่อนรันทำเว็บ เตรียมตัวสัมภาษณ์งาน แล้วยังมี Elance อีกอันที่หลงเข้าไป~! จะเล่าให้ฟังบลอกนี้ล่ะ

เรื่องมันเริ่มจากผมไปอ่านหนังสือเรื่อง Start Small, Stay Small: A Developer’s Guide to Launching a Startup แนวคิดของหนังสือมันไม่ใช่ Startup ที่อยากจะพลิกโลกหรือเปลี่ยนวิธีทำงานของคนในอุตสาหกรรมจากหลังฝ่าเท้าเป็นหน้ามืออะไรแบบนั้น แต่มันเป็นเรื่องของการหาตลาดเฉพาะกลุ่ม (Niche) แล้วทำ product ออกมาตอบโจทย์คนกลุ่มเล็กๆกลุ่มนั้นให้ได้ดีๆมากกว่า ไม่ต้องไปทำโปรดักส์ที่ target ทุกคน (ซึ่งโอกาสล้มเหลวสูง)

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

Screen Shot 2555-12-30 at 7.55.14 PM

ผมก็คิดในใจ .. นี่มัน “ถูก” จริงรึเปล่าวะ คิดเลขเล่นๆว่าทำวันละ 8 x $15 = $120 มันก็ not bad นะ … มากกว่าเงินเดือนหลายคนด้วยซ้ำ

“อืมม .. ลองไปเป็นแรงงานราคาถูกดีกว่า” ผมเลยหลงเข้าไปใน Elance แบบงงๆ o__O” …

สมัครไปปุ๊บจะต้องมีการยืนยันหลักฐานอะไรกันนิดหน่อย (ผมใช้ใบขับขี่) วิธีรับเงินคือผ่าน Paypal (เหมือนจะมีวิธีอื่นด้วยแต่จำไม่ได้) หลังจากนั้นเราก็จะเข้าไป “ประมูลงาน” ได้

งานใน Elance มีหลากหลายมาก แน่นอนว่าผมสนใจงาน Software Dev แต่อื่นๆก็มีเช่น

  • งานแปลเอกสาร (ไทย อังกฤษ จีน ญี่ปุ่น …)
  • งาน Graphics ออกแบบโลโก ออกแบบเว็บ

ส่วนงาน Software Dev หลายๆอย่างนี่ เข้าขั้น “Sexy” เลยทีเดียว หลายอย่างก็เข้าขั้นน่าเบื่อหรือผิดศีลธรรม ยกตัวอย่างที่เคยเห็น

  • เขียน OpenCV เอาภาพจากกล้องสองตัวมาต่อกันเนียนๆ
  • เขียนโปรแกรมส่ง E-mail หาลูกค้าเยอะๆ คอนฟิก POP3 SMTP ที่จะใช้ได้
  • ไดรเวอร์เสมือนรันบน OS X ให้เป็นเหมือน Speaker เทียม เสียงวิ่งผ่าน network ไปอีกที่นึง
  • โปรแกรมต่อไฟล์เสียง Wav สองไฟล์
  • หาคนเขียน Visual Basic 6 / ColdFusion / Cobol มาแก้โค้ดให้หน่อยจ้าา
  • ต้องการเทพ Ruby มาปั่นเว็บ เป็น contract 6 เดือน

ผมลองประมูลไปทั้งหมดสองงาน (ประมูลก็ต้องใช้ point ใน Elance ด้วย ทำให้เราประมูลหลายๆงานไม่ได้) แต่บอกเลยว่าคู่แข่งเยอะมากๆ ราคาก็ติดดิน

ทีนี้จะทำยังไงให้หน้าใหม่แบบผมได้งาน? ผมเอาเวลาตัวเองเข้าแลก ทำงานที่ยังประมูลไม่ได้ไปส่วนหนึ่งก่อน แล้วเอาไปเขียน proposal ไปแบบอ่านแล้วรู้เลยว่าเราทำได้แน่ๆส่งเข้าไป (มีโค้ดตัวอย่างด้วย!) ส่งไปสองคนก็ได้ผลทั้งสองคน แต่ก็โดนบี้ราคากลับมา (เวลาประมูลจะบอก rate ต่อชั่วโมงของเราไปและเวลาที่จะใช้ เช่น $15 x 4 ชม ฝั่งโน้นก็จะถามว่า 2 ชม ได้มั้ย – -”)

งานสองงานที่ผมรับมาเป็นงานที่อ่านแวบแรกแล้วรู้สึกมันง่ายฮะ แต่ทำไปทำมา มีงานนึงที่ทำแล้วคุ้มมาก อีกงานไม่ค่อยคุ้ม สรุปให้ฟังสั้นๆ

  • งานแรก อ่านตอนแรกไม่คิดว่ายากอะไร แค่เอา C++/CLI มาหุ้ม C++ library ที่มีอยู่แล้ว ปรากฎว่าลูกค้ามาทำให้ complicate ตรงที่จะให้เรา integrate เข้ากับ UI ของเค้าที่มีอยู่ก่อนแล้วด้วย … ซึ่งเขียนไว้ กาก มาก แถมยังมาบีบคั้นกับเราเรื่องอยากให้ performance ดีๆ สุดท้ายผมต้องเขียนอะไรคล้ายๆ Thread Pool เพิ่มไปให้อีก งานนี้ใช้เวลามากกว่าที่ตกลงไว้ โคดไม่คุ้ม
  • งานที่สอง ให้เขียนโปรแกรมต่อ Wave สองอันใน C# แล้วบอกว่าคนประมูลต้องเข้าใจ format AIFF และ Wav บลาบลานะ ไม่งั้นไม่ต้องส่งมา ผมเสนอไปว่าให้ใช้ open source lib ตัวนี้ดูมั้ย ฮีก็โอเค (?) เขียนเสร็จแบบง่ายดาย แต่ตอนหลังเค้าอยากได้ feature normalize เสียงระหว่างสองไฟล์ด้วย เสียเวลากับตรงนั้นไปเยอะเพราะต้องขุด library แต่รู้สึกว่างานนี้คุ้ม

รวมสองงานที่ทำไปแล้วได้เงินเทียบกับเวลามาน้อยมากกกกกกกก T__T แต่เป็นประสบการณ์แปลกๆดี แล้วลูกค้าทั้งสองก็ดูจะพอใจ ให้เรตติ้งเกือบ 5 ดาว แล้วจะเสนองานให้ทำต่ออีก (คงติดใจราคาที่กดได้สินะ หึหึ) แต่ผมบอกไปทั้งคู่ว่าไม่เอาละ เดือนหน้าเปลี่ยนงาน ยุ่ง ไว้โอกาสหน้า :)

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

 

สอบ TOEFL iBT

บลอกย้อนหลังไปหลายเดือนอยู่ -..-’ สอบตั้งแต่ปลายเดือนมิถุนายน

ความตั้งใจตอนแรกตั้งแต่ต้นปี 2012 นี้คือจะเตรียมตัวเรื่องไปเรียนต่อโทให้ได้ อุปสรรคหลักๆมีอยู่สามอย่าง

  1. คะแนน TOEFL
  2. คะแนน GRE (หรือ GMAT ในกรณีที่ไปเรียน Management)
  3. จดหมายแนะนำ (ขอเมเนเจอร์กับอาจารย์ที่คณะ)

เอาจริงๆผมหาตัวเองไม่เจอว่าอยากจะไปเรียนต่ออะไร? และที่ยากกว่านั้นคือเรียนต่อจบมาแล้วจะให้ทำอะไร?

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

อย่างไรก็ตาม ไม่ว่าจะไปเรียนสายอะไรก็ต้องสอบ TOEFL เป็นด่านแรก ปัจจุบันเป็นระบบ iBT มีด่านสำคัญสี่ด่าน

  • Reading
  • Listening
  • Speaking
  • Writing

Writing

อย่างแรกที่ผมเตรียมตัวคือ Writing ซึ่งเตรียมไว้เนิ่นๆมากตั้งแต่ปลายปี 54 (ห่างจากเวลาสอบเยอะพอควร) สำหรับการเขียน Essay ใน part นี้เป็นอะไรที่เตรียมตัวด้วยตัวเองยากมาก เพราะต้องหาคนรีวิวงานเขียนของเราให้ และชี้ว่าตรงไหนถูกผิด อีกทั้งในการสอบจริงเวลามันก็มีจำกัด ดังนั้นต้องฝึกเขียนให้คล่อง

ระหว่างหาข้อมูลผมไปเจอกับ ACM Writing โดยพี่ Joe เข้า รู้สึกถูกฉโลก >_< คือผมเป็นคนไม่ชอบไปเดินทางไปเข้า class เป็นเวลาๆ (เพราะชีวิตเอาแน่เอานอนไม่ได้) อีกอย่างเราก็อยากได้แค่คนรีวิวงาน ไม่ได้อยากได้คนมาสอนแกรมมาร์หรืออะไรทำนองนั้น การเรียนผ่านอีเมล์กับพี่ Joe ก็เลยเหมาะ จบคอร์สมาก็ได้ความมั่นใจเพิ่มขึ้นพอสมควร และก็มีคนชี้จุดที่เราทำผิดบ่อยๆให้ อย่างไรก็ตามผมรู้สึกว่าถ้าจะเรียนกับพี่ Joe ให้ได้ประโยชน์เต็มที่ผู้เรียนก็ต้องพร้อมระดับนึง ถ้าไปแบบเป็น 0 คงไม่ได้อะไร ไปหาคอร์สนั่งเรียนจะดีกว่า

Reading & Listening

อันนี้เป็นส่วนที่ฝึกเองได้ง่ายมาก แค่เอาข้อสอบมาทำ แล้วก็ฝึกทำในโปรแกรม simulation (มักจะแถมมากับหนังสือ)​ ผมใช้หนังสือสองเล่ม

  • Cracking the TOEFL iBT (Princeton Review) เล่มนี้ตรงประเด็น กระชับ ภาษาอ่านง่ายเหมือนเพื่อนเล่าให้ฟัง (ดีป่าวหว่า)​ สอนเทคนิค ผมรู้สึกได้อะไรจากเล่มนี้เยอะสำหรับอะไรที่เป็นเรื่องเทคนิคทำข้อสอบ เค้าแถม audio CD มาให้ข้างในมี MP3 ไม่มีซอฟแวร์
  • Cambridge Preparation for the TOEFL Test เล่มนี้จะมีพาร์ทที่เป็นการปูพื้นฐานเยอะ สอนแกรมมาร์ แต่ผมรู้สึกว่ามันน้ำท่วมทุ่งมากๆ ที่เด็ดคือซอฟแวร์ simulation ซึ่ง interface เหมือนกับที่ใช้สอบจริงมาก ขอบ่นนิดหน่อยว่า CD มันก็อปปี้ยาก ทำ image ออกมาแล้วใช้ไม่ได้ซะงั้น – -’

สำหรับสองพาร์ทนี้เน้นฝึก ฝึก ฝึก และฝึก อย่างเดียวครับ ทำให้เยอะๆเข้าไว้

Speaking

พาร์ทนี้ล่ะที่เป็นผู้ร้ายตัวจริง! เป็นพาร์ทที่คนมีปัญหาด้วยมากที่สุด และควรให้เวลาฝึกเยอะหน่อย

นอกจากคำแนะนำในหนังสือสองเล่มข้างบนแล้ว ผมแนะนำวิดีโอของ Joseph Miranda (Notefull.com) ผมได้ประโยชน์จากวิดีโอของเฮียแกมากๆ ซึ่งคำถามใน TOEFL iBT Speaking มันมีแพทเทิร์นที่เกือบจะชัดเจนของทั้ง 6 คำถาม

อันที่แปะไว้ข้างล่างนี้เป็น strategy ของ Question 1 ให้ลองไล่ดูไปเรื่อยๆจนถึง Question 6 แล้วพยายามสรุป template วิธีพูดของตัวเองสำหรับทั้ง 6 คำถามให้ชัดเจน แล้วไปฝึกจับเวลาทำของจริง (หมายถึง simulation) ที่มันจะทำให้เราแตกตื่นคือเรื่องการจับเวลานี่ล่ะ รุ่นใหญ่ใจต้องนิ่งนิดนึง = =’

ผมชอบวิดีโอของ Joseph มากๆ มากจนตามไปซื้อคอร์ส Speaking ในเว็บของเฮียมาในราคาประมาณ $10 (ถือเป็นการ tip) เพราะรู้สึกว่าได้ประโยชน์มากจริงๆ

คำถามที่ 1 กับ 2 มักจะเป็นคำถามปลายเปิด (เช่น เล่าเรื่องทักษะใหม่ที่เพิ่งเรียนรู้มาเมื่อปิดเทอมก่อน หรืออาจารย์ในอุดมคติเป็นยังไง??) สิ่งหนึ่งที่ควรเข้าใจคือ ไม่ต้องตอบให้ตรงความเป็นจริงก็ได้ ให้แต่งเรื่อง on the fly ไปเลย อะไรที่ทำให้เราสามารถพูดเหตุผลที่ make sense และทันเวลาให้พูดไปเลย จะสมมติว่าตัวเองเป็นนักเรียนหรือช่างซ่อมรถก็ได้

ผมฝึกพูดอยู่ที่บ้านคนเดียว เอาไอโฟนอัดเสียงตัวเองแล้วมาฟังอยู่ประมาณสองอาทิตย์ก่อนสอบ = =’

วันสอบ

ผมเลือกไปสอบที่ American Way English School ตามคำแนะนำของบลอกน้องแก้ว (พยายาม scheule ให้ได้ศูนย์นี้มากๆ) ไม่เคยไปสอบสนามอื่นเลยก็ไม่รู้จะแนะนำยังไง แต่ก็รู้สึกว่าที่ AWE อุปกรณ์ก็โอเค ถ้าจะมีเรื่องบ่นคงมีเรื่องเดียวคือตอนสอบ Speaking เสียงคนอื่นพูดดังเต็มห้องไปหมดเพราะนั่งใกล้กัน เราต้องจดจ่อกับการสอบของเราให้ดีแล้วไม่ต้องไปสนใจคนอื่น ซึ่งผมคิดว่าทำได้ไม่ยากนัก

ผลสอบ

คะแนนมาประมาณ 2 อาทิตย์หลังสอบ ปรากฎว่า ..

Test Test Date Reading Listening Speaking Writing Total
TELXML Sat Jun 30 09:37:24 EDT 2012 30 29 23 25 107

ได้คะแนนรวมออกมา 107 โดยที่ Reading กับ Listening เกือบเต็ม~ ส่วนอีกสองอันเกิน 20 ก็ดีใจแล้ว T_T ผมดีใจกับคะแนนมากๆ เอาจริงๆคือมันแอบฟลุ๊คที่ Reading กับ Listening กดไปซะเยอะ  สำหรับเพื่อนๆวิศวคอมกลุ่มที่สนิทกันการได้ TOEFL iBT เกิน 100 จาก 120 นี่ถือเป็น gold standard แล้ว (บางคนก็ aim สูงกว่านี้ ขึ้นกับคณะและมหาลัยในฝัน) ดังนั้นถ้าจะไปเรียนต่อคงทำก่อนที่คะแนนอันนี้จะหมดอายุ เพราะถ้าสอบใหม่คิดว่าคงไม่ได้เกิน 100 (ฮาา)

จึงจดประสบการณ์สอบไว้ที่นี่กันลืม~ .. ส่วนเป้าหมายต่อไปคือ GRE มีอันต้องยกเลิกไปกลางคันเพราะเปลี่ยนงานใหม่กระทันหัน ไม่มีเวลาเตรียมตัวและความอยากสอบเหลือเลย จนต้องยกเลิกที่สมัครไว้เลย >_<

ทำงาน 3 ปี 7 เดือนแรก ออกจากที่ทำงานที่แรก

เหลือเชื่อว่าไม่ได้เขียนบลอกทิ้งไว้ตอนครบ 2 ปี หรือ 3 ปี >_< ก็ว่าทำไมหาไม่เจอ (แต่เขียนไว้ตอน เดือนแรก5 เดือนแรก และ 1 ปีแรกนะ)

หลังจากทำงานผ่านปีแรกมา หลายอย่างก็เริ่มเข้าที่เข้าทาง ความเป็นเด็กใหม่ในทีมเริ่มลดลงไป ค่อนข้างเข้าใจ product ตัวที่ซัพพอร์ตอยู่และขยายกิจการไปตัวอื่นๆในทีม ได้พัฒนาทักษะเรื่อง debugging เยอะมาก (ซึ่งผมเชื่อว่าหาเรียนรู้ยากในงาน dev ทั่วไปนะ ส่วนใหญ่ก็ไม่มีใครอยากเสียเวลา debug อะไรยากๆมากมาย – -”)

เรื่องนึงที่ภูมิใจและมักจะเป็นเรื่องที่เลือกใช้เวลาต้องเล่าหรือต้องเขียน “ความสำเร็จ” อะไรซักอย่างจากการทำงาน คือเรื่องโปรแกรมตัวนึงที่เขียนไว้ browse log file (format เฉพาะของบริษัท)  ตัวโปรแกรมไม่ได้เขียนยาก แต่ผมรู้สึกว่าทำไปแล้วมันค่อนข้างมี impact กับทีม มันทำให้งานวิเคราะห์ log ที่ต้องทำเกือบทุกวันง่ายขึ้นมาก ได้รับเสียงตอบรับดี

แล้วตลอดสองสามปีที่ผ่านมา ผมจะรู้สึก “ฟิน” ลึกๆ เวลา(เผอิญ)กราดหน้าจอคนอื่นแล้วเผอิญเห็นเค้ารันไอ่แอปตัวนี้อยู่ >_< (คนเขียนโปรแกรมคงเข้าใจ) … format ของ log file ที่ว่าคงจะหายไปในไม่ช้า แต่โปรแกรมมันก็ถูกใช้งานอย่างคุ้มค่าแล้วอ่ะนะ

ปีนั้นทีมให้รางวัลเป็นแท่งอะคริลิค (IMS Support STAR) .. ชีวิตนี้โดยเฉพาะตอนสมัยเรียน  ได้แท่งอะคริลิคมาหลายอันอยู่ แต่อันนี้เป็นอันนึงที่ดีใจมากๆที่ได้ ถึงจะมาจากคนกลุ่มเล็กๆ T__T ตอนนี้เอากลับมาบูชาที่บ้านแล้ว

(หลังๆเค้าเลิกให้อะคริลิค ให้เป็นเช็คของขวัญแทนซะละ – -’ ลืมบอกทีมก่อนออกว่าชอบอะคริลิคมากกว่า)

หลังผ่านมาสองปี (โดยประมาณ) มีการเปลี่ยนแปลงอันนึงที่สำคัญ คือย้ายทีมย่อยภายใน (เอาจริงๆทีมใหม่ก็เจอหน้ากันทุกวันอยู่แล้วอ่ะนะ ^^’) เรื่องหลักๆที่เกิดขึ้นคือเปลี่ยน product (เรียนรู้ใหม่) เปลี่ยน GL (พี่หวานจะเป็นยังไงน้าา .. หือๆ) เอาจริงๆไม่มีใครมาบีบคอให้เปลี่ยน ส่วนหนึ่งก็ไม่ชอบความเปลี่ยนแปลง (ไม่อยากออกจาก comfort zone) อีกส่วนหนึ่งก็รู้สึกว่าอยากลองทำอะไรใหม่ๆ

สุดท้ายลองเปลี่ยนดู .. และก็ค้นพบว่าตัวเองยังอยู่ดี ปกติ มีความสุข ได้คุยกับพี่หลายคนที่ก่อนย้ายทีมไม่ค่อยได้คุยเยอะขึ้น :) รู้สึกได้ว่าทักษะเรื่อง debug เพิ่มขึ้นอีกมากมาย ทักษะเรื่องการหลอกล่อต่อสู้ลูกค้าประเภทต่างๆ ณ จุดนี้มีความมั่นใจว่าตัวเองโอเคแล้ว เขียนเมล์ด่าคนนี่พริ้วมาก~

ระหว่างทาง ก็มีเพือนใหม่ๆมาร่วมทีม แล้วก็เพื่อนเก่าออกจากทีมไป หลายๆครั้งเวลามีคนออกจากทีมผมรู้สึกได้รับ emotional impact เยอะอยู่ บางคนเห็นหน้ากันคุยกันทุกวันมาปีสองปีสามปีอยู่ๆหายไปเลยก็อดรู้สึกส้วมซึมเล็กๆไม่ได้ :( แต่ละคนก็มีเหตุผลส่วนตัวของตัวเองในการเปลี่ยนงาน บางทีก็เข้าใจ บางทีก็ไม่เข้าใจ ฮ่าๆ

เรื่องที่รู้สึกได้จากที่นี่มากคงเป็นเรื่องติดต่อสื่อสารกับคนอื่น ปกติแล้วเป็นคนยังไงก็ได้ ไม่ค่อยกล้าพูด ไม่กล้าโวยวาย เค้าให้ทำยังไงก็ทำแบบนั้น (เข้าใจรึเปล่า?) มาอยู่นี่แล้วรู้สึกโวยวายเก่งขึ้น อยากได้อะไรต้องพูด(เมล์)ตรงๆ โดยเฉพาะกับลูกค้า และทีมอื่นๆที่คุยด้วย รอให้คนอื่น act นอกจากจะช้าแล้วยังไม่ได้แบบที่ต้องการอีก – -’

นอกจากนี้การอยู่ในบริษัทใหญ่ๆมันก็ได้เห็นเรื่องพวก management structure ว่าเค้ามีวิธีจัดการคน 1,600 คนให้ตั้งหน้าตั้งตาทำงานกันได้ยังไงให้มีความสุขและไม่มีปัญหา ซึ่งก็แน่นอนว่านี่เป็นปัญหาอีกแบบที่หาดูไม่ได้ในบรัษัทขนาดเล็กและคล่องตัวกว่า

197578_10150125390157321_6690666_n

เรื่องต่อๆมาคงเป็นเรื่องประสบการณ์ชีวิต รู้สึกได้ทำกิจกรรมแปลกๆ (ที่คงไม่ทำด้วยตัวเองแน่ๆ) ร่วมกันบ่อยๆ 555+

150797_479642437256_4882771_n

ขอแอบขอบคุณทีมอีกรอบไว้ในบลอกเงียบๆ ถ้าใครเข้ามาอ่านก็ทิ้ง comment ไว้ด้วยละกัน รักทุกคนครับ :P

 

ในช่วงปีที่ 4 มี opportunity เข้ามา ผมต้องขอบคุณ blognone (ถึงแม้จะเป็นเว็บที่ชอบมีกฎอะไรแปลกๆออกมาบ่อยๆในช่วงหลายปีก่อนหน้านี้ แต่ปีหลังๆรู้สึกโอเคขึ้นละนะ) ที่คาบข่าวสารดีๆมาบอก แถมยังลงเป็นข่าวหน้าแรก​ (ไม่งั้นคงไม่เห็น)

ผมอยู่ในสถานะค่อนข้างเหมาะสม คือเริ่ม “อิ่ม” กับงานที่ทำอยู่ ไม่มีธุรกิจของตัวเองต้องดูแลจัดการ ภาษาอังกฤษโอเค เรื่องเขียนโปรแกรมก็สู้รบปรบมือ เป็นโอกาสที่ดีที่จะบีบตัวเองออกจาก comfort zone แล้วทำอะไรแปลกๆใหม่ๆดูซัก 11 เดือนในขณะที่ยังทำได้ (ไม่แก่จนเกินไป ไม่ต้องเก็บเงิน ไม่มีครอบครัว) แอบเสียดาย

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

536552_10151092582217257_1466899938_n

บลอกหน้าจะจดเรื่องเดือน กันยายน – ตุลาคม 2012 ซึ่งเต็มไปด้วยการเปลี่ยนแปลง :D (อยากจดมาก ถ้าไม่ขี้เกียจเขียนซะก่อน)

เลิกเขียนบลอกที่ solidskill.net แล้ว

เลิกเขียนบลอก .. ที่ solidskill.net แล้ว :P

ย้ายไปเขียนที่นี่ http://lifeonvm.nkuln.com .. พร้อมโพสต์เก่าทุกอัน

ส่วน URL Feed อันใหม่เป็น http://lifeonvm.nkuln.com/?feed=rss2 

ถ้าเรายังรักกันอยู่ ก็ฝาก subscribe ค์ด้วยนะครับ ส่วนเว็บ solidskill.net อันนี้ผมจะค่อยๆเอาออกไปทีละนิดส์ จดหมด ขอบพระคุณ ;)

ขอเริ่มบลอกแรกของปีนี้ ตอนใกล้ๆปลายปี ที่นี่ละกัน :)

พักหลังๆผมอยากได้ VPS เป็นของตัวเองซักอัน จะได้เอาไว้ใช้เล่นอะไรพิเรนๆ ก่อนหน้านี้ใช้ของ Rackspace Cloud Server อยู่พักนึง ก็เจอปัญหาว่าช้ามากเพราะเซิร์ฟเวอร์อยู่ US (ส่ง ping ทีนึงได้ 400-500ms จากไทย) ssh เข้าไปกว่าจะพิมพ์ได้แต่ละตัวรู้สึกอึดอัดเลยล่ะ

ต่อมาลองใช้ Amazon EC2 เลือก region เป็นสิงค์โปร์ พบว่ามันเร็วกว่ามาก (ping ประมาณ 50-100ms จากไทย) ช่วงนี้เค้าให้ลองเล่น micro instance (แบบห่วยสุด) ฟรี ก็เลยขอลองซักหน่อย แต่ก็เจอปัญหาอีกว่า micro instance มันทำอะไรหนักๆมากไม่ได้ ใช้หนักมากๆจะโดนลิมิต CPU จนนิ่งไปพักนึงเลย ส่วนครั้นจะอัพเกรดขึ้นมาอีกระดับเป็น small instance ก็แพงจนเกินไป สรุปว่า EC2 ก็ไม่ใช่ solution สำหรับคนจนๆอยากใช้ VPS อย่างเราอยู่ดี :’(

สุดท้ายเลยกลับไปมองฝั่ง US อีกรอบ คราวนี้ไปที่ linode เพราะ

  • มันมีเรื่อง availability zone s ที่หลากหลายกว่า Rackspace และมีหน้าวัดความเร็วของแต่ละ zone ให้ใช้ ผมลองดู Tokyo กับ Fremont ลองดูหลายๆอย่างทั้ง ping, traceroute สุดท้ายเลือก Fremont ไป (แอบแปลกใจเหมือนกันที่มันเร็วกว่าโตเกียว)
  • นอกจากนี้ยังอ่านเจอว่า Linode มันมีการ preserve resource พวก CPU ที่เป๊ะกว่า เพราะสำหรับ VPS หลายๆที่นั้นถ้าเราไปเจอเพื่อนบ้านเฮงซวยใช้ CPU เยอะก็อาจจะมาเบียดเบียนเราได้ แต่ Linode สามารถการันตี minimum ของ CPU time ที่เราจะได้ได้ ก็เป็นอีกหนึ่งข้อดี
  • หน้า admin interface ใช้ง่ายสุดๆ

ส่วนข้อเสียหลักๆก็เหมือน Rackspace คือมันอยู่ไกลมาก request/response ทีนึงหายไป 400ms ก็คงไม่เหมาะนักถ้าอยากจะทำเว็บที่มันต้องตอบสนองเร็วๆ ส่วนเรื่อง ssh ช้าก็พอใช้ mosh เยียวยาได้บ้าง

ถามว่าแล้วทำไมไม่เช่า VPS ไทยไปเลย? คำตอบคือส่วนใหญ่มันแพง ไม่มีตังค์ – -’ (เฉลี่ยถูกสุดประมาณ 1,500 บาทต่อเดือน) ส่วนที่ประมาณ 700 บาทก็มี แต่เราก็ดันเชื่อใจ Linode มากกว่า ถ้าทำอะไรซักอย่างแล้วมัน catch on ค่อยกลับมาไทยละกันเนอะ (หวังว่าจะมีวันนั้น :P)

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

ทำครัวไม่เหมือนต่อเลโก้

น้ำท่วมพาเหตุการณ์สำคัญมาให้ผมอีกเรื่องนึง คือ ข้าวกล่องแดง 7-11 หมดเกลี้ยง หยุดผลิต!

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

พอมันหายไป ผมเลยต้องมองหาอย่างอื่นมาทดแทน ซึ่งก็ไม่ได้หายากอะไรเพราะนอกจาก 7-11 ใต้คอนโดยังมี Max-Value ที่เป็นซูเปอร์มาเปิดใหม่ไม่นาน มีอาหารปรุงเสร็จใส่กล่องขายด้วย

พวกข้าวกระเพราไก่ไข่ดาว ข้าวผัด blah blah มีหมด … เสียอย่างเดียวคือรสชาติมันพอๆกับข้าวที่ศูนย์ฝึก ร.ด. แค่นั้นเอง = =’’

อีกอย่างที่ขายคือพวกของสด เป็น ปลาแซลมอน ปลาดอรี หอยลาย พอร์คชอป กุ้งสด ใส่เป็นห่อๆขาย ที่ต้องทำคือเอามาทำให้สุกซักวิธี ที่ผมทำได้คือ microwave หรือไม่ก็ทอดกับเตาไฟฟ้า (ซึ่งยังไม่เคยใช้เลยเพราะปกติเวฟเอาตลอด)

ก็เลยลองทอดดู มันจะมีอะไรยาก เอามาทอดๆ ปรากฎว่าสนุกดีอะ ทำกินไปหลายอย่างเลย ทั้งแบบที่หน้าตามันดูกินได้ และดูกินไม่ได้ …

301089_10150346633527257_637427256_8542827_10672384_n  8f0498bc086d11e19896123138142014_7

พอเริ่มทอดคล่องแล้ว (หลายวัน) อยากลองของยากขึ้นฮะ แล้วไปเจอวิดิโอสอนทำคาโบนาราใน Youtube พอดีด้วยความบังเอิญ

http://www.youtube.com/watch?v=B47U6ff7SY8&feature=feedf_more

ไอ่คนในวีดิโอบอกว่าทำง่ายซะด้วย! เอาวะ ลองซะหน่อย ดูในวิดิโอก็ไม่เห็นจะยากตอนไหนเลย

ก็เลยไปหาของมาให้ครบๆ ดังต่อไปนี้

  1. เส้นสปาเกตตี (แน่นอน ต้องมี)
  2. หัวหอมใหญ่
  3. ไข่
  4. เบคอน
  5. พริกไทยดำ
  6. เกลือ
  7. พาเมซานชีส (แพง maxxx เกือบหาไม่ได้)
  8. วิปครีมเหลว (อันนี้ก็แพงเหมือนกัน)

วันแรกที่ทำยังไม่มี วิปครีมเหลว แต่ว่ามีซอสผัดอย่างอื่นที่น่าจะใช้แทนได้ เลยลองดันทุรังทำดูซักหน่อย ปรากฎว่าแง่งออกมาเป็นผัดหมี่ = =’’ แดมมม

 Photo Nov 08, 9 11 02 PM

วันที่สอง ไปแสวงหาอุปกรณ์มาจนครบละ “ผมชื่อแก๊น วันนี้ผมพร้อมมาก และหิวมาก” (เลียนแบบใครหว่า) เลยจัดหนักเอาเส้นมาซะเยอะเลย วิปครีมก็เยอะ ใช้ชีสเยอะ ทุกอย่างเยอะ แต่ก็ไม่คิดว่าพอลวกเส้นเสร็จมันจะออกมาเยอะขนาดนี้ = =’’ แดมมมม (2)

นอกจากเรื่องเส้นที่มากไปแล้ว ยังมีความผิดพลาดอื่นๆอีก (ที่เรียนรู้เองจากการลองทำ)

  • ใช้ไฟแรงเกินไป จนพวกเบคอนกับหอมสับห่อเหี่ยวหมด
  • พอไฟแรง ของในกระทะเริ่มแห้ง ก็ต้องเอาน้ำเปล่าเติม (ไม่มีน้ำซุป) ออกมาแฉะไปอีก
  • อัตราส่วนวิปครีมเทียบกับไข่ ใช้วิปครีมเยอะไป ตอนกินมีแต่รสวิปครีม เลี่ยนๆ
  • ใช้วิปครีมเยอะไปมากก จนท่วมเส้นได้ทั้งกระทะ กะผิด
  • ตั้งวิปครีมไว้บนเตาไฟแรงนานมากจนนมแยกออกจากน้ำมันชัดเจนเลยทีเดียว = =’

รูปข้างล่างมาจากวันที่สอง ออกมาเป็นไรไม่รู้ แต่ก็ฝืนๆกินจนทนไม่ไหว เลยเลิก – -‘

(เพิ่งเข้าใจประโยค Eat your own dog food จากการปฎิบัติจริง ก็วันนี้)

Photo Nov 12, 9 15 12 AM Photo Nov 12, 9 48 06 AM Photo Nov 12, 10 04 55 AM

ทำกินตอนเช้า ตอนบ่ายออกไปเที่ยวเล่นด้วยความพะอืดพะอม = = กะว่าจะเลิกทำคาโบไปอีกซักอาทิตย์

แต่วันนี้ตื่นมานึกไงไม่รู้ ทำอีกรอบ คราวนี้แก้ไขข้อผิดพลาดคราวที่แล้วคือ

  • ใช้เส้นน้อยลงมาก (คราวนี้นับเลยว่าใช้ 40 เส้น)
  • เพิ่มส่วนประกอบที่เป็นเบคอนทอดกรอบ (จะได้ดูดีขึ้นหน่อย + ดับความเลี่ยน)
  • ใช้วิปครีมน้อยลง ผสมไข่แล้วข้นๆเลย
  • ใช้ไฟอ่อนลงเยอะ
  • แยกหัวหอมออกมาส่วนนึงก่อน ไว้ค่อยใส่เข้าไปตอนหลัง จะได้กินหอมดิบๆบ้าง หวานๆดี
  • ตั้งวิปครีมบนกระทะแปร๊บเดียว แล้วเทลงจานเลย กลัวมันร้อนจนน้ำมันแยกตัวแบบคราวก่อน

ค่อนข้างพอใจกับผลที่ออกมาฮะ TvT พอรับประทานได้เลยทีเดียวเชียวล่ะ ..

Photo Nov 13, 12 08 31 PM

ที่น่าจะยากหลังจากนี้ คือ จะทำให้ได้ออกมาประมาณนี้แบบคงเส้นคงวายังไง แล้วถ้าต้อง scale (เช่นทำมาเสิร์ฟสองที่พร้อมกัน) จะ scale ได้มั้ย ..

เป็นอะไรเล็กๆน้อยๆที่มากับเรื่องน้ำท่วม 2554 ฮะ ผมจะจำไว้

ปล. ราคาต้นทุนน่าจะสูงกว่ากินตามร้านแล้ว แดมมม (3)

ลองใช้ LaTeX

วันก่อนไม่รู้นึกไงเอาไฟล์ The Not So Short Introduction to LaTeX ใส่ Kindle ไปอ่าน อ่านไปอ่านมา skim ไปจนจบ ต้องลองเล่นดูซะหน่อย

สมัยเรียนมหาลัยถ้าใครเคยอ่านเปเปอร์พวกที่เป็นงานวิจัยจะรู้สึกว่ามันมีอะไร “บางอย่าง” คล้ายๆกันอยู่ แต่ไม่รู้ว่ามันคืออะไร ..

จริงๆแล้วเอกสารเหล่านี้ส่วนใหญ่มากเลยล่ะ ผลิตมาด้วย LaTeX ทั้งนั้น

ดังนั้นถ้าให้เปรียบเทียบกับซอฟแวร์ที่เรารู้จักก็คงต้องเอา LaTeX ไปเปรียบเทียบกับ Microsoft Word เพราะทั้งสองโปรแกรมใช้ผลิตงานพิมพ์ได้เหมือนกัน

ในวงการการวิจัยและการศึกษาจะยอมรับเอกสารที่ผลิตมาจาก LaTeX มากกว่า ผมเชื่อว่าถ้าส่งไฟล์ .docx ไป conference คงโดนศาสตราจารย์มองด้วยหางตา + เพื่อนเนิ้ดไม่คุยด้วยเลยทีเดียว .. (ขี้เว่อร์ซะ)

จริงๆแล้วมีโจ๊กเกี่ยวกับ LaTeX ที่เคยโพสต์ไว้ด้วยใน วิธีอ่าน Resume ของ HR กับ Programmer

วิธีการเริ่มใช้งานจริงๆมันไม่ยากอะไร แต่ถ้าจะจัด format เอกสารให้ได้ดั่งใจจริงๆผมว่ายุ่งยาก

สำหรับ Windows

  1. ไปโหลด MikTeX มา โหลดแบบ portable ก็พอ เพราะเดี๋ยวก็ลบทิ้งแล้ว
  2. ติดตั้งให้เรียบร้อย
  3. เขียนไฟล์เอกสาร myfile.tex ง่ายๆหนึ่งไฟล์ ถ้าไม่มีลองเอาตัวอย่างจากท้ายบลอกนี้ไปเล่นดู
  4. รัน MikTeX portable, คลิกขวาที่ icon ตรง tray เลือก Command Prompt
  5. รัน pdflatex myfile.tex แล้วรับผลงานในรูปแบบ PDF file

ตัวอย่างเอกสาร

\documentclass[a4paper]{article}
\author{Natthawut K}
\title{Hello Old World! I’m on \LaTeX{} now!}
\begin{document}
\maketitle
\thispagestyle{empty}
\paragraph{About Me}
My name is Natthawut Kulnirundorn, and I think it’s a long name so you can just refer to my online identity “m3rLinEz.” I am from Thailand, Land of Tom-Yum-Goong and delicious foods :)\footnote{I don’t think we’re really “Land of Smiles” any more \ldots} I am interested in Object-Oriented Design, Software Architecture, Graphics, .NET, Java. I also have a technical blog\footnote{Visit my blog –
http://www.solidskill.net (in Thai)} and a Twitter account\footnote{Follow @m3rlinez!}.
\end{document}

เห็นมั้ยล่ะ อ่านไม่รู้เรื่องเลย 555+

เรื่องข้อดีข้อเสียหรือประวัติ LaTeX วิธีใช้งานเบื้องต้น ลองไปอ่านใน The Not So Short Introduction to LaTeX  ได้

บลอกนี้จดไว้กันลืม จะได้รู้ว่าเคยเล่นแล้ว

ของเล่นใหม่ใน Java 7

duke_java7
 
เป็น major version อันแรกของ Java ใต้ร่มเงาของ Oracle! ผมเองไม่ได้เขียน Java มานานมากๆแล้วเพราะงานที่ทำงานไม่ได้ใช้ตรงๆ แต่ก็ตื่นเต้นไปกับของเล่นใหม่ๆด้วย วันนี้เลยลอง Netbeans 7 + JDK 7 มาเล่นปัดฝุ่นดู :D

เข้าใจว่ามันมีของใหม่เติมเข้ามาในเวอร์ชันนี้เยอะ แต่ที่ลองเล่นไปจะเป็นอะไรที่เกี่ยวกับตัวภาษาตรงๆ:

Binary Literals

ให้เราแทนค่าที่เป็น binary เช่น 01010101 ลงไปใน code ได้ตรงๆ น่าจะมีประโยชน์มากกับคนที่ทำพวก network / protocol / data format programming ที่แบบว่าต้องเซ็ตบิตที่ตำแหน่งเท่านี้เท่านั้นเยอะๆ ทำให้โค้ดอ่านง่ายขึ้นด้วย (รึเปล่า ??)

int data = 0b001;
int mask = 0b101;
data |= mask;

System.out.println("Data: " + Integer.toBinaryString(data));
// prints 'Data: 101'

Underscores in Numeric Literals

เป็นเรื่อง readability คือพวกค่าที่เป็นตัวเลขก็เอา underscore ไปคั่นได้ ทำให้อ่านง่ายขึ้น (เหรอ?) เช่น

int mask = 0b1110_1010;
int colorCode = 0xFF_FF_CC;
double myAccountBalance = 3_141_592.654;

Strings in switch Statements

อันนี้ไม่มีอะไรต้องอธิบาย เป็น feature ที่ถูกขอมานานถึง 16 ปีแล้ว!

มีเรื่องที่น่าสนใจอีกเรื่อง ถ้าใครตั้งใจเรียนสมัยอยู่มหาลัยจะรู้ว่า switch กับ if ซ้อนกันหลายๆอันมันทำงานไม่เหมือนกัน (ในเชิงทฤษฎี) ในเชิงปฎิบัติ หนังสือเกี่ยวกับ JVM เล่มนี้เค้าบอกว่า ถ้า constants ใน case ต่างๆทั้งหมดรวมกันแล้วมันโล่งเตียน (Sparse) คือมันกระจายตัวกันมากๆ Java จะใช้ Binary search แทนการใช้ Offset table (แบบที่เราเข้าใจตอนเรียน) แต่ถ้าอยู่กันหนาแน่น ก็จะใช้ Offset Table ตามปกติ .. เป็น optimization อย่างนึง

Type Inference for Generic Instance Creation

เป็นการแนะนำตัวของ diamond (“<>”) ช่วยให้เวลาประกาศพวก Generic เขียนง่ายขึ้น ไม่รกหูรกตา

List<String> nameList = new ArrayList<>() {};
Map<Integer, List<String>> customerToOrders = new HashMap<>();

The try-with-resources Statement

ผมว่าอันนี้มีประโยชน์เยอะเลย น่าจะทำให้โค้ด Java ใหม่ๆเปลี่ยนไปเยอะ

ถ้าให้อธิบายแบบผมคือ มันเป็นเป็นใช้ syntax ของภาษาที่บังคับให้ทำอะไรซักอย่างก่อนออกจาก scope เสมอๆ (คล้ายๆกับ destructor ของ C++ ที่จะโดนเรียกเสมอตอนออกจาก scope, เอาไปทำเทคนิคที่เรียกว่า RAII ได้)

ตัวอย่างที่ยกมาให้ดูในเว็บของ Java เป็นการใช้ BufferedReader แต่ไม่ต้องมีการสั่ง close() เอง ทำให้โค้ดอ่านง่ายขึ้นเยอะเลย จริงมั้ย??

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
// br is auto-closed here!

ใน Java 7 ก็มีหลาย class นอกจาก BufferedReader ที่สนับสนุน try-with-resources แบบนี้ ถ้าเราอยากจะให้ Class ของเราสนับสนุน try แบบนี้ด้วย ก็แค่ implements AutoCloseable

class TestAutoCloseable implements AutoCloseable{

@Override
public void close() throws Exception {
System.out.println("== Close ==");
}
}

// ...

try(TestAutoCloseable ac = new TestAutoCloseable()){
// Doing something ..
System.out.println("== Inside try ==");
}catch(Exception ex){ // (you don't want to do this)
// Close failed!
}
System.out.println("== Outside try ==");

// Prints:
// == Inside try ==
// == Close ==
// == Outside try ==

Catching Multiple Exception Types and Rethrowing Exceptions with Improved Type Checking

อันนี้มีสองอย่าง

อย่างแรกคือ catch Exception ได้หลายๆแบบ (ยิงปืนนัดเดียวได้นกหลายตัว) โดยใช้ try{ .. } catch(FirstException | SecondException ex){ .. }

อย่างที่สองคือ Improved Type Checking คือ Java 7 ฉลาดขึ้นสามารถเข้าใจ Type ของ Exception ได้ละเอียดขึ้น ในตัวอย่างที่ยกมา:

public void rethrowException(String exceptionName)
throws FirstException, SecondException {
try {
if (exceptionName.equals("First")) {
throw new FirstException();
} else {
throw new SecondException();
}
}
catch (Exception e) {
throw e;
}
}

จะเห็นได้ว่าถึงแม้ใน catch จะ thorw e (ที่มี type เป็น Exception) แต่ปรากฎว่าที่หัว method เราเขียน throws FirstException, SecondException ซึ่งเป็น type ที่ specific กว่าได้! อันนี้ทำได้เพราะ Java ฉลาดพอที่จะเข้าใจได้ว่า code ใน try มัน throw  อะไรออกมาได้บ้าง

Improved Compiler Warnings and Errors When Using Non-Reifiable Formal Parameters with Varargs Methods

อ่านหัวข้อก็รู้แล้วว่าอันนี้เข้าใจยากแน่ๆ! = =’ (เลยเอาไว้หัวข้อสุดท้าย)  อันนี้ผมอ่านแล้วก็ยังงงๆ เลยไม่กล้าลงรายละเอียด

โดยสั้นๆคือ code แบบนี้มันถูก syntax และ compile ผ่าน แต่จะตายตอนรัน

List l = new ArrayList<Number>();
List<String> ls = l; // unchecked warning
l.add(0, new Integer(42)); // another unchecked warning
String s = ls.get(0); // ClassCastException is thrown

Java 7 มีการพัฒนาในการระแวดระวังความผิดพลาดทำนองนี้ โดยการเพิ่ม Warning และ Errors ให้ผู้ใช้ระวังตัวนั่นเอง (รากหญ้าแบบผมคงไม่เจอปัญหาทำนองนี้บ่อยๆ = =’)

..

โดยสรุปว่าผม try-with-resources เป็น highlight ของอันนี้ ถ้าเอาไปเทียบกับ C# มันคือ using(..) statement นั่นเอง

แต่ที่ดูแล้วน่าคิดอีกเรื่องคือเรื่อง throw error ได้ละเอียดขึ้น อันนี้ถ้าไม่ใช้ Checked Exception ตั้งแต่แรกก็จะไม่มีปัญหานี้เลย (เหมือนใน C#)

ชอบ features ไหนกันบ้าง ? อ่านละเอียดๆได้ที่ http://download.oracle.com/javase/7/docs/technotes/guides/language/enhancements.html#javase7

สร้างการเรียงสับเปลี่ยนด้วย Javascript

ไปเจอคำถามน่าสนใจใน Blognone forum ว่าจะเขียนโปรแกรมแก้ปัญหา Zebra Puzzle (ปัญหาที่มันบอกว่ามีคนหลายชาติ เลี้ยงสัตว์หลายแบบ บ้านหลายสี บ้านคนนั้นติดคนนี้ น่ะ) ยังไง? ตอนสมัยเรียนรู้สึกเหมือนเคยแก้ปัญหาอะไรทำนองนี้แต่ใช้ Prolog ทำ ถ้าจะเอาภาษา Imperative บ้านๆแบบ Python หรือ C# ทำจะได้มั้ย?

ผมเข้าใจว่า Prolog เองมันก็มีการทำ search หา solution ที่เป็นไปได้ แล้วมีการทำพวก branch & bound หรือ track back เวลา solution มันผิดอะไรแบบนี้เหมือน (ไม่รู้ใช้ศัพท์ถูกป่าว มันนานมาแล้ว – -‘a) ครั้งนี้กะว่าจะลองใช้ Javascript เขียน

วิธีที่อยากทำคือจะวนไปตามรูปแบบ solution ทั้งหมดที่เป็นไปได้แล้ว check กับ constraints ของโจทย์ทีละตัวเลย ปัญหาแรกที่เจอคือจะ generate solution ที่เป็นไปได้ออกมายังไง?? อันนี้ต้องใช้ Permutation

Permutation ทั้งหมดของ [1,2,3] มี 3! แบบ = 6 แบบ ได้แก่ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]

ถ้ามี list มาให้อันนึง จะวนหา Permutation ทั้งหมด Wikipedia แบบให้ทำแบบนี้

The following algorithm generates the next permutation lexicographically after a given permutation. It changes the given permutation in-place.

  1. Find the largest index k such that a[k] < a[k + 1]. If no such index exists, the permutation is the last permutation.
  2. Find the largest index l such that a[k] < a[l]. Since k + 1 is such an index, l is well defined and satisfies k < l.
  3. Swap a[k] with a[l].
  4. Reverse the sequence from a[k + 1] up to and including the final element a[n].

เขียนออกมาเป็น Javascript .. ผมทำไว้เป็น Module

/////////////////////////////////////////////
// Permutation Generator
// - generate all permutation of given string
// array
// - Natthawut Kulnirundorn <m3rlinez at email by google>
// http://www.solidskill.net 10 July 2011
/////////////////////////////////////////////

var PermutationGenerator = (function () {
var self = {};

// Get start sequence of given array
self.getStartSequence = function (list) {
return list.slice(0).sort();
};

// Get next sequence from given array
// Ref: http://en.wikipedia.org/wiki/Permutation#Systematic_generation_of_all_permutations
self.getNextSequence = function (list) {
// Make clone
var a = list.slice(0);

//The following algorithm generates the next permutation lexicographically after a given permutation. It changes the given permutation in-place.
// 1. Find the largest index k such that a[k] < a[k + 1]. If no such index exists, the permutation is the last permutation.
var k = -1;
for (var i = 0; i < a.length - 1; ++i) {
if (a[i] < a[i + 1]) { k = i; }
}
if (k == -1) return null; // means this is the last one

// 2. Find the largest index l such that a[k] < a[l]. Since k + 1 is such an index, l is well defined and satisfies k < l.
var l = -1;
for (var i = 0; i < a.length; ++i) {
if (a[k] < a[i]) { l = i };
}
if (l == -1) return null; // impossible

// 3. Swap a[k] with a[l].
var tmp = a[k]; a[k] = a[l]; a[l] = tmp;

// 4. Reverse the sequence from a[k + 1] up to and including the final element a[n].
var next = a.slice(0, k + 1).concat(a.slice(k + 1).reverse());

return next;
};

return self;
} ());

แถม test cases ให้เป็นวิธีใช้
/////////////////////////////////////////////
// Test Cases
/////////////////////////////////////////////

var PermutationGeneratorTest = (function () {
var self = {};

function getStartSequence_Test1() {
var a = ['red', 'white', 'green', 'yellow', 'blue'];
var res = PermutationGenerator.getStartSequence(a);
log('input = ' + a);
log('output = ' + res);
}

function generateSequence(list) {
var current = PermutationGenerator.getStartSequence(list);
var count = 1;
log('start = ' + current);
while (true) {
current = PermutationGenerator.getNextSequence(current);
if (current == null) { break; }
log('next' + (++count) + ' = ' + current);
}
}

function getNextSequence_TestNormal() {
generateSequence(['English', 'Spanish', 'Japanese']);
}

function getNextSequence_TestEmpty() {
generateSequence([]);
}

function getNextSequence_TestRepeat() {
generateSequence(['gant', 'gant', 'korkore', 'jan']);
}

self.runTests = function () {
log("=== getStartSequence 1 ===");
getStartSequence_Test1();
log("=== getNextSequence Normal ===");
getNextSequence_TestNormal();
log("=== getNextSequence Empty ===");
getNextSequence_TestEmpty();
log("=== getNextSequence Repeat ===");
getNextSequence_TestRepeat();
};

return self;
} ());

ตัวอย่างเต็มๆผมทิ้งไว้ที่ http://www.solidskill.net/ZebraPuzzle.htm

ส่วนอันนี้เป็นคำตอบที่ตอบใน forum .. เผื่อว่า Blognone ทำกระมุ้หายคงเสียดาย พิมพ์ตั้งนาน :P

อาจารย์ให้โจทย์ได้น่าสนใจมากครับ ผมเห็นแล้วอยากทำไปด้วยเลย ลองทำดูเล่นๆเป็น Javascript ใช้เวลาไปมากพอสมควร

เวลาทำโจทย์แนวนี้โดยใช้ดินสอกระดาษ เราก็จะพยายามสร้างคำตอบที่เป็นไปได้โดยดูจาก constraints ที่โจทย์บอก ทำผิดก็ลบใหม่แล้วสลับโน่นเปลี่ยนนั่นเปลี่ยนนี่ไปเรื่อยๆให้สอดคล้องกับ constraints จนได้คำตอบ .. แต่สิ่งที่ยากคือจะเอาวิธีที่กล่าวมานี้เปลี่ยนมาเป็น code ได้ยังไง??

สิ่งแรกที่ต้องทำคือ กำหนดรูปแบบของคำตอบที่เราต้องการ ตัวอย่างอันนี้กำหนดให้อยู่ในรูป list ของ list เช่น

[[1,2,3,4,5], [yellow,blue,red,white,green], [Norwegian,Italian,English,Spanish,Japanese], [fox,horse,snails,dog,zebra], [water,tea,milk,orange juice,coffe], [diplomat,physician,photographer,violinist,painter]]

list ย่อยตัวแรกจะบอกตำแหน่งของบ้าน ตัวต่อมาบอกสีบ้าน ตัวต่อมาบอกสัญชาติ และอื่นๆ ตามลำดับ จากตัวอย่างจะบอกว่าบ้านหลังแรกสีเหลือง มีชาว Norwegian บ้านหลังที่ 3 มีชาว Italian เลี้ยงหอยทาก เป็นต้น จากรูปแบบคำตอบแบบนี้และข้อมูลที่โจทย์ให้มา เราจะต้องหาคำตอบที่ถูกต้องจากคำตอบที่เป็นไปได้ทั้งหมด (5!)^5 = 24,883,200,000 แบบ (ไม่ต้องยกกำลัง 6 เพราะจริงๆแล้ว list ย่อยตัวแรกคือตำแหน่งนั้น เรา fixed ไว้เลย)

ทำแบบตรงไปตรงมา .. เราก็ generate คำตอบที่เป็นไปได้ทั้งหมดออกมา แล้วเอามาตรวจสอบกับ constraints ว่าผ่านทุก constraints หรือไม่ หลังจากตรวจสอบแล้วก็จะเหลือแค่คำตอบที่สอดคล้องกับ constraints ทั้งหมด ถ้าลองทำกับโจทย์ข้อนี้จะพบว่ามันเหลือแค่คำตอบเดียว (จากทั้งหมด 25,000 ล้านแบบ) ถ้าลองเอา constraint ออกซักตัวจะเห็นได้ว่ามีตำตอบออกมาเพิ่มหลายคำตอบ

วิธี generate คำตอบทำได้ด้วยการหา permutation ทั้งหมดที่เป็นไปได้ ยกตัวอย่างเช่น [1,2,3] มี permutation 3! =6 แบบ คือ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] .. อัลกอริทึมสำหรับการทำดูได้ใน http://en.wikipedia.org/wiki/Permutation#Systematic_generation_of_all_permutations

แต่ถ้าเราจะ generate คำตอบที่เป็นได้ไปได้ออกมาทั้ง 25,000 ล้านแบบแล้ว ตรวจสอบทุกแบบอาจจะใช้เวลามาก จริงๆแล้วเราสามารถตัดคำตอบที่เป็นไปไม่ได้ออกได้ตั้งแต่ตอน generate เลย เช่นมี constraint ตัวนึงบอกว่าบ้านหลังสีเขียวอยู่ถัดจากบ้านหลังสีขาว ดังนั้นระหว่างเรา generate สีบ้าน เราก็ตัดเคสอื่นๆที่ไม่สอดคล้องกับ constraint ตัวนี้ออกไปซะ ก็จะลดเวลาที่ใช้ลงไปได้มาก (pruning)

ที่ผม implement เป็น Javascript ลองเข้าไปดู (view source) ได้ที่ http://www.solidskill.net/ZebraPuzzle.htm ถ้าเข้าใจหลักการแล้วจะ implement เป็น Python หรือภาษาอื่นก็ไม่น่าจะลำบาก

ผมเข้าใจว่าถ้าเป็นวิชา Discrete Mathematics อาจารย์คงอยากให้หัดทำ permutation แหละ คงไม่ได้ต้องการให้ใช้เทคนิคยากๆจาก AI หรืออย่างอื่น

เข้าฝูง

iphone4

ส่วนตัวผมฝังใจมาตลอด ว่าถ้าจะซื้อมือถือเครื่องหน้าคงเป็น Android ชัวร์ๆ

ปรากฎว่ามีอะไรให้เปลี่ยนใจนิดหน่อย ตอนนี้ก็เลยไปถือ iPhone 4 ตามบางคนแทน ^ ^a ปลดระวาง Samsung i780 ไปแล้ว ซึ่งถึงตอนนี้ถ้าเทียบกับค่าตัวที่ซื้อมาก็ถือว่าใช้คุ้มแล้วล่ะครับ

เรื่องรีวิวทั่วๆไปคงไม่ต้องมีอะไรมากเนื่องจากคนใช้เต็มไปหมด เอาเป็นว่าจากมุมมองของผม:

ข้อดี

  • ตามแบบฉบับ iPhone ใช้ง่ายมาก ง่ายเกินไปด้วยซ้ำ ถ้าเทียบกับ Android แล้วคิดว่าง่ายกว่า ไม่ต้องลากบนลากล่างเพื่อเข้าถึง App หรือ Notification

  • เนื่องจากระบบมันค่อนข้างปิดมาก ไม่ยอมให้ app มา extend ระบบส่วนกลางได้ง่ายๆ (ยกเว้น app สำหรับเครื่อง jailbreak) อันนี้ต้องลองมองเทียบกับ Windows Mobile — โอกาสที่ผู้ใช้ไม่รู้อิโหน่อิเหน่จะโหลด app มาลงเยอะๆ แล้วทำเครื่องพังแบบ WM เกิดขึ้นได้น้อย

  • FaceTime เจ๋ง ลองเล่นเทียบกับ Skype Video Call แล้วผมประทับใจ FaceTime มากกว่า กำลังจะได้ลองข้ามประเทศเร็วๆนี้

  • ราคาค่อนข้างตกช้า เทียบกับมือถืออื่นๆในตลาด สภาพคล่องสูงมาก

  • เรื่อง sensitivity ต่อการ touch พอๆกับ Windows Phone 7 และเหนื่อกว่า Android ค่อนข้างชัดเจน (ที่ทีมมีให้ลองทุกรุ่น เหอะๆ)

ข้อเสีย

  • เรื่อง push notification ยังดูไม่ค่อยเป็นระเบียบ ถ้าเทียบกับ android ที่ notifcation ทุกอย่างมารวมอยู่ที่เดียว

  • ถ้าไม่ jailbreak เครื่อง ก็ไม่มี app เถื่อนๆที่มันยุ่งกับระบบเยอะๆให้เล่น ผมคิดว่าคงยังไม่ jailbreak ไปซักพัก เพราะตอนนี้ก็โอเคดี

  • ถ้าอยากเขียนโปรแกรมลงไป ต้องใช้ Mac เท่านั้น อันนี้หนักอกที่สุด คนเป็น developer (ที่ใช้ PC) คงรู้สึกคล้ายๆกัน ตอนนี้เลย enjoy user-mode experience อย่างเดียว

  • app ซื้อง่ายเกินไป ตังค์ออกจากกระเป๋าครั้งละ 30 บาทได้ง่ายๆ (ตอนนี้จ่ายไปแล้ว 3 apps)

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

ส่วนตัวมองว่า Google พลาดที่ไปสร้างความคาดหวังว่า Android เป็นระบบเปิดให้ผู้ผลิตแก้ไขอะไรยังไงก็ได้ แต่ตอนนี้พอมีปัญหาเรื่องประสบการณ์ที่ผู้ใช้ที่ซื้อมือถือแปะป้าย “Android” ไป แต่ละคนมันต่างกันมาก เลยพยายามสร้าง policy มาจัดการเรื่องนี้มากขึ้น แฟนบอย Apple ก็เลยด่าเรื่องนี้กันสนุกปาก

ถ้ามองจริงๆพอคนใช้มือถือ “Android by Google” แล้วพบว่ามันห่วย คนที่โดน blame คงไม่ใช่แค่ LG, Samsung, HTC แต่รวมถึง Google ด้วย มันก็เลยต้องมีการควบคุมกันหน่อย

กรณีคล้ายๆกันที่ผมเคยเห็นคือเรื่องของ Firefox กล่าวคือ Mozilla ถือว่า Firefox เป็น trademark ของตัวเอง ดังนั้นถ้าจะเอา code ไป build แล้วเอาไป market ก็ได้ แต่ห้ามมีส่วนประกอบ Firefox ในชื่อเด็ดขาด (ยกเว้นจะเป็น official build ที่ Mozilla เห็นชอบด้วย) ถ้า Google จะเอาวิธีนี้มาใช้ก็น่าจะได้เหมือนกัน ก็แค่ใครจะ customize แบบที่เราไม่เห็นด้วย ก็ห้ามเอาชื่อ Android ไปโปะ แต่แนวทางตอนนี้ดู Google ใจดีกว่านี้นิดนึง (แค่ตัดสิทธิ์ไม่ให้เข้า early access program)

กว่าจะมีโอกาสซื้อเครื่องใหม่คงอีกอย่างต่ำๆสองปี ไว้เจอกันอีกรอบนะหุ่นยนต์เขียว! เขียนไปเขียนมาทำไมเป็นเรื่อง Android วะเนี่ย!!

PS. ว่าจะเขียนเรื่องทำงานครบสองปี คงไม่ได้เขียนวันนี้แล้ว ไว้ก่อนละกัน Smile with tongue out

แบ่งเวลาไม่เป็น

สิ่งดึงดูดความสนใจบนโลกนี้มันเยอะเกินไปครับ

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

แต่พอเริ่มเปิดเทอมแล้วผมจำไม่ได้ว่าทำไมที่บ้าน limit ให้เล่นได้เฉพาะวันศุกร์ เสาร์ อาทิตย์ และ enforce เรื่องนี้อย่างจริงจังมากกกก! เคยกลับมาแอบเล่นอยู่พักนึง แต่โดนจับได้ –*-

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

limit อันนี้มาอยู่ๆก็หายไปตอนประมาณผมอยู่ ป.4 – ป.6 ล่ะมั้ง จำไม่ได้แระ แต่ตอนนั้นก็เริ่มคิดได้อะไรได้บ้าง + เริ่มมีอย่างอื่นให้ pursue เช่นเรื่องการสอบเข้าหรือที่ตอนนั้นเริ่มชอบ math มากขึ้น อะไรพวกนั้น

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

สมัยมัธยมปลาย เริ่มได้ทำกิจกรรมนู่นนี่นั่น เยอะขึ้น (แต่ก็หนีไม่พ้นเรื่อง nerd) ความขยันอ่านหนังสือเรียนลดลง! ตอนนั้นมีเครื่องเกม PS2 ที่เคยอยากได้มาตลอด แต่สุดท้ายก็ได้เล่นเกมนับเป็นเกมคงไม่เยอะเท่า PS1 ส่วนนึงเพราะมันมีอย่างอื่นน่าสนใจ + บันเทิง ให้ทำเยอะกว่าก็เลยเลิกเล่นเกมไปเลย ก

ารแบ่งเวลานับว่าทำได้แย่ รู้สึกได้อ่านหนังสือสอบ Ent (รุ่นสุดท้าย) น้อยมาก มาเร่งอ่านเอาช่วงท้ายๆ โชคดีตกใส่หัวที่ได้โควต้าคอมตรงของโครงการโอลิมปิก ตอนเทอมสองเลยไม่ต้องอ่าน Ent แล้ว –/\- กราบขอบพระคุณ สสวท. และ Turbo C++ เวอร์ชันเถื่อน

สุดท้าย สมัยมหาลัย นับเป็นจุดต่ำสุดของการแบ่งเวลา!

  • ไม่เคยเข้าเรียนฟิสิกส์ 2 … เลย!
  • ไม่ยอมนั่งทำโจทย์เก่าวิชาพวก Calculus เกรดเลยออกมาเน่ามาก (แมวตรึม)! ถ้าอยากไปเรียนสาขาพวก Finance จะไม่ได้ไปก็เพราะไอ่ถั่วงอกพวกนี้แหละ
  • นอนดึก ตื่นเที่ยง เป็นปกติ
  • มีเหตุผลนับล้านให้โดดเรียน
  • ไม่สามารถใช้เวลาว่าง (คาบว่าง วันไม่มีเรียน) ให้เกิดประโยชน์สูงสุดได้
  • ทำตัวเหลวไหล บัดซบ

 

จนตอนนี้มาถึงช่วงการทำงาน แน่นอนว่าพอเริ่มทำงานปุ๊บก็ต้องปรับเวลาในชีวิตอย่างมาก

  • เวลาว่างที่เคยมีเยอะๆเหลือแค่ 2 วันต่อสัปดาห์ + เย็น 5 วัน และให้ลาได้ปีละ 15 วัน
  • ต้องตื่น และไปทำงานเช้าขึ้น (อันนี้ก็ยังต้องพยายามปรับอยู่)

 

เวลาว่างที่เหลือน้อยลงเหล่านี้ก็นำมาใช้ประโยชน์ได้ยาก กลับมาจากที่ทำงานวันธรรมดา ถึงบ้านประมาณ 2 ทุ่ม ก็ไม่อยากทำอะไรแล้ว (กลับช้าเพราะไปสาย) ส่วนวันเสาร์อาทิตย์ก็อยากพักผ่อน … ด้วย internet!

เวลาถูกเผาไปด้วย pattern นี้นับปี … อันนี้เป็นจำนวนการค้นหาด้วย Google ของผม แบ่งตามชั่วโมง ของปีที่ผ่านมา

year

เห็นได้ชัดว่า ไอ่ผู้ชายคนนี้มันใช้ net อะไรเยอะแยะวะเนี่ย! แถมยังมีช่วง ตี 1 – 6 โมงเช้า เป็นจำนวนนึงอีก! อย่าลืมว่านี่มาจาก stat ของผู้ชายที่ทำงาน full-time ตลอดทั้งปี

จนเมื่อเร็วๆนี้เอง ผมเพิ่งย้ายเข้าไป condo ที่ไม่มี net ใช้ แน่นอนว่าเวลาตอนเย็นถูกใช้ไปกับอย่างอื่นที่ไม่ใช่ internet แน่นอน ที่ผ่านมาได้ทำ:

  • ออกกำลังกาย
  • อ่านหนังสือ (มากมายนับไม่ถ้วนใน Kindle)
  • เขียนโค้ด (แบบที่ไม่ต้องถาม Google ตลอดเวลา)
  • นอนฟังเพลง
  • ใช้เน็ตมือถือ (อ่าว เฮ้ย!!!)

 

ที่รู้สึกคือ เวลาผ่านไปอย่างมีคุณค่ามากขึ้น เหมือนกับตอนนี้ มีคนมาคุมเวลาให้อีกครั้งแบบในสมัยเด็กๆ (ว่าวันธรรมดาห้ามเล่นเกมส์) เพราะสุดท้ายโตป่านนี้ผมก็ยังคุมเวลาตัวเองไม่ได้อยู่ดี ถ้าโดนควบคุมด้วย environment แบบนี้ก็คงเวิร์คอยู่

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

month

เสียดายที่ Google ไม่เปิดให้ดูเดือนใดๆ ไม่งั้นคงเทียบกับ pattern การใช้ของตัวเองในสมัยก่อนได้ดีขึ้น

แนะนำ practice นี้ให้ทุกคนที่มีปัญหากับชีวิตและโดน internet ดูดเวลาครับ

เอาจริงๆเร็วๆนี้มีเรื่องให้ต้องติด net ที่คอนโดซะแล้ว ไม่รู้จะกลับไปเป็นแบบเดิมมั้ย T^T