トップ 最新 追記

2012-05-01 [長年日記]

_ RailsAdmin試して簡単にTypusと比較してみた

調べた当時見つけることができなかったので普段は Typus を使っているんだけど、Rails 3.2 で動かないっぽいのと、Mongoid と組み合わせて使ってみようと思ったら

Typus はユーザーDBが ActiveRecord を利用する前提になってる

のにガックリきて RailsAdmin を試してみた。

というわけで以下は簡単な比較。

Typus

http://www.typuscmf.com/

  • Model に対応する admin 用の Controller を作る必要がある
  • 加えて Model に対する編集権限や読み書きできる field を YAML で定義する必要がある

YAML を作るということさえ分かればカスタマイズは楽にできるし、生の Controller ができるのでこれをいじれば動きを変えられるということが簡単に想像できる。

手間は多いけどどうすればカスタマイズできるかが分かりやすいのがメリット。

画像などのファイルについては

  • PaperClip や Dragonfly を使った画像の preview からさらに lightbox 系の機能まで組み込み済み
デメリット
  • Rails 3.2 はたぶん未対応
  • 認証用のユーザー DB が ActiveRecord 前提なのでフル Mongoid にできない
  • Typus 用に Model に手を加える必要がある場合がある。これがパフォーマンスに影響しそうでちょっとイヤな感じ。

RailsAdmin

https://github.com/sferik/rails_admin

  • Rails 3.1+ 以降対応 ( sass などが前提 )
  • デザインがイマドキ
  • 設定用 YAML や admin 用 Controller を作らなくてもいきなり管理できる
  • Mongoid フル対応
  • 認証は基本 devise 依存だが最初のセットアップが親切なので Mongoid や devise が分かってなくても準備できる
  • カスタマイズは initilizers/rails_admin.rb の中で config.model ModelName do end のような形で記述する。

例えば画像の preview サイズの設定は

config.model ModelName do
  field :FIELD do
    thumb_method '200x200'
  end
end

みたいに書く。

最初の準備は RailsAdmin の方が楽かも。少なくともたくさんファイル作らなきゃいけない*1という面倒くささはない。

  • 管理画面から触れてほしくない Model なんかも config.excluded_models で設定できる。ユーザー別にどうするかまでは調べてない。
  • カスタムコントローラとかたぶん作れるけどよく分かってない

カスタマイズのノウハウ次第のところはあるけど、

  • Rails 3.2 対応
  • 見た目のかっこよさ
  • Controller や YAML を用意しまくらなくてもとりあえず動く

これはとても良いと思う。

  • image の popup preview ( Lightbox 的なアレ ) はないみたい

だけど、管理画面だし、オリジナルの画像を確認できるだけで十分ちゃ十分かも。

残念なところ
  • JS の効果の仕上げが粗い。popup が残りっぱなしになったりする
  • バージョン 0.0.1 は不安になる。安定して使えるならそれなりのバージョンにしてほしい。

認証の外し方

Typus の場合は initializer で

Typus.setup do |config|
  # Define authentication: +:none+, +:http_basic+, +:session+
  config.authentication = :none
end

すればいいというのが設定ファイルを見ればコメントですぐ分かるんだけど、RailsAdmin の場合はよく分からなかったので設定ファイルの中を読んでいたら Proc.new {} という記述をそこかしこで見かけたので試しに

RailsAdmin.config do |config|
  # ignore authentication
  config.authenticate_with do; end
end

こんな感じに authenticate_with の中身を空にしたら認証がスルーされた。というわけでこれを

config/environments/development.rb

に書けば開発環境でだけ認証が外れる。

Tags: Ruby Rails

*1 実際には generator が作っているとしても、正しく配置しておかなきゃいけないことには違いがない


2012-05-02 [長年日記]

_ Mongoid試してみた

特に目先の目的はないんだけど、スキーマとデータを後から自由に、しかもメンテナンスストップせずに変更できそうな気がして MongoDB を動かしてみようと思い、Mongoid をちょっと触ってみた。

自分用のメモなので特に面白い話はないです、念のため。

Mongoidを使った開発の準備

MongoDBのインストール

省略

新規アプリ作成

rspec を使いたいので

rails new APP_NAME -T -O

で、作成。

できあがったアプリケーションのGemfile

assets とか省略して最低限こんな感じ。

gem 'mongoid'
gem 'bson_ext'

group :development, :test do
  gem 'rspec-rails'
end

で、これを

bundle instal

