雑文発散

追記
過去の日記

2015-07-30 [長年日記]

[Pebble] Pebble Time の SOS スクリーン(リカバリーモード)というものを知った

お昼ごはんから返ってきて、ふと時計を見たら、Pebble Time が見慣れない画面になっていた。

Pebble Time

ボタン類を押しても変化しない。なにこれどーなってんの!?壊れちゃったの??修理する場合は本国送還????国際宅配便を送るのどうすんだっけ?とパニックになりかけた。

よく見ると画面内には getpebble.com/sos とある。こういう URL にするのセンスあるわぁとか思いながら、その URL を叩くと次のヘルプ画面へ飛ばされた。

このページに書いてある「How to get out of Recovery Mode」あたりの説明では、自動で再接続が行われて復帰するとか書かれているけど、オレの場合は何にも起きなかったので説明と違う。

さらに読み進めて行ったら「If your smartwatch does not reconnect and update automatically」なんて説明があった。

  • スマホの Bluetooth 設定画面へ行け
  • Pebble Time の登録を解除
  • スマホと Pebble Time を再起動
    • Pebble Time は Back と Up と Select ボタン(右側の3つのボタン)を Pebble のロゴが出てくるまで同時に長押し
  • 初回設定時と同じようにペアリングのやり直し

このうち、スマホ( iPhone5s )の再起動はしなかったんだけど、ペアリングをしたら、ファームウェアのインストールが始まり無事に復帰。日本語の表示もできていたので、日本語言語パックには影響がなかった模様。

どうやら、ファームウェア 3.2 で同様の症状になる人が(そこそこ?)いるらしく、3.1 へのダウングレード方法をまとめている人もいた。

オレの場合は多発している訳でもないし、まだ 3.2 のままで行こう。そのうち 3.2 での機能を使った処理を書くかも知れないし、なんか後戻りするのは性に合わないし(笑)

(あぁ、写真に Bluetooth 機器名称が写ったままだった。。。まぁ、いいや)


2015-07-29 [長年日記]

[Elasticsearch] Elasticsearch 2.0.0 で導入予定の Pipeline Aggregations が便利そうなので自分なりにまとめてみたよ

先日の Elasticsearch 勉強会で Pipeline Aggregations のドキュメントを紹介されてから、数日ちまちまと眺めているのだけど、「これはもしかしてあればいいのになぁと思っていた機能なのでは!?」と思うようになって、ちょっとだけマジメにドキュメントを読み始めた。

実は以前に公開された 2.0.0 の紹介記事でも Pipeline Aggregations に触れられているんだけど、パフォーマンス改善やマイグレーションの話に目がいってしまって、「ふーん」とスルーしてしまっていた(せっかく書かれていたのに申し訳ない)。

改めてその記事を見直すと、Pipeline Aggregations の話が一番上に書いてある。一番上ってことは、一番訴求したい項目であって、一番ウリな機能ってことじゃないか!!!

ちょっと落ち着こう。

Pipeline Aggregations とは「Aggregation で集計された結果をさらに Aggregation できる」というのが超絶ざっくりした解説になる。

最初(というか単にアルファベット順)に説明されているのは、Avg Bucket Aggregation で、こいつが何をできるかというと、こういう表が Elasticsearch のクエリ一発で表せるようになるってことだよね、きっと。この「平均」の部分を Elasticsearch 側で計算してくれる。

売上数 売上額
2015-01 3 550
2015-02 2 60
2015-03 2 375
平均 328.33

縦方向の集計としては、「平均」の他に「最大」「最小」「合計」の計算が可能みたいだ。上の表で言えば、「平均」の部分の代わりに「最大の売上額」「最小の売上額」「売上額の合計」が簡単に出せそうだ。

こいつらを整理するとこんな体系になっている様子。「* Bucket Aggregation」という名前が一連のシリーズだと思えばいいのかな。

