タイトル：

Ruby Workshop

主催：

日本 UNIX ユーザ会

日程：

1999 年 9 月 4 日(土)定員：100 名

会場：

日本オラクル株式会社本社
ニューオータニガーデンコート 12F セミナールーム

プログラム：
時刻
9:00-9:30
9:30-10:45(講演 45 分 質疑 30 分)
10:45-11:30(講演 25 分 質疑 20 分)
11:30-12:15(講演 25 分 質疑 20 分)
12:15-13:45
13:45-14:30(講演 25 分 質疑 20 分)
14:30-14:45
14:45-16:45(パネリスト講演20 分*3+α
討論 60 分)

16:45-17:00
17:00-18:00

講師

テーマ
受付 30 分(株)ネットワーク応用通信研究 Ruby 作 者 に よ る
所開発部主任研究員
Ruby について
まつもとゆきひろ
キヤノン株式会社
Windows 環 境 に お
木村浩一
ける Ruby について
IIJ
Ruby の GUI 環境に前橋孝広
ついてお昼休み 90 分
日本オラクル株式会社
Ruby と oracle につLinux 事業推進部
いて宮原徹
休憩 15 分利用者環境から見た Ruby について---スクリプト言語に対する誤解を解く
アサカ理研工業株式会社
SGmail の開発を中
アサカネット事務局
心に鴫原厚博ForUs
Meeting2000 の開発
松尾尚典
を中心に
北海道大学大学院理学研究科
Ruby による地球流
後藤謙太郎
体データの扱い
キヤノン株式会社
スクリプト言語の簡木村浩一
単講座
懇親会準備 15 分
懇親会 60 分

1/26

JUS Ruby Workshop

Sep 1999

9:30-10:45 Ruby 作者による Ruby について

2/26

JUS Ruby Workshop

Sep 1999

9:30-10:45 Ruby 作者による Ruby について

3/26

JUS Ruby Workshop

Sep 1999

9:30-10:45 Ruby 作者による Ruby について

4/26

JUS Ruby Workshop

Sep 1999

9:30-10:45 Ruby 作者による Ruby について

5/26

JUS Ruby Workshop

Sep 1999

10:45-11:30 Windows 環境における Ruby について

現状
• Cygwin版とmswin32版が存在している• mswin32版のバイナリ配布は行っていない• mswin32版の作成にはVisual C++が必要

Windwos環境におけるRuby
その現在・過去・未来
木村浩一

作業にあたっての苦労

なぜ移植したのか?

• popen()の実装• 拡張子の違い(lib、dll等)

ソースを眺めていたら、途中まで作業されていた形跡があった
gawkやmawkをいじったことがあったのでその延長として興味があった• コンパイラーのオプション• 構築スクリプトの対応• 使用できるツールが限定されている

拡張子の違いpopen()• ライブラリファイル(.a と.lib)• オブジェクトファイル(.oと.obj)• 共有ライブラリ(.soと.dll)• gawkで一度実装した経験があった• 完全にうまく動作するものはできなかった• Ｖｉsual C++のライブラリのソースを見たらドキュメント化されていないことをしていた• あきらめて、ライブラリをそのまま使うことに

6/26

JUS Ruby Workshop

Sep 1999

10:45-11:30 Windows 環境における Ruby についてコンパイラーのオプション構築スクリプト(extmk.rb)の対応• UNIX環境のCコンパイラーのオプションとＶｉｓｕal C++とではオプションの種類が異なる• UNIX一般のものと拡張子が異なる• Cコンパイラーのオプションが異なる• Rubyが良くわかってない状態でいじくりまわした• 本家との一般化を考えてはいたが、なおざりにしている間に小松さんが作業してくれた

構築スクリプトがそのままでは使えない

使用できるツールの制限

Cygwin版 Ruby

• 実行ファイル作成に際しての手間を軽減するためにコンパイラ以外のツールはできるだけ使わないようにしたかった• exportする関数の検出ができないため手作業が入る• わたなべひろふみさんの手によるもの• Windows用Rubyとして標準的なもの

Cygwin版とmswin32版の違い

