トップ «前の日(04-25) 最新 次の日(04-27)» 追記   RSS 1.0 FEED  

Journal InTime


2001-04-26 (Thu)

_ libwrap-ruby

libwrap-ruby(ruby-tcpwrap)がDebian sidにinstallされてるみたい。

_ 解決編

謎のエラー の原因はスクリプトの最後に~という行があったこと。 どうしてそんなのが見つからなかったのかわからない人は次のコマンドを実行して みてください。

$ cat > foo
echo foo
~
^D
$ sh foo 
foo
foo: /home/shugo: is a directory
$ vi foo

森に木を隠す、というトリックでした。


2004-04-26 (Mon)

_ [ハードウェア] PowerMac G4 Cube

PowerMac G4 Cube

OS9しか入ってなくて会社で打ち捨てられていたG4 CubeにLinuxを インストール。

しかし、メモリ64MBはつらいなあ。 だれかMac用の要らないメモリがあったらください。

本日のツッコミ(全3件) [ツッコミを入れる]

_ かずひこ [DOS/V 系の PC100/133 の SDRAM が使えませんか? うちでは 512MB のは相性なのかトラブル..]

_ shugo [へー、PCと一緒なんですね。]

_ shugo [ちょうどマザーボードがイカれてたマシンがあったので、メモリかっぱらってきて付けてみたらOKでした:-)]


2005-04-26 (Tue)

_ [mod_ruby] Multi-VM instance

 とりあえず,目標として考えているのは mod_ruby が複数アプリ ケーションを扱えるようにするための機構です.  現在は,1 Ruby プロセスを共有するようになっているため, mod_ruby で複数アプリケーションを動かすと,グローバルな何か は全部共有されてしまいます.たとえば,String クラスを再定義 すると,どのアプリケーションでもそうなってしまう.これをな んとかしたい.

[yarv-dev:471より引用]

わーい。

しかし、mod_rubyの場合は(普通のMPMだと)複数プロセスなので、 (プロセス数 * アプリケーション数)分のメモリが必要になってしまうなあ。

Stringうんぬんに関してはselector namespaceを作ってくれてもいいですよ。

_ [仕事][Rails] Action Web Service

独自プロトコルによる通信部分もAction Web Serviceで置き換えたくなってきた。 やばい、そんな時間ないってば。

本日のツッコミ(全3件) [ツッコミを入れる]

_ ささだ [アプリケーション分のメモリは必要ないんじゃないでしょうか.Java の MVM の目指すものと同じで. というか,..]

_ shugo [すみません、今はグローバルなものが一つだけあればいいところで、(プロセス数 * アプリケーション数)分いるなあという..]

_ shugo [IRCで、ちゃんと共有できるもの(再定義されてないものとか)は共有するように実装するから問題ないだろ、ぼけー、という..]


2012-04-26 (Thu)

_ [Ruby] real-time deque

Purely Functional Data Structuresのreal-time dequeをRubyで実装してみた。 dequeは両端から要素を追加したり削除できるキューで、real-time dequeは両端への追加・削除が最悪でもO(1)というもので、以下のような使い方ができる。

>> deque = Immutable::Deque.empty.push(1).push(2).push(3)
=> #<Immutable::Deque:0x20f21b18 @front=Stream[?, ...], @front_len=1, @front_schedule=Stream[...], @rear=Stream[?, ...], @rear_len=2, @rear_schedule=Stream[...], @c=3>
>> deque.to_a
=> [1, 2, 3]
>> deque.first
=> 1
>> deque.shift.to_a
=> [2, 3]
>> deque.last
=> 3
>> deque.pop.to_a
=> [1, 2]

短命データなら例えば双方向リストを使って簡単に実装できると思うが、永続データだと後でリンクを付け変えることができないので結構複雑になる。このreal-time dequeでは、2本のリストを使って前半と後半に要素を分けて管理し、一回の操作がO(1)に収まるように一方のリストから他方に逐次的に要素を移している。

当初、queueの実装をFigure 5.3どおりに以下のように実装していたが、@c == 2*1の時に(1..5).inject(Immutable::Deque.empty, :&cons).to_aのようなコードでエラーになってしまった。

def queue(f, f_len, f_schedule, r, r_len, r_schedule)
  # ...
  elsif r_len > @c * f_len + 1
    i = (f_len + r_len) / 2
    j = (f_len + r_len) - i
    f2 = rotate_drop(f, j, r)
    r2 = r.take(j)
    self.class.new(f2, i, f2, r2, j, r2)
  else
    self.class.new(f, f_len, f_schedule, r, r_len, r_schedule)
  end
end

どうも

i = (f_len + r_len) / 2
j = (f_len + r_len) - i

の部分を

j = (f_len + r_len) / 2
i = (f_len + r_len) - j

のようにijを入れ替えないと上手く行かないようだ。 この部分はリア側の要素をフロント側に移す処理をしていて、elsifの前にはフロント側の要素をリア側に移すコードがあるのだが、それと対称的なコードにするには上記のようにijを入れ替えないといけない気がする。

また、Figure 5.3のコードはrotateDropの引数の順番も間違っているような気がするのだが、MLのコードなのでよくわからない。

*1  @cは一方のリストが他方よりどれくらい長くなったら要素を移すかを決めるパラメータ。