目次


Scilab と PHP を使った効率的な数学処理

Web と科学を融合し、スマートな世界を実現する

Comments

最近のサーバー・サイド Web 開発には、Ruby、Python、PHP などのスクリプト言語が活用されています。これらの優れた言語を使用することで Web サイトの構築が容易かつ迅速に行えるようになります。ただし欠点として、これらの言語を使って数学や科学の複雑なアルゴリズムを実装しようとすると非効率的なコードになってしまいます。

近年、Web に公開される科学データは増え続けています。これらのデータは多くの場合、オープンなライセンスとして無料で公開されていますが、オープンで誰にでも受け入れられ、そして誰もが利用可能となれば、協力型の R&D が実現します。世界中の人々は、こうして公開される様々なデータの中にパターンを発見することができ、科学の神秘に対する人間の理解を深めることができます。

通常、科学計算には重たい処理が付きものであり、強力なシステムが必要になりますが、そうしたシステムを見つけることは簡単ではありません。特に Web 上では、そこにあらゆる科学データが存在するにもかかわらず、そうしたシステムを見つけることは簡単ではありません。この記事では、ある特定の科学ソフトウェア (Scilab) の強力さを、開発の容易さと Web との親和性を備えたサーバー・サイド言語 (PHP) と融合させる 1 つの特別な方法について検討します。

Scilab は INRIA (フランス国立情報学自動制御研究所) と ENPC (フランス国立土木学校) の研究者達によって 1990年に開発された数値計算パッケージです。Scilab は数値指向の高級プログラミング言語として実装されており、GPL 互換の CeCILL の下で配布されています。Scilab は乗算などの単純な行列演算を行える他、複雑な多次元演算や相関のような難易度の高い演算のライブラリーも備えています。Scilab の用途としては、信号処理、統計分析、画像処理、流体力学シミュレーション、数値最適化などが考えられます。

セットアップ

この記事でコードを作成してテストするのに使用したのは、Ubuntu カーネル 9.10 上で動作する Scilab V5.1.1、PHP V5.2.10、XHTML V1.0 Strict、そして Apache V2.2.12 です。この記事で説明するサンプルはそれぞれの新しいバージョンでも動作するはずであり、場合によると古いバージョンでも動作するかもしれません。

Scilab のセットアップ

Scilab は、Linux/UNIX®、Mac OS X、あるいは Windows® に対応しており、Scilab の Web サイトからダウンロードすることができます (「参考文献」を参照)。この記事は主に Linux/UNIX ユーザーを対象に書かれていますが、Mac OS X の場合も同様の構成体を見つけられるはずです。Windows のコマンドラインで Scilab を使う方法の詳細については Scilab の Web サイトを参照してください。

Scilab を使うための前提条件であるものの、通常の Linux/UNIX システムに含まれていないものとして、Scilab エンジンで UI 用に時々使われる Java™ 技術や Tcl/Tk、Scilab で画像および動画を処理するためのツールキットの一部として使われる GCC (GNU Compiler Collection) などがあります。あるいは別の選択肢として、一部の Linux/UNIX パッケージ・マネージャー (Ubuntu リポジトリーを使用する Synaptic Package Manager など) を利用して Scilab を入手することもできます。

PHP と Apache のセットアップ

PHP プログラムを実行するには、インタープリターを使って PHP スクリプトを実行する必要があります。インタープリターは PHP の Web サイトからダウンロードすることができ (「参考文献」を参照)、また一部の Linux/UNIX パッケージ・マネージャーを利用して入手することもできます。

サーバー・サイド言語として PHP を動作させるためには Web サーバー・ソフトウェアが必要です。そうした Web サーバーの 1 つが Apache HTTP Server です。Apache HTTP Server は Apache の Web サイト (「参考文献」を参照) から入手することができ、または一部の Linux/UNIX パッケージ・マネージャーを利用して入手することもできます。

一部のシステムでは、Apache と PHP を MySQL など他のアプリケーションと共にカプセル化することができます。その一例が XAMPP ですが、そうしたシステムでは、この記事で概説するタスクの一部を実行する上で制約があるかもしれません。

接続

