和尚祈求不動明王像
03/22/2010, 11:02 - 想到的

和尚向不動明王像祈求:"請背我到都卒天內院"。
不動明王像竟睜開眼睛說:"即然百般懇求,就帶你去吧。但是先去把屁股洗乾淨吧"

故事後面還有,
到了卒天內院之前,不動明王又問和尚,你熟讀了法華經了嗎?
和尚說讀還可以,但還不會熟背,所以沒有進到都卒天內院,又被不動明王像背回來了。

摘自"鬼譚草紙“ p.33

對照到最近教廷的新聞,有些近似的雙關。

1.不動明王像終究不是不動明王本尊,它還是會"動"。
2.要到都卒天內院應該靠自已。
3.把屁股洗乾淨,至少有兩種意思。
3.1.可以等同"先把自已的鬍子刮乾淨"。
3.2.或者是真的把屁股洗乾淨,"後面會用到"。
4.要靠別人提攜之前,自已也要有一定的斤兩!

不過這些道理也可以用在工作、或處世吧!
還有宗教界也是人在主持,所以還是脫不了人和社會的一切問題吧。

參考資料
http://ck101.com/viewthread.php?action= ... id=1147110
http://www.new7.com.tw/journal/weekly/o ... le028.html
http://www.taiwanenews.com/doc/20090815103.php
http://news.chinatimes.com/world/0,5246 ... 57,00.html

發表回應 發表回應 ( 686預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 473 )

好主管不該教員工摘要
03/01/2010, 09:31 - 筆記
"好主管不該教員工" 長野慶太 摘要

企業主管若只是把看順眼的人納入旗下,把不順眼的人當作備用,那麼公司百分之百會輸給對手。

要員工免費加班的公司,根本不會要求員工個人的工作效率,因為這種企業和諧第一,不重效率,
營造出一種大家一起挑燈夜戰的樣子,其實根本不講求時效。
員工只要守標準作流程就可以了,根本不用強制要求員工的協調精神。

收到電子郵件愈多的主管,愈丟臉,而且工作効率愈差。

當上主管,不代表著從此可以躲在後面,而討厭的事,都讓部屬去作。

球隊老闆應該和觀眾坐在一起,展現他和場內比賽同在的樣子。

要讓主管們知道,會議就是成本。

開會有多浪費錢,算給老闆看。

召開會議將一口氣花掉龐大的人事費用,真的需要不惜成本召開會議?

為了會議而用Powerpoint及Excel的盲點,是為了會議做了太多準備,而浪費太多時間成本。

出席會議前,一定需事先讀過事前提供的會議資料。並且在會議召開通知,需要有明確的目標。

會議時間長,代表工作時間變短。

愈是管理不善的公司,工作量的控制愈差,所以一天到晚都處於緊急狀態下。

歡迎員工在假日到公司加班,根本不配當主管。

因一名員工假日加班行為,而逼得其他人產生罪惡感。當休息成為罪惡時,就是主管的失職。

每天搞到很晚才走出公司的話,要檢討上班工作時間,是否經常被打斷。

別把終身托付給公司。努力工作,以期對公司有所貢獻,但絕對不能依賴公司過活。
發表回應 發表回應 ( 798預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 378 )

For download files checksum script
02/04/2010, 15:38 - Network
從網路上 download 下來的檔案, 提供者經常會有提供 SHA1 check sum 的檔案,
以供download之後可以檢查檔案是否完整無誤. 但一個一個檢查也很笨吧.
做個 shell script 代勞吧.


#!/bin/sh

if [ -z "$1" ];then
CHECKSUM=SHA1SUM
else
CHECKSUM=$1
fi

if [ ! -f $CHECKSUM ];then
echo "\"$CHECKSUM\" file is not found."
exit
fi

if [ `uname -s` = "Darwin" ];then
SHA=shasum
else
SHA=sha1sum
fi

F=`ls -la|awk '{print $8}'|grep iso`

for i in $F ;do
C1=`$SHA $i|awk '{print $1}'`
C2=`grep $i $CHECKSUM|awk '{print $1}'`

if [ "$C1" = "$C2" ];then
echo "$i ... Checksum Matched"
else
echo "$i ... Checksum Not Matched"
fi
done

echo "Done"

發表回應 發表回應 ( 856預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 385 )

歐巴馬在 Google 和 Youtube
01/29/2010, 22:13 - 有的沒的

上圖是在 Google 上看到的,拿下來以資紀念。
發表回應 發表回應 ( 910預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 540 )

SIKULI 為 GUI 自動化開了一道門
01/28/2010, 13:21 - Open Source
前天試用了一下來自台灣台中的 vgodMIT修業兩年的成果, SIKULI Project, 發覺這真的是像 vgod 自己在 Blog 說的是會改變 GUI 世界的東西啊. 這是可以將 GUI 的原本需要人一個一個click的用法, 變成 batch 的方式. 也就是說可以將多個 GUI 程式經由 SIKULI 串在一起, 完成一件事, 或者是可以將原本需要人用Mouse在電腦之前,一步一步的確認及回應, 現在可以將這些動作自動化了. 可以自動化對於常用電腦執行固定工作項目的人,是很重要的一個需求.讓電腦將經常需要重覆的工作自動化, 這樣人才有時間作別的事, Work Smart, do'nt work hard, 意思是說要聰明的工作, 而不要白費力氣的工作啊. 有了自動的 GUI script 正好補完了多年來 GUI 無法自動化的缺口.

在Macintosh 有 Apple script可以作類似的工作, 不過前提是 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 和別的程式作有限度的互動, 雖然有人作出了 AutoitAutoHotkey, 不過都需要使用文字程式碼寫成 script, 而這都需要一定的程式語言使用背景才可以完成,還是沒有 SIKULI 直接及簡單. 以前有一個作業系統叫 BeOS,可以用Cortex 在 GUI 中將各不同的影音來源輸入和輸出串在一起,一起工作,例如從介面錄音之後直接送到MP3 encoder壓縮後,再送到音效卡輸出,全部用GUI將線接在一起就可以,不過 BeOS 已經是昨日黃花,已經進入歷史了,現在有的只有一個相容的 Open source 計畫,叫作 Haiku

