Ruby.first (LMS 2001.11.25)

LILO (Linux Install Learning Osaka) というLinuxのユーザーグループがあります。ここでは,だいたい毎月,セミナーというか勉強会をやってます。

で,僭越ながら2001年11月25日(日)に大阪の電通大でRubyについて喋りました。そのスライドと補足。

つっこみ,大いに歓迎。

Welcome to LILO

01

最近人気を集める「Ruby」。今回は,主にRubyに親しんでない人向けに,Rubyがどういったもので,何に使えるのか,を解説したい。Rubyを触ってみようという人が増えると嬉しい。

02

今回の内容。

  • Rubyって何?
  • どこに情報があるの?
  • 何に使えるの?
  • おわりに

まずは,Rubyがどういうもの,というかどんなプログラム言語なのか。他の言語と対比したりするかも。

Rubyは現在も開発が進められていて,ライブラリやアプリケーションがどんどん増えている。なので情報を仕入れるのは,基本的にWebとメーリングリストになる。じっくり腰を据えたい,あるいは電車の中で読むなら本がいい。本もけっこう出てる。

どんなプログラムが書けるのか。どんなライブラリがあるか,とか。結論は,大抵のことができる。

03

Rubyは,まつもとゆきひろ氏が設計・開発しているプログラム言語で「シンプルかつ強力なオブジェクト指向スクリプト言語」。

Rubyで強調するのは「楽しいプログラミング」。

コンピュータには,人間がするには退屈な繰り返しの仕事や計算なんかをさせたい。このようなユーザーの欲求は個別的であって,そのつど異なる。だから,ユーザーが,あるいはそのアシスタントがプログラムを組めるといいと思う。これまでのプログラム言語は,複雑怪奇な構文や低機能で,ユーザーの直接的な目的を果たすのが大変。

Rubyは,シンプルで覚えやすく,その一方で強力。たいていの用途に使える。いかに楽をするかが重要。

RubyのREADMEには,これだけのものが特徴として挙がってる。

  • シンプルな文法
  • 普通のオブジェクト指向機能(クラス,メソッドコールなど)
  • 特殊なオブジェクト指向機能(Mixin, 特異メソッドなど)
  • 演算子オーバーロード
  • 例外処理機能
  • イテレータとクロージャ
  • ガーベージコレクタ
  • ダイナミックローディング (アーキテクチャによる)
  • 移植性が高い.多くのUNIX上で動くだけでなく,DOSやWindows,Mac,BeOSなどの上でも動く

うーん,ちょっとこれは多いし,えらく技術的に思う。

04

プログラム言語には,スクリプト言語とそうでないのがある。スクリプト言語は「コンパイル」という手続きが必要ない。コンパイルが必要なプログラム言語は,お定まりの命令を書かないといけなかったり,プログラム全体の骨組みが固まってないと動かすことができない。

これでは使い捨てのプログラムを書く気が萎えるし,(使い捨てでない)大きなプログラムを書くときにも,少しずつ部品単位で動かして試すのが大変。

スクリプト言語は,Rubyのほかに,Perl, JavaScript, sed, awkなどがある。スクリプト言語でないプログラム言語は,Java,C++など。

スライドでは「#!」で始まる,とあるが,えらくUNIX的,というかJavaScriptは違うやん。シェルから直接実行できるのも違う。やはり,単にコンパイルが必要ないの,ぐらい。

スクリプト言語のためのプログラム(でありプログラムソース)を,特に「スクリプト」という。

05

「ファイルの中の文字列を置き換えたい」とか特定の目的のためには,そのために作られたプログラム言語を使うのが早いと思う。でも,それではそれぞれの目的に合った言語を覚えないといけないし,ちょっと目的が変わったときに使えなくなる。

sedで書いた読点を変換するスクリプト;

s/,/、/g

Rubyで書いたの;

print gsub(',', '、') while gets

汎用的な言語は,特定の目的がある言語よりスクリプトが長くなるけど,何でもできる分,変化に強い。

というか,文字列置換が's'とか覚えてられない。ある程度冗長性がないと。強者の人はどうやって覚えてるんだろう。

