ใช้ VisualSVN Server จัดการโปรเจคที่บ้าน

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

วิธีแก้ปัญหาของผมตอนแรกๆ เป็นแบบนี้
Backup ของโปรแกรมที่ทำงานได้แล้ว

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

VisualSVN Server จริงๆ อยากใช้ SVN มาช่วยจัดการ version โปรแกรม แต่ก็ไม่ได้ใช้เพราะคิดว่า setup SVN server ยุ่งยาก
แต่พอมาเจอโปรแกรม VisualSVN Server ซึ่งเล็ก (~4MB) ติดตั้งและตั้งค่าง่าย ก็เลยได้มีโอกาสใช้ SVN จัดการกับโค้ดในเครื่องซักที… มาแนะนำโปรแกรมให้ลองใช้กันครับ

ปีสองทำอะไรไปบ้าง?

ทำไมเวลา 1 ปีมันผ่านไปเร็วจัง?

ลองมานั่งนึกดูว่า 1 ปีที่ผ่านไป เราได้ลองทำอะไรบ้าง?

นอกจากเรียนหนังสือไป 1 ปี ก็นึกออกว่าได้ลองทำอะไรหลายอย่างเหมือนกัน:

- ลองเขียน Nontri Internet autologin

เป็น Firefox Extension (ตัวแรกในชีวิต)ที่ช่วย login เข้าเน็ตอัตโนมัติ
เขียนเสร็จ ปล่อยลงเน็ตปั๊บ สบค. (คนรับผิดชอบระบบ login สำหรับคนใช้เน็ตมหาลัยเกษตร) เขาก็แก้ระบบ login ให้ extension เราใช้ไม่ได้(ไม่กี่นาทีหลังจากปล่อย extension)

- ไปแข่ง TESA Topgun Rally 2008

(ผลการแข่ง)
เป็นครั้งแรกที่ได้ลองเขียนโปรแกรมบน Microcontroller (ในงานใช้ dsPIC33) โจทย์ของการแข่งคือ สร้าง ECU สำหรับรถยนต์ โดยใช้ Real-time OS ได้เรียนเกี่ยวกับ Real Time OS นิดนึงด้วย
แต่ไปงานนี้คิดว่าเราได้เฉพาะบรรยากาศเขียนโปรแกรมบน embedded system เพราะคนอื่นๆ ในทีมเคยเขียนมากันหมดแล้ว (เรา noob สุดๆ) ไปเกาะเขานั่นเอง อิๆ… ได้ไปช่วยๆ นึก state machine/อัลกอริทึมที่ใช้ detect pulse, กับ คำนวณเวลายิง pulse
ในงานแข่งครั้งนี้ได้ใช้ SVN ด้วย (รู้สึกได้ประโยชน์จาก SVN สุดๆ ก็งานนี้แหละ)

- ลองเขียนโปรแกรมตัดคำที่ “ขึ้นกับบริบท”

(แข่ง BEST 2009)
จำได้ว่าตอนอยู่มัธยม พยายามทำ Chatbot เลยค้นรายงานเกี่ยวกับระบบตัดคำภาษาไทยมาอ่าน แล้วก็ได้แต่อ่าน… ไม่สามารถเขียนออกมาเป็นชิ้นเป็นอันได้ เพราะ ใช้ Regular Expression ไม่เป็น (และในรายงานนั้นก็เป็นการตัดคำโดยใช้กฎที่เป็น Regular Expression)
มาตอนปีสองนี่… ลองเขียนหลายอย่างมาก ทั้งแบบ Longest matching (ลองอันแรกเลย ง่ายสุด ฮะๆ), Maximal Matching (ตัดแบบให้จำนวนคำน้อยสุด),…. จนมาถึงตัวตัดคำที่ขึ้นกับบริบท(ที่ใช้แข่ง)

“ฉัน|นั่ง|ตาก|ลม|อยู่|ริม|หน้าต่าง|”
กับ
“เด็ก|ผู้|หญิง|มี|ดวง|ตา|กลม|โต|แวววาว|”

- เขียน Twitnest


