PICNIC

課題4 CSV形式データを含んだ制御ページ取得とFTPサーバへのアップロード

■ 課題4 

1. 課題4の目標

2. web制御画面のHTMLデータへのCSVデータ行追加

3. 各コマンドのインストールについて

4. ページ取得とフィルタ加工の例

5. 定期的なコマンド実行のスケジューリング方法

6. ftpサーバへのCSVファイルアップロード

7. 課題4の提出

8. 考察のポイント

9. 参考URL

■レポート提出システム

 

→質問やお気づきの点はこちら

←目次へ戻る

2008年6月25日 11:03 更新

 

●課題4の目標

課題4として、「CSV形式データを含んだ制御ページ取得とFTPサーバへのアップロード」の課題提出を行う。→課題提出はここから

IT大学院カリキュラム:(A)IT技術者になるための最低限の知識・技能の習得 で修得した項目のいくつかを実際に活用していく
※履修順序の関係:
http://cai.cs.shinshu-u.ac.jp/sugsi/info/Lecture2006.png

この課題の目的は2つある。

(1)CSV形式データの生成(PICNIC側)
課題3で作成したバージョンのドアセキュリティシステム(ver1.2.0.8)を基にし、web制御画面のHTMLデータ中に、CSV,....から始まる各種データを盛り込んだCSV(カンマスペース区切り形式データ)行を追加する。

(2)取得データのFTPサーバへのアップロード(PC側)
PICNICへ接続可能なUnix(Linux、FreeBSD、Sunなど)あるいはWindowsPCから以下のHTMLページ取得と各種加工ツールを使うことにより、ページ取得と、CSV行の検出・フィルタ・加工を行い、最後に、FTPサーバへ加工済みCSVデータをアップロードする。

・wget:HTMLページ取得プログラム
・grep:フィルタ
・sed :ストリームエディタ
・date:日付/時刻取得と表示

これは汎用性の高いデータ形式なので、ログとしてのデータベース化、あるいは各PICNICノードの最近の状態把握など、様々な用途に使用できる。

<付記>
各々のコマンドの使用方法については、man電子マニュアルページ、あるいは
例: wget --help
というように --help オプションを付けて起動すると使用方法が表示される。

●web制御画面のHTMLデータへのCSVデータ行追加

HTMLデータ取得後の加工作業を容易にするため、web制御画面のHTMLデータ中に、CSV,....から始まる各種データ行を追加する。これはフッタの最終行に\nした後、入れると良い。

(1)CSVデータ形式

CSV行のカンマ区切りデータは、以下の並びであるとする。
※今回は、IPアドレス、ポート番号はデータ中に載せない。
アプリケーションによっては載せたほうがよい場合があるだろう。

<CSVデータ形式(実際には一行)>
-------------------------------------------
CSV,
学籍番号,
Firm Version,
MAC Address,
RA0,RA1,RA2,RA3,RA5,
RB0,RB1,RB2,RB3,RB4,RB5,RB6,RB7,
ドア開閉回数カウンタcounter(行終了)
-------------------------------------------

<出力例>

CSV,02TA699X, 1.2.0.9, 00:02:CB:01:2E:75, 0, 0, 0, 0, 27, High , Low , High , High , High , Low , Low , Low , 0

→実際のwebページ(HTML)の様子はここからどうぞ


(2)プログラム変更

web制御画面メッセージバンク#4のフッタ部分へ、以下のコードを追加する。

<web制御メッセージバンク#4 フッタ部分への追加コード>

;
;++++++++++++++ 各種データCSV行 +++++++++++[ver0.9]
;
DA "CSV," ; CSV行識別文字列
DA "02TA699X," ; 学籍番号
DA "$8," ; バージョン番号($8)
DA "$0," ; MACアドレス($0)
DA "@\x00" ; RA0 '@",0000_0000b
DA ", "
DA "@\x01" ; RA1 '@",0000_0001b
DA ", "
DA "@\x02" ; RA2 '@",0000_0010b
DA ", "
DA "@\x03" ; RA3 '@",0000_0011b
DA ", "
DA "@\x04" ; RA5 '@",0000_0100b(℃換算値表示)
DA ", "
DA "@\x10" ; RB0 '@',0001_0000b
DA ", "
DA "@\x11" ; RB1 '@',0001_0001b
DA ", "
DA "@\x12" ; RB2 '@',0001_0010b
DA ", "
DA "@\x13" ; RB3 '@',0001_0011b
DA ", "
DA "@\x14" ; RB4 '@',0001_0100b
DA ", "
DA "@\x15" ; RB5 '@',0001_0101b
DA ", "
DA "@\x16" ; RB6 '@',0001_0110b
DA ", "
DA "@\x17" ; RB7 '@',0001_0111b
DA ", "
DA "$9" ; ドア開閉回数カウンタcounter
DA "\n"

 

