<?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; Python</title>
	<atom:link href="http://www.kowito.com/category/programming/python-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>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>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>
		<item>
		<title>Django 1.1 ออกแล้ว</title>
		<link>http://www.kowito.com/2009/07/30/django-1-1-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7/</link>
		<comments>http://www.kowito.com/2009/07/30/django-1-1-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 18:41:07 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Localization]]></category>
		<category><![CDATA[Thai language]]></category>

		<guid isPermaLink="false">http://www.kowito.com/2009/07/30/django-1-1-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7/</guid>
		<description><![CDATA[หลังจากติดโรคเลื่อน ในที่สุด Django 1.1 หลังจากติดโรคเลื่อนจนผมถอดใจ ในที่สุด Django ก้ได้ปล่อย stable version ออกมาเสียทีเมื่อเช้านี้ โดยรวมๆแล้วมีการเปลี่ยนแปลงที่ชัดเจนคือหน้าตาของ AdminSite โดยเฉพาะ slugField ที่เพิ่มข้อมูลให้อัตโนมัติ ไม่ต้อมานั่งกรอกเองให้เมื่อยตุ้ม Aggregate ที่เมื่อก่อนทำไม่ได้ ในเวอร์ชั่นนี้สามารถทำได้แล้ว สามารถใช้อะไรอย่าง &#62;&#62;&#62; from django.db.models import Avg &#62;&#62;&#62; Book.objects.all().aggregate(Avg('price')) {'price__avg': 34.35} หล่อขึ้นเยอะมากเลยทีเดียว และอีกหลายๆอย่างที่ขี้เกียจเขียน อยากรู้ไปอ่านเองดีกว่าครับ ส่วนเรื่องภาษาไทยนั้น ผมได้ส่งฉบับล่าสุด โดยมีพี่เทพช่วยตรวจสอบให้ โดยพยายามให้เป็นไปในแนวทางเดียวกันกับ tl10n หลายๆจุดปรับปรุงให้ดีขึ้น ลดความกำกวมไปเยอะ โดยทาง Django ได้ปล่อย stable version หลังจากที่เพิ่มภาษาไทยเพียงสี่ชั่วโมง ฉิวเฉียด หวาดเสียวกันจนหยดสุดท้ายจริงๆ ยังไงก็ขอให้สนุกกับการพัฒนาโปรแกรมนะครับ]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2009/07/30/django-1-1-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p>หลังจากติดโรคเลื่อน ในที่สุด Django 1.1 หลังจากติดโรคเลื่อนจนผมถอดใจ ในที่สุด Django ก้ได้ปล่อย stable version ออกมาเสียทีเมื่อเช้านี้</p>
<p>โดยรวมๆแล้วมีการเปลี่ยนแปลงที่ชัดเจนคือหน้าตาของ AdminSite โดยเฉพาะ slugField ที่เพิ่มข้อมูลให้อัตโนมัติ ไม่ต้อมานั่งกรอกเองให้เมื่อยตุ้ม</p>
<p>Aggregate ที่เมื่อก่อนทำไม่ได้ ในเวอร์ชั่นนี้สามารถทำได้แล้ว สามารถใช้อะไรอย่าง</p>
<pre name="code" class="python">&gt;&gt;&gt; from django.db.models import Avg
&gt;&gt;&gt; Book.objects.all().aggregate(Avg('price'))
{'price__avg': 34.35}</pre>
<p>หล่อขึ้นเยอะมากเลยทีเดียว</p>
<p>และอีกหลายๆอย่างที่ขี้เกียจเขียน <a title="Django 1.1 release notes" href="http://docs.djangoproject.com/en/dev/releases/1.1/">อยากรู้ไปอ่านเอง</a>ดีกว่าครับ</p>
<p>ส่วนเรื่องภาษาไทยนั้น ผมได้ส่งฉบับล่าสุด โดยมีพี่เทพช่วยตรวจสอบให้ โดยพยายามให้เป็นไปในแนวทางเดียวกันกับ tl10n หลายๆจุดปรับปรุงให้ดีขึ้น ลดความกำกวมไปเยอะ โดยทาง Django ได้ปล่อย stable version หลังจากที่เพิ่มภาษาไทยเพียงสี่ชั่วโมง ฉิวเฉียด หวาดเสียวกันจนหยดสุดท้ายจริงๆ</p>
<p>ยังไงก็ขอให้สนุกกับการพัฒนาโปรแกรมนะครับ <img src='http://www.kowito.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2009/07/30/django-1-1-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django 1.1RC ออกแล้ว เตรียมพร้อมกันหรือยัง</title>
		<link>http://www.kowito.com/2009/07/24/django-1-1rc-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b9%80%e0%b8%95%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%a1%e0%b8%9e%e0%b8%a3%e0%b9%89%e0%b8%ad%e0%b8%a1%e0%b8%81%e0%b8%b1/</link>
		<comments>http://www.kowito.com/2009/07/24/django-1-1rc-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b9%80%e0%b8%95%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%a1%e0%b8%9e%e0%b8%a3%e0%b9%89%e0%b8%ad%e0%b8%a1%e0%b8%81%e0%b8%b1/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 06:10:35 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Translation]]></category>

		<guid isPermaLink="false">http://www.kowito.com/2009/07/24/django-1-1rc-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b9%80%e0%b8%95%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%a1%e0%b8%9e%e0%b8%a3%e0%b9%89%e0%b8%ad%e0%b8%a1%e0%b8%81%e0%b8%b1/</guid>
		<description><![CDATA[Django 1.1RC ออกมาแล้วเมื่อวันที่ 21 กรกฏาคม ที่ผ่านมา แต่พึงระลึกว่ายังไม่ใช่ตัวหลัก แนะนำว่าอย่าเพิ่งรีบร้อนเอามาใช้ในงานจริง เพราะว่าหากโชคดี คงจะได้เห็นตัวหลักในเวลาอันไกล้ ตอนนี้จะไม่มีการแก้ไขข้อความอะไรเพิ่มตาม หากต้องการจะแปล นี่เป็นโอกาสอันดีแล้วครับ ลุยกันเลย หากต้องการจะลอง สามารถ DOwnload ได้ที่นี่]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2009/07/24/django-1-1rc-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b9%80%e0%b8%95%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%a1%e0%b8%9e%e0%b8%a3%e0%b9%89%e0%b8%ad%e0%b8%a1%e0%b8%81%e0%b8%b1/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p>Django 1.1RC ออกมาแล้วเมื่อวันที่ 21 กรกฏาคม ที่ผ่านมา แต่พึงระลึกว่ายังไม่ใช่ตัวหลัก แนะนำว่าอย่าเพิ่งรีบร้อนเอามาใช้ในงานจริง เพราะว่าหากโชคดี คงจะได้เห็นตัวหลักในเวลาอันไกล้</p>
<p>ตอนนี้จะไม่มีการแก้ไขข้อความอะไรเพิ่มตาม หากต้องการจะแปล นี่เป็นโอกาสอันดีแล้วครับ <a title="PyThai" href="http://groups.google.com/group/pythai" target="_blank">ลุยกันเลย</a></p>
<p>หากต้องการจะลอง สามารถ DOwnload ได้<a title="2. Get the 1.1 release candidate" href="http://www.djangoproject.com/download/" target="_blank">ที่นี่</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2009/07/24/django-1-1rc-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b9%80%e0%b8%95%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%a1%e0%b8%9e%e0%b8%a3%e0%b9%89%e0%b8%ad%e0%b8%a1%e0%b8%81%e0%b8%b1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RegEx validate email for python</title>
		<link>http://www.kowito.com/2009/07/08/regex-validate-email-for-python/</link>
		<comments>http://www.kowito.com/2009/07/08/regex-validate-email-for-python/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 11:55:14 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[RegEx]]></category>

		<guid isPermaLink="false">http://www.kowito.com/2009/07/08/regex-validate-email-for-python/</guid>
		<description><![CDATA[เขียนเว็บก็ที่ก็ต้องมานั่งเขียน validate email address ทุกที รำคาญมาก จดไว้ในนี้เสีย จะได้ไม่ต้องเสียเวลาไปค้นอีก อย่างแรกคือกฎ วุ่นวายสับสนมากมาย ไปอ่านเพิ่มเติมกันเอาเองที่นี่ IETF แต่ถ้าเอาคร่าวๆก็ตามนี้ Alpha Characters a-z and A-Z (ASCII 97-122 and 65-90) Numeric Characters (ASCII 48-57) Exclamation Point &#8216;!&#8217; (ASCII 33) Number Sign &#8216;#&#8217; (ASCII 35) Dollar Sign &#8216;$&#8217; (ASCII 36) Percent Sign &#8216;%&#8217; (ASCII 37) Ampersand &#8216;&#38;&#8217; (ASCII 38) Single Quote &#8221;&#8217; (ASCII 39) [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2009/07/08/regex-validate-email-for-python/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><p>เขียนเว็บก็ที่ก็ต้องมานั่งเขียน validate email address ทุกที รำคาญมาก จดไว้ในนี้เสีย จะได้ไม่ต้องเสียเวลาไปค้นอีก</p>
<p>อย่างแรกคือกฎ วุ่นวายสับสนมากมาย ไปอ่านเพิ่มเติมกันเอาเองที่นี่ <a href="http://www.ietf.org/rfc/rfc2822.txt" target="_blank">IETF</a> แต่ถ้าเอาคร่าวๆก็ตามนี้</p>
<ul>
<li> Alpha Characters a-z and A-Z (ASCII 97-122 and 65-90)</li>
<li> Numeric Characters (ASCII 48-57)</li>
<li> Exclamation Point &#8216;!&#8217; (ASCII 33)</li>
<li> Number Sign &#8216;#&#8217; (ASCII 35)</li>
<li> Dollar Sign &#8216;$&#8217; (ASCII 36)</li>
<li> Percent Sign &#8216;%&#8217; (ASCII 37)</li>
<li> Ampersand &#8216;&amp;&#8217; (ASCII 38)</li>
<li> Single Quote &#8221;&#8217; (ASCII 39)</li>
<li> Asterisk &#8216;*&#8217; (ASCII 42)</li>
<li> Plus Sign &#8216;+&#8217; (ASCII 43)</li>
<li> Minus Sign/Dash/Hyphen &#8216;-&#8217; (ASCII 45)</li>
<li> Forward Slash &#8216;/&#8217; (ASCII 47)</li>
<li> Equals Sign &#8216;=&#8217; (ASCII 61)</li>
<li> Question Mark &#8216;?&#8217; (ASCII 63)</li>
<li> Caret &#8216;^&#8217; (ASCII 94)</li>
<li> Underscore &#8216;_&#8217; (ASCII 95)</li>
<li> Left Opening Brace &#8216;{&#8216; (ASCII 123)</li>
<li> Right Opening Brace &#8216;}&#8217; (ASCII 125)</li>
<li> Tilde &#8216;~&#8217; (ASCII 126)</li>
</ul>
<p>หลังจากนั้นก็ได้ Pattern ตามนี้</p>
<pre class="brush: python; ruler: true; first-line: 10; highlight: [2, 4, 6]">
[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
</pre>
<p>ปล. เพิ่งรู้ว่าตัวอักษรประหลาดๆหลายตัวใช้ใน email Address ได้ด้วย</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2009/07/08/regex-validate-email-for-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>บรรทัดเดียวก็พอ #1 factorial</title>
		<link>http://www.kowito.com/2009/07/08/%e0%b8%9a%e0%b8%a3%e0%b8%a3%e0%b8%97%e0%b8%b1%e0%b8%94%e0%b9%80%e0%b8%94%e0%b8%b5%e0%b8%a2%e0%b8%a7%e0%b8%81%e0%b9%87%e0%b8%9e%e0%b8%ad-1-factorial/</link>
		<comments>http://www.kowito.com/2009/07/08/%e0%b8%9a%e0%b8%a3%e0%b8%a3%e0%b8%97%e0%b8%b1%e0%b8%94%e0%b9%80%e0%b8%94%e0%b8%b5%e0%b8%a2%e0%b8%a7%e0%b8%81%e0%b9%87%e0%b8%9e%e0%b8%ad-1-factorial/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 11:28:32 +0000</pubDate>
		<dc:creator>kowito</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.kowito.com/2009/07/08/%e0%b8%9a%e0%b8%a3%e0%b8%a3%e0%b8%97%e0%b8%b1%e0%b8%94%e0%b9%80%e0%b8%94%e0%b8%b5%e0%b8%a2%e0%b8%a7%e0%b8%81%e0%b9%87%e0%b8%9e%e0%b8%ad-1-factorial/</guid>
		<description><![CDATA[def fact(x): return (1 if x&#60;1 else x * fact(x-1))]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><fb:like href="http://www.kowito.com/2009/07/08/%e0%b8%9a%e0%b8%a3%e0%b8%a3%e0%b8%97%e0%b8%b1%e0%b8%94%e0%b9%80%e0%b8%94%e0%b8%b5%e0%b8%a2%e0%b8%a7%e0%b8%81%e0%b9%87%e0%b8%9e%e0%b8%ad-1-factorial/" send="true" width="" colorscheme="light" layout=standard show_faces="true" font="tahoma" action="like"></fb:like></div><pre name = "code" class="python">def fact(x): return (1 if x&lt;1 else x * fact(x-1))</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.kowito.com/2009/07/08/%e0%b8%9a%e0%b8%a3%e0%b8%a3%e0%b8%97%e0%b8%b1%e0%b8%94%e0%b9%80%e0%b8%94%e0%b8%b5%e0%b8%a2%e0%b8%a7%e0%b8%81%e0%b9%87%e0%b8%9e%e0%b8%ad-1-factorial/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

