ตามล่าหา SVN Hosting ….

ตอนนี้ทำ Project Software ที่ต้องทำงานเป็นทีม ตอนนี้ทำงานกันอยู่ 2 คน ปัญหาหลักคือ พอเอา Source Code ที่มีไปลองเขียน แล้วต่างคนต่างแก้ มันกลายเป็นว่า Source Code ที่ทำมันไปคนละทิศคนละทางไป และการจัดการเป็นไปได้ยาก แถมด้วยถ้าแก้แล้ว Save ไปๆ มาๆ แล้ว Code ที่ใส่ลงไปใหม่ดันมีปัญหา ไม่เข้ากับ Code ตัวอื่น ๆ หรือ Function ใหม่ไม่เข้ากับ Function เดิม และจำเป็นต้องย้อนกลับไปใช้ Code เดิมที่แก้ มันทำให้การกลับไปใช้ตัวเดิมเป็นไปได้ยาก เพราะส่วนใหญ่ไม่ได้ Backup ไว้ ซึ่งลำบากลำบนอย่างมาก

ทางแก้ของปัญหาหานี้คือใช้ระบบ Control Version System หรือ CVS นั้นเอง ส่วนเรื่อง CVS มันเป็นยังไงหาใน Google เอาแล้วกันนะครับ สำหรับคนที่สนใจ เว็บไทยหลาย ๆ เว็บก็มีพูด ๆ ไว้ และในปัจจุบันนั้น ระบบ SVN หรือ SubVersioN นั้นเอง โดยมีข้อดีมากกว่า CVS พอสมควรเลย ซึ่งผมต้องการหา Hosting ที่รองรับ SVN ซึ่งของคนไทยนี่หาไม่เจอเลย แล้ว Hosting ที่เช่าอยู่ก็ไม่มี Mod ของ Apache นี้ลงอยู่ในเครื่อง มันเลยต้องตามล่าหาของ Free ใช้ไปก่อน โดยไปเจอ http://opensvn.csie.org/  เข้าซึ่งตอนนี้กำลังทดสอบอยู่ว่า มันจะ ทำอะไรได้บ้างและระบบมีความเสถียรพอหรือไม่ เพราะเดี่ยวซวยเวลาจะ Update หรือ Commit แล้วมันล่มเดี่ยวจะมีปัญหาเอา

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

สุดมันกับ A* Search Algorithm -_-“

ตอนนี้งานค่อนข้างเยอะเลย -_-" เรียน Software Engineering แล้วทำ Term Project ที่เป็นระบบแผนที่ ตอนนี้หา Algorithm ที่มาใช้ในการค้นหาเส้นทางที่ดีที่สุด และเหมาะสมที่สุด หาไป หามา ก็ได้ A* (A-Star) Search Algorithm ซึ่งเป็น graph search algorithm ที่ค่อนข้างจะเข้าท่ามาก คิดโดย Peter Hart, Nils Nilsson และ Bertram Raphael ในปี 1968 แม้ว่าจะไม่เคยเรียนมาก่อน ก็ด้วยเหตุการณ์จำเป็น เลยต้องศึกษาเอาไว้ เดี่ยวทำระบบไม่ได้แล้วจะยุ่ง

