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

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

((<"スケジュール表・各回資料 (05/07)"|[Exp2010]スケジュール表・各回資料#05-2F07>))

{{toc}}

= 提出について

* 提出期限: 5/20 (木)
* 修正期限: 5/27 (木)

== レポートの作成方法

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

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

* 自宅, 学内から ITPASS サーバ (ika-itpass) にログインする場合,
  ((<[TEBIKI]SSHサーバへの公開鍵認証によるログイン>)) を参考にして下さい.
* シェルスクリプトを作って実行するだけなら学内の Mac でもできます.
* 606 号室にある自分の担当マシンは, 部屋の使用予定がない限り,
  許可なく使ってもらってもよいです.
  * 毎週月曜日の午前は, 宇宙物理学研究室がゼミに使用しています.
* 606 号室への入室するにあたり事前に許可は不要ですが,
  鍵がかかっていて入れないことがあります. 予め御了承下さい.
* 部屋を使用するときには, 奥の宇宙物理学研究室の人に一言断ってから使用してください.

==  レポートの提出方法

=== ファイルを置く

今回のレポートは全て
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実習レポート 5/7 出題分 (自分の氏名)」
  * 宛先
    * itpass のメーリングリスト
  * メール本文に必ず記入すること
    * 情報実験機番号
    * 氏名
    * レポートの URL


= 必須課題

== 問 1 ファイル自動転送
=== 問題
作成したレポートを web 上で公開するには, 次の作業;
* レポートを適切なディレクトリ上に置くこと.
* レポートのパーミッションを適切に設定すること.
をする必要があります. くわしくは ((<ITPASS サーバでレポートを公開するには|[Exp2010]ITPASS サーバでレポートを公開するには>))をご覧ください.

公開のたびに複数のコマンドを打っていては面倒なので,
シェルスクリプトを使って作業を自動化してみましょう.

引数に
現在転送したいファイルが格納されているディレクトリ

転送先のディレクトリ
を指定すると, 前者のなかにある全てのファイルとディレクトリを, パーミッションを
775: ディレクトリとスクリプト
664: それ以外のファイル
として後者のなかに設置するシェルスクリプトを作ってください.
* 公開時, なぜパーミッションを上記のようにする必要があるのか答えられない場合は, 前回の実習内容を復習しましょう.

レポート内には以下を記述してください.

* シェルスクリプトファイル quiz1.sh.txt へのリンク.
  (上記で作成した quiz1.sh を quiz1.sh.txt という名前に変更
  してください. ブラウザ上から読めるようにするためです).
* シェルスクリプトの解説
  * スクリプト内の各行が何をしているのか, スクリプト内にコメント文として書く
* スクリプトの使い方の解説
  * これをもとに TA が実際にテストします.
  * 実行する際のスクリプト, データの置き場を明示すること.
* 実行結果(スクリプトの作業記録) quiz1.txt へのリンク
* 参考資料
  * URL をベタ書きにするのではなく, そのページの作者やタイトル, および何を参考にしたのかも明記する.
* 共同作業した人の名前
* コメント
  * 本課題を回答するにあたって工夫したこと, 感想など

=== 実行例
$ ls report/  <-- report/ の中身を表示させる
index.html results scripts ... <-- これから転送するファイルとディレクトリを確認する

$ ./quiz1.sh report /home/USERNAME/public_html
    <-- 現在レポートが格納されているディレクトリと, 転送先のディレクトリを引数で与えてスクリプト実行.

$ ls -l /home/USERNAME/public_html <-- 転送先のディレクトリの中身を表示させる
total **
-rw-rw-r--  1 USERNAME USERNAME 3912 2010-05-07 08:50 index.html
-rwxrwxr-x  1 USERNAME USERNAME  776 2010-05-07 08:50 results
-rwxrwxr-x  1 USERNAME USERNAME  776 2010-05-07 08:50 scripts
    <-- 転送が行われ, パーミッションが正しく設定されていることを確認する.

== 問 2 カレンダー作成
=== 問題
UNIX には, "cal" というコマンドが実装されています.
次のようにシェルに入力することで実行できます.

$ cal 5 2010

すると, 以下のように 2010 年 5 月のカレンダーが表示されます.
普段と年・月の順番が逆ですが, これは西洋式表記に従っているからです.

      5月 2010
日 月 火 水 木 金 土
                    1
  2  3  4  5  6  7  8
  9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

この cal コマンドのように, 指定した年月のカレンダーを表示するシェルスクリプトを作ってください.

レポート内には以下を記述してください.

* シェルスクリプトファイル quiz2.sh.txt へのリンク.
  (上記で作成した quiz2.sh を quiz2.sh.txt という名前に変更
  してください. ブラウザ上から読めるようにするためです).
* シェルスクリプトの解説
  * スクリプト内の各行が何をしているのか, スクリプト内にコメント文として書く
* スクリプトの使い方の解説
  * これをもとに TA が実際にテストします.
  * 実行する際のスクリプト, データの置き場を明示すること.
* 実行結果 quiz2.txt へのリンク
* 参考資料
  * URL をベタ書きにするのではなく, そのページの作者やタイトル, および何を参考にしたのかも明記する.
* 共同作業した人の名前
* コメント
  * 本課題を回答するにあたって工夫したこと, 感想など

=== 実行例

以下は, 1986 年 12 月 を指定したときの実行例です.

$ ./quiz2.sh
Enter your YEAR and MONTH.    --> 年, 月の入力を促してくる
1986 12               <-- 年, 月をシェルに読み込ませる
日 月 火 水 木 金 土  <-- カレンダーが出力される
     1  2  3  4  5  6
  7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

=== 実行結果の例

quiz2.txt に出力してください.

1986 年 12 月  <-- 入力された年, 月
日 月 火 水 木 金 土 <-- 対応するカレンダー
     1  2  3  4  5  6
  7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

=== ヒント

* ((<ツェラー (Zeller) の公式|URL:http://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F>))をつかうと, 年月日から曜日を求めることができます.
* expr というコマンドで整数の計算ができます.
* printf という出力コマンドには, 指定した書式で出力する機能があります.

余力のある人は, 以下のオプション課題にも答えてみて下さい.

= オプション課題

((* 以下の問題は必須ではありません. *))

== 問 3 Hit and Blow
=== 問題
((<2009 年のレポート課題 問題 1|URL:https://itpass.scitec.kobe-u.ac.jp/~itpass/hiki/hiki.cgi?%5BExp2009%5D%A5%B7%A5%A7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8%B2%DD%C2%EA#CC-E4+1+-BF-F4-C5-F6-A4-C6 >))では,
2 桁の正の数を, 正解と比べて「大きい」か「小さい」のヒントを出しながら, ユーザに当てさせるスクリプト
を作ってもらいました. 今回は, ゲーム性をより高めるために, 問題を次のように変えてみます.
* 各桁が重複しない 4 桁の数字をランダムに用意する.
  * また, どの桁も 0 を含んではいけない.
* ヒントを「大きい」「小さい」ではなく, 次のように出す.
  * 数字と桁の両方とも, 正解と一致する数字の数 ... Hit
  * 数字は一致するが, 桁が違う数字の数 ... Blow
  * 正解が 2718 のとき, 1732 が入力された場合のヒント:
    * 7 は, 数字と桁の両方とも正解と一致 --> 1 Hit
    * 1 と 2 は, 数字は正解と一致しているが桁が違う --> 2 Blow  
    * したがって, ヒントは "1 Hit 2 Blow" となる.  
* 全ての数字と桁が一致するまで, ユーザからの回答とヒントの作成を交互に行う.
* 正解が入力されるとその旨を表示して, また成績として, 正解に至るまで何度の回答を要したかを表示する.

このようなゲームをするスクリプトを作ってください.

レポート内には以下を記述してください.

* シェルスクリプトファイル quiz3.sh.txt へのリンク.
  (上記で作成した quiz3.sh を quiz3.sh.txt という名前に変更
  してください. ブラウザ上から読めるようにするためです).
* シェルスクリプトの解説
  * スクリプト内の各行が何をしているのか, スクリプト内にコメント文として書く
* スクリプトの使い方の解説
  * これをもとに TA が実際にテストします.
  * 実行する際のスクリプト, データの置き場を明示すること.
* 実行結果 quiz3.txt へのリンク
* 参考資料
  * URL をベタ書きにするのではなく, そのページの作者やタイトル, および何を参考にしたのかも明記する.
* 共同作業した人の名前
* コメント
  * 本課題を回答するにあたって工夫したこと, 感想など.

=== 実行例
$ ./quiz3.sh 20
Type your first answer! <-- 最初の回答を促す
1234                    <-- 入力される
1 Hit and 2 Blow        <-- 回答に対するヒントを与え, 2 度目の回答を促す
1357                    <-- 入力される
1 Hit and 1 Blow      
1447                    <-- 重複する桁が存在した場合, 以下のような警告を出してやりなおさせる.
Your Answer has some OVERLAPPED DIGITS. Try Again.
1438
2 Hit and 1 Blow        
1483                    ...繰り返し...
3 Hit and 0 Blow
1463                    <-- 正解と一致する回答が入力される
Your number matches the answer!!      <-- メッセージを表示して終了する
You answered 5 times to get the answer.<-- 正解に至るまで何度の回答を要したか表示する.

=== 実行結果
quiz3.txt に出力してください.
1234
1 Hit and 2 Blow
1357
1 Hit and 1 Blow
1438
2 Hit and 1 Blow  
1483
3 Hit and 0 Blow
1463
Your number matches the answer!!
You answered 5 times to get the answer.

=== ヒント
* $RANDOM 変数で 0 から 32767 までのランダムな整数が生成できます.
* read というコマンドで計算機に数字や文字列を読み込ませることができます.
* 正解とユーザの回答をそれぞれ 4 桁の数字のまま扱うのか, 1 桁ずつ分けて扱うのかで趣の違うプログラムになります (他の方法もあるかもしれません). 自分のやりやすい方で構いません.
  * 両方つくって比較してもいいです.

= 提出されたレポート
* joho01
    * ((<関 友也|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/tbseki/>))
    * ((<板倉 統|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/genius/>))
* joho02
    * ((<船津 圭佑|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/funatsu/>))
    * ((<小倉 匠真|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/oguratac/>))
* joho04
    * ((<津田 彰子|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/pontaume/>))
    * ((<野尻野 真栄|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/m17choco/>))
* joho05
    * ((<中坊 孝司|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/tyubo/>))
    * ((<松倉 匡志|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/mmasashi/>))
* joho07
    * ((<小林 英貴|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/hidekoba/>))
    * ((<塩崎 淳也|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/siozakij/>))
* joho08
    * ((<金藤 夏子|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/kanafuji/>))
    * ((<大西 響子|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/kyokon/>))
* joho10
    * ((<竹内 英彦|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/htakeuti/>))
    * ((<池添 紘平|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/kikezoe/>))
* joho11
    * ((<金野 圭祐|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/kanano/>))
    * ((<笠谷 直矢|URL:http://itpass.scitec.kobe-u.ac.jp/exp/fy2010/100507/report/answers_final/kasatani/>))