Image Collector extensionでのDelayed Jobの使い方の歴史

Image Collector extensionのバックエンドはRuby on Railsで書かれたサーバアプリケーションです。Webページ上にある画像群について、ユーザが何らかのクラウドストレージにアップロードすることをポップアップウィンドウから選択したとき、拡張機能からは画像のURL群がサーバアプリケーションに送信されます。URLで示された画像ファイルをクラウドストレージにアップロードする処理は、拡張機能がやっているのではなく、僕の自宅で動いているサーバがやっていることです。 幸い...

OmniAuth-mixiとjpmobileを組み合わせてガラケー対応する方法

RubyのWebアプリでmixiの認証機能を手軽に組み込める「 OmniAuth-mixi」ですが、標準の機能でもdisplayクエリパラメータを指定することで、スマフォ対応することが可能です。 redirect '/auth/mixi?display=touch' でも、ガラケー端末向けには、ちょっと工夫が必要になります。これは、mixiのOAuth2対応では、PC&スマフォの認可画面と、ガラケー向けの認可画面とで、URLが異なるという事情から来ています。例えばjpmobileを使...

mixiへの認証を行ってくれる「OmniAuth-mixi」を作ってみました

Ruby on RailsやSinatraで作るWebアプリケーションに各種認証機能を手軽に追加できる機構として、「 OmniAuthシリーズ」があります。これのmixi版を作ってみました。 OmniAuth-mixi - Github OmniAuthは、Strategyという形式で任意の認証プロバイダの実装を追加できるようになっています。OmniAuth-mixiを使うことで、OAuth2にてmixi Graph APIの認証認可を行い、People APIで認可ユーザのプロフィー...

僕が考えたRuby on RailsとDojo toolkitで作るWebアプリのデザインパターン

今年の前半、ある限定した範囲で使うツールを以下の構成で作ってました。 Ruby 1.9.3 Rails 3.2 Dojo toolkit 1.7 Railsで何かを作るのが久々だったこと、 Erlangで最初作ったものをRubyベースでPortingすること、という背景があったのですが、実際に僕がRubyベースで書き直したときの書き方が結構満足いくものだったので、それをここで紹介してみたいと思います。もちろん、ドメインモデ...

Google Drive APIをRuby on Railsから叩く方法

DropboxとSkyDriveの各APIを叩いてRuby on Railsアプリからファイルのアップロードする方法を紹介してきましたが、最後はGoogle Driveを紹介してみます。Image Collector extensionでサポートしているGoogle Driveへの画像のアップロードですが、実は連携数はNo.1です。Dropboxが人気なのかな、と勝手に思ってたんですが、やっぱりみんなGoogle大好き!ってことなのでしょうか。 今までGoogle Driveにファイルを...

SkyDrive APIをRuby on Railsから叩く方法

Image Collector extensionでは、Webページにある画像を一気にSkyDriveにアップロードする機能が備わっています。ただし、Chromeから直接SkyDriveにアップロードすることはできないので、僕の自宅で稼働しているRuby on Railsサーバアプリケーションがその役目を担っています。つまり、Chrome上で動作しているImage Collector extensionは「このURLの画像をSkyDriveにアップロードして!」と指示だけをサーバアプリケー...

Dropbox APIをRuby on Railsから叩く方法

Image Collector extensionを使うことで、Webページ上にある画像をDropboxにアップロードすることができます。この際、Chrome extensionから直接Dropboxに上げることはできませんので、僕の自宅サーバで動いているRuby on Railsアプリがその処理を代行するようになっています。つまり、Chrome extensionからは「このURLとこのURLの画像を取得して、それをDropboxにアップロードしておいて」とお願いするだけです。 その処...

Rubyで重複しない結果を得るための効率的な方法

今まで「Rubyのuniqは遅い」という思い込みをしていました。ある配列から重複を取り除いた配列を作り出すためにはいくつかの方法が考えられますが、何が効率的なのか、実測してみました。 試した方法は以下の4つです。 Array#uniq Array#uniq! Set Hash それぞれのコードは最後に掲載するとして、さっそく実測値です。使ったマシンはmacbook air 11’。CPUは1.6GHz...

