February 28, 2012

let's code: แก้โจทย์ Google Code Jam

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

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

ภาษาที่ใช้ได้
ภาษาใดก็ได้ที่มี compiler ฟรีให้ใช้งาน
(ตัวอย่างภาษาที่ไม่ผ่านเกณฑ์เช่น Maple, Mathematica)

รูปแบบการตรวจคำตอบ
ดาว์นโหลด test case มาประมวลผลเอง แล้วส่งคำตอบ (พร้อม source code) ให้ server

ตัวอย่างโจทย์
  • Reverse Words: ให้ประโยคในภาษาอังกฤษมาประโยคหนึ่ง จงเรียงลำดับของคำแต่ละคำใหม่ โดยกลับให้ตำแหน่งของคำที่อยู่ด้านท้ายมาอยู่ด้านหน้า ด้านหน้าลงไปอยู่ด้านท้าย
  • Center of Mass: ให้ตำแหน่งและความเร็วของหิ่งห้อยกลุ่มหนึ่งมา จงหาว่าที่เวลาเท่าใด จุดศูนย์กลางมวลของกลุ่มหิ่งห้อยกลุ่มนั้น จะเข้าไปใกล้กับจุด origin มากที่สุด และจุดนั้นอยู่ห่างจากจุด origin เป็นระยะทางเท่าใด สมมติว่านี่เป็นหิ่งห้อยในอุดมคติ (มวลเท่ากัน, ขนาดเป็นศูนย์)
  • Watersheds: ให้แผนที่ระดับความสูงของป่าแห่งหนึ่งมา สมมติว่าเกิดฝนตกทั่วป่า จงแบ่งโซนพื้นที่ป่าแห่งนั้น โดยมีกฎว่าน้ำฝนที่ตกลงมาสู่พื้นนั้น จะไหลจากที่สูงลงไปยังที่ต่ำที่สุดเสมอ

February 26, 2012

Python: เทคนิคสำหรับเขียนให้สั้น

ในภาษาอื่น อาจพบ shorthand if-else เช่น condition ? true : false ; ส่วนใน Python เรามี

อย่าลืมว่าการย่อแบบนี้ ต้องมีส่วน else เสมอนะครับ



สำหรับ generator expressions (หรือที่มักเรียกกันว่า list comprehension เมื่อได้ผลลัพท์เป็น list) มีเทคนิคการกรองข้อมูล (filter) เช่นนี้

ส่วนการซ้อนชั้นของประโยค for ก็จะไล่ทำจากด้านหน้าไปด้านหลังเรื่อยๆ เช่นเดียวกับการวน for หลายชั้นครับ

ข้อสังเกตคือ การ filter นี้มีแต่ if อย่างเดียวนะครับ ไม่มี else และถ้าเอาไปใช้รวมกับ shorthand if-else ก็ระวังว่าจะงงเองหละ



สำหรับการเขียน slice เราสามารถเล่นกับมันได้มากขึ้นอีกโดยการบอก step ครับ

แต่ส่วนใหญ่ประโยชน์ของมันจะมาจากการกลับตำแหน่งของสมาชิกใน list มากกว่า คือ

นอกจากนี้ เรายังสามารถ unzip ตัวแปรในกรณีที่ไม่ต้องการระบุตัวแปรครบทุกตัวได้ด้วย

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

February 25, 2012

PHP: Arrays

Array คือ กลุ่มของตัวแปร ใน PHP แบ่งออกเป็น 3 กลุ่ม คล้าย ๆ กับภาษาอื่น คือ
  • Numberic Array ใช้ตัวเลข (index) ระบุตำแหน่งใน array
  • Associative Array ใช้คำบอกตำแหน่ง array ในบางภาษาเรียก array ลักษณะนี้ว่า dictionary
  • Multidimensional Array เป็น array ซ้อน array

Numberic Arrays


เริ่มนับจาก 0 เป็น index ของ array ตัวแรก


Associative Arrays


จะใช้ คำ (key) แทน ตัวเลข (index) ทำให้มันมีความหมายในตัวเอง เข้าใจง่าย เรียกใช้ง่าย

Multidimensional Arrays


พูดง่าย ๆ คือ การใช้ array เป็นค่าใน array อีกตัวหนึ่งนั่นเอง

February 24, 2012

PHP: If... Else และ Switch

If... Else...


คำสั่งทางเลือก If... Else ใน PHP จะใช้อยู่ 2 แบบ คือ if {} else และ if: else:

elseif ในแบบแรก สามารถเขียนแทนด้วย else if ได้ แต่จะทำงานช้ากว่า เพราะเป็นการแยกคำสั่งออกเป็น 2 คำสั่ง แต่ที่จะเป็นคำสั่งของ if อันแรกอันเดียวก็เป็น if 2 อัน และหากมีคำสั่งใน if แค่บรรทัดเดียวสามารถละ {} ได้ แต่ก็ต้องมั่นใจว่า อ่านโค้ดแล้วไม่งง ส่วนในแบบหลัง elseif ต้องติดกันเท่านั้น, ในแบบหลังนี้มักใช้ตอนที่เขียน PHP ร่วมกับ HTML หรือมีคำสั่งใน if... else เยอะมาก ๆ เพราะอ่านเข้าใจง่ายกว่า เช่น
แต่ถ้าต้องการคืนค่า หรือทำตามคำสั่งสั้น ๆ ง่าย ๆ สามารถใช้คำสั่ง ?: (ternary operator) แทนได้ โดยที่จะมีรูปแบบคือ