SIKULI 使用的方法說起來也很簡單, 就是先將要做動作的圖象, 用 screen capture 給剪下來, 在執行 script 時進行比對, 若有一定程度的相似性(可在 script 中設定),就作 script 中指定的動作, 如 type 一段文數字,或是按一下 botton. 這樣子的作法是比較慢, 但好處是沒有作業系統相容的問題, 也沒有需要連結程式庫或預先作好的介面問題, 一切都和人在使用 GUI 介面時一樣, 用眼睛看, 選擇相對 icon, 作出對應的事件,像是按一次,或兩次, 或輸入資料等. 夠直接了吧!

我花了三分鐘就作了一個可以將 Windows 關機的 script.

簡單吧,在 SIKULI 的網頁上還有很多的例子。

最棒的是 SIKULI 是 Open source, 所以應該可以在任何電腦系統上,經過一定的修補後執行. SIKULI 使用 Jython, 所以要有 Java JDK/JRE 才可以執行.不過在 Windows 版的好像 save 就會 crash, 而 OS X 版的就不會. Linux 還在和 OpenCV Library 打架中. 在 Windows 版本上可以設定 screen capture 的時間 delay, 以免還沒有找到要按的按鍵就 timeout 了. 我是設成 3 秒, 好像比較可以符合慢慢的 Windows XP.

SIKULI 使用 Jython, 所以要有 Java JDK/JRE 才可以執行. 在作 screenshut 時要注意的是背景顏色, 會干擾圖象辦認的正確, 在使用時要小心. 也可以先用別的程式將圖象抓下來, 再放到 script 中, 可以節省時間. 我看到的是 SIKULI 使用 png 格式, 不知道 jpeg 和 gif 可不可以. 因為 SIKULI 現在還在 beta 版, 所以文件部份只有簡單的說明1, 希望未來會有較多較詳細的說明.

不過因為 SIKULI 是使用圖象辦認,所以看來 script 的可移動性會低一點,因為各作業系統,或每個人使用的圖象都可以自行改變,而改了當然就無法正確辦認出來了。

現在 vgod 用 SIKULI 為大家開了一扇門, 接下來要如何使用就看我們了吧! 像是測試軟體的可用性, 操作測試儀器, 或是經由多個程式共同完成一個工作等等. 去拿來試試吧, 並把你認為可以加強或不足的部份告訴 vgod , 或者自己從 source code 修改成你要的樣子.

SIKULI 網址 http://sikuli.org
vgod Blog http://blog.vgod.tw
vgod 在 twitter 上開了一個 SIKULI 的專推 sikuli@twitter
2 回應 2 回應 ( 1674預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 412 )

雜念
01/12/2010, 23:44 - 有的沒的
一家公司老闆的心很重要,老闆有心,找到對的管理人,在公司發出一定向心力,公司才會好,若開會講得頭頭是道,反正會議結束之後也不用他負責作,咀咒給別人死。凡事只有Schedule要求,沒有提供Budget,沒有人力,要兵給將...。發生問題,一定是部屬能力有問題,自已一定都是對的。

一個會議動不動就四五小時,可以花三四個小時喬schedule和人力,而不想這個問題可能只要數分鐘就可以解決。而會議長度無法有效控制,浪費與會人員的工作時間,可以前期個別討論的,卻放到會議上才講,美其名為很忙,事實就是不會利用時間,及控制場面。不過是一個逐會議而居,靠會議為生的廢人而已。若是主管是這種人,公司會好是運氣,不好是正常。若當個主管只是喬schedule和人力,這種工作是不需要用到高階主管的,只要請一位專門管理師就可以作得很好。

主管的工作是什麼呢?開會?發信?駡人?包工程?...........都不是吧,應該是安內壤外才對啊。為部門、為公司爭取最大福利,並準時完成工作,以及讓部屬可以回家和家人在一起,而不是在公司加班工作,或將工作帶回家。長時間工作對身心都不好,工作效率一定不好吧!一直無法了解的是,多加班的一定可以作好工作,效率高,為何不是準時下班而又做好工作效率高。一天工作八小時完成一件事,和一天工作十四小時,用兩天完成一件事,那個好啊!當然是作了二十八小時才完成的比較辛苦啊,他有加班啊,作那麼久才作好一定比較難完成吧。若長此下去結果會是如何呢?大家就會加班在公司打球、聊天混時間了吧。

難怪很多人不想作主管,而很多人只想作主管。
1 回應 1 回應 ( 830預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 385 )

用 Expect 連接 RS-232 及 telnet
12/31/2009, 16:50 - Misc
expect 可以模擬和程式或設備溝通, 是很方便的小工具, 使用 tcl script language, 可以用在 rs-232, telnet, ftp 等等, 將需要人操作的程式自動化. 可以在 Windows/Linux/BSD/Solaris/Mac OS X ...上使用.

用 expect 連接 RS-232 自動在人機介面模擬人按鍵, 作自動測試.

#!/usr/bin/expect --
# add -d for expect dump debug message
#
proc startUp x {
send " "
send " "
sleep 1
return
}

proc backSpace x {
# Send 8 backspace key code
send \177\177\177\177\177\177\177\177
sleep 1
return
}