WindowsでRubyを使う場面• Cygwin版はCygnusによるUNIX環境エミュレートのレイヤーになるDLLが存在し、実行にはこれが必要• Cygwin版はUNIX環境で動くスクリプトが多分そのまま使える• awk, Perlと同様の(あるいはそれ以上の)テ
キスト処理言語として• win32OLE拡張ライブラリを使った「糊」言語として• バイナリ配布がある• win32oleにも対応

7/26

JUS Ruby Workshop

Sep 1999

10:45-11:30 Windows 環境における Ruby について

Win32ole

将来に向けて その１• 助田さんによる拡張ライブラリ• OLEによりOfficeソフト(ex. Accessデータベース)等の制御が可能• Perlの同等の拡張モジュールに比べてよりVBAに近い表記ができる• 拡張ライブラリのＴｃｌTklibがうまく動かない問題の解決• VC++以外のコンパイラー(ex. Borland C++
Builder, LCC)対応• Python for Windowsのような環境の構築• Windows CE対応

将来に向けて その２• Windows Scripting Host対応• Internet Explorerとの連携

May the source be with you

8/26

JUS Ruby Workshop

Sep 1999

11:30-12:15 Ruby の GUI について

9/26

JUS Ruby Workshop

Sep 1999

11:30-12:15 Ruby の GUI について

10/26

JUS Ruby Workshop

Sep 1999

11:30-12:15 Ruby の GUI について

11/26

JUS Ruby Workshop

Sep 1999

11:30-12:15 Ruby の GUI について

12/26

JUS Ruby Workshop

Sep 1999

14:45-15:05 Sgmail と Ruby について

13/26

JUS Ruby Workshop

Sep 1999

14:45-15:05 Sgmail と Ruby について

14/26

JUS Ruby Workshop

Sep 1999

14:45-15:05 Sgmail と Ruby について

15/26

JUS Ruby Workshop

Sep 1999

15:05-15:25 Ruby と Meeting2000

目次RubyとMeeting2000• 1 Meeting2000について• 2 Rubyを選択した理由• 3 開発してみて• 4 今後の予定– グループウェアサーバへの道

松尾尚典 @ ForUs• 5 まとめ

1 Meeting2000について• 参加希望者の都合を調整し、参加申込を受け付けるWebアプリケーション (便利!)– 幹事さんの苦労を超軽減– 参加者の手間も削減• グループウェア

Meeting2000について(2)• 構成– 自作HTTPサーバ機能– 自作Webアプリフレームワーク(リクエスト、ページ、セッション)• 規模– 3000行、0.5人月 (1人*0.5月)– 情報の共有、加工と提示– 日曜プログラム程度、中規模というより小規模– Webアプリとしては結構複雑(商用、社内システムを除けば^^)• Rubyの普及にある程度貢献できた感触

Rubyのよいところ 概観

2 Rubyを選択した理由• 私• vs システムプログラミング言語– 開発効率がよい(C、C++)– 型等による制約 が少ない(Java、C、C++)– 言語屋さんでも言語マニアでもない– コーディングが趣味でもない(趣味はゴルフだ)– やりたい事がすばやく出来れば良い– 以前は Perl4– 多少遅いが気にならない• vs 他のスクリプティング言語• Ruby– OOである。しかも分かりやすいOO– 書きたい事が書け、書きたくない事は書かなくて済む度合が、自分にとって丁度気持ち良い– 日本製で、日本語のコミュニティが本家

16/26

JUS Ruby Workshop

Sep 1999

15:05-15:25 Ruby と Meeting2000

キーとなった機能• 素直なOO• gc、thread、socket、正規表現、ハッシュ、
例外…
• 変数がオブジェクトのハンドル• Ruby Home Page を見て(それが本当なら)良いと確信

