RMagick で画像に Wet floor effect を適用する

せっかく上の記事で勉強したので、Web アプリケーション化しました。名前はベタに「Reflectr」としておきます。

Reflectr

画像をアップロードすると、Wet floor effect を適用してくれます。床の色も指定できるようにしました。

アプリケーションは Ruby on Rails で、DreamHostにホスティングしています。作るのはそんなに苦労してませんが、DreamHost で動かすのに苦労しました。そのあたりは追々書きます。

ちなみに、ロゴはここで作ってみました。

広告

ファイルのアップロード機能を作っていて、テストの書き方がわからなかったので調べた結果をメモ。アップロード処理は次のようになっています。

  1. ブラウザがファイルを Post
  2. コントローラが Post データを受け取り、モデルに渡す
  3. モデルがデータをファイルに保存

行いたいテストはコントローラのテストとモデルのテストの2種類。

まずコントローラのテスト。ActionController::TestUploadedFileを使う模様。
83’s : ファイルアップロードのテスト

次にモデルのテスト。

ファイルがアップロードされたかテストするためには、cgi.rbがマルチパートのPOSTを受け取ったときの処理を模擬する必要がある。 困ったことに、そこでやることは結構長くて複雑だ。 ファイルをシステムに取り込んで、いつもcgi.rbから取り出している形式に変換する。 もちろんどんなメソッドを持つかは場合による。

定義 (test_helper.rb):

def uploaded_file(tmp_filename, content_type, filename)
t = Tempfile.new(filename);
t.binmode
path = RAILS_ROOT + “/test/fixtures/files/” + tmp_filename
FileUtils.copy_file(path, t.path)
(class << t; self; end).class_eval do alias local_path path define_method(:original_filename) { filename } define_method(:content_type) { content_type } end return t end [/sourcecode] RoR Wiki 翻訳 Wiki – HowtoUploadFiles より

通常、Post データがモデルに渡るときには TempFile クラスのオブジェクトで渡され、しかもオブジェクトは cgi.rb によて拡張されているんだと思います。そのため、データを保存するモデルをテストするには、cgi.rb と同様の拡張をほどこしてくれるヘルパ関数を test_helper.rb に定義しています。

以上でコントローラ、モデルともにテストできます。

OSX に Ruby on Rails 環境を構築しました。OSX(10.4 Tiger)には最初から Ruby がインストールされていますが、この Ruby では Rails が動作しないようです。そこで、Ruby 自体のインストールから始める必要がありますが、代表的な構築方法には以下のようなものがあるようです。

