ITPASS 実習レポート 1

名前 上野 友輔

担当情報実験機 joho02

問 1

スクリプトの URL

このスクリプトquiz1.shへのリンク

このスクリプトは円周率の小数点以下100万桁の中から任意の4桁の数字を探すスクリプトです。100万桁の数字の中からまず、1〜4桁目の数字を切り取り、その数字が入力した数字と合っているか調べ、合っていなかったら切り取る桁をずらして再度同じ事を繰り返す、という操作を行なっています。詳しい説明はスクリプト内に書いていますのでそちらを見てください。

スクリプトの使い方の解説

※スクリプトはホームディレクトリにおいてください

まず、ITPASSサーバ上の円周率のデータ「kadai1_data.dat」を自分のホームディレクトリに持ってきます。

次にスクリプト「quiz1.sh.txt」の名前を「mv」コマンドによって「quiz1.sh」に変更します。

その後、"chmod 744 quiz1.sh"でスクリプトに実行権を与えて、「 ./quiz1.sh ○ ○ 」 と入力してください。○ ○ には好きな4桁の数字を入力してください。

4桁以外の数字を入力するとエラー処理が行われます。

実行結果へのリンク

問題1の実行例へのリンク

参考資料

・HP「ITpro by 日経コンピューター」内の「Linuxコマンド集 INDEX」

URL : 「http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230573/?ST=oss」 リンクはこちら

コマンド「cut」や「expr」などを調べたり、文字列の長さを調べるためのコマンドを探したりするのに利用しました。

共同作業した人の名前

野口 貴久

澤田 達哉

野口君には円周率から切り出した4桁の数字を新しく「kadai1-1_data.dat」というファイルに入れることで、スクリプトの実行時間を短縮できることを教えてもらいました。

澤田君には「円周率から1~4桁目を切り出し、その値が実行時引数と一致するなら答えを表示し、一致しないのなら切り取る桁をずらしていく」というループ構造を教えてもらいました。

工夫したこと, 感想

実行時引数が4桁でない場合にエラー処理を行うために、実行時引数の文字数を知る必要がありました。そのために当初は「wc」コマンドを利用しようとしましたがうまくいかず、別の方法を探していたら「echo ${#変数名}」というやり方を見つけました。

このスクリプトでは例えば実行時引数の数字が99万桁目に存在したりする場合、答えを出すまでに数時間かかってしまいます。 当初はもっと時間がかかり、なんとかここまで短縮することができました。もっと短縮できるやり方があるのかもしれませんがこれ以上のものを思いつくことはできませんでした。

問 2

スクリプトの URL

スクリプトquiz2.sh.txtを作成しました。リンクは こちら

このスクリプトは2003年4月1日〜2014年3月31日の間の気象データの内、
・日最高気温のベスト10の気温と年月日

・日最低気温のベスト10の気温と年月日

・日積算降水量のベスト10の降水量と年月日

・日最小湿度のワースト10の湿度と年月日

を求めるスクリプトです。

全気象データを一つにまとめ、知りたい項目について大きい値順、小さい値順に並び替え、その中から上位10位内の値を抜き出しました。詳しい説明はスクリプト内に書いていますのでそちらを見てください。

スクリプトの使い方の解説

※スクリプトはホームディレクトリにおいてください

まず、ITPASSサーバ上の気象データの圧縮ファイル「kadai2_data.tgz」をtarコマンドを用いて展開します。

次に、その展開したファイル「kadai2_data」を自分のホームディレクトリに持ってきます。

その後、スクリプト「quiz2.sh.txt」の名前を「mv」コマンドによって「quiz2.sh」に変更します。

そして、"chmod 744 quiz2.sh"でスクリプトに実行権を与えて、「./quiz2.sh ○ ○ 」 と入力してください。○ ○ には「日最高気温」、「日最低気温」、「日積算降水量」、「日最小湿度」の4つのどれかを入力してください。入力名が間違っている場合はエラー処理が行われます。

実行結果へのリンク

問題2の実行例へのリンク

参考資料

・HP「ITpro by 日経コンピューター」内の「Linuxコマンド集 INDEX」

URL : 「http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230573/?ST=oss」 リンクはこちら

コマンド「sed」や「sort」、「paste」、「awk」、「uniq」などを調べるのに利用しました。

共同作業した人の名前

野口 貴久

澤田 達哉

野口君には後述の「スクリプトを二つに分ける」というアイデアを教えてもらいました。

澤田君には「全気象データをひとつのファイルにまとめる」というアイデアとやり方を教えてもらいました。 また、「ベスト/ワースト10の中に同じ値を記録したデータがあった場合はすべて表示する」という操作を行うために必要なコマンド「uniq」についても教えてもらいました。

工夫したこと, 感想

全気象データをひとつにまとめる際に、どれがどのデータか見分けがつくようにファイル内の各行末に年月を付加することにしたのですが、そのやり方だとスクリプトを一回実行する度に行末に年月がどんどん付加されていってしまいました。そこで、スクリプトを二つに分け、行末に年月を付加するという操作だけを別のスクリプトで行いました。しかし、それではエラー処理を行えなかったので、「一回操作をする度に作成したファイルを消去する」という手段を取ることにしました。

このスクリプトでは多くのファイルが必要となりました。より無駄を省く方法はあったのかもしれませんが、確実性のためや、手順を一つ進める度に頭の中で整理を行うためにもこちらの方法で行いました。

当初、「ベスト/ワースト10の中に同じ値を記録したデータがあった場合はすべて表示する」という操作を行うための手がかりが全くつかめず、「そういう操作を行うコマンドがあるものだ」と思ってコマンドを片っ端から調べたので、苦労しました。
また、コマンド「sed」や「sort」には大変お世話になりました。

全体を通して、とにかくコマンドを知らなければならないと思いました。コマンドを一つ一つ調べていくのは大変でしたが、それだけに、行いたい操作にぴったり当てはまるコマンドを見つけたり、組み合わせることで成功したりしたときは小さな達成感を得られました。また、「この操作を行いたい時はどのようにプログラムを書けばよいか」という事を考える際、「眼から鱗」や「コロンブスの卵」とでも言うべきアイデアが多くあったので常に冷静に視野を広く持つことが重要だな、と痛感しました。