「プログラミング」に関する日記(23)

プログラミング関係の話題。プログラミングコーナーを更新したとか、プログラミングの内容に踏み込んだ話とか。

<前 次>

標準エラー出力

メテオスもどき作り始めました。
eclipseが重いのとアプレットビューアでは実際的な動作テストができないことから、ブラウザ上で効率よくデバッグできる方法を考えていました。
ブラウザ上でのデバッグの大きな問題点としては、ミディビのときにJavaのクラスローダキャッシュのせいでアプレットが最新版に更新されないという問題に直面していたので、今回はそのことを中心に対策しました。
まず考えたのが、URL単位でキャッシュを保存していることは知っていたので、JARファイルを返すアドレスの後ろに毎回異なる文字列をつけるというものでしたが、後半の文字列を無視して同じファイルと認識したり、ファイルとは別のものと認識してエラーを起こしたりしたため失敗でした。
そして最終的に考えたのが、ミディビを作るときに行っていた、ディレクトリ名を変える方法を自動化するやり方です。
要するに、アプレットをテストするページにアクセスすると、PHPスクリプトによって毎回違う値でディレクトリを作り、その場所にJARファイルのコピーを置くというもので、これは非常にうまく働いてくれました。
そうすると欲が出てくるもので、どうせ常に最新版に保つんだからコンパイルもアクセス時に同時にしてしまおうということになりました。
それはそれで、コンパイルするだけならバッチファイルに入れていたものをPHPに移植するだけで簡単だったのですが、ここで思わぬ問題が出ました。
エラーメッセージが出力されなかったんです。
バッチファイルでコンパイルしていたときも、コマンドプロンプトが瞬時に消えてしまっていたために見えなかったのですが、今回は標準出力をページに表示するなりファイルに出力するなりすれば簡単に見られると思っていました。
ところが、エラーの出力先は標準出力ではなく標準エラー出力であったため、標準出力には何もないという状態になっていたのでした。
最終的に、「2>&1」とすることで、標準エラー出力2に出たエラーを標準出力1にリダイレクトして、その結果をPHPで拾うことで無事表示させることができました。

そうそう、明日から二泊三日で旅行に行きます。
海で泳ぎます。

ランダムセレクト

プログラミングのところの乱数のページを増やしました。
前々からやろうと思ってたんですけどね、ランダムセレクトの話です。
またBomber丸Worldのスクリプトにでも組み込もうかなと思ってまして。

チューニング中

LuaそのものをBomber丸World用にチューニングしてました。
Bomber丸Worldで使われると困る標準関数を削除したり、ゲーム上でうまく動かない関数の仕様を変更したり、紛らわしい名前の関数をリネームしたり。
で、削除しまくってたらライブラリのサイズが400KBから300KBまで大幅に落ちました。
まあ、どっちみち使ってないものはリリースコンパイルで消えるはずだから直接的なサイズ削減効果はないかもしれませんが。

lua_dumpは遅いのか!?

コンパイル済みのデータを保持するクラスを作り始めたのですが、どうにもバイナリ出力するlua_dumpはコードの細切れごとにwriterを呼び出すようで、予め全体の大きさがわからないし断片ごとに何度も書き込まれるのでまとめて書き込んで高速化というのができないし、ということで、バイナリを保持しておいて高速化というのは、最初のコストや後で再利用される割合などを考えるとどうにも割に合わないようです。
そんなわけで、もっと単純でリスクの少ない方法を考えることにします。

luaU_dump

ウィンドウシステムの相対座標での描画も出来上がったのでWikiにアップしておきました。
そして、BGMシステムを作ることにしたのですが、その前にもう一度Luaの見直しを行っておこうということで、CBWLuaを改造中です。
BGMスクリプトとか、マップイベントとかで、同じスクリプトを繰り返し何度も読み込むことがありうるので、auto_resourceが使えるかもしれないと思い、auto_resourceで使いまわすためのコンパイル済みチャンクを作るためのクラスをluacを参考に作っているところです。

CBWLua

LuaのBomber丸World用カスタマイズ版ができたのでアップしました。
本当は5.1.2の日本語対応版を作りたかったんですが、やはりというか日本語化パッチは5.1.2には対応していなかったようで。
そんなわけで、ちょっと古いかもしれませんが5.1の日本語対応版を使うことになりました。
変数名には日本語は使えませんよ!

TEPOLとZTB

デジカメは見つけたんですが使い方がわからず分子模型の写真は取れませんでした。
有機化学のセットだったので金属結晶はほとんど作れないようでした。