●各コマンドのインストールについて

(1)Unixマシンの場合

sh, bashなどのシェル、grep,sed,dateなどの各種コマンド、ならびにwgetは最近のLinux-OSなどには標準インストールの状態で入っている。


(2)WindowsPCの場合

以下の2つの方法がある。

[A] Cygwin環境をインストール
[B] Win32環境で動くGNU Unixコマンド互換ユーティリティをインストール


[A] Cygwin環境

CygwinホームページからCygwin環境セットアップを実行する。
http://www.cygwin.com/
http://www.cygwin.com/setup.exe

grep, sed, date:Baseカテゴリのdefaultインストールで入る。
wget:Webカテゴリで wget をインストール選択すると入る(defaultでは入らない)。

bashコマンドシェル上での操作となる。


[B] Win32-Unix互換コマンド環境(2005/3/25 再修正)

GNU utilities for Win32を用いて、Unix互換コマンドをインストールする。

このローカルコピーからダウンロード(12.6MB)して unxutils.exeを実行してセットアップしてください。

インストール時、Basicを選択。
コマンド群:C:\Windows\System32\ 下に入る。(よって、コマンドパス変更不要)
マニュアル:C:\Program Files\UnxUtils\ 下に入る。

各互換コマンドは、DOSコマンドプロンプトから呼び出した shシェル上で使用する。
コマンドの使用方法は、shシェル上で、man wget などで電子マニュアルを参照してください。

WinXPの場合:
【スタート】→【プログラム】→【アクセサリ】→<コマンドプロンプト>
あるいは、
【スタート】→【ファイル名を指定して実行】→ cmd.exe

その後、c:\windows\system32\sh を実行すれば、shシェルの互換環境になる。
Unix(Cygwin)上のシェルコマンドと同じ正規表現やリダイレクトが可能となる(非常に便利!)。

※注意点 WinXpなどでは、アルファベット数字で名前が構成された、管理者権限を有するadministratorユーザでセットアップを行ってください。

●ページ取得とフィルタ加工の例(2005/3/25 修正)

※以下、PICNICは IPアドレス 192.168.1.200 / httpポート 8080番 で接続可能な状態であると仮定している。(実験する際、PICNICの電源は入れておくように)

(1)wgetによるPICNICのページ取得(GETコマンドの発行)

HTMLページ取得の例:

wget http://192.168.1.200:8080/
→ index.htmlに保存

wget -O picnic.html http://192.168.1.200:8080/
→ picnic.htmlに保存

wget -O - http://192.168.1.200:8080/
→ 標準出力へ書き出す

wget -O picnic.html http://192.168.1.200:8080/modify.cgi?RB6=H
→ GET methodでPICNICのRB6ポートをHighに変更した後、HTMLレスポンスをpicnic.htmlへ保存する。(ブラウザが無くても、wgetコマンドだけでポートの遠隔操作が可能!)※2005/3/25修正(-O引数を追加)


(2)grepによるCSV行の検出

行中に "CSV"という文字が含まれている行を切り出す。

  grep "CSV" inputfile.txt


(3)sedによる日付/時刻情報の付加

行先頭にdateの出力をカンマを付けて付加するような正規表現を date.sed として保存

  echo "s/^/`date`,/g" > date.sed

※注意:一部の日本語化Unix(例:TurboLinux 8 workstationの日本語rvt端末など)の環境では、LOCALEがja_JP.eucJPなどになっていて、dateの出力がEUC日本語となる場合がある。このような環境で、英語表記のdate出力を望む場合は、コマンド env を使用して、LANG=Cと指定した上で上記のdate実行を行えば良い。
例: env LANG=C date

<参考URL>
locale (ロケール・ロカール) の設定

 

次に、このdate.sedを使って、入力ファイル先頭に日付/時刻を付加する。

  sed -f date.sed inputfile.csv


(4)最終的なスクリプト

例:02TA699X.csvへ追記する場合

[A] Unix(Cygwin)環境の場合

