[#15179] ruby にメッセージの国際化の仕組みはありますか? — "HIRATA Naoto" <hirata-naoto@...>

はじめまして,平田@武蔵工大と申します.

9 messages 1999/07/01

[#15264] 年月を範囲でうまく扱うには? — Yukihiko Eda <yuki-e@...>

江田です。

19 messages 1999/07/06
[#15265] 年月を範囲でうまく扱うには? — gotoken@... (GOTO Kentaro) 1999/07/06

In message "[ruby-list:15264] 年月を範囲でうまく扱うには?"

[#15284] Re: 年月を範囲でうまく扱うには? — Yukihiko Eda <yuki-e@...> 1999/07/07

> 大した手間でもなさそうだし、年月のクラスを作っちゃうのは

[#15296] Re: 年月を範囲でうまく扱うには? — gotoken@... (GOTO Kentaro) 1999/07/08

In message "[ruby-list:15284] Re: 年月を範囲でうまく扱うには?"

[#15323] Re: 年月を範囲でうまく扱うには? — Tadayoshi Funaba <tadf@...> 1999/07/08

ふなばです。

[#15324] Re: 年月を範囲でうまく扱うには? — gotoken@... (GOTO Kentaro) 1999/07/08

ごとけんです

[#15325] Re: 年月を範囲でうまく扱うには? — Wakou Aoyama <wakou@...> 1999/07/08

青山です。

[#15326] Range, ruby-talk (Re: 年月を範囲でうまく扱うには?) — gotoken@... (GOTO Kentaro) 1999/07/08

ごとけんです

[#15378] RubyFAQ-990713 — Akira Endo <akendo@...3.rim.or.jp>

遠藤です.

14 messages 1999/07/13

[#15467] debugger exception handle (Re: Modified debug.rb) — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

25 messages 1999/07/16
[#15490] Re: debugger exception handle (Re: Modified debug.rb) — keiju@... (石塚圭樹) 1999/07/16

けいじゅ@日本ラショナルソフトウェアです.

[#15528] Re: debugger exception handle (Re: Modified debug.rb) — matz@... (Yukihiro Matsumoto) 1999/07/19

まつもと ゆきひろです

[#15551] Re: debugger exception handle (Re: Modified debug.rb) — keiju@... (石塚圭樹) 1999/07/20

けいじゅ@日本ラショナルソフトウェアです.

[#15552] Re: debugger exception handle (Re: Modified debug.rb) — gotoken@... (GOTO Kentaro) 1999/07/20

In message "[ruby-list:15551] Re: debugger exception handle (Re: Modified debug.rb)"

[#15643] Re: debugger exception handle (Re: Modified debug.rb) — keiju@... (石塚圭樹) 1999/07/25

けいじゅ@日本ラショナルソフトウェアです.

[#15518] 省略記法 — ARIMA Yasuhiro <fit0298@...>

Pascal では、構造体のメンバを表記する際に省略記法があります。

16 messages 1999/07/19

[#15530] 半 to 全 — Sinichiro Dezawa <dezawa@...>

出沢です

27 messages 1999/07/19

[#15557] グループウェアサーバ — hisanori@...

松尾です。こんにちは。

22 messages 1999/07/21
[#15558] Re: グループウェアサーバ — a-shigi@... (A.Shigihara) 1999/07/21

ども鴫原です。

[#15565] Re: グループウェアサーバ — hisanori@... 1999/07/21

松尾です。

[#15566] Re: グループウェアサーバ — a-shigi@... (A.Shigihara) 1999/07/21

ども鴫原です。

[#15669] cannot install ruby-gtk into FreeBSD 2.2.x — TAKAHASHI Masayoshi <maki@...>

Ruby Workshopのお手紙(請求書とも言う)が届いてうれしい高橋征義です。

26 messages 1999/07/27
[#15678] Re: cannot install ruby-gtk into FreeBSD 2.2.x — Hiroshi Igarashi <igarashi@...> 1999/07/27

いがらしです。

[#15686] Re: cannot install ruby-gtk into FreeBSD 2.2.x — TAKAHASHI Masayoshi <maki@...> 1999/07/27

高橋征義です。

[#15689] Re: cannot install ruby-gtk into FreeBSD 2.2.x — matz@... (Yukihiro Matsumoto) 1999/07/28

まつもと ゆきひろです

[#15692] Re: cannot install ruby-gtk into FreeBSD 2.2.x — Hiroshi Igarashi <igarashi@...> 1999/07/28

いがらしです。

[#15780] Re: cannot install ruby-gtk into FreeBSD 2.2.x — matz@... (Yukihiro Matsumoto) 1999/07/31

まつもと ゆきひろです

[#15807] Re: cannot install ruby-gtk into FreeBSD 2.2.x — WATANABE Hirofumi <eban@...> 1999/07/31

わたなべです.

[#15815] Re: cannot install ruby-gtk into FreeBSD 2.2.x — WATANABE Hirofumi <eban@...> 1999/08/01

わたなべです.

[#15818] Re: cannot install ruby-gtk into FreeBSD 2.2.x — Hiroshi Igarashi <igarashi@...> 1999/08/01

いがらしです。

[#15823] Re: cannot install ruby-gtk into FreeBSD 2.2.x — matz@... (Yukihiro Matsumoto) 1999/08/01

まつもと ゆきひろです

[#15679] about postgres-0.5.1 — goto@...

後藤@横河工事です。たびたびお世話になります。

29 messages 1999/07/27
[#15680] Re: about postgres-0.5.1 — Shugo Maeda <shugo@...> 1999/07/27

前田です。

[#15681] Re: about postgres-0.5.1 — goto@... 1999/07/27

後藤@横河工事です。

[#15682] Re: about postgres-0.5.1 — matz@... (Yukihiro Matsumoto) 1999/07/27

まつもと ゆきひろです

[#15684] Re: about postgres-0.5.1 — goto@... 1999/07/27

後藤@横河工事です。

[#15716] Re: about postgres-0.5.1 — kawakami <kawakami@...> 1999/07/29

[#15720] ruby debugger (like gdb attach) — kikutani@...

前にも2度ほど質問しましたが、cursesとかslangとかののrubyアプリを

28 messages 1999/07/29
[#15730] Re: ruby debugger (like gdb attach) — matz@... (Yukihiro Matsumoto) 1999/07/30

まつもと ゆきひろです

[#15743] Re: ruby debugger (like gdb attach) — kikutani@... 1999/07/30

On Fri, 30 Jul 1999 12:53:46 +0900,

[#15817] Re: ruby debugger (like gdb attach) — kikutani@... 1999/08/01

Fri, Jul 30, 1999 at 02:13:13PM +0900 において

[#15819] Re: ruby debugger (like gdb attach) — "NAKAMURA, Hiroshi" <nakahiro@...> 1999/08/01

なひです.

[#15822] Re: ruby debugger (like gdb attach) — kikutani@... 1999/08/01

On Sun, 1 Aug 1999 21:37:31 +0900,

[ruby-list:15406] dRuby/rudy/DRb

From: Masatoshi SEKI <m_seki@...>
Date: 1999-07-13 15:18:57 UTC
List: ruby-list #15406
咳です。

次期shttpsrvのモジュールにと温めていた分散(?)Rubyを
シンプルに書き直してみました。1.2系では動きません。
お目汚しにどうぞ。

method_missing のあたりがとくに自信ないです。

drb.rb --- distributed Rubyモジュール
drbs.rb --- サンプルサーバー
drbc.rb --- サンプルクライアント

分散オブジェクトって聞きかじった程度なので
どんな機能が必要でどんな用語があるかなど、
よくわかっていないのでへんな間違いがあると思います。



使い方

はじめに自局の Remote Object ハンドラを起動します。
front はクライアントが Remote Object を指定しなかったときに
返事をするオブジェクトです。

  DRb.start_server('druby://hostname:port', front)

ネーミングサービスなどは front を使って実現できそうです。

  
クライアントはデフォルトの Remote Object を作って、
普通にメッセージを送ります。

  ro = DRbObject.new(nil, 'druby://server:prot')
  ro.sample(1, DRbEx.new(2), 3)

引数のオブジェクトは Marshal::dump して送りますが、
dump不能なときは Remote Object に変換されて送ります。
dumpされたくないときは、dumpできないようにしておくか、
DRbObject.new(obj) で Remote Object に明示的に変換して逃げます。

GCされて動かなくなりそうなときは自分で保護して下さい。




drb.rb
#!/usr/local/bin/ruby
=begin
 Tiny distributed Ruby --- dRuby
 DRb --- dRuby module.
 DRbProtocol --- Mixin class.
 DRbObject --- dRuby remote object.
 DRbConn --- 
 DRbServer --- dRuby message handler.
=end

require 'socket'
require 'marshal'

module DRb
  def start_service(uri, front=nil)
    @uri = uri.to_s
    @front = front
    @server = DRbServer.new(@uri)
    @thread = @server.run
  end
  module_function :start_service

  attr :uri
  module_function :uri

  attr :thread
  module_function :thread

  attr :front
  module_function :front
end

module DRbProtocol
  def parse_uri(uri)
    if uri =~ /^druby:\/\/(.+?):(\d+)/
      host = $1
      port = $2.to_i
      [host, port]
    else
      raise RuntimeError, 'can\'t parse uri'
    end
  end

  def dump(obj, soc)
    begin
      str = Marshal::dump(obj)
    rescue
      ro = DRbObject.new(obj)
      str = Marshal::dump(ro)
    end
    soc.write(str) if soc
    return str
  end

  def send_request(soc, ref,msg_id, *arg)
    dump(ref, soc)
    dump(msg_id.id2name, soc)
    dump(arg.length, soc)
    arg.each do |e|
      dump(e, soc)
    end
  end
  
  def recv_reply(soc)
    succ = Marshal::load(soc)
    result = Marshal::load(soc)
    [succ, result]
  end

  def recv_request(soc)
    ro = Marshal::load(soc)
    msg = Marshal::load(soc)
    argc = Marshal::load(soc)
    argv = []
    argc.times do
      argv.push Marshal::load(soc)
    end
    [ro, msg, argv]
  end

  def send_reply(soc, succ, result)
    dump(succ, soc)
    dump(result, soc)
  end
end

class DRbObject
  def initialize(obj, uri=nil)
    @uri = uri || DRb.uri
    @ref = obj.id if obj
  end

  def method_missing(msg_id, *a)
    succ, result = DRbConn.new(@uri).send_message(self, msg_id, *a)
    raise result if ! succ
    result
  end

  attr :ref
end

class DRbConn
  include DRbProtocol

  def initialize(remote_uri)
    @host, @port = parse_uri(remote_uri)
  end

  def send_message(ref, msg_id, *arg)
    begin
      soc = TCPSocket.open(@host, @port)
      send_request(soc, ref, msg_id, *arg)
      recv_reply(soc)
    ensure
      soc.close if soc
#      ObjectSpace.garbage_collect
    end
  end
end

class DRbServer
  include DRbProtocol

  def initialize(uri)
    @host, @port = parse_uri(uri)
    @soc = TCPServer.open(@port)
    @uri = uri.dup
  end

  def run
    Thread.start do
      while true
	proc
      end
    end
  end

  def proc
    ns = @soc.accept
    Thread.start do
      begin
	s = ns
	begin 
	  ro, msg, argv = recv_request(s)
	  if ro and ro.ref
	    obj = ObjectSpace._id2ref(ro.ref)
	  else
	    obj = DRb.front
	  end
	  result = obj.__send__(msg.intern, *argv)
	  succ = true
	rescue
	  result = $!
	  succ = false
	end
	send_reply(s, succ, result)
      ensure
	close s if s
#	ObjectSpace.garbage_collect
      end
    end
  end
end



drbs.rb
#!/usr/local/bin/ruby

require 'drb.rb'

class DRbEx
  def initialize
    @hello = 'hello'
  end

  def hello
    @hello
  end

  def sample(a, b, c)
    a.to_i + b.to_i + c.to_i
  end
end

if __FILE__ == $0
  DRb.start_service('druby://localhost:7640', DRbEx.new)
  DRb.thread.join
end


#!/usr/local/bin/ruby

require 'drb.rb'

class DRbEx2
  def initialize(n)
    @n = n
  end

  def _dump
    raise TypeError, 'can\'t dump'
  end

  def to_i
    @n.to_i
  end
end

if __FILE__ == $0
  DRb.start_service('druby://localhost:7950')
  ro = DRbObject.new(nil, 'druby://localhost:7640')
  p ro.hello
  p ro.sample(DRbEx2.new(1), 2, 3)
  p ro.sample(1, ro.sample(DRbEx2.new(1), 2, 3), DRbEx2.new(3))
end

In This Thread

Prev Next