<?xml version="1.0" encoding="UTF-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="zh-TW">
	<title>Tasuka&#039;s Workbench</title>
	<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php" />
	<modified>2010-03-10T06:04:29Z</modified>
	<author>
		<name>Tasuka</name>
	</author>
	<copyright>Copyright 2010, Tasuka</copyright>
	<generator url="http://www.sourceforge.net/projects/sphpblog" version="0.4.8">SPHPBLOG</generator>
	<entry>
		<title>好主管不該教員工摘要 </title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry100301-093107" />
		<content type="text/html" mode="escaped"><![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 />別把終身托付給公司。努力工作，以期對公司有所貢獻，但絕對不能依賴公司過活。]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry100301-093107</id>
		<issued>2010-03-01T00:00:00Z</issued>
		<modified>2010-03-01T00:00:00Z</modified>
	</entry>
	<entry>
		<title>For download files checksum script</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry100204-153822" />
		<content type="text/html" mode="escaped"><![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>]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry100204-153822</id>
		<issued>2010-02-04T00:00:00Z</issued>
		<modified>2010-02-04T00:00:00Z</modified>
	</entry>
	<entry>
		<title>歐巴馬在 Google 和 Youtube</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry100129-221337" />
		<content type="text/html" mode="escaped"><![CDATA[<img src="images/US_President_Vote_In_Google.jpeg" width="530" height="268" border="0" alt="" /><br />上圖是在 Google 上看到的，拿下來以資紀念。]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry100129-221337</id>
		<issued>2010-01-29T00:00:00Z</issued>
		<modified>2010-01-29T00:00:00Z</modified>
	</entry>
	<entry>
		<title>SIKULI 為 GUI 自動化開了一道門</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry100128-132124" />
		<content type="text/html" mode="escaped"><![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>]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry100128-132124</id>
		<issued>2010-01-28T00:00:00Z</issued>
		<modified>2010-01-28T00:00:00Z</modified>
	</entry>
	<entry>
		<title>雜念</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry100112-234447" />
		<content type="text/html" mode="escaped"><![CDATA[一家公司老闆的心很重要，老闆有心，找到對的管理人，在公司發出一定向心力，公司才會好，若開會講得頭頭是道，反正會議結束之後也不用他負責作，咀咒給別人死。凡事只有Schedule要求，沒有提供Budget，沒有人力，要兵給將...。發生問題，一定是部屬能力有問題，自已一定都是對的。<br /><br />一個會議動不動就四五小時，可以花三四個小時喬schedule和人力，而不想這個問題可能只要數分鐘就可以解決。而會議長度無法有效控制，浪費與會人員的工作時間，可以前期個別討論的，卻放到會議上才講，美其名為很忙，事實就是不會利用時間，及控制場面。不過是一個逐會議而居，靠會議為生的廢人而已。若是主管是這種人，公司會好是運氣，不好是正常。若當個主管只是喬schedule和人力，這種工作是不需要用到高階主管的，只要請一位專門管理師就可以作得很好。<br /><br />主管的工作是什麼呢？開會？發信？駡人？包工程？...........都不是吧，應該是安內壤外才對啊。為部門、為公司爭取最大福利，並準時完成工作，以及讓部屬可以回家和家人在一起，而不是在公司加班工作，或將工作帶回家。長時間工作對身心都不好，工作效率一定不好吧！一直無法了解的是，多加班的一定可以作好工作，效率高，為何不是準時下班而又做好工作效率高。一天工作八小時完成一件事，和一天工作十四小時，用兩天完成一件事，那個好啊！當然是作了二十八小時才完成的比較辛苦啊，他有加班啊，作那麼久才作好一定比較難完成吧。若長此下去結果會是如何呢？大家就會加班在公司打球、聊天混時間了吧。<br /><br />難怪很多人不想作主管，而很多人只想作主管。]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry100112-234447</id>
		<issued>2010-01-12T00:00:00Z</issued>
		<modified>2010-01-12T00:00:00Z</modified>
	</entry>
	<entry>
		<title>用 Expect 連接 RS-232 及 telnet</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091231-165058" />
		<content type="text/html" mode="escaped"><![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 />]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091231-165058</id>
		<issued>2009-12-31T00:00:00Z</issued>
		<modified>2009-12-31T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Terminal Characters define</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091221-123143" />
		<content type="text/html" mode="escaped"><![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]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091221-123143</id>
		<issued>2009-12-21T00:00:00Z</issued>
		<modified>2009-12-21T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Arduino WebSwitch</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091214-171350" />
		<content type="text/html" mode="escaped"><![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>]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091214-171350</id>
		<issued>2009-12-14T00:00:00Z</issued>
		<modified>2009-12-14T00:00:00Z</modified>
	</entry>
	<entry>
		<title>SED recursive strip</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091214-114845" />
		<content type="text/html" mode="escaped"><![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 />]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091214-114845</id>
		<issued>2009-12-14T00:00:00Z</issued>
		<modified>2009-12-14T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Arduino Ethernet Shield</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091202-171536" />
		<content type="text/html" mode="escaped"><![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>]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091202-171536</id>
		<issued>2009-12-02T00:00:00Z</issued>
		<modified>2009-12-02T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Parallels Desktop 5 for Mac 小小改善</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091123-115704" />
		<content type="text/html" mode="escaped"><![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上。]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091123-115704</id>
		<issued>2009-11-23T00:00:00Z</issued>
		<modified>2009-11-23T00:00:00Z</modified>
	</entry>
	<entry>
		<title>OS X 10.6.2 Update</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091110-122832" />
		<content type="text/html" mode="escaped"><![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="" />]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091110-122832</id>
		<issued>2009-11-10T00:00:00Z</issued>
		<modified>2009-11-10T00:00:00Z</modified>
	</entry>
	<entry>
		<title>OS X server 10.4.11 upgrade to 10.6 問題解決</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091106-213531" />
		<content type="text/html" mode="escaped"><![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 />]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091106-213531</id>
		<issued>2009-11-06T00:00:00Z</issued>
		<modified>2009-11-06T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Snow Leopard hosts.allow and hosts.deny</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091106-150051" />
		<content type="text/html" mode="escaped"><![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>]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091106-150051</id>
		<issued>2009-11-06T00:00:00Z</issued>
		<modified>2009-11-06T00:00:00Z</modified>
	</entry>
	<entry>
		<title>OS X server 10.4.11 upgrade to 10.6 問題暫解</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091103-115957" />
		<content type="text/html" mode="escaped"><![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 />]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091103-115957</id>
		<issued>2009-11-03T00:00:00Z</issued>
		<modified>2009-11-03T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Parallels Windows 7</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091030-160818" />
		<content type="text/html" mode="escaped"><![CDATA[用 Parallels4 在 Snow Leopard 上跑 Windows 7，得到的測試結果，Graphics 還要再加強啊！<br /><img src="images/Parallels4_Win7.jpg" width="530" height="184" border="0" alt="" />]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091030-160818</id>
		<issued>2009-10-30T00:00:00Z</issued>
		<modified>2009-10-30T00:00:00Z</modified>
	</entry>
	<entry>
		<title>寫好一份文件</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry091002-160043" />
		<content type="text/html" mode="escaped"><![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 />所以就創造了很多人,利用這些寫得不好的文件,而自己再寫一份來賣錢!]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry091002-160043</id>
		<issued>2009-10-02T00:00:00Z</issued>
		<modified>2009-10-02T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Apple Store updating</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry090929-152828" />
		<content type="text/html" mode="escaped"><![CDATA[新東西要來了吧！<br /><br /><img src="images/Apple_Store_Updating_Sep292009.jpeg" width="400" height="261" border="0" alt="" />]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry090929-152828</id>
		<issued>2009-09-29T00:00:00Z</issued>
		<modified>2009-09-29T00:00:00Z</modified>
	</entry>
	<entry>
		<title>rpm2targz</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry090916-132624" />
		<content type="text/html" mode="escaped"><![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 下，就可以用了。為何最簡單的格式反而沒有人要用呢?]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry090916-132624</id>
		<issued>2009-09-16T00:00:00Z</issued>
		<modified>2009-09-16T00:00:00Z</modified>
	</entry>
	<entry>
		<title>更新更新更新</title>
		<link rel="alternate" type="text/html" href="http://tasuka.idv.tw/blog/index.php?entry=entry090911-105858" />
		<content type="text/html" mode="escaped"><![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 />所以呢這是一個隨時在更新的年代，有什麼東西是不可以變的呢？]]></content>
		<id>http://tasuka.idv.tw/blog/index.php?entry=entry090911-105858</id>
		<issued>2009-09-11T00:00:00Z</issued>
		<modified>2009-09-11T00:00:00Z</modified>
	</entry>
</feed>

