授業資料/09 の変更点


#contents

//  第 9 回 (Ruby ことはじめ)

* Ruby: 準備  [#i80584e7]

Ruby は Processing よりは少し本格派なプログラミング言語で,画像や音声の処理よりも計算や文字列処理,論理的な動作に向いている造りだ.
つまり,

&br;&br;
CENTER:&size(24){''Ruby は素っ気ないけど力持ち.数学科向きかな?''};
&br;&br;

その分,最初は利用するための手順などを少し面倒に感じるかもしれないが,すぐ慣れるので心配は不要だ.

&br;&br;
** 準備: 専用のディレクトリを作っておこう [#q6216c5a]

Processing の最初の時同様,Ruby 専用にディレクトリをホームディレクトリの下に作っておこう.
この web ではそのディレクトリの名前を ''lec_ruby'' としておく(皆は自分で好きな名前をつけよう. ただし,アルファベットや数字以外を使うとあとで相当苦労するかもよ…).

&br;&br;
* Ruby: 初めての Ruby [#sf553a37]

Ruby でのプログラミングのやり方は以下の繰り返しだ.

&br;&br;
+ ruby プログラムを保存しておくテキストファイルを ''lec_ruby'' に作る.
+ テキストエディタでそのファイルにプログラムを書き込む(or 修正する).
&br;
&ref(/materials/warning.png); テキストエディタをモノにしておかないとここで困る.これからも似たような機会でやはり困るよね…
+ ruby にそのテキストファイルを渡すと,ruby が読み込んで実行する.
+ その結果に一喜一憂.
+ 2. へ戻って繰り返し.
&br;&br;


まあ,習うより慣れろというわけで,以下の例に沿ってやってみよう.

&ref(/materials/notes.png);次の手順に従って,実際にやってみよう.

+ ''まずは Ruby を呼び出して動いてもらう環境'' を準備する.
&br;
大学の PC だとその「環境」として cygwin が 使えるので,cygwin を立ち上げよう(メニューの中を探してみよう).
黒くて四角い素っ気ない画面だけど,なかなかどうして,こいつはたいした働き者なのだ.
&br;
これを一旦立ち上げたら,授業が終わるまでそのまま立ち上げておこう.
&br;&br;
+ cygwin に,ruby 専用ディレクトリに移動してもらおう.
&br;
cygwin は「どのディレクトリで作業するのか」という概念を持っているので,これを上で自分で用意したディレクトリに変えよう.
これには,cygwin を起動して出てきた黒い画面で
//
>  ''cd ~/lec_ruby''
<
とすればよい(作ったディレクトリの名前が''lec_ruby''の場合.以下,同様.).
ちなみに,上の ''cd'' は change directory の略で,''~'' はホームディレクトリのことだ.
&br;&br;
+ ''新規にプログラムを書く場合'' : そのプログラムを入れておくテキストファイルを作ろう.
&br;
例えば ''test.rb'' という名前のファイルを作りたければ,cygwin で
//
> ''touch test.rb''
<
とすれば良い.
&br;&br;
+ このテキストファイルにプログラムを書き込むためにテキストエディタを立ち上げよう.
&br;
既に自分の使うテキストエディタを選んでいるはずだ.それを起動しよう.
&br;
ただし,大学の PC に入っていないものを選んだ人もいるかもしれない.
そういう人は適当そうなのを選ぼう.
&br;&br;
+ &size(18){''初めてのプログラムを書こう''};
&br;
テキストエディタで次のように一行だけ書きこんで,保存しよう. 
//
>  ''p 3+5''
<
&ref(/materials/warning.png); この行をきちんと「改行」しておこう! 改行してない行は認識されずにプログラムとして読み込まれないかもしれない…
&br;&br;
+ &size(18){''プログラムを動かしてみよう''};
&br;
cygwin の中で,
//
>  ''ruby -w test.rb''
<
と打ってみよう. ここまでの作業に問題がなければ
//
 8
//
という答えが返ってくるはずだ.


&br;&br;
&ref(/materials/OK.png); あとは,プログラムをどんどん改良するために
&br;
「ファイルの中のプログラムを書き直して保存」
→「''ruby -w ファイル名''」
&br;
を好きなだけ繰り返せばよいだけだ.

&br;&br;
* 超簡素な Ruby 文法解説(1) [#zc001eb4]

さてここで,最低限必要な知識と,
皆が既に学んだ概念で Ruby で相当するモノと,
知らなかったけれどもすぐわかる知識
を書いておこう.

すぐ分かるだろうけれども, Processing と比較すると初歩の文法に関して言えば,

&br;&br;
CENTER:&size(24){''同じ機能については,だいたい Ruby の方が簡単に書けるよ''};
&br;&br;


** 最低限必要な知識 [#p0f775e0]

| 名称 | 解説,注意 | サンプル |h
| 数学したい | 数学計算を行なう準備.プログラムの先頭行にいつも右のように書こう(1行で). | ''&color(blue){include Math};'' |
| &ref(/materials/warning.png); | 変数の宣言は要らないよ.いきなり代入で始めよう. 変数に実数を代入すると実数で,整数を代入すると整数になるよ. |  |
| &ref(/materials/warning.png); | 行末に ; なんかはだいたい要らないよ. |  |
| &ref(/materials/warning.png); | 変数を始め,ruby では大文字の小文字は区別があるよ |  |
| &ref(/materials/warning.png); | 変数名を大文字で書くと,その中身の変更はできないよ |  |
| &ref(/materials/warning.png); | 大きなプログラムの中の全体で使いたい変数は $ で始めた名前にするよ |  |

** もう知っている概念 [#ub9f8c8b]

| 名称 | 解説,注意 | サンプル |h
| コメント | 行頭を ''#'' で始めると,ruby にその行は無視される | ''&color(blue){# ほにゃらら};'' |
// |  - | ''&color(blue){pp};'' を使うための準備(1度でよい) | ''&color(blue){require 'pp'};'' |
| 表示1 | 画面に内容を出す | ''&color(blue){p ほにゃらら};'' |
// | 表示2 | ''&color(blue){p};'' より見やすい  | ''&color(blue){pp ほにゃらら};'' |
// | 表示3 | 丁寧に表示したい | ''&color(blue){print ほにゃらら};'' |
| 変数の代入 | 数字などを入れる | ''&color(blue){a = 3.5};'' |
| 変数に足す | - | ''&color(blue){a += 1};'' (a に1足す)|
| 変数をコピー | - | ''&color(blue){a = b};'' (a に b の中身をコピー)|
| 掛け算 | - | ''&color(blue){a*b};'' |
| 実数の割り算 | - | ''&color(blue){5.0/2};'' (2.5 になる)|
| 整数の割り算 | - | ''&color(blue){5/2};'' (2 になる)|
| 余り | - | ''&color(blue){5 % 2};'' (1 になる)|
| べき乗 | - | ''&color(blue){2**3 };'' (8になる)|
| 数えながら繰返す | ループだね. 範囲が 1..5 みたいに書けて便利だよ | ''&color(blue){for i in 1..5 do ほにゃらら end};'' |
| 一致してる? | 比較する | ''&color(blue){a == b};'' |
| もしも | 条件があうなら動作 | ''&color(blue){if ほにゃらら then ほい else ほいな end};'' |
| 単なる集合(配列と思っていいよ) |  , で区切って,[] の中に中身を並べるだけ  |  ''&color(blue){[1.2,a,b,3] };''など |
| 集合の要素 | &ref(/materials/warning.png); やっぱり数え方が1ずれるので要注意だ  |  ''&color(blue){a[3] };''は4番目の要素を指す |
| 乱数 | 0以上1未満 | ''&color(blue){rand()};'' |

** 知らなかったけれどもすぐ分かるもの [#t1cfd3c2]

| 名称 | 解説,注意 | サンプル |h
| 絶対値 | - | ''&color(blue){a.abs };'' (a の絶対値)|
| 切り上げ | - | ''&color(blue){a.ceil };'' (a の切り上げ)|
| 対数 | 自然対数 | ''&color(blue){log(a)};'' |
| 指数 | -  | ''&color(blue){exp(a)};'' |
| 文字数 | 全部で何文字? | ''&color(blue){s.length};'' |
| 集合,文字列をコピー | 集合と文字列だけ,コピーが特殊だよ | ''&color(blue){a = b.dup};''(a に b の中身をコピー) |
| 文字数 | 全部で何文字? | ''&color(blue){s.length};'' |
| 集合の作り方(1) | 中身が既に決まっているとき | ''&color(blue){a = [1,8,2.3]};'' |
| 集合の作り方(2) | 大きさは決まっているんだけど…というとき | ''&color(blue){a = Array.new(3){0}};''(3個の要素がある場合.要素は仮に 0 としている) |
| 集合の作り方(3) | とりあえず空集合を作ればいいやというとき | ''&color(blue){a = []};'' |
| 集合の要素数 | - | ''&color(blue){group.size};'' |
| 集合に要素追加(最初) | - | ''&color(blue){group.unshift(a)};''(集合の先頭に要素 a を追加) |
| 集合に要素追加(最後) | - | ''&color(blue){group.push(a)};''(集合の最後尾に要素 a を追加) |
| 集合の要素削除(最初) | - | ''&color(blue){group.shift};''(集合の先頭要素を削除) |
| 集合の要素削除(最後) | - | ''&color(blue){group.pop};''(集合の最後尾を削除) |
| 最大, 最小値 | 集合の中身の最大, 最小値 | ''&color(blue){[3,5,2].min };'' など|
// | もしもループ | 条件があう間はループ動作 | ''&color(blue){while ほにゃらら do ほい end};'' |
// | 関数作成 | できると便利 | ''&color(blue){def ほにゃらら(引数) 中身 end};'' |
// | 関数の出力は | 関数定義の中で使おう  | ''&color(blue){return 出力};''|
// | 動作時のパラメータ | ''&color(blue){ruby test.rb 3 10};'' とするなど| ''&color(blue){ARGV[i]};'' で i+1個目  |




* 簡単なサンプル: 平均 [#ub3b0491]

次の数字の平均をとってみよう(答えは 1.3 になるはずだ).
//
> 1.2, -3.0, 3.3, 4.1, 0.9
<
特に難しいアルゴリズムや仕組みを考える必要はないだろう.

&br;&br;
CENTER:&size(24){''全部足して,要素数で割って表示するだけ''};
&br;&br;

これだけである.

この ruby プログラムを上に紹介した機能だけで書いてみると次のようなものになるだろう.
#highlighter(language=ruby,number=on,cache=on){{
include Math

a = [1.2, -3.0, 3.3, 4.1, 0.9]

sum = 0.0
for i in 1..a.size do
  sum += a[i-1]
  end

average = sum/a.size

p average
}}

&ref(/materials/notes.png); 実習
&br;
上のプログラムを動かしてみよう.

&ref(/materials/notes.png); 実習
&br;
上のプログラムを理解しよう.
&br;
おそらく,「全部足す」ところが初学者には難しかったりするだろう.
ぱっとわからなくてもよいから,上のサンプルをじっくり読んで
CENTER:&size(24){''何が起きているか,完璧に理解しておこう''};

&br;&br;
** 練習問題 [#q7a9332c]
&br;
分散を計算するプログラムを書いて動かそう.
&br;
次の数字の分散をとってみよう(答えは 6.1 になるはずだ).
//
> 1.2, -3.0, 3.3, 4.1, 0.9

&br;&br;
** 練習問題 [#k444b512]
&br;
みんなが気になる,偏差値を計算するプログラムを書いて動かそう.
&br;
全学生10人の点数が次のような場合,それぞれの偏差値を計算してみよう(偏差値の定義を知らない人は検索しよう.日本独特の概念だね).
//
> 72, 30, 23, 41, 9, 55, 18, 80, 15, 2

&br;&br;
* レポート [#r1878a7f]

以下の課題について,あたうかぎり賢明な調査と考察と実行をし,

&size(18){''ExpMath1-Report-09''};

という題名をつけて e-mail にて教官にレポートとして提出せよ.なお,各自の

+ 所属(学部,学科)
+ 学籍番号
+ 学年
+ 氏名

を書くのを忘れないように.

&ref(/materials/warning.png); 自分のレポート作成ツールセットを記載せよ(もちろん,今回のレポートもそのツールセットを使って作成すること).


** レポート課題 [#h44905e8]

+ 実習で出てきた練習問題に対しての,自分の解答プログラムと,その結果を示せ.
+ 1. のプログラムを「詳細に」解説せよ.


* about Icons, ClipArts [#u8fbac06]

For details, see [[&ref(/materials/JNorth_arrow-right-sm.png); this>materials]].

// ━┃┏┓┛┗┣┳┫┻╋


// コマンドライン入力は「行頭を > で始める」.
// コマンドライン出力は「行頭をブランクで始める」.

// 実習アイコン
// &ref(/materials/notes.png);

// 注意アイコン
// &ref(/materials/warning.png);

// Link アイコン
// &ref(/materials/JNorth_arrow-right-sm.png);

// OK アイコン
// &ref(/materials/OK.png);

// NG アイコン
// &ref(/materials/NG.png);

// サンプルアイコン
// &ref(/materials/Gnome-Preferences.png);

// 大文字での強調
// CENTER:&size(24){''ほげほげ''};

// 太文字 + 赤 での強調
// &color(red){''''};

// programu source 表記
// #highlighter(language=ruby,number=on,cache=on){{}}