picnic-get.sh
-----------------------------------------------------------------------
echo "s/^/`date`,/g" > date.sed ; wget -O - http://192.168.1.200:8080/ | grep --text "CSV" | sed -f date.sed >> 02TA699X.csv
-----------------------------------------------------------------------

[B] Win32環境の場合

以下のように、sh -c で順次コマンド呼び出しを行う。

picnic-get.cmd
-----------------------------------------------------------------------
echo off
sh -c "echo s/^/`date`,/g > date.sed"
sh -c "wget -O - http://192.168.1.200:8080/ | grep --text 'CSV' > picnic.csv"
sh -c "cat picnic.csv | sed -f date.sed >> 02TA699X.csv"
-----------------------------------------------------------------------

<生成されたCSVファイルの例>

02TA699X.csvの例

●定期的なコマンド実行のスケジューリング方法

(1)Unixマシンの場合

cron、あるいはatコマンドを使用して、定期的なシェルスクリプト実行を行う。


(2)Cygwin環境、Win32環境の場合(OS依存)

[A] Win2000,XPなどで、scheduleサービスが起動されている場合:
ATコマンドによるタスクのスケジュール実行が可能である。

WinXP(クラッシックメニュー)の場合:
【スタート】→【設定】→【コントロールパネル】→【タスク】で設定

※タスクウィザードで設定できるのは時刻指定の日単位スケジュールが最小のものである。


[B] コマンド実行をスケジューリングできるフリーソフトなどを使用する:

例:Multi Function Alarm Ver.1.52(フリーソフト)
http://www.vector.co.jp/soft/win95/personal/se057446.html

[C] Cygwin上でcronを使用するための設定:

Cygwin上でcronを使用するために、NTサービスへcygrunsrvをインストールすることも可能なようだ。
http://www.amy.hi-ho.ne.jp/tachibana/cygwin/cron.html

●ftpサーバへのCSVファイルアップロード

例:学籍番号 02TA699Xの場合

02TA699X.csvというCSVファイルがカレントディレクトリに存在しており、これをanonymousユーザでサーバのincoming/picnicディレクトリ下へFTPアップロードする。

FTPクライアントからの自動アップロードには、以下の2つの方法がある。

(1)FTPコマンド入力ファイルを用いた方法(-sオプションが使用できるCygwin環境上のftpクライアントなどで利用可)
(2)FTPコマンドを列挙したファイルを用意し、リダイレクトで流し込む方法(-nオプションが使用できるUnix上のftpクライアントで利用可)

(※2003年10月18日追記)

(1)FTPコマンド入力ファイルを用いた方法(Cygwin環境上のftpクライアントで利用可)

<FTPコマンド入力ファイル ftplogin.txt>


open ysserve.cs.shinshu-u.ac.jp
anonymous
wasaki@cs.shinshu-u.ac.jp  ←各自のメールアドレス
cd /incoming/picnic
del 02TA699X.csv
put 02TA699X.csv      ←アップロードしたいCSVファイル
quit


<実行例> ftp -s:ftplogin.txt を実行


THINKPAD2# ftp -s:ftplogin.txt
ftp> open ysserve.cs.shinshu-u.ac.jp
Connected to ysserve.cs.shinshu-u.ac.jp.
220 ysserve.cs.shinshu-u.ac.jp FTP server (Version 6.00LS) ready.
User (ysserve.cs.shinshu-u.ac.jp:(none)): anonymous  ←ユーザ名(実際には表示されない)
331 Guest login ok, send your email address as password. wasaki@cs.shinshu-u.ac.jp  ←パスワード(実際には表示されない)
230- Welcome to Anonymous FTP server 'ysserve.cs.shinshu-u.ac.jp'!
230-
230 Guest login ok, access restrictions apply.
ftp>
ftp> cd /incoming/picnic
250 CWD command successful.
ftp> put 02TA699X.csv
200 PORT command successful.
150 Opening ASCII mode data connection for '02TA699X.csv'.
226 Transfer complete.
ftp: 40 bytes sent in 0.00Seconds 40000.00Kbytes/sec.
ftp> quit
221 Goodbye.

(2)FTPコマンドを列挙したファイルを用意し、リダイレクトで流し込む方法(-nオプション利用)

<FTPコマンドを列挙したファイル ftpupload.txt>


open ysserve.cs.shinshu-u.ac.jp
user anonymous wasaki@cs.shinshu-u.ac.jp
cd /incoming/picnic
del 02TA699X.csv
put 02TA699X.csv
quit

