Kibana 5.X で visualize 結果から elasticsearch query を取得したい

kibana の visualize 機能で集計グラフを作成できたけど、これを Elasticsearch から直接取得したい。 Query に直さなきゃいけないんだけど、さすがに手でやるのは面倒だし…

Visualize 画面下部の矢印を押すと、spy mode になる。

  • Table (検索結果の Table view)
  • Request Body
  • Response Body
  • Statistics (クエリのレスポンスタイムなど)

これらを表示できるので、Request Body を見ればよい。

書き終わった後に気づいたよ!!

出典: github.com

Ruby 2.4 で CGI.unescape が高速化されていた

久しぶりに ruby をいじる機会があったので、備忘的に。

URL encode された文字列を decode したいのだけど、Ruby 2.1 の URI.decode だと遅すぎる!

というのをなんとか解決できないかと調べていました。

ベンチマークコード

似たようなことをやってくれるメソッドが複数あったので、とりあえずベンチとってみる。

require 'benchmark'
require 'uri'
require 'cgi'

encoded = '%7B%22hoge%22%3A%7B%22foo%22%3A%22bar%22%2C%22hoo%22%3A%22baz%22%7D%7D'
# => {"hoge":{"foo":"bar","hoo":"baz"}}

def manytimes
  100000.times { yield } if block_given?
end

Benchmark.bmbm do |bm|
  bm.report("URI.decode") {
    manytimes { URI.decode encoded }
  }
  bm.report("URI.decode_www_form_component") {
    manytimes { URI.decode_www_form_component encoded }
  }
  bm.report("CGI.unescape") {
    manytimes { CGI.unescape encoded }
  }
end
Ruby 2.1
$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-darwin15.0]

$ ruby decode_bench.rb
Rehearsal -----------------------------------------------------------------
URI.decode                      2.360000   0.020000   2.380000 (  2.404751)
URI.decode_www_form_component   1.270000   0.010000   1.280000 (  1.467851)
CGI.unescape                    1.480000   0.020000   1.500000 (  1.578028)
-------------------------------------------------------- total: 5.160000sec

                                    user     system      total        real
URI.decode                      2.570000   0.030000   2.600000 (  2.729236)
URI.decode_www_form_component   1.170000   0.010000   1.180000 (  1.189314)
CGI.unescape                    1.510000   0.010000   1.520000 (  1.577981)

遅いし obsolete だし、URI.decode はやめておいた方がよさそうだ。 singleton method URI.decode (Ruby 2.4.0)

URI.decode_www_form_component を使うのがいいのかな?

Ruby 2.4

試しに Ruby 2.4 でベンチとってみたら、思わぬ結果になった。

$ ruby --version
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin15]

$ ruby decode_bench.rb
Rehearsal -----------------------------------------------------------------
URI.decode                      2.290000   0.010000   2.300000 (  2.334818)
URI.decode_www_form_component   1.280000   0.020000   1.300000 (  1.330829)
CGI.unescape                    0.120000   0.000000   0.120000 (  0.133207)
-------------------------------------------------------- total: 3.720000sec

                                    user     system      total        real
URI.decode                      2.560000   0.030000   2.590000 (  2.859363)
URI.decode_www_form_component   1.270000   0.010000   1.280000 (  1.329829)
CGI.unescape                    0.120000   0.000000   0.120000 (  0.127875)

CGI.unescape が10倍以上速くなっている。

Ruby 2.4 から CGI モジュールのいくつかのメソッドが C拡張として実装されたらしい。

github.com

escape/unescape, escapeHTML/unescapeHTML 辺りが対象かな?

ruby/escape.c at trunk · ruby/ruby · GitHub

というわけで

URL decode したい時は Ruby 2.4 にして CGI.unescape を使うと速いよ!ということでした。

ある日から今日までの毎週日曜の日付を出したい

ひさびさなのに小ネタ。

たまに使うけど、毎回忘れては調べてるので書いておく。

Python 2.x で使う時は print のところを書き直すとよい。

$ python --version
Python 3.6.0

$ pip list | grep python-dateutil
python-dateutil 2.6.0

$ python sunday_list.py 20161226
20170101 20170108 20170115 20170122 20170129 20170205 20170212 20170219 20170226 20170305 20170312 20170319 20170326 20170402 20170409

Python3.x: Print every Sunday

近況

最近は qiita に書いてみています

http://qiita.com/gom

markdown 使えるのではかどる

ssh private key のパスフレーズを変更する

毎回忘れるのでメモ代わりに。ssh-keygen で変更できます

 

$ ssh-keygen -p -f ~/.ssh/id_rsa
Enter old passphrase: 
Key has comment '.ssh/id_rsa' 
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase. 

static property

仕事の時に見てたコードで、おや?と思ったものがあったので調べた。

 

クラス継承時に、親の持っている static property は子から参照しても同じ値が入っています。(static_property.php)
しかし、子クラスで同名の static property を宣言すると、親と子で別々の値が持てるようになります。(static_property_self.php)

理由はわりと単純で、子クラスで self::$foo と参照したときに、まず自分のクラスで定義を探す。なければ、 parent へ探しに行く。
なので、子クラスからも必ず同じ static property を参照したい場合は、self ではなく parent を指定しておくと良さそう。(static_property_parent.php)

 

コード見た方が早いと思うので、サンプル貼っておきますね。

object が同一かどうかはspl_object_hashで見ているhttp://php.ne ...

Project Euler - Problem 10

もろもろの合間にちょっとした体操。

http://projecteuler.net/problem=10
200万までの素数の合計を求める。
単に素数リストを求めて合計すればいいだけ。

組み込みクラス使ってもいいけど、自前で実装する。

#!/usr/bin/env ruby

class Prime
  def list(max)
    # Eratosthenes
    list = (3..max).step(2).to_a
    result = [2]
    while(list.last > result.last ** 2) do
      result << list.shift
      list.reject! {|n| n % result.last == 0}
    end
    result + list
  end
end

# sum of primes
max = ARGV[0].to_i # 2000000
p Prime.new.list(max).reduce(&:+)

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

$ time ruby p10.rb 2000000
ruby p10.rb 2000000 469.85s user 1.62s system 99% cpu 7:53.67 total

reject の部分で素数の倍数を落としているが、件数が多すぎて時間がかかってしまう。
リストにして一気に落とした方が早いか。

#!/usr/bin/env ruby

class Prime
  def list(max)
    # Eratosthenes
    list = (3..max).step(2).to_a
    result = [2]
    while(list.last > result.last ** 2) do
      result << list.shift
      list -= (result.last..list.last).step(result.last).to_a
    end
    result + list
  end
end

# sum of primes
max = ARGV[0].to_i # 2000000
p Prime.new.list(max).reduce(&:+)

$ time ruby p10.rb 2000000
ruby p10.rb 2000000 12.65s user 0.23s system 99% cpu 12.914 total

arrayが演算できる言語だからできる手抜き。
Cでやると面倒そうだなあ。