satococoa's blog

主にサーバーサイド、Web 系エンジニアのブログです。Go, Ruby, React, GCP, ...etc.

Webエンジニアのためのデータベース技術[実践]入門

誕生日から1週間位過ぎたダメなタイミングでウィッシュリストをこっそり晒してみたら id:a2ikm さんが送ってくれたので読みました。 ありがとうございます!! (ちなみにこちら -> http://www.amazon.co.jp/registry/wishlist/16JH79VDRKUVM )

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

どんな本?

この本は「データベース技術」と題してはありますが主に MySQL を使っている人向けと考えて読むのがいいと思います。

第9章 "MySQLに学ぶデータベース管理"、第10章 "MySQLソースコードを追ってみよう" は掲題の通り MySQL に特化した内容なのですが、その他の部分も「MySQL だと...」というように MySQL について述べられたところがたくさんあります。

その上でインデックスの基本的な仕組みや正規化などのテーブル設計のトピックもありますので初心者にとっても役立つ本だと思います。 また、最近のトレンドである NoSQL とかデータウェアハウスについても軽くではありますが述べられています。

個人的に役立った部分

正規化とかインデックスの仕組みとかその辺は理解していたので、基礎知識の再確認という意味ではよかったです。 それ以外にどちらかというと運用面が僕は知識が不足している (そして RDS にお任せっきり) の部分だったので、以下の項目について知れたのがよかったです。

まとめ

以上のように、MySQL を中心にデータベースについて広く浅くという本なので、比較的 DB にあまり親しみの深くない経験の浅いエンジニアはなるべく早い段階で読んでおくと良いと思います。逆に mysqld のチューニング、SQL のチューニング、運用について自信のある方には少し物足りないかもしれません。(僕はあまり自信がなかったので知識の再確認も含めて役に立ちました!)

DB 関連の本はたくさんありますが、テーブル設計・運用・周辺知識までざっくり押さえるには良い本だと思いました。

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

Web制作者のためのCSS設計の教科書を読んだ

久しぶりに仕事で Web 側の view を作っていて web のフロントエンドの技術からだいぶ遅れてしまっていたことを実感したので、キャッチアップするために以下の本を読みました。

例によって PDF が欲しかったので達人出版会で買いましたが、ちょうどポチった翌日から kindle 版が半額以下になるという悲しい現実。(いや、でもどうせ PDF が欲しかったのできっとどちらにせよ達人出版会で買ったと思いますが...。)

以下感想です。

どんな本?

CSS の "設計" について書かれた本です。

フロントエンドの "設計" というと JavaScript のことと勘違いしがちですが、CSS も無秩序にセレクタを書いていくとあっという間に破綻してあちこち意図しない見た目になってしまいますよね。 サービスをリリースした経験がある方のほとんどはこんな経験を一度はされていると思います。

最近は sass とか less があるので途中まではそれなりにうまくモジュールに切り分けて整理できていても、そのうち「なんでこのセレクタが優先されちゃうの?」とか「こっちにはこのスタイル効いて欲しくないのに!」って困るのはあるあるネタだと思います。

その辺のよくあるやりがちな間違いをきちんと実例を挙げながら原因を解説するところから始めて、最近よく聞く OOCSS とか BEM とか SMACSS とかの CSS の設計技法についても満遍なくフラットに解説してくれている本です。 また、SASS を使った設計方法についても記述があるので Rails 使いの人にとってもすぐ役立つ知識をすっきりと手に入れられる本です。

最後には Web Components についても概要を紹介してくれています。

どんな人にオススメ?

CSS の本だからと言ってコーダーとかデザイナ向けだと勘違いしてしまうと損です。むしろプログラマにオススメです。 特にフロントエンドにあまり縁がなかったバックエンドを主に扱っているプログラマにとっては、プログラマ的な考え方で CSS を整理するという観念とその設計の手がかりを得ることができるので、CSS に対する苦手意識や「なんとなくわかってるけど、よくわからない」感をだいぶ減らせると思います。

「Bootstrap のカスタマイズで十分間に合うから CSS を一から自分で書くとかほとんどしないしー」っていう方も、この本を読了すればどうして Bootstrap があのような設計で作られているのかがなんとなく理解できて、Bootstrap ってよくできているんだなぁと実感できるようになると思います。

僕も以前は「Bootstrap を使うとなんか HTML の class が bootstrap 臭くなって汚れる」とか思っていた方なのですが、Web アプリの CSS の設計という観点から見て非常に綺麗によくできているフレームワークなんだな、としみじみ感じさせられました。

あとは BEM とか SMACSS とか最近話題だからちょっと調べてはみたけど、あまり具体的なメリットがわからないな、っていう方は是非読んでみてください。 @ken_c_lo さん曰く、それぞれのフレームワークについてこれだけ網羅してきちんとわかりやすく書いてあるものは存在しない、とのことなのでデザイナさんのお墨付きと言っても過言ではないと思います。

あとは実案件でどうやってこの知識を活かせるか試すのみですが、「sass でなんとなくページごとにファイル分けときゃいいんじゃない?」なんて思っていた頃よりはきっと納得のいく設計ができるようになっていると思います。がんばります。

AWS CloudSearch を使ってみた

Elasticsearch を調べたあと、最近は CloudSearch も機能強化されて日本語の検索も簡単にできていることを知り、いろいろ試して使ってみました。 結果、すごく良さそうなので今開発中のプロジェクトで採用することにしました。

調査しつついろいろコツというか知っておくべき点があったのでメモを残しておきます。 Elasticsearch との比較という観点で調査・検証していたので、Elasticsearch をある程度知った状態で読んでいただいた方がいいかも。

CloudSearch と Elasticsearch の比較

  • Elasticsearch ではシャード数は index 作成時に決定しなくてはならないが、CloudSearch なら自動でスケールアップしてくれる。
  • 検索のパフォーマンスに関しては Elasticserch でもあとから replica 追加可能なのでスケールアウト可能。しかし、インデックス更新のパフォーマンスは上げられない。
  • 日本語検索は両者とも ok
  • 特定の条件を重要視したスコアリングなども両者とも ok
  • CloudSearch の場合、インデックスの作成や構造を変更するとき (カラムの追加とか) にはかなり時間がかかる + 別途料金 (1GB あたり 0.98 USD) がかかるので注意が必要。

CloudSearch を使う上で知っておきたいこと

インデックスの更新について

  • インデックスの更新は "add" と "delete" の2種類で、それぞれ JSON をアップロードすることで更新する。
  • add は常に上書き更新となり、一部のカラムだけ更新とかはできない。
  • 複数の add, delete の操作をまとめて送ることができて(その単位をドキュメントバッチと呼ぶ)、なるべくドキュメントバッチのサイズ上限である 5MB に近いデータを送るようにした方がパフォーマンスがいいらしい。
    • 僕はいったん更新/削除用の json をデータベースに貯めておいて、一定時間おきに sidekiq で最大 5MB ずつのバッチに分けてアップロードしています。
  • json 以外のデータもアップロードできるらしいけど、そのユースケースが自分にはないので調べてないです。
  • インデックス上のドキュメントを識別するための id は ActiveRecord のオブジェクトの id でももちろん ok

料金体系

  • 次の 4つで課金されます。 -> インスタンス料金、ドキュメントの更新、インデックスの再構築、データ転送
  • うち、インスタンス料金以外はかなり安いので無視してもよさそう。
  • ちなみに最低で 0.082 * 24時間 * 30日 = $59.04/月 くらい (マルチAZ無し)

参考文献

Elasticsearch メモ

最近仕事で使いたいと思い、Elasticsearch で遊んだりしています。

$ brew install elasticsearch したらローカルで動いたのですが、そこから何すればいいのかさっぱりわからなかったので急がば回れということで本を読みました。

高速スケーラブル検索エンジン ElasticSearch Server

高速スケーラブル検索エンジン ElasticSearch Server

epub 版は以下から。

高速スケーラブル検索エンジン ElasticSearch Server【委託】 - 達人出版会

上記書籍は Elasticsearch 0.90.11 を元に書かれているので、実際に使う前に差分を公式のドキュメントで確認することをお勧めします。(そんなに大きくは変わってないですし、概念を学ぶにはぜひ書籍を)

雑多なメモ

elasticsearch-head

elasticsearch-head プラグインを使うとブラウザから elasticsearch の状態を見たり操作したりできます。これがないといちいち curlAPI を叩かないとクラスタの様子がわからない。

$ plugin -i mobz/elasticsearch-head # インストール
$ open http://localhost:9200/_plugin/head/

Rails から使うには

以下の gem を使う。ちなみに以前は tire という gem が主流のようでしたが、現在そのリポジトリkarmi/retire · GitHub という名前になって引退しています。(お茶目)

elasticsearch-model を使って、適切にインデックスの mapping をしたり query を組み立てたりすることができますが、デフォルトでは as_json メソッドの値をそのままインデックスに登録しているので、雑に使う分にはそれで十分かもしれません。

このへん。 https://github.com/elasticsearch/elasticsearch-rails/blob/4a61f1786696045561864567e0921db9b318aeaa/elasticsearch-model/lib/elasticsearch/model/serializing.rb#L26

あとは Article.search('title: hoge').records とかすれば、タイトルに hoge を含む検索結果に基づいて where id IN (1, 3, 4) みたいな SQL でレコードを取得できます。

ちゃんとインデックスを定義したい場合はモデルで mapping を定義して as_indexed_json をオーバーライドすることで Elasticsearch に登録する情報を定義したりできます。

クラスタリング

config/elasticsearch.yml の cluster.name が同じ elasticsearch の node がネットワーク上に存在すると、勝手にクラスタ化されます。すごいですね。 ちなみに Homebrew でインストールした場合は network.host: 127.0.0.1コメントアウトしないとクラスタに参加してくれませんでした。この辺検証するときは Vagrant でやるとか、公式からアーカイブ落としてきて起動するとかした方が楽かもしれません。

AWS 上で運用する際は以下のドキュメントが参考になります。 (node が参加するべきクラスタを EC2 API を叩いて探してくれたりする)

elasticsearch on ec2

ただ、このドキュメントだいぶ古いので注意が必要です。

シャード数はインデックス作成時にだけ指定できるみたいですが、レプリカ数はあとから足したり引いたりすることが可能なようです。 検索のパフォーマンスが足りなくなったなぁと思ったら増やす感じですね。

シャードやレプリカの配置は Elasticsearch に勝手配置してもらったり、任意の routing を定義したりもできるようです。

日本語全文検索

kuromoji というトークナイザーを使えば日本語での全文検索が可能です。

詳しくは以下。

パーフェクト Ruby on Rails を読んだ

パーフェクトRuby on Rails を読みました。

いまさら!?という感じですが、しばらく仕事では iOS をメインでやっていたのですが、最近またサーバーサイドに戻ってきたそのタイミングで電子版が発売されたので。

ちなみに epub 版は 以下の URL から買えます。

Rails で仕事をしている人にはこの辺がオススメ

全体的には仕事、趣味を問わずバリバリ Rails を使っている人にこそ必要な本だなーという印象でした。 特に4章と9章が今後の自分の設計指針にとって非常に参考になりました。

4章の “Railsのロードパスとレイヤーの定義方法” は Model, View, Controller 以外の層 (Worker とか Service とか) を定義して使うための方法について書いてあります。ジョブキューでよく使われている sidekiq が例に出ているのでわかりやすくて実践的です。

そして9章の “より実践的なモデルの使い方” では4章で得た知識を使って、どうやって複雑になりがちな ActiveRecord::Base を継承したモデルを整理しきれいな設計をするか、という内容を具体的なコードを挙げながら説明してくれています。

rails がデフォルトで持っている app/models, app/controllers, app/views での MVC ではモデルないしコントローラが複雑になってしまってなんだかうまくいかないなーと感じている人は、ぜひ4章と9章を読んでみることをオススメします。

書籍とは関係ありませんが、最近 肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳) | TechRacho を読んで、自分が rails がデフォルトで作る models, controllers, view ならびに concerns に無理やりコードを収めようとし過ぎて、レールの下敷きになってしまっていたことにようやく気付き反省したところでした。 この パーフェクト Ruby on Rails を読んでさらに設計に対する姿勢を柔軟にすることができたと感じています。