proc loopbackTest x {
set y $x
set timeout 3
# 0x28 is down arrow keycode
if {$y eq 0} {
send \x28
sleep 1
set timeout 1
expect {
STU-C-I/F {
send " "
send "\r"
}
STU-C-DSL {
send "\r"
}
STU-R-DSL {
send " "
send " "
send " "
send "\r"
}
STU-R-I/F {
send " "
send " "
send "\r"
}
timeout {
send " "
send " "
send " "
send "\r"
}
}

# 0x28 is down arrow keycode
send \x28
sleep 1
}

set timeout 30

while {$y ne 0} {
expect {
underflow {
puts "\n\nRun $y Times\x07\n\n"
exit $y
}
Network {
send "\r"
}
Customer {
sleep 1
}
Off {
send "\r"
}
Download {
send "\x07"
exit
}
timeout {
send " "
}
}
incr y
}
## Rescursive test
incr y
loopbackTest $y
return
}

proc carrigeReturn x {
# Carrige Return 0x13 "\r"
send "\r"
sleep 1
return
}

proc passwordKeyin x {
expect {
assword: {
# press enter as password
carrigeReturn 0
}
Test {
# Goto Test menu
send T
sleep 1
# Goto Loopback Test
loopbackTest 0
return
}
again {
# Password error, send Enter to try again
carrigeReturn 0
}
loopbacks {
# Send Escape key to escape to main menu
send \033
sleep 1
# Goto Test menu
send T
sleep 1
# Goto Loopback Test
loopbacktest 0
return
}
"Clear 24 Hour History" {
# It must in Main Menu, Escape
send \033
sleep 1
}
Download {
puts "\x07"
exit
}
timeout {
# Nothing, send backspace and enter for renew screen display
backSpace 0
sleep 1
send "\r"
sleep 1
}
}
}

# Set default timeout
set timeout 10
# Set Serial port parameters
set port [open /dev/tts/USB0 RDWR]
fconfigure $port -blocking 0 -buffering line -mode 9600,n,8,1 -translation auto
-eofchar {}

# Start connect from serial port
uplevel #0 {spawn -open $port}

#set session1 $spawn_id

# wait for connected
sleep 2

# Send 2 space for calculate connection speed from client
startUp 0
#
set x 0
while {$x eq 0} {
passwordKeyin 0
}
#passwordKeyin 0
#passwordKeyin 0

#close serial port
close $port
#End


用 expect 連接 Telnet 並按鍵

#!/usr/bin/expect -d

set timeout 3

spawn telnet 172.16.7.250

while {$timeout ne 0} {
expect {
4.SW4 {
expect {
timeout {
send "4\r"
}
}
}
timeout {
send "0"
}
}
}


發表回應 發表回應 ( 1020預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 540 )

Terminal Characters define
12/21/2009, 12:31 - Misc
000 0 0x00 NUL
001 1 0x01 SOH, Control-A
002 2 0x02 STX, Control-B
003 3 0x03 ETX, Control-C
004 4 0x04 EOT, Control-D
005 5 0x05 ENQ, Control-E
006 6 0x06 ACK, Control-F
007 7 0x07 BEL, Control-G
010 8 0x08 BS, backspace, Control-H
011 9 0x09 HT, tab, Control-I
012 10 0x0a LF, line feed, newline, Control-J
013 11 0x0b VT, Control-K
014 12 0x0c FF, form feed, NP, Control-L
015 13 0x0d CR, carriage return, Control-M
016 14 0x0e SO, Control-N
017 15 0x0f SI, Control-O
020 16 0x10 DLE, Control-P
021 17 0x11 DC1, XON, Control-Q
022 18 0x12 DC2, Control-R
023 19 0x13 DC3, XOFF, Control-S
024 20 0x14 DC4, Control-T
025 21 0x15 NAK, Control-U
026 22 0x16 SYN, Control-V
027 23 0x17 ETB, Control-W
030 24 0x18 CAN, Control-X
031 25 0x19 EM, Control-Y
032 26 0x1a SUB, Control-Z
發表回應 發表回應 ( 1003預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 381 )

Arduino WebSwitch
12/14/2009, 17:13 - Open Source
加入了將設定寫至 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 放在一起了。

這個程式很簡單,在 8 支 digital pin 上,連接電晶體當電子開關,控制 Relay 或 SSR,作為網路可控制110V/220V的 8 孔電源開關。可以由 Web browser 得知開關的狀態。預設的 IP address 是用 169.254.0.0/16 所以可以在一開始時用簡單 Crossover 線,接上PC Windows (設定為 DHCP)的方式設定好正確的 IP,也可以設定開關的 default 狀態。


/*
This program is wor Arduino Ethernet Shield with W5100 ethernet chip,
As a 8 digital pins control in web page
Version : 1.0
Programmer : Tasuka Hsu, Dec 1 2009
*/

// Library import
#include <Ethernet2.h>
#include <Print.h>
#include <Server.h>
#include <Client.h>
#include <EEPROM.h>
#include <avr/pgmspace.h>

// Const define
#define LENGTH 50 // Message length
#define PINS 8 // Digital pins 1 to 8

#define EEPROM_START_ADDRESS 0
#define EEPROM_MAC EEPROM_START_ADDRESS+10
#define EEPROM_IP EEPROM_MAC+6
#define EEPROM_SUBNET EEPROM_IP+4
#define EEPROM_GATEWAY EEPROM_SUBNET+4
#define EEPROM_PORT EEPROM_GATEWAY+4
#define EEPROM_REFRESH EEPROM_PORT+2
#define EEPROM_SW EEPROM_REFRESH+2
#define EEPROM_RESERVED EEPROM_SW+8

// MAC Address
byte MAC[]={0x80,0x0c,0x01,0x01,0xef,0xfe};

byte Default IP Address setting
byte IP[]={169,254,1,1};
byte GATEWAY[]={0,0,0,0};
byte SUBNET[]={255,255,0,0};

//byte IP[]={172,16,7,250};
//byte GATEWAY[]={172,16,7,254};
//byte SUBNET[]={255,255,255,248};

byte SW[PINS]={0,0,0,0,0,0,0,0}; /* Switch defult state config */

