[back]

【雑記】

2008/4/24 意外と動くものだね

JavaScriptでこんな具合

なお現状のexeはこちら. アーカイブの中に入っている tbl.jsを yash.exeにドラッグ&ドロップ (jsをダブルクリックだとWindowsデフォルトのwshが起動してしまうので注意) で実行可能、なお23行目のコメントアウトを外して24行目と入れ替えるとフルスクリーンで動作します;-)

まだまだ検証段階でナンバリングできるだけの所にすら来ていないが、これはこれで玩具程度としては結構遊べるかもという具合、ここ暫くはLayeredWindowやタスクトレイ常駐プログラムなどのサポート機能を実装してみたり、ただスクリーンセーバーだけは専用のスタブを用意する方が良いかも. それ以外にはDLLや.netオブジェクト(COM経由)の呼び出しなどをつらつらと、まぁ最終的にはexeに変換するのをサポートすると考えると余りランタイムは肥大化しないよう注意を払う方が大変かも.

まあ最悪WSHで無くともWindows用のスクリプトフレームワーク的なデザインは得られるので悪くは無いカンジではある (tkベースのはUnix系でWin環境との親和性がイマイチだし、.netは粒度が細かすぎて余りスクリプト向けとは思えないので) ただ埋め込みIEを使う場合だけはWSH言語(※1)ベースの方がブラウザ側にそのままオブジェクトを渡したりできるので良いかも. 無論普通のActiveXコントロールならCOM呼び出しと大差無いものが多いのでどうにでもという具合.

※1) あくまで内部設計がCOMオブジェクトベースになっているJScript/VBScriptの事、ね. OpenSource系の言語でもWindowsScriptingHostに対応したものは一応あり、COMをただ呼び出すだけなら何とでもなるものが多いが、関数オブジェクトや配列の互換性まで含めて実用的な実装ができているものは今まで試した限りでは見つからなかった (まぁPorting元のエンジンがそれ用では無いので致し方無しという具合:-<

 

2008/4/19

スクリプトから作成したWindow上にActiveXコントロールを配置する機能を実装してみた、ブラウザオブジェクトのjavascriptを呼び出したりその逆もできるように、当然FlashやMediaPlayerも埋め込み可能.

ちょっと楽しくなってきたかも、ただこういう事ができると嬉しくなるのはプログラマの習性なれど、まぁシンプルなものに越した事は無いという点も忘れてはならぬ所 :-P

まぁぼちぼち続きますという具合.

ペイントソフトはまだ休み、まぁこちらも映像やっている友人に渡してみたので、何か面白そうなネタがあればというカンジで ;-)

 

2008/4/17

GUIフレームワーク部のイベント・子Windowの生成デザインが大体定まってきたカンジ. 具体的には作成時にイベントプリフィクスを設定し、実際のトップレベルwindow open時にイベントレシーバを指定するようにした、例えば以下のようなWindowを表示する場合


function TestWin(){
    var w,e1;

    w=new Dialog(300,80,"Test");
    with(w){
        button("PushMe",[110,44,80,24],"Btn1_");
        e1=editbox("",[10,10,280,20]);
    }

    this.exec=function(){
        w.open(this);
        while(w.visible)    sleep(1);
    };
    this.Btn1_onCommand=function(e){
        var s=e1.get();
        alert(s);
    };
}

w=new TestWin();
w.exec();

VBScriptだとこんな具合

option explicit

class TestWin
    dim w,e1

    sub Class_Initialize
        set w=Dialog.new(300,80,"Test")
        with(w)
            .button "PushMe", Array(110,44,80,24), "Btn1_"
            set e1=.editbox("", Array(10,10,280,20))
        end with
    end sub

    sub exec
        w.modal Me
    end sub

    sub Btn1_onCommand(e)
        dim s
        s=e1.get
        msgbox s,0,"Info"
    end sub
end class

dim w
set w=new TestWin
w.exec

無論1つだけしかWindowを使わないなら、わざわざオブジェクトにバインドしなくてもグローバルオブジェクトをレシーバにする方が手っ取り早い.


var w,e1;
w=new Dialog(300,80,"Test");
with(w){
    button("PushMe", [110,44,80,24], "Btn1_");
    e1=editbox("", [10,10,280,20]);
}
w.modal();

function Btn1_onCommand(e){
    var s=e1.get();
    alert(s);
}

