kaminari で Bootstrap のテーマを使う

$ bin/rails generate kaminari:views bootstrap

で Boostrap 用の kaminari のビューをダウンロードできる。 ただ、Bootstrap 2.0 のときのテーマなので、最新の 3.2 で使うには修正が必要。

app/views/kaminari/_pagenator.html.erb を次のように修正すれば使えた。

<%= paginator.render do -%>
  <ul class="pagination">
    <%= first_page_tag unless current_page.first? %>
    <%= prev_page_tag unless current_page.first? %>
    <% each_page do |page| -%>
      <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
        <%= page_tag page %>
      <% elsif !page.was_truncated? -%>
        <%= gap_tag %>
      <% end -%>
    <% end -%>
    <%= next_page_tag unless current_page.last? %>
    <%= last_page_tag unless current_page.last? %>
  </ul>
<% end -%>

amatsuda/kaminari_themes には Bootstrap 3 対応のプルリクエストがいくつもあるけど、どれもマージされていない。まぁ、これくらいの修正で使えるからいいけど。

Windows で自己署名証明書を作成するスクリプト

Windows AzureSSL のテストをやりたいときに、自己署名証明書を作成することがたまにある。

自分の場合、自己署名証明書の作成には、Windows SDK で提供されている makecert コマンドと pvk2pfx コマンドを使っている。 ただ、作成するのは稀だし、毎回作り方を忘れていてネットで調べていたので、スクリプト化してメモしておく。

SET FQDN=azure-sample.cloudapp.net
SET CER_FILE=%FQDN%.cer
SET PVK_FILE=%FQDN%.pvk
SET PASSWORD=test12345
SET BEGIN_DATE=01/01/2000
SET END_DATE=01/01/2100

rem 証明書作成
makecert -r -pe -n "CN=%FQDN%" -sky exchange %CER_FILE% -sv %PVK_FILE% -a sha256 -b %BEGIN_DATE% -e %END_DATE%

rem pfx ファイル作成
pvk2pfx -pvk %PVK_FILE% -spc %CER_FILE% -pfx %FQDN%.pfx -pi %PASSWORD%

ファイル名やパスワードは適当なものに変更して使うこと。

Devise でメールアドレスではなくユーザー名とパスワードでサインインできるようにする方法メモ

Devise ではメールアドレスとパスワードを使ってサインインするのがデフォルト。

メールアドレスではなくユーザー名、それとパスワードでサインインしたい場合はどうすればいいか? Devise が呼び出すモデルとコントローラーのメソッドを上書きするしかない。

やったことをメモしておく。

ユーザー名を保存する列を追加

すでに users テーブルを作っていたので、users テーブルに列を追加する。

$ rails generate migration AddUsernameToUsers

マイグレーションファイルの中身は次の通り。

class AddUsernameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :username, :string, null: false, default: ""

    add_index :users, :username, unique: true
  end
end

あとはマイグレーションを実行。

認証のキーにユーザー名を使えるようにモデルを修正

ユーザー名を使ってサインインするのは User だけなので、 User クラスで認証に使うキーを指定する。

class User < ActiveRecord::Base
  # 認証で使うキーを指定
  devise :database_authenticatable, :trackable, :validatable,
    authentication_keys: [:username]

  # ユーザー名で検索
  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if username = conditions.delete(:username)
      where(conditions).where(username: username).first
    else
      where(conditions).first
    end
  end

  # 登録時に email を不要にする
  def email_required?
    false
  end
  def email_changed?
    false
  end
end

ユーザー名を認証時のパラメータとして使えるようにコントローラーを修正

ユーザー名が Strong Parameters ではじかれないように対策が必要。

class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  # ...省略...

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:subdomain, :username, :email, :password, :password_confirmation) }
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:subdomain, :username, :email, :password, :remember_me) }
  end
end

ユーザー名を入力できるようにカスタムビューを作成

ユーザー名とパスワードでサインインするのは User だけなので、 異なるビューを使えるように initializers/devise.rb で設定する。

Devise.setup do |config|
  # ...省略...

  config.scoped_views = true
end

ビューを生成。

$ rails generate devise:view users

app/views/users/sessions/new.html.erb を修正し、ユーザー名とパスワードを入力できるようにする。

