togatttiのエンジニアメモ

過度な期待はしないでください.

fishでrbenvを使う

Ubuntuでfishを使っていて、rbenvの初期処理を実行する際に、詰まったので備忘録を残す。

最初に以下の記事を見つけて、config.fishを変更した。

qiita.com

設定内容はこれ。

togattti@dev ~> cat ~/.config/fish/config.fish
rbenv init - | source

でも、ログインし直したら、エラーが出た。

'case' builtin not inside of switch block
- (line 10):   case "$command" in
               ^
from sourcing file -
    called on line 1 of file ~/.config/fish/config.fish

from sourcing file ~/.config/fish/config.fish
    called during startup

rbenvは、1.1.1だから、そこまで古くないのだけど。。

とりあえず、Issueを見つけたので、以下のように設定を変更して、反映させた。

togattti@dev ~> cat ~/.config/fish/config.fish
if status –is-interactive
  set PATH $HOME/.rbenv/bin $PATH
  . (rbenv init - | psub)
end

参考

. (rbenv init -|psub) breaks fish shell executable files · Issue #501 · rbenv/rbenv · GitHub

fishで、Anacondaに環境パスを通す

Anacondaへの環境パスがfishだと通ってないので、設定する。

Anaconda3のインストール先を変更しないことを前提に、以下のコマンドを実行する。

Ubuntu, MacOS

set -U fish_user_paths $HOME/anaconda3/bin $fish_user_paths

どうでもいいけど、anacondaユーザは.bashrcとか.bash_profileに環境パスが追記されるけど、bashの利用者が多いのだろうか。

日時範囲を指定して、Elasticsearchのデータを取得する。

curlで日時範囲を指定して、Elasticsearchのデータを取得する方法を示す。

取得対象のデータには、

(snip)
 "@timestamp" : "2017-08-16T16:51:06+09:00"
(snip)

のような感じで、タイムスタンプが設定されていることを前提とする。

curlで、タイムスタンプを日時の範囲を指定して、データを取得したい場合は、

$ curl -XGET 'localhost:9200/elsdata-2017.08.16/elsdata/_search' -d '{
    "query": {
        "range" : {
            "@timestamp" : {
                "gte" : "2017-08-16T16:18:00+09:00", "lte": "now", "format" : "date_time_no_millis"
            }
        }
    }
}'

という感じで、JSONを渡してあげると取得できる。

gteとlteを指定することで、2017-08-16T16:18:00+09:00から現在までのデータを取得することできる。

タイムスタンプの形式によっては、formatを設定する必要があるので、ここから条件を満たすものを選び設定する。

また、10000件以上のデータを一度に取得したい場合は、scrollとsizeを指定して、リクエストすると取得できる。

以下の例は、30000万件のデータを取得する場合

$ curl -XGET 'localhost:9200/elsdata-2017.08.16/elsdata/_search?scroll=1m&size=30000&pretty' -d '{
    "query": {
        "range" : {
            "@timestamp" : {
                "gte" : "2017-08-16T16:18:00+09:00", "lte": "now", "format" : "date_time_no_millis"
            }
        }
    }
}'

embulk-parser-regexのエラー対応

Embulkプラグインのembulk-parser-regexで、regexのキーに、_(アンダースコア)を含めるとエラーになる。

regexを使う時は、キーに_を使わないようにしよう。

エラーメッセージ

Error: java.util.regex.PatternSyntaxException: named capturing group is missing trailing '>' near index 125
^(?<from>[^%]+)%(?<uid>[^%]+)%(?<did>[^%]+)%(?<mid>[^%]+)%(?<type>[^%]+)%(?<to>[^%]+)%(?<status>[^%]+)%(?<ts>[^%]+)%(?<status_desc>[^%]+)%(?<host>[^%]+)%(?<uuid>[^%]+)$
                                                                                                                             ^

confg.ymlのサンプル

parser:
    type: regex
    # エラーが出る。
    # regex: ^(?<from>[^%]+)%(?<uid>[^%]+)%(?<did>[^%]+)%(?<mid>[^%]+)%(?<type>[^%]+)%(?<to>[^%]+)%(?<status>[^%]+)%(?<ts>[^%]+)%(?<status_desc>[^%]+)%(?<host>[^%]+)%(?<uuid>[^%]+)$
    # アンダースコアを消すとうまくいく。
    regex: ^(?<from>[^%]+)%(?<uid>[^%]+)%(?<did>[^%]+)%(?<mid>[^%]+)%(?<type>[^%]+)%(?<to>[^%]+)%(?<status>[^%]+)%(?<ts>[^%]+)%(?<statusdesc>[^%]+)%(?<host>[^%]+)%(?<uuid>[^%]+)$

    columns:
(snip)
    # regex_nameもアンダースコアを修正
    # - {name: status_desc, type: string, regex_name: status_desc}
    - {name: status_desc, type: string, regex_name: statusdesc}
(snip)