駆け足気味にWine1.0でバージョン別FileMakerの動作確認を取ってみた

Wine1.0がリリースされFreeBSD Portsにも反映されました。

とりあえず会社にあったFileMakerのパッケージCDをいくつか借りて、Wineでの動作状況を調べてみました。動作環境は次のとおりです。

/home/unam/% uname -a
FreeBSD aquarius.localhost 8.0-CURRENT FreeBSD 8.0-CURRENT #7: Sat Jun 21 23:44:30 JST 2008     root@aquarius.localhost:/usr/obj/usr/src/sys/Aquarius  i386

今回試したのは、次にあげる9種類です。(バージョン飛び飛びですみません)

  • 4.1
  • 5(Pro)
  • 5.5(Pro, Developer)
  • 6(Pro, Unlimited, Developer)
  • 8(Pro)
  • 9(Adv)

すべて日本語版CDです。

インストール〜各種動作までの検証

5〜6は起動に失敗してしまうため、表から外しました。Wineをターミナルから実行してログを見ても、Wine自体はクラッシュしてないのですが先に進みません・・プリンタ周りの不具合でしょうか。

○: 問題なく動作、△: 一部表示に問題があるが動作、×: 動作せず、またはWineごとクラッシュ

4 8 9adv
インストール
起動
■ 日本語表示
ダイアログ
フィールド名 × × ×
フィールド内 ×
スクリプトメーカー × ×
プルダウンボックスなど ×
アプリケーションメニュー
レイアウト名
■ DB定義
フィールド追加
フィールド名変更
フィールド削除
リレーション定義 × ×
値一覧定義
ファイル共有設定
各種アカウント定義
■ ブラウズモード
フィールド入出力
レコード作成
レコード複製
レコード削除
フォーム形式で表示
リスト形式で表示
表形式で表示 -
ソートが実行可能
全置換が実行可能
ポータルが動作する ? ?
■ 検索モード
検索が実行可能
■ レイアウトモード
フィールドの配置 × ×
テキストの配置 × ×
グラフィックオブジェクトの配置 × ×
ボタンの配置 × ×
ポータルの配置 × ×
文字色の変更 × ×
背景色の変更 × ×
背景色パターンの変更 × ×
マウスを使用したパートの位置変更
パートの追加・削除
パートの設定 × ×
■ プレビューモード
プレビューモードが動作する
■ アプリケーション
共有ファイルを開ける
アプリケーション環境設定を開ける
ファイル環境設定を開ける
総合安定度(私感:
A ~ E )
A E E

メモ

  • 4.1
    • 8以降とは比較にならないほど、安定して動作します。検証中、1度もクラッシュすることはありませんでした。
    • 日本語表示に拘らなければ、通常運用でも充分使えるかと思います。
  • 8および9
    • Wine 1.0でも安定しません..
    • 日本語は例によってお豆腐状態です。(これはWineの設定で改善する可能性あり)
    • フィールド定義・スクリプト定義で、日本語・半角英数字問わず一覧を表示することができません。
    • リレーションシップ定義画面でTOをクリックするとクラッシュします。このため、リレーションを定義することができません。
    • レイアウトに何も配置することができないため、ポータルの動作確認が取れていません。
    • プレビューモードは動作しますが、意味のない描画を繰り返し動作が著しく遅くなります。
    • レイアウトの何も配置されていないところをクリックするとクラッシュします。
    • 何もしていないで放っておいても勝手にクラッシュします。業務・開発用途にはまだ向かないようです。

Wineやレジストリの設定でまだまだ改善するかも知れません。FileMaker 5〜6 の起動に成功している方や、7以降でも安定して動作している方がいらっしゃったら、コンフィグ等ご教授いただければ幸いです。

FileMaker API for PHPで自己署名証明書を使用しているサーバとSSL通信する方法

FX.php同様、FileMaker API for PHPでもFileMaker Serverに接続する際、cURLを使用します。自己署名証明書を使用しているサーバとSSL通信をおこなおうとすると「Communication Error 60」が発生します。

FileMaker API for PHPの場合は、FileMaker/conf以下の設定ファイルfilemaker-api.phpを少し修正するだけで、サーバ証明書の検証をスキップさせることができます。

--- filemaker-api.php.orig      Thu Jun 12 12:09:16 2008
+++ filemaker-api.php   Thu Jun 12 11:43:32 2008
@@ -33,7 +33,7 @@
  * an associative array, with curl option names as the keys, and
  * option values as the values.
  */
