日記

3月 1日 (火)

1. SMP

例の赤帽Linux機のカーネルをアップデートしておきました。aptって便利ですねえ。楽ちん楽ちん。

さて、こいつに何をさせようか。

3月 2日 (水)

1. アキバ

五月雨を買ってきました。

あと、AGP接続のビデオカードが欲しかったのですが、手頃なのが見つかりませんでした。背が低い(コネクタエッジからの丈が短い)、ってのが絶対条件で、性能的にはVGAが映れば十分なんですが。千円くらいで転がってないかなー。

3月 5日 (土)

1. Lethal Application

Ultimate(Reminisce)で1300万(リプレイ ver.1.02用)。道中での稼ぎはダメダメですが、ステージ8とボス6でフォローしてます。

道中でちゃんと稼げば、1400万くらいいけそうですね。

2. 吉里吉里

プラグイン。メモリリークや、ほか、細かいバグを修正。TJSCreateArrayObject、TJSCreateDictionaryObjectで取得したものはちゃんと解放しましょう、ということ。あと、微妙に仕様変更とか。

そろそろ晒してもいいかな。

3月 6日 (日)

1. 吉里吉里

プラグイン。ver. 0.6β1として(弱気に)リリース。2.24RC3用です。

吉里吉里本体が2.24になったらリリースし直します。多分。

2. 「電車男」映画化決定

なんだそれは。

書籍版が出版された頃、本屋でぱらぱらと3秒ほど眺めましたが、買ってまで読むほどの価値はないと思いました。

そういえば、逆境ナインも映画化されるんですよね、実写で。

3月 7日 (月)

1. お買い物

アキバでビデオカードを買ってきました。背の低いやつです。チップはATI Rage XLで、VRAMが4MBも搭載されています。しかもAGPx2対応です。ややオーバースペック気味ですが、まあいいでしょう。安かったし。

サーバ機用なんて、VGAが映りゃいいんですよ。

2. 吉里吉里

吉里吉里Ver.2.25からは、プラグインからネイティブ実装されたクラスを提供できるようになりました。2.24まではできなかったわけです、公式には。

私の環境では、当社【何】のインチキ・テクノロジ【謎】により、2.24でも似非ネイティブクラスを提供できるようにしてあります。new SQLite3()とかnew Socket()とか、OKです。もちろん、本体改造はしていません。無修正です。でもちょっとインチキくさいです。完全なネイティブになっていなかったり、クラス定義部が「なんじゃそりゃー」だったり、「テクノロジ」でも何でもない辺りが、インチキ・クォリティ。

インチキはさておき、Ver.2.25ではβ版とはいえ公式に(?)サポートされたのですから、使わない手はありません。サンプルである nativeclasstest を読みながら、一つクラスを書いてみました。

…うーん、これはやりにくそうですね。というのは、自動生成のことです。当社【だから何】では、インチキ・テクノロジにより、コーディングが面倒な部分は自分で書かずに済むようにしています。V2Link()、V2Unlink()、TJSメンバのクラス定義などは、Perlによるソースコード自動生成です。C++クラス名とTJS関数名の対応表を書いておくだけで、記述量の多いあのV2Link()、V2Unlink()諸々がさくっとできあがります。楽ちんです。しかし、今回の公式の手法では、これが通用しないように思えます。

通常の関数は今までのやり方を踏襲する予定ですが、クラスに関してはどうしたものでしょう。できれば公式の手法を採用したいところですが。どうやって自動生成させようかなあ…

3月 9日 (水)

1. 吉里吉里

プラグインでネイティブクラス。

nativeclasstest の通りに書くと、同じ記述(クラス名とかメンバ名)が何度も出てくることになります。プリプロセッサマクロでかなり簡素化されてはいますが、それでも記述量はそれなりです。これでは書くのが面倒なのはもちろん、記述ミスも多くなりそうですし、メンテも大変そうです。そこで、楽に記述できるような仕組みを作ってみました。nativeclasstest の Main.cpp は、おおよそ以下のようになります。

@comment このソースは、そのままではコンパイルできません。 

/*
  C++ source code ...
  class TJSNI_Test { ... };
*/

// TJS Native Class
@begin Test

// 空の finalize メソッド
TJS_DECL_EMPTY_FINALIZE_METHOD

// (TJSの) コンストラクタ
@constructor
  // ここでは何もしない
  return TJS_S_OK;
@;

// print メソッド
@method print
  _this->Print();
  return TJS_S_OK;
@;

// add メソッド
@method add
  if(numparams < 1) return TJS_E_BADPARAMCOUNT;
  _this->Add((tjs_int)*param[0]);
  return TJS_S_OK;
@;

// value プロパティ
@property value
@getter
  *result = (tTVInteger)_this->GetValue();
  return TJS_S_OK;
@;
@setter
  _this->SetValue((tjs_int)*param);
  return TJS_S_OK;
@;
@;

// square プロパティ (read only)
@property square
@getter
  *result = (tTVInteger)_this->GetSquare();

  return TJS_S_OK;
@;
TJS_DENY_NATIVE_PROP_SETTER
@;

@end

これを通常のC++ソースファイルに埋め込んでおきます。中途半端にコンパイルされると困るので、C++言語レベルでは、コンパイルエラーになるような仕様にしてあります。こいつをスクリプトで処理すると、

  • static iTJSNativeInstance * Create_Test_NI() { ... implementation ... }
  • #define TJS_NATIVE_CLASSID_NAME ClassID_Test
  • static tjs_int32 TJS_NATIVE_CLASSID_NAME = -1;
  • iTJSDispatch2 * Create_Test_NC() { ... implementation ... }

のコードが吐き出されます。これはC++コンパイル可能です。TJSネイティブインスタンスの実装用クラス(ややこしいな)である TJSNI_Test は、自分で書くしかありません(当たり前)。

V2Link()とV2Unlink()は、今までの仕組みで自動生成できます。必要なのはこのファイル一つだけです。

# Native class 'Test'
tTestClass Test@class:()

奇妙奇天烈な書式ですが、ほかの文法との兼ね合いでこんなふうになってしまいました。こいつをスクリプトで処理すると、V2Link()やV2Unlink()諸々を含んだ Main.cpp と、ヘッダファイルが作成されます。

なんだ、スクリプトで処理するのが面倒じゃないか、と思われがちですが、Makefile に依存関係と生成規則を書いてあるので、実際には make 一発で済んでしまいます。楽ちんです。make ばんざーい。

2. hn.org

soulsaver.hn.orgにアクセスできなくなってしまいました。正確には、名前からIPアドレスを引けない状態です。hostコマンドで問い合わせると、関係ないIPアドレスが返ってきます。IPアドレスを登録し直しても、数日前に登録したIPアドレス *1 のままです。どうしたんでしょうね。ちょっと困りました。

  • *1: うちは固定IPではありません。