選択肢• スクリプティング言語– Perl[45]– Tcl• 以前5000行ぐらい書いたけど、超苦い記憶だから早く忘れたい、ていうか忘れた^^• システムプログラム言語– Java– C++• 出来るだけかかわりを持たないようにしてます選択肢 (1) : vs Perl
• 好きだった• スクリプティング言語の良さを教えてもらった• どうにでも書ける、というのはちょっと嫌選択肢 (2) : vs Java• コンポーネントはC++よりある感じ• お手軽度が決定的に足らない(ニーズが違うから仕方がない)– 例外のcatchを強制される– Perl4– スレッドが面倒– 正規表現がない– 日本語が下手– new Hoge より Hoge.new かな– RMI等は、Rubyにも欲しい• Nifty4U は沢山の人に使ってもらえた• 今更な感、OOでない– Perl5• 素直なOOでない。Rubyの決定的な勝ち3 開発してみて• やっぱり極めて書きやすい– 生産性高い (Perlよりよいぞ。OOだから)– 仕事でもプロトタイプ作成に利用• 分析結果をすばやく検証できる• どうでもよいと思ってたけど、実は結構よかった^^機能3-1 定義が動的• 定義も実行文も同じ• 例えば、既に定義済みのクラスに、メソッドを自由に追加できる• クラスの機能拡張が容易かつ当該スクリプ
ト中に閉じた変更が可能– 標準ライブラリや、人様の作ったクラスに(失礼ながら)機能不足を感じても、気軽にメソッドを追加出来る– 1 定義が動的– 2 特異メソッド– 3 制御構造がオブジェクトを返す

17/26

JUS Ruby Workshop

Sep 1999

15:05-15:25 Ruby と Meeting2000

3-2 特異メソッド• インスタンスに固有のメソッドを定義出来る• ホワイトボックス型フレームワーク– サブクラスを定義して、インスタンス化– システム中に一つしか要らないインスタンスの為にもサブクラスを定義しなければならない• 今回使ったWebアプリ用のフレームワーク– Pageクラス、Requestクラスのインスタンスは画面、要求毎に一つだけ存在すればよい

特異メソッドを使わなければ
class PageX < Page # サブクラス定義
def form(session)# 固有のメソッドを定義
end
end # サブクラス定義終了
p = PageX.new # インスタンス化...

3-3 制御構造がオブジェクトを返す

特異メソッドを使えば
p = Page.new # インスタンス化
def p.form(session)# 固有のメソッドを定義
end…
• サブクラスを定義しなくてよい• 実際は大した差ではない• ページ生成で利用… + if i.url then"<A HREF='#{i.url}'>#{i.name}</A>”
elsei.nameend + …

– が、それが気持ちよい^^場合がある– が、それが開発にとっては重要

4 今後の展開

グループウェアサーバ

• 現在 0.93 のベータ版をRAAにて提供中• グループウェアに対するニーズは高い• でもちまたのCGIスクリプトは物足りない• 現在の機能にほぼ満足しているが、機能拡張の要求は多い– 時刻も調整しよう、日と場所で表にする等– eRuby化、国際化、見栄えをよくしたい– しかし、今のMeeting2000は保守性が低く、機能や画面の追加が難しい• グループウェアサーバ構想– ユーザ登録、掲示板や更新情報通知システム、ランキング物。
– もっともっと便利なアプリケーションを!
• ユーザ、グループによる情報の選別、共有• グループウェア用のアプリケーションサー
バが欲しい– その上で次期Meeting2000を構築する予定– アプリケーションサーバって???

18/26

JUS Ruby Workshop

Sep 1999

15:05-15:25 Ruby と Meeting2000

アプリケーションサーバ
• アプリケーションを開発するためのフレームワークであり、且つアプリケーション群を管理するサーバ• クライアントがWebブラウザであるアプリケーションが対象 (Webアプリケーション)• HTTPサーバ、データアクセス、トランザクション、セッション、サーバ分散、セキュリティ等の様々な機能を有する• OAS(オラクル)、 WebSphere(IBM)、NAS(Netscape)、INTERSTAGE(富士通)等

欲しいもの• 製品版は– 高い。買えないって。
– 機能が多すぎる。そんなにいらない。

• 作りたいものは– Webベースのグループウェアが対象のアプリケーションサーバ
– 日曜プログラマ(僕)が手軽に使える– 機能は最小限で、簡単、わかりやすい

現在5 まとめ• GroupWareServer (仮称) 0.0.2 作成中– ユーザ、グループ管理機能• Ruby は一見して便利、使ってやはり便利• ユーザクラス、ログイン、設定変更画面等– 排他制御、データのロード、セーブ– プレゼンテーション層とビジネスロジック層の分離– リクエスト処理オブジェクトとページレイアウト
オブジェクトの分離– まだ人様に使ってもらえる段階ではない– 試してみて欲しい• Meeting2000も便利、でも保守性が悪い– グループウェアサーバを作成中• Rubyについて思うこと– 本を! (まつもとさんへ)– アプリケーションを! (Rubyユーザへ)• 御意見など頂ければ歓迎