Rubyは,変数,式,分岐,繰り返し,関数(メソッド),例外と,普通のプログラム言語にある仕組みは全部揃ってる。ほか,何かあるかな? 正規表現も扱える。

最近の言語なので,ソケットも当然扱える。

ライブラリも,文字列,配列,ハッシュ,ファイル,スレッドなどなど,一通り揃ってる。後で見るけど,Web関係もある。

06

オブジェクト指向は,難しくない。オブジェクト指向は,何か(「モノ」に限定されない)に分類を与え,その分類が振る舞いを決める世界。

オブジェクト指向なプログラム言語では,スクリプトは単純になる。

Rubyスクリプト;

a = [1, 2, 3]
s = "hoge"
puts a.length, s.length

a, sは変数。aには配列を,sには文字列を代入している。配列のlengthメソッドは要素数を返し,文字列のlengthメソッドは文字列の長さを返す。メソッドの振る舞いはオブジェクトごとに違う。

Perlで;

@a = (1, 2, 3);
$s = "hoge";
print $#a + 1, "\n", length($s), "\n";

変数に$とか@を付けないといけないだけで,ムキーッ!ってなる。なりません? 私はなる。というか,配列を表すときは@aでその要素を表すときは$a[x]って,何で頭の文字が変わるの! と思う。まぁ,Perlは全然知らないので,何か深い意味があるのかもしれないけど。

話がずれる。Perlの関数を定義するとき,引数が配列に入って渡されるけど,後から見てそれぞれの引数の意味って分かる? Rubyは,Javaのように引数を陽に書く。こっちの方が,何番目の引数が何か,っていうのがすぐ分かる。

Rubyのオブジェクト指向は,よくあるオブジェクト指向で,クラスとインスタンスがある。クラスで属性や振る舞いを定義し,インスタンスが内部状態を持つ。蛇足ながら,こういうのをクラスベース(のオブジェクト指向言語)という。クラスベースでないのはプロトタイプベースといって,クラスとインスタンスの区別がなく,クラスベースでいうインスタンスにそれぞれメソッドを定義していく。JavaScriptがこのタイプ。

例えば「車」を思い浮かべられたい。車は色,ドアの数などの属性を持ち,走る,曲がるなどの操作ができる。これがクラス。で,実際のそれぞれの車がインスタンス。

Rubyでは,何でもオブジェクトであり,クラスや手続きもオブジェクト。クラスがオブジェクトなので,(インスタンスと同じように)クラス自体をメソッドに渡したりできる。

多重継承はない。

でも,最も重要なのは,オブジェクト指向言語だからといって,無理してオブジェクト指向する必要は全然ない。オブジェクト指向しなくても,スクリプトは書ける。

07

どこに情報があるの? という訳で,Rubyでプログラムを書くために,どこを当たれば早いのか。

  • Webサイト
  • メーリングリスト
  • 書籍

ホームページ,いやWebサイトでは,「Ruby Home Page」が出発点となる。最近はRubyの本も多く出ている。

あとはGoogleか。

08

Ruby Home PageがRubyの総本山。ここには,

  • Ruby最新版のアーカイブ
  • インストールガイド
  • Rubyリファレンスマニュアル
  • Ruby Application Archive
などがある。

Rubyの最新版は,安定版がバージョン1.6.5,開発版が1.7.1。普通は安定版を使う。で,お勧めは1.6.5ではなくって,安定版スナップショット。安定版でもバグがあるが,スナップショットなら既知のは潰されてる。

インストールガイドは,UNIXなら,特に読む必要なし。./configure && makeと,make installで終わり。WindowsならCygwin環境を用意するのが早いかなぁ。

Cygwin

リファレンスマニュアルは,組み込みクラス・モジュール,ライブラリの動作を調べるのには,必須。こういうのは紙よりネットの方がいい。ただ,リファレンスマニュアルは,文法とかの説明がなんだか分散して混乱してるような気がするので,ほかのプログラム言語に親しんでない場合は本を読んだ方がいいと思う。

