<?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>jQueryTips by Tee++; &#187; Others</title>
	<atom:link href="http://www.jquerytips.com/category/others/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jquerytips.com</link>
	<description>Coding is fun.</description>
	<lastBuildDate>Sun, 25 Apr 2010 11:30:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>เฮ้ยจะกลับมา Update แล้ว 555+</title>
		<link>http://www.jquerytips.com/2010/01/28/i-am-back/</link>
		<comments>http://www.jquerytips.com/2010/01/28/i-am-back/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 18:42:18 +0000</pubDate>
		<dc:creator>Tee++;</dc:creator>
				<category><![CDATA[Codeigniter]]></category>
		<category><![CDATA[Others]]></category>

		<guid isPermaLink="false">http://www.jquerytips.com/?p=510</guid>
		<description><![CDATA[หายไปทำบ้าทำบอ อยู่ราวๆ ครึ่งปี จนตอนนี้เก็บสะสม ความรู้ใหม่ๆได้เพียบเลย จะค่อยๆ กลับทยอย อัพเดทให้อ่านกันอีกครั้งนะครับ โดยเรื่องที่จะอีัพเดทที่มีเตรียมไว้ในหัวตอนนี้ก็คือ
1. CodeIgniter Ready to Code
อันนี้เป็น CI Structure ที่ผมทำมาเอง ซึ่งตอนนี้ผม ทำเทสหลายๆ ด้าน รวมถึงความง่ายในการเขียน รับรองว่า สุดจี๊ด เลย ทั้งสวยงามน่าใช้ ทั้ง performance ดีเยี่ยม จนคุณลืม CI แบบปกติทิ้งไปได้เลย 
รองรับ
1. การแยก File Server
2. การทำ Replicate Database (Zend Db)
3. การ Caching (Zend Cache)
4. Timezone ของ App ปรับได้ (Zend Date and Zend Local)
5. Translate ทำผ่าน gettext [...]]]></description>
			<content:encoded><![CDATA[<p>หายไปทำบ้าทำบอ อยู่ราวๆ ครึ่งปี จนตอนนี้เก็บสะสม ความรู้ใหม่ๆได้เพียบเลย จะค่อยๆ กลับทยอย อัพเดทให้อ่านกันอีกครั้งนะครับ โดยเรื่องที่จะอีัพเดทที่มีเตรียมไว้ในหัวตอนนี้ก็คือ</p>
<p>1. CodeIgniter Ready to Code<br />
อันนี้เป็น CI Structure ที่ผมทำมาเอง ซึ่งตอนนี้ผม ทำเทสหลายๆ ด้าน รวมถึงความง่ายในการเขียน รับรองว่า สุดจี๊ด เลย ทั้งสวยงามน่าใช้ ทั้ง performance ดีเยี่ยม จนคุณลืม CI แบบปกติทิ้งไปได้เลย <span id="more-510"></span></p>
<p>รองรับ<br />
1. การแยก File Server<br />
2. การทำ Replicate Database (Zend Db)<br />
3. การ Caching (Zend Cache)<br />
4. Timezone ของ App ปรับได้ (Zend Date and Zend Local)<br />
5. Translate ทำผ่าน gettext แทน array (Zend Translate)<br />
6. เอาระบบ Mater page มาใช้แทน view เดิม<br />
7. จัดการเรื่อง ACL ได้สะดวก (Zend ACL)<br />
8. รองรับ user แบบ sub-domain<br />
9. ทำ Auto Resize ได้ทั้งแบบ Crop และแบบ ปกติ โดยไม่ต้องเขียน upload เอง<br />
10. ปรับ performance ในการ call function (Zend Registry)<br />
11. รองรับ API แบบ Rest Protocol (Zend Rest)</p>
<p>ที่สำคัญ ไม่มีการ hack core class ในลักษะณะที่ อัพเดทไม่ได้เด็ดขาด ลืมเรื่อง CI เก่าๆ ที่ผมเขียนมาได้เลย ตัวนี้ จี๊ด จริงๆ คนเขียนยังชอบ 555++</p>
<p>2. jQuery UI แบบ Advance<br />
อันนี้ผมไปลองทำ App ใหญ่ๆ พวก ที่ใช้ RIA เยอะๆ สรุปแล้ว jQuery UI ทำงานได้ดีที่สุด ผมจะเอาแสดงให้ดูทีละนิด ทีละหน่อยกัน</p>
<p>3. 960 Css Grid Framework<br />
ตัว Grid ที่ผมเอามาใช้แล้ว รู้สึกว่ามันสะดวก โครตๆ ยิ่งใช้ร่วมกับ jQuery UI แล้ว จับใจ &#8230;</p>
<p>4. Zend Framework<br />
ของรัก ตัวใหม่ที่รวบรวม Component ปราบเซียนไว้เพียบ </p>
<p>5. Facebook API<br />
เว็บซึ่งดังไปทั่วโลกใน ขณะนี้ แต่ Document API ในภาษาไทยไม่มีเลย ผมไปศึกษามาให้แทนหมดแล้วครับ ทั้ง<br />
FBJS<br />
XFBML<br />
FQL<br />
Facebook Client </p>
<p>งานนี้รับรองมีที่เดียวในไทย &#8230;.</p>
<p>*** ข้อที่ 2-4 นี่อยู่รวมใน ข้อ 1 หมดเลย ***</p>
<p>ยังไงรอติดตามกันนะครับ ทั้งหมดนี้บอกได้คำเดียวว่า &#8220;มหากาพย์&#8221; </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jquerytips.com/2010/01/28/i-am-back/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>พัก อัพเดทบล๊อกชั่วคราว</title>
		<link>http://www.jquerytips.com/2009/06/14/jquerytips-sleeping-time/</link>
		<comments>http://www.jquerytips.com/2009/06/14/jquerytips-sleeping-time/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 16:04:36 +0000</pubDate>
		<dc:creator>Tee++;</dc:creator>
				<category><![CDATA[Others]]></category>

		<guid isPermaLink="false">http://www.jquerytips.com/?p=486</guid>
		<description><![CDATA[อย่าเพิ่งตกใจไปครับ ยังไม่ได้หายไปไหน แต่ว่ากำลังไป &#8220;ตามฝัน&#8221; ตัวเอง อิอิ ว่าไปนั่น คือว่าช่วงนี้ผมยุ่งๆ หลายเรื่องเลย ทั้งเรื่อง&#8230;. (ไม่อยากบอก แต่เพื่อนๆ บางคน คงรู้ -*-) แล้วก็เรื่องงาน ตัวเอง ที่ใช้เวลา มานานมากก็ไม่ขยับเสียที ตอนนี้เริ่มรู้สึกว่าอยากทำจริงๆ จังๆขึ้นมาแล้ว ก็จะขอเอาเวลา ส่วนใหญ่ไป ทุ่มให้กับตรงนั้น
คือว่า &#8230;
ผมกำลังจะไปทำงาน ศิลปะ ครับ แต่ว่า เป็นศิลปะ ของ web application ซึ่ง ตอนนี้งานก็เริ่มเดินไปเรื่อยๆ แล้ว พอเอาเวลาไปทำงานตรงนั้น เลยกลัวว่า พอไม่ได้มาอัพเดทบล๊อกเลย เพื่อนๆ จะคิดว่าผมหายไปไหน ก็บอกตรงนี้เลยครับ ว่ายังไม่ได้หายไปไหน บล๊อกก็จะพยายาม อัพ แต่คงไม่ถี่ เหมือนเดิมแล้วล่ะ จะเอาเฉพาะ อะไรที่ &#8220;เด็ด&#8221; จริงๆ มาอัพ 
ยังไงก็อย่าเพิ่งทิ้งกันไปไหนนะครับ ^^
Mr.Tee Plus Plus
(I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>อย่าเพิ่งตกใจไปครับ ยังไม่ได้หายไปไหน แต่ว่ากำลังไป &#8220;ตามฝัน&#8221; ตัวเอง อิอิ ว่าไปนั่น คือว่าช่วงนี้ผมยุ่งๆ หลายเรื่องเลย ทั้งเรื่อง&#8230;. (ไม่อยากบอก แต่เพื่อนๆ บางคน คงรู้ -*-) แล้วก็เรื่องงาน ตัวเอง ที่ใช้เวลา มานานมากก็ไม่ขยับเสียที ตอนนี้เริ่มรู้สึกว่าอยากทำจริงๆ จังๆขึ้นมาแล้ว ก็จะขอเอาเวลา ส่วนใหญ่ไป ทุ่มให้กับตรงนั้น</p>
<p>คือว่า &#8230;</p>
<p>ผมกำลังจะไปทำงาน ศิลปะ ครับ แต่ว่า เป็นศิลปะ ของ web application ซึ่ง ตอนนี้งานก็เริ่มเดินไปเรื่อยๆ แล้ว พอเอาเวลาไปทำงานตรงนั้น เลยกลัวว่า พอไม่ได้มาอัพเดทบล๊อกเลย เพื่อนๆ จะคิดว่าผมหายไปไหน ก็บอกตรงนี้เลยครับ ว่ายังไม่ได้หายไปไหน บล๊อกก็จะพยายาม อัพ แต่คงไม่ถี่ เหมือนเดิมแล้วล่ะ จะเอาเฉพาะ อะไรที่ &#8220;เด็ด&#8221; จริงๆ มาอัพ </p>
<p>ยังไงก็อย่าเพิ่งทิ้งกันไปไหนนะครับ ^^</p>
<p><strong>Mr.Tee Plus Plus</strong><br />
<em>(I&#8217;m Coding like playing the piano.)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jquerytips.com/2009/06/14/jquerytips-sleeping-time/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>MySQL::Merge Storage Engine</title>
		<link>http://www.jquerytips.com/2009/05/27/mysqlmerge-storage-engine/</link>
		<comments>http://www.jquerytips.com/2009/05/27/mysqlmerge-storage-engine/#comments</comments>
		<pubDate>Wed, 27 May 2009 14:28:08 +0000</pubDate>
		<dc:creator>Tee++;</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.jquerytips.com/?p=464</guid>
		<description><![CDATA[พักนี้เริ่มมั่วไปใหญ่ละ ตอนที่เปิดเว็บ มาตั้งใจว่าจะเขียนแต่เรื่อง jQuery กับ Javascript แต่พักนี้ไหง มีทุกเรื่องเลยก็ไม่รู้ กลายเป็น บล๊อกโปรแกรมมิ่ง ไปไม่รู้ตัว แต่ขออีกทีน่า คนมันอยากเขียนนี่หว่า เดี๋ยวครั้งหน้ากลับมา เขียนเรื่อง jQuery ต่อ
วันนี้ที่จะมาเขียนก็ฉีกแนวไปจากเดิมอีกละ จะมาพูดถึงเรื่อง Storage Engine ตัวนึงที่มี ใน MySQL 5.0 ขึ้นไป นั่นก็คือ merge storage engine (MRG_MyIsam) นั่นเอง เป็นการทำให้ table หลายๆ ตัว ถูก มองเห็นเป็นตัวเดียวกัน 
ก่อนอื่นผมสร้าง DB ขึ้นมาทำการทดสอบชื่อว่า merge_test
จากนั้นผมสร้่าง table ขึ้นมา 2 ตัว ชื่อว่า table_a, table_b



CREATE TABLE `merge_test`.`table_a` &#40;


`id` INT&#40; 10 &#41; NOT [...]]]></description>
			<content:encoded><![CDATA[<p>พักนี้เริ่มมั่วไปใหญ่ละ ตอนที่เปิดเว็บ มาตั้งใจว่าจะเขียนแต่เรื่อง jQuery กับ Javascript แต่พักนี้ไหง มีทุกเรื่องเลยก็ไม่รู้ กลายเป็น บล๊อกโปรแกรมมิ่ง ไปไม่รู้ตัว แต่ขออีกทีน่า คนมันอยากเขียนนี่หว่า เดี๋ยวครั้งหน้ากลับมา เขียนเรื่อง jQuery ต่อ</p>
<p>วันนี้ที่จะมาเขียนก็ฉีกแนวไปจากเดิมอีกละ จะมาพูดถึงเรื่อง Storage Engine ตัวนึงที่มี ใน MySQL 5.0 ขึ้นไป นั่นก็คือ <strong>merge storage engine</strong> (MRG_MyIsam) นั่นเอง เป็นการทำให้ table หลายๆ ตัว ถูก มองเห็นเป็นตัวเดียวกัน </p>
<p>ก่อนอื่นผมสร้าง DB ขึ้นมาทำการทดสอบชื่อว่า <strong>merge_test</strong></p>
<p>จากนั้นผมสร้่าง table ขึ้นมา 2 ตัว ชื่อว่า table_a, table_b<span id="more-464"></span></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">CREATE TABLE `merge_test`.`table_a` <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">`id` INT<span class="br0">&#40;</span> <span class="nu0">10</span> <span class="br0">&#41;</span> NOT <span class="kw2">NULL</span> AUTO_INCREMENT ,</div>
</li>
<li class="li1">
<div class="de1">`data` VARCHAR<span class="br0">&#40;</span> <span class="nu0">25</span> <span class="br0">&#41;</span> NOT <span class="kw2">NULL</span> ,</div>
</li>
<li class="li1">
<div class="de1">PRIMARY <a href="http://www.php.net/key"><span class="kw3">KEY</span></a> <span class="br0">&#40;</span> `id` <span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#41;</span> ENGINE = MYISAM ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">CREATE TABLE `merge_test`.`table_b` <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">`id` INT<span class="br0">&#40;</span> <span class="nu0">10</span> <span class="br0">&#41;</span> NOT <span class="kw2">NULL</span> AUTO_INCREMENT ,</div>
</li>
<li class="li1">
<div class="de1">`data` VARCHAR<span class="br0">&#40;</span> <span class="nu0">25</span> <span class="br0">&#41;</span> NOT <span class="kw2">NULL</span> ,</div>
</li>
<li class="li2">
<div class="de2">PRIMARY <a href="http://www.php.net/key"><span class="kw3">KEY</span></a> <span class="br0">&#40;</span> `id` <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span> ENGINE = MYISAM ;</div>
</li>
</ol>
</div>
<p><strong>Engine ต้องเป็น MyIsam เท่านั้นนะครับ</strong></p>
<p>จากนั้นผม ก็ทำการ ทดสอบ insert ข้อมูล ลงไปใน table_a ก่อน ดังนี้</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">INSERT INTO `merge_test`.`table_a` <span class="br0">&#40;</span>`id`, `data`<span class="br0">&#41;</span> VALUES <span class="br0">&#40;</span><span class="kw2">NULL</span>, <span class="st0">&#8216;data for table a&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>แล้วต่อมาอีก ผมก็สร้าง merage table มามีชื่อว่า table_all</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">CREATE TABLE `table_all` <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; `id` int<span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> NOT <span class="kw2">NULL</span> AUTO_INCREMENT,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; `data` varchar<span class="br0">&#40;</span><span class="nu0">25</span><span class="br0">&#41;</span> NOT <span class="kw2">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; PRIMARY <a href="http://www.php.net/key"><span class="kw3">KEY</span></a> <span class="br0">&#40;</span>`id`<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#41;</span> ENGINE=MERGE UNION=<span class="br0">&#40;</span>table_a,table_b<span class="br0">&#41;</span> INSERT_METHOD=LAST</div>
</li>
</ol>
</div>
<p>โดยต้องมี Structure เหมือนกับ 2 table ด้านบนไม่ผิดเพี้ยน จากนั้นกำำหนด Engine เป็น merge ซะ และใช้คำสั่ง Union ในการเลืกว่าจพ เชื่อม table ไหน จากนั้น กำหนด ให้ data insert อยู่ที่ last table นั่นก็คือ table_b นั่นเอง</p>
<p>จากนั้นมาลอง insert ข้อมูลลง table_all</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">INSERT INTO `merge_test`.`table_all` <span class="br0">&#40;</span>`id`, `data`<span class="br0">&#41;</span> VALUES <span class="br0">&#40;</span><span class="kw2">NULL</span>, <span class="st0">&#8216;555 test&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>จะเห็นได้ว่า table_all จะเอา data ของ ทั้ง 2 table มาอยู่ในตัวเอง ดังภาพด้านล่าง</p>
<p><strong>table_a</strong><br />
<a href="http://www.jquerytips.com/wp-content/uploads/2009/05/table_a.jpg"><img src="http://www.jquerytips.com/wp-content/uploads/2009/05/table_a.jpg" alt="table_a" title="table_a" width="272" height="71" class="alignnone size-full wp-image-465" /></a></p>
<p><strong>table_b</strong><br />
<a href="http://www.jquerytips.com/wp-content/uploads/2009/05/table_b.jpg"><img src="http://www.jquerytips.com/wp-content/uploads/2009/05/table_b.jpg" alt="table_b" title="table_b" width="223" height="75" class="alignnone size-full wp-image-467" /></a></p>
<p><strong>table_all</strong><br />
<a href="http://www.jquerytips.com/wp-content/uploads/2009/05/table_all.jpg"><img src="http://www.jquerytips.com/wp-content/uploads/2009/05/table_all.jpg" alt="table_all" title="table_all" width="297" height="96" class="alignnone size-full wp-image-466" /></a></p>
<p>จากภาพเราก็จะเห็นได้ว่า data ที่เรา insert table_all จะไป ตกอยู่ที่ table_b ด้วย โดยที่ auto increment ไม่ผิดเพี้ยนไป </p>
<p>ก็คือ table_all จะเป็นตัว map data เท่านั้น โดยที่ ไม่ได้ทำหน้าที่เป็นตัวจัดเก็บจริงๆ<br />
*** ถ้ามี data เยอะๆ ไปลองสังเกตุไฟล์ table_all.frm ได้ว่า ไม่มีขนาดเพิ่มขึ้นตามจำนวน data ***</p>
<p>ทีนี้ เราก็จะสามารถบริหาร select, insert, delete, update โดยใช้ table_all เท่านั้น โดยไม่ต้องไปสนใจว่า data จะอยู่ที่ table_a หรือ table_b</p>
<p>วิธีนี้ไม่เหมือนกับการทำ Partition นะครับ เพราะว่า Data ไม่สามารถกำหนดในลักษณะั hasing ได้ ต้องเลือกเอาเลย ว่าจะ insert ลง table ไป &#8220;Last or First&#8221;</p>
<blockquote><p>เท่าที่ลองหาข้อมูลมา วิธีนี้ไม่ได้ช่วยเรื่อง performance เท่าไหร่ แต่ว่า เป็นการ merge table เพื่อนำมาวิเคราะห์ข้อมูลมากกว่า แตกต่างจาก partition อย่าสับสนกันนะครับ</p></blockquote>
<p>เอาล่ะ จบ เรื่อง MySQL เดี๋ยวครั้งแน่ jQuery แน่ๆ 555+</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jquerytips.com/2009/05/27/mysqlmerge-storage-engine/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>ว่าด้วยเรื่องของการ &#8220;debug&#8221; และการใช้ FireBug บน Browser ทุกตัว</title>
		<link>http://www.jquerytips.com/2009/05/23/about-debugging/</link>
		<comments>http://www.jquerytips.com/2009/05/23/about-debugging/#comments</comments>
		<pubDate>Sat, 23 May 2009 16:13:21 +0000</pubDate>
		<dc:creator>Tee++;</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.jquerytips.com/?p=456</guid>
		<description><![CDATA[วันนี้ไปงาน Barcamp Bangkok#3 มา แอบเสียใจเล็กน้อยที่ไม่มีคนพูดเรื่อง JS Framework หรือ PHP Framework เท่าไหร่ แต่ก้มีเรื่องอื่นๆ ดีๆที่ได้ฟัง เช่นเรื่อง ธุรกิจสายใหม่ของคุณ Aum ซึ่งผมชอบมาก เพราะได้กิน ไสไหมด้วย อิอิ แต่ที่ชอบจริงๆ คือ ทำให้เกิด รอยหยักในสมองเพิ่ม ว่าธุรกิจธรรมดาๆ แต่ถ้าเราใส่ใจและ เติมไอเดีย ให้มั้น ก็รุ่งได้ไม่ใช่น้อย
และก็มีเพื่อนถามด้วยว่าทำไม ไม่พูดเรื่อง JS Framework เองเลยล่ะ อยากจะบอกว่า กว่าจะโผล่ไปงานก็ บ่าย 3 แล้วคร๊าบบบ แถมกลัวไปอ๊วกใส่ไมค์ เค้าด้วย เพราะว่า ก่อนหน้านั้น &#8220;เมา&#8221; อย่างหนัก เชื่อป่ะว่าให้ ตรวจ L-ก-ฮ ตอน บ่าย 1 ยังโดนจับเลย 555+
เอาล่ะ เข้าเรื่องๆ&#8230;.
เรื่องนึงที่สร้างปัญหาให้อย่างหนัก แก่ Tester [...]]]></description>
			<content:encoded><![CDATA[<p>วันนี้ไปงาน <a href="http://www.barcampbangkok.org/">Barcamp Bangkok#3</a> มา แอบเสียใจเล็กน้อยที่ไม่มีคนพูดเรื่อง JS Framework หรือ PHP Framework เท่าไหร่ แต่ก้มีเรื่องอื่นๆ ดีๆที่ได้ฟัง เช่นเรื่อง ธุรกิจสายใหม่ของคุณ <a href="http://www.scriptdd.com/">Aum</a> ซึ่งผมชอบมาก เพราะได้กิน ไสไหมด้วย อิอิ แต่ที่ชอบจริงๆ คือ ทำให้เกิด รอยหยักในสมองเพิ่ม ว่าธุรกิจธรรมดาๆ แต่ถ้าเราใส่ใจและ เติมไอเดีย ให้มั้น ก็รุ่งได้ไม่ใช่น้อย</p>
<p>และก็มีเพื่อนถามด้วยว่าทำไม ไม่พูดเรื่อง JS Framework เองเลยล่ะ อยากจะบอกว่า กว่าจะโผล่ไปงานก็ บ่าย 3 แล้วคร๊าบบบ แถมกลัวไปอ๊วกใส่ไมค์ เค้าด้วย เพราะว่า ก่อนหน้านั้น &#8220;เมา&#8221; อย่างหนัก เชื่อป่ะว่าให้ ตรวจ L-ก-ฮ ตอน บ่าย 1 ยังโดนจับเลย 555+</p>
<p>เอาล่ะ เข้าเรื่องๆ&#8230;.</p>
<p>เรื่องนึงที่สร้างปัญหาให้อย่างหนัก แก่ Tester นั่นก็คือ &#8220;Bug&#8221; ครับ ไม่ใช่เรื่องเล็กๆ เลย สำหรับการเขียน bug แถมไปกับโปรแกรมด้วยเนี่ย มันเป็นปัญหาที่ทำให้เราดูไม่มีความเป็น มืออาชีพ และทำให้ ชนรุ่นหลังต้องมาเก็บ และสุดท้าย &#8220;การเ็ก็บ&#8221; มักจะลงท้ายด้วย การเพิ่มบั๊กลงไปแทน เพราะคนที่เก็บ อาจจะไม่ใช่คนเดียวกับคนเขียน ดังนั้น logic อาจจะไม่เหมือนกัน ผลลงเอยคือ application ที่อุตส่าห์ลงทุน ลงแรง วางโครงสร้างมาอย่างหูตาเหลือก ก็จะกลายเป็น app ที่แต่ละคน พยายาม เขียนอย่างขอไปที ในที่สุด อันนี้เชื่อผมเถอะครับ เจอมาหลายงานละ T_T <span id="more-456"></span></p>
<p>ดังนั้นการ เขียนโคด ต้องพยายามเทสเองครับ แล้วก็ เทสในหลายๆ กรณีด้วย<br />
<strong><br />
สำหรับเคสของ PHP นั้น การทำงานควรจะทำแบบนี้&#8230;.</strong><br />
1. เปิด Error ทุกกรณีใน Developer environment<br />
2. อย่าเรียกตัวแปรตรงๆ ให้เรียก $_GET, $_POST แบบนี้แทน<br />
3. อย่าเอา @ ไปปกปิดความผิดพลาด แต่ให้เช็ค ก่อนว่าควรจะทำงานมั้ย<br />
4. การเขียน Query ควรจะเช็ค พวก affected ด้วย<br />
5. อย่าเรียก file เข้าหาตัวเองเช่น file_get_content(&#8216;http:// domain ของ app&#8217;); มันเหมือนฆ่าตัวเอง<br />
6. comment ให้ละเอียด ผมเห็นโคด ฝรั่งมัน comment เยอะกว่า coding อีก มันสะดวกมากเวลาหาอะไร<br />
7. พวก file function พยายามออกแบบให้ดี อย่าให้มาสร้างปัญหาในอนาคต<br />
8. พยายาม write error log ของ application เวลา publish แล้ว เพื่อให้ user จำนวนมากช่วยเทสให้เราด้วย </p>
<p>สำหรับเคสของ JS<br />
1. พยายามบีบอัดไฟล์ js ให้เล็กที่สุดเท่าที่จะทำได้ เช่น <a href="http://dean.edwards.name/packer/">compress</a> และทำำ <a href="http://tinyurl.com/8j3ep">GZIP</a><br />
2. เปิด FireBug ตลอดเวลา อย่าให้มี ตัว แดงๆ โผล่สักจุด 555+</p>
<p>เท่านี้และ เอาล่ะ ที่จริงวันนี้ไม่ได้กะมาเขียนพวกนี้หรอก แต่จะมาแนะนำ วิธีการใช้ FireBug บน Browser อื่นๆ นอกจาก Firefox ต่างหาก ง่ายมากครับ ขอบอก </p>
<p>ก่อนอื่นไปที่ <a href="http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js">GetFireBug</a> ก่อน แล้ว save as ไฟล์ลงมา (อย่า hotlink นะครับ เพราะว่า มันจะทำให้ function บางตัวไม่ทำงาน เพราะ มองว่าเป็นการ cross domain)</p>
<p>แล้วก็เอามาแปะใน โคดของคุณซะ </p>
<p><a href="http://www.jquerytips.com/wp-content/uploads/2009/05/firebug.jpg"><img src="http://www.jquerytips.com/wp-content/uploads/2009/05/firebug-300x157.jpg" alt="firebug" title="firebug" width="300" height="157" class="alignnone size-medium wp-image-457" /></a></p>
<p>จะเห็นได้ว่ามี ไอ้รูปแมลงของ FireBug เข้ามาแล้วใน IE และแล้วเราก็สามารถใช้ FireBug ใน IE ได้แล้ว เย้!</p>
<p><a href="http://www.jquerytips.com/wp-content/uploads/2009/05/firebug2.jpg"><img src="http://www.jquerytips.com/wp-content/uploads/2009/05/firebug2-300x147.jpg" alt="firebug2" title="firebug2" width="300" height="147" class="alignnone size-medium wp-image-458" /></a></p>
<p>**เทคนิคนี้ใช้ได้ในทุกๆ browser ครับ เพราะว่า FireBug เองจริงๆ แล้ว เป็น Javascript ตัวนึงเหมือนกันครับ เพียงแต่ใน Firefox เค้า ทำงานผ่าน plugin เท่านั้นเอง </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jquerytips.com/2009/05/23/about-debugging/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>วิธีทำ Css sticky footer [It&#039;s work]</title>
		<link>http://www.jquerytips.com/2009/05/19/css-sticky-footer/</link>
		<comments>http://www.jquerytips.com/2009/05/19/css-sticky-footer/#comments</comments>
		<pubDate>Tue, 19 May 2009 16:19:58 +0000</pubDate>
		<dc:creator>Tee++;</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[Css]]></category>

		<guid isPermaLink="false">http://www.jquerytips.com/?p=452</guid>
		<description><![CDATA[อืมม์ เริ่มมั่วไปทุกทีละ jQueryTips มี Css โผล่มาด้วย 555+
หลังจากที่ผมหาวิธีตั้งนานที่จะทำให้ footer มันอยู่ติด ข้างล่าง โดยที่ ยังยิดตาม content แล้วก็ใช้ได้ ครบทุก browser ลองมาหลายๆ วิธี แม้กระทั้ง เขียน js เพิ่มคำนวน scrolling ก็ยังเคยมาแล้ว (มันกระตุก) 
จนในวันนี้ได้มา วิธีที่ work ที่สุด แถมได้ทุก browser ไม่เพี้ยน ยืดขยาย ได้ตามแต่ content
(ทดสอบใน: IE6+7, FF, Win Safari, Opera)
มาลองดูกัน โคด ไม่ยากเลย
Css



&#60;style type=&#34;text/css&#34;&#62;


&#160; &#160; &#160; &#160; html, body &#123;


&#160; &#160; &#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>อืมม์ เริ่มมั่วไปทุกทีละ jQueryTips มี Css โผล่มาด้วย 555+</p>
<p>หลังจากที่ผมหาวิธีตั้งนานที่จะทำให้ footer มันอยู่ติด ข้างล่าง โดยที่ ยังยิดตาม content แล้วก็ใช้ได้ ครบทุก browser ลองมาหลายๆ วิธี แม้กระทั้ง เขียน js เพิ่มคำนวน scrolling ก็ยังเคยมาแล้ว (มันกระตุก) </p>
<p>จนในวันนี้ได้มา วิธีที่ work ที่สุด แถมได้ทุก browser ไม่เพี้ยน ยืดขยาย ได้ตามแต่ content<br />
(ทดสอบใน: IE6+7, FF, Win Safari, Opera)</p>
<p>มาลองดูกัน โคด ไม่ยากเลย<span id="more-452"></span></p>
<p><strong>Css</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;style type=<span class="st0">&quot;text/css&quot;</span>&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; html, body <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">margin</span>: <span class="nu0">0</span> <span class="kw2">auto</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">height</span>: <span class="re3"><span class="nu0">100</span>%</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">#container</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">min-height</span>: <span class="re3"><span class="nu0">100</span>%</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">height</span>: <span class="kw2">auto</span> !important;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">height</span>: <span class="re3"><span class="nu0">100</span>%</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">margin</span>: <span class="nu0">0</span> <span class="kw2">auto</span> -<span class="re3">100px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">background-color</span>: <span class="re0">#DBDBDB</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">#footer</span>, <span class="re0">#push</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">height</span>: <span class="re3">100px</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">#footer</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">background-color</span>: <span class="kw2">red</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&lt;/style&gt;</div>
</li>
</ol>
</div>
<p><strong>HTML</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;body&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;div id=&quot;container&quot;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Header and content
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;div id=&quot;push&quot;&gt;&lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;div id=&quot;footer&quot;&gt;Footer&lt;/div&gt;
</div>
</li>
<li class="li2">
<div class="de2">&lt;/body&gt;</div>
</li>
</ol>
</div>
<p>เท่่านี้เองง่ายๆ หัวใจสำคัญมันอยู่ที่ push ที่คอยดัน footer ตามขนาด margin ลองดูละกัน สำหรับผม มันยอดมาก !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jquerytips.com/2009/05/19/css-sticky-footer/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>มาทำ ตัวอักษรสวยๆ ด้วยเทคนิค Image Replacement</title>
		<link>http://www.jquerytips.com/2009/05/14/image-replacement-using-php/</link>
		<comments>http://www.jquerytips.com/2009/05/14/image-replacement-using-php/#comments</comments>
		<pubDate>Wed, 13 May 2009 17:57:19 +0000</pubDate>
		<dc:creator>Tee++;</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.jquerytips.com/?p=435</guid>
		<description><![CDATA[ก่อนจะเข้าเรื่อง ผมมีความยินดีที่จะบอกว่า jQueryTips.com ของเราได้นักขี่ยนเพิ่มมาอีก 1 คน นั่นก็คือ Bigchern ซึ่งจะมาเขียน Review Software และ Scripts ที่เป็นประโยชน์ต่างๆ ภายในเว็บแห่งนี้ อาทิเช่น..
วิธีติดตั้ง wordpress บน server จริง
ติดตั้งโปรแกรม Ftp ( File zilla )
และเร็วๆ นี้เรากำลังจะได้ตัว นักเขียนอีกคนที่จะมา เขียนเรื่อง Performance ภายในเว็บ ยังไง รอติดตามละกัน
เอาล่ะมาเข้าเรื่องกันเดี๋ยวจะไม่ได้นอน หลังจากที่ครั้งก่อนผมเคยแนะนำ เทคนิค sIFR จากบทความ
&#8220;เปลี่ยน Font เน่าๆ ให้ดูสวยงามด้วย jQuery + sIFR&#8221;
และหลังจากวันนั้นผมได้เห็นข้อความต่างๆผ่าน Twitter จนทำให้ได้มาพบกับ ข้อความที่เขียนโดย คุณ zafire06 ซึ่งเข้าบอกว่าวิธีการทำ Text Replacement ยังมีอีกตั้งหลายอย่างผมก็เลมาลองๆ ดู
จนเจอกับเทคนิค Image Replacement นี่ล่ะ [...]]]></description>
			<content:encoded><![CDATA[<p>ก่อนจะเข้าเรื่อง ผมมีความยินดีที่จะบอกว่า <a href="http://www.jquerytips.com">jQueryTips.com</a> ของเราได้นักขี่ยนเพิ่มมาอีก 1 คน นั่นก็คือ <a href="http://www.jquerytips.com/author/bigchern/">Bigchern</a> ซึ่งจะมาเขียน Review Software และ Scripts ที่เป็นประโยชน์ต่างๆ ภายในเว็บแห่งนี้ อาทิเช่น..</p>
<p><a href="http://www.jquerytips.com/2009/05/13/install-wordpress/">วิธีติดตั้ง wordpress บน server จริง</a><br />
<a href="http://www.jquerytips.com/2009/05/13/install-ftp-file-zilla/">ติดตั้งโปรแกรม Ftp ( File zilla )</a></p>
<p>และเร็วๆ นี้เรากำลังจะได้ตัว นักเขียนอีกคนที่จะมา เขียนเรื่อง Performance ภายในเว็บ ยังไง รอติดตามละกัน</p>
<p>เอาล่ะมาเข้าเรื่องกันเดี๋ยวจะไม่ได้นอน หลังจากที่ครั้งก่อนผมเคยแนะนำ เทคนิค sIFR จากบทความ<span id="more-435"></span></p>
<p><a href="http://www.jquerytips.com/2009/04/22/jquery-sifr/">&#8220;เปลี่ยน Font เน่าๆ ให้ดูสวยงามด้วย jQuery + sIFR&#8221;</a></p>
<p>และหลังจากวันนั้นผมได้เห็นข้อความต่างๆผ่าน <a href="http://twitter.com/TeePlusPlus">Twitter</a> จนทำให้ได้มาพบกับ ข้อความที่เขียนโดย คุณ <a href="http://www.f0nt.com/forum/index.php/topic,15892.msg1242902.html#msg1242902">zafire06</a> ซึ่งเข้าบอกว่าวิธีการทำ Text Replacement ยังมีอีกตั้งหลายอย่างผมก็เลมาลองๆ ดู</p>
<p>จนเจอกับเทคนิค Image Replacement นี่ล่ะ ที่เห็นว่าเข้าท่าดี เลยลองไปโหลดมา ศึกษาจากเว็บ ซึ่งก็ได้ผลลัพธ์ออกมาแบบนี้</p>
<p><a href="http://jquerytips.com/example/facelift/">Example by jQueryTips.com</a></p>
<p>ซึ่งวิธีการใช้งาน ผมขี้เกียจอธิบายเพราะมันง่ายมากๆ เอาเป็นว่า view source กับดูตัวอย่างประกอบจาก <a href="http://facelift.mawhorter.net/detailed-examples/">Official website</a> เอาละกัน<br />
<strong><br />
ข้อมูลสรุป</strong></p>
<p>หลักการทำงานก็คือ ใช้ เทคนิค GD ของ PHP มาเป็นตัว Render Text ครับ โดยจะทำงานร่วมกับ Javascript และ Css ไปพร้อมๆ กัน</p>
<p>โดยที่ javascript จะทำการอ่านค่า จาก css เรื่องของขนาด font (optional) และจะส่ง parameters ให้กับ php</p>
<p>ตัวอย่างเช่น</p>
<p>text -> เป็นชุด string ที่จะทำการเปลี่ยนเป็นภาพ<br />
cFont -> Font face (จะถูก define ค่าใน config อีกทีนึง เป็น array)</p>
<p>แล้วก็ยังมี parameters อื่นๆ อีกนิดหน่อย (ลอง Generate source ด้วย FireFox ดูจะเห็น)</p>
<p>จากนั้น PHP ก็จะใช้ความสามารถของ GD ในการสร้าง image มา แล้วก็เก็บลง cache โดยมีการทำ hashin folder ไว้ให้แล้ว จบ&#8230;<br />
<strong><br />
ข้อเสีย</strong></p>
<p>1. สระลอย<br />
2. สร้าง cache เยอะชิบหาย หมั่นลบบ่อยๆ ละกัน ถ้าใช้แบบ dynamic นี่ รัน cron ไว้ลบได้เลย<br />
3. ท่าทางจะกินพลังงาน Server ไม่ใช้น้อย </p>
<p>ลองเองละกันนะครับ สำหรับตัวนี้ ไม่ยากอะไร แต่ให้เลือกผมกลับไปใช้ <a href="http://www.jquerytips.com/2009/04/22/jquery-sifr/">sIFR</a> น่าจะเป็นคำตอบได้ดีกว่า </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jquerytips.com/2009/05/14/image-replacement-using-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>จากประสบการณ์จริงของ Developer ตัวน้อยๆ</title>
		<link>http://www.jquerytips.com/2009/05/09/the-true-story-from-tee/</link>
		<comments>http://www.jquerytips.com/2009/05/09/the-true-story-from-tee/#comments</comments>
		<pubDate>Sat, 09 May 2009 11:22:31 +0000</pubDate>
		<dc:creator>Tee++;</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[structure]]></category>

		<guid isPermaLink="false">http://www.jquerytips.com/?p=414</guid>
		<description><![CDATA[ก่อนจะเลื่อนไปอ่านบทความนี้ทางด้านล่าง ผมจะบอกไว้ก่อนว่า คราวนี้ไม่ใช่ เทคนิค หรือวิธี พัฒนาโปรแกรมอะไรก็ตามแต่ เพราะว่ามันเป็น &#8220;เรื่องของผมล้วนๆ&#8221; 
เป็นการนำเสนอ จาก ประสบการณ์ตรงที่อยู่ในวงการ web application มานาน หลายปีดีดัก ซึ่ง หลายคนอาจจะมองว่า ถูกบ้าง ผิดบ้าง ก็แล้วแต่กันไป อันนี้ผมไม่ได้ขอให้ใครมาทำตาม แต่ประการใด เพราะว่าเรื่องของการพัฒนา ชื่อมันก็บอกอยู่แล้วว่า ต้องพัฒนากันต่อ ไม่ได้เป็น พิมพ์เขียว ใดๆ ทั้งสิ้น 
สรุปเลยละกัน วันนี้ผมจะมาตั้งสติ นึกทบทวนว่าในการทำ web app แต่ละตัว นั้นผมลงมือ ลำดับการทำงาน ก่อนหลังยังไงบ้าง&#8230;.
1. เก็บ Requirement
สิ่งแรกที่ผมจะทำเลยคืออ่าน Requirement อย่างละเอียดครับ แล้วก็ จินตนาการณ์ ในหัวไปเรื่อยว่ามัน จะต้องทำอะไรบ้าง แล้วมีส่วนไหนที่จะต้องเชื่อมกับตรงไหนบ้าง จะต้องใช้เวลาส่วนไหนานที่สุด ปัญหาที่เกิดขึ้นคืออะไร
2. แก้ไขไอ้ปัญหาที่จะเกิดขึ้นให้ได้ก่อน
หลังจากที่คิดได้จนครบจากข้อแรก ผมจะยังไม่ลงมือทำ จนก่าจะหาทางแก้ไอ้ ปัญหาที่จะเกิดขึ้นให้ได้เสียก่อน ไม่งั้นทำไปแล้วอาจมี &#8220;รื้อ&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>ก่อนจะเลื่อนไปอ่านบทความนี้ทางด้านล่าง ผมจะบอกไว้ก่อนว่า คราวนี้ไม่ใช่ เทคนิค หรือวิธี พัฒนาโปรแกรมอะไรก็ตามแต่ เพราะว่ามันเป็น &#8220;เรื่องของผมล้วนๆ&#8221; </p>
<p>เป็นการนำเสนอ จาก ประสบการณ์ตรงที่อยู่ในวงการ web application มานาน หลายปีดีดัก ซึ่ง หลายคนอาจจะมองว่า ถูกบ้าง ผิดบ้าง ก็แล้วแต่กันไป อันนี้ผมไม่ได้ขอให้ใครมาทำตาม แต่ประการใด เพราะว่าเรื่องของการพัฒนา ชื่อมันก็บอกอยู่แล้วว่า ต้องพัฒนากันต่อ ไม่ได้เป็น พิมพ์เขียว ใดๆ ทั้งสิ้น </p>
<p>สรุปเลยละกัน วันนี้ผมจะมาตั้งสติ นึกทบทวนว่าในการทำ web app แต่ละตัว นั้นผมลงมือ ลำดับการทำงาน ก่อนหลังยังไงบ้าง&#8230;.<span id="more-414"></span></p>
<p>1. เก็บ Requirement<br />
สิ่งแรกที่ผมจะทำเลยคืออ่าน Requirement อย่างละเอียดครับ แล้วก็ จินตนาการณ์ ในหัวไปเรื่อยว่ามัน จะต้องทำอะไรบ้าง แล้วมีส่วนไหนที่จะต้องเชื่อมกับตรงไหนบ้าง จะต้องใช้เวลาส่วนไหนานที่สุด ปัญหาที่เกิดขึ้นคืออะไร</p>
<p>2. แก้ไขไอ้ปัญหาที่จะเกิดขึ้นให้ได้ก่อน<br />
หลังจากที่คิดได้จนครบจากข้อแรก ผมจะยังไม่ลงมือทำ จนก่าจะหาทางแก้ไอ้ ปัญหาที่จะเกิดขึ้นให้ได้เสียก่อน ไม่งั้นทำไปแล้วอาจมี &#8220;รื้อ&#8221; ได้ ดังนั้นผมจะลองทำการจำลอง ส่วนที่ผมคิดว่ามันจะ &#8220;ติด&#8221; แล้วก็ลงมือหาทางแก้ปัญหาก่อนที่จะ ทำอะไรต่อไป </p>
<p>3. Structure ที่ดีคือหัวใจหลักของ application ที่ประสบความสำเร็จ<br />
ขั้นตอนนี้เป็นขั้นตอนที่จะลงมือทำงานกันจริงๆ จังๆแล้ว โดยผมถือว่าเป็น &#8220;หัวใจ&#8221; ของทุกขั้นตอนเลยครับ การเขียนที่ มี structure ที่ดีจะช่วยให้งานเรา ไหลลื่นและทำได้อย่างต่อเนื่อง การพัฒนาต่อก็แสนจะง่ายดาย โดยสิ่งที่ผมจะทำในข้อนี้ก็คือ</p>
<p>3.1 เลืือกรูปแบบที่จะทำการเขียน ว่าจะใช้แบบไหน เช่นจะเขียนด้วย oop หรือว่า framework แบบไหน ตัวไหน<br />
3.2 จัดวาง folder โครงสร้างให้เหมาะกับงาน โดยคำนึงถึงการจัดเก็บที่เป็นระเบียบ และ ง่ายต่อการใช้งาน<br />
3.3 คิดเผื่อไปเลยว่าจะรองรับ users มากขนาดไหน จะต้องทำ hashing data หรือว่า caching หรือ ต้องมี proxy คลุมในส่วนไหนรึเปล่า เพราะถ้าเราไปแก้ ตอนหลัง นี่ยาวเลยครับ ทำไปทั้งชาติเลย </p>
<p>4. เลือก Tools ที่จะมาใช้งานร่วมด้วย<br />
หลังจากได้วิธีการเขียนแล้ว ต่อมาก็เลือก Tools หรือ libraries หลักๆ ที่จะเอามาทำงานร่วมด้วย เช่น เลือกใช้ Smarty มาทำ template เลือกเอา zend cache มาทำ cache เป็นต้น โดยในข้อนี้ที่ผมใช้ประจำก็จะมี</p>
<p>4.1 Smarty &#8211; ใช้ทำ template ในส่วนของ view<br />
4.2 Adodb &#8211; ใช้ในการ ติดต่อ database<br />
4.3 Zend Cache &#8211; ใช้ในการทำ caching<br />
4.4 PHPMailer &#8211; ใช้ในการส่งเมล์<br />
4.5 TinyMCE, SpawEditor &#8211; ใช้ในการทำ WYSIWYG</p>
<p>ส่วนที่เหลือเป็น libs ที่ใช้ เฉพาะทางผมไม่ขอเอ่ยถึงละกัน </p>
<p>5. ออกแบบ Database บางส่วน<br />
ต่่อมาผมก็จะทำการออกแบบ db ที่ว่าเป็นบางส่วน เพราะ บางทีมันยังไม่ลงมือเขียน ก็ยังคิดไม่ออกจริงๆ ว่ามันควรจะมี fields อะไรบ้าง แต่หลักๆ ที่ต้องใช้งานแน่ๆ ก็จะมีเช่น</p>
<p>- users<br />
- user group</p>
<p>พวกนี้ก็จะทำไปก่อนเลย </p>
<p>6. สุดท้ายแล้วเริ่มเขียน module แรก<br />
สุดท้ายละ ที่ผมจะเขียนเป็น module แรกถุกครั้ง (ในกรณีที่ไม่ได้ re-use ของเก่า) ก็คือ </p>
<p><strong>User Register and Authentication</strong></p>
<p>และนี่ก็คือ จุดเริ่มต้นเล็กๆ ของผมในแต่ละงานครับ </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jquerytips.com/2009/05/09/the-true-story-from-tee/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Simple HTML DOM Parser มันคือ jQuery&#8217;s selectors ดีๆ นี่เอง</title>
		<link>http://www.jquerytips.com/2009/04/21/simple-html-dom-parser/</link>
		<comments>http://www.jquerytips.com/2009/04/21/simple-html-dom-parser/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 16:27:45 +0000</pubDate>
		<dc:creator>Tee++;</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[library]]></category>

		<guid isPermaLink="false">http://www.jquerytips.com/?p=392</guid>
		<description><![CDATA[ไปเจอของดีมาครับ เป็น PHP Library ที่ทำงานในลักษณะ คล้ายๆกับ Selectors ของ jQuery แต่ว่าเป็น PHP ซึ่งเรียกให้ถูกมันก็คือ HTML DOM Parser น่ะแหละครับ ซึ่งการใช้งานค่อนข้างง่าย เล่นเอาลืม Regexp ไปเลย 
เดี๋ยวนี้ เว็บไซด์ส่วนใหญ่นั้น จะเขียนกันในรูปแบบ XHTML ซึ่งมักจะมาการระบุ Class หรือ Id ให้กับ Elements เกือบทั้งหมดอยู่แล้ว ซึ่งบางที ถ้าเราจะทำการ Get Content ที่อยู่ในช่วง tag ของมัน เราก็มักจะใช้ความสามารถของ Regular Expression (Regexp) โดยส่วนใหญ่ แต่&#8230;..
ชีวิตคุณจะสบายขึ้น ถ้าไปรู้จักกับ Lib ตัวนี้ ที่จะไม่ต้องมานั่งปวดหัวกับการคิด regexp อีกต่อไป เพราะว่า มันเขียนมาให้เกือบหมดแล้ว 
เท่าที่ไปลองไล่ lib มาก็เห็นว่าใช้ความสามารถของ [...]]]></description>
			<content:encoded><![CDATA[<p>ไปเจอของดีมาครับ เป็น PHP Library ที่ทำงานในลักษณะ คล้ายๆกับ Selectors ของ jQuery แต่ว่าเป็น PHP ซึ่งเรียกให้ถูกมันก็คือ HTML DOM Parser น่ะแหละครับ ซึ่งการใช้งานค่อนข้างง่าย เล่นเอาลืม Regexp ไปเลย </p>
<p>เดี๋ยวนี้ เว็บไซด์ส่วนใหญ่นั้น จะเขียนกันในรูปแบบ XHTML ซึ่งมักจะมาการระบุ Class หรือ Id ให้กับ Elements เกือบทั้งหมดอยู่แล้ว ซึ่งบางที ถ้าเราจะทำการ Get Content ที่อยู่ในช่วง tag ของมัน เราก็มักจะใช้ความสามารถของ Regular Expression (Regexp) โดยส่วนใหญ่ แต่&#8230;..</p>
<p>ชีวิตคุณจะสบายขึ้น ถ้าไปรู้จักกับ Lib ตัวนี้ ที่จะไม่ต้องมานั่งปวดหัวกับการคิด regexp อีกต่อไป เพราะว่า มันเขียนมาให้เกือบหมดแล้ว </p>
<p>เท่าที่ไปลองไล่ lib มาก็เห็นว่าใช้ความสามารถของ regexp เหมือนกัน แต่ทว่า มันเขียบนได้ เทพ แท้ๆ เลยครับ <span id="more-392"></span></p>
<p>อย่่างสมมุติผมจะภาพทั้งหมดจาก Google ผมก็เขียนแค่</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&#8217;simple_html_dom.php&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$dom</span> = file_get_html<span class="br0">&#40;</span><span class="st0">&#8216;http://www.google.com&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$dom</span>-&gt;<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&#8216;img&#8217;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$elm</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$elm</span>-&gt;<span class="me1">src</span>.<span class="st0">&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>นอกจจากนี้มันยังทำกาเปลี่ยนแก้ไขค่าได้อย่างสะดวก เช่น</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// แก้ class</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$dom</span>-&gt;<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&#8216;div[id=hello]&#8216;</span>, <span class="nu0">0</span><span class="br0">&#41;</span>-&gt;<span class="me1">class</span> = <span class="st0">&quot;newclassname&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// แก้ inner html</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$dom</span>-&gt;<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&#8216;div&#8217;</span>, <span class="nu0">1</span><span class="br0">&#41;</span>-&gt;<span class="me1">innertext</span> = <span class="st0">&quot;new content&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// PS. 0, 1 คือ index ของ elements</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>ดึงแค่ text โดยตัด HTML Tags</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> file_get_html<span class="br0">&#40;</span><span class="st0">&#8216;http://www.google.com/&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">plaintext</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>นอกจจากนี้ยังทำงานได้อีกเพียบเช่น หา Children, childNodes, parent, siblings เรียกว่า เมพ ขิงๆ ได้เลยทีเดียว</p>
<p>Recommended by: <a href="http://twitter.com/auttasak">K.Auttasak</a><br />
Download: <a href="http://simplehtmldom.sourceforge.net/">http://simplehtmldom.sourceforge.net/</a><br />
API Reference: <a href="http://simplehtmldom.sourceforge.net/manual_api.htm">http://simplehtmldom.sourceforge.net/manual_api.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jquerytips.com/2009/04/21/simple-html-dom-parser/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>วันนี้ลองเปลี่ยนแนวมา Review หนังสือกัน</title>
		<link>http://www.jquerytips.com/2009/04/06/review-book-1/</link>
		<comments>http://www.jquerytips.com/2009/04/06/review-book-1/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 08:02:40 +0000</pubDate>
		<dc:creator>Tee++;</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://www.jquerytips.com/?p=360</guid>
		<description><![CDATA[ก่อนอื่นต้องขอออกตัวก่อนเลยนะครับ ว่าผมไม่ได้รู้จัก คนเขียน(แปล) หนังสือเล่มนี้เป็นการส่วนตัวแต่อย่างใด และก็ไม่ได้ค่า โฆษณา มาจากที่ไหนด้วย แต่ที่จะมา Review ก็เพราะ ถูกใจครับ เท่านั้นเอง !
คิดว่าเพื่อนๆ หลายคนคงเคยไปเปิดหนังสือ Text Book ของ PHP ที่เป็นภาษาไทยตามร้านหนังสือใหญ่ๆ ที่ให้ยืนอ่านฟรีๆ ได้นานๆ ใช่มั้ยครับ ซึ่งผมบอกเลยผมเปิดมาอ่านแค่ สารบัญก็ปิดแล้ว ไม่ได้ซื้อหนังสือ พวกนี้มาไม่รู้กี่ปี จะมีบ้างก็เป็น Text Book ที่เป็น ภาษาอังกฤษบางเล่ม ซึ่งผมก็ไม่ได้ไปอ่านมันหมด ส่วนมากจะเปิดๆ อ่านโคด บ้างเท่านั้นเอง อ่านไปอ่านมา ก็รู้สึกว่า จะเปิด พจนานุกรม มากกว่าหนังสือ ที่ซื้อมาซะอีก (ฮา)
ที่ไม่ได้อ่านหรือ ไม่ได้ซื้อมาไม่ใช่ว่าหนังสือเค้าไม่ดีนะครับ บางเล่มก็เขียนได้ดีทีเดียว เข้าใจง่าย มากๆ แต่ผมไม่รู้จะซื้อมาทำไมก็ในเมื่อ 4-5 ปีที่แล้วที่ผมซื้อมา มันก็เนื้อหาทำนองเดียวกัน ทั้งนั้น แล้วก็ส่วนมากจะเป็นออกแนว Basic ซะมากกว่า ไปหาเอาใน [...]]]></description>
			<content:encoded><![CDATA[<p>ก่อนอื่นต้องขอออกตัวก่อนเลยนะครับ ว่าผมไม่ได้รู้จัก คนเขียน(แปล) หนังสือเล่มนี้เป็นการส่วนตัวแต่อย่างใด และก็ไม่ได้ค่า โฆษณา มาจากที่ไหนด้วย แต่ที่จะมา Review ก็เพราะ ถูกใจครับ เท่านั้นเอง !</p>
<p>คิดว่าเพื่อนๆ หลายคนคงเคยไปเปิดหนังสือ Text Book ของ PHP ที่เป็นภาษาไทยตามร้านหนังสือใหญ่ๆ ที่ให้ยืนอ่านฟรีๆ ได้นานๆ ใช่มั้ยครับ ซึ่งผมบอกเลยผมเปิดมาอ่านแค่ สารบัญก็ปิดแล้ว ไม่ได้ซื้อหนังสือ พวกนี้มาไม่รู้กี่ปี จะมีบ้างก็เป็น Text Book ที่เป็น ภาษาอังกฤษบางเล่ม ซึ่งผมก็ไม่ได้ไปอ่านมันหมด ส่วนมากจะเปิดๆ อ่านโคด บ้างเท่านั้นเอง อ่านไปอ่านมา ก็รู้สึกว่า จะเปิด พจนานุกรม มากกว่าหนังสือ ที่ซื้อมาซะอีก (ฮา)</p>
<p>ที่ไม่ได้อ่านหรือ ไม่ได้ซื้อมาไม่ใช่ว่าหนังสือเค้าไม่ดีนะครับ บางเล่มก็เขียนได้ดีทีเดียว เข้าใจง่าย มากๆ แต่ผมไม่รู้จะซื้อมาทำไมก็ในเมื่อ 4-5 ปีที่แล้วที่ผมซื้อมา มันก็เนื้อหาทำนองเดียวกัน ทั้งนั้น แล้วก็ส่วนมากจะเป็นออกแนว Basic ซะมากกว่า ไปหาเอาใน Google หรือ Manual ก็คงพอได้เหมือนกัน<span id="more-360"></span></p>
<p>แต่เผอิญวันนี้ไปยืนรอ พัดลม(Fan) ทีี่ Se-ed Book ครับ ไม่มีอะไรทำ ก็เลยหยิบหนังสือแปลมาเล่มนึง ชื่อว่า </p>
<p><a href="http://www.se-ed.com/eShop/Products/Detail.aspx?No=9789742129132"><img src="http://www.jquerytips.com/wp-content/uploads/2009/04/imageaxd.gif" alt="imageaxd" title="imageaxd" width="198" height="256" class="alignnone size-full wp-image-361" /><br />
</a></p>
<div><a href="http://www.se-ed.com/eShop/Products/Detail.aspx?No=9789742129132">101 Tips &#038; Tricks PHP</a></div>
</p>
<p>เรียบเรียงโดย <strong>K.ทวิร พานิชสมบัติ </strong> </p>
<p>ซึ่งผมก็ขอขอบคุณมากครับ อยากจะบอกกับเจ้าตัวโดยตรงว่า ผลงานมีประโยชน์มากเลยครับ</p>
<p>จากนั้นผมก็ซื้อมาใน ราคา 299 บาท โดยถ้าไปเทียบกับของราคา ต้นฉบับ ก่อนแปลปล้ว นับว่าถูกมากๆ เลยทีเดียว</p>
<p>จากนั้นผมก็กลับไปรอแฟนทำสีผม 3 ชั่วโมงเต็มๆ T_T ก็เลยนั่งอ่านเพลินๆ ไปจนจบครับ (อ่านข้ามๆ) หลังจากอ่านจบผมก็ได้ความรู้ใหม่ๆ เพิ่มมาพอสมควร โดย เนื้อหาที่ผมเห็นว่าค่อนข้างจะน่าสนใจ มีดังนี้ครับ </p>
<p>1. สร้างความเข้าใจเกี่ยวกับการเขียนแบบ OOP ที่ถูกต้อง (ก็เรื่องความช้ากับ ความเป็นระบบที่ผมพูดบ่อยๆ นั่นล่ะ)<br />
2. การใช้ PEAR หรือ library ต่างๆ เพื่อ ลดงานของเรา<br />
3. ความเข้าใจเกี่ยวกับ Web Service<br />
4. Security และ Performance<br />
5. การจัดการฐานข้อมูลด้วย PDO และ เรื่องของ SQL Injection</p>
<p>นี่ล่ะครับ เนื้อหาที่ผมว่ามันแตกต่างจาก หนังสือ PHP ในท้องตลาดมากเลย ยังไงสนใจก็ไปลองหาซื้อกันดูนะครับ </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jquerytips.com/2009/04/06/review-book-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>มากำหนดสิทธิการเข้าถึงด้วย Zend ACL กันดีกว่า</title>
		<link>http://www.jquerytips.com/2009/04/01/zend-acl/</link>
		<comments>http://www.jquerytips.com/2009/04/01/zend-acl/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 17:21:36 +0000</pubDate>
		<dc:creator>Tee++;</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.jquerytips.com/?p=355</guid>
		<description><![CDATA[วันก่อนไปนั่งดู libraries ของ Zend ก็ได้ลองไปหลายตัวเหมือนกัน ส่วนมากจะโดนใจ ทั้ง DOM, Rest, Akismet, Recaptcha, Paginator คือเอาเป็นว่าลองตัวไหน ก็ไม่ผิดหวังเลยจริงๆ แต่ที่ จะมาพูดวันนี้เป็น lib ที่เกี่ยวกับการกำหนด สิทธิการเข้าใข้งานครับ มี ชื่อว่า &#8220;Zend_Acl&#8221;
ซึ่งเป็นชุด lib ที่ใช้กำหนดระดับความสำคัญในการเข้าถึงข้อมูลส่วนต่างๆ ใน เว็บไซด์ ที่มีความสำคัญและต้องการความปลอดภัยในระดับนึง เช่น admin area เป็นต้น 
โดยคำว่า ACL ย่อมาจาก Access control list นั่นเอง 
การทำงานของ lib จะถูกแบ่งออกเป็น 2 ส่วนคือ
1. Role &#8211; อันนี้คือประเภทของผู้ใช้งาน
2. Resource &#8211; คือ Resource ที่จะทำงานด้วย เรียกภาษาชาวบ้านๆ ก็คือ หน้าต่างๆของเว็บ นั่นเอง
โดยหลังจากที่เรากำหนดใน [...]]]></description>
			<content:encoded><![CDATA[<p>วันก่อนไปนั่งดู libraries ของ <a href="http://framework.zend.com">Zend</a> ก็ได้ลองไปหลายตัวเหมือนกัน ส่วนมากจะโดนใจ ทั้ง DOM, Rest, Akismet, Recaptcha, Paginator คือเอาเป็นว่าลองตัวไหน ก็ไม่ผิดหวังเลยจริงๆ แต่ที่ จะมาพูดวันนี้เป็น lib ที่เกี่ยวกับการกำหนด สิทธิการเข้าใข้งานครับ มี ชื่อว่า &#8220;<a href="http://framework.zend.com/manual/en/zend.acl.html">Zend_Acl</a>&#8221;</p>
<p>ซึ่งเป็นชุด lib ที่ใช้กำหนดระดับความสำคัญในการเข้าถึงข้อมูลส่วนต่างๆ ใน เว็บไซด์ ที่มีความสำคัญและต้องการความปลอดภัยในระดับนึง เช่น admin area เป็นต้น </p>
<p>โดยคำว่า ACL ย่อมาจาก <strong>Access control list</strong> นั่นเอง <span id="more-355"></span></p>
<p>การทำงานของ lib จะถูกแบ่งออกเป็น 2 ส่วนคือ<br />
1. Role &#8211; อันนี้คือประเภทของผู้ใช้งาน<br />
2. Resource &#8211; คือ Resource ที่จะทำงานด้วย เรียกภาษาชาวบ้านๆ ก็คือ หน้าต่างๆของเว็บ นั่นเอง</p>
<p>โดยหลังจากที่เรากำหนดใน 2 ส่วนนี้แล้ว เราก็ต้องมากำหนดอีกทีว่า Role ไหนจะเข้าถึง Resource ส่วนไหนได้บ้าง </p>
<p>และข้อดีที่สุดของ lib ตัวนี้คือ สามารถทำงานแบบ <strong>inherit</strong> หรือการถ่ายทอดคุณสมบัติ ได้ พูดไป พูดมาเดี๋ยวจะเรื่องยาวกันไปยัง มาดูวิธีการใช้งานไป ด้วยกันดีกว่า จะได้เข้าใจไปทีเดียวเลย </p>
<p>ก่อนอื่นก็ต้องไป Download ชุด libraries ของ Zend มาก่อนครับ โดยเลือกเอาแบบ Minimal ก็พอ ถ้าไม่ได้คิดจะเขียน Framework โดยใช้ Zend เป็น Core<br />
<a href="http://framework.zend.com/releases/ZendFramework-1.7.8/ZendFramework-1.7.8-minimal.zip">Download Zend Framework Minimal</a></p>
<p>********** เริ่มต้นใช้งาน **********<br />
// อันนี้ใครวาง path ไว้ไหนไป setup กันให้ถูกเองนะครับ</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&#8216;Zend/Acl.php&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&#8216;Zend/Acl/Role.php&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&#8216;Zend/Acl/Resource.php&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span> = <span class="kw2">new</span> Zend_Acl<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p><strong>ทีนี้ก็ลองมาใช้งานกันดูเลยครับ</strong> </p>
<p>1. กำหนด Role ก่อน เป็นอันดับแรก</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">addRole</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Role<span class="br0">&#40;</span><span class="st0">&#8216;banned&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">addRole</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Role<span class="br0">&#40;</span><span class="st0">&#8216;member&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">addRole</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Role<span class="br0">&#40;</span><span class="st0">&#8216;writer&#8217;</span><span class="br0">&#41;</span>, <span class="st0">&#8216;member&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">addRole</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Role<span class="br0">&#40;</span><span class="st0">&#8216;editor&#8217;</span><span class="br0">&#41;</span>, <span class="st0">&#8216;writer&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$acl</span>-&gt;<span class="me1">addRole</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Role<span class="br0">&#40;</span><span class="st0">&#8216;moderator&#8217;</span><span class="br0">&#41;</span>, <span class="st0">&#8216;editor&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">addRole</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Role<span class="br0">&#40;</span><span class="st0">&#8216;administrator&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>ผมกำหนดระดับไว้ดังนี้ครับ banned, member, writer, editor, moderator, administrator โดยที่แต่ละตัว สืบทอดคุณสมบัติต่อๆกันมา ยกเว้น administrator ท่านเดียวเลย <strong>ซึ่งการสืบทอดแบบนี้จะทำให้ ระดับที่รับสืบทอดมา มีคุณสมบัติเหมือนตัวแม่ทุกประการ</strong></p>
<p>2. มากำหนด resource ที่มีกันต่อไปเลย </p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Resource<span class="br0">&#40;</span><span class="st0">&#8216;usercp&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Resource<span class="br0">&#40;</span><span class="st0">&#8216;usercp/settings&#8217;</span><span class="br0">&#41;</span>, <span class="st0">&#8216;usercp&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Resource<span class="br0">&#40;</span><span class="st0">&#8216;usercp/album&#8217;</span><span class="br0">&#41;</span>, <span class="st0">&#8216;usercp&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Resource<span class="br0">&#40;</span><span class="st0">&#8216;office&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$acl</span>-&gt;<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Resource<span class="br0">&#40;</span><span class="st0">&#8216;office/users&#8217;</span><span class="br0">&#41;</span>, <span class="st0">&#8216;office&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Acl_Resource<span class="br0">&#40;</span><span class="st0">&#8216;office/news&#8217;</span><span class="br0">&#41;</span>, <span class="st0">&#8216;office&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>ตอนนี้ผมลองกำหนด resource โดยแบ่งระดับเป็น User&#8217;s Control Panel และ Back Office โดยผมใช้ uri มาเป็นตัวกำหนด ลักษณะตัวอย่าง ดังนี้</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">http://www.domain.com/usercp/settings/addnew</div>
</li>
</ol>
</div>
<p>สมมุติผมมี url ดังนี้ผมก็จะตัด ตั้งแต่ segment ที่ 1 &#8211; 3 ออกมา เป็น resource นั่งเอง </p>
<p><strong>เอาล่ะๆ ถึงตอนสำคัญละ &#8230;</strong></p>
<p>3. กำหนดสิทธิ ให้แต่ละ Role ว่าใช้งาน Resource ไหนได้บ้าง</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; Baned &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">allow</span><span class="br0">&#40;</span><span class="st0">&#8216;banned&#8217;</span>, <span class="st0">&#8216;usercp/settings&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># กลุ่ม banned อนุญาติให้เข้าใช้งานที่ url:: /usercp/settings เท่านั้น</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; Member &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*/</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$acl</span>-&gt;<span class="me1">allow</span><span class="br0">&#40;</span><span class="st0">&#8216;member&#8217;</span>, <span class="st0">&#8216;usercp&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># กลุ่ม member ให้ใช้งาน url:: /usercp/ ได้ทั้งหมด (usercp เป็น parent)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Writer &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">allow</span><span class="br0">&#40;</span><span class="st0">&#8216;writer&#8217;</span>, <span class="st0">&#8216;office/news&#8217;</span>, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;addnew&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># กลุ่ม writer ให้ใช้งาน url:: /office/news ได้ใน action เดียวคือ การ add ข้อมูล</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Editor &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">allow</span><span class="br0">&#40;</span><span class="st0">&#8216;editor&#8217;</span>, <span class="st0">&#8216;office/news&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># กลุ่ม editor ให้ใช้งาน ur:: /office/news ได้ทั้งหมด</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Moderator &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">allow</span><span class="br0">&#40;</span><span class="st0">&#8216;moderator&#8217;</span>, <span class="st0">&#8216;office&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$acl</span>-&gt;<span class="me1">deny</span><span class="br0">&#40;</span><span class="st0">&#8216;moderator&#8217;</span>, <span class="st0">&#8216;office/users&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># กลุ่ม moderator ให้ใช้งาน ur:: /office/ ได้ทั้งหมด ยกเว้น users</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; Administrator &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$acl</span>-&gt;<span class="me1">allow</span><span class="br0">&#40;</span><span class="st0">&#8216;administrator&#8217;</span><span class="br0">&#41;</span>; <span class="co1">// Grant All</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># กลุ่ม administrator ให้ใช้งานได้ทั้งหมดเลย </span></div>
</li>
</ol>
</div>
<p>มาถึงตรงนี้มีข้อสังเกตุนิดหน่อยครับ ดังนี้<br />
1. ทำไมกลุ่ม member กำหนด แค่ usercp ได้?<br />
- ลองไปดูตอนเราทำการ add resource ครับจะเห็นว่า usercp เป็น parent ของ child ทั้งหมดในส่วนของมัน อันนี้เป็นคุณสมบัติ inherit ในตัว lib</p>
<p>2. ทำไม writer มีื array(&#8216;addnew&#8217;) ด้วย?<br />
- อันนี้เป็น สิทธิการเข้าถึงในระดับ action ครับ ซึ่ง lib อนุญาติให้ใช้งานได้ โดยที่ array อาจจะเป็นแบบนี้ก็ได้ array(&#8216;addnew&#8217;, &#8216;edit&#8217;, &#8216;update&#8217;) จะหมายถึง อนุญาติใน 3 acts นี้ </p>
<p>3. ทำไม administrator ไม่สืบทอด deny มาจาก moderator ล่ะ?<br />
- ลองไปสังเกตุดูตอน register role ดูครับว่า administrator ไม่ได้ inherit มาจาก moderator</p>
<p>4. ทำไมไม่กำหนด resource ให้กับ administrator<br />
- การไม่กำหนดเท่ากับให้สิทธิอย่างสมบูรณ์ ครับ โดยมีสิทธิเข้าได้ทุกหน้าจนกว่าจะสั่ง deny</p>
<p><strong>เอาล่ะ มาถึงสุดท้ายละ ตอนทำการตรวจสอบสิทธิ</strong></p>
<p><em>Url: http://www.domain.com/office/news/addnew</em></p>
<p>จาก URL ด้านบนผมก้จะใช้วิธีอะไรก็ได้ ตัด segment ที่ 1 &#8211; 3 ออกมาให้ได้ข้อมูลดังนี้</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$segment_1</span> = <span class="st0">&#8216;office/news&#8217;</span>; <span class="co1">// อันนี้ถ้าไม่มี news ข้อมูลก็จะต้องเหลือแค่ office</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$segment_2</span> = <span class="st0">&#8216;addnew&#8217;</span>; <span class="co1">// อันนี้ถ้าไม่มีก็คือ null </span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$acl</span>-&gt;<span class="me1">isAllowed</span><span class="br0">&#40;</span><span class="st0">&#8216;member&#8217;</span>, <span class="re0">$segment_1</span>, <span class="re0">$segment_2</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>ถ้าเราเช็คข้อมูลตามแบบข้างบนผลที่ได้ก็จะออกมาเป็น false ครับ แต่ถ้าตั้งแต่ write ขึ้นไปจะสามารถ เข้าถึงในส่วนนี้ได้ทั้งหมด </p>
<p>เพราะอะไร?</p>
<p>1. เรากำหนดให้ writer เข้า หน้า office/news ที่มี action เป็นการ addnew ได้<br />
2. เรากำหนดให้ editor เข้า หน้า office/news ได้ทั้งหมด<br />
3. เรากำหนดให้ moderator เข้า office ซึ่งเป็น parent ของข้อมูลส่วนนี้ได้ ทั้งหมด<br />
4. administrator เป็น Grant all อยู่ จึงเข้าได้หมดอยู่แล้ว</p>
<p>ที่เหลือไปลองเล่นกันเองนะ ผมเหนื่อยแล้ว วันนี้อธิบายยาวมากๆ เลยอ่ะ -*-</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jquerytips.com/2009/04/01/zend-acl/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
