image

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

検索

最近のトラックバック

無料ブログはココログ

ruby

2011-06-26

ruby から redis と tokyo-cabinet の利用を比較

ruby から redis と tokyo-cabinet の利用をして、速度を比較してみた。
redis と tc はそうとう差がある。測定用プログラムが間違っているか redis の設定がおかしいのか?

$ ruby sample00.rb
      user     system      total        real
Redis:set
30.420000  12.080000  42.500000 ( 77.195107)
Redis:get
  0.060000   0.010000   0.070000 (  0.123865)
TokyoTyrant:set
  2.280000   0.090000   2.370000 (  2.394154)
TokyoTyrant:get
  0.000000   0.000000   0.000000 (  0.001792)

以下がプログラム。(web 上で見つけた類似プログラムをベースにした)

$ cat sample00.rb
require 'rubygems'
require 'redis'
require 'tokyocabinet'

require 'benchmark'
require 'pp'

BENCH_TIMES_CREATE = 10000 * 65 # 1000
BENCH_TIMES_SELECT = 1000

include TokyoCabinet

@tc = HDB::new
@tc.open("tc.hdb", HDB::OWRITER | HDB::OCREAT)
if !@tc.vanish()
  ecode = @tc.ecode
  STDERR.printf("get error: %s\n", @tc.errmsg(ecode))
end

@rd = Redis.new
@rd.flushall

Benchmark.bm do |b|

  b.report("Redis:set\n") {
    1.upto BENCH_TIMES_CREATE do |i|
      @rd.set "foo_#{i}", "bar_#{i}"
    end
  }

  b.report("Redis:get\n") {
    1.upto BENCH_TIMES_SELECT do |i|
      @rd.get "foo_#{ i}"
    end
  }

  b.report("TokyoTyrant:set\n") {
    1.upto BENCH_TIMES_CREATE do |i|
      @tc["foo_#{i}"] = "bar_#{ i}"
    end
  }
  b.report("TokyoTyrant:get\n") {
    1.upto BENCH_TIMES_SELECT do |i|
      @tc["foo_#{i}"]
    end
  }
end


2011-05-07

sinatra + jqgrid + mongodb で 郵便番号をあつかってみた

Zipcode01 Zipcode02
Zipcode03

sinatra + jqgrid + mongodb で 郵便番号(12万件) の表示/検索をする web アプリを作成してみた。
ソースコード: http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/Edinet/tools/jqgrid-example/

grid (表) の列を drag で表示幅、表示順序の変更が出来る。
列名の下の部分で、表示データを絞り込む事ができる。
(いずれも文字列の部分一致で)
都道府県の列は、選択リストになっているが、県毎の件数を表示するようにもなっている。

jqgrid の機能はとても豊富である。
gqgrid のデモページをみる事で、一端をすることができる。
See - http://www.trirand.com/blog/jqgrid/jqgrid.html
      > jqGrid Demos

2010-10-02

mongodb の find() と mapreduce

mngodb で あるデータ(290万件から 10 数件) を検索するのを
find() と mapreduce で行ってみた。

find()
======
real   0m14.686s
user   0m0.960s
sys    0m0.221s

mapreduce
==========
real   1m17.705s
user   0m0.967s
sys    0m0.222s

この速度差は妥当なのか?

find のコード
--------------
pat = /zzz/
coll.find( { 'val' => zzz } ).each { |d|
  pp d['zzz']
}

mapreduce のコード
-----------------
map = "function() { " +
  "if (/zzz/.test(this['val'])) emit(this, 0);" +
  "}"
reduce = "function(key, values) { " +
  "return 0; " +
  "};"

result = coll.map_reduce(map, reduce)
result.find.to_a.each do |r|
  pp r
end

2010-06-06

sinatra アプリから得たデータを extjs の grid で表示する

sinatra アプリから得たデータを extjs の grid で表示する例を以下に置いた。
  http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/Edinet/ria/grid-sinatra/?root=ruby-xbrl

web 上や 書籍には php で作成したアプリからのデータを grid で表示する例がほとんどである。
sinatra で作成した アプリからのデータを extjs で表示する際には、jsonp にすることが必要である。
それらのことを含め、小さなスケルトンを書いた。

2010-05-30

sinatra + mongodb

ずっと mongodb をいじっていなかったので、改めて ruby で sinatra で データ CRUD の練習をしてみた。
// データ一覧、新規追加、削除、json 形式でのレスポンス の練習。

$ cat main.rb

#  2010-05-30 katoy
#    $ mongod --dbpath data
#    $ shotgun main.rb
#    acccess to "http://localhost:9393"
#
#  ruby 1.8.7

require 'rubygems'
require 'sinatra' # 1.0
require 'erb'
require 'mongo'  # 1.0.1,   mongodb 1.4.2
require 'json/pure'
require 'pp'

DB = 'mydb'
COLLECTION = 'test'

template :layout do
  s = <<EOS
<html lang="ja">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <style type="text/css">
    .item {
        border: solid;
        margin: 10px;
    }
    .alignTopLeft {
        text-align:left;
        vertical-align:top;
    }
    </style>
  <head>
  <body>
    <hr>
      <%= yield %>
    <hr>
    <h1><a href="/">一覧へ</a></h1>
  </body>
</html>
EOS
end

helpers do
  def get_collection
    db = Mongo::Connection.new.db(DB)
    db[COLLECTION]
  end
end

#-- Top page
get '/' do
  redirect '/list'
end

# -- Form for Create
get '/create' do
  erb %{
    <div>
      <form action='/create' method='POST'>
        <span class="alignTopLeft">KEY: </span>
        <input type='text' name='key'><br>
        <span class="alignTopLeft">VAL: </span>
        <textarea cols="100" rows="8" name='val'></textarea><br>
        <input type='submit' value='登録'>
      </form>
    </div>
  }
