CarrierWaveを使った時にundefined method `validate_integrity'が出て困った話

TL;DR

アプリケーション名とCarrierWaveで生成されるuploaderが同じ名前になるとundefined method `validate_integrity'のエラーが出て困る。

とった解決策

多分何らかのオプションがあってずらせる気がするが、今回はアプリケーション名とuploaderが変わるように変更した。

まとめ

名前空間が衝突すると変なことになるので注意

前提

多分こんなマヌケなことをやらかすのは僕だけだと思ってるのですが、

Rails+CarrierWaveを使った時にうまく動かなくてちょっと諦めかけてたのですが、問題自体がかなり間抜けっぽかったので多分皆引っかからないと思うのですが解決策もよくわかってないのでメモだけは残しておく。

CarrierWaveのせいでもRailsのせいでも無くて使い手の問題な気がします。

つまり俺が悪い。一応バージョンだけ記載しておきます。

使用したソフトウェア バージョン
ruby 2.2.3
rails 4.2.4
carrierwave 0.10.0

他はまぁ適当に使ってます。databaseとかはなんでもいい気がするので書いてません。

何をしたか?

手慰みに画像のアップロード機能をRailsでためしてみることにしたかった。

というわけで安直に名前をImageUploaderとしてrails newをした。(ココが原因)

振り返り

プロジェクト生成

Rails new ImageUploader

生成したプロジェクトにCarrierWaveのGemを追加する。

source 'https://rubygems.org'

gem 'carrierwave'
#~~~~長いんで省略~~~~

で、Gemfileに書き加えたのでいつものごとくbundle installを叩く。

これで準備は完了。

Scaffold

そして画像をアップロードした時のモデルとコントローラーをscaffoldでどかっと作ってしまう。 名前(name)と画像管理用のカラム(image)をもつImageモデルを作る。

管理に使うカラムのクラスはCarrierWaveのREADEMEにかかれている通り、stringを指定している。

bundle exec rails g scaffold Image name:string image:string

で、生成されたmigrationファイルを実行しておく。

bundle exec rake db:create
bundle exec rake db:migrate
== 20151012181358 CreateImages: migrating =====================================
-- create_table(:images)
   -> 0.0016s
== 20151012181358 CreateImages: migrated (0.0017s) ============================

この時点でrailsを起動すると、したのようにいつもの画面が出てくる

f:id:k2170:20151013032341p:plain

uploaderを作る

そして本題のuploaderを作る。この辺りもちゃんとREADMEにかかれているので参照されると良いと思う。

bundle exec rails g uploader Image

これを叩くと app/uploaders/ の配下に image_uploader.rb が生成される。

特に変換とかしたいわけではないので、デフォルトをそのまま使う。

モデルと結びつける

class Image < ActiveRecord::Base
  mount_uploader :image, ImageUploader
end

railsを起動する

f:id:k2170:20151013032643p:plain エラーが出る…

はてさてこの原因は何だろうということでエラーをじっと見てみるとModuleとか出てるわけで、

というわけでconfig/application.rbを見てみると

require File.expand_path('../boot', __FILE__)

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module ImageUploader
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = 'Central Time (US & Canada)'

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de

    # Do not swallow errors in after_commit/after_rollback callbacks.
    config.active_record.raise_in_transactional_callbacks = true
  end
end

うん、多分これだ。

名前空間が衝突しちゃったみたいだ。

というわけで、別の名前でmigrationからやり直してみる。

%s/Image/Gazo/

bundle exec rails g scaffold Gazo name:string gazo:string
bundle exec rails g uploader Gazo

bundle exec rake db:migrate
class Gazo < ActiveRecord::Base
  mount_uploader :gazo, GazoUploader
end

で実行してみるとちゃんと実行される f:id:k2170:20151013034353p:plain

まとめ

めったに無いとは思いますが、application名とuploaderが一緒になるような場合問題になるようです。 ご注意ください。

