image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« 2007年5月19日 | トップページ | 2007年5月21日 »

2007年5月20日

2007-05-20

ピックアップ:XMLは人間が読むものではない, JavaScriptによるガントチャート, etc...

- http://www.rubyist.net/~matz/20070511.html#p04
> > Matzにっき(2007-05-11)
> ... 「XMLは人間が読むものではない」、「DSLの台頭によって(Java界における)XMLの地位は下がりつづけている」という話。...

- http://jp.rubyist.net/magazine/?0019
> > Rubyist Magazine - Rubyist Magazine 0019 号

- http://rakuto.blogspot.com/2007/05/ruby-and-erlang-rbridgeerlang.html
> > Young risk taker.: [Ruby and Erlang] そろそろRBridge::Erlangについて一言いっておくか

- http://journal.mycom.co.jp/news/2007/05/19/001/index.html
> > RubyでTwitterしちゃおう - Twitter4R登場 | エンタープライズ | マイコミジャーナル

- http://www.itmedia.co.jp/news/articles/0705/19/news006.html
> > ITmedia News:MS、マッシュアップなWebデザインソフト「Popfly」を発表

- http://d.hatena.ne.jp/ktat/20070519/1179549664
> > Practice of Programming - JavaScriptによるガントチャート作ってみた(まだ途中)

- http://kirik.tea-nifty.com/diary/2007/05/post_7b08.html
> > 切込隊長BLOG(ブログ): ついに、取引メールでデコメを使う奴が出現

- http://level.s69.xrea.com/mozilla/index.cgi?id=20070519_10Tips
> > Firefox の結構使える10の基本機能 - えむもじら

- http://blogs.itmedia.co.jp/hiranabe/2007/05/post_893a.html
> > 『ソフトウェア開発に役立つマインドマップ』本が出ます! - An Agile Way [ITmedia オルタナティブ・ブログ]

- http://www.yasuhisa.com/could/entries/001139.php
> > COULD:インターフェイスガイドラインいろいろ

- http://e0166.blog89.fc2.com/blog-entry-171.html
> > あなたのブログの間違った5つの設計*ホームページを作る人のネタ帳

- http://ohnishi.livedoor.biz/archives/50313770.html
> > 大西 宏のマーケティング・エッセンス:セカンドライフってもう終わった? - livedoor Blog(ブログ)

druby での超簡易チャットシステム(jruby版)

jruby で書いたチャットシステムが jruby で動作しなかったのは、
$stdout の druby での扱いが ruby/jruby で異なっているのが原因のようだ。

そこで, $stdout の参照を直接 あつかうのではなく、ruby のクラスで包むことにした。
その版では、ruby, jruby とも動作した。
以下にソースを示す。
jserver.rb, jclient.rb, MyStream.rb がある。

$ cat jserver.rb
# 2007-05-20 katoy
# usage: $jruby server.rb
#     or $ruby server.rb
#

require 'drb/drb'
require 'MyStream'

class Chatroom
  def initialize
    @member = Hash.new
    @member["*"] = MyStream.new  # "*" is id for server.
  end

  def login name, stream
    @member[name] = stream
    broadcast "_", "login: #{name}"  # system information
  end

  def logout name
    broadcast "_", "logout: #{name}" # system information
    @member.delete name
  end

  def broadcast name, str
    @member.each {|key, val|
      val.xxputs "#{name}> #{str}"  if key != name
    }
  end

  def list name
    stream = @member[name]
    @member.each {|key, val|
      stream.xxputs " #{key}" unless key == "*"
    }
  end
end

uri = 'druby://localhost:12345'
DRb.start_service uri, Chatroom.new
puts 'Start Chat server...'
DRb.thread.join
#--- End of File ---

$ cat jclient.rb
# 2007-05-20 katoy
# usage: $ruby kato druby://loalhost:12350
#     or $jruby kato druby://loalhost:12350

require 'drb/drb'
require 'MyStream'

name = ARGV.shift
uri = ARGV.shift

DRb.start_service(uri)
room = DRbObject.new_with_uri 'druby://localhost:12345'

stream = MyStream.new

room.login(name, stream)

while s = gets.chop
  next  if s == ""              # ignore empty line
  break if s == 'exit'          # logout
  room.list(name) if s == "list" # show all member
  room.broadcast(name, s)        # send message to all member
end
room.logout(name)
#--- End of File ---

$ cat MyStream.rb
# 2007-05-20 katoy
#

require 'drb/drb'

class MyStream
  include DRbUndumped

  def xxputs(str)
    puts str
  end
end
#--- End of File ---

今度はさらに、$stdout の代わりに、java の System.out を使ってみよう。

cat MyStream.rb
# 2007-05-20 katoy
#