end

# -- Create
post '/create' do
  doc = { '_id' => BSON::ObjectID.new.to_s, 'key' => params[:key], 'val' => params[:val]}
  coll = get_collection
  id = coll.insert(doc)
  redirect "/#{id}"
end

# -- Form for Edit
get '/edit/:uid' do
  erb %{
    <% coll = get_collection  %>
    <% coll.find('_id' => params[:uid]).each do |row| %>
      <div>
        <form action='/edit/<%=  params[:uid] %>' method='POST'>
          <span class="alignTopLeft">KEY: </span>
          <input type='text' name='key' value="<%= row['key'] %>"><br>
          <span class="alignTopLeft">VAL: </span>
          <textarea cols="60" rows="10" name='val'><%= row['val'] %></textarea><br>
          <input type='submit' value='変更'>
        </form>
      </div>
    <% end %>
  } , :locals => { :param => params }
end

# -- Edit
post '/edit/:uid' do
  id = params[:uid]
  doc = { '_id' => id, 'key' => params[:key], 'val' => params[:val]}
  coll = get_collection
  coll.update( {'_id' => id }, doc)
  redirect "/"
end

# -- List
get '/list' do
  erb %{
    <% coll = get_collection %>
    <%= coll.count %> 件<br/>
    <a href="/create">新規追加</a><hr>
    <% coll.find().each do |row| %>
     <div class="item">
       キー: <a href="/edit/<%= row['_id']%>"><%= row['key'] %></a> <a href="/del/<%= row['_id']%>">削除</a><br/>
       <pre><%= row['val'] %></pre>
     </div>
    <% end %>
  }
end

# -- List format json
get "/list/json" do
  ans = []
  coll = get_collection
  coll.find().each do |row|
    ans << row
  end

  content_type :json
  ans.to_json
end

# -- Delete
get '/del/:uid' do
  uid =  params[:uid]
  coll = get_collection
  coll.remove('_id' => uid)
  redirect '/list'
end

# Read
get '/:uid' do
  uid =  params[:uid]
  coll = get_collection
#  ans = coll.find({'_id' => uid}, {:limit => 1})
  ans = coll.find({'_id' => uid}, {:limit => 1})
  if ans.count > 0
    erb %{
      <% ans.each do |row| %>
       <a href="/edit/<%= row['_id']%>">変更</a><br/>
       <a href="/del/<%= row['_id']%>">削除</a><br/>
        <div class="item">
          key:<%= row['key'] %><br/>
          val:<%= row['val'] %></p>
        </div>
      <% end %>
    }, :locals => { :ans => ans }
  else
    erb %{
      Not find the data.
    }
  end
end

# -- Read format json
get '/:uid/json' do
  uid =  params[:uid]
  ans= nil
  coll = get_collection
  coll.find({'_id' => uid}, {:limit => 1}).each do |row|
    ans = row
  end
  content_type :json
  ans.to_json
end
#-- End of File ---

2010-05-16

web スクリーンショット生成サービスの試作 (その2)

201005016screenshot
先に作った web サービスを使って <a href> タグ のマウスホバーで、スクリーンショットを preview させるようにしてみた。
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/Edinet/tools/screenshot/03/?root=ruby-xbrl

次の javascript を利用している。
- http://cssglobe.com/post/1695/easiest-tooltip-and-image-preview-using-jquery
> Easiest Tooltip and Image Preview Using jQuery | Css Globe

web スクリーンショット生成サービスの試作

webkit2png というツールを見つけた。
これはコマンドラインツールであるが、指定した url のページのスクリーンショット(png) を得るものだ。
この ツールを sinatra で wrap してみた。
  http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/Edinet/tools/screenshot/?root=ruby-xbrl
   (ruby 1,8.7, 1.9.1m jruby 1.5.0 で動作する)

現状では、リクエスの度に画像生成をしているが、
   (url, imageデータ0 の 対で DB 登録する、
  url 短縮名 で 画像をファイル保存して、再利用する
といった キャッシュ処理の組み込みがさらに必要だろう。

こういった小さな サービスの実験に sinatra は向いてる (Rails では大袈裟すぎる)

2009-10-05

EDINET タクソノミ中の用語を PDIC にしてみた

20091005peic

firedictionary への追加辞書データして、EDINET でのタクソノミ中の用語を pdic 形式で作ってみた。

方法 (ruby スクリプト) と PDIC データは 以下を参照。
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/Edinet/lib/pdic/?root=ruby-xbrl

現状ではなぜか、日本語 -> 英語 しか引けない。何故?

次は IFRS 用語辞書を作る予定。
// IFRS 用語辞書からボランティアを募ってデータ作成していく?

2009-09-27

企業の売り上げ/利益のグラフを coverflow 風に閲覧 (その3)

20090927chart

株価のチャートも coverflow 風に閲覧できるようにしてみた。

http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/Edinet/tools/msn/00Readme.txt?view=markup&root=ruby-xbrl

ruby をつかって、yahoo の株価チャートの画像を download している。
sourceforge には、過去 2000 年以降の株価情報の download プログラムもいれてあるので、このデータからグラフを作成することも可能。

2009-09-23

企業の売り上げ/利益のグラフを coverflow 風に閲覧 (その2)

20090923imageflow

業種別にブラウジングできるようにした。
動作させている様子の動画は以下にある。
  http://www.screencast.com/users/katoy/folders/Default/media/ebe9b4f1-fd27-4c9c-9af4-51a486cd0020

ruby でのソースコードは sourceforge.jp に commti してある。
See http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/Edinet/tools/msn/00Readme.txt?view=markup&revision=100&root=ruby-xbrl

より以前の記事一覧

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 あわせて読みたい

リンク