09

メーリングリストは,目的によって,オフィシャルなのだけで5本ある。

  • ruby-list
  • ruby-dev
  • ruby-ext
  • ruby-math
  • ruby-talk

普通はruby-listだけで十分と思う。流量は1日25通ぐらい。

ruby-mathが目を引く。私は数学はよく分からないけど,Rubyは標準で大きな整数を扱える。例えば,階乗を求めるスクリプト;

# 負でない整数について階乗を求める。
def factorial(x)
  if x == 0
    1
  else
    x * factorial(x - 1)
  end
end

puts factorial(100)

実行結果;
9332621544394415268169923885626670049071596826438162146859296389
5217599993229915608941463976156518286253697920827223758251185210
916864000000000000000000000000

ほかの言語だと,32ビットとか,そういうコンピュータの都合による限界を超えるとエラーになったり予期しない動作が起こったりしてしまう。Rubyはそんなことない。

あと,有理数,複素数,行列,素数のライブラリが付いてる。使ったことはないけど。

10

とりあえず,amazonで上位のを挙げます。

  • 『プログラミングRuby』[1]
  • 『Rubyプログラミング入門』[2]
  • 『Rubyを256倍使うための本 網道編』[3]

私は,[1]を持ってるけど,これはお勧め。Rubyの完全な解説になってる。一冊あれば,Rubyの基礎からライブラリまで押さえれると思う。

いわゆる256本は沢山出ているが,どれが何だかよく分からない。LMSの後,とりあえず[3]を買ってみました。うーん,悪くはないと思うけど,どうかなぁ。

11

Rubyでは,大抵のデータ形式にアクセスするためのライブラリが揃っている。XML, Postgres, CSV, メールメッセージなど。また,Rubyオブジェクトをそのまま直列化(シリアライズ)して保存することもできる。

GUIなアプリケーションを組むためのツールキットも揃っている。UNIX向けの,GNOME/KDEや,Windows向けのライブラリがある。OLEライブラリもあって,ExcelなどをRubyから操作することもできる。

12

Webというインターフェイスは非常にポータビリティが高く,有用。RubyはCGIライブラリとセッション管理ライブラリが標準で付いている。埋め込みRubyのためのライブラリは別にインストールする必要がある。

埋め込みRubyは,HTMLにRubyスクリプトを埋め込むもの。CGIなどを書くのが大幅に楽になる。mod_rubyは,Apacheに組み込んで,Rubyをあらかじめ起動しておき,CGIのパフォーマンスを大きく向上させる。

#!/usr/local/bin/ruby /usr/local/lib/ruby/site_ruby/1.6/erb/erbcgi.rb
<html lang="ja">
<body>
<% for i in 1..10 do %>
  <p><%= i %>
<% end %>
</body>
</html>

13

Rubyアプリケーションの例。RWikiを持ってきた。見栄えが悪くないし,いろんなライブラリを使ってて説明にちょうどよい。

RWikiは,「誰でも」Webのページを書き換えれるシステム。リファレンスマニュアルもこれで運用されてる。

14

分散オブジェクト技術は,プロセスを跨いでメソッド呼び出しやオブジェクトのやり取りを,あたかもローカルプロセスのように行う技術。埋め込みRubyは,HTML文書にRubyスクリプトを埋め込む。RDは,Rubyに関する文書でよく使われる形式。Raccは,yacc/bisonのような,コンパイラ・コンパイラ。でも何でRWikiでいるんだろう?

15

Rubyを使えば,もっと楽ができる。むしろ堕落できると言ってもいい。

最近,ruby-list MLに流れてたのに激しく同意。[ruby-list:32526], [ruby-list:32531]

  • コードを修正してコンパイルせずに動かそうとする
  • 変数宣言を忘れる
  • 代入時に型の違いを忘れる。
  • 何気なくイテレータやブロックを使おうとする。
  • printfなのに"#{...}"形式で書こうとする。
  • 文末のセミコロンを忘れる。
  • ifやwhileなどの括弧を忘れる。
  • switch-caseでbreakを忘れてはまる。