Maxima on Web
iPadでMaxima使いたいなと思っています。数式を扱う時って、ディスプレイ見ているよりノート見る感じのほうがいいんですよね。
てっとり早いのはブラウザで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に限界があるなら、ネイティブのアプリケーションで。夢が広がります。