「JRuby on Rails」について発表しました

昨日の4月30日、JJUG主催による「クロスコミュニティカンファレンス」にて、「JRuby on Rails」というお題目で話をしてきた。 | View | Upload your own 聴衆の中に潜んでいたJRuby第一人者から、手痛い突っ込みの数々を頂いた。ここで上記資料の中で訂正(ってわけじゃないけど)してみようと思う。 32枚目の「CGIに比べてパフォーマンス的に有利」と記述してしまったが、現状ではmongrel_clusterで真面目に(?)構築した方...

ActiveResourceで拡張子なしのURIを発行する方法

Ruby on Rails 2.0から標準搭載されたActiveResource。これを使うと、RESTful APIをActiveRecordのように叩くことができるようになる。自分でURIを作ってopenすることもせず、レスポンスを自分でパースしてオブジェクトを作ることもせず、数行の記述でRESTfulなサービスを利用することが可能になる優れものだ。ActiveResourceの詳細は、 ここを見て欲しい。 さて、現状のActiveResourceは、僕にとって一つ気になる点がある。...

map.resourcesでcollectionを指定すると.xmlを受け付けない、なんてことはなかった

RESTful APIをRuby on Railsで実装するための重要な機構に、map.resourcesがある。これはconfig/routes.rbファイルで記述され、URIに関してRESTfulなプロトコルに対応した処理のマッピングを自動的に設定してくれる仕組みだ。例えば、 map.resources :articles としてあげれば、「GET /articles/1.xml」というリクエストに対してArticleController#showメソッドが、「DELETE /ar...

JRuby-1.0.3のRegexp#escapeメソッドは文字コードを指定できない

JRubyの現在の正式な最新バージョンは 1.0.3である。しかし、 1.1RC1も登場しているので、1.1の正式版が登場するのは時間の問題だろう。安定版ということで1.0.3を使いたくなるし、多くの場合は1.0.3で事足りるだろう。しかし、今日僕は1.0.3で小一時間ハマってしまった。 そろそろ こみゅすけの携帯版を作ろうと思い、 jpmobileというプラグインをRails 2.0にインストールしていろいろと遊んでみることを始めようとした。もちろんJRuby-1.0.3のgemでRa...

イルカが太陽に取り込まれる日

OSSなデータベースの代表格「MySQL」が、米Sunにより買収されるらしい。 「 米Sun、オープンソースDBのMySQLを買収へ」- Enterprise Watch PostgreSQLの性能向上によってMySQLを選択する理由が次々となくなってきている今、MySQL陣営にとっては嬉しいニュースなんじゃないかな。これによって、MySQLのエンタープライズ領域(つまり大規模案件への適用)での事例が増えてノウハウが次々とオープンになってくれば、PostgreSQLにシェアを食われている率...

僕のCode to Test Ratio歴

Ruby on Railsでの開発では、その規模の大小問わず、短期的・長期的問わず、最低限の品質を確保するためにテストコードの作成と自動化は「必ず」行うべきである、という考えを僕は持っている。つまり、テストコードのないRailsの成果物は、非常識きわまりなく、構造計算が一切行われていない建物と一緒。もしそんな開発プロジェクトがあれば、それは国会で取り上げられる程の騒ぎにならなければいけない事態であり、IT業界からご退場願わなければならない、と思っている。 さて、RoRでは、常に「自分がテ...

Fixtures Visualizerプラグインを公開しました

あけましておめでとうございます。今年もよろしくお願いいたします。 2008年の最初のエントリは、新年の挨拶もほどほどに、この冬休みの宿題の1つの成果報告をしてみよう。4つほどあった宿題だが、結果が出たのは1つのみである。なんとも情けない。。。 さて、昨年さんざん騒がれたRuby on Railsだが、「Javaな感覚」でRailsアプリを作ると、それはすなわち「Java以上の失敗プロジェクト」になる。「Javaな感覚」とは、つまり、コンパイラの存在。Javaにおいて、コンパイラが行って...

