IT pass HikiWiki - [Exp2014]シェルスクリプト課題 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}

= 提出について

* 提出期限: 9/3 (水) 23:59
* 修正期限: 9/10 (水) 23:59

== レポートの作成方法

* ((<ITPASS サーバでレポートを公開するには|[Exp2014]ITPASS サーバでレポートを公開するには>)) を参照してください. また, ((<簡単なレポートの書き方指南>)) も良く読みましょう.
* レポートの一番上に以下のことを必ず明記してください.
  * タイトル (例: ITPASS 実習レポート1)
  * 名前
    * 学籍番号は書かないでください.
  * 担当情報実験機名 (例: joho01)
* レポートの HTML ファイルの名前は index.html にしてください.
  複数の HTML ファイルを作る場合は, 以下の要件を満たすようにしてください.
  * index.html を表紙, 目次とする
  * どの HTML ファイルも index.html との相互リンクが張ってある
* ((<レポートのテンプレート|URL:/~itpass/exp/fy2013/130809/practice_kadai/hiki-samples/sample.html>))  を置いてあります. 自由に使ってもらってかまいません.
* HTML の書き方については実習の時間内では解説しません.
  Web や書籍などで書き方を調べてください.
  上記のテンプレートを参照するのもよいでしょう.
  これもレポートの一環としてがんばってください.
* 問題の難易度を高めに設定しています.
  解けない場合は, 未完成のスクリプトを提出し,
  どこまでできて, 何につまづいたかを詳しく解説してください.
  問題そのものができていなくても,
  きちんとした解説があるレポートには高い評価を与えます.
* 自力で頑張っても分からない場合は, 他の人が提出したレポート
  (実習のメーリングリストに投げられたレポート提出報告メールに
  書かれている (はずの) URL から見られます)
  を参考にすることを推奨します.
  その場合, 参考にしたレポートを参考資料に挙げるようにしてください.
  また, 丸写しにするのではなく, 自分なりの改良も加えましょう.
* ((<2008 年のレポート課題|[Exp2008]シェルスクリプト課題>)), ((<2009 年のレポート課題|[Exp2009]シェルスクリプト課題>)), ((<2010 年のレポート課題|[Exp2010]シェルスクリプト課題>)) , ((<2011 年のレポート課題|[Exp2011]シェルスクリプト課題>)) , ((<2012 年のレポート課題|[Exp2012]シェルスクリプト課題>)) , ((<2013 年のレポート課題|[Exp2013]シェルスクリプト課題>))も参考にしてみてください.

=== 授業時間外のレポート作成について

