技術ブログのためのHexoのテーマ Ingenuous をリリースしました

先日ブログエンジンをHexoに移行したのですが、その際に下記のページのテーマをひと通り試してみました。

しかしどれもしっくりこなかったので、デフォルトのテーマ Landscape をベースにして自分好みのものを作りました。

変更がそれなりの分量になったので、Ingenuousと名前をつけてリリースすることにしました。

kwhrtsk/hexo-theme-ingenuous

欲しい機能を追加したり、スタイルを部分的に自分好みに修正したりしています。 基本方針は「自分の技術ブログに必要十分な機能とスタイル」です。

主な追加機能・変更箇所は下記の通り。

  • モバイルの画面で、コードブロックにより多くのコードが表示されるように修正
  • サイドバーにAboutウィジェットを追加
  • モバイルのナビゲーションメニューにサイドバー(モバイルでの表示時は画面下部へ移動)のアイテムへジャンプするリンクを追加
  • 投稿ページにシェア数を表示
  • 記事内にTOCを表示する機能追加(front-matterでtoc: trueを指定)

あとは過去記事のページネーションなど細かい修正をいくつか。

オリジナルのLandscapeはMIT License、IngenuousもMIT Licenseです。

RailsのエラーモニタリングツールErrbitのChefレシピ

4/17に大阪で開催されたRailsの勉強会でLTしてきました。

自分の発表資料をちょっと加筆修正したものを以下に公開しました。

テーマはRailsのエラーモニタリングです。

通知先はSlackという前提で、 exception_notificationというgemで直接Slackに通知する方法と、 New RelicやAirbrakeといったWebサービス経由で通知する方法、 Errbit というOSSのAirbrakクローン経由でSlackに通知する方法を紹介しました。

ErrbitはHerokuの無料枠で運用することが可能で、詳細なセットアップの情報が日本語でも見つかります。

Errbit - Railsアプリの本番エラーをherokuで管理、メール通知する【無料枠】 - 酒と泪とRubyとRailsと

今回はHerokuを使わずにオンプレやAmazon EC2のようなIaaSに自分でセットアップする方法を検討しました。

まずErrbitをセットアップするChefのレシピを探してみたのですが、見つかったものは対応しているErrbitのバージョンが古く、サポートもUbuntuのみでした。

errbit Cookbook - Chef Supermarket

自分はCentOSも好きなので、2015-04-17時点の最新のErrbitに対応していて、かつUbuntuとCentOSのどちらもサポートしているものを作成して公開しました。

errbit-server Cookbook - Chef Supermarket

今回はコミュニティクックブックを多めに使ってやってみました。大まかな構成は下記のとおりです。

  • コミュニティクックブックでやっていること
    • mongodbのインストール
    • rbenvとruby_buildのインストール
    • ruby 2.2.2のインストール(attributeで変更可能)
    • Errbitのチェックアウトと初期化
      • applicationクックブックを利用
      • application_rubyはマイグレーションでbundlerのrakeを使おうとせずにエラーになるのでスルー
    • ErrbitにバンドルされているUnicornをservice_factoryでサービス化(SysV or Upstart)
    • Unicornのlogrotate
  • 自前で追加した分
    • Errbitのデプロイ先のディレクトリレイアウト
    • Errbitの初期化処理(rake errbit:bootstrap)
    • ErrbitのUnicornを起動するためのラッパ作成
    • Errbitの設定値のための環境変数をattributeで設定する仕組み

Vagrantで動作を確認するための手順をsampleディレクトリに置いています。下記のバージョンの組み合わせで動作を確認しています。

  • OSX Yosemite
  • Ruby 2.2.2
  • Vagrant 1.7.2
  • VirtualBox 4.3.26
  • CentOS 6.6 or Ubuntu 14.10

CentOSで試すのであれば、ターミナルで下記のようなコマンドを入力すると、最終的に http://192.168.33.10:3000/ でローカルVM上のErrbitにログインできます。

Read More

Sidekiqのコードに潜む愉快なメソッドたち