railsとrakeは似ている

Railsアプリのディレクトリの中で、テストケースを実行するために、 rake test と打たなければならないところを、 rails test と打ってしまうと、もれなくtestアプリケーションがテスト対象アプリの中にできあがる。 Railsアプリを「正しく」作っている(=ちゃんとテストコードを書いて品質を担保している)人々はきっと経験していることではないか、と想像してみるが、いかがだろうか。。。

丸レクでREST on Railsについて話をしてきました

本日、「 丸山先生レクチャーシリーズ RESTfulサービス技術の台頭」で話をしてきた。僕の題目はというと、「Ruby on Rails2.0におけるREST対応」。使用したスライドは下のものである。 | View | Upload your own PDFは こちら 個人的には、やっぱり練習をしていくべきだったかなぁ、と、話し方に関して反省である。何度もRESTとRailsを言い間違えたし、日本語として正しくないよなぁ、と思ってしまうほど文法上酷い言い方をしてしまった部分もあった...

Rails2.0.2がもうあるよ!

JRuby1.0.3がリリースされたので、それにRailsを入れようとした。 なんと、すでに2.0.2がある。この前2.0.1がリリースされたばかりなのに。 というわけで、近日中に2.0.2リリースのアナウンスが正式に来るだろう。

JRuby1.0.3がリリースされました

先週の土曜日、JRubyの安定バージョンとして、1.0.3がリリースされた。これはマイナーバージョンアップであり、バグフィックスが中心となっている。 JRuby 1.0.3 Released - JRuby - Codehaus 参考までに、リリースに関する上記の内容を訳してみた。 — JRubyコミュニティは、JRuby1.0.3のリリースをアナウンスしたことを嬉しく思っています。 Homepage: http://www.jruby.org/ Download: http://d...

あるタグ全体を検証するassert_dom_equalメソッド

RailsにおけるControllerの挙動をテストするために、functionalsテストがある。functionalsテストの対象は各種Controllerクラスのメソッドであり、Webブラウザのリクエストをシミュレートして、それに対するControllerおよび使用されたViewの結果の内容を検証するのが目的。つまり、rhtmlやrxmlなどのViewによってレンダリングされた内容についても、動的に変化する部分に関してはfunctionalsテストの範囲となる。 functiona...

assert_selectで属性値を扱う方法

rhtmlのレンダリング結果を確認するために、assert_selectを使用する。この際、要素が持つテキストを確認するのではなく、ある属性の値を検証する必要も出てくるだろう。 ある要素のある属性値を確認するためには、以下のようにすれば良い。 assert_select element, ‘[name=?]’, ‘value’ 上記の例では、ある要素elementに対して、それが持つ”name”属性の値が”value”であることを確認するコードである。つまり、 CSSセレクタの属性セ...

「Ruby on Rails2.0におけるREST対応」のハンズオンが公開されました

来週の18日に控えている丸レクで使用する資料が、今日から以下のサイトで公開されている。 丸山先生レクチャーシリーズ2007-2008 「 第2回「RESTfulなサービス技術の台頭」 僕の資料は、「第3セッションのハンズアウト」である。興味のある方は、ぜひ見てみて欲しい。もちろん当日会場に来てもらえると、もっと嬉しい。

Ruby on Rails 2.0がリリースされました!

見落としていたのだが、すでにRuby on Rails 2.0が、12月6日にリリースされていた。現在は、すでに2.0.1になっている。 root/tags/rel_2-0-1 - Rails Trac 今日時点で、例えば「jruby -S gem install rails –include-dependencies」すれば、2.0.1一式を得ることができる。ちなみに、僕のmacではヒープサイズが足りなくなったため、「-J-Xmx512m」オプションを追加することによりインストールをす...

リソースが3段以上ネストしたときのmap.resourcesの書き方