– ソースからビルド
– [Locomotive](http://locomotive.raaum.org/) をインストール
– MacPortsからインストール

Locomotive は Ruby, Rails, Mongrel などをまとめてインストールできるパッケージのようです。今回は後で色々と追加インストールすることを考えて、MacPorts でインストールしました。

[nice_code]
$ sudo port install readline
$ sudo port install ruby
$ sudo port install rb-rubygems
$ sudo port install subversion
$ sudo port install swig
$ sudo gem install -r sqlite3-ruby ¥
-- --with-sqlite3-include=/opt/local/include ¥
--with-sqlite3-lib=/opt/local/lib
$ sudo gem install rails -y
$ sudo gem install mongrel -y
[/nice_code]

と、一通り必要そうなものをインストールしました。Web サーバは Mongrel, DB は SQLite にしました。SQLite は OSX に最初から入っているようですが、Subversion インストールしたら引っ張られてインストールされたので、MacPorts のものを使うようにしました。

CodeGearが、開発中としていたRuby IDEの詳細を明らかにしたようです。Eclipseベースの模様。早く触ってみたいけど、これって無償じゃないよなあ。

[nice_link]CodeGear、Ruby統合開発環境の詳細を明らかに − @IT
CodeGear、「Ruby on Rails」対応の開発ツールを発表へ – CNET Japan[/nice_link]

アバウトミー

2007/06/7

@niftyのアバウトミーに登録してみました。トップページの右下の方にブログパーツが付いてるはず。

アバウトミーは自己紹介サービス。質問に答えていくことで自己紹介を充実させていきます。質問は登録ユーザが作成したものがランダムで出題されます。当然自分で質問を作るのもありです。

最近こういった、twitter系のゆる~いひとことサービスが多いですね。以前何かのセミナーで、コミュニケーションチャネルは技術の進歩に伴って小ビット化しているという話を聞きました(確かシナジーメディア社のこの方でした)。つまり、電話から電子メール、IMと進歩してきたコミュニケーションチャネルですが、流れるデータはどんどん小さくなっており、今後は1パケットで完結するコミュニケーションチャネルが幅を利かせてくるというもの。アバウトミーなんか、殆どの質問は選択問題なので、まさにワンパケット時代のサービスなのかな、と思いました。

ところでこのアバウトミー、NaCL協力のもと、twitterと同じくRuby on Railsで開発されたそうです。@niftyでは他にも@nifty TimeLineというサービスもRailsで開発しているとのこと。この調子でどんどんRailsの本番稼動実績が積まれていけばいいですね。

[nice_link]アバウトミー[/nice_link]

ある Rails アプリケーションで他の Rails アプリケーションのデータベースを参照したかったので、方法を調べました。情報源は以下のサイトです。

ActiveRecord の API ドキュメントにはこう書いてあります。

Connections are usually created through ActiveRecord::Base.establish_connection and retrieved by ActiveRecord::Base.connection. All classes inheriting from ActiveRecord::Base will use this connection. But you can also set a class-specific connection. For example, if Course is a ActiveRecord::Base, but resides in a different database you can just say Course.establish_connection and Course *and all its subclasses* will use this connection instead.

データベースへのコネクションは ActiveRecord::Base.establish_connection で作られるので、あるモデル(例えば Course)で別のコネクションを使いたければ、Course.establish_connection を自分で呼べばよいらしい。ということでやってみました。

続きを読む »

Adobe LabsSpry という Adobe 製の Ajax フレームワークが公開されています。Adobe によると、Spry とは

The Spry framework for Ajax is a JavaScript library for web designers that provides functionality that allows designers to build pages that provide a richer experience for their users. It is designed to bring Ajax to the web design community who can benefit from Ajax, but are not well served by other frameworks.

であり、つまりは Web デザイナーが利用することを想定した JavaScript ライブラリだそうです。@IT にも記事がありますが、 Spry を使うと XML データから動的なページを生成することができます。しかも、デザイナー対象であることから、JavaScript によるコーディングは必要最低限に抑えられています。

ところで Rails 1.2 には新しいジェネレータとして「scaffold_resource」が追加されています。scaffold_resourceで足場を生成すると、通常の scaffold とは異なり、REST 風味のリソース操作が可能になるというのは以前に書きましたが、scaffold_resource を利用すると、さらにリソースの XML 出力まで可能な足場を生成してくれます。例えば、ブログを開発するために、記事のモデル(Post)とコントローラ(PostsController)を作ったとすると、scaffold_resource の場合、

GET /posts

で記事一覧の HTML を取得することができますが、さらに

GET /posts.xml

とするだけで記事一覧の XML を取得することができます。

ここでやっと本題ですが、scaffold_resource を使うとリソースの XML 出力を簡単に得ることができるので、Spry を使うのも簡単じゃない?と思って使ってみました。

続きを読む »

楽天がサービスの開発に Rails を採用すると発表しました。業務で Rails を利用している身(プロトタイピングと実験ばかりだけど)にとっては心強いし、この流れで Rails を取り巻く環境が良くなっていけばいいなあ、と願っております。CNET にも出てたよ。

楽天、ネットサービス開発で「Ruby on Rails」を採用–NaClが全面協力 – CNET Japan

確かに Rails の生産性は高いのかもしれないけど、今のところ Rails は実績や開発環境、運用環境といった点で Java や PHP に敵いません。「実績なんか始めからあるわけがない」「DRY な Rails はコードが少ないんだから IDE なんかいらないんだ」といった意見もあるとは思いますが、自分の勤めているような企業がこういった点を求めるのは事実なわけです。今回のように、業界に影響力のある企業が Rails 採用を発表していくことで、何を言われても「いや Rails すごいんですって!」と言えるようになればいいなあ。

実際、開発環境はどうにかならないものかしら。NetBeans 6 では Ruby/Rails をサポートするらしいので期待しています。

これまで Rails で作ったアプリケーションは Apache 2.0 + FastCGI で動かしていましたが、開発環境では Mongrel を利用しているので、できれば Mongrel で運用したいと思っていました。ちなみに Mongrel とは

Mongrel is a fast HTTP library and server for Ruby that is intended for hosting Ruby web applications of any kind using plain HTTP rather than FastCGI or SCGI. It is framework agnostic and already supports Ruby On Rails, Og+Nitro, Camping, and IOWA frameworks.

です。

先ごろ Mongrel もバージョンも 1.0 を超えたので、Apache と組み合わせて運用に使ってみることにしました。環境は以下の通りです。

  • CentOS 4.4
  • Apache 2.0.52 (CentOS Package)
  • Mongrel 1.0.1

要件は

  • Rails アプリケーションは Mongrel で提供する
  • 複数の Rails アプリケーションを同時に提供する
  • 複数の Rails アプリケーションを同一ドメインの別ディレクトリで提供する(バーチャルホストは利用しない)
  • Rails アプリケーション以外は Apache で提供する

になります。

続きを読む »

Ruby on Rails で作ったアプリケーションを配置ツール Capistranoでデプロイしてみました。環境は

  • 開発環境: Windows XP
  • デプロイ先: CentOS 4.4 + mongrel

です。

続きを読む »