unsigned int PORT=80; // HTTP port
unsigned int REFRESH=120; // HTTP refresh timer

// Keep Strings in Flash Memory not load into RAM for RAM space save
static char TITLE_S[] PROGMEM = "Adruino Digital Pins Control";
static char ANNOUNCE[] PROGMEM = "Tasuka Lab";
static char FOOTER0[] PROGMEM = "Open source of hardware and software for Arduino";
static char FOOTER1[] PROGMEM = "Program By Tasuka Hsu";
static char ARDUINO_WEB[] PROGMEM = "http://www.arduino.cc";

static char HTML_HEADER0[] PROGMEM = "HTTP/1.1 200 OK";
static char HTML_HEADER1[] PROGMEM = "Content-Type: text/html; charset=utf-8";
static char HTML[] PROGMEM = "<html>";
static char HTML_[] PROGMEM = "</html>";
static char TITLE[] PROGMEM = "<title>";
static char TITLE_[] PROGMEM = "</title>";
static char HEAD[] PROGMEM = "<head>";
static char HEAD_[] PROGMEM = "</head>";
static char CENTER[] PROGMEM = "<center>";
static char CENTER_[] PROGMEM = "</center>";
static char BODY[] PROGMEM = "<body>";
static char BODY_[] PROGMEM = "</body>";
static char INPUT_TEXT[] PROGMEM = "<input type=\"text\" name=\"";
static char INPUT_TEXT_[] PROGMEM = "\" value=\"";
static char INPUT_TEXT__[] PROGMEM = "\" size=\"";
static char INPUT_TEXT___[] PROGMEM = "\">";
static char INPUT_RADIO[] PROGMEM = "<input type=\"radio\" name=\"";
static char META[] PROGMEM = "<meta http-equiv=\"refresh\" content=\"";
static char META_[] PROGMEM = ";url=/\">";
static char SUBMIT[] PROGMEM = "<input type=\"submit\" value=\"Send\">";
static char CLEAR_BUF_CHKBX[] PROGMEM = "Clear Config<input type=\"checkbox\" name=\"cl0\">";
static char CHKBOX[] PROGMEM = "<input type=\"radio\" name=\"";
static char URL_BTN_RETURN[] PROGMEM ="<a href=\"/\"><input type=\"button\" value=\"Return\"></a>";
static char URL_BTN_BACK[] PROGMEM = "<a href=\"/?g=1\"><input type=\"button\" value=\"Back\"></a>";
static char URL_BTN_CONFIG[] PROGMEM ="<a href=\"/?g=1\"><input type=\"button\" value=\"Config\"></a>";
static char FORM[] PROGMEM = "<form method=\"GET\" action=\"/\">";
static char FORM_[] PROGMEM = "</form>";
static char DIGITAL_TITLE[] PROGMEM = "<tr><td>Digital Pin</td><td>On</td><td>Off</td></tr>";
static char TABLE_BORDER[] PROGMEM = "<table border=\"1\" align=\"center\">";
static char TABLE_NO_BORDER[] PROGMEM="<table border=\"0\" align=\"center\">";
static char TABLE_[] PROGMEM = "</table>";
static char MAC_CONFIG[] PROGMEM = "<a href=\"/?g=2\">Config MAC Address</a>";
static char IP_CONFIG[] PROGMEM = "<a href=\"/?g=3\">Config IP Address</a>";
static char SUBNET_CONFIG[] PROGMEM = "<a href=\"/?g=4\">Config Subnet Mask</a>";
static char GATEWAY_CONFIG[] PROGMEM ="<a href=\"/?g=5\">Config Gateway Address</a>";
static char PORT_CONFIG[] PROGMEM = "<a href=\"/?g=6\">Config TCP Port</a>";
static char REFRESH_CONFIG[] PROGMEM ="<a href=\"/?g=7\">Config HTML Refresh Time</a>";
static char SW_CONFIG[] PROGMEM = "<a href=\"/?g=8\">Config SW Default State</a>";
static char MAC_TITLE[] PROGMEM = "<tr><td>MAC Address</td><td>";
static char IP_TITLE[] PROGMEM = "<tr><td>IP Address</td><td>";
static char SUBNET_TITLE[] PROGMEM = "<tr><td>Subnet Mask</td><td>";
static char GATEWAY_TITLE[] PROGMEM = "<tr><td>Gateway</td><td>";
static char PORT_TITLE[] PROGMEM = "<tr><td>TCP Port</td><td>";
static char REFRESH_TITLE[] PROGMEM = "<tr><td>HTML Refresh Time</td><td>";
static char SW_TITLE[] PROGMEM = "<tr><td>Switch Default State</td><td>";
static char TD_TR_[] PROGMEM = "</td></tr>";
static char TD_TR_BR[] PROGMEM = "</td></tr><br><tr><td>";
static char ON_OFF[] PROGMEM = "<tr><td></td><td>On/Off</td></tr>";
static char CHECKED[] PROGMEM = "\" checked=\"checked";
static char SPACE[] PROGMEM = " ";

// The string address pointer
PROGMEM const char *string_table[]={
TITLE_S, //0
ANNOUNCE,
FOOTER0,
FOOTER1,
ARDUINO_WEB,
HTML_HEADER0, //5
HTML_HEADER1,
HTML,
HTML_,
TITLE,
TITLE_, //10
HEAD,
HEAD_,
CENTER,
CENTER_,
META, //15
BODY,
BODY_,
INPUT_TEXT,
INPUT_TEXT_,
INPUT_TEXT__, //20
INPUT_TEXT___,
SUBMIT,
CLEAR_BUF_CHKBX,
URL_BTN_RETURN,
URL_BTN_BACK, //25
URL_BTN_CONFIG,
TABLE_,
FORM,
META_,
DIGITAL_TITLE, //30
TABLE_BORDER,
MAC_CONFIG,
IP_CONFIG,
SUBNET_CONFIG,
GATEWAY_CONFIG, // 35
PORT_CONFIG,
REFRESH_CONFIG,
TABLE_NO_BORDER,
MAC_TITLE,
IP_TITLE, //40
SUBNET_TITLE,
GATEWAY_TITLE,
PORT_TITLE,
REFRESH_TITLE,
INPUT_RADIO, //45
FORM_,
TD_TR_,
SW_CONFIG,
SW_TITLE,
CHKBOX, //50
TD_TR_BR,
ON_OFF,
CHECKED,
SPACE
};