เป็นโปรเจคที่คิดว่าจะทำส่งเป็นการบ้านวิชา Practicum ตอนเรียน อ. @jittat สั่งให้ทำ Web App ด้วย Google App Engine ตอนนั้นเราก็ยังไม่มีไอเดียทำโปรเจคอะไรเลย แต่ได้รับแรงบันดาลใจจากท่านภาคย์ ว่าจะทำโปรแกรมประมาณ “เชื่อม social network” ทั้งหลายเข้าด้วยกัน

ทีนี้ท่านภาคย์ อยากให้แสดงผลคล้ายๆ family tree พอคุยไปคุยมา… ก็อยากได้เป็นกราฟ แล้วตอนนั้นก็เพิ่งเริ่มเล่น twitter ใหม่ๆ (เหมือนจะโดนชักชวนโดยเพื่อนๆ CPE21 ที่โดน @jittat ชักชวนอีกที)

เลยหันมาสนใจ Flash เพราะดูโปรแกรมทำกราฟอื่นๆ ที่เขียนด้วย javascript แล้วไม่ประทับใจเท่าไหร่ นั่งบ้าอ่าน Essential Actionscript 3.0 (เป็น text ที่ผมชอบนะ อ่านง่ายดี) อยู่นานมาก… แล้วก็ใช้ FlashDevelop เขียน

ก่อนหน้านี้ไม่เคยสนใจ Flash เลย เพราะรู้สึกงง กับ Timeline, Frame, Keyframe, ฯลฯ รู้สึกว่ามันเป็นโปรแกรมที่เหมาะกับ Designer มากกว่า แต่พอใช้ FlashDevelop แล้วสร้าง Flash ด้วยโค้ดล้วนๆ แล้วรู้สึกสบายใจกว่า :D

โปรแกรม Twitnest นี่เสียเวลากับส่วน Auto-group (จัดกลุ่มคนในกราฟอัตโนมัติ) มากที่สุด แต่เป็นคิดว่าเป็นความสำเร็จแรกในการ อ่าน paper ด้วยตัวเอง แล้วพยายามเขียนโปรแกรมออกมาจนเสร็จ (และคิดว่าได้ผลลัพธ์ถูกต้อง)

- Wordle Clone

ไปเจอ Wordle แล้วก็พบว่ามันสร้าง Wordle สำหรับตัวอักษรภาษาไทยไม่ได้ (เลยอยากสร้างเองให้แสดงภาษาไทยได้)

ลองเขียนเองดูบ้างด้วย Python + Python Image Library (PIL) ได้ผลลัพธ์ดังนี้

เป็นรายชื่อเพื่อนๆ ใน เว็บบอร์ดรุ่น โดย ขนาดของชื่อจะใหญ่ตามจำนวนโพสต์ในบอร์ด (ยิ่งใหญ่ยิ่งปั๊มนั่นเอง)

ตอนนั้นรู้สึกอยากเอา Wordle Clone นี้ขึ้นให้บริการบนเน็ตด้วย ดังนั้นโปรแกรมต้องทำงานเร็ว แต่โปรแกรมที่เขียนตอนแรกมันทำงานช้าไป ความยากอยู่ตรงที่ต้องเขียนวิธีเช็คว่า ข้อความที่เรากำลังจะปะลงไป มันจะซ้อนทับของเดิมรึเปล่า (2D Collision Detection)

ก็เลยบ้าไปนั่งอ่าน text เกี่ยวกับ Computational Geometry เรื่อง Hierarchical Bounding Volume เพื่อที่จะเอามาใช้เช็ค “Collsion ของ ข้อความ” อย่างรวดเร็ว (นั่งงงอยู่นาน) สุดท้าย implement ออกมาได้ (ดีใจสุดๆ)

แต่ก็เจอกับปัญหาว่าการจัด layout ที่ได้มันยังไม่สวยพอ (ไม่สวยเท่าของ wordle) มันยังหลวมๆ ไป… เราก็เลยพับโปรเจคนี้ไว้ และเก็บไว้ใน D:\projects\ ต่อไป เพราะต้องไปทำอย่างอื่นต่อ

- Webpage Language Identification

ทำระบบ ช่วยระบุภาษาหน้าเว็บเพจอัตโนมัติ ทำการระบุในระดับ byte-stream (ดังนั้น encoding จะมั่วก็ไม่เป็นไร)
โปรเจคนี้ทำกับ Mike lab@CPE.KU ใช้ visible Markov-model มาเรียนรู้ลำดับ byte ในเอกสารภาษาต่างๆ… แล้วก็เอาโมเดลที่เรียนรู้แล้วของแต่ละภาษามาระบุภาษาของ unknown อัตโนมัติ (ตอนทำมีภาษา ไทย ญี่ปุ่น ลาว อังกฤษ)

