自作ソフトのアイコン用などでドット絵に腐心していた頃、色数や形状にやたら細かいルールを決めていた。
例えば32×32のキャラ絵なら、全体を頭・胸・腹の3つに分ける。この時点で、一度に考えるべき領域が1/3に減る。頭部は髪と顔、胸部は胸と腕、腹部は腹と脚に分ける。さらに手足は左右に分かれるので、全体のピクセル数が少なければ、一度に考える領域は数ピクセルで済む。
結果、「32×32のキャラ絵」が、分割することで「4~6ピクセルで右手だけ描く」に単純化される。
決められたルールの中で表現する長所は、理詰めでルーチン化して描き進められることと、事前にゴールが分かっている安心感だ。
逆に、大きな画用紙を渡されて「自由に描いてごらん」というのは恐怖だ。キャンバスの解像度が3桁だったりベクタツールだったりすると、途端にゴールが描けなくなって不安になる。
体験から得た結論は月並みなもので、「ゴールの見えない作業は不安だ。ルーチン化はゴールを見えやすくしてくれる。ただし、新しい世界に対応するのが一層難しくなる」ということだった。
2010-10-08
プログラムに関心の無い人向けのプログラミングは...
5年ほど前、色々な人が参加している作業で100個くらいのファイルを改名する必要があった時、プログラムをVBScriptで書いて配布した。
素のVBScriptがどれだけショボい代物かは皆知っていた。が、パソコンの中身から使う能力までバラバラな環境だったので、数十行のvbsファイルをばらまく方が楽だったのだ。
最近、書店へ行ったら、Twitter BOTに関心のある人にRubyをインストールさせて、数行でいかにクールなことができるかを紹介する本を見かけた。
パソコンの使い方でアドバイスしたことがある人なら、ソフトウェア開発に関心の無い人にその手の環境をインストールさせるのが、どれだけ骨が折れる作業か知っていると思う。
今では、スクリプト言語のランタイムをまるまるインストールする代わりに、Webで何か書くと実行から公開までやってくれるGoogleガジェットのようなサービスがある。もちろん、とりあえず手元でJavaScriptを動かすのもスタートラインとして良いと思う。
不特定多数向けにプログラミング寄りのことをさせる場合、巨大なAPIリファレンスの最初の1ページを読んでもらえるよう期待するよりも、やりたいと思った時に始められて「やーめた」と思ったらやめられることの方が重要だと思う。ゲームとか動画とか、興味をひかせるものが沢山ある中では、なおさらだ。
素のVBScriptがどれだけショボい代物かは皆知っていた。が、パソコンの中身から使う能力までバラバラな環境だったので、数十行のvbsファイルをばらまく方が楽だったのだ。
最近、書店へ行ったら、Twitter BOTに関心のある人にRubyをインストールさせて、数行でいかにクールなことができるかを紹介する本を見かけた。
パソコンの使い方でアドバイスしたことがある人なら、ソフトウェア開発に関心の無い人にその手の環境をインストールさせるのが、どれだけ骨が折れる作業か知っていると思う。
今では、スクリプト言語のランタイムをまるまるインストールする代わりに、Webで何か書くと実行から公開までやってくれるGoogleガジェットのようなサービスがある。もちろん、とりあえず手元でJavaScriptを動かすのもスタートラインとして良いと思う。
不特定多数向けにプログラミング寄りのことをさせる場合、巨大なAPIリファレンスの最初の1ページを読んでもらえるよう期待するよりも、やりたいと思った時に始められて「やーめた」と思ったらやめられることの方が重要だと思う。ゲームとか動画とか、興味をひかせるものが沢山ある中では、なおさらだ。
2010-09-23
Java AppletをGoogleサイトで表示してみる
Google Sitesのページエディタにappletタグを貼り付けても、保存の際に削除されてしまう。対処方法をGoogleで調べてみたら、Google ガジェット経由で表示できるらしい。
で、モノクロアニメのアプレットを移植してみたら、セキュリティ例外で落ちる。Google Sitesの場合、ファイルを要求する時のURLと実際に返されるURLが異なるようだ(試しにブラウザで画像のURLを確認すると分かる)。
どうもGoogle Sitesに置いたアプレットからアニメファイルにアクセスすると、アプレットのコードベースとアニメファイルのURLドメインが違っていて、アクセスエラーを引き起こしているように見える。
結果、Java Appletと必要なファイル全てを1つのzipに入れてみたら動いた。
へらへらアプレット: WC(わらのさん作)
https://sites.google.com/site/syjiroji/applet/hela2app (削除されました)
で、モノクロアニメのアプレットを移植してみたら、セキュリティ例外で落ちる。Google Sitesの場合、ファイルを要求する時のURLと実際に返されるURLが異なるようだ(試しにブラウザで画像のURLを確認すると分かる)。
どうもGoogle Sitesに置いたアプレットからアニメファイルにアクセスすると、アプレットのコードベースとアニメファイルのURLドメインが違っていて、アクセスエラーを引き起こしているように見える。
結果、Java Appletと必要なファイル全てを1つのzipに入れてみたら動いた。
へらへらアプレット: WC(わらのさん作)
https://sites.google.com/site/syjiroji/applet/hela2app (削除されました)
2010-09-05
jrunscriptはいつか試験的でなくなるのかしらん
jrunscriptの使い勝手というよりも、Javaでスクリプト例外が発生した際のエラー報告の仕組みがもう少し何とかなれば(特にエラーの発生したスクリプトの行番号)...。
developerWorks Japan: 今まで知らなかった 5 つの事項: Java スクリプト API
「注: このツールは試験的なものであり、将来の JDK のバージョンでは利用できなくなる可能性があります。」
JDK(TM) 6 ドキュメント: jrunscript - コマンド行スクリプトシェル
developerWorks Japan: 今まで知らなかった 5 つの事項: Java スクリプト API
「注: このツールは試験的なものであり、将来の JDK のバージョンでは利用できなくなる可能性があります。」
JDK(TM) 6 ドキュメント: jrunscript - コマンド行スクリプトシェル
2010-08-14
今さらyoutubeに連続再生が追加されていたことを知る
サムネイルをクリックしたはずが、連続再生の「キュー」に突っ込まれていて慌てふためいた。
ユーチューブシャッフル(というサイトがあった)に興奮していたのが今は昔...。
ユーチューブシャッフル(というサイトがあった)に興奮していたのが今は昔...。
2010-07-18
Java 7: クロージャは無くとも、新しいファイルシステムAPIには期待している
スクリプト言語で書き捨てスクリプトを書く際、あのJava 1.1.x時代から続く古いファイルシステムAPIのせいで、ファイル操作が中心の「いかにもスクリプトっぽいこと」の実装に突っかかっていたのが、Java 7で少しでも改善されるとありがたい。
developerWorks Japan - Java 技術、IBM スタイル Java 技術の新たな時代 http://www.ibm.com/developerworks/jp/java/library/j-java7.html?ca=drs-jp
Java 6付属のRhinoで実装されたシェルっぽいもの(jrunscriptをそのまま起動すると確認できる)も、今回のバージョンでそれらしくなるのかしらん。
developerWorks Japan - Java 技術、IBM スタイル Java 技術の新たな時代 http://www.ibm.com/developerworks/jp/java/library/j-java7.html?ca=drs-jp
Java 6付属のRhinoで実装されたシェルっぽいもの(jrunscriptをそのまま起動すると確認できる)も、今回のバージョンでそれらしくなるのかしらん。
2010-05-05
RhinoでJavaのCanvasに描画したいと思った
さすがに描画処理(paintメソッド)のリスナーインタフェースは見当たらなかったので、Javaのソースファイルに以下のようなクラスを書いて、コンパイルしておく。
上のソースはbackGraphicsを初期化する処理が抜けていて、今回は古いやり方に従って描画メソッド(JPanelなのでpaintComponentメソッド)が初めて呼び出された時だけcreateImage()でオフスクリーンバッファ(と、そのGraphicsオブジェクト)を作成するようにした。
Javaは「Compatibleな」オフスクリーンバッファを作るメソッド、というのが幾つもあるのだけれど、いまいち最適な使い方が分からない。
/** 自作キャンバス */ public class MyCanvas extends JPanel { /** オフスクリーンバッファに描画するためのオブジェクト */ private Graphics backGraphics; /** キャンバスを作成する */ public MyCanvas() { super(false); // JPanel提供のダブルバッファリングは使わない } /** オフスクリーンバッファに描画するためのオブジェクトを返す */ public Graphics getBackGraphics() { return backGraphics; } //...以下略 // backGraphicsを初期化する処理が必要 }後は、Rhinoのスクリプトでオフスクリーンバッファへ描画してから repaint() で自作キャンバスを再描画する。
上のソースはbackGraphicsを初期化する処理が抜けていて、今回は古いやり方に従って描画メソッド(JPanelなのでpaintComponentメソッド)が初めて呼び出された時だけcreateImage()でオフスクリーンバッファ(と、そのGraphicsオブジェクト)を作成するようにした。
Javaは「Compatibleな」オフスクリーンバッファを作るメソッド、というのが幾つもあるのだけれど、いまいち最適な使い方が分からない。
2010-04-29
Bloggerの新しい投稿エディタに変えたら改行設定が変わった
投稿エディタのヘルプを見たら、以前の改行設定ではなく「投稿オプションで設定」するように書いてあった...。
スクリプトを投稿に載せる都合上、自動改行されると困るケースの方が多いのでOFF。
スクリプトを投稿に載せる都合上、自動改行されると困るケースの方が多いのでOFF。
今さらRhinoのsync()について知った
引数として関数オブジェクトを渡すと、Javaでいうsynchronized(this)な関数に変換してくれる。
1. 書いてみる
1. 書いてみる
// よくある何とかHolder var numHolder = function(initNum) { this.out = java.lang.System.out; this.num = initNum; // 加算と減算 this.incNum = function() { for (var i = 0; i < 10; i++) { this.out.print(" inc:" + this.num++); } } this.decNum = function() { for (var i = 0; i < 10; i++) { this.out.print(" dec:" + this.num--); } } // sync()を使って同期関数を用意する this.incNumSync = sync(this.incNum); this.decNumSync = sync(this.decNum); }; // Holder一個だけ作っておく var theHolder = new numHolder(0); // 別スレッドで、ひたすら加算する var runner = new java.lang.Runnable() { holder: theHolder, run: function() { this.holder.incNum(); // *sync()を使う場合* //this.holder.incNumSync(); } }; new java.lang.Thread(runner).start(); // メインスレッドで、ひたすら減算する theHolder.decNum(); // *sync()を使う場合* //theHolder.decNumSync();2. sync()を使わない場合の動作
js> load("synctest.js"); dec:0 dec:-1 dec:-2 dec:-3 dec:-4 dec:-5 dec:-6 inc:-7 in :-3 inc:-2 inc:-1 inc:0 inc:1 inc:2 dec:3 dec:2 dec:1js>3. sync()を使う場合の動作
js> load("synctest.js"); dec:0 dec:-1 dec:-2 dec:-3 dec:-4 dec:-5 dec:-6 dec:-7 dec:-8 c:-9 inc:-8 inc:-7 inc:-6 inc:-5 inc:-4 inc:-3 inc:-2 inc:-1js>
2010-03-21
符号付き16ビット整数の左ビットシフトをRhinoでやってみる
シフト数を16にした時に、ようやく(value << shiftCount)だとダメだと気付いた。
function shiftLeft16(value, shiftCount) { return ((value & 0x7FFF) << shiftCount) | (value & ~0x7FFF); } function printValue16(value) { java.lang.System.out.println( value + "(" + java.lang.Integer.toBinaryString(value & 0xFFFF) + ")"); } var value = -1; printValue16(value); printValue16(value << 16); printValue16(shiftLeft16(value, 16)); // 結果は以下: //-1(1111111111111111) //-65536(0) //-32768(1000000000000000)
Rhinoで独自プロパティを追加してJavaインタフェースを実装する
Javaインタフェースを実装するJavaScriptオブジェクトにプロパティを追加しておくと、Javaインタフェースで宣言されたメソッドからも利用できる。
var runner = new java.lang.Runnable() { // 独自プロパティを追加する message: "Hello, ", // Javaインタフェースのメソッドを実装する run: function() { // 追加しておいたプロパティを使用する java.lang.System.out.println(this.message + this); } }; new java.lang.Thread(runner).start(); java.lang.Thread.currentThread().sleep(100); // スクリプト本体の実行が終わらないように少し待つ
2010-02-21
2010-02-16
2010年明けてました
- 気が付いたら1年経ってました。
- サイト名変えました(etisia->syjiroji)。肩肘張らない感じに。
- pnm/bmp/mag画像ファイルをBufferedImageに変換するJavaサンプルコードをWebサイトの方に追加しました。BufferedImageを作る時のSampleModel-WritableRaster-ColorModelの組合せって、よくある画像フォーマットとどう対応しているの、ということを示す例にはなるんじゃないかと。
- Java Image I/Oのプラグイン作成にも挑戦してみましたが、ImageReader#read()チュートリアルの「プラグイン開発者は~しなければなりません」を読んだ辺りで挫折しました。使う側としては便利なAPIなのですが、プラグインを作るのは相当難しい気がします。
登録:
投稿 (Atom)