よりよいコードの書き方
Rubyは、見やすくて表現力豊か、かつ強力なコードを記述するための最良の言語です。Rubyの100%オブジェクト指向の構造と洗練された言語機構により、より効率的に開発を行うことができます。
私たちは大のRubyファンであり、そのことはRfmの設計にも表れています。Rfmは、シームレスにFileMakerのコンセプトとRubyの表現形式を統合しているので、あなたの期待通りに機能します。上記のWhy Ruby?をクリックすると、少しだけその一端を確認できます。
いまどきのWeb開発手法
現在最も人気のあるWebアプリケーションフレームワークであるRuby on Railsが、Rubyで記述されているのは単なる偶然ではありません。規約ベースのアプローチにより、Ruby on Railsを利用してWebサイトを構築すると、コードの量が少なくて済み、繰り返しが排除され、生産性を高めることができます。そして今、Rfmを利用することで、RailsアプリケーションとFileMakerを直接統合できるようになりました。Rfmは、あらゆる方法の中で、FileMakerデータベースをWebに公開する最良の方法です。
自由なソフトウェア
なんと言ってもRfmは自由です。事実、RfmはMITライセンスのもとで利用可能です。すなわち、使用に対価を必要とせず、ソースコードの追加や修正も自由にできます。また、たとえ商用製品であっても、製品に組み込んで使用することもできます。
オープンソースであるため、安心してRfmという技術に取り組むことができます。いざというときには、(100% Pure Rubyで実装された)ソースコードを読んで、自由に機能を強化したり修正することもできます。さらに、多くのコントリビューターの協力により、Rfmは時間と共に改良されていくことが十分に期待できます。
必要なものすべてがここに
あなたのデータで何をする必要があるのか最も分かっているのはあなた自身です。ですから、Rfmは全く仮定を行いません。代わりに、あなたのスクリプトやサイトが思うままに表現できるように、FileMakerのWeb公開機能を活用できる機能をすべて揃えています。Rfmは次に挙げるすべてのことができます:
- 関連レコードやポータルからでさえも、容易に検索を実行したりデータの取得ができます。
- シンプルなRubyのハッシュを用いてレコードを追加・編集したり、容易にレコードを削除できます。
- 変更を保存する必要がないタイミングが分かるように、レコードオブジェクトを管理することができます。
- 自動的に同時更新を検知してデータの消失を防ぐことができます。
- (必要ならスクリプト引数を渡して)スクリプトを実行させたり、対象レコードに対して任意の処理を行うことができます。
- 画像、MP3ファイルなどのデータや、オブジェクトフィールドに格納されている書類データを容易に取り出せます。
- 精度や有効範囲を失うことなくFileMakerの数字フィールドのデータを扱うことができます。
- FileMaker Serverでホストされているアクセス可能なデータベース一覧を取得できます。
- データベース内のアクセス可能なレイアウトやスクリプトの一覧を取得できます。
謝辞
Rfmは当初Six Fried Riceの共同創立者であるGeoff Coffeyによって設計されましたが、多くの方の協力や貢献により改良されてきています。特に、Rfmはオープンソースであるため、だれでもコントリビューターになることができるのです。
私たちは以下に挙げる方たちのサポートと協力に感謝の意を表明します:
- Mufaddal Khumriは、Rfmが可能な限りRubyらしくなるよう設計を助けてくれました。彼はまた、見事なエラー処理コードとエラークラスの包括的な階層構造の設計に貢献してくれました。
- Atsushi Matsuoは、早くからRfmのテスターとしてすぐれたフィードバックや重要なパッチを提供してくれました。また、Web上では多くの情報を公開しています。私たちは彼の協力に感謝しています。
- Jesse Antunesは、Rfmの安定性と機能性の向上に寄与してくれました。
上に挙げたコントリビューターに加えて、Rfmは多くの素晴らしい、無料のオープンソース技術(特にRuby、REXMLおよびRake)のおかげで成り立っています。
Why Ruby?
Rubyを使う理由はたくさんあります。Rubyは最も簡単かつきれいで、表現力の高い言語であると、多くの人は断言します。そしてRfmも完全にオブジェクト指向であるため、申し分なくRubyで記述されたコードにうまく適合します。
レールに乗ろう
正直に申し上げましょう。大半の人がRubyに注目する最大の理由は、Ruby on Railsを使いたいからです。Railsは、WebサイトやWebアプリケーション、Webサービスなどの構築手順の効率化に役立つWebフレームワークです。PHP、ASP、.NETやJEEといったWebの定番と比較すると比較的新参であるにも関わらず、Railsは非常に有名なものになりました。その理由はシンプルで、Webサイトをより容易に構築できるからです。そして今、Rfmにより、この最先端のWeb技術がFileMaker Proのユーザーも利用できるようになったのです。
Ruby on RailsとRfmで構築された実際のWebサイトのサンプルをダウンロードするには、「サンプル」の項を参照してください。
思考をそのまま表現
人々がRubyについて語るとき、必ずと言っていいほど表現力という単語が出てきます。これは何を意味するのでしょうか?答えはシンプルです。Rubyではシンプルなコードで複雑な考えを容易に表現できるのです。一度習得してしまえば、わずかなコードで多くのことを成し遂げられることにあなたは驚くことでしょう。
下記はとてもシンプルなサンプルコードです。仮にあなたのお店で各顧客がいくら費やしたか知りたいと仮定します。Rubyではすべての注文の総額を次のように算出することができます:
total = 0.0
db["Order Layout"].find("Customer ID" => 1).each {|r| total += r["Total"]}
最初は少々複雑に見えるかもしれませんが、いったんRubyの基礎を理解すれば、実際にはこのコードはとても読みやすいものです。上記のコードを言い換えてみると、『「Order Layout」という名前のレイアウトにおいて、「Customer ID」フィールドの値が"1"であるレコードを検索します。検索して見つかったすべてのレコードの各「Total」フィールドの値をそれぞれ変数に足します。』ということになります。
なお、FileMaker API for PHPでコードを記述すると下記のようになります:
$total = 0.0
$cmd =& $connection->newFindCommand('Order Layout');
$cmd->addFindCriterion('Customer ID', 1);
$result = $cmd->execute();
foreach($result->getRecords() as $record) {
$total = $total + $record->getField("Total");
}
PHPのコードはそれ自体悪くありませんが、念頭に置くべき点やタイプする量、読むコードの量がただ多く、あれこれ気を使うことが多いです。Rubyなら同じ発想を短いコードで表現できます。
自明なエラー
例外処理においてもRubyの素晴らしい表現力を見て取れます。必ず誤りや例外というものは発生するものなので、たいていよく起こる例外にうまく対処できるようにコードを書くべきです。例えば、さきほどの例において顧客の注文記録が全くなければ、どのようなことになるでしょうか?ページ上に(オブジェクトやメソッド、および型に関する何かを示す)不格好なエラーメッセージが表示されてしまうでしょう。PHPで適切にエラー処理を行うには、次のようにコードを修正する必要があります:
$total = 0.0
$cmd =& $connection->newFindCommand('Order Layout');
$cmd->addFindCriterion('Customer ID', 1);
$result = $cmd->execute();
if (!FileMaker::isError($result)) {
foreach($result->getRecords() as $record) {
$total = $total + $record->getField("Total");
}
}
上記のPHPのコードでは、検索処理を実行した際に何かエラーが発生していないか確認してから処理を行うようにしています。それでは、Rfmのサンプルコードでは、検索でレコードが見つからなかった場合のエラー処理を行うには、どのようにコードを変更すればいいのでしょうか?その必要はありません。Rfmでは、検索結果が0件の場合はエラーとして扱いません。このことは、単に空のレコードセットが返ってくることを意味します。Rubyは適切に空の配列を処理するので(単にループの中に入らないので)、エラーが発生することなく総額が算出されます。(レコードが見つからない場合に例外が発生するようにしたい場合には、Rfmでそのように指定することもできます。しかし、通常はそのようにはしたくないでしょう。)
もっとも、他の問題が起こる可能性もあります。 もしかしたら、Web公開エンジンが動作していなかったり、データベースが開かれていないかもしれません。このようなエラーが発生した場合には、RfmはRubyの例外を発生させます。すると、即座にRubyスクリプトの処理が中止され、Webページかコンソール上に発生したエラーの内容が表示されるでしょう。エラーは自動的に検出されるので、コードの各ステップごとに強迫的にエラーの内容を随時チェックする必要はありません。エラーを検出して何か処理を行う必要がある場合には(例えば、適切なメッセージを表示させたい場合には)、次のように簡単に対処することができます:
total = 0.0
begin
db["Order Layout"].find("Customer ID" => 1).each {|r| total += r["Total"]}
rescue Rfm::Error::RfmError
puts "I wasn't able to talk to FileMaker!"
end
Rubyのrescue
修飾子を利用すると、その直前のコードのブロック内で何か例外が発生した場合に自動的に実行されるコードを記述することができます。これにより、好きなようにあらゆることを想定して細かくエラー処理を組み込んだり、もしくは細かいことはあまり気にせずに例外に対応できるコードを書くことができます。さらに、Rubyスクリプトの途中でエラーが起きて、その後の処理を続行させたままにしてはいけない場合に、その処理を止めるようにすることもできます。
オブジェクト指向の効能
後からオブジェクト指向機能が強化されたスクリプト言語とは違い、Rubyは純粋なオブジェクト指向言語です。そのことは、RfmがまさしくRubyのようなインターフェースを提供することができる理由となっています。例えば、Rfmで検索処理を実行すると、ResultSet
オブジェクトが結果として返ってきます。ResultSet
オブジェクトは、本質的にはレコードの集合です。FileMakerには(フィールドのメタデータやポータルのように)このオブジェクトがサポートする必要のある固有の機能がいくつかありますが、ResultSet
オブジェクトはRubyのArrayオブジェクトと共通する部分がたくさんあります。そう、オブジェクト指向プログラミングのおかげで、ResultSet
クラスはArrayクラスでもあるのです。そのため、あなたがRubyに精通しているのであれば(すぐにそうなるでしょうが)、RfmのResultSetオブジェクトはまさに期待通りに機能します。配列中の個々の要素に対して、繰り返し処理を行ったり、数を数えたり、結合したり、さもなければ通常の配列を扱うときと同様の処理を進めることができます。
サンプル
高度にインタラクティブなWebサイトからちょっとしたスクリプト処理まで、Rfmはありとあらゆるところで活躍します。ここではいくつか簡単なサンプルを紹介しましょう。
Rfmサンプルサイト
Rfmの動作を確認する最も良い方法は、サンプルサイトをよく調べてみることです。 ここで紹介するシンプルなWebサイトはRuby on RailsとRfmで構築されています。ソースコードをまるごとダウンロードして、手元のコンピューターでサンプルサイトを実際に確認することもできます(なお、動作にはRailsがインストールされている環境が必要です)。FileMaker Serverに自動的にインストールされるFMServer_Sampleテストデータベースを使用しているので、手元のサーバーでそのデータベースを利用するように調整をすれば、動作を確認することができます。
-or-
他のサンプルとドキュメント
補足的なサンプルコードも記載されているRfmのドキュメントもきっと役立つはずです。ドキュメントはオンラインでも参照することができます。
さあ始めよう
Rfmを利用するには、いくつか必要なものがあります。まず最初に、FileMaker Serverが必要になります(サポートされているバージョンの詳細については下記参照)。そして、RubyやRfm、(オプションとして)Ruby on Railsも必要です。このページでは、素晴らしいコードを作り始めるために知っておく必要のあることすべてを紹介します。
サポート対象のFileMaker Serverを入手
RfmはFileMaker ServerのXML APIを使用するので、まず確実にFileMaker Serverが必要になります。 幸運なことに、最新のFileMaker Server 9ではカスタムWeb公開機能がサポートされ、Advanced版である必要はなくなったので、以前に比べてコストを抑えることができます。具体的に必要な製品は下記の通りです:
いずれにしても、FileMaker ServerとWeb公開エンジンの両方のソフトウェアをインストールする必要があります。セットアップ手順の詳細については、FileMaker Serverに付属のマニュアルを参照するようにしてください。
Ruby、RailsおよびRfmのインストール
Ruby、RailsおよびRfmをインストールすることは、たやすいことです。(注記:すでにRuby on Railsを使用している場合には、あとはRfmをインストールするだけです。)
(訳注:Mac OS X Leopardには最初からRailsが組み込まれています。この場合もあとはRfmをインストールするだけです。)
- Ruby(バージョン1.8.4以降)
Mac OS X v10.4.6以降であれば、必要なバージョンのRubyが組み込まれている環境がすでに整っています。それより古いバージョンのMac OS Xを使用している場合には、すぐにでもアップグレードを検討してみませんか。Windowsユーザーは、One-Click Ruby Installer for Windowsを利用するといいでしょう。
- RubyGems
パッケージ管理システムであるRubyGemsを利用すると、Ruby on RailsやRfm、および何千もの素晴らしいRuby関連ソフトウェアを入手することができます。RubyGemsのおかげで、必要なソフトウェアのインストール作業はとても簡単です。あいにく、最初だけRubyGems自身をインストールしなければなりません。まず、RubyGemsの最新版をダウンロードします。次に、ファイルを展開し、コマンドラインで「ruby setup.rb
」を実行します。Mac OS Xでは、おそらく代わりに「sudo ruby setup.rb
」と入力する必要があるでしょう。これで、RubyGemsで必要なものすべてがインストールされるはずです。
- Ruby on Rails
RubyGemsがインストールされていれば、Ruby on Railsのインストールは簡単なことです。コマンドラインで「gem install -y rails
」 と入力するだけです(繰り返しになりますが、Macではコマンドの最初にsudo
を加えることになるでしょう)。RubyGemsは、Railsとそれに必要なコンポーネントをすべて探し出します。パッケージを取得することを選ぶと、確認が求められます。あとは、Y
を押して、続けてenterもしくはreturnキーを押していくだけです。(注記:Webサイトを構築する目的ではなく、単にRubyスクリプトを書く目的でRfmを使用する場合には、Railsをインストールする必要はありません。その場合には、このステップは省略してください。)
- Rfm
最後のステップとして、RubyGemsを使用してRfmをインストールします。ここで入力するコマンドは「gem install rfm
」です(この時点では特に説明する必要はおそらくないでしょうが、Macではsudo
コマンドを使用します)。数秒後にはRfmがきちんと組み込まれ、RubyスクリプトでRfmを使用する準備が整っていることでしょう。
サンプルの入手
Rfmを使い始める最も簡単な方法は、サンプルをダウンロードすることです。このファイルには、Ruby on Railsで構築されたサンプルWebサイト(こちらで実際に公開されているサイトを確認することもできます)と、サンプルのRubyスクリプトが含まれています。
ドキュメントとサンプル
Rfmには包括的なドキュメントが用意されており、Gemsサーバーから取得したり、こちらで内容を確認することができます。
また、本ページの「サンプル」の項では、実際に機能するRfmとRuby on Railsで構築されたサンプルサイトをダウンロードできます。
よくある質問
Rfmについてまだ疑問点がある場合には、下記のQ&Aを参照してください。
FileMakerのWeb公開にRuby on Railsを使うべきでしょうか?
はい、そうすべきです。
Rfmの使用料はいくらですか?
0円です。
Rfmは本当に自由なのでしょうか?商用目的で利用したい場合はどうなりますか?また、自社製品にRfmを同梱したい場合にはどうなるでしょうか?
はい、Rfmは自由なソフトウェアです。RfmはMITライセンスのもとで利用可能です。これは驚くほどオープンなライセンスです。無料で使うことができますし、あなたの創作物と一緒にRfmを配布することができます。ソースコードを修正することもできますし、Rfmを利用した製品を作ることもできます。(違う名称で)独自のRfmを作ったり、Rfmの競合として公開することさえもできます。唯一の要件は、ライセンスファイルに記載されている版権情報が、あなたの配布物の中においてどこか妥当なところに含まれていることだけです。
Rubyは遅いということを耳にしました。サイトのパフォーマンスは悪くなってしまうのでしょうか?
正直に言えば、PHPやPerlなどといったよく利用されるスクリプト言語よりRubyは遅いです。ただし、Rubyの焦点は処理速度ではなく開発者の生産性にあります。これはRfmに興味を持っている人には身近な概念でしょう:そう、まさしくFileMakerと同じです。
世の中には速いデータベースサーバーはいくらでもありますが、それらはいずれもFileMaker Proの使いやすさと生産性にはかないません。FileMakerとRubyは共に使いやすくて生産性が高いのです。また、大多数のアプリケーションでは処理速度だけが唯一考慮すべき要因ではありません。概してデータベースやHTTPのオーバーヘッドは、コードの処理自体よりもWebの応答にかかる時間のほうが多くの割合を占めていますし、Rubyも一部のケースを除けば十分に速いのです。そのうえ、少し速いサーバーの費用とソフトウェア開発のコストを比較してみてください。技術力のある生産的な開発者は、低価格のサーバーであれば1ダース分に相当する価値を持っています。
そんな素晴らしいWebのプラットフォームがない場合にはどうすればいいのでしょうか?
そのような人生は考えられないと思います。
FileMaker Serverが本当に必要になるのでしょうか?クライアント数が少ないので、できればFileMaker Proで済ませたいのですが。
FileMaker ProではなくFileMaker Serverが必要になります。Rfmは、FileMakerのRESTスタイルのXML APIを利用します。これはFileMaker Serverでのみ利用可能です。
RfmはActiveRecordのドライバーですか?
残念ながら違います。全く異なるものではありますが、簡単かつエレガントに使えます。
なぜActiveRecordに対応していないのでしょうか?
FileMakerをActiveRecordに無理矢理対応させるのはかなり厄介であることが分かり、Rfmを開発したGeoff Coffeyは早い時期からActiveRecordには対応しないことを決めていました。順不同でその理由を挙げてみます:
- FileMakerのODBCサポートはやや不十分であり、ActiveRecord用のODBCドライバーはFileMakerではうまく機能しません。それらがうまく機能するようにするには、やるべきことがたくさんあることは明白でした。
- FileMakerは素晴らしいのですが、通常のSQLデータベースではありません。 ActiveRecordらしい方法でFileMakerのコンセプトを模倣できたとしても、もはやそれはFileMakerらしいものではありません。しかし、実際はFileMakerのままです。すなわち、FileMakerは「標準」に準拠していないので、ActiveRecordのエキスパートにとってはFileMakerが厄介で面倒な存在であると感じてしまうはずです。また、FileMakerのエキスパートはRfmをそのように感じてしまうことになるでしょう。そう、私たちは誰も苛立たせたくはありませんでした。
- FileMakerのXML APIが、FileMakerのODBCデータソース機能よりはるかに枯れていて、よく使われており、そして信頼できるので、この方法を使用するのが最も良い方法に見えました。
- XML APIがActiveRecordに対応するにはたくさんの魔法が必要になるでしょう。将来ハリー・ポッターが登場する可能性を期待しましょう……。
少し前向きに考えてみましょう。もしも、あなたが上記すべてについて意見を異にして、きっぱり間違っていると考えている場合には、RfmをActiveRecordに対応させてみるというのもひとつの手です。もしかしたら、それが次世代のRfmになるかもしれません。
RailsでWebサイトを構築しようとした際にデータベースの設定に関するエラーが表示されますが、空のSQLデータベースをあらかじめ用意しないといけないのでしょうか?単にFileMakerだけを使いたいのですが。
SQLデータベースに関するエラーが表示されるのは、RailsでActiveRecordを使用しているからです(ActiveRecordはとても素晴らしいものですが、FileMakerと非互換です)。そのため、Railsアプリケーションを立ち上げるたびにSQLデータベースに接続しようとします。
解決策は単にActiveRecordを無効にすることです。 environment.rb
ファイルに次のような記載がある部分が見つかるはずです:
# Skip frameworks you're not going to use (only works if using vendor/rails)
# config.frameworks -= [ :action_web_service, :action_mailer ]
config.frameworks
の設定で、Railsで必要のないライブラリを指定することができます。その行をコメントアウトして、次のようにActiveRecordを無効化する設定にします:
# Skip frameworks you're not going to use (only works if using vendor/rails)
config.frameworks -= [ :active_record ]
これでエラーなしでアプリケーションが起動するようになったはずです。
正しく設定をしたと思いますが、「authentication error」というエラーメッセージが返ってきます。FileMakerのアカウント名かパスワードが間違っているようですが、これはどういうことでしょうか?
RfmがFileMakerにログインするために使うアカウントには、「XML Web 公開でのアクセス(fmxml)」拡張アクセス権が割り当てられていなければなりません。FileMaker Proにおいて、「ファイル」メニューの「管理」>「アカウントとアクセス権...」(古いバージョンのFileMaker Proの場合は「ファイル」メニューの「定義」>「アカウントとアクセス権...」)を選びます。
「アクセス権セット」タブに切り替えて、Rfmで使うアカウントが割り当てられるアクセス権セットを開いてください。 [アクセス権セットの編集]ダイアログボックスの左下にある、「XML Web 公開でのアクセス」拡張アクセス権にチェックをつけます。 [OK]ボタンを押していき、開いているダイアログボックスをすべて閉じて設定を保存した後、再度動作を確認してみてください。
これでRfmがきちんと動作するでしょう。
Rfmの今後は?
オープンソースプロジェクトであるため、Rfmはすべてのユーザーからのフィードバックを受け付けています(もちろんコードやパッチの提供も歓迎します)。私たちは絶えず今後の機能について議論していきます。現時点では次のようなアイデアを考えています:
- 1行書きによるオブジェクトフィールドからのダウンロード対応:
image_data = myRecord["Photo"].download
or myRecord["Photo"].download("file.jpg")
- オブジェクトフィールドへのファイルアップロードのサポート(FileMakerでこれは可能でしょうか?その点についてははっきりしません。)
- スクリプト実行を手軽にするための追加オプション
- Rails対応の強化:database.ymlのサポート、一元化された設定方法、データベースとレイアウトオブジェクトの自動インスタンス化。RfmをDRYにする方法の模索。
- 他にも素晴らしいアイデアがあれば是非お知らせください。