Electrum-DOGEも動かしてみた
Electrum-DOGEも動いたのでメモしておく。 ネットワークは doge-cce-1.coinomi.net tcp 5003 を使えばいける。doge-cce-2もついでに追加しておくとよい。 TX Feeは1DOGE(約0.015円)なので、テスト用には一番良いかもしれない。少し入手しておこうかと思う。
[追記] 動いたと思いましたが、着信がunverifiedのまま進みませんでした。例外も出ているので何か問題があるようです。
Litecoin用のElectrumを使ってみた
Electrumが結構お気に入りなので、Litecoin用のElectrumも使ってみた。
使い方はREADME.rstでは以下のようになっている。
./electrum-ltc
インストールするにはこんな感じか。
pyrcc4 icons.qrc -o gui/qt/icons_rc.py
python setup.py sdist --format=zip,gztar
sudo pip install --pre dist/Electrum-LTC-2.6.tar.gz
ただ、これだけだと初期ノードにつながらないので、以下のサイトにあるノードを追加した。
差分は以下のような感じ。ついでにRPCのポート番号を7777から7778に変更。
[追記] こんなことをしなくてもsetconfigでできました。
$ electrum-ltc setconfig rpcport 7778
立ち上げた後、コンソールでgetservers()すると7ノードほど表示された。 なお、上記パッチをあてる前に起動してしまった場合は ~/.electrum-ltc/recent_servers を一度消しておいた方がよさそう。
daemonとして立ち上げる場合は electrum-ltc daemon start とすればよい。
$ electrum-ltc daemon start
helpを見れば色々とコマンドが見れる。RPCなので、curlとかからでも操作できるので便利。
dRubyで並列処理
(※12月の1日から25日まで、日替わりで Ruby の Tips を紹介するイベント、 Ruby Advent Calendar jp: 2009 の 11 日目です。昨日は no6v さんでした。明日は id:willnet さんの予定です。)
RubyのThreadは時分割なので並列処理を行いたいときにちょっと困ります。そんなときにはdRubyを使ってみるのはいかがでしょうか。
#!/usr/bin/ruby require 'drb/drb' class MonteCarlo def initialize(seed) srand(seed) end def dice(n) best = rand n.times do r = rand best = r if r < best end best end end PROCESSORS = (ARGV[0] || 1).to_i pids = [] workers = PROCESSORS.times.map do |i| uri = "druby://localhost:#{12345 + i}" pids << fork { DRb.start_service(uri, MonteCarlo.new(i)); sleep } DRbObject.new_with_uri(uri) end begin n = 5000000 / PROCESSORS q = Queue.new sleep 0.1 ts = workers.map do |foo| Thread.start(foo) {|f| q.push(f.dice(n))} end ts.each{|t| t.join} p q.size.times.map{q.pop}.min ensure pids.each {|pid| Process.kill(:TERM, pid)} end
このサンプルコードは500万回の疑似乱数の中から最も0に近い実数を見つけだすというプログラムです。sleep 0.1の部分は見なかったことにしてください。サンプルなので内容はあまり意味がありませんが、要は並列処理したい部分をMonteCarloのdiceの中に書いてあげればいいわけです。このプログラムは以下のように並列処理数を指定して実行します。
$ ruby montecarlo.rb 2
この例では2つのプロセスを並列で動かします。最近のデュアルコアのCPUでは2を指定しましょう。コアがもっと多い人は「界王拳4倍!」とか唱えながら4とかを指定するといいでしょう。コアが1つしかない方はヤムチャの気分になってあきらめてください。というのは冗談で、コア数を超えていても一応動きますので試してみてください。
メインのプロセスはforkで生成された子プロセス2つに命令を送り、待つためのスレッドがそれぞれ生成され、joinで終了を待ちます。
結果はQueueに格納され、これを個数分popして取り出し、その中から最小値を取り出して表示して終了します。Queueは便利ですね。
以下はベンチマークです。平均とかは取っていないのでかなり適当ですが。それにしてもやっぱりCore i7は速いですね。こんなことにしかこのPCを活かせていないのが悲しいですが。
プロセス数 | CoreDuo | Core i7 |
---|---|---|
1 | 7.284s | 4.482s |
2 | 3.882s | 2.120s |
3 | 3.898s | 1.417s |
4 | 3.876s | 1.102s |
5 | 3.695s | 1.163s |
6 | 3.754s | 0.997s |
7 | 3.716s | 0.958s |
8 | 3.666s | 0.974s |
9 | 3.738s | 1.029s |
10 | 3.713s | 0.983s |
11 | 3.905s | 0.981s |
12 | 3.776s | 0.952s |
13 | 3.697s | 0.934s |
18 | 3.816s | 0.896s |
32 | 3.669s | 0.907s |
64 | 4.036s | 0.942s |
96 | 4.643s | 0.973s |
Ruby1.9.1
プロセス数 | CoreDuo | Core i7 |
---|---|---|
1 | 4.675s | 2.082s |
2 | 2.677s | 1.112s |
3 | 2.656s | 0.791s |
4 | 2.609s | 0.625s |
5 | 2.746s | 0.705s |
6 | 2.649s | 0.656s |
7 | 2.581s | 0.641s |
8 | 2.626s | 0.616s |
9 | 2.691s | 0.646s |
10 | 2.617s | 0.632s |
11 | 2.619s | 0.629s |
12 | 2.573s | 0.633s |
16 | 2.705s | 0.639s |
32 | 2.619s | 0.662s |
64 | 3.144s | 0.625s |
96 | 3.010s | 0.797s |
なお、このプログラムはlinuxでしか試していませんので、動かなかった場合はがんばって動くようにしてもらえると助かります。また、MacRubyな方はこんなことしなくても普通にスレッドで動かせばよいらしいです。(くやしー!)
new Objectはスケールするか?
$ cat a.scala import scala.concurrent.ops._ import java.lang.System.{currentTimeMillis => curt} def foo(n: Int) = { (0 until n).foreach { _ => new Object } } def bench(weight: Int, ncore: Int) { val s = curt (0 until ncore).map(_ => future(foo(weight))).toList.foreach(_()) val e = curt println("%d: %d ms".format(ncore, e - s)) } (0 to 3).foreach { _ => bench(40000000, 1) bench(20000000, 2) bench(10000000, 4) } $ scala a.scala 1: 868 ms 2: 598 ms 4: 594 ms 1: 783 ms 2: 587 ms 4: 596 ms 1: 784 ms 2: 587 ms 4: 593 ms 1: 785 ms 2: 590 ms 4: 589 ms
CoreDuoで実行したので4はあまり意味がないです。
plzma: splitとxargsでlzmaを並列処理
作ってみました。(圧縮のみ)
コミットログの出だしの単語ベスト30
取ってみた。
present -s past ing ---------------------------------- fix 771 8 70 add 729 102 4 merge 746 13 make 304 use 269 remove 188 29 update 120 20 don't 121 move 115 5 allow 91 change 72 10 test 66 7 simplify 68 avoid 58 handle 57 improve 41 9 minor 47 do 46 show 32 refactor 32 import 12 20 ignore 30 clean 19 10 replace 23 5 only 27 more 27 pull 25 get 25 convert 25 correct 9 15
少し前のmercurial-crewのログから最初の2単語を抽出して、sort,uniq -c,cutとかいろいろ使いながら、半分手作業でまとめました。
ベスト160まで取りましたが、長くなるのでとりあえずここまで。
できればこの後どういう単語につながるパターンが多いのか調べていきたい。