徒然日記 – Chrome拡張を作る環境整えたり(generator-chrome-extension)

所要で外出。多少涼しくなったとはいえ、日中外出するとなかなか体にこたえる。

Chrome拡張を久しぶりに作ってみたい気になってきたので以下のページを参考にしながら環境を整えたりしていた。

qiita.com

github.com

小さく何かを作り続けることはどの様な立場になっても継続して続けていきたいなと思っているのだが、なかなか。

9月のカレンダー

壁紙に設定中。iPhoneを見るたびに癒やされてる。

徒然日記

夕食に某焼肉チェーン店へ。

普通に美味しいのでとても満足。ささやかに幸せなことをずっと大切にしていきたいと最近切に思う。

徒然日記

所用あって日中は外出。意外と日が当たると暑い。

永遠と社会人になって以来、悩み続けているノート問題。twitterのタイムラインで下のツールが紹介されているのを見たので試しに入れてみた。個人的にMac上でメモを取るときはサーバーサイドに保管される必要もなく、Markdownなどでカジュアルにかけるといいなと思っていてエディタで素朴に書いていたのだけど、これなら使ってみても良いかなと少し触ってみた感想としては持ったので使ってみようかと思った。

b00st.io

自宅に戻ってからはひたすら今仕事で携わっているサイトを眺め続けていた。

渋谷の鳥竹へ行った

渋谷で勤務するようになってから数年過ぎているのだけど、お昼ごはんでは何度か入店していた鳥竹に初めて行った。

r.gnavi.co.jp

焼き鳥は1本300円〜 で少し高く感じるがどれも大きいので食べごたえ十分。一般的な焼き鳥屋さんの勢いで注文するときっと多い。

焼き鳥数本、冷やしトマト、軟骨の唐揚げなどを注文。軟骨の唐揚げもよくある小粒になった状のものがでてくるのかとおもいきや軟骨が串にさされたものがそのまま揚げられていて食べごたえあって非常によかった。

生ビールのジョッキも「中ジョッキ」が正統派の中ジョッキ。

最近の居酒屋さんでよくあるのが中ジョッキと称しておきながら明らかに内容量少ないだろうと思わず異議申し立てをしたくなるようなものではなく、キチンキチンとした中ジョッキで非常に好印象*1

別途瓶ビールもあってこちらはサッポロラガーが置いてある。たまには喉越しを楽しむビールではなく素朴に苦さや旨味を味わえるサッポロラガーが呑みたくなる。*2

@hika69google play musicが今あったらREMP作ってなかったという話やPHPのビルドの話、facebookgoogleAppleの3つの会社の違いの話、SEO戦略からWordPressの話、そして大乗仏教からの親鸞の話、八角を使った中華料理の話まで非常に幅広い話をしながら日は過ぎていくのであった。

f:id:hideack:20160904144318p:plain

*1:個人的には居酒屋の中ジョッキ問題と呼んでいる

*2:もちろんキリンでも可

2016年8月に読んだ本を振り返る

結局夏休み中に読んだだけになってしまった。

余裕が無いと本すら読まなくなってしまうので本を読む程度の余裕を持って人生過ごしたい。


hideackの本棚 - 2016年08月 (4作品)
powered by Booklog

徒然日記

社内ISUCONが開催されていて観覧者用のUIからスコアが上下する様子を見ていたりした。直近開発に打ち込んでいるところもないので参加はしなかったのだけど、逆に観覧者として見ているとエンジニア以外の職種の人にこの様子を伝えてみると面白いかもなと少し思っていた。

そうすることで日頃エンジニアが機能の開発・サービスの開発以外のところのどの部分が気になっていて改善しようとする時間を取りたいと感じているのかというのが少しでも共有できるのではないかと思ったり。まだ具体的にどういったみせかたをするのが、わかりやすいのかといったところが浮かばないが。

昼食に同部署のデザイナーと外に出て何故かARMの話で盛り上がった。

関東地方、台風の影響無かったが北海道・東北方面が心配。

nroongaを使ってデータストアして全文検索するまで

昨日の続き。

繰り返しになるが、解決したい課題と現状は、

  • 数ギガサイズのアクセスログがある
  • 上記に対して数万パターンの文字列それぞれが何回出現するかを数え上げたい

という状況。なので、このログファイルをngroongaを介してgroongaのデータベースを新規作成し、そこに格納してみる。

もちろん事前にGroongaのインストールが必要なのでインストールする。Macであればbrewでインストールすることができる。

$ brew install groonga

で、次に、

  • Groonga DB作成
  • DBへデータを格納するためのテーブル作成
    • 今回はシンプルに1テーブルにbodyという1カラムを作ってそこにアクセスログ1行分を格納する
  • 上記のテーブル中のカラムを全文検索するための語彙表(インデックス)用のテーブル作成
  • テキストファイルベースのログファイルを格納

という上記の一通りの作業は以下のコードで実現できる。