ทำการเปรียบเทียบ ? ถ้าเป็นจริงทำอันนี้ : ถ้าเป็นเท็จทำอันนี้


Comparison Operator

operator ในการเปรียบเทียบ จะมีเหมือน ๆ กับภาษาอื่นคือ == คือ เท่ากัน (แปลงค่าเปรียบเทียบกรณีตัวแปรต่างชนิดกัน === คือ เท่ากันทุกประการ (ถ้าตัวแปรต่างชนิดก็จะถือว่าไม่เท่ากัน) != และ <> คือ ไม่เท่ากัน !== คือ ค่าไม่เท่ากัน หรือ ต่างชนิดกัน < คือ น้อยกว่า > คือ มากกว่า <= คือ น้อยกว่า หรือเท่ากับ >= คือ มากกว่า หรือเท่ากับ

Switch

ถ้าตรวจสอบค่าจากตัวแปรตัวเดียว ในรูปแบบต่าง ๆ สามารถใช้ switch แทน if... elseif ยาว ๆ ได้ ซึ่งโค้ดที่ได้จะอ่านง่ายกว่าด้วย เช่น
และก็เหมือนกับ if... else ที่สามารถใช้รูปของ : ได้ด้วย คือ switch(ตัวแปรที่ต้องการ): ...(case: ต่าง ๆ)... endswitch;

และเนื่องจาก เมื่อ switch เจอ case ไหนแล้ว จะทำตาม case นั้นลงไปจนออกนอก switch หากไม่เจอคำสั่ง break; จึงประยุกต์ให้ตรวจสอบค่าหลาย ๆ ค่า แต่ทำคำสั่งเดียวกันได้ อย่างเช่น case: 'violet' และ case: purple จากตัวอย่างข้างบน

ถ้าสังเกต การเปรียบเทียบตัวแปรกับค่าคงที่ ผมจะให้ค่าคงที่ขึ้นก่อน รูปแบบนี้เรียกว่า Yoda Condition ข้อดีของมันคือ ถ้าเราเผลอใช้ = อันเดียวแทนที่จะเป็น == มันจะแจ้ง error ขึ้นมา แทนที่จะทำงานไปตามปกติ แล้วเกิดบั๊กที่ตรวจสอบได้ยาก แต่ข้อเสียคือ ทำให้การอ่านโค้ดไม่เป็นธรรมชาติ (ผู้ชาย เท่ากับ เพศ แทนที่จะเป็น เพศ เท่ากับ ผู้ชาย) ... ยกเว้นว่าจะชื่นชอบ Star War และเข้าใจท่าน Yoda เป็นอย่างดี...

แต่เราก็ไม่ควรจะใช้ Yoda Condition ในทุก ๆ ภาษา, บางภาษาเช่น Java ไม่อนุญาตให้กำหนดค่าตัวแปรในตอนเปรียบเทียบค่าอยู่แล้ว จึงไม่มีเหตุผลที่จะใช้ Yoda Condition แม้แต่น้อย

February 23, 2012

let's code: แก้โจทย์ Interviewstreet

Interviewstreet เป็นเว็บหางานสำหรับโปรแกรมเมอร์แนวใหม่ ที่ตัดสินคัดเลือกคนขั้นต้นด้วยการจัดให้เขียนโปรแกรมแข่งกันซะเลย (แล้วค่อยไปยื่น resume + สัมภาษณ์ทีหลัง) เพียงแค่ทำโจทย์ผ่าน 7 ข้อ ก็มีสิทธิยื่นใบสมัครกับบริษัทเช่น Facebook, Microsoft, Amazon.com, Dropbox ฯลฯ เรียกได้ว่า นอกจากจะได้ฝึกสมองแก้โจทย์แล้ว ยังมีโอกาสลุ้นไปทำงานกับบริษัทเหล่านี้อีกด้วย

แม้ว่าตอนนี้เว็บจะมีโจทย์ให้ไปเล่นไม่มากเท่าไหร่ แต่ความยากนั้นรับรองว่าไม่ธรรมดาแน่นอน (โจทย์ค่อนข้างง่ายแต่ test case โหดมาก) นอกจากที่จะต้องใช้ algorithm ที่มีประสิทธิภาพควบคู่ไปกับ data structure ที่เหมาะสมแล้ว ยังต้องแม่นในการพิสูจน์ทางคณิตศาสตร์เพื่อนำมาลดขนาดของ big-O ด้วยครับ

ภาษาที่ใช้ได้
C/C++, C#, Java,
Haskell, Clojure, Scala,
PHP, Ruby, Python, Perl

ปล. ไม่ต้องกังวลจนเกินไปว่า เขียนภาษาในกลุ่ม script แล้วจะเสียเปรียบกลุ่ม native/managed นะครับ เพราะทางเว็บได้ชดเชยเวลาให้ตามสัดส่วนครับ

รูปแบบการตรวจคำตอบ
ส่ง source code ให้ server ประมวลผลกับ test case

ตัวอย่างโจทย์
  • Meeting Point: หมู่บ้านแห่งหนึ่ง บ้านแต่ละหลังจะสามารถสร้างอยู่บนจุดตัดของกริดได้เท่านั้น จากบ้านหลังหนึ่งถ้าเดินทางตรงๆ ไปจุดถัดไปในทิศทั้ง 4 จะใช้เวลา 1 หน่วย แต่ถ้าเดินทางทะแยงในทิศทั้ง 4 ก็จะใช้เวลา 1 หน่วยเช่นกัน ถ้าให้พิกัดของบ้านทุกหลังในหมู่บ้านแห่งหนึ่งมา จงหาบ้านหลังที่ถ้าทุกคนในหมู่บ้านเดินทางมาประชุมที่บ้านหลังนั้น เวลารวมของการเดินทางของทุกคนจะมีค่าน้อยที่สุด
  • String Reduction: ในระบบภาษาระบบหนึ่ง มีตัวอักษรแค่ 3 ตัวคือ abc เท่านั้น ถ้าต้องการย่อคำในภาษานั้น โดยกฎการย่อคือ จะย่อตัวอักษรไม่เหมือนกัน 2 ตัวที่อยู่ติดกันให้กลายเป็นตัวอักษรตัวที่ 3 ถ้าให้คำๆ หนึ่งมา ให้บอกว่าคำนั้นสามารถย่อให้สั้นที่สุดเหลือกี่ตัวอักษร
  • Changing Bit: ให้บิตของตัวเลขขนาดใหญ่มาก (ใหญ่ได้ถึง 100,000 บิต) มา 2 ชุด ถ้าให้การคิวรี่อีกจำนวนหนึ่งมา ซึ่งสามารถ 1. ทำการเปลี่ยนข้อมูลบิตใดบิตหนึ่งในเลขทั้งสอง และ 2. นำเลขทั้งสองมาบวกกัน แล้วพิมพ์ค่าของบิตในตำแหน่งที่ร้องขอ จงสร้างระบบสำหรับตัวเลขและการคิวรีนี้

เปิดหมวดใหม่ let's code

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

let's code: แก้โจทย์ ACM-ICPC

ACM-ICPC หรือเรามักที่เรียกย่อๆ กันว่า ACM คืองานแข่งขันโปรแกรมมิ่งในระดับอุดมศึกษาทั่วโลก นศ.ที่เรียนทางด้านวิศวกรรม-วิทยาการคอมพิวเตอร์ ก็คงหนีไม่พ้นที่จะโดนอาจารย์ชักชวนให้ลงแข่งเป็นแน่แท้

และด้วยความที่มันเป็นการแข่งที่แพร่หลายมาก ก็ทำให้มี mirror site เกิดขึ้นมากมาย เช่น Online Judge, Zhejiang University หรือจะลองไปถามๆ อาจารย์ที่ภาควิชาคอมพิวเตอร์ดูก็ได้นะ :D

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

ภาษาที่ใช้ได้
C/C++, Java, Pascal

รูปแบบการตรวจคำตอบ
ส่ง source code ให้ server ประมวลผลกับ test case

ตัวอย่างโจทย์
  • 2088 - Entropy: สมมติให้คำในภาษาอังกฤษมาคือ "AAAAABCD" ถ้าย่อตัวอักษรแต่ละตัวด้วยบิตดังนี้ {"A": "0", "B": "10", "C": "110", "D": "111"} จะได้ว่าคำนี้สามารถเขียนด้วยบิตได้สั้นที่สุด (entropy encoding) ถ้าให้คำใดๆ มา จงบอกว่าคำนั้นสามารถย่อได้เหลือกี่บิต
  • 2145 - Lost in Space: ให้ความยาวด้านทั้งสามของสามเหลี่ยมต้นแบบมา และให้เซ็ตของพิกัด xyz ของจุดมาอีกจำนวนหนึ่ง จงหาจุด 3 จุดจากเซ็ตนั้น ที่จะสร้างสามเหลี่ยมคล้ายกับสามเหลี่ยมต้นแบบ (มีสัดส่วนด้านทั้งสามคงเดิม) และมี error น้อยกว่า 0.01%
  • 2334 - Gridland: สมมติประเทศ ซึ่งเมืองแต่ละเมืองอยู่บนกริดขนาด N x M แต่ละเมืองสามารถเดินทางไปยังเมืองอื่นๆ ที่อยู่ติดกันได้ 8 ทิศ คนขายของต้องเดินทางสั้นที่สุดเป็นระยะทางเท่าไหร่ ถึงจะผ่านเมืองครบทุกเมือง

February 22, 2012

PHP: Operator

Operator หรือ ตัวดำเนินการใน PHP จะเหมือนกับ C/C++ คือมี บวก ลบ คูณ หาร หารเอาเศษ เพิ่มขึ้นหนึ่ง และลดลงหนึ่ง

ควรระวังการใช้ เพิ่มขึ้นหนึ่ง(++) และลดลงหนึ่ง(--) ร่วมกับคำสั่งอย่างอื่นตรงนี้ด้วย แต่ถ้าสั่งเดี่ยว ๆ บรรทัดเดียวของมันเองก็ไม่ใช่ปัญหา จะแบบไหนก็ไม่ต่างกัน
การกำหนดค่า นอกจากจะใช้เครื่องหมาย = อย่างเดียวก็ใช้ร่วมกับ operator บวก ลบ คูณ หาร หารเอาเศษ ได้ด้วย หากเป็นการกระทำกับตัวมันเองและค่า หรือตัวแปรอื่น ๆ
ส่วนการเชื่อมต่อข้อความนั้น (string) จะใช้ . ในการเชื่อมข้อความเข้าด้วยกัน แต่ถ้าใช้ร่วมกับตัวแปรชนิดอื่นอย่าง boolean หรือ int ก็จะถูกแปลงมาให้เป็น string ก่อนที่จะเชื่อมต่อกับข้อความ

February 20, 2012

PHP: ตัวแปร

ใน PHP ตัวแปรเป็นประเภท weak type (ไม่ต้องกำหนดชนิดตัวแปรก่อนกำหนดค่า) และ dynamic type (สามารถเปลี่ยนชนิดตัวแปรได้ด้วยการกำหนดค่าใหม่) โดยมีชนิดตัวแปรหลักอยู่ 8 ชนิด คือ

Boolean ที่เก็บค่า true (จริง) หรือ false (เท็จ) โดยไม่คำนึงถึงตัวใหญ่ตัวเล็ก (จะใช้ TRUE หรือ TrUe ก็ true เหมือนกัน) การแปลงเป็น boolean ใช้ (bool) หรือ (boolean)


Integer หรือ int เก็บค่าตัวเลข สามารถกำหนดเป็นเลขฐานสิบ ฐานแปด (ขึ้นต้นด้วย 0) ฐานสอง (ขึ้นต้นด้วย 0b — ต้องเป็น PHP5.4+) หรือฐานสิบหก (ขึ้นต้นด้วย 0x) ก็ได้ และกำหนดเครื่องหมาย - เพื่อให้เป็นค่าลบได้ ข้อจำกัดที่ควรรู้เกี่ยวกับ integer คือ ถ้า php ทำงานแบบ 32bit มันจะมีขนาด 32bit แต่ถ้าทำงานบนระบบ 64bit มันจะมีขนาด 64bit ถ้าค่ามีขนาดเกินที่ int จะเก็บได้ PHP จะแปลงชนิดตัวแปรจาก int เป็น float โดยอัตโนมัติ... การแปลงเป็น int ใช้ (int) หรือ (integer) หรือใช้ฟังชั่น intval() ก็ได้

Float (บางคนเรียก double) พูดง่าย ๆ คือ ตัวเลขที่มีจุดทศนิยม


String เก็บข้อความ โดยมี " (double quoted) หรือ ' (single qouted) ครอบข้อความนั้น ๆ โดย single quoted จะใส่ escape character ได้แค่ \' และ \\ นอกจากนั้นจะเป็นอย่างที่ใส่ ส่วน double quoted จะสามารถใส่ escape character ได้ครบ และสามารถดึงค่าตัวแปรออกมาแสดงได้ด้วย นอกจากนี้ยังมีกำหนดค่าตัวแปรโดย heredoc และ nowdoc ได้


Array เก็บค่าเป็นชุด ๆ ใน PHP สามารถเรียกโดยใช้ index ก็ได้ หรือจะใช้แบบ dictionary หรือ associated array (key => value) ก็ได้ เราสามารถใช้ array เก็บ array ได้ด้วยนะ แต่ระวังซ้อนกันเยอะจนงงเอง...


Object เป็น instance ของคลาส โดยทั่วไป เมื่อสร้างคลาสขึ้นมาแล้ว จะต้องสร้าง object ของคลาสเพื่อเรียกใช้งานฟังชั่นต่าง ๆ ภายในคลาสนั้น ๆ

นอกจากนี้ยังมี ชนิดตัวแปรแบบพิเศษอีก 2 ตัวคือ

Resources ซึ่งเป็นข้อมูลที่ได้จากแหล่งภายนอกอย่าง ฐานข้อมูล หรือไฟล์ จะต้องส่งให้ฟังชั่นที่เกี่ยวข้องดึงข้อมูลออกมาก่อนที่จะนำมาแสดงผล

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

นอกจากนั้นยังมี ตัวแปรแบบ pseudo ที่มักเอาไว้เขียนเป็น doc ของฟังชั่นคือ

Mixed เป็นตัวแปรชนิดไหนก็ได้ (แต่ไม่ได้หมายความว่า "ตัวแปรทุกชนิด" นะ)

Number เป็นตัวเลข จะเป็น int หรือ float ก็ไม่เกี่ยง

Callback เป็น string แต่เป็น string ที่บอกชื่อฟังชั่น มักใช้ในฟังชั่นประเภท callback ที่ส่งค่าต่อให้ฟังชั่นที่เกี่ยวข้องทำงาน แล้วส่งค่ากลับมา

เราสามารถตรวจสอบชนิดของตัวแปรโดยใช้ฟังชั่น gettype()

เราสามารถใช้ var_dump() ที่แสดงข้อมูลทุกอย่างของตัวแปร และ  print_r() เพื่อแสดงข้อมูลของตัวแปรให้อ่านได้ง่าย ๆ แต่ถ้า แสดงออกมาแล้วยังอ่านไม่รู้เรื่อง เพราะติดกันไปหมดก็ครอบส่วนนั้นด้วยแท็ก <pre> ครับ

ใน PHP มีการตรวจสอบค่าเฉพาะของตัวแปรอยู่หลายแบบ ซึ่งบางครั้งก็ดูเหมือนจะซ้ำซ้อนกัน เช่น
  • empty() ตัวแปรนั้นว่างเปล่า (0, '', array(), false) หรือไม่
  • isset() ตัวแปรนั้นถูกกำหนดค่าใด ๆ ที่ไม่ใช่ NULL หรือไม่


ผลที่ได้จะแสดงความแตกต่างระหว่าง empty() กับ isset() ลองสังเกตดูเองนะครับ ; )

