Archive for August, 2009

Object Oriented Programming with JavaScript I

Monday, August 17th, 2009

ช่วงนี้ได้ใช้ JavaScript แบบจริงๆ จังๆ กับเขาบ้าง เพราะต้องเอาไปต่อกับ REST ในหน้าเพจที่ทำแต่เห็นว่าบางอย่างมันต้องเขียนโค้ดแบบเดิมซ้ำไปซ้ำมาอยู่เรื่อยก็เลยเกิดความคิดไปหาวิธีใช้งานแบบ OOP สำหรับ JavaScript ซะหน่อยดีกว่า เคยอ่านผ่านๆ ตาหลายรอบแล้วเหมือนกันแต่ไม่ค่อยได้เอาจริงเอาจังกับมันซะเท่าไหร่ครับ ตอนนี้งาน JavaScript เข้าจังๆ ก็เลยมีเหตุจำเป็นให้ต้องลอง นอกจากนั้นก็เป็นข้อดีหลายอย่างของการเขียน OO ที่ผมชอบก็คือ Reusable, Inheritance และ Encapsulation แต่ต้องบอกก่อนว่าการเขียนโปรแกรมแบบนี้ไม่ใช่เรื่องแปลกอะไร เพราะมันก็ทำได้ตั้งนานแล้วครับ blog ตอนนี้ก็คงเป็นการเอามะพร้าวห้าวมาขายสวนอีกตามเคยครับ :)

ความจริง เท่าที่ได้อ่านวิธีการเขียนก็คงไม่ใช้ OOP เหมือน Java หรือ PHP เท่าไหร่ เพราะใช้วิธีการแปลกๆ ของ JavaScript มาช่วยแต่ถึงอย่างไรวิธีการนี้ก็ใช้แนวคิดของ OO มาช่วยพัฒนาเลยหยวนๆ ถือว่าเป็น OOP แล้วกันครับ :)

hello, world

...
<script type="text/javascript" charset="utf-8">
	function HelloWorld(msg) {
		var defaultMessage = "HELLO, WORLD!!!";
		this.message = msg || "สวัสดีชาวโลก";

		alert('Let me say');

		this.goodie = function(m) {
			m = m || "?";
			alert(m + " " + good());
		}

		var good = function(m) {
			return "good day";
		}
	}

	function sayHi(m) {
		var hi = new HelloWorld();
		hi.goodie(m);
		hi.goodie(hi.message);
		hi.goodie(hi.defaultMessage);
		hi.good("Goodbye");
	}
</script>

</head>

<body id="index" onload="sayHi('สวัสดี')">
...

ด้านบนก็เป็นตัวงอย่างของการเขียน JavaScript แบบ OO ครับ ในที่นี้ “HelloWorld” จะทำหน้าที่เป็นคลาสจะ ให้ function sayHi เรียกใช้งาน โดยที่แนบตัวแปร message ไปให้ด้วย ใน script นี้จะมี alert message ให้เราเห็นทั้งหมด 4 หน้าต่างครับ ตามนี้เลยครับ แต่ก่อนเริ่มอาจจะต้องอธิบายกันนิดหน่อยเพื่อว่าจะมีคนไม่รู้ เครื่องหมาย “||” นี้ผมไม่รู้ชื่อวิธีเรียกมันอย่างเป็นทางการนะครับ แต่วิธีการทำงานก็คือโปรแกรมจะเปรียบเทียบว่าตัวแปรที่อยู่ด้านซ้ายเป็นค่าว่าง (null) หรือเปล่าถ้าใช้จะนำค่าที่อยู่ด้านซ้ายมาให้โดยอัตโนมัติ

Constructor

Constructor

Constructor


เป็น Constructor ของคลาส HelloWorld คิดง่ายๆ ก็คือ ทุกอย่างที่ไม่ได้ครอบไว้ด้วย function จะเป็น Constructor ของคลาสทั้งหมด

Assign

Assign

Assign


ตัวอย่างของการส่งค่าให้กับฟังก์ชั่น goodie ที่เป็น method ที่อยู่ภายในคลาส HelloWorld

Public Access

Public Variable

Public Access


ตัวอย่างการเข้าถึง Public variable ของคลาส “HelloWorld” สังเกตุได้ที่ตัวแปร “message” ที่อยู่ภายในคลาส “HelloWorld” ด้านบนที่นำหน้าด้วย this มีค่าเหมือนกับการใส่ “public”

Private Access

Private Access

Private Access


เป็นการเข้าถึงตัวแปรที่เป็นระบุไว้ว่าเป็น private ผลที่ได้คือไม่สามารถเข้าถึงได้เห็นได้จากค่าทีไ่ด้ออกมาจะเป็น ‘?’

ส่วนหน้าต่างสุดท้ายจะไม่ปรากฎให้เห็นเนื่องจากฟังก์ชั่น ‘good’ ถูกระบุให้มีชนิดการเข้าถึงแบบ private

นอกจากนี้ยังเขียนให้คลาสสามารถสืบทอดคุณสมบัติกันได้เหมือนภาษา OOP ทั่วไป แต่ยังไงก็ขอติดไว้ตอนหน้าแล้วกันครับ