-// $__FM_CONFIG['curlOptions'] = array(CURLOPT_SSL_VERIFYPEER => false);
+$__FM_CONFIG['curlOptions'] = array(CURLOPT_SSL_VERIFYPEER => false);

 /**
  * The PHP class to use for representing Records

httpsを使用する場合は、必要に応じて$__FM_CONFIG['hostspec']もhttpsにする必要があります。

FX.phpで自己署名証明書を使用しているサーバとSSL通信する方法

別にFX.phpに限ってたことではないですが..。FX.phpではFileMaker Serverに接続する際、cURLを使用します。その際、自己署名証明書を使用しているサーバとSSL通信をおこなおうとするとエラーが発生し、うまく動作しません。

そこでFX.phpcURL通信をおこなっている箇所に、次のような修正をおこないます。

--- FX.php.orig  Thu May 22 18:17:40 2008
+++ FX.php  Fri May 23 11:37:45 2008
@@ -535,6 +535,8 @@
         } elseif ($this->isPostQuery) {
             if ($this->useCURL && defined("CURLOPT_TIMEVALUE")) {
                 $curlHandle = curl_init(str_replace($this->dataURLParams, '', $this->dataURL));
+                curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, FALSE);
+                curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, FALSE);
                 curl_setopt($curlHandle, CURLOPT_POST, 1);
                 curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $this->dataURLParams);
                 ob_start();
@@ -640,6 +642,8 @@
         } elseif ($this->isPostQuery) {
             if ($this->useCURL && defined("CURLOPT_TIMEVALUE")) {
                 $curlHandle = curl_init(str_replace($this->dataURLParams, '', $this->dataURL));
+                curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, FALSE);
+                curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, FALSE);
                 curl_setopt($curlHandle, CURLOPT_POST, 1);
                 curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $this->dataURLParams);
                 ob_start();

CURLOPT_SSL_VERIFYPEER、CURLOPT_SSL_VERIFYHOSTをFALSEに設定することで、サーバ証明書の検証をスキップさせています。(http://jp2.php.net/manual/ja/function.curl-setopt.php)

社内開発用の第四種オレオレ証明書なサーバで利用するだけなので、とりあえず修正箇所は以上です。FX.phpそのものに修正を加えるのがイヤであれば、別ファイルでFXを継承するクラスを作成して、その中でRetrieveFMData()とRetrieveFM7Data()をオーバーライドするコードを書けばOKだと思います。

FX.php + Flexigrid + FileMaker でWeb一覧画面を動的に作成してみる

FlexigridとはPaulo P. Marinas氏が開発・公開しているjQueryプラグインです。非常に簡単なコードを書くだけで、既存のテーブルに対してソートやカラムのサイズ変更といった、さまざまな視覚効果を与えることができます。このライブラリは同サイトにてThe MIT License、GNU GENERAL PUBLIC LICENSE Version 3のデュアルライセンスのもとで公開されています。

FileMakerPHPを連携させたWebアプリケーションの開発手法としては、FileMaker Pro 9 リリース時に公開されたFileMaker PHP for APIPHP Site Assistant(正直微妙まだ発展途上のため、これからに期待です)、そしてFX.phpが挙げられますが、ここではFX.phpを利用して、一覧画面を半自動的に生成してみたいと思います。

※ FX.phpにはない独自クラスなどがあります。適宜読み飛ばしてください。

従来の書き方だと

コントローラ

$data = new FX_ext();
$data->SetDBData(DATABASE,"test",1);
$data->AddDBParam('-skip',$skip);
/* ごにょごにょ */
$dataSet=$data->FMFind();

ビューア

<table class="list" cellspacing="0" >
    <tr>
        <th>(ヘッダ)</th>
    </tr>
    <?php
    if ($dataSet['foundCount'] > 0)
    {
        foreach($dataSet['data'] as $key => $value)
        {
            $recid = strtok($key, '.');
            ?>
            <tr>
                <td class="md"><?= $value['fieldName'][0] ?>&nbsp;</td>
            </tr>
            <?php
        }
    }
    ?>
</table>

こんな感じでしょうか。一覧画面ですと、このほかにページャやソートなどが実装されているかも知れません。

ではここから手抜きをして、一覧のテンプレートをいちいち作成しなくてもいいようにしたいと思います。具体的には次のとおりです。

  • FileMakerレイアウトに配置されているフィールド情報を取得し、自動的に一覧を生成
    • 一覧画面に表示したくない場合はphp側で専用の配列を定義しておく
    • フィールド名/表示用のラベルを変更したい場合もphp側で専用の配列を定義
  • 一覧の生成はFlexigridにおこなってもらう