แม้ว่า บางอันจะทำให้สับสนไปบ้าง เช่น -1 มีค่าเป็น true, กำหนดค่าตัวแปรเป็น null แต่ถูกมองว่า ไม่เคยมีตัวแปรนี้อยู่, หรือเรียกชนิดตัวแปรว่า float แต่พอสั่งแสดงชนิดตัวแปรกลับแสดงเป็น double แต่มันก็มีข้อดีของมันอยู่บ้าง หากรู้เท่าทัน และรู้จักนำมาใช้ประโยชน์

Visual Basic: รับค่าและแสดงผลอย่างง่าย

การรับค่าจากผู้ใช้เข้ามา แบบง่ายที่สุดคือการใช้ TextBox ร่วมกับ Button เพื่อรับข้อมูล

หรือจะให้ผู้ใช้กดปุ่ม เพื่อมี InputBox โผล่ขึ้นมาก็ได้



เนื่องจาก Visual Basic เน้นการเขียนโปรแกรมแบบ GUI ดังนั้นการรับค่าจึงไม่ได้มีแต่ข้อความเพียงอย่างเดียว สำหรับการรับค่าเข้ามาแบบอื่นๆ ที่ควรรู้จักคือ

CheckBox จะให้ค่าเป็น True หรือ False เท่านั้น

