2010/06/18 00:00:00
5日間お付き合いいただきありがとうございました。
これを見てJAKLD使ってみたいという方は末尾最適化に対応したコードも公開されているのでそちらを使うことをお勧めします。
再帰なしでschemeのコードを書くとめんどくさいことになること請け合いです。
■今後の課題
・テストコードを書く
・コメントアウトしてスルーした箇所を再検討
・Subr.javaのdoInvoke()メソッドの修正
・実機での動作確認(オイッ)
最後にソースコードとjarをまとめたものを作りました。
まだ書きかけですのでコードの出来は保証しませんが興味のあるかたは使ってみてください。
一番下の「ダウンロード」をクリックしてダウンロードしてください。
ダウンロードしたiAppliSrcAndJar.zipは解凍して適当なフォルダにおいてください。
■使い方1
ソースコードからコンパイルするにはiアプリの開発環境を作ったあとにEclipseでDoja5.1のプロジェクトを作ったあとそれぞれのフォルダ(srcとres)にコピーすれば動くはずです。
■使い方2
ただ動作させたい場合
http://www.nttdocomo.co.jp/service/imode/make/content/iappli/tool/doja/index.html
から「DoJa-5.1プロファイル向けiアプリ開発ツール」を入手してiアプリエミュレーターをインストールしてください。
エミュレータを起動してプロジェクト読込みから解凍したフォルダを選択して実行できます。

■ソースコードとjarファイル
一応おやくそくですが
私、わいえすまたは株)タイムインターメディアが動作を保証するものではありません。
オリジナルの配布条件と同じMozilla Public License(MPL)にしたがって利用してください。
改変・追加部分もMPLにしたがって利用してください。
ダウンロード
2010/06/17 00:00:00
今日はグラフィックの描画をしてみます。
5つほど関数を実装しました。
・(line x1 y1 x2 y2)
直線の描画
・(set-color r g b)
描画色の設定各色0~255
・(fill x y w h)
四角形の塗潰し
・(repaint)
再描画
・(sleep t)
tミリ秒停止
■サンプルプログラム
res/init.scm
;再描画と処理待ち
(define (wt t) (repaint) (sleep t))
;赤色を設定
(set-color 255 0 0)
;線を描画
(line 0 0 100 200)
;再描画したあと1秒まち
(wt 1000)
;青色を設定
(set-color 0 0 255)
;線を描画
(line 0 0 200 200)
;再描画したあと1秒まち
(wt 1000)
;正方形描画
(fill 10 10 20 20)
;再描画
(repaint)
実行結果