<実行例> ftp -v -n < ftpupload.txt を実行


THINKPAD2# ftp -v -n < ftpupload.txt
ftp> open ysserve.cs.shinshu-u.ac.jp
Connected to ysserve.cs.shinshu-u.ac.jp.
220 ysserve.cs.shinshu-u.ac.jp FTP server (Version 6.00LS) ready.
User (ysserve.cs.shinshu-u.ac.jp:(none)): anonymous  ←ユーザ名(実際には表示されない)
331 Guest login ok, send your email address as password. wasaki@cs.shinshu-u.ac.jp  ←パスワード(実際には表示されない)
230- Welcome to Anonymous FTP server 'ysserve.cs.shinshu-u.ac.jp'!
230-
230 Guest login ok, access restrictions apply.
ftp>
ftp> cd /incoming/picnic
250 CWD command successful.
ftp> put 02TA699X.csv
200 PORT command successful.
150 Opening ASCII mode data connection for '02TA699X.csv'.
226 Transfer complete.
ftp: 40 bytes sent in 0.00Seconds 40000.00Kbytes/sec.
ftp> quit
221 Goodbye.

 


アップロードの確認は、以下のURLをブラウザなどでアクセスする。

ftp://ysserve.cs.shinshu-u.ac.jp/incoming/picnic/

MS-ExcelがインストールされたWindowsマシンで、InternetExplorerから上記のFTPフォルダに格納されているCSVファイルを直接開くことができる。
#他の受講生のファイルは消去しないこと!

 

●課題4の提出

【課題4】(総合実験)

【A】CSV形式データの生成(PICNIC側)
課題3で作成したバージョンのドアセキュリティシステム(ver1.2.0.8)を基にし、web制御画面のHTMLデータ中に、CSV,....から始まる各種データを盛り込んだCSV(カンマスペース区切り形式データ)行を追加する。

【B】取得データのFTPサーバへのアップロード(PC側)
PICNICへ接続可能なUnix(Linux、FreeBSD、Sunなど)あるいはWindowsPCから以下のHTMLページ取得と各種加工ツールを使うことにより、ページ取得と、CSV行の検出・フィルタ・加工を行い、最後に、FTPサーバへ加工済みCSVデータをアップロードする。

【A】CSV形式データの生成(PICNIC側)の演習とレポート提出

(1)CSV形式データをweb制御画面で表示するような、ファームウェアの更新を行いなさい。

(2)仕様通りの動作が行われることを、ドアセンサ状態、カウンタ値の変化、web制御画面を用いて確認せよ。

(3)アセンブルソースファイルのバージョン番号を、
 ver1.2.0.9
へ変更せよ。また、web制御画面のフッタ部分を、各自の学籍番号等に適宜変更せよ。

(4)完成したアセンブルソースファイルを v1209e4.asm という名前で保存せよ(全て半角英数字・アルファベットは小文字、半角カタカナ・全角文字はファイル名には決して使用しない)。

(5)以下のレポート提出システムから、v1209e4.asm をアップロードせよ。レポート受領後、採点が行われる。

<提出方法>
作成したプログラムは以下のレポートシステム(ファイルアップロード機能付き)を用いて、アセンブル・ソースファイル(拡張子が *.asm のもの。*.hexの方ではない)を提出します。 

提出されたファイルは、こちらで動作を確認した後、動作に不備があった場合には再提出、動作がOKの場合には”【A】分が修了”の判定を行います。

レポート課題4【A】(課題番号:picnic-exp04)の提出はここからどうぞ

(6)「判定待ち」となります。少々お待ちください。なかなか判定結果が出ない場合は、こちらへメールして下さい。

(7)再提出判定がなされた場合には指摘された不具合を修正し、v1209e4a.asmなどとファイル名を替えて、再提出する。

(8)(7)でない場合(修了判定)、レポート課題4【A】分は一旦受理されたことになる。(まだBが続く)


【B】取得データのFTPサーバへのアップロード(PC側)

(9)PICNICへ直接ネットワーク接続可能なPCにおいて、sh, bashなどのシェル、grep,sed,dateなどの各種コマンド、ならびにwgetコマンド群が使用可能な状態にセットアップせよ