ส่วน RadioButton ก็จะเหมือนกับ CheckBox ทุกประการ ยกเว้นที่ผู้ใช้จะสามารถเลือกได้เพียง 1 อันภายในเขตของ GroupBox หนึ่งๆ เท่านั้น

ด้าน ListBox จะคล้ายกับ RadioButton ตรงที่สามารเลือกได้เพียง 1 อย่างเท่านั้น แต่จะใช้ได้สะดวกกว่าเมื่อมีตัวเลือกจำนวนมากๆ การกำหนดตัวเลือกเริ่มต้นให้มันจะทำผ่าน properties -> data -> items ก็ได้ หรือจะกำหนดค่าให้มันตอนโหลดโปรแกรมดังนี้

และเมื่อต้องการค่าของมันว่าผู้ใช้เลือกตัวเลือกไหน ก็เรียกดูได้จาก

ถ้าผู้ใช้ไม่ได้เลือกอะไรเลย จะได้ค่า index กลับมาเป็น -1 หรือได้ค่า item เป็นข้อความว่างครับ



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

February 14, 2012

misc: เวลาในระบบคอมพิวเตอร์

เมื่อพูดถึงเวลาในคอมพิวเตอร์นั้น เวลา Unix มักถูกอ้างอิงใช้เป็นมาตรฐานมากที่สุด มันคือเวลาเป็นวินาทีนับจากเที่ยงคืนของวันที่ 1 มกราคม 1970 ตามเวลาสากล UTC มาจนถึงปัจจุบัน