します。bson_ext はなくても動くみたいだけど、なんかいろいろメッセージが出てうるさかったのでインストールして黙らせた。

generatorを叩いて設定ファイル作成

mongoid のインストールが成功していれば

rails g mongoid:config

これで config/mongoid.yml ができる。これは中身いじらなくて ok. rspec の分は省略。

dbの場所確保とmongod起動task

MongoDB は SQLite3 のような組み込み用ではないので daemon を起こす必要がある。繊細な感じがしていやだったので以下のような rake task を用意した。

これは

db/mongodb/
config/mongo_develop.conf.erb

を作って、conf.erb の内容から conf を生成してこの conf を mongod -f に与えて起動するようになっている。

screen を起こして一つの window で mongod を、もう一つで rails server を起こすようにすると邪魔じゃないしタブの意図が明確になっていいんじゃないかと思う。mongoid.yml の配置以降は mongod 起きてないと rails コマンドがちゃんと機能しないかも。

少なくとも migration は migration 実行時に初めて DB に変更が加わるんだけど Mongoid の場合はその場で変更できるものは変更するらしい。したがって mongod が起きてないと generate や destroy は実行できない。

Modelの作り方

普通に generator を使う。上のセットアップを済ますと generate model は Mongoid の model 生成用 generator に差し替わっている。*1

できるのはこんなモデル。

class Foo
  include Mongoid::Document
end

ただし、これだと timestamps 相当の field がない。ActiveRecord::Migration が標準で作るのと同じ感じの Model にするには以下のように作る。

class Bar
  include Mongoid::Document
  include Mongoid::Timestamps

  field FIELD_NAME, { option }
end

Mongoid はこんな感じで便利機能をイロイロ include できるらしいので一度確認しておくとよさげ。

cf. Play With Mongoid!

Mongoid + Dragonfly

ActiveRecord の場合は以前

今さらRails3メモ - 番外編その1: Paperclip and Dragonfly

で書いたように require するだけでいいんだけど、Mongoid の場合はもう一手間必要。

File: Mongo ― Documentation by YARD 0.7.4

と言っても本家に書いてある通りで、

require 'dragonfly'

app = Dragonfly[:images]

...

# Allow all mongoid models to use the macro 'image_accessor'
app.define_macro_on_include(Mongoid::Document, :image_accessor)

MongoDataStore 使わないなら上の実質2行を initializer に加えるだけ。

感想

migration がないので最初のセットアップのテンポがいい。ActiveRecord のときは

  • migration の方に column を書く
  • Model に attr_accesible 定義や validation で column を書く
  • さらに管理画面に Typus を使ってると Typus で編集可能な column 定義書く

という感じで、

DRY !!!

って叫びたくなる。それが Mongoid + RailsAdmin だとだいぶ楽ちんな感じ。*2

とは言え migration がないので逆に field 名変更は全 document に対して実行しなければいけない。rails runner でのバッチ処理の出番か。

もともとできるだけ生SQLは書かないようにしていた*3し、別に RDBMS 脳でもないので Mongoid 縛りで MongoDB を使うのにはそれほど抵抗ないんじゃないかなーと思っている。まだ Relation 使ってないから join ねーよ!ってときの気持ちが分からないけど、ま、なんとかなるんじゃないかな?

参考

Tags: Ruby Rails

*1 ActiveRecordを使うgeneratorは active_record:model に退避されているので使おうと思えば使える。

*2 RailsAdminについては別エントリで。

*3 といっても凝ったことしようとすると書いた方が早かったりするんだけど


2012-05-08 [長年日記]

_ NetBeans 7でRails 3開発環境を作ってみた

完全にお試しです。ゴリゴリ開発するところまでは行ってません。

コマンドラインスキーの自分がなんでこんなことやったかというと、

  • コマンドラインだけだと適性のある人以外に伝えるときにある程度以上つきっきりにならざるを得ないこと
  • 身の回りからちょっと広い範囲の間になんとなく Rails やってみたい人が増えてる感

の二つが大きいです。自分自身の普段の作業の効率という意味で乗り換えることはあり得ませんが、かといって説明や共有不能な状態のままというのもいかがなものかなぁという感じですね。

これはエディタについても当てはまっていて、自分は Emacs で満足しているけど、決してこれはオススメではないと思っています。ターミナル + Emacs でしか Rails の話ができない状態は、インターフェイスとしてとてもよろしくない。少なくともそういうのが得意なエンジニア以外には自分は Rails の説明をすることすらできません。ターミナルを見せた段階で引かれます。