Scilab は一種の数学アルゴリズム言語ですが、平均的なコンピューター・プログラマーには見覚えがあるかもしれません。Scilab は数学アプリケーションや科学アプリケーションに特化した動的言語であり、強力な行列演算機能を備えています。数学者や科学者のプログラマーにとって、Scilab は R プログラミング言語と似ており、また Scilab の体系はオープンソースの GNU Octave や独自体系の MATLAB などと似ています。

コマンドラインでの Scilab への接続

Scilab にはかなり便利な GUI が付属しており、この GUI の中で Scilab スクリプトを容易に作成することができます。ただし Scilab をコマンドラインから使うこともでき、後ほど説明する Web ベースのシステムを動作させるためにはコマンドラインで Scilab を使う必要があります。コマンドラインで行う操作は下記のようにかなり複雑です。

scilab -nwni -nb -e "m=[1 2 3; 3 4 5];disp(m);exit"

このコマンドは、文字の組み合わせが奇妙なため、パッと見ただけでは若干わかりにくくなっています。先頭には scilab という単語があります。もちろん、scilab によって Scilab が起動されます。続いて、以下のフラグ (Scilab をロードする際のパラメーター) が指定されています。

  • nwni — ウィンドウ・システムは不要
  • nb — ウェルカム・メッセージを表示しない
  • e — Scilab エンジンは、このフラグに続く項目を式として実行する

変数を割り当てる場合には、例えば a = 5; のようにします。a は変数名の一例であり、= は代入を意味し、5 は代入される値です。行はセミコロン (;) で終わります。セミコロンで終わらない場合には、実行後に結果が画面に出力されます。

この例では、1 つの変数を行列に割り当てています。行列の作成には大括弧 ([]) を使い、各要素の区切りには空白、各行の区切りにはセミコロンを使います。つまりこの例では、m=[1 2 3; 3 4 5] という行列が作成されます。

これから作成する Web ベースのシステムでは、画面に何を出力するのかを明確に指定する必要があります。そのためには Scilab の disp 関数を使います (disp 関数は disp(m) という形で変数を引数に取ります)。次に Scilab を終了し、計算リソースを解放する必要があります。そのためには exit を使います。Scilab によるスクリプトの詳細については Scilab の Web サイトを参照してください。

PHP を使って Scilab に接続する

PHP と Scilab という、一見すると本質的に異なるものに見えるシステム間のギャップを埋めるには、いくつかの方法が考えられます。1 つの方法は、Scilab の Java インターフェースを使って Scilab のコマンド・チェーンを直接送信する方法です。もう 1 つの方法は、コマンドラインを使って Scilab をインスタンス化し、そのインスタンスに Scilab の式を渡す方法です。ここでは 2 番目の方法を選択しました。その理由は、Scilab の Java インターフェースはまだ初期段階にあり、動作を改善しない限り PHP では完全に機能しないからです。また、2 番目の方法では Scilab のインスタンス化を完全に制御することができ、既製のインターフェースに限定されることがありません。

PHP を使う最初の例として、この前のセクションで作成した単純な Scilab コマンドを送信します。その結果、画面に行列がプレーン・テキストとして表示されます。リスト 1 は、この操作を行うためのコードを示しています。

リスト 1. Scilab に送信された結果を PHP を使って出力する
    <?php
        exec('scilab -nwni -nb -e "m=[1 2 3; 3 4 5];disp(m);exit;"', $output);
        print_r($output);
    ?>

exec 関数を使ってオペレーティング・システムにコマンドを送信します。このコマンドによって、この前のセクションの場合とまったく同じように、Scilab が呼び出されます。

  • exec — この便利な PHP 関数は、オペレーティング・システムのコマンドラインにストリングを送信し、そのストリングをコマンドとして実行させます。この関数を Web サイトで使う場合には少し注意が必要です。つまり誰もがこの関数を利用できるようにしてしまうと、サーバーのハードディスクへ誰もがアクセスできるようにしてしまっていることになります。この関数の 1 番目のパラメーターは送信することになるコマンドであり、2 番目のパラメーターはそのコマンドの実行結果が複数行にわたる完全な出力として格納される変数です。
  • print_r — このコマンドは、単純に任意の変数を (その変数の構造を含めて) 出力します。この場合には $output 変数は 1 次元の配列であり、配列の各要素は 1 行で出力されます。