// RAM buffer for strings move from flash memory
char buffer[70];

// CGI GET messages buffer
char MESSAGE[LENGTH+1];
byte page=0;
boolean bootUp=true;

// HTTP Server setting
//Server server=Server(PORT);

// Load string's content from Flash memory by index of pointer to RAM
void get2RAM(byte k)
{
strcpy_P(buffer,(char *)pgm_read_word(&(string_table[k])));
}

void ReadWriteConfig()
{
byte i=0;

get2RAM(1);
// Write default data to EEPROM
if((EEPROM.read(EEPROM_START_ADDRESS)!=buffer[0])&&(EEPROM.read(EEPROM_START_ADDRESS+1)!=buffer[1])){
for(i=0;i<10;i++){
EEPROM.write(EEPROM_START_ADDRESS+i,buffer);
if(i<PINS){
EEPROM.write(EEPROM_SW+i,LOW);
SW=0;
if(i<6){
EEPROM.write(EEPROM_MAC+i,MAC);
if(i<4){
EEPROM.write(EEPROM_IP+i,IP);
EEPROM.write(EEPROM_GATEWAY+i,GATEWAY);
EEPROM.write(EEPROM_SUBNET+i,SUBNET);
}
}
}
}
EEPROM.write(EEPROM_PORT,byte((PORT&0xff00)/256));
EEPROM.write(EEPROM_PORT+1,byte(PORT&0x00ff));
EEPROM.write(EEPROM_REFRESH,byte((REFRESH&0xff00)/256));
EEPROM.write(EEPROM_REFRESH+1,byte(REFRESH&0x00ff));
}else{
// Read config data from EEPROM
for(i=0;i<PINS;i++){
SW=EEPROM.read(EEPROM_SW+i);
if(i<6){
MAC=EEPROM.read(EEPROM_MAC+i);
if(i<4){
IP=EEPROM.read(EEPROM_IP+i);
GATEWAY=EEPROM.read(EEPROM_GATEWAY+i);
SUBNET=EEPROM.read(EEPROM_SUBNET+i);
}
}
}
PORT=(int(EEPROM.read(EEPROM_PORT))*256)+int(EEPROM.read(EEPROM_PORT+1));
REFRESH=(int(EEPROM.read(EEPROM_REFRESH))*256)+int(EEPROM.read(EEPROM_REFRESH+1));
}
}

void char2Hex(byte m)
{
byte j=0;

for(byte i=0;i<2;i++){
if(i==0){
j=(m&0xf0)/16;
}else{
j=m&0x0f;
}
if(j>=0&&j<=9){
buffer=char(int(j)+'0');
}else{
buffer=char(int(j)+'A'-10);
}
}
buffer[2]='\0';
}

byte getIP(byte i,byte t)
{
byte j=MESSAGE[i+2]-'0';
byte k=4;
if(j>=0&&j<4){
byte l=0;
while((MESSAGE[i+k]!='&')&&(MESSAGE[i+k]!=' ')&&(MESSAGE[i+k]!='\n')&&(MESSAGE[i+k]!='\r')&&(MESSAGE[i+k]!='\0')){
l=l*10+byte(MESSAGE[i+k]-'0');
k++;
}
switch(t){
case 1:
IP[j]=l;
EEPROM.write(EEPROM_IP+j,l);
break;
case 2:
SUBNET[j]=l;
EEPROM.write(EEPROM_SUBNET+j,l);
break;
case 3:
GATEWAY[j]=l;
EEPROM.write(EEPROM_GATEWAY+j,l);
break;
}
}
return(k);
}

