SlideShare a Scribd company logo
1 of 35
Download to read offline
GroongaとTwitter StreamAPI 
で 
お手軽データ解析 
2014/09/04 
ConoHa presents - Groonga "How-To" Talks
自己紹介 
• 斉藤弘信(@hironobu_s) 
• 開発&インフラ屋 
• 所属:GMOインターネット 
最近ConoHaの中の人になりました
あらすじ 
• このイベントの雑用係として打ち合わせに参加 
• そこにいたGroongaの方とSennaの話をする 
• 登壇<= イマココ
今日やること 
• github.com/gc37/20140904-groonga 
• Groonga初心者の体験談 
• Twitter StreamAPIを使ってデータを収集 
• Groongaにストア+ちょっとしたデータ解析 
• PHP + GroongaHTTPサーバ 
• インフラとしてConoHa VPS(CentOS6.5)
Twitter Steraming API 
• HTTPで接続すると永遠にツイートデータが流れ 
てくる 
• 流れてくるのは全ツイートの1%程度のサンプル 
• 接続するエンドポイントによってとれる情報が違 
う 
• 今回は日本(lang=ja)を指定して取得してみた。
今回作ったもの
PHPとGroonga 
• GroongaのHTTPサーバを使用 
• PHPからはcURLでアクセス 
• 簡易的なGroongaアクセスクラスを書いた 
(groonga.php) 
• Mroongaの方が簡単だったか・・・
• github.com/gc37/20140904-groonga 
使用例 
<?php 
require_once 'groonga.php'; 
$groonga = new Groonga('localhost', 10041); 
$cond = [ 
'table' => 'TableName', 
'match_columns' => 'test_col', 
'query' => 'hoge', 
'limit' => 10, 
'offset' => 0 
]; 
$r = $groonga->execute('select', $cond); 
// ヒット数 
var_dump($r->count); 
// 列情報 
var_dumP($r->headers); 
// 実行結果 
var_dumP($r->results); 
example.php
• インスタンスを作る 
• 実行するコマンドのパラメータを配列にする 
• コマンド名を渡してexecute()メソッドを叩く 
• いじょう
実行結果 
int(161) <=== ヒット数 
array(10) { <=== 検索結果 
[0]=> 
array(7) { 
["_id"]=> 
int(90032) 
["created_at"]=> 
float(1408890604) 
["date"]=> 
string(10) "2014-08-24" 
["name"]=> 
string(11) "hiroshi5s38" 
["screen_name"]=> 
string(36) "レンタルサーバーの選び方" 
["source"]=> 
string(11) "sakura_blog" 
["text"]=> 
string(106) "『サーバーの悩み』レンタルサーバー比較- サービスの比…|http://t.co/j1AtQfUXOL" 
} 
• ヒット数、列情報、実行結果がオブジェクトで返る 
• 実行結果が連想配列になる
実装 
• github.com/gc37/20140904-groonga 
/** 
* Groongaサーバにリクエストを送信して、結果をJSONで返す 
* 
* @param string $cmd コマンド名 
* @param array $params コマンドに渡すパラメータ配列 
* @return array 
*/ 
private function sendRequest($cmd, $params = []) 
{ 
$url = sprintf('http://%s:%d/d/%s', $this->host, $this->port, $cmd); 
$url .= '?' . http_build_query($params); 
// リクエストを送信 
$curl = $this->initializeCurl(); 
curl_setopt($curl, CURLOPT_URL, $url); 
$body = curl_exec($curl); 
if( ! $body) { 
throw new RuntimeException('HTTP Request fail.'); 
} 
// レスポンスをデコードする 
$json = json_decode($body, true); 
if( ! $json) { 
throw new RuntimeException('Incorrect datatype for JSON.'); 
} 
// この要素が0未満の場合はコマンド実行失敗で、[0][3]にメッセージが入るっぽい。 
if($json[0][0] < 0) { 
throw new RuntimeException($json[0][3]); 
} 
return $json; 
}
• PHPは便利機能だらけなので、Groonga HTTPク 
ライアントがすぐ作れる 
• http_build_query: QueryStringを作ってくれる 
• cURL: HTTPのことは全部面倒見てくれる 
• json_decode: JSON文字列を連想配列に変換
データ取得スクリプト概要 
• twapi_streaming.php 
• Phirehoseライブラリを使わせていただいた 
(https://github.com/fennb/phirehose) 
• StreamingAPIからのJSONデータをパースして 
Groonga用のJSONオブジェクトを作る 
• 自作GroongaクラスとPhirehoseクラスの合わせ技
Phirehoseライブラリの使い方 
<?php 
require_once 'phirehose/lib/Phirehose.php'; 
require_once 'phirehose/lib/OauthPhirehose.php'; 
// OAuth 
$access_token = '************************************************'; 
$access_token_secret = '******************************************'; 
class TestStream extends OauthPhirehose 
{ 
public function enqueueStatus($status) 
{ 
// ここに実装を書くだけ 
// $status が1ツイートのJSONデータになっている 
// 
// また今回の場合、自動的に以下のエンドポイントが選択される 
// https://stream.twitter.com/1.1/statuses/filter.json 
} 
} 
$s = new TestStream($access_token, $access_token_secret); 
$s->setLang('ja'); 
$s->consume();
Groongaへの保存 
<?php 
• twapi_streaming.php 
// Groongaにデータを保存する 
// $dataはツイートオブジェクト 
$tweet = [ 
'_key' => $data->id_str, 
'text' => $data->text, 
'source' => $data->source, 
'name' => $data->user->name, 
'screen_name' => $data->user->screen_name, 
'created_at' => $time 
]; 
if($data->geo != null) { 
$geo = $data->geo->coordinates[0] . 'x' . $data->geo->coordinates[1]; 
$tweet['geo'] = $geo; 
} 
$data = [ 
'table' => 'TwSource', 
'values' =>json_encode([ $tweet ]) 
]; 
$r = $this->groonga->execute('load', $data);
Groonga側の構成
インデックス作成 
• ツイートデータをTwSourceテーブルに保存 
• textカラムにツイート本文が含まれる 
• このカラムに全文検索インデックスを設定
<?php 
$g = new Groonga('localhost', 10041); 
// 既存テーブル削除 
try { 
$params = [ 
'name' => 'TwIndex' 
]; 
$g->execute('table_remove', $params); 
} catch(Exception $e) {} 
// インデックステーブルを作成 
$params = [ 
'name' => 'TwIndex', 
'flags' => 'TABLE_PAT_KEY|KEY_NORMALIZE', 
'key_type' => 'ShortText', 
'default_tokenizer' => 'TokenMecab', 
]; 
$g->execute('table_create', $params); 
// インデックスカラムを作成 
$params = [ 
'table' => 'TwIndex', 
'name' => 'text', 
'flags' => 'COLUMN_INDEX|WITH_POSITION', 
'type' => 'TwSource', 
'source' => 'text' 
]; 
$g->execute('column_create', $params);
• ここはGroongaドキュメントの通り 
• 自作Groongaライブラリを通してインデックスを 
作成する 
• 今回はトークナイザにMeCabを使用した
データ分析スクリプト概要 
• select1.php, select2.php 
• 簡単な分析をする 
• 対象は8/24〜9/2までのツイートデータ4,380,001 
件 
• (ただし8/29、8/29、8/30の一部は事故で取得失敗・・・) 
• キーワードの出現頻度を見てみましょう
急上昇ワード 
• Yahoo急上昇ワードに登場するワードを、今回の 
解析基盤で調べてみます。 
• 8/25(火) PSN障害(ゲーム) 
• 8/26(水) ランドクルーザー(車) 
• 8/27(木) ヨンア(モデル)、芝幸太郎(実業家)
[hiro@MBP]# ./select_burst.php PSN障害 
2014-08-24: 15 
2014-08-25: 16 
2014-08-26: 12 
2014-08-27: 2 
2014-08-28: 0 
2014-08-29: 0 
2014-08-30: 0 
2014-08-31: 0 
2014-09-01: 0 
[hiro@MBP]# ./select_burst.php ランドクルーザー 
2014-08-24: 0 
2014-08-25: 84 
2014-08-26: 20 
2014-08-27: 5 
2014-08-28: 4 
2014-08-29: 0 
2014-08-30: 0 
2014-08-31: 1 
2014-09-01: 5 
[hiro@MBP]# ./select_burst.php ヨンア 
2014-08-24: 0 
2014-08-25: 2 
2014-08-26: 209 
2014-08-27: 29 
2014-08-28: 14 
2014-08-29: 0 
2014-08-30: 0 
2014-08-31: 0 
2014-09-01: 2 
[hiro@MBP]# ./select_burst.php 芝幸太郎 
2014-08-24: 0 
2014-08-25: 0 
2014-08-26: 135 
2014-08-27: 10 
2014-08-28: 1 
2014-08-29: 0 
2014-08-30: 0 
2014-08-31: 0 
2014-09-01: 0 
25日 
26日 
27日
時事ワード 
• デング熱 
• 急性の熱性感染症。戦後初の国内感染を確認 
• ↑このニュースが出たのが27日 
[hiro@MBP]# ./select_burst.php デング熱 
2014-08-24: 0 
2014-08-25: 0 
2014-08-26: 0 
2014-08-27: 332 
2014-08-28: 756 
2014-08-29: 0 
2014-08-30: 0 
2014-08-31: 38 
2014-09-01: 837 
(29日、30日、31日はデータ取得失敗)
まとめ
Groongaは速かった 
• Senna経験者で今回初めてGroongaを触った人の感想です 
• とにかく速い。インデックスにあるカラムなら400万件でも一 
瞬で結果が返る 
• データが小さい。メモリに全部載る(今回のデータで3.7GB) 
• 全文検索インデックスの作成がずいぶん短い。最初はほんとに 
作られてるのか疑った。 
• HTTPサーバは簡単にプログラムが書けたので助かった。オー 
バーヘッドがあるかも?
時間がなくて試せなかった 
• suggestプラグインで補完、提案を試したい 
• Mroonga 
• Geoデータ(ツイートには結構、緯度経度が入ってた)
ご清聴 
ありがとうございました
宣伝
ConoHaリニューアルしました
オブジェクトストレージ 
容量無制限、転送量課金無し、今日から使えます 
月額450円/100GB
ブログ書いてます
ConoHa支援プログラム
もちろんVPSも
20140903groonga発表資料
ConoHaを始めてみよう 
• https://www.conoha.jp/ 
• 全員1500円分のクーポン付き 
• さらに来場者限定で 
3000円クーポン 
• 併せて4500円分使えます! 
• VPSでもオブジェクトストレージで 
も使えます! 
• ストレージだけなら10ヶ月使えます 
! 
おわり

More Related Content

What's hot

gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectgumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectSadayuki Furuhashi
 
パケット解析ノススメ
パケット解析ノススメパケット解析ノススメ
パケット解析ノススメ彰 村地
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Jun Ohtani
 
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigiComplex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigiSATOSHI TAGOMORI
 
45分で理解する webクローリング入門 斉藤之雄
45分で理解する webクローリング入門 斉藤之雄45分で理解する webクローリング入門 斉藤之雄
45分で理解する webクローリング入門 斉藤之雄Yukio Saito
 
JSON Based Web Services
JSON Based Web ServicesJSON Based Web Services
JSON Based Web ServicesToru Yamaguchi
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎Naruhiko Ogasawara
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサーnakamura001
 
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」de:code 2017
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説Shoken Fujisaki
 
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについてAndroidの通信周りのコーディングについて
Androidの通信周りのコーディングについてShoichi Takagi
 
フレッシャーズのためのパケット解析入門
フレッシャーズのためのパケット解析入門フレッシャーズのためのパケット解析入門
フレッシャーズのためのパケット解析入門彰 村地
 
Webスクレイピング用の言語っぽいものを作ったよ
Webスクレイピング用の言語っぽいものを作ったよWebスクレイピング用の言語っぽいものを作ったよ
Webスクレイピング用の言語っぽいものを作ったよTakaichi Ito
 
PHPの今とこれから 2013
PHPの今とこれから 2013PHPの今とこれから 2013
PHPの今とこれから 2013Rui Hirokawa
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo dbYuji Isobe
 
Firefox Add-on SDK 入門
Firefox Add-on SDK 入門Firefox Add-on SDK 入門
Firefox Add-on SDK 入門Shoot Morii
 
Fluentd+MongoDB+Groovy
Fluentd+MongoDB+GroovyFluentd+MongoDB+Groovy
Fluentd+MongoDB+GroovyDaisuke Ando
 

What's hot (20)

gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectgumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack Project
 
パケット解析ノススメ
パケット解析ノススメパケット解析ノススメ
パケット解析ノススメ
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
 
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigiComplex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
 
45分で理解する webクローリング入門 斉藤之雄
45分で理解する webクローリング入門 斉藤之雄45分で理解する webクローリング入門 斉藤之雄
45分で理解する webクローリング入門 斉藤之雄
 
MongoDB
MongoDBMongoDB
MongoDB
 
JSON Based Web Services
JSON Based Web ServicesJSON Based Web Services
JSON Based Web Services
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎
 
実践スクレイピング
実践スクレイピング実践スクレイピング
実践スクレイピング
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
 
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説
 
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについてAndroidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
 
フレッシャーズのためのパケット解析入門
フレッシャーズのためのパケット解析入門フレッシャーズのためのパケット解析入門
フレッシャーズのためのパケット解析入門
 
Webスクレイピング用の言語っぽいものを作ったよ
Webスクレイピング用の言語っぽいものを作ったよWebスクレイピング用の言語っぽいものを作ったよ
Webスクレイピング用の言語っぽいものを作ったよ
 
HTTP入門
HTTP入門HTTP入門
HTTP入門
 
PHPの今とこれから 2013
PHPの今とこれから 2013PHPの今とこれから 2013
PHPの今とこれから 2013
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo db
 
Firefox Add-on SDK 入門
Firefox Add-on SDK 入門Firefox Add-on SDK 入門
Firefox Add-on SDK 入門
 
Fluentd+MongoDB+Groovy
Fluentd+MongoDB+GroovyFluentd+MongoDB+Groovy
Fluentd+MongoDB+Groovy
 

Similar to 20140903groonga発表資料

⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5Nishida Kansuke
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までMasahiro Wakame
 
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料Junichi Ishida
 
ネットワーク超入門
ネットワーク超入門ネットワーク超入門
ネットワーク超入門xyzplus_net
 
長いの
長いの長いの
長いのemasaka
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜Takahiro Inoue
 
HTMLからの本文抽出
HTMLからの本文抽出HTMLからの本文抽出
HTMLからの本文抽出Lintaro Ina
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!do_aki
 
TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介ao27
 
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法Hiroki Mizuno
 
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)parrotstudio
 
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会yoshinori matsumoto
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナーTakahiro Iwase
 
クラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccampクラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccampMasahiro NAKAYAMA
 

Similar to 20140903groonga発表資料 (20)

⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
 
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料
 
Haikara
HaikaraHaikara
Haikara
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
ネットワーク超入門
ネットワーク超入門ネットワーク超入門
ネットワーク超入門
 
長いの
長いの長いの
長いの
 
Ingress on GKE/GCE
Ingress on GKE/GCEIngress on GKE/GCE
Ingress on GKE/GCE
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
 
HTMLからの本文抽出
HTMLからの本文抽出HTMLからの本文抽出
HTMLからの本文抽出
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
 
TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介
 
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法
 
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
 
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナー
 
クラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccampクラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccamp
 

More from Hironobu Saitoh

パブリッククラウドConoHaを使ってOpenStack APIを理解する
パブリッククラウドConoHaを使ってOpenStack APIを理解するパブリッククラウドConoHaを使ってOpenStack APIを理解する
パブリッククラウドConoHaを使ってOpenStack APIを理解するHironobu Saitoh
 
出張このべん in 大阪
出張このべん in 大阪出張このべん in 大阪
出張このべん in 大阪Hironobu Saitoh
 
このべん第5回 ConoHaでWordPressのお勉強!
このべん第5回 ConoHaでWordPressのお勉強!このべん第5回 ConoHaでWordPressのお勉強!
このべん第5回 ConoHaでWordPressのお勉強!Hironobu Saitoh
 
ConoHaにおける オブジェクトストレージの 利用動向
ConoHaにおける オブジェクトストレージの 利用動向ConoHaにおける オブジェクトストレージの 利用動向
ConoHaにおける オブジェクトストレージの 利用動向Hironobu Saitoh
 
ConoHa VPSの コマンドラインツールを作った
ConoHa VPSの コマンドラインツールを作ったConoHa VPSの コマンドラインツールを作った
ConoHa VPSの コマンドラインツールを作ったHironobu Saitoh
 
フロントエンドの人にも知ってもらいたいサーバーの話
フロントエンドの人にも知ってもらいたいサーバーの話フロントエンドの人にも知ってもらいたいサーバーの話
フロントエンドの人にも知ってもらいたいサーバーの話Hironobu Saitoh
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったHironobu Saitoh
 
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけ
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけクラウドのようなVPS 「ConoHa」 を使ってみよう +おまけ
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけHironobu Saitoh
 
クラウドのようなVPS 「ConoHa」 を使ってみよう。
クラウドのようなVPS 「ConoHa」 を使ってみよう。クラウドのようなVPS 「ConoHa」 を使ってみよう。
クラウドのようなVPS 「ConoHa」 を使ってみよう。Hironobu Saitoh
 
OpenSSHの認証に証明書を使う
OpenSSHの認証に証明書を使うOpenSSHの認証に証明書を使う
OpenSSHの認証に証明書を使うHironobu Saitoh
 
Unityのバックエンドに
ConoHaオブジェクトストレージ を使う
Unityのバックエンドに
ConoHaオブジェクトストレージ を使うUnityのバックエンドに
ConoHaオブジェクトストレージ を使う
Unityのバックエンドに
ConoHaオブジェクトストレージ を使うHironobu Saitoh
 
オブジェクトストレージを使ってイメージビューアを作ってみる
オブジェクトストレージを使ってイメージビューアを作ってみるオブジェクトストレージを使ってイメージビューアを作ってみる
オブジェクトストレージを使ってイメージビューアを作ってみるHironobu Saitoh
 
レガシーPHPアプリ(10年もの)を運用している話
レガシーPHPアプリ(10年もの)を運用している話レガシーPHPアプリ(10年もの)を運用している話
レガシーPHPアプリ(10年もの)を運用している話Hironobu Saitoh
 

More from Hironobu Saitoh (14)

パブリッククラウドConoHaを使ってOpenStack APIを理解する
パブリッククラウドConoHaを使ってOpenStack APIを理解するパブリッククラウドConoHaを使ってOpenStack APIを理解する
パブリッククラウドConoHaを使ってOpenStack APIを理解する
 
出張このべん in 大阪
出張このべん in 大阪出張このべん in 大阪
出張このべん in 大阪
 
このべん第5回 ConoHaでWordPressのお勉強!
このべん第5回 ConoHaでWordPressのお勉強!このべん第5回 ConoHaでWordPressのお勉強!
このべん第5回 ConoHaでWordPressのお勉強!
 
ConoHaにおける オブジェクトストレージの 利用動向
ConoHaにおける オブジェクトストレージの 利用動向ConoHaにおける オブジェクトストレージの 利用動向
ConoHaにおける オブジェクトストレージの 利用動向
 
ConoHa VPSの コマンドラインツールを作った
ConoHa VPSの コマンドラインツールを作ったConoHa VPSの コマンドラインツールを作った
ConoHa VPSの コマンドラインツールを作った
 
フロントエンドの人にも知ってもらいたいサーバーの話
フロントエンドの人にも知ってもらいたいサーバーの話フロントエンドの人にも知ってもらいたいサーバーの話
フロントエンドの人にも知ってもらいたいサーバーの話
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
 
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけ
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけクラウドのようなVPS 「ConoHa」 を使ってみよう +おまけ
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけ
 
クラウドのようなVPS 「ConoHa」 を使ってみよう。
クラウドのようなVPS 「ConoHa」 を使ってみよう。クラウドのようなVPS 「ConoHa」 を使ってみよう。
クラウドのようなVPS 「ConoHa」 を使ってみよう。
 
OpenSSHの認証に証明書を使う
OpenSSHの認証に証明書を使うOpenSSHの認証に証明書を使う
OpenSSHの認証に証明書を使う
 
Unityのバックエンドに
ConoHaオブジェクトストレージ を使う
Unityのバックエンドに
ConoHaオブジェクトストレージ を使うUnityのバックエンドに
ConoHaオブジェクトストレージ を使う
Unityのバックエンドに
ConoHaオブジェクトストレージ を使う
 
オブジェクトストレージを使ってイメージビューアを作ってみる
オブジェクトストレージを使ってイメージビューアを作ってみるオブジェクトストレージを使ってイメージビューアを作ってみる
オブジェクトストレージを使ってイメージビューアを作ってみる
 
Conoha VPSについて
Conoha VPSについてConoha VPSについて
Conoha VPSについて
 
レガシーPHPアプリ(10年もの)を運用している話
レガシーPHPアプリ(10年もの)を運用している話レガシーPHPアプリ(10年もの)を運用している話
レガシーPHPアプリ(10年もの)を運用している話
 

20140903groonga発表資料

  • 1. GroongaとTwitter StreamAPI で お手軽データ解析 2014/09/04 ConoHa presents - Groonga "How-To" Talks
  • 2. 自己紹介 • 斉藤弘信(@hironobu_s) • 開発&インフラ屋 • 所属:GMOインターネット 最近ConoHaの中の人になりました
  • 3. あらすじ • このイベントの雑用係として打ち合わせに参加 • そこにいたGroongaの方とSennaの話をする • 登壇<= イマココ
  • 4. 今日やること • github.com/gc37/20140904-groonga • Groonga初心者の体験談 • Twitter StreamAPIを使ってデータを収集 • Groongaにストア+ちょっとしたデータ解析 • PHP + GroongaHTTPサーバ • インフラとしてConoHa VPS(CentOS6.5)
  • 5. Twitter Steraming API • HTTPで接続すると永遠にツイートデータが流れ てくる • 流れてくるのは全ツイートの1%程度のサンプル • 接続するエンドポイントによってとれる情報が違 う • 今回は日本(lang=ja)を指定して取得してみた。
  • 7. PHPとGroonga • GroongaのHTTPサーバを使用 • PHPからはcURLでアクセス • 簡易的なGroongaアクセスクラスを書いた (groonga.php) • Mroongaの方が簡単だったか・・・
  • 8. • github.com/gc37/20140904-groonga 使用例 <?php require_once 'groonga.php'; $groonga = new Groonga('localhost', 10041); $cond = [ 'table' => 'TableName', 'match_columns' => 'test_col', 'query' => 'hoge', 'limit' => 10, 'offset' => 0 ]; $r = $groonga->execute('select', $cond); // ヒット数 var_dump($r->count); // 列情報 var_dumP($r->headers); // 実行結果 var_dumP($r->results); example.php
  • 9. • インスタンスを作る • 実行するコマンドのパラメータを配列にする • コマンド名を渡してexecute()メソッドを叩く • いじょう
  • 10. 実行結果 int(161) <=== ヒット数 array(10) { <=== 検索結果 [0]=> array(7) { ["_id"]=> int(90032) ["created_at"]=> float(1408890604) ["date"]=> string(10) "2014-08-24" ["name"]=> string(11) "hiroshi5s38" ["screen_name"]=> string(36) "レンタルサーバーの選び方" ["source"]=> string(11) "sakura_blog" ["text"]=> string(106) "『サーバーの悩み』レンタルサーバー比較- サービスの比…|http://t.co/j1AtQfUXOL" } • ヒット数、列情報、実行結果がオブジェクトで返る • 実行結果が連想配列になる
  • 11. 実装 • github.com/gc37/20140904-groonga /** * Groongaサーバにリクエストを送信して、結果をJSONで返す * * @param string $cmd コマンド名 * @param array $params コマンドに渡すパラメータ配列 * @return array */ private function sendRequest($cmd, $params = []) { $url = sprintf('http://%s:%d/d/%s', $this->host, $this->port, $cmd); $url .= '?' . http_build_query($params); // リクエストを送信 $curl = $this->initializeCurl(); curl_setopt($curl, CURLOPT_URL, $url); $body = curl_exec($curl); if( ! $body) { throw new RuntimeException('HTTP Request fail.'); } // レスポンスをデコードする $json = json_decode($body, true); if( ! $json) { throw new RuntimeException('Incorrect datatype for JSON.'); } // この要素が0未満の場合はコマンド実行失敗で、[0][3]にメッセージが入るっぽい。 if($json[0][0] < 0) { throw new RuntimeException($json[0][3]); } return $json; }
  • 12. • PHPは便利機能だらけなので、Groonga HTTPク ライアントがすぐ作れる • http_build_query: QueryStringを作ってくれる • cURL: HTTPのことは全部面倒見てくれる • json_decode: JSON文字列を連想配列に変換
  • 13. データ取得スクリプト概要 • twapi_streaming.php • Phirehoseライブラリを使わせていただいた (https://github.com/fennb/phirehose) • StreamingAPIからのJSONデータをパースして Groonga用のJSONオブジェクトを作る • 自作GroongaクラスとPhirehoseクラスの合わせ技
  • 14. Phirehoseライブラリの使い方 <?php require_once 'phirehose/lib/Phirehose.php'; require_once 'phirehose/lib/OauthPhirehose.php'; // OAuth $access_token = '************************************************'; $access_token_secret = '******************************************'; class TestStream extends OauthPhirehose { public function enqueueStatus($status) { // ここに実装を書くだけ // $status が1ツイートのJSONデータになっている // // また今回の場合、自動的に以下のエンドポイントが選択される // https://stream.twitter.com/1.1/statuses/filter.json } } $s = new TestStream($access_token, $access_token_secret); $s->setLang('ja'); $s->consume();
  • 15. Groongaへの保存 <?php • twapi_streaming.php // Groongaにデータを保存する // $dataはツイートオブジェクト $tweet = [ '_key' => $data->id_str, 'text' => $data->text, 'source' => $data->source, 'name' => $data->user->name, 'screen_name' => $data->user->screen_name, 'created_at' => $time ]; if($data->geo != null) { $geo = $data->geo->coordinates[0] . 'x' . $data->geo->coordinates[1]; $tweet['geo'] = $geo; } $data = [ 'table' => 'TwSource', 'values' =>json_encode([ $tweet ]) ]; $r = $this->groonga->execute('load', $data);
  • 17. インデックス作成 • ツイートデータをTwSourceテーブルに保存 • textカラムにツイート本文が含まれる • このカラムに全文検索インデックスを設定
  • 18. <?php $g = new Groonga('localhost', 10041); // 既存テーブル削除 try { $params = [ 'name' => 'TwIndex' ]; $g->execute('table_remove', $params); } catch(Exception $e) {} // インデックステーブルを作成 $params = [ 'name' => 'TwIndex', 'flags' => 'TABLE_PAT_KEY|KEY_NORMALIZE', 'key_type' => 'ShortText', 'default_tokenizer' => 'TokenMecab', ]; $g->execute('table_create', $params); // インデックスカラムを作成 $params = [ 'table' => 'TwIndex', 'name' => 'text', 'flags' => 'COLUMN_INDEX|WITH_POSITION', 'type' => 'TwSource', 'source' => 'text' ]; $g->execute('column_create', $params);
  • 19. • ここはGroongaドキュメントの通り • 自作Groongaライブラリを通してインデックスを 作成する • 今回はトークナイザにMeCabを使用した
  • 20. データ分析スクリプト概要 • select1.php, select2.php • 簡単な分析をする • 対象は8/24〜9/2までのツイートデータ4,380,001 件 • (ただし8/29、8/29、8/30の一部は事故で取得失敗・・・) • キーワードの出現頻度を見てみましょう
  • 21. 急上昇ワード • Yahoo急上昇ワードに登場するワードを、今回の 解析基盤で調べてみます。 • 8/25(火) PSN障害(ゲーム) • 8/26(水) ランドクルーザー(車) • 8/27(木) ヨンア(モデル)、芝幸太郎(実業家)
  • 22. [hiro@MBP]# ./select_burst.php PSN障害 2014-08-24: 15 2014-08-25: 16 2014-08-26: 12 2014-08-27: 2 2014-08-28: 0 2014-08-29: 0 2014-08-30: 0 2014-08-31: 0 2014-09-01: 0 [hiro@MBP]# ./select_burst.php ランドクルーザー 2014-08-24: 0 2014-08-25: 84 2014-08-26: 20 2014-08-27: 5 2014-08-28: 4 2014-08-29: 0 2014-08-30: 0 2014-08-31: 1 2014-09-01: 5 [hiro@MBP]# ./select_burst.php ヨンア 2014-08-24: 0 2014-08-25: 2 2014-08-26: 209 2014-08-27: 29 2014-08-28: 14 2014-08-29: 0 2014-08-30: 0 2014-08-31: 0 2014-09-01: 2 [hiro@MBP]# ./select_burst.php 芝幸太郎 2014-08-24: 0 2014-08-25: 0 2014-08-26: 135 2014-08-27: 10 2014-08-28: 1 2014-08-29: 0 2014-08-30: 0 2014-08-31: 0 2014-09-01: 0 25日 26日 27日
  • 23. 時事ワード • デング熱 • 急性の熱性感染症。戦後初の国内感染を確認 • ↑このニュースが出たのが27日 [hiro@MBP]# ./select_burst.php デング熱 2014-08-24: 0 2014-08-25: 0 2014-08-26: 0 2014-08-27: 332 2014-08-28: 756 2014-08-29: 0 2014-08-30: 0 2014-08-31: 38 2014-09-01: 837 (29日、30日、31日はデータ取得失敗)
  • 25. Groongaは速かった • Senna経験者で今回初めてGroongaを触った人の感想です • とにかく速い。インデックスにあるカラムなら400万件でも一 瞬で結果が返る • データが小さい。メモリに全部載る(今回のデータで3.7GB) • 全文検索インデックスの作成がずいぶん短い。最初はほんとに 作られてるのか疑った。 • HTTPサーバは簡単にプログラムが書けたので助かった。オー バーヘッドがあるかも?
  • 26. 時間がなくて試せなかった • suggestプラグインで補完、提案を試したい • Mroonga • Geoデータ(ツイートには結構、緯度経度が入ってた)
  • 35. ConoHaを始めてみよう • https://www.conoha.jp/ • 全員1500円分のクーポン付き • さらに来場者限定で 3000円クーポン • 併せて4500円分使えます! • VPSでもオブジェクトストレージで も使えます! • ストレージだけなら10ヶ月使えます ! おわり