実装は、JAKLDとCanvaを別々のスレッドで動かしてCanvasに持たせたImageにJAKLDに実装した関数で描画するようにしました。
■MyEntry.java
import com.nttdocomo.ui.*;
public class MyEntry extends IApplication {
public void start() {
MainCanvas mc = MainCanvas.getInstance();
Display.setCurrent(mc);
(new Eval()).start();
}
}
■Subr.java
doInvokeメソッドに新規に追加した関数を追加します。
関数に番号を振ってswitch文でと書きましたが手抜きをして元々のコードで関数名が渡ってくるので関数名で分岐させています。
private Object doInvoke(Object[] argV) throws Throwable{
String funcname = name.toString();
//拡張分
if (funcname.equals("line")){ return MainCanvas.line(argV[0], argV[1], argV[2], argV[3]);}
else if (funcname.equals("set-color")){ return MainCanvas.set_color(argV[0], argV[1], argV[2]);}
else if (funcname.equals("fill")){ return MainCanvas.fill(argV[0], argV[1], argV[2], argV[3]);}
else if (funcname.equals("repaint")){ return MainCanvas.rpt();}
else if (funcname.equals("sleep")){ return MainCanvas.sleep(argV[0]);}
:
:
■描画用Canvasクラス MainCanvas.java
import com.nttdocomo.ui.Canvas;
import com.nttdocomo.ui.Display;
import com.nttdocomo.ui.Graphics;
import com.nttdocomo.ui.IApplication;
import com.nttdocomo.ui.Image;
/**
* MainCanvas
*
*/
class MainCanvas extends Canvas {
private static MainCanvas m_mc = null;
public static Image m_img = null;
public static int m_color = 0;
private final static Boolean T = Boolean.TRUE;
private final static Boolean F = Boolean.FALSE;
public static MainCanvas getInstance(){
if (m_mc == null){
m_mc = new MainCanvas();
}
return m_mc;
}
private MainCanvas() {
setSoftLabel(SOFT_KEY_1, "END");
m_img = Image.createImage(Display.getWidth(), Display.getHeight());
}
public void paint(Graphics g) {
g.lock();
g.drawImage(m_img, 0, 0);
g.unlock(true);
}
public void processEvent(int type, int param) {
if (type == Display.KEY_RELEASED_EVENT) {
if (param == Display.KEY_SOFT1) {
(IApplication.getCurrentApp()).terminate();
}
}
}
static { Subr.def("MainCanvas", "sleep", "sleep", 1); }
public static Boolean sleep(Object msec) throws InterruptedException {
if (m_mc == null) return F;
Eval.sleep(((Integer)msec).longValue());
return T;
}
static { Subr.def("MainCanvas", "rpt", "repaint", 0); }
public static Boolean rpt() {
if (m_mc == null) return F;
m_mc.repaint();
return T;
}
static { Subr.def("MainCanvas", "set_color", "set-color", 3); }
public static Boolean set_color(Object r1 ,Object g1 ,Object b1) {
if (m_mc == null) return F;
m_color = Graphics.getColorOfRGB(((Integer)r1).intValue(), ((Integer)g1).intValue(), ((Integer)b1).intValue());
return T;
}
static { Subr.def("MainCanvas", "line", "line", 4); }
public static Boolean line(Object x1 ,Object y1 ,Object x2 ,Object y2) {
if (m_mc == null) return F;
Graphics g = m_img.getGraphics();
g.setColor(m_color);
g.drawLine(((Integer)x1).intValue(), ((Integer)y1).intValue(), ((Integer)x2).intValue(), ((Integer)y2).intValue());
return T;
}
static { Subr.def("MainCanvas", "fill", "fill", 4); }
public static Boolean fill(Object x1 ,Object y1 ,Object w ,Object h) {
if (m_mc == null) return F;
Graphics g = m_img.getGraphics();
g.setColor(m_color);
g.fillRect(((Integer)x1).intValue(), ((Integer)y1).intValue(), ((Integer)w).intValue(), ((Integer)h).intValue());
return T;
}
}
2010/06/16 00:00:00
今日は残りのソースを補完しています。
1.ソースコードのまったくないクラスの実装
DoJaプロファイルにはPushBackReaderとstringWriterはありませんので実装が必要です。
・PushBackReaderの実装
まともに実装するとちょっと面倒くさいかなと思いますが、参照箇所を調べるとunreadは1文字分だけに限られるので簡単に実装できます。
・stringWriterの実装
stringWriterも参照箇所を調べるとwrite()メソッドはwrite(char[] cbuf, int off, int len) だけだったのでバッファをStringBufferで持っておいてappendメソッド一発で実装できます。
これであとは残りのソースを移植するだけです。
2.残りのソースをプロジェクトに追加
残っていた
Symbol.java
Subr.java
Num.java
List.java
Char.java
をプロジェクトにインポートします。
ソースをみればわかると思いますが
Symbol.java
List.java
Char.java
についてはほとんどエラーはありません。
簡単に修正できました。(一部コメントアウト)
残った2ファイルはPDFにも書いてあるように修正箇所も多くもっとも手間がかかりました。
Subr.java
Num.java
■Num.java
これは根気よく修正するしかありません。
よく使うLisp関数が定義されているのでコメントアウトしてスルーすることもできません。
PDFにもありますが、Numberから派生しているはずのIntegerとBigIntegerがDojaではNumberとBigIntegerがなくなっていてIntegerがOjectから派生しています。(゚Д゚;)
あとJava1.4なのでキャストは明示的に書く必要があります。
NumberをObject変更してBigIntegerのコードを削除してひたすらキャストを追加しました。
■Subr.java
これもPDFに倣って修正を加えました。
オリジナルのコードではLispの関数を実装したメソッドをコールするためにリフレクションを使っています。
DojaではリフレクションをサポートしていないためPDFには関数に番号を振ってswitch分でディスパッチしたとありました。
そこで別途Eclipse上にプロジェクトを作成してそこで改造したJAKLDを動かしてコードを自動生成しました。

携帯のjarを削除してエラーも無くなりきれいになりました。
2010/06/15 00:00:00
Schemeをアプリに組込んで使いたいのでUIからコードを入力するのでは不都合です。
リソースファイルからソースを読み込むように変更します。
IO.java、Eval.javaをコピーしてClasses以下のIO.class、Eval.classを削除。
以下の修正を加え。そのほかエラーになる関数はできるだけ一旦コメントアウトの方向で修正。
■load関数がリソースファイルを読めるよう修正
・元
public static PushbackReader openInputFile(String name, String encoding)
throws FileNotFoundException,
UnsupportedEncodingException {
FileInputStream fis = new FileInputStream(name);
return new PushbackReader (encoding == null
? new InputStreamReader(fis)
: new InputStreamReader(fis, encoding));
}
・先
public static PushbackReader openInputFile(String name, String encoding)
throws java.io.IOException ,UnsupportedEncodingException {
InputStream instream = Connector.openInputStream(name);
InputStreamReader inreader = null;
if (encoding==null){
inreader = new InputStreamReader(instream);
}
else{
inreader = new InputStreamReader(instream,encoding);
}
return new PushbackReader(new BufferedReader(inreader));
}
■Evalクラス
Threadクラスを継承してスレッドで動作するよう変更
run()メソッドで(load "resource://init.scm")を実行するよう変更。
■MyEntryクラス
GUIのコードはすべて破棄してEvalクラスを生成するよう修正。
これだけ。
public class MyEntry extends IApplication {
public void start() {
(new Eval()).start();
}
}
■Lispのコード
プロジェクトの下のresフォルダに「init.scm」ファイルを置いておきます。
(define (fact n)
(if (= n 1)
1
(* n (fact (- n 1)))))
(display (fact 3))
■実行結果

携帯(エミュレータ)の画面にはなにも出ませんが

標準出力に結果が出ています。
オリジナルのメッセージを残してますので「6」がinit.scmの実行結果になります。
順番が前後しましたが明日は残りのソースコードの移植について書きます。
2010/06/14 00:00:00
JAKLDというJavaで実装されたオープンソースのLisp処理系をiアプリに載せたのでその過程をまとめてみようかと思います。
JAKLDとは?
http://www.yuasa.kuis.kyoto-u.ac.jp/~yuasa/jakld/index-j.html
で公開されているSchemeに似たJavaで実装されたLisp処理系です。
組込み用にサイズが小さくつくられていてソースコードも読みやすいのでハックして遊ぶには手軽な処理系です。
しかもiアプリのモジュールも公開されています。
iアプリ上でLispのコードを入力して実行できる楽しそうな構成ですが、残念ながらiアプリ用のソースは公開されていません。
幸いiアプリへの移植した手順がPDFで公開されていたのでそれらを参考に移植した手順を書いていきます。
・処理系に関する詳細
http://www.yuasa.kuis.kyoto-u.ac.jp/~yuasa/jakld/pro.pdf
・iアプリ版の詳細
http://www.yuasa.kuis.kyoto-u.ac.jp/~yuasa/jakld-i/jakld-jssst.pdf
・別に見つけた処理系を紹介している論文
http://jp.franz.com/base/seminar/2006-11-22/SeminarNov2006-yuasa.pdf
まず動く環境を作りました。
試行錯誤しながら修正したいためとにかく動くものがほしかったので少し邪道なことをしてできるだけ修正をせずに動かしています。
使ったもの
・ソース
末尾最適化の無いバージョンを使いました。
解凍して中のjavaのコードだけ使います。
http://www.yuasa.kuis.kyoto-u.ac.jp/~yuasa/jakld/all.tar.gz
・携帯用のjar
そのままのjarと解凍した中のclassファイルも使います。
http://www.yuasa.kuis.kyoto-u.ac.jp/~yuasa/jakld-i/jakld.jar
1.開発環境
Eclipseだけは推奨バージョンではなく3.5(galireo)を使っています。
新しいバージョンのSVNのプラグインが使いたかったのでSVNが必要なければ推奨バージョンで問題ありません。
ほかはごく普通の環境を使いました。
Dojaは5.1を使いましたがjarサイズの問題を除けばDoja3.5あたりでも大丈夫かと思います。
iアプリの開発環境についての詳細はドコモのサイトを見てください。
http://www.nttdocomo.co.jp/service/imode/make/content/iappli/index.html
2.プロジェクトの作成
EclipseにDojaの新規プロジェクトを作ってダウンロードしたソースをインポートします。

エラーで真っ赤。
3.クラスパスの設定
エラーの出ているファイルを削除して携帯用のjarを参照するようクラスパスを変更します。
4.Entry.javaを補完
携帯用の入力UI部分のコードがないので
http://jp.franz.com/base/seminar/2006-11-22/SeminarNov2006-yuasa.pdf
に載っているものに手をいれてMyEntry.javaを作成
import com.nttdocomo.ui.*;
public class MyEntry extends IApplication implements ComponentListener {
private TextBox inbox, outbox;
private Button evalbutton;
private FifoReader consoleInputStream;
public void start() {
Panel p = new Panel();
p.add(inbox = new TextBox("", 50, 10, TextBox.DISPLAY_ANY));
p.add(evalbutton = new Button("eval"));
p.add(outbox = new TextBox("", 50, 10, TextBox.DISPLAY_ANY));
p.setComponentListener(this);
Display.setCurrent(p);
consoleInputStream = new FifoReader();
IO.currentInputPort = new PushbackReader(consoleInputStream);
IO.currentOutputPort = new TextBoxWriter(outbox);
(new Eval()).start();
}
public void componentAction(Component source, int type, int param) {
if (source == evalbutton) {
try {
consoleInputStream.append(inbox.getText());
} catch (BufferFullException e) {
e.printStackTrace();
}
}
}
}

5.classファイルをコピー
これでとりあえずコンパイルの通る環境ができました。
このままではエミュレータで動かないので携帯用のjarを解凍して中のclassファイルをすでにあるファイルを上書きしないようにclassesフォルダにコピーします。
実行

結果

オリジナルと比べてちょっと手抜きですが動くことが確認できたのでよしとします。
明日はリソースファイルから読んだLispコードを実行するように修正します。
2007/11/16 00:00:00
中古のノートパソコン ThinkPad R31を買いました。
目立つキズもなく電池の状態もよくて2万円でラッキーな買い物でした。
さっそくVine4.1をインストールしてみたんですが、メモリは128Mとちょっと少ないのでかなり動きが苦しいです。
週末にでもメモリを買出しに秋葉原にいこうかなぁ・・・。
今日は私の行ったことがある人形の展示が見られるところや定期的に開催されるイベントの紹介です。
横浜人形の家
http://www.welcome.city.yokohama.jp/doll/
横浜のデートのついでにでもどうぞ。
館内で西洋の人形の作り方のビデオが上映されているんですが、
どっかでみたことあるなと思ったら私が以前通っていた教室で撮ったものでした。
ビデオのほかは人間国宝平田郷陽の人形がおすすめです。
リカちゃんキャッスル
http://www.liccacastle.co.jp/
タカラの見学用の工場です。
ちょっと方向性は違いますが・・・リカちゃんの意外な秘密がわかったりと面白いです。
女の子がいるお家にはおすすめです。
ドールワールドフェスタ
http://www32.ocn.ne.jp/~japandollworld/
毎年6月頃に開催されるイベントです。
アンティークから着替人形関係のグッツまで幅広く展示・販売されます。
例年、テディベアショーとミニチュアショーが同時開催されてこちらも見ごたえがあってお勧め。
デザインフェスタ
http://www.designfesta.com/index.html
年2回開催のイベントです。
例年、何人かの人が人形を出展してるようです。
私も過去2回ほど出したことがあります。
なんでもありのアートイベント。
とても面白いイベントです。
アイドール
http://www.idollweb.net/west/index.htm
東京以外に大阪、名古屋で開催しているイベントです。
着替人形の服やグッツの展示即売会です。
ワンダーフェスティバル
http://www.kaiyodo.co.jp/wf/
海洋堂が主催の模型の展示即売会です。
人形ではありませんがフィギュアの比率が高いです。
ちょっとクセが強いイベントかもしれません。
月曜から駆け足で紹介してきましたが、人形は怖いからイヤとか言わずちょっとでも興味を持ってもらえたらと思います。
それでは、おつきあいいただきありがとうございました。
2007/11/15 00:00:00
人形関係では人形を作る以外にnamazuを使った人形関係の検索サイトを今年の春くらいからはじめました。
3000サイト15万ファイルくらいを検索するのですが、なんだかんだでインデックスを作るのに1週間くらいかかってしまいます。
そんな訳でダウンロードしっぱなしでも相手のサーバーに負荷をかからないようにダウンロードの間隔や時間を調整したくてクローラーを自作中なんですが思ったより面倒で苦戦中です。
http://doll.search-garden.com/
よかったら見てやってください。
昨日に引き続き本の紹介です。
ざっと流しましたがトレヴィルから出版された人形の作品集です。
トレヴィルは倒産してしまって今は入手困難かもしれません。
どれも人形制作を始めた頃に手当たり次第に買ったものがほとんどです。
作品よりは構造を研究するために見てました。(^^;;
人形姫

いま一番人気のある作家さんかも知れません。
以前ちょっとしたツテで少しだけ御本人と話す機会があって買ってみました。
人形作家

四谷シモンの自伝的な内容です。
私の人形を作るきっかけが澁澤龍彦の本の表紙に載っていた四谷シモンの作品だったりします。
でも、作品集は1冊しか持ってません(^^;
人形愛

私が唯一持ってる四谷シモンの作品集。
Bisque Dolls

以前通っていたアンティークドールのレプリカを作る教室の先生の作品集です。
実は今一番欲しいのはメイクの本だったりします(^^;;;
いい本知りませんか?(笑)
人形作りは男にとっては未知の世界の知識が多すぎて困ります。
それでは、また明日。
2007/11/14 00:00:00
最近はSecondLifeなんかもやってます。
ログインしてもサンドボックスとかひと気のない企業スペースとかでスクリプト書いて怪しげなアイテムを作ってるだけなので友達もいないんですが・・・orz
実生活とやってることが一緒でなんかイヤです。
どうせ実生活と変わらないならいっそ「SecondLifeで仕事を」とか思うんですがなにかありませんか?(笑)
今日、明日は持ってる本の紹介です。
今日は作る編。
人形の伝統技法

日本の人形の作り方が詳しく書いてあります。
とてもいい本ですが今ではアクリル系の画材でいいものがあって胡粉や膠を扱うことは少ないので参考になる箇所は少ないかもしれません。
はじめてつくるBisque Doll 1,2

磁器製の人形の作り方です。
いままで見た本では一番詳しく書いてあるかと思います。
ビスクドールを作りたいかたにはお勧め。
ただ電気窯とか用意するのが大変なのでやるには相当の覚悟が必要です。
窯を買うのはともかく100V 60Aで8時間つけっ放しとか聞いて私は挫折しました。
人体のしくみ

3DCG製作者のための人体構造の解説書です。
CGで人体構造を再現しながらわかりやすくまとめてあってお勧めです。
手作りビスクドール入門

以前通っていた教室の先生の本です。
人形作りのはじめから終わりまでをダイジェストに紹介したような内容です。
ちなみに出版元の日本ヴォーグ社ってタイムインターメディアから歩いて数分だったりします。
近いからといってなんの意味もないですけど・・・。
洋装 製図の書き方から部分縫いまで

服の縫い方についてはいくつか買いましたがこの本が一番わかりやすかったと思います。
(あと和装の本でいいのもあったはずなんですがどっかに埋もれて見つかりません。)
服作りに関してはミシンを買ってだいぶ練習したんですが、結局いまは縫製会社に頼んでいるので自分では縫ってません。
本はこのほかにも色々買いましたが写真集とかポーズ集が多かったように思います。
それでは明日に続きます。
2007/11/13 00:00:00
せっかくなので簡単に作ってるとこなんかを紹介したいと思います。
画像は3,4年前に作ってたHPからの引用です。
材料は石粉粘土です。
石の粉を混ぜたちょっと高級な紙粘土と思ってもらえればそう間違ってないと思います。
商品名でいうと一番よく出回ってるのがフォルモ。
他に、VISION、ネピア、ネピアGOLDはほとんど同じ。
少し値段が高めで滑らかな感じなのがラドール。
よくある作り方では、これらの粘土に桐の粉や木の粉の粘土を混ぜたりしますが自分ではそのまま使ってます。
工具は、左から
- 木工用鬼目のヤスリ
- 彫刻刀
- スパチュラ(ヘラ)
- デザインナイフ
- 鉛筆
- カッター
ほか60番〜100番程度の紙やすりを数種類。
のこぎり、丸ノミ。
特別なものは使ってません。
あとは乾燥用にオーブンがあると便利かな?
冬はファンヒーターの送風口前においておくとよく乾くのですが夏にはできませんので。
普通は発泡スチロールで作った芯にサランラップを巻いて、その周りに粘土を貼り付けて中空に作ります。
うちには昔作った石膏型やら作りかけがやたらとあるのでそれを流用して作ってます。

昔の作りかけを流用します。
へたくそです。

こんな感じでカッターで削っていって。

やすりをかけるといつの間にかこんな感じになっていきます。
(間を省略しすぎ・・・)
こんな感じで全身のパーツを作っていって塗装してゴム紐でつないだらできあがりです。
完成品は・・・。
出すとまずいような画像ばかりなのでやめておきます。
2007/11/12 00:00:00
はじめまして。
今週一週間を担当する「わいえす」です。
最近のマイブームはカピパラとテレビ父さん。
会社の机の上はこんな感じです。
さてなにを書きましょうか?
社内ではフィギュアオタクとか思われてるようですので、その辺の趣味の話でもしようかと思います。
実のところはフィギュアではなく創作人形をやってます。
球体関節人形とかいうやつです。
始めたのがまだWindows3.1でインターネットに繋いでいたころからだから1993〜4年頃からかな?
当時は、作り方を書いた本はもちろん情報がほとんどなくて、人形に関する本はもちろん模型の本を買ってみたりと自分なりに試行錯誤を重ねて作っていました。
今では、一時期ちょっとしたブームもあったのでインターネットで検索すれば作り方はいくらでもわかるのでうらやましい限りです。
ちなみに球体関節人形とは全体を中空で作って関節を球にしてゴム紐を通して可動性を持たせたものです。
ただ自分としては最近は人体造形自体が面白くなってきて関節の球体や可動にはこだわりはないので球体関節人形とは言わず創作人形と言っています。
金曜までそんな感じの人形の話をしたいと思います。