« Oracle10g XE | メイン | Ruby on Rails入門2日目 »

2007年08月08日

Ruby on Rails入門1日目

1日目終了!
だめだ、脳ミソ、オーバーフロー。。。。

2007年8月8日(水) wakhokサマースクール2007
稚内北星学園東京サテライト校 4F
講師:安藤友晴先生

------------------------------------------------------------------------------

■Railsは難しいか。

フレームワークの構造・設計としては複雑な部類に入る。
その分、ユーザがコーディングする分量は非常に少なくて済む
しかし、少し複雑な処理を実装しようとするとフレームワーク
自体の持つ複雑さが全面に出てくる場合がある。


■教材・サイト

http://www.wakhok.ac.jp/~tomoharu/rails-summer2007/


■Ruby on Railsとは何か

Rubyを利用して作られているMVCアーキテクチャによる
フルスタックWebアプリケーションフレームワーク

■フルスタックとは

Java/J2EEのフレームワークはフルスタックではない。
Web(UI)側とDB側で別々のフレームワークが必要になり、
各フレームワークごとの相性や組み合わせに起因する
問題が発生する。これがJava/J2EEのフレームワークの
難しさに繋がっているともいえる。

Railsであればフルスタックフレームワークなのでこの
問題を会費する事はできる。

DB周りだけや、Web周りだけというような部分的なRailsの
使い方も不可能ではないが、フルスタックで使う事で真価
を発揮する。


■Rails諸元

David Heinemeier Hansson(略してDHH)が作成した。
現在の最新バージョンは、1.2.3
今年の3月にリリースされた1.2になった時の変更が
非常に大きい。現在、市販の書籍は1.2に対応していない
場合が多くサンプルが記述されている通りでは動作しない
ので注意が必要である。かつてJava1.1~1.2の時代に起こった
ような変革期がRailsに起こっているとも言える。日本語化
されている1.2対応済の書籍は、まだ少ない。時期バージョンは
2.0になる予定で変更内容も大きい予定だが、ほぼ1.2で変更点は
出尽くした感がある。
1.2からJavaのDeprecatedと同様の概念が導入されたが、将来の
バージョンで切り落とされる可能性があるので注意する必要がある
Javaと比較するとドキュメンテーションの整備状況が充分ではない
と言える


■Railsのデモ

安藤先生によるRailsのデモが行われる。NetBeans等を使用するのでは
なく、コマンド操作でのRailsのデモのようです。ちなみにRailsの
プロジェクトを新規作成するためのコマンドはrailsだった。

J2EEではXMLの設定ファイルを記述する機会が多いが、Railsではほとんど
設定ファイを記述する機会がない。唯一例外が.ymlファイル(YAML形式)の
記述である。database.yml

database.ymlは接続先DBの定義を記述するファイルであるが、開発用、
テスト用、本番用の設定を分けて記述することができるように予め設計
されている。

RailsはUTF-8が必須である。一応、UTF-8以外もサポートされる事に
なっているが、実際問題、UTF-8以外では正常に動作しないと思った方が
いい。PC用のブラウザであれば問題にならないがケータイ向けのコンテンツ
をRailsで開発しようとする時には問題になる可能性が高い。
基本的には、UIからDBまで全てをUTF-8で統一した方がよいであろう。

モデル名をbookで宣言すると、テーブル名はbooksという風に複数形になる
childとchildrenのような変則形にも対応できる。

bookは1レコードに対応し、booksはDBのテーブルに対応する。
rakeコマンドでDB側にテーブルを作成する。

Railsのアプリケーションは変更後もサーバを再起動する必要はない。
開発用、テスト用のフェーズであればHotデプロイ可能


■Railsの考え方

・Convention over Configuration(CoC)「設定よりも規約」
設定ファイルを記述するのではなく、徹底的に規約で拘束するという考え方
J2EEなどでは、どのファイルがどこにあって、オブジェクト名などがどのような
名前であっても、それらの対応付けを設定ファイルに記載すれば対応できる
という考え方だが、Railsは逆で規約で様々なものを拘束する。
例えば、オブジェクト名の複数形がテーブル名になり、主キーのカラム名は
常にIDという列名になる。

・Don't Repeat Yourself(DRY)「同じ事を二度書かせない。」


DOA(Data Oriented Approach)が基本なので、最初にテーブルの設計が
ないとアプリケーション開発が始まらないとも言える。この点はOOPの
視点から見たときにRailsが批判される点である。現在主流のオブジェクト
指向設計とは逆行している。しかし、DBが既に存在するという状況は
実際の開発の現場では良くある状況であり、現実に即した設計と言うことも
できる。


■DSL(Domain Specific Language)特定用途言語

RailsはRubyでWebアプリケーションを開発するためのDSLであるとも言える。
Rubyを理解していてもRailsの文法を理解できない場合もある。
Rails特有の文法もある。
Rubyは動的言語である。


■環境構築

Windowsなら One-Click Ruby Installer を利用すると楽
http://rubyforge.org/projects/rubyinstaller/