まぁそれ以外にバイナリと文字列エンコード/デコード機能付きのファイルクラスを実装してたり、汎用部品としてコマンドラインやシングルスレッドGUIでもまともに動くプログレスダイアログを作ってたり (ある程度まともなものを作ろうとするとスレッド分けなどこれが毎回結構面倒なので:-P) まぁ色々.

まぁもう少しコードが短くなると良いのだけど、、、sigh ちなみにbuttonとかをwindowのメンバにしているのは単にaddするのが面倒だからです、一応コンストラクタからも作れるけど;-) これらの過程でマルチスレッドでGUIが動作している自作言語のイベント機構についても良い方法が思いついたり、上のコントロールの作成では例のペイントソフトで作ったライブラリのコードが含まれていたりと、思いもかけぬ所で繋がるのもまた楽しい所.

実際自前のインタプリタに搭載してある数学演算や配列、文字列のライブラリのベースになってるルーチンはC++の開発でも大いに役立ってます(笑)

後はまぁexeのリソースに後付けでスクリプトやアイコンをバインドしてexeに変換する方法について調べてみたり、以前仕事の途中のデータ処理で自前言語を使ってた所「変換ツールあるの?」って聞かれて、「自前の言語で書いたので良ければね」という具合だったので、まぁ少しはそういう事があっても対処できるようにしときましょうというカンジ、、、あくまで普及言語で書くという発想は無いのですけどね(ぉ 正規の仕事ならともかく自分用の雑用コードまでそんな面倒な事したくないし、みたいな(駄目じゃん ってゆーかコード書きたくないし(マテコラ

、、、まぁ根本的に間違ってるきらいがあるのは否定はせず、ま押し並べて全ては余興ですよという具合にて :-P

 

2008/4/10 駄目だこりゃ

イベントについて昨日書いたようにコールバックオブジェクトを指定する方式で何とかなるかと思ったが、どうにも問題がある事が発覚、具体的にはイベントを受けるオブジェクトがWindowの所有者である場合に循環参照が発生してしまいメモリリークが発生する. スクリプトオブジェクトならgcに任せられるが、COMオブジェクトの場合インターフェイスにGC時のマーキングが無い以上、この辺が如何ともし難し.

無論解決策が無いワケでは無く、コールバックオブジェクトを以下のようにWindowの表示寿命単位としてしまえば問題無い. 具体的には以下のようなカンジ(Simple内のexecメソッドの内容)


function Simple(){
    var w=new Frame(640,480,"Simple Window");

    this.onQuit=function(o){
        print("onQuit() called");
    };
    this.exec=function(o){
        w.exec(this);
        while(w.visible)    sleep(1);
    };
}

w=new Simple();
w.exec();

しかし、単体のWindowならこれでも問題が無いが子Windowがあると自体は更にややこしくなる. 子Windowも確実に削除したい場合にはWindowが途中まで作成されて実際には表示されないケースも考慮するとonCreateイベント内での作成以外許容しないようにしなければならない.

、、、それ自体は単純な話だが、どうにも書き方を規定されるとややこしくなって宜しくない. そもそもそんな面倒なプログラムを書くならスクリプトである意味など無いワケで、あるいはhtmlのごとく徹頭徹尾名前によるフラットな疎結合モデルにしてしまうとか(美しくないが) さてさてどうしたものやら:-<

まぁ、、、さっさとJavaScript互換のインタプリタでも作ってしまう方が早いのかもしれない、などといつもの結論に落ち着いてしまいそうで実に嫌なカンジではあるX-< 多分ガチでやって仕様切りからコアが安定するまで大体3ヶ月程度、どちがら良いのやら、、、

 

2008/4/9

基本的なスクリプトホストフレームワーク部が安定してきた為、実験がてら画像を読み込んで表示するだけのソース

まずはJScript


function main(fname){
    var img,w;

    img=Graphic.load(fname);
    if(!img)    return;

    printf("Image Info: %d x %d\n", img.width, img.height);

    w=new Frame(img.width, img.height, fname, "");
    w.graphic.draw(img);

    w.modal();
}

main("test.bmp");

VBScriptだとこんな具合


option explicit

sub main(fname)
    dim img,w

    set img = Graphic.load(fname)
    if isEmpty(img) then return
    printf esc("Image info: %d x %d\n"), img.width, img.height

    set w = Frame.new(img.width, img.height, fname, "")

    w.graphic.draw img
    w.visible = true

    while w.visible
        sleep 1
    wend
end sub

main "test.bmp"

ループの待ち方を変えているが概ねこんな具合、、、若干まだ目がチカチカする気がして、もう少し安易にならないかなぁという気はするが、クラスの場合は致し方無し哉?なおWindowイベントはプリフィクス形式とオブジェクトを登録したListener形式の2系統をサポート、動的結合なのでListener+プリフィクスもそれらしくて良いのだが、作成時の引数が増えるのが難点か、、、だって引数が(4つ以上とか)多いと覚えてられないし(ヲイ、なおハンドラに結びつける形式は宣言とバインド部で2箇所コードを書かねばならないので却下(笑)

Window周りをまず作っているのは、ここが一番所有関係がややこしいからというカンジ、例えばスクリプト内のWindowオブジェクトが消えてもWIN32のWindow側は正常に動作しなければならないとか、所有するプロパティだけ生存してもちゃんと動かなければいけないとか、式の中の中間オブジェクトも考慮しなければとか、そんな具合、この辺のテストには削除がgcまで遅延されるJScriptよりもVBScriptの方がリファレンスが消えるとすぐ削除されるのでやり易かったり;-)

まーなんつーかね、ランタイム管理とか企業の事情とか余計な物を考えずに安直に使える環境が欲しいだけなんですけどね. そういう意味では昨今のC/C++以降の言語環境は押し並べて大げさ過ぎるし、Unix系のLLはWindowsのGUI環境とは相性が悪いし、Windows系のそういう簡易言語はあまりに昔のBASIC系っぽかったり、一部は不必要に日本語とか言っててアレだし、やりたい事は単に思ったことを安易にプログラムしたいだけなのですが、もう少しどーにかならんものですかねぇ:-<(※1)

※1) まぁこの辺の文化の断裂は面白い所、アーキテクチャ (not ジャンルね、もう少し粒度の細かい技術要素) 的にUnix系プログラマの得意な分野が得意なプログラマはWindows系のプログラマには少ないしその逆もまた然り、そのギャップを埋められればもう少し良いソフトが作れるのになぁなどと思うことしきり.

 

 

2008/4/5

最近今更ながらにWSHをつらつらいじる日々、先に書いたIDispatchExの実装ができたのでここで改めてWSHを組み込んだ簡易開発環境の考察を行う.

やっぱり.NET何か違うんだよねぇクラスライブラリの想定粒度がアレなので IronPythonとか使ってもやっぱり面倒だし、最近増えてきたJavaScriptの開発環境はむしろ企業間のAPI戦争の道具としてなので、どうしてもランタイム込みであったり、何か違うという具合なので、HSPみたいな割り切った機能でJScript&VBScriptの環境があればどうだろうといったカンジ. 自作言語の方で考慮しても良いのだがこちらはアルゴリズムの実験の対話環境での試行錯誤がメインな為GUIスレッドが本体から独立している、 それに対し最初から走らせるタイプの用途想定ではGUIスレッドは本体と結合させる方が柔軟性があって良いといった具合.

まぁいつものフレームワーク遊びですね(笑) という事でまだペイントソフトはお休み;-)

、、、しかしJScriptとVBScript両方サポートとなると、クラスライブラリの大文字小文字どーしよ(悩)

---------------

同日 13:00追記)
ちょっと荷物が届くまで動けない為、相変わらずいじっているのだが、VBScriptとJScriptを両方サポートしようとすると両者のIDispatch(Ex)の呼び方の違いで難儀する、プロパティに配列をサポートしようとするとJScriptはそのまま配列->要素と取ってくれるが、VBScriptの場合は引数付きプロパティとしてアクセスしていたりで結構グチャグチャ、まぁ分からなくは無い仕様ですが.