言語化することの脅威

2年間ぐだぐだと個人的に続けてきたことを、一回自分でもまとめてみようかな?と思ってスライドとかに簡単にまとめてみたりして準備したりしてたのですが、

結果として急にモチベーションが下がってしまって、2年間続けてきたことを続けていくことに対してものすごく辛くなって自分でもわけがわからない状態になってしまっていた。

その時はなんで急にモチベーションが下がったのか、なんで急にいつもやってたことが煩わしくなってしまったのかが解らなくてもやもやしてこんな状態じゃ続けられないしどうしようと思っていたのだが、phaさんの下の記事
何かを終わらせるために書いてる - phaの日記

を見た時にハッとした。

なんとなくで言語化してしまったことによって自分の中で終わらせてしまっていた事に気がついた。

でも、本当にそれって終わってるの?勝手に答えを全部出したつもりになっているけど本当に終わったの?やりのことしたことは無いの?

って思うと全然道半ばだしやりたいこともまだまだあるし、やってみたいこともある。

だから、もうちっとだけ続けてみよう。

と、思えたのだが恐ろしいことに何が原因でモヤモヤしていたのか答えを得られなかったら本当にやめてしまっていたに違いない。

言語化することで自分としての答えを出すという事は非常に大事になことだと思います。

人間の時間は有限なので何かを終わらせる事でしか、次に進めないというのもあわかります。

しかし、その時点で出した答えで満足できるか?もっとやることは無いか?今後は同様に辞めたくなった時に思い返して見ることが出来るようになったのでいい経験になったと思う。

でも、言語化したことでこんな副作用があるとは正直思わなくてびっくりした。

YAPC::Asia2015に行ってきた

去年のYAPCからブログ書いてないとかどんだけだよという気分もしますが、YAPCはブログを書くまでがYAPCなのでしょうがないですね。生存確認のためです。仕方ないですね。

例によって朝寝坊してしまったので、ラリー・ウォールさんの講演は聞けなかった。

その場にいた同期によるとホビットの冒険を見れば大丈夫らしい(なんじゃそりゃ)