こういった「集計後のデータのさらに平均だとか合計だとか」を、Web アプリなどに表示したい場合ってどうしていただろう? わりと「データベースで集計した結果をアプリ側でさらに計算して平均(合計)を出す」ということをやっているのではないだろうか。少なくともオレはそうしている。

もちろん SQL をちょっとがんばれば、この表を一発で返すこともできるだろうけど、アプリでちょいちょいとやってしまった方が楽そうに思う場合が多いので。

でも、例えば Avg Bucket Aggregation のクエリはすごいシンプルに書ける。リファレンスから引用するとこんな感じ。

{
    "aggs" : {
        "sales_per_month" : {
            "date_histogram" : {
                "field" : "date",
                "interval" : "month"
            },
            "aggs": {
                "sales": {
                    "sum": {
                        "field": "price"
                    }
                }
            }
        },
        "avg_monthly_sales": {
            "avg_bucket": {
                "buckets_paths": "sales_per_month>sales"
            }
        }
    }
}

Avg Bucket Aggregation の本体は "avg_monthly_sales" 以下の JSON 部分になる。ちなみに "avg_monthly_sales" というのは、ラベルみたいなものなので好きな名前を付ければ良いところ。本当の本体は "avg_bucket" の部分で、これが「Avg Bucket Aggregation を使え」という指定。さらに "buckets_paths" が、前段の集計のどの結果を使うかの指定。上の例で言えば、「sales_per_month の中の sales という値」を対象にする、という意味になっているのだと思う。

「sales_per_month の中の」を表すのが「>」みたい。これは AGG_SEPARATOR と呼ばれるものらしい。詳細は buckets_path Syntax に書いてあるけど、まだあまり理解していない。

縦方向の集計をしていると、GROUP BY foo HAVING bar <= 50 みたいに集計結果の絞り込みが欲しくなるときがあるけど、それは Bucket Selector Aggregation で実現できるようになりそう。

つまり、次のような全体の集計があるとした場合を考えてみる。

売上数 売上額
2015-01 3 550
2015-02 2 60
2015-03 2 375

Bucket Selector Aggregation を使えば、次のように「売上が 200 未満の集計結果のみを表示」などができる。こういうの待ち望んでいた感じ、あるよね!!

売上数 売上額
2015-02 2 60

さて、縦方向の集計があれば、横方向の集計もあるわけで、Derivative Aggregation では変化量(差分)を集計することができる。つまりこのような表の「前月との差額」を一発で集計できるみたいだ。(あ、でも、こういうの、横方向の集計とは言わないかな。単に横に表を広げるのでそういう言い方をしてしまっている)

売上数 売上額 前月との差額
2015-01 3 550
2015-02 2 60 -490
2015-03 2 375 315

また、Cumulative Sum Aggregation では、このような「累積額」を一発集計できるやつっぽい。

売上数 売上額 累積額
2015-01 3 550 550
2015-02 2 60 610
2015-03 2 375 985

さらに Bucket Script Aggregation を使うと、もっと細かい横方向の拡張ができるようだ。

例えば、こういう表が一発で作れるみたい。「Tシャツが売上に占める割合」の部分を Bucket Script Aggregation で求めることができる。

総売上数 Tシャツの売上数 総売上額 Tシャツの売上額 Tシャツが売上に占める割合
2015-01 3 2 50 10 20%
2015-02 2 1 60 15 25%
2015-03 2 1 40 20 50%

この他にも Moving Average AggregationSerial Differencing Aggregation が Pipeline Aggregations に含まれている。それぞれ、だいたい何をやっているのかは把握できたものの、うまく説明する自信がないので、いまは置いておく。時系列データを分析する場合には使えそうな予感だけはしている。

Elastic 社 CTO の Shay さんが「Elasticsearch は検索がスタートだったけど、集計にも使われることが増えてきたので、そちらにも力を入れ始めている」というような発言をされていた(と思う)んだけど、それはこういうことだったんだなぁと思った。

そしてこういう用途への拡張を意識して「PostgreSQL のようにデータの信頼性を維持できる Elasticsearch にしていきたい」という発言に繋がったのだなぁなどと思ったりもした。