byte getDigit(byte i,byte t)
{
byte k=4;
unsigned int l=0;
while((MESSAGE[i+k]!='&')&&(MESSAGE[i+k]!=' ')&&(MESSAGE[i+k]!='\n')&&(MESSAGE[i+k]!='\r')&&(MESSAGE[i+k]!='\0')){
l=l*10+byte(MESSAGE[i+k]-'0');
k++;
}
switch(t){
case 1:
PORT=l;
EEPROM.write(EEPROM_PORT,byte((PORT&0xff00)/256));
EEPROM.write(EEPROM_PORT+1,byte(PORT&0x00ff));
break;
case 2:
REFRESH=l;
EEPROM.write(EEPROM_REFRESH,byte((REFRESH&0xff00)/256));
EEPROM.write(EEPROM_REFRESH+1,byte(REFRESH&0x00ff));
break;
}
return(k);
}
void parseCGI()
{
byte i=0;
byte flag=false;

// Send to Digital pins from parse HTTP send message
while(MESSAGE!='\0'){
// Port Status
if((MESSAGE=='p'||MESSAGE=='P')&&(MESSAGE[i+2]=='=')){
digitalWrite(int(MESSAGE[i+1])-'0',int(MESSAGE[i+3])-'0');
i+=3;
}
// Page
if((MESSAGE=='g'||MESSAGE=='G')&&(MESSAGE[i+1]=='=')){
page=MESSAGE[i+2]-'0';
i+=2;
}
// Clear EEPROM to zero
if((MESSAGE=='c'||MESSAGE=='C')&&(MESSAGE[i+1]=='l'||MESSAGE[i+1]=='L')&&(MESSAGE[i+2]=='0')&&(MESSAGE[i+3]=='=')){
for(int j=0;j<512;j++){
EEPROM.write(EEPROM_START_ADDRESS+j,0);
}
i+=6;
}
// MAC Address Config and Write MAC to EEPROM
if((MESSAGE=='m'||MESSAGE=='M')&&(MESSAGE[i+1]=='a'||MESSAGE[i+1]=='A')&&(MESSAGE[i+3]=='=')){
byte j=MESSAGE[i+2]-'0';
if(j>=0&&j<6){
for(byte l=0;l<2;l++){
byte k=MESSAGE[i+4+l];
// Change to upper case
if(k>'Z'){
k=k-'a'+'A';
}
if(k<='9'&&k>='0'){
switch(l){
case 0:
MAC[j]=byte(int(k-'0')*16);
break;
case 1:
MAC[j]+=byte(int(k-'0'));
break;
}
}else{
switch(l){
case 0:
MAC[j]=byte(int(k-'A'+10)*16);
break;
case 1:
MAC[j]+=byte(int(k-'A'+10));
break;
}
}
}
EEPROM.write(EEPROM_MAC+j,MAC[j]);
}
i+=5;
}
// IP Address Config and Write to EEPROM
if((MESSAGE=='i'||MESSAGE=='I')&&(MESSAGE[i+1]=='p'||MESSAGE[i+1]=='P')&&(MESSAGE[i+3]=='=')){
i+=getIP(i,1);
}
// Subnet Address Config and Write to EEPROM
if((MESSAGE=='s'||MESSAGE=='S')&&(MESSAGE[i+1]=='b'||MESSAGE[i+1]=='B')&&(MESSAGE[i+3]=='=')){
i+=getIP(i,2);
}
// Gateway Address Config and Write to EEPROM
if((MESSAGE=='g'||MESSAGE=='G')&&(MESSAGE[i+1]=='w'||MESSAGE[i+1]=='W')&&(MESSAGE[i+3]=='=')){
i+=getIP(i,3);
}
// Port Config and Write to EEPROM
if((MESSAGE=='p'||MESSAGE=='P')&&(MESSAGE[i+1]=='r'||MESSAGE[i+1]=='R')&&(MESSAGE[i+2]=='0')&&(MESSAGE[i+3]=='=')){
i+=getDigit(i,1);
}
// Refresh Time Config and Write to EEPROM
if((MESSAGE=='r'||MESSAGE=='R')&&(MESSAGE[i+1]=='f'||MESSAGE[i+1]=='F')&&(MESSAGE[i+2]=='0')&&(MESSAGE[i+3]=='=')){
i+=getDigit(i,2);
}
// Switch default state Config and Write to EEPROM
if((MESSAGE=='s'||MESSAGE=='S')&&(MESSAGE[i+1]=='w'||MESSAGE[i+1]=='W')&&(MESSAGE[i+3]=='=')){
byte j=MESSAGE[i+2]-'0';
SW[j]=byte(MESSAGE[i+4]-'0');
EEPROM.write(EEPROM_SW+j,SW[j]);
i+=5;
}
i++;
}
}

void setup()
{
// Read/Write config from/to EEPROM
ReadWriteConfig();

// Initial digital pin setting to EEPROM store setting
for(byte i=0;i<PINS;i++){
pinMode(i,OUTPUT);
digitalWrite(i,SW);
}
}

