Hatena::ブログ(Diary)

FileMakerとPHPのメモ

2008-06-24

駆け足気味に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以降でも安定して動作している方がいらっしゃったら、コンフィグ等ご教授いただければ幸いです。

2008-06-12

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にする必要があります。

2008-05-23

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

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

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

--- 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だと思います。

2008-05-18

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

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

FileMakerとPHPを連携させた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>

実行結果

f:id:unam-h:20080518021745p:image

f:id:unam-h:20080518021746p:image

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

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

2008-05-01

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上からプロジェクトもユーザも作成できるのが嬉しいですね。これからちょっといろいろ試してみたいと思います。

f:id:unam-h:20080501203856p:image

f:id:unam-h:20080501203855p:image

Connection: close