<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>MagicKiat&#039;s Weblog</title>
	<atom:link href="http://magickiat.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://magickiat.wordpress.com</link>
	<description>MagicKiat on the WordPress.com weblog</description>
	<lastBuildDate>Thu, 26 Jan 2012 09:31:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='magickiat.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>MagicKiat&#039;s Weblog</title>
		<link>http://magickiat.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://magickiat.wordpress.com/osd.xml" title="MagicKiat&#039;s Weblog" />
	<atom:link rel='hub' href='http://magickiat.wordpress.com/?pushpress=hub'/>
		<item>
		<title>[2012/01/26] รวมลิงก์น่าสนใจ</title>
		<link>http://magickiat.wordpress.com/2012/01/26/20120126-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/</link>
		<comments>http://magickiat.wordpress.com/2012/01/26/20120126-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 09:31:52 +0000</pubDate>
		<dc:creator>MagicalCyber</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://magickiat.wordpress.com/?p=623</guid>
		<description><![CDATA[Stanford Machine Learning Building Memory-efficient Java Applications: Practices and Challenges<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=623&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://holehouse.org/mlclass/">Stanford Machine Learning</a></li>
<li><a href="http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf">Building Memory-efficient Java Applications:<br />
Practices and Challenges</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/magickiat.wordpress.com/623/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/magickiat.wordpress.com/623/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/magickiat.wordpress.com/623/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/magickiat.wordpress.com/623/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/magickiat.wordpress.com/623/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/magickiat.wordpress.com/623/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/magickiat.wordpress.com/623/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/magickiat.wordpress.com/623/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/magickiat.wordpress.com/623/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/magickiat.wordpress.com/623/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/magickiat.wordpress.com/623/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/magickiat.wordpress.com/623/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/magickiat.wordpress.com/623/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/magickiat.wordpress.com/623/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=623&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://magickiat.wordpress.com/2012/01/26/20120126-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef5d276fd6f82f262728b3431b25744d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">magickiat</media:title>
		</media:content>
	</item>
		<item>
		<title>ตัวอย่างการทำ Unit Test แบบง่ายๆ</title>
		<link>http://magickiat.wordpress.com/2012/01/25/simple-java-unit-test-with-junit/</link>
		<comments>http://magickiat.wordpress.com/2012/01/25/simple-java-unit-test-with-junit/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 01:13:55 +0000</pubDate>
		<dc:creator>MagicalCyber</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[unit test]]></category>

		<guid isPermaLink="false">http://magickiat.wordpress.com/?p=603</guid>
		<description><![CDATA[หลายครั้งที่ผมได้ยินคำว่าให้ทำ unit test ผมมักจะพบว่า โปรแกรมเมอร์(ผมด้วย) จะใช้วิธีรันโปรแกรมแล้วกรอก input หรือทำตาม step ที่ต้องทดสอบ ถ้าพบ bug ก็แก้ code จนได้ผลลัพท์ที่ต้องการก็จบแล้วก็ส่งขึ้น build เพื่อให้ tester ตรวจสอบต่อไป จากเหตการณ์ที่กล่าวมา เราลองมาแปลความหมายของคำว่า Unit Test กัน ถ้าให้ยึดตามความหมายตาม wikipedia ความหมายของ Unit เขาเขียนไว้ดังนี้ A unit is the smallest testable part of an application มันคือหน่วยที่เล็กที่สุดของโปรแกรมที่สามารถทดสอบได้ &#8230; <a href="http://magickiat.wordpress.com/2012/01/25/simple-java-unit-test-with-junit/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=603&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>หลายครั้งที่ผมได้ยินคำว่าให้ทำ unit test ผมมักจะพบว่า โปรแกรมเมอร์(ผมด้วย) จะใช้วิธีรันโปรแกรมแล้วกรอก input หรือทำตาม step ที่ต้องทดสอบ ถ้าพบ bug ก็แก้ code จนได้ผลลัพท์ที่ต้องการก็จบแล้วก็ส่งขึ้น build เพื่อให้ tester ตรวจสอบต่อไป</p>
<p>จากเหตการณ์ที่กล่าวมา เราลองมาแปลความหมายของคำว่า Unit Test กัน ถ้าให้ยึดตามความหมายตาม <a href="http://en.wikipedia.org/wiki/Unit_testing">wikipedia</a> ความหมายของ Unit เขาเขียนไว้ดังนี้ </p>
<blockquote><p>A unit is the smallest testable part of an application</p></blockquote>
<p>มันคือหน่วยที่เล็กที่สุดของโปรแกรมที่สามารถทดสอบได้ แล้วที่เรารันโปรแกรมเพื่อทดสอบหน่ะเหรอเรียกว่าหน่วยย่อยของโปรแกรม ก็เลยเป็นที่มาของบล็อกนี้ เพื่อแสดงวิธีการเขียน Unit Test ด้วย JUnit<br />
<span id="more-603"></span><br />
<strong>Tool ที่ผมใช้</strong></p>
<ol>
<li>JDK 6</li>
<li>Eclipse Indigo</li>
</ol>
<p><strong>กรณีตัวอย่าง คลาสจัดรูปแบบการแสดงผลของ Date object</strong></p>
<p>ผมสร้างคลาส DateFormatUtil ขึ้นมา ทีนี้ผมต้องการทดสอบคลาสที่เพิ่งเขียนนี้ ถ้าเอาง่ายเลยก็คงเขียนเมธอด main แล้วก็เรียกดู วิธีนี้ได้ผลแต่ก็ลูกทุ่งไป เพราะบางทีหากมีการแก้ไข pattern โดยคนอื่น อาจจะได้ผลลัพท์ที่เราคาดไม่ถึงก็ได้ วันนี้ผมเลยขอเสนอ JUnit มาเป็นพระเอกให้</p>
<p><strong>เริ่มต้น JUnit บน Eclipse</strong></p>
<ol>
<li>สร้าง Java Project ขึ้นมาแล้วสร้างคลาส DateFormatUtil ดังนี้<br />
<pre class="brush: java;">
package util;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatUtil {
	
	public String parseSimpleThaiFormat(Date date){
		SimpleDateFormat formatter = new SimpleDateFormat(&quot;dd/MMM/yyyy&quot;);
		return formatter.format(date);
	}
}
</pre></li>
<li>สร้าง source folder ชื่อ test (คลิกขวาชื่อโปรเจคแล้วเลือก new -&gt; source folder) เพื่อแยกคลาส Test ออกจากคลาสหลัก</li>
<li>ที่หน้าต่าง Package Explorer คลิกขวาที่ชื่อไฟล์ DateFormatUtil -&gt; New -&gt; JUnit Test Case (ถ้าไม่พบให้เลือก Other แล้วพิมพ์ค้นหาเอา) จะมี dialog ดังนี้<br />
<a href="http://www.flickr.com/photos/magicalcyber/6757509827/" title="1 - new test case by magical_cyber, on Flickr"><img src="http://farm8.staticflickr.com/7150/6757509827_c4d34152d8.jpg" width="446" height="500" alt="1 - new test case"></a></p>
<p>ที่ช่อง Source folder กดปุ่ม Browse&#8230; แล้วเลือก folder test ที่เราเพิ่งสร้างจากขั้นตอนที่แล้ว จากนั้นกด Next<br />
<a href="http://www.flickr.com/photos/magicalcyber/6757544823/" title="2 - select method by magical_cyber, on Flickr"><img src="http://farm8.staticflickr.com/7163/6757544823_75712968a4.jpg" width="446" height="500" alt="2 - select method"></a><br />
เลือกเมธอด parseSimpleThaiFormat แล้วกดปุ่ม Finish หากยังไม่เคยมีการเพิ่ม Library ของ JUnit จะมี Dialog ขึ้นมาถามให้เพิ่มด้วยหรือเปล่า ก็กดปุ่ม OK ได้เลย เมื่อ Eclipse ทำงานเสร็จก็จะได้คลาสหน้าตาดังนี้</p>
<p><pre class="brush: java;">
package util;

import static org.junit.Assert.*;

import org.junit.Test;

public class DateFormatUtilTest {

	@Test
	public void testParseSimpleThaiFormat() {
		fail(&quot;Not yet implemented&quot;);
	}

}

</pre>
</li>
<li>ผมแก้ไข Test Case ใหม่ดังนี้<br />
<pre class="brush: java;">
package util;

import static org.junit.Assert.*;

import java.util.Calendar;
import java.util.GregorianCalendar;

import org.junit.Test;

public class DateFormatUtilTest {

	@Test
	public void testParseSimpleThaiFormat() {
		DateFormatUtil format = new DateFormatUtil();
		Calendar calendar = new GregorianCalendar();
		calendar.set(2012, 0, 25);
		assertEquals(&quot;25/01/2555&quot;, format.parseSimpleThaiFormat(calendar.getTime()));
	}

}

</pre><br />
เคสที่ผมผมคาดหวังว่า เมื่อส่งวันที่ 25 เข้าในแปลง ผมจะได้ตามที่ผมต้องการ (บรรทัดคำสั่ง assertEquals) จากนั้นคลิกขวาที่คลาสนี้แล้วเลือก Run As -&gt; JUnit Test จะปรากฏหน้าจอดังนี้<br />
<a href="http://www.flickr.com/photos/magicalcyber/6757603653/" title="3 - first fail by magical_cyber, on Flickr"><img src="http://farm8.staticflickr.com/7016/6757603653_3954999685.jpg" width="428" height="500" alt="3 - first fail"></a><br />
สั้นๆ ว่างานเข้าครับทดสอบไม่ผ่าน ที่ช่อง Failure Trace แจ้งว่า ผลลัพธ์ที่ผมคาดหวังไว้ไม่ตรงกับที่คลาสตอบกลับมา ต่อไปก็เป็นหน้าที่เราที่จะต้องแก้โปรแกรมให้ตรงตามที่เราคาดหวังไว้หล่ะ</li>
<li>แก้คลาส DateFormatUtil ใหม่ได้ดังนี้<br />
<pre class="brush: java;">
package util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatUtil {
	
	public String parseSimpleThaiFormat(Date date){
		Locale.setDefault(new Locale(&quot;th&quot;, &quot;TH&quot;));
		SimpleDateFormat formatter = new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);
		return formatter.format(date);
	}
}

</pre><br />
จากนั้นกลับไปรัน Test Case ใหม่ ควรจะได้หน้าจอดังนี้<br />
<a href="http://www.flickr.com/photos/magicalcyber/6757637647/" title="4 - success by magical_cyber, on Flickr"><img src="http://farm8.staticflickr.com/7158/6757637647_372242a644.jpg" width="467" height="492" alt="4 - success"></a><br />
ไฟเขียวแสดงว่าผ่าน เฮ้!!!</li>
<li>แต่ชีวิตจริงมันไม่ง่ายขนาดนั้น เพราะว่าเราทดสอบยังไม่ครอบคลุม ซึ่งผมก็ได้เพิ่ม Case ส่งค่า null เข้าไปเพื่อทดสอบ<br />
<pre class="brush: java;">
package util;

import static org.junit.Assert.*;

import java.util.Calendar;
import java.util.GregorianCalendar;

import org.junit.Test;

public class DateFormatUtilTest {

	@Test
	public void testParseSimpleThaiFormat() {
		DateFormatUtil format = new DateFormatUtil();
		Calendar calendar = new GregorianCalendar();
		calendar.set(2012, 0, 25);
		
		assertEquals(&quot;-&quot;, format.parseSimpleThaiFormat(null));
		assertEquals(&quot;25/01/2555&quot;, format.parseSimpleThaiFormat(calendar.getTime()));
	}

}
</pre><br />
ผมคาดหวังว่า ถ้าส่งค่า null เข้าไปจะได้เป็นเครื่องหมายขีดกลับมา จากนั้นรัน Test Case ใหม่ก็จะพบหน้าจอนี้<br />
<a href="http://www.flickr.com/photos/magicalcyber/6757680999/" title="5 - NullPointerException by magical_cyber, on Flickr"><img src="http://farm8.staticflickr.com/7005/6757680999_5c35de344f.jpg" width="398" height="500" alt="5 - NullPointerException"></a><br />
ร้องเบาๆ ว่า งานเข้าแล้วตรู ก็ไม่ได้เขียนให้รองรับนิหน่า ก็กลับไปแก้ไขโปรแกรมให้รองรับ Case ค่าวันที่เป็น Null ดังนี้<br />
<pre class="brush: java;">
package util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatUtil {

	public String parseSimpleThaiFormat(Date date) {
		String formatDate = &quot;-&quot;;
		if(date != null){
			Locale.setDefault(new Locale(&quot;th&quot;, &quot;TH&quot;));
			SimpleDateFormat formatter = new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);
			formatDate = formatter.format(date);
		}
		return formatDate;
	}
}
</pre><br />
จากนั้นก็รัน Test Case ใหม่ ควรจะขึ้นไฟเขียว
</li>
</ol>
<p>จากนี้ไป เราก็สามารถมั่นใจได้ว่าคลาสเราทำงานได้ถูกต้องด้วยการรัน Test Case นี้ทุกครั้งที่มีการ Update โค้ดจากคนอื่น ซึ่งหากผลการรัน Test Case ไม่ผ่านก็สามารถหาต้นตอเจอได้ว่าผิดที่ตรงใหน</p>
<p>จะเห็นได้ว่า การทำ Unit Test ไม่ยากอย่างที่คิด สิ่งที่ยากคือเราออกแบบคลาสให้รองรับการทำ Unit Test ได้หรือเปล่า ตอนต่อไปผมจะทำตัวอย่างการทำ Unit Test ด้วย JUnit ของ Java Web Project ให้ชม โปรดติดตามตอนต่อไป</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/magickiat.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/magickiat.wordpress.com/603/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/magickiat.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/magickiat.wordpress.com/603/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/magickiat.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/magickiat.wordpress.com/603/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/magickiat.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/magickiat.wordpress.com/603/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/magickiat.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/magickiat.wordpress.com/603/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/magickiat.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/magickiat.wordpress.com/603/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/magickiat.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/magickiat.wordpress.com/603/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=603&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://magickiat.wordpress.com/2012/01/25/simple-java-unit-test-with-junit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef5d276fd6f82f262728b3431b25744d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">magickiat</media:title>
		</media:content>

		<media:content url="http://farm8.staticflickr.com/7150/6757509827_c4d34152d8.jpg" medium="image">
			<media:title type="html">1 - new test case</media:title>
		</media:content>

		<media:content url="http://farm8.staticflickr.com/7163/6757544823_75712968a4.jpg" medium="image">
			<media:title type="html">2 - select method</media:title>
		</media:content>

		<media:content url="http://farm8.staticflickr.com/7016/6757603653_3954999685.jpg" medium="image">
			<media:title type="html">3 - first fail</media:title>
		</media:content>

		<media:content url="http://farm8.staticflickr.com/7158/6757637647_372242a644.jpg" medium="image">
			<media:title type="html">4 - success</media:title>
		</media:content>

		<media:content url="http://farm8.staticflickr.com/7005/6757680999_5c35de344f.jpg" medium="image">
			<media:title type="html">5 - NullPointerException</media:title>
		</media:content>
	</item>
		<item>
		<title>[2011/11/18] รวมลิงก์น่าสนใจ</title>
		<link>http://magickiat.wordpress.com/2011/11/18/20111118-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/</link>
		<comments>http://magickiat.wordpress.com/2011/11/18/20111118-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 05:25:56 +0000</pubDate>
		<dc:creator>MagicalCyber</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://magickiat.wordpress.com/?p=593</guid>
		<description><![CDATA[Do you still read source code to learn how to use an API? 10 inventors of Internet technologies you may not have heard of Announcing jQuery Mobile 1.0 Android 101: Introduction to Android Development Guide Expression language for Java jQuery &#8230; <a href="http://magickiat.wordpress.com/2011/11/18/20111118-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=593&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://code-recommenders.blogspot.com/2011/11/do-you-still-read-source-code-to-learn.html">Do you still read source code to learn how to use an API?</a></li>
<li><a href="http://royal.pingdom.com/2011/11/14/10-inventors-of-internet-technologies-you-may-not-have-heard-of/">10 inventors of Internet technologies you may not have heard of</a></li>
<li><a href="http://jquerymobile.com/blog/2011/11/16/announcing-jquery-mobile-1-0/">Announcing jQuery Mobile 1.0</a></li>
<li><a href="http://www.broculos.net/en/article/android-101-introduction-android-development-guide">Android 101: Introduction to Android Development Guide</a></li>
<li><a href="http://mvel.codehaus.org/Home">Expression language for Java</a></li>
<li><a href="http://jqfundamentals.com/">jQuery Fundamentals</a></li>
<li><a href="http://data.story.lu/">Data story blog</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/magickiat.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/magickiat.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/magickiat.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/magickiat.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/magickiat.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/magickiat.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/magickiat.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/magickiat.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/magickiat.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/magickiat.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/magickiat.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/magickiat.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/magickiat.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/magickiat.wordpress.com/593/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=593&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://magickiat.wordpress.com/2011/11/18/20111118-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef5d276fd6f82f262728b3431b25744d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">magickiat</media:title>
		</media:content>
	</item>
		<item>
		<title>[2011/11/16] รวมลิงก์น่าสนใจ</title>
		<link>http://magickiat.wordpress.com/2011/11/16/20111116-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/</link>
		<comments>http://magickiat.wordpress.com/2011/11/16/20111116-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 07:31:47 +0000</pubDate>
		<dc:creator>MagicalCyber</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://magickiat.wordpress.com/?p=590</guid>
		<description><![CDATA[FitNessize your JEE dev with minuteproject Adobe Engineer: Here&#8217;s Why We Killed Flash For Mobile Performance of Google’s V8 Javascript engine in Solr continuously-improving-as-a-developer Performance Architecture Checklist Software Testing is Dead<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=590&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://minuteproject.blogspot.com/2011/10/fitnessize-your-jee-dev-with.html">FitNessize your JEE dev with minuteproject</a></li>
<li><a href="http://www.businessinsider.com/adobe-engineer-heres-why-we-killed-flash-for-mobile-2011-11">Adobe Engineer: Here&#8217;s Why We Killed Flash For Mobile</a></li>
<li><a href="http://java.dzone.com/articles/performance-google%E2%80%99s-v8">Performance of Google’s V8 Javascript engine in Solr</a></li>
<li><a href="http://dotnetsurfers.com/blog/2011/11/13/continuously-improving-as-a-developer/">continuously-improving-as-a-developer</a></li>
<li><a href="http://omgimlovinit.blogspot.com/2011/11/performance-architecture-checklist.html">Performance Architecture Checklist</a></li>
<li><a href="http://www.softwaretestingmagazine.com/videos/software-testing-is-dead/">Software Testing is Dead</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/magickiat.wordpress.com/590/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/magickiat.wordpress.com/590/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/magickiat.wordpress.com/590/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/magickiat.wordpress.com/590/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/magickiat.wordpress.com/590/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/magickiat.wordpress.com/590/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/magickiat.wordpress.com/590/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/magickiat.wordpress.com/590/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/magickiat.wordpress.com/590/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/magickiat.wordpress.com/590/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/magickiat.wordpress.com/590/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/magickiat.wordpress.com/590/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/magickiat.wordpress.com/590/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/magickiat.wordpress.com/590/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=590&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://magickiat.wordpress.com/2011/11/16/20111116-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef5d276fd6f82f262728b3431b25744d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">magickiat</media:title>
		</media:content>
	</item>
		<item>
		<title>Java สร้างไฟล์ pdf ด้วย iText</title>
		<link>http://magickiat.wordpress.com/2011/11/03/java-%e0%b8%aa%e0%b8%a3%e0%b9%89%e0%b8%b2%e0%b8%87%e0%b9%84%e0%b8%9f%e0%b8%a5%e0%b9%8c-pdf-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-itext/</link>
		<comments>http://magickiat.wordpress.com/2011/11/03/java-%e0%b8%aa%e0%b8%a3%e0%b9%89%e0%b8%b2%e0%b8%87%e0%b9%84%e0%b8%9f%e0%b8%a5%e0%b9%8c-pdf-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-itext/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 10:48:26 +0000</pubDate>
		<dc:creator>MagicalCyber</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[iText]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[pdf]]></category>

		<guid isPermaLink="false">http://magickiat.wordpress.com/?p=586</guid>
		<description><![CDATA[เจอตัวอย่างที่อ่านง่าย และผมได้งานที่ต้องสร้างรูปจาก pdf จึงเอามาเก็บไว้เป็นตัวอย่าง http://www.avajava.com/tutorials/lessons/how-do-i-write-to-a-pdf-file-using-itext.html ถอดรหัส pdf http://www.rowellbelen.com/content/unlocking-password-protected-pdf-using-itext-library<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=586&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>เจอตัวอย่างที่อ่านง่าย และผมได้งานที่ต้องสร้างรูปจาก pdf จึงเอามาเก็บไว้เป็นตัวอย่าง<br />
<a href="http://www.avajava.com/tutorials/lessons/how-do-i-write-to-a-pdf-file-using-itext.html">http://www.avajava.com/tutorials/lessons/how-do-i-write-to-a-pdf-file-using-itext.html</a></p>
<p>ถอดรหัส pdf<br />
<a href="http://www.rowellbelen.com/content/unlocking-password-protected-pdf-using-itext-library">http://www.rowellbelen.com/content/unlocking-password-protected-pdf-using-itext-library</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/magickiat.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/magickiat.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/magickiat.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/magickiat.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/magickiat.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/magickiat.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/magickiat.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/magickiat.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/magickiat.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/magickiat.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/magickiat.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/magickiat.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/magickiat.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/magickiat.wordpress.com/586/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=586&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://magickiat.wordpress.com/2011/11/03/java-%e0%b8%aa%e0%b8%a3%e0%b9%89%e0%b8%b2%e0%b8%87%e0%b9%84%e0%b8%9f%e0%b8%a5%e0%b9%8c-pdf-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-itext/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef5d276fd6f82f262728b3431b25744d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">magickiat</media:title>
		</media:content>
	</item>
		<item>
		<title>[2011/10/28] รวมลิงก์น่าสนใจ</title>
		<link>http://magickiat.wordpress.com/2011/10/28/20111028-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/</link>
		<comments>http://magickiat.wordpress.com/2011/10/28/20111028-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 06:46:38 +0000</pubDate>
		<dc:creator>MagicalCyber</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://magickiat.wordpress.com/?p=584</guid>
		<description><![CDATA[1,000,000 daily users and no cache (Splash 2011) AWS CloudFormation and Puppet at PuppetConf &#8211; Jinesh Varia mockito &#8211; simpler &#38; better mocking powermock CouchDB &#38; Ruby: You&#8217;re Doing It Wrong SOME LESSONS LEARNED from my experiences as an investor &#8230; <a href="http://magickiat.wordpress.com/2011/10/28/20111028-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=584&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.slideshare.net/wooga/1000000-daily-users-and-no-cache-splash-2011">1,000,000 daily users and no cache (Splash 2011)</a></li>
<li><a href="http://www.slideshare.net/AmazonWebServices/aws-cloudformation-and-puppet-at-puppetconf-jinesh-varia">AWS CloudFormation and Puppet at PuppetConf &#8211; Jinesh Varia</a></li>
<li><a href="http://code.google.com/p/mockito/">mockito &#8211; simpler &amp; better mocking</a></li>
<li><a href="http://code.google.com/p/powermock/">powermock</a></li>
<li><a href="http://confreaks.net/videos/642-gogaruco2011-couchdb-ruby-you-re-doing-it-wrong">CouchDB &amp; Ruby: You&#8217;re Doing It Wrong</a></li>
<li><a href="http://cdixon.org/2011/09/28/some-lessons-learned/">SOME LESSONS LEARNED from my experiences as an investor and entrepreneur.</a></li>
<li><a href="http://blog.programmableweb.com/2011/09/29/building-a-real-time-location-based-urban-geofencing-game-with-socket-io-redis-node-js-and-sinatra-synchrony/">How We Built Our Real-Time, Location-Based Urban Geofencing Game</a></li>
<li><a href="http://css.dzone.com/articles/getting-started-selenium-2">Getting started with Selenium 2</a></li>
<li><a href="http://blogs.lessthandot.com/index.php/WebDev/UIDevelopment/automated-web-testing-with-selenium">Automated Web Testing with Selenium IDE</a></li>
<li><a href="http://java.dzone.com/articles/why-use-powermock-mock-private">Why Use PowerMock to Mock Private Methods?</a></li>
<li><a href="http://www.bnet.com/blog/teamwork/10-inspirations-for-embracing-failure/320">10 Inspirations for Embracing Failure</a></li>
<li><a href="http://www.informit.com/articles/article.aspx?p=1759890">iOS Developer&#8217;s Bookshelf: A Reading List by Rod Strougo</a></li>
<li><a href="http://mobile.dzone.com/articles/video-tutorial-how-build-rough">Video Tutorial: How to build a rough Angry Birds clone for Windows Phone in 5 minutes</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/magickiat.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/magickiat.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/magickiat.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/magickiat.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/magickiat.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/magickiat.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/magickiat.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/magickiat.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/magickiat.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/magickiat.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/magickiat.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/magickiat.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/magickiat.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/magickiat.wordpress.com/584/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=584&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://magickiat.wordpress.com/2011/10/28/20111028-%e0%b8%a3%e0%b8%a7%e0%b8%a1%e0%b8%a5%e0%b8%b4%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99%e0%b9%83%e0%b8%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef5d276fd6f82f262728b3431b25744d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">magickiat</media:title>
		</media:content>
	</item>
		<item>
		<title>Struts Framework 2 – ตัวอย่าง Application ตอนที่ 2</title>
		<link>http://magickiat.wordpress.com/2011/10/23/struts-framework-2-%e2%80%93-%e0%b8%95%e0%b8%b1%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87-application-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-2/</link>
		<comments>http://magickiat.wordpress.com/2011/10/23/struts-framework-2-%e2%80%93-%e0%b8%95%e0%b8%b1%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87-application-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-2/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 08:09:33 +0000</pubDate>
		<dc:creator>MagicalCyber</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[struts 2]]></category>
		<category><![CDATA[struts framework 2]]></category>
		<category><![CDATA[struts framework 2 ภาษาไทย]]></category>

		<guid isPermaLink="false">http://magickiat.wordpress.com/?p=572</guid>
		<description><![CDATA[บทความตอนที่แล้ว Struts Framework 2 – ตัวอย่าง Application ตอนที่ 1 จากตอนที่ 1 เราได้เตรียมตัวพร้อมแล้วสำหรับการเขียน Web board ตอนที่ 2 นี้ก็เริ่มบันทึกข้อมูลลงฐานข้อมูลแล้ว อย่าลืมลง MySQL แล้วดาวโหลด Driver มาไว้ด้วยนะ ผมใช้ mysql-connector-java-5.1.18 แตก Zip Driver แล้ว Copy ไฟล์ mysql-connector-java-5.1.18-bin.jar ไปไว้ที่ WEB-NF/lib Copy ไฟล์ error.jsp ของ Project: bookstore มาไว้ที่ &#8230; <a href="http://magickiat.wordpress.com/2011/10/23/struts-framework-2-%e2%80%93-%e0%b8%95%e0%b8%b1%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87-application-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-2/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=572&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>บทความตอนที่แล้ว</strong><br />
<a href="http://magickiat.wordpress.com/2011/10/23/struts-framework-2-%E0%B8%95%E0%B8%B1%E0%B8%A7%E0%B8%AD%E0%B8%A2%E0%B9%88%E0%B8%B2%E0%B8%87-application-%E0%B8%95%E0%B8%AD%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88-1/">Struts Framework 2 – ตัวอย่าง Application ตอนที่ 1</a></p>
<p>จากตอนที่ 1 เราได้เตรียมตัวพร้อมแล้วสำหรับการเขียน Web board ตอนที่ 2 นี้ก็เริ่มบันทึกข้อมูลลงฐานข้อมูลแล้ว<br />
อย่าลืมลง MySQL แล้วดาวโหลด Driver มาไว้ด้วยนะ ผมใช้ mysql-connector-java-5.1.18<br />
<span id="more-572"></span></p>
<ol>
<li>แตก Zip Driver แล้ว Copy ไฟล์<em> mysql-connector-java-5.1.18-bin.jar</em> ไปไว้ที่	<em>WEB-NF/lib</em></li>
<li>Copy ไฟล์ <em>error.jsp</em> ของ Project: <strong>bookstore </strong>มาไว้ที่ <em>WebContent </em>ของ Project: <strong>webboard</strong></li>
<li>เปิดไฟล์ main.jsp เพื่อสร้าง Form สำหรับกรอกข้อมูลเพื่อน Post ข้อความดังนี้<br />
<pre class="brush: java;">
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
	pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ taglib prefix=&quot;s&quot; uri=&quot;/struts-tags&quot;%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Web board&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;s:form&gt;
		&lt;s:textarea name=&quot;message&quot; label=&quot;ข้อความ&quot; value=&quot;&quot; /&gt;
		&lt;s:submit value=&quot;Post&quot; align=&quot;center&quot; /&gt;
	&lt;/s:form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
</li>
<li>รันโปรแกรมเพื่อดูว่ามีฟอร์มปรากฏจริงหรือไม่ (ต่อไปถ้ามีการบอกว่าให้รันโปรแกรม ผมจะหมายถึงให้คลิกชื่อ Project แล้วเลือก <em>Run As -&gt; Run on Server</em>) และเพื่อดูว่ามี error หรือไม่ ซึ่งถ้าไม่มีปัญหา จะพบหน้าจอดังรูป<br />
<a href="http://www.flickr.com/photos/magicalcyber/6271373773/" title="3 - post form by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6211/6271373773_52a6ab1f7a.jpg" width="402" height="166" alt="3 - post form"></a></p>
<p>ดูเสร็จแล้ว Stop Server ให้เรียบร้อย</li>
<li>สร้างคลาส โดยกำหนดค่าดังนี้<br />
<blockquote><p>Package: webboard.dao<br />
Name: ConnectionManager</p></blockquote>
<p>คลาสนี้จะใช้เป็นตัวกลางที่เชื่อมต่อกับฐานข้อมูล ดังนี้<br />
<pre class="brush: java;">
package webboard.dao;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectionManager {
	public static Connection getStatement() throws Exception {
		Connection con = null;
		String userName = &quot;webboard&quot;;
		String password = &quot;webboard&quot;;
		String url = &quot;jdbc:mysql://localhost/webboard&quot;;
		
		// Load driver
		Class.forName(&quot;com.mysql.jdbc.Driver&quot;).newInstance();
		// Connect
		con = DriverManager.getConnection(url, userName, password);
		
		return con;
	}
}</pre>
</li>
<li>สร้าง User และฐานข้อมูล ให้ข้อมูลในตรงกับข้อมูลในคลาส ConnectionManager.java<br />
จากนั้นสร้าง Table ที่ชื่อว่า posts รายละเอียดดังนี้<br />
<pre class="brush: sql;">
CREATE  TABLE IF NOT EXISTS `webboard`.`posts` (
  `id` INT(11) NOT NULL AUTO_INCREMENT ,
  `post` VARCHAR(500) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
</pre></li>
<li>สร้างคลาส โดยกำหนดค่าดังนี้<br />
<blockquote><p>Package: webboard.dao<br />
Name: PostDAO</p></blockquote>
<p>คลาสนี้จะทำหน้าที่เป็นคนบันทึกข้อมูลลงฐานข้อมูล ซึ่งเป็นส่วนหนึ่งของ Model ใน MVC Pattern หากจำไม่ได้ให้ลองกลับไปอ่าน <a href="http://magickiat.wordpress.com/2010/10/05/struts-framework-the-model-in-mvc/">http://magickiat.wordpress.com/2010/10/05/struts-framework-the-model-in-mvc/</a><br />
โค้ดดังนี้<br />
<pre class="brush: java;">
package webboard.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;


public class PostDAO {
	public void save(String post) throws Exception{
		//Get Connection
		Connection con = ConnectionManager.getConnection();
		//Prepare sql to insert
		PreparedStatement pstmt = con.prepareStatement(&quot;insert into posts(post) values(?)&quot;);
		pstmt.setString(1, post);
		//Method 'executeUpdate' can use Insert, Update, Delete
		pstmt.executeUpdate();
		//Close any connection
		pstmt.close();
		con.close();
	}
}</pre>
</li>
<li>สร้างคลาส โดยกำหนดค่าดังนี้<br />
<blockquote><p>Package: webboard.action<br />
Name: Post</p></blockquote>
<p>โค้ดดังนี้<br />
<pre class="brush: java;">
package webboard.action;

import webboard.dao.PostDAO;

public class Post {
	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	
	public String post() throws Exception{
		PostDAO postDAO = new PostDAO();
		postDAO.save(message);
		return &quot;success&quot;;
	}
}</pre></p>
<p>เป็นคลาสที่ใช้ในการบันทึก post ลงฐานข้อมูล<br />
<strong>จุดแตกต่าง</strong>อย่างหนึ่งของ Struts 2 กับ Struts 1 คือ เราจะไม่มีการสร้างคลาส Form โดยเราจะเอาตัวแปรมาประกาศไว้ในคลาส Action ในที่นี้คือตัวแปร message ก็จะตรงกับตัวแปร TextArea ในหน้า main.jsp<br />
และจุดที่สองคือ คลาส Action ไม่จำเป็นต้องสืบทอดคลาสอื่นๆ ก็สามารถทำงานได้
</li>
<li>ทำการ Config คลาส Action ให้ Struts รู้จัก โดยให้เปิดไฟล์ webboard.xml แล้วก็อปโค้ดนี้ไว้ใน Tag package<br />
<pre class="brush: xml;">
&lt;action name=&quot;postMessage&quot; class=&quot;webboard.action.Post&quot; method=&quot;post&quot;&gt;
	&lt;result name=&quot;success&quot;&gt;/main.jsp&lt;/result&gt;
&lt;/action&gt; </pre><br />
เป็นการบอก Struts ว่า ถ้ามีคนร้องขอ postMessage เข้ามา ให้เรียกเมธอด post ของคลาส webboard.action.Post ขึ้นมาทำงาน และถ้าผลลัพท์ที่ได้จากคลาสเป็น String ที่มีค่าเป็น success ให้ส่งต่อไปที่หน้า main.jsp
</li>
<li>แก้ไขหน้า main.jsp เล็กน้อย ตรง Tag form ให้เพิ่มส่วนของ action ดังนี้<br />
<pre class="brush: xml;">&lt;s:form action=&quot;postMessage.action&quot;&gt; </pre></p>
<li>แก้ไขไฟล์ index.html ตรง URL ให้แก้เหลือแค่ index.action<br />
<pre class="brush: xml;">&lt;META HTTP-EQUIV=&quot;Refresh&quot; CONTENT=&quot;0;URL=index.action&quot;&gt;&lt;/li&gt; </pre></li>
<li>รันโปรแกรมเพื่อทดสอบ ให้กรอกข้อความตามต้องการ แล้วกดปุ่ม Post ถ้าหากเกิด Error ก็จัดการตาม Error ที่พบ คาดว่าถ้าพบก็จะเป็น username/password ของฐานข้อมูลไม่ตรง หรือหา Driver ไม่เจอ หรือชื่อตัวแปร textarea ไม่ตรงกับใน Action<br />
แต่ถ้ากด Post แล้วหน้าจอนิ่ง ให้ไปตรวจสอบที่ฐานข้อมูล ถ้าพบข้อมูลใน Table posts แสดงว่าโปรแกรมทำงานถูกต้องแล้ว</li>
<li>เนื่องจากเราไม่ทราบว่าโปรแกรมทำการ Insert ข้อมูลได้จริงหรือไม่ และไม่รู้ด้วยว่ามี Post ก่อนหน้านี้หรือไม่ เราจึงต้องทำการแก้ไขโปรแกรมโดยเพิ่มการแสดงผลในหน้า main.jsp ให้เพิ่มโค้ดนี้ต่อท้าย Tag </s><br />
	<pre class="brush: xml;">&lt;h2&gt;Posts&lt;/h2&gt;
	&lt;table&gt;
		&lt;tr&gt;
			&lt;td&gt;ID&lt;/td&gt;
			&lt;td&gt;Message&lt;/td&gt;
		&lt;/tr&gt;
		&lt;s:iterator value=&quot;posts&quot; var=&quot;post&quot;&gt;
			&lt;tr&gt;
				&lt;td&gt;&lt;s:property value=&quot;id&quot; /&gt;&lt;/td&gt;
				&lt;td&gt;&lt;s:property value=&quot;post&quot; /&gt;&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/s:iterator&gt;
	&lt;/table&gt;
 </pre>
</li>
<li>สร้างคลาส โดยกำหนดค่าดังนี้<br />
<blockquote><p>Package: webboard.dto<br />
Name: PostDTO</p></blockquote>
<p>โค้ดดังนี้<br />
<pre class="brush: java;">
package webboard.dto;

public class PostDTO {
	public int id;
	public String post;
}
</pre><br />
คลาสนี้จะใช้สำหรับการเก็บค่า เป็นเสมือนตัวแทนของแต่ละ Row ใน table post และมีหน้าที่ในการนำข้อมูลนี้ส่งไปมาระหว่าง Model – View – Controller ซึ่งเป็นหน้าที่หลักของ DTO</li>
<li>แก้ไขคลาส PostDAO ให้เพิ่มเมธอดเพื่อดึงรายการ Post ทั้งหมด<br />
<pre class="brush: java;">	public List&lt;PostDTO&gt; listPosts() throws Exception{
		List&lt;PostDTO&gt; posts = new ArrayList&lt;PostDTO&gt;();

		// Get Connection
		Connection con = ConnectionManager.getConnection();
		Statement stmt = con.createStatement();
		//Query posts
		ResultSet rs = stmt.executeQuery(&quot;select id, post from posts&quot;);
		if(rs != null){
			while(rs.next()){
				PostDTO post = new PostDTO();
				post.id = rs.getInt(rs.findColumn(&quot;id&quot;));
				post.post = rs.getString(rs.findColumn(&quot;post&quot;));
				posts.add(post);
			}
		}
		
		return posts;
	}</pre>
</li>
<li>แก้ไขคลาส Post โดยประกาศตัวแปรนี้ และเพิ่ม getter/setter<br />
<pre class="brush: java;">
private List&lt;PostDTO&gt; posts;
	
public List&lt;PostDTO&gt; getPosts() {
	return posts;
}

public void setPosts(List&lt;PostDTO&gt; posts) {
	this.posts = posts;
}</pre><br />
ซึ่งชื่อตัวแปรนี้จะตรงกับตัวแปรใน Tag integrator ในหน้า main.jsp<br />
และแก้ไขเมธอด post เป็นดังนี้<br />
<pre class="brush: java;">
	public String post() throws Exception{
		PostDAO postDAO = new PostDAO();
		postDAO.save(message);
		posts = postDAO.listPosts();
		return &quot;success&quot;;
	}</pre><br />
จุดที่แก้คือเพิ่ม listPosts() ขึ้นมาหลังจาก save()
</li>
<li>ให้ลบข้อมูลในฐานข้อมูลที่เคยบันทึกไว้ก่อนหน้านี้ แล้วค่อยรันโปรแกรมเพื่อทดสอบ ถ้าถูกต้อง ควรจะได้ดังรูป<br />
<a href="http://www.flickr.com/photos/magicalcyber/6271373839/" title="4 - show posts by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6218/6271373839_0d4871494f.jpg" width="419" height="274" alt="4 - show posts"></a></li>
<li>ถ้าหากไม่ลบข้อมูลก่อน เวลาที่เรารันโปรแกรมครั้งแรก เราจะไม่พบ post ก่อนหน้าที่บันทึกไปแล้ว วิธีการแก้ไขคือ ให้สร้างเมธอดในคลาส Post ดังนี้<pre class="brush: java;">
	public String load() throws Exception{
		PostDAO postDAO = new PostDAO();
		posts = postDAO.listPosts();
		return &quot;success&quot;;
	}</pre><br />
จากนั้นเปิดไฟล์ struts.xml แล้วแก้ไข action index ให้เป็นดังนี้<pre class="brush: xml;">
		&lt;action name=&quot;index&quot; class=&quot;webboard.action.Post&quot; method=&quot;load&quot;&gt;
			&lt;result name=&quot;success&quot;&gt;/main.jsp&lt;/result&gt;
		&lt;/action&gt;</pre><br />
ลองรันโปรแกรมใหม่อีกครั้ง คราวนี้เราก็จะเห็น post ก่อนหน้านี้แล้ว</li>
</ol>
<p><strong>ดาวโหลด source code</strong> ได้ที่ <a href="http://www.4shared.com/file/AqLW7Hds/webboard_ch2.html">http://www.4shared.com/file/AqLW7Hds/webboard_ch2.html</a></p>
<p><strong>แหล่งอ้างอิง</strong></p>
<ul>
<li><a href="http://viralpatel.net/blogs/2010/01/tutorial-struts2-hibernate-example-eclipse.html">http://viralpatel.net/blogs/2010/01/tutorial-struts2-hibernate-example-eclipse.html</a></li>
<li><a href="http://www.roseindia.net/struts/struts2/struts-2-mysql.shtml">http://www.roseindia.net/struts/struts2/struts-2-mysql.shtml</a></li>
<li><a href="http://www.sitepoint.com/forums/showthread.php?585778-Input-not-to-remember-history">http://www.sitepoint.com/forums/showthread.php?585778-Input-not-to-remember-history</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/magickiat.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/magickiat.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/magickiat.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/magickiat.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/magickiat.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/magickiat.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/magickiat.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/magickiat.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/magickiat.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/magickiat.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/magickiat.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/magickiat.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/magickiat.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/magickiat.wordpress.com/572/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=572&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://magickiat.wordpress.com/2011/10/23/struts-framework-2-%e2%80%93-%e0%b8%95%e0%b8%b1%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87-application-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef5d276fd6f82f262728b3431b25744d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">magickiat</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6211/6271373773_52a6ab1f7a.jpg" medium="image">
			<media:title type="html">3 - post form</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6218/6271373839_0d4871494f.jpg" medium="image">
			<media:title type="html">4 - show posts</media:title>
		</media:content>
	</item>
		<item>
		<title>Struts Framework 2 &#8211; ตัวอย่าง Application ตอนที่ 1</title>
		<link>http://magickiat.wordpress.com/2011/10/23/struts-framework-2-%e0%b8%95%e0%b8%b1%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87-application-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-1/</link>
		<comments>http://magickiat.wordpress.com/2011/10/23/struts-framework-2-%e0%b8%95%e0%b8%b1%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87-application-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-1/#comments</comments>
		<pubDate>Sat, 22 Oct 2011 19:11:10 +0000</pubDate>
		<dc:creator>MagicalCyber</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[struts 2]]></category>
		<category><![CDATA[struts framework 2]]></category>
		<category><![CDATA[struts framework 2 ภาษาไทย]]></category>

		<guid isPermaLink="false">http://magickiat.wordpress.com/?p=556</guid>
		<description><![CDATA[เริ่มเบื่อ Hello world แล้วก็ bookstore แล้ว ลองอย่างอื่นทำดีกว่า คราวนี้ลองมาเขียนโปรแกรมติดต่อฐานข้อมูลดีกว่า จะได้ดูดีขึ้นมาหน่อย ตัวอย่างที่เหมาะกับเรื่องนี้ก็คือ Web board หวังว่าคงเคยใช้งานกันมาบ้าง อารมณ์เหมือน Post บน Facebook แล้วมีคนมา comment สิ่งที่จำเป็นในบทความนี้คือ ทำขั้นตอนติดตั้ง Project ให้ผ่านก่อน เพื่อที่จะได้นำเอาโครงสร้าง Project นั้นมาใช้งานต่อ ติดตั้ง MySQL 5.5 (เวอร์ชันล่าสุดตอนที่เขียนบทความนี้) และดาวโหลด Driver MySQL มาด้วย (Connector/J 5.1) หรือหากใครมีความสามารถที่จะใช้ของเจ้าอื่นและเขียนติดต่อกับฐานข้อมูลเป็นก็สามารถใช้แทนกันได้ Step เตรียมพร้อม สร้าง &#8230; <a href="http://magickiat.wordpress.com/2011/10/23/struts-framework-2-%e0%b8%95%e0%b8%b1%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87-application-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-1/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=556&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>เริ่มเบื่อ Hello world แล้วก็ bookstore แล้ว ลองอย่างอื่นทำดีกว่า คราวนี้ลองมาเขียนโปรแกรมติดต่อฐานข้อมูลดีกว่า จะได้ดูดีขึ้นมาหน่อย ตัวอย่างที่เหมาะกับเรื่องนี้ก็คือ Web board หวังว่าคงเคยใช้งานกันมาบ้าง อารมณ์เหมือน Post บน Facebook แล้วมีคนมา comment<br />
สิ่งที่จำเป็นในบทความนี้คือ</p>
<ol>
<li>ทำ<a href="http://magickiat.wordpress.com/2011/10/15/struts-framework-2-setup/">ขั้นตอนติดตั้ง Project</a> ให้ผ่านก่อน เพื่อที่จะได้นำเอาโครงสร้าง Project นั้นมาใช้งานต่อ </li>
<li>ติดตั้ง <a href="http://dev.mysql.com/downloads/mysql/">MySQL 5.5</a> (เวอร์ชันล่าสุดตอนที่เขียนบทความนี้) และดาวโหลด Driver MySQL มาด้วย (<a href="http://dev.mysql.com/downloads/connector/j/5.1.html">Connector/J 5.1</a>) หรือหากใครมีความสามารถที่จะใช้ของเจ้าอื่นและเขียนติดต่อกับฐานข้อมูลเป็นก็สามารถใช้แทนกันได้ </li>
</ol>
<p><span id="more-556"></span><br />
<strong>Step เตรียมพร้อม</strong>
<ol>
<li>สร้าง <em>Dynamic Web Project</em> โดยเลือกเมนู <em>File -&gt; New -&gt; Project…</em> แล้วพิมพ์ Dynamic ก็จะขึ้นมาให้เลือก</li>
<li>ตั้งชื่อ Project ว่า <em>webboard </em>แล้วกด Next สองที แล้วทำเครื่องหมายถูกหน้าคำว่า <em>Generate web.xml deployment descriptor</em> แล้วกด Finish</li>
<li>ไปที่ Project <strong>bookstore </strong>ให้ทำการ copy ไฟล์ทั้งหมดใน <em>WEB-INF/lib</em> มาไว้ที่ Project <strong>webboard </strong>ตำแหน่งเดียวกัน</li>
<li>Copy ไฟล์ <em>web.xml</em> ของ Project <strong>bookstore </strong>มาไว้ที่ Project <strong>webboard </strong>(ถ้ามี dialog ถามว่าให้ทับไฟล์เดิมหรือเปล่าให้ตอบ Yes ถ้าไม่มีแสดงว่าวางผิดตำแหน่ง)</li>
<li>Copy ไฟล์<em> struts.xml</em> และ <em>example.xml</em> ที่ตำแหน่ง <em>src </em>ของ Project <strong>bookstore </strong>มาไว้ที่ <em>src </em>ของ Project <strong>webboard</strong></li>
<li>Copy ไฟล์ <em>index.html</em> ที่ตำแหน่ง <em>WebContent </em>ของ Project <strong>bookstore </strong>มาไว้ที่ <em>WebContent </em>ของ Project <strong>webboard</strong></li>
</ol>
<p>จบพิธีการเตรียม Project เพื่อเตรียมให้รัน Struts 2 ได้<br />
ตรวจสอบให้ดีว่าไฟล์ครบดังรูปหรือไม่ (อย่าลืมปรับ Perspective ให้เป็น Java นะ จะได้เหมือนกัน)<br />
<a href="http://www.flickr.com/photos/magicalcyber/6270076296/" title="1 - must have file by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6118/6270076296_9a3b21cddd.jpg" width="322" height="493" alt="1 - must have file"></a></p>
<p><strong>ลงมือเขียน</strong></p>
<ol>
<li>เปลี่ยนชื่อไฟล์ <strong>example.xml</strong> เป็น <strong>webboard.xml</strong> โดยการคลิกสองครั้งหรือ คลิกขวาที่ไฟล์แล้วเลือก<em> Refactor -&gt; Rename…</em></li>
<li>เปิดไฟล์ <strong>webbord.xml</strong> ที่ได้จากขั้นตอนที่ 7) ขึ้นมา แล้วหาบรรทัดนี้<br />
<pre class="brush: xml;">&lt;package name=&quot;example&quot; namespace=&quot;/example&quot; extends=&quot;default&quot;&gt;</pre><br />
ให้เปลี่ยนคำว่า <strong>example</strong>เป็น <strong>webboard</strong>แล้วกดบันทึก<br />
แล้วลบ Tag ที่อยู่ข้างใน tag <strong>package</strong>ให้หมดก็จะได้ไฟล์หน้าตาดังนี้<br />
<pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&lt;!DOCTYPE struts PUBLIC
        &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot;
        &quot;http://struts.apache.org/dtds/struts-2.0.dtd&quot;&gt;

&lt;struts&gt;

    &lt;package name=&quot;webboard&quot; namespace=&quot;/webboard&quot; extends=&quot;default&quot;&gt;

    &lt;/package&gt;
&lt;/struts&gt;
 </pre>
</li>
<li>เปิดไฟล์ <strong>struts.xml</strong> หา tag นี้แล้วลบข้างใน tag ออก<br />
<pre class="brush: xml;">
&lt;action name=&quot;index&quot;&gt;
     &lt;result type=&quot;redirectAction&quot;&gt;
          &lt;param name=&quot;actionName&quot;&gt;HelloWorld&lt;/param&gt;
          &lt;param name=&quot;namespace&quot;&gt;/example&lt;/param&gt;
     &lt;/result&gt;
&lt;/action&gt;
</pre><br />
แก้ให้เป็น<br />
<pre class="brush: xml;">&lt;action name=&quot;index&quot;&gt;
  &lt;result&gt;/main.jsp&lt;/result&gt;
 &lt;/action&gt;</pre>	</p>
<p>และเปลี่ยนค่าของ Tag<br />
<pre class="brush: xml;">&lt;include file=&quot;example.xml&quot;/&gt;</pre><br />
เป็น<br />
<pre class="brush: xml;">&lt;include file=&quot;webboard.xml&quot;/&gt;</pre>	</li>
<li>สร้างไฟล์ <strong>main.jsp</strong> ไว้ที่ <em>WebContent </em>เปิดไฟล์นี้ขึ้นมาแล้วพิมพ์<br />
<blockquote><p><strong>Hello World!</strong></p></blockquote>
<p> ไว้ข้างใน Tag <em>body</em></li>
<li>เปิดไฟล์ <strong>index.html</strong> แล้วแก้<br />
<pre class="brush: xml;">&lt;META HTTP-EQUIV=&quot;Refresh&quot; CONTENT=&quot;0;URL=example/HelloWorld.action&quot;&gt;</pre><br />
ให้เป็น<br />
<pre class="brush: xml;">&lt;META HTTP-EQUIV=&quot;Refresh&quot; CONTENT=&quot;0;URL=webboard/index.action&quot;&gt;</pre></li>
<li>คลิกขวาที่ไฟล์ <strong>index.html</strong> เลือก<em> Run As -&gt; Run on Server</em> ถ้าพบหน้าจอดังรูปแสดงว่า การ Setup Struts 2 ได้แล้ว<br />
<a href="http://www.flickr.com/photos/magicalcyber/6270076338/" title="2 - first run test by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6231/6270076338_24b4833076.jpg" width="436" height="186" alt="2 - first run test"></a></p>
<p>ถ้าหากไม่ขึ้นดังนี้ ข้อแสดงความเสียใจด้วย เพราะว่าต้องเริ่มทำใหม่ตั้งแต่ต้น</li>
</ol>
<p>ปล. หากทำตามแล้วไม่ผ่าน </p>
<ol>
<li>ให้โหลดไฟล์นี้ <a href="http://www.4shared.com/file/vt1daoAt/webboard_ch1.htm">http://www.4shared.com/file/vt1daoAt/webboard_ch1.html</a></li>
<li>ไปที่ Eclipse แล้วเลือกเมนู File -&gt; Import&#8230; แล้วเลือก General -&gt; Existing Projects into Workspace</li>
<li>เลือกรายการ Select archive file: แล้วชี้ไปที่ตำแหน่งที่ดาวโหลดมา แล้วกดปุ่ม finish ที่เหลือก็แก้ Config เรื่อง JDK และ Tomcat ก็ผ่านจะผ่านแล้ว</li>
</ol>
<p> หรือจะเลือก New Dynamic Web Project จากนั้นแตก zip แล้วก็อปไฟล์ไปวาง</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/magickiat.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/magickiat.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/magickiat.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/magickiat.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/magickiat.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/magickiat.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/magickiat.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/magickiat.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/magickiat.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/magickiat.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/magickiat.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/magickiat.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/magickiat.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/magickiat.wordpress.com/556/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=556&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://magickiat.wordpress.com/2011/10/23/struts-framework-2-%e0%b8%95%e0%b8%b1%e0%b8%a7%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87-application-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef5d276fd6f82f262728b3431b25744d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">magickiat</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6118/6270076296_9a3b21cddd.jpg" medium="image">
			<media:title type="html">1 - must have file</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6231/6270076338_24b4833076.jpg" medium="image">
			<media:title type="html">2 - first run test</media:title>
		</media:content>
	</item>
		<item>
		<title>คำนิยามของ Web Application Framework (เวอร์ชันจาวา)</title>
		<link>http://magickiat.wordpress.com/2011/10/22/what-is-web-application-framework/</link>
		<comments>http://magickiat.wordpress.com/2011/10/22/what-is-web-application-framework/#comments</comments>
		<pubDate>Sat, 22 Oct 2011 11:24:30 +0000</pubDate>
		<dc:creator>MagicalCyber</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[web application]]></category>
		<category><![CDATA[web application framework]]></category>

		<guid isPermaLink="false">http://magickiat.wordpress.com/?p=539</guid>
		<description><![CDATA[ขอกล่าวถึงการสร้าง Web Application สำหรับผู้ที่ไม่เคยเขียน JSP/Servlet มาก่อนนะครับ เพื่อที่จะได้เข้าใจคำว่า framework ให้มากขึ้น เราต้องการสร้าง Java Web Application ด้วย Servlet/JSP ในการบันทึกข้อมูลจากผู้ใช้ จะมีกระบวนการที่เกิดขึ้นดังนี้ ผู้ใช้กรอกข้อมูลในส่วนของหน้า form แล้วกดปุ่ม submit ในโค้ด Servlet เราจะต้องดึงข้อมูลที่ผู้ใช้ส่งมา โดยส่วนมากจะใช้คำสั่ง request.getParameter("ชื่อตัวแปร"); ทำการ validate ข้อมูลที่ส่งมา ถ้าไม่ผ่านก็ให้ไปแสดงผลที่หน้าแสดง error ถ้าผ่านก็ให้บันทึกข้อมูล แล้วแสดงหน้าจอว่าบันทึกเสร็จเรียบร้อย ถ้า Web Application ของเรามีความซับซ้อนมากขึ้น เช่น ในการทำงานของหนึ่ง Servlet &#8230; <a href="http://magickiat.wordpress.com/2011/10/22/what-is-web-application-framework/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=539&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>ขอกล่าวถึงการสร้าง Web Application สำหรับผู้ที่ไม่เคยเขียน JSP/Servlet มาก่อนนะครับ เพื่อที่จะได้เข้าใจคำว่า framework ให้มากขึ้น </p>
<p>เราต้องการสร้าง Java Web Application ด้วย Servlet/JSP ในการบันทึกข้อมูลจากผู้ใช้ จะมีกระบวนการที่เกิดขึ้นดังนี้</p>
<ul>
<li>ผู้ใช้กรอกข้อมูลในส่วนของหน้า form แล้วกดปุ่ม submit</li>
<li>ในโค้ด Servlet เราจะต้องดึงข้อมูลที่ผู้ใช้ส่งมา โดยส่วนมากจะใช้คำสั่ง<br />
<code> request.getParameter("ชื่อตัวแปร");</code></li>
<li>ทำการ validate ข้อมูลที่ส่งมา ถ้าไม่ผ่านก็ให้ไปแสดงผลที่หน้าแสดง error ถ้าผ่านก็ให้บันทึกข้อมูล แล้วแสดงหน้าจอว่าบันทึกเสร็จเรียบร้อย</li>
</ul>
<p><span id="more-539"></span><br />
 ถ้า Web Application ของเรามีความซับซ้อนมากขึ้น เช่น</p>
<ul>
<li>ในการทำงานของหนึ่ง Servlet ต้องแสดงผลแตกต่างกันไปตามผลลัทพ์ที่ได้ เช่นการ login ของระบบลงทะเบียนระหว่างอาจารย์และนักศึกษา จะต้องเห็นคนละหน้ากัน</li>
<li>กำหนดสิทธิ์การเข้าถึงข้อมูล เช่น นักศึกษาไม่มีสิทธิ์เข้าดูข้อมูลส่วนของอาจารย์</li>
</ul>
<p>ซึ่งโดยส่วนมาก ในการพัฒนา Web Application ก็จะทำกันเป็น pattern เดียวกัน คือ</p>
<ol>
<li>User ส่ง Request เข้ามา</li>
<li>Validate สิทธิ์</li>
<li>Validate ข้อมูล</li>
<li>ทำงานตามหน้าที่ของแต่ละคลาส</li>
<li>แสดงผลลัพธ์หรือแสดงข้อผิดพลาด</li>
</ol>
<p>คนที่เขียน Web Application ก็จะพบการทำงานส่วนอื่นๆ ก็จะคล้ายกันอย่างนี้เสมอ และเลี่ยงไม่ได้ที่จะต้องทำ เราเรียกกระบวนการทำงานนี้ว่า workflow (แปลตรงตัว กระบวนการหรือลำดับการทำงาน) ซึ่งถ้าต้องเสียเวลามานั่งทำในส่วนที่ซ้ำๆ กันอย่างนี้จะทำให้เสียเวลาในการพัฒนาส่วนของการทำงานหลักที่เราต้องทำ เช่น แค่จะบันทึกข้อมูลแต่เราต้องทำขั้นตอนอื่นๆ อีกหลายอย่าง และซ้ำๆ กัน แล้วแต่ละคนก็ design workflow อาจจะไม่เหมือนกันก็ได้ ทั้งๆ ที่ผลลัพธ์ก็ได้เหมือนกัน จึงมีคนพยายามที่จะทำให้กระบวนการทำงานนี้เป็นมาตรฐานไม่ว่าจะสร้างกี่โปรเจคก็ตาม อารมณ์ประมาณว่า ยังไงก็ต้องเขียนอย่างนี้อยู่แล้ว ถ้าอย่างนั้นก็เขียนไว้ให้ใช้งานเลย เวลาอยากเขียนให้ทำงานแบบนี้จะได้ไม่ต้องมาเขียนใหม่ จะได้มีเวลาเอาไปคิดส่วนการทำงานหลักที่เราต้องทำจริงๆ สิ่งที่คนเหล่านี้คิดเรียกว่า <strong>Web Application Framework</strong> เช่น Spring MVC, Struts, Seam, Grails เป็นต้น</p>
<p>แต่ทว่า แต่ละเจ้าก็ design workflow ต่างกันออกไป อาจจะเพราะแต่ละเจ้าก็ออกแบบให้แก้ปัญหาที่เจ้าอื่นพบเจอ แล้วยังแก้ไม่ได้ ทำให้มีข้อดีข้อเสียแตกต่างกันไป สุดท้ายคนลำบากก็คือพวกเราตาดำๆ ที่จะต้องมานั่งศึกษาว่า แต่ละ framework มันใช้อย่างไร</p>
<p>สิ่งที่คาดว่าจะได้รับจากบทความนี้ หวังว่าจะเข้าใจ framework มากขึ้นนะครับ สรุปทิ้งท้ายซักหน่อยดีกว่า<br />
คำว่า framework ก็คือ โค้ดโปรแกรมที่มีกระบวนการทำงานอย่างใดอย่างหนึ่ง และเป็นสิ่งที่ต้องทำอยู่เสมอ แล้วเปิดโอกาสให้เราเอาโค้ดที่เราต้องการให้ทำงานบ่างอย่างได้<br />
เช่น MVC Framework ก็เป็นการทำงานของ Web Application ที่มีการแยกส่วนการทำงานตามหน้าที่ Model-View-Controller<br />
หรือ Javascript Framework ก็เป็นโค้ดการทำงานในส่วนของ Javascript ที่ทุกคนต้องเจอ ก็ทำเป็นไฟล์ให้เราเรียกใช้เพื่อความสะดวก</p>
<p>และอีกหนึ่งตัวอย่างทิ้งท้ายที่คิดว่าน่าจะเห็นภาพมากขึ้น<br />
สมมุติว่าผมเป็นคนที่เขียนโปรแกรมจาวาได้เก่งมาก แต่ว่าอ่อนเรื่องภาษาอังกฤษและคณิตศาสตร์ ถ้าเป็นเรื่องเขียนโปรแกรมผมสู้สุดใจ แต่ถ้าให้ไปลุยภาษาอังกฤษหรือคำนวณเลขก็ยอมขาดใจดีกว่า แต่แทนที่ผมจะยอมขาดใจ ผมก็ไปเรียกคนที่เขาเก่งและถนัดภาษาอังกฤษมาหนึ่งคน และคณิตศาสตร์มาหนึ่งคนให้มาช่วย เมื่อผมเจอเหตุการณ์ที่ต้องให้ภาษาอังกฤษก็เรียกคนที่ถนัดภาษาอังกฤษมาทำงานให้ หรือเมื่อเจอโจทย์คำนวณก็เรียกคนที่ถนัดคณิตศาสตร์มาช่วยคิด ผมจะเรียกสองคนนี้ว่า framework ที่เข้ามาช่วยการทำงานของผม (ผมก็เป็น framework ในการเขียนโปรแกรม และเรียกใช้ framework อื่นเพื่อให้การทำงานสำเร็จตามที่ต้องการได้) ส่วนจะเป็น framework เจ้าไหน(คนไหน) ก็ตามแต่จะหาได้ หรือคุยกันรู้เรื่องแล้วหล่ะ</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/magickiat.wordpress.com/539/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/magickiat.wordpress.com/539/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/magickiat.wordpress.com/539/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/magickiat.wordpress.com/539/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/magickiat.wordpress.com/539/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/magickiat.wordpress.com/539/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/magickiat.wordpress.com/539/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/magickiat.wordpress.com/539/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/magickiat.wordpress.com/539/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/magickiat.wordpress.com/539/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/magickiat.wordpress.com/539/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/magickiat.wordpress.com/539/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/magickiat.wordpress.com/539/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/magickiat.wordpress.com/539/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=539&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://magickiat.wordpress.com/2011/10/22/what-is-web-application-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef5d276fd6f82f262728b3431b25744d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">magickiat</media:title>
		</media:content>
	</item>
		<item>
		<title>[BB] Hello world BlackBerry App</title>
		<link>http://magickiat.wordpress.com/2011/10/22/bb-hello-world-blackberry-app/</link>
		<comments>http://magickiat.wordpress.com/2011/10/22/bb-hello-world-blackberry-app/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 17:35:02 +0000</pubDate>
		<dc:creator>MagicalCyber</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[BB]]></category>
		<category><![CDATA[BlackBerry]]></category>

		<guid isPermaLink="false">http://magickiat.wordpress.com/?p=528</guid>
		<description><![CDATA[เพิ่งซื้อ BlackBerry Bold 9900 มา เลยขอบูชา Hello world ซะหน่อย สิ่งที่ต้องการในการพัฒนาแอ็บของ BB คือ Java SDK 6 ตั้งแต่ Update 16 ขึ้นไป Eclipse 3.6 Helios หรือ 3.7 Indigo (แต่ผมลองแล้ว Indigo update plug-in ไม่ผ่าน ต้อง Helios) BlackBerry Java Plug-in Step เตรียมตัว สมัครสมาชิกที่ http://us.blackberry.com/developers/ Login &#8230; <a href="http://magickiat.wordpress.com/2011/10/22/bb-hello-world-blackberry-app/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=528&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>เพิ่งซื้อ BlackBerry Bold 9900 มา เลยขอบูชา Hello world ซะหน่อย<br />
สิ่งที่ต้องการในการพัฒนาแอ็บของ BB คือ</p>
<ol>
<li>Java SDK 6 ตั้งแต่ Update 16 ขึ้นไป</li>
<li>Eclipse 3.6 Helios หรือ 3.7 Indigo (แต่ผมลองแล้ว Indigo update plug-in ไม่ผ่าน ต้อง Helios)</li>
<li>BlackBerry Java Plug-in</li>
</ol>
<p><span id="more-528"></span><br />
<strong>Step เตรียมตัว</strong></p>
<ol>
<li>สมัครสมาชิกที่ <a href="http://us.blackberry.com/developers/">http://us.blackberry.com/developers/</a></li>
<li>Login เข้าไป จะพบเมนูด้านซ้ายว่า BlackBerry 7 คลิกเข้าไป จะมีปุ่มดาวโหลดตรงกลางหน้าจอ ก็คลิกเข้าไปอีกที จะเป็นวิธีการลง BlackBerry Java Plug-in ให้ Eclipse<br />
ย้ำอีกทีว่า ผมแนะนำให้ใช้ Helios นะ ถ้าหากติดตั้งไม่ผ่าน ให้ดาวโหลด plug-in มาเองที่หน้าตอน login ครั้งแรก ที่เมนูด้านขวา จะมี Top Download อยู่ อันแรก ดูว่าถ้าเป็น plug-in ของ windows ให้ดาวโหลดแล้วตอนติดตั้ง ให้ชี้ไปที่ path ของ eclipse มันจะไปอัพเดทให้</li>
</ol>
<p><strong>มาเริ่ม Hello world กันเถอะ</strong></p>
<ol>
<li>เปิด Eclipse ที่ผ่านการลง BlackBerry Java Plug-in ขึ้นมา</li>
<li>เลือกเมนู <em>File -&gt; New -&gt; BlackBerry Project</em></li>
<li>ผมตั้งชื่อโปรเจคว่า helloworld สังเกตว่าที่ช่อง JRE จะเป็น BlackBerry JRE 6.0.0<br />
<a href="http://www.flickr.com/photos/magicalcyber/6267079196/" title="0 - new project by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6222/6267079196_ec3ffca708.jpg" width="417" height="500" alt="0 - new project"></a></p>
<p>(เป็นเวอร์ชันที่แถมมากับ Java Plug-in update ล่าสุด ณ วันที่เขียนบทความ หากต้องการเขียนเวอร์ชันอื่นให้ไปดู Step Update จะมีให้เลือกเวอร์ชัน)<br />
<a href="http://www.flickr.com/photos/magicalcyber/6266551519/" title="1 - software update by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6019/6266551519_68befc424c.jpg" width="500" height="435" alt="1 - software update"></a></p>
</li>
<li>จากนั้นก็กดปุ่ม Next ไปสองที จะพบหน้าจอนี้ ให้เลือก Hello BlackBerry แล้วกด Finish (หรือจะกด Next ต่อก็ได้ เพื่อปรับค่าชื่อโปรแกรมหรือ package ซึ่งผมว่ายังไม่จำเป็น)<br />
<a href="http://www.flickr.com/photos/magicalcyber/6267079284/" title="2 - template by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6112/6267079284_cf9c83625a.jpg" width="417" height="500" alt="2 - template"></a></p>
</li>
<li>เมื่อกลับมาที่หน้า Eclipse จะมีหน้าต่าง Getting Started เอาไว้เปิดดูขำๆ หรือปิดไปก็ได้ และไฟล์ config ซึ่งก็ปิดไปได้เหมือนกัน</li>
<li>คลิกขวาที่ชื่อโปรเจคในหน้าต่าง Package Explorer จากนั้นเลือก Run As -&gt; BlackBerry Simulator ก็จะปรากฏหน้าจอ Emulator ของ BlackBerry และ Dialog แจ้งอะไรซักอย่าง ก็กด ok ไป</li>
<li>เมื่อ Emulator โหลดเสร็จ ให้คลิกที่คำว่า All ตรงกลาง จะโผล่รายการโปรแกรมทั้งหมดใน Emulator จากนั้นให้เลื่อนลงมาด้านล่าง หาโปรแกรมที่ชื่อ helloworld จัดการคลิกทันที<br />
<a href="http://www.flickr.com/photos/magicalcyber/6266552083/" title="3 - all menu and hello world by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6166/6266552083_3962436aac.jpg" width="387" height="500" alt="3 - all menu and hello world"></a></p>
</li>
<li>กรอก Name แล้วกดปุ่ม Say Hello to ก็จะได้ Dialog ขึ้นมาดังรูป เย้ๆๆ เสร็จแล้ว Hello World<br />
<a href="http://www.flickr.com/photos/magicalcyber/6266552371/" title="4 - hello kiat by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6224/6266552371_12b140a609.jpg" width="387" height="500" alt="4 - hello kiat"></a></p>
</li>
</ol>
<blockquote><p>เดี๋ยวก่อน นี่มัน Hello world ที่เขาเขียนขึ้นมานิ ไม่ได้เขียนเองนิหว่า </p></blockquote>
<p>อยากจะบอกว่า นี่เป็นโค้ดตัวอย่างที่อยากจะให้ดู ให้เข้าไปดูที่โฟลเดอร์ <em>src -&gt; mypackage</em> จะเห็นว่ามีสองคลาส ซึ่งสองคลาสนี้จะได้มาทุกครั้งที่ <em>New Project</em> ไม่ว่าจะเป็น <em>Template</em> ธรรมดาหรือว่า <em>Hello </em>แค่ว่าถ้าเป็น <em>Hello </em>จะมีโค้ดไว้ให้ดู</p>
<p><strong>เจาะตับ helloworld</strong></p>
<ol>
<li><strong>HelloBlackBerry.java</strong> เปิดคลาสขึ้นมา มันคือเมนคลาสที่ใช้รันโปรเจค ซึ่งเวลา New Project ที่ไม่ใช่ Hello BlackBerry ก็ต้องมีเหมือนกัน และโค้ดข้างในก็เหมือนกันด้วย คือจะมีไว้ New คลาสที่สอง ที่เป็น UI ขึ้นมาทำงาน
<p><pre class="brush: java;">
package mypackage;

import net.rim.device.api.ui.UiApplication;

/**
 * This class extends the UiApplication class, providing a graphical user interface.
 */
public class HelloBlackBerry extends UiApplication {
    /**
     * Entry point for application
     * 
     * @param args
     *            Command line arguments (not used)
     */
    public static void main( String[] args ) {
        // Create a new instance of the application and make the currently
        // running thread the application's event dispatch thread.
        HelloBlackBerry theApp = new HelloBlackBerry();
        theApp.enterEventDispatcher();
    }

    /**
     * Creates a new HelloBlackBerry object
     */
    public HelloBlackBerry() {
        // Push a screen onto the UI stack for rendering.
        pushScreen( new HelloBlackBerryScreen() );
    }
}

</pre></p>
</li>
<li><strong>HelloBlackBerryScreen.java</strong> เป็นคลาส UI ที่มี BasicEditField ที่มี label ในตัวเอง กับปุ่ม ButtonField ที่มีการ set listener ว่าเมื่อกดปุ่ม ให้ไปสร้าง Dialog เพื่อ Hello ค่าที่กรอก<br />
<pre class="brush: java;">
package mypackage;

import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.component.BasicEditField;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.util.StringProvider;

public class HelloBlackBerryScreen extends MainScreen {
    private BasicEditField basicEditField;

    public HelloBlackBerryScreen() {
        super( MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR );
        setTitle( &quot;HelloBlackBerry&quot; );

        basicEditField = new BasicEditField( &quot;Enter Name:&quot;, &quot;&quot;, 100, BasicEditField.EDITABLE );
        add( basicEditField );

        ButtonField buttonField_1 = new ButtonField( &quot;Say Hello to&quot;, ButtonField.CONSUME_CLICK | ButtonField.FIELD_RIGHT );
        add( buttonField_1 );
        buttonField_1.setChangeListener( new FieldChangeListener() {
            public void fieldChanged( Field arg0, int arg1 ) {
                sayHello();
            }
        } );
    }

    protected void makeMenu( Menu menu, int instance ) {
    	super.makeMenu(menu, instance);
        MenuItem mntmSayHello = new NewMenuItem();
        menu.add( mntmSayHello );
    }

    private class NewMenuItem extends MenuItem {
        public NewMenuItem() {
            super( new StringProvider( &quot;Say Hello&quot; ), 0, 0 );
        }

        public void run() {
            sayHello();
        }
    }

    private void sayHello() {
        Dialog.inform( &quot;Hello &quot; + basicEditField.getText() );
    }
}

</pre></li>
</ol>
<p><strong>เอา helloworld ลงเครื่องจริง</strong><br />
มีเครื่องจริงกับมืออยู่แล้ว จะไม่ลองเอาลงเครื่องก็ยังไงๆ อยู่ จัดซะหน่อยแล้วกัน</p>
<ol>
<li>ไปขอ BlackBerry Code Signing Keys จากหน้าเว็บ <a href="http://us.blackberry.com/developers/javaappdev/codekeys.jsp">http://us.blackberry.com/developers/javaappdev/codekeys.jsp</a> แล้วเลื่อนลงมาจนเจอลิงค์ <em>Register for code signing keys</em> ก็กดเข้าไปเลย จะเจอแบบฟอร์ม กรอกๆ ให้ครบ หลักๆ ที่ไม่ควรลืมคือช่อง <em>Select a key</em> ให้เลือกเป็น <em>Smartphone </em>หรือถ้าจะทำ tablet ก็เลือก <em>Smartphone and tablet</em> จากนั้นก็รอทาง RIM ส่ง Signing Key มาให้ ซึ่งเราจะได้รับแจ้งทาง email ว่าให้รอประมาณ 2 ชม.<br />
<a href="http://www.flickr.com/photos/magicalcyber/6267146650/" title="5 - request signing keys by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6229/6267146650_890ebe6173.jpg" width="500" height="488" alt="5 - request signing keys"></a></p>
<li>ดาวโหลดไฟล์ .csi ซึ่งเป็นของ smartphone มาไว้ กลับมาที่ Eclipse แล้วคลิกขวาที่ชื่อโปรเจคแล้วเลือก BlackBerry -&gt; Install new signature keys แล้ว browse ไปหาไฟล์ .csi ที่ได้มา ก็จะปรากฏ dialog ดังรูป
<p><a href="http://www.flickr.com/photos/magicalcyber/6267404390/" title="6 - create new pair by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6049/6267404390_5b4e52ecb5.jpg" width="434" height="194" alt="6 - create new pair"></a></p>
<p>กดปุ่ม Yes ก็จะปรากฏช่องให้กรอกพาสเวิร์ด ก็กรอกพาสที่สมัคร Dev ลงไปแล้วรอจนกว่าจะทำการ generate เสร็จ ซึ่งนานพอสมควร<br />
<a href="http://www.flickr.com/photos/magicalcyber/6266878243/" title="7 - password by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6103/6266878243_0e31b01c78.jpg" width="500" height="201" alt="7 - password"></a></p>
<p>เมื่อผ่านขั้นตอนนี้ ก็จะมี dialog ให้กรอก PIN ที่ทำการลงทะเบียนในแบบฟอร์มก่อนหน้านี้ ก็เป็นอันจบการ Generate Key</p>
</li>
<li>กลับมาที่ Eclipse คลิกขวาที่ชื่อโปรเจคเลือก BlackBerry -&gt; Sign with Signature Tool&#8230; (สังเกตุว่า มันมาแทนเมนู Install เมื่อขั้นตอนที่แล้ว) จะขึ้น dialog ให้กรอก password ผมกรอก password ที่สมัคร dev ลงไป ก็จะทำอะไรของมันไม่รู้ซักพักหนึ่ง พอกระบวนการนี้เสร็จ มันจะมีเมล์แจ้งว่าเรา sign เรียบร้อย (แสดงว่าต้องต่ออินเตอร์เนตตอน sign)</li>
<li> คลิกขวาที่ชื่อโปรเจคเลือก BlackBerry -&gt; Package Project(s) จากนั้นในโฟลเดอร์ deliverables จะพบไฟล์โฟลเดอร์ Standard และ Web และมีไฟล์ .jad อยู่โฟลเดอร์ข้างในอีกชั้น</li>
<li>เสียบ BB กับเครื่องคอม แล้วเปิดโปรแกรม BlackBerry Desktop Software ขึ้นมา จากนั้นเลือกเมนู Import files&#8230; แล้วชี้ไปที่โฟลเดอร์ Standard แล้วเลือกไฟล์ helloworld.alx ก็จะมีไฟล์ helloworld ปรากฏบนรายการโปรแกรม คลิกเครื่องหมายบวกด้านหลัง (แต่ถ้าขึ้นว่า Undo Install ก็ไม่ต้องกดนะ)  แล้วกด Apply<br />
<a href="http://www.flickr.com/photos/magicalcyber/6266976415/" title="9 - import project by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6042/6266976415_3da84e9ac5.jpg" width="500" height="315" alt="9 - import project"></a></p>
</li>
<li>ดูที่เครื่องจริงใน ทำเหมือนรันใน emulator ทุกอย่าง ก็จะได้ดังรูป<br />
<a href="http://www.flickr.com/photos/magicalcyber/6267531006/" title="10 - all program by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6155/6267531006_e190658329.jpg" width="500" height="375" alt="10 - all program"></a></p>
<p>และสุดท้าย<br />
<a href="http://www.flickr.com/photos/magicalcyber/6267004109/" title="11 - run by magical_cyber, on Flickr"><img src="http://farm7.static.flickr.com/6236/6267004109_c8fb933c64.jpg" width="500" height="375" alt="11 - run"></a></li>
</ol>
<p>ขอบคุณข้อมูลจากเว็บนี้ </p>
<ul>
<li><a href="http://stackoverflow.com/questions/4222195/how-to-package-and-deploy-blackberry-apps-to-device-from-eclipse">http://stackoverflow.com/questions/4222195/how-to-package-and-deploy-blackberry-apps-to-device-from-eclipse</a></li>
<li><a href="http://www.webspheretools.com/sites/webspheretools.nsf/docs/How%20to%20prepare%20and%20deploy%20a%20BlackBerry%20Java%20Application">http://www.webspheretools.com/sites/webspheretools.nsf/docs/How%20to%20prepare%20and%20deploy%20a%20BlackBerry%20Java%20Application</a></li>
</ul>
<p>ในความคิดเห็นส่วนตัวของผม เมื่อเทียบกับ Hello world ของ Android กรณีที่ต้องรับค่า แล้วมาแสดงผลนะ ไม่ใช่ Hello แบบที่แสดงแค่ label ผมว่าของ BlackBerry โค้ดดูง่ายกว่ามากเลย ตอนนี้ผมกำลังจะลองพัฒนาแอ็พของ BlackBerry ตัวเดียวกับที่ผมกำลังทำบน Android เพื่อเปรียบเทียบว่าความยากง่ายในการพัฒนาต่างกันมากน้อยแค่ไหน แล้วพบกันใหม่ตอนหน้าครับ</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/magickiat.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/magickiat.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/magickiat.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/magickiat.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/magickiat.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/magickiat.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/magickiat.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/magickiat.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/magickiat.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/magickiat.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/magickiat.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/magickiat.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/magickiat.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/magickiat.wordpress.com/528/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=magickiat.wordpress.com&amp;blog=3544604&amp;post=528&amp;subd=magickiat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://magickiat.wordpress.com/2011/10/22/bb-hello-world-blackberry-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef5d276fd6f82f262728b3431b25744d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">magickiat</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6222/6267079196_ec3ffca708.jpg" medium="image">
			<media:title type="html">0 - new project</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6019/6266551519_68befc424c.jpg" medium="image">
			<media:title type="html">1 - software update</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6112/6267079284_cf9c83625a.jpg" medium="image">
			<media:title type="html">2 - template</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6166/6266552083_3962436aac.jpg" medium="image">
			<media:title type="html">3 - all menu and hello world</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6224/6266552371_12b140a609.jpg" medium="image">
			<media:title type="html">4 - hello kiat</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6229/6267146650_890ebe6173.jpg" medium="image">
			<media:title type="html">5 - request signing keys</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6049/6267404390_5b4e52ecb5.jpg" medium="image">
			<media:title type="html">6 - create new pair</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6103/6266878243_0e31b01c78.jpg" medium="image">
			<media:title type="html">7 - password</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6042/6266976415_3da84e9ac5.jpg" medium="image">
			<media:title type="html">9 - import project</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6155/6267531006_e190658329.jpg" medium="image">
			<media:title type="html">10 - all program</media:title>
		</media:content>

		<media:content url="http://farm7.static.flickr.com/6236/6267004109_c8fb933c64.jpg" medium="image">
			<media:title type="html">11 - run</media:title>
		</media:content>
	</item>
	</channel>
</rss>