Rails を勉強中の方にはこの辺がオススメ

6章の “Railsアプリケーション開発” は具体的なアプリケーションを実際に作りながら rails の機能をどのように使えばいいか、そしてどのようなところに気をつければいいか、について解説されている章です。

この章に従って一通りアプリケーション作りをしてみることは Getting Started with Rails — Ruby on Rails Guides (和訳: Railsをはじめよう — Ruby on Rails Guides) や Ruby on Rails Tutorial (3rd Ed.), Learn Web Development with Rails - Michael Hartl | Softcover.io (和訳: https://www.railstutorial.jp) を終えた人にとって非常によい練習になると思います。

この章を教材にすると中級者向けの Rails 講座とかやれそうですね。

まとめ

最近の Rails 周りの情報を一気にキャッチアップできるよい本だと思います。 読んでよかったです。

パーフェクトRuby on Rails

パーフェクトRuby on Rails

はてなブログに出戻り

wordpress -> はてなダイアリー -> Lokka -> はてなブログ -> octopress -> middleman-blog と来て、またはてなブログに戻ってきました。 ついでなので、過去の記事もなるべく移行してきました。

octopress の頃の記事は middleman-blog にちゃんと移行してあったので、あとは以下のようなスクリプトで MT 形式に書き出しました。

# $ bundle exec middleman console 内で。
template = <<EOT
AUTHOR: %s
TITLE: %s
DATE: %s
CATEGORY: %s
-----
BODY:
%s
-----
--------
EOT

File.open('/tmp/blog.mt', 'w') {|f|
  blog.articles.each do |article|
    body = article.body
    f.puts template % ['satococoa', article.title, article.date.strftime('%m/%d/%Y %H:%M:%S'), article.tags.join("\nCATEGORY: "), body]
  end
}

Lokka の記事もだいたいそんな上記みたいな感じで。 Lokka は heroku に置いてあったので書き出した後のテキストファイルをどうやって手元に持ってこようか悩んだのですが、

https://transfer.sh

を使うことで解決しました。

Web デザイナ向け GitHub ハンズオン at PHPカンファレンス2014

PHPカンファレンス2014P4D として Web デザイナ向け GitHub ハンズオン を開催します。

今回のハンズオンは前半・後半の2部構成で行います。 後半に関しては PHP カンファレンスの参加登録 以外にハンズオンへの 参加登録 も必要ですので、希望者は 忘れずに お願いいたします。

(前半は PHP カンファレンスの参加登録だけでご参加いただけます。)

前半: 講演 x 3 「Web デザイナが GibHub を使うと嬉しいこと」

前半は実際に GitHub を使って開発を行っている 3 名の方に講演をいただきます。

  1. @kenclo さん: (デザイナー)
  2. @machida さん: (デザイナー)
  3. @hiro_y さん: (エンジニア)

前半は事前登録等は不要です。そのまま会場へお越し下さい。 (希望人数によっては立ち見や、残念ながら入室いただけない可能性もありますのでお早めにどうぞ。)

後半: 「Web デザイナ向け GitHub ハンズオン」

後半は Web デザイナさん向けに、実際に GibHub でコミュニケーションができるようになるまでを体験していただくハンズオンをやりたいと思います。

Git についての事前知識は特に必要ありません。また、Git のバージョン管理という側面については最低限しか解説しない予定です。あくまで「GitHub を使ってエンジニアとコミュニケーションをとりながら楽しく開発ができる」ようになるためのハンズオンです。

そういう意味ではややニッチではありますが、取っ付きやすいテーマだと思いますのでぜひお気軽に参加してください。

参加される方は必ず以下の準備をしてきてください

ハンズオンへの参加希望の方は Web デザイナ向け GitHub ハンズオン in PHPカンファレンス2014 から参加者登録をお願いします。