Live Demo

หัวกระดาษ ท้ายกระดาษ กับ Pages

Friday, August 7th, 2009

ตอนนี้มีเรื่องให้ทะเลาะกับ Pages เรื่อยๆ วันก็เลยเล่นซนจนได้เรื่องอีกแล้ว เรื่องของเรื่องคือตอนนี้กำลังเขียนรายงานอยู่เล่มครับ ระหว่างแก้ไปก็หยิบหนังสือมาอ่านเห็นอยู่อย่างที่ชอบคือ ที่ด้านล่างบริเวณที่ภาษาฝรั่งเรียกว่า “Footer” ของหนังสือ จะมีชื่อหนังสือ ชื่อบทแล้วก็เลขหน้า ซึ่งด้านซ้าย กับด้านขวาก็ไม่เหมือนกันอีก ก็เลยเกินความอยากลองของครับ เพราะอยากจะรู้ว่า Pages มันทำแบบนี้ได้ไหม ลองหาข้อมูลดูใน Apple Discussions ก็เจอวิธีทำครับ เห็นว่าเจ๋งดีเลยเอามาเขียนไว้ในบล็อกดีกว่า จะได้ไม่ลืม [เอามะพร้าวห้าวมาขายสวนกันดีๆ นั่นเอง]

ใส่ Section

เมื่อเปิด Pages มาแล้วให้เลือกกระดาษเปล่าๆ มา 1 แผ่นครับ จะแนวตั้งหรือแนวนอนก็แล้วแต่สะดวกครับ เพราะไม่มีผลอยู่แล้ว จากนั้นให้เพิ่ม Section เข้าไปครับ วิธีการคือ กดที่ปุ่ม ‘Sections‘ ที่หน้าต่าง Pags หรือเมนู ‘Insert -> Sections‘ ซึ่งก็จะมีให้เลือกอีกล่ะครับ ว่าจะป็น Text Page หรือว่า Blank Page เลือกเอาตามชอบครับตรงนี้ถือว่าสำคัญมากครับ เพราะจะเป็นการใส่เขตรูปแบบที่เราต้องการไม่ให้ไปปะปนกับ Sections อื่นครับ ส่วนตัวผมจะใช้ 1 Section ต่อ 1 บท ครับ เพราะจะสะดวกเมื่อต้องการเปลี่ยนหน้า หรือลำดับบทครับ ลากไปลากมาได้ทั้งบทเลย เมื่อใส่ Section เรียบร้อยแล้ว ลองเปิด Page Thumbnail [option + command + P, View -> Pages Thumbnails] ดูจะมีกรอบสีเหลือง ครอบ Section ที่เราเอาเม้าส์คลิกไว้เหมือนใน Fig.1 ครับ

Fig.1: เลือก Section

Fig.1: เลือก Section

จะเห็นได้ว่าในกระดาษของผมจะมีเส้นสีเทาๆ ด้วยนะครับจะช่วยเรื่องการจัดวางเลเอาท์ครับ ถ้ายังไม่มีให้ไปที่ View -> Show Layout หรือ Shift + Command + L ครับ

ตั้งค่า Section

ก่อนที่จะใส่ข้อความลงไปในหัวกระดาษ และท้ายกระดาษ ก็ต้องเริ่มต้นด้วยการกำหนดค่าให้กับ Section ปัจจุบันที่เราใช้งานอยู่ก่อนครับ [ต้องจำไว้เลยว่า Section จะแยกการกำหนดค่าบางอย่างจะแยกออกเป็นเอกเทศ] ส่วนการกำหนดค่าต่างๆ จะขอพูดแค่หัวกระดาษอย่างเดียวแล้วกันครับ เนื่องจากวิธีการจะเหมือนกัน เพียงแค่เปลี่ยนคำแหน่งกันเท่านั้น การกำหนดให้เปิดหน้าต่าง Inspector ขึ้นมาครับ [option + command + I, Views -> Show Inspector] เข้าไปที่ Layout Inspector จากนั้นเลือกที่ แท็บ Section จะได้เหมือนใน Fig.2 ครับ

Fig.2: หน้าต่าง Layout Inspector ส่วน Section

Fig.2: หน้าต่าง Layout Inspector ส่วน Section

