2015-02-09
Hatena Engineer Seminar #4 に行ってきました
2/7 に開催された、Hatena Engineer Seminar #4というイベントに 参加してきました。
Go からインフラっぽい話からモバイルっぽい話から、フロントまで、幅広くいろいろな話が聞けてよかったと思います。 その話も、割と現場寄りな、泥臭い話が多くて、とても面白かった。
astj さんの、レガシーな環境に CPAN モジュールを入れるためにほげほげ、とか僕も最近悩んでたやつで、はてなさんでも 決して完全に解決しているとは思えないけど、参考になるし、何より勇気がもらえる。
と、言うわけでとても楽しいイベントでした。懇親会も楽しかった。また(無事当選できたら)是非参加したいです。
以下は雑なメモ。(聴講中にメモってたやつ) だいたいスライドは公開されているっぽいので、そっち見た方がいいと思います。
Goで書かれたmackerel-agentのOSS化や自動化にまつわるあれこれ(songmuさん)
- サーバサイドは Scala、エージェントは Golang
- エージェントはユーザが使うものだから、ソースを公開。エンジニア的にも嬉しいし
- ソースをオープンにするだけじゃだめで、p-r をちゃんと取り込んでいける体制になっていないといけない
- CI があると公平になるし、パッチのクオリティが担保できる
- travis 慣れているのと、tag にフックできるのがよい
- コードフォーマットの検査(go vet golint)
- Windows 対応もやってる (AppVeyor。インストーラとかも作れるらしい)
- レビュー体制はこれから(今は気付いた時にやってる)
- mackerel-agent-plugins(Nginx の接続数をとるとか)
- リリースプロセスがオープンに(リリース用のp-rを作るmake, travis でビルドしてリリースタグを打ってリリース)
- どこでも入っていて、テストも書けるので、better shellscript としての Perl は良い
- tag は github token でやると権限のコントロールが大変なので travis にしている
- 社内で検証できないプラグインはどうするか
はてなのサービスの開発環境(astjさん)
- ブログ、ブックマークなどいろいろなサービスやってた
- 開発者やデザイナーの手元で環境が使えるとよい
- ブクマはレガシーな環境やミドルウェアの構築とかが面倒なので、仮想マシン使う(Vagrant)
- ブログはそうでもないので、仮想マシンを使わず環境構築(plenv/Carton)
- 5.8.8/Ridge/Moco/mod_perl/TS(部分的)/gulp/LESS(部分的)いろいろあったけど今はgulp
- apache+nginex/MySQL/memd/Elasticsearch(2014/06から)
- Cent/chef/rpm(社内ビルド)/CPANも
- サービスはProcletであげてる
- cpanm だと昔のモジュールとかをうまく管理できない
- Vagrant + Chef でやる。秘伝のタレ化を防止
- うまくインストールできないCPANモジュールはChefのクックブックで頑張る
- サーバ(DBなど)は一部別の開発環境を共有。テスト時は手元に建てたものを使う
- apt がobsoluteになったり、CPANが非互換になったりして、困る
- 管理コストを減らすためにUbuntu->Cent(本番と同じ)にしたい
- bento(chef official な Base Box)
- B!KUMA は最初はエンドポイントを手で叩いていたが、つらいので、Nginxたてて reproxyするようにした
- Hatena Blogの開発環境は Solr 以外は全部立つように
はてなブックマークの新機能における自然言語処理の活用(skozawaさん)
- 10周年
- トピックページ2/5リリース
- クラスタリングの精度の問題とタイトル生成
- クラスタリングは重要語抽出ベース(Elasticsearch)
- タイトル生成は自然言語処理
- Elasticsearch の Significant Terms Aggregation(重要語を取得できる機能)
- 普段現れないような単語を取れる => 盛り上がってる話題
- スコア計算はいろいろあるが、jlh scoreというのを使っている
- 最近の単語のスコアが高くなる計算方法
- トピックのどれかが含まれるだと、関係のないエントリも取れてしまう
- スコアの合計8割以上になるようなエントリをとっている
- トピックのタイトルは、記事のタイトルと本文1行目
- キーワードの羅列では厳しい => どれかの記事を使うとうまくいきそう => どれでもいいわけではないので、重要文を取る
- 媒体名が入ると困るが、辞書を作るのはコストが高い => 重要な部分をとれば自然と媒体名はなくなるはず
- 重要語抽出 Elasticsearch -> TopicSum
- 重要語のスコアが最大の記事のタイトルを抽出
- かかり受け解析(Cabocha&ipadic)
- 重要語を含む戦闘文節から末尾の文節まで。非文にならないように、品詞関係をみるヒューリスティックルールを一部採用
- タイトルは全角スペースが文境界になっていたりするので、前処理をかける
はてなのiOSアプリとSwift(yashiganiさん)
- はてなブックマークShare Extension で使用
- ほぼ全てSwift(実験プロジェクト的位置付け)
- アプリの規模として小さいので、試すのにちょうど良かった
- 今後は標準的に Swift を採用
- 同じコードが Objective-C->Swiftに書き換えるとシンプルになる
- Generics のおかげで、安全なコードが楽にかける
- 関数型っぽい記述(map, filter, sort etc.)
- Closure Objective-C の Blocks だとつらい(慣れれば読める、慣れても書けない)
- 言語は良いが過去の資産が使えない
- Cで書かれたものの一部が使えない
- C++
- 最適化で壊れることがある
- β配布まで気づかないことが多い
- デバッグ実行時でも最適化レベルを上げれば再現する
- 一時変数を使ったり、Swiftの機能を排除する(structを使わない、NSObjectを継承)
- 型推論が微妙なのとリフレクションがまだない
- JSON はOptional と相性が悪い Mantle 使うと良い
- スマート会。チームを横断で技術共有
TypeScriptで実現するMVPアーキテクチャパターン(nanto_viさん)
- 動的な部分は少ないが、投稿ツールやビューワでJSを使用
- TSを使っている。Angular などのフレームワークは使わず、外部ライブラリは JQuery のみ
- 型が使えて、型推論もある。関数の引数と戻り値の型を指定しておけば、追加の指定はほぼ不要
- gulp-typescript でコンパイル
- 開発環境はコンパイルしたJSをそのまま使用。本番はminifyや 結合したもの(CI環境を使用)
- テストは QUnit/Sinon.js(モック)
- ローカルではブラウザ、CIでは gulp-qunit
- 最初は JS を書いていたが規模が大きくなると辛いので TS に移行
- 移行は5行書き換えただけだった(外部宣言の追加、any型へのキャスト、typoの修正)
- 徐々にTSのクラス、モジュールを使って書き直し(8000行のうちの半分くらいがTSらしいコードに)
- AngularJS は学習コストが高いのと、チューニングが辛そうなので見送り
- Vue.js は Android 2.3 で動かないので見送り
- Alux/React.js 当時は情報が少なかったので見送り
- プレゼンテーション層をテスタブルにしたいけど、フレームワークは上記の理由で厳しいし、データバインディングを自作するのは嫌
- MVP アーキテクチャパターン(Model-View-Presenter)
- MVVM と違って、View のIFを知っていて、自身の変更をViewに反映される(自前でやる)
- DOM の変化する部分を View の Interface に定義(例: 場所、可視性、ページ番号)
- Presenter は DOM の処理に依存しない形でロジックを実装
- アニメーションは JQuery の animate を使用。Presenter の値が変わるたびに View に通知して表示を更新
- テストは空のView(モック)を作って、Presenter のみテストしている(View は DOM を触るのでテストできていない)