今日はNeoMuplのランダム演奏時のスキップ率を実装しました。
それ以外で実装するかどうかは未定です。
もしかしたらオプションで決めるようにするかもしれません。

Luaのほうはというと、変数への代入も案外あっさりできて、ついでにテーブルの新規作成とかも作ってしまって、ガベージコレクションの様子を確認したりもしました。
基本的にLuaでは細かいプログラムをたくさん同時並列的に動かすのでガベージコレクションは何も設定しなくても事実上分散して行われます。
5.1の意味があまりないです。

PVDとかCVDとか

またまた突然ですが学習帳を更新しました。
薄膜の成長様式などについてですよ。
尻切れなのはまあつまらない事情からです。

Luaは、ただいまLuaの変数にC++から代入する簡単な方法を模索しているところですが、スタックの操作でどうやったら変数に値を書き込めるのか、まだ未知の部分があります。

#include &quot;LUA\lua.h&quot; // ClassView によって追加されました。

http://www.water.sannet.ne.jp/sowwa/
の日本語化パッチを5.1.2に使ってなんとか日本語対応できないかと試みていましたが、結果は失敗に終わりました。
やっぱり5.0系列と5.1系列ではそれなりに違いがあるようでした。
一応 http://hammm.dw.land.to/lua/ の日本語化パッチで文字列リテラルの日本語対応(つまり"ソース"を正しく表示できるなど)は可能だったのでしておきました。
変数名はともかく文字列に使えるかどうかは利便性に大きく関わりますからね。

で、ちょっとそれとは別に、lua_Stateの扱いについて考えていました。
ラッパークラスであるCBWLuaに全て管理を任せてLuaに対する操作は全てCBWLua経由で、と思っていたのですが、CBWLuaから実行したプログラムでもどんどんCBWLuaの管轄外のlua_Stateを作ることができてしまうので、CBWLuaではlua_Stateを管理しきれないのです。
つまり、動き始めたのがCBWLuaによるlua_Stateだったとしても、実行するうちに勝手に新しいlua_Stateが作られて、それが実行されてゆくと、CBWLuaによるlua_Stateが実行されているのにもかかわらず実際に動いているのはそれから派生した別のlua_Stateだったりするのです。
これで何が困るかといえば、グローバル環境は親玉(CBWLuaによるlua_State)も子分(派生したlua_State)も共通なのですが、スタックは別々で、今すぐ必要になるデータとかは大抵スタックに積まれているのです。
だから、CBWLuaにlua_Stateを一括管理させていると、子分のスタックが見られなくて、大事なところで親分が何もわからないということになるのです。
だから、スタックに関する部分はLuaAPIを直接使ってもらうことにして、CBWLuaが扱うのはグローバル環境と子分の作成など、どのlua_Stateがやっても同じになる用事だけにしておきました。

それなので、さっそくグローバル環境に関する関数を、ということで、特定の変数の値を得る関数を作ってみました。
ただ単にグローバル変数を得るだけでなく、可変引数を用いて複雑なテーブルの中身なども得られるようにしてみました。
この関数とほぼ同じものをWikiにも掲載しておきました。

で、そんなこんなで色々やってると突然リンカエラーが。
何があったのかと思って調べていたらVC++が勝手にヘッダファイルのインクルードをextern "C"の外に出していることが判明しました(中に入れておかないとエラーが出る)。
IDEって時々余計なことをして見つかりにくいエラーを混入してしまうのが困り者ですね。

TGBBS削除機能

Lua、Bomber丸World上で動かすのに成功しました!
コネコベーダーの動きをコルーチンで制御しています。
実際のプログラムをWiki上にアップしているので是非ご覧ください!

あと、今日はTGBBSの削除機能を実装しました。
ただ、実際に消しているわけではなく削除済みフラグを立てているだけなので後から復活することもできます。

子ルーチン

就職の面接の結果が出ました。
内定、だそうです。

で、Lua、とりあえずコルーチンを動かすことには成功しました。
まだまだLuaの変数を見たりすることができないので本当に意図したとおりに動いているのかはわかりませんが、とりあえずエラーは出ていないようです。

昨日描いていたいずみさんの絵ができました。
一応24歳です。
24歳ですってば!
年齢半分ぐらいに見えるかもしれないけど!!

1180709513.png

いずみさんの絵

Lua、コルーチンを扱うクラスを作りました。
母体となるLuaクラスから作って、コルーチンが終了したら自分で勝手にdeleteします。
そして、コルーチンが無限ループだった利したら母体のLuaクラスの消滅時に一緒に消滅します。
あと、単純にLuaの関数をラップするだけの関数も大量に作ったりしてました。

