<?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>kowito.com &#187; Programming</title>
	<atom:link href="http://www.kowito.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kowito.com</link>
	<description>Try not to become a man of success but a man of value.</description>
	<lastBuildDate>Thu, 15 Dec 2011 04:43:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>one line factorial</title>
		<link>http://www.kowito.com/2011/12/15/one-line-factorial/</link>
		<comments>http://www.kowito.com/2011/12/15/one-line-factorial/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 04:26:23 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.kowito.com/?p=198</guid>
		<description><![CDATA[def fac(i): return reduce(int.__mul__, xrange(1, i+1), 1)]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2011/12/15/one-line-factorial/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><pre name="code" class="python">def fac(i): return reduce(int.__mul__, xrange(1, i+1), 1)</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2011/12/15/one-line-factorial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ทำไมถึงควรเลือกใช้ Mercurial SCM</title>
		<link>http://www.kowito.com/2011/02/17/%e0%b8%97%e0%b8%b3%e0%b9%84%e0%b8%a1%e0%b8%96%e0%b8%b6%e0%b8%87%e0%b8%84%e0%b8%a7%e0%b8%a3%e0%b9%80%e0%b8%a5%e0%b8%b7%e0%b8%ad%e0%b8%81%e0%b9%83%e0%b8%8a%e0%b9%89-mercurial-scm/</link>
		<comments>http://www.kowito.com/2011/02/17/%e0%b8%97%e0%b8%b3%e0%b9%84%e0%b8%a1%e0%b8%96%e0%b8%b6%e0%b8%87%e0%b8%84%e0%b8%a7%e0%b8%a3%e0%b9%80%e0%b8%a5%e0%b8%b7%e0%b8%ad%e0%b8%81%e0%b9%83%e0%b8%8a%e0%b9%89-mercurial-scm/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 14:38:37 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[DVCS]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://www.kowito.com/?p=178</guid>
		<description><![CDATA[Distributed revision control เป็นเครื่องมือที่ Developer สมัยนี้จะต้องหามาใส่หัวให้ได้ Mercurial ก็เป็น DVCS ชนิดหนึ่งที่เป็นที่นิยมในตลาด ( หมายถึงตลาดโลก ในเมืองไทยหายากหน่อยนึง ) แต่หลายคนที่พยายามจะเปลี่ยนจาก Subversion มาเป๋น DVCS ก็ยังสับสน ว่าไอ้ที่มีอยู่หลายเจ้านั้น มีดียังไง ผมจะสรุปคร่าวๆโดยที่พยายามพูดถึงเจ้าอื่นให้น้อยที่สุด เพื่อไม่ให้เกิดดราม่า Mercurial สามารถทำงานได้ดี ในทีมที่มีหลายๆคน เพราะว่าแต่ละคนก็มี repo ของตัวเอง เนื่องด้วยแต่ละคนมี repo ของตัวเอง อิสระในการทำงานก็สูงกว่า ไม่ต้องกังวลว่าจะไปพังของใคร แล้วทำให้ทั้งระบบต้องหยุด สามารถทำงานแบบ Stand Alone แค่เพียง Check Out มา จะ Commit ก็ครั้งก็ได้ พอต่อเน็ตได้ค่อย Push ทีเดียว แต่ละ Rev. มีเลขกำกับ เหมือน SVN ต่างจาก Git [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2011/02/17/%e0%b8%97%e0%b8%b3%e0%b9%84%e0%b8%a1%e0%b8%96%e0%b8%b6%e0%b8%87%e0%b8%84%e0%b8%a7%e0%b8%a3%e0%b9%80%e0%b8%a5%e0%b8%b7%e0%b8%ad%e0%b8%81%e0%b9%83%e0%b8%8a%e0%b9%89-mercurial-scm/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p><a title="Distributed revision control" href="http://en.wikipedia.org/wiki/Distributed_revision_control" target="_blank">Distributed revision control</a> เป็นเครื่องมือที่ Developer สมัยนี้จะต้องหามาใส่หัวให้ได้ Mercurial ก็เป็น DVCS ชนิดหนึ่งที่เป็นที่นิยมในตลาด ( หมายถึงตลาดโลก ในเมืองไทยหายากหน่อยนึง ) แต่หลายคนที่พยายามจะเปลี่ยนจาก Subversion มาเป๋น DVCS ก็ยังสับสน ว่าไอ้ที่มีอยู่หลายเจ้านั้น มีดียังไง ผมจะสรุปคร่าวๆโดยที่พยายามพูดถึงเจ้าอื่นให้น้อยที่สุด เพื่อไม่ให้เกิดดราม่า</p>
<ul>
<li>Mercurial สามารถทำงานได้ดี ในทีมที่มีหลายๆคน เพราะว่าแต่ละคนก็มี repo ของตัวเอง</li>
<li>เนื่องด้วยแต่ละคนมี repo ของตัวเอง อิสระในการทำงานก็สูงกว่า ไม่ต้องกังวลว่าจะไปพังของใคร แล้วทำให้ทั้งระบบต้องหยุด</li>
<li>สามารถทำงานแบบ Stand Alone แค่เพียง Check Out มา จะ Commit ก็ครั้งก็ได้ พอต่อเน็ตได้ค่อย Push ทีเดียว</li>
<li>แต่ละ Rev. มีเลขกำกับ เหมือน SVN ต่างจาก Git ที่เป็น Hash ยาวๆ จำยากๆ แต่ก็มีข้อเสียที่หมายเลข Rev เดียวกันนี้ จะแตกต่างไปจากคนอื่นๆ สร้างความสับสนพอสมควร เอาให้ชัวร์เวลา Merge ก็อ้างจาก Hash นั่นแหละ</li>
<li>ลงง่าย ใช้เร็ว มีเกือบทุก Platform</li>
<li><a title="Guido van Rossum" href="http://www.python.org/~guido/">Guido</a> ใช้ ( อันนี้ไม่รู้เป็นข้อดีหรือเปล่า อารมณ์ประมาณเหมือนใช้กระเป๋า ใช้มือถือตามดาราที่ชอบ )</li>
<li>มี Web Server build-in อันนี้ชอบมาก เหมาะกับคนที่ไม่ได้ใช้ผ่าน GUI สามารถสั่ง hg serve ไปเปิดไปที่ http://localhost:8000 เลย</li>
<li>ฟรี!!!</li>
</ul>
<p>นึกต่อไม่ออกแฮะ ตัดจบเลยแล้วกัน</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2011/02/17/%e0%b8%97%e0%b8%b3%e0%b9%84%e0%b8%a1%e0%b8%96%e0%b8%b6%e0%b8%87%e0%b8%84%e0%b8%a7%e0%b8%a3%e0%b9%80%e0%b8%a5%e0%b8%b7%e0%b8%ad%e0%b8%81%e0%b9%83%e0%b8%8a%e0%b9%89-mercurial-scm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>จาวาเร็วส์</title>
		<link>http://www.kowito.com/2011/02/16/%e0%b8%88%e0%b8%b2%e0%b8%a7%e0%b8%b2%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b8%aa%e0%b9%8c/</link>
		<comments>http://www.kowito.com/2011/02/16/%e0%b8%88%e0%b8%b2%e0%b8%a7%e0%b8%b2%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b8%aa%e0%b9%8c/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 11:45:57 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[สบายใจ]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[กลอน]]></category>

		<guid isPermaLink="false">http://www.kowito.com/?p=171</guid>
		<description><![CDATA[จาวาใครว่าเร็วส์ ทุเรศ ท่านผู้นำสมเพช แม่งค้าง ความดีบ่เบิกเนตร ใครขัด กูด่า ใครคิดเหตุผลอ้าง กูบล็อก เว็บกู]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2011/02/16/%e0%b8%88%e0%b8%b2%e0%b8%a7%e0%b8%b2%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b8%aa%e0%b9%8c/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p>จาวาใครว่าเร็วส์ ทุเรศ</p>
<p>ท่านผู้นำสมเพช แม่งค้าง</p>
<p>ความดีบ่เบิกเนตร ใครขัด กูด่า</p>
<p>ใครคิดเหตุผลอ้าง กูบล็อก เว็บกู</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2011/02/16/%e0%b8%88%e0%b8%b2%e0%b8%a7%e0%b8%b2%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b8%aa%e0%b9%8c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Test Driven Development ด้วย Django Unit Testing (ตอนที่ 1)</title>
		<link>http://www.kowito.com/2010/11/09/test-driven-development-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-django-unit-testing-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-1/</link>
		<comments>http://www.kowito.com/2010/11/09/test-driven-development-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-django-unit-testing-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-1/#comments</comments>
		<pubDate>Tue, 09 Nov 2010 08:28:39 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit test]]></category>

		<guid isPermaLink="false">http://www.kowito.com/?p=150</guid>
		<description><![CDATA[Django มีสุดยอดแห่ง unit testing ที่ build in มาในตัว framework เรียบร้อยแล้ว, คนมักจะไม่ค่อยใส่ใจกับมันเท่าไรนักเพราะว่ามันมาแบบ “out of the box” แต่นั่นไม่ได้หมายความว่าเราจะละเลยส่วนั้นได้ เมื่อเราสร้าง Application ของเราเองขึ้นมา เพราะว่าเทสต์นั้นทำให้เรา &#8220;คิดออก&#8221; ว่าอะไรที่ควรจะทำให้เสร็จ เพราะฉะนั้นเราจะมาพูดเรื่องทำอย่างไรให้ Application สามรถทำงานได้เป็นอย่างดี เมื่อมาถึงตรงนี้แล้วผมจะพยายามแสดงให้เห็นว่า ทำยังไงจะใช้ TDD ใน Django Application เราจะสร้าง Project เล็กๆ และมี Application เพียงตัวเดียว และใช้ Unit testing เป็นตัวกำหนด ว่าจะออกแบบ algorithm และจะ implement class อย่างไร ทำไมต้องเทสต์ตลอด? หลายๆ คนพูดถึงเรื่อง Test Driven Development แล้วยังมีโปรแกรมเมอร์ที่มีประสบการณ์หลายๆ คน [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2010/11/09/test-driven-development-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-django-unit-testing-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-1/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p>Django มีสุดยอดแห่ง unit testing ที่ build in มาในตัว framework เรียบร้อยแล้ว, คนมักจะไม่ค่อยใส่ใจกับมันเท่าไรนักเพราะว่ามันมาแบบ “out of the box” แต่นั่นไม่ได้หมายความว่าเราจะละเลยส่วนั้นได้ เมื่อเราสร้าง Application ของเราเองขึ้นมา เพราะว่าเทสต์นั้นทำให้เรา &#8220;คิดออก&#8221; ว่าอะไรที่ควรจะทำให้เสร็จ เพราะฉะนั้นเราจะมาพูดเรื่องทำอย่างไรให้ Application สามรถทำงานได้เป็นอย่างดี</p>
<p>เมื่อมาถึงตรงนี้แล้วผมจะพยายามแสดงให้เห็นว่า ทำยังไงจะใช้ TDD ใน Django Application เราจะสร้าง Project เล็กๆ และมี Application เพียงตัวเดียว และใช้ Unit testing เป็นตัวกำหนด ว่าจะออกแบบ algorithm และจะ implement class อย่างไร</p>
<p><span id="more-150"></span></p>
<p><strong>ทำไมต้องเทสต์ตลอด?</strong></p>
<p>หลายๆ คนพูดถึงเรื่อง Test Driven Development แล้วยังมีโปรแกรมเมอร์ที่มีประสบการณ์หลายๆ คน ที่ไม่ต้องการจะทำ TDD เพราะว่าคนเหล่านั้น ไม่ยอมเปิดรับการเปลี่ยนแปลงใหม่ๆและไม่ยอมที่จะเรียนรู้  คนกลุ่มนี้สร้างระบบและจัดการในเรื่องการ maintain code เขาอาจจะเขียน code เป็นเดือน หรือแม้แต่เป็นปี code ที่เขียนนั้นได้รับการทดสอบเต็มรูปแบบจึงมั่นใจในความแข็งแกร่ง ทำไมยังจะต้องเขียน unit test?</p>
<p>โปรแกรมเมอร์รุ่นใหม่ไม่รู้ว่าจะเริ่มต้นกับเทสต์อย่างไร พวกเขาเขียน code แล้วจึงเขียนเทสต์ แล้วจึงพบกับความท้อแท้ เพราะว่าต้องเขียน code วนซ้ำไปซ้ำมาถึงสองครั้ง เพื่อที่จะพบกับผลลัพท์ที่แทบจะเอาตัวไม่รอด</p>
<p>เรื่องทั้งคู่เป็นเรื่องน่าเศร้าที่เราจะพบเห็นได้บ่อยๆ เพราะมีบางสิ่งที่ TDD ได้มอบให้โปรแกรมเมอร์และองค์กรนั้นคือ :</p>
<ul>
<li>การรับประกันคุณภาพที่มีประสิทธิภาพมากขึ้น เพราะว่า QA Engineer และ Tester ไม่ต้องมานั่งตรวจสอบฟังชั่นการทำงาน, แล้วมันให้ code ที่ดีกว่าเหรอ? หมายความว่ายังไงกันแน่? หมายความว่าต่างคนก็ต่างทำงานใขขอบเขตของตน นั่นสร้างประโยชน์โดยรวมแก่บริษัททั้งหมด ถ้าโค้ดพื้นฐานและฟังชั่นทั้งหมด สามารถเทสต์ได้โดยอัตโนมัต QA ก็สามารถที่จะใช้เวลาเพิ่มขึ้นในการค้นหาบักที่ไม่ชัดเจน และแก้ไขมันเสีย ก่อนที่มันจะทำลายโปรแกรมทั้งหมด.</li>
<li>การประสานงานในองค์กรดีขึ้น TDD สร้างความไว้เนื้อเชื่อใจในองค์กรทั้งหมด โปรแกรมเมอร์ต้องการความเชื่อใจในความสามารถและทักษะ เมื่อทุกคนในองค์กรใช้ TDD นั่นหมายความว่าโค้ดที่มากจากคนอื่นๆในองค์กรจะต้องทำงานได้ถูกต้อง นั่นไม่ได้เพียงแค่สร้างความเชื่อใจระหว่างโปรแกรมเมอร์ แต่ยังรวมถึงส่วนอื่นๆในองค์กร เช่นฝ่ายการตลาด Business resource รวมไปถึง QA</li>
<li>ความเป็นมืออาชีพ คำว่า<strong>โปร</strong> ไม่ได้หมายความเพียงแค่เขียนโค้ดนับพันบรรทัดในวันเดียว แต่หมายถึงการเขียนโค้ดที่มีประสิทธิภาพ ง่ายต่อการบำรุงรักษา ง่ายต่อการ config หมายถึงโค้ดที่ &#8220;ทำงานได้&#8221; ตลอดเวลา ไม่ใช้แค่ทำงานได้ แต่ต้องผ่านการเทสต์และมีเอกสารที่ดีด้วย</li>
<li>สร้างแรงกดดันเพื่อน &#8220;ทำสิ่งที่ถูกต้อง&#8221; เมื่อสมาชิกในทีมรวมไปถึงหัวหน้าทีมใช้งาน TDD ดูแลโค้ดของตัวเองให้มีประสิทธิภาพ มันจะสร้างแรงกระตุ้นต่อองค์กรโดยรวม ให้เกิดสภาพแวดล้อมที่ดีต่อการฝึกฝน</li>
</ul>
<p>Test Driven Development ภายไต้ unit test จะสร้างซอฟต์แวร์ที่มีประสิทธิภาพ และสามารถทำงานได้อย่างดี บทความอันนี้จะอธิบายถึงวิธีการพัฒนาโปรแกรมที่ซับซ้อนอย่าง Bank Routing Number (ABN) validation class</p>
<p><strong>Create the Project and Application</strong></p>
<p>อย่างแรกที่จะทำคือสร้าง Application ชื่อ</p>
<p>valid_lib</p>
<p>โดยกำหนดให้เป็น Service platform ที่อนุญาติให้ข้อมูลทางการเงินอันสลับซับซ้อนสามารถ validate ผ่าน ReSTful interface. ในตอนนี้เรายังไม่ต้องกังวลเกี่ยวกับ Service หรือ Business model เพียงแค่คิดเรื่องเกี่ยวกับการคำรวนและ validation algorithm ก็พอ ตอนนี้เริ่มจากสร้างแอปก่อน</p>
<p>./manage.py startapp finvs</p>
<p>และเพิ่ม finvs ลงไปบน INSTALL_APP ในไฟล์ settings.py สร้างโฟลเดอร์ชื่อ util ลงในโฟลเดอร์ finvs อีกทีนึงอย่างในรูป</p>
<p><img class="aligncenter" title="รูปที่ 1" src="http://gurovich.com/site/wp-content/uploads/2010/03/fig1.png" alt="" width="194" height="222" /></p>
<p>ลองดูที่ไฟล์ test.py ในโฟลเดอร์ชื่อ finvs เราจะเริ่มจากตรงนั้น Django ได้สร้าง unit test ไฟล์ไว้ให้เราแล้ว</p>
<p><strong>ABN Validation </strong></p>
<p>ABA (American Banker’s Association) routing numbers (ABNs) ใช้สำหรับระบุสถาบันการเงินตอนที่สร้าง transaction ตัวเลขนี้จำเป็นต้องใช้เวลาที่จะโอนเงินผ่านธนาคารโดยตรง บริการจ่ายเงินอัตโนมัต หรือเมื่อเราต้องการจะจ่ายเงินเผ่านโทรศัพท์ ระบบออนไลน์เป็นต้น</p>
<p>เลขเหล่านี้มีความหมายต่างๆดันไป และยังรวมถึง checksum digit เพื่อที่จะสามารถตรวจสอบได้ว่าเลขที่ให้มานั้นถูกต้องหรือไม่</p>
<p>Algorithm จะตรวจสอบดังนี้ 3(d1+d4+d7)+7(d2+d5+d8)+(d3+d6+d9) mod 10 = 0 แบบนี้</p>
<pre class="python">import unittest
#from django.test import TestCase

#Here are some bank numbers that we can run tests against...
SHORT_BAD_ABN_NUM = 1000012
LONG_BAD_ABN_NUM = 255073345999
BAD_ABN_NUM = 255073545
GOOD_ABN_NUM = 255073345

class ValidatorsTestCase(unittest.TestCase):

    def setUp(self):
        self.value = GOOD_ABN_NUM

    def testAbnAlgorythm(self):
        """Tests the algorythm with a known good bank number.
           This test is here to create the algorythm to be used
             in the validator implementation.  When it's right,
             cut and paste it into the validator class.

           The algorithm checks the first second and third number
            and adds them together, then iterates through every
            three numbers (total of 9) to return a value.

           If the resulting sum is an even multiple of ten
            (but not zero), the ABA routing number is good.
           """
        n=0
        bank_str = str(GOOD_ABN_NUM)
        num_length = len(bank_str)
        if (num_length ==9):
            for j in range(0,num_length,3):
                t = int(bank_str[j])
                ti = int(bank_str[j + 1])
                tii = int(bank_str[j + 2])
                n += (t * 3)+ (ti * 7)+ tii
            self.assertTrue((n != 0) &amp; ((n % 10) == 0))
</pre>
<p>หลังจากนั้นก็รันเทสต์</p>
<pre class="shell">python manage.py test finvs.ValidatorsTestCase</pre>
<p>น่าจะได้ผลลัพท์อย่างนี้</p>
<pre class="bash">$ python manage.py test finvs.ValidatorsTestCase
Creating test database...
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
Installing index for auth.Permission model
Installing index for auth.Message model
True
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Destroying test database...
</pre>
<p>ระหว่างที่กำลังรันเทสต์นั้น Django จะสร้างและลบ Test Database ให้โดยอัตโนมัต แจ่มใหม?  แต่จริงๆแล้วเราจะยังไม่ได้ใช้โค้ดชุดนี้ เราจะสร้าง Production code ต่างหาก แต่เมื่อดูตัวเทสต์ จะพบว่านี่คือพื้นฐานของการ implement ระบบจริงๆ</p>
<p>ครั้งหน้าเราจะมาต่อที่การ implement จริงๆกัน</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2010/11/09/test-driven-development-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-django-unit-testing-%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%97%e0%b8%b5%e0%b9%88-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Barcamp Bankhen Live</title>
		<link>http://www.kowito.com/2010/11/01/barcamp-bankhen-live/</link>
		<comments>http://www.kowito.com/2010/11/01/barcamp-bankhen-live/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 15:56:39 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Barcamp]]></category>

		<guid isPermaLink="false">http://www.kowito.com/?p=139</guid>
		<description><![CDATA[นั่งฟังเรื่องแรก Atom Server ของอาจารย์ภุชงค์ Intro เสียเกินครึ่ง แต่ก็ได้รู้เรื่องประวัติศาสตร์เสียมาก พูดเรื่อง Super Computer ที่เมืองจีน โดยพัฒนาโดยวิศวะกรของจีนเอง และยังพูดถึงเรื่อง CUDA ของ Nvidia ที่เปลี่ยนเรื่อง Program Design ไปเลย และ OpenCL ของ Apple ที่นำความสามารถของ GPU มาใช้ประมวลผล ใช้มือถือสร้าง Super Computer เนื่องจาก Balance ของ Power กับ Performance ได้ดีที่สุด แนวทางการโปรแกรมมิ่งแบบ Message Driven หลังจากนั้นมาพูดเรื่อง Blueprint CSS พูดไม่ได้เร็วเท่าไร แต่ไม่มีเรื่องจะพูดซะงั้น lol หลังจากนั้นมาได้เข้ามานั่งฟังเรื่อง Open Source Enterprises พูดเรื่องการ implement open source ค่าใช้จ่ายต่างๆ [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2010/11/01/barcamp-bankhen-live/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p>นั่งฟังเรื่องแรก Atom Server ของอาจารย์ภุชงค์ Intro เสียเกินครึ่ง แต่ก็ได้รู้เรื่องประวัติศาสตร์เสียมาก พูดเรื่อง Super Computer ที่เมืองจีน โดยพัฒนาโดยวิศวะกรของจีนเอง และยังพูดถึงเรื่อง CUDA ของ Nvidia ที่เปลี่ยนเรื่อง Program Design ไปเลย และ OpenCL  ของ Apple ที่นำความสามารถของ GPU มาใช้ประมวลผล ใช้มือถือสร้าง Super Computer เนื่องจาก Balance ของ Power กับ Performance ได้ดีที่สุด แนวทางการโปรแกรมมิ่งแบบ Message Driven</p>
<p>หลังจากนั้นมาพูดเรื่อง Blueprint CSS พูดไม่ได้เร็วเท่าไร แต่ไม่มีเรื่องจะพูดซะงั้น lol </p>
<p>หลังจากนั้นมาได้เข้ามานั่งฟังเรื่อง Open Source Enterprises พูดเรื่องการ implement open source ค่าใช้จ่ายต่างๆ  Commercial Software เกือบทั้งหมด จะมีชิ้นส่วนของ Open Source หัวข้อค่อนข้างยาว ง่วงนอนมาก</p>
<p>หัวข้อสุดท้ายมาฟังเรื่อง ใครว่าไมโครซอฟท์ใจร้ายโดยอาจารย์ศุภเดชและพี่หลาม งานนี้เพิ่งรู้ว่ามีของฟรีให้ใช้เยอะขนาดนี้ ไม่มาไม่รู้จริงๆ </p>
<p>ระหว่างวันได้เจอกับ <a href="http://iannnnn.com/">iannnn</a> ตัวเป็นๆ ไม่กล้าบอกว่าคุณคือไอดอลของผม จุ๊ฟๆ lol นอกจากนี้ยังมีพี่อึ่งที่เดินวนไปวนมา เจอกันทั้งวัน พี่อึ่งเล่าให้ฟังเรื่องรับอบรมติดตั้งระบบ Ubuntu หวังว่าสักวันคงจะได้ทำแบบนั้นมั่ง หาอิสระเสรีให้ชีวิต</p>
<p>ตัดจบดื้อๆ เขียนต่อไม่ออก.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2010/11/01/barcamp-bankhen-live/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>เร็วๆสุดๆ เพิ่มพลัง Website</title>
		<link>http://www.kowito.com/2010/10/06/%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b9%86%e0%b8%aa%e0%b8%b8%e0%b8%94%e0%b9%86-%e0%b9%80%e0%b8%9e%e0%b8%b4%e0%b9%88%e0%b8%a1%e0%b8%9e%e0%b8%a5%e0%b8%b1%e0%b8%87-website/</link>
		<comments>http://www.kowito.com/2010/10/06/%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b9%86%e0%b8%aa%e0%b8%b8%e0%b8%94%e0%b9%86-%e0%b9%80%e0%b8%9e%e0%b8%b4%e0%b9%88%e0%b8%a1%e0%b8%9e%e0%b8%a5%e0%b8%b1%e0%b8%87-website/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 01:09:42 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Website Optimizer]]></category>

		<guid isPermaLink="false">http://www.kowito.com/?p=137</guid>
		<description><![CDATA[ไปอ่านเรื่อง Page Speed Analysis: Search Engine Roundtable จากเว็บของ Sajal มาบันทึกไว้กันลืม เรื่องทำอย่างไนจะ Optimize หน้าเว็บให้สุดได้ http://www.webpagetest.org/]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2010/10/06/%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b9%86%e0%b8%aa%e0%b8%b8%e0%b8%94%e0%b9%86-%e0%b9%80%e0%b8%9e%e0%b8%b4%e0%b9%88%e0%b8%a1%e0%b8%9e%e0%b8%a5%e0%b8%b1%e0%b8%87-website/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p>ไปอ่านเรื่อง <a href="http://www.sajalkayan.com/page-speed-analysis-search-engine-roundtable.html">Page Speed Analysis: Search Engine Roundtable</a> จากเว็บของ Sajal มาบันทึกไว้กันลืม เรื่องทำอย่างไนจะ Optimize หน้าเว็บให้สุดได้</p>
<p>http://www.webpagetest.org/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2010/10/06/%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b9%86%e0%b8%aa%e0%b8%b8%e0%b8%94%e0%b9%86-%e0%b9%80%e0%b8%9e%e0%b8%b4%e0%b9%88%e0%b8%a1%e0%b8%9e%e0%b8%a5%e0%b8%b1%e0%b8%87-website/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CodeAndroid</title>
		<link>http://www.kowito.com/2009/11/29/codeandroid/</link>
		<comments>http://www.kowito.com/2009/11/29/codeandroid/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 06:42:43 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[HTC]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile Phone]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.kowito.com/?p=116</guid>
		<description><![CDATA[Entry แรกหลังจากกู้ Server กลับมาได้จากอาการ &#8220;โคอาล่าเป็นพิษ&#8221; หลังจากไป meeting ที่ SIS  มาได้ข้อสรุบว่า HTC ต้องการให้เหล่า Developer สร้าง App สำหรับคนไทยขึ้นมา เพื่อขยายฐานผู้ใช้ Android ในเมืองไทย ส่งผลต่อเนื่องถึงยอดขายของ HTC ในทางอ้อม หากมองในตอนนี้เห็นได้ชัดว่า  Android ไม่ได้เปรี้ยงปร้างเท่าที่ควรจะเป็น ส่วนหนึ่งคงเป็นเพราะมันไม่หล่อเหมือน  iPhone อันนี้เรื่องจริงต้องยอมรับ แต่ในระยะยาวก็ไม่แน่ เพราะ Android Open source และยังมี Google หนุนหลังเต็มที่ สำหรับตัวผมแล้วติดว่า โทรศัพท์ที่ใช้ Android ส่วนใหญ่ราคาไกล้เคียงกับ iPhone แต่ความสามารถนั้นสู้ไม่ได้ อย่างน้อยก็มัลติทัช แล้วก็เอฟเฟกต์วิ้งๆทั้งหลายแหล่ จะมีดีกว่าก็เพียงแต่มันไม่ยุ่งยาก จุกจิกกวนใจเหมือน iPhone ทำอะไรนิดอะไรหน่อยก็หมดประกัน ถ้า HTC Magic ราคาลงมาสัก 5000 อย่างนี้จะเลือกง่ายขึ้นเยอะ ด้าน [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2009/11/29/codeandroid/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p>Entry แรกหลังจากกู้ Server กลับมาได้จากอาการ &#8220;โคอาล่าเป็นพิษ&#8221;</p>
<p>หลังจากไป meeting ที่ SIS  มาได้ข้อสรุบว่า HTC ต้องการให้เหล่า Developer สร้าง App สำหรับคนไทยขึ้นมา เพื่อขยายฐานผู้ใช้ Android ในเมืองไทย ส่งผลต่อเนื่องถึงยอดขายของ HTC ในทางอ้อม</p>
<p>หากมองในตอนนี้เห็นได้ชัดว่า  Android ไม่ได้เปรี้ยงปร้างเท่าที่ควรจะเป็น ส่วนหนึ่งคงเป็นเพราะมันไม่หล่อเหมือน  iPhone อันนี้เรื่องจริงต้องยอมรับ แต่ในระยะยาวก็ไม่แน่ เพราะ Android Open source และยังมี Google หนุนหลังเต็มที่</p>
<p>สำหรับตัวผมแล้วติดว่า โทรศัพท์ที่ใช้ Android ส่วนใหญ่ราคาไกล้เคียงกับ iPhone แต่ความสามารถนั้นสู้ไม่ได้ อย่างน้อยก็มัลติทัช แล้วก็เอฟเฟกต์วิ้งๆทั้งหลายแหล่ จะมีดีกว่าก็เพียงแต่มันไม่ยุ่งยาก จุกจิกกวนใจเหมือน iPhone ทำอะไรนิดอะไรหน่อยก็หมดประกัน ถ้า HTC Magic ราคาลงมาสัก 5000 อย่างนี้จะเลือกง่ายขึ้นเยอะ</p>
<p>ด้าน Developer อันนี้ชัดเชน Android มาพร้อม Java ของดีที่ผมไม่เคยชอบ 8-( แต่ยังพอมีทาง ตอนนี้ผมมองไปที่ <a style="text-decoration: none; color: #000000;" href="http://code.google.com/p/android-scripting/">android-scripting</a> หวังว่ามันจะใช้ Python ได้เข้าท่า ตอนนี้ขอเวลาไปลองก่อน ได้ผลยังไงจะมารายงาน</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2009/11/29/codeandroid/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ติดตั้ง Postgres ลงบน Ubuntu 9.04 อย่างง่ายและรวดเร็ว</title>
		<link>http://www.kowito.com/2009/10/17/%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-postgres-%e0%b8%a5%e0%b8%87%e0%b8%9a%e0%b8%99-ubuntu-9-04-%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b8%87%e0%b9%88%e0%b8%b2/</link>
		<comments>http://www.kowito.com/2009/10/17/%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-postgres-%e0%b8%a5%e0%b8%87%e0%b8%9a%e0%b8%99-ubuntu-9-04-%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b8%87%e0%b9%88%e0%b8%b2/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 18:34:46 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[postgres]]></category>

		<guid isPermaLink="false">http://www.kowito.com/2009/10/17/%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-postgres-%e0%b8%a5%e0%b8%87%e0%b8%9a%e0%b8%99-ubuntu-9-04-%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b8%87%e0%b9%88%e0%b8%b2/</guid>
		<description><![CDATA[ผมมีปัญหากับการติดตั้ง postgres มาตลอด เมื่อเปรียบเทียบกับ mysql แล้วพบว่ายุ่งยากมาก ลองใช้วิธีต่อไปนี้ทำให้ติดตั้ง postgres ภายในสามนาที!! sudo apt-get install postgresql pgadmin3 python-psycopg2 หลังจากรอขั้นตอนการติดตั้งจนเสร็จเรียบร้อยแล้วให้ตั้งรหัสผ่านให้กับ user postgres เพื่อไปติดตั้งส่วนอื่นๆต่อไปดังนี้ sudo -u postgres psql postgres=# password postgres postgres=# q ได้รหัสผ่านของ user postgres แล้ว!! อย่าลืมแก้ไฟล์ sudo nano /etc/postgresql/8.3/main/pg_hba.conf ตรงบรรทัด # "local" is for Unix domain socket connections only local all all ident sameuser # IPv4 local connections: [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2009/10/17/%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-postgres-%e0%b8%a5%e0%b8%87%e0%b8%9a%e0%b8%99-ubuntu-9-04-%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b8%87%e0%b9%88%e0%b8%b2/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p>ผมมีปัญหากับการติดตั้ง postgres มาตลอด เมื่อเปรียบเทียบกับ mysql แล้วพบว่ายุ่งยากมาก ลองใช้วิธีต่อไปนี้ทำให้ติดตั้ง postgres ภายในสามนาที!!</p>
<pre class="shell">sudo apt-get install postgresql pgadmin3 python-psycopg2</pre>
<p>หลังจากรอขั้นตอนการติดตั้งจนเสร็จเรียบร้อยแล้วให้ตั้งรหัสผ่านให้กับ user postgres เพื่อไปติดตั้งส่วนอื่นๆต่อไปดังนี้</p>
<pre class="shell">
sudo -u postgres psql

postgres=# password postgres
postgres=# q
</pre>
<p>ได้รหัสผ่านของ user postgres แล้ว!!<br />
อย่าลืมแก้ไฟล์ sudo nano /etc/postgresql/8.3/main/pg_hba.conf ตรงบรรทัด</p>
<pre>
# "local" is for Unix domain socket connections only
local   all         all                               ident sameuser
# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
host    all         all         ::1/128               md5
</pre>
<p>เป็น</p>
<pre>
# "local" is for Unix domain socket connections only
local   all         all                               md5
# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
host    all         all         ::1/128               md5
</pre>
<p>เมื่อได้รหัสผ่านก็สามารถ login ผ่าน pgadmin ได้แล้ว เร็วใหม?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2009/10/17/%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-postgres-%e0%b8%a5%e0%b8%87%e0%b8%9a%e0%b8%99-ubuntu-9-04-%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b8%87%e0%b9%88%e0%b8%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Django template language</title>
		<link>http://www.kowito.com/2009/07/31/the-django-template-language/</link>
		<comments>http://www.kowito.com/2009/07/31/the-django-template-language/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 17:58:21 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[DJango Template]]></category>
		<category><![CDATA[Template]]></category>

		<guid isPermaLink="false">http://www.kowito.com/?p=83</guid>
		<description><![CDATA[เกี่ยวกับเอกสารนี้ เอกสารนี้อธิบายรายละเอียดเกี่ยวกับไวยากรณ์ของ Django Template . หรือมีข้อสงสัยหรือปัญหาการใช้งาน โปรดอ่าน The Django template language: For Python programmers. Django template นั้นออกแบบมาอย่างสมดุลระหว่างความสามารถและความง่ายดาย. มันถูกออกแบบมาให้สามารถทำงานกับ HTML ได้สะดวก นั่นรวมถึง Text-Based อื่นๆด้วย. หลักการ ถ้าคุณเคยมีพื้นฐานการเขียนโปรแกรมที่ฝังโค้ดใน HTML แล้ว คุณจะรู้สึกเหมือนได้กลับบ้านอีกครั้ง การใช้ Django template จะเป็นอะไรที่ง่ายดาย แต่ถ้าหากคุณหวังว่าจะเห็นโค้ด Python ใน Django template แล้ว ต้องขอแสดงความเสียใจที่ทำให้ผิดหวัง The Django template มีฟังชั่นเหมือนกับภาษาโปรแกรมทั่วไป มี if tags เพื่อตรวจสอบเงื่อนไข มี for loop เอาไว้วนให้ปวดหัวเล่น Django template จะรันเพียง template [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2009/07/31/the-django-template-language/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><blockquote>
<h4>เกี่ยวกับเอกสารนี้</h4>
<p>เอกสารนี้อธิบายรายละเอียดเกี่ยวกับไวยากรณ์ของ Django Template . หรือมีข้อสงสัยหรือปัญหาการใช้งาน โปรดอ่าน <a href="http://docs.djangoproject.com/en/dev/ref/templates/api/#ref-templates-api">The Django template language: For Python programmers.</a></p></blockquote>
<p>Django template นั้นออกแบบมาอย่างสมดุลระหว่างความสามารถและความง่ายดาย. มันถูกออกแบบมาให้สามารถทำงานกับ HTML ได้สะดวก นั่นรวมถึง Text-Based อื่นๆด้วย.</p>
<blockquote>
<h4>หลักการ</h4>
<p>ถ้าคุณเคยมีพื้นฐานการเขียนโปรแกรมที่ฝังโค้ดใน HTML แล้ว คุณจะรู้สึกเหมือนได้กลับบ้านอีกครั้ง การใช้ Django template จะเป็นอะไรที่ง่ายดาย แต่ถ้าหากคุณหวังว่าจะเห็นโค้ด Python ใน Django template แล้ว ต้องขอแสดงความเสียใจที่ทำให้ผิดหวัง<br />
The Django template มีฟังชั่นเหมือนกับภาษาโปรแกรมทั่วไป มี if tags เพื่อตรวจสอบเงื่อนไข มี for loop เอาไว้วนให้ปวดหัวเล่น Django template จะรันเพียง template tag และจะไม่รัน Python code โดยเด็ดขาด</p></blockquote>
<p><span id="more-83"></span></p>
<h3>Templates</h3>
<p>Template เป็นเพียงไฟล์ text  สามารถสร้างในรูปแบบใดก็ได้ (HTML, XML, CSV, etc.).<br />
มันจะประกอปด้วย ตัวแปร, ที่จะถูกแทนที่เมื่อ template ถูกสร้างขึ้นมา และยังมี tags ที่ทำหน้าที่ควบคุม.<br />
ข้างล่างนี่คือตัวอย่างง่ายๆ</p>
<pre name="code" class="python">
{% extends "base_generic.html" %}
{% block title %}{{ section.title }}{% endblock %}
{% block content %}
&lt;h1&gt;{{ section.title }}&lt;/h1&gt;
{% for story in story_list %}
&lt;h2&gt;
&lt;a href="{{ story.get_absolute_url }}"&gt;
{{ story.headline|upper }}
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;{{ story.tease|truncatewords:"100" }}&lt;/p&gt;
{% endfor %}
{% endblock %}
</pre>
<h3>Variables</h3>
<p>ตัวแปรจะมีหน้าตาประมาณนี้: {{ variable }}. เมื่อ template เจอตัวแปรนี้ จะแทนที่ตัวแปรด้วยค่าที่ได้รับมา ใช้จุดคั่นตัวแปร (.) เพื่อเข้าถึงแอททริบิวต์ในตัวแปร ยกตัวอย่างเช่น, {{ section.title }} จะถูกแทนที่ด้วยค่า title ซึ่งเป็นแอททริบิวต์ของออปเจ็กต์ section.<br />
ถ้าไม่ได้กำหนดค่าให้ หรือไม่พบตัวแปร มันจะถูกแทนที่ด้วย EMPLATE_STRING_IF_INVALID ซึ่งโดยปกติจะเป็น &#8221; (สตริงว่าง) โดยปริยาย.</p>
<h3>Filters</h3>
<p>คุณสามารถแก้ไขตัวแปรสำหรับการแสดงผลโดยการใช้ ตัวกรอง. Filters จะมีหน้าตาแบบนี้: {{ name|lower }} จะแสดงค่าของ name เป็นตัวอักษรแบบพิมพ์เล็ก ฟิลเตอร์สามารถรวมกันหลายๆอันได้แบบนี้. {{ text|escape|linebreaks }} ฟิลเตอร์นี้จะแปลง text เป็น escape character แล้วค่อยใส่ &lt;p&gt; tags เข้าไปภายหลัง. ฟิลเตอร์บางตัวจะมีอาร์กิวเมนต์</p>
<p>เช่น : {{ bio|truncatewords:30 }}. อันนี้จะแสดง 30 ตัวอักษรแรกของ bio เป็นต้น</p>
<p>ฟิลเตอร์ที่ถายในมีช่องว่างต้องเติมลูกน้ำ(”); ตัวอย่างเช่น {{ list|join:&#8221;, &#8221; }}.<br />
default<br />
ฟิลเตอร์นี้จะแสดงค่าปริยายที่เรากำหนด หากตัวแปรไม่มีค่า<br />
เช่น:<br />
{{ value|default:&#8221;nothing&#8221; }}<br />
ถ้า value ไม่มีค่าอะไรจะแสดง &#8220;nothing&#8221;.<br />
length<br />
จะแสดงความยาวของตัวแปร ใช้ได้ทั้ง list และ string ;<br />
เช่น:<br />
{{ value|length }}<br />
ถ้า value เป็น ['a', 'b', 'c', 'd'], output จะเป็น 4.</p>
<h3>Tags</h3>
<p>Tags จะหน้าตาแบบนี้: {% tag %}. Tags จะซับซ้อนกว่าตัวแปรนิดนึง: tag บางอย่างจะสร้าง text outpu. Tag บางอย่างให้ควบคุมโปรแกรม tag ส่วนมากต้องมีจุดเริ่มต้นและจุดจบ (i.e. {% tag %} &#8230; tag contents &#8230; {% endtag %}).<br />
for<br />
tag นี้เอาไว้สร้าง loop ซึงแปลว่าloop ก็คือ loop ไม่รู้จะอธิบายยังไง &#8211; -” ดูตัวอย่างอาจจะหายงง<br />
athlete_list:<br />
&lt;ul&gt;<br />
{% for athlete in athlete_list %}<br />
&lt;li&gt;{{ athlete.name }}&lt;/li&gt;<br />
{% endfor %}<br />
&lt;/ul&gt;<br />
if and else<br />
อันนี้คือ if else ธรรมดามาก มีทุกภาษา แต่ Django จะทะลึ่งนิดนึง คือจะไม่เปรียบเทียบกับอะไรเลย จะตรวจที่ตัวแปรเลยว่ามีค่า &#8220;True” หรือเปล่า ถ้าไม่มีก็ข้ามไป **ระวัง ถ้า value มีอะไรอยู่ข้างใน tag  นี้จะมองเป็น &#8220;True” เสมอ ยกเว้นมันมีค่า &#8220;False” **<br />
{% if athlete_list %}<br />
Number of athletes: {{ athlete_list|length }}<br />
{% else %}<br />
No athletes.<br />
{% endif %}<br />
จากตัวอย่างข้างบน , ถ้า athlete_list ไม่ว่างหรือไม่ใช่ “False ” จะแสดง {{ athlete_list|length }}.<br />
ifequal และ ifnotequal<br />
แสดงบางอย่างถ้าอากิวเมนต์ทั้งสองตัวเท่ากัน.<br />
ลองดูตัวอย่าง:<br />
{% ifequal athlete.name coach.name %}<br />
&#8230;<br />
{% endifequal %}<br />
หรือ:<br />
{% ifnotequal athlete.name &#8220;Joe&#8221; %}<br />
&#8230;<br />
{% endifnotequal %}<br />
block และ extends<br />
สร้าง template inheritance (อ่านด้านล่าง), ช่วยให้งานง่ายขึ้นเยอะ เราสามารถแบ่ง template เป็นชิ้นย่อยๆได้.</p>
<h3>Comments</h3>
<p>คอมเม้นในโปรแกรม คงไม่ต้องอธิบายกันให้มากความ: {# #}.<br />
ตัวอย่าง, template  นี้จะแสดง &#8216;hello&#8217;:<br />
{# greeting #}hello<br />
น่าเสียดายว่ามันใช้ได้บรรทัดเดียว หากขี้เกียจกดหลายทีให้ใช้ {% comment %} และ {% endcomment %}</p>
<h3>Template inheritance</h3>
<p>ไม่ต้องประหลาดใจว่า &#8220;เทมเพลตมรดก” (ลองดู google translate แล้วจะพบว่ามีฮากว่านี้) คืออะไร มันคือการสืบทอดคุณสมบัติของเทมเพลต มันสามารถช่วยจัดการสร้างโครงสร้างของหน้าเว็บ ด้วยการใช้ tag {%block name%}&#8230;{%endblock%} คุณมาสามารถเพิ่มเติมอะไรก็ได้ตรงกลางระหว่าง block<br />
เพื่อให้ง่ายต่อการเข้าใจเทมเพลทมรดกโดยเริ่มต้นด้วยตัวอย่าง:<br />
&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221;<br />
&#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;&gt;<br />
&lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221; xml:lang=&#8221;en&#8221; lang=&#8221;en&#8221;&gt;<br />
&lt;head&gt;<br />
&lt;link rel=&#8221;stylesheet&#8221; href=&#8221;style.css&#8221; /&gt;<br />
&lt;title&gt;{% block title %}My amazing site{% endblock %}&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;div id=&#8221;sidebar&#8221;&gt;<br />
{% block sidebar %}<br />
&lt;ul&gt;<br />
&lt;li&gt;&lt;a href=&#8221;/&#8221;&gt;Home&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href=&#8221;/blog/&#8221;&gt;Blog&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;<br />
{% endblock %}<br />
&lt;/div&gt;<br />
&lt;div id=&#8221;content&#8221;&gt;<br />
{% block content %}{% endblock %}<br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
เราสร้าง template นี้โดยใช้ชื่อว่า base.html, เป็นโครงร่าง HTML ง่ายๆ แล้วเราค่อยสร้าง template&#8217;s ต่อมาโดยการสืบทอด template&#8217;s นี้<br />
ในตัวอย่างนี้, {% block %} กำหนด block ของ child template&#8217;s ไว้สามอัน เราสามารถเพิ่มเติมได้โดยยังคงโครงสร้างของ template เดิมไว้<br />
child template อาจจะหน้าตาแบบนี้:<br />
{% extends &#8220;base.html&#8221; %}<br />
{% block title %}My amazing blog{% endblock %}<br />
{% block content %}<br />
{% for entry in blog_entries %}<br />
&lt;h2&gt;{{ entry.title }}&lt;/h2&gt;<br />
&lt;p&gt;{{ entry.body }}&lt;/p&gt;<br />
{% endfor %}<br />
{% endblock %}<br />
{% extends %} tag คือกุญแจไปสู้ห้องแห่งความลับ. แฮรี่ พอตเตอร์บอกว่าเราสารถใช้ {% extends %} เพื่อสืบทอดทุก template ได้ มหัศจรรย์จริงๆ!! เคราเมอร์ลินเป็นพยาน<br />
สังเกต {% block %} tags ใน base.html and ให้ดีๆ มันจะถูกแทนที่ด้วยข้อมูลใน child template. output ออกมาหน้าตาประมาณนี้:<br />
&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221;<br />
&#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;&gt;<br />
&lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221; xml:lang=&#8221;en&#8221; lang=&#8221;en&#8221;&gt;<br />
&lt;head&gt;<br />
&lt;link rel=&#8221;stylesheet&#8221; href=&#8221;style.css&#8221; /&gt;<br />
&lt;title&gt;My amazing blog&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;div id=&#8221;sidebar&#8221;&gt;<br />
&lt;ul&gt;<br />
&lt;li&gt;&lt;a href=&#8221;/&#8221;&gt;Home&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href=&#8221;/blog/&#8221;&gt;Blog&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;<br />
&lt;/div&gt;<br />
&lt;div id=&#8221;content&#8221;&gt;<br />
&lt;h2&gt;Entry one&lt;/h2&gt;<br />
&lt;p&gt;This is my first entry.&lt;/p&gt;<br />
&lt;h2&gt;Entry two&lt;/h2&gt;<br />
&lt;p&gt;This is my second entry.&lt;/p&gt;<br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
เราไม่ได้กำหนด sidebar block ใน child template ,ข้อมูลใน {% block %} tag จะใช้ค่าเดิมใน base.html<br />
เราสามารถสืบทอด template&#8217;s หลายๆชั้นเท่าที่ต้องการเช่น :<br />
สร้าง base.html เป็น templat  ที่เป็นหน้าตาหลักของ site<br />
สร้าง base_SECTIONNAME.html สำหรับทุกๆส่วนย่อย. เช่น, base_news.html, base_sports.html. โดยสืบทอดมาจาก base.html นั่นรวมถึง styles/design.<br />
สร้าง template&#8217;s ตามมาอย่างใจต้องการ news blog ect.<br />
สะดวกและง่ายดาย ประหยัดโค้ด.<br />
นี่เป็นเคล็ดลับเล็กๆน้อยๆในการสืบทอด template&#8217;s :<br />
ถ้าคุณใช้ {% extends %} มันจะต้องเป็น tag แรกใน template&#8217;s นั้น<br />
เราสามารใส่ {% block %} tags ใน base template เท่าไรก็ได้ และเรายังสามารถเพิ่มเติมมันใน child template&#8217;s ภายหลัง<br />
ถ้าเจอเนื้อหาซ้ำๆกัน, เป็นไปได้ว่าคุณย้ายมันไปไว้ใน parent template หรือเปล่า.<br />
เพื่อให้อ่านง่าย กำหนดชื่อใน {% endblock %} tag. เช่น:<br />
{% block content %}<br />
&#8230;<br />
{% endblock content %}<br />
ด้วยเทคนิคนี้ ทำให้มั่นใจได้ว่า {% block %} tags ถูกปิดเรียบร้อยแล้ว.<br />
สุดท้ายนี้, คุณไม่สามารถกำหนด {% block %} tags ที่มีชื่อเหมือนกันใน template&#8217;s เดียวกันได้เพราะนอกจากคุณจะงงแล้ว โปรแกรมก็จะงงด้วย.</p>
<h3>Automatic HTML escaping</h3>
<p>เวลาที่สร้าง HTML จาก templates, มันมีความเสียงที่จะพบตัวอักษรที่ส่งผลให้การแสดงผล HTML ผิดพลาด. ลองดูตัวอยางจากโค้ดด้านล่างนี้:<br />
Hello, {{ name }}.<br />
ดูเหมือนจะปลอดภัย แต่จะเกิดอะไรขึ้นถ้า user กรอกข้อมูลต่อไปนี้:<br />
&lt;script&gt;alert(&#8216;hello&#8217;)&lt;/script&gt;<br />
ด้วย username นี้ มันจะถูกเรนเดอร์เป็น:<br />
Hello, &lt;script&gt;alert(&#8216;hello&#8217;)&lt;/script&gt;<br />
&#8230;งานเข้า!! pop-up a JavaScript alert box!<br />
ต่อมา จะเป็นอย่างไรถ้า user ใช้ตัวอักษร &#8216;&lt;&#8217; อย่างนี้?<br />
&lt;b&gt;username<br />
template&#8217;s ก็จะออกมาแบบนี้ :<br />
Hello, &lt;b&gt;username<br />
&#8230;งานเข้าอีกแล้ว!! ซวยแล้ว ตัวหนาทั้งเว็บ!<br />
ไม่ดีแน่อย่างนี้ เพราะว่าผู้ไม่ประสงค์ดีบางคนอาจจะให้ช่องโหว่นี้ทำอันตรายต่อระบบได้. นี่เป็นช่องโหว่ของระบบรักษาความปลอดภัยที่เรียกว่าการโจมตีแบบ  Cross Site Scripting (XSS) .<br />
เพื่อแก้ปัญหานี้ เรามีอยู่สองทางเลือก:<br />
อย่างแรก คุณสามารถมั่นใจว่าจะมาสารถแสดงผลข้อมูลเหล่านี้ด้วย escape filter (อ่านด้านล่าง), ด้วยวิธีนี้ คุณสามารถมั่นใจว่าข้อมูลทุกอย่างที่แสดงผล ถูกแปลงไปเป็นข้อมูลที่ปลอดภัย<br />
หรืออีกวิธี, ใช้ความสามารถของ Django ให้เป็นประโยชน์ เราสามารถทำ auto-escaping<br />
โดยทั่วไปแล้ในDjango, ในทุกๆ template จะเปี่ยนให้โดยอัตโนมัติ เช่น:<br />
&lt; เปลี่ยนเป็น &amp;lt;<br />
&gt; เปลี่ยนเป็น &amp;gt;<br />
&#8216; (single quote) เปลี่ยนเป็น &amp;#39;<br />
&#8221; (double quote) เปลี่ยนเป็น &amp;quot;<br />
&amp; เปลี่ยนเป็น &amp;amp;<br />
ย้ำอีกครั้ง, auto-escaping เป็นไปโดยอัตโนมัติ เมื่อคุณเลือก Django คุณจะได้รับการปกป้อง.</p>
<h4>แล้วจะปิดยังไง</h4>
<p>ถ้าคุณไม่ต้องการใช้งาน  auto-escaped ทั้ง site บาง template หรือตัวแปรบางตัว คุณมาสามารถเลือกปิดได้ตามใจ<br />
ทำไมถึงอยากจะปิดล่ะ? เพราะบางบางที คุณอาจจะต้องการเรนเดอร์ HTML โค้ด,ในกรณีนี้ คุณคงไม่ต้องการ escaped charector. ยกตัวอย่างเช่น บางทีคุณเก็น blob ของ HTML ในฐานข้อมูล และต้องการแสดงผลข้อูลนั้นลงบน template&#8217;s  โดยตรง. หรือบางทีคุณอาจจะใช้ Django&#8217;s template จัดการ text ที่ไม่ใช่ HTML – อย่างเชน e-mail<br />
<strong>สำหรับตัวแปรเป็นตัวๆไป<br />
</strong>เพื่อยกเลิก auto-escaping สำหรับตัวแปรแต่ละตัวโดยใช้ safe filter:<br />
อันนี้จะแปลงตัวอักษร: {{ data }}<br />
อันนี้จะไม่แปลงตัวอักษร: {{ data|safe }}<br />
ลองดูตัวอย่างง่ายๆ data มีค่าเป็น&#8217;&lt;b&gt;&#8217;:<br />
อันนี้จะแปลงตัวอักษร: &amp;lt;b&amp;gt;<br />
อันนี้จะไม่แปลงตัวอักษร: &lt;b&gt;<br />
<strong>สำหรับ template blocks</strong><br />
เพื่อจะควบคุม auto-escaping สำหรับ template, หมายถึงทั้ง template&#8217;s ใช้  autoescape tag, อย่างนี้:<br />
{% autoescape off %}<br />
Hello {{ name }}<br />
{% endautoescape %}<br />
autoescape tag สามารถเปลี่ยนแปลงได้โดยการเปลี่ยนค่า on หรือ off ในอาร์กิวเมนต์. ลองดูตัวอย่างนี้จะทำความเข้าใจได้ง่ายขึ้น:<br />
โดยปกติแล้ว Auto-escaping จะถูกตั้งค่าเป็น on. Hello {{ name }}<br />
{% autoescape off %}<br />
This will not be auto-escaped: {{ data }}.<br />
Nor this: {{ other_data }}<br />
{% autoescape on %}<br />
Auto-escaping applies again: {{ name }}<br />
{% endautoescape %}<br />
{% endautoescape %}<br />
auto-escaping tag จะทำงานทั้งหน้า รวมไปถึงส่วน include tag,ตัวอย่างเช่น:<br />
# base.html<br />
{% autoescape off %}<br />
&lt;h1&gt;{% block title %}{% endblock %}&lt;/h1&gt;<br />
{% block content %}<br />
{% endblock %}<br />
{% endautoescape %}<br />
# child.html<br />
{% extends &#8220;base.html&#8221; %}<br />
{% block title %}This &amp; that{% endblock %}<br />
{% block content %}{{ greeting }}{% endblock %}<br />
เพราะว่า auto-escaping ถูกปิดอยู่ในbase template, เพราะฉะนั้นมันจึงถูกปิดใน child template ด้วยเช่นเดียวกัน, ผลการรันHTML เมื่อตัวแปรgreeting เป็นอย่างนี้<br />
&lt;b&gt;Hello!&lt;/b&gt;:<br />
&lt;h1&gt;This &amp; that&lt;/h1&gt;<br />
&lt;b&gt;Hello!&lt;/b&gt;</p>
<h4>Notes</h4>
<p>โดยปกติแล้ว Designer ไม่ต้องสนใจส่วนนี้มากเท่าใดนัก ปล่อยให้เป็นงานของ Developer (ไอ้คนที่เขียนโค้ดบน Pythion นั่นแหละ)เป็นคนคิดว่าอะไรควรจัดการดีกว่า.</p>
<h4>String literals and automatic escaping</h4>
<p>บ่อยครั้งที่เราใช้อาร์กิวเมนต์ที่เป็น string ในฟิลเตอร์:<br />
{{ data|default:&#8221;This is a string literal.&#8221; }}<br />
ข้อมูลตรงนี้จะไม่ถูก autoescape.<br />
หมายความว่าควรเขียนอย่างนี้<br />
{{ data|default:&#8221;3 &amp;lt; 2&#8243; }}<br />
&#8230;ไม่ใช่<br />
{{ data|default:&#8221;3 &lt; 2&#8243; }}  &lt;&#8211; บัดซบ อย่าเขียนอย่างนี้เด็ดขาด.</p>
<h4>เรียบเรียงจาก</h4>
<p><a href="http://docs.djangoproject.com/en/dev/topics/templates/#topics-templates">The Django template language</a></p>
<p>แหล่งข้อมูลเพิ่มเติม<br />
<a href="http://www.django66.com/">Django66</a><br />
<a href="http://groups.google.co.th/group/pythai">PyThai google groups</a></p>
<p>This document is licensed under a Creative Commons Attribution-Non-Commercial-Share Alike 3.0 Unported License.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2009/07/31/the-django-template-language/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>จำนวนเฉพาะกับตะแกรงเอราทอสเทนีส</title>
		<link>http://www.kowito.com/2009/07/30/%e0%b8%88%e0%b8%b3%e0%b8%99%e0%b8%a7%e0%b8%99%e0%b9%80%e0%b8%89%e0%b8%9e%e0%b8%b2%e0%b8%b0%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b8%95%e0%b8%b0%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%87%e0%b9%80%e0%b8%ad%e0%b8%a3/</link>
		<comments>http://www.kowito.com/2009/07/30/%e0%b8%88%e0%b8%b3%e0%b8%99%e0%b8%a7%e0%b8%99%e0%b9%80%e0%b8%89%e0%b8%9e%e0%b8%b2%e0%b8%b0%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b8%95%e0%b8%b0%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%87%e0%b9%80%e0%b8%ad%e0%b8%a3/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 19:30:35 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.kowito.com/?p=75</guid>
		<description><![CDATA[ไปอ่านเจอมา เขียนไว้กันลืม def primes(n): """ primes(n) --> primes Return list of primes from 2 up to but not including n. Uses Sieve of Erasth. """ if n < 2: return [] nums = range(2,int(n)) p = [] while nums: new_prime = nums[0] p.append(new_prime) for i in nums[1:]: if i % new_prime == 0: nums.remove(i) nums.remove(nums[0]) [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2009/07/30/%e0%b8%88%e0%b8%b3%e0%b8%99%e0%b8%a7%e0%b8%99%e0%b9%80%e0%b8%89%e0%b8%9e%e0%b8%b2%e0%b8%b0%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b8%95%e0%b8%b0%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%87%e0%b9%80%e0%b8%ad%e0%b8%a3/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p>ไปอ่านเจอมา เขียนไว้กันลืม</p>
<pre name="code" class="python">
def primes(n):
"""
primes(n) --> primes

Return list of primes from 2 up to but not including n.
Uses Sieve of Erasth.
"""

    if n < 2:
        return []

    nums = range(2,int(n))
    p = []

    while nums:
        new_prime = nums[0]
        p.append(new_prime)

        for i in nums[1:]:
            if i % new_prime == 0:
                nums.remove(i)
        nums.remove(nums[0])

    return p
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2009/07/30/%e0%b8%88%e0%b8%b3%e0%b8%99%e0%b8%a7%e0%b8%99%e0%b9%80%e0%b8%89%e0%b8%9e%e0%b8%b2%e0%b8%b0%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b8%95%e0%b8%b0%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%87%e0%b9%80%e0%b8%ad%e0%b8%a3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

