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

<channel>
	<title>jQuery, Ajax, PHP, JSON, XML, Web Technologies &#187; Algorithm</title>
	<atom:link href="http://blog.chonla.com/category/algorithm/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chonla.com</link>
	<description>คุยกันเรื่อง jQuery, Ajax, PHP, JSON, XML และ Web Technologies เป็นภาษาไทยกันดีกว่า</description>
	<lastBuildDate>Tue, 17 Jan 2012 18:27:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>เวลาตอนนี้อยู่ในช่วงเวลานั้นหรือเปล่านะ&#8230;</title>
		<link>http://blog.chonla.com/2011/03/%e0%b9%80%e0%b8%a7%e0%b8%a5%e0%b8%b2%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%99%e0%b8%b5%e0%b9%89%e0%b8%ad%e0%b8%a2%e0%b8%b9%e0%b9%88%e0%b9%83%e0%b8%99%e0%b8%8a%e0%b9%88%e0%b8%a7%e0%b8%87%e0%b9%80%e0%b8%a7/</link>
		<comments>http://blog.chonla.com/2011/03/%e0%b9%80%e0%b8%a7%e0%b8%a5%e0%b8%b2%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%99%e0%b8%b5%e0%b9%89%e0%b8%ad%e0%b8%a2%e0%b8%b9%e0%b9%88%e0%b9%83%e0%b8%99%e0%b8%8a%e0%b9%88%e0%b8%a7%e0%b8%87%e0%b9%80%e0%b8%a7/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 11:05:43 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Time]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=314</guid>
		<description><![CDATA[ตอนนี้เป็นเวลา 17.40 แล้ว (ตอนที่เขียน) &#8230; เอ&#8230; เวลาตอนนี้อยู่ในช่วงเวลา 13.00 &#8211; 21.00 หรือเปล่านะ ก็ต้องใช่น่ะสิ เพราะว่า 13.00 &#60;= 17.40 &#60;= 21.00 นี่นา ใคร ๆ ก็รู้ ผมไม่ได้อัพเดทบล็อกมาหลายเดือนเลยครับ ด้วยเหตุผลหลาย ๆ อย่างทำให้ผมมีเวลาไม่ค่อยมากเหมือนเก่า และที่สำคัญ หลาย ๆ ครั้งผมคิดไม่ออกว่าจะเขียนอะไรดีครับ entry นี้ เป็นไอเดียที่ผมไปได้มาตอนที่ไปประชุมวิชาการที่ญี่ปุ่นครับ ลองอ่านแล้วลองไปปรับใช้กันดูนะครับ เวลาตอนนี้ อยู่ในช่วงเวลานั้นหรือเปล่า เป็นแนวความคิดง่าย ๆ ที่ใช้สำหรับเช็คว่า เวลาใด ๆ นั้น อยู่ในช่วงเวลาที่เรากำหนดหรือเปล่า ตามที่ยกตัวอย่างไปตอนต้น วิธีการเช็คแบบไม่ต้องคิดอะไรมากก็ทำง่าย ๆ ผมจะอธิบายแบบค่อย ๆ เป็นค่อย ๆ ไปทีละขั้นนะครับ $t = (int)date("G", time()); [...]]]></description>
			<content:encoded><![CDATA[<p>ตอนนี้เป็นเวลา 17.40 แล้ว (ตอนที่เขียน) &#8230; เอ&#8230; เวลาตอนนี้อยู่ในช่วงเวลา 13.00 &#8211; 21.00 หรือเปล่านะ ก็ต้องใช่น่ะสิ เพราะว่า 13.00 &lt;= 17.40 &lt;= 21.00 นี่นา ใคร ๆ ก็รู้</p>
<p>ผมไม่ได้อัพเดทบล็อกมาหลายเดือนเลยครับ ด้วยเหตุผลหลาย ๆ อย่างทำให้ผมมีเวลาไม่ค่อยมากเหมือนเก่า และที่สำคัญ หลาย ๆ ครั้งผมคิดไม่ออกว่าจะเขียนอะไรดีครับ</p>
<p>entry นี้ เป็นไอเดียที่ผมไปได้มาตอนที่ไปประชุมวิชาการที่ญี่ปุ่นครับ ลองอ่านแล้วลองไปปรับใช้กันดูนะครับ</p>
<p><span id="more-314"></span>เวลาตอนนี้ อยู่ในช่วงเวลานั้นหรือเปล่า เป็นแนวความคิดง่าย ๆ ที่ใช้สำหรับเช็คว่า เวลาใด ๆ นั้น อยู่ในช่วงเวลาที่เรากำหนดหรือเปล่า ตามที่ยกตัวอย่างไปตอนต้น วิธีการเช็คแบบไม่ต้องคิดอะไรมากก็ทำง่าย ๆ ผมจะอธิบายแบบค่อย ๆ เป็นค่อย ๆ ไปทีละขั้นนะครับ</p>
<pre>$t = (int)date("G", time());</pre>
<p>ค่า $t ที่ได้ ก็จะเป็นเวลาชั่วโมง มีค่าตั้งแต่ 0-23 ครับ มี type เป็น int (จากการ casting ด้วย int) ด้านหน้าแหละครับ</p>
<p>สมมติว่าช่วงที่เรากำหนดไว้มี 2 ช่วงคือ ช่วง A คือ 10-21 (10 โมงเช้า ถึง 3 ทุ่ม) และ ช่วง B คือ 21-10 (3 ทุ่ม ถึง 10 โมงเช้า) สมมติให้แต่ละช่วงเป็น array ที่มี 2 element โดย element ที่ 0 คือเวลาเริ่มต้น และ element ที่ 1 คือเวลาสิ้นสุด ดังนั้น</p>
<pre>$A = array(10, 21);
$B = array(21, 10);</pre>
<p>ดังนั้นสำหรับ $A แล้ว การเช็คก็จะง่าย ๆ ใช่มั๊ยครับ แค่ใช้ว่า <span style="color: #0000ff;">if (($A[0] &lt;= $t) &amp;&amp; ($t &lt;= $A[1]))</span> เท่านั้นเอง ในขณะที่ $B จะไม่สามารถทำแบบนี้ได้ เพราะเวลาของ element ที่ 1 มีค่าน้อยกว่า element ที่ 0 ดังนั้นทำให้เราต้องเช็คอีกแบบหนึ่งแทน โดยสามารถทำได้ 2 แบบครับ คือ <span style="color: #0000ff;">if ((($B[0] &lt;= $t) &amp;&amp; ($t &lt;= 23)) || (($t &lt;= 0) &amp;&amp; ($t &lt;= $B[1])))</span> คือ แบ่งช่วงก่อนเที่ยงคืนและหลังเที่ยงคืนมาเช็คนั่นเองครับ หรืออีกวิธีคือ <span style="color: #0000ff;">if (!(($B[1] &lt; $t) &amp;&amp; ($t &lt; $B[0])))</span> ครับ นั่นคือเช็คว่าไม่อยู่ในช่วงนอกช่วงเวลาที่กำหนดนั่นเองครับ</p>
<p>จะเห็นได้ว่า การทำแบบนี้จะต้องมาเช็คช่วงว่าตัวแรกน้อยกว่าหรือมากกว่าตัวหลัง แล้วแยกไปเช็คตามวิธีที่สอดคล้องกัน</p>
<p>ทีนี้มาลองดูวิธีที่ผมคิดว่าน่าจะง่ายกว่ากันมั่ง</p>
<p>วิธีนี้ มีข้อกำหนดให้ช่วงเวลาเริ่มต้นจะต้องน้อยกว่าช่วงเวลาสิ้นสุดเสมอ โดยให้เวลาที่เลยเที่ยงคืนไป จะให้นับต่อไปเรื่อย ๆ จาก 23 ครับ ไม่ต้องวนกลับไปนับ 0 ใหม่ ดังนั้น ช่วงของ $A และ $B ใหม่ จะได้เป็น</p>
<pre>$A = array(10, 21);
$B = array(21, 34); // 34 คือ 24 + 10 นั่นเอง เอา 10 โมงเช้า + เวลาหลังเที่ยงคืน</pre>
<p>วิธีการเช็คก็ง่ายนิดเดียวครับ โดยการใช้แบบนี้ครับ <span style="color: #0000ff;">if ((($A[0] &lt;= $t) &amp;&amp; ($t &lt;= $A[1])) || (($A[0] &lt;= ($t+24)) &amp;&amp; (($t+24) &lt;= $A[1])))</span> วิธีแบบนี้ใช้ได้กับทั้ง $A และ $B ครับ นั่นคือเอาเวลาปัจจุบันมาดูว่าอยู่ในช่วงเวลาปกติหรือเปล่า หรือว่าอยู่ในช่วงเวลาข้ามวันไปแล้ว (โดยการ +24 แล้วเอาไปเช็ค)</p>
<p>วิธีนี้ผมได้แนวความคิดมาหลังจากที่ผมเห็นป้ายหน้าตึก ropongi hill ที่ระบุเวลาเปิดปิดไว้ว่า ปิดเวลา 25:00 ครับ (ตี 1) ผมเลยเอามาคิดว่าทำไมถึงต้อง 25:00 ทำไมไม่เป็น 1:00 แล้วจะเอาไปใช้งานง่าย ๆ ได้ยังไง ที่เหลือผมก็คิดเองเออเองมาเป็นแบบที่เขียนให้อ่านกันนี่แหละครับ ใครมีวิธีที่น่าสนใจกว่า เอามาแชร์กันได้นะครับ</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2011%2F03%2F%25e0%25b9%2580%25e0%25b8%25a7%25e0%25b8%25a5%25e0%25b8%25b2%25e0%25b8%2595%25e0%25b8%25ad%25e0%25b8%2599%25e0%25b8%2599%25e0%25b8%25b5%25e0%25b9%2589%25e0%25b8%25ad%25e0%25b8%25a2%25e0%25b8%25b9%25e0%25b9%2588%25e0%25b9%2583%25e0%25b8%2599%25e0%25b8%258a%25e0%25b9%2588%25e0%25b8%25a7%25e0%25b8%2587%25e0%25b9%2580%25e0%25b8%25a7%2F&amp;title=%E0%B9%80%E0%B8%A7%E0%B8%A5%E0%B8%B2%E0%B8%95%E0%B8%AD%E0%B8%99%E0%B8%99%E0%B8%B5%E0%B9%89%E0%B8%AD%E0%B8%A2%E0%B8%B9%E0%B9%88%E0%B9%83%E0%B8%99%E0%B8%8A%E0%B9%88%E0%B8%A7%E0%B8%87%E0%B9%80%E0%B8%A7%E0%B8%A5%E0%B8%B2%E0%B8%99%E0%B8%B1%E0%B9%89%E0%B8%99%E0%B8%AB%E0%B8%A3%E0%B8%B7%E0%B8%AD%E0%B9%80%E0%B8%9B%E0%B8%A5%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%B0%26%238230%3B" id="wpa2a_2"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2011/03/%e0%b9%80%e0%b8%a7%e0%b8%a5%e0%b8%b2%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%99%e0%b8%b5%e0%b9%89%e0%b8%ad%e0%b8%a2%e0%b8%b9%e0%b9%88%e0%b9%83%e0%b8%99%e0%b8%8a%e0%b9%88%e0%b8%a7%e0%b8%87%e0%b9%80%e0%b8%a7/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>หมายเลขบัตรประชาชน? สร้างเองดีกว่า</title>
		<link>http://blog.chonla.com/2009/04/%e0%b8%ab%e0%b8%a1%e0%b8%b2%e0%b8%a2%e0%b9%80%e0%b8%a5%e0%b8%82%e0%b8%9a%e0%b8%b1%e0%b8%95%e0%b8%a3%e0%b8%9b%e0%b8%a3%e0%b8%b0%e0%b8%8a%e0%b8%b2%e0%b8%8a%e0%b8%99-%e0%b8%aa%e0%b8%a3%e0%b9%89%e0%b8%b2/</link>
		<comments>http://blog.chonla.com/2009/04/%e0%b8%ab%e0%b8%a1%e0%b8%b2%e0%b8%a2%e0%b9%80%e0%b8%a5%e0%b8%82%e0%b8%9a%e0%b8%b1%e0%b8%95%e0%b8%a3%e0%b8%9b%e0%b8%a3%e0%b8%b0%e0%b8%8a%e0%b8%b2%e0%b8%8a%e0%b8%99-%e0%b8%aa%e0%b8%a3%e0%b9%89%e0%b8%b2/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 08:14:57 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Souce Code]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Utility]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=155</guid>
		<description><![CDATA[สาเหตุที่ผมเขียนบทความนี้ขึ้นมา เพราะว่ามันจะมีบางช่วงเวลาที่ผมจำเป็นต้องใช้หมายเลขบัตรประชาชนในการทำอะไรหลาย ๆ อย่าง ไม่ว่าจะเป็นเรื่องของการทำระบบ verify หมายเลขบัตรประชาชน หรือเอาไปใช้สมัครโน่นสมัครนี่ บางครั้งผมแค่อยากลองเฉย ๆ แต่ไม่ได้อยากใช้หมายเลขบัตรของผมจริง ๆ ด้วยเหตุผลด้านความปลอดภัยของผมเอง ผมเลยลองสร้างหมายเลขบัตรประชาชนจากอัลกอริธึมในการตรวจสอบหมายเลขบัตรประชาชนขึ้นมา อัลกอริธึมในการตรวจสอบหมายเลขบัตรประชาชน สามารถหาได้ตามเว็บทั่ว ๆ ไป ที่ผมได้มาก็จะประมาณนี้ครับ (Javascript) function validate_thai_citizen_id(id) { var b = 0; if (id.length &#60; 13) return false; checksum = id.substring(12, 13); for (var i = 0; i &#60; 12; i++) { b += parseInt(id.substring(i, i+1)) * (13 - i); [...]]]></description>
			<content:encoded><![CDATA[<p>สาเหตุที่ผมเขียนบทความนี้ขึ้นมา เพราะว่ามันจะมีบางช่วงเวลาที่ผมจำเป็นต้องใช้หมายเลขบัตรประชาชนในการทำอะไรหลาย ๆ อย่าง ไม่ว่าจะเป็นเรื่องของการทำระบบ verify หมายเลขบัตรประชาชน หรือเอาไปใช้สมัครโน่นสมัครนี่ บางครั้งผมแค่อยากลองเฉย ๆ แต่ไม่ได้อยากใช้หมายเลขบัตรของผมจริง ๆ ด้วยเหตุผลด้านความปลอดภัยของผมเอง ผมเลยลองสร้างหมายเลขบัตรประชาชนจากอัลกอริธึมในการตรวจสอบหมายเลขบัตรประชาชนขึ้นมา</p>
<p><span id="more-155"></span>อัลกอริธึมในการตรวจสอบหมายเลขบัตรประชาชน สามารถหาได้ตามเว็บทั่ว ๆ ไป ที่ผมได้มาก็จะประมาณนี้ครับ (Javascript)</p>
<pre name="code" class="js">
function validate_thai_citizen_id(id)
{
    var b = 0;
    if (id.length &lt; 13) return false;
    checksum = id.substring(12, 13);
    for (var i = 0; i &lt; 12; i++)
    {
        b += parseInt(id.substring(i, i+1)) * (13 - i);
    }
    tmp = 11 - (b % 11);
    switch(tmp)
    {
        case 11: check = 1; break;
        case 10: check = 0; break;
        default: check = tmp;
    }
    return (check == checksum);
}
</pre>
<p>จาก code ด้านบน เราจะเห็นได้ว่าส่วนที่สำคัญที่สุดคือ digit สุดท้าย ซึ่งจะทำหน้าที่เป็น checksum digit ซึ่งเราสามารถคำนวณได้จาก 12 digits แรก</p>
<p>เมื่อเราเอามาจัดการเขียนให้เป็นเรื่องเป็นราวจะได้แบบนี้ครับ</p>
<pre name="code" class="php">
function generate_thai_citizen_id()
{
	$checksum = 0;
	$b = 0;
	$r = 0;
	$t = "";
	mt_srand();
	for ($i = 0; $i < 12; $i ++)
	{
		$r = mt_rand(0, 9);
		$b += $r * (13 - $i);
		$t .= "$r";
	}
	$tmp = 11 - ($b % 11);
	switch($tmp)
	{
		case 11: $check = 1; break;
		case 10: $check = 0; break;
		default: $check = $tmp;
	}
	$t .= $check;
	return $t;
}
</pre>
<p>Code ด้านบนนี้ผมพอร์ตมาจาก Javascript version ที่ผมทำไว้ให้เป็น PHP ครับ</p>
<p>ลองดูหน้าที่ทำเสร็จแล้ว (PHP) ได้ที่ <a title="LIVE DEMO: Randomly create citizen ID" href="http://sandbox.chonla.com/citizenid/" target="_blank">LIVE DEMO</a> เลยครับ</p>
<p>ปล. หมายเลขบัตรประชาชนที่สร้างจาก <a title="LIVE DEMO: Randomly create citizen ID" href="http://sandbox.chonla.com/citizenid/" target="_blank">LIVE DEMO</a> สามารถนำไปใช้ได้จริงนะครับ ใช้ให้ถูกที่ถูกกฏหมายนะครับ<br />
ปล. อีกที วันที่ 9 ก.ย. 52 ผมแก้ไข code ที่เป็น เวอร์ชั่น php ให้ถูกต้องครับ มีบักนิดหน่อย</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2009%2F04%2F%25e0%25b8%25ab%25e0%25b8%25a1%25e0%25b8%25b2%25e0%25b8%25a2%25e0%25b9%2580%25e0%25b8%25a5%25e0%25b8%2582%25e0%25b8%259a%25e0%25b8%25b1%25e0%25b8%2595%25e0%25b8%25a3%25e0%25b8%259b%25e0%25b8%25a3%25e0%25b8%25b0%25e0%25b8%258a%25e0%25b8%25b2%25e0%25b8%258a%25e0%25b8%2599-%25e0%25b8%25aa%25e0%25b8%25a3%25e0%25b9%2589%25e0%25b8%25b2%2F&amp;title=%E0%B8%AB%E0%B8%A1%E0%B8%B2%E0%B8%A2%E0%B9%80%E0%B8%A5%E0%B8%82%E0%B8%9A%E0%B8%B1%E0%B8%95%E0%B8%A3%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%8A%E0%B8%B2%E0%B8%8A%E0%B8%99%3F%20%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B9%80%E0%B8%AD%E0%B8%87%E0%B8%94%E0%B8%B5%E0%B8%81%E0%B8%A7%E0%B9%88%E0%B8%B2" id="wpa2a_4"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/04/%e0%b8%ab%e0%b8%a1%e0%b8%b2%e0%b8%a2%e0%b9%80%e0%b8%a5%e0%b8%82%e0%b8%9a%e0%b8%b1%e0%b8%95%e0%b8%a3%e0%b8%9b%e0%b8%a3%e0%b8%b0%e0%b8%8a%e0%b8%b2%e0%b8%8a%e0%b8%99-%e0%b8%aa%e0%b8%a3%e0%b9%89%e0%b8%b2/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