他にも懇親会予約しそこねていてかなり(´・ω・`)

後輩と出くわしたり色々と盛りだくさんで、楽しかったです。

話を聞いた中で面白かったものを3個だけとりあげて以下にまとめる。

個人的に超知見が得られたという話であれば、「ISUCONの勝ち方」これに尽きます。
現在色々と隠れ蓑にしてチューニングして回っているのですが、これは本当に知見のかたまりでした。
すごく役に立ってます。この発表を聞いて方針が綺麗に定まったおかげか、一部のAPIのレスポンスタイムが1/3にすることが出来ました。この話は聞けてよかった。
http://yapcasia.org/2015/talk/show/86ebd212-fab3-11e4-8f5a-8ab37d574c3a

羨ましくなった話としては「esa.io - 趣味から育てたWebサービスで生きていく」です。
僕も自分が自分で使えるようなサービスをいずれ作りたくなりました。
http://yapcasia.org/2015/talk/show/c191c08a-0a98-11e5-be34-67dc7d574c3a

発表が面白かったといえば「WebAudio で入門する信号処理 」です。
すごく面白かった。ビデオが公開されたら見るのをおすすめしたいです。
発表も内容も発想も面白かったです。こんなことができるようになりたいです!
http://yapcasia.org/2015/talk/show/c61a32a4-f797-11e4-bcef-8ab37d574c3a

ビデオが公開されたら他の聞けなかった講演も見てみたいなぁ〜

YAPC::Asia2014に行ってきた(2日目)

         ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|          あ…ありのまま 昨日 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|       『おれはいつの間にか寝ていたと
        i|:!ヾ、_ノ/ u {:}//ヘ              思ったらYAPCが始まっていた』
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人      な… 何を言ってるのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ       おれも何をされたのかわからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ        頭がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -―一ァ‐゙T´ '"´ /::::/-‐  \     目覚ましを無意識に止めていたとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ  そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ もっと恐ろしいものの片鱗を味わったぜ…

というわけで、寝坊しました!あれだけ楽しみにしてたのに!

朝の2セッション聞けませんでした!でも、気になるのでビデオ公開されたら必ずみる!
他の参加してないセッションも気になるのあるから是非とも速く見たい!

というわけで、お昼のご飯に滑り込んだところから、YAPC二日目が始まりました。

ご飯美味しかったです。かき氷は火照った体に気持ちよかったです。



YAPC::Asia感想ですが、いや本当にすごかった。

どのセッションも凄かったし、技術に関してみんなキラキラしながら楽しそうに語ってたのが何よりもうワクワクした。

こんなワクワクしたのは本当に久しぶりで、僕もそういう生き方をしたい…いやする!ということで色々とゴソゴソと動いてみることにしようと思いました。

いや、なんというか会社内に篭ってるとこういうのが見えないから良くないっすな!

行ってして良かった!いや、もう行ってなかった去年までの自分を殴りに行きたいレベルで楽しかった!

今年はリスナーとして楽しませて頂いたけど、来年はなにか話せるものを作って頑張りたい!

あそこに立ってキラキラしながら楽しそうに語ってみたい!と思えるイベントでした。

あぁ楽しかった。

YAPC::Asia2014に行ってきた(1日目)

業務的にも、個人的にもPerlは書いたことは殆ど無くて、ワンライナーで借りてきてファイル内全置換とかぐらいのレベルの人間ですが、YAPC::Asia2014に行ってみました。

ブログを書くまでがYAPCらしいので感想をただただ淡々とダラダラと書いていきます。

ちなみに、購入したのはTシャツとパーカーが欲しかったので個人スポンサーにしました。

Tシャツはしばらく会社にも着て行くことになるでしょう。

パーカーは今は横に太りすぎてて入らないので、いつかきっと着る日が来ることでしょう。


それはさておきYAPC::Asiaは今回が初参加なのですが、前情報で聞いてたとおり、Perlに限らずいろんな話が聞けて楽しかったです。

Perlのセッションにしても他の言語でのプログラミングの知識が、そこそこあれば言語間の違いや共通部分が見つけられて楽しめました。

自分は今の会社に入って1年半なのですが、新卒1年目の方や同期に当たる人たちがドンドン発表しているのを見て俺も何時迄もくすぶってられないなやってやろう!という気持ちに少しなりました(ここがYAPCに参加した中のメリットで一番大きいかも)。

久しぶりに技術の濃厚な話を聞いて最高にハイってやつだ!状態になってて燃えてました。

ちなみに私は英語のセッションに行かなかったのですが、同時通訳がかなり良かったらしく聞いてみればよかったなと思いました。
そういえば、最後の方まで同時通訳のレシーバを探していたようですが、結局見つかったのでしょうか?
個人的にかなり気になりました。(一個4万円もするらしいので、ちゃんと出てきてたらいいなぁ・・・)

後、懇親会のご飯美味しかったです(写真は無いですけど)!いいだけ食べて体重がまた増えました!ごちそうさまでした!

明日(というかもう今日ですねw)も勿論行きますし、多分来年も行くでしょう。

正直、楽しみで仕方ないです。

MBP Retina 15inchを買った。

すごく今更だが、4月の増税前に買ってみた。

それまでは13inchのLate 2011のMBPを使っていた。

こいつも頑張ってSSDを入れてみたり、メモリーを16Gに拡張したりやれることはやってたのだが以下の2つの理由で買い替えを行った。

・重いソフトを動かすのが辛くなってきた。(コンパイルなども待ち時間が多くなった)
・会社でMBP Retinaを支給された。

重いソフトを動かすのが辛くなってきたのは、まぁ我慢しようと思ったのだが、会社で貸与されていたMBAがほとんど作業が行えない状態になってしまい。(すぐにCPU温度が3桁まで跳ね上がり、熱々で作業ができなくなる。Androidアプリをコンパイルから実行するまでに10分程度待たされる。など)交換してもらった。

交換してもらったものは、
MBP retina 15 inch(Late 2013)の下位モデルの吊るし

ぶっちゃけて言って比べるのも失礼なぐらい快適だった。コンパイルはそれなりに重くてもそれなりの時間に終わるし、サクッと出来るようになった。

なのでこの環境うちにも欲しいと思って買ってみた。

グラボは使わない気がしたので下位モデルで、メモリーとCPUだけ16Gと2.3GHzにしてみた。

メモリーが8Gだとちょっと心もとないのと手元にあるPCに負けてるってどうなんだ?と思ったこともある。
それにやはり、だいたい4G程度しか開いてないので16Gにして正解だったと思う。

MBP retinaに変えばもっとサクサク動くかと思ってたけど、時々もっさりとする気がするのはまぁ諦めるしかないな。

人間の欲望とは果てがないもので、もっと早く動くものが欲しくなる。

年々コンピュータに対する待ち時間が厳しくなるが、まぁ年を取るに連れて残り時間も減っていくのだろうから妥当ではないだろうか。

後やっぱりMBP retinaを見てからMBPの画面を見るとすごく汚く(というか荒く?)見えてしまうのが悔しい。

一部のページではやはりボタンもMacに最適化されてないので表示されるボタンが汚くてなんだかなーとなるのもなれるんだろうかなぁ?(2014年に乗り換えた人からは総ツッコミを受けそうだが)

そんな感じで便利に使ってます。

次はお金貯めてフルスペック買いたい。(ストレージ以外)

RubyでGrowlを操作してみたい。

さてさて、一体何時ぶりの更新なんでしょうかねw

定期的に書く癖を付けたいですが、備忘録なのでOKということにしましょう。

やりたかったこと!

はてブホッテントリをクロールしてきてgrowlに通知したい…ですが、今回はgrwolに通知を出すことを目標に進めていきます。

これを見た人の中にはいやいや、それぐらいはもう既にツールがあるからツールを使いなよ。と思う人もいるかもしれないけれど、自分で作ってみたい欲が少し出たので調査と実装を行ってみることにしました。

今回は取り敢えず、Growlで通知を出すところまで進めていきたいと思います。

Growlのインストール

通知といえば、Growlな人間なのでGrowlを使う前提で進めていきます。

App Storeから購入すると(2014年1月12日現在)400円ですが、自力でコンパイルを行うとただで使うことも出来るようです。

有料になったGrowlとHardwareGrowlerをビルドして無料で使う | Macとかの雑記帳

でも今回は時間もったいないし、アップデートするときにも面倒なので買ってしまいました。

ruby-growlのインストール

今回ですが、rvmでruby 2.1.0をインストールしようとすると何故かconfigure中にMacがフリーズしてしまうので(原因不明)昔に入れたruby 2.0.0を利用しております。

gemで使用したものは、ruby-growlです。

詳しくはこちら(RubyでGrowlを操作 ( ruby-growl ) - simanmanのブログ)に書かれているので見てもらえばわかると思います。

公式のドキュメントはこちら(ruby-growl-4.0 Documentation)です。

というわけで取り敢えずのテストコード(class Growl - ruby-growl-4.0 Documentation)を動かしてみました。

require 'ruby-growl'
require 'ruby-growl/ruby_logo'

g = Growl.new "localhost", "ruby-growl"
g.add_notification("notification", "ruby-growl Notification",
                   Growl::RUBY_LOGO_PNG)
g.notify "notification", "It came from ruby-growl", "Greetings!"

を動かすとこんな表示がされました。


これを使って色々と出来るようにしたいと思いってます。