Pow をアンインストール

だいぶ前に、マルチテナントの Rails アプリをテストするために Pow を導入した。

便利に使っていたけど、もう用済みになったのでアンインストール。

$ curl get.pow.cx/uninstall.sh | sh

Pow は Mac 以外で使えないのがもったいない。 Node ではなく Go で作られていたら Windows でも使えたりしたかもな。

環境や開発者ごとに異なる設定を記述するのに dotenv が便利だった

Rails アプリ開発中、メール送信機能をテストするには GmailSMTP サーバーを使うのが手っ取り早い。

その際、ActionMailer の設定に Gmail のアカウントとパスワードを書く必要があるけど、 開発者ごとに違うし、そもそもアカウントとパスワードをソースコードに直接書きたくない。

そういった環境や開発者ごとに異なる情報を記述するために、 dotenv(dotenv-rails) を導入してみた。

Gemfile に

gem "dotenv-rails", groups: [:development, :test]

を追加して bundle install

プロジェクトのルートディレクトリに .env ファイルを作成し、環境変数にセットしたい情報を記述する。

GMAIL_ADDRESS="your-address@gmail.com"
GMAIL_PASSWORD="your-password"

すると、config/environment/development.rb の ActionMailer の設定が次のように書ける。

config.action_mailer.delivery_method = :smtp
config.action_mailer.raise_delivery_errors = true
config.action_mailer.smtp_settings = {
  enable_starttls_auto: true,
  address: "smtp.gmail.com",
  port: 587,
  domain: "smtp.gmail.com",
  authentication: "plain",
  user_name: ENV["GMAIL_ADDRESS"],
  password: ENV["GMAIL_PASSWORD"]
}

bin/rails server で開発サーバーを起動すれば、.env ファイルに書いた環境変数が自動で読み込まれて ENV にセットされる。

.env ファイルをリポジトリから除外するように .gitignore に追加しておけば、 Gmail のアカウントとパスワードをソースコードに記述せずに、 心置きなくメール送信をテストできる。

RubyMotion をアンインストール

Apple の新言語 Swift を使い始めていて、思いのほか書き心地が良かったので、 iOS アプリ開発は RubyMotion から Swift に移行することにした。

そこで、後戻りできないように、MacBook から RubyMotion をアンインストール。

sudo rm -rf /Library/RubyMotion
sudo rm /usr/bin/motion
rm ~/Library/RubyMotion

書き心地というか、楽しさでは RubyMotion も負けていないんだけど、 ライセンス更新に毎年 10000 円ほどかかるのがツライ。 iOS Developer Program で 7800 円かかるから余計にね。

Rails 開発環境を構築するために Chef を使って PostgreSQL をインストールするメモ

Rails アプリの開発環境を Vagrant + Chef で構築していて、 PostgreSQL のインストールでつまづいたのでメモ。

まず Berkshelf で postgresql のクックブックをダウンロード。

echo cookbook "postgresql" >> Berksfile
berks vendor cookbooks

postgresql クックブックはそのまま使うと、どうしてもエンコーディングUTF-8 を指定してデータベースを作成できなかった。 対策として、postgresql をインポートするクックブックを新規作成する。

knife cookbook create postgresql_server_utf8

デフォルトのレシピを記述。

ENV["LANGUAGE"] = ENV["LANG"] = ENV["LC_ALL"] = "en_US.UTF-8"
include_recipe "postgresql::server"

環境変数をセットしているのがポイント。

あとは Vagrantfile に

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "hashicorp/precise64"

  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = ["./chef/cookbooks", "./chef/site-cookbooks"]

    chef.add_recipe "postgresql_server_utf8"
    chef.json = {
      "postgresql" => {
        "password" => {
          "postgres" => "postgres"
        },
        "initdb_locale" => "en_US.UTF-8",
        "config" => {
          "lc_messages" => "en_US.UTF-8",
          "lc_monetary" => "en_US.UTF-8",
          "lc_numeric" => "en_US.UTF-8",
          "lc_time" => "en_US.UTF-8"
        }
      }
    }
  end
end

を書いて、vagrant up/provision を実行すれば、 PostgreSQL をインストールできた。 エンコーディングUTF-8 を指定してデータベースを作成できるようにもなった。

博多 一双

久しぶりにラーメン屋を新規開拓したくなったので、博多まで足を伸ばしてみた。 ターゲットは博多駅筑紫口から徒歩6分のところにある『博多 一双』。

f:id:griefworker:20140906182107j:plain

入り口の券売機でラーメン(600円)とミニチャーハン(300円)の食券を購入。 兼虎のときも思ったけど、券売機だいぶ普及してるな。

まずラーメン。

f:id:griefworker:20140906182919j:plain

麺は中細。スープは、豚骨特有の臭みを感じない、クリーミーな豚骨スープ。 一幸舎の系統に近いかも。 ただ、チャーシューの脂身部分が気になった。 トロトロになるまで煮込んである方が好み。

あとミニチャーハン。

f:id:griefworker:20140906182714j:plain

タレでしっかりと味が付いていて、それでいてパラパラで旨い。 ラーメン屋にチャーハンがあったら毎回注文している気がする。 ラーメン屋のチャーハンは中華料理屋のそれよりも好きだな。

関連ランキング:ラーメン | 博多駅東比恵駅

Tiki

福岡市内の人気カレー店としてグルメ本ではおなじみの、 天神南にある『路地裏カレー Tiki』に行ってみた。

f:id:griefworker:20140906115511j:plain

目印の看板。ここから古民家のわきを抜けて裏地に行くと

f:id:griefworker:20140906115452j:plain

こんなところに店が。看板無かったら絶対分からない。 入るまでは本当に Tiki かも疑わしかった。 隠れ家みたいで男心をくすぐられる。

開店直後でまだ席が開いていたので、待たずに座れた。 このあとすぐ席埋まったけど。

早速、スパイシーチキンカレー(800円) を注文。

f:id:griefworker:20140906114252j:plain

一口食べて驚いた。予想よりかなり辛い。 これで中辛とは・・・。 鶏肉はジューシー。カレールーはかなりスパイシーで旨い。 具にはナッツも入っているんだろうか? ときおり感じるカリっとした食感が新鮮で良かった。 額に汗をにじませながら完食。

関連ランキング:インドカレー | 天神南駅西鉄福岡駅(天神)渡辺通駅

Devise でのパスワード変更を自前で実装する

パスワード変更機能を、Devise が提供するコントローラーを使わずに、自前で実装したいときのためのメモ。

現在のパスワード・新しいパスワード・新しいパスワード(確認用) を入力して変更する場合、 update_with_password を使う。

current_user.update_with_password(
  password: "new_password",
  password_confirmation: "new_password",
  current_password: "old_password"
)

新しいパスワードで強制的に変更する場合、update を使う。 管理者がユーザーのパスワードを再発行するときなんかに使ったりする。

current_user.update(
  password: "new_password",
  password_confirmation: "new_password"
)

注意点としては、現在ログインしているユーザーのパスワードを変更すると、 直後ログアウトした状態になってしまうので、 再ログインする処理が必要。

class SettingsController < ApplicationController
  # ... 省略 ...

  def update
    respond_to do |format|
      if current_user.update_with_password(user_params)
        # パスワードを変更するとログアウトしてしまうので、再ログインが必要
       sign_in(current_user, bypass: true)
        format.html { redirect_to edit_setting_path }
      else
        format.html { render :edit }
      end
    end
  end
end