次の例では、さまざまな言語のコードをマージしています。つまり Web データ文書言語の XHTML、サーバー・サイド言語の PHP、そして Linux/UNIX コマンドラインからの Scilab の呼び出しを組み合わせています。リスト 2 を見てください。

リスト 2. XHTML で PHP を使用して複雑な式を Scilab に送信し、その出力を描画する
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Example 2: Sending equations to Scilab using a PHP web interface</title>
</head>
<body>
<p>Example 2: Sending equations to Scilab using a PHP web interface<p>
<?php

    if(isset($_GET['code']) && $_GET['code'] != "") {
        $defaultcode = str_replace('\"', '"', $_GET['code']);
        $code = preg_replace("/[\n\r]/","", $_GET['code']);
        exec('scilab -nwni -nb -e "' . $code . ';exit;"', $output);
        echo '<div id="result">Result = ';
        foreach($output as $line) {
            print_r($line);
            echo "<br />";
        }
        echo "</div>";
    } else {
        $defaultcode = "";
    }
?>
    <div id="codeeditor">
    <form action="webscilab.php" method="get">
        <textarea id="code" name="code" title="Code" rows="10" cols="30"
			style="Courier, monospace"><?php echo $defaultcode; ?>
		</textarea> <br />
        <input type="submit" id="submit" name="submit"
			title="Submit" value="Submit" />
    </form>
    </div>
</body>
</html>

まず、XHTML を分析し、重要な部分に焦点を当てましょう。この記事で説明しない部分の詳細について理解するためには、W3Schools の Web サイトが適切な出発点となります (「参考文献」を参照)。

リスト 2 のコードは単純な XHTML フォームです。このフォームは HTTP の GET メソッドと追加のパラメーターを使って現在のページを更新しています。このフォームの中には、ユーザーが Scilab コードをそのまま入力して実行できるテキスト領域、そしてフォームのアクションを実行する「Submit」ボタン、という 2 つの要素があります。

PHP によって、このコードを本格的に制御することができます。PHP コードはページがロードされると、そのページがフォームから「リロードされた」ページかどうかを判断します。リロードされたページの場合には、PHP コードは単純にフォームから Scilab コードを取得し、そのコードを exec コマンドを使って Scilab に送信します。フォームから取得した値は、PHP の $_GET 配列 (HTTP の get パラメーターの配列) に保存されます。

ただしこの PHP コードは、リスト 1 のコードとはいくつかの重要な点で異なります。まず、HTTP と Web ブラウザーは独特の動作をするため、ユーザーがコードの再編集や再実行を行える手段が必要です。つまり、入力されたコードを変数に保存し、HTTP に含まれる特定の文字列を元の値 (この場合は引用符) に置き換える必要があります。そのためには PHP の str_replace 関数を使います。この関数を使うことで、それらの文字列を textarea というフォーム要素のデフォルト値に書き込むことができます。

また、コードに対する操作も必要です。コードはコマンドラインから Scilab に送信されるため、改行を削除してクリーンアップする必要があります (あるいはもっと正確には、改行を空のストリングで置き換える必要があります)。この場合には、もう少し強力な、PHP の preg_replace を使います。preg_replace は検索用語として正規表現を引数に取ります。exec 関数に Scilab コードが入力されているため、Scilab コードの末尾に exit コマンドが連結されており、毎回ユーザーが exit という単語を入力するのを当てにする必要がありません。

次に、PHP の foreach ループがあります。このループは出力された各行に繰り返し処理を行い、ブラウザーに表示できる適切な XHTML にします。このループは単純に配列に対して繰り返し処理を行い、コマンドラインで出力する場合と同じように各行を出力しますが、各行を出力するごとに XHTML の改行要素を挿入しています。

方程式の送信と解の受信をグラフィカルに行う

