<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jQuery, Ajax, PHP, JSON, XML, Web Technologies &#187; Performance Tuning</title>
	<atom:link href="http://blog.chonla.com/category/tuning/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chonla.com</link>
	<description>คุยกันเรื่อง jQuery, Ajax, PHP, JSON, XML และ Web Technologies เป็นภาษาไทยกันดีกว่า</description>
	<lastBuildDate>Thu, 02 Sep 2010 18:43:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>เลิกใช้เหอะไอ้ .inc น่ะ</title>
		<link>http://blog.chonla.com/2010/09/%e0%b9%80%e0%b8%a5%e0%b8%b4%e0%b8%81%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b9%80%e0%b8%ab%e0%b8%ad%e0%b8%b0%e0%b9%84%e0%b8%ad%e0%b9%89-inc-%e0%b8%99%e0%b9%88%e0%b8%b0/</link>
		<comments>http://blog.chonla.com/2010/09/%e0%b9%80%e0%b8%a5%e0%b8%b4%e0%b8%81%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b9%80%e0%b8%ab%e0%b8%ad%e0%b8%b0%e0%b9%84%e0%b8%ad%e0%b9%89-inc-%e0%b8%99%e0%b9%88%e0%b8%b0/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 18:43:00 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Performance Tuning]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Souce Code]]></category>
		<category><![CDATA[Extension]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=293</guid>
		<description><![CDATA[เคยเขียนเว็บที่เป็น แล้วมีหน้าที่ต้อง include เข้ามาใช่มั๊ยครับ หน้า include ที่ว่านี้ ผมไม่ได้หมายถึงแค่ส่วนประกอบบนหน้าเว็บอย่างเดียวนะครับ แต่ผมรวมถึงพวกค่า config, ค่า constant, function ต่าง ๆ ที่ทำเป็น library ไว้ ฯลฯ ตั้งชื่อนามสกุลไฟล์พวกนั้นไว้ว่าอะไรครับ .inc หรือเปล่า เลิกใช้เถอะครับ ใส่นามสกุลอย่างที่มันควรจะเป็นเถอะครับ ผมเคยเห็นคนใช้ไฟล์นามสกุล .inc ครั้งแรกตอนสมัยเขียน ASP สมัยนั้นผมยังเป็นเด็กเอ๊าะ ๆ วัยละอ่อนที่ไม่รู้ประสีประสาอะไร มันจะมีไฟล์ที่ผมใช้ประจำอยู่ไฟล์นึงที่ผมโหลดมาจากในเน็ต มันมีชื่อเต็ม ๆ ว่า adodb.inc ครับ ไฟล์นี้เป็น text file ธรรมดานี่แหละ ข้างในเป็น ASP Script (Server-Sided VBScript) ที่มีการประกาศค่าคงที่ต่าง ๆ มากมาย ที่ช่วยให้ชีวิตในการเขียน ASP สะดวกขึ้นอย่างมาก ผมใช้มันมาตลอดเวลาที่ผมเขียน ASP จนกระทั่งผมเลิกเขียน [...]]]></description>
			<content:encoded><![CDATA[<p>เคยเขียนเว็บที่เป็น แล้วมีหน้าที่ต้อง include เข้ามาใช่มั๊ยครับ หน้า include ที่ว่านี้ ผมไม่ได้หมายถึงแค่ส่วนประกอบบนหน้าเว็บอย่างเดียวนะครับ แต่ผมรวมถึงพวกค่า config, ค่า constant, function ต่าง ๆ ที่ทำเป็น library ไว้ ฯลฯ ตั้งชื่อนามสกุลไฟล์พวกนั้นไว้ว่าอะไรครับ .inc หรือเปล่า เลิกใช้เถอะครับ ใส่นามสกุลอย่างที่มันควรจะเป็นเถอะครับ</p>
<p><span id="more-293"></span>ผมเคยเห็นคนใช้ไฟล์นามสกุล .inc ครั้งแรกตอนสมัยเขียน ASP สมัยนั้นผมยังเป็นเด็กเอ๊าะ ๆ วัยละอ่อนที่ไม่รู้ประสีประสาอะไร มันจะมีไฟล์ที่ผมใช้ประจำอยู่ไฟล์นึงที่ผมโหลดมาจากในเน็ต มันมีชื่อเต็ม ๆ ว่า adodb.inc ครับ ไฟล์นี้เป็น text file ธรรมดานี่แหละ ข้างในเป็น ASP Script (Server-Sided VBScript) ที่มีการประกาศค่าคงที่ต่าง ๆ มากมาย ที่ช่วยให้ชีวิตในการเขียน ASP สะดวกขึ้นอย่างมาก ผมใช้มันมาตลอดเวลาที่ผมเขียน ASP จนกระทั่งผมเลิกเขียน ASP ไป</p>
<p>จริง ๆ ผมไม่ได้หมายถึงแค่ .inc อย่างเดียวหรอกครับ ผมหมายถึง text file ทุกชนิดที่ server มันไม่รู้จัก หรือประมวลผลไม่ได้ ไม่ว่าจะเป็น .txt, .conf, .config, .inc, .duck, .dat, .ini หรือแม้กระทั่งไม่ใส่นามสกุลให้มันเลยก็ตาม ถ้าข้อความข้างในเป็น text มันก็คือ text file อยู่วันยังค่ำ</p>
<p>ปัญหามันอยู่ที่ไหนเหรอครับ ยังมีเว็บโปรแกรมเมอร์หลายคนที่ยังตั้งนามสกุลไฟล์เป็นพวกนี้อยู่ และมิหนำซ้ำ ยังเอาไป include ใช้งานจริงเสียด้วย ผมยกตัวอย่างกรณีของ php ละกันครับ ตัว php web server เอง (เช่น Apache) ปกติแล้วมันไม่ประมวลผลไฟล์นามสกุลพวกนี้หรอกครับ ยกเว้นแต่เราไป include ไฟล์พวกนั้นลงไปใน script ที่เราเขียน เช่นถ้าเป็น php มันก็จะประมวลผลไฟล์นามสกุลพวก .php, .php4, .php5 (หรืออะไรก็แล้วแต่ตามที่ตั้งไว้) ถ้าเราสั่ง include(&#8220;test.inc&#8221;) แบบนี้มันจะประมวลผล test.inc ให้ครับ แต่ถ้าเราลองเรียก test.inc ตรง ๆ ผ่าน browser มันไม่ประมวลผลหรอกครับ ทีนี้พอ server มันไม่ประมวลผล สิ่งที่มันคืนกลับมาให้เราเห็น มันก็คือข้อความข้างในไฟล์นั่นเอง ค่าต่าง ๆ ที่เราตั้งไว้เก็บไว้กะว่าจะดูคนเดียว ทั้ง username กับ password ของ database ทั้งโน่น ทั้งนี่ ตั้งหลายอย่าง ถูกเผยแพร่ไปง่าย ๆ ด้วยเหตุผลเพียงการตั้งนามสกุลไฟล์แบบนี้เท่านั้นเอง</p>
<p>พอมองเห็นปัญหาแล้วใช่มั๊ยครับ หลายคนตั้งนามสกุลไฟล์เป็นแบบนี้ เพื่อที่จะให้สื่อความหมายว่ามันเป็น include file นะ ก็ย่อว่า inc ไง หรือ config file นะ ก็ย่อว่า conf ไง ใช่ครับ มันสื่อ แต่มันไม่ได้เรื่องครับ อยากจะตั้งให้สื่อ แล้วยังจะให้ server ประมวลผล ก็ง่ายนิดเดียวครับ แค่เติมนามสกุลมันลงไปอีกหน่อยก็ได้ครับ เป็น .inc.php ก็ได้ เป็น .conf.php ก็ได้ สมัยไหนแล้ว ไม่ใช่ DOS นะครับ จะตั้งชื่อมีจุดหลาย ๆ จุดไม่ได้</p>
<p>แล้วคนอื่นจะรู้ได้ไงว่าเราตั้งนามสกุลไว้แบบนี้น่ะเหรอครับ ก็ตอนที่ server ล่ม หรือ script เจ๊งไงครับ เคยเห็นมั๊ยครับ ที่ script ทำงานไม่ถูกต้อง แล้วมัน report error ออกมา พร้อมชื่อไฟล์ที่มีปัญหา คิดว่ามันจะไม่มีวันเกิดขึ้นเลย 100% เหรอครับ กันไว้ก่อนดีกว่าครับ ดีกว่าจะมานั่งเสียใจทีหลังเพราะความเลินเล่อเล็ก ๆ น้อย ๆ</p>
<p>(entry นี้ เหมือนจะเป็นการบ่นเลยแฮะ แต่เพิ่งไปเจอคนตั้งชื่อไฟล์นามสกุลแบบนี้มา แล้ววันก่อนเว็บมันเจ๊งพอดี เลยเข้าไปดู เห็นอะไรหลายอย่างที่ไม่ควรให้เห็นเลยเชียว เฮ้อ&#8230; เห็นแล้วกลุ้ม เอามาบ่นหน่อยดีกว่า XD)</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2010/09/%e0%b9%80%e0%b8%a5%e0%b8%b4%e0%b8%81%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b9%80%e0%b8%ab%e0%b8%ad%e0%b8%b0%e0%b9%84%e0%b8%ad%e0%b9%89-inc-%e0%b8%99%e0%b9%88%e0%b8%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redirect แล้วอย่าคิดว่าจะไม่เห็นนะ</title>
		<link>http://blog.chonla.com/2008/11/redirect-%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%84%e0%b8%b4%e0%b8%94%e0%b8%a7%e0%b9%88%e0%b8%b2%e0%b8%88%e0%b8%b0%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%80%e0%b8%ab/</link>
		<comments>http://blog.chonla.com/2008/11/redirect-%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%84%e0%b8%b4%e0%b8%94%e0%b8%a7%e0%b9%88%e0%b8%b2%e0%b8%88%e0%b8%b0%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%80%e0%b8%ab/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 13:45:19 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[HTTP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Performance Tuning]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[HTTP Header]]></category>
		<category><![CDATA[Redirect]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=132</guid>
		<description><![CDATA[คำสั่งการทำ Redirect ใน PHP นั้น อย่างที่เรารู้ ๆ กันอยู่ว่าเพียงแค่พิมพ์ว่า header("location:http://blog.chonla.com"); ซึ่งความจริงแล้ว มันเป็นการกำหนดค่า Location ลงไปใน HTTP Header นั่นเอง เรายังสามารถกำหนด Header อื่น ๆ ลงไปใน HTTP Header ได้อีก แต่วันนี้ผมจะพูดถึงเฉพาะ Location ครับ มีหลายคนหลงคิดไปเองว่า การสั่ง Redirect ด้วยวิธีนี้นั้น ผู้ใช้จะไม่เห็นส่วนที่เหลือในเว็บ เว็บหนึ่งที่มีการตรวจสอบว่าผู้ใช้ล็อกอินแล้วหรือยัง ถ้ายังให้ redirect ไปยังหน้าล็อกอิน แต่ถ้าล็อกอินอยู่แล้วก็ให้แสดงเนื้อหาในเว็บนั้นเลย ตามโค๊ดด้านล่างนี้ครับ &#60;?php if (!$login) header("location:login.php"); ?&#62; เนื้อหาสำคัญที่จะเข้าถึงได้เฉพาะผู้ที่ล็อกอินแล้วเท่านั้น สิ่งที่เกิดขึ้นจริงคือ เมื่อ PHP แปลคำสั่งถึง header ที่กำหนด location แล้ว จะเป็นการส่ง HTTP Response [...]]]></description>
			<content:encoded><![CDATA[<p>คำสั่งการทำ Redirect ใน PHP นั้น อย่างที่เรารู้ ๆ กันอยู่ว่าเพียงแค่พิมพ์ว่า</p>
<pre class="php" name="code">header("location:http://blog.chonla.com");</pre>
<p>ซึ่งความจริงแล้ว มันเป็นการกำหนดค่า Location ลงไปใน HTTP Header นั่นเอง เรายังสามารถกำหนด Header อื่น ๆ ลงไปใน HTTP Header ได้อีก แต่วันนี้ผมจะพูดถึงเฉพาะ Location ครับ</p>
<p><span id="more-132"></span></p>
<p>มีหลายคนหลงคิดไปเองว่า การสั่ง Redirect ด้วยวิธีนี้นั้น ผู้ใช้จะไม่เห็นส่วนที่เหลือในเว็บ เว็บหนึ่งที่มีการตรวจสอบว่าผู้ใช้ล็อกอินแล้วหรือยัง ถ้ายังให้ redirect ไปยังหน้าล็อกอิน แต่ถ้าล็อกอินอยู่แล้วก็ให้แสดงเนื้อหาในเว็บนั้นเลย ตามโค๊ดด้านล่างนี้ครับ</p>
<pre class="php" name="code">&lt;?php
if (!$login)
    header("location:login.php");
?&gt;
เนื้อหาสำคัญที่จะเข้าถึงได้เฉพาะผู้ที่ล็อกอินแล้วเท่านั้น</pre>
<p>สิ่งที่เกิดขึ้นจริงคือ เมื่อ PHP แปลคำสั่งถึง header ที่กำหนด location แล้ว จะเป็นการส่ง HTTP Response 302 กลับไป ซึ่งหมายถึงสิ่งที่เว็บบราวเซอร์ต้องการนั้นอยู่อีกที่หนึ่ง รวมถึงระบุ URL ของหน้านั้น ๆ กลับไปให้ <strong><span style="color: #ff0000;">และยังทำการแปลส่วนที่เหลือจนจบและส่งกลับไปให้บราวเซอร์ด้วย</span></strong></p>
<p>เริ่มเห็นปัญหาแล้วหรือยังล่ะครับ ถ้าเริ่มเห็นอะไรเหมือนที่ผมเห็นแล้ว ลองไปดู <a title="LIVE DEMO : Clean Redirection" href="http://sandbox.chonla.com/redirect" target="_blank">LIVE DEMO</a> กันได้เลยครับ</p>
<p>คุณจะเห็นรายละเอียดใน LIVE DEMO ได้ง่ายขึ้นด้วยโปรแกรมประเภท HTTP Sniffer ครับ เช่น Fiddler, HTTPWatch หรือจะใช้พวก Packet Sniffer อย่างเช่น WireShark (Ethereal)</p>
<p>การแก้ไขปัญหามีหลายวิธีครับ ใน LIVE DEMO ผมใช้ exit() เป็นตัวแก้ไขปัญหา แต่ในความเป็นจริงแล้ว เราอาจจะใช้ if&#8230;else&#8230; ครอบไว้ก็ได้ครับ หรือใครมีวิธีอื่น ๆ อีกก็มาคุยกันได้ครับ</p>
<p>ตัวอย่างภาพที่ผมเซฟมาให้ดูนั้น เป็นภาพที่ได้จาก HTTPWatch ครับ ให้ลองเปรียบเทียบกันระหว่างส่วนที่เป็น Content กันระหว่างแบบที่ผมไม่ได้ใส่ exit() กับแบบที่ผมใส่ exit() เพื่อให้เห็นความแตกต่างของสิ่งที่ได้ส่งกลับมาให้บราวเซอร์ครับ</p>
<div id="attachment_133" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.chonla.com/wp-content/uploads/2008/11/loc.gif"><img class="size-medium wp-image-133" title="loc" src="http://blog.chonla.com/wp-content/uploads/2008/11/loc-300x134.gif" alt="Redirect ทั่ว ๆ ไป" width="300" height="134" /></a><p class="wp-caption-text">Redirect ทั่ว ๆ ไป</p></div>
<div id="attachment_134" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.chonla.com/wp-content/uploads/2008/11/locexit.gif"><img class="size-medium wp-image-134" title="locexit" src="http://blog.chonla.com/wp-content/uploads/2008/11/locexit-300x134.gif" alt="Redirect และปิดด้วย exit()" width="300" height="134" /></a><p class="wp-caption-text">Redirect และปิดด้วย exit()</p></div>
<p>นอกจากนี้แล้วการทำแบบนี้ยังทำให้ Perfomance สูงขึ้นด้วยครับ เพราะ PHP ไม่จำเป็นต้องประมวลผลคำสั่งส่วนที่เหลือนั่นเองครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2008/11/redirect-%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%84%e0%b8%b4%e0%b8%94%e0%b8%a7%e0%b9%88%e0%b8%b2%e0%b8%88%e0%b8%b0%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%80%e0%b8%ab/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>เรื่องลูป ๆ กับ jQuery</title>
		<link>http://blog.chonla.com/2008/11/%e0%b9%80%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87%e0%b8%a5%e0%b8%b9%e0%b8%9b-%e0%b9%86-%e0%b8%81%e0%b8%b1%e0%b8%9a-jquery/</link>
		<comments>http://blog.chonla.com/2008/11/%e0%b9%80%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87%e0%b8%a5%e0%b8%b9%e0%b8%9b-%e0%b9%86-%e0%b8%81%e0%b8%b1%e0%b8%9a-jquery/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 14:10:26 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Performance Tuning]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[each]]></category>
		<category><![CDATA[Loop]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=120</guid>
		<description><![CDATA[เมื่อพูดถึงลูป (Loop หรือ Iteration) ใน JavaScript เราจะนึกถึง for-loop หรือ for-each-loop เช่น for(i = 0; i &#60; 30; i++) alert(i); หรือ for(x in a) alert(a[x]); แต่เมื่อกลับมามองที่ jQuery ทาง jQuery เองก็ได้เตรียมฟังก์ชั่นสำหรับการวนลูป element ที่ได้มาจาก selector แล้วเหมือนกัน นั่นคือ $.each() $.each() ไม่้ใช่แค่จะลูป element จาก selector ได้เท่านั้น แต่ยังสามารถลูปใน JavaScript Array และ JSON ได้ด้วย ถือว่าเป็นสุดยอดฟังก์ชั่นอีกตัวหนึ่งเลยก็ได้ โดยปกติแล้ว Syntax ของ $.each() คือ $.each(object, callback) [...]]]></description>
			<content:encoded><![CDATA[<p>เมื่อพูดถึงลูป (Loop หรือ Iteration) ใน JavaScript เราจะนึกถึง for-loop หรือ for-each-loop เช่น</p>
<pre name="code" class="js">
for(i = 0; i &lt; 30; i++)
    alert(i);
</pre>
<p>หรือ</p>
<pre name="code" class="js">
for(x in a)
    alert(a[x]);
</pre>
<p>แต่เมื่อกลับมามองที่ jQuery ทาง jQuery เองก็ได้เตรียมฟังก์ชั่นสำหรับการวนลูป element ที่ได้มาจาก selector แล้วเหมือนกัน นั่นคือ $.each()</p>
<p><span id="more-120"></span></p>
<p>$.each() ไม่้ใช่แค่จะลูป element จาก selector ได้เท่านั้น แต่ยังสามารถลูปใน JavaScript Array และ JSON ได้ด้วย ถือว่าเป็นสุดยอดฟังก์ชั่นอีกตัวหนึ่งเลยก็ได้</p>
<p>โดยปกติแล้ว Syntax ของ $.each() คือ $.each(object, callback) โดยที่ object จะหมายถึง object ที่สามารถลูปได้ เช่น jQuery Object, Array หรือ JSON ส่วน callback จะหมายถึง callback function ที่ในลูปแต่ละรอบมันจะมาเรียกฟังก์ชั่นนี้ครับ เรายังสามารถเขียนในรูปแบบอีกแบบนึงได้คือ $(object).each(callback) ก็ได้ครับ</p>
<p>ลองไปดู <a title="LIVE DEMO: jQuery each" href="http://sandbox.chonla.com/each" target="_blank">LIVE DEMO</a> กันดีกว่าครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2008/11/%e0%b9%80%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87%e0%b8%a5%e0%b8%b9%e0%b8%9b-%e0%b9%86-%e0%b8%81%e0%b8%b1%e0%b8%9a-jquery/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>เมื่อฟ้าส่ง Chainability มาให้กับ jQuery</title>
		<link>http://blog.chonla.com/2008/11/%e0%b9%80%e0%b8%a1%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%9f%e0%b9%89%e0%b8%b2%e0%b8%aa%e0%b9%88%e0%b8%87-chainability-%e0%b8%a1%e0%b8%b2%e0%b9%83%e0%b8%ab%e0%b9%89%e0%b8%81%e0%b8%b1%e0%b8%9a-jquery/</link>
		<comments>http://blog.chonla.com/2008/11/%e0%b9%80%e0%b8%a1%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%9f%e0%b9%89%e0%b8%b2%e0%b8%aa%e0%b9%88%e0%b8%87-chainability-%e0%b8%a1%e0%b8%b2%e0%b9%83%e0%b8%ab%e0%b9%89%e0%b8%81%e0%b8%b1%e0%b8%9a-jquery/#comments</comments>
		<pubDate>Sat, 08 Nov 2008 15:32:25 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Performance Tuning]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Chainability]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=117</guid>
		<description><![CDATA[ผมชอบไอเดีย Chainability (เชน-นะ-บิ-ลิ-ตี้; สามารถเรียกใช้ต่อเนื่องได้) จริง ๆ ถึงแม้จะใช้ไม่่ค่อยบ่อยก็ตามที Chainability เป็นคุณสมบัติหนึ่งของ jQuery ที่จะช่วยเพิ่มประสิทํธิืภาพ และลดจำนวนบรรทัดในการเขียนโค๊ดลงได้ โดยหลักการง่าย ๆ ของ Chainability คือ การคืนค่า jQuery Object ของฟังก์ชั่นที่ทำงานเสร็จแล้วกลับมา ผมแยกไอเดียของ jQuery ออกมาคร่าว ๆ เพื่อให้เข้าใจได้ง่ายขึ้นดังนี้ครับ ตามหลักคือฟังก์ชั่นต่าง ๆ ที่เราเรียกใช้งานได้ของ jQuery Object นั้น มันคืนค่า jQuery Object กลับมาให้ ซึ่งก็จะมีฟังก์ชั่นต่าง ๆ ของ jQuery Object อย่างครบถ้วน ทำให้เราสามารถเรียกฟังก์ชั่นของ jQuery Object ได้ต่อเนื่องกันไปเรื่อย ๆ ไม่รู้จบ เช่น $("span[@name=clickme]") .mouseover(mouseover_handler) .mouseout(mouseout_handler) .click(mouseclick_handler) .html("คลิกฉันสิจ๊ะ"); Chainability [...]]]></description>
			<content:encoded><![CDATA[<p>ผมชอบไอเดีย Chainability (<em>เชน-นะ-บิ-ลิ-ตี้; สามารถเรียกใช้ต่อเนื่องได้</em>) จริง ๆ ถึงแม้จะใช้ไม่่ค่อยบ่อยก็ตามที Chainability เป็นคุณสมบัติหนึ่งของ jQuery ที่จะช่วยเพิ่มประสิทํธิืภาพ และลดจำนวนบรรทัดในการเขียนโค๊ดลงได้ โดยหลักการง่าย ๆ ของ Chainability คือ การคืนค่า jQuery Object ของฟังก์ชั่นที่ทำงานเสร็จแล้วกลับมา</p>
<p><span id="more-117"></span></p>
<p>ผมแยกไอเดียของ jQuery ออกมาคร่าว ๆ เพื่อให้เข้าใจได้ง่ายขึ้นดังนี้ครับ</p>
<ul>
<li>ตามหลักคือฟังก์ชั่นต่าง ๆ ที่เราเรียกใช้งานได้ของ jQuery Object นั้น มันคืนค่า jQuery Object กลับมาให้ ซึ่งก็จะมีฟังก์ชั่นต่าง ๆ ของ jQuery Object อย่างครบถ้วน ทำให้เราสามารถเรียกฟังก์ชั่นของ jQuery Object ได้ต่อเนื่องกันไปเรื่อย ๆ ไม่รู้จบ เช่น</li>
</ul>
<pre name="code" class="js">
$("span[@name=clickme]")
    .mouseover(mouseover_handler)
    .mouseout(mouseout_handler)
    .click(mouseclick_handler)
    .html("คลิกฉันสิจ๊ะ");
</pre>
<ul>
<li>Chainability จะกระทำกับ Object ที่เกิดจาก Selector ที่เราระบุไว้เท่านั้น บางกรณีเราสามารถเปลี่ยน Selector ในขณะที่กำลังทำ Chain (เรียกอย่างต่อเนื่อง) อยู่ก็ได้</li>
</ul>
<pre name="code" class="js">
$("span")
    .filter("[@name=clickme"])
        .click(function(){alert("Click");})
        .end()   // เพื่อจบ chain ที่ได้จาก filter "[@name=clickme]"
    .filter("[@name=hoverme"])
        .mouseover(function(){alert("Mouse over");})
        .mouseout(function(){alert("Mouse out");});
</pre>
<p>ข้อดีที่เท่าที่ผมเห็นของ Chainability คือ</p>
<ol>
<li>เมื่อเราทำ Chain แสดงว่า เราจะได้จำนวนบรรทัดที่น้อยลง</li>
<li>เมื่อมันเป็น Chain แสดงว่า มันจะมีการ re-use (ใช้ซ้ำ) Object เดิม ไม่ต้องไปเสียเวลาค้นหาใน DOM ใหม่ แน่นอนที่ว่า มันจะเป็นการเพิ่ม Throughput ให้กับงานที่ทำได้ไปในตัว เช่น ลองเปรียบเทียบ Code ที่ทำงานเหมือนกัน 2 ชุดด้านล่างนี้ จะเห็นความแตกต่างทันทีครับ</li>
</ol>
<pre name="code" class="js">
$("span[@name=clickme]")
    .mouseover(mouseover_handler)
    .mouseout(mouseout_handler)
    .click(mouseclick_handler)
    .html("คลิกฉันสิจ๊ะ");
</pre>
<pre name="code" class="js">
$("span[@name=clickme]").mouseover(mouseover_handler);
$("span[@name=clickme]").mouseout(mouseout_handler);
$("span[@name=clickme]").click(mouseclick_handler);
$("span[@name=clickme]").html("คลิกฉันสิจ๊ะ");
</pre>
<p>เพื่อให้เห็นภาพได้ชัดเจนมากขึ้น ลองไปดูที่ <a title="LIVE DEMO : jQuery Chainability" href="http://sandbox.chonla.com/chainability" target="_blank">LIVE DEMO</a> กันครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2008/11/%e0%b9%80%e0%b8%a1%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%9f%e0%b9%89%e0%b8%b2%e0%b8%aa%e0%b9%88%e0%b8%87-chainability-%e0%b8%a1%e0%b8%b2%e0%b9%83%e0%b8%ab%e0%b9%89%e0%b8%81%e0%b8%b1%e0%b8%9a-jquery/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hotmail โฉมใหม่ เร็วปรู๊ดดดด&#8230;!</title>
		<link>http://blog.chonla.com/2008/11/hotmail-%e0%b9%82%e0%b8%89%e0%b8%a1%e0%b9%83%e0%b8%ab%e0%b8%a1%e0%b9%88-%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b8%9b%e0%b8%a3%e0%b8%b9%e0%b9%8a%e0%b8%94%e0%b8%94%e0%b8%94%e0%b8%94/</link>
		<comments>http://blog.chonla.com/2008/11/hotmail-%e0%b9%82%e0%b8%89%e0%b8%a1%e0%b9%83%e0%b8%ab%e0%b8%a1%e0%b9%88-%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b8%9b%e0%b8%a3%e0%b8%b9%e0%b9%8a%e0%b8%94%e0%b8%94%e0%b8%94%e0%b8%94/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 03:09:47 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Performance Tuning]]></category>
		<category><![CDATA[Web Technologies]]></category>
		<category><![CDATA[Hotmail]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=110</guid>
		<description><![CDATA[Hotmail โฉมใหม่ หรือที่ปัจจุบันกลายมาเป็น Windows Live Hotmail แล้ว ได้มีการปรับปรุงขนานใหญ่ ผมได้ข่าวนี้จาก Newsletter ของ Hotmail เองมาสักพักแล้ว และวันนี้ (4 พ.ย. 2551) ผมก็ได้ทดลองใช้ด้วยตัวเอง เข้ามาครั้งแรก ได้เจอกับข้อความแจ้งถึงการเปลี่ยนแปลงของ Hotmail ครั้งใหญ่ ที่อ้างถึง 3 สิ่งที่เปลี่ยนแปลงไป คือ รูปลักษณ์ที่เรียบง่ายที่ปรับแต่งได้เองมากขึ้น เข้าถึงอีเมลได้เร็วขึ้นถึง 70%! เข้าถึงผู้ติดต่อ Windows Live Hotmail ได้ง่ายขึ้น จากที่ได้ทดลองใช้ จะเห็นได้ว่า สิ่งที่เปลี่ยนไปอย่างเห็นได้ชัดคือกราฟิคที่เบาลง ใน Hotmail เวอร์ชั่นเดิม จะเห็นได้ว่า มีสีสันและรูปภาพกราฟิคจำนวนมาก ซึ่งเป็นปัจจัยหนึ่งที่ทำให้โหลดหน้าได้ช้า ใน Hotmail ใหม่นี้ สีสันดูสะอาดสะอ้านมากขึ้น แต่ก็ยังมีรูปแบบธีม (Theme) ของสีที่ให้มา (Default) ที่ดูขัด ๆ กันอยู่ดี นอกจากนี้แล้วยังมีธีมรูปแบบอื่น [...]]]></description>
			<content:encoded><![CDATA[<p>Hotmail โฉมใหม่ หรือที่ปัจจุบันกลายมาเป็น Windows Live Hotmail แล้ว ได้มีการปรับปรุงขนานใหญ่ ผมได้ข่าวนี้จาก Newsletter ของ Hotmail เองมาสักพักแล้ว และวันนี้ (4 พ.ย. 2551) ผมก็ได้ทดลองใช้ด้วยตัวเอง</p>
<p><span id="more-110"></span></p>
<p>เข้ามาครั้งแรก ได้เจอกับข้อความแจ้งถึงการเปลี่ยนแปลงของ Hotmail ครั้งใหญ่ ที่อ้างถึง 3 สิ่งที่เปลี่ยนแปลงไป คือ</p>
<ol>
<li>รูปลักษณ์ที่เรียบง่ายที่ปรับแต่งได้เองมากขึ้น</li>
<li>เข้าถึงอีเมลได้เร็วขึ้นถึง 70%!</li>
<li>เข้าถึงผู้ติดต่อ Windows Live Hotmail ได้ง่ายขึ้น</li>
</ol>
<p><a href="http://blog.chonla.com/wp-content/uploads/2008/11/hotmail.png"><img class="alignnone size-full wp-image-113" title="Hotmail Changes" src="http://blog.chonla.com/wp-content/uploads/2008/11/hotmail.png" alt="" width="500" height="284" /></a></p>
<p>จากที่ได้ทดลองใช้ จะเห็นได้ว่า สิ่งที่เปลี่ยนไปอย่างเห็นได้ชัดคือกราฟิคที่เบาลง ใน Hotmail เวอร์ชั่นเดิม จะเห็นได้ว่า มีสีสันและรูปภาพกราฟิคจำนวนมาก ซึ่งเป็นปัจจัยหนึ่งที่ทำให้โหลดหน้าได้ช้า ใน Hotmail ใหม่นี้ สีสันดูสะอาดสะอ้านมากขึ้น แต่ก็ยังมีรูปแบบธีม (Theme) ของสีที่ให้มา (Default) ที่ดูขัด ๆ กันอยู่ดี นอกจากนี้แล้วยังมีธีมรูปแบบอื่น ๆ ที่ให้มา ผมลองเปลี่ยนเล่นแล้วก็เห็นถึงความเปลี่ยนแปลงเพียงนิดหน่อย (นิดเดียวจริง ๆ) คือโทนสีที่เปลี่ยนไปเพียงบางจุด และรูปภาพกราฟิคที่เปลี่ยนไป</p>
<p>ผมได้ลองเรื่องความรวดเร็วในการเข้าถึงอีเมลแต่ละฉบับ ก็พบว่า เข้าถึงรวดเร็วดี น่าจะเร็วขึ้นกว่าแต่ก่อนตามที่กล่าวอ้าง แต่ผมจับเวลาไม่ได้ว่าเร็วขึ้นกี่เปอเซนต์ แต่ก็ถือว่าเร็วใช้ได้</p>
<p>นอกจากนี้แล้ว ยังมีรูปแบบวิธีการใส่อีเมลของผู้รับที่เปลี่ยนไปเล็กน้อย คือ มีฟังก์ชั่นให้ค้นหาโดยการกดปุ่ม, autocomplete ที่สวยงามมากขึ้น, การจัดการอีเมลที่พิมพ์เข้าไปแล้ว (มีกากบาทให้ลบอีเมลที่พิมพ์เข้าไปแล้วได้) ก็ถือว่าในส่วนนี้สะดวกขึ้นจริง ๆ</p>
<p>โดยรวมแล้ว ผมถือว่าเป็นพัฒนาการที่ดีขึ้นของ Hotmail ครับ แต่ถึงยังไง ผมก็ยังชอบ Gmail มากกว่าครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2008/11/hotmail-%e0%b9%82%e0%b8%89%e0%b8%a1%e0%b9%83%e0%b8%ab%e0%b8%a1%e0%b9%88-%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b8%9b%e0%b8%a3%e0%b8%b9%e0%b9%8a%e0%b8%94%e0%b8%94%e0%b8%94%e0%b8%94/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>มารู้จักกับ Google Gears, เร่งสปีดเว็บด้วย Google Gears</title>
		<link>http://blog.chonla.com/2008/10/%e0%b8%a1%e0%b8%b2%e0%b8%a3%e0%b8%b9%e0%b9%89%e0%b8%88%e0%b8%b1%e0%b8%81%e0%b8%81%e0%b8%b1%e0%b8%9a-google-gears-%e0%b9%80%e0%b8%a3%e0%b9%88%e0%b8%87%e0%b8%aa%e0%b8%9b%e0%b8%b5%e0%b8%94%e0%b9%80/</link>
		<comments>http://blog.chonla.com/2008/10/%e0%b8%a1%e0%b8%b2%e0%b8%a3%e0%b8%b9%e0%b9%89%e0%b8%88%e0%b8%b1%e0%b8%81%e0%b8%81%e0%b8%b1%e0%b8%9a-google-gears-%e0%b9%80%e0%b8%a3%e0%b9%88%e0%b8%87%e0%b8%aa%e0%b8%9b%e0%b8%b5%e0%b8%94%e0%b9%80/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 14:06:59 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Gears]]></category>
		<category><![CDATA[Performance Tuning]]></category>
		<category><![CDATA[Web Technologies]]></category>
		<category><![CDATA[Google Gears]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=88</guid>
		<description><![CDATA[Google Gears หรือ Gears เป็นเทคโนโลยีใหม่ ที่ช่วยให้การเปิดเว็บสามารถทำไปได้อย่างรวดเร็วมากขึ้นโดยอาศัยหลักการง่าย ๆ ที่ว่า ไฟล์ต่าง ๆ ที่อยู่บนเครื่องของเรา ย่อมโหลดมาได้เร็วกว่าไฟล์ที่อยู่บนเว็บเซิร์ฟเวอร์ องค์ประกอบของ Gears Gears ประกอบด้วยส่วนประกอบต่าง ๆ ดังนี้ Database Module (ใช้ SQLite) เพื่อใช้เก็บข้อมูลต่าง ๆ ของเว็บไว้ในเครื่องของเรา WorkerPool Module ใช้สำหรับการรัน JavaScript ใน Background LocalServer Module ใช้สำหรับการเรียกใช้ไฟล์ต่าง ๆ ไม่ว่าจะเป็นภาพ หรือข้อมูลอื่น ๆ โดยไม่จำเป็นต้องมีการต่ออินเตอร์เน็ต (Offline Data) โดย LocalServer จะทำการ Cache ข้อมูลเหล่านี้ไว้บนเครื่อง และให้บริการเมื่อมีการร้องขอ Desktop Module ใช้เพื่อให้เว็บที่ใช้ Gears สามารถใช้งานคำสั่งที่เกี่ยวกับ Desktop ได้ เช่น [...]]]></description>
			<content:encoded><![CDATA[<p>Google Gears หรือ Gears เป็นเทคโนโลยีใหม่ ที่ช่วยให้การเปิดเว็บสามารถทำไปได้อย่างรวดเร็วมากขึ้นโดยอาศัยหลักการง่าย ๆ ที่ว่า ไฟล์ต่าง ๆ ที่อยู่บนเครื่องของเรา ย่อมโหลดมาได้เร็วกว่าไฟล์ที่อยู่บนเว็บเซิร์ฟเวอร์</p>
<p><span id="more-88"></span></p>
<p><strong>องค์ประกอบของ Gears</strong></p>
<p>Gears ประกอบด้วยส่วนประกอบต่าง ๆ ดังนี้</p>
<ol>
<li>Database Module (ใช้ SQLite) เพื่อใช้เก็บข้อมูลต่าง ๆ ของเว็บไว้ในเครื่องของเรา</li>
<li>WorkerPool Module ใช้สำหรับการรัน JavaScript ใน Background</li>
<li>LocalServer Module ใช้สำหรับการเรียกใช้ไฟล์ต่าง ๆ ไม่ว่าจะเป็นภาพ หรือข้อมูลอื่น ๆ โดยไม่จำเป็นต้องมีการต่ออินเตอร์เน็ต (Offline Data) โดย LocalServer จะทำการ Cache ข้อมูลเหล่านี้ไว้บนเครื่อง และให้บริการเมื่อมีการร้องขอ</li>
<li>Desktop Module ใช้เพื่อให้เว็บที่ใช้ Gears สามารถใช้งานคำสั่งที่เกี่ยวกับ Desktop ได้ เช่น การสร้าง Shortcut</li>
<li>Geolocation Module ใช้สำหรับบอกตำแหน่งที่อยู่ของผู้ใช้งานเว็บที่ใช้ Gears ณ ขณะนั้น</li>
</ol>
<p><strong>การทำงานของ Gears</strong></p>
<p>ตามที่ผมเคยอ้างไว้ในบทความ Ajax? คืออะไรกันหว่า? [<a title="Ajax? คืออะไรกันหว่า?" href="http://blog.chonla.com/?p=8" target="_blank">http://blog.chonla.com/?p=8</a>] ว่า เว็บ 1 หน้า จะแยกเป็น 3 ส่วน คือ Layout (Application UI), Data, และ Script ส่วนที่เป็น Data ที่แยกออกมานี้ เราเรียกว่า Data Layer</p>
<p>โดยปกติเว็บทั่ว ๆ ไป จะไม่มีการแยก Data Layer ออกมาจากส่วน Layout แต่จะเขียนปนกัน</p>
<div id="attachment_89" class="wp-caption alignnone" style="width: 403px"><a href="http://blog.chonla.com/wp-content/uploads/2008/10/figure_1.jpg"><img class="size-full wp-image-89" title="การเชื่อมต่อแบบไม่มี Data Layer" src="http://blog.chonla.com/wp-content/uploads/2008/10/figure_1.jpg" alt="การเชื่อมต่อแบบไม่มี Data Layer" width="393" height="131" /></a><p class="wp-caption-text">การเชื่อมต่อแบบไม่มี Data Layer</p></div>
<p>การที่จะเก็บ Data ไว้ในเครื่องเราได้นั้น เราจำเป็นต้องแยก Data Layer ออกจาก Layout ก่อน เราเรียกขั้นตอนนี้ว่า Data Isolation เมื่อเรามองถึงเว็บที่มีการเรียกใช้ Ajax ในการแลกเปลี่ยนเฉพาะ Data ระหว่างเว็บบราวเซอร์ และเว็บเซิร์ฟเวอร์ เราสามารถพิจารณาได้ว่า Ajax นี่เองที่ทำหน้าที่เป็น Data Layer ของเว็บนั้น ๆ</p>
<div id="attachment_90" class="wp-caption alignnone" style="width: 510px"><a href="http://blog.chonla.com/wp-content/uploads/2008/10/figure_2.jpg"><img class="size-full wp-image-90" title="การเชื่อมต่อแบบมี Data Layer" src="http://blog.chonla.com/wp-content/uploads/2008/10/figure_2.jpg" alt="การเชื่อมต่อแบบมี Data Layer" width="500" height="112" /></a><p class="wp-caption-text">การเชื่อมต่อแบบมี Data Layer</p></div>
<p>และตรงนี้เองที่ Gears จะเข้ามามีบทบาท ลองพิจารณาดูนะครับว่า ถ้าเราเอา Module อะไรซักอย่าง ไปคั่นระหว่างส่วนเว็บบราวเซอร์กับส่วน Data Layer เพื่อใช้ในตัดสินใจว่าจะดึงข้อมูลที่เราเก็บไว้จากในเครื่องของเรา หรือจะดึงข้อมูลใหม่จากเว็บเซิร์ฟเวอร์แทน หรือจะทำทั้ง 2 อย่างดี เราเรียก Module ตัวนี้ว่า Data Switch เราสามารถมองได้ว่า Data Switch นี่ก็ทำตัวเหมือนเป็น Data Layer เหมือนกันนั่นเอง</p>
<div id="attachment_91" class="wp-caption alignnone" style="width: 510px"><a href="http://blog.chonla.com/wp-content/uploads/2008/10/figure_3.jpg"><img class="size-full wp-image-91" title="เพิ่ม Data Switch เข้าไป" src="http://blog.chonla.com/wp-content/uploads/2008/10/figure_3.jpg" alt="เพิ่ม Data Switch เข้าไป" width="500" height="103" /></a><p class="wp-caption-text">เพิ่ม Data Switch เข้าไป</p></div>
<p>Data Switch จะทำหน้าที่ทั้งบันทึกข้่อมูลที่ต้องการลงสู่เครื่องของเรา และดึงข้อมูลที่เราต้องการออกมา เมื่อเราเชื่อมภาพการทำงานของ Data Switch เข้าไปด้วย เราจะเห็นได้ว่า นี่แหละครับ คอนเซ์ปต์การทำงานของ Gears</p>
<div id="attachment_92" class="wp-caption alignnone" style="width: 510px"><a href="http://blog.chonla.com/wp-content/uploads/2008/10/figure_4.jpg"><img class="size-full wp-image-92" title="ภาพการทำงานของ Gears เมื่อติดต่อกับ LocalServer และ Database Module" src="http://blog.chonla.com/wp-content/uploads/2008/10/figure_4.jpg" alt="ภาพการทำงานของ Gears เมื่อติดต่อกับ LocalServer และ Database Module" width="500" height="160" /></a><p class="wp-caption-text">ภาพการทำงานของ Gears เมื่อติดต่อกับ LocalServer และ Database Module</p></div>
<p>ตัว Data Switch เองยังสามารถที่จะกำหนดให้ทำการ Synchronize ข้อมูลกับ Server เป็นระยะได้อีกด้วย</p>
<p><strong>Gears เมื่อไม่มี Data Layer</strong></p>
<p>จะทำยังไง ถ้าเราไม่ได้ทำ Data Layer? ยังทำได้ครับ แต่ก็ยุ่งยากขึ้นมาหน่อย เราจะต้องเขียน Code ในการดักขั้นตอนของการรับส่งข้อมูลไปยัง Server เช่น ตอน Submit Form แต่การทำแบบนี้ ทำให้เราต้องทำงานหนักขึ้นอีกเยอะ สู้เอาเวลามาแยก Data Layer ออกมาน่าจะง่ายกว่าหรือเปล่า? <img src='http://blog.chonla.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>เมื่อไหร่ที่จะควรหรือไม่ควรทำ Offline Data</strong></p>
<ul>
<li>เมื่อข้อมูลเป็นข้อมูลชั่วคราว เช่น ข้อมูลดัชนีหุ้น แบบนี้ก็ไม่ควรทำ</li>
<li>ข้อมูลบางอย่างจะมันก็ควรจะเป็น online มากกว่าที่จะเป็น offline เช่น ข้อความพูดคุยในโปรแกรม Chat แบบนี้ก็ไม่ควรทำเหมือนกัน</li>
<li>ข้อมูลที่มีการเรียกใช้บ่อย ๆ แบบนี้ควรทำอย่างยิ่ง</li>
<li>ข้อมูลที่ต้องมีการประมวลผล หรือใช้ข้อมูลมากมายมหาศาลเกินกว่าเครื่องผู้ใช้จะรับไหวได้ แบบนี้ก็ไม่ควรทำ</li>
</ul>
<p><strong>การ Synchronize Data</strong></p>
<p>จะเกิดขึ้น เพราะสาเหตุดังนี้</p>
<ul>
<li>มีการเปลี่ยนแปลงข้อมูลในขณะที่ Offline</li>
<li>มีการใช้งานข้อมูลร่วมกันกับคนอื่น (คนอื่นอาจจะเปลี่ยนแปลงข้อมูลนั้นได้)</li>
<li>มีการเรียกใช้งานข้อมูลจาก External Resource เช่นการเรียกใช้งาน Feed</li>
</ul>
<p>การทำให้ข้อมูลบนเครื่อง เหมือนกับข้อมูลบนเว็บเซิร์ฟเวอร์ เราเรียกว่าการทำ Synchronization เราสามารถทำได้ 2 วิธีคือ Manual Sync และ Background Sync</p>
<p><strong>Manual Sync</strong></p>
<p>จะทำก็ต่อเมื่อ มีข้อมูลที่ต้อง Sync ไม่มากก และผู้ใช้้ต้องการข้อมูลที่ใหม่ล่าสุดก่อนที่จะทำการเปลี่ยนไปใช้ข้อมูลแบบ Offline แต่ปัญหาของการทำ Manual Sync ก็มี เช่น เราไม่สามารถรู้ได้ว่า Network ในขณะนั้นหลุดเมื่อไหร่ เพราะผู้ใช้อาจจะอยู่ในสถานที่ที่ Network ไม่เสถียร เช่นบนรถ เป็นต้น หรือ User อาจจะลืม Sync ก่อนที่จะเข้าสู่ Offline ก็ได้</p>
<p><strong>Background Sync</strong></p>
<p>วิธีนี้จะมีข้อดีคือ ข้อมูลจะอัพเดทเสมอ และสามารถทำได้แม้เน็ตจะไม่เร็ว ข้อเสียคือ ถ้าไม่ได้ใช้ WorkerPool (ถ้าจำไม่ได้ว่าคืออะไร ให้ย้อนกลับไปอ่านข้างต้น) มันจะกิน resource ปริมาณมาก อาจจะทำให้เน็ตช้าได้</p>
<div id="attachment_93" class="wp-caption alignnone" style="width: 510px"><a href="http://blog.chonla.com/wp-content/uploads/2008/10/figure_5.jpg"><img class="size-full wp-image-93" title="Gears ภาพรวม" src="http://blog.chonla.com/wp-content/uploads/2008/10/figure_5.jpg" alt="Gears ภาพรวม" width="500" height="204" /></a><p class="wp-caption-text">Gears ภาพรวม</p></div>
<p><strong>ตัวอย่างเว็บที่ใช้ Gears</strong></p>
<p>Google (Docs, Reader, Picasa, YouTube), MySpace, WordPress 2.6</p>
<p><strong>ตัวอย่าง Gears Application</strong></p>
<ul>
<li><a title="ตัวอย่าง Gears Application" href="http://code.google.com/apis/gears/sample.html" target="_blank">http://code.google.com/apis/gears/sample.html</a></li>
</ul>
<p><strong>บทสรุป</strong></p>
<p>ตามความเห็นส่วนตัวแล้ว Gears ถือว่าเป็นเทคโนโลยีที่น่าสนใจตัวหนึ่ง ยิ่งผนวกเข้ากับ DHTML ที่นับวันยิ่งหวือหวาได้ใจด้วยแล้ว คงเอาชนะใจ Developer หลาย ๆ คนได้ไม่ยาก แต่สำหรับในเชิงการพัฒนาเพื่อธุรกิจแล้ว อาจจะทำได้ยาก เพราะความไม่แน่นอนของพฤติกรรมของผู้ใช้ อาจจะเป็นปัจจัยหลักในการตัดสินใจนำมาใช้สำหรับผู้บริหารได้</p>
<p><strong>แหล่งอ้างอิง</strong></p>
<ul>
<li><a title="Gears Architecture" href="http://code.google.com/apis/gears/architecture.html" target="_blank">http://code.google.com/apis/gears/architecture.html</a></li>
<li><a title="WIKI: Gears (Software)" href="http://en.wikipedia.org/wiki/Gears_(software)" target="_blank">http://en.wikipedia.org/wiki/Gears_(software)</a></li>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2008/10/%e0%b8%a1%e0%b8%b2%e0%b8%a3%e0%b8%b9%e0%b9%89%e0%b8%88%e0%b8%b1%e0%b8%81%e0%b8%81%e0%b8%b1%e0%b8%9a-google-gears-%e0%b9%80%e0%b8%a3%e0%b9%88%e0%b8%87%e0%b8%aa%e0%b8%9b%e0%b8%b5%e0%b8%94%e0%b9%80/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>เร่งสปีดเว็บด้วย CSS Sprite</title>
		<link>http://blog.chonla.com/2008/10/%e0%b9%80%e0%b8%a3%e0%b9%88%e0%b8%87%e0%b8%aa%e0%b8%9b%e0%b8%b5%e0%b8%94%e0%b9%80%e0%b8%a7%e0%b9%87%e0%b8%9a%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-css-sprite/</link>
		<comments>http://blog.chonla.com/2008/10/%e0%b9%80%e0%b8%a3%e0%b9%88%e0%b8%87%e0%b8%aa%e0%b8%9b%e0%b8%b5%e0%b8%94%e0%b9%80%e0%b8%a7%e0%b9%87%e0%b8%9a%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-css-sprite/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 18:54:58 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Performance Tuning]]></category>
		<category><![CDATA[CSS Sprite]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=49</guid>
		<description><![CDATA[การลดจำนวนไฟล์ที่เว็บบราวเซอร์จะต้องโหลด เป็นวิธีหนึ่งที่จะทำให้การโหลดเว็บทำได้รวดเร็วยิ่งขึ้น วิธีหนึ่งที่ผมจะพูดถึงในครั้งนี้ เราเรียกว่า CSS Sprite CSS Sprite สามารถช่วยให้จำนวนไฟล์ลดลงได้ โดยการรวมไฟล์ภาพเข้าด้วยกัน และนำไปใช้โดยการกำหนดผ่านค่า background-position ใน css นั่นเอง และการรวมไฟล์ภาพเข้าด้วยกันนี่เอง จากที่เราเคยจะต้องโหลดไฟล์หลาย ๆ ไฟล์ ก็จะสามารถลดลงมาใช้เพียง 1 หรือ 2 ไฟล์ บางกรณีการรวมไฟล์เข้าด้วยกันเป็นไฟล์เดียว ยังทำให้ขนาดไฟล์โดยรวมเล็กลงอีกด้วย การใช้ CSS Sprite ส่วนใหญ่แล้ว จะพบเห็นได้บ่อยในการทำกรอบของข้อความ การทำกรอบของข้อความ โดยปกติแล้ว การทำกรอบเราจำเป็นที่จะต้องใช้กรอบถึง 8 ไฟล์ด้วยกันคือ แต่ในที่นี้ เราสามารถ ลดเหลือ 2 ภาพได้ คือ และ เราลองมาดูตัวอย่างกันใน LIVE DEMO ได้เลยครับ]]></description>
			<content:encoded><![CDATA[<p>การลดจำนวนไฟล์ที่เว็บบราวเซอร์จะต้องโหลด เป็นวิธีหนึ่งที่จะทำให้การโหลดเว็บทำได้รวดเร็วยิ่งขึ้น วิธีหนึ่งที่ผมจะพูดถึงในครั้งนี้ เราเรียกว่า CSS Sprite</p>
<p><span id="more-49"></span></p>
<p>CSS Sprite สามารถช่วยให้จำนวนไฟล์ลดลงได้ โดยการรวมไฟล์ภาพเข้าด้วยกัน และนำไปใช้โดยการกำหนดผ่านค่า background-position ใน css นั่นเอง และการรวมไฟล์ภาพเข้าด้วยกันนี่เอง จากที่เราเคยจะต้องโหลดไฟล์หลาย ๆ ไฟล์ ก็จะสามารถลดลงมาใช้เพียง 1 หรือ 2 ไฟล์ บางกรณีการรวมไฟล์เข้าด้วยกันเป็นไฟล์เดียว ยังทำให้ขนาดไฟล์โดยรวมเล็กลงอีกด้วย</p>
<p>การใช้ CSS Sprite ส่วนใหญ่แล้ว จะพบเห็นได้บ่อยในการทำกรอบของข้อความ</p>
<p>การทำกรอบของข้อความ โดยปกติแล้ว การทำกรอบเราจำเป็นที่จะต้องใช้กรอบถึง 8 ไฟล์ด้วยกันคือ <a href="http://blog.chonla.com/wp-content/uploads/2008/10/8piece.png"><img class="size-medium wp-image-50" title="8-pieced-border" src="http://blog.chonla.com/wp-content/uploads/2008/10/8piece.png" alt="" width="50" height="50" align="absmiddle" /></a> แต่ในที่นี้ เราสามารถ ลดเหลือ 2 ภาพได้ คือ <a href="http://blog.chonla.com/wp-content/uploads/2008/10/corner.png"><img class="size-medium wp-image-52" title="ภาพมุมและขอบซ้ายขวา" src="http://blog.chonla.com/wp-content/uploads/2008/10/corner.png" alt="" width="33" height="20" align="absmiddle" /></a> และ <a href="http://blog.chonla.com/wp-content/uploads/2008/10/border.png"><img class="size-medium wp-image-51" title="ภาพขอบบนล่าง" src="http://blog.chonla.com/wp-content/uploads/2008/10/border.png" alt="" width="1" height="13" align="absmiddle" /></a></p>
<p>เราลองมาดูตัวอย่างกันใน <a title="LIVE DEMO - CSS Sprite" href="http://sandbox.chonla.com/csssprite" target="_blank">LIVE DEMO</a> ได้เลยครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2008/10/%e0%b9%80%e0%b8%a3%e0%b9%88%e0%b8%87%e0%b8%aa%e0%b8%9b%e0%b8%b5%e0%b8%94%e0%b9%80%e0%b8%a7%e0%b9%87%e0%b8%9a%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-css-sprite/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
