読者です 読者をやめる 読者になる 読者になる

君だけの最強の開発環境を作ろう2015

ここ数日は早起きして仕事をしています。今日は7時半に出社して調子が良いので、300年ぶりにブログを書こうと重い腰を上げました。
早起きの原因はマネジメントから開発に戻ったのが大きい気がするのですが、そんな開発で使ってるものたちを今日は紹介しようと思いました。

RubyMine

www.jetbrains.com

RubyIDEです。Vimはこの1年で使うのをほとんど辞めました。
2015年にもなってIDEならではの機能を今さら紹介するのはアレなのですが、一つだけ紹介するならtypoの発見機能が便利です。
typoしてる部分が波線表示されるので見つけやすいし、見つけた後にリファクタリング機能で一括置換できるのも便利ですね。
Rubyのgemはキラキラネームが多いので軒並みtypo判定されるのが辛いですが、そういう時はユーザー定義辞書を食わせることもできるのでがんがん辞書に追加しましょう。

他の便利機能はぐぐれば山ほど出てきます。

Sequel Pro

Sequel Pro

複数DBを扱うプロジェクトで、mysqlのコンソールでがんばってSQLを打ってる人は今すぐこれをインストールしましょう!
DBの切り替え、テーブルの定義や値の参照、更新なんかもGUIで超お手軽です。タブで複数DBを開いておけば切り替えも超簡単。
O/RマッパーとこのツールのせいでSQLは全部忘れました。

PlantUML

plantuml.sourceforge.net

テキストからUMLに変換してくれる便利なやつです。Cacooとかで図を書くのが便利なときもあるんですが、やっぱりテキストで書くとgitで管理できて便利ですね。
またPlantUMLはConfluence にも対応していて、Confluenceに貼り付けることもできます。
テキストからUMLへの変換はJavaで行うんですが、これが大変遅くてイライラします。そんな時はGruntなんかで自動化したり、Tomcatを立ててその中でPlantUMLを使うようにすると良いです。

ちなみにPlantUMLを記述するエディタは個人的にはAtomがオススメです。

Atom

atom.io

PlantUMLとMarkdown書くときはこのエディタを使ってます。どちらもプレビューを確認しながら編集できるのが便利です。
Markdownを書く時は、Ctrl + Mで画面が分割され、右側にリアルタイムでMarkdownのプレビューが表示されて捗ります。
Atomは画像も表示できるエディタなので、

  • 画面分割して片方にPlantUMLで生成された画像を表示し
  • 片方でテキストを編集して保存
  • 裏側でGruntでテキストから画像に変換
  • もう片方の画面の画像が自動でリロードされる

というような流れで開発をしています。

HHKB Pro Type-S

Happy Hacking Keyboard | HHKB Professional2 Type-S | PFU

おっさんなのでCUIからGUI多めの環境に切り替えてタイプ数は減った気がするんですが、やっぱりキーボードは大事です。
5年くらいHHKB Pro2を会社で使ってたんですが、家でも使いたくなったのでもう一個買いました。
せっかくなのでType-Sにしてみたら+5000円で段違いの気持ち良さなので、「黒のほうがかっこいいからType-Sはちょっと…」って思ってる人は考えなおしてみてもらいたいです!

まとめ

おっさんなので枯れたものばかりですが、GUIは最高なので、5月病にかかる前に開発環境を見なおしてみてはどうでしょうか?
新卒の方々はそろそろ配属されて開発を始める人もいるでしょうし、自分なりの最強の開発環境を構築してみてはいかがでしょうか?
GWの間に友達と差をつけよう!

SinatraでCookieを発行するときの設定

このブログを全然更新してなかったら生死の心配をされたので、久しぶりに何か書きます。

RubyでWebアプリといえばRailsが主流ですし、Web APIだったらGrapeだったりするのかもしれませんが、今回はあまり話題にもならなくなったSinatraの話です。
そんなSinatraCookieを発行する際に、domainやpathをどうやってセットするのかわからず、ぐぐってもパッと出てこなかったので書いておきます。

まずSinatraCookieを発行する場合は以下のように書けば良いです

  delete '/perl' do
    cookies[:perl] = 'dead'
  end

