- 本日の作業内容
- 出席確認
電子メールで出席確認をします.宛先など以下の情報を用いてメールを作成し,
出席申告してください.なお,キーワードは授業中に紹介します.
提出形式
宛先 |
justice@mag.shimane-u.ac.jp |
件名 |
AttendA01-31_ruby_s0440**
AttendB01-31_ruby_s0440** |
(Aクラス) (Bクラス) |
本文 |
学生番号
氏名
キーワード
|
(改行) (改行)
キーワードは授業中に紹介 |
注意 |
「件名」および「添付書類名」の**をそのままにしないで,必ず自分の学生番号
に修正して下さい.また,ABクラス別は指示にしたがって下さい.
|
- 授業アンケート
教育改善のための授業アンケートを実施します.指示に従って作業してください.
- 特殊な配列
UNIXシェルのようなコマンド操作を扱えるプログラミング言語において,外部か
ら引数を与える方法が用意されているのが,一般的です.このような引数を「コ
マンドライン引数」と言います.Rubyにおいてはそれは定数配列としてプログラ
ムの中に渡されます.これまでS@pphireを利用して来て,一度もさわらなかった
「コマンドライン引数」の部分を使いますので,方法に注意して下さい.まずは,
次のようなスクリプトを作成します.
一行だけのそっけないスクリプトですが,これは実行しても値が無いので,次の
ように表示されるだけです.
ここで使用した ARGV は大文字であることから分かるように定数です
が,形式としては配列です.ですので, [] が p メソッド
により表示されます.では,これに値を渡してみましょう.スクリプト入力ウィ
ンドウの上にある「コマンドライン引数」のチェックをマウスでクリックするこ
とにより入れて,その右側の空欄に適当な数字や文字をスペースで区切って複数
入れて下さい.そして,実行結果と見比べて下さい.このように,値をスクリプ
トの外から与えるために利用するのが,コマンドライン引数です.
ここで注意するのは,コマンドライン引数で与えた値は見掛け上数値を入れたと
しても,文字列として認識されることです.ですので,数値を与えようと思うと,
スクリプト中で to_i や to_f メソッドが必要になります.
もう少し,中身のある例も試してみましょう.次の例は
いかがでしょうか.
num = []
for i in 0..ARGV.size-1
num[i] = ARGV[i].to_i
end
p num
|
コマンドライン引数には適当な数字をいくつか与えて下さい.結果はそれらを数
値に直した配列を作成したことを示しています.
- UNIXにおける基本的な利用法
- コマンドラインによる実行
これまで長らくS@pphireを使用してRubyプログラミングを学習して来ましたが,
ここで通常のエディタ操作によるものを試してみましょう.本来のUNIXプログラ
ミングはこのような手法で実施します.
まず,プログラミング自体は通常テキストエディタで実施します.gEditでも
Emacsでもプログラミングは可能ですが,ここはそのままS@pphireを使っても構
いません.大事なのは,適切な名前で保存することです.どのようなスクリプト
でも良いのでそれを次のようにターミナルで実行してみましょう.
$ ruby hoge.rb
スクリプト名はもちろん自分で保存したものを実施します.次に,コマンドライ
ン引数を扱った場合の例を試しましょう.これもどのスクリプトでも良いので,
次のように適当なもので実施しましょう.
$ ruby hoge.rb 1 2 3 4
ここで,Ruby自体に渡しているコマンドライン引数はファイル名と数字4つの計
5個です.そのうち,最後の4個はhoge.rbというスクリプトに渡すようになっ
ています.その違いに注意しましょう.
- 出力のパイプライン処理
ターミナルでスクリプトを実行すると,長い出力では画面が高速でスクロールし
て何が表示されたかは目で追えなくなります.そのような場合には画面の表示内
容をターミナルの表示可能な行数ずつ区切って表示するページャを活用すると良
いでしょう.Linuxでは代表的なものにlessというものがあります.縦に長くな
る出力を持つスクリプトの例として次のようなものを実
行してみましょう.
i = 0
while i < 50
puts i
i += 1
end
|
出力が50行になるのでターミナルの画面には収まりません.そこで,実行すると
きに出力先を画面(「標準出力」)ではなく,lessというプログラムへ渡すように,
専用の記号を使用して行います.
$ ruby long.rb | less
これで,1ページずつ区切って表示するようになりました.このlessですが,操
作はキーボードから行います.表1のようなキー操作により読みたい領域を操作し
ます.
キー操作 | 動作 |
スペース | 1ページ分進む |
p | 先頭に戻る |
↓ | 1行進む |
↑ | 1行戻る |
q | 終了 |
他にもキー操作はたくさんありますが,上記のものを覚えておけば困ることは無
いでしょう.
- 出力のリダイレクト
「リダイレクト」(redirect)とは「迂回」ということです.これはスクリプトの
出力を標準出力ではなく,別の「ファイル」の中へと迂回させることです.言葉
で言うのは難しいので,動作で試してみましょう.先ほどのスクリプトの実行部
分を次のように変更します.
$ ruby long.rb > result.txt
この場合,画面には結果は表示されません.結果は result.txt とい
う名前のファイルの中に保存されました.確かめるには,次のようにしてターミ
ナルで実行するか,エディタでファイルを開いてみるかしてみましょう.
$ less result.txt
- 演習
- コマンドライン引数としていくつかの数値を与えた場合に,それらの和を求
めるスクリプトを作成してみましょう.
解答例
- 三角関数を使った計算を考えてみます.
0から2πまでを100分割した値を
変数θとするとき,各行にθの値,sinθ,sin2θをカンマで
区切って出力するスクリプトを作成しましょう.
解答例
- 先ほどの出力結果を sin.csv という名前で保存してください.
- OpenOffice.orgの表計算機能Calcを使って sin.csv を読み込みま
しょう.
- Calcのグラフ描画機能を使ってグラフを描いてみましょう.
- 3次元のグラフをgnuplotというグラフ描画ツールを用いて作成することを
試してみましょう.
- 0≦x≦2π,0≦y≦2πの範囲内の変数xとy
に対して sin x + cos yを計算し,x座標,
y座標,関数の値をスペースで区切って表示するスクリプトを作成し
ましょう.xとyの値はそれぞれ範囲を100分割するものとし
ます.
解答例
- 結果は1万行を越える大きな出力となりますが,これをファイルに保存しま
しょう.ファイル名は sincos.txt としてみます.
- ターミナルからGnuplotを起動しましょう.コマンドは
$ gnuplot
です.するとコマンドプロンプトが次のように変わります.
gnuplot>
ここでコマンドを入力していくことでグラフ描画ができます.まずは,おまじな
いとして
gnuplot> set parametric
を入力してください.これで準備は出来上がりです.
- 先ほどの sincos.txt を利用してグラフを描かせてみましょう.コマ
ンドラインに次のように入力します.
gnuplot> splot "sincos.txt"
これで無事に3次元グラフが描けるはずです.このような形式のグラフはExcel
では作成できません.また,市販のツールを利用しようとすると,数万円の価格
がついたものしかありません.GnuplotはWindows上でも動きますので,今後は活
用してみて下さい.
- Gnuplotの終了はコマンドで行います.
gnuplot> quit
- 小テスト
授業の終わりに小テストを実施します.アナウンスに注意していて下さい.
- 宿題
宿題に関する案内が授業の終わりに紹介されます.注意にしたがって提出してく
ださい.
- 本日の用語
- コマンドライン引数
ターミナルでコマンドを利用するときに,コマンドに続けて与える「引数」.
- ARGV
Rubyでコマンドライン引数を格納する特殊な配列.数値を与えても文字列として
配列に納められるので利用する際には注意が必要.
- パイプ(ライン)処理
コマンドの出力結果を別のコマンドの入力に渡す処理.記号は | を使
う.
- リダイレクト
コマンドの出力結果をファイルに渡す処理.記号は > を使う.末
尾に追記する場合の記号は >> になる.
- less
ターミナルで表示をウィンドウサイズの行数に合わせて表示する機能を持つ閲覧
ツール.
- Gnuplot
高度な機能を持つグラフ描画ツール.コマンドラインで対話的な処理を行う方法
と,データファイルを整形しておいてバッチ処理する方法とが利用可能.
Windowsでも利用可能(Wgnuplot).