var nroonga = require('nroonga'),
byline = require('byline'),
fs = require('fs');
var db = new nroonga.Database('db/accesslog');
db.commandSync('table_create Logs TABLE_NO_KEY');
db.commandSync('column_create Logs body --type Text');
db.commandSync('table_create', {'name':'LogIndexes', 'flags':'TABLE_PAT_KEY',  'key_type':'ShortText', 'default_tokenizer':'TokenBigram', 'normalizer':'NormalizerAuto'});
db.commandSync('column_create', {'table':'LogIndexes', 'name':'body_index', 'flags':'COLUMN_INDEX|WITH_POSITION', 'type':'Logs',  'source':'body'});
var stream = fs.createReadStream('access.log', { encoding: 'utf8' });
stream = byline.createStream(stream);
stream.on('data', function(line) {
var log = JSON.stringify([
{'body':line}
]);
db.commandSync("load", {'table':'Logs', 'values': log});
});
stream.on('finish', function(){
console.log("Finish parse log file.");
db.close();
});

上記の格納が完了した後*1、実際に格納した情報にたいして全文検索するには以下の様に select のクエリを発行する。limit:0 を指定することでGroongaでは件数のみを取得できるので、例えば今回格納したログファイル中に「Windows」という文字列が何回出現したかということを得たい場合は以下の様な形になる。

var nroonga = require('nroonga');
var db = new nroonga.Database('db/accesslog');
var res = db.commandSync('select', {'table': 'Logs', 'match_columns':'body', 'query': 'Windows', 'limit':0});
console.log(res);
//=> [ [ [ 1869923 ], [ [Object], [Object] ] ] ] 

かなり気楽に全文検索できる状態を作れる。最初スクリプトgrepツールで解決しようと思ったが少し時間がかかりすぎなところがあったので対象を絞ることを考えていたりしたが自分が解決したかったことは解決できそう。

例えばサービスの方針等々を検討する際の数値集めが簡単に行える様にするためにログ基盤を整える等が最も正しい解決策だとは思うのだが、ひとまず何かしらログが残されていれば手元にこういった環境を作って調べてみるのも一つのやり方かなと思う。

参照

GitHub - nroonga/nroonga: A library for building Groonga powered nodes

Groonga - カラムストア機能付き全文検索エンジン

*1:ちなみにGroongaのDBとして作られたファイルのサイズは投入したアクセスログのサイズが1.8Gbyteに対して、4.3Gbyteになった。

外は雨なのでnroongaと戯れつつ「やわらなか生命」を読む – 徒然日記

東京は朝から雨。

空いた時間でnroongaと戯れる。

f:id:hideack:20160828103417p:plain:w300

nroongaはNode.js用のGroongaバインディング全文検索エンジンのGroongaをライブラリとして利用できる。よって検索のプロセス自体はNode.jsが担うことになる。

手元にとあるサーバーのログがあって、それに対して対象とする文字列にマッチする行をカウントする的なことをしたくなったのだけど、サイズが数ギガ単位で微妙に大きいのとマッチングしたい対象文字列が多いので、であれば全文検索エンジンに一度該当ログを突っ込んでから多様な条件でカウントさせればいいのではということを試してみている。なんで今、Groongaなのかと問われれば「使ったことがないから」。

案外もしかしたらもっとお手軽ソリューションあるのかもしれないけど、目の前の課題を解決するための方法としてはありなのかなと思う次第。

気分転換するときはやわらかな生命を読む。「シンプルな均衡」という文章が掲載されているのだけど、アンバランスなシステムに関する提言はなるほど感があった。

エネルギーをできるだけ等身大の、生命に親和的な方法で得ること。ヘロンの公式の美しさは、そのシンプルな均衡にある。近代が推し進めてきた方法の美醜が、いまあらためて問い直されているのだと福岡ハカセは思う。

福岡伸一, やわらかな生命 p.48

世の中の万物のシステムは何かしらのエネルギー(経済活動としての対価も含む)を得る目的で運営されている以上、アンバランスな体のまま何かしらを得ることは何事も難しいのかもしれないということを端的に表現した文章だなと思った。

特定単語のGoogle検索順位をSlackなどに通知したりGoogle analyticsに記録したりする

タイトルが全てシリーズ。

google-search-rankというnpmを作った - テノニッキ (@hideack 's diary)というエントリで書いたとおり検索語に対する特定サイトの検索順位を取得できる様なnpmを作ったので弊作のevacの入力として指定できる様にしました。

例えば、

in:
searchrank:
key: "(google custom search API key)"
cx: "(google custom search engine ID)"
site: pickup.calamel.jp
maxPage: 5
format: ":google: 検索語「__word__」 = __rank__位"
word:
- "よしざわ窯"
out:
ikachan:
url: http://*********
join: false
channel: "#hideack"
message: "__word__"

という設定をYAMLで定義してevacに渡すと指定したSlackのチャンネルに

f:id:hideack:20160820214103p:plain

といった具合でSlack通知させることができます。

Slack以外にも出力としてGoogle analyticsへ順位をアウトプットすることもできるので、そうすると検索順位と実際にサイトのPV等をまとめて管理できるのできっと便利。少なくとも自分は便利。