จะเห็นได้ว่ามี 2 ส่วนย่อยๆ ในแท็บ Section นี้นะครับ คือ Page Number และ Configuration แต่ใส่บล็อกตอนนี้จะขอพูดถึงเพียงแค่ Configuration อย่างเดียวก่อนครับ ว่ากันไปทีละเมนูเลยนะครับ

  • First page is different – จะบอกให้ Pages รู้ว่าหน้าแรกของ Section นี้จะมีการกำหนดค่า ต่างออกไปจากหน้าอื่นๆ ของ Section นี้ เช่น หากเราลบเลขหน้าที่ใส่อัตโนมัติก่อนหน้านี้ที่หัวกระดาษ ก็จะไม่ส่งผลกระทบไปยังหน้าอื่นๆ ภายใน Section นี้
  • Left and right pages are different – ตัวเลือกนี้จะกำหนดให้การตั้งค่าต่างๆ ของหน้ากระดาษด้านซ้าย และด้านขวาต่างกัน ภายใน Section ปัจจุบัน เช่น ต้องการให้หัวกระดาษด้านขวามีชื่อบทเป็น ส่วนหัวกระดาษด้านซ้ายเป็นชื่อหนังสือ ก็สามารถทำได้โดยให้เลือกที่ตัวเลือกนี้ก่อน
  • Use previous headers & footers – ง่ายๆ ครับ คือเอา “รูปแบบ” กำหนดค่า header และ footer ของ Section ก่อนหน้านี้มาใช้นั่นเอง แต่มีข้อควรระวังอย่างหนึ่งก็คือ หากเราแก้ไข header หรือ footer ใน Section ที่เลือกตัวเลือกนี้ จะส่งผลกระทบไปยัง Section ต้นแบบด้วย
  • Section starts on: – กำหนดให้หน้าแรก “ที่มีข้อมูล” ของ Section เริ่มต้นที่ด้านไหน จะมีให้เลือกอยู่ 3 ตัวเลือกด้วยกัน คือ “Any Page“, “Right Page” และ “Left Page” ซึ่งค่า default จะอยู่ที่ “Any Page” คือ เริ่มที่หน้าไหนก็ได้ แต่ถ้าไม่พอใจอยากให้เริ่มต้นด้วยหน้าที่เราต้องการก็ได้ครับ ก็เปลี่ยนได้ตามชอบ โดยส่งที่ Pages จะทำคือจะแทรกหน้าว่างเข้าไป 1 หน้า เพื่อเลื่อนให้หน้าแรกที่มีข้อมูลของ Section ไปอยู่ตรงตำแหน่งที่เรากำหนดครับ

เข้าใจว่าถ้าอ่านอย่างเดียวคงไม่ค่อยเห็นภาพครับ ยังไงลองดาวน์โหลดตัวอย่างไฟล์ไปเล่นดูแล้วกันครับ จะเป็น zip ไฟล์ที่ข้างในจะมีไฟล์ Pages + PDF ที่แปลงมาจาก Pages ครับ แต่คุณภาพอาจจะไม่ดีนักครับเนื่องจากต้องการให้เห็นเป็นตัวอย่างเท่านั้น ในไฟล์ Pages จะแบ่งออกเป็น 3 Section ด้วยกันครับ คือ

  • Section 1: มีหน้า 1 หน้าเดียว
  • Section 2: จะมีหน้า เปล่า 1 หน้า (เนื่องจากผมกำหนดให้ section นี้เริ่มที่ด้านขวา) 2, 3 และ 4
  • Section 3: คือที่เหลือครับ คือ 5, 6 และ 7

โปรแกรมที่ใช้: Pages ’09

ขอให้มีความสุขกับการใช้งานโปรแกรมถูกลิขสิทธิ์ครับ

Google Maps :: แสดงผลข้อมูลการจราจรได้แล้ว

Friday, August 7th, 2009
ข้อมูลการจราจรจาก อนุเสาวรีย์ชัยสมรภูมิ ไปยัง มหาวิทยาลัยธรรมศาสตร์ ท่าพระจันทร์

ข้อมูลการจราจรจาก อนุเสาวรีย์ชัยสมรภูมิ ไปยัง มหาวิทยาลัยธรรมศาสตร์ ท่าพระจันทร์

เป็นเรื่องดีไม่น้อยเลยครับ [สำหรับคนหลงทางบ่อยๆ แบบผม] เมื่อ Google Maps สามารถแสดงข้อมูลการจราจรของไทยได้แล้วไม่เพียงแค่เส้นทางการเดินทางนะครับ แต่เป็นข้อมูลการขนส่งด้วย เช่น จะขึ้นรถเมล์สายอะไร จากตรงไหน ใช้เวลาเท่าไหร่ และเวลาโดยประมาณที่จะถึงจุดหมายปลายทาง จากตัวอย่างด้านบน[คลิ๊กที่รูปภาพเพื่อดูของจริง] เป็นตัวอย่างที่ผมลองหาเส้นทางจาก จากอนุเสาวรีย์ชัยสมรภูมิ ไปยังมหาวิทยาลัยธรรมศาสตร์ ท่าพระจันทร์ ก็ได้ผลอย่างที่เห็นครับ นอกจากการเดินทางด้วยรถแล้ว ถ้าสังเกตุดีๆ จะเห็นข้อมูลเส้นทางเรือในแม่น้ำเจ้าพระยาด้วย

จากที่ลองค้นดูอีเมล์ที่ Google แจ้งการปรับปรุงให้ทราบเรื่อยๆ [แต่ไม่ได้สนใจ] ก็พบว่าข้อมูลการจราจร[GTrafficOverlay] เพิ่มเข้ามาตั้งแต่เวอร์ชั่น 2.81 ครับ [ปัจจุบันเวอร์ชั่น 2.170 อัพเดตวันที่ 6 สิงหาคม 2552]

Google Maps: http://maps.google.co.th
Issue Tracker: http://code.google.com/p/gmaps-api-issues/wiki/JavascriptMapsAPIChangelog