読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

Maxima on Web

iPadMaxima使いたいなと思っています。数式を扱う時って、ディスプレイ見ているよりノート見る感じのほうがいいんですよね。
てっとり早いのはブラウザでAjaxかと思い、誰かやってくれているはずと思ったのですが、なかなかMaximaを生で見せてくれるものはありませんでした。
限定的だったり、公開していなかったり。

ならばと作り始めました。

ウェブサーバーの設定、起動

(以下はMac OS Snow Leopardでのノウハウです。)
ウェブサーバーがCGIを実行するように、設定を変更します。

/etc/apache2/users/<ユーザー名>.confはオリジナルは以下の通りでした。

<Directory "/Users/yuji/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
以下を追加します。
<Directory "/Users/yuji/Sites/cgi-bin">
    Options + ExecCGI
    SetHandler cgi-script
</Directory>


次に、システム環境設定の「共有」から「Web共有」を「入」にします。

ウェブページの準備

以下のようなウェブページmaxima.htmlを作成します。
フォームの中のテキストをcgi-bin/maxima.cgiに引数としてGETリクエストを送り、レスポンスを表示します。
Javascriptライブラリには、jQueryとPrototype Javascript frameworkが人気ですが、後者にしました。予め、prototype.jsをダウンロードしておきます。

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>Maxima on Web</title>
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript"><!--
function execute() {
  var xmlHttp = new Ajax.Request(
    'cgi-bin/maxima.rb?' + $('command').value,
    {method: 'get',
    onSuccess: function(request) {
      $('result').innerHTML = request.responseText;
      },
    onFailure: function(request) {
      alert('failure');
    },
    onException: function(request) {
      alert('exception');
    }
  }
  );
}

// --></script>
</head>
<body>
<h1>Maxima on Web</h1>
<form>
<input type="text" id="command" size="80" value="" />
<input type="button" value="実行" onClick="execute()" />
</form>
<div id="result"></div>
</body>
</html>

CGIスクリプトの準備

以下のようなCGIを作成します。言語にはRubyを使いました。Ruby初心者です。書き方に自信はありません。
引数を標準入力でMaximaに渡し、tex出力を返します。

#!/usr/bin/ruby
# -*- coding: undecided -*-
texfile = "foo.tex"
# Maximaのtexコマンドはファイルに追加していくので最初にファイルを消しておく。
`rm #{texfile}` 

cmd = ENV['QUERY_STRING']
if /;$/ !~ cmd then
  cmd = cmd + ";" #cmdの最後に;がなければ追加する。
end
cmd = cmd + "\ntex(%, \\\"" + texfile + "\\\");"
r = `echo "#{cmd}" | /Applications/Maxima.app/Contents/Resources/maxima.sh`

f = open(texfile)
print "Content-Type: text/plain\n\n"
puts "<div align=\"center\">"
puts "<img src=\"http://latex.codecogs.com/gif.latex?"+ f.read + "\" />"
puts "</div>"


後は、グラフ対応をちゃんとして、AJAXでどこまで数式を扱いやすくするか。AJAXに限界があるなら、ネイティブのアプリケーションで。夢が広がります。