(10) 個々のOS環境に応じた、ページ取得とフィルタ加工のシェルスクリプトを実装し、上記【A】で実装したCSV出力がPICNICから取得〜CSVファイルの追記・格納ができるか確認せよ。日付・時刻が追加されているか、10秒間隔くらいで3〜4回は取得しておく。

(11)定期的なコマンド実行のスケジューリング方法については、この時点では設定不要(後日、ゆっくりトライして下さい)

(12)作成した学籍番号.csvというファイル名のCSVファイルがカレントディレクトリに生成できているはずなので、これをanonymousユーザでftpサーバ(ysserve.cs.shinshu-u.ac.jp)のincoming/picnicディレクトリ下へFTPアップロードする。

(13)以下のURLへアクセスして、各自のCSVファイルがアップロードできているか確認する。
   ftp://ysserve.cs.shinshu-u.ac.jp/incoming/picnic/

(14)アップロードが確認でき次第、以下のレポート提出システムの教官コメント欄へ、アップロードしたCSVファイルのURLを含んだコメントを入力し、送信せよ。

<提出方法>
コメント欄に記述されたCSVファイルのURLを確認した後、不備があった場合には再提出、OKの場合には【B】分修了の判定、ならびに課題4全体に対しての修了判定を行います。

レポート課題4【B】(課題番号:picnic-exp04)の提出はここからどうぞ

(15)「判定待ち」となります。少々お待ちください。なかなか判定結果が出ない場合は、こちらへメールして下さい。

(16)再提出判定がなされた場合には指摘された不具合を修正し、再提出する。

(17)(16)でない場合(修了判定)、レポート課題4【B】分、ならびに課題4全体のレポートが受理されたことになる。


上記(17)まで完了した受講生の方、お疲れ様でした!これで「IT技術演習」必須提出課題は全て修了となりました。今後とも、当大学院での積極的な学習と研究、遠隔教育プロジェクトへの参画など、様々な面でご協力を賜りますよう、スタッフ一同願っております。どうぞ宜しくお願い申し上げます。m(_o_)m

●考察のポイント

以下に、今回の仕様と実装に対する考察ポイントを挙げます。レポートとして回答必須ではありませんが、プログラム完成・レポート提出前に必ず各自で考えをまとめておくようにせよ。

 

[1] 今回のCSV出力形式について、取得するPICNICのファームウェアのバージョンと、取得後のデータ処理(どのカラムが、何のデータを意味するのか)が相互に連携・一致している必要がある。他方、データ取得PC側から見ると、HTML取得を行う”ノード”は、実際に”存在する”PICNICマイコンボードである必要はない。このことは、将来PICNICマイコンボードのバージョンが変わり扱う入出力ポートの数が変化したり、故、各カラムの割り当てが変更される可能性を示唆している。今回のCSVデータ形式は、データ値を列挙しているだけで、各カラムのポート割り当てや意味を表す、タイトル行を含んでいない。このために、最終的な *.csv ファイルの先頭行に、当該”CSVファイル形式のバージョン”(PICNICファームウェアのバージョンではない)と、各カラムの割り当てを示したものを明示する方法をとると良いであろう。この方策についての検討と実装上のポイントについて議論せよ

[2] PICNICからのデータ取得→サーバへのアップロードについては、どのような取得周期・タイミングで行えばよいか?これは適用するアプリケーションによって大きく変化するであろう。例えば、単純に「温度記録装置」として使用するならば、10分毎の計測→数時間分まとめて転送 というタイミングでも要求に叶う場合が多いであろう。他方、ドアセキュリティシステムとして利用し、留守中のドア警報の速報性が必要ならば、「留守中」については1分以下の計測→通報のタイミングが要求される場面もあろう。アプリケーション依存によるデータ計測と転送タイミングについて詳しく検討を加えよ。

[3] wgetコマンドでCGI引数(?RB6=Hなど)を与えることで、シェルスクリプトからのPICNICのポート出力制御が即時可能である。この機能を利用したアプリケーション例について検討してみよ。

 

●参考URL

UNIX Tools for Win32
http://crocus.sci.kumamoto-u.ac.jp/physics/astro/fujimoto/home/junixwin32.htm

Cygwin
http://www.cygwin.com/

GNU utilities for Win32
http://unxutils.sourceforge.net/

GNU FSF/UNESCO Free Software Directory
http://www.gnu.org/directory/

 

信州大学インターネット大学院

Creative Commons License

IT技術演習(院)−PICNIC− by Katsumi WASAKI is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.1 Japan License.