Hatena::ブログ(Diary)

Maximaでつづる数学の旅

お引っ越しのお知らせ

こちらのブログは「はてなブログ」にお引っ越ししました。新しいブログは
Maxima で綴る数学の旅
になります。URLはhttp://maxima.hatenablog.jp/です。
今までのご訪問に感謝しますとともに、新しいブログにも是非ご訪問いただきたく
よろしくおねがいします。

2012-10-16

Maxima (on Android)でセッションを保存する

f:id:jurupapa:20081016142906j:image:w320

模擬レース

にほんブログ村 科学ブログ 数学へ
にほんブログ村


Google Playのコメントを見ていると、「Maxima on Androidでセッションの保存や保存したセッションの復活が出来ればいいのに」、という指摘がありました。

Maximaには元々そのような機能がありますし、それらはMaxima on Androidでも動作します。便利な機能なのでここでご紹介します。

保存は、

save("/data/local/tmp/saveddata",all);

とやればユーザ操作によってセッション中で定義された物、変更された物は全て保存されます。ユーザが定義した関数や変数、入力や出力ラベル(%i1, %o1などのこと)、assume()で定義された述語、など結構色々な物が保存されます。詳しくはマニュアルを見て下さい、と言いたいのですが、マニュアルも保存対象をきちんとリストアップ出来ていません。ですので試してみて下さい。

load("/data/local/tmp/saveddata");

とやれば、保存されたセッション内容が復元します。

ここまでで目的は達成出来ました。がこれでは保存内容が確認出来ません。そこで、

playback();

とやれば、復元された物も含めた全ての入出力ラベルとその値が順に表示されます。


ちなみに上記の例で使用したファイルパスはAndroid端末だとうまく動くと思いますが、Linux, Windows, Mac などではエラーが起こると思います。その場合には、

"/tmp/saveddata"

に書き換えて試してみて下さい。

2012-10-07

Maxima on Androidを振り返る

f:id:jurupapa:20120813185044p:image:w240 f:id:jurupapa:20120923224120p:image:w240

にほんブログ村 科学ブログ 数学へ
にほんブログ村


今年の5月の連休に始めた、Maxima on Androidもようやく一区切り、実装したかった物は全て入れてみました。Androidでアプリを作るのは初めてだったこともあり、どこまで出来るのか自信はありませんでしたが、使って頂いている方にはそこそこ喜んで頂いているようで嬉しいです。

以下、マイルストーンを書いてみます。

  • ECL on Androidを利用して、ECL を Androidのshell上で動作させて、そこにMaximaの.lispファイルを全て読み込んだら一応動いた。結構感動!!
  • コンパイルをするためにAndroid NDKとECLを組み合わせてクロスコンパイル環境を作った。maximaという単独のバイナリ実行ファイルの生成が出来た。
  • 普通のアンドロイドアプリとして動かしたいので、apkからコマンドバイナリを起動する方法を調査。ここは簡単だったが、、、
  • apkからコマンドバイナリをターゲット機器にインストールする方法がよく分からず、この方法の調査に難航。ただこれは多くのLinux向けオープンソースソフトをapk化する際に必ず必要な技のはずなので、じっくり調べて出来ることが分かった。ここは結構辛かったです。
  • どうしても数式レンダリングLaTeX 品質で行いたいと考えました。数式出力が汚いと考える気力が削がれるので、、、調べてみるとweb上での数式表示に革命が起きていてMathjaxというajaxライブラリを使うと超キレイに数式表示出来る!しかもajaxとはいってもサーバサイドのプログラムは不要!!これでAndroid のフレームワークの一つのwebviewを使ってGUIを作ることが決定。見た目が綺麗になり再び感動!!

  • ここまででそれぞれの部品が動作すること、JavaやAndroid frameworkも大体分かったところで、一気に700行くらいのプログラムを書いて最初のバージョンを作り上げました。
  • まず、スクロールの具合が変で表示した数式が隠れている、という問題を調査。結局webviewからjavaへのコールバックをMathjaxレンダリングの終了タイミングで行う、という方法で解決。
  • ソースを見たい、という要望が多く、オープンソース化を行った。使っているオープンソースのライセンスを再チェック。また全てのソースにライセンス表示を入れた。(こういうことは結構手間を食います)。
  • グラフ表示。記事でも書きましたがgnuplotのクロスコンパイル環境で悩みました。NDKでAndroid.mkを書起してやるのか、、、結局Scratchboxという素晴らしいクロス開発環境を見つけて、やってみたらコンパイルが一発で通ってビックリしました。またgnuplotが既にHTML5のcanvasを出力先としてサポートしていたため、webviewに出力を流し込んで表示が出来ることを確認。