RESTfulなサービスを実装するとして、対象リソースがその他のリソースとの従属(親子)関係があるときに、Ruby on Railsではmap.resourcesをネストして記述することが可能になっている。例えば、部署(Division)に所属する社員(Employee)のリソース定義であれば、 map.resources :divisions, :path_prefix => ‘/api’ do |divisions| divisions.resources :employees...

ActionController::Resourcesを翻訳しました

「 Active ResourceのREADMEを翻訳してみました」エントリでRESTサービスを叩くためのActiveResourceに関するドキュメントを翻訳したが、またもや勉強のために、今回はActionController::Resourcesに関するドキュメントを翻訳してみた。ActionController::Resourcesには、RESTfulサービスを実装するために必要な知識が記述されている。 ActionController::Resources 原文の中で「route...

Active ResourceのREADMEを翻訳してみました

Rails 1.2から搭載され、Rails 2.0でいくつか改良されたActive Resource。これを使えば、RESTなWebサービスを簡単に利用できるようになる。これのREADMEが「 ここ」にあるのだが、勉強がてら日本語に翻訳してみたので、公開してみようと思う。 ActiveResource_README_ja.txt RESTfulなWebサービスを利用するクライアントは、Active Resourceを使えばかなり簡単に作れることが、これを見てわかると思う。Active R...

RBCドリコムノック(長崎)に参加してきます

車酔いを恐れず,果敢にブログエントリを試みる。 ギガプライズ勤務最終日だった昨日から一夜明け,今日は「 Ruby ビジネス・コモンズ ドリコム・ノック」のお手伝いを行うため,九州に旅立つ。福岡には昨年いやというほど行ったのだが,長崎は初めての上陸。このエントリは,大宮から羽田空港に向かうバスの中で書いている。 「 こみゅすけ」の開発に夢中になっている今日この頃だが,すでにRuby on Railsで作ったアプリは4本。10年以上ずっとJavaをやってきた僕が,こんなにRuby on Rai...

「24」風Ustreamプレーヤー,題して「Ustream24」

外国ドラマの「24」風な感じで,Ustreamを見るためのサイトを作ってみた。 題して,「 Ustream24」。 ま,単にUstreamを四方に置いて,真ん中に黄色くLCD的なデジタル時計を置いただけ。ただそれだけ。しかし,何故かこれで見ると「ちょっとした臨調感」を感じれたりするので,勉強会とか,開発合宿とか,納期2日前のプロジェクトの風景とか,そんなものをこれで見ると面白いかもしれない。 Ustream24は,Ruby on RailsとDojoの組み合わせで開発した。もうJava...

Timeオブジェクトに対するto_jsonメソッド呼び出し

Ajaxを多用したアプリケーションにおいても,Ruby on Railsの採用が今後どんどん増えていくと考えられる。Ajaxと言えば,言葉の通りXMLを連想するかもしれない。しかし,サーバから受け取った後の処理効率を考えると,JSONでやり取りを行ったほうがトータルで都合が良い。近年では,XMLではなくJSONを利用する機会が多いと考えられる。 Ruby on Railsの1.2から,全オブジェクトに対してto_jsonメソッドを呼び出すことができるようになった。これは,active_s...

ActiveRecordの属性に「?」で問い合わせる

ActiveRecordオブジェクトは, class Employee < ActiveRecord::Base end とするだけで,上記で言えばemployees表が持つ各種列に対応する属性が利用可能になる。例えば,employees表にname列が定義されていたとすれば, employee.name = ‘Yoichiro’ p employee.name というように,nameアクセッサを利用することができる。とても簡単だ。では, employee.name? と...

結局lighttpdからmungrel_clusterに移行

「 lighttpdで稼働しているrailsアプリでリダイレクトが効かなくなった」件だが,結局原因は判明せず。どうもyumの自動更新によってlighttpdがバージョンアップされたらしく,そのタイミングで動作がおかしくなった模様。 apacheとlighttpdの組み合わせは,mongrelの自動機能の設定を行うのが面倒そう,という安易な理由で選んだのだが,やはり世の中はapacheとmongrelの組み合わせが多数派なようである。いつまでも放置していると,ユーザ(とっても目の肥えた数人)...