- IR Repeater


วงจรซ้ำสัญญาณรีโมท UBC (ขอเรียกว่า UBC แทน True Vision ละกันสั้นดี)
คือที่บ้านมีเครื่องรับ UBC อยู่ชั้นบน แต่ต่อออกทีวีทั้ง ชั้นบนและชั้นล่าง… ไปๆ มาๆ อยากดู UBC ชั้นล่างบ่อยขึ้น พออยากเปลี่ยนช่อง ก็ต้องวิ่งขึ้นไปชั้นบน จิ้มรีโมทเปลี่ยนช่อง (เหนื่อย)

เลยอยากได้ IR Repeater เอาไว้ใช้รับสัญญาณรีโมทจากชั้นล่าง แล้วยิงซ้ำเข้าเครื่องรับ UBC ชั้นบน

พอได้แรงบันดาลใจจากวิชา Practicum (อีกแล้ว) ที่ได้นั่งประกอบชุด kit เลยทำให้เราอยากประกอบวงจรอีก ค้นๆ ในเน็ตเจอ IR Repeater เขาแจกวงจร (schematic) ด้วย… :D ตอนนี้ก็มีใช้แล้ว ตามภาพครับ

สรุป

ใช้เวลาปีสองได้คุ้มค่ารึเปล่าเนี่ย?…. รู้สึกว่าทำหลายอย่าง แต่ไม่ได้เกาะติดกับเรื่องไหนนานๆ ลึกๆ… เลยรู้สึกเหมือนเป็นเป็ดเลย (บินได้ ว่ายน้ำได้ เดินบนบกได้… แต่ทำได้อย่างละนิดอย่างละหน่อย)

รู้สึกว่า พออยู่ปีสองได้เรียน “พื้นฐานที่จำเป็น” หลายๆ อย่าง ทำให้เราทำ “สิ่งเคยอยากทำแต่ทำไม่ได้ตอนเด็ก” ได้ :) (แต่ก็มีอีกหลายอย่างที่ยังทำไม่ได้นะ)

เฮือก…เขียน blog ได้ยาวมาก (หมักไว้ไม่ได้มาเขียนนาน)

ปิดเทอมใหญ่นี้ ไม่ลงเรียน summer แน่นอน… ยังค้นหาเรื่องที่อยากทำต่อไป (จริงๆ ก็มีค้างอยู่หลายเรื่อง) แต่อยาก up skill อื่นๆ นอกจากคอมฯ บ้าง :)

ปล. ถ้าผมเขียน blog ได้น่างงงวย ช่วยบ่นด้วยการ comment ด้วยครับ :D จะได้เอาไปปรับปรุงสำหรับ blog ถัดๆ ไป

กลับลำดับ Bit ในตัวแปร Integer

วันนี้เขียน Micro C ลง dsPIC30 (เป็น Microcontroller ตัวนึงน่ะนะ) ต้องการเขียนโปรแกรมให้กลับลำดับ bit ในตัวแปร x

x = 01001111000000001010101011110000

ให้กลายเป็น

y = 00001111010101010000000011110010

(คือ เขียน bit ใน x จากหลังมาหน้านั่นแหละครับ)

ตอนแรกพยายามนึกวิธีเอง ได้วิธีถึกๆ แบบต้องวนลูป 32 ครั้งค่อยๆ ดึง bit ตัวท้ายออกมาใส่อีกตัวแปรนึงไปเรื่อยๆ (32 ครั้ง = 32 bit) พอไปค้นในเน็ตเจอ Bit Twiddling Hacks ซึ่งแข็งแกร่งมาก (ทำเสร็จในไม่กี่ operation) ขอเอาโค้ดมาแปะตามนี้
Read the rest of this entry »

ตัวอย่างโปรแกรมให้ @kidsdev