<%= form_for(resource,
             as: resource_name,
             url: session_path(resource_name),
             html: { class: "form-signin", role: "form" }) do |f| %>
  <h2 class="form-signin-heading">
    サインイン
  </h2>

  <%= f.text_field :username,
    class: "form-control",
    placeholder: "ユーザー名" %>

  <%= f.password_field :password,
    autocomplete: "off",
    class: "form-control",
    placeholder: "パスワード" %>

  <%= f.submit "サインイン",
    data: { disable_with: "サインイン中..." },
    class: "btn btn-lg btn-primary btn-block" %>
<% end %>

なお、今回作っているアプリは「ユーザー登録を行うのは管理者ユーザーのみ」という仕様だったので、 ユーザー名とパスワードでのサインアップは省いた。

Control + Space で Spotlight ではなく Alfred の検索フィールドを表示する方法

Control + Space は Spotlight の検索フィールドを表示するショートカットキーだけど、今は Alfred をメインに使っているから Alfred 表示したい。

違うショートカットキーを覚えるのはだるいので、Alfred が表示されるように設定してみた。MacBook を移行したときのために、やり方をメモしておく。

まずシステム環境設定のキーボードを開き、ショートカットを選択。Spotlight のショートカットを無効にする。

f:id:griefworker:20140821053018p:plain

そして、Alfred Preferences でショートカットに Control + Space を設定。

f:id:griefworker:20140821053030p:plain

Control + Space で Alfred が表示されるようになって、いろいろ捗る。

スイートバジル

5年ぶりくらいに、大名にある『スイートバジル』に行ってきた。当日夕方に電話で予約。人気の店だから無理かもな〜って思っていたけど、以前行ったときよりもテーブルが増えていたため席がとれた。ラッキー。

まず最初に食べたのが『海老とアボガドのディップ(400円)』。

f:id:griefworker:20140812194136j:plain

これ超旨かった。海老のぷりっとした食感と、アボガドのクリーミーさ。それにスパイシーな味付けが見事にマッチ。もう1つ注文しようかと悩んだくらいだ。

次は『自家製パンチェッタとアスパラ〜半熟卵添え〜(1200円)』というピザ。

f:id:griefworker:20140812195300j:plain

サクっとした軽い食感のクリスピー生地のピザ。アスパラはみずみずしく、ピザソースはそれに負けないしっかりとした味。酸味は感じなかった。半熟卵の黄身をからめて食べるのが旨い。

最後に食べたのが『柔らか牛ホホ肉の煮込み(1400円)』

f:id:griefworker:20140812202142j:plain

皿と肉が黒いから写真だとわかりにくい。 ソースは甘みとバルサミコの酸味が肉にあっていた。 ただ、肝心の牛ホホ肉が固くて、噛み切るのが大変。 ぜんぜん柔らかくなかった。 とろとろになるほど煮込まれているわけでもなく。 今日食べた中では一番高い料理だったけど、 期待が高すぎたのを差し引いても、一番不満。

牛ホホ肉は残念だったけど、ディップとピザは旨かった。 特にディップ。これはまた食べたい。 この店は肉料理よりもパスタを頼んだほうがいいのかもなぁ。

関連ランキング:イタリアン | 西鉄福岡駅(天神)天神駅赤坂駅

ミルク&ハニー福岡の生いちごミルク

昨夏期間限定でイムズにオープンして盛況だったらしい「ミルク&ハニー」が、今年もオープンしていたみたいなので行ってみた。

お目当ては『生いちごミルク(690円)』。

f:id:griefworker:20140816121411j:plain

氷はふわふわで口溶けがいい。 蜜は上質な苺ジャムのよう。 初めて食べるかき氷で、美味だった。…蜜がかかっている部分はね。 正直、氷の量に対して蜜とミルクの量が少なすぎると思う。 ポスターの写真とはだいぶ蜜の量が違っている。

f:id:griefworker:20140816122648j:plain

氷自体に味がついているわけではないので、途中氷ばかり食べることになって辛かった。 これで690円は高い。

関連ランキング:カフェ | 西鉄福岡駅(天神)天神駅天神南駅

ghq でリポジトリを管理するなら peco は必須

ghq で管理しているローカルリポジトリに移動するのを楽にするために、peco を導入することにした。

go get github.com/peco/peco/cmd/peco

でインストール。

ghq list -p | peco

ghq で管理しているローカルリポジトリインクリメンタルサーチできた。

peco で選択したリポジトリに移動したい場合は、

cd $(ghq list -p | peco)

を実行すればいい。

このコマンドを毎回入力するのはダルイので、エイリアスをつけておく。

alias g='cd $(ghq list -p | peco)'

g コマンドを実行するだけで、 ghq 管理下のローカルリポジトリを peco で選択し移動できるようになった。 便利。