しかし、この時に発行されるCookieのdomainやpathはリクエストがあったサーバのホストとリクエストのパスになるようです。
クライアントからのリクエストを一旦プロキシサーバが受けて、その後別のホストにプロキシしてるような特殊な環境下でこのまま処理を行うと大変なことになります。
というわけでdomainとpathを設定しましょう。

class Hoge < Sinatra::Base
   set :cookie_options, { domain: 'example.com', path: '/' }
   
   delete '/perl' do
     cookies[:perl] = 'dead'
   end
end

cookie_optionsにいろいろ設定すれば良いだけです。簡単でした。
ちなみにdomainとpath以外にも、secureとhttponlyもちゃんと設定できます。

Sinatraはログ周りとかちゃんと設定しないと本番で運用するのは大変ですが、やってることはシンプルなのでパフォーマンスとか求める場合は良いのかなーと思ったりします。ただRailsが遅いのはActiveRecordが原因だったりするので、SinatraActiveRecord使っちゃうとあんまり意味ないことになるんですけどね…。

ドミニオン日本選手権2013に行ってきた

毎年なんだかんだで参加してるドミニオン日本選手権も今年で3回め。1回めは4戦目で1点差で負けてなければ予選突破、2回めはなぜか4位くらいで予選突破と例年そこそこ好調で、3回めの今年はどうなったのか振り返りです。

当日まで

今年は基本+暗黒時代で予選が行われるのですが、たしか暗黒時代が発売されたのは年末で、友人らと推奨セットで1回遊んだきり、クソゲーなのではと感じてそれ以来ドミニオン自体やってませんでした。さすがにカード名も効果も忘れた状態で予選に行くのは…と思い、前の週にひと通りのカードを使って軽く練習はしました。

当日

午後から野球を見に行くことを考慮して初めての午前の部参加。10時代々木集合で平日会社行くより早いという難易度の高さだったけどなんとか到着。まなめさんがテレストレーションでキャッキャウフフしてるのを眺めつつ席に着席。周り全員が木ドミの人ぽかったけど、その後席替えがあって助かった。

1回戦 救貧院、礼拝堂、木こり、死の荷車、庭園、泥棒、民兵、議事堂、研究所、祭壇【避難所】

3番手スタート。庭園が見えたので庭園ゲー行こうと思ったけど(庭園行っておけば最下位は無いやろという考え)、突然の2−5だったので礼拝堂、研究所スタート。二人が庭園泥棒に行ったので、銅貨はあまり廃棄せず、むしろ途中で議事堂で銅貨を1枚買ったりしつつ、金銀と属州を買って勝利。

2回戦 賢者、宰相、改築、行進、城塞、ねずみ、密偵、山賊の宿営地、地下墓所、狩場【避難所】

2番手スタート。宰相スタートもあるかな?と思ってたらまたもや2−5スタート。山賊の宿営地、屋敷から。銀貨と金貨を買った辺りで狩場を入れたけど、先に狩場を入れた人のほうが速かったですね。残り二人がねずみ買って遊んでたので2位

3回戦 浮浪者、堀、隠遁者、賢者、浮浪児、襲撃者、泥棒、役人、議事堂、偽造通貨【避難所】

ついに来た4番手スタート。そして3−4スタート。負けムード漂う中、普通に言っても速度負けしそうなので浮浪児、襲撃者スタート。そうしたら3ターン目に傭兵を手に入れて一気に手番差を取り戻したかに思えたが、その後傭兵と襲撃者がかぶったりして一度も襲撃者を使うことはなく、金と偽造通貨と議事堂を入れて普通にやってたら2位。最後に1番手の人が偽造通貨使って属州2枚買って終わった。最後は手番差に泣いた。

4回戦 地下貯蔵庫、物置、改築、ゴミあさり、封土、役人、騎士、書庫、盗賊、墓暴き【避難所】

3回戦終了時点で15位?だったので2位条件。3番手スタートで2−5スタート。地下貯蔵庫、盗賊からだったはず。盗賊から入ってその後墓暴きをぶん回せば2位は確保できるんじゃねーの?という発想。盗賊で良い感じに落としつつ、下家の盗賊が他の人に刺さりつつそれを回収しつつと良い感じに回りつつ、途中から公領買い集めて2位を確保しに行った。下家の封土改築が良い感じに回って属州も買い集めてたので2位で終了。3位の書庫ステロと1点差でやばかった。

結果