สำหรับระบบที่ implement มันแบบ 32 บิท อาจพบปัญหาได้ในปี 2038 เนื่องจากเลขที่ใช้ overflow ครับ



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

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

รูปแบบตัวเลข0 นำหน้าชื่อเต็มชื่อย่อ
วันของสัปดาห์%u%a%A
วันของเดือน%e%d
วันของปี%j
สัปดาห์%V
เดือน%m%b%B
ปี%y%Y
เขตเวลา%z%Z
12 ชั่วโมง%l%I%p
24 ชั่วโมง%k%H
นาที%M
วินาที%S

นอกจากนี้ ยังมีรูปแบบที่ใช้บ่อยๆ ที่ถูกเก็บเป็นตัวย่อไว้ให้เรียกใช้ ดังนี้

%s = เวลา Unix
%D = %m/%d/%y
%F = %Y-%m-%d
%r = %I:%M:%S %p
%R = %H:%M
%T = %H:%M:%S
%c = %a %b %d %H:%M:%S %Y

สำหรับค่าเริ่มต้นเมื่อไม่ได้กำหนดรูปแบบเป็นพิเศษ จะได้รูปแบบเป็น %c เช่น Tue Feb 14 16:03:42 2012 ครับ

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

ปล. ไหนๆ วันนี้ก็วันแห่งความรักทั้งที รู้จักเวลา Unix ไปแล้ว ก็อย่าลืมแบ่งเวลาไปใส่ใจเธอด้วยนะครับ :P