あ、ちなみにここに書いたものは、全てドキュメントから把握してまとめたもの。本当は実際に HEAD の ELasticsearch を動かしつつ試してみようとか思っていたんだけど、なんか手元でビルドがうまくいかずにまだ試せていない。間違っていたところがあったらごめんね。


2015-07-28 [長年日記]

[Elasticsearch] 第11回 Elasticsearch 勉強会へ参加してきた

昨日、第11回 Elasticsearch 勉強会へ参加してきた。いつもの時間に会社を出たつもりだけど、会場・開始までにはそんなに余裕が無かったので、いつもの時間を間違えていた気がするのだけど、いつもの時間とはいつだったのだろうか。

今回は Elastic 社の CTO である Shay Banon さんがトークするという回。昨年もそういうタイミングがあったそうなのだけど、その頃は Elasticsearch に触れていなかったので、まったく知らなかった。

その Shay さんの到着が遅れそうだからみたいな理由(だったと思う)で、LT からのスタートに予定変更になっていた。でも、開会のタイミングでは到着していたので、元通りの発表順でも間に合ったかも知れない。ただ、LT で始まり、通常の勉強会の雰囲気が作られた後で CTO の発表という順番は、意外と良かったのかも知れない。

【追記】到着遅れという話じゃなくて、最初から場の空気を感じてもらう意図での順番変更だったそうです。さすが。

各 LT の発表後、Shay さんから積極的に Question を投げてたし、そういう場の空気を感じてから発表するのは、彼にとってもやりやすかったんじゃないかなぁと勝手に思ったりした。どうせなら話した後に満足感を得て頂きたいしねぇ。そういう意味では、まともに英語が聴き取れない参加者だったオレは、彼に満足感を与えられないのであった。まったく申し訳ない。

ということで、各感想など。

Elasticsearch and Recruit Technologies Co., Ltd.

会場提供して頂いているリクルートテクノロジーズさんでどのように Elasticsearch を使っているかの話。

Elasticsearch を選択したのは、その簡易性にあったとか。スケールが楽だし、レプリカがあり障害時の対応も楽という話。発表後の会場からの質問で「大規模利用で苦労したことは?」との答えが「いまのところ特に無い」だったところからもシステムの信頼性の高さが伺えた。

また、検索に関して、複数のインデックスを作れるところも魅力だとか。形態素解析だけ、N-gram だけ、ではなく、それらを組み合わせて検索ができるところが良いそうだ。「ハイブリッドインデックス」と呼んでいた。

ただこれだけではなく、検索用に静的および動的な独自スコアを付けて、そのヒット率を上げているとか。静的なスコアは、ユーザのログやコンテンツを Hadoop で集計し、Elasticsearch へ保存しておく。動的なスコアは、クエリ内容によって可変させる仕組みを作っているそうだ。ひとつのクエリを実行する前に、そのクエリに対応するファクター(要因)を検索し、そのファクターを利用したクエリに書き換えて検索を実行するなどの方式を取っているみたい。

この辺りの挙動はプラグインで行なっているんだとか。自作、かな。

Elasticsearch as a DMP

インティメート・マージャーさんの DMP で Elasticsearch をどのように使っているかという話。少し前に別の流れでこの会社名を聞いていて、その後にこの勉強会で発表があると聞いてビックリしていた。

Elasticsearch には 3.6 億レコードを入れて利用中とのこと。DMP なので、複数のデータソースから各種ログなどをインプット要素にしており、それらを KVS などで JOIN した後のデータを Elasticsearch へ入れているそうだ。

サンプルのデータ構造としてはこんな感じのだった(まだスライド公開されていないので、実況ツイートと記憶で書いている)。

_id segment keyword user_agent area org
1 [aaa,bbb] [xxx,yyy] Safari Tokyo Ad service

こういったデータから「女性で東京に住んでいる人」や興味・関心などの条件で絞り込みを行い、広告配信システムへ引き渡す使い方を行なっている。

