<?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>Cholwich's blog &#187; unix</title>
	<atom:link href="http://cholwich.org/wordpress/tag/unix/feed/" rel="self" type="application/rss+xml" />
	<link>http://cholwich.org/wordpress</link>
	<description>Just another blog of mine</description>
	<lastBuildDate>Fri, 09 Jul 2010 09:11:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>สำรองข้อมูลด้วย dirsplit</title>
		<link>http://cholwich.org/wordpress/2009/05/19/dirsplit/</link>
		<comments>http://cholwich.org/wordpress/2009/05/19/dirsplit/#comments</comments>
		<pubDate>Tue, 19 May 2009 04:58:59 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[cdrecord]]></category>
		<category><![CDATA[dirsplit]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[wodim]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=312</guid>
		<description><![CDATA[ผมมักจะมีปัญหากับการแบ็คอัพข้อมูลบ่อยๆ ถึงแม้ว่าจะมีอุปกรณ์ต่างๆ ที่ครบถ้วนอยู่แล้ว เนื่องจากเวลาเก็บไฟล์ไว้เยอะ ถ้าจะเก็บลงแผ่น CD หรือ DVD จะมีปัญหาที่จะต้องมานั่งจัดแบ่งไฟล์ออกเป็นแผ่นๆ บางไฟล์ก็ใหญ่เกินไปเขียนลงบนแผ่นเดียวกัน ก็จะต้องจำไฟล์นี้ไว้ก่อน แล้วไปหาไฟล์อื่นมาแทนถ้าจะทิ้งให้เหลือไว้อย่างนั้นก็รู้สึกว่าเปลือง ทำไปทำมาก็จะงงไปหมด เสียเวลาในการจัดการนานมาก จนกระทั่งขี้เกียจแบ็คอัพในที่สุด วันนี้ลงค้นๆใน apt-get ของ Ubuntu ดู พบว่ามีคนทำเครื่องมือช่วยจัดการปัญหานี้ คือเป็นสคริปต์เล็กๆ ที่ชื่อว่า dirsplit ที่มาพร้อมกับแพคเกจ genisoimage โปรแกรมนี้ทำหน้าที่สร้างลิสต์ของไฟล์ เพื่อเขียนไดเรคทอรีใหญ่ๆ ลงแผ่น CD/DVD โดยโปรแกรมจะจัดไฟล์ให้เราตามขนาดไฟล์ เราสามารถกำหนดได้ว่าจะสร้าง catalog แต่ละแผ่นใหญ่แค่ไหน (default คือขนาด DVD) วิธีใช้ก็คือ $ dirsplit -e2 --prefix mybackup ./mydir1 ./mydir2 ตัวเลือก -e2 ใช้กำหนดวิธีการคำนวณและรวมขนาดไฟล์ มีอยู่หลายวิธี ผมเห็นตัวอย่างใช้วิธีนี้ก็เลยใช้ตาม ส่วน &#8211;prefix ใช้กำหนดชื่อไฟล์ catalog ที่สร้างขึ้น [...]]]></description>
			<content:encoded><![CDATA[<p>ผมมักจะมีปัญหากับการแบ็คอัพข้อมูลบ่อยๆ ถึงแม้ว่าจะมีอุปกรณ์ต่างๆ ที่ครบถ้วนอยู่แล้ว เนื่องจากเวลาเก็บไฟล์ไว้เยอะ ถ้าจะเก็บลงแผ่น CD หรือ DVD จะมีปัญหาที่จะต้องมานั่งจัดแบ่งไฟล์ออกเป็นแผ่นๆ บางไฟล์ก็ใหญ่เกินไปเขียนลงบนแผ่นเดียวกัน ก็จะต้องจำไฟล์นี้ไว้ก่อน แล้วไปหาไฟล์อื่นมาแทนถ้าจะทิ้งให้เหลือไว้อย่างนั้นก็รู้สึกว่าเปลือง ทำไปทำมาก็จะงงไปหมด เสียเวลาในการจัดการนานมาก จนกระทั่งขี้เกียจแบ็คอัพในที่สุด</p>
<p>วันนี้ลงค้นๆใน apt-get ของ Ubuntu ดู พบว่ามีคนทำเครื่องมือช่วยจัดการปัญหานี้ คือเป็นสคริปต์เล็กๆ ที่ชื่อว่า dirsplit ที่มาพร้อมกับแพคเกจ genisoimage โปรแกรมนี้ทำหน้าที่สร้างลิสต์ของไฟล์ เพื่อเขียนไดเรคทอรีใหญ่ๆ ลงแผ่น CD/DVD โดยโปรแกรมจะจัดไฟล์ให้เราตามขนาดไฟล์ เราสามารถกำหนดได้ว่าจะสร้าง catalog แต่ละแผ่นใหญ่แค่ไหน (default คือขนาด DVD) วิธีใช้ก็คือ</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ dirsplit <span style="color: #660033;">-e2</span> <span style="color: #660033;">--prefix</span> mybackup .<span style="color: #000000; font-weight: bold;">/</span>mydir1 .<span style="color: #000000; font-weight: bold;">/</span>mydir2</pre></div></div>

<p>ตัวเลือก -e2 ใช้กำหนดวิธีการคำนวณและรวมขนาดไฟล์ มีอยู่หลายวิธี ผมเห็นตัวอย่างใช้วิธีนี้ก็เลยใช้ตาม ส่วน &#8211;prefix ใช้กำหนดชื่อไฟล์ catalog ที่สร้างขึ้น อย่างกรณีนี้ ก็จะได้ mybackup1.list mybackup2.list &#8230; ไปเรื่อยๆ ตามไฟล์ที่เรามี</p>
<p>เมื่อสร้าง catalog เสร็จ ก็ต้องนำมาสร้าง ISO image ซึ่งจะเป็นการไปดึงไฟล์จริงมารวมไว้ วิธีใช้ของ dirsplit ก็มีวิธีสร้าง ISO มาให้ด้วย คือ</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ mkisofs <span style="color: #660033;">-D</span> <span style="color: #660033;">-r</span> <span style="color: #660033;">--joliet-long</span> <span style="color: #660033;">-graft-points</span> <span style="color: #660033;">-path-list</span> mybackup1.list <span style="color: #660033;">-o</span> mybackup1.iso</pre></div></div>

<p>เพียงเท่านี้ก็จะได้ image สำหรับเขียนลงแผ่น ก็สามารถใช้โปรแกรมที่ชื่นชอบเขียนได้ ผมขี้เกียจใช้ GUI ก็ใช้โปรแกรม wodim โดยตรง</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ wodim <span style="color: #660033;">-v</span> <span style="color: #007800;">dev</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>scd0 <span style="color: #007800;">speed</span>=<span style="color: #000000;">8</span> mybackup1.iso</pre></div></div>

<p>ก็จะได้แผ่นสำรองข้อมูล (ที่มีค่าหรือเปล่าก็ไม่รู้) ของเราไว้ได้ ข้อเสียของวิธีนี้ก็คือ ถ้าต้องการค้นหาไฟล์บางอย่างในภายหลังอาจจะยุ่งยากพอควร เพราะเราจะไม่รู้ว่าไฟล์นั้นเก็บไว้ที่ไหน ถ้าให้ดีก็เก็บไฟล์ catalog เอาไว้ด้วย จะได้ค้นหาได้เร็วขึ้น</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2009/05/19/dirsplit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>จัดการการบ้าน (1)</title>
		<link>http://cholwich.org/wordpress/2008/10/19/%e0%b8%88%e0%b8%b1%e0%b8%94%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%9a%e0%b9%89%e0%b8%b2%e0%b8%99-1/</link>
		<comments>http://cholwich.org/wordpress/2008/10/19/%e0%b8%88%e0%b8%b1%e0%b8%94%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%9a%e0%b9%89%e0%b8%b2%e0%b8%99-1/#comments</comments>
		<pubDate>Sun, 19 Oct 2008 07:58:59 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[teaching]]></category>
		<category><![CDATA[assignment]]></category>
		<category><![CDATA[fetchmail]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=129</guid>
		<description><![CDATA[เวลาผมให้นักศึกษาทำการบ้านเขียนโปรแกรม ผมมักจะให้ส่งการบ้านทางเมล เพราะคิดว่าสะดวกที่จะตรวจทางเมลมากกว่า จะทดสอบด้วยการรันโปรแกรมที่ส่งมาก็ได้ รวมทั้งยังสามารถใช้เครื่องมือต่างๆ ในการตรวจจับความคล้ายของโปรแกรมในกรณีที่ลอกกันมาได้อีกด้วย แต่ประสบการณ์ที่ผ่านมา จะพบปัญหาต่างๆ ที่ทำให้ผมไม่อยากตรวจการบ้าน ก็คือ เมลที่แต่ละคนส่งมา จะมีรูปแบบหลากหลาย ไม่ค่อยตรงกับที่กำหนดให้ เช่น ไม่ตั้งชื่อไฟล์ตามที่กำหนด บางคนก็ใช้โปรแกรมบีบอัดแบบแปลกๆ มาให้ บางทีบอกให้ส่งเป็น plain text ก็จะมีคนเขียนใน MS Word แล้วเปลี่ยน extension เป็น .txt จนอ่านไม่ออก หรือกำหนดให้ส่งเป็น .jar แต่ไม่รู้ยังไงใช้ WinRAR ทำเป็น .rar แล้วเปลี่ยน extension เป็น .jar เฉยเลย สุดท้ายผมจะต้องมานั่งไล่เช็คไล่เก็บไฟล์ทีละฉบับ บางคนยังส่งมาหลายที แถมยังมีการใช้แอดเดรสเดียวกัน ส่งการบ้านหลายชุดแทนเพื่อนอีก ทำให้สับสนได้ง่ายมาก และเนื่องจากผมจะต้องสอนนักศึกษาไม่น้อยกว่า 70-80 คน จึงเสียเวลาไปกับเรื่องนี้เยอะมาก จนพาลไม่ค่อยจะอยากตรวจสักเท่าไหร่ เมื่อวานเลยนั่งคิดว่าจะทำยังไงกับการบ้านในเทอมที่จะถึงนี้ดี จะทำเป็นเว็บให้อัพโหลดไฟล์ ก็ขี้เกียจเขียนเว็บ สุดท้ายจึงตัดสินใจจะใช้เมลเหมือนเดิม แล้วไปเขียนสคริปต์ด้วย fetchmail [...]]]></description>
			<content:encoded><![CDATA[<p>เวลาผมให้นักศึกษาทำการบ้านเขียนโปรแกรม ผมมักจะให้ส่งการบ้านทางเมล เพราะคิดว่าสะดวกที่จะตรวจทางเมลมากกว่า จะทดสอบด้วยการรันโปรแกรมที่ส่งมาก็ได้ รวมทั้งยังสามารถใช้เครื่องมือต่างๆ ในการตรวจจับความคล้ายของโปรแกรมในกรณีที่ลอกกันมาได้อีกด้วย แต่ประสบการณ์ที่ผ่านมา จะพบปัญหาต่างๆ ที่ทำให้ผมไม่อยากตรวจการบ้าน ก็คือ เมลที่แต่ละคนส่งมา จะมีรูปแบบหลากหลาย ไม่ค่อยตรงกับที่กำหนดให้ เช่น ไม่ตั้งชื่อไฟล์ตามที่กำหนด บางคนก็ใช้โปรแกรมบีบอัดแบบแปลกๆ มาให้ บางทีบอกให้ส่งเป็น plain text ก็จะมีคนเขียนใน MS Word แล้วเปลี่ยน extension เป็น .txt จนอ่านไม่ออก หรือกำหนดให้ส่งเป็น .jar แต่ไม่รู้ยังไงใช้ WinRAR ทำเป็น .rar แล้วเปลี่ยน extension เป็น .jar เฉยเลย สุดท้ายผมจะต้องมานั่งไล่เช็คไล่เก็บไฟล์ทีละฉบับ บางคนยังส่งมาหลายที แถมยังมีการใช้แอดเดรสเดียวกัน ส่งการบ้านหลายชุดแทนเพื่อนอีก ทำให้สับสนได้ง่ายมาก และเนื่องจากผมจะต้องสอนนักศึกษาไม่น้อยกว่า 70-80 คน จึงเสียเวลาไปกับเรื่องนี้เยอะมาก จนพาลไม่ค่อยจะอยากตรวจสักเท่าไหร่</p>
<p>เมื่อวานเลยนั่งคิดว่าจะทำยังไงกับการบ้านในเทอมที่จะถึงนี้ดี จะทำเป็นเว็บให้อัพโหลดไฟล์ ก็ขี้เกียจเขียนเว็บ สุดท้ายจึงตัดสินใจจะใช้เมลเหมือนเดิม แล้วไปเขียนสคริปต์ด้วย fetchmail กับ procmail หรือไม่ก็ maildrop เพื่อคัดแยกเมลที่ส่งมา ไปไว้ในไดเรคทอรีที่กำหนด แยก attachment ออกจากเมล โดยอาจจะใช้ Perl หรือไม่ก็โปรแกรม ripMime พร้อมทั้งตอบเมลกลับแบบอัตโนมัติว่าได้รับการบ้านแล้ว (ในกรณีที่ส่งมาถูกตามที่กำหนด) สุดท้ายหวังว่าจะช่วยให้จัดการกับการบ้านทางเมลได้สบายขึ้น แต่วิธีการทั้งหมดก็จะยังไม่สามารถจัดการกับกรณีที่ส่งไฟล์มาผิดประเภทได้ แต่ไม่เป็นไรเพราะมีคนแนะนำวิธีจัดการมาให้แล้ว ก็คือไม่ต้องตรวจให้ 0 ไปเลย คนแนะนำรับรองว่าแค่ทำเพียงครั้งเดียวก็จะส่งถูกต้องทุกคน จริงๆ แล้วยังไม่ได้เขียนสคริปต์ทั้งหมดหรอก แต่จะเอามาเล่าเรื่อยๆ วันนี้เล่าถึง fetchmail ก่อนล่ะกัน</p>
<p>โปรแกรม fetchmail เป็นโปรแกรมสำหรับดึงเมลจากเซิร์ฟเวอร์ (จะเป็นแบบ POP3 หรือ IMAP ก็ได้) มาไว้ที่เครื่องของเรา การทำงานของมัน ก็จะคล้ายๆ โปรแกรมอ่านเมลทั่วไป เพียงแต่ว่าเป็นแบบ command line ที่ให้โหลดเป็นครั้งๆ ไป และอาจจะกำหนดให้ทำงานเป็น daemon คอยเช็คและโหลดอยู่ตลอดเวลาได้ด้วย การใช้งานก็ง่ายมาก แค่กำหนดข้อมูลเซิร์ฟเวอร์ที่จะไปโหลดไว้ในไฟล์ .fetchmailrc เช่น</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">set</span> daemon <span style="color: #000000;">300</span>
poll mail.mydomain.com protocol pop3 user <span style="color: #ff0000;">&quot;myname&quot;</span> password <span style="color: #ff0000;">&quot;mypassword&quot;</span>
mimedecode
mda <span style="color: #ff0000;">&quot;/usr/bin/maildrop&quot;</span>
no keep
fetchall</pre></div></div>

<p>จะเป็นกำหนดให้อ่านเมลทั้งหมดจากเซิร์ฟเวอร์ด้วยโปรโตคอล pop3 ตามที่กำหนด จากนั้นส่งเมลที่ได้ทีละฉบับไปยังโปรแกรม maildrop ซึ่งเราจะสามารถกำหนด regular expression สำหรับคัดแยกเมลได้ ทีนี้จะเขียนวิธีการคัดแยกทำยังไงเอาไว้ต่อคราวหน้าล่ะกัน</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2008/10/19/%e0%b8%88%e0%b8%b1%e0%b8%94%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%9a%e0%b9%89%e0%b8%b2%e0%b8%99-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Screen, NoHUP, SIGHUP</title>
		<link>http://cholwich.org/wordpress/2008/08/07/screen-nohup-sighup/</link>
		<comments>http://cholwich.org/wordpress/2008/08/07/screen-nohup-sighup/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 13:47:35 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nohup]]></category>
		<category><![CDATA[screen]]></category>
		<category><![CDATA[sighup]]></category>
		<category><![CDATA[terminal]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=112</guid>
		<description><![CDATA[ในระบบเชลล์ของยูนิกซ์เวลาที่เราต้องการจะสั่งให้โปรแกรมทำงานแบบแบ็คกราวน์ จะทำโดยเรียกโปรแกรมนั้นพร้อมกับระบุเครื่องหมาย &#38; ต่อท้าย เช่น $ firefox &#38; แต่เราจะพบปัญหาเวลาที่ต้องการให้โปรแกรมที่สั่งให้ทำงานแบบแบ็คกราวน์นั้นทำงานต่อไปแม้ว่าเราจะออกจากระบบไปแล้ว เนื่องจากเวลาเราออกจากระบบ (logout) จะมีการส่งสัญญาณ SIGHUP (hangup) ไปยังโปรเซสทั้งหมดของเราที่กำลังทำงานอยู่ ซึ่งพฤติกรรมโดยปกติของโปรเซสเมื่อได้รับสัญญาณก็คือ หยุดการทำงานแบบไม่ปกติ (abnormal termination) จึงทำให้โปรแกรมที่เราหมายมั่นปั้นมือว่าจะให้ทำงานไปตลอดคืนนี้ หยุดทำงานไปโดยไม่รู้ตัว (กว่าจะรู้อีกทีก็อาจจะเช้าแล้ว ต้องเสียเวลารออีก) วิธีการแก้ปัญหานี้มีหลายวิธี วิธีที่ยุ่งยากหน่อยก็คือแก้โปรแกรมโดยเรียกใช้ system call เพื่อดัก SIGHUP ไว้ โปรแกรมของเราจะได้ไม่ทำตามพฤติกรรมปกติซึ่งก็ดูจะยุ่งยากไปหน่อย และไม่สามารถใช้กับโปรแกรมที่ไม่เปิดเผยโค้ดได้ อีกวิธีหนึ่งก็คือการใช้โปรแกรม nohup ซึ่งจะทำตัวเป็นเหมือนเชลล์ห่อโปรแกรมของเราไว้อีกชั้นหนึ่ง โดยจะดักสัญญาณ SIGHUP ไว้ ทำให้โปรแกรมทำงานต่อไปหลังจากออกจากระบบ เช่น $ nohup myprogram &#38; แต่ข้อเสียของโปรแกรม nohup ก็คือแม้ว่าเราจะกลับเข้ามาในระบบใหม่ เราก็จะไม่สามารถติดต่อหรือดูผลการทำงานของโปรแกรมได้ ผลลัพธ์ทั้งหมดจะต้องเก็บลงไฟล์ไว้ก่อนเท่านั้น ทำให้ไม่สะดวกเท่าที่ควร screen เป็นโปรแกรมบนยูนิกซ์อีกโปรแกรมหนึ่งที่ช่วยอำนวยความสะดวกในการรันโปรแกรมแบบนี้ $ screen myprogram [...]]]></description>
			<content:encoded><![CDATA[<p>ในระบบเชลล์ของยูนิกซ์เวลาที่เราต้องการจะสั่งให้โปรแกรมทำงานแบบแบ็คกราวน์ จะทำโดยเรียกโปรแกรมนั้นพร้อมกับระบุเครื่องหมาย &amp;<br />
ต่อท้าย เช่น</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ firefox <span style="color: #000000; font-weight: bold;">&amp;</span></pre></div></div>

<p>แต่เราจะพบปัญหาเวลาที่ต้องการให้โปรแกรมที่สั่งให้ทำงานแบบแบ็คกราวน์นั้นทำงานต่อไปแม้ว่าเราจะออกจากระบบไปแล้ว เนื่องจากเวลาเราออกจากระบบ (logout) จะมีการส่งสัญญาณ SIGHUP (hangup) ไปยังโปรเซสทั้งหมดของเราที่กำลังทำงานอยู่ ซึ่งพฤติกรรมโดยปกติของโปรเซสเมื่อได้รับสัญญาณก็คือ หยุดการทำงานแบบไม่ปกติ (abnormal termination) จึงทำให้โปรแกรมที่เราหมายมั่นปั้นมือว่าจะให้ทำงานไปตลอดคืนนี้ หยุดทำงานไปโดยไม่รู้ตัว (กว่าจะรู้อีกทีก็อาจจะเช้าแล้ว ต้องเสียเวลารออีก) </p>
<p>วิธีการแก้ปัญหานี้มีหลายวิธี วิธีที่ยุ่งยากหน่อยก็คือแก้โปรแกรมโดยเรียกใช้ system call เพื่อดัก SIGHUP ไว้ โปรแกรมของเราจะได้ไม่ทำตามพฤติกรรมปกติซึ่งก็ดูจะยุ่งยากไปหน่อย และไม่สามารถใช้กับโปรแกรมที่ไม่เปิดเผยโค้ดได้ อีกวิธีหนึ่งก็คือการใช้โปรแกรม nohup ซึ่งจะทำตัวเป็นเหมือนเชลล์ห่อโปรแกรมของเราไว้อีกชั้นหนึ่ง โดยจะดักสัญญาณ SIGHUP ไว้ ทำให้โปรแกรมทำงานต่อไปหลังจากออกจากระบบ เช่น</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">nohup</span> myprogram <span style="color: #000000; font-weight: bold;">&amp;</span></pre></div></div>

<p>แต่ข้อเสียของโปรแกรม nohup ก็คือแม้ว่าเราจะกลับเข้ามาในระบบใหม่ เราก็จะไม่สามารถติดต่อหรือดูผลการทำงานของโปรแกรมได้ ผลลัพธ์ทั้งหมดจะต้องเก็บลงไฟล์ไว้ก่อนเท่านั้น ทำให้ไม่สะดวกเท่าที่ควร</p>
<p>screen เป็นโปรแกรมบนยูนิกซ์อีกโปรแกรมหนึ่งที่ช่วยอำนวยความสะดวกในการรันโปรแกรมแบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">screen</span> myprogram</pre></div></div>

<p>screen จะทำงานคล้าย nohup เพียงแต่ว่าเมื่อเริ่มทำงาน screen จะทำให้ดูเหมือนว่าโปรแกรมของเราทำงานเป็นแบบฟอร์กราวน์ตามปกติทั่วไป เราสามารถสั่งให้ทำงานเบื้องหลังได้ โดยกด CTRL-A CTRL-D ต่อกัน โปรแกรมก็จะไม่เชื่อมต่อกับเทอร์มินัล แต่จะทำงานในแบบแบ็คกราวน์ แต่เราสามารถกำหนดให้ screen เรียกโปรแกรมของเราที่ทำงานอยู่ให้กลับมาอยู่เบื้องหน้าอีกครั้งได้ แม้ว่าเราจะออกจากระบบไป และกลับมาใหม่แล้วก็ตาม</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">screen</span> <span style="color: #660033;">-r</span></pre></div></div>

<p>ในกรณีที่เรียกใช้ screen พร้อมกันหลายๆ โปรเซส ก็อาจจะต้องระบุรหัสโปรเซสที่ต้องการเรียกกลับมาบนเทอร์มินัล โดยอาจจะใช้ออปชัน -ls เพื่อแสดงโปรเซสของ screen ทั้งหมดก็ได้ นอกจากนี้ screen ยังมีออปชันให้เกิดสิ่งที่เป็นผลลัพธ์ทั้งหมดลงไฟล์ไว้ให้ด้วยก็ได้ ทำให้สะดวกในการเรียกดูผลลัพธ์ภายหลัง ผมเองก็ต้องพึ่งโปรแกรม screen เยอะเลยทีเดียวกว่าจะเรียนจบมาได้</p>
<p>รายละเอียดเพิ่มเติม: <a href="http://www.gnu.org/software/screen/">http://www.gnu.org/software/screen/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2008/08/07/screen-nohup-sighup/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SSH Tunneling</title>
		<link>http://cholwich.org/wordpress/2008/07/29/ssh-tunneling/</link>
		<comments>http://cholwich.org/wordpress/2008/07/29/ssh-tunneling/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 06:03:32 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[unix]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=89</guid>
		<description><![CDATA[ผมมักจะมีปัญหาเสมอในการใช้งานโปรแกรมต่างๆ ผ่านเน็ตเวิร์ค เนื่องจากที่ทำงานผมติดตั้งไฟร์วอลล์ที่อนุญาตให้ใช้งานหลักๆ ได้แค่ &#8220;เว็บ&#8221; กับ &#8220;ssh&#8221; อย่างเช่น ผมไม่สามารถอัพเดตข้อมูลแพคเกจของ MacPorts ได้ เพราะว่ามันใช้วิธี rsync ผ่านพอร์ต 783 ที่ไม่ได้รับอนุญาต ครั้นจะไปขอให้เขาเปิดพอร์ตเพิ่มก็ดูกระไรอยู่ ส่วนใหญ่ผมจึงมักจะอัพเดตข้อมูลแพคเกจที่บ้านก่อนมาทำงาน จริงๆ แล้ว ถ้าหากเรามีเซิร์ฟเวอร์ที่ใช้งาน ssh ได้อยู่ภายนอก และเซิร์ฟเวอร์เครื่องนั้นไม่มีไฟร์วอลล์ เราจะสามารถใช้วิธี ssh tunneling เพื่อติดต่อจากเครื่องของเราผ่านเซิร์ฟเวอร์ออกไปโลกภายนอกได้ $ ssh xxx.myserver.net -L 1783:rsync.somewhere.com:783 จะเป็นการติดต่อผ่าน ssh ไปยังเครื่อง xxx.myserver.net ตัวเลือก -L ใช้กำหนด ssh tunneling โดยโปรแกรม ssh จะจับข้อมูลที่ส่งไปยังพอร์ท 1783 ของเครื่องเราทั้งหมด ส่งต่อผ่านไปยังเครื่อง xxx.myserver.net และส่งต่อไปยังพอร์ต 783 ของเครื่อง rsync.somewhere.com ทำให้เราสามารถใช้งานเครื่อง rsync.somewhere.com [...]]]></description>
			<content:encoded><![CDATA[<p>ผมมักจะมีปัญหาเสมอในการใช้งานโปรแกรมต่างๆ ผ่านเน็ตเวิร์ค เนื่องจากที่ทำงานผมติดตั้งไฟร์วอลล์ที่อนุญาตให้ใช้งานหลักๆ ได้แค่ &#8220;เว็บ&#8221; กับ &#8220;ssh&#8221; อย่างเช่น ผมไม่สามารถอัพเดตข้อมูลแพคเกจของ MacPorts ได้ เพราะว่ามันใช้วิธี rsync ผ่านพอร์ต 783 ที่ไม่ได้รับอนุญาต ครั้นจะไปขอให้เขาเปิดพอร์ตเพิ่มก็ดูกระไรอยู่ ส่วนใหญ่ผมจึงมักจะอัพเดตข้อมูลแพคเกจที่บ้านก่อนมาทำงาน</p>
<p>จริงๆ แล้ว ถ้าหากเรามีเซิร์ฟเวอร์ที่ใช้งาน ssh ได้อยู่ภายนอก และเซิร์ฟเวอร์เครื่องนั้นไม่มีไฟร์วอลล์ เราจะสามารถใช้วิธี ssh tunneling เพื่อติดต่อจากเครื่องของเราผ่านเซิร์ฟเวอร์ออกไปโลกภายนอกได้</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">$ ssh xxx.myserver.net -L 1783:rsync.somewhere.com:783</pre></div></div>

<p>จะเป็นการติดต่อผ่าน ssh ไปยังเครื่อง xxx.myserver.net ตัวเลือก -L ใช้กำหนด ssh tunneling โดยโปรแกรม ssh จะจับข้อมูลที่ส่งไปยังพอร์ท 1783 ของเครื่องเราทั้งหมด ส่งต่อผ่านไปยังเครื่อง xxx.myserver.net และส่งต่อไปยังพอร์ต 783 ของเครื่อง rsync.somewhere.com ทำให้เราสามารถใช้งานเครื่อง rsync.somewhere.com ที่อยู่ข้างนอกได้ โดย ssh ทำตัวเสมือนเป็นอุโมงค์ให้ข้อมูลของเราลอดผ่านไฟร์วอลล์ออกไป</p>
<p>ในทำนองเดียวกัน ผมก็มักจะใช้ ssh tunneling เพื่อต่อเข้ามาใช้งานเน็ตเวิร์คภายในหน่วยงาน เวลาผมอยู่ข้างนอก อย่างเช่น ถ้าผมอยากจะโหลดเปเปอร์จากฐานข้อมูลที่สถาบันเป็นสมาชิก ซึ่งปรกติเขาจะตรวจสอบบุคคลด้วยไอพีแอดเดรส เวลาผมอยู่บ้านผมก็จะแค่ ssh เข้ามาที่เซิร์ฟเวอร์ภายในสถาบันก่อนแล้ว โดยกำหนดให้ forward ข้อมูลไปยังเครื่อง proxy ที่สามารถใช้งานได้ จากนั้นผมก็แค่เซ็ต proxy บนเครื่องผมให้เป็น localhost และใช้พอร์ตที่กำหนด ก็จะดูเหมือนว่าผมใช้งานจากภายในหน่วยงาน ผมสามารถเข้าไปใช้งานฐานข้อมูลได้ตามปกติ</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">$ ssh xxx.myinternal.net -L 8080:proxy.myinternal.net:8080</pre></div></div>

<p>โปรแกรม ssh ส่วนใหญ่จะสนับสนุน tunneling หรือบางทีเรียกว่า port forwarding อย่างเช่น บน Windows คนที่ใช้ <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">putty</a> ก็จะมีตัวเลือกให้กำหนดพอร์ตต้นทางและปลายทางได้ ดังรูป </p>
<p><center><a href="http://cholwich.org/wordpress/wp-content/uploads/2008/07/putty.gif"><img src="http://cholwich.org/wordpress/wp-content/uploads/2008/07/putty-300x290.gif" alt="" title="putty ssh tunneling" width="300" height="290" class="aligncenter size-medium wp-image-93" /></a></center></p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2008/07/29/ssh-tunneling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>expect</title>
		<link>http://cholwich.org/wordpress/2008/07/08/expect/</link>
		<comments>http://cholwich.org/wordpress/2008/07/08/expect/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 07:07:36 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=71</guid>
		<description><![CDATA[ขอพูดถึงคำสั่ง unix ต่ออีกอันหนึ่งละกัน เนื่องจากเมื่อวานพยายามเขียน script เพื่อสร้าง account แบบเยอะๆ โดยใช้ข้อมูลในไฟล์รายชื่อนักเรียน เพราะว่ามีนักเรียนอยู่ 120 กว่าคน ถ้าให้สร้างด้วยมืออาจจะหมดแรงก่อนได้ ปัญหาเกิดขึ้นตอนกำหนด password ที่แม้ว่าจะมีโปรแกรม pwgen สำหรับสร้าง password ให้โดยอัตโนมัติแล้วก็ตาม แต่โปรแกรม adduser ที่ใช้บน Ubuntu ไม่ยอมให้กำหนด password ไว้เป็น option จึงต้องหาวิธีอื่นๆ ซึ่งก็มีหลายวิธี เช่น เปลี่ยนไปใช้ useradd (ชื่อคล้ายกัน สับสนดีแท้) แทนเนื่องจากกำหนดรายละเอียดต่างๆ ได้เยอะ แต่ก็มีปัญหาที่จะต้องตามไปกำหนดเงื่อนไขต่างๆ ยุ่งยากพอสมควรในขณะที่ adduser มีอีกคนกำหนดค่าต่างๆ ไว้ให้แล้ว อีกวิธีหนึ่งก็จะต้องไปแก้ไฟล์ shadow เพื่อแก้ข้อมูลเอาเอง ซึ่งไม่อยากทำเท่าไหร่ กลัวผิดแล้วมีปัญหา สุดท้ายมีคนแถวนี้แนะนำให้ใช้โปรแกรม expect ซึ่งสามารถจำลองการทำงานของโปรแกรมที่ต้องมีการตอบโต้กับผู้ใช้ ให้เราสามารถส่งค่าได้เหมือนกับสั่งงาน โดย expect นี้จะใช้ regular [...]]]></description>
			<content:encoded><![CDATA[<p>ขอพูดถึงคำสั่ง unix  ต่ออีกอันหนึ่งละกัน เนื่องจากเมื่อวานพยายามเขียน script เพื่อสร้าง account แบบเยอะๆ โดยใช้ข้อมูลในไฟล์รายชื่อนักเรียน เพราะว่ามีนักเรียนอยู่ 120 กว่าคน ถ้าให้สร้างด้วยมืออาจจะหมดแรงก่อนได้ ปัญหาเกิดขึ้นตอนกำหนด password ที่แม้ว่าจะมีโปรแกรม pwgen สำหรับสร้าง password ให้โดยอัตโนมัติแล้วก็ตาม แต่โปรแกรม adduser ที่ใช้บน Ubuntu ไม่ยอมให้กำหนด password ไว้เป็น option จึงต้องหาวิธีอื่นๆ ซึ่งก็มีหลายวิธี เช่น เปลี่ยนไปใช้ useradd (ชื่อคล้ายกัน สับสนดีแท้) แทนเนื่องจากกำหนดรายละเอียดต่างๆ ได้เยอะ แต่ก็มีปัญหาที่จะต้องตามไปกำหนดเงื่อนไขต่างๆ ยุ่งยากพอสมควรในขณะที่ adduser มีอีกคนกำหนดค่าต่างๆ ไว้ให้แล้ว อีกวิธีหนึ่งก็จะต้องไปแก้ไฟล์ shadow เพื่อแก้ข้อมูลเอาเอง ซึ่งไม่อยากทำเท่าไหร่ กลัวผิดแล้วมีปัญหา</p>
<p>สุดท้ายมีคนแถวนี้แนะนำให้ใช้โปรแกรม expect ซึ่งสามารถจำลองการทำงานของโปรแกรมที่ต้องมีการตอบโต้กับผู้ใช้ ให้เราสามารถส่งค่าได้เหมือนกับสั่งงาน โดย expect นี้จะใช้ regular expression เพื่อเทียบข้อความที่โปรแกรมแสดงออกมา แล้วจึงสามารถใช้คำสั่ง send เพื่อส่งข้อความหรืออินพุตกลับไปได้ เช่น</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/expect -f</span>
&nbsp;
spawn <span style="color: #c20cb9; font-weight: bold;">passwd</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>lindex <span style="color: #007800;">$argv</span> <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">set</span> password <span style="color: #7a0874; font-weight: bold;">&#91;</span>lindex <span style="color: #007800;">$argv</span> <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
expect <span style="color: #ff0000;">&quot;password:&quot;</span>
send <span style="color: #ff0000;">&quot;<span style="color: #007800;">$password</span><span style="color: #000099; font-weight: bold;">\r</span>&quot;</span>
expect <span style="color: #ff0000;">&quot;password:&quot;</span>
send <span style="color: #ff0000;">&quot;<span style="color: #007800;">$password</span><span style="color: #000099; font-weight: bold;">\r</span>&quot;</span>
expect eof</pre></div></div>

<p>จากโปรแกรม คำสั่ง expect เป็นการกำหนดให้รอจนกระทั่งมีข้อความที่กำหนดแสดงขึ้นมา ส่วนคำสั่ง send ก็จะเป็นส่งข้อมูลซึ่งก็คือ password ของเราไปให้โปรแกรม ที่เรียกมาทำงานโดยใช้คำสั่ง spawn ทั้งหมดนี้ไม่ได้เขียนเองหรอก ดูจากที่อ้างอิงได้ </p>
<p>อ้างอิง: http://floppsie.comp.glam.ac.uk/Glamorgan/gaius/scripting/5.html</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2008/07/08/expect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AWK</title>
		<link>http://cholwich.org/wordpress/2008/07/05/awk/</link>
		<comments>http://cholwich.org/wordpress/2008/07/05/awk/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 05:17:47 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[text processing]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=70</guid>
		<description><![CDATA[ตอนนี้พยายามเขียนเรื่องให้มีสาระมากขึ้น มากกว่าแค่แปะลิงก์ แล้วก็กล่าวถึงนิดๆ เพราะลองดูสถิติจาก Google Analytics แล้ว รู้สึกว่ามีคนหลงมาที่นี่เพราะคำสำคัญต่างๆ ที่ใส่ไว้ เห็นมีคนตามมาอ่านเรื่อง fpdf ที่บ่นๆ ไว้ ไม่ค่อยมีสาระเท่าไหร่ คนอ่านคงจะเซ็งว่าไอ้บ้านี่เขียนอะไรไม่มีประโยชน์เลย awk เป็นเครื่องมือที่ช่วยจัดการไฟล์ข้อความ โดยมองว่าข้อมูลในไฟล์แบ่งเป็นเรคอร์ดและฟิลด์ สามารถระบุได้ว่าจะให้ใช้เครื่องหมายอะไรตัวแบ่งระหว่างฟิลด์หรือเรคอร์ด ลองดูตัวอย่างง่ายๆ กันก่อน ถ้าผมมีไฟล์ข้อมูลคะแนนนักเรียนอยู่ แบ่งเรคอร์ดตามบรรทัด และแบ่งฟิลด์ด้วยแท็บ 4822111111 10 4822222222 13 4833333333 14 4844444444 9 ถ้าจะแปลงข้อมูลในไฟล์นี้เป็นตารางในแบบ html ก็ทำได้โดยอ่านไฟล์มาทีละบรรทัด แล้วเพิ่มแท็ก tr และ td ลงไป BEGIN &#123; FS=&#34;\t&#34; print &#34;&#60;table&#62;&#34; &#125; &#160; &#123; print &#34;&#60;tr&#62;&#60;td&#62;&#34;$1&#34;&#60;/td&#62;&#60;td&#62;&#34;$2&#34;&#60;/td&#62;&#60;/tr&#62;&#34; &#125; &#160; END &#123; print [...]]]></description>
			<content:encoded><![CDATA[<p>ตอนนี้พยายามเขียนเรื่องให้มีสาระมากขึ้น มากกว่าแค่แปะลิงก์ แล้วก็กล่าวถึงนิดๆ เพราะลองดูสถิติจาก Google Analytics แล้ว รู้สึกว่ามีคนหลงมาที่นี่เพราะคำสำคัญต่างๆ ที่ใส่ไว้ เห็นมีคนตามมาอ่านเรื่อง fpdf ที่บ่นๆ ไว้ ไม่ค่อยมีสาระเท่าไหร่ คนอ่านคงจะเซ็งว่าไอ้บ้านี่เขียนอะไรไม่มีประโยชน์เลย</p>
<p>awk เป็นเครื่องมือที่ช่วยจัดการไฟล์ข้อความ โดยมองว่าข้อมูลในไฟล์แบ่งเป็นเรคอร์ดและฟิลด์ สามารถระบุได้ว่าจะให้ใช้เครื่องหมายอะไรตัวแบ่งระหว่างฟิลด์หรือเรคอร์ด ลองดูตัวอย่างง่ายๆ กันก่อน ถ้าผมมีไฟล์ข้อมูลคะแนนนักเรียนอยู่ แบ่งเรคอร์ดตามบรรทัด และแบ่งฟิลด์ด้วยแท็บ</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">4822111111	10
4822222222	13
4833333333	14
4844444444	9</pre></div></div>

<p>ถ้าจะแปลงข้อมูลในไฟล์นี้เป็นตารางในแบบ html ก็ทำได้โดยอ่านไฟล์มาทีละบรรทัด แล้วเพิ่มแท็ก tr และ td ลงไป</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">BEGIN <span style="color: #7a0874; font-weight: bold;">&#123;</span>
  <span style="color: #007800;">FS</span>=<span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
  print <span style="color: #ff0000;">&quot;&lt;table&gt;&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
  print <span style="color: #ff0000;">&quot;&lt;tr&gt;&lt;td&gt;&quot;</span>$<span style="color: #000000;">1</span><span style="color: #ff0000;">&quot;&lt;/td&gt;&lt;td&gt;&quot;</span>$<span style="color: #000000;">2</span><span style="color: #ff0000;">&quot;&lt;/td&gt;&lt;/tr&gt;&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
END <span style="color: #7a0874; font-weight: bold;">&#123;</span>
  print <span style="color: #ff0000;">&quot;&lt;/table&gt;&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>เมื่อเขียนเสร็จ ก็ลองเอามาใช้งานได้โดย</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ awk -f [awk-file] &amp;lt; [data-file]</pre></div></div>

<p>จะได้ผลเป็นตารางในตามข้างล่าง</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;table border=&quot;0&quot;&gt;
&lt;tr&gt;
&lt;td&gt;4822111111&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4822222222&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4833333333&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4844444444&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</pre></div></div>

<p>ในโปรแกรม awk ข้างต้น แบ่งออกเป็น 3 ส่วน แต่ละส่วนแบ่งด้วยวงเล็บปีกกา ส่วนแรกมีคำว่า BEGIN กำหนดอยู่หมายความว่าให้ทำครั้งเดียวตอนเริ่มต้นอ่านไฟล์ ในที่นี้กำหนดให้ใช้แท็บเป็นตัวแบ่งฟิลด์ แล้วก็พิมพ์ &#8220;&lt;table&gt;&#8221; ออกมา</p>
<p>ส่วนที่สองไม่ได้กำหนดอะไรไว้ก่อนเครื่องหมายวงเล็บปีกกาเปิด ก็จะทำงานทุกครั้งเมื่อขึ้นเรคอร์ดใหม่ จึงเป็นการพิมพ์ข้อมูลทีละแถวในตาราง โดย $1 ใช้แทนข้อมูลในฟิลด์ที่ 1 และ $2 จะแทนฟิลด์ที่ 2  ไปเรื่อยๆ</p>
<p>ส่วนที่สามเริ่มต้นด้วย END จะทำงานเพียงครั้งเดียวเมื่ออ่านไฟล์ทั้งหมดเสร็จแล้ว ดังนั้นจึงแค่พิมพ์ &#8220;&lt;/table&gt;&#8221; ออกมาในตอนท้าย</p>
<p>ด้วยลักษณะที่ awk ทำงานตามเรคอร์ดและฟิลด์ ทำให้การเขียนโปรแกรมเพื่อจัดการกับข้อมูลต่างๆ ทำได้สะดวกขึ้น ไม่จำเป็นต้องเขียนลูปเพื่อวนรอบ แค่เขียนเป็นกฎไว้เท่านั้นก็พอ นอกจากนี้ยังสามารถระบุให้ทำงานกับเรคอร์ดที่แตกต่างกันได้ด้วย โดยใช้ Regular Expression กำหนดรูปแบบของเรคอร์ดนั้น เช่น</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>^<span style="color: #000000;">4822</span><span style="color: #000000; font-weight: bold;">/</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span> print <span style="color: #ff0000;">&quot;48&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>กฎข้างต้นจะทำให้พิมพ์คำว่า &#8220;48&#8243; เมื่อเรคอร์ดขึ้นต้นด้วย &#8220;4822&#8243; ตามที่กำหนดไว้ใน RE เท่านั้น</p>
<p>จริงๆ แล้วโปรแกรมข้างต้นผมเขียนขึ้นมาใช้งานจริง เวลาจะเอาคะแนนของนักเรียนไปประกาศบนเว็บ หลายคนอาจจะสงสัยว่าทำไมไม่ใช้โปรแกรมพวกสเปรดชีท ทำไมต้องมาใช้ awk ให้เสียเวลา คำตอบก็คือ ผมไม่เคยสามารถทำให้โปรแกรมสเปรดชีทต่างๆ สร้างตารางในรูปแบบ html ที่สะอาดๆ ได้เลย ลองมาหลายโปรแกรมแล้ว ทุกๆ อันจะต้องแทรกโน้นนี่มาให้ตลอด แล้วผมก็เป็นพวกโรคจิต ถ้าเห็นโค้ดที่ไม่สะอาดรกรุงรัง ก็จะต้องพยายามหาทางทำให้สะอาด เนื่องจากอยากให้ตารางมันแสดงไปตามรูปแบบที่เรากำหนดไว้แล้ว สุดท้ายเลยตัดสินใจใช้ awk ดีกว่าสร้างโค้ดได้สะอาดสมใจ</p>
<p>แต่ว่าโปรแกรมข้างต้นก็ยังมีข้อจำกัดอยู่ที่กำหนดจำนวนฟิลด์ไว้ตายตัว ทำให้ไม่ยืดหยุ่นเท่าไหร่ ถ้ามีคะแนนหลายๆ ค่า แต่เนื่องจาก awk นั้นมี control structure อยู่หลายแบบ จึงสามารถเขียนให้ยืดหยุ่นขึ้นได้อีกเป็น</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">BEGIN <span style="color: #7a0874; font-weight: bold;">&#123;</span>
  <span style="color: #007800;">FS</span>=<span style="color: #ff0000;">&quot; &quot;</span>
  <span style="color: #007800;">ORS</span>=<span style="color: #ff0000;">&quot;&quot;</span>
  print <span style="color: #ff0000;">&quot;&lt;table class=<span style="color: #000099; font-weight: bold;">\&quot;</span>attendance<span style="color: #000099; font-weight: bold;">\&quot;</span> border=<span style="color: #000099; font-weight: bold;">\&quot;</span>0<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
  print <span style="color: #ff0000;">&quot;&lt;tr&gt;&quot;</span>
  <span style="color: #000000; font-weight: bold;">for</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">i</span>=<span style="color: #000000;">1</span>; i<span style="color: #000000; font-weight: bold;">&amp;</span>lt;=NF; i++<span style="color: #7a0874; font-weight: bold;">&#41;</span>
    print <span style="color: #ff0000;">&quot;&lt;td&gt;&quot;</span><span style="color: #007800;">$i</span><span style="color: #ff0000;">&quot;&lt;/td&gt;&quot;</span>
  print <span style="color: #ff0000;">&quot;&lt;/tr&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
END <span style="color: #7a0874; font-weight: bold;">&#123;</span>
  print <span style="color: #ff0000;">&quot;&lt;/table&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>NF เป็นตัวแปรระบุจำนวนฟิลด์ ซึ่งทำให้เราสามารถใช้ลูปเพื่อพิมพ์ข้อมูลจากทุกๆ ฟิลด์ได้</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2008/07/05/awk/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>mcrypt</title>
		<link>http://cholwich.org/wordpress/2007/05/25/mcrypt/</link>
		<comments>http://cholwich.org/wordpress/2007/05/25/mcrypt/#comments</comments>
		<pubDate>Fri, 25 May 2007 07:30:23 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=20</guid>
		<description><![CDATA[mcrypt เป็นโปรแกรมที่พํฒนาขึ้นเพื่อทดแทน crypt บน Unix ซึ่งใช้สำหรับเข้ารหัสไฟล์ข้อมูล พอดีตอนนี้ต้องสำรองข้อมูลจาก mysql ไปไว้ที่อื่น เลยอยากเข้ารหัสด้วย เพื่อเพิ่มความปลอดภัย ก็เลยเขียน shell script ขึ้นมาอันนึง ให้เรียก mysqldump จากนั้นก็เรียก mcrypt มาเข้ารหัส แล้วค่อยส่งไปเก็บไว้ที่อีกเครื่องหนึ่ง วิธีใช้ mcrypt ก็ไม่ยาก เพียงแค่กำหนดขั้นตอนวิธีที่จะใช้เข้ารหัส รวมทั้งวิธีระบุกุญแจที่จะใช้ เช่น mcrypt -a des --keymode pkdes [filename] โปรแกรมก็จะรอให้กำหนดกุญแจที่จะใช้ ถ้ากำหนดเรียบร้อยแล้ว ก็จะเข้ารหัสให้ และได้ไฟล์ใหม่โดยเติม .nc เข้าไปข้างท้าย วิธีนี้จะใช้สำหรับ interactive เท่านั้น ถ้าเป็นกรณีที่ต้องการใช้ใน shell script ก็ต้องกำหนดให้ไปเอากุญแจมาจากไฟล์ เช่น mcrypt -a des --keymode pkdes -f [key-file] [filename] [...]]]></description>
			<content:encoded><![CDATA[<p>mcrypt เป็นโปรแกรมที่พํฒนาขึ้นเพื่อทดแทน crypt บน Unix ซึ่งใช้สำหรับเข้ารหัสไฟล์ข้อมูล พอดีตอนนี้ต้องสำรองข้อมูลจาก mysql ไปไว้ที่อื่น เลยอยากเข้ารหัสด้วย เพื่อเพิ่มความปลอดภัย ก็เลยเขียน shell script ขึ้นมาอันนึง ให้เรียก mysqldump จากนั้นก็เรียก mcrypt มาเข้ารหัส แล้วค่อยส่งไปเก็บไว้ที่อีกเครื่องหนึ่ง</p>
<p>วิธีใช้ mcrypt ก็ไม่ยาก เพียงแค่กำหนดขั้นตอนวิธีที่จะใช้เข้ารหัส รวมทั้งวิธีระบุกุญแจที่จะใช้ เช่น</p>
<p><code>mcrypt -a des --keymode pkdes [filename]</code></p>
<p>โปรแกรมก็จะรอให้กำหนดกุญแจที่จะใช้ ถ้ากำหนดเรียบร้อยแล้ว ก็จะเข้ารหัสให้ และได้ไฟล์ใหม่โดยเติม .nc เข้าไปข้างท้าย วิธีนี้จะใช้สำหรับ interactive เท่านั้น ถ้าเป็นกรณีที่ต้องการใช้ใน shell script ก็ต้องกำหนดให้ไปเอากุญแจมาจากไฟล์ เช่น</p>
<p><code>mcrypt -a des --keymode pkdes -f [key-file] [filename]</code></p>
<p>แต่ปัญหาที่พบก็คือขั้นตอนวิธีเข้ารหัส แต่ละอันจะมีข้อกำหนดเรื่องความยาวสูงสุดของกุญแจ ถ้ากำหนดยาวเกินไปก็จะเกิด error ขึ้น เช่น DES จะรองรับแค่ 8 ตัวอักษรเท่านั้น จึงต้องดูเรื่องนี้ประกอบด้วย โดยรายละเอียดจะมีอยู่ที่ &#8211;list-keymodes</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2007/05/25/mcrypt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