Flexigridは2〜5行のJavaScriptコードを追加するだけで、上記のようなテーブル一覧にもすぐに組み込むことができますが、せっかくですのでソートやページャ・簡易検索といった強力な機能を使用できる実装にします。データのやり取りはXMLJSONがサポートされています。ここではJSONを選択しました。

修正後のコード

コントローラ

$postdata = sanitizeTag($_POST);
if ( 'list_json' == $mode)
{
    $sortname = ( $postdata['sortname'] ) ? $postdata['sortname'] : 'serial';
    $sortorder = (  $postdata['sortorder'] ) ? $postdata['sortorder'] : 'descend';
    $max= ( $postdata['rp'] ) ? $postdata['rp'] : 15 ;
    $page = ( $postdata['page'] ) ? $postdata['page'] - 0 : 1 ;

    switch($sortorder)
    {
        case 'desc':
            $sortorder = 'descend';
            break;
        case 'asc':
            $sortorder = 'ascend';
            break;
        default:
            $sortorder = 'descend';
            break;
     }

     $data = new FX_ext();
     $data->SetDBData(DATABASE,"test",$max);
     $data->AddSortParam($sortname, $sortorder ,1);
     $data->AddDBParam('-skip',$max*($page-1));
     if ($postdata['qtype'] && $postdata['query'] )
     {
          $data->AddDBParam($postdata['qtype'],$postdata['query']);
     }
     $dataSet=$data->FMFind();

     $json = array
     (
         'page' => $page,
         'total' => $dataSet['foundCount'],
     );
	
     foreach($dataSet['data'] as $key => $value)
     {
         $recid = strtok($key, '.');

         unset($tmp);
         $tmp[] = $recid;
         foreach($dataSet['fields'] as $fKey => $fValue)
         {
             $tmp[] = printFormat($value[$fValue['name']][0], $fValue['type']).($postdata['serial']);
         }

         $json['rows'][] = 
         (
             array
             (
                 'id' => $recid,
                 'cell' => $tmp
             )
         );
    }

    $output = json_encode($json);
    echo $output."\n";

}

配列でのフィールド定義

// フィールド名のラベルを設定
$fieldName2Label_array = array
(
    // フィールド名 => 日本語ラベル(タグOK)
    'text_field' => 'テキスト',
    'date_field' => '日付',
    'serial' => 'シリアル'
);

ビューア(JavaScript)

<script type="text/javascript" src="./js/jquery-1.2.3.js"></script>
<script type="text/javascript" src="./js/flexigrid.js"></script>
<script type="text/javascript">
<!--
$(document).ready(function() 
    { 
        $("#list").flexigrid
        (
            {
                url: './hoge.php?mode=list_json',
                procmsg: '読み込んでいます。しばらくお待ちください..',
                pagestat: '{total} 件中、{from} - {to} 件目を表示',
                dataType: 'json',
                colModel :
                [
                    {display: '#', name : 'recid', width: 70, sortable : true, align: 'center' },
                <?php
                $n = 0;
                foreach($dataSet['fields'] as $fKey => $fValue)
                {
                    if (0 < $n) { echo ",\n"; }
                    ?>
                    {display: '<?= printLabel($fieldName2Label_array, $fValue['name']) ?>', name : '<?= $fValue['name'] ?>', width:100, sortable : true, align: '<?= printAlign($listDisplayAlign_array, $value[$fValue['name']][0], $fValue['type'], 'none') ?>'}
                    <?php
                    $n++;
                }
                unset($fKey,$fValue);
                ?>
            
                ],
                searchitems :
                [
                
                <?php
                $n = 0;
                foreach($dataSet['fields'] as $fKey => $fValue)
                {
                    if (0 < $n) { echo ",\n"; }
                    ?>
                    {display: '<?= printLabel($fieldName2Label_array, $fValue['name']) ?>', name : '<?= $fValue['name'] ?>'}
                    <?php
                    $n++;
                }
                unset($fKey,$fValue);
                ?>
                
                ],
                sortname: 'recid',
                sortorder: 'desc',
                usepager: true,
                useRp: true,
                rp: 15,
                width: 'auto',
                height: 'auto'
            }
        );   
 
    } 
); 
-->
</script>

ビューア(HTML)

<table id="list" style="display:none"></table>