บล็อกนี้เขียนเพื่อตอบคำถามของ @kidsdev ที่อยากเขียนโปรแกรมประมาณ Robolab ด้วย Flex (http://tinyurl.com/dy9of4) ขอตอบลงบล็อก เผื่อจะมีประโยชน์กับคนอื่นๆ ด้วยครับ

ขอยกตัวอย่างวิธีสร้างโปรแกรมต่อไปนี้ละกันครับ


Read the rest of this entry »

twitnest: มาดู social graph ใน twitter กันเถอะ

twitnest 0.1

นี่คือกราฟของเพื่อนๆ ผมใน twitter ครับ เส้นเชื่อมบ่งบอกว่า ใคร follows ใครบ้าง
ถ้าอยากลองดูกราฟของคุณบ้าง ลองเข้าไปที่ http://twitnest.appspot.com/

ความสามารถของ twitnest 0.1
- Who knows who? – คลิกคนที่คุณอยากรู้ว่าเขา follows ใครบ้าง
- Auto-group – ช่วยจัดกลุ่มคนในกราฟอัตโนมัติ เวลาใช้ก็คลิกปุ่มแล้วก็เลื่อน slider ไปทางขวาเรื่อยๆ จนได้จำนวนกลุ่มที่พอใจ (เลือกได้ว่าอยากได้กลุ่มมากๆ หรือน้อยๆ) โดยคนที่มีชื่อสีเดียวกันคือคนที่อยู่กลุ่มเดียวกัน

วิธีควบคุม
- drag กราฟไปมาเพื่อเลื่อนตำแหน่งที่ดูได้
- scroll mouse wheel เพื่อซูมเข้าซูมออก
- drag คนในกราฟเพื่อเปลี่ยนตำแหน่งได้ครับ

เมื่อคืนหักดิบ ปั่นให้เสร็จเพื่อที่จะเอาลงเน็ตให้คนอื่นได้ลองใช้ซักที (หลังจากดองเค็มไว้ในเครื่องนานกว่า 4 เดือน)
ถ้าเล่นแล้วมี comment หรือจะรายงาน bug ขอให้ทิ้งข้อความไว้ให้ @nattster หรือที่ blog นี้ได้เลยครับ :D

Read the rest of this entry »

ปั่นจักรยาน

ชอบปั่นจักรยานใน ม.เกษตร ช่วงวันหยุดมากๆ

เพราะถนนมันโล่ง ไม่ต้องระวังรถเท่าไหร่… ปั่นสนุกสนานเหมือนเวลาไปเที่ยวแล้วไปปั่นจักรยานเลย :D

ช่วงค่ำๆ รถก็น้อยเหมือนกัน แต่มืด น่ากลัว แถมมีข่าวว่ามีคนถีบจักรยานให้ล้ม เพื่อขโมยของด้วย (น่ากลัวฉิบ)

มีคืนนึงเลี้ยวผิดซอย … เข้าไปเจอ น้องหมาสองตัว แยกเขี้ยวใส่ แฮ่!!!! น่ากลัวมาก
แถมยังวิ่งเข้ามาอีก – -” adrenaline หลั่งไหล รีบปั่นอ้อมไปออกอีกทาง
ระหว่างปั่นหนี มันก็ยังไล่เห่า ไล่ตามอีกนะ (จะโหดไปไหนเนี่ย)
ในที่สุดก็หนีรอดมาได้โดยไม่โดนกัด

โพสต์นี้ โดนใจอย่างแรง

ช่วงสอบนี่เหนื่อยสุดๆ บางวันก็หงุดหงิดสุดๆ อาจเป็นเพราะโดนคาดหวังเยอะ โดนคาดคั้นเยอะ

วันนี้อ่านเจอโพสต์เนื้อหาดีๆ ของ maikub ในบอร์ดรุ่น ดังนี้ (ขอแปะให้ลองอ่านละกัน)

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

” ความผิดเท่านี้เทียบกับโจรสามจังหวัดภาคใต้ หรือไอ้พวกพนักงานรัฐที่รับใต้โต๊ะ โกงกินชาติ หรือพวกข่มขืนฆ่าไม่ได้เลยซักนิด แต่เอามาพูดซ้ำกันอยู่ได้”

คน ทุกคนทำผิด ตัดสินใจผิดก็ต้องการการให้อภัย… อย่างไรก็ตามมันให้กันยาก แม้เราจะรู้ว่าควรให้ เพราะบางเรื่องมันอภัยไม่ได้!!! (แม้จะไร้สาระแค่ไหนก็ตาม)

ตอนเด็กๆเราเชื่อฟังพ่อแม่ ครูอาจารย์
ตอน โตเราฟังน้อยลงเพราะเรามีเหตุผลมากขึ้น แต่อย่าลืมว่าเหตุผลของเราไม่ได้ถูกเสมอไป บางเรื่องมันก็ undecidable… บางเรื่องเราก็ใช้เหตุผลผิด (ลืม discrete ไปแล้วเหรอ p->q != q->p)… แต่เรื่องส่วนใหญ่เรามักเข้าข้างตัวเอง (แหงสิ ไม่งั๊นจะให้เข้าข้างใคร อิอิ)…

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

เหตุผล -> 20% จิตสำนึก
ใจ -> 80% จิตใต้สำนึก
บางครั้งเราก็หาเหตุผลดีดีให้บางเรื่องไม่ได้ แค่ใจคิดว่ามันดีแล้ว

ขอพิมพ์นิดนึง (ไม่ได้เกี่ยวอะไรกับกระทู้เลย)

สอบไม่ได้ -> คะแนนไม่ดี -> เพราะอะไร …

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

อาจารย์สอนไม่รู้เรื่อง ?
x อย่างไรก็ตามถึงแม้สอนไม่รู้เรื่องจริงๆ พวกเทพเค้าก็เทพอย่างเดิมไม่ว่าอาจารย์จะสอนยังไง
(นึก ถึงตอนสอน C# น้องๆ ถึงแม้จะรู้ตัวว่าสอนไม่รู้เรื่อง แต่… มึงไม่รู้เรื่องก็ถามกูสิ กูถามก็ไม่ตอบ นั่งบื้อกันแล้วบอกว่าไม่รู้เรื่อง สม >.< บางทีอาจารย์บางคนที่สอนเราอยู่อาจคิดแบบนี้ก็ได้นะ 555)

โทษว่าอาจารย์สอนไม่รู้เรื่อง ?
x ต่างกันที่คุณตั้งใจพอหรือยัง พยายามเข้าใจหรือยัง… (ถึงแม้บางคนจะสอนงงจริงๆ เช่น เรา ^O^)
(คงได้เห็นในวิชา Digital… ข้อสอบยากระดับหนึ่งเลยล่ะ
แต่นึกสภาพตอนเรียนแล้ว… ก็ไม่แปลก
ถ้าเค้าเคืองจริงๆวิชานี้ออกได้นรกกว่านี้มาก แต่ก็นะพาร์ทหลังนี้ยากมากแน่ๆ
นึกถึงชั่วโมงที่เค้าด่าเรื่องคอมบนโต๊ะ…หลังจากนั้นทุกอย่างก็เหมือนเดิม ^^ แม้แต่เรา)

หัวไม่ไป ?
x ยอมรับว่าคนทุกคนถนัดแต่ละด้านไม่เท่ากันแน่ๆ แต่ถ้าได้พยายามแล้วก็พอแล้วล่ะ (แต่พยายามเป็นกิจวัตรนะ ไอ้ที่พยายามก่อนสอบอย่างบ้าคลั่งเนี่ย…ช่างมันเถอะ)

ไม่ได้เข้าเรียนเพราะงานยุ่ง / ตื่นสาย / เข้าไปเรียนก็ไม่รู้เรื่อง ?
x งานยุ่งจริงคงช่วยไม่ได้…
x ตื่นสายไม่เคยเป็นข้ออ้างที่ดี ถึงจะจริงก็เถอะ…
x เข้าไปเรียนก็ไม่รู้เรื่อง (ถ้าไม่เข้าแล้วเอาเวลาไปทำประโยชน์ก็ดีนะ…ถ้าเอาไปทำประโยชน์)
(หัวข้อ นี้นึกถึงวิชา elec secบน… แต่พอคิดแล้ว ถ้าเข้ามาคุย…ไม่เข้าดีแล้วล่ะ >^< แต่คนที่ไม่เข้าทำไมคะแนนดีกว่าคนเข้ามากมาย 555 กุโง่เอง กุมันไม่อ่านหนังสือสอบ)
อย่างไรก็ตาม เข้าไม่ถึง 80% หมดสิทธิ์สอบนะ… (อาจารย์คนไหนโหดๆคงน่ากลัว)

ปล0. ไอ้ที่ว่าทั้งหมดเราก็ทำ ถึงแม้จะรู้ (เชื่อเถอะทุกคนก็รู้ตัวเองดี รู้ว่าอะไรถูก อะไรผิด) แต่ก็ทำไม่ใช่เหรอ = =a

ปล1. การขุดคุ้ย – วิจารณ์ – นินทา ความผิดพลาดของคนอื่นเป็นเรื่องสนุกของคุณ ไม่ใช่ของเจ้าของเรื่องนั้น

ปล2. วันไหนไม่มีพวกเทพๆแล้วเราจะสอบกันยังไงเนี่ย = =a.

ปล3. รู้เขารู้เรา รบร้อยครั้ง ชนะร้อยครั้ง
อาจารย์แต่ละคนไม่เหมือนกัน (คนแต่ละคนก็ไม่เหมือนกัน) เลือกวิธีใช้กับแต่ละคนเองละกันนะ

อ่านแล้วอยากดันให้เพื่อนไปเขียนหนังสือ/บทความ ขายจริงๆ :P

AVL Tree ใน python

นั่งแอบเขียน AVL Tree ระหว่างนั่งเรียนวิชา Abstract Data Types (ตัวอย่างไม่ดี โปรดอย่าเลียนแบบ :P )

AVL Tree คือ binary search tree ที่คอยจัดตัวเองให้ balance อยู่เสมอ (subtree ทางซ้าย กับ subtree ทางขวามี depth แตกต่างกันไม่เกิน 2) และการจัดต้นไม้ให้ balance อยู่เสมอทำให้ binary search tree สามารถแทรก/ค้นหา ข้อมูลได้อย่างมีประสิทธิภาพ (ไม่มีปัญหาที่เกิดจากต้นไม้เอียงไปข้างใดข้างหนึ่ง)

AVL Tree ที่เขียนเป็น class มี method isLeaf (เช็คว่าเป็นโหนดลูก), depth (หาความลึกของต้นไม้), balance (คำนวณ balance factor สำหรับต้นไม้), LeftRotate (ทำการหมุนต้นไม้ไปทางซ้าย), RightRotate (หมุนต้นไม้ไปทางขวา), RLDoubleRotate (หมุนสองครั้งแบบขวา-ซ้าย), LRDoubleRotate (หมุนสองครั้งแบบซ้าย-ขวา), insert (แทรกโหนดลงไปในกราฟ), travel (ท่องไปในต้นไม้), printtree (พิมพ์ต้นไม้)

ตัวอย่างต้นไม้ที่ printtree พิมพ์ออกมา

    7
  6
    5
4
    3
  2
    1

ข้างบนเป็นต้นไม้ที่มี 4 เป็น root และมี 2 กับ 6 เป็นลูกทางซ้ายและขวาตามลำดับ โดย 2 มี 1 และ 3 เป็นลูก…. วิธี printtree แบบนี้ ได้เทคนิคมาจาก อ.ที่ค่าย สอวน. ศูนย์ ม.ศิลปากร ครับ :D

(โค้ดอยู่ด้านในนะครับ)
Read the rest of this entry »

Mysweeper version 1 ชม. เสร็จ

mysweeperวันนี้ขอนำเสนอเกมส์ Mysweeper ซึ่งมันก็เป็นเกมส์แบบเดียวกับ Minesweeper ที่เราเล่นกันมานาน (ตั้งชื่อแบบนี้จะได้ออกเสียงคล้าย Minesweeper ต้นฉบับ) แต่ถ้าแปลตรงตัวก็น่าจะแปลว่า “ไม้กวาด ของฉัน” ฮ่าๆ

เกมส์ Mysweeper เป็นเกมส์ที่ปั่นอย่างบ้าระห่ำ ใน 1 ชม. (ไม่ยอมอ่านหนังสือสอบ) เพื่อที่จะเอาไปบอกน้องๆ ปีหนึ่งว่า นี่คือเกมส์เล็กๆ ที่สร้างด้วย Visual C# ได้นะครับ (ผมกำลังจะสอนน้องๆ เรื่อง Windows Form Application ครับ)

แต่เขียนเสร็จเก็บไว้มันก็เท่านั้น เอาโค้ดมาแจกละกันครับ เผื่อใครจะลองเอาไปศึกษาดู อ่านรู้เรื่องไม่รู้เรื่องก็ทิ้ง comment ไว้ได้นะครับ สาเหตุที่เอาโค้ดมาแจกเพราะตอนสมัยหัดเขียน Visual Basic ครั้งแรกๆ ก็มาดาวน์โหลดโค้ดชาวบ้านไปนั่งดู (เยอะมากๆ) โค้ดอันนึงที่ประทับใจมากคือโค้ดของ Tamagotchi Simulator ของคุณ Tooh (พีรภัทร์ สว่างเพียร) แล้วเอามานั่งแกะๆ แล้วได้รับความรู้มากมาย

ผมเลยหวังว่าโปรแกรมเล็กๆ ที่ผมเขียนนี้อาจจะเป็นแหล่งเรียนรู้ให้กับคนอื่นได้ไม่มากก็น้อยฮับ

ดาวน์โหลดโค้ดเกมส์ mysweeper (ขนาด 46KB สร้างด้วย Visual Studio 2008)

ใช้ python เรียกโปรแกรมอื่น โดยมี timeout

วันจันทร์ที่ผ่านมาผมนั่งเขียน grader อย่างบ้าคลั่ง เพราะต้องเอามาใช้ตรวจโปรแกรมน้องๆ ในวันอังคาร ผมเขียน grader ด้วยภาษา Python หลายๆคนคงทราบดีว่าโปรแกรม grader เป็นโปรแกรมที่ทำหน้าที่ compile และ run โปรแกรมอื่น เพื่อตรวจสอบว่า input ที่ใส่เข้าไปตรงกับ output ที่ถูกต้องหรือไม่ ถ้าถูกต้องทุก input ก็ถือว่าผ่าน

แต่ว่าโปรแกรมที่เอามาตรวจอาจรันแล้วเกิดอาการติดลูป หรือรันไม่รู้จบ เราจึงต้องกำหนด timeout ว่าให้รันได้ไม่เกินกี่วินาที ถ้าโปรแกรมรันนานเกินไป โปรแกรม grader จะต้องหยุดการทำงาน (End Process) ของโปรแกรมที่ถูกตรวจ

ปรากฏว่าผมไปค้นๆ ในเน็ตก็ไม่เจอตัวอย่างโปรแกรม python ที่สามารถ รันโปรแกรมอื่น แล้วกำหนด timeout แบบง่ายๆ เลย ผมก็เลยพยายามเขียนเอง :D ได้โค้ดมาดังนี้ (ใช้ thread และ subprocess)

import subprocess
from time import sleep
from threading import Thread
 
class process(Thread):
    # written by Natt Piyapramote <nattster at google mail>
    # requires: Python 2.6
    def __init__(self, filename, input_txt=None):
        Thread.__init__(self)
        self.filename = filename
        self.input_txt = input_txt
        self.status = 0
        self.output = ''
 
    def run(self):
        self.process = subprocess.Popen(self.filename,
                                   stdin=subprocess.PIPE, stdout=subprocess.PIPE)
        self.output, self.err = self.process.communicate(self.input_txt)
        self.status = 1
 
def run_process(filename, input_txt=None, timeout=1):
    "run a process with timeout"
 
    p = process(filename, input_txt)
    p.start()
    p.join(timeout)
 
    if p.status == 0:   # process still running?
        p.process.terminate()
        while p.isAlive():
            sleep(0.1)
            print 'killing process...'
 
    return p.output

ตัวอย่างการใช้งานฟังก์ชันนี้ก็

run_process('c:\\windows\\notepad.exe', timeout=4)

ฟังก์ชัน run_process จะไปเรียกโปรแกรม notepad.exe ให้ทำงาน (ซึ่ง notepad จะรันไปเรื่อยๆ ไม่ปิดตัวเอง) ดังนั้นฟังก์ชัน run_process จะหยุดการทำงานของ notepad ภายในเวลา 4 วินาที

นอกจากนี้ถ้าเรารันโปรแกรมที่เป็น Console Application เราสามารถกำหนด Input ให้กับ Standard Input (stdin) และอ่านค่าจาก Standard Output (stdout) ของโปรแกรมที่รันได้ด้วย (กำหนด Input ให้ตัวแปร input_txt แล้วฟังก์ชันจะคืนค่าข้อความจาก stdout)

อ้อ… ฟังก์ชันนี้ต้องใช้ Python 2.6 นะครับ