以上がMaxima on Androidを作成する道程でした。

2012-10-03

Maxima on Android 1.5 released. Gnuplot is supported

にほんブログ村 科学ブログ 数学へ
にほんブログ村


本日ようやくgnuplotをサポートしたMaxima on Android をリリース出来ました。Google PlayでMaximaと検索すると出てきますので、お試しください。

2012-09-23

plot2d(), plot3d()などによるグラフ表示が動きました (Scrtachboxのおかげです)

にほんブログ村 科学ブログ 数学へ
にほんブログ村


f:id:jurupapa:20120923224120p:image:w180:left

リリース以来、Google PlayのコメントやMaximaのメーリングリストなどで、明確にリクエストされていたのがグラフ表示でした.

ようやく動き始めました.

今回の開発のポイントは、Scratchboxです。これ、クロス開発ツールの一種です.

Androidでは普通Android SDKを使ってJavaでアプリを作ります。出来上がったプログラムがいわゆるAPKです。

このAPKの中にCで書いたライブラリを入れてjavaのJNI経由で呼び出したい、という要望に応えてくれるのがNDK (Native Dev Kit)です。CソースをAndroid向けにコンパイルしてくれます。(このようにターゲット機器向けにコンパイルすることをクロスコンパイル、と呼び、このような開発をクロス開発と呼びます)。

ところがNDKを使って開発しようとするとmakefileをAndroid専用に書く必要あり、gnuplotのような大規模オープンソースソフトを移植するのは非常に面倒なのです.また最近のオープンソースソフトは大抵

% ./configure; make; make install

とすると、動作環境を判別し、必要なライブラリを探し出し、環境に応じたmakefileを生成します。この結果上記のコマンドでインストールまで済んでしまいます。ところが単純に上記をクロス開発環境で実行しても、動作環境の判別をコンパイル環境で行うため、正しいmakefileが生成されません。

Scratchboxではこれらの問題を解決して大規模オープンソースソフトのAndroidへのポーティングを簡単にしてくれます。Scratchboxを正しくインストールした後、使用を開始すると、あたかも自分のshellがターゲット機器で動作しているように振る舞います。その中にはconfigureが環境判別に使うコマンドやコンパイラなども全て提供されます。そのうえ、エミュレータを使って作成したバイナリを実行することさえ可能です。

Scratchboxのインストールは面倒な点がいくつかありましたが、このScratchboxをつかってgnuplotをコンパイルするのは非常に簡単でした。

今回のgnuplotの使い方は、Maximaが生成したgnuplotコマンド列をgnuplotが解釈して、HTML5に出力する、というフィルタ的なものでした。画面表示の心配をすることも無いので、本当にコンパイル自体は簡単でした。

グラフ機能はもう少しチューニングが必要そうなのでリリースは9月末くらいになりそうです。

2012-09-17

Maxima on Androidをオープンソースしました

にほんブログ村 科学ブログ 数学へ
にほんブログ村


Maxima on Androidをオープンソースしました.自分で書いたのはわずか771行のJavaプログラム.後はオープンソースソフトウェアであるMaxima, Mathjax, ECLを組み合わせただけです.あらためてこれらのオープンソースソフトウェアを開発しているコミュニティに感謝します.

興味のある方は、英語のサイトになりますがこちらからダウンロードしてみて下さい.簡単な説明もこちらにあります.