実行結果



JavaScriptPHPコードを突っ込んでいたり、JSONの出力方法がまだまだきれいになりそうですが、とりあえずFileMakerレイアウトに配置されているフィールド情報をもとに、テーブルを組むこと(?)なく一覧画面が自動作成できました。

CRUDまで行なえるスケルトンの自動作成が目標ですが、できるのかな・・完成したら公開します。

FreeBSD上でRedmineを試してみる

2ヶ月ほどTracを試してみましたが、1つのサイトで1つのプロジェクトしか基本的に管理できないというところがどうしても使いづらかったです。代わりになるものを探していたところ、Redmineというのが複数プロジェクトを管理できるというそうなので試してみました。

RedmineはJean-Philippe Lang氏によって開発・公開されているオープンソースソフトウェアです。RoRで構築されており、複数のプロジェクトを管理することができるのが特徴です。現在のRedmineのバージョンは4月28日(フランス時間)に公開されたv0.7.0で、GNU GENERAL PUBLIC LICENSE Version 2のもとで公開されています。

実行環境は次のとおりです。

インストールした環境ではRuby関連のアプリケーションを何もインストールしていなかったため、ここではビルドに必要なものからインストールしていきます。(Redmine v0.7.0では、Rails 2.0.2が必須となっているようです)

  1. 必要なアプリケーションをインストール
  2. Redmineのダウンロード
  3. SQLiteでデータベース作成
  4. database.ymlの修正
  5. rake
  6. 動作確認テスト
  7. Apacheの設定

インストールについて

を参考にさせていただきました。ありがとうございます。

必要なアプリケーションをインストール

rake時に必要なアプリケーションを先にportsからインストールしておきます。
  • converters/ruby-iconv
  • databases/rubygems-sqlite3
  • devel/rubygem-rake
  • www/rubygem-rails

Redmineのダウンロード

リポジトリからチェックアウトします。

# svn checkout http://redmine.rubyforge.org/svn/trunk/

SQLiteでデータベース作成

SQLite3でデータベースを作成します。

# sqlite3 redmine
SQLite version 3.5.6
Enter ".help" for instructions
sqlite > .exit

database.ymlの修正

# cp ./trunk/config/database.yml.example database.yml
# vi database.yml

database.yml

production:
  adapter: sqlite3
  dbfile:db/redmine
  timeout: 5000

rake

# rake db:migrate RAILS_ENV="production"
# rake redmine:load_default_data RAILS_ENV="production"

動作確認テスト

# ruby script/server -e production

Webブラウザhttp://localhost:3000/ にアクセスし、動作していたらOKです。

Apacheの設定

Phusion Passengerを使用し、Apache上でRedmineを動作させる設定をします。

# gem install rails --version 2.0.2
# gem install passenger

特に問題がなければ、次のようなメッセージが表示されます。

The Apache 2 module was successfully installed.
Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-1.0.3/ext/apache2/mod_passenger.so
   RailsSpawnServer /usr/local/lib/ruby/gems/1.8/gems/passenger-1.0.3/bin/passenger-spawn-server
   RailsRuby /usr/local/bin/ruby18

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Press ENTER to continue.

--------------------------------------------

Deploying a Ruby on Rails application: an example
Suppose you have a Ruby on Rails application in /somewhere. Add a virtual host
to your Apache configuration file, and set its DocumentRoot to
/somewhere/public, like this:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      DocumentRoot /somewhere/public
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips and other useful information:
  /usr/local/lib/ruby/gems/1.8/gems/passenger-1.0.3/doc/Users guide.html

Enjoy Passenger, a product of Phusion (www.phusion.nl) :-)

http://www.modrails.com/

メッセージのとおりにhttpd.confとhttpd-vhosts.confに追記します。ここではVirtualHostのPortを8080に変更しています。

Listen 8080
NameVirtualHost *:8080

<VirtualHost *:8080>
ServerName redmine.sweets.localhost
DocumentRoot "/home/redmine/public"

<Directory />
    Options Indexed FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

</VirtualHost>

日本語の表示環境があらかじめ組まれているため、簡単な設定ですぐに日本語で使ってみることも可能です。Web上からプロジェクトもユーザも作成できるのが嬉しいですね。これからちょっといろいろ試してみたいと思います。

WineでFileMaker Pro 9.0を動かしてみる

最近開発環境をWindowsからFreeBSDに移行しました。Windows上でのFileMaker+Web開発では、Eclipse or NetBeansFileMaker Proを同時に実行し、ウィンドウを切り替えながら開発していましたが、FreeBSDではFileMaker Proがインストールできないため

