2014-04-27

Cassandra を使ったデータ削除の実装でコレをやるとマズイ

最近はお仕事で Cassandra をメインのデータストアにしたサービスを開発しています。
KVSなデータストアでの開発にもだいぶ慣れてきたところなんですが、落とし穴があったのでメモφ(`д´)

データ削除時に tombstone (墓石) を建てる


Cassandra はレコードの削除を行うときに、tombstone という削除フラグ的なものを立てて論理削除ぽいことをしているらしい。
なので tombstone だけでは物理的にレコードは消えておらず、Java の GC とか minor compaction をされるまで残り続けるみたいです。

検索するときの邪魔になる

Cassandra はデータ検索時に tombstone があるとそれをスキップして走査するという動きになっているらしい。
なので、大量の tombstone があると検索効率が落ちていきます。
データ削除を大量のレコードに対してやるとこうなっちゃうんですね。
cassandra/system.logとかには

Read 0 live and xxxx tombstoned cells

とか表示されているはず。

回避策1

データ走査対象にならないように、適切にレコードに対して key を割り振りましょう。
単純に1種類の ID とかで走査してしまうような検索を避けるために、もう1種類グループ分けできるような ID を振り分けると検索対象から外れて tombstone を踏むことが減ります。

回避策2

gc_grace_seconds の時間を短くして GC される間隔を短くする。
デフォルトだと10日くらいなので、それを短くするとか。これはパフォーマンスと相談して時間を決めるのが良いかと。
CQLで

> UPDATE COLUMN FAMILY [CF名] with GC_GRACE = [時間];

とか書けばいいらしい。

まとめ

一時的にデータを作って、一気に消すような実装が入ってるときに気にしたい tips でした。
tombstone 、墓石と名付けるセンスが面白いですね( ・`v・´)

2014-04-04

アンプ要らず!macの音質を劇的に良くする方法メモ

以前ロケットニュースで紹介されていた "音作りのプロが教えるブッ飛ぶほど最高な iTunesイコライザ設定「Eargasm Explosion」がコレだ!!" を試してみて、確かに劇的に音が良くなったので凄く感動しました。

しかし音楽を聴くのはいつもiTunesというわけではなくて、よく聴いてるのは SoundCloud のremixされたオシャレなクラブミュージックだったりします。アニソン多めですが、最近はラブリーサマーちゃんがお気に入りです。

https://soundcloud.com/yuuki-shichiku
https://soundcloud.com/yuuki-shichiku/likes

ここで問題なのはブラウザの音だとEargasm Explosionが使えない><ということでした。
でもググったら方法があったのでメモ。


ライフハッカーさんありがとう

しっかりまとまってました。
http://www.lifehacker.jp/2013/04/130417equalizer_pc_mac.html

Soundflower というソフトと、 Apple提供の AU Lab というソフトを使えば良いらしい。

macの設定で、出力先を Soundflower に渡して、その出力を AU Lab でイコライズするって仕組みみたいです。

Graphic Equalizer の設定を開いて、10バンドにしたらロケットニュースさんに記載されてる Eargasm Explosion を再現するだけ!

http://rocketnews24.com/2014/03/19/424320/

設定してハマったところと注意

設定した後はGraphic Equalizerの上にあるUntitledから保存するメニューを選んで、Eargasm Explosionの設定をドキュメントファイルとしてどこかに保存しましょう!
保存したファイルを開けばまたこの設定が反映されます。
消しちゃうとまた最初から設定しなおしです。

あとはmac側の設定を変えて、Soundflower に出力を向けっぱなしだとAU Labを立ち上げない限り音が出なくなったりするので注意。


滅茶苦茶良い音でSoundCloudが聴けて幸せです( ˘ω˘ )♪

2014-04-02

Node.js を JavaScript から勉強するときに使ったものまとめ

昨日で社会人5年目になった79です^q^
最近仕事ではNode.jsでサーバサイドなプログラミングばかりしているのですが、人に教える機会が凄く多くなってきました。

他の言語やっている人が、1から(人によってはJavaScriptから) Node.jsをやってみたい!という人がちょくちょく僕を訪ねてくれます。

個人的にどういう勉強をして今に至るのかをずらずらっと書いてみます。


JavaScript からやってみた

自信がないから本読もうという段階

去年末のブログに書きましたが、JavaScript自体始めたのが最近です。
途方にくれて買ってきた1冊の本が始まりなわけですが、とりあえず触るにはちょうど良かった本がこちら



ブラウザですぐ動いて楽しい本です。ただちょっと物足りないので、ちゃんとJavaScriptを勉強したくなってこれを買い足しました。



仕事で使い始めてもっと知りたくなる段階

JavaScript Good Parts


jsは凄く書きやすい言語です。良くも悪くもすぐ動きます。
しかし、ある程度ルールをキメた上でコーディングしていかないと、思わぬ挙動をしたりします。そういうのを防ぐための本。

プロになるためのJavaScript入門


jQueryとか使えるけど、JavaScriptでもうちょっとオシャレに実装したい、とか、流行りのクライアントサイドMVなんとか使いたいとか、そういう時に便利。
ちょうど仕事でBackbone.js使い始めてたので、Backbone.jsの話が多めに書いてあったから買った本。


webサイトで入門するなら

時間かけてられなくて、触りだけ知りたいときはwebでやったほうが良い。

code academy
簡単だけどオススメ。

code school
英語だし有料(一部無料)だけど、本買うより良い。実際にコードを打ち込んで正解しないと次に進めない。
他のプログラミングの勉強もできる。(もちろんNode.jsも)
コード見るだけなら意外とできちゃうし、終わった後英語出来た気になれるw

JavaScriptなら、「JavaScript road trip part 1-3」をやれば良い。

日本語じゃないとダメだって人はドットインストールでもいいのだけど、見るだけになっちゃうので、ちゃんと自分で書いて動かすっていうのと、
自分で1からちゃんと作ってみるのとセットじゃないと書けた気になったままで評価しづらい。


いざ Node.js !

正直本はあまり読んでいない。

簡単に触れるwebでの情報が結構色々あるので、Node.jsはそれだけで充分だった。
ので1冊本を読みきったことはないんです。
でも会社に置いてある良さそうだねってなった本は以下。

Node.js入門




web での学習が一番良かった

The Node Beginner Book
JavaScriptができていれば、Node.jsの勉強はそんなに怖くなくなっているはず。
Node.jsの学習に一番良いとされているドキュメントがあります。


Node.jsの特性を知れるし、expressみたいなフレームワークに頼らずに仕組みを知れるので凄く重宝するはず。

code school - realtime web with node.js
これは本当に良い授業だった。Node.jsの基礎からexpressの利用、socket.ioを使ったサンプル、RedisみたいなKVSへのデータ保存まで網羅されてる。

code schoolの良い所はビデオを見た後にその内容をテスト形式で穴埋め復習出来る所。写経よりも習熟度が高くなるので、本当にオススメです。


Github projects
blogに書いたところでどうにもならないけど、社内のソースコードを読むのが一番勉強になった。社内ではGHEを使っていて、僕が勉強してる時期はいろんなNode.jsのフレームワークが喧嘩していた。その時期はそれぞれのFWを比較しながら読んだり出来て、凄く環境に恵まれてるなぁと実感。
(※社内向けに書くと、Pなんとかとか, beezとか, 某ネイティブゲームで使ってるやつとか(気になる人は聞いてね))

身近にそういうのが無ければ、 node.js sample とかで github 検索したリポジトリを漁るのが良いでしょう!ソーシャルコーディングすばらしい^v^

とは言っても何も知らないと難しいと思うので、今パッと思いついたのでvisionmedia氏がやっぱり至高なのでリンク置いておきますね。
これ見ると気づくと思うんですが、Node.jsでよく使われてるモジュールは大体この人が関わっています。ありがたやありがたや。。

詳細だと express の examplesとかを見れば色々あります。

参考までに

社内で主流なのは express をラップしたようなフレームワークばかり。
厳格なMVCフレームワークは死んでいて、OOPなのも1つだけ?
超ざっくり言うと、1つのオブジェクトに色々機能をぶち込んだものを引き回したりする書き方が多い。
モジュールにキレイにまとめていたり、必要な機能だけDIしたり、フレームワークによって様々。

開発するときに初期から使っておくと良いツール達

Node.jsライブラリ
  • mocha: 下のexpect.jsと一緒に使う。テスト書いてTDD/BDDするのが世界標準だよと怒られています。javascriptは自律が必要な言語です。是非テストを書きましょう!
  • expect.js: 一番具合が良い。
  • lodash: underscoreより今はコッチのほうが使われてる。
  • jade: ejsのが個人的には好き。handlebarsでも良い気もする。
  • async.js: parallelな処理はasync使うのが良いと思う。長い非同期処理書くときにも良い。
  • yeoman: Node.jsで開発してたらyeomanがデフォルトで使えるので、使えるようになっておきましょう。
  • supervisor: 好み。
コーディング
  • jsHint: javascript good parts とか見ると参考になる
  • editorconfig: js関係ないけどお気に入り。node.jsのインデントはスペース2が調度良いと思う。
  • Git: 言わずもがな。使えるようになると Github 巡りが楽しくなる。
  • github-flow: git-flowは死んだ!と思う。なんかグチャグチャしてたりルールを決めるのが大変。偉い人曰く、pull requestが無かった時代の管理手法なんじゃないかとのこと。確かにそんな気がする。
その他
  • vagrant: DBとかはlocalに立ててもいいけど、vagrantに入れてすぐぶっ壊せる環境にあったほうが良いので推奨。v1.5から使えるshare機能で、boxの共有が出来るようになったから、具合の良いboxみつけてそれ使うだけでもイイ。
  • ansible: chefじゃなくてansible。覚えておくと便利。vagrant内にsshでインストール作業がサクサク出来る。
  • CIツール類: jenkinsくらいは使えればおk。jobの中身知らずにビルド回すとかはご法度です。


さいごに

社内外向けに最近のNode.js講座周りのTipsをまとめてみました。
僕が運が良かったのは、これらと合わせて素晴らしいレビュワーが居たということでしょう。
書いたコードを誰かに見せて、問題がないかチームなり上司なりと確認しあうのが大事です。

あとは真似する事が一番の近道です。スーパーエンジニア様達が弊社にはいっぱいいます。身近に居なくても、世界中のコードがgithubで見れたりするので、今はすごく勉強がし易い環境が整っているはずです。良いとされているコードをたくさん真似してみましょう。