19/26

JUS Ruby Workshop

Sep 1999

15:05-15:25 Ruby と Meeting2000

目次
アプリケーションサーバにおけるリクエスト処理とページレイアウトの分離(株)東芝 情報・社会システム社
SI技術開発センター SI技術担当• 1 Webアプリケーション開発の問題点• 2 リクエスト処理とページレイアウトの分離• 3 リクエスト処理オブジェクト• 4 ページレイアウトオブジェクト• 5 まとめ松尾尚典
Copyright © 1999 by Toshiba Corporation

Copyright © 1999 by Toshiba Corporation

サーバアプリケーションの処理

1 Webアプリケーション

ブラウザ• よく見かけるCGIなアプリケーション

ID:
PASS:

– 掲示板、ユーザ登録、情報サービス…

• 画面遷移が少ないものが殆ど– 一つの画面で入力、もう一つの画面で出力

リクエスト
get /login?id=...
ページ<html><head>...

サーバアプリケーション① リクエストの処理② 対応するページの生成• 多くは①と②を一緒に記述• 一般のGUIアプリケーションなら数十、数百の画面を扱っているのに…

– 教本のサンプルコード等殆ど全て• もう少し画面数の多い、役に立つアプリケー
ションを作りたい
Copyright © 1999 by Toshiba Corporation• 単純なアプリケーションではそれで十分• しかし、リクエストやページの種類、関連数が多くなると、途端に開発が難しくなる
Copyright © 1999 by Toshiba Corporation

画面遷移例
こんな小さな遷移図でもリクエストとページ

login[NG]ログインダイアログ• リクエストとページは多対多login[OK]– ページ数:7– リクエスト数:13– 関連:多数– リクエストとページを、1対1として一緒に処理するアプローチでは対応できない– 一部のリクエストとページは密接に結びついているので、うまい工夫が出来そう– だが全てを奇麗に解決する手段は?

メニュー
goDialogSelectToEntry

goMenugoMenugoDialogCreate
goDialogSelectToEdit

create[NG]新規作成ダイアログ

設定選択ダイアログ goMenu

goMenu

参加選択ダイアログ
goMenucreate[OK] selectedit

設定変更ダイアログ

entry
goDialogEntry

select• 多数の画面を扱うのはやっぱり面倒– みんないろいろ工夫している

参加設定ダイアログ

goDialogEdit

Copyright © 1999 by Toshiba Corporation

Copyright © 1999 by Toshiba Corporation

20/26

JUS Ruby Workshop

Sep 1999

15:05-15:25 Ruby と Meeting2000

2 リクエストとページの分離

アプリケーションサーバでは

ブラウザ• 一つの解として、リクエストとページの分離– リクエストの処理とページレイアウトを分離出来る構造、メカニズムを提供– もちろんこれで全て解決できるわけではない– アプリケーションサーバのメリットがこれだけという訳でもない

ID:
PASS:

リクエスト r,x
get /login?id=...
ページ p<html><head>...

サーバアプリケーションr を処理する関数 fr
p = fr ( x )• データ x を持つリクエスト r に対応した
ページ p を選択する関数 fr• 関数 fr とページ p は明確に分離出来る– fr :リクエスト処理オブジェクト– p :ページレイアウトオブジェクト

Copyright © 1999 by Toshiba Corporation

Copyright © 1999 by Toshiba Corporation

分離することのメリット
ページレイアウト

リクエスト処理*

ビジネスロジック*

アプリケーションサーバにおけるリクエストとページの分離• リクエスト処理とページレイアウト• 責任と処理内容の明確化– 例えば Servlet / JSP、VBScript / ASP、Requestオブジェクト / Pageオブジェクト– 誰が何をするのか• 開発効率、分業化、保守性– ページレイアウトはデザインの専門家に– リクエスト処理はプログラマに– ビジネスロジックは業務の専門家に
Copyright © 1999 by Toshiba Corporation• どちらもプログラムだから、やろうと思えばなんでも出来る• だが、責任範囲以外のことはやるな!
– わざわざ分離したんだから…
Copyright © 1999 by Toshiba Corporation