โดย A* เนี่ย มันเป็น Algorithm ที่ใช้ในการหาเส้นทางที่ดีที่สุด (บอกไปแล้วจะบอกทำไมอีกหว่า -_-") คือมันจะมีทั้งหมด 3 ส่วนที่ทำให้เส้นทางต่าง ๆ นั้นถูกตัดสินใจให้ใช้ หรือไม่ให้ใช้โดย

  1. Heuristic : คือค่าสำหรับการตัดสินใจในการผ่านจุดใด ๆ โดยให้เกณฑ์เป็นตัวเลข
  2. Cost : คือค่าใด ๆ ที่บ่งบอกถึงค่าใช้จ่าย หรือระยะเส้นทางที่ใช้เวลา หรืออะไรก็แล้วแต่ ที่ทำให้เส้นทางนั้นเหมาะสมต่อการใช้หรือไม่ โดยให้เกณฑ์เป็นตัวเลข
  3. Priority : เป็นค่าที่ได้จาก Heuristic + Cost จะได้เป็นค่า Priority ออกมา โดยจะเป็นตัวบ่งบอกว่าเส้นทางดังกล่าวนั้นเหมาะสมที่จะผ่านหรือไม่ โดยวัดจากตัวเลข

เรากำหนดให้

  • Heuristic = H
  • Cost = C
  • Priority = F

โดยตัวอย่างนี้เรากำหนดจุดเริ่มต้นคือ S และจุดหมายปลายทางคือ G

  • เส้นสีเหลียงคือเส้นทางที่ดีที่สุด
  • เส้นสีส้มคือเส้นทางที่น่าจะเป็นไปได้
  • สีเขียวคือจุดปลายทาง
  • สีน้ำเงินคือจุดเริ่มต้น
  1. S มีค่าคือ H:12,C:0,F:12 โดยมีจุดเชื่อมต่อสองจุดคือ A และ B
  2. เราเลยตัดสินใจว่าจะทำการทดสอบว่าเส้นทางไหนมี Priority น้อยที่สุดในกลุ่ม (ในที่นี้คือ 2 ตัวเลือกคือ S-B และ S-A ) ซึ่งมีค่าดังต่อไปนี้ S-B มีค่า H:5,C:8,F:13 และ S-A H:5,C:10,F:15
  3. ในตอนนี้เราตัดสินใจได้แล้วว่าเราจะไป S-B เพราะมีค่า F น้อยที่สุดในกลุ่ม เมื่อถึง S-B แล้วก็ทำการทดสอบเส้นทางอีกครั้งโดยมีจุดเชื่อมต่อ 2 จุดที่ต่อกับ B คือ D และ G เราก็จะได้ค่าที่ B-D และ B-G คือ S-B-D มีค่า H:2,C:16,F:18 และ S-B-G H:0,C:24,F:24 แต่เรายังมีค่าเก่าของ SA อยู่คือ H:5,C:10,F:15 ซึ่งเราต้องเอามาคิดด้วยก็จะได้ 3 ตัวเลือก โดยในตัวเลือกครั้งนี้นั้น S-A มีค่า F น้อยที่สุดในกลุ่ม (มีตัวเลือก 3 ตัวเลือกนะ อย่าลืมหล่ะ ไม่ใช่ 2 ) และ G นั้นมีการเชื่อต่อกับเส้นทางอื่น ๆ อยู่แสดงว่าน่าจะมีเส้นทางที่มีความเป็นไปได้ว่าจะดีกว่า S-B-G ด้วย
  4. เมื่อถึง S-A แล้วก็ทำการทดสอบเส้นทางที่เชื่อมต่อกับ A ซึ่งมีเส้นทางอยู่ 2 เส้นทางคือ C และ G ก็จะได้ S-A-C ที่มีค่า H:5,C:12,F:17 และ S-A-G ที่มีค่า H:0,C:20,F:20 เราอย่าลืมว่าเรามีค่าเก่าอยู่อีก 2 ตัวคือ S-B-D มีค่า H:2,C:16,F:18 และ S-B-G H:0,C:24,F:24 แต่ S-B-G นั้นมีค่ามากที่สุด และยังมีจุด G ซึ่งซ้ำกับ S-A-G ที่มีค่าน้อยกว่า เราเลยตัดทิ้งไปเพราะจุดหมายปลายทางคือ G ซึ่งเราต้องการหาค่าเส้นทางที่ไปถึง G ที่น้อยที่สุดเท่านั้นจึงตัด S-A-G ทิ้งไป โดยในที่นี้ ค่า F ของ S-A-C นั้นน้อยที่สุดในกลุ่ม เราก็เลือกให้เดินต่อไปที่ S-A-C โดย S-A-G นั้นยังมีเส้นทางอื่นที่เชื่อต่อแสดงว่าน่าจะมีเส้นทางที่ดีกว่าอยู่
  5. เมื่อถึง S-A-C เรามีเส้นทางอยู่ 2 เส้นคือ E และ G โดยที่ S-A-C-E นั้นมีค่า H:2,C:15,F:17 และ S-A-C-G  นั้นมีค่า H:5,C:21,F:26 และค่าที่เหลืออยู่คือ S-B-D มีค่า H:2,C:16,F:18 และ S-A-G H:0,C:20,F:20 โดยที่ค่า F ของ S-A-C-E นั้นน้อยที่สุดในกลุ่มทั้ง 4 ตัวเราก็จะเลือกเดินไปที่ E และ S-A-C-G ก็ต้องนำออกจากกลุ่มด้วยเพราะ S-A-G นั้นมีค่า F น้อยกว่า
  6. โดยเมื่อถึง E แล้ว เส้นทางมีเส้นเดียวคือเส้น S-A-C-E-G ซึ่งมีค่า H:0,C:17,F:17 ซึ่งน้อยกว่า SBD H:2,C:16,F:18 และ S-A-G มีค่า H:0,C:20,F:20 เราก็จะเลือกเส้นทาง S-A-C-E-G เป็นเส้นทางที่ดีที่สุดในการเดินทางจาก S ไปถึง G โดยใช้ Priority ที่ 17, Cost ที่ 17 และ Heuristic ที่ 0

Animation สามารถทดลองเล่นได้ที่ JSearch demo ครับ
ซึ่งวิธีการ A* นั้นส่วนใหญ่จะใช้ในการเดินทางของ AI ในเกมส์ต่าง ๆ โดยหลักการนี้มีเขียนไว้ที่ Game Character Path Finding in Java โดยใช้ในการเขียนการค้นหาคู่ต่อสู้ในแผนที่ของเกมส์โดยใช้ Heuristic ที่เปลี่ยนแปลงไปโดยตลอด และเส้นทางที่น่าจะเป็นไปได้ หรือใช้ระยะทางในการกำหนดค่าของ Cost ในการค้นหาศัตรูด้วย ส่วน Code นั้นเดี่ยวขอเวลาเขียนก่อน ตอนนี้ได้ Idea เท่านั้น -_-"

Framework , Library , Platform, Architecture และ AJAX

ผมมีคำถามที่ไม่เข้าใจ ให้ช่วยแนะนำแนวทาง ดังนี้ครับ
1. framework คืออะไร เกี่ยวข้องกับ library ไหม
2. แพลตฟอร์มกับสถาปัตยกรรมต่างกันอย่างไร
3. AJAX คืออะไรครับ

Framework นั้นใน Software development เป็นการสร้างโครงสร้างของ software project ที่สามารถรวบรวม และพัฒนาสิ่งต่าง ๆ ได้ โดยที่ framework นั้นจะมีโปรแกรมสนับสนุน (IDE), library, scripting language และซอฟต์แวร์อื่นๆ ที่ช่วยในการพัฒนา ตัวอย่าง Framework ก็ Eclipse ที่เป็น Java Framework จาก IBM, NetBeans จาก Sun Microsystems, Microsoft .NET จาก Microsoft, Ruby On Rails สำหรับเขียน Ruby, Cocoa จาก Apple Computer ฯลฯ ส่วนถ้าใน Hardware development เป็นพวกการรวมกันของระบบ เช่น SuperComputer ที่ต้องใช้ Hardware เฉพาะที่เข้ากันได้, Macintosh ที่ต้องใน CPU ที่ออกแบบมาเฉพาะสำหรับการทำงานร่วมกับ Mac OS เป็นต้น
ซึ่งในส่วนของ Framework ที่เป็น Software development นั้น บางครั้งก็สามารถแยกย่อยได้เป็น 2 ส่วนคือ Runtime และ SDK (Software Develop Kits) ซึ่ง Runtime นั้นเป็นการทำให้ซอฟต์แวรที่พัฒนาจาก SDK สามารถทำงานได้ โดยที่ไม่ต้องลง SDK ทั้งหมด ถ้าคิดง่ายๆ คือ SDK เป็น super set ของ Runtime อีกที

Library เป็นการรวมกันของ subprogram ที่ช่วยในการพัฒนาซอฟต์แวรต่าง ๆ ถ้าใน c/c++ ก็พวก stdio, iostream, string ฯลฯ ซึ่งเราต้อง include ถ้าใน java ก็พวก import ต่างๆ เช่น swing อะไรพวกนี้เข้ามาใน code ของเราเพื่อช่วยให้เราไม่ต้องเขียนในส่วนนั้น ๆ ตัวอย่างเช่นใ น MFC ที่สามารถ include Library พวก win32 เข้ามาเพื่อสร้าง GUI ในภาษา visual c++, visual basic

Architecture เป็นศาสตร์ และศิลปของการออกแบบสิ่งของ และโครงสร้างต่าง ๆ โดยมุ่งเน้นในความเป็นกลางของระบบที่เข้ากันได้ในแต่ละรายละเอียด ทั้ง Software และ Hardware

Platform เป็นรายละเอียดต่างๆ ที่นำมารวมกันของ framwork (ทั้ง hardware หรือ software) ที่ยินยอมให้ทำงานได้ ซึ่งมันเป็นการรวมกันของ Computer architecture, operating system หรือ programming language และรวมไปถึง runtime library ตัวอย่างเช่น Wintel เป็นการรวมกันของ Intel x86 หรือ compatible hardware และ Windows operating system, Macintosh เป็นการจัดจำหน่วยบน platform ของ Apple Computer hardware และ Mac OS operating system และพวก video game console ต่าง ๆ พวก xbox, ps(1,2,3) game cube ฯลฯ

AJAX หรือ Asynchronous JavaScript and XML นั้นเอง ซึ่งมันทำงานโดยใช้

  • HTML/XHTML/CSS เพื่อแสดงผล
  • Document Object Model ทำการส่งค่า html และทำงานโดยผ่าน JavaScript เพื่อทำการแสดงผลแบบ dynamic ให้กับ HTML/XHTML/CSS มากขึ้น
  • XMLHttpRequest เพื่อทำการส่งข้อมูลเข้า และออก web server เพื่อประมวลผล

Web browser ที่สนับสนุนคือ

  • Apple Safari 1.2 ขึ้นไป
  • Konqueror ทุกรุ่น
  • Microsoft Internet Explorer (and derived browsers) 4.0 ขึ้นไป
  • Mozilla Firefox (and derived browsers) 1.0 ขึ้นไป
  • Netscape 7.1 ขึ้นไป
  • Opera 7.6 ขึ้นไป
  • ฯลฯ ในอนาคต

ซึ่งจริงๆ แล้วเป็น Technology ที่ใช้ใน Outlook Web Access อยู่แล้ว ซึ่งทำงานผ่าน Microsoft Exchange Server โดยทำงานบน Microsoft Internet Explorer 4.0 ต่อมาในปี 2005 นั้น Google ก็เอามาใช้ใน Google Groups, Google Maps, Google Suggest และ Gmail
ถ้าไล่ตามลำดับแล้ว จากขนาดใหญ่ไปเล็กก็ไล่จาก
Platform -> Architecture -> Framework -> Library -> AJAX

จะเรียนเกี่ยวกับคอมพิวเตอร์

ผมขอแยกออกเป็น 3 ด้าน ด้วยกัน
1. Software Production, Algorithm & Theory ซึ่งคือด้าน Computer Engineering, Computer Science, Information Science เป็นการศึกษา เรื่องของ

  • correctness โปรแกรมที่คุณเขียนจะต้องถูกต้องทุกกรณี ไม่มีความผิดพลาดเกิดขึ้น โดยต้อง ทำ math proof ได้ ว่าทำไมถึงถูกต้อง
  • performance โปรแกรมที่เขียนจะต้องมีประสิทธิภาพใสการทำงานสูง ทำงานเร็ว โปรแกรมเปรียบเทียบบางโปรแกรมอาจจะใช้ O(n2), O(n3) แต่คนที่มีความรู้เรื่อง algorithms เป็นอย่างดี อาจจะสามารถเขียนให้โปรแกรมทำงานใน O(n logn) หรือ O(n) ได้
  • efficency โปรแกรมที่เขียนจะต้องทำงานได้ดีที่สุดโดยใช้หน่วยความจำน้อยที่สุด
  • OS เวลาเขียนโปรแกรมใหญ่ ๆ ที่ใช้ thread มากมาย ถ้าเขียนแล้วเกิด deadlock ขึ้นคุณจะแก้ปัญหายังไง แก้ปัญหาเรื่อง priority อีก ว่า thread ไหนจะได้ทำงานก่อน ถ้าคุณไม่เข้าใจเรื่องนี้ ก็อาจจะเขียน thread มั่ว ๆ ซึ่งอาจทำให้โปรแกรมทำงานช้า, เกิด deadlock ได้
  • data communication and network ในระบบ LAN คอมพิวเตอร์มันคุยกันได้ยังไงครับ ในเมื่อ IP address เป็นสิ่งที่สมมติขึ้นมา ในการที่เราจะวางระบบเครือข่าย เช่น ใน SW ขนาดใหญ่ เวลา implement อาจจะต้องดูเรื่อง network ด้วย ถ้าคุณไม่เข้าใจเรื่อง router, gateway, dns ต่าง ๆ คุณจะวางระบบไม่ได้
  • AI ปัญญาประดิษฐ์ ถ้าคุณจะไปเป็นนักพัฒนาเกมส์ แล้วคุณไม่รู้จักเรื่อง AI คุณก็จะทำไม่ได้อีก
  • IR ก็เหมือนกัน ถ้าคุณไปเขียนระบบที่ต้องมี Full Text Search นั้นเอง
  • etc …. อื่นๆ อีกนิดหน่อย

ซึ่งศึกษาในเชิงลึกในส่วนของ S/W รวมถึงการจัดการระบบงานต่างๆ และในแนวกว้างในส่วนของ H/W

2. Hardware Design หรือพวกที่เรียนด้าน Electronic และ Physic, Physic (Micro) Controller เป็นการทำงานร่วมกับพวกที่อยู่กับข้อที่ 1 ในการทำ คิดค้นหาอุปกรณ์ใหม่ๆ เพื่อให้ พวกข้อที่ 1 นำไปแก้ปัญหา และตอบ Requestment ของผู้ใช้ต่างๆ ให้ออกมาใช้งานได้ตามที่ลูกค้า หรือผู้ใช้ต้องการ โดยศึกษาในเชิงลึกในด้าน H/W และแนวกว้างในส่วนของ S/W

3. Technical หรือ Consult ต่างๆ เป็นผู้ให้คำปรึกษาต่างๆ แบ่งได้ 3 ระดับคือ

  • Administrator คือผู้ดูแลระบบต่างๆ บางครั้งอาจใช้คำว่า System Director, System Administrator หรือ System Management ติดตั้ง และดูแลในด้านจัดการระบบทรัพยากรระบบงานขององค์กรต่างๆ ดูแล Server หรือเครื่องแม่ข่ายให้อยู่ดี มีสุข
  • Technical Support เป็นคนที่คอยดูแลระบบงานต่างๆ ไม่ว่าเครื่องเสีย เครื่องมีปัญหา ต่างๆ ที่เป็นเครื่องลูกค่ายต่างๆ จะลงไปแก้ไขปัญหา
  • Consult เป็นคนดูแลในด้านการจัดการ ให้คำปรึกษา และแก้ปัญหาในด้านสินค้า นั้นๆ

โดยในด้านที่ 1 และ 2 ต้องมีพื้นฐานทางความคิดมาจากการจัดการความคิดแบบเป็นระบบมากๆ และการเรียนจะเน้นไปในทางการทำงานร่วมกัน เรียนในด้านทฤษฎี และทำการปฎิบัติไปพร้อมๆ กัน ส่วนในด้านที่ 3 นั้นเป็นงานเชิงช่างเทคนิคมากกว่าครับ

ส่วนใหญ่ด้านที่ 1 และ 2 นั้นคนที่จบ ม.ปลายจะสามารถเข้าไปศึกษาได้ง่ายกว่า แต่ก็มีสายอาชีพมาศึกษาเหมือนกันแต่ต้องเก่งจริงๆ
ส่วนด้านที่ 3 นั้น ส่วนใหญ่จะเป็นคนที่ศึกษามาจากด้านสายอาชีพครับ

แต่ไม่ขอฝันธงว่าด้านไหนดี เพราะว่าทุกด้านต้องทำงานร่วมกันอยู่แล้วครับ

Programmer Life Style

  1. ค่าของคน อยู่ที่ผลของงาน
  2. โอกาศในวันพรุ่งนี้ขึ้นอยู่กับการกระทำในวันนี้
  3. จงรักและเชื่อในงานทีทำ ดูแลมันให้เหมือนลูกเหมือนเมีย
  4. สมดุลของชีวิตส่วนตัวและชีวิตงาน ห้ามทำงานเกิน 10ชม. เด็ดขาด
  5. ชีวิตคุณอาจจะมีแค่วันพรุ่งนี้ ดังนั้นทำวันนี้ให้ดีที่สุด
  6. เราเกิดมาเพื่ออะไร คุณค่าต่อสังคมของเราคืออะไร เราทำอะไรให้สังคมบ้าง
  7. คิดก่อนทำ
  8. ทำเสียวันนี้ ไม่ต้องรอวันพรุ่งนี้
  9. อย่ายึดติดกับภาษา มันก็แค่ฆ้อน ตะปู ที่ใช้สร้างบ้าน วิธีการสร้างบ้านต่างหากที่สำคัญ
  10. หมั่นศึกษาหาความรู้ใหม่ๆ โลก IT เปลี่ยนแปลงทุกนาที
  11. ค้นคว้าศึกษาด้วยตัวเองก่อนถามผู้อื่น ความรู้ที่เกิดจากการประมวลผลขึ้นมาเอง จะอยู่ติดเราไปจนตาย
  12. ให้ความสำคัญกับคุณภาพของงานที่ทำให้มากที่สุด มันคือสิ่งวัดคุณค่าของเรา
  13. ชีวิตคือของเรา แต่งานทำให้เรามีคุณค่า และผลงานคือสิ่งที่ทำให้เราอยู่ในความทรงจำ
  14. จงเป็นถูกเลือก ไม่ใช่ถูกลืม
  15. ธุรกิจคอมพิวเตอร์เหมือนเลขฐานสอง เป็น 1 หรือเป็น 0 อยู่รอดหรือดับสูญ
  16. จงทำมากกว่าพูด แต่เมื่อพูดแล้วต้องทำให้ได้ ถ้าไม่ได้อย่าพูดออกมา