という煩わしい環境になってしまっていました。(rdesktopでFileMakerも操作すればいいのですが、処理が重く、ストレスが溜まるので避けています)

どうにかしたいと思っていたところ、先月あたりに「WineでFileMaker動くかも」ということを教えていただき、ちょっと実験してみました。


Wineは現在開発が活発におこなわれている、WindowsAPIを動作させることを目標にしたオープンソースソフトウェアです。現在のWineのバージョンは4月18日(米国時間)に公開された0.9.60で、GNU LESSER GENERAL PUBLIC LICENSE Version 2.1のもとで公開されています。

Wine上でのFileMakerの動作については、Wine AppDBによると、現在 4.1 〜 9.0 までのFileMakerが動作することが確認されているようです。そのうち、4.1 と 8.5 はUbuntu上ではかなり高い安定度で動作する、ということが報告されています。

今回インストールしようと思っている 9.0 Advancedでは、Wine 0.9.57時点で残念ながらスクリプト一覧や、フィールド一覧が空欄になってしまうという不具合があるそうです..

Wineの詳しい紹介はさておき、ここでは

  1. Wineを使用した、FileMaker Pro 9 Advanced(v1)のインストール
  2. アプリケーションの起動
  3. ちょっとさわってみたところ
を簡単に紹介してみたいと思います。実行環境は次のとおりです。

Wineを使用した、FileMaker Pro 9 Advanced(v1)のインストール

筆者の環境だと、CDを挿入するとなぜがsegmentation faultを起こしてOSごと落ちてしまうので、あらかじめCDの内容を他マシンからコピーしておきます。

% wine Setup.exe


インストーラが起動します。とくに問題はありません。次へ進んでいきます。


Japaneseと選択していましたが、UIは英語のままでした。それ以外はとくに問題ありません。次へ進んでいきます。


インストールするディレクトリを決定し、次へ。


インストール完了です。

アプリケーションの起動

GNOME を使っている場合は、左上のアプリケーション > その他 に「FileMaker Pro Advanced」が作成されていますので、そこから起動します。

コンソールから起動する場合は、インストールしたディレクトリまで移動し、wine FileMaker Pro Advanced.exe を実行します。


起動直後の画面。日本語が微妙に表示できていないようです。wineの設定かな..

起動はとくに問題ありませんでした。起動時にかならず最大化の状態で起動するようですが、これもwineの設定かな..

ちょっとさわってみたところ


test.fp7を作成し、データベース定義画面を開いているところ。


フィールドを作成し、適当にデータを入れてみた。


ネットワーク越しのFileMaker Serverを参照。問題なくファイルが表示されている。

結果/感想

残念ながら私の環境では安定しないようです。しょっちゅう落ちます。端末からwine FileMaker Pro Advanced.exeを起動していると、落ちるときに

wine: Unhandled page fault on read access to 0x00000004 at address 0x18aacc1 (thread 0009), starting debugger...
というメッセージを確認することができます。

環境がかなり偏っているというのもあるかも知れませんが、今のところ、次の動作をおこなうと確実に落ちることを確認しました。

  • レイアウトモード上でフィールドの配置・移動をおこなった瞬間
  • 検索モードで検索、レコードが1件以上該当したとき

※Compizを起動し、ウィンドウアニメーションを有効にしていると、落ちる操作した直後、一瞬ウィンドウが作成されることが確認できます。Win版のFileMaker Proは9.0以降、作業ウィンドウとScriptMakerを同時起動できるようになった分、ウィンドウ回りの実装が8.5以前と比較して大幅に変更されている気がします。Mac版と比較すると、ウィンドウの描画処理(とくにリスト形式でのレコード操作)でWin版では処理中にMac版では発現しないちらつき・もたつきを確認できます。この現象は、8.5以前では発現していませんでした。推測になりますが、このあたりが不具合に影響してるのはないでしょうか。

また、例のスクリプト一覧やフィールド一覧が表示されないという問題はまだ発生してしまうようです。

レコードの閲覧だけならば、とくに問題はないようです。ネットワーク越しに 10万件近くのレコードが保存されているファイルを開いて操作してみましたが、所轄処理が遅いということは感じませんでした。

しかし、検索やレイアウトの操作をおこなえないようでは残念ながらまだまだ実用には遠いようです。Wineの今後の動向・発展に期待したいところです。