Campfireを試しています

IRCの代替サービスを探す旅の一環として、少し前から37SignalsのCampfireを使っています。

やりたことはだいたいできるんですが、Macの専用クライアントを使わないと全体的にあと一歩という印象。

  • Roomから勝手に出てたりする(Chromeとの相性?Webインタフェースだけ?)
  • ブラウザ開きなおすと全Roomから出てたりして泣ける
  • mentionがイマイチ
    • するのもイマイチ
    • されても気付きにくい

いいところは

  • Githubのhookとかの表示がいい
  • 画像とかtwitterのURLとか、いくつか展開してくれるやつがある
  • ペーストした内容にパーマリンクがつく
  • chrome-extensionで通知できる
  • chorme-extensionでアイコンをつけることができる

Roomの扱いがもうちょっといい感じなるとIRCの変わりには使えるかなぁというところですけど、この旅の終着駅にはならなそうな感じです。

勤労に感謝して海浜幕張まで

服を買いにいく服がない状態だったので、海浜幕張のアウトレットパークまで。

幕張本郷からバスで行こうと思ってバス停にいったら、千葉駅伝であと1時間くらい通行止めですと言われて一回休み。 さすがに幕張本郷で1時間とか無理ゲーなので西船経由で海浜幕張まで移動して買い物して帰ったのでした。

あまりにレアなイベントに遭遇したので、そのうち何かいいことないかなぁ。

DevLOVE HangarFlight - Snow Barrage - でRailsとCIについてお話しします

同僚となった@papandaからオファーをいただきまして、12/10のDevLOVE HangarFlight - Snow Barrage -でお話させていただくことになりました。

「弊社でのJenkinsの運用を中心にRailsとCI(とサーバ仮想化)について」というJenkins勉強会でお話しした内容の最新版をお届けしようと思います。

私以外にも永和からは@haru01、@m_pixy、@papanda、そしてチェンジビジョンから@kompiroが登壇予定ですので皆さん奮ってご参加ください!

「Restoring Function and Form to Patterns」を読みました

原文ではなく、和智さんが翻訳してくださったものを読んだのですが、これはすごいものが出てきてしまいました… 前半は「Alexandeその人」と「Alexandeのパターン」に馴染みのない人(たとえば私)にはかなり読みにくいのですが、DCIアーキテクチャに興味を持っている方はぜひ最初から読むのを強くお勧めします。

p23の「機能の型」からは比較的身近な話が多くなるので、そこからまず読んでDCIアーキテクチャと実際のシステムの関連を把握するのもいいかもしれません。

さすがにこれを英語で理解できるとは思えないので翻訳してくださった和智さん、本当にありがとうございます。

読み終わってから、これは「音読会」が必要だと思ってメールを出そうとしたら、先に@kakutaniが音読会のメールを出していてふいたのが数日前の話。社内での音読会が楽しみでしかたありません。

tappについてそろそろ一言言っておくか

弊社で(総力を上げて)メンテナンスしているtappというライブラリがあるのですが、思ったより認知度が低いようなのでここで紹介させていただきます。

まとめ

tappは、従来のPrint Debugの問題点を解決する画期的なライブラリです。 次のような経験がある方は、いますぐGemfileにtappを追加することをお勧めします。

  • メソッドチェーンの間のオブジェクトの状態を見るためだけに一時変数を使ったことがある
  • ppやp、putsを消し忘れてリポジトリにコミットしてしまった

tappとは

tappは、Print Debugを簡単に行うためのRubyライブラリです。

リポジトリはhttps://github.com/esminc/tappになります。

tappの歴史

tappの作者である@ursmは、2008〜2009年頃に社内向けのモンキーパッチとしてtappを生みだし、Rails勉強会41.1回(Rails勉強会@東京第41.1回にいってきた - ayumin)や、InactiveSupportのご紹介により、一部のRubyistに広まることとなりました。

そして、その1年後の2010年7月7日にバージョン1.0.0がgemとしてリリースされました。

現在はリポジトリをesminc(会社の公式アカウント)に移し、開発を継続しています。

tappの機能

2011/11現在、tappは次の3つのメソッドを提供しています。

  • Object#tapp
  • Object#taputs
  • Object#taap

出力の形式に違いはありますが、要は**「レシーバをpp(puts,ap)して返す」**というだけです。

>> require 'tapp'
=> true
>> "hoge".tapp
hoge
=> "hoge"

これだけだとpp "hoge"と何が違うのかわかりませんね。tappを使いこなすには、「レシーバを返す」というところを上手く使えるようにならなければいけません。

tappの使い所

tappがあれば、急に次のようなコードのメンテナンスを依頼されても慌てることはありません。 {%img /images/kakutani_slideshare.png %} (SlideShareのページ指定埋めこみがうまくいかなかったので画像にしています)

Rubyでプログラムを書いていると、ArrayやHashに対してメソッドチェーンを使う場合が非常に多いと思います。そんなとき、メソッドチェーンの途中の状態を見たくなりませんか?

そこでtappの**「レシーバを返す」**というのが効いてきます。

例えば、「1から10までの数字で奇数だけを合計する」ような処理では、tappを使って次のようにメソッドチェーンの途中の状態を見ることができます。

>> (1..10).tapp.select(&:odd?).tapp.inject(&:+)
1..10
[1, 3, 5, 7, 9]
=> 25

tappを使わずに同じようなことをしようとすると、途中の状態を一時変数に入れなければなりません。tappがあれば処理の流れを切ることなく、自然にPrint Debugを差し込むことができます。

また、tappはBlock引数を受けとることができるので、Symbol#to_procと組合せることで任意の属性だけを出力することも簡単です。

>> User.first.tapp(&:name)
"kenchan"
=> #<User id: 1, name: "kenchan">

Print Debug消し忘れ対策としてのtapp

みなさん一度はリポジトリに対してppやpをコミットしてしまったことがあるのではないでしょうか。書き方によっては、ppやpはgrepで見つけることが困難になり、探すのに苦労することもあります。

そんなときもtapp系を使っていれば安心です。間違いなくgrepで見つけることができます。

また、v1.3.0からはtappのコマンドラインツールが同梱されており、バージョン管理にGitを使っている場合は簡単にtappを検索できるようになっています。

$ bundle exec tapp grep
Gemfile:  gem 'tapp'
Gemfile.lock:    tapp (1.3.0)
Gemfile.lock:  tapp

tappの落とし穴

Rails(ActiveModel)でtappを使う際には、AssociationProxyやScopeに注意しなければいけません。

普通に使っている分にはArrayのように見える彼等ですが、チェーンの間にtappを差しこんでしまうとそこでチェーンが切れてしまうため、その先がエラーになってしまう場合があります。

どこまでがScopeやAssociationProxyのチェーンになっているか見極めてtappを差し込みましょう。

おわりに

tappはオープンソースプロダクトです。みなさんからのpull requestをお待ちしています!

https://github.com/esminc/tapp