18位で見事予選突破を決めました。でも次の日はミニ四駆ジャパンカップと阪神戦があったので辞退して、代々木でチャーハンカツカレー食って帰りました。

High Performance Ruby行かなかった会議2日目

チケット持ってなくて1日目行ってないので、当然2日目も行ってません。今日はPerlを書いたり、さよならクロールを貰ったりしました。

さて、今日はRubyKaigiでHigh Performance Railsという発表があったらしいので、Rails 4でのキャッシュ(fragment_cache)の話でも書こうかと思います。既出だったらすみません…。

Cache Digests

Rails 4でもfragment_cacheの使い方は変わりません。ただCache Digestsというものが入っていて、キャッシュのキーにdigestが追加されるようになりました。
digestはテンプレートを元に作成されるので、これによりテンプレートが更新された場合にfragment cacheがヒットしなくなり、テンプレ更新時のキャッシュ削除忘れ事故がなくなるわけですね!便利!!

= cache 'aaaa' do
  %strong キャッシュして!!

こんな感じでキーを指定した場合には、"views/aaaa/1ed3444c6df4ab6dd640ab7196df711b" というようなキーでキャッシュされます。

ちなみにdigestを追加したくない場合は第二引数にskip_digest: trueを渡せば良いです。

= cache 'aaaa', skip_digest: true do
  %strong digestなんていらない!!

Rails 3でもこの機能を使いたい人はcache_digests( https://github.com/rails/cache_digests ) をインストールすれば使えます。

Sweeper追悼…

Rails 3まではキャッシュの削除にSweeperを使えば良い感じに書けたんですが、Rails 4からSweeperはなくなりました。追悼…。Observerがgemに切りだされたみたいなので、そっちに行ったっぽいです。
https://github.com/rails/rails-observers

ただ、先に紹介したCache Digestsを使うとキーにdigestが付与されるので、expire_fragmentでの削除が不可能です。(キーの指定に正規表現を使えばできるかもしれないですが…。)
じゃあモデルに変更があった時にキャッシュの削除をしたい場合どうするんだぜ?と思ったのですが、キャッシュのキーにupdated_atを含めておくと、モデルに変更があればキーが変わって問題ないっぽいです。
詳しくはこのあたり http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works

こうなるとキャッシュのお掃除をどうにかする必要があるんですが、めんどくさいのでexpireを指定して保存すると楽ですね。というわけでcache_storeをredisにします。

redis-store

cache_storeをredisにすると言ったんですが、あまりおすすめできません。
理由はredis-storeのgithub( https://github.com/jodosha/redis-store ) を見るとわかるんですが、pull requestが放置されまくり、半年間コミットもなく、依存関係があってrails 4と一緒にインストール出来ないからです。
それでも使いたい場合はforkして、こんな感じに修正すればインストール出来ます。
https://github.com/tohae/redis-store/commit/da281bad747b2f19107b802522a0881bae3d1440

今やってるRailsプロジェクトでは、セッションをredisに保存してnode.jsと良い感じに共有したかったのでredisにしたんですが、特に理由がないならmemcachedとかに保存するほうが良いと思います。この辺りもいつかブログに書きたい…。


というわけでRails 4でのキャッシュの話でした。数ヶ月前はRails 4も不安な感じありましたけど、最近は特に困らず使えてるのでさっさと上げてしまうのが良いと思います。Railsプロジェクトはバージョンアップとの戦いなので、後回しにせず早め早めにやりましょう!!1

RubyKaigi1日目に行きませんでした

前ほど仕事でRuby使ってないし、値段も高いということで不参加をキメたんだけど、twitter見てるとRubyでわいわいやってるのが憎かったので、Perlは一行も書かず、Rubyを書き、RubyMotion*1を買い、なるほどUnixプロセス*2を買って読みました。

勢いで買った(買わされた)RubyMotionがなかなか良い話

後ろの人がRubyMotion会議に行ってきた影響で、RubyMotion推し推しだったので、それに影響されて買いました。RubyMotionはRubyKaigiやってるおかげで数千円安く買えてよいです。

iOSアプリの開発を一から始めようとすると、Xcodeの使い方、Objective-Cの文法、iOSアプリ開発のあれこれを覚える必要があると思うのですが、RubyMotionだと、Xcodeの代わりにVimなどの好きなエディタとコマンド、Objective-Cの文法の代わりにRubyが使えるので、iOSアプリ開発のあれこれを覚えるだけですんでだいぶ敷居が下がる気がします。
コマンドでプロジェクト作成して、rakeでビルドしてiPhoneシミュレーターが起動するのは感動的です。

あとiOSアプリ開発、最初は何していいか全然わからないんですけど、RubyMotionはサンプルコード*3がGitHubに結構上がっていて、それを見ればなんとなくわかる気がします。初心者にはすごくありがたいです。

Objective-Cを理解してる人にとってはあまりメリットが無いのかもしれませんが、RubyMotion用のgemがいろいろあるみたいなので、これらを使うようになればRubyMotionの方が便利なのかもしれません。sqliteActiveRecordっぽく使うやつとかあるみたいですし。

エディタはVimでもなんとかなるんですが、クラス名やメソッド名が長いので、スニペットくらい作っといた方がいいような気がします。
スニペットはこれを参考にしました。 http://qiita.com/items/b443536fa1727a8017da
ただ、スニペットが巨大になるので、普通のrbファイルを開くときに重くていらっとするのでちょっと微妙です。
SublimeTextとかRubyMineに課金しても良いかもしれません。

Perlでプロセスのあれこれをするために勢いで買ったなるほどUnixプロセスがなかなかいい話

RubyMotionで遊んでばかりはさすがにあかんやろと思い、Perlの仕事に戻ろうと思ったんですが、シグナルとかプロセスをあーだこーだするのに、改めてこの辺りを勉強したほうが近道になるのではと思い気になってたなるほどUnixプロセスを買いました。
まだ半分くらいしか読んでないですが、今まで「なんとなくこういことかな?」って思ってたのが、しっかり説明されていて整理できて良い感じです。サンプルコードがRubyなのでわかりやすいです。2,3年前にこの本があればよりうれしかったです。

Perlさいこ〜

Perlの仕事が原因で?、急性胃腸炎になり、微熱が続き、甲状腺機能低下症の疑いがあったりしましたが、腹は治り、血液検査も正常だったので、ぼくは元気です。
というわけでPerlサイコーすぎるので、RubyKaigiの次はYAPC::Asia行きましょう!!! http://yapcasia.org/2013/
ぼくは行きません!!!!

!!1;

*1:http://www.rubymotion.com/

*2:http://tatsu-zine.com/books/naruhounix

*3:https://github.com/HipByte/RubyMotionSamples

Railsでbowerを使ってJSのライブラリを管理する

最近Perlで仕事をしていて、cpanfileが無いプロジェクトで盛大にやらかしたtohaeです、こんにちは。
Perlでやらかした経験を生かし、Railsプロジェクトで使うクライアントサイドのJSもちゃんと管理しようとbowerを使うことにしました。

bower is 何?

bowerってのはtwitterが作ったJSのパッケージマネージャです。最近紹介記事も多いので、詳しくはぐぐってください。
簡単に言うとJSをwgetする時代は終わったってことです!!!
今回はbowerの紹介ではなく、bowerをRailsで使う場合にはbower-railsを使うといいかもというお話をします。

bower-railsの下準備

まずはbowerをnpmで入れます。

$ npm install bower -g

次にGemfileにbower-railsを追加します。現時点ではバージョンを指定しないとちょっと古いバージョンが入るので注意。

gem 'bower-rails', '0.3.1'

Railsjqueryを使う場合はjquery_ujsを使うためにjquery-railsを使ってることが多いと思いますが、jqueryjquery_ujsはbowerで管理するため、Gemfileからjquery-railsを消しておきます。

bower.jsonでなくJsfile

bowerはboewr.jsonに依存関係を定義しますが、bower-railsはGemfileのようにRubyで書きたい人のために独自のDSLが用意されています。
独自DSLを使う場合は、Jsfileというファイルを作成し、以下のように記述します

assets_path "assets/javascripts"

# Puts files under ./vendor/assets/javascripts
group :vendor do
  js 'jquery', '2.0.0'
  js 'jquery-ujs' # Assummes it's latests
  js 'jquery-autopager', 'http://lagoscript.org/files/jquery/autopager/jquery.autopager-1.0.0.js'
end

Gemfileみたいで親しみやすいですね!
このように記述して以下のコマンドを実行します。

$ rake bower:dsl:install

実行するとvendor/assets/javascripts以下にbower.jsonが作成され、それをもとにbower installがされてvendor/assets/javascripts/components以下にJSが入ります。

このままではassetsで使えないので、vendor/assets/javascripts/componentsをassets pathに追加しましょう。

# config/application.rb
config.assets.paths << Rails.root.join("vendor", "assets", "javascripts", "components")

最後にJSのrequireのパスを書き換えて完了です。今回のJsfileだと下記のような感じになります。

//= require jquery
//= require jquery-ujs/src/rails.js
//= require jquery-autopager/index.js

bowerで入るディレクトリ構成上、jquery-ujsとか若干ださい感じに…。jquery-railsはいつもどおり使った方がいいかもしれません。

cap deploy!!!!

capistranoでbundle installするような感じでbower installするとしたら、こんなタスクを書けば良さそうです。

namespace :bower do
  task :install do
    run "cd #{latest_release} && bundle exec rake bower:dsl:install"
  end

  task :update do
    run "cd #{latest_release} && bundle exec rake bower:dsl:update"
  end
end
after "deploy:finalize_update", "bower:install"

ちなみにbowerはGit Read-Onlyなgit://を使うのですが、環境によってはこのプロトコルが使えないことがあってハマりました…。そういう場合にはhttpsを使うようにgitconfigを修正すればいいようです。
参考: http://stackoverflow.com/questions/4891527/git-protocol-blocked-by-company-how-can-i-get-around-that/10729634#10729634

まとめ

こんな感じでRailsのJSをbower-railsを使ってJsfileで管理するようにしてみました。
Gemfileやpackage.jsonやcpanfileとかいろいろ便利な世の中になったなーと思いつつも、いろんな言語を触るとそれぞれ少しずつ違ってイラっしてたんですが、今回紹介したJsfileはRubyでGemfileのように記述できるのでおすすめです。

2012年の振り返りと2013年の抱負

年が明けてだいぶ経ちましたが、あけましておめでとうございます。
1/5に27歳になり、本格的なアラサーになりつつありますが今年もよろしくお願いします。
ちなみに例のリストはこちらです!!! http://www.amazon.co.jp/registry/wishlist/MRQ3OS6NAULY

振り返り

去年はRailsECサイト?をやったり、ついカッとなって転職したり、転職後にPerlができるようになりつつあったらサンフランシスコでRuby書いてたりしました。
前半はあまり成長してる感が無かったのですが、転職してからはPerlやったり、成功してるサービスのPDCAの回し方を知ったり、GitHubを使った開発とか、海外での働き方とか、英語とか、いろいろ新しい体験もできてよかったかなぁと思います。
まぁ良くも悪くも海外出張が一番印象に残ってますね。
英語できないのはやっぱり辛かったです。言ってることは1割くらいしかわからないし(技術的な話題ならもう少しわかる)、言いたいことは1%も伝えられないしで無力さを痛感しました。
あとGitHubを使った開発は実に良いです。pull request使うとレビューが割りとうまく回る気がします。レビューされるのはありがたいです。前職で導入しようとちょっと動いたけどもっと真剣に動いておけばよかったとちょっと後悔するくらいです。

日本ではPerlだけど、サンフランシスコではRubyが使われてて、Rails以外で書かれたコンポーネントもあり、今まではRailsばかりやってきたので色々勉強になりました。ただ前職で約2年間、経験あるRubyistもいない状況でいろいろ模索しながらやってきたことは無駄ではなくて、他の環境でもちゃんと通用することがわかったのは良かったです。

抱負

今年はPerlを書くことになりそうな雰囲気が今のところあります。Perlは色々disりたいところが多々あり、勉強する意欲がなかなか湧いてこないのですが、チームの人達の足を引っ張らない程度にはちゃんと使えるようになりたいです。それと同時にPerlはやっぱり嫌でRubyPythonが好きという気持ちもあるので、RubyPythonの仕事を産み出せたら良いなと思っています。
あとはGitHubの使い方もだんだんわかってきたので、今年は何らかのオープンソースにpull requestを送りたいです。perlのHTTP::Sessionに投げたpull requestがマージされたので*1、この調子でがんばりたいです。英語もpull requestを送るときに不自由しない程度にはできるように勉強しようかと思います。


というわけで今年もよろしくお願いします!!!

*1:ノーテストでpull requestしたら「テスト書けや」って怒られたりしたけど…