lighttpdで稼働しているrailsアプリでリダイレクトが効かなくなった

「 約5時間かかったRuby on Railsの実行環境構築」で頑張ってみたRails運用環境だが,今日になって不具合が出てしまった。昨日までは元気に動いていたのに。。。 昨日の夜に,配置してあるRailsアプリに機能追加を行った。実際には2つRailsアプリを配置してある。形態は「apache2 <=> mod_proxy <=> lighttpd」という組み合わせ。修正は片方のアプリのみなので,もう一つは影響はないはず。加えて,apacheやlighttpdの設...

updated_atを自動でセットしないようにする方法

データベースに格納される情報は,「作成日時」や「更新日時」を付与することが多い。ActiveRecordでは,作成日時や更新日時について,暗黙的にセットする機構が標準で備わっている。例えば, class CreateEmployees < ActiveRecord::Migration def self.up create_table :employees do |t| ・・・ t.column :created_at, :timestamp t.column :updated_a...

ActiveRecordに置き換えられたfind_allメソッド

ActiveRecordは,Rubyの動的な性質を存分に使って作られた,非常に利便性の高いライブラリだと思う。ActiveRecordをJavaにコピーすることは,きっとできないだろう。しかし,時に初心者(今の僕)は,その動的な特徴故に,期待した通りの動きにならずに苦戦することが多い。 ActiveRecordを使えば,モデル間の関連とそれに関する操作を数行で定義することができる。例えば,部署を表すDivisionモデルと,部署に所属する社員を表すEmployeeモデルがあった場合, ...

JavaでいうdeprecatedはRubyではobsoleteというらしい

遥か昔に制定した法律や決め事が今日のご時世に合わずに支障を来しているように,プログラムにおいても,過去に作ったものについて現在使って欲しくないという状況がしばしば起きる。実際のプログラミング環境では,「使って欲しくない」という作者の意図が何らかの形でプログラマに伝わらなければならない。 Javaでは,ソースコードに”deprecated”というキーワードを埋めておくことで,プログラマに「このメソッドは非推奨だから使ってはいけません!」と意思表示することができる。例えば,こんな感じ。 /...

options_form_collection_for_selectの初期選択が効かない

アプリケーションでは,データベース内に格納された各種マスタの一覧から1つ選択する,という行為が良く行われる。Webアプリケーションにおいて,マスタの内容を一覧表示する際は,selectタグとoptionタグの組み合わせが多く使われる。Ruby on Railsのactionpackに含まれるaction_viewヘルパーには,あるモデルの集合からoptionタグのセットを生成してくれる便利な機能が提供されている。それが,options_from_collection_for_selectメ...

railsでテストが実行できなくなった