RubyGemsはRubyのパッケージ管理システム
One-Click Ruby Installer を使っていれば既にインストールされている
そうでない人は下記サイトからダウンロード
Railsを入れる場合もRubyGemsから入れる事が一般的
http://rubyforge.org/projects/rubygems/


■Ruby

Rubyでは、すべてがオブジェクト


■クラス定義とメソッド定義

============================================================
class A

def plus(a, b)
@result = a + b
end
============================================================

@からはじまる変数はインスタンス変数になる。
メソッドの戻り値は最後に評価した値が返り値になる
この場合は @resultの値を返す


■return文を使った戻り値の戻し方
============================================================
def times(a)
return @result * a
end
============================================================

明示的にreturn文を使ってもよい
ifの途中でreturnする場合など、メソッドの最後以外の箇所で
戻り値を戻す場合などに利用する。


■インスタンスの作成

============================================================
a = A.new
b = B.new
c = C.new
d = D.new
============================================================
クラス名.new でインスタンスを生成できる
コンストラクタはinitializeメソッドに記述する

■+記号(演算子)もメソッドである
============================================================
3+2
3.+(2)
============================================================
上記の2つの式は等価である。3もオブジェクトであり、+はメソッド
2は引数である。RubyはこのようなSyntax Sugerが多い言語である。

Rubyは括弧記号の使用が省略出来るなど、非常に文法に幅があり
ゆるやかである。「一つの事をやるのにも複数の方法があっていい。」
という考えがあるようで、Javaとは対局を成す考え方である。


■動的言語

============================================================
a = A.new
puts a.plus(2, 3)
a = C.new
puts a.getName
============================================================
変数には型はない。ポインタとしての役割のみもつ
従って上記例のように同じaという名前でその名前が参照する
オブジェクトを切り替えることができる。


■インターフェースの代用

============================================================
class A
def getName
"class A"
end
#クラスA,B,CともにgetNameメソッドの定義は同一
a = A.new
puts d.doSomething(a)
puts d.doSomething(b)
puts d.doSomething(c)
============================================================
Rubyにはインタフェースはないが、こんなことができる

============================================================
methodName = "getName"
puts c.send(methodName)
============================================================
sendメソッドはObjectクラスのメソッドである。
Reflectionのようなもの??

※if文のブロックでメソッドの定義を括ってしまいある条件が成立した
場合にのみ存在するメソッドを定義することができる。
(初心者はさわるな危険!)


■StringとSymbol

============================================================
s1 = 'wakhok'
s2 = 'wakhok'
s3 = :wakhok
s4 = :wakhok

puts s1.object_id
puts s2.object_id
puts s3.object_id
puts s4.object_id
============================================================
s3とs4はオブジェクトIDが同じになる
Symbolは「単なる名前」を表すときに使われる
SymbolはオブジェクトIDの同一性を確保するために使用される事が
多く、ハッシュの添え字として多用される


■配列

============================================================
a = ['りんご', 'みかん', [1, 2, 3], 'なし']
============================================================
数値オブジェクトと文字列オブジェクトを混在させる事が可能
a[0][0]とすれば'り'が返される


■ハッシュ

============================================================
h = {:name => 'tomoharu', :address => '北海道稚内市'}
puts h[:name]
============================================================
配列は添え字が数値だったが、ハッシュ要素に対応する添え字が
オブジェクトである。


■ブロック

============================================================
a = [1, 2, 3, 4, 5]
a.each do |n|
puts(n)
end
============================================================
eachはメソッドである。doからendまでがブロックであり、ブロック
自体がeachの引数であるともいえる。Rubyのコードでは上記のような
ブロックが多用される。
eachメソッドを利用することで配列の各要素を対象にして、ある一定
の処理(ブロック)を実行できる。

投稿者 abiru : 2007年08月08日 18:25

トラックバック

このエントリーのトラックバックURL:
http://abiru.jp/blog/mt-tb.cgi/438

コメント

質問①これは、授業中のノート兼用でしょうか?それとも、あとで書き起こしたものですか?
感想①あびさんの頭の中にはこんな言葉や知識がいっぱいつまっているのだな~。と改めて思った。
それなのに、話してくれる時は、こういうことも、あんな風に私でもわかるように話せるのだなぁ。。。
脳みその容量と断面図を見てみたいわ。ついでにご自慢の妄想力とやらも。
まぁ、妄想力は私も負けてないけど!

投稿者 よもぎ : 2007年08月12日 00:50

これは、授業中にThinkpadでメモしたものをほぼ、そのまま掲載しています。

> 私でもわかるように話せるのだ

難解な内容を難しく話す事は簡単ですが、難解な内容を平易に話すには、自分が内容を正しく理解できている必要があるのです。これは自分の理解度を測るための指標になっています。

投稿者 あびる : 2007年08月12日 02:01

コメントしてください




保存しますか?

(書式を変更するような一部のHTMLタグを使うことができます)