3 リクエスト処理オブジェクト

フレームワーク利用の心構え• そもそもフレームワークは制約の塊– あれをしてはいけない、これをしてもいけない– このフォーマットに従え、範囲を逸脱するな…

• しかしその制約に従って初めて便利• ① データを受け取り、• ② 対応するビジネスロジックを実行し、• ③ ページレイアウトオブジェクトを選択する– 制約があるから迷わずに済む、ありがたい– 分業化、パターン化、コンポーネント化• 開発では、制約に誠実に従うが吉– 現実には、構造だけ提供される場合が多い– 制約(=ノウハウ)部分は別売
Copyright © 1999 by Toshiba Corporation

Copyright © 1999 by Toshiba Corporation

21/26

JUS Ruby Workshop

Sep 1999

15:05-15:25 Ruby と Meeting2000

コードのパターン化(Ruby版)
責任– 渡されたデータをビジネスロジック用に正規化する– ビジネスロジックを実行する– 正常系、準正常系、異常系で分岐する– ページレイアウトオブジェクト用にデータを正規化する– ページレイアウトオブジェクトを呼び出す– その他のことはやっては *いけない*
Copyright © 1999 by Toshiba Corporation

begin # Java なら try - catch< データの正規化(ビジネスロジック用) >< ビジネスロジックの実行 >< データの正規化(ページレイアウトオブジェクト用) >< 正常系のページレイアウトオブジェクﾄの呼び出し >rescue BusinessLogicException
case $!.to_s
when < 例外X >< データの正規化(ページレイアウトオブジェクト用) >< 例外Xのページレイアウトオブジェクトの呼び出し >when...
else
raise # 処理できなかった例外は再発生させる
end
end# rescue されなかった例外はスルーされる

正常系

準正常系

異常系

Copyright © 1999 by Toshiba Corporation

4 ページレイアウトオブジェクト

責任• 与えられたデータを用いて、HTML文字列を生成する– 渡されたデータをページとして表現する– リクエストオブジェクト名をリンク先とする– その他のことはやっては *いけない*– これだけ– デザイナがデザインに集中できる– データで表現可能な範囲なら、変更も容易

Copyright © 1999 by Toshiba Corporation• 前提条件– 必要十分なデータが渡される– データは表示用に正規化されている– 必要なら、データは表示用の構造にパックされている
Copyright © 1999 by Toshiba Corporation

ページのパターン化

5 まとめ• 表示すべきデータは全て与えられているので、プログラミングレス→ デザイナの手持ちのパターンが使える• Webアプリケーション開発では、リクエスト処理とページレイアウトを明確に分離するとよい• アプリケーションサーバは、分離するための構造を提供している• 開発においては、分離する意義を十分理解して、与えられた構造を利用すべきである• パターンの集積が可能→ どんどん再利用

Copyright © 1999 by Toshiba Corporation

Copyright © 1999 by Toshiba Corporation

22/26

JUS Ruby Workshop

Sep 1999

15:25-15:45 Ruby による地球環境データの扱い

23/26

JUS Ruby Workshop

Sep 1999

15:25-15:45 Ruby による地球環境データの扱い

24/26

JUS Ruby Workshop

Sep 1999

15:25-15:45 Ruby による地球環境データの扱い

25/26

JUS Ruby Workshop

Sep 1999

15:45-16:05 スクリプト言語簡単講座

スクリプティング言語とは?

スクリプト言語簡単講座• These are languages that are primarily
interpreted, and on unix sytems,
can ususally be invoked directly from atext file using #!.
木村浩一(http://www.idiom.com/freecompilers/CATEGORY/scriptin-1.html)

スクリプティング?

Scripting: Higher Level Programming
for the 21st Century• 第四世代のプログラミング
Scripting - the fourth generation
http://www.equi4.com/jcw/scripting4.html

http://www.scriptics.com/people/john.ou
sterhout/scripting.html• 世代を進むにつれ抽象度が高くなるパーツを作るシステム言語とそれを組み合わせるためのスクリプティング言語

スクリプティング言語の実例• Perl• Python• Ruby• Tcl• Visual BASIC26/26

JUS Ruby Workshop

Sep 1999