そして今日は久しぶりに絵も描いていたり。
いずみさんもうすぐ描けそうなんで明日アップします。

lua_Alloc

yaneSDKのメモリ管理にあわせるためにアロケート関数をyaneSDKの機能を使う方法で実装したらエラーが出たので標準のアロケート関数に戻しました。
あとはWikiの内容を充実させながらちょこちょことBomber丸World用のLuaクラスを作っていました。

今日はこの日記PHPで既に書いた日記に対して編集操作を行ったときにタグが無条件でエスケープされてしまうバグを修正しました。
この修正はTGdiaryにも反映するので次の更新はTGdiaryのバージョンアップとなります。

Lua5.1リファレンスマニュアル

う~ん、Luaの、C側での関数リファレンスも見つけたので、うちのWikiの存在意義が半分ぐらいなくなってしまったようです…。
まあ、関連性の深い関数などをすぐに参照できるというのがうちのWikiの強みだったりするし、順を追って発展させていくチュートリアルなどもあればまた存在価値というのは高めていけそうですが。

で、Bomber丸WorldにLuaを組み込むほうもわりとそれなりにでき始めています。
まあ、lua_openしてloadしてcloseするクラスを作ってそれが今のところエラーを起こしていないというところなんですが。

WME

WindowsMediaEncoderをインストールしてみました。
画面の取り込みもできるのでまた再びふにゃさんのプレイ動画を作れそうです。
あれと比べてどの程度よくなるのか、または悪くなるのかはわかりませんが、とりあえず使うだけ使ってみました。
まあ、画質はそれなり、ウィンドウ枠まで録画されるのが鬱陶しいのですが、録画後に長い変換処理がないというのと、音も一応取れているらしいところはよいかもしれません。

Lua組み込みWikiはとりあえずユーザーが使える全ての関数と変数の型と定数のページは作り終えました。
中身はありませんけどね。

Lua組み込みWiki

組み込みはちょっとてこずってます。
Lua言語の文法やら使い方に関してはまあまあわかりやすいんですが、組み込むC側のリファレンスがないのです。
優れたプログラムをLuaで組んでもCから呼び出せなければ意味がないのです。
網羅的に解説しているサイトが全然見当たらないのです。
もういいです。自分で作ります。

Luaを組み込んでみる

MifuminScriptが完成するかどうかの不安もあるので、とりあえずLuaを一度Bomber丸Worldに組み込んでみることにしました。
はむ氏の空想具現化プログラミング(http://hammm.blog21.fc2.com/)にあったS-JISが使えるものを使ってます。
とりあえずライブラリのコンパイルとヘッダファイルのインクルードまではうまくいったようです。
そういえば、Bomber丸Worldに何かフリーフォントでも組み込んで使ってみようかと思ったのですが、再配布可能なものでよさそうなものがなかったので諦めました。

無題

ほぃ、そんなわけで、一時停止のことも踏まえて、スクリプト講座更新しました。
では、メテオスオンラインでやりたいことがあるので。

見つかりません。病室は存在しないか、場所を間違えています。

スクリプトのことについてですが、よく考えたらこのスクリプトは任意の位置で一時停止できなければ役に立たないので、途中で止めることが困難なツリー構造から実行する形式は見直す必要があるかもしれません。
そうなればツリーのノード本位な今の設計も根本的に見直す必要があり、今度は大幅な変更が来るかもしれません。

で、今日はスクリプト自体は特に触らなかったので、TGBBSの開発を始めてみました。
ファイル形式などはまだ決まっていませんが、ユーザーから受け取るべきデータはほぼ決まりきっているので、投稿フォームから先に作り始めています。
しかし…フォームの位置がランダムに入れ替わるというのは少し面倒かもしれませんね…。
迷惑書き込み対策になるかどうかも未知数だし…。

Bomber丸Worldの施設の一つとして、病院というものを考えてみました。
元々4と死を結び付けない文化なので、3階と5階の間には4階があって病室になっています。
ただ、死とは関係なく、少しおかしい病室になっています。

逆に定期更新ペースになりそう

そんなわけでプログラムを書き換えつつプログラミングのページも書いたりしています。
ちょっと順番が前後しちゃったため2ページを並行して書くことになりました。
共用体を使うとなれば中に入るデータの大きさが気になるところですが、このあたりはどうしましょうかね…。

<前 次>