ここまでの段階では、ある程度強力なアプリケーションを作成しましたが、このアプリケーションは Scilab のインターフェースを使った場合と大きく異なるものではありませんでした。またソフトウェアから使用する上でも、あまり使いやすいものではありませんでした。そこで次の課題は、XHTML と PHP による何らかのグラフィカル・インターフェースを提供することです。そのためには、強力な Scilab 式を生成する便利なフォームを追加します。

そうしたフォームの使い方を最もわかりやすく示す例として、単純な正弦計算プログラムがあります。単純でわかりやすくするために、リスト 3 には XHTML の本体部分のみを示してあります。

リスト 3. 三角法に基づく計算プログラムによる Scilab スクリプトの動的生成
<body>
<p>Sine Calculator<p>
<?php
    $answer = "";
    if(isset($_GET['opposite']) && isset($_GET['hypotenuse'])) {
        $code = "result = " . $_GET['opposite'] .
		  "/" . $_GET['hypotenuse'] . "; disp(result); exit";
        exec('scilab -nwni -nb -e "' . $code . '"', $output);
        $answer = $output[1];
    }
?>
    <div id="calculator">
    <form action="example3.php" method="get">
        <label for="opposite">Opposite</label><br />
		<input type="textbox" id="opposite" name="opposite" title="opposite"
		  value="<?php echo $_GET['opposite']; ?>" /><br />
        <label for="hypotenuse">Hypotenuse</label><br />
		<input type="textbox" id="hypotenuse" name="hypotenuse"
		  title="hypotenuse" value="<?php echo $_GET['hypotenuse']; ?>" />
		<br />
        <input type="submit" id="submit" name="submit" title="Submit" value="Submit" />
		<br /><br />
        <label for="result">Result</label><br />
		<input type="textbox" id="result" name="result"
		  value="<?php echo trim($answer); ?>" /><br />
    </form>
    </div>
</body>

このコードはリスト 2 のコード・エディターと同じような手法を使用しています。リスト 3 で、直角三角形の対辺と斜辺に対応する単純なテキストボックス・フォームを作成しています。次に、このフォームを取り込んで $_GET 配列に格納されている計算結果と連結されています。この考え方は非常に単純ですが、これを強力な科学アプリケーションや数学アプリケーションのベースにすることができます。

Scilab のグラフを PHP で作成する

Scilab はデータに基づいてグラフを出力する機能を持っています。この機能によって Scilab は信じられないほど強力になり、この機能を Web アプリケーションで活用することができます。この機能は画面にグラフを出力できるだけではなく、ファイルにも出力することができ、ファイル・フォーマットには Web ブラウザーでの表示に適した GIF や JPEG なども含まれています。リスト 4 の Scilab コードでは、サンプルのグラフが JPEG ファイルに出力されます。

リスト 4. Scilab のグラフを出力するスクリプトの例
scf(0);
plot2d();
xs2jpg(0,'example4.jpg');

グラフを生成する方法は他にも多数ありますが、グラフをファイルに出力する、この xs2jpg 関数を使うのは便利な方法です。このコードを PHP を使って実行するためには、グラフィック・ライブラリーが必要です。そのため、コマンドラインで nwni フラグを使う代わりに nw を使います。nw を使う場合も Scilab の計算はコマンドラインでしかできませんが、nw はグラフィック・ライブラリーをロードすることができます。

この機能は PHP に含められる可能性があります。リスト 5 のコードはその一例であり、このコードはリスト 2 のコードを基にしています。(このコードを適切に動作させるためには少しアクセス権を操作する必要があり、またこの方法よりも適切な方法があるかもしれないことに注意してください。)

リスト 5. Scilab のグラフを XHTML で出力、表示するためのにわか仕立ての手法
<body>
<p>Example 4: Sending equations to Scilab and receiving JPEGs<p>
<?php

    if(isset($_GET['code']) && $_GET['code'] != "") {
        $filename = time() . ".jpg";
        $defaultcode = str_replace('\"', '"', $_GET['code']);
        $code = preg_replace("/[\n\r]/","", $_GET['code']);
        $exec = 'scilab -nw -nb -e "' . $code .
			'xs2jpg(0,\"/var/www/webscilab/' . $filename . '\");exit;"';
        exec($exec);
        ?>
        <div id="result">
          <img src="<?php echo $filename; ?>" alt="result" />
        </div>
        <?php
    } else {
        $defaultcode = "scf(0);
plot2d();";
    }