ちょっと嫌になってきました(笑)

同日 17:00追記)
荷物来ねえ(--;; 一日家に閉じ込められた、、、
色々試したがIDispatchExはスクリプトとの親和性は良いものの、完全にスクリプトオブジェクトとしては振舞ってくれない模様、JScriptのinstanceofに反応しないのはともかくdynamic propertyを実装しても結合されたfunctionオブジェクト呼び出し時に対象がJScriptオブジェクトでは無い為thisに呼び出しオブジェクトをバインドしてくれないとか、そんな具合

割り切れば良いのだけどイマイチ綺麗じゃないなぁ、、、どうしたものか:-<

 

2008/4/3 めんこと鉄板

毛色を変えて子供の頃の話

子供の頃友人の間で「めんこ」が流行った事があった (実際には自分の住んでいたところでは「ぺったん」とか「ぺっちん」とか呼んでいた) 初めは普通に遊んでいただけだが、そのうち自分で強化しためんこを作って勝負するのが流行り始め、ダンボールを重ねたりビニルテープでぐるぐる巻きにして補強したものや、2枚のめんこを繋ぎ合わせたものなどで勝負が行われていた.

それならばという事で自分も自作のめんこに鉄板を入れた所、見事に使用禁止にされた. 子供心には2枚のめんこが許されるんだからいーじゃんと若干釈然としなかった(笑)のだが、子供時代のトラウマである(ぇ

無論成長した今となってはゲームのフェアネスという観点からNGであろう事は容易に想像できるが、反面ソフト・道具作りという観点ではこの心を忘れないようにしたいトコロ ;-)

# とまぁそんな事を言っているから友人に「君はエンジニアというよりむしろSEだな」などと言われてしまうのかもしれないが(苦笑) まぁ職人タイプで無いのは認める所だけど、ある程度仕事のやり方を知った仲で僕の事をむしろ「SE」だと言ったのは(記憶にある限り)まだ2人しかいない :-P

 

なお子供達の間でミニ四駆が流行っていた時 (自分はもうそういう年齢ではなかったが、弟が熱を入れていた) チマチマとしたパーツを組み合わせたりやカウルを軽量化したり外したり、市販の「パワーモーター」とかを組み合わせているのを見て「問題はそういう所にあるんじゃないから、電池を直列化したり、モーターのコイルそのものを調整する方が良いんじゃない?」と言ったら 「それはもはやミニ四駆じゃない」と言われた経験もある(苦笑)

今になって大人目線で思い返すと結構嫌な子供だな(えー

 

2008/4/2 間抜けな話

相変わらず言語いじり、今回のペイントソフトの開発補助として使っていて (主にデータコンバート&ソースの自動生成とロジックプロトタイプの実装に使用) 多少使い難かった個所をいじるだけのつもりが、色々思いついては微調整を繰り返す.

本日は思う所があってscanf互換のパーサを書いていたのだが、実装の為scanfの詳細を確認していた所、今に至るまで任意の文字セットを指定できる機能がある事を全く知らなかった事が露呈する. 以下のように指定できるらしい.


    char s1[128], s2[512];
    sscanf(buff, "%127[^\n \t=]%*[= \t]%511[^\n]", s1, s2);

正規表現のように"あっても無くても良い"が指定できない為、柔軟かつ厳密なフォーマット確認には今ひとつ足りない気もするが、それでもこれなら何とか使っても良さそう.

というかもう10年以上C/C++使っているのに全然知らなかったよ、何とも間抜け.

なお行列処理言語に組み込もうと思ったのだが、一般的な任意の要素が混在する配列機能を持っていない (matlabとかと同様、全て行列な為、このデザインで任意要素に対応させると今に比べかなり重く&メモリ効率が圧倒的に悪くなる) のでイマイチ使い勝手が悪いという事もあって見送りに決定、切りが悪いので取り合えず完成させたが、どうせならフォーマットの解析と一致検索を再帰的に実行すれば簡易正規表現ルーチンなんかも作れたので、そちらにしておけば良かったかなーなどと少々後悔.

半日程触って何か飽きてきたのでまた気が向いたらそういうものも作っておいて損はなかろうというカンジ.

 



過去の雑記
2008年 3月
2008年 2月
2008年 1月
2007年 8月〜12月
2007年 7月
2007年 6月
2007年 5月
2007年 4月の雑記はありません.
2007年 3月
2007年 2月
2007年 1月
2006年 12月
2006年 11月
2006年 10月
2006年 4月〜9月の雑記はありません.
2006年 3月
2006年 2月
2006年 1月
2005年 12月
2005年 11月
2005年 10月
2005年 9月
2005年 8月
2005年 7月
2005年 6月
2005年 5月
2005年 4月
2005年 3月
2005年 2月
2005年 1月
2004年度


メールアドレス収集ロボット対策の為メールアドレスはHP上に記載しておりません、
ソフト内のドキュメントには記載しておりますので、御用の方はそちらまでお願いします.
since 2003/10/04, Y.Ume/Tabo