<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Tasuka&#039;s Workbench</title>
		<link>http://tasuka.idv.tw/blog/index.php</link>
		<description><![CDATA[由 Apple Computer Inc.  Mac Mini 1.66 GHz 上執行 GNU Linux 作業系統所產生Apple, Networks, Internetworking, CCIE, LPIC, LPI, Cisco, Linux, BSD, FreeBSD, Macintosh, OS X, Mac, Maintosh, iPhone, iPod, Open source, programming, Cisco, Wireless, 802.11, Radio, Computer, Communication, Telecom,  tasuka, 網路, 電信, 通信原理, 作業系統, 蘋果電腦, 認證, 寫程式, UNIX, OS, Tasuka]]></description>
		<image>
			<url>http://tasuka.idv.tw/blog/interface/feed.png</url>
			<link>http://tasuka.idv.tw/blog/index.php</link>
			<title>Tasuka&#039;s Workbench</title>
			<description><![CDATA[Tasuka&#039;s Workbench]]></description>
		</image>
		<copyright>Copyright 2010, Tasuka</copyright>
		<managingEditor>Tasuka</managingEditor>
		<language>zh-TW</language>
		<generator>SPHPBLOG 0.4.8</generator>
		<item>
			<title>好主管不該教員工摘要 </title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry100301-093107</link>
			<description><![CDATA[<a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010443429" target="_blank" ><b>&quot;好主管不該教員工&quot;</b> 長野慶太</a> 摘要<br /><br />企業主管若只是把看順眼的人納入旗下，把不順眼的人當作備用，那麼公司百分之百會輸給對手。<br /><br />要員工免費加班的公司，根本不會要求員工個人的工作效率，因為這種企業和諧第一，不重效率，營造出一種大家一起挑燈夜戰的樣子，其實根本不講求時效。員工只要守標準作流程就可以了，根本不用強制要求員工的協調精神。<br /><br />收到電子郵件愈多的主管，愈丟臉，而且工作効率愈差。<br /><br />當上主管，不代表著從此可以躲在後面，而討厭的事，都讓部屬去作。<br /><br />球隊老闆應該和觀眾坐在一起，展現他和場內比賽同在的樣子。<br /><br />要讓主管們知道，會議就是成本。<br /><br />開會有多浪費錢，算給老闆看。<br /><br />召開會議將一口氣花掉龐大的人事費用，真的需要不惜成本召開會議?<br /><br />為了會議而用Powerpoint及Excel的盲點，是為了會議做了太多準備，而浪費太多時間成本。<br /><br />出席會議前，一定需事先讀過事前提供的會議資料。並且在會議召開通知，需要有明確的目標。<br /><br />會議時間長，代表工作時間變短。<br /><br />愈是管理不善的公司，工作量的控制愈差，所以一天到晚都處於緊急狀態下。<br /><br />歡迎員工在假日到公司加班，根本不配當主管。<br /><br />因一名員工假日加班行為，而逼得其他人產生罪惡感。當休息成為罪惡時，就是主管的失職。<br /><br />每天搞到很晚才走出公司的話，要檢討上班工作時間，是否經常被打斷。<br /><br />別把終身托付給公司。努力工作，以期對公司有所貢獻，但絕對不能依賴公司過活。]]></description>
			<category>筆記</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry100301-093107</guid>
			<author>Tasuka</author>
			<pubDate>Mon, 01 Mar 2010 01:31:07 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=10&amp;m=03&amp;entry=entry100301-093107</comments>
		</item>
		<item>
			<title>For download files checksum script</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry100204-153822</link>
			<description><![CDATA[從網路上 download 下來的檔案, 提供者經常會有提供 SHA1 check sum 的檔案, <br />以供download之後可以檢查檔案是否完整無誤. 但一個一個檢查也很笨吧. <br />做個 shell script 代勞吧.<br /><br /><pre><br />#!/bin/sh<br /><br />if [ -z &quot;$1&quot; ];then<br />  CHECKSUM=SHA1SUM<br />else<br />  CHECKSUM=$1<br />fi<br /><br />if [ ! -f $CHECKSUM ];then<br />  echo &quot;\&quot;$CHECKSUM\&quot; file is not found.&quot;<br />  exit	<br />fi<br /><br />if [ `uname -s` = &quot;Darwin&quot; ];then<br />  SHA=shasum<br />else<br />  SHA=sha1sum<br />fi<br /><br />F=`ls -la|awk &#039;{print $8}&#039;|grep iso`<br /><br />for i in $F ;do<br />  C1=`$SHA $i|awk &#039;{print $1}&#039;`<br />  C2=`grep $i $CHECKSUM|awk &#039;{print $1}&#039;`<br /><br />  if [ &quot;$C1&quot; = &quot;$C2&quot; ];then<br />    echo &quot;$i ... Checksum Matched&quot;<br />  else<br />    echo &quot;$i ... Checksum Not Matched&quot;<br />  fi <br />done<br /><br />echo &quot;Done&quot;<br /></pre>]]></description>
			<category>Network</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry100204-153822</guid>
			<author>Tasuka</author>
			<pubDate>Thu, 04 Feb 2010 07:38:22 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=10&amp;m=02&amp;entry=entry100204-153822</comments>
		</item>
		<item>
			<title>歐巴馬在 Google 和 Youtube</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry100129-221337</link>
			<description><![CDATA[<img src="images/US_President_Vote_In_Google.jpeg" width="530" height="268" border="0" alt="" /><br />上圖是在 Google 上看到的，拿下來以資紀念。]]></description>
			<category>有的沒的</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry100129-221337</guid>
			<author>Tasuka</author>
			<pubDate>Fri, 29 Jan 2010 14:13:37 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=10&amp;m=01&amp;entry=entry100129-221337</comments>
		</item>
		<item>
			<title>SIKULI 為 GUI 自動化開了一道門</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry100128-132124</link>
			<description><![CDATA[前天試用了一下來自台灣台中的 <a href="http://blog.vgod.tw/about-vgod/" target="_blank" >vgod</a> 在<a href="http://web.mit.edu/" target="_blank" >MIT</a>修業兩年的成果, <a href="http://sikuli.csail.mit.edu/" target="_blank" >SIKULI Project</a>, 發覺這真的是像 vgod 自己在 Blog 說的是會<a href="http://blog.vgod.tw/2010/01/25/change-the-world/" target="_blank" >改變 GUI 世界</a>的東西啊. 這是可以將 GUI 的原本需要人一個一個click的用法, 變成 batch 的方式. 也就是說可以將多個 GUI 程式經由 SIKULI 串在一起, 完成一件事, 或者是可以將原本需要人用Mouse在電腦之前,一步一步的確認及回應, 現在可以將這些動作自動化了. 可以自動化對於常用電腦執行固定工作項目的人,是很重要的一個需求.讓電腦將經常需要重覆的工作自動化, 這樣人才有時間作別的事, Work Smart, do&#039;nt work hard, 意思是說要聰明的工作, 而不要白費力氣的工作啊. 有了自動的 GUI script 正好補完了多年來 GUI 無法自動化的缺口.<br /><br />在Macintosh 有 <a href="http://en.wikipedia.org/wiki/AppleScript" target="_blank" >Apple script</a>可以作類似的工作, 不過前提是 GUI 程式要有支援 Scriptable 的介面, 和 Apple Script 連結起來, 才可以用 script 控制 GUI 的程式工作. 而在 UNIX 系統上(Linux/BSD/Solaris/AIX...都是), 可以用的 script 就更多了, Shell script, Perl, PHP, Python, Ruby, TCL/Tk, Expect等等, 各有不同的語法及用途, 不過有一個共通點, 就是只能用在文字模式, 或是自己所構成的 GUI 環境, 無法和別的 GUI 程式互動. 在 Microsoft 的作業系統上的 script 就更弱了, 來自80年代的 DOS batch file, 以少得可憐的指令, 及奇怪的用法, 一樣是工作文字模式下, 可以經由 VBScript 作出 GUI 及使用 OLE 和別的程式作有限度的互動, 雖然有人作出了 <a href="http://www.autoitscript.com/autoit3/" target="_blank" >Autoit</a> 和 <a href="http://www.autohotkey.com/" target="_blank" >AutoHotkey</a>, 不過都需要使用文字程式碼寫成 script, 而這都需要一定的程式語言使用背景才可以完成,還是沒有 SIKULI 直接及簡單. 以前有一個作業系統叫 <a href="http://en.wikipedia.org/wiki/BeOS" target="_blank" >BeOS</a>，可以用Cortex 在 GUI 中將各不同的影音來源輸入和輸出串在一起，一起工作，例如從介面錄音之後直接送到MP3 encoder壓縮後，再送到音效卡輸出，全部用GUI將線接在一起就可以，不過 BeOS 已經是昨日黃花，已經進入歷史了，現在有的只有一個相容的 Open source 計畫，叫作 <a href="http://www.haiku-os.org/" target="_blank" >Haiku</a>。<br /><br />SIKULI 使用的方法說起來也很簡單, 就是先將要做動作的圖象, 用 screen capture 給剪下來, 在執行 script 時進行比對, 若有一定程度的相似性(可在 script 中設定),就作 script 中指定的動作, 如 type 一段文數字,或是按一下 botton. 這樣子的作法是比較慢, 但好處是沒有作業系統相容的問題, 也沒有需要連結程式庫或預先作好的介面問題, 一切都和人在使用 GUI 介面時一樣, 用眼睛看, 選擇相對 icon, 作出對應的事件,像是按一次,或兩次, 或輸入資料等. 夠直接了吧!<br /><br />我花了三分鐘就作了一個可以將 Windows 關機的 script.<br /><img src="images/SIKULI-ShutdownWindows.jpg" width="168" height="114" border="0" alt="" /><br />簡單吧，在 SIKULI 的網頁上還有很多的例子。<br /><br />最棒的是 SIKULI 是 Open source, 所以應該可以在任何電腦系統上,經過一定的修補後執行. SIKULI 使用 <a href="http://www.jython.org/" target="_blank" >Jython</a>, 所以要有 <a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank" >Java JDK/JRE</a> 才可以執行.不過在 Windows 版的好像 save 就會 crash, 而 OS X 版的就不會. Linux 還在和 OpenCV Library 打架中. 在 Windows 版本上可以設定 screen capture 的時間 delay, 以免還沒有找到要按的按鍵就 timeout 了. 我是設成 3 秒, 好像比較可以符合慢慢的 Windows XP.<br /><br />SIKULI 使用 <a href="http://www.jython.org/" target="_blank" >Jython</a>, 所以要有 <a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank" >Java JDK/JRE</a> 才可以執行. 在作 screenshut 時要注意的是背景顏色, 會干擾圖象辦認的正確, 在使用時要小心. 也可以先用別的程式將圖象抓下來, 再放到 script 中, 可以節省時間. 我看到的是 SIKULI 使用 png 格式, 不知道 jpeg 和 gif 可不可以. 因為 SIKULI 現在還在 beta 版, 所以文件部份只有簡單的說明1, 希望未來會有較多較詳細的說明. <br /><br />不過因為 SIKULI 是使用圖象辦認，所以看來 script 的可移動性會低一點，因為各作業系統，或每個人使用的圖象都可以自行改變，而改了當然就無法正確辦認出來了。<br /><br />現在 vgod 用 SIKULI 為大家開了一扇門, 接下來要如何使用就看我們了吧! 像是測試軟體的可用性, 操作測試儀器, 或是經由多個程式共同完成一個工作等等. 去拿來試試吧, 並把你認為可以加強或不足的部份告訴 vgod , 或者自己從 source code 修改成你要的樣子.<br /><br />SIKULI 網址 <a href="http://sikuli.org" target="_blank" >http://sikuli.org</a><br />vgod Blog <a href="http://blog.vgod.tw" target="_blank" >http://blog.vgod.tw</a><br />vgod 在 twitter 上開了一個 SIKULI 的專推 <a href="http://twitter.com/sikuli" target="_blank" >sikuli@twitter</a>]]></description>
			<category>Open Source</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry100128-132124</guid>
			<author>Tasuka</author>
			<pubDate>Thu, 28 Jan 2010 05:21:24 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=10&amp;m=01&amp;entry=entry100128-132124</comments>
		</item>
		<item>
			<title>雜念</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry100112-234447</link>
			<description><![CDATA[一家公司老闆的心很重要，老闆有心，找到對的管理人，在公司發出一定向心力，公司才會好，若開會講得頭頭是道，反正會議結束之後也不用他負責作，咀咒給別人死。凡事只有Schedule要求，沒有提供Budget，沒有人力，要兵給將...。發生問題，一定是部屬能力有問題，自已一定都是對的。<br /><br />一個會議動不動就四五小時，可以花三四個小時喬schedule和人力，而不想這個問題可能只要數分鐘就可以解決。而會議長度無法有效控制，浪費與會人員的工作時間，可以前期個別討論的，卻放到會議上才講，美其名為很忙，事實就是不會利用時間，及控制場面。不過是一個逐會議而居，靠會議為生的廢人而已。若是主管是這種人，公司會好是運氣，不好是正常。若當個主管只是喬schedule和人力，這種工作是不需要用到高階主管的，只要請一位專門管理師就可以作得很好。<br /><br />主管的工作是什麼呢？開會？發信？駡人？包工程？...........都不是吧，應該是安內壤外才對啊。為部門、為公司爭取最大福利，並準時完成工作，以及讓部屬可以回家和家人在一起，而不是在公司加班工作，或將工作帶回家。長時間工作對身心都不好，工作效率一定不好吧！一直無法了解的是，多加班的一定可以作好工作，效率高，為何不是準時下班而又做好工作效率高。一天工作八小時完成一件事，和一天工作十四小時，用兩天完成一件事，那個好啊！當然是作了二十八小時才完成的比較辛苦啊，他有加班啊，作那麼久才作好一定比較難完成吧。若長此下去結果會是如何呢？大家就會加班在公司打球、聊天混時間了吧。<br /><br />難怪很多人不想作主管，而很多人只想作主管。]]></description>
			<category>有的沒的</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry100112-234447</guid>
			<author>Tasuka</author>
			<pubDate>Tue, 12 Jan 2010 15:44:47 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=10&amp;m=01&amp;entry=entry100112-234447</comments>
		</item>
		<item>
			<title>用 Expect 連接 RS-232 及 telnet</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091231-165058</link>
			<description><![CDATA[<a href="http://expect.nist.gov" target="_blank" >expect</a> 可以模擬和程式或設備溝通, 是很方便的小工具, 使用 <a href="http://www.tcl.tk/" target="_blank" >tcl</a> script language, 可以用在 rs-232, telnet, ftp 等等, 將需要人操作的程式自動化. 可以在 Windows/Linux/BSD/Solaris/Mac OS X ...上使用.<br /><br />用 expect 連接 RS-232 自動在人機介面模擬人按鍵, 作自動測試.<br /><pre><br />#!/usr/bin/expect --<br /># add -d for expect dump debug message<br />#<br />proc startUp x {<br />  send &quot; &quot;<br />  send &quot; &quot;<br />  sleep 1<br />  return<br />}<br /><br />proc backSpace x {<br /># Send 8 backspace key code<br />  send \177\177\177\177\177\177\177\177<br />  sleep 1<br />  return<br />}<br /><br />proc loopbackTest x {<br />  set y $x<br />  set timeout 3<br /># 0x28 is down arrow keycode<br />  if {$y eq 0} {<br />    send \x28<br />    sleep 1<br />    set timeout 1<br />    expect {<br />      STU-C-I/F {<br />        send &quot; &quot;<br />        send &quot;\r&quot;<br />      }<br />      STU-C-DSL {<br />        send &quot;\r&quot;<br />      }<br />      STU-R-DSL {<br />        send &quot; &quot;<br />        send &quot; &quot;<br />        send &quot; &quot;<br />        send &quot;\r&quot;<br />      }<br />      STU-R-I/F {<br />        send &quot; &quot;<br />        send &quot; &quot;<br />        send &quot;\r&quot;<br />      }<br />      timeout {<br />        send &quot; &quot;<br />        send &quot; &quot;<br />        send &quot; &quot;<br />        send &quot;\r&quot;<br />      }<br />    }<br /><br /># 0x28 is down arrow keycode<br />    send \x28<br />    sleep 1<br />  }<br /><br />  set timeout 30<br /><br />  while {$y ne 0} { <br />    expect {<br />      underflow {<br />        puts &quot;\n\nRun $y Times\x07\n\n&quot;<br />        exit $y<br />      }<br />      Network {<br />        send &quot;\r&quot;<br />      }<br />      Customer {<br />        sleep 1<br />      }<br />      Off {<br />        send &quot;\r&quot;<br />      }<br />      Download {<br />        send &quot;\x07&quot;<br />        exit<br />      }<br />      timeout {<br />        send &quot; &quot;<br />      }<br />    }<br />    incr y<br />  }<br />  ## Rescursive test<br />  incr y<br />  loopbackTest $y<br />  return<br />}<br /><br />proc carrigeReturn x {<br /># Carrige Return 0x13 &quot;\r&quot;<br />  send &quot;\r&quot;<br />  sleep 1<br />  return<br />}<br /><br />proc passwordKeyin x {<br />  expect {<br />    assword: {<br />      # press enter as password<br />      carrigeReturn 0<br />    }<br />    Test {<br />      # Goto Test menu<br />      send T<br />      sleep 1<br />      # Goto Loopback Test<br />      loopbackTest 0<br />      return<br />    }<br />    again {<br />      # Password error, send Enter to try again<br />      carrigeReturn 0<br />    }<br />    loopbacks {<br />      # Send Escape key to escape to main menu<br />      send \033<br />      sleep 1<br />      # Goto Test menu<br />      send T<br />      sleep 1<br />      # Goto Loopback Test<br />      loopbacktest 0<br />      return<br />    }<br />    &quot;Clear 24 Hour History&quot; {<br />      # It must in Main Menu, Escape<br />      send \033<br />      sleep 1<br />    }<br />    Download {<br />      puts &quot;\x07&quot;<br />      exit<br />    }<br />    timeout {<br />      # Nothing, send backspace and enter for renew screen display<br />      backSpace 0<br />      sleep 1<br />      send &quot;\r&quot;<br />      sleep 1<br />    }<br />  }<br />}<br /><br /># Set default timeout<br />set timeout 10<br /># Set Serial port parameters<br />set port [open /dev/tts/USB0 RDWR]<br />fconfigure $port -blocking 0 -buffering line -mode 9600,n,8,1 -translation auto <br />-eofchar {}<br /><br /># Start connect from serial port<br />uplevel #0 {spawn -open $port}<br /><br />#set session1 $spawn_id<br /><br /># wait for connected<br />sleep 2<br /><br /># Send 2 space for calculate connection speed from client<br />startUp 0<br />#<br />set x 0<br />while {$x eq 0} {<br />  passwordKeyin 0<br />}<br />#passwordKeyin 0<br />#passwordKeyin 0<br /><br />#close serial port<br />close $port<br />#End<br /></pre><br /><br />用 expect 連接 Telnet 並按鍵<br /><pre><br />#!/usr/bin/expect -d<br /><br />set timeout 3<br /><br />spawn telnet 172.16.7.250<br /><br />while {$timeout ne 0} {<br />  expect {<br />    4.SW4 {<br />      expect {<br />        timeout {<br />  	  send &quot;4\r&quot;<br />        }<br />      } <br />    }<br />    timeout {<br />      send &quot;0&quot;<br />    }<br />  }          <br />}<br /></pre><br />]]></description>
			<category>Misc</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091231-165058</guid>
			<author>Tasuka</author>
			<pubDate>Thu, 31 Dec 2009 08:50:58 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=12&amp;entry=entry091231-165058</comments>
		</item>
		<item>
			<title>Terminal Characters define</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091221-123143</link>
			<description><![CDATA[000 0 0x00 NUL<br />001 1 0x01 SOH, Control-A<br />002 2 0x02 STX, Control-B<br />003 3 0x03 ETX, Control-C<br />004 4 0x04 EOT, Control-D<br />005 5 0x05 ENQ, Control-E<br />006 6 0x06 ACK, Control-F<br />007 7 0x07 BEL, Control-G<br />010 8 0x08 BS, backspace, Control-H<br />011 9 0x09 HT, tab, Control-I<br />012 10 0x0a LF, line feed, newline, Control-J<br />013 11 0x0b VT, Control-K<br />014 12 0x0c FF, form feed, NP, Control-L<br />015 13 0x0d CR, carriage return, Control-M<br />016 14 0x0e SO, Control-N<br />017 15 0x0f SI, Control-O<br />020 16 0x10 DLE, Control-P<br />021 17 0x11 DC1, XON, Control-Q<br />022 18 0x12 DC2, Control-R<br />023 19 0x13 DC3, XOFF, Control-S<br />024 20 0x14 DC4, Control-T<br />025 21 0x15 NAK, Control-U<br />026 22 0x16 SYN, Control-V<br />027 23 0x17 ETB, Control-W<br />030 24 0x18 CAN, Control-X<br />031 25 0x19 EM, Control-Y<br />032 26 0x1a SUB, Control-Z]]></description>
			<category>Misc</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091221-123143</guid>
			<author>Tasuka</author>
			<pubDate>Mon, 21 Dec 2009 04:31:43 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=12&amp;entry=entry091221-123143</comments>
		</item>
		<item>
			<title>Arduino WebSwitch</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091214-171350</link>
			<description><![CDATA[加入了將設定寫至 Flash memory 及將 string 用 PANGMEM 放至 Flash memory 以縮小 RAM 的用量。因為測試用的 Arduino 只有 1024 byte RAM，所以要用時間換取空間，不然 1024 byte 很快就用光了。而且將原本一個 function 到底的程式，區分為多個共用 functions 以節省 Flash memory 的用量。看來效果還不錯，不過程式的可讀性變得很低。下一個來試試 Telnet 和 Finger，若拿到 ATMega328 就有 2K RAM 和 32K Flash memory 可以用，就可以將所有的 services 放在一起了。 <br /><br />這個程式很簡單，在 8 支 digital pin 上，連接電晶體當電子開關，控制 Relay 或 SSR，作為網路可控制110V/220V的 8 孔電源開關。可以由 Web browser 得知開關的狀態。預設的 IP address 是用 169.254.0.0/16 所以可以在一開始時用簡單 Crossover 線，接上PC Windows (設定為 DHCP)的方式設定好正確的 IP，也可以設定開關的 default 狀態。<br /><br /><pre><br />/*<br />  This program is wor Arduino Ethernet Shield with W5100 ethernet chip,<br />  As a 8 digital pins control in web page<br />  Version : 1.0<br />  Programmer : Tasuka Hsu, Dec 1 2009<br />*/<br /><br />// Library import<br />#include &lt;Ethernet2.h&gt;<br />#include &lt;Print.h&gt;<br />#include &lt;Server.h&gt;<br />#include &lt;Client.h&gt;<br />#include &lt;EEPROM.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />// Const define <br />#define LENGTH 50  // Message length<br />#define PINS 8     // Digital pins 1 to 8<br /><br />#define EEPROM_START_ADDRESS 0<br />#define EEPROM_MAC EEPROM_START_ADDRESS+10<br />#define EEPROM_IP EEPROM_MAC+6<br />#define EEPROM_SUBNET EEPROM_IP+4<br />#define EEPROM_GATEWAY EEPROM_SUBNET+4<br />#define EEPROM_PORT EEPROM_GATEWAY+4<br />#define EEPROM_REFRESH EEPROM_PORT+2<br />#define EEPROM_SW EEPROM_REFRESH+2<br />#define EEPROM_RESERVED EEPROM_SW+8<br /><br />// MAC Address<br />byte MAC[]={0x80,0x0c,0x01,0x01,0xef,0xfe};<br /><br />byte Default IP Address setting<br />byte IP[]={169,254,1,1};<br />byte GATEWAY[]={0,0,0,0};<br />byte SUBNET[]={255,255,0,0};<br /><br />//byte IP[]={172,16,7,250};<br />//byte GATEWAY[]={172,16,7,254};<br />//byte SUBNET[]={255,255,255,248};<br /><br />byte SW[PINS]={0,0,0,0,0,0,0,0}; /* Switch defult state config */<br /><br />unsigned int  PORT=80;    // HTTP port<br />unsigned int  REFRESH=120;  // HTTP refresh timer<br /><br />// Keep Strings in Flash Memory not load into RAM for RAM space save<br />static char TITLE_S[] PROGMEM =       &quot;Adruino Digital Pins Control&quot;;<br />static char ANNOUNCE[] PROGMEM =      &quot;Tasuka Lab&quot;;<br />static char FOOTER0[] PROGMEM =       &quot;Open source of hardware and software for Arduino&quot;;<br />static char FOOTER1[] PROGMEM =       &quot;Program By Tasuka Hsu&quot;;<br />static char ARDUINO_WEB[] PROGMEM =   &quot;http://www.arduino.cc&quot;;<br /><br />static char HTML_HEADER0[] PROGMEM =  &quot;HTTP/1.1 200 OK&quot;;<br />static char HTML_HEADER1[] PROGMEM =  &quot;Content-Type: text/html; charset=utf-8&quot;;<br />static char HTML[] PROGMEM =          &quot;&lt;html&gt;&quot;;<br />static char HTML_[] PROGMEM =         &quot;&lt;/html&gt;&quot;;<br />static char TITLE[] PROGMEM =         &quot;&lt;title&gt;&quot;;<br />static char TITLE_[] PROGMEM =        &quot;&lt;/title&gt;&quot;;<br />static char HEAD[] PROGMEM =          &quot;&lt;head&gt;&quot;;<br />static char HEAD_[] PROGMEM =         &quot;&lt;/head&gt;&quot;;<br />static char CENTER[] PROGMEM =        &quot;&lt;center&gt;&quot;;<br />static char CENTER_[] PROGMEM =       &quot;&lt;/center&gt;&quot;;<br />static char BODY[] PROGMEM =          &quot;&lt;body&gt;&quot;;<br />static char BODY_[] PROGMEM =         &quot;&lt;/body&gt;&quot;;<br />static char INPUT_TEXT[] PROGMEM =    &quot;&lt;input type=\&quot;text\&quot; name=\&quot;&quot;;<br />static char INPUT_TEXT_[] PROGMEM =   &quot;\&quot; value=\&quot;&quot;;<br />static char INPUT_TEXT__[] PROGMEM =  &quot;\&quot; size=\&quot;&quot;;<br />static char INPUT_TEXT___[] PROGMEM = &quot;\&quot;&gt;&quot;;<br />static char INPUT_RADIO[] PROGMEM =   &quot;&lt;input type=\&quot;radio\&quot; name=\&quot;&quot;;<br />static char META[] PROGMEM =          &quot;&lt;meta http-equiv=\&quot;refresh\&quot; content=\&quot;&quot;;<br />static char META_[] PROGMEM =         &quot;;url=/\&quot;&gt;&quot;;<br />static char SUBMIT[] PROGMEM =        &quot;&lt;input type=\&quot;submit\&quot; value=\&quot;Send\&quot;&gt;&quot;;<br />static char CLEAR_BUF_CHKBX[] PROGMEM = &quot;Clear Config&lt;input type=\&quot;checkbox\&quot; name=\&quot;cl0\&quot;&gt;&quot;;<br />static char CHKBOX[] PROGMEM =          &quot;&lt;input type=\&quot;radio\&quot; name=\&quot;&quot;;<br />static char URL_BTN_RETURN[] PROGMEM =&quot;&lt;a href=\&quot;/\&quot;&gt;&lt;input type=\&quot;button\&quot; value=\&quot;Return\&quot;&gt;&lt;/a&gt;&quot;;<br />static char URL_BTN_BACK[] PROGMEM =  &quot;&lt;a href=\&quot;/?g=1\&quot;&gt;&lt;input type=\&quot;button\&quot; value=\&quot;Back\&quot;&gt;&lt;/a&gt;&quot;;<br />static char URL_BTN_CONFIG[] PROGMEM =&quot;&lt;a href=\&quot;/?g=1\&quot;&gt;&lt;input type=\&quot;button\&quot; value=\&quot;Config\&quot;&gt;&lt;/a&gt;&quot;;<br />static char FORM[] PROGMEM =          &quot;&lt;form method=\&quot;GET\&quot; action=\&quot;/\&quot;&gt;&quot;;<br />static char FORM_[] PROGMEM =         &quot;&lt;/form&gt;&quot;;<br />static char DIGITAL_TITLE[] PROGMEM = &quot;&lt;tr&gt;&lt;td&gt;Digital Pin&lt;/td&gt;&lt;td&gt;On&lt;/td&gt;&lt;td&gt;Off&lt;/td&gt;&lt;/tr&gt;&quot;;<br />static char TABLE_BORDER[] PROGMEM =  &quot;&lt;table border=\&quot;1\&quot; align=\&quot;center\&quot;&gt;&quot;;<br />static char TABLE_NO_BORDER[] PROGMEM=&quot;&lt;table border=\&quot;0\&quot; align=\&quot;center\&quot;&gt;&quot;;<br />static char TABLE_[] PROGMEM =        &quot;&lt;/table&gt;&quot;;<br />static char MAC_CONFIG[] PROGMEM =    &quot;&lt;a href=\&quot;/?g=2\&quot;&gt;Config MAC Address&lt;/a&gt;&quot;;<br />static char IP_CONFIG[] PROGMEM =     &quot;&lt;a href=\&quot;/?g=3\&quot;&gt;Config IP Address&lt;/a&gt;&quot;;<br />static char SUBNET_CONFIG[] PROGMEM = &quot;&lt;a href=\&quot;/?g=4\&quot;&gt;Config Subnet Mask&lt;/a&gt;&quot;;<br />static char GATEWAY_CONFIG[] PROGMEM =&quot;&lt;a href=\&quot;/?g=5\&quot;&gt;Config Gateway Address&lt;/a&gt;&quot;;<br />static char PORT_CONFIG[] PROGMEM =   &quot;&lt;a href=\&quot;/?g=6\&quot;&gt;Config TCP Port&lt;/a&gt;&quot;;<br />static char REFRESH_CONFIG[] PROGMEM =&quot;&lt;a href=\&quot;/?g=7\&quot;&gt;Config HTML Refresh Time&lt;/a&gt;&quot;;<br />static char SW_CONFIG[] PROGMEM =     &quot;&lt;a href=\&quot;/?g=8\&quot;&gt;Config SW Default State&lt;/a&gt;&quot;;<br />static char MAC_TITLE[] PROGMEM =     &quot;&lt;tr&gt;&lt;td&gt;MAC Address&lt;/td&gt;&lt;td&gt;&quot;;<br />static char IP_TITLE[] PROGMEM =      &quot;&lt;tr&gt;&lt;td&gt;IP Address&lt;/td&gt;&lt;td&gt;&quot;;<br />static char SUBNET_TITLE[] PROGMEM =  &quot;&lt;tr&gt;&lt;td&gt;Subnet Mask&lt;/td&gt;&lt;td&gt;&quot;;<br />static char GATEWAY_TITLE[] PROGMEM = &quot;&lt;tr&gt;&lt;td&gt;Gateway&lt;/td&gt;&lt;td&gt;&quot;;<br />static char PORT_TITLE[] PROGMEM =    &quot;&lt;tr&gt;&lt;td&gt;TCP Port&lt;/td&gt;&lt;td&gt;&quot;;<br />static char REFRESH_TITLE[] PROGMEM = &quot;&lt;tr&gt;&lt;td&gt;HTML Refresh Time&lt;/td&gt;&lt;td&gt;&quot;;<br />static char SW_TITLE[] PROGMEM =      &quot;&lt;tr&gt;&lt;td&gt;Switch Default State&lt;/td&gt;&lt;td&gt;&quot;;<br />static char TD_TR_[] PROGMEM =        &quot;&lt;/td&gt;&lt;/tr&gt;&quot;;<br />static char TD_TR_BR[] PROGMEM =      &quot;&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;&quot;;<br />static char ON_OFF[] PROGMEM =        &quot;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;On/Off&lt;/td&gt;&lt;/tr&gt;&quot;;<br />static char CHECKED[] PROGMEM =       &quot;\&quot; checked=\&quot;checked&quot;;<br />static char SPACE[] PROGMEM =         &quot; &quot;;<br /><br />// The string address pointer<br />PROGMEM const char *string_table[]={<br />  TITLE_S,       //0<br />  ANNOUNCE,<br />  FOOTER0,<br />  FOOTER1,<br />  ARDUINO_WEB,<br />  HTML_HEADER0,  //5<br />  HTML_HEADER1,<br />  HTML,<br />  HTML_,<br />  TITLE,<br />  TITLE_,        //10<br />  HEAD,<br />  HEAD_,<br />  CENTER,<br />  CENTER_,<br />  META,         //15<br />  BODY,<br />  BODY_,<br />  INPUT_TEXT,<br />  INPUT_TEXT_,<br />  INPUT_TEXT__,  //20<br />  INPUT_TEXT___,<br />  SUBMIT,<br />  CLEAR_BUF_CHKBX,<br />  URL_BTN_RETURN,<br />  URL_BTN_BACK,  //25<br />  URL_BTN_CONFIG,<br />  TABLE_,<br />  FORM,<br />  META_,<br />  DIGITAL_TITLE,  //30<br />  TABLE_BORDER,<br />  MAC_CONFIG,<br />  IP_CONFIG,<br />  SUBNET_CONFIG,<br />  GATEWAY_CONFIG, // 35<br />  PORT_CONFIG,    <br />  REFRESH_CONFIG,<br />  TABLE_NO_BORDER,<br />  MAC_TITLE,<br />  IP_TITLE,       //40<br />  SUBNET_TITLE,   <br />  GATEWAY_TITLE,<br />  PORT_TITLE,<br />  REFRESH_TITLE,<br />  INPUT_RADIO, //45<br />  FORM_,<br />  TD_TR_,<br />  SW_CONFIG,<br />  SW_TITLE,<br />  CHKBOX,  //50<br />  TD_TR_BR,<br />  ON_OFF,<br />  CHECKED,<br />  SPACE<br />};<br /><br />// RAM buffer for strings move from flash memory<br />char buffer[70];<br /><br />// CGI GET messages buffer<br />char MESSAGE[LENGTH+1];<br />byte page=0;<br />boolean bootUp=true;<br /><br />// HTTP Server setting<br />//Server server=Server(PORT);<br />    <br />// Load string&#039;s content from Flash memory by index of pointer to RAM<br />void get2RAM(byte k)<br />{<br />  strcpy_P(buffer,(char *)pgm_read_word(&amp;(string_table[k])));<br />}<br /><br />void ReadWriteConfig()<br />{<br />  byte i=0;<br /><br />  get2RAM(1);<br />  // Write default data to EEPROM<br />  if((EEPROM.read(EEPROM_START_ADDRESS)!=buffer[0])&amp;&amp;(EEPROM.read(EEPROM_START_ADDRESS+1)!=buffer[1])){<br />    for(i=0;i&lt;10;i++){<br />      EEPROM.write(EEPROM_START_ADDRESS+i,buffer<i>);<br />      if(i&lt;PINS){<br />        EEPROM.write(EEPROM_SW+i,LOW);<br />        SW<i>=0;<br />        if(i&lt;6){<br />          EEPROM.write(EEPROM_MAC+i,MAC<i>);<br />          if(i&lt;4){<br />            EEPROM.write(EEPROM_IP+i,IP<i>);<br />            EEPROM.write(EEPROM_GATEWAY+i,GATEWAY<i>);<br />            EEPROM.write(EEPROM_SUBNET+i,SUBNET<i>);<br />          }<br />        }<br />      }<br />    }<br />    EEPROM.write(EEPROM_PORT,byte((PORT&amp;0xff00)/256));<br />    EEPROM.write(EEPROM_PORT+1,byte(PORT&amp;0x00ff));<br />    EEPROM.write(EEPROM_REFRESH,byte((REFRESH&amp;0xff00)/256));<br />    EEPROM.write(EEPROM_REFRESH+1,byte(REFRESH&amp;0x00ff));<br />  }else{<br />    // Read config data from EEPROM<br />    for(i=0;i&lt;PINS;i++){<br />      SW<i>=EEPROM.read(EEPROM_SW+i);<br />      if(i&lt;6){<br />        MAC<i>=EEPROM.read(EEPROM_MAC+i);   <br />        if(i&lt;4){<br />          IP<i>=EEPROM.read(EEPROM_IP+i);<br />          GATEWAY<i>=EEPROM.read(EEPROM_GATEWAY+i);<br />          SUBNET<i>=EEPROM.read(EEPROM_SUBNET+i);<br />        }<br />      }<br />    }<br />    PORT=(int(EEPROM.read(EEPROM_PORT))*256)+int(EEPROM.read(EEPROM_PORT+1));<br />    REFRESH=(int(EEPROM.read(EEPROM_REFRESH))*256)+int(EEPROM.read(EEPROM_REFRESH+1));<br />  }<br />}<br /><br />void char2Hex(byte m)<br />{<br />  byte j=0;<br />  <br />  for(byte i=0;i&lt;2;i++){<br />    if(i==0){<br />      j=(m&amp;0xf0)/16;<br />    }else{<br />      j=m&amp;0x0f;<br />    }<br />    if(j&gt;=0&amp;&amp;j&lt;=9){<br />      buffer<i>=char(int(j)+&#039;0&#039;);<br />    }else{<br />      buffer<i>=char(int(j)+&#039;A&#039;-10);<br />    }<br />  }<br />  buffer[2]=&#039;\0&#039;;<br />}<br /><br />byte getIP(byte i,byte t)<br />{<br />  byte j=MESSAGE[i+2]-&#039;0&#039;;<br />  byte k=4;<br />  if(j&gt;=0&amp;&amp;j&lt;4){<br />    byte l=0;<br />    while((MESSAGE[i+k]!=&#039;&amp;&#039;)&amp;&amp;(MESSAGE[i+k]!=&#039; &#039;)&amp;&amp;(MESSAGE[i+k]!=&#039;\n&#039;)&amp;&amp;(MESSAGE[i+k]!=&#039;\r&#039;)&amp;&amp;(MESSAGE[i+k]!=&#039;\0&#039;)){<br />      l=l*10+byte(MESSAGE[i+k]-&#039;0&#039;);<br />      k++;<br />    }<br />    switch(t){<br />      case 1:<br />        IP[j]=l;<br />        EEPROM.write(EEPROM_IP+j,l);<br />        break;<br />      case 2:<br />        SUBNET[j]=l;<br />        EEPROM.write(EEPROM_SUBNET+j,l);<br />        break;<br />      case 3:<br />        GATEWAY[j]=l;<br />        EEPROM.write(EEPROM_GATEWAY+j,l);<br />        break;<br />    }<br />  }<br />  return(k);<br />}<br /><br />byte getDigit(byte i,byte t)<br />{<br />  byte k=4;<br />  unsigned int l=0;<br />  while((MESSAGE[i+k]!=&#039;&amp;&#039;)&amp;&amp;(MESSAGE[i+k]!=&#039; &#039;)&amp;&amp;(MESSAGE[i+k]!=&#039;\n&#039;)&amp;&amp;(MESSAGE[i+k]!=&#039;\r&#039;)&amp;&amp;(MESSAGE[i+k]!=&#039;\0&#039;)){<br />    l=l*10+byte(MESSAGE[i+k]-&#039;0&#039;);<br />    k++;<br />  }<br />  switch(t){<br />    case 1:<br />      PORT=l;<br />      EEPROM.write(EEPROM_PORT,byte((PORT&amp;0xff00)/256));<br />      EEPROM.write(EEPROM_PORT+1,byte(PORT&amp;0x00ff));<br />      break;<br />    case 2:<br />    REFRESH=l;<br />    EEPROM.write(EEPROM_REFRESH,byte((REFRESH&amp;0xff00)/256));<br />    EEPROM.write(EEPROM_REFRESH+1,byte(REFRESH&amp;0x00ff));<br />    break;<br />  }<br />  return(k);<br />}<br />void parseCGI()<br />{<br />  byte i=0;<br />  byte flag=false;<br />   <br />  // Send to Digital pins from parse HTTP send message<br />  while(MESSAGE<i>!=&#039;\0&#039;){<br />    // Port Status<br />    if((MESSAGE<i>==&#039;p&#039;||MESSAGE<i>==&#039;P&#039;)&amp;&amp;(MESSAGE[i+2]==&#039;=&#039;)){<br />      digitalWrite(int(MESSAGE[i+1])-&#039;0&#039;,int(MESSAGE[i+3])-&#039;0&#039;);<br />      i+=3;<br />    }<br />    // Page<br />    if((MESSAGE<i>==&#039;g&#039;||MESSAGE<i>==&#039;G&#039;)&amp;&amp;(MESSAGE[i+1]==&#039;=&#039;)){<br />      page=MESSAGE[i+2]-&#039;0&#039;;<br />      i+=2;<br />    }<br />    // Clear EEPROM to zero<br />    if((MESSAGE<i>==&#039;c&#039;||MESSAGE<i>==&#039;C&#039;)&amp;&amp;(MESSAGE[i+1]==&#039;l&#039;||MESSAGE[i+1]==&#039;L&#039;)&amp;&amp;(MESSAGE[i+2]==&#039;0&#039;)&amp;&amp;(MESSAGE[i+3]==&#039;=&#039;)){<br />      for(int j=0;j&lt;512;j++){<br />        EEPROM.write(EEPROM_START_ADDRESS+j,0);<br />      }<br />      i+=6;<br />    }<br />    // MAC Address Config and Write MAC to EEPROM      <br />    if((MESSAGE<i>==&#039;m&#039;||MESSAGE<i>==&#039;M&#039;)&amp;&amp;(MESSAGE[i+1]==&#039;a&#039;||MESSAGE[i+1]==&#039;A&#039;)&amp;&amp;(MESSAGE[i+3]==&#039;=&#039;)){<br />      byte j=MESSAGE[i+2]-&#039;0&#039;;<br />      if(j&gt;=0&amp;&amp;j&lt;6){<br />        for(byte l=0;l&lt;2;l++){<br />          byte k=MESSAGE[i+4+l];<br />          // Change to upper case<br />          if(k&gt;&#039;Z&#039;){<br />            k=k-&#039;a&#039;+&#039;A&#039;;<br />          }<br />          if(k&lt;=&#039;9&#039;&amp;&amp;k&gt;=&#039;0&#039;){<br />            switch(l){<br />              case 0:<br />                MAC[j]=byte(int(k-&#039;0&#039;)*16);<br />                break;<br />              case 1:<br />                MAC[j]+=byte(int(k-&#039;0&#039;));<br />                break;<br />            }<br />          }else{<br />            switch(l){<br />              case 0:<br />                MAC[j]=byte(int(k-&#039;A&#039;+10)*16);<br />                break;<br />              case 1:<br />                MAC[j]+=byte(int(k-&#039;A&#039;+10));<br />                break;<br />            }<br />          }<br />        }<br />        EEPROM.write(EEPROM_MAC+j,MAC[j]);<br />      }<br />      i+=5;<br />    }<br />    // IP Address Config and Write to EEPROM      <br />    if((MESSAGE<i>==&#039;i&#039;||MESSAGE<i>==&#039;I&#039;)&amp;&amp;(MESSAGE[i+1]==&#039;p&#039;||MESSAGE[i+1]==&#039;P&#039;)&amp;&amp;(MESSAGE[i+3]==&#039;=&#039;)){              <br />      i+=getIP(i,1);<br />    }<br />    // Subnet Address Config and Write to EEPROM      <br />    if((MESSAGE<i>==&#039;s&#039;||MESSAGE<i>==&#039;S&#039;)&amp;&amp;(MESSAGE[i+1]==&#039;b&#039;||MESSAGE[i+1]==&#039;B&#039;)&amp;&amp;(MESSAGE[i+3]==&#039;=&#039;)){<br />      i+=getIP(i,2);<br />    }<br />    // Gateway Address Config and Write to EEPROM      <br />    if((MESSAGE<i>==&#039;g&#039;||MESSAGE<i>==&#039;G&#039;)&amp;&amp;(MESSAGE[i+1]==&#039;w&#039;||MESSAGE[i+1]==&#039;W&#039;)&amp;&amp;(MESSAGE[i+3]==&#039;=&#039;)){<br />      i+=getIP(i,3);<br />    }<br />    // Port Config and Write to EEPROM      <br />    if((MESSAGE<i>==&#039;p&#039;||MESSAGE<i>==&#039;P&#039;)&amp;&amp;(MESSAGE[i+1]==&#039;r&#039;||MESSAGE[i+1]==&#039;R&#039;)&amp;&amp;(MESSAGE[i+2]==&#039;0&#039;)&amp;&amp;(MESSAGE[i+3]==&#039;=&#039;)){<br />      i+=getDigit(i,1);<br />    }<br />    // Refresh Time Config and Write to EEPROM      <br />    if((MESSAGE<i>==&#039;r&#039;||MESSAGE<i>==&#039;R&#039;)&amp;&amp;(MESSAGE[i+1]==&#039;f&#039;||MESSAGE[i+1]==&#039;F&#039;)&amp;&amp;(MESSAGE[i+2]==&#039;0&#039;)&amp;&amp;(MESSAGE[i+3]==&#039;=&#039;)){<br />      i+=getDigit(i,2);<br />    }<br />    // Switch default state Config and Write to EEPROM      <br />    if((MESSAGE<i>==&#039;s&#039;||MESSAGE<i>==&#039;S&#039;)&amp;&amp;(MESSAGE[i+1]==&#039;w&#039;||MESSAGE[i+1]==&#039;W&#039;)&amp;&amp;(MESSAGE[i+3]==&#039;=&#039;)){<br />      byte j=MESSAGE[i+2]-&#039;0&#039;;<br />      SW[j]=byte(MESSAGE[i+4]-&#039;0&#039;);<br />      EEPROM.write(EEPROM_SW+j,SW[j]);<br />      i+=5;<br />    }<br />    i++;<br />  }<br />}<br /><br />void setup()<br />{<br />  // Read/Write config from/to EEPROM<br />  ReadWriteConfig();<br /><br />  // Initial digital pin setting to EEPROM store setting<br />  for(byte i=0;i&lt;PINS;i++){<br />    pinMode(i,OUTPUT);<br />    digitalWrite(i,SW<i>);<br />  }<br />}<br /><br />void loop()<br />{<br />  Server server=Server(PORT);<br />  if(bootUp){<br />    // Initial Ethernet MAC and IP setting<br />    Ethernet.begin(MAC,IP,GATEWAY,SUBNET);<br /><br />    // Start server listen<br />    server.begin();<br />    bootUp=false;<br />  }<br />  <br />  /* Initial client */<br />  Client client=server.available();<br />  <br />  if(client) {<br />    boolean current_line_is_blank=true,flag=false;<br />    char c=&#039;\0&#039;;<br />    byte i=0;<br />    <br />    // If connected<br />    while(client.connected()){<br />      if(client.available()){<br />        <br />        /* Clear MESSAGE */<br />        for(i=0;i&lt;LENGTH;i++){<br />          MESSAGE<i>=&#039;\0&#039;;<br />        }<br />        <br />        flag=false;<br />        i=0;<br /><br />        // Read from HTTP GET input information<br />        while((c=client.read())!=&#039;\n&#039; &amp;&amp; i&lt;=LENGTH){<br />          if(c==&#039;?&#039;){<br />            flag=true;<br />          }<br />          if(c==&#039; &#039;||c==&#039;\n&#039;||c==&#039;\0&#039;){<br />            flag=false;<br />          }<br />          if(flag){<br />            MESSAGE[i++]=c;<br />          }<br />        }<br />        MESSAGE<i>=&#039;\0&#039;;<br />        <br />        page=0;<br />        parseCGI();<br /><br />        if(current_line_is_blank){  <br />          // Send HTTP header<br />          get2RAM(5);<br />          client.println(buffer);<br />          //client.println(&quot;HTTP/1.1 200 OK&quot;);<br />          get2RAM(6);<br />          client.println(buffer);<br />          //client.println(&quot;Content-Type: text/html; charset=utf-8&quot;);<br />          client.println();<br />          <br />          // Send HTML<br />          get2RAM(7);<br />          client.println(buffer); <br />          //client.println(&quot;&lt;html&gt;&quot;);<br />          get2RAM(9);<br />          client.print(buffer);<br />          //client.print(&quot;&lt;title&gt;&quot;);<br />          get2RAM(0);<br />          client.print(buffer);<br />          //client.print(TITLE);<br />          get2RAM(10);<br />          client.println(buffer);<br />          //client.println(&quot;&lt;/title&gt;&quot;);<br />          get2RAM(11);<br />          //client.print(&quot;&lt;head&gt;&quot;);<br />          client.print(buffer);<br />          get2RAM(13);<br />          client.print(buffer);<br />          //client.print(&quot;&lt;center&gt;&quot;);<br />          client.print(&quot;&lt;h1&gt;&quot;);<br />          get2RAM(0);<br />          client.print(buffer);<br />          //client.print(TITLE);<br />          client.print(&quot;&lt;/h1&gt;&quot;);<br />          get2RAM(14);<br />          client.print(buffer);<br />          //client.println(&quot;&lt;/center&gt;&quot;);<br />          get2RAM(15);<br />          client.print(buffer);<br />          //client.print(&quot;&lt;meta http-equiv=\&quot;refresh\&quot; content=\&quot;&quot;);<br />          <br />          if(page==0){    <br />            client.print(REFRESH);<br />          }else{<br />            client.print(3600);<br />          }<br />          <br />          get2RAM(29);<br />          client.print(buffer);<br />          //client.println(&quot;;url=/\&quot;&gt;&quot;);<br />          get2RAM(12);<br />          client.println(buffer);<br />          //client.println(&quot;&lt;/head&gt;&quot;);<br />          get2RAM(16);<br />          client.print(buffer);<br />          //client.println(&quot;&lt;body&gt;&quot;);<br />          client.println(&quot;&lt;hr&gt;&quot;);<br />          get2RAM(28);<br />          client.print(buffer);<br />          //client.print(&quot;&lt;form method=\&quot;&quot;);<br />          //client.print(&quot;GET&quot;);<br />          //client.print(&quot;\&quot;&quot;);<br />          //client.println(&quot; action=\&quot;/\&quot;&gt;&quot;);<br /> <br />        if(page==0){          <br />          // Read data from digital pin<br />          get2RAM(31);<br />          client.print(buffer);<br />/*          <br />          client.print(&quot;&lt;table border=\&quot;&quot;);<br />          client.print(1);<br />          client.print(&quot;\&quot;&quot;);<br />          client.print(&quot; &quot;);<br />          client.print(&quot;align=\&quot;&quot;);<br />          client.print(&quot;center&quot;);<br />          client.print(&quot;\&quot;&quot;);<br />          client.println(&quot;&gt;&quot;);<br />*/          <br />          get2RAM(30);<br />          client.print(buffer);<br />/*<br />          client.print(&quot;&lt;tr&gt;&quot;);<br />          client.print(&quot;&lt;td&gt;&quot;);<br />          client.print(&quot;Digital&quot;);<br />          client.print(&quot; &quot;);<br />          client.print(&quot;Pin&quot;);<br />          client.print(&quot;&lt;/td&gt;&quot;);<br />          client.print(&quot;&lt;td&gt;&quot;);<br />          client.print(&quot;On&quot;);<br />          client.print(&quot;&lt;/td&gt;&quot;);<br />          client.print(&quot;&lt;td&gt;&quot;);<br />          client.print(&quot;Off&quot;);<br />          client.print(&quot;&lt;/td&gt;&quot;);<br />          client.println(&quot;&lt;/tr&gt;&quot;);<br />*/          <br />          for(i=0;i&lt;PINS;i++){<br />            client.print(&quot;&lt;tr&gt;&lt;td&gt;SW &quot;);<br />            client.print(int(i));<br />            client.println(&quot;&lt;/td&gt;&lt;td&gt;&quot;);<br />            <br />            /* Display pins status */<br />            if(digitalRead(i)==HIGH){<br />              get2RAM(45);<br />              client.print(buffer);<br />              client.print(&quot;p&quot;);<br />              client.print(int(i));<br />              get2RAM(53);<br />              client.print(buffer);<br />              //client.print(&quot;\&quot; checked=\&quot;checked&quot;);<br />              client.print(1);<br />              get2RAM(21);<br />              client.print(buffer);<br />/*<br />              client.print(&quot;&lt;input type=radio&quot;);<br />              client.print(&quot; &quot;);<br />              client.print(&quot;name=\&quot;&quot;);<br />              client.print(&quot;p&quot;);<br />              client.print(int(i));<br />              client.print(&quot;\&quot;&quot;);<br />              client.print(&quot; &quot;);<br />              client.print(&quot;checked&quot;);<br />              client.print(&quot; &quot;);<br />              client.print(&quot;value=\&quot;&quot;);<br />              client.print(1);<br />              client.print(&quot;\&quot;&gt;&quot;);<br />*/<br />              client.println(&quot;&lt;/td&gt;&quot;);<br /><br />              client.print(&quot;&lt;td&gt;&quot;);<br />              get2RAM(45);<br />              client.print(buffer);<br />              client.print(&quot;p&quot;);<br />              client.print(int(i));<br />              get2RAM(19);<br />              client.print(buffer);<br />              client.print(0);<br />              get2RAM(21);<br />              client.print(buffer);<br />/*<br />              client.print(&quot;&lt;input type=radio&quot;);<br />              client.print(&quot; &quot;);<br />              client.print(&quot;name=\&quot;&quot;);<br />              client.print(&quot;p&quot;);<br />              client.print(int(i));<br />              client.print(&quot;\&quot;&quot;);<br />              client.print(&quot; &quot;);<br />              client.print(&quot;value=\&quot;&quot;);<br />              client.print(0);<br />              client.println(&quot;\&quot;&gt;&quot;);<br />*/<br />            }else{<br />              get2RAM(45);<br />              client.print(buffer);<br />              client.print(&quot;p&quot;);<br />              client.print(int(i));<br />              get2RAM(19);<br />              client.print(buffer);<br />              client.print(1);<br />              get2RAM(21);<br />              client.print(buffer);<br />/*<br />              client.print(&quot;&lt;input type=radio&quot;);<br />              client.print(&quot; &quot;);<br />              client.print(&quot;value=\&quot;&quot;);<br />              client.print(1);<br />              client.print(&quot;\&quot;&quot;);<br />              client.print(&quot; &quot;);<br />              client.print(&quot;name=\&quot;&quot;);<br />              client.print(&quot;p&quot;);<br />              client.print(int(i));<br />              client.print(&quot;\&quot;&gt;&quot;);<br />*/<br />              client.println(&quot;&lt;/td&gt;&quot;);<br /><br />              client.print(&quot;&lt;td&gt;&quot;);<br />              get2RAM(45);<br />              client.print(buffer);<br />              client.print(&quot;p&quot;);<br />              client.print(int(i));<br />              get2RAM(53);<br />              client.print(buffer);<br />              //client.print(&quot;\&quot; checked=\&quot;checked&quot;);<br />              get2RAM(19);<br />              client.print(buffer);<br />              client.print(0);<br />              get2RAM(21);<br />              client.print(buffer);<br />/*<br />              client.print(&quot;&lt;input type=radio&quot;);<br />              client.print(&quot; &quot;);<br />              client.print(&quot;checked&quot;);<br />              client.print(&quot; &quot;);<br />              client.print(&quot;value=\&quot;&quot;);<br />              client.print(0);<br />              client.print(&quot;\&quot;&quot;);<br />              client.print(&quot; &quot;);<br />              client.print(&quot;name=\&quot;&quot;);<br />              client.print(&quot;p&quot;);<br />              client.print(int(i));<br />              client.println(&quot;\&quot;&gt;&quot;);<br />*/<br />            }<br />            <br />            get2RAM(47);<br />            client.print(buffer);<br />            //client.println(&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);<br /><br />          }<br />          get2RAM(27);<br />          client.print(buffer);     <br />          //client.print(&quot;&lt;/table&gt;&quot;);<br />        }<br />        <br />        get2RAM(13);<br />        client.print(buffer);<br />        //client.print(&quot;&lt;center&gt;&quot;);<br />        if(page==1){<br />          get2RAM(32);<br />          client.print(buffer);<br />/*<br />          client.print(&quot;&lt;a href=\&quot;/?g=&quot;);<br />          client.print(2);<br />          client.print(&quot;\&quot;&quot;);<br />          client.print(&quot;&gt;&quot;);<br />          client.print(&quot;Config&quot;);<br />          client.print(&quot; &quot;);<br />          client.print(&quot;MAC Address&quot;);<br />          client.print(&quot;&lt;/a&gt;&quot;);<br />*/<br />          client.println(&quot;&lt;br&gt;&quot;);<br /><br />          get2RAM(33);<br />          client.print(buffer);<br />/*<br />          client.print(&quot;&lt;a href=\&quot;/?g=&quot;);<br />          client.print(3);<br />          client.print(&quot;\&quot;&quot;);<br />          client.print(&quot;&gt;&quot;);<br />          client.print(&quot;Config&quot;);<br />          client.print(&quot; &quot;);<br />          client.print(&quot;IP Address&quot;);<br />          client.print(&quot;&lt;/a&gt;&quot;);<br />*/<br />          client.println(&quot;&lt;br&gt;&quot;);<br />          <br />          get2RAM(34);<br />          client.print(buffer);<br />/*          <br />          client.print(&quot;&lt;a href=\&quot;/?g=&quot;);<br />          client.print(4);<br />          client.print(&quot;\&quot;&quot;);<br />          client.print(&quot;&gt;&quot;);<br />          client.print(&quot;Config&quot;);<br />          client.print(&quot; &quot;);<br />          client.print(&quot;Subnet Mask&quot;);<br />          client.print(&quot;&lt;/a&gt;&quot;);<br />*/<br />          client.println(&quot;&lt;br&gt;&quot;);<br /><br />          get2RAM(35);<br />          client.print(buffer);   <br />/*          <br />          client.print(&quot;&lt;a href=\&quot;/?g=&quot;);<br />          client.print(5);<br />          client.print(&quot;\&quot;&quot;);<br />          client.print(&quot;&gt;&quot;);<br />          client.print(&quot;Config&quot;);<br />          client.print(&quot; &quot;);<br />          client.print(&quot;Gateway Address&quot;);<br />          client.print(&quot;&lt;/a&gt;&quot;);<br />*/<br />          client.println(&quot;&lt;br&gt;&quot;);<br />          <br />          get2RAM(36);<br />          client.print(buffer);<br />/*          <br />          client.print(&quot;&lt;a href=\&quot;/?g=&quot;);<br />          client.print(6);<br />          client.print(&quot;\&quot;&quot;);<br />          client.print(&quot;&gt;&quot;);<br />          client.print(&quot;Config&quot;);<br />          client.print(&quot; &quot;);<br />          client.print(&quot;TCP Port&quot;);<br />          client.print(&quot;&lt;/a&gt;&quot;);<br />*/<br />          client.println(&quot;&lt;br&gt;&quot;);<br /><br />          get2RAM(37);<br />          client.print(buffer);<br />/*          <br />          client.print(&quot;&lt;a href=\&quot;/?g=&quot;);<br />          client.print(7);<br />          client.print(&quot;\&quot;&quot;);<br />          client.print(&quot;&gt;&quot;);<br />          client.print(&quot;Config&quot;);<br />          client.print(&quot; &quot;);<br />          client.print(&quot;HTML Refresh Time&quot;);<br />          client.print(&quot;&lt;/a&gt;&quot;);<br />*/<br />          client.println(&quot;&lt;br&gt;&quot;);<br /><br />          get2RAM(48);<br />          client.print(buffer);<br />          <br />          client.println(&quot;&lt;br&gt;&quot;);<br />        }<br />        if(page&gt;=2){<br />          get2RAM(38);<br />          client.print(buffer);<br />/*          <br />          client.print(&quot;&lt;table border=\&quot;&quot;);<br />          client.print(0);<br />          client.print(&quot;\&quot;&quot;);<br />          client.print(&quot; &quot;);<br />          client.print(&quot;align=\&quot;&quot;);<br />          client.print(&quot;center&quot;);<br />          client.print(&quot;\&quot;&quot;);<br />          client.print(&quot;&gt;&quot;);<br />*/<br /><br />          if(page==2){<br />            get2RAM(39);<br />            client.print(buffer);<br />/*<br />            client.println(&quot;&lt;tr&gt;&quot;);<br />            client.print(&quot;&lt;td&gt;&quot;);<br />            client.print(&quot;MAC Address&quot;);<br />            client.println(&quot;&lt;/td&gt;&quot;);<br />          <br />            client.print(&quot;&lt;td&gt;&quot;);<br />*/<br />            for(i=0;i&lt;6;i++){<br />              if(i&gt;0&amp;&amp;i&lt;6){<br />                client.print(&quot;:&quot;);<br />              }<br />              get2RAM(18);<br />              client.print(buffer);<br />              client.print(&quot;ma&quot;);<br />              client.print(int(i));<br />              get2RAM(19);<br />              client.print(buffer);<br />              char2Hex(MAC<i>);<br />              client.print(buffer);<br />              get2RAM(20);<br />              client.print(buffer);<br />              client.print(2);<br />              get2RAM(21);<br />              client.print(buffer);<br />            }            <br /><br />            client.println(&quot;&lt;/td&gt;&quot;);<br />          }<br />          <br />          if(page==3){<br />            get2RAM(40);<br />            client.print(buffer);<br />/*<br />            client.println(&quot;&lt;tr&gt;&quot;);<br />          <br />            client.print(&quot;&lt;td&gt;&quot;);<br />            client.print(&quot;IP Address&quot;);<br />            client.println(&quot;&lt;/td&gt;&quot;);<br />          <br />            client.println(&quot;&lt;td&gt;&quot;);<br />*/            <br />            for(i=0;i&lt;4;i++){<br />              if(i&gt;0&amp;&amp;i&lt;4){<br />                client.print(&quot;.&quot;);<br />              }<br />              get2RAM(18);<br />              client.print(buffer);<br />              client.print(&quot;ip&quot;);<br />              client.print(int(i));<br />              get2RAM(20);<br />              client.print(buffer);<br />              client.print(3);<br />              get2RAM(19);<br />              client.print(buffer);<br />              client.print(int(IP<i>));<br />              get2RAM(21);<br />              client.print(buffer);<br />            }<br />            <br />            get2RAM(47);<br />            client.print(buffer);            <br />            //client.println(&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);<br />          }<br />          <br />          if(page==4){<br />            get2RAM(41);<br />            client.print(buffer);<br />/*<br />            client.println(&quot;&lt;tr&gt;&quot;);<br />            client.print(&quot;&lt;td&gt;&quot;);<br />            client.print(&quot;Subnet Mask&quot;);<br />            client.println(&quot;&lt;/td&gt;&quot;);<br />          <br />            client.println(&quot;&lt;td&gt;&quot;);<br />*/<br />            for(i=0;i&lt;4;i++){<br />              if(i&gt;0&amp;&amp;i&lt;4){<br />                client.print(&quot;.&quot;);<br />              }<br />              get2RAM(18);<br />              client.print(buffer);<br />              client.print(&quot;sb&quot;);<br />              client.print(int(i));<br />              get2RAM(20);<br />              client.print(buffer);<br />              client.print(3);<br />              get2RAM(19);<br />              client.print(buffer);<br />              client.print(int(SUBNET<i>));<br />              get2RAM(21);<br />              client.print(buffer);<br />            }<br />            <br />            get2RAM(47);<br />            client.print(buffer);            <br />            //client.println(&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);<br />          }<br />          <br />            if(page==5){<br />              get2RAM(42);<br />              client.print(buffer);<br />/*<br />              client.println(&quot;&lt;tr&gt;&quot;);<br />              client.println(&quot;&lt;td&gt;&quot;);<br />              client.print(&quot;Gateway&quot;);<br />              client.println(&quot;&lt;/td&gt;&quot;);<br />          <br />              client.print(&quot;&lt;td&gt;&quot;);<br />*/<br />              for(i=0;i&lt;4;i++){<br />                if(i&gt;0&amp;&amp;i&lt;4){<br />                  client.print(&quot;.&quot;);<br />                }<br />                get2RAM(18);<br />                client.print(buffer);<br />                client.print(&quot;gw&quot;);<br />                client.print(int(i));<br />                get2RAM(20);<br />                client.print(buffer);<br />                client.print(3);<br />                get2RAM(19);<br />                client.print(buffer);<br />                client.print(int(GATEWAY<i>));<br />                get2RAM(21);<br />                client.print(buffer);<br />              }<br />              <br />              get2RAM(47);<br />              client.print(buffer);              <br />              //client.println(&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);<br />            }<br />          <br />            if(page==6){<br />              get2RAM(43);<br />              client.print(buffer);<br />/*<br />              client.println(&quot;&lt;tr&gt;&quot;);<br />              client.print(&quot;&lt;td&gt;&quot;);<br />              client.print(&quot;TCP Port&quot;);<br />              client.println(&quot;&lt;/td&gt;&quot;);<br /><br />              client.println(&quot;&lt;td&gt;&quot;);<br />*/              <br />              get2RAM(18);<br />              client.print(buffer);<br />              client.print(&quot;pr&quot;);<br />              client.print(0);<br />              get2RAM(20);<br />              client.print(buffer);<br />              client.print(5);<br />              get2RAM(19);<br />              client.print(buffer);<br />              client.print((unsigned int)int(PORT));<br />              get2RAM(21);<br />              client.print(buffer);<br /><br />              get2RAM(47);<br />              client.print(buffer);          <br />              //client.println(&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);    <br />            }<br />          <br />            if(page==7){<br />              //client.println(&quot;&lt;td&gt;&quot;);<br />              get2RAM(44);<br />              client.print(buffer);<br /><br />              get2RAM(18);<br />              client.print(buffer);<br />              client.print(&quot;rf&quot;);<br />              client.print(0);<br />              get2RAM(20);<br />              client.print(buffer);<br />              client.print(3);<br />              get2RAM(19);<br />              client.print(buffer);<br />              client.print((unsigned int)int(REFRESH));<br />              get2RAM(21);<br />              client.print(buffer);<br />              <br />              get2RAM(47);<br />              client.print(buffer);<br />              //client.println(&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);    <br />            }<br />            <br />          if(page==8){<br />            get2RAM(49);<br />            client.print(buffer);<br />            get2RAM(51);<br />            client.print(buffer);<br />            //client.print(&quot;&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;&quot;);<br />            get2RAM(38);<br />            client.print(buffer);<br />            get2RAM(52);<br />            client.print(buffer);<br />            //client.println(&quot;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;On/Off&lt;/td&gt;&lt;/tr&gt;&quot;);<br />            <br />            for(i=0;i&lt;PINS;i++){<br />              client.print(&quot;&lt;tr&gt;&lt;td&gt;SW&quot;);<br />              client.print(int(i));<br />              client.print(&quot;&lt;/td&gt;&lt;td&gt;&quot;);<br />              get2RAM(45);<br />              client.print(buffer);<br />              //client.print(&quot;&lt;input type=\&quot;radio\&quot; name=\&quot;sw&quot;);<br />              client.print(&quot;sw&quot;);<br />              client.print(int(i));<br />              get2RAM(19);<br />              client.print(buffer); <br />              //client.print(&quot;\&quot; value=\&quot;&quot;);<br />              client.print(1);<br />              if(SW<i>==1){<br />                get2RAM(53);<br />                client.print(buffer);<br />                //client.print(&quot;\&quot; checked=\&quot;checked&quot;);<br />              }<br />              get2RAM(21);<br />              client.print(buffer);<br />               <br />              get2RAM(45);<br />              client.print(buffer);<br />              //client.print(&quot;&lt;input type=\&quot;radio\&quot; name=\&quot;sw&quot;);<br />              client.print(&quot;sw&quot;);<br />              client.print(int(i));<br />              get2RAM(19);<br />              client.print(buffer); <br />              //client.print(&quot;\&quot; value=\&quot;&quot;);<br />              client.print(0);<br />              if(SW<i>==0){<br />                get2RAM(53);<br />                client.print(buffer);<br />                //client.print(&quot;\&quot; checked=\&quot;checked&quot;);<br />              }<br />              get2RAM(21);<br />              client.print(buffer);<br />              <br />              get2RAM(47);<br />              client.print(buffer);<br />              //client.println(&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);<br />            }<br />            get2RAM(27);<br />            client.print(buffer); <br />            //client.print(&quot;&lt;/table&gt;&quot;);<br />            get2RAM(47);<br />            client.print(buffer); <br />            //client.print(&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);<br />            get2RAM(47);<br />            client.print(buffer);            <br />            //client.println(&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);<br />          }            <br />            get2RAM(27);<br />            client.print(buffer);<br />            //client.println(&quot;&lt;/table&gt;&quot;);<br />            client.println(&quot;&lt;br&gt;&quot;);<br />          }<br />          get2RAM(14);<br />          client.print(buffer);<br />          //client.println(&quot;&lt;/center&gt;&quot;);<br />          <br />          if(page&gt;=2){<br />            get2RAM(13);<br />            client.print(buffer);<br />            //client.println(&quot;&lt;center&gt;&quot;);<br />            get2RAM(23);<br />            client.print(buffer);<br />            get2RAM(14);<br />            client.print(buffer);<br />            //client.println(&quot;&lt;/center&gt;&quot;);<br />            client.println(&quot;&lt;br&gt;&quot;);<br />          }<br />          <br />          if(page!=1){<br />            get2RAM(13);<br />            client.print(buffer);<br />            //client.println(&quot;&lt;center&gt;&quot;);<br />            get2RAM(22);<br />            client.print(buffer);<br />            get2RAM(14);<br />            client.print(buffer);<br />            //client.println(&quot;&lt;/center&gt;&quot;);<br />          }<br />          <br />          get2RAM(46);<br />          client.print(buffer);<br />          //client.println(&quot;&lt;/form&gt;&quot;);<br />          client.println(&quot;&lt;br&gt;&quot;);<br />          <br />          client.print(&quot;&lt;hr&gt;&quot;);<br />          get2RAM(13);<br />          client.print(buffer);<br />          //client.print(&quot;&lt;center&gt;&quot;);          <br />          if(page==0){<br />            get2RAM(26);<br />            client.print(buffer);<br />          }<br />          if(page&gt;=2){<br />            get2RAM(25);<br />            client.print(buffer);<br />          }<br />          if(page!=0){<br />            get2RAM(24);<br />            client.print(buffer);<br />          }<br />          get2RAM(14);<br />          client.print(buffer);<br />          //client.print(&quot;&lt;/center&gt;&quot;);<br />          client.println(&quot;&lt;br&gt;&quot;);<br />/*<br />// Debug received message<br />          client.print(&quot;Message=&quot;);<br />          client.println(MESSAGE);<br />          <br />          for(i=0;i&lt;16;i++){<br />            client.print(int(EEPROM.read(EEPROM_START_ADDRESS+i)));<br />            client.print(&quot; &quot;);<br />          }<br />          client.print(&quot;Page &quot;);<br />          client.println(int(page));<br />// Debug message end<br />*/          <br />          // HTML tail<br />          client.println(&quot;&lt;h6&gt;&quot;);<br />          get2RAM(2);<br />          client.print(buffer);<br />          client.print(&quot;&lt;br&gt;&quot;);<br />          //client.println(&quot;Open source of hardware and software for Arduino&quot;;<br />          <br />          client.print(&quot;&lt;a href=&quot;);<br />          get2RAM(4);<br />          client.print(buffer);<br />          //client.print(&quot;http://www.arduino.cc&quot;);<br />          client.print(&quot;&gt;&quot;);<br />          get2RAM(4);<br />          client.print(buffer);<br />          //client.print(&quot;http://www.arduino.cc&quot;);<br />          client.print(&quot;&lt;/a&gt;&quot;);<br />          <br />          client.print(&quot;&lt;br&gt;&quot;);<br />          get2RAM(3);<br />          client.println(buffer);<br />          client.println(&quot;&lt;br&gt;&quot;);<br />          <br />          client.println(&quot;&lt;/h6&gt;&quot;);<br />          get2RAM(17);<br />          client.println(buffer);<br />          //client.println(&quot;&lt;/body&gt;&quot;);<br />          get2RAM(8);<br />          client.println(buffer);<br />          //client.println(&quot;&lt;/html&gt;&quot;);<br />          break;<br />        }<br />        if(c==&#039;\n&#039;){<br />          current_line_is_blank=false;<br />        }<br />      }<br />    }<br />    delay(1);<br />    client.stop();<br />  }<br />}<br /><br /></pre>]]></description>
			<category>Open Source</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091214-171350</guid>
			<author>Tasuka</author>
			<pubDate>Mon, 14 Dec 2009 09:13:50 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=12&amp;entry=entry091214-171350</comments>
		</item>
		<item>
			<title>SED recursive strip</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091214-114845</link>
			<description><![CDATA[This is a script to recursive strip some thing between &quot;$A_PROPERTIES&quot; and &quot;$FUNCTIONS&quot; also between &quot;$FUNCTIONS&quot; to &quot;$NETS&quot;<br />And strip all of the &quot;:FXX.&quot; to &quot;.&quot;<br /><br /><pre><br />#!/bin/sh<br />sed -e &quot;s/\:F[0-9]*\./\./g&quot; $1 &gt;$1.txt<br />sed -e  &quot;/^\$A_PROPERTIES/,/^\$FUNCTIONS/!b<br />		/^\$A_PROPERTIES/{<br />			x<br />			s/^.*\n//<br />			x<br />		}<br />		G<br />		/\$FUNCTIONS/!d<br />		s/\n.*//<br />	&quot; $1.txt &gt;$1.txt.txt<br /><br />sed -e &quot;/^\$FUNCTIONS/,/^\$NETS/!b<br />		/^\$FUNCTIONS/{<br />			x<br />			s/^.*\n//<br />			x<br />		}<br />		G<br />		/\$NETS/!d<br />		s/\n.*//<br />	&quot; $1.txt.txt &gt;$1.txt<br /><br />rm -fr $1.txt.txt<br /><br /></pre><br />]]></description>
			<category>Misc</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091214-114845</guid>
			<author>Tasuka</author>
			<pubDate>Mon, 14 Dec 2009 03:48:45 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=12&amp;entry=entry091214-114845</comments>
		</item>
		<item>
			<title>Arduino Ethernet Shield</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091202-171536</link>
			<description><![CDATA[花了一點時間，用了一下<a href="http://ww.arduino.cc" target="_blank" >Arduino</a> 這個小東西，Open source 的硬體和軟體。順便作了一個可以經由網路控制的數位腳，及SSR當作電源開關。這個程式加上了 <a href="http://www.arduino.cc/en/Main/ArduinoEthernetShield" target="_blank" >Arduino Ethernet Shield</a> 可以用 Arduino Ethernet Library 也可以換成 <a href="http://code.google.com/p/tinkerit/source/browse/#svn/trunk/Ethernet2%20library/Ethernet2" target="_blank" >Ethernet2 Library</a>，用 Ethernet2 空間會比較省。下次再配合 <a href="http://www.seeedstudio.com/depot/sd-card-shield-for-arduino-v21-p-492.html" target="_blank" >Arduino SD shield</a> 看看吧！作起來比 <a href="http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=8186&amp;mid=14&amp;lang=en&amp;pageId=75" target="_blank" >Microship 的 PIC</a> 簡單，程式工具不用錢，可以在Windows/Mac OS X/Linux 下寫程式，不必被限制一定要用Windows。不必買燒錄工具，用 USB 就可以寫入資料。不過在燒入資料時，digital pin 1 和 2 不可以接東西。目前 MAC address 和 IP 是固定的，有空再試試 <a href="http://blog.jordanterrell.com/post/Arduino-DHCP-Library-Version-04.aspx" target="_blank" >DHCP library</a>。<br /><br /><pre><br />/*<br />  This program is wor Arduino Ethernet Shield with W5100 ethernet chip,<br />  As a 8 digital pins control in web page<br />  Programmer : Tasuka Hsu, Dec 1 2009<br />*/<br /><br />/* Library import */<br />#include &lt;Ethernet2.h&gt;<br />#include &lt;Print.h&gt;<br />#include &lt;Server.h&gt;<br />#include &lt;Client.h&gt;<br /><br />/* Const define */<br />#define LENGTH 42  /* Message length */<br />#define PINS 8     /* Digital pins 1 to 8 */<br />#define PORT 80    /* HTTP port */<br />#define REFRESH 10  /* HTTP refresh timer */<br /><br />/* MAC Address */<br />byte MAC[]={0x00,0x0c,0x01,0x01,0xef,0xff};<br /><br />/* IP Address setting */<br />byte IP[]={172,16,7,251};<br />byte GATEWAY[]={172.16,7,254};<br />byte SUBNET[]={255,255,255,248};<br /><br />/* HTTP Server setting */<br />Server server=Server(PORT);<br /><br />char TITLE[]=&quot;Adruino Digital Pins Control&quot;;<br />char MESSAGE[LENGTH+1];<br /><br />void setup()<br />{<br />  /* Initial Ethernet MAC and IP setting */<br />  Ethernet.begin(MAC,IP,GATEWAY,SUBNET);<br />  <br />  /* Initial digital pin setting to default 0 */<br />  for(int i=0;i&lt;PINS;i++){<br />    pinMode(i,OUTPUT);<br />    digitalWrite(i,0);<br />  }<br />  <br />  /* Start server listen */<br />  server.begin();<br />}<br /><br />void loop()<br />{<br />  /* Initial client */<br />  Client client=server.available();<br />  <br />  if(client) {<br />    boolean current_line_is_blank=true,flag=false;<br />    char c=&#039;\0&#039;;<br />    int i=0;<br />    <br />    /* If connected */<br />    while(client.connected()){<br />      if(client.available()){<br />        <br />        /* Clear MESSAGE */<br />        for(i=0;i&lt;LENGTH;i++){<br />          MESSAGE<i>=&#039;\0&#039;;<br />        }<br />        <br />        flag=false;<br />        i=0;<br />        /* Read from HTTP GET input information */<br />        while((c=client.read())!=&#039;\n&#039; &amp;&amp; i&lt;=LENGTH){<br />          if(c==&#039;?&#039;){<br />            flag=true;<br />          }<br />          if(c==&#039; &#039;||c==&#039;\n&#039;||c==&#039;\0&#039;){<br />            flag=false;<br />          }<br />          if(flag){<br />            MESSAGE[i++]=c;<br />          }<br />        }<br />        MESSAGE<i>=&#039;\0&#039;;<br />        <br />        i=0;<br />        flag=false;<br />        /* Send to Digital pins from parse HTTP send message  */<br />        while(MESSAGE<i>!=&#039;\0&#039;){<br />          if((MESSAGE<i>==&#039;p&#039;||MESSAGE<i>==&#039;P&#039;)&amp;&amp;(MESSAGE[i+2]==&#039;=&#039;)){<br />            digitalWrite(int(MESSAGE[i+1])-0x30,int(MESSAGE[i+3])-0x30);<br />            i+=3;<br />          }<br />          i++;<br />        }<br /><br />        if(current_line_is_blank){  <br />          /* Send HTTP header */<br />          client.println(&quot;HTTP/1.1 200 OK&quot;);<br />          client.println(&quot;Content-Type: text/html; charset=utf-8&quot;);<br />          client.println();<br />          <br />          /* Send HTML */<br />          client.print(&quot;&lt;html&gt;\n&lt;title&gt;&quot;);<br />          client.print(TITLE);<br />          client.print(&quot;&lt;/title&gt;\n&lt;head&gt;\n&lt;center&gt;&lt;h1&gt;&quot;);<br />          client.print(TITLE);<br />          client.print(&quot;&lt;/h1&gt;&lt;/center&gt;\n&quot;);<br />          client.print(&quot;&lt;meta http-equiv=\&quot;refresh\&quot; content=\&quot;&quot;);<br />          client.print(REFRESH);<br />          client.print(&quot;;url=/\&quot;&gt;\n&lt;/head&gt;\n&lt;body&gt;\n&quot;);<br />          client.print(&quot;&lt;hr&gt;\n&lt;form method=\&quot;GET\&quot; action=\&quot;/\&quot;&gt;\n&quot;);<br />          <br />          /* Read data from digital pin */<br />          client.print(&quot;&lt;table border=\&quot;1\&quot;&gt;\n&quot;);<br />          client.print(&quot;&lt;tr&gt;&lt;td&gt;Digital Pin&lt;/td&gt;&lt;td&gt;On&lt;/td&gt;&lt;td&gt;Off&lt;/td&gt;&lt;/tr&gt;\n&quot;);<br />          <br />          for(i=0;i&lt;8;i++){<br />            client.print(&quot;\n&lt;tr&gt;&lt;td&gt;Pin &quot;);<br />            client.print(i);<br />            client.print(&quot;&lt;/td&gt;\n&lt;td&gt;&quot;);<br />            <br />            /* Display pins status */<br />            if(digitalRead(i)==1){<br />              client.print(&quot;&lt;input type=radio checked value=1 name=\&quot;p&quot;);<br />              client.print(i);<br />              client.print(&quot;\&quot;&gt;&lt;/td&gt;\n&quot;);<br />              client.print(&quot;&lt;td&gt;&lt;input type=radio value=0 name=\&quot;p&quot;);<br />              client.print(i);<br />              client.print(&quot;\&quot;&gt;\n&quot;);<br />            }else{<br />              client.print(&quot;&lt;input type=radio value=1 name=\&quot;p&quot;);<br />              client.print(i);<br />              client.print(&quot;\&quot;&gt;&lt;/td&gt;\n&quot;);<br />              client.print(&quot;&lt;td&gt;&lt;input type=radio checked value=0 name=\&quot;p&quot;);<br />              client.print(i);<br />              client.print(&quot;\&quot;&gt;\n&quot;);<br />            }<br />            client.print(&quot;&lt;/td&gt;&lt;/tr&gt;\n&quot;);<br />            <br />          }<br />          client.print(&quot;&lt;/table&gt;\n&quot;);<br />          client.print(&quot;&lt;br&gt;&lt;input type=submit value=\&quot;Send\&quot;&gt;&lt;/form&gt;&lt;br&gt;\n&quot;);<br /><br />          /* Debug received message */<br />//          client.print(&quot;Message=&quot;);<br />//          client.println(MESSAGE);<br /><br />          /* HTML tail */<br />          client.print(&quot;&lt;h6&gt;\nOpen source of hardware and software for Arduino\n&lt;br&gt;\n&quot;);<br />          client.print(&quot;&lt;a href=http://www.arduino.cc&gt;http://www.arduino.cc&lt;/a&gt;&lt;/h6&gt;\n&quot;);<br />          client.print(&quot;&lt;/body&gt;\n&lt;/html&gt;\n&quot;);<br />          break;<br />        }<br />        if(c==&#039;\n&#039;){<br />          current_line_is_blank=false;<br />        }<br />      }<br />    }<br />    delay(1);<br />    client.stop();<br />  }<br />}<br /><br /><br /></pre>]]></description>
			<category>Open Source</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091202-171536</guid>
			<author>Tasuka</author>
			<pubDate>Wed, 02 Dec 2009 09:15:36 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=12&amp;entry=entry091202-171536</comments>
		</item>
		<item>
			<title>Parallels Desktop 5 for Mac 小小改善</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091123-115704</link>
			<description><![CDATA[Parallels 4 Windows 7 系統分數<br /><img src="images/Parallels4-Win7-Preformance.jpg" width="530" height="195" border="0" alt="" /><br />Parallels 5 Windows 7 系統分數<br /><img src="images/Parallels5-Win7-Preformance.jpg" width="530" height="212" border="0" alt="" /><br /><br />看來是好一點了，對我而言不是重點，反正我用到Windows的機會很低。想說的是為何 Ubuntu 9.10 在 Parallels 4 下，安裝 Parallels Tools 就會失敗（因為用的 Linux Kernel版本較 Parallels Tools 中支援列表的要新，沒辦法安裝），而 Parallels 5 就可以用，這對沒有更新到 Parallels 5 的人來說很不公平吧！<br />還有就是網路計價的問題，這去年更新 Parallels 4 時 Fred 就說過了-<a href="http://fred.ipod.to/blog/?post;1729" target="_blank" >Parallels 4.0‥‥結帳注意事項</a>，不過今年還是一樣。<br /><br />原本想放棄 Parallels 而換用 VirtualBox 的，因為價格及支援的問題，Ubuntu 9.10 在 VirtualBox 下就很好，但是 VirtualBox 一直沒有解決 USB device 的問題，至少在我的 Windows/Linux/MacOSX 上都不能用，所以目前的Parallels還會活在我的MacBookPro上。]]></description>
			<category>Apple</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091123-115704</guid>
			<author>Tasuka</author>
			<pubDate>Mon, 23 Nov 2009 03:57:04 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=11&amp;entry=entry091123-115704</comments>
		</item>
		<item>
			<title>OS X 10.6.2 Update</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091110-122832</link>
			<description><![CDATA[<img src="images/OSX10.6.2Update.jpg" width="530" height="634" border="0" alt="" /><br /><img src="images/OSX10.6.2.jpg" width="321" height="393" border="0" alt="" />]]></description>
			<category>Apple</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091110-122832</guid>
			<author>Tasuka</author>
			<pubDate>Tue, 10 Nov 2009 04:28:32 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=11&amp;entry=entry091110-122832</comments>
		</item>
		<item>
			<title>OS X server 10.4.11 upgrade to 10.6 問題解決</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091106-213531</link>
			<description><![CDATA[看來是 Apache 和 PHP5 之間的問題，Snow Leopard Server 的 PHP 是<br /><pre><br />root# php -v<br />PHP 5.3.0 (cli) (built: Jul 19 2009 00:34:29) <br />Copyright (c) 1997-2009 The PHP Group<br />Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies<br /></pre><br /><br />但是在系統中並沒有 Zend，而查看 Sample CPU load of httpd 時，發現 load 是在作 zend debug 時最多，所以在 /etc/php.ini 中加上兩行：<br /><pre><br />report_zend_debug = 0<br />mbstring.script_encoding=&quot;&quot;<br /></pre><br /><br />CPU load 就下來了。不過要試個幾天確定一下！<br /><pre><br />root# uptime<br />21:41  up 5 days, 10:57, 2 users, load averages: 0.03 0.08 0.52<br /></pre><br />]]></description>
			<category>Apple</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091106-213531</guid>
			<author>Tasuka</author>
			<pubDate>Fri, 06 Nov 2009 13:35:31 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=11&amp;entry=entry091106-213531</comments>
		</item>
		<item>
			<title>Snow Leopard hosts.allow and hosts.deny</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091106-150051</link>
			<description><![CDATA[新裝好的 Snow Leopard Server, 一直收到有人用字典攻擊,在測試密碼. 先用 /etc/hosts.allow 和 /etc/hosts.deny 過濾掉沒有正確 IP 正反解的連線, 到時再用 sshdfilter 來擋!<br /><br />/etc/hosts.allow<br /><pre><br />#<br /># hosts.allow   This file describes the names of the hosts which are<br />#               allowed to use the local INET services, as decided<br />#               by the &#039;/usr/sbin/tcpd&#039; server.<br />#<br />#in.identd:ALL:ALLOW<br />#<br />smtpd:KNOWN,LOCAL,192.168.0.0/255.255.242.0:ALLOW<br />smtpd:UNKNOWN,PARANOID:DENY<br />#<br />httpd:KNOWN,LOCAL,192.168.0.0/255.255.2242.0:ALLOW<br />httpd:UNKNOWN,PARANOID:DENY<br />#<br />vsftpd:LOCAL,KNOWN,192.168.0.0/255.255.242.0:ALLOW<br />vsftpd:UNKNOWN,PARANOID:DENY<br />#<br />##in.telnetd:LOCAL,KNOWN,host,192.168.0.0/255.255.242.0:ALLOW<br />##in.telnetd:KNOWN,UNKNOWN,PARANOID:DENY<br />#<br />ipop3d:KNOWN,LOCAL,192.168.0.0/255.255.242.0,:ALLOW<br />ipop3d:UNKNOWN,PARANOID:DENY<br />#<br />imapd:KNOWN,LOCAL,192.168.0.0/255.255.242.0,:ALLOW<br />imapd:UNKNOWN,PARANOID:DENY<br />#<br />sshd:KNOWN,LOCAL,192.168.0.0/255.255.242.0:ALLOW<br />sshd:UNKNOWN,PARANOID,173.183.250.38:DENY<br />#<br />named:ALL:ALLOW<br />#<br />ALL:KNOWN,LOCAL,192.168.0.0/255.255.242.0:ALLOW<br />ALL:UNKNOWN,PARANOID:DENY<br />#<br /></pre><br /><br />/etc/hosts.deny<br /><pre><br />#<br /># hosts.deny    This file describes the names of the hosts which are<br />#               *not* allowed to use the local INET services, as decided<br />#               by the &#039;/usr/sbin/tcpd&#039; server.<br />#<br />#ALL:UNKNOWN,PARANOID:DENY<br /></pre>]]></description>
			<category>Apple</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091106-150051</guid>
			<author>Tasuka</author>
			<pubDate>Fri, 06 Nov 2009 07:00:51 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=11&amp;entry=entry091106-150051</comments>
		</item>
		<item>
			<title>OS X server 10.4.11 upgrade to 10.6 問題暫解</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091103-115957</link>
			<description><![CDATA[最近將原本在 iMac G5 上的 OS X Server 從 Tiger 10.4.11 昇級並換裝至 Mac Mini 的 Snow Leopard Server 10.6. 從 PowerPC 換成 Intel 的 CPU, 因為 Apple 在這兩種 CPU 上使用的 HDD Partition 格式不同, 無法直接以原來PowerPC的硬碟在Intel機器上開機. 所以將 iMac G5 放到 Target Disk Mode, 用 Firewire 連至 MacMini, 當成資料硬碟, 就可以無痛昇級,Snow Leopard Server 系統在一安裝好之後,第一次開機會有 Server Migration 可以自動作昇級,並自動作資料的搬移及轉換, 不過時間要等有點久, Snow Leopard Server 安裝約一個小時,但需要3個小時作 migration, 最多時間用在作原本的 user 所存放的 mail 格式轉換. 10.6 server 的 postfix 己經由原本的 UNIX mailbox 格式, 換成 QMail 的 maildir 可以加快信件的處理速度. 經過 Server Migration 之後, 所有的的資料都在, 密碼及SSL的CA設定也都沒有改變, 在外部的人根本無法察覺到 Server 己經換了.<br /><br />跑了兩天發現系統的 loading (uptime) 會上昇到 40 以上, CPU 100% 滿載, (一般的 UNIX 系統在 3 至 5 就不得了了), 讓系統反應變慢. 檢查的結果應該是 apache2 的關係, 原因還不明, 因為有使用 Squirrel webmail, 無法停掉 apache, 先作一個 shell script 放在 crontab 中定時檢查若 load 大於 8, 就重新起動 apache. 作為暫時解決的方案.<br /><br /><pre><br />#!/bin/sh<br />AP_PS=`ps -ax|grep httpd|grep -v grep|wc -l|awk &#039;{printf(&quot;%d\n&quot;,$1)}&#039;`<br />LOAD=`uptime|awk &#039;{printf(&quot;%d\n&quot;,$11)}&#039;`<br /><br />if [ $LOAD -ge 8 ]; then<br />  if [ $AP_PS -ge 10 ]; then<br />    /usr/sbin/apachectl restart<br />  fi<br />fi<br /></pre><br /><br /><img src="images/httpd_HighLoad.jpeg" width="530" height="439" border="0" alt="" /><br />]]></description>
			<category>Apple</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091103-115957</guid>
			<author>Tasuka</author>
			<pubDate>Tue, 03 Nov 2009 03:59:57 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=11&amp;entry=entry091103-115957</comments>
		</item>
		<item>
			<title>Parallels Windows 7</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091030-160818</link>
			<description><![CDATA[用 Parallels4 在 Snow Leopard 上跑 Windows 7，得到的測試結果，Graphics 還要再加強啊！<br /><img src="images/Parallels4_Win7.jpg" width="530" height="184" border="0" alt="" />]]></description>
			<category>Apple</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091030-160818</guid>
			<author>Tasuka</author>
			<pubDate>Fri, 30 Oct 2009 08:08:18 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=10&amp;entry=entry091030-160818</comments>
		</item>
		<item>
			<title>寫好一份文件</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry091002-160043</link>
			<description><![CDATA[經常需要讀一些說明文件，發現好的文件很少，要舉例的話，我只想到 <a href="http://www.cisco.com/en/US/products/ps6350/products_installation_and_configuration_guides_list.html" target="_blank" >Cisco IOS Configuration Guide</a> 和 <a href="http://developer.apple.com/mac/library/navigation/" target="_blank" >Apple Developer Library</a>，這兩者的文件在例子及詳細說明，完完整整都會放在同一份文件中，不需要再參考別的文件，而所需要的答案都可以在看過一至兩份文件之後得到，進而還可以完整了解整個工作的方法及流程。<br /><br />但是其他很多公司的文件就沒有這麼好了，這些文件大都需要參照來參照去的，不在同一份文件中詳細說明，而是用了大量的參考連結，通常的結果就是看了半天，連來連去，結果不知所云。像<a href="http://msdn.microsoft.com/en-us/library/default.aspx" target="_blank" >Microsoft MSDN</a>的文件就是這樣。不直接給答案，而是用連結回答問題，結果弔發更多問題。<br /><br />不過像Cisco和Apple，也因為將所有的資料都放在一起，並詳細說明，所以文件一般都比較大，但大都可以解決讀者的問題，而且因為太大，所以都提供可下載的版本，拿回去慢慢看。而Microsoft分成無數個小檔案的文件，就是每個文件只有寫一部份，再用連結連起來，其他的請參考某編號文件，經常在轉了一大圈之後回到原點，而問題還是沒有解決，而且因為檔案內容太少，大都沒有提供可下載的版本，不然就是需要拿一堆檔案，自已再從中看看可不可以找到答案。<br /><br />有一個問題可以找到很多不同的版本，但是以 Cisco 和 Apple 而言，大都會有新舊版本之間的說明可看。而Microsoft的話，就只有看當時的運氣，以及個人的修為而定了。<br /><br />Open Source 的話，我認為 <a href="http://www.gnu.org" target="_blank" >GNU Project</a>的文件算是很好的，而<a href="http://docs.wxwidgets.org/stable/" target="_blank" >wxWidget</a> 的也不錯，不過像<a href="http://qt.nokia.com/" target="_blank" >Qt</a>,<a href="http://www.gtk.org/documentation.html" target="_blank" >GTK+</a>,<a href="http://library.gnome.org/devel/references" target="_blank" >GNOME</a>及<a href="http://www.x.org/wiki/" target="_blank" >X.org</a>,都太分散了,就很不好。<br /><br />所以就創造了很多人,利用這些寫得不好的文件,而自己再寫一份來賣錢!]]></description>
			<category>想到的</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry091002-160043</guid>
			<author>Tasuka</author>
			<pubDate>Fri, 02 Oct 2009 08:00:43 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=10&amp;entry=entry091002-160043</comments>
		</item>
		<item>
			<title>Apple Store updating</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry090929-152828</link>
			<description><![CDATA[新東西要來了吧！<br /><br /><img src="images/Apple_Store_Updating_Sep292009.jpeg" width="400" height="261" border="0" alt="" />]]></description>
			<category>Apple</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry090929-152828</guid>
			<author>Tasuka</author>
			<pubDate>Tue, 29 Sep 2009 07:28:28 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=09&amp;entry=entry090929-152828</comments>
		</item>
		<item>
			<title>rpm2targz</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry090916-132624</link>
			<description><![CDATA[我使用 <a href="http://www.slackware.com" target="_blank" >Slackware Linux</a>作為工作平台，但要找應用程式時，經常看到只有 <a href="http://www.debian.org" target="_blank" >Debian</a>或是只有<a href="http://www.redhat.com" target="_blank" >rpm</a>的格式。今天要用<a href="http://desktop.google.com" target="_blank" >Google Desktop</a>時，就發現 Linux 版本，只有包裝成 rpm 及 deb，所以就想到用 rpm2targz/rpm2tgz 這個工具轉檔一下，再自已搬到 /usr 下，就可以用了。為何最簡單的格式反而沒有人要用呢?]]></description>
			<category>Open Source</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry090916-132624</guid>
			<author>Tasuka</author>
			<pubDate>Wed, 16 Sep 2009 05:26:24 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=09&amp;entry=entry090916-132624</comments>
		</item>
		<item>
			<title>更新更新更新</title>
			<link>http://tasuka.idv.tw/blog/index.php?entry=entry090911-105858</link>
			<description><![CDATA[最近很多東西都作了更新：<br /><br />OS X Leopard 10.5 -&gt; Snow Leopard 10.6 -&gt; Snow Leopard 10.6.1<br />iPhoto8 -&gt; iPhoto9<br />iTune8 -&gt; iTune9<br />iPod Touch 3.0 -&gt; iPod Touch 3.1.1<br />XCode 3.1 -&gt; XCode 3.2 for Snow Leopard<br />iPod 5G 更新電池<br />Slackware 12.2 -&gt; Slackware 13.0 -&gt; Slackware64 13.0<br />Linux Kernel version 2.6.24 -&gt; version 2.6.30.5<br />還有一堆東西啊...<br /><br />工作上也是幫客戶更新了一些東西。<br /><br />就連台灣的行政內閣也換了新人呢。<br /><br /><img src="images/OS_X_10.6.1.jpg" width="321" height="393" border="0" alt="" /><br /><br />所以呢這是一個隨時在更新的年代，有什麼東西是不可以變的呢？]]></description>
			<category>想到的</category>
			<guid isPermaLink="true">http://tasuka.idv.tw/blog/index.php?entry=entry090911-105858</guid>
			<author>Tasuka</author>
			<pubDate>Fri, 11 Sep 2009 02:58:58 GMT</pubDate>
			<comments>http://tasuka.idv.tw/blog/comments.php?y=09&amp;m=09&amp;entry=entry090911-105858</comments>
		</item>
	</channel>
</rss>