快調にRuby on Railsなアプリを開発。そして振り返ると,なーんにもテストコードを書いていない自分に気がつく。Rails上でのテストコードの記述は好きな部類に入るため,テストを書かねばと思い立つ。 あるモデルに対するテストを1メソッド作り,「rake test:units」を実行した。すると, ./test/unit/../test_helper.rb:18: undefined method `use_transactional_fixtures=’ for Test::...

YAMLファイルの読み込みと場所の指定

Ruby on Railsアプリケーションにおいて,実行環境依存で設定を変更したくなるときがある。昨日一応の完成を見た僕の処女作では,最初にログインする際のパスワードについて,正解のパスワードをデータベースからではなく,ファイルから読み込ませるようにしたかった。しかし,IntegrationテストやFunctionalテストのコード中にログイン処理のテストをコーディングする際に,正解のパスワードを記載しなければならないため,production時の正解のパスワードではなく,開発時もしくはテ...

assert_selectでCSSセレクタを使う

Ruby on Railsアプリケーションの統合テストは,ActionController::IntegrationTestクラスを継承して作成する。統合テストは,ユーザが行うアクションを想定してコードでシミュレーションを行い,結果としてアプリケーションが正しく振る舞うかどうかを確認するためのテストである。一般的にWebアプリケーションの場合は,操作の結果としての出力の形式がHTMLという比較的複雑な文字列であるため,正しい動作を行ったかどうかの検証は難しい部類に入る。 Railsの場合...

datetime型を持つモデルのテスト

Ruby on Railsにおいて,テスト環境がとっても気持ちがいいと「前のエントリ」で書いたが,実際にテストケースを書き始めると,やっぱり知らないことがいろいろと出てきて,サクサクっとはいかない。もちろん,それは俺がバンビーノだからなのだが。。。 datetime型な列があるappointments表のAppointmentモデルをテストすることを考える。fixtureには,こんな感じで記述するだろう。 first: id: 1 promise: 2007-07-10 13:30:0...

Railsアプリを本番環境に配備する際の注意点

MacOS Xで作成したRuby on Railsアプリケーションを,今日Fedora Core 6に配備することにチャレンジした。もちろん一発でうまくいく訳もなく,いくつかハマり箇所があった。同じミスを繰り返さないためにも,ここに残しておく。 [rubyコマンドのパス] 作成したRailsアプリを,「 約5時間かかったRuby on Railsの実行環境構築」エントリで紹介したlighttpd実行環境にファイル一式コピー。lighttpd.confおよびhttpd.confにそれぞれ設定...

「%>」と「-%>」の違い

Ruby on Railsで採用されているERB(eRubyの実装)。これによって,HTML内にRubyコードを記述することで,動的なコンテンツを出力することが可能となっている。 いくつかのサイトや書籍を見ながらRoRアプリケーションを試していたところ,以下の点に気がついた。 「%>」と「-%>」,何が違うのか? マイナス記号が付いている場合と付いていない場合がある。例えば, ‘edit’, :id => user.id -%> といったように。 上記の...

Ruby on Railsのテスト環境が気持ちいい

Javaな世界に10年以上どっぷりと浸かってきたが,Ruby on Rails(RoR)をやっていると「良く考えられているなぁ」と感心してしまう箇所が随所に見られる。とかくScaffoldやActiveRecordに関するコーディングに目が行ってしまいがちだが,僕個人的にはテストに関する環境が最も「おぉ」と感じている。 言うなれば,「JUnit + DbUnit + Cactus」な環境が標準で整備されている,ということだ。 JUnitについては,もちろんTest::Unitがそれに相...

約5時間かかったRuby on Railsの実行環境構築

ここ数日はJavaからほとんど離れて,Ruby on Railsのお勉強に多くの時間を割いている。確かにRoRがこんだけ騒がれる理由がわかる。railsの内部処理に踏み込むと宇宙な世界だが,railsの上でアプリケーションを書いて単体テストをしている分には,この上ない気持ちにさせてくれる。 しかし,RoRアプリの運用環境構築に5時間も苦戦するとは思わなかった。 RoRの運用環境は,現在では以下のパターンがあるらしい。細かく分ければ,もっと多くの組み合わせがあるだろう。 a...

今日もPythonは僕に冷たい

ちょっと興味が出てきたので,軽くテスト。 Python 2.3.5 (#1, Jan 13 2006, 20:13:11) [GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin Type “help”, “copyright”, “credits” or “license” for more information. class Foo(object): … def p(self): …...

僕がPythonでなくRubyを選んだ理由

Welcome to Darwin! beloved:~ yoichiro$ irb irb(main):001:0> print “test” test=> nil irb(main):002:0> quit beloved:~ yoichiro$ python Python 2.3.5 (#1, Jan 13 2006, 20:13:11) [GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin Type...

僕のRuby第一歩目

誠に恥ずかしながら,今日初めてRubyコードを書いた。 Weclome to Darwin! beloved:~ yoichiro$ irb irb(main):001:0> print “test” test=> nil irb(main):002:0> “Hello world!”ではなく,”Hello Ruby!”でもなく,”test”。 うーん,センスなし。orz