少し前にRails4.2のActiveJobのバックエンドについて調べました。

Resque、SidekiqからSucker PunchまでActiveJobのバックエンドについてひと通り調べてみた

このときSidekiqのコードを読んで、Celluloidによるアクターモデルで並行処理を実装していることを知りました。 ちょうどScalaやErlangでアクターを使う方法を調べていたところだったので興味がわき、Celluloidを利用したアプリケーションのサンプルとして読んでみることにしました。

その時見つけた愉快なメソッドを紹介します。

今回読んだSidekiqのバージョンは3.3.3です。

注意事項

  • 本エントリはSidekiqやアクターの解説記事ではありません。
  • 記事に機種依存文字が含まれています。
    • OSXのChromeとFirefox、iOSのSafariとChromeでのみ表示を確認しています。
    • iOSのブラウザではGithubから引用しているコードの一部が化けます。

Read More

Rails 開発をサポートするChrome拡張 Rails Panel の機能と仕組み

7 must have Development Gems to install on every project

この記事を読んでいて、Rails PanelというChrome拡張を知りました。

Rails Panelでできること

デベロッパーツールにRailsというパネルが追加されます。 このパネルでは、ページリクエスト単位で下記のような情報を表示することができます。

  • Breakdown: 処理時間の内訳(ActiveRecord, Rendering, Other)
  • Params: コントローラから参照できるparamsの内容
  • ActiveRecord: そのリクエストを処理する際に発行したSQLと処理時間
  • Rendering: ビューテンプレートごとの描画時間

要するに rails server の標準出力(あるいは log/${RAILS_ENV}.log)の情報を見やすく表示してくれます。

Read More

Resque、SidekiqからSucker PunchまでActiveJobのバックエンドについてひと通り調べてみた

ActiveJobのバックエンドと、永続化先としてRedisが好まれる理由

Rails 4.2で、ActiveJobというクラスが導入されました。

これ以前より、Railsで非同期処理を行う際にはResqueやSidekiq、Delayed Jobなどが広く使われていましたが、 ActiveJobはジョブを記述するためのインタフェースを抽象化して、 ジョブの実装を変えること無くジョブランナーを切り替えることを可能にするものです。 なおActiveJobにおいては、バックエンドを指定しなければジョブは非同期実行しようとしても即座に実行されます。

Rails 4.2.0時点では、ActiveJobのバックエンドとして以下のページにある9つのいずれかを使用できます。

ActiveJob::QueueAdapters

  • Backburner
  • Delayed Job
  • Qu
  • Que
  • queue_classic
  • Resque 1.x
  • Sidekiq
  • Sneakers
  • Sucker Punch

ちなみにRuby ToolboxのBackground Jobsというカテゴリの上位3つは、Resque、Sidekiq、Delayed Jobでした。この3つがよく使われている印象です。

The Ruby Toolbox - Background Jobs: Save jobs in a queue and process them later wihout blocking your current thread

特にResque、Sidekiqは、ジョブの情報を永続化する先としてRedisを必須としています。

情報の保存先ならActiveRecord(RDBMS)でも良さそうなものですが、あえてRedisを必須としている理由は何だろうか考えてみました。

ぱっと思いつくのは、「キューにジョブが積まれた」というイベントをワーカーへ伝えるための手段として、 RedisのPub/SubBLPOP/BRPOPのようなメッセージング機構を使うのが簡単で都合が良かったのではないか?ということです。

バックエンドにMySQLのようなRDBMSを使う場合、普通に考えるとワーカー側はジョブを保存したテーブルをロックしつつポーリングしないといけないのでスケールしなさそうだし、 RabbitMQのようなメッセージングサービスを用いるのと比べて、RedisであればRailsエンジニアは元々better memcachedとして使用しているケースが多いので導入のハードルが低いです。

というわけで、このエントリではResque、Sidekiqの2つについてはRedisのメッセージング機構を使っているかどうかを確認しつつ、 ActiveJobのページに挙げられている9つのプロダクトについてジョブ情報の保存先を調べてまとめてみようと思います。