まぁ少し誇張してますが、概ね事実です。入り口として terminal + emacs である必要はまったくない。そこで別な選択肢を試してみようと思いました。どれくらい作業できそうかなと思って。

Eclipseは厳しい

まず Eclipse を試しました。以前 Titanium Mobile を試した際に Aptana が入っているので。これは一応 Ruby および Rails 対応のはずです。

自分は Eclipe の経験がないわけではありません。昔、数ヶ月ほど Eclipse で PHP を書いたり DB を覗いたりしていた時期もあります。

しかしきつかった。コマンドラインの知識があるとこの操作体系は飲み込むのが難しいです。例えば rake に入っている migration が commands に入っているかと思えば generator はどこにいった?*1といった具合です。commands って書かれているのを見たら何かのコマンドが実行するのを期待すると思うのですが、コード補完だったり、ちょっと意味がよく分からない。

あとインストールすらしてない機能がメニュー上に最初から存在しているのもちょっとどうなんだろうという感じ。要するに自分の中の IDE に対する苦手意識を増幅するものがすべて揃っています。

情報がありすぎて何したらいいのか分からない

さらに悪いことに操作体系に一貫性があるように見えず、なんでこれがここにあるの?と感じてしまい、なまじコマンドラインの知識があると混乱します。これではコマンドライン側の人間として歩み寄ってコミュニケーションを取るのは難しいです。

NetBeansのRuby対応はpluginに分離している

NetBeans 自体は知っていました。Ruby に対応しているという話も知っていました。そして NetBeans 7 から Ruby 対応が外れたことも知っていました。

実はこの分離した時点で不安があったので今まで試さずにいました。でもそれは間違いでした。特に plugin の説明の記述が古くて Rails 2.3.x 対応と書かれていますが、実際には普通に Rails 3 で開発できると思います。これを試した2012年5月現在も、これを書いている6月現在もちゃんとメンテナンスは続いています。むしろ開発を継続しやすいように本体から分離したのかもしれません。Rails は変化が速いですから。

以下、Netbeans + Rails plugin について感じたことを並べますと、

  1. NetBeans は Eclipse より軽快に動く
    • ちょっと肩すかしというか、なんだこれ?あれ普通に使えるんじゃないの?と思ってしまう感じでした。
  2. メニュー構成も Aptana より素直で分かりやすい
    • IDE 音痴の自分でもあまり迷いません
  3. rvm で入れた Ruby も普通に認識して動かせる
    • 試してないけど rbenv についても同様にいけそうな感じです
  4. ただし bundler 前提は難しい

最後がイマドキの Rails および gem 開発ではとても惜しいのですが、入り口としてはだいぶいいと思います。「とりあえず localhost の環境で開発できる」という意味ではなんら支障はありません。

なんだ、NetBeans でいいじゃん

というのが正直な感想です。

ただ、気をつけることはいくつかあります。

2012-05時点で気をつけること

最初のRailsのインストールは面倒見てくれない

rails コマンドが使えればそこから今回のプロジェクトに使う雛形を作り開発を進めることはできますが、その最初のハードルを越えることは NetBeans + Rails plugin の範疇ではありません。そこは誰かのサポートを得るか、頑張ってコマンドラインを使うか、最近では RailsInstaller の力を借りる必要があります。

RailsInstaller は Windows 版もあり、素の環境に Ruby が何一つなく、rvm など考える必要がない Windows の方がこれからは最初の環境を作るのは楽なのかもしれませんね。native extension な gem が絡んでくると難しくなりますが。

rvm環境ではgemのPATHが合っていない

GEM_PATH が Mac 標準のものしかない。

rvm で入れた ruby バイナリは正しく認識できるのに gem PATH が合ってないので、まともに作業を始めることができません。これが rvm 環境に特有の現象かどうかは分かっていませんけど、たぶんそうなんじゃないかな。rvm 環境だと GEM_PATH は動的に変わりますからね。なんとなく Mac 標準の Ruby であれば大丈夫そうに見えますが、さすがにそれはオススメしたくないですしねぇ…。

ただし対処方法はあります。

  1. メニューから [ ツール ] -> [ Ruby Platform Manager ] を呼び出して Gem Path を追加する
    • . から始まるフォルダを開かなければいけないので注意が必要
  2. Mac だと ~/.netbeans/#{VERSION}/build.properties ファイルがあり、この中の rubyplatform.Ruby_#{num}.gem_path を書き換える