require 'drb/drb'
require 'java'
include_class 'JMyStream'

class MyStream
  include DRbUndumped

  def initialize
    @jstream = JMyStream.new
  end

  def xxputs str
    @jstream.xxputs str
  end
end
--- End of File ---

$ cat JMyStream.java
public class JMyStream {

    public JMyStream() {
    }

    public void xxputs(final String str) {
        System.out.println(str);
    }
}
--- End of File ---

これで、ruby クラス/java クラスを リモート/ローカルで呼び出せるようになったことになる。
これらのことを応用すれば、
  java クラスを ruby を使って張り合わせ、それらを適宜 分散させて実行するテストフレームワーク
を作れそうな気がする。

来週は java から jruby エンジンを稼働させたとき、呼び出し側のjava 環境の変数/メソッドを  jruby コードからアクセスできるかを試したい。
これができれば、xfy の xvcd で書きにくいビジネスロジックを ruby 構文をつかって記述することの実現がぐっと近くなってくる。

druby での超簡易チャットシステム

druby の解説ページ
- http://www2a.biglobe.ne.jp/%7Eseki/ruby/d205.html
> > 5 pass by reference, pass by value
に、stdout の参照をサーバー側に登録する例がある。

これを応用して、簡易チャットシステムを作ってみた。
アイデアは次のとうり。
- サーバー側では、ハッシュで {name, $stdout} の組で、クライアント情報を保持する。
- クライアントからのメッセージを、ハッシュ中のすべての $stdoutに puts する。

使い方は
  ターミナル1: $ ruby server.rb
  ターミナル2: $ ruby client.rb foo druby://localhost:12340
  ターミナル3: $ ruby client.rb foo druby://localhost:12341
                  (クライアント毎に port は異なるものを指定する必要がある)

client では、 "exit" を入力すると、logout してプログラム終了する。
              "list" を入力すると、login しているユーザー名一覧を表示する。
              空行は無視
              それ以外の入力行は、他のクライアント、サーバーのコンソールに表示される。

以下にプログラムを示す。

$ cat server.rb
# 2007-05-20 katoy
# usage: $ruby server.rb
#      

require 'drb/drb'

class Chatroom
  def initialize
    @member = Hash.new
    @member["*"] = $stdout  # "*" is id for server.
  end

  def login name, stream
    @member[name] = stream
    broadcast "_", "login: #{name}"  # system information
  end

  def logout name
    broadcast "_", "logout: #{name}" # system information
    @member.delete name
  end

  def broadcast name, str
    @member.each {|key, val|
      val.puts "#{name}> #{str}"  if key != name
    }
  end

  def list name
    stream = @member[name]
    @member.each {|key, val|
      stream.puts " #{key}" unless key == "*"
    }
  end
end

uri = 'druby://localhost:12345'
DRb.start_service uri, Chatroom.new
puts 'Start Chat server...'
DRb.thread.join
--- End of File ---

$ cat client.rb
# 2007-05-20 katoy
# usage: $ruby kato druby://loalhost:12350
#

require 'drb/drb'

name = ARGV.shift
uri = ARGV.shift

DRb.start_service(uri)
room = DRbObject.new_with_uri 'druby://localhost:12345'

room.login name, $stdout

while s = gets.chop
  next  if s == ""              # ignore empty line
  break if s == 'exit'          # logout
  room.list name if s == "list" # show all member
  room.broadcast name, s        # send message to all member
end
room.logout name
#--- End of File ---

この程度の行数で作れてしまうとは驚き。(エラー処理、mutex 処理などは抜けてるけど)
java で同様のものを作ろうとしたら、それなりの量を記述する必要があるし、
修正の度に compile が必要で、時間もかかるだろう。

上記のプログラムは、jruby では なぜか動作しない。
server は起動できるが、client を起動すると、次のエラーが出て起動できない。
/Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:585:in `load': Ruby "NativeException" object can not be allocated (TypeError)
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:585:in `load'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:633:in `exclusive'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:594:in `load'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:633:in `recv_reply'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:921:in `recv_reply'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:1195:in `send_message'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:1086:in `method_missing'
        from client.rb:14:in `open'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:1087:in `method_missing'
        from client.rb:14:in `with_friend'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:1089:in `method_missing'
        from client.rb:14

このチャットシステムの GUI を xfy/xvcd で作る事はできるか?
$stdout へ出力されたことのイベントをキャッチして、xfy の画面更新するが出来る必要がある。どうすれば良い?...

xfy の メモリー上の srcDOMの参照を server に登録して、サーバーが srcDOM に変更を加える?
srcDOM を変更する xfy メソッドを server から呼び出す?

« 2007年5月19日 | トップページ | 2007年5月21日 »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク