Life_may_18

先週振り返り

プロダクトをリリースできてよかった。
これからの成長が重要だ。

週末振り返り

実際に料理を作ってみた。
色々見つかったのでフィードバックしてみる。

プロセッサを支える技術の第3章まで読んだ。
アルゴリズムクイックリファレンス第3章まで読んだ。

偉大な目標

全く進んでない

完成してないゲーム

全く進んでない

読書途中経過

読んでる

  • プロセッサを支える技術- 果てしなくスピードを追求する世界 3章まで
  • アルゴリズムクイックリファレンス 3章まで
  • SICP-問題1.8 まで

積んでる

  • ミクシィ公認 スマホアプリ開発実践ガイド[iOS/Android両対応] [Kindle版]
  • 論語入門
  • ハイパフォーマンスHTTP サーバ nginx 入門

読み終えた

  • (2014/5/11)入門コンピュータ科学
  • (2014/5/4)作って学ぶプログラミング言語(Ruby による Scheme の実装)読破
  • (2014/4/29)ネットワークはなぜつながるのか?
  • (2014/4/29)オペレーティングシステム
  • (2014/4/28)Webエンジニアのためのデータベース技術[実践]入門
  • (2014/3/1)chef-solo 入門
  • (2014/3/1)パーフェクトルビー
  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

Life_may_11

週末振り返り

築地の豊ちゃんっていう洋食屋でかつ丼を食べてきた。
かなりうまかった。
銀座の船見坂っていうラーメン屋のラーメンはかなりうまかった。

プロセッサを支える技術の第2章まで読んだ。

2章までのキーワード

  • メモリアドレス空間
    – 64 ビットアーキテクチャとかは64ビットのアドレス空間に対応するために必要
  • RISC と CISC
    – RISC(Reduced Instruction Set Computer) は固定長命令で、パイプライン制御をしやすくするために作られた
    – CISC(Complex Instruction Set Computer) は可変長命令なので、パイプライン制御しにくかった
  • Out of Order と 分岐予測、投機実行
    – プログラムの実行時に次の演算結果が依存しない時にその次の命令を先読み実行できる、これを Out of Order という。
    – 分岐があるせいで演算の先読みが難しい
    — 処理が多い方の条件分岐を先に実行しておく(分岐予測)
    — Out of Order と 分岐予測を合わせた実行が投機実行

偉大な目標

全く進んでない

完成してないゲーム

全く進んでない

読書途中経過

読んでる

  • プロセッサを支える技術- 果てしなくスピードを追求する世界(2章まで)
  • SICP-問題1.1.5 まで
  • DDD ショートバージョン(P40まで

積んでる

  • ミクシィ公認 スマホアプリ開発実践ガイド[iOS/Android両対応] [Kindle版]
  • 論語入門
  • アルゴリズムクイックリファレンス
  • ハイパフォーマンスHTTP サーバ nginx 入門

読み終えた

  • (2014/5/11)入門コンピュータ科学
  • (2014/5/4)作って学ぶプログラミング言語(Ruby による Scheme の実装)読破
  • (2014/4/29)ネットワークはなぜつながるのか?
  • (2014/4/29)オペレーティングシステム
  • (2014/4/28)Webエンジニアのためのデータベース技術[実践]入門
  • (2014/3/1)chef-solo 入門
  • (2014/3/1)パーフェクトルビー
  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

Life_may_6

GW 後半振り返り

macmlh について

というか昨日だけど、 ずっとやってみたかった vim-mlh の mac IME 移植を試みた。
が、結論から言うとそう簡単ではないことがわかった。

基本的に、 mlh で必要なもの、 と言うか必要なパーツってのは、
- カーソルの移動
- 文字列の削除
- 選択候補の表示
などである。
mac の Input Method Kit という cocoa アプリを作成するときに
非常に便利なライブラリがあったが、 それがサポートしているのは
クライアントとサーバ形式での変換のやり取りなので基本的には
文字列の削除、 カーソルの移動などはできなかった。
割とこれが致命傷で、 mlh の場合は, というよりも俺が考える mlh では、
入力中に候補が出るたぐいのものではない。
入力中に候補が出るようにするのは全然造作なく作れるんだけど、
俺が考える、半角英数入力が終わったあとに / + が入力されて初めて 変換されるようなものにするにはできなかった。

NSString に ^H(Ctrl+V,Ctrl+H) を送っても、 iTerm2 ではうまく動くけど、
xcode とか firefox ではうまく動かなかったり..
とにかく、 vimscript でかく上では上記に上げた必要なパーツは全て揃っていたが、
Input Method Kit 及びそれを書く cocoa アプリ作成では見つけられなかった。

ゴールデンウィークらしいモラトリアム期間の中でやってみたチャレンジだったが
非常に残念な結果になったので、 また平常運転で本を消化していこうと思う。

Input Method Kit に詳しい人いたら教えてほしいです。
@vimtaku までぜひご一報ください。

本を買った

  • アルゴリズムクイックリファレンス
  • プロセッサを支える技術- 果てしなくスピードを追求する世界
  • ハイパフォーマンスHTTP サーバ nginx 入門

今日の目標

  • 詳解UNIXプログラミング(第3版) 4章 まで読む

偉大な目標

全く進んでない

完成してないゲーム

全く進んでない

読書途中経過

読んでる

  • とある本8章まで読んだ
  • SICP-問題1.1.5 まで
  • DDD ショートバージョン(P40まで

積んでる

  • 作って学ぶプログラミング言語(Ruby による Scheme の実装)
  • ミクシィ公認 スマホアプリ開発実践ガイド[iOS/Android両対応] [Kindle版]
  • 論語入門
  • アルゴリズムクイックリファレンス
  • プロセッサを支える技術- 果てしなくスピードを追求する世界
  • ハイパフォーマンスHTTP サーバ nginx 入門

読み終えた

  • (2014/5/4)作って学ぶプログラミング言語(Ruby による Scheme の実装)読破
  • (2014/4/29)ネットワークはなぜつながるのか?
  • (2014/4/29)オペレーティングシステム
  • (2014/4/28)Webエンジニアのためのデータベース技術[実践]入門
  • (2014/3/1)chef-solo 入門
  • (2014/3/1)パーフェクトルビー
  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

時をかける少女の感想

時をかける少女の DVD をレンタルしてみた

面白かった。
いままでは、金曜ロードショーだけ見て楽しい映画だなぁと思っていたけど
改めて DVD でみたらとても楽しめた。
自分史上映画ランキングでもかなり上位だと思う。

最後のクライマックスシーンの解釈について

「未来で待ってる」「すぐ行く、走って行く」の解釈は、
いかにも映画らしく読者解釈に任せようというかんじだったけど、
エンディング曲の歌詞から察すると、自分の解釈としては、

もう逢えない関係性のなかでの、
「いつまでも忘れない」と「わたしも」
っていうやりとりなんだろう。

Life_may_5

先週振り返り

仕事は相変わらず忙しいが一区切りつきそうである。

今日振り返り

  • とある本8章まで読んだ
  • 作って学ぶプログラミング言語(Ruby による Scheme の実装)読破

偉大な目標

全く進んでない

完成してないゲーム

全く進んでない

読書途中経過

読んでる

  • とある本8章まで読んだ
  • SICP-問題1.1.5 まで
  • 詳解UNIXプログラミング(第3版) 1章
  • DDD ショートバージョン(P40まで

積んでる

  • 作って学ぶプログラミング言語(Ruby による Scheme の実装)
  • ミクシィ公認 スマホアプリ開発実践ガイド[iOS/Android両対応] [Kindle版]
  • 論語入門

読み終えた

  • (2014/5/4)作って学ぶプログラミング言語(Ruby による Scheme の実装)読破
  • (2014/4/29)ネットワークはなぜつながるのか?
  • (2014/4/29)オペレーティングシステム
  • (2014/4/28)Webエンジニアのためのデータベース技術[実践]入門
  • (2014/3/1)chef-solo 入門
  • (2014/3/1)パーフェクトルビー
  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

Life_april_29

週末振り返り

本を読みまくれたのでよかった。
- rails tutorial 流し読み
– なんていうかやっぱりだいたいわかってた。
– ホントは Rspec の本とか読むともっと良いテストかけるようになっていいと思っている
- Webエンジニアのためのデータベース技術[実践]入門 7章を読み干す
– 昨日ブログ書いたとおり、読み終えた
- オペレーティングシステムを読み干す
– これはさくっと読み飛ばした。
- ネットワークはなぜつながるのか?
– 読みきった。面白かった。

TOEIC を受けてこようと思う。2014年7月21日。また podcast から始めるか。

偉大な目標

全く進んでない

完成してないゲーム

全く進んでない

読書途中経過

読んでる

  • とある本4章まで
  • SICP-問題1.1.5 まで
  • 詳解UNIXプログラミング(第3版) 1章

積んでる

  • 作って学ぶプログラミング言語(Ruby による Scheme の実装)
  • DDD ショートバージョン
  • ミクシィ公認 スマホアプリ開発実践ガイド[iOS/Android両対応] [Kindle版]
  • 論語入門

買いたい

  • nginxの本

読み終えた

  • (2014/4/29)ネットワークはなぜつながるのか?
  • (2014/4/29)オペレーティングシステム
  • (2014/4/28)Webエンジニアのためのデータベース技術[実践]入門
  • (2014/3/1)chef-solo 入門
  • (2014/3/1)パーフェクトルビー
  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

Life_april_28

いろいろ振り返り

すごく仕事が忙しかったのと、とある試験を受けるためにずっと勉強してて
全然ブログを更新出来ていなかったが、両方そこそこに落ち着いてきたのでそろそろ
また新しく書き始めることにする。

今日の目標

  • rails tutorial 終わらせる – これもうかけるし全然大丈夫じゃないかとは思っている – なのでさらっと読み飛ばす

  • Webエンジニアのためのデータベース技術[実践]入門 7章を読み干す
  • オペレーティングシステムを読み干す

偉大な目標

全く進んでない

完成してないゲーム

全く進んでない..

勉強途中経過

進んでない

読書途中経過

進んだ

  • ネットワークはなぜつながるのか?(3章)
  • とある本4章まで読んだ
  • SICP-問題1.1.5 まで終了

積んでる

  • 作って学ぶプログラミング言語(Ruby による Scheme の実装)
  • DDD ショートバージョン
  • ミクシィ公認 スマホアプリ開発実践ガイド[iOS/Android両対応] [Kindle版]
  • 論語入門

諦めそう

  • 詳解UNIXプログラミング – 新盤が出たのでそちらを読み直していく

まだ積んでないけど読む

  • nginxの本

読み終えた

  • (2014/3/1)chef-solo 入門
    • ザーッと目を通し直したらほぼ理解出来てたので読み終えたことにする
  • (2014/3/1)パーフェクトルビー
    • 手を動かしながら ver
  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

Web エンジニアのためのデータベース技術入門をざっくり読んだ

web エンジニアのためのデータベース技術入門をざっくり読んだ

この人の感想ブログがいい感じ
なので、自分で気になったあたりを調べたところとかを、以下にメモしていく。

Sharding と更新性能

RAID を組んだ マスタの場合、冗長性だけでなく並列性においても有利である。
MySQLではマスタはマルチスレッドで動作するが、
スレーブはシングルスレッドで動いているから、スレーブのほうが負荷がかかりやすく、
さらに raid のせいで I/O での差が発生する。
なので、スレーブだけ SSD とか、SSD のなかでもさらに高性能な PCI-express SSD を使うと余裕になるっていう話。

Hash JOIN について

MySQL では join とかするときは、残念なことに MySQL5.6 でも Nested Loop に変換されてしまう。
MariaDB とか PostgreSQL とかでは Hash Join が実装されているようだ。
Hash JOIN のほうがすごく早い場合がある、が、単純に Hash Join のほうが早いというわけではない。
mysql performance blogの結論部をたいして無い英語力で翻訳してみると、

Based on the above information and the benchmark results for different test cases, we can see where Hash Joins work best and where they don’t. First of all Hash joins only work for equijoins. Hash join work best when you are joining very big tables with no WHERE clause, or a WHERE clause on a non-indexed column. They also provide big improvement in query response time when you are joining tables with no indexes on the join condition (Full Join). The best performance with Hash Join can be achieved when the left table can fit completely in the join buffer, or when the least amount of buffer refills are needed, as each buffer refill means a scan of the right-side table. However, Hash joins do not outperform BNL or BKA when you are joining a really small subset of rows, as then scanning the right-side table becomes costly in comparison. Block Nested Loop Join would perform better than Hash Join when you are joining two tables on a PK column such that both tables are read in PK order. One use case that I can think of for hash joins is data warehouse applications that need to run reporting queries that need to join on lookup tables which tend to be small mostly. What use cases can you think of

まず Hash join は inner join じゃなきゃそもそもうごかない。
Hash join は where 句なしの大きいテーブルか、
where 使っているけど インデックスはられていないカラムの条件指定の時に効果を発揮するよ。
もしくは、index がはられていない列同士の結合とかにもだいぶ効果発揮するよ。
ベストパフォーマンス発揮するタイミングは、左のテーブルがジョインバッファに全部収まる
(最低限再度バッファに入れる時に入るサイズ)ときだ。
それは右のテーブルを読みきった時にまたジョインバッファ更新するから。
すげぇ小さいテーブルとか、右のテーブルに const 検索条件が使われている時とかは BNL とか BKA とかのほうがいい感じだぜ。
BNL は PK での 検索条件とか、 PK での sort order 使ってるときに Hash join よりいいぜ。
まぁ、一つ思いつくのは data ware hause Application とかでレポートする処理とか書く時にかなり早くなりそうだよね。
あとなんかある?

って感じだ。
なるほど、そう考えると格段と良くなるとは言えないが、場合によっては相当効力がありそうだ。
しかもグラフを見ると、なるほど、たしかに、そうとうパフォーマンスが上がっている場所がある。
というか mysql 5.5 と 5.6 の差が違いすぎてウケる。

参考:

http://d.hatena.ne.jp/interdb/20131020/1382280437
http://www.mysqlperformanceblog.com/2012/05/31/a-case-for-mariadbs-hash-joins/

スレッドプールについて

MariaDB だとスレッドプールが使用できるが、MySQL 5.6 ではその機能はない。
エンタープライズ版とかだと用意されているらしい。 ちなみに MySQL6 とかで実装されるらしい。

MySQL チューニングについて

これらの記事がおそらくとても参考になるので、本番運用前にチェックしてみるとよいかも。
http://yakst.com/ja/posts/200
http://nippondanji.blogspot.jp/2009/03/mysql7.html
http://dsas.blog.klab.org/archives/50860867.html
http://www.slideshare.net/kenmasu/ss-12604339

以下メモ
show engine innodb status;
で ロックが発生していないか見る。

これで遅いトランザクションの洗い出しが可能。
https://github.com/yoshinorim/MySlowTranCapture

この辺は見直すとよいかも。

mysql> show global variables like '%innodb_lock_wait_timeout%';

RDS におけるリストアについて

オンプレミスな DB のリストアなら、
ある地点のスナップショットのリストア + バイナリログをロールフォワードだと思うけど
RDS ならどうするんだろうと思ってちょっと調べたけど、最初から MultiAZ にしておけば
自動フェイルオーバーしてくれる模様。
しかし3-5分くらいかかる模様なので、その間システムが落ちるのかと思うと結構しんどい。
手動でフェイルオーバー とかもあってこっちは復旧はすごく早いけどこれも結構デメリットはあるみたい。
何を取るかだとは思うけど(おそらく組織レベルでサービスの停止が許せるかどうか)、
メンテの楽さを考えると RDS 任せのほうが楽な気はする。

所感

この本に関しては、業務でやっている、やっていたことが結構書かれていた。
無意識レベルでやっていたことが結構書かれていたのでそういうところは飛ばして読んだ。
でも、mysql のチューニングのあたりなどはあまりやったことがない経験だった。 前職では運用チームの人たちがいたのでその人達で閉じていた知識だと思うので、
今の職場で活かせるようにチューニングしたいと思った。

Wikipedia や Google は MariaDB を採用しているらしい。
まだ枯れているという印象は全然ないけど、実際に使われていることや、ほぼ MySQL だったりするところ、
スレッドプールが使えるあたりはかなり変わってきそう。
hash join も使えるので、オプティマイザが賢ければかなりその恩恵受けられそう。
オプティマイザ比較しているブログ 見る限り、実は postgresql が頑張っている。
postgresql は前前職で使っていたが vacuum の印象が強くてあんまりいいイメージはない。
今度自分のプロダクトを作るときには MariaDB を使ってみようと思う。

参考

Jbuilder のフラグメントキャッシュで、配列で書きたい場合とハッシュで書きたい場合のキャッシュを共通化したい

結論

views/book/_book.jbuilder

json.cache! book do
  _j = book.to_builder.target!
    JSON.parse(_j).each do |k,v|
        json.set! k, v
    end
end

controller で @tmpl[:book] が set されていると仮定
views/book/show.jbuilder

json.book do
  json.partial! 'book/book', book: @tmpl[:book]
end

controller で @tmpl[:books] が set されていると仮定
views/book/list.jbuilder

json.books @tmpl[:books], partial:'book/book', as: :book

背景

単体表示に

{
    book: {
        bookId: "moge"
    }
}

複数表示に

{
    books:[
    {
      bookId: "moge"
    },
    {
      bookId: "moge2"
    }
    ]
}

としたいみたいなやつがググっても全然出てこなかったので。

所感

まぁこうは普通しないわなぁ。

Jbuilder で 共通パラメータを付与したい時は Layout を使うといいかも

前提

  • rails4
  • jbuilder(1.5.3)

背景

jbuilder を使うと、 api のレスポンスをシンプルに定義できる。
例えば、hoge_controller.rb#new の場合に
app/views/hoge/new.jbuilder とかを用意しておいて、
そこに template で返したい値などを書いて定義できる。
しかし、共通で値を返したい場合どうするんだってことになって
いろいろ考えた結果以下に落ち着いた。

解法

layout を使う。

controller にたとえば
layout ‘api/application.jbuilder’ などと定義しておく。

それで上記の例で言うと、 hoge_controller.rb#new では
app/views/hoge/new.jbuilder が呼ばれるので、

app/views/hoge/new.jbuilder

json.from_hoge "from_hoge_param"

layouts/api/application.jbuilder

# common に値を付与
json.common "common_param_is_here"
# controller の @hoge を参照できる
json.hoge @hoge
# template の値を付与
JSON.parse(yield).each do |k,v|
  json.set! k, v
end

とかしておくと良いのかもしれない。
結果は {common:”common_param_is_here”, fromHoge:”from_hoge_param”, hoge:”hoge_from_controller”} てな感じになる。

ちなみに camelCase には公式の通り、 Jbuilder.key_format camelize: :lower でできる。

上記は、まだ実践してないけど手元で試してみた見たかんじこれで行けそう。

所感

もっといい方法あれば教えて下さい。

蛇足

stack over flow とかで書いてある render! を定義する方法や
json.render JSON.parse(yield) だとうまく行かなかった。