void loop()
{
Server server=Server(PORT);
if(bootUp){
// Initial Ethernet MAC and IP setting
Ethernet.begin(MAC,IP,GATEWAY,SUBNET);

// Start server listen
server.begin();
bootUp=false;
}

/* Initial client */
Client client=server.available();

if(client) {
boolean current_line_is_blank=true,flag=false;
char c='\0';
byte i=0;

// If connected
while(client.connected()){
if(client.available()){

/* Clear MESSAGE */
for(i=0;i<LENGTH;i++){
MESSAGE='\0';
}

flag=false;
i=0;

// Read from HTTP GET input information
while((c=client.read())!='\n' && i<=LENGTH){
if(c=='?'){
flag=true;
}
if(c==' '||c=='\n'||c=='\0'){
flag=false;
}
if(flag){
MESSAGE[i++]=c;
}
}
MESSAGE='\0';

page=0;
parseCGI();

if(current_line_is_blank){
// Send HTTP header
get2RAM(5);
client.println(buffer);
//client.println("HTTP/1.1 200 OK");
get2RAM(6);
client.println(buffer);
//client.println("Content-Type: text/html; charset=utf-8");
client.println();

// Send HTML
get2RAM(7);
client.println(buffer);
//client.println("<html>");
get2RAM(9);
client.print(buffer);
//client.print("<title>");
get2RAM(0);
client.print(buffer);
//client.print(TITLE);
get2RAM(10);
client.println(buffer);
//client.println("</title>");
get2RAM(11);
//client.print("<head>");
client.print(buffer);
get2RAM(13);
client.print(buffer);
//client.print("<center>");
client.print("<h1>");
get2RAM(0);
client.print(buffer);
//client.print(TITLE);
client.print("</h1>");
get2RAM(14);
client.print(buffer);
//client.println("</center>");
get2RAM(15);
client.print(buffer);
//client.print("<meta http-equiv=\"refresh\" content=\"");

if(page==0){
client.print(REFRESH);
}else{
client.print(3600);
}

get2RAM(29);
client.print(buffer);
//client.println(";url=/\">");
get2RAM(12);
client.println(buffer);
//client.println("</head>");
get2RAM(16);
client.print(buffer);
//client.println("<body>");
client.println("<hr>");
get2RAM(28);
client.print(buffer);
//client.print("<form method=\"");
//client.print("GET");
//client.print("\"");
//client.println(" action=\"/\">");

if(page==0){
// Read data from digital pin
get2RAM(31);
client.print(buffer);
/*
client.print("<table border=\"");
client.print(1);
client.print("\"");
client.print(" ");
client.print("align=\"");
client.print("center");
client.print("\"");
client.println(">");
*/
get2RAM(30);
client.print(buffer);
/*
client.print("<tr>");
client.print("<td>");
client.print("Digital");
client.print(" ");
client.print("Pin");
client.print("</td>");
client.print("<td>");
client.print("On");
client.print("</td>");
client.print("<td>");
client.print("Off");
client.print("</td>");
client.println("</tr>");
*/
for(i=0;i<PINS;i++){
client.print("<tr><td>SW ");
client.print(int(i));
client.println("</td><td>");

/* Display pins status */
if(digitalRead(i)==HIGH){
get2RAM(45);
client.print(buffer);
client.print("p");
client.print(int(i));
get2RAM(53);
client.print(buffer);
//client.print("\" checked=\"checked");
client.print(1);
get2RAM(21);
client.print(buffer);
/*
client.print("<input type=radio");
client.print(" ");
client.print("name=\"");
client.print("p");
client.print(int(i));
client.print("\"");
client.print(" ");
client.print("checked");
client.print(" ");
client.print("value=\"");
client.print(1);
client.print("\">");
*/
client.println("</td>");

client.print("<td>");
get2RAM(45);
client.print(buffer);
client.print("p");
client.print(int(i));
get2RAM(19);
client.print(buffer);
client.print(0);
get2RAM(21);
client.print(buffer);
/*
client.print("<input type=radio");
client.print(" ");
client.print("name=\"");
client.print("p");
client.print(int(i));
client.print("\"");
client.print(" ");
client.print("value=\"");
client.print(0);
client.println("\">");
*/
}else{
get2RAM(45);
client.print(buffer);
client.print("p");
client.print(int(i));
get2RAM(19);
client.print(buffer);
client.print(1);
get2RAM(21);
client.print(buffer);
/*
client.print("<input type=radio");
client.print(" ");
client.print("value=\"");
client.print(1);
client.print("\"");
client.print(" ");
client.print("name=\"");
client.print("p");
client.print(int(i));
client.print("\">");
*/
client.println("</td>");

client.print("<td>");
get2RAM(45);
client.print(buffer);
client.print("p");
client.print(int(i));
get2RAM(53);
client.print(buffer);
//client.print("\" checked=\"checked");
get2RAM(19);
client.print(buffer);
client.print(0);
get2RAM(21);
client.print(buffer);
/*
client.print("<input type=radio");
client.print(" ");
client.print("checked");
client.print(" ");
client.print("value=\"");
client.print(0);
client.print("\"");
client.print(" ");
client.print("name=\"");
client.print("p");
client.print(int(i));
client.println("\">");
*/
}

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");

}
get2RAM(27);
client.print(buffer);
//client.print("</table>");
}

get2RAM(13);
client.print(buffer);
//client.print("<center>");
if(page==1){
get2RAM(32);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(2);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("MAC Address");
client.print("</a>");
*/
client.println("<br>");

get2RAM(33);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(3);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("IP Address");
client.print("</a>");
*/
client.println("<br>");

get2RAM(34);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(4);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("Subnet Mask");
client.print("</a>");
*/
client.println("<br>");

get2RAM(35);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(5);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("Gateway Address");
client.print("</a>");
*/
client.println("<br>");

get2RAM(36);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(6);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("TCP Port");
client.print("</a>");
*/
client.println("<br>");

get2RAM(37);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(7);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("HTML Refresh Time");
client.print("</a>");
*/
client.println("<br>");

get2RAM(48);
client.print(buffer);

client.println("<br>");
}
if(page>=2){
get2RAM(38);
client.print(buffer);
/*
client.print("<table border=\"");
client.print(0);
client.print("\"");
client.print(" ");
client.print("align=\"");
client.print("center");
client.print("\"");
client.print(">");
*/

if(page==2){
get2RAM(39);
client.print(buffer);
/*
client.println("<tr>");
client.print("<td>");
client.print("MAC Address");
client.println("</td>");

client.print("<td>");
*/
for(i=0;i<6;i++){
if(i>0&&i<6){
client.print(":");
}
get2RAM(18);
client.print(buffer);
client.print("ma");
client.print(int(i));
get2RAM(19);
client.print(buffer);
char2Hex(MAC);
client.print(buffer);
get2RAM(20);
client.print(buffer);
client.print(2);
get2RAM(21);
client.print(buffer);
}

client.println("</td>");
}

if(page==3){
get2RAM(40);
client.print(buffer);
/*
client.println("<tr>");

client.print("<td>");
client.print("IP Address");
client.println("</td>");

client.println("<td>");
*/
for(i=0;i<4;i++){
if(i>0&&i<4){
client.print(".");
}
get2RAM(18);
client.print(buffer);
client.print("ip");
client.print(int(i));
get2RAM(20);
client.print(buffer);
client.print(3);
get2RAM(19);
client.print(buffer);
client.print(int(IP));
get2RAM(21);
client.print(buffer);
}

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}

if(page==4){
get2RAM(41);
client.print(buffer);
/*
client.println("<tr>");
client.print("<td>");
client.print("Subnet Mask");
client.println("</td>");

client.println("<td>");
*/
for(i=0;i<4;i++){
if(i>0&&i<4){
client.print(".");
}
get2RAM(18);
client.print(buffer);
client.print("sb");
client.print(int(i));
get2RAM(20);
client.print(buffer);
client.print(3);
get2RAM(19);
client.print(buffer);
client.print(int(SUBNET));
get2RAM(21);
client.print(buffer);
}

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}

if(page==5){
get2RAM(42);
client.print(buffer);
/*
client.println("<tr>");
client.println("<td>");
client.print("Gateway");
client.println("</td>");

client.print("<td>");
*/
for(i=0;i<4;i++){
if(i>0&&i<4){
client.print(".");
}
get2RAM(18);
client.print(buffer);
client.print("gw");
client.print(int(i));
get2RAM(20);
client.print(buffer);
client.print(3);
get2RAM(19);
client.print(buffer);
client.print(int(GATEWAY));
get2RAM(21);
client.print(buffer);
}

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}

if(page==6){
get2RAM(43);
client.print(buffer);
/*
client.println("<tr>");
client.print("<td>");
client.print("TCP Port");
client.println("</td>");

client.println("<td>");
*/
get2RAM(18);
client.print(buffer);
client.print("pr");
client.print(0);
get2RAM(20);
client.print(buffer);
client.print(5);
get2RAM(19);
client.print(buffer);
client.print((unsigned int)int(PORT));
get2RAM(21);
client.print(buffer);

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}

if(page==7){
//client.println("<td>");
get2RAM(44);
client.print(buffer);

get2RAM(18);
client.print(buffer);
client.print("rf");
client.print(0);
get2RAM(20);
client.print(buffer);
client.print(3);
get2RAM(19);
client.print(buffer);
client.print((unsigned int)int(REFRESH));
get2RAM(21);
client.print(buffer);

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}

if(page==8){
get2RAM(49);
client.print(buffer);
get2RAM(51);
client.print(buffer);
//client.print("</td></tr><br><tr><td>");
get2RAM(38);
client.print(buffer);
get2RAM(52);
client.print(buffer);
//client.println("<tr><td></td><td>On/Off</td></tr>");

for(i=0;i<PINS;i++){
client.print("<tr><td>SW");
client.print(int(i));
client.print("</td><td>");
get2RAM(45);
client.print(buffer);
//client.print("<input type=\"radio\" name=\"sw");
client.print("sw");
client.print(int(i));
get2RAM(19);
client.print(buffer);
//client.print("\" value=\"");
client.print(1);
if(SW==1){
get2RAM(53);
client.print(buffer);
//client.print("\" checked=\"checked");
}
get2RAM(21);
client.print(buffer);

get2RAM(45);
client.print(buffer);
//client.print("<input type=\"radio\" name=\"sw");
client.print("sw");
client.print(int(i));
get2RAM(19);
client.print(buffer);
//client.print("\" value=\"");
client.print(0);
if(SW==0){
get2RAM(53);
client.print(buffer);
//client.print("\" checked=\"checked");
}
get2RAM(21);
client.print(buffer);

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}
get2RAM(27);
client.print(buffer);
//client.print("</table>");
get2RAM(47);
client.print(buffer);
//client.print("</td></tr>");
get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}
get2RAM(27);
client.print(buffer);
//client.println("</table>");
client.println("<br>");
}
get2RAM(14);
client.print(buffer);
//client.println("</center>");

if(page>=2){
get2RAM(13);
client.print(buffer);
//client.println("<center>");
get2RAM(23);
client.print(buffer);
get2RAM(14);
client.print(buffer);
//client.println("</center>");
client.println("<br>");
}

if(page!=1){
get2RAM(13);
client.print(buffer);
//client.println("<center>");
get2RAM(22);
client.print(buffer);
get2RAM(14);
client.print(buffer);
//client.println("</center>");
}

get2RAM(46);
client.print(buffer);
//client.println("</form>");
client.println("<br>");

client.print("<hr>");
get2RAM(13);
client.print(buffer);
//client.print("<center>");
if(page==0){
get2RAM(26);
client.print(buffer);
}
if(page>=2){
get2RAM(25);
client.print(buffer);
}
if(page!=0){
get2RAM(24);
client.print(buffer);
}
get2RAM(14);
client.print(buffer);
//client.print("</center>");
client.println("<br>");
/*
// Debug received message
client.print("Message=");
client.println(MESSAGE);

for(i=0;i<16;i++){
client.print(int(EEPROM.read(EEPROM_START_ADDRESS+i)));
client.print(" ");
}
client.print("Page ");
client.println(int(page));
// Debug message end
*/
// HTML tail
client.println("<h6>");
get2RAM(2);
client.print(buffer);
client.print("<br>");
//client.println("Open source of hardware and software for Arduino";

client.print("<a href=");
get2RAM(4);
client.print(buffer);
//client.print("http://www.arduino.cc");
client.print(">");
get2RAM(4);
client.print(buffer);
//client.print("http://www.arduino.cc");
client.print("</a>");

client.print("<br>");
get2RAM(3);
client.println(buffer);
client.println("<br>");

client.println("</h6>");
get2RAM(17);
client.println(buffer);
//client.println("</body>");
get2RAM(8);
client.println(buffer);
//client.println("</html>");
break;
}
if(c=='\n'){
current_line_is_blank=false;
}
}
}
delay(1);
client.stop();
}
}


發表回應 發表回應 ( 2268預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3.1 / 420 )

SED recursive strip
12/14/2009, 11:48 - Misc
This is a script to recursive strip some thing between "$A_PROPERTIES" and "$FUNCTIONS" also between "$FUNCTIONS" to "$NETS"
And strip all of the ":FXX." to "."


#!/bin/sh
sed -e "s/\:F[0-9]*\./\./g" $1 >$1.txt
sed -e "/^\$A_PROPERTIES/,/^\$FUNCTIONS/!b
/^\$A_PROPERTIES/{
x
s/^.*\n//
x
}
G
/\$FUNCTIONS/!d
s/\n.*//
" $1.txt >$1.txt.txt

sed -e "/^\$FUNCTIONS/,/^\$NETS/!b
/^\$FUNCTIONS/{
x
s/^.*\n//
x
}
G
/\$NETS/!d
s/\n.*//
" $1.txt.txt >$1.txt

rm -fr $1.txt.txt



發表回應 發表回應 ( 731預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 414 )


<<開始 <前一頁 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 下一頁> 最後>>