また、特徴抽出のような機能もあり、例えば「Elasticsearch というキーワードで抽出される人たちの業種」というと広告業界が多く、更にその中でもサイバーエージェントの人が多いみたいなところまで分かるんだとか。

これらの QPS を特に測ったりはしていないそうだけど、ID を抽出するようなクエリの場合、数千万件(の結果?)でも1秒かからないレベルだそうだ。

どのくらいのノード数でこれを実現しているのか知りたいな(発表内にあって聞き漏らした可能性あり)。

Real-time social big data analytics using elasticsearch

ホットリンクさんのサービスで Elasticsearch を使っている話。ソーシャルメディアなどのデータを一般的な企業でも使いやすいように加工して利用してもらうサービスを運営しているとのこと。

ソーシャルメディア上の書き込みをテキストマイニングして、その発言がポジティブなのかネガティブなのかを判定したり、どの年齢層が多いのか、どの位置情報が多いのかを調べたり、拡散した元の発言者(インフルエンサー)が誰なのか?を知ることができるのだとか。また、時系列の過去データを利用して、これから流行る商品や株価の行方などの未来予測なども行えるサービスもやっているそうだ。

そういうサービスでなぜ Elasticsearch を使うことになったのかというと、データ量の増大があったり、他言語化やリアルタイム性の要求が大きくなったからとのこと。

データの流れとしては、ソーシャルメディアのデータをクローラーやストリームで MySQL や S3 にいったんストアし、そのストアしたデータを Elasticsearch へ入れているとのこと。直接 Elasticsearch へ入れていないのは、データロストを心配していまのところこの形になっているみたい。あと、一次受けで MySQL を使っているのは、旧来のシステムがまだ残っているからだそうだ。ちなみに旧システムは、Senna で形態素解析をやっていたので、同じく形態素解析が使える Elasticsearch + kuromoji は相性が良かったみたい。

ノード数については、30ノードと話していた気がする。

Elasticsearch in Hatena Bookmark

はてなブックマークでの Elasticsearch の使い方の話。はてブの検索エンジンは、MySQL → Sedue → Solr → Elasticsearch と移ってきているそうだ。

Elasticsearch は、全体で3クラスタを利用しており、それぞれユーザー(の検索?)用とバッチ処理用、(システムの?)ログ用になっている。

はてブでの検索用途では、タグやタイトル検索には普通にキーワード検索やソート、フィルタなど。本文検索には「コンセプトサーチ」と言っていた気がするけど、ちょっと良くわからず。「他社製品名に聞こえるよね」みたいな声も会場から上がってたけど、ちょっと分からない。

Term Vector API を使って(?)、検索用語に味付けをして、より精度の高い検索結果を出しているような話だった気がするけど、ちょっとうまく思い出せない。

特集記事みたいなものは、はてブの編集さんがまとめているのだけど、ここに掲載するための Query DSL を編集さんに書かせるのは難しいので、それ用の管理画面を用意して使ってもらっているそうだ。管理画面をポチポチしていくと、裏側でクエリを組み立てているそうだ。

「どのくらいのノード数で使っているか?」という質問が相変わらず出てくるんだけど、「メインクラスタ9台」という話だった。

About Elastic and Elasticsearch

さて、今回の目玉、CTO の Shay さんの話。スライドは無く、会場からの質問ベースのやりとり。ここからオレの実況ツイートは途絶えている。いや、聞き取れる単語はあるし、だいたい何を言っているかの雰囲気は分かるんだけど、詳細はまったく頭に入ってこない。

英語が、英語が、英語が……

それでも @yusuke さんが同時テキスト通訳をしてくれていたので、理解できるところは理解できた。いや本当にありがたかった。

この話の中で、いくつか気になった点だけ箇条書きでピックアップして書いておく。

  • Elasticsearch をデータソースとして Apache Spark が動くみたいな話が気になった
    • Spark SQL で Elasticsearch 内のデータが引っ張れるってことかな?
  • 「PostgreSQL と同じようにデータの信頼性を持てるようにしたい」みたいな発言があった
    • PostgreSQL 好きとしてはなんか嬉しかった