February 12, 2012

HTML: โครงสร้างเว็บ, ลิงก์ และรูปภาพ

รูปแบบโครงสร้างของเว็บหนึ่งๆ จะมีหน้าตาเหมือนกับโครงสร้าง directory บนระบบ Unix สิ่งที่แตกต่างอยู่บ้าง คือสำหรับเว็บจะมีหน้าที่เป็นตัวแทนประจำ directory ที่ชื่อว่า index.html อยู่ (หรืออาจเป็น index.php ก็ได้ เมื่อเขียนเว็บแบบไดนามิก) ซึ่งถ้าเราเข้าไปยัง directory นั้นๆ โดยไม่ระบุไฟล์ มันจะไปเรียกหน้า index นี้มาให้

รูปแบบการระบุ path เพื่อทำการเชื่อมโยงไปยังไฟล์ต่างๆ ภายในเว็บของเราเอง ก็ทำได้ 2 วิธีดังนี้
  • absolute path ระบุตั้งแต่ root directory / ไปจนถึงไฟล์ที่ต้องการค้นหา
  • relative path จะระบุสำหรับตำแหน่ง directory ที่เราอยู่
สำหรับการเชื่อมโยงออกไปยังเว็บภายนอก ต้องขึ้นต้นด้วย domain name/IP address เว็บนั้นๆ แล้วตามด้วย absolute path เสมอครับ



สมมติว่าโครงสร้างเว็บ mysite.com เป็นดังนี้

ถ้าเราอยู่ที่หน้า php.html แล้วต้องการลิงก์ไปยังหน้า about.html เราอาจมองว่ามันมีตำแหน่งคือ ../about.html หรือ /about.html หรือ http://mysite.com/about.html ก็ได้

สำหรับการสร้างลิงก์ไปยังเว็บนั้น จะมีวิธีการเขียน tag ต่างจากตอนก่อนๆ ตรงที่ต้องเพิ่ม attribute เข้าไปคือ

ส่วนการนำรูปภาพมาแสดง ก็ทำการเปลี่ยน tag และชื่อ attribute เป็น



อนึ่ง tag a ยังสามารถวางตำแหน่งในเอกสาร เพื่อให้เราจะโดดไปยังจุดต่างๆ ได้อย่างรวดเร็วคือ

เวลาจะเรียกใช้ ก็เพิ่ม #name ต่อท้ายชื่อ path นั่นเอง เช่นถ้า #jumppoint อยู่ในหน้า index.html

February 11, 2012

HTML: จัดข้อความพื้นฐาน

ข้อความที่อยู่ระหว่าง <body>...</body> จะถูกแสดงผลออกมาเป็นข้อความธรรมดาๆ แต่จะแตกต่างจากปรกติตรงที่ space ติดกันหลายๆ ตัวนั้นมีผลแค่ space ตัวเดียว ส่วนการขึ้นบรรทัดใหม่นั้น มีค่าเท่ากับการ space

ถ้าอยากแสดงผลขึ้นบรรทัดใหม่ ให้ใช้ tag <br /> ครับ ซึ่งโดยส่วนตัวแล้ว ผมไม่ค่อยชอบการขึ้นบรรทัดใหม่เองเท่าไหร่ ใช้การขึ้นย่อหน้าเองด้วย <p>...</p> เอาดีกว่า



ส่วนการใส่ลูกเล่นให้ตัวอักษรนั้น มีรูปแบบดังนี้

อย่างไรก็ตาม ถ้าต้องการทำตัวหนาเป็นหัวข้อเรื่องแล้ว ควรใช้ tag heading แทน ซึ่งมีขนาดได้ตั้งแต่ 1-6 ดังนี้

ส่วนการแทรกตัวอักษรให้ลอยเด่นเป็นพิเศษ ทำได้โดย



การสร้างลิสต์ของข้อความเป็น bullet ก็ทำได้เช่นนี้

ถ้าต้องการให้ bullet กลายเป็นตัวเลขแทน ก็เปลี่ยนเป็น