自分の環境は 10.5 だったせいか GUI からうまく ~/.netbeans フォルダを開くことができなかったので、2 の方法を使って直接ファイルを書き換えました。

例えば自分の環境で NetBeans 7.1.2 を入れている状態では

/Users/watanabe/.netbeans/7.1.2/build.properties

というファイルがあり、この中にもろもろ設定があります。ruby platform manager 関係の部分を抜粋するとこんな感じ。

...
rubyplatform.Ruby_0.ruby_version=1.9.2
rubyplatform.Ruby_1.gem_home=/Users/watanabe/.rvm/rubies/ree-1.8.7-2011.12/lib/ruby/gems/1.8
rubyplatform.Ruby_1.gem_path=/Users/watanabe/.gem/ruby/1.8:/Users/watanabe/.rvm/rubies/ree-1.8.7-2011.12/lib/ruby/gems/1.8
rubyplatform.Ruby_1.gem_version=1.5.3
rubyplatform.Ruby_1.interpreter=/Users/watanabe/.rvm/rubies/ree-1.8.7-2011.12/bin/ruby
rubyplatform.Ruby_1.ruby_kind=Ruby
rubyplatform.Ruby_1.ruby_lib_dir=/Users/watanabe/.rvm/rubies/ree-1.8.7-2011.12/lib/ruby/1.8
rubyplatform.Ruby_1.ruby_patchlevel=357
rubyplatform.Ruby_1.ruby_platform=i686-darwin9.8.0
rubyplatform.Ruby_1.ruby_release_date=2011-12-28
rubyplatform.Ruby_1.ruby_version=1.8.7

この中で gem_path を : でくっつけて並べた(Unix風のパスの記述なので Windows は違うかも)というわけです。

rakeが動かない

NetBeansでRails3のRakeタスクが取得できない - 雨の降らせ方

です。

これは NetBeans に限らず rake が 0.8 から 0.9 になった段階であちこちで起きたうぎゃー動かないと同じ話かもしれません。とりあえず今から Rails 3 を始めようと思ったら上の設定はしとかなきゃ、で覚えてしまってよいと思います。

まとめ

何カ所かハマりポイントがあるので本当の初心者に自信を持ってオススメします!とは言いにくいですが、まぁ許容範囲かなと思えますし、とりあえず今後自分はいろいろ分からないけどやってみたいという人がいたら NetBeans + ruby plugin でいんじゃね?と言うと思います。

Tags: Ruby Rails

*1 call generate script として存在している


2012-05-17 [長年日記]

_ DVCSというかcommitについてのメモ

一ヶ月前くらいにとてもひどい commit を見たときに説明用にメモしたものを発掘。

ちなみに現在の環境は中央が Subversion で、非エンジニア含めて TortoiseHG を入れてとりあえず作業がぶっ飛んでしまわないようにしているような状態。

  • DVCS のメリットは svn に commit しなくていいことじゃない
  • 大事なのは svn の commit(というかみんなが読む commit)
    • ここに分かりやすい log があればそれが資産になる
    • 分かりやすい commit とは変更点と変更の意図がちゃんと対応している commit

特に意図が大事。意図が抜けて作業しか書かれていない commit は後から見ても意味不明。commit メッセージに書くのが難しいなら ticket で補うのもあり。*1

  • DCVS のメリットは svn に入れる前に commit を失敗できること(push の前に読み直す)

現状の試みは

  • 上のような commit の説明を全員にするのは難しいが、元に戻せる安心感を提供したいから

個人的には git-svn を使っていて、git を使っていると感じるのは rebase しやすいのは良い commit かもなぁという辺り。あとで順番を入れ替えたり message を書き換えたりしやすいし、忘れていたファイルを見つけてもあとで commit して rebase で寄せていくことができる。もちろんこれは作業上のメリットであって読み手のメリットではないけど、一度に複雑な変更を加えてしまった場合はこういう作業はできないので、読み手にとっても一つずつ分かりやすい commit になるんじゃないかなぁと感じている。

Tags: VCS

*1 例えば例外的な何かに対応するためにあえてよくないコードに変更している場合があっても、後から見たら分からないからそれを「修正」して壊してしまう可能性も生まれる。そういうのはコードの中にコメントとして残しておかないとまた壊す可能性あるけど、それはまた別の話かな。


2012-05-23 [長年日記]