* 自宅, 学内から ITPASS サーバ (ika-itpass) にログインする場合,
  ((<[TEBIKI]SSHサーバへの公開鍵認証によるログイン>)) を参考にして下さい.
  * Windows からの接続については, ((<こちら|URL:https://itpass.scitec.kobe-u.ac.jp/hiki/hiki.cgi?%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%A8%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E6%89%8B%E5%BC%95%E9%9B%86>))の
    * [TEBIKI]Tera Term を用いた SSH サーバへのログイン
    * [TEBIKI]Xming を用いた X (ウィンドウ) の飛ばし方
    * [TEBIKI]ITPASS サーバへのファイル転送方法
    を参考にすると良いでしょう.
  * なお, 学外からは情報実験機 (johoXX-itpass) に直接ログインすることはできません. 学外からは itpass サーバ (itpass.scitec.kobe-u.ac.jp) にログインし, itpass サーバから情報実験機に ssh でログインしましょう.
* シェルスクリプトを作って実行するだけなら学内の Mac でもできます.
* 507 号室にある自分の担当マシンは, 部屋の使用予定がない限り,
  許可なく使ってもらってもよいです. ゼミなどで使用している場合も, その場で許可をとってもらえば使用してかまいません.
  * 507 号室の使用予定は以下の予定表で確認できます.
    * ((<507 号室の予約表|URL:https://itpass.scitec.kobe-u.ac.jp/~bldg3/hiki/hiki.cgi?507%E5%8F%B7%E5%AE%A4%E3%81%AE%E4%BA%88%E7%B4%84%E7%AE%A1%E7%90%86>))
* 507 号室への入室にあたり事前に許可は不要ですが,
  鍵がかかっていて入れないことがあります. 希望者には鍵を貸し出しますので, TA にご一報ください.
* 部屋を使用するときには, 506 号室 もしくは 508 号室にいる人に一言断ってから使用してください. ((<[Exp2014]実習部屋(507号室)の使い方>)) もよく読んでください.

==  レポートの提出方法

=== ファイルを置く

今回のレポートは全て
ITPASS サーバ (ika-itpass) の ~/public_html/report01/
以下に置いてください.
置き場所となるディレクトリは必要に応じて自分で作ってください.

情報実験機で作ったファイルを ITPASS サーバに転送するには scp というコマンドを使うとよいでしょう. 詳しくは man を見てください.
各ファイルの置き方は以下のようにしてください.

* html ファイルは ~/public_html/report01/ 以下に置く.
* シェルスクリプトは ~/public_html/report01/scripts/ 以下に置く.
* 結果として出力されたファイルは
  ~/public_html/report01/results/ 以下に置く.
* 注意: 問題として配布するデータファイルは置かなくても結構です.
  ただし, どこからどうやって入手したかはレポート本文に明記しておきましょう.

=== アップロード確認

ブラウザから全部のファイルにアクセスできるか確認してみましょう.
例えば, ITPASS サーバ (ika-itpass) では,
~/public_html/report01/index.html に対応する URL は

  http://itpass.scitec.kobe-u.ac.jp/~(自分のアカウント名)/report01/index.html

になります.

=== 提出完了の報告

提出期限までに以下のメールを送ってください.
内容を確認した後, 修正すべき点があればその旨を連絡します.
修正完了後, 再度メールで報告してください.
こちらから, レポート提出完了のメールが送られた時点で
レポートを提出したことになります.

* メールの内容
  * 件名
    * 「ITPASS実習レポート 8/8 出題分 (自分の氏名)」
  * 宛先
    * itpass のメーリングリスト
  * メール本文に必ず記入すること
    * 情報実験機番号
    * 氏名
    * レポートの URL


= 必須課題

== 問題 1

=== 円周率 100 万桁の中から, 自分の好きな 4 桁の数字を探すスクリプト

円周率の小数点以下 100 万桁が書かれているファイルがあります. この円周率の数列において, 自分の好きな 4 桁の数字 (例えば, 誕生日や電話番号の下 4 桁など) の並びが何桁目から始まるかを表示するスクリプトを作成して下さい.

* 円周率のデータは itpass サーバー上にありますので, 以下のコマンドを実行して, 自分のホームディレクトリに持ってきて下さい.
cp /home/itpass/dc-arch/exp/fy2014/140808/practice_kadai/kadai1_data.dat /home/hoge/

* さらに自分が使用している情報実験機にデータをコピーしてください.
cd ~hoge
scp kadai1_data.dat hoge@133.30.109.??:
?? には, 自分が使用している情報実験機のIPアドレスを入力してください.

* 用意されている円周率のファイルでは
14159265358979323846264338327950288419716939937510…
と改行もスペースや区切りもなく数字が羅列してあります.

* 探す 4 桁の数字は, 実行時引数で指定できるようにしてください.

* 4 桁の数字以外のものを指定した場合にエラー処理を行なって下さい. また, 探している 4 桁の数字が存在しない場合のエラー処理も行なって下さい (任意の 4 桁の数字は円周率 100 万桁の中にあることは調べてありますが, 念のため).


* 結果は, 以下のようにコンソールに表示させて下さい.
<4 桁の数字> は円周率の小数点以下 <桁数> 桁目から始まります

* 指定した 4 桁の数字はデータ内の複数箇所に現れるかもしれませんが, 今回は始めに出てきた箇所の桁数を表示させるようにして下さい.

==== レポートに書く内容

レポート内には以下を記述してください.
ただしリンクを貼る際は((*相対パスで指定するようにしてください*)).
* シェルスクリプトファイル quiz1.sh.txt へのリンク

  上記で作成した quiz1.sh を quiz1.sh.txt という名前に変更してください. ブラウザ上から読めるようにするためです.
* シェルスクリプトの解説

  スクリプト内の各行が何をしているのか, ((*スクリプト内にコメント文として書く*)).
* スクリプトの使い方の解説

  これをもとに TA が実際にテストします. 
  実行する際のスクリプト, データの置き場を明示すること.
* 実行例 quiz1.txt へのリンク

  実行例とは, スクリプトの作業記録です. 自分が実際にスクリプトを実行したときのコンソールをテキストファイルにコピーするなどしてください.

* 参考資料

  URL をベタ書きにするのではなく, そのページの作者やタイトル, および何を参考にしたのかも明記する.
* 共同作業した人の名前
* 工夫したこと, 感想など

=== 実行結果の例

$ ./quiz1.sh 3846
3846 は円周率の小数点以下 17 桁目から始まります

$ ./quiz1.sh 443
443 は 4 桁の数字ではありません. 4 桁の数字を指定して下さい.


== 問題 2

=== 気象データを解析するスクリプト

2003年4月1日から2014年3月31日までの, 神戸市で観測された気象データファイルがあります.
このデータファイルは, 以下のようなディレクトリ構造になっています.

/home/hoge/kadai2_data
     |
     | -- 2003-04.csv   ( 2003 年 4 月のデータ)
     | -- 2003-05.csv   ( 2004 年 5 月のデータ)
     | -- 2003-06.csv   ( 2005 年 6 月のデータ)
     | -- ......


この csv ファイルの各列には, 次のような順番でデータが記述されています.

<日付>, <現地平均気圧>, <海面平均気圧>, <合計降水量>, .......

詳しい対応は((<ここ|URL:http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=63&block_no=47770&year=2003&month=4&day=&view=>))を参照して下さい.

このファイルから必要なデータを適宜読み込んで, 過去10年間の内

*日最高気温のベスト10の気温と年月日
*日最低気温のベスト10の気温と年月日
*日積算降水量のベスト10の降水量と年月日
*日最小湿度のワースト10(小さい値順)の湿度と年月日

を出力するスクリプトを作成してください.

ただし, スクリプトには以下の処理を必ず組み込むようにして下さい.
*ベスト/ワースト10の中に同じ値を記録した年月日があった場合にはすべて表示する.
  * 結果として10個以上のデータが表示されても良い.
*日最高気温, 日最低気温, 日積算降水量, 日最小湿度のどの項目に対して行うかを, 実行時引数で指定するようにする.
*存在しない項目が指定された場合には, エラー処理を行うようにする.
*項目別ランキングの情報は, 以下のようにコンソールに出力する.

  例:日積算降水量
   <20**年> <**月> <**日> <***mm>
   <20**年> <**月> <**日> <***mm>
   <20**年> <**月> <**日> <***mm>
    (以下略)

==== 事前準備

スクリプトを作成する前に, ITPASSサーバ上のデータファイルを自分のホームディレクトリに持ってきてください. 次のコマンドをITPASSサーバで実行します。

# cp -R /home/itpass/dc-arch/exp/fy2014/130808/practice_kadai/kadai2_data/ /home/hoge/

cp /home/itpass/dc-arch/exp/fy2014/140808/practice_kadai/kadai2_data.tgz /home/hoge/

気象データは圧縮ファイルにまとめられています. tar コマンドを用いて圧縮ファイルを展開してください.

cd ~hoge
tar xvzf ./kadai2_data.tgz

さらに自分が使用している情報実験機にデータをコピーしてください.
cd ~hoge
scp -r ./kadai2_data/ hoge@133.30.109.??:kadai2_data/
?? には, 自分が使用している情報実験機のIPアドレスを入力してください.

==== レポートに書く内容

レポート内には以下を記述してください.
ただしリンクを貼る際は((*相対パスで指定するようにしてください*)).
* シェルスクリプトファイル quiz2.sh.txt へのリンク

  上記で作成した quiz2.sh を quiz2.sh.txt という名前に変更してください. ブラウザ上から読めるようにするためです.
* シェルスクリプトの解説

  スクリプト内の各行が何をしているのか, ((*スクリプト内にコメント文として書く*)).
* スクリプトの使い方の解説

  これをもとに TA が実際にテストします. 
  実行する際のスクリプト, データの置き場を明示すること.

* 実行結果 result_2.txt ページへのリンク
  
  4つの項目の内1つを適当に指定してスクリプトを実行し, その結果をresult_2.txt にリダイレクトしてください. また, 指定された項目以外を指定した場合の出力結果も result_2.txt の最後に加えてください.

* 参考資料

  URL をベタ書きにするのではなく, そのページの作者やタイトル, および何を参考にしたのかも明記する.
* 共同作業した人の名前
* 工夫したこと, 感想など

=== 実行結果の例
(1993年-2004年のデータを基にした場合)
$ ./quiz2.sh
  表示したい値の番号を入力してください
  1.日積算降水量 2.最高気温 3.最低気温 4.最低湿度
  1
  1999年 06月 29日  179.5mm
  2000年 09月 11日  123.0mm
  1998年 09月 22日  122.0mm
  1995年 05月 12日  118.5mm
  2003年 08月 14日  108.5mm
  1998年 10月 17日  94.0mm
  1993年 09月 30日  86.0mm
  1998年 09月 24日  85.5mm
  1997年 07月 13日  82.5mm
  2003年 06月 24日  77.0mm

余裕のある人は, 実行結果の先頭に順位が表示される

$ ./quiz2.sh
  表示したい値の番号を入力してください
  1.日積算降水量 2.最高気温 3.最低気温 4.最低湿度
  1
  1位 1999年 06月 29日  179.5mm
  2位 2000年 09月 11日  123.0mm
  3位 1998年 09月 22日  122.0mm
   (以下略)

ようにしたり, 同じ値を持つ年月日が複数ある場合には, 10個以上のデータが並ぶようにしてみましょう.

なお, 今回使用するデータは, ((<気象庁のHP"過去の気象データ"|URL:http://www.data.jma.go.jp/obd/stats/etrn/index.php>))をもとに作成しました.
  
= オプション課題

== 問題 3

=== 自分の生まれた年・月の東西平均温度分布図を描く ruby スクリプト

1948年1月から2013年6月までの, ひと月ごとの月平均温度データがあります.
このデータを用いて, 自分の生まれた年月の東西平均温度分布図 (横軸: 緯度,
縦軸: 気圧) を描く ruby スクリプトを作成してください.

* 描画には, ((<電脳 ruby プロジェクト|URL:http://www.gfd-dennou.org/library/ruby/index-j.htm>)) で開発された, GPhys, GGraph を用いてください.
* GPhys, GGraph の使い方の詳細は, ((<チュートリアル|URL:http://www.gfd-dennou.org/library/ruby/products/gphys/tutorial2/>)) を使って自習してください.
* 描画に用いる気象データは, itpass サーバの
  /home/itpass/ftp/exp/fy2014/140808/practice_kadai3/data/air.mon.mean.nc
  を使ってください.
  * なお, このデータは, ((<The NCEP/NCAR Reanalysis Project|URL:http://www.esrl.noaa.gov/psd/data/reanalysis/reanalysis.shtml>)) からダウンロードしました.

==== レポートに書く内容

レポート内には以下を記述してください.
ただしリンクを貼る際は((*相対パスで指定するようにしてください*)).
* ruby スクリプトファイル quiz3.rb.txt へのリンク

  上記で作成した quiz3.rb を quiz3.rb.txt という名前に変更してください. ブラウザ上から読めるようにするためです.
* ruby スクリプトの解説

  スクリプト内の各行が何をしているのか, ((*スクリプト内にコメント文として書く*)).
* スクリプトの使い方の解説

  これをもとに TA が実際にテストします. 
  実行する際のスクリプト, データの置き場を明示すること.
* 実行例 quiz3.txt へのリンク

  実行例とは, スクリプトの作業記録です. 自分が実際にスクリプトを実行したときのコンソールをテキストファイルにコピーするなどしてください. 具体的には下記の実行例のようなものです.
* 実行の結果得られた画像ファイル result_3.png (or result_3.ps, ..., など) へのリンク
* 参考資料

  URL をベタ書きにするのではなく, そのページの作者やタイトル, および何を参考にしたのかも明記する.
* 共同作業した人の名前
* 工夫したこと, 感想など

=== 実行結果の例

2014 年 6 月の経度平均した温度分布は下のようになります.

((<実行結果のサンプル|URL:http://itpass.scitec.kobe-u.ac.jp/~itpass/exp/fy2014/140808/practice_kadai3/data/dcl_001.png>))

== ヒント

=== Ruby および GPhys のインストール

インストールは, debian パッケージを使うと良いでしょう.

* /etc/apt/sources.list の編集

  /etc/apt/sources.list に下の行を追記します.

  deb http://www.gfd-dennou.org/library/cc-env/Linux/debian-dennou wheezy main

  deb-src http://www.gfd-dennou.org/library/cc-env/Linux/debian-dennou wheezy main

* パッケージデータの更新

  # apt-get update

* 最後にインストール

  # apt-get install gphys

  gphys をインストールすることで, ruby などの関連するソフトウェアもインストールされます.

インストールについての詳細は, ((<こちら|URL:http://www.gfd-dennou.org/arch/davis/gfdnavi/doc/install/install-ruby-gphys.htm>))を参照してください.

=== データの時刻指定

データのなかの時刻を指定するためには Date.parse を用いると良いでしょう.
例えば, 下のスクリプトの例では 2014 年 1 月 (1 日) を指定しています.

require "numru/ggraph"
include NumRu
gphys = GPhys::NetCDF_IO.open('air.mon.mean.nc', 'air')  # データファイルのオー プン
DCL.gropn(1)                 # DCLのオープン
DCL.sgpset('lcntl', false)   # 制御文字を解釈しない
DCL.sgpset('lfull',true)     # 全画面表示
DCL.uzfact(0.75)             # 座標軸の文字列サイズを 0.75 倍
DCL.sgpset('lfprop',true)    # プロポーショナルフォントを使う
GGraph.set_fig 'itr'=>1, 'viewport'=>[0.15,0.85,0.1,0.6] # 軸, 描画範囲指定
gphysout = gphys.cut('time'=>Date.parse('2014-01-01'))   # 2014/01 データの切り 出し
GGraph.tone( gphysout, true, 'map_axes'=>true )          # 描画
GGraph.color_bar                                         # カラーバー描画
DCL.grcls

=== 出力画像フォーマット

GPhys (dcl) では, gropn の引数を変えることで出力画像フォーマットを
変更することができます.

しかし, あらゆるフォーマットに対応しているわけではありません.
良く使われる出力形式は postscript (ps) ですが, そのままで使いにくい
場合には, convert を使って png や gif に変換すると良いでしょう.



#=== 実行結果

= 提出されたレポート

* joho 01
   * ((<赤尾 亮汰|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/akao/>))
* joho 02
   * ((<上野 友輔|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/uenoyuu/>))
* joho 04
   * ((<大塚 愛里梨|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/eotsuka/>))
* joho 05
   * ((<佐久川 遥|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/sakugawa/>))
* joho 07
   * ((<澤田 達哉|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/sawada/>))
* joho 08
   * ((<高木  一樹|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/ktakagi/>))
* joho 10
   * ((<野口 貴久|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/tnoguchi/>))
* joho 11
  * ((<坂東あいこ|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/abandou/>))
* joho 16
  * ((<松田 幸樹|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/matsudak/>))
* joho 17
  * ((<松本 翔太|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/shotam78/>))
* joho 19
  * ((<溝口 雄斗|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/mizomizo/>))
* joho 20
  * ((<横山 康喜|URL:/~itpass/exp/fy2014/140808/kadai_answer/answers_final_140919/k62yoko/>))