ส่วนการสร้างเป็นตารางไปเลย

สุดท้าย ถ้าต้องการแบ่งส่วนของเอกสารด้วยเส้นคั่น สามารถทำได้โดย tag <hr /> ครับ

February 8, 2012

HTML: ตกลงกันก่อน

คอมเมนท์ใน HTML เขียนได้ดังนี้

ซึ่งเราอาจมองว่ามันเป็น tag หนึ่งก็ได้ ทำให้ซ่อนส่วนที่ต้องการจะตรวจสอบออกไปก่อน เช่น



เนื่องจาก code ในภาษานี้มักจะยาว เพราะต้องมีการครอบด้วย tag ที่ใหญ่กว่ามันเสมอๆ ดังนั้นจะตัดมาแสดงเฉพาะส่วนที่สนใจนะครับ (อย่างเช่นข้างบนที่ละ tag html, body ไป)

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

อนึ่ง ที่นี่จะใช้คำสั่งของ tag เป็นตัวเล็กทั้งหมด และค่าของ attribute (เช่น example.jpg ข้างบน) จะถูกล้อมรอบด้วย double quotes "..." เสมอครับ

HTML: สวัสดีชาวโลก

เห็นว่า mementototem เขียนเรื่อง PHP ซึ่งเป็นภาษาที่มีความเกี่ยวข้องกับการสร้างเว็บ ก็คิดว่าคงจะดีที่จะกลับมาวางพื้น HTML อีกรอบ

1955 กำเนิด Tim Berners-Lee
1989 Lee ยื่นข้อเสนอระบบ hypertext สำหรับอินเตอร์เน็ต
1993 กำเนิด Mosaic เว็บบราวเซอร์ตัวแรกของโลก
1994 กำเนิด Netscape Navigator
1995 กำเนิด Internet Explorer
1997 HTML เวอร์ชัน 4 ถูกใช้เป็นมาตรฐาน
2004 กำเนิด Firefox
2008 ข้อเสนอ HTML เวอร์ชัน 5
2008 กำเนิด Google Chrome

ชื่อของ HTML ย่อมาจาก HyperText Markup Language ซึ่งถือว่าเป็นภาษาสำหรับตกแต่งเองสาร ไม่ใช่ภาษาโปรแกรมมิ่งแต่อย่างใด



โปรแกรมที่จะใช้ทดสอบ HTML ก็คือเว็บบราว์เซอร์ทั่วไปนั่นเอง ทางที่ดีเราควรจะทดสอบบนบราวเซอร์หลักที่คนใช้กันเยอะๆ ให้ครบทุกตัวด้วยครับ (อย่าลืมบราว์เซอร์ขนาดเล็กสำหรับมือถือไปซะหละ!)

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



ถึงแม้ว่าเอกสารที่มีแค่คำว่า Hello World. เฉยๆ (โดยไม่มีคำสั่ง HTML เลย) จะสามารถแสดงผลลัพท์ได้ถูกต้อง แต่ทางที่ดี เราควรเขียนให้ครบเช่นนี้ครับ

เซฟเป็นไฟล์ .html แล้วเรียกโดยบราวเซอร์ตัวโปรดได้เลย

February 7, 2012

Python: เก็บตัวแปรไว้ใช้ทีหลังด้วย pickle

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

ใน Python มีโมดูลหนึ่งชื่อว่า pickle ที่ทำให้เราเก็บตัวแปรลงในไฟล์ได้ตรงๆ เลย เช่น

ปิดโปรแกรมแล้วเปิดขึ้นมาใหม่ แล้วเรียกใช้ตัวแปรที่เราเก็บไว้ได้ดังนี้

อย่างไรก็ดี เราไม่สามารถเปิดอ่านข้อมูลที่ pickle เก็บไว้ได้รู้เรื่อง เพราะมันจะถูกเก็บเป็น data structure ของ Python นั่นเอง

ที่สำคัญที่สุดคือ การ load ข้อมูลจากไฟล์ที่โดน pickle ไปนั้น ต้องมั่นใจว่าไฟล์นั้นๆ ปลอดภัยจริงนะครับ



สำหรับข้อมูลที่ pickle สามารถจัดเก็บไว้ได้ มีดังนี้
  • ค่าตัวแปร None, True, False
  • ตัวเลขแบบ int, float, complex
  • ข้อความแบบ string, byte, bytearray
  • ตัวแปรชุดแบบ tuple, list, set, dictionary
  • "ที่อยู่" ของฟังก์ชัน, คลาส, object (ไม่เก็บ code ในฟังก์ชันให้นะครับ)
สำหรับการใช้ pickle เก็บข้อมูลแบบสุดท้ายนั้น จะเก็บแค่ชื่อ/ตำแหน่งที่อยู่ฟังก์ชันให้เท่านั้น เช่น

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

February 3, 2012

PHP: เครื่องมือ มาตรฐานการเขียนโค้ด และคอมเมนต์

ทำงานกับ PHP