_ Capistrano使うときの初歩的な注意事項二つ

  1. ホスト名はみんなが引ける名前をつける
    • 自分だけなら ssh_config で付けられる alias でも接続できるけど、それは共有できない
  2. deploy を実行する機械の時計は正確に合わせておく
    • releases/ 以下のディレクトリは capistrano を叩いた機械の時計をもとにディレクトリを作成するので、未来すぎたり過去すぎたりするとうまく deploy できなかったり次の deploy に支障が出たりする

時間の方は最近こういうのでガードするようにした。これはたまたま LAN 内の NTP サーバに HTTPD も起きていたので、そこから時間を取得して cap 叩いた機械の時計と比較している。

まぁ cap 叩く機械を統一して Webistrano でやりますっていうんならこういうのは要らない。人数が増えて上のようなミスを減らそうと思ったら Webistrano 入れるといいのかも。認証通さないといけないし、deploy のログも残る。

GUI が必要ないなら ssh の proxy とかで同じようなことができるんじゃないかなぁと思ってるんだけど、できるかどうかよく分からないし、そこまで考えるなら Webistrano の方が楽かな。ブラウザでポチポチするのがちょっとダルいけど。


2012-05-25 [長年日記]

_ capybara-mechanizeでSJISのページを扱う

[20130729 追記]

Ruby 1.8 前提の書き方になっていたのと、Ruby 1.9 以降を使っている場合に Capybara-mechanize 1.0 前後で挙動が変わる記述を追加。

scrapeはmechanizeらしくUTF-8のままでok

click_on( '次へ>>' )

みたいな記述は UTF-8 で書いたものがそのまま動く。

テスト時はUTF-8への変換が必要

Ruby 1.8 では

body.toutf8

でよかった。

it {
  body.toutf8.should include('ほげげげ')
}

みたいな感じ。

kconv を require した覚えがないのに kconv が動いてるのはなんでだろう。

まーいっか。

もし&#xxx;形式になってたら

(Ruby 1.8で動かしている場合は $KCODE = 'u' したうえで)

CGI.unescapeHTML(body)

でいいみたい。

ちなみにSelenium WebDriverの場合

全部 UTF-8 で扱える。Selenium で書いていって Mechanize で CI に乗せる、といった運用を考えている場合はここが食い違うので注意が必要。

Ruby 1.9+ の場合

いずれも Mechanize 2.7.1 で試した。

HTTP Response Header に charset がない場合の挙動が Capybara 1 と 2 の間、あるいは Capybara-mechanize 0.x と 1.x の間で異なっているので注意が必要。

たぶんイマドキは charset UTF-8 に統一してあれば response header に入ってそうな気はするけど、古い日本のサイトだとダメな気がする。

'capybara-mechanize', '< 1.0'

自動で正しく encoding を判別できていたので

.encode('UTF-8')

で OK

'capybara-mechanize', '> 1.0'

HTML の中に charset 指定があってもダメで HTTP Response の charset だけをアテにして encoding の判別に失敗するようになってしまい Encoding::UndefinedConversionError: ... from ASCII-8BIT to UTF-8 エラーが出る。

仕方ないので

.toutf8.force_encoding('UTF-8')

を挟んだらうまくいった。

Tags: Ruby Test
本日のツッコミ(全1件) [ツッコミを入れる]

_ おいおい [1.8系以後はtoutf8は廃止になったものと思い込んでたので、この件、瞑想しまくり、ここに流れ着きました。 とても..]


2012-05-26 [長年日記]

_ AndroidのメモアプリをFlickNoteからNotationalAccelarationに変えた

以前書いたように Evernote + Simplenote の2大メモ体制 で臨んでいる*1んだけど、ある日突然 Simplenote 用の Android アプリである FlickNote が同期に失敗するようになった。

しばらく Android の方は仕方なく Evernote でメモして PC で素早く書きたいときは Notational Velocity から Simplenote へと、なんだかおかしな使い方をしていたんだけど、さすがに不便なので探し直した。

結果、Notational Accelaration にした。

同期の速度も特別速くないし、自分のきらいな黒地に白文字の画面なんだけど、

同期の失敗が比較的少なく、安定して動く

のでこれにした。有料アプリも試してるんだけど、Android 用の Simplenote クライアントの開発が停滞しているのか、どれもそれほど優秀な感じがしない。FlickNote がやっぱりいちばんいいと思うんだけど、いかんせん

アカウント新規作成後の最初の同期以外は失敗する

という豪快な状態で、さすがにこれはちょっと使いものにならないので諦めることにした。

なお次点は AndroNoter だったが、同期するとノートがダブってしまうという問題があったので見送った。

*1 何に?