9つの中で特にSucker Punchはジョブの保存先もワーカープロセスの起動も必要とせずに非同期処理を行えるので、簡単に作りたいならおすすめです。詳細は後述。

Read More

Chef 12のオープンソース版と25ノード制限について

Chef バージョン12がリリースされました。

ところで下記のニュースで気になる記述がありました。

ビジネスモデル面でも変更があり、 オープンソース版(「Chef Essentials」)と商用版(「Chef Enterprise」)を単一のコードベースに統一し、 新たにフリーミアムサブスクリプションモデルを導入した。 新たに導入された無料の「Chef Essentials」プランでは、25ノードまで(ホステッド版では5ノードまで)の設定管理が可能となっている。

オープンソース版のライセンスが変わって、25ノードまでの台数制限が入った ようにも読めます。

マジか。

さすがにそれは無いだろうと思ったけど念の為に本家の情報を確認。

Chef | IT automation for speed and awesomeness | Chef

上記のページより、ライセンスと価格についての表示を引用します。

CHEF Essentialsというのがオープンソース版ですね。ここに下記のような記述があります。

Premium Features

・Access to premium features for up to 25 nodes ・Hosting available for up to 5 nodes

つまり25ノードに制限されるのは、Essentials版そのものではなく、 SubscriptionとEnterprise Subscriptionの欄に書かれている Premium Featuresだけです。

Premium Features

・Management console with reporting and role-based access control ・Analytics platform ・High availability ・Replication ・Available as hosted service

以下の機能はEssentials版でも無制限に利用できます。

✔ Chef server

    ✔ Manage 10,000+ Nodes with a single Chef server
    ✔ Maintain a searchable blueprint of your infrastructure
    ✔ Easy Installation with Omnibus installer

✔ Chef client

    ✔ Easily manage Linux, Windows, Mac OS, Solaris, and FreeBSD

✔ Chef development kit

    ✔ Everything you need to start managing applications and infrastructure with Chef
    ✔ Download and install in just a few clicks

✔ Integration with all major cloud providers
✔ Easily manage containers in a versionable, testable and repeatable way. 

ありえないと思ったんだけどドキドキした。

何か勘違いがあれば @KawaharaTaisuke 宛までご指摘いただけましたら幸いです。

リンク

knife solo prepareでエラー

knife-soloをインストールしたら何故かchef 12.0.0.alphaがインストールされてしまいました。

$ gem install knife-solo
Fetching: chef-zero-2.2.gem (100%)
Successfully installed chef-zero-2.2
Fetching: chef-12.0.0.alpha.1.gem (100%)
Successfully installed chef-12.0.0.alpha.1
Thanks for installing knife-solo!

If you run into any issues please let us know at:
  https://github.com/matschaffer/knife-solo/issues

If you are upgrading knife-solo please uninstall any old versions by
running `gem clean knife-solo` to avoid any errors.

See http://bit.ly/CHEF-3255 for more information on the knife bug
that causes this.
Successfully installed knife-solo-0.4.2
Parsing documentation for chef-12.0.0.alpha.1
Installing ri documentation for chef-12.0.0.alpha.1
Parsing documentation for chef-zero-2.2
Installing ri documentation for chef-zero-2.2
Parsing documentation for knife-solo-0.4.2
Done installing documentation for chef, chef-zero, knife-solo after 20 seconds
3 gems installed

opscodeのchefのインストーラはまだ未対応なのか、knife solo prepareが失敗するようになってしまいました。

Read More

Vagrantの上のCentOS 6.5でyum updateした後、vagrant upで発生したエラーの原因と対処

概要

Vagrant + VirtualBoxで動かしているCentOS 6.5のVMでyum updateしたら、 その後のvagrant up実行時にエラーが出るようになったので原因を調べてみました。

$ vagrant up

(snip)

default: /vagrant => /Users/kawahara_taisuke/Documents/program/ruby/vagrant-test
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

忘れた頃にまた踏みそうなのでメモしておきます。

Read More