ในการทำงานกับ PHP สามารถใช้เพียง Text Editor ต่าง ๆ (แต่ต้องเป็น Plain Text Editor เป็นพวก Word Processor อย่าง MS Office Word อันนี้ใช้ไม่ได้) แต่ถ้ามี Syntax Hilighter ก็จะช่วยให้มองโค้ดได้ง่ายขึ้น อย่างเช่น Notepad2-Mod, Notepad++, gEdit (GNOME), Kate (KDE) หรือ Vim (เว็บเรามีสอนใช้ Vim ด้วยนะ) เป็นต้น

แต่ถ้าต้องการความสามารถเพิ่มขึ้นอย่างการจัดการโค้ด และ Auto Complete ก็มีโปรแกรมที่เป็น IDE อย่าง eclipse+PDT หรือ Netbean อันนี้ขึ้นอยู่กับความชอบ ความต้องการของแต่ละคน

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

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

บน Windows สามารถใช้ AppServ หรือ XAMPP (Portable) หรือ Zend Server CE

ส่วนบน ลินุกซ์ ให้ติดตั้ง Apache, PHP, MySQL Server (สำหรับฐานข้อมูล) (โดยทั่วไปจะเรียกรวมว่า LAMP) ผ่านทาง Package Manager ได้โดยตรง (สะดวกซะ)

ถ้าบน Mac OSX ก็มี MAMP

ถ้าใครใช้ Windows แต่อยากได้สภาพแวดล้อมเป็นลินุกซ์ สามารถที่จะติดตั้ง VM อย่าง Virtual Box แล้วติดตั้งลินุกซ์ (แบบไม่มี GUI) ตั้งค่านิดหน่อย แล้วใช้เป็น Web Server เพื่อทดสอบก็ได้เช่นกัน


มาตรฐานการเขียนโค้ด


การเขียนโค้ดตามภาษาต่าง ๆ จะมีข้อบังคับ ซึ่งทุกคนต้องปฏิบัติตาม ถ้าไม่ปฏิบัติตามโค้ดจะรันไม่ผ่าน และมาตรฐานการเขียนโค้ด ซึ่งถึงไม่ปฏิบัติตามโค้ดก็ยังทำงานได้ตามปกติ

มาตรฐานโค้ดมีไว้เพื่อให้การอ่านโค้ด และนักพัฒนาทำงานร่วมกันได้ง่ายขึ้น แต่ทั้งนี้ทั้งนั้น มาตรฐานของแต่ละที่อาจจะไม่เหมือนกัน อันนี้ขึ้นอยู่กับกลุ่ม และบริษัทที่เราอยู่ เช่น มาตรฐานโค้ดของ Drupal จะไม่เหมือนกับของ WordPress และทั้งคู่ก็ไม่ตรงกับมาตรฐานของ PHP

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

แต่ก็ใช่ว่า มันจะเปลี่ยนแปลงไม่ได้เลย วันเวลาเปลี่ยนไป อาจจะถึงเวลาเปลี่ยนมาตรฐานกันบ้าง ก็ไม่แปลกอะไร ยึดหลัก แต่อย่ายึดติด


เปิด/ปิดเท็กสำหรับ PHP


ก่อนจะเขียน PHP จะต้องมีแท็กเปิดก่อน ซึ่งที่นิยมกันจะมี <?php และ <? ส่วนตัวแนะนำให้ใช้แบบเต็มคือ <?php

ถ้าต้องการปิดแท็กก็ใช้ ?> แต่ถ้าไฟล์นั้นทั้งไฟล์เป็น PHP หรือ โค้ดส่วนท้ายไม่ได้มีส่วนผสมของ HTML ก็สามารถละ ?> ปิดท้ายไฟล์ได้ การทำแบบนี้จะทำให้ไม่มีปัญหา header already sent ในกรณีมีมีวรรคหรือบรรทัดเปล่า ๆ อยู่ท้ายเอกสารได้ด้วย

คอมเมนต์

รูปแบบการคอมเม้นต์โคดใน PHP ไม่ต่างกับภาษาอื่นมากนัก
นอกจากนี้ยังมี PHPDoc ที่ใช้ในการอธิบายการทำงานของ Class/Function จะใช้ /** */ การเขียน PHPDoc จะช่วยให้โปรแกรม IDE สามารถดึงข้อมูลส่วนนี้ไปแสดงเวลาเรียกใช้ฟังชั่นได้ด้วย


ถ้าต้องการคอมเมนต์โค้ดที่ยาว ๆ ซับซ้อน เพื่อการทดสอบการทำงาน ไม่แนะนำให้ใช้รูปแบบการคอมเมนต์แบบด้านบน แต่ให้ใช้ if (0) { ส่วนที่ต้องการคอมเมนต์ } แทน เพราะถ้ามีคอมเมนต์อยู่ในโค้ดก็ไม่ต้องสั่งคอมเมนต์หลาย ๆ รอบ


(ตัวอย่างไม่ซับซ้อนเท่าไหร่เลย...)