どこかの発表の時に 2.0 で入る「Pipeline Aggregations のリンク」が紹介されていて辿っていったのだけど、master 版のリファレンスには、もう 2.0 で拡張予定の機能がドキュメント化されているんだね。いつも 1.6 とか 1.7 版のリファレンスしか見てなかったから気づいていなかった。

あと、その Pipeline Aggregations に含まれる機能は、もしかしたら、使いたかった機能かも知れないので、これから読み進めようと思っている。

はー、 Elasticsearch いいわぁ。


2015-07-27 [長年日記]

[Pebble] Pebble で emoji を表示する方法がガイドに追加されていた

いつものように Pebble のデベロッパーガイドを眺めていたら、Font Resources のページに「Using Emoji Fonts」の項目が増えていることに気が付いた。

簡単に言うとテキストを出力する際に次のように、絵文字のコードポイントを指定してやれば良いってことだ。

text_layer_set_text(s_layer, "Smiley face: \U0001F603");

まぁ、この方法だと、絵文字に限らずユニコードのコードポイントなら指定可能っぽいね。表示されるかどうかは、そのとき使っているフォントに依存する感じ。

前述のガイドだと、Pebble の下記のシステムフォントに絵文字が入っているとのこと。ただし、全ての絵文字が含まれている訳ではないそうだ。

  • Gothic 24
  • Gothic 24 Bold
  • Gothic 18
  • Gothic 18 Bold

ガイドに掲載されているサンプルコードにシステムフォント(FONT_KEY_GOTHIC_24_BOLD)の指定を加え、こんな感じのソースでビルドしてみる。

text_layer = text_layer_create((GRect) { .origin = { 0, 70 }, .size = { bounds.size.w, 24 } });
text_layer_set_font(text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));
text_layer_set_text(text_layer, "Smiley face: \U0001F603");

すると、初代 Pebble 系(Aplite)でも Pebble Time 系(Basalt)でも絵文字が表示できた。Aplite の表示位置がアレなのは、プラットフォームによる表示領域の違いを考慮していないソースだから。

Pebble (Aplite) Pebble Time (Basalt)
pebble-aplite pebble-basalt

カラーが使えるはずの Pebble Time でも絵文字がモノクロなのは、Text Layer の文字色が単色しか指定できないというシステム制限があるのでそういうものだと思う。

それとは別に、フォントを FONT_KEY_GOTHIC_24 に変えてみると、豆腐文字になってしまった。

Pebble (Aplite) Pebble Time (Basalt)
pebble-aplite-tofu pebble-basalt-tofu

ガイドでは、FONT_KEY_GOTHIC_24 でもサポートしているみたいに読めたけど、ドキュメントが違うのか、実装が違うのか。。。

何にせよフォント依存が大きい処理なので、使う場合はいろいろ試してみるか、Using a Cusom Fontで説明されているカスタムフォントで対応するかという感じかな。


2015-07-26 [長年日記]

[] 「プリディスティネーション」を観た

ちょっと疲れが出ていたので、体調を整えるために自宅でゴロゴロ。まぁ、暑くて外に出る気がしなかったのもある。なんかちょっと映画を観たいなという気分もあったので、ひさびさに AppleTV を起動して映画をブラウズ。上位のほうにいた「プリディスティネーション」を借りて観た。

プリデスティネーション ブルーレイ&DVD セット (初回限定生産/2枚組) [Blu-ray]

タイムパラドックスのSFモノって感じだから観てみたんだけど、その情報がある故に「あぁ、これがこうなってこうなるのかな?」という予測をしながら観てしまい、結果そのとおりの結末になってしまった。

映像の感じとかは好きな雰囲気なので悪くはないんだけど、もっと何も考えずに観れば良かったかな。驚きが無くなってしまって満足度が下がってしまった。