?>
    <div id="codeeditor">
    <form action="example4.php" method="get">
        <textarea id="code" name="code" title="Code"
		  rows="10" cols="30" style="Courier, monospace">
			<?php echo $defaultcode; ?>
		</textarea> <br />
        <input type="submit" id="submit" name="submit" title="Submit" value="Submit" />
    </form>
    </div>
</body>

JPEG ファイルを作成するために Scilab を xs2jpg 関数と連結していることに注意してください。またタイムスタンプ関数を使用することで、(言うなれば) 一意のリンク先ファイル名を生成していることにも注意してください (リンクはこの後の XHTML の img タグの中で行われています)。この方法は多少実験的であり、あまり望ましくないアクセス権設定に依存しているため、とても完全なソリューションとは言えません。ただし、こうした方法が可能であることを、このコードから理解できると思います。

まとめ

この記事では、コマンドラインから PHP を使って Scilab に容易に接続する方法について説明しました。ユーザーは Scilab に Scilab スクリプトを送信することができ、また Scilab スクリプトを生成するための使いやすいインターフェースを作成することで、Scilab の複雑さがユーザーには見えないようにしながら Scilab の機能を利用することができます。最後に、実験として Scilab のグラフ・ライブラリーを試し、保存されたグラフに XHTML を使ってリンクする方法を説明しました。

皆さんがこのユニークなソフトウェアを引き続きいじってみることで、この記事で説明した基本的な内容について理解を深めてもらえれば幸いです。特に、Scilab の擬似焼きなまし法の関数や遺伝的アルゴリズムの関数、あるいはアップロードされた写真や動画を操作できる画像および動画処理ライブラリーについて学んでください。Web 上での効率的な数学処理、そしてオープンソースのツールや技術を使用することで、より「スマート」な世界を協力作業によって構築できるようになるのです。


ダウンロード可能なリソース


関連トピック

  • Scilab をダウンロードし、またドキュメントやチュートリアルも見つけてください。
  • Apache のサイトを訪れてください。この Web ベースで Java ベースという大規模なオープソース・ソフトウェアのリポジトリーには、広範な種類のドキュメントが用意されています。またこのサイトから Apache HTTP Server をダウンロードすることもできます。
  • XAMPP は Apache サーバーと PHP プログラミング言語、その他さまざまなシステムを組み合わせ、1 つの手軽なバンドルにしています。
  • GNU Octave は Scilab や MATLAB に代わる手段として適切です。
  • MATLAB は Scilab や GNU Octave に代わる独自形式の手段です。
  • W3Schools.com には、XHTML や PHP、その他いくつかのプログラミング言語でのコーディングに関する基本的で適切なチュートリアルが用意されています。
  • IBM も科学計算のための商用ライブラリーを提供しており、ESSL (Engineering and Scientific Subroutine Library) や Parallel ESSL などがあります。
  • IBM の WebSphere sMash を使って PHP アプリケーションを作成、デプロイしてください。
  • developerWorks の Web development ゾーンには Web 2.0 開発のためのツールや情報が豊富に用意されています。
  • PHP.net には PHP 開発者のためのリソースが集まっています。
  • Recommended PHP reading list」を調べてみてください。
  • developerWorks には他にも PHP に関する資料が豊富に用意されています。
  • developerWorks を Twitter でフォローしてください。
  • IBM developerWorks の PHP project resources を利用して PHP のスキルを磨いてください。
  • developerWorks podcasts ではソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
  • PHP でデータベースを使うのであれば、Zend Core for IBM を調べてみてください。これはシームレスでそのまま使用でき、インストールも容易な、IBM DB2 V9 をサポートする PHP の開発環境であり本番環境でもあります。
  • My developerWorks コミュニティーは広範な話題を網羅した全般的なコミュニティーとして成功している一例です。
  • developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使った開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。また最も人気の高かった記事とチュートリアルの一覧もご覧ください。
  • IBM 製品の試用版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=481411
ArticleTitle=Scilab と PHP を使った効率的な数学処理
publish-date=03162010