@satococoa さんが「p4d で温泉ハッカソンやりたいけどだれか主催しませんか」と言っていたので手を上げて主催してきました。ちょうど、そろそろまた合宿やりたいと思っていた時期だったので渡りに船。

合宿場所は去年の別の合宿でも使ったはじめのいっぽ。日光は前回行ったときも相当寒かったので冬の格好をして行ったのですが、4月下旬で雪が降るほどとは…予想外でした><

Untitled

感想など

人数的にはエンジニア6人、デザイナー2人の総勢8人でハッカソンしてきました。デザイナーさんがいると、普段のエンジニアだけのハッカソンとは少し違う雰囲気になって刺激になります。

ハッカソンの内容的には、最近自分が主催するハッカソンでの定番スタイルである、「最初にやること宣言して最後に成果発表、それ以外は自由にもくもく」で進めました。最後の成果発表では多種多様な取り組みが見れるので毎回楽しいです。

僕はずっと続けているwebサービス開発の地味な作業をひたすら続けていました。利用規約作ったり、SSL証明書を購入して設定したり。仕事ではなく個人でwebサービスを作る場合、こういうモチベーションの上がらない地味作業をいかにして進めるかがとても重要になってきます。ハッカソンという場を利用して地味作業をこなしていくのはとても良い手段ですね。最後の成果発表も地味になってしまうのが玉に瑕ですが…。

まとめ

やっぱり合宿楽しいです。次は夏に避暑地でハッカソンしたいですねー。

これまで、さくらVPSのサーバ(CentOS 6.3) で、なぜか https のリポジトリから git clone ができませんでした。他のプロトコルを使えば問題なく clone できるのですが、なんとなく気持ち悪い。今日ようやく解決法が分かったのでエントリとして残しておきます。

さくらサーバからgistのリポジトリをcloneできない · Issue #1 · willnet/misc

やり方

git をソースコードからコンパイルします。まずは必要となるパッケージを入れます。

yum install -y zlib-devel perl-devel gettext curl-devel

次に git のソースコードを下記URLからから落として展開。

git-core - Git - the stupid content tracker - Google Project Hosting

あとは普通に

./configure
make
sudo make install

でOK。

参考

表題の通りのメモ。rails で一部のパスだけ http 、他は https にしたいなーと思ってざっくり調べたのでした。

調べたこと

  • Rails 3 では config.force_ssl = true としたら rack-ssl が使われる
    • Rails 4 では ActionDispatch::SSL が使われる
    • ソース見た感じ、 ActionDispatch::SSL は rack-ssl を少しだけいじったものに見える
  • rack-ssl には、ssl の対象にならない条件を exclude オプションに callable なオブジェクトを渡すことで指定できる
  • Rails 4(ActionDispatch::SSL) では exclude オプションが無い

なぜ ActionDispatch::SSL に exclude オプションが入っていないか(削除されたか)というと、 rack-ssl(および ActionDispatch::SSL) で使われる HSTS はドメインごとの指定なので、そもそも rack-ssl (およびActionDispatch::SSL)は http/https の混在をさせる想定の設計じゃないんだよとのこと。

もし Rails 4 で exclude オプション使いたければ、 ActionDispatch::SSL と rack-ssl を差し替えてやればできそう。しかし上述の理由によりほぼ意味がない。

結論

http/https の混在環境を作りたければ ActionController の force_ssl を使うべき。

参考

coffee script のバージョンを上げたらテストがこけるようになりました。問題となったのは下記のようなコード。これは 1.4 では動きますが 1.5 だとコンパイルエラーになります。

func 'arg'
  hoge: 'fuga'

関数に渡す引数が複数で、かつ改行後にオブジェクトを渡している場合、改行前にカンマが必須になりました。下記のようにすると動きます。

func 'arg',
  hoge: 'fuga'

参考

Change in argument handling with 1.5 breaks code that worked in 1.4 · Issue #2715 · jashkenas/coffee-script

有名なRails用認証プラグインである devise は、機能毎にモジュール化されており必要な物だけを選んで使うことができます。例えば Confirmable というモジュールを使うと会員登録時に確認メールを飛ばすことができます。ただ、デフォルトではメールアドレス変更時には確認メールが飛びません。そこで下記のやり方でメールアドレス変更時にも確認メールを飛ばすようにしました。

やり方

User モデルを devise 用のモデルとして使っていると仮定します。

config/initializer/devise.rb に下記の一文を追加します。

config.reconfirmable = true

さらに、メールアドレス変更時の一次保存用カラムを追加します。

rails g migration add_unconfirmed_email_to_user unconfirmed_email
rake db:migrate

これだけでメールアドレス変更時に確認メールが飛ぶようになりました。だがしかし、送信されるメールの文面がユーザ登録時と同じです…。テンプレートの切り替えは難しい(devise のソースコード自体に手を入れないとダメ)ので、テンプレート中で分岐させます。

# views/devise/mailer/confirmation_instructions.text.erb
<% if @resource.unconfirmed_email %>
下記のリンクをクリックするとメールアドレスが変更されます。
<% else %>
下記のリンクをクリックしてユーザ登録を完了してください。
<% end %>
<%= confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>

あとメール中のURLをクリックした後表示される flash メッセージも同じになります。これも切り替えるのが難しいので、会員登録でもメールアドレス変更でも意味の通る文言にしておく必要があります。"メールアドレスの確認が完了しました" とか。

どうしてもメッセージを別にしたい場合は ConfirmationsController をオーバライドする必要があるでしょう。

所感

たかだか「メールアドレス変更時にも確認メールを出す」をきちんとやろうとしたくらいでそれなりにきちんと(stackoverflow みたり github の issue みたりソースコード読んだり)調査する必要があったので、初心者に devise は大分厳しいなーという気持ちになりました。devise が敷いてるレール上から外れない前提なら便利だと思いますが、それなりに凝ろうとしたら死あるのみではないでしょうか。

だからと言って上級者な人なら devise を便利に使えるかというとそうでもない気もします…。最近はみなさんどんな認証ライブラリを使ってるのでしょうか。