ITPASS 実習レポート


野口貴久

担当情報実験機:joho10


課題出題ページヘのリンク


シェルスクリプト課題ページ
https://itpass.scitec.kobe-u.ac.jp/hiki/hiki.cgi?[Exp2014]%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E8%AA%B2%E9%A1%8C


問1


シェルスクリプトのURL

./scripts/quiz1.sh.txt

シェルスクリプトの使い方

まず、ITPASSサーバ上にある円周率100万桁のファイル(ファイル名:kadai1_data.dat)を自分のホームディレクトリにコピーします。次にスクリプトファイルを上記のURLからダウンロードして、名前をquiz1.sh.txtからquiz1.shに変更してください。シェルスクリプトのパーミッションをls -laコマンドで確認し、所有者の実行権限がない(左から4番目がxになっていない)場合、chmodコマンドで変更しましょう。以上ができたら、./quiz1.shでquiz1.shを実行してみます。その際に、./quiz1.shの横に実行時引数として4桁の数字を入力するのを忘れないようにしてください。入力されていなかったり、桁数が違う場合にはエラーメッセージが表示されます。正しく引数が入力されるとスクリプトが実行されますが、探したい4桁の数字がかなり後の方にある場合はそこそこ時間がかかるので、しばらく待ってみましょう。成功すると指定した4桁の数字が小数点以下の何桁目から始まるかが表示されるはずです。所要時間ですが、だいたい100桁で1秒、1000桁で10秒ほどかかり、私は試していませんが100万桁になると3時間弱ほどかかると思われます。また、もし指定した引数が円周率100万桁の中になかった場合にもエラーメッセージが表示されます。


シェルスクリプトの実行結果へのリンク

./results/quiz1_result.txt

参考資料

「ITpro by 日経コンピュータ Linuxコマンド集 INDEX」
http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230573/?ST=oss
様々なコマンドの使い方や記入法などを学びました。

共同作業した人の名前

上野友輔 引数の文字数を表示する方法を教えてくれました。
澤田達哉 cutコマンドで4桁を抜き出して引数と比べるという方法は彼が思いついたものです。

工夫したこと 感想

初め100万桁を検索するのに30時間くらいかかっていたのが、改良に改良を重ねた結果最終的に3時間弱にまで短縮することができました。しかし、もう少し短縮できたのではないかと思います。引数の桁数が4桁で無い時にエラーメッセージを出したり、100万桁の中に対象の4桁の数字がなかった場合の処理も工夫しました。(修正後追加)修正期間中に澤田くんから劇的に時間を短縮する方法を教えてもらったのですが、自分のスクリプトとは根本的にやり方が異なり、せっかく何日もかけて作り上げた現在のスクリプトを破棄してまた1から他人のを真似て作り直すよりかは自分のスクリプトをそのまま残しておきたいという思いから、修正せずにそのままにしました。



問2


シェルスクリプトのURL

準備用  ./scripts/quiz2_pre.sh.txt
本番用  ./scripts/quiz2.sh.txt

シェルスクリプトの使い方

まず、ITPASSサーバ上にある神戸市の気象データのファイル(ファイル名:kadai2_data.tgz)を自分のホームディレクトリにコピーします。次に、上記のURLから2つのシェルスクリプトをダウンロードして、名前をそれぞれquiz2_pre.sh.txtからquiz2_pre.sh、quiz2.sh.txtからquiz2.shに変更してください。また、問1と同様ファイルのパーミッションを確認し、実行権限がなければパーミッションを変更しましょう。上にも書いてあるように、quiz2_pre.shは準備用のスクリプトです。まず先にこのスクリプトを実行させます。もし誤って先にquiz2.shを実行してしまった場合はエラーメッセージが表示されます。これはすべての日の気象データの行の末尾に年月の列を挿入し、新たに作成されたkadai2-2_dataという名前のディレクトリの中にそのファイルを入れるためのスクリプトです。ですから、./quiz2_pre.shで実行した際に結果が何も表示されなければOKです。<注意>このスクリプトは本番用のスクリプトを実行する前に1度だけ実行するようにしてください。複数回実行するとエラーメッセージが表示されるようになっています。それができたら、本番用のスクリプトを実行しましょう。(以降、準備用のスクリプトを使う必要はありません)./quiz2.shで実行すると、4つのデータのうちどれに基づくランキングを表示するか聞かれるので、1~4の数字のうちいずれかを入力しEnterを押してください。このとき関係のない数値・文字を入力したり、何も入力せずにEnterを押したりするとエラーメッセージが表示されます。成功すると、各データのベスト10(ワースト10)が年月日とともに表示されるはずです。


シェルスクリプトの実行結果へのリンク

準備用  ./results/quiz2_pre_result.txt
本番用  ./results/quiz2_result.txt

参考資料

「ITpro by 日経コンピュータ シェル・スクリプト・リファレンス INDEX」
http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230580/?ST=oss
問1と同様に様々なコマンドの使い方や記入法などを学びました。

「hydroculのメモ コマンドの使い方 sedコマンド」
http://hydrocul.github.io/wiki/commands/sed.html
sedコマンドの詳しい使い方などが参考になりました。

共同作業した人の名前

上野友輔 気象データの各行に年月の列を付け足す方法を教えてくれました。また、pasteコマンドの使い方を教えてくれました。
澤田達哉 私がwhileコマンドの使い方を間違っていたことを発見してくれました。また、sedコマンドで行数を変数で指定する際の書き方を教えてくれました。

工夫したこと 感想

ただ単にベスト10を出すところまでは順調にできたのですが、順位を表示したり、同じ値のデータが複数あった場合の処理が難しかったです。ある行とその下の行の値を比較してより大きいかイコールかで場合分けをし、順位をつけていくという理論自体は家で寝ながら考えついたのですが、いざコマンドを打ち込んで実行させるとエラーが大量に出て上手くいきませんでした。ひとつずつ書き方のミスを直していき、何度実行してもエラーが出る中いろいろ試行錯誤しながらようやく完成できました。その際、上野君や澤田君には色々アドバイスをいただき、とても助かりました。結果、同じ値のデータが複数ある場合には10個以上のデータが表示されるようになり、順位の数も上下の値との関係によって変わりより正確になりました。ただ、スクリプトが非常に長くなってしまったので、もう少し簡潔に書ければ良かったなと思います。



あとがき


今回のレポート作成にあたってたくさんの方にお世話になりました。この場を借りてお礼申し上げます。特に、上野君と澤田君は全般にわたって色々アドバイスをしてくれました。私一人だけでは絶対に完成できなかったと思います。本当にありがとうございました。スクリプトは書き方がややこしかったりエラーが出まくったりして大変でしたが、実行させて成功したときはとても嬉しかったのでまた機会があれば触れてみたいと思います。