homebrewでMySQLがインストールされた環境でmysql2 gemをbundle installする方法

毎回ハマるのでメモしておきます。

まずMySQLがインストールされている場所を特定します。

brew info mysql55

そうするとそれっぽいディレクトリ情報が表示されるので、次にRailsプロジェクト配下の.bundle/configに以下のように追記します。

BUNDLE_BUILD__MYSQL2: '--with-mysql-lib=/usr/local/opt/mysql55/lib --with-mysql-dir=/usr/local/opt/mysql55 --with-mysql-config=/usr/local/opt/mysql55/bin/mysql_config --with-mysql-include=/usr/local/opt/mysql55/include/mysql'

上記の設定値は環境によって違うと思うので、brew infoした結果で書き換えてください。

ハマったのはwith-mysql-includeオプションのところ。includeディレクトリの下にもう一階層(ここではmysqlディレクトリ)があったことに気づかず、30分以上悩みました。。

CocoaPodsでAFNetworkingを使おうとしてハマった話

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_AFHTTPRequestOperationManager", referenced from:
      objc-class-ref in xxx.o

というエラーが出た。

原因はPodsプロジェクトのBuild Settingsで「Build Active Architecture Only」プロパティを"Yes"にしていたため。このプロパティが"Yes"だとarmv7等の実機だけで動くようにしかライブラリがコンパイルされないため、iOS Simulatorでも動くようにこのプロパティを"No"にする。

こんなことに2時間もハマってしまった。。

should_be_bulid_active_architecture_only_no

 

 

CentOS上でコマンドラインでメールを送る方法

まず、メール送信サーバーとしてPostfixをセットアップします。Postfixのインストールと設定については以下のこちらの記事を参考にしてください。

CLIのメールクライアントコマンド「mail」がCentOS 6ではデフォルトでインストールされていなかったので以下のコマンドでインストールします。

sudo yum install mailx

 

メールを送るときには以下のように送り先のメールアドレスを指定してmailコマンドを実行します。

mail hoge@hoge.com

このコマンド後、Subjectと本文の入力が促されます。本文を入力し終えたら改行して半角ピリオドを打てばメールが送信されます。

意外と簡単ですね。

 

環境

CentOS 6.2

Heirloom Mail version 12.4

 

FactoryGrilの書き方いろいろ

テストデータの定義に使われるFactoryGirlの書き方に関するメモです。

データ投入時に値を指定する

FactoryGirlの定義ファイルに値を記述するのではなく、データ投入時(FactoryGirl.createするとき)にどのようなデータにするかを指定する方法です。FactoryGirlの定義ファイルのカラムにシンボルを指定しておき、FactoryGirl.createするときにシンボルとともに設定したい値を指定します。

# FactoryGirlデータファイル
FactoryGirl.define do
  factory :user, :class => User do
    name: "田村くん"
    address :address
  end
end
# RSpecファイル
describe 'User' do
  before do
     @user = FactoryGirl.create(:user, address:"山形県米沢市")
  end
end

 

 

 

Pryの使い方

RubyのデバッグツールPryの使い方の覚書です。

 

デバックモード内でのコマンド

コマンド 用途
show-source デバック中のコードを表示する

 

 

 

iOS7でUISearchDisplayControllerの挙動がちょっと変わった

UISearchDisplayControllerのプロトコルUISearchDisplayDelegateにはwillUnloadSearchResultsTableViewメソッドが定義されています。

 

問題点

検索画面が閉じられるとき、iOS6ではこのメソッドが呼び出されるのですが、iOS7では呼び出されないようになったようです。そのため、このメソッドを起点として検索画面非表示後の処理を記述している場合は不具合が発生します。

 

解決策

このメソッドの代わりにwillHideSearchResultsTableViewメソッドを用いればよいと思います。このメソッドはiOS6でも呼び出されます。

 

環境

XCode 5.0

Rails – RSpecの設定と使い方

RSpecのRailsプロジェクトへのインストール

Gemに以下の記述を追加します。

group :development, :test do
  gem "rspec-rails"
  gem "factory_girl_rails"
end

 

RSpecの初期化

以下のコマンドを実行し、RSpecのテストファイルを格納するディレクトリ等を作成します。

rails g rspec:install

 

スペックファイルの生成

例えばUserというモデルのスペックファイルを生成する場合は以下のコマンドを実行する。

rails g rspec:model user

 

RSpecによるテストの実行

array_spec.rbというスペックファイルのテストを実行する場合には以下のコマンドする。

rspec spec/model/user_spec.rb

 

データ投入時にモデルのバリデーションを無視する方法

FactoryGirl.define do
  factory :item_a, :class => Item do
    company_id 1

    # save時にvalidationをスキップする
    to_create do |instance|
      instance.save validate: false
    end 
  end
end

 

 

 

ハマりどころ

FactoryGirlファイルの場所の明示が必要

テストデータを作成するためにFactoryGirlを組み合わせて使ったのですが、ちゃんとFactoryGirlファイルを準備しているのに、その定義内容ではなくNULLがDBに投入されようとしてエラーになってしまいました。

fixtureの代替としてFactoryGirlを使用することを設定に明記していないのが原因でした。以下の一文をconfig/application.rbに追記すればエラーが発生しなくなりました。

config.generators.fixture_replacement :factory_girl, dir: 'spec/factories'

 

FactroyGirlファイルの内容を変えたときはspringの再起動が必要

springを使ってrspecテストを高速化している場合、FactoryGirlファイルの内容はrspec初回起動時のものが保持され続けるので注意が必要です。FactoryGridファイルを変更したら以下のコマンドを実行して一度springを止め、再び再起動(spring rspec)しましょう。

spring stop

 

 

 

Rails – CookieOverflowが発生したときの対処法

ActionDispatch::Cookies::CookieOverflowエラー(例外)はセッションに大きすぎるデータ(4KB以上のデータ)を格納しようとしたときに発生します。flashもセッションにデータを格納する仕組みですので、大量のエラーメッセージをflashに格納する場合などは注意が必要です。

このエラーの解決方法は2つあります。1つは極力セッションを使わないこと、または使ったとしても最小限のデータを格納するのにとどめることです。この解決方法が最もスマートだと思います。セッションに大量のデータを格納するような設計には問題があります。

ただ、どうしてもセッションに大量のデータを格納しておきたい、でもCookieOverflowが発生してしまう。そんなときに2つ目の方法としてセッションデータをActiveRecord上に格納する方法があります。このメモではこの方法について解説します。

 

セッションをActiveRecordに格納する方法

まず、以下のコマンドでセッション上のデータを格納するテーブルを作成します。

rake db:sessions:create
rake db:migrate

次に config/initializers/session_store.rb の設定を以下のように変更します。

[プロジェクト名]::Application.config.session_store :active_record_store

最後にRailsサーバーを再起動して完了です。

 

環境

Rails 3.2.9

 

 

 

iOS – CoreDataにおける検索条件のエスケープ

CoreDataで以下のコードでtargetNameに該当するデータを検索する場合、targetNameにシングルクォート「'」が含まれていると、シングルクォートの「囲み」の整合性が取れなくなるので、アプリが落ちます。

NSString *searchCondition = [NSString stringWithFormat:@"name = '%@'", targetName];
NSPredicate *predicate = [NSPredicate predicateWithFormat:searchCondition];
[fetchRequest setPredicate:predicate];

このような場合はtargetNameに含まれているシングルクォートを以下のようにして事前にエスケープしておけば大丈夫です。

targetName = [targetName stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"]