druby, again. · rails様様 erb利用者急増中 ... 二つのirbを使って話し合う ......

81
dRuby, Again. dRubyをもう一度思い出してみよう 今日も古い話ばっかり

Upload: others

Post on 13-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

dRuby, Again.

dRubyをもう一度思い出してみよう今日も古い話ばっかり

Page 2: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

重要なことを先に

先に

Page 3: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

重要

昨夏リリースまだ初版買えます!

dRubyによる

関 将俊 著

分散・Webプログラミング

Page 4: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

私について

咳今日はAgileの人じゃないよ

内向的なプログラマコードにつぶやく

Page 5: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

作ったもの

ERBdRubyRWiki

Page 6: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

作ったものの‥

Div, Tofudivip - ユーザ数1

proxyネタPRb, KoyaARb

Page 7: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

ERBについて

eRubyの実装の一つRubyを文書に埋め込む - 普通それをRubyに埋め込む - ふつうフレームワーク作る人むけ?

Page 8: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

詳しくはこちら

網道編

Page 9: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Rails様様

ERB利用者急増中

Page 10: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

dRuby

Ruby限定の分散オブジェクトRMIRubyの特徴をそのままにIDL不要ブロック付きメソッド

Page 11: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

dRuby再入門の前に

忘れていた歴史についててゆか昨日から歴史ばっかり

Page 12: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

’98 shttpsrv

はじめにshttpsrvがあった原信一郎さんのhttpd

servlet拡張erb拡張

Page 13: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

当時の素振り

やっぱりbookmarkタグ付けするやつ

RDBをshttpsrvで隠すUIのshttpsrvとhttpで繋ぐ

Page 14: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

こんなの

shttpsrv+servlet

PostgreSQL

shttpsrv+servlet

plain text

shttpsrv+servlet

HTTP

HTTP

HTTPUI担当

データベース

user管理

RMI over HTTP

Page 15: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

発見

みんなserverでclientだhttpをRubyっぽくラップめんどくさい

Page 16: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

じゃdRuby作ろう

shttpsrvの実装をマネる要求ごとのThread

かっこいいRubyのライブラリTCPSocketMarshal

Page 17: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

できた

200行くらいRubyすごい

Page 18: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

dRubyのやること

Rubyのメッセージングを拡張別のプロセスのオブジェクトのメソッドを起動する

Page 19: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

メッセージング

オブジェクトにメッセージを送信メソッドを起動ちょっと嘘かも

Page 20: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Object(1) メッセージ送信

(2) メソッド起動

Page 21: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Object(1) メッセージ送信

Object(2) メッセージ転送

(3) メソッド起動

プロセスを越える

Page 22: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

実験

二つのirbを使って話し合う一方はHashを公開

Page 23: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

front

システムへの入り口、きっかけURIで指定するdRubyのシステムに一つ以上

Page 24: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

irb

cinq:~ mas$ irb --simple-prompt --noreadline>> require 'drb/drb'=> true>>

cinq:~ mas$ irb --simple-prompt --noreadline>> require 'drb/drb'=> true>>

OSXでThreadがスイッチしない

Page 25: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

{}をfrontに

>> DRb.start_service('druby://localhost:12345', {})=> #<DRb::DRbServer:0x1c1e48....>>>

{}とURIを結びつける

Page 26: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

frontを参照

>> DRb.start_service=> #<DRb::DRbServer:0x1c97c4...>>> ro = DRbObject.new_with_uri('druby://localhost:12345')=> #<DRb::DRbObject:....>>>

URIを参照する

Page 27: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

{}をいじる>> ro['client'] = 'Hello, Again'=> "Hello, Again">>

>> DRb.front=> {"client"=>"Hello, Again"}>> DRb.front['server'] = 'Hello, World.'=> "Hello, World.">>

>> ro['server']=> "Hello, World.">> ro=> #<DRb::DRbObject:...">>> ro.keys=> ["client", "server"]>> ro.values => ["Hello, Again", "Hello, World."]>>

Page 28: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

オブジェクトの交換

Marshal

dumpablepass by value

Number, String, Boolean...

can’t dumppass by reference

Proc, Thread, File ...

Page 29: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Threadは参照渡し

>> DRb.front['thread'] = Thread.current=> #<Thread:0x1df7cc run>>>

>> ro['thread']=> #<DRb::DRbObject:...>>> ro['thread'].status=> "sleep">>

Page 30: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

値渡しはコピー

>> DRb.front['client']=> "Hello, Again">>

>> ro['client']=> "Hello, Again">> ro['client'].reverse! => "niagA ,olleH">> ro['client']=> "Hello, Again">>

Page 31: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

ブロック付きメソッド

なぜ動くのかProcは参照渡しyieldはProcへの操作

Page 32: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

リモートなeach

>> ro.each {|k, v| p [k, v]}["thread", #<DRb::DRbObject:...>]["client", "Hello, Again"]["server", "Hello, World."]=> #<DRb::DRbObject:...">>> ro.find_all {|k, v| String === v}=> [["client", "Hello, Again"], ["server", "Hello, World."]]>>

Page 33: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Rubyなので

IDL不要proxyは一種類だけ

Page 34: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

class Counter>> class Counter>> include MonitorMixin>> include DRbUndumped>> def initialize >> super()>> @value = 0>> end>> def up>> synchronize do?> @value += 1>> end>> end>> attr_reader :value>> end=> nil>> DRb.front['counter'] = Counter.new=> #<Counter:...>>>

Page 35: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Counter知りません

>> ro['counter'].up=> 1>> ro['counter'].up=> 2>> ro['counter'].up=> 3>> ro['counter'].value=> 3>>

Page 36: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

同期

Thread同期の仕組みもそのまま

Page 37: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

SizedQueue>> require 'thread' => false>> DRb.front['queue'] = SizedQueue.new(1)=> #<SizedQueue:...>>> DRb.front['queue'].push(1)=> nil>> DRb.front['queue'].push(2)

>> rq = DRbObject.new_with_uri('druby://localhost:12345?queue')=> #<DRb::DRbObject:...>>> rq.pop=> 1>> rq.pop=> 2>> rq.pop

=> nil>> DRb.front['queue'].push(3)=> #<Thread:...>>>

=> 3>>

OptionつきURI

Page 38: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

で?

dRubyをなにに使うの?

Page 39: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

いろんな分散

配置プロセスマシン

機能ちょっと豪華な通信の代替手段

Page 40: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

配置と寿命

オブジェクトはプロセスに在る住いが異なる = 寿命が異なるプロセスより長命なオブジェクト

Page 41: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

寿命といえば永続化

永遠の永続化比較的に永続化一方よりは長生きだ

Page 42: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

OODB?

オブジェクトをそのまましまうしまうというよりそこに在る

Page 43: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

RWiki

オンメモリOODBオブジェクトをサーバに配置再起動の際の手がかりをログRD形式

Page 44: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

生きてるRWiki

RDHTTP dRuby

dRuby Log

RWiki

daemon

CGI

interface

Application

Page 45: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

起動時のRWiki

ログから再構築運用中は書き込むだけ

RD

Log

RWiki

daemon

Page 46: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

RWiki Prop

RD Data - 構想があったyaml風味

RD PropRDの木からオブジェクトをStoryCard拡張

Page 47: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

StoryCard拡張

ストーリーをオブジェクトに10000件たぶんスケールしない

統計情報、テストケース、サマリさまざまなログ

Page 48: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

長命なオブジェクト

長生きするオブジェクトの方が自然なときWeb UIとか

Page 49: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

event driven

GUIWeb UIコンテキストが細切れ

通信周り

Page 50: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Web UI

Webブラウザ HTTP 遺言系CGI 遺言

Event !だいぶ短命長生き

遺言にcontextを

Page 51: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

遺言作戦

プロセスの寿命を超えるためにさまざまな状態を遺すだんだん饒舌に

Page 52: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

遺言はどこに

URLくっきぃファイルRDBMS

Page 53: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

相続問題

排他制御運用回避

Page 54: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

遺言に苦労するなら

はじめから長命なオブジェクトはいかが?つーかそのMVCでいいの?

Page 55: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Web UI 2.0

Webブラウザ HTTP Web UI アプリケーション

Event !だいぶ短命

長生きだと自然

長生き

Page 56: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Web UIへの応用例

Div::Div / TofuWeb Applicationのフレームワークじゃないらしい

Page 57: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

もっとかっこいいやつ

並列処理糊言語 LindaとRinda動的な構成変更 Ring使わなくても素振りしておけ

Page 58: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Linda

並列処理糊言語タプルとタプルスペースパターンマッチング

Page 59: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Lindaの協調

outinとrdパターンで指定ブロックできる

参加者はタプルスペースだけを知ってる

Page 60: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

かっこいい並列処理

TupleSpace

Engine

Engine

Engine

Client

Client

Tuple Spaceだけを知っている

Page 61: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Rinda

RubyによるLindaの実装dRubyを意識してくれるTupleはArray|Hashで

Page 62: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

TupleSpace

>> ts = Rinda::TupleSpace.new=> #<Rinda::TupleSpace:...>>> DRb.front['ts'] = ts=> #<Rinda::TupleSpace:...>>>

>> it = DRbObject.new_with_uri('druby://localhost:12345?ts')=> #<DRb::DRbObject:...>>> ts = Rinda::TupleSpaceProxy.new(it)=> #<Rinda::TupleSpaceProxy:...>>>

TupleSpaceProxyはdRuby下で安全に動作させるためのもの

Page 63: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

writeとtake

>> ts.write([:seki, :age, 20])=> #<Rinda::TupleEntry:...>>> TupleSpace

:seki :age

write

20

Page 64: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

writeとtake

>> ts.write([:seki, :age, 20])=> #<Rinda::TupleEntry:...>>>

>> ts.take([:seki, :age, nil]) => [:seki, :age, 20]>>

TupleSpace

:seki :age

take

20

Page 65: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

待ち合わせ

>> ts.take([:seki, :age, nil])

TupleSpace

take

Page 66: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

待ち合わせ

>> ts.write([:seki, :age, 20])=> #<Rinda::TupleEntry:...>>>

>> ts.take([:seki, :age, nil])

TupleSpace

:seki :age

writetake

20

Page 67: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

待ち合わせ

>> ts.write([:seki, :age, 20])=> #<Rinda::TupleEntry:...>>>

=> [:seki, :age, 20]>>

>> ts.take([:seki, :age, nil])

TupleSpace

:seki :age

take

20

Page 68: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

安全なカウンタ

値のタプルを資源と考える同時にただ一つのプロセスだけが値を更新できる

Page 69: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

安全なカウンタ>> tuple = ts.take([:count, nil])

TupleSpace

take

Page 70: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

安全なカウンタ

>> ts.write([:count, 0])=> #<Rinda::TupleEntry:...>>>

>> tuple = ts.take([:count, nil])

TupleSpace

:count 0

takewrite

Page 71: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

安全なカウンタ

>> ts.write([:count, 0])=> #<Rinda::TupleEntry:...>>>

=> [:count, 0]>>

>> tuple = ts.take([:count, nil])

TupleSpace

take

:count 0

Page 72: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

安全なカウンタ

>> ts.write([:count, 0])=> #<Rinda::TupleEntry:...>>>

=> [:count, 0]>>

>> tuple = ts.take([:count, nil])

>> tuple = ts.take([:count, nil])

>> tuple[1] += 1=> 1>> ts.write(tuple)=> #<DRb::DRbObject:...>>>

TupleSpace

:count 1

writetake

=> [:count, 1]>>

Page 73: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

frontとURI, Again

dRubyでは少なくとも1つのURIを知らなくてはならない名前サーバを用意しても結局‥

Page 74: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Ring

名前サーバすら知らずに動きたいTupleSpaceを探す仕組みそこに名前を登録する決めごと有効期限付きTuple

Page 75: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

RingFinger

近くのTupleSpaceを探し出すUDPでブロードキャスト

Page 76: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

Ringの参加者は

TupleSpaceをlookup自サービスを登録必要なサービスを取得

Page 77: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

参加者がこけた

有効期限をすぎたTupleは削除完全ではないがまあまあ動く

Page 78: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

実験

割愛druby.orgのCMS

Page 79: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

druby.orgのための

動的にWEBrickにmountサービスの追加簡単

起動順序を気にしない再起動も

TupleSpace

WEBrick RWiki

Formatter

Div

Page 80: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

未来を少しだけ語る

proxyネタKoyaARb

Page 81: dRuby, Again. · Rails様様 ERB利用者急増中 ... 二つのirbを使って話し合う ... Engine Engine Engine Client Client

重要な点をもう一度

昨夏リリースまだ初版買えます!

dRubyによる

関 将俊 著

分散・Webプログラミング