日記

9月 10日 (土)

1. 地球防衛軍2

マグマ火炎砲を所持していたことに気づきました。いつの間に入手していたんでしょう?

今日もINFERNO「灼熱」で武器稼ぎをしましたが、何も出ませんでした。俺の「THE 地球防衛軍2」には、超級武器のデータが入ってないんじゃないかと。(←単に運が悪いだけです)

2. 吉里吉里

2.1. 文書レイヤ

TeXを参考にしているせいか、文字の配置、ルビの振り方等、かなり美しく組版されています。これ、そのまま頂こうかな。

9月 11日 (日)

1. 吉里吉里

SQLitePlus 3.0.7に付属していたisqliteを、一部日本語化しました。ついでに、インタラクティブモードのコマンドにエイリアスindexesを追加しました。index という単語の複数形はindicesindexes がありますが、isqliteにはデフォルトでindicesしかなかったので。

isqliteはもともとシンプルに作られているので、折を見ていろいろ改造してみましょうか。

9月 13日 (火)

1. 吉里吉里

プラグイン。util_sqliteのmakeにはsqlite3.libとsqlite3.dllが必要なのに、makeコマンドだけではこの二つが生成されません。予め別に作成しておく必要があります。前から思っていたんですが、これ、面倒です。だったら対処しろよ、との心の叫びに従って、Makefileを改良しました。これでようやく真の「make一発」になりましたよ、ああ楽ちん。

ちなみに、make release一発で、全ライブラリ再作成、全ドキュメント再作成、全リリース用アーカイブファイル作成までやってくれるので、私は楽ちんです。作者(私)にしか恩恵がないですけど。

9月 15日 (木)

1. 吉里吉里

プラグイン。使い道が不明な関数、global.getClassInstanceInfo(obj)のドキュメントを書き忘れた気がします。はい、忘れてました。

9月 17日 (土)

1. 吉里吉里

DXライブラリLunaから、ソケットライブラリであるLunaSocket、LunaSocketAsyncIO、LunaSocketServerAsyncを引っこ抜いて、これらだけでコンパイルが通るようにしました。

…した矢先、Luna本家ではすでに、LunaSocket系がLunaNetworkに移行されていることに気づいてがっかり。

2. 地球防衛軍2

INFERNO「灼熱」。相変わらず超級武器が出ません。「殺虫スプレー」はもういいから、ハーキュリーとかUMXA-V2を出してくれ。

3. スプライツ

放置気味だったティンクルスタースプライツをプレイ。キャラクタモードの最後の空欄、ドラゴンスター リアリー・ティルがなかなか出てこず、ストーリーモードを何周もしました。ほとんど「作業」でした。運が悪かったのでしょうか。

ギャラリーにサターン版OPが追加されたので、鑑賞。この下手くそな歌はほとんど音波攻撃ですね。この歌い方はとても独創的ですね。PS2ということもあって、画質はかなり向上しています。まあ、サターン版ではハードの制約上、画質を落とさざるを得なかったわけで、PS2版で本来の画質になった、というところでしょう。ただ、画質は向上しても歌唱力は向上しなか…うわ、何をす…

で、NEOGEO版。ラスボスが凶悪ですね。特にエキストラアタック。PS2版ではずいぶん弱体化しているように感じますが、やっぱり歳のせ…うわ、何(略)

9月 18日 (日)

1. 吉里吉里

1.1. Smalltalk

怪しげな関数を思いつきました。Javaでは表現しにくかった、Smalltalk風の表記法も、TJS2でなら実現できる!

Array.timesRepeat = function (lambda)
{
  if (this.count > 0) {
    var cnt = this[0];
    if (cnt > 0) {
      while (cnt--) {
        lambda();
      }
    }
  }
};

[ 3 ].timesRepeat(function () {println("hoge");});
Array.ifTrue = function (lambda)
{
  if (this.count > 0) {
    lambda() if (this[0]);
  }
};

Array.ifFalse = function (lambda)
{
  if (this.count > 0) {
    lambda() if (!this[0]);
  }
};

var foo = 5;
var bar = 3;

[ foo > bar ].ifTrue(function () {println("fuga");});
[ foo > bar ].ifFalse(function () {println("xyzzy");});

アホです。配列をこんなことに使うなよ…

1.2. 関数が持つメンバ

冗談はさておき。TJS2では、オブジェクトはプロパティを持つことができます。関数もオブジェクトですから、関数もまたプロパティを持つことができます。では、その関数内部から、その関数オブジェクトが持つプロパティにアクセスする方法は?

var func = function()
{
  println(prop1);
};
func.prop1 = "hoge";
func();

現状のTJS2では、このコードは実行時エラーになります。

メンバ "prop1" が見つかりません at test/f2.tjs(3)[(function expression) (anonymous)]

func.prop1と明示すればアクセスできますが、これは美しくありません。また、thisはglobalを指すので、this.prop1でもダメです。まあ、これができたからといって、どうということもないのですが。

1.3. Array.range

より高度なクロージャとは?にあったrange関数の改悪版。

Array.range = function(lambda)
{
  if (this.count > 1) {
    var begin = this[0];
    var end = this[1];
    var step = (this.count > 2) ? this[2] : 1;

    if (begin <= end) {
      step = -step if (step < 0);
      for (var i = begin; i <= end; i += step) {
        lambda(i);
      }
    } else {
      step = -step if (step > 0);
      for (var i = begin; i >= end; i += step) {
        lambda(i);
      }
    }
  }
};

[ 1, 3 ].range(function (n) {println(n);});
[ 5, 1, 2 ].range(function (n) {println(n);});

だから、配列をこういうことに(略)

全然関係ないですが、ラムダ関数で検索するラムダ関数たん…ハァハァ(内容は真面目です)がトップにくるGoogleは素敵だと思いました。

1.4. Socket

ネットワーク関係。構想中。こんなイメージで進めてみましょうか。

static function Socket.getResourceViaHTTP(hostname, URI)
HTTP経由でデータを取得(GET)する。
static property Socket.lastError
最後に発生したエラー情報。
class ClientSocket
クライアント用ソケットクラス。原則、非同期モード。
function ClientSocket.ClientSocket()
コンストラクタ。
function ClientSocket.connect(serverHostname, serverPort)
サーバに接続する。
function ClientSocket.close()
クローズする。
property ClientSocket.isEndRequestSend
送信処理終了チェック。
property ClientSocket.isEndRequestReceive
受信処理終了チェック。
function ClientSocket.requestSend(data)
データ(文字列またはオクテット列)を送信する。
function ClientSocket.requestReceiveAsString(size)
文字列を受信する。(要求を出す)
function ClientSocket.requestReceiveAsOctet(size)
オクテット列を受信する。(要求を出す)
property ClientSocket.requestSendResult
リクエスト結果コード
property ClientSocket.requestReceiveResult
リクエスト結果コード
function ServerSocket.ServerSocket()
コンストラクタ
function ServerSocket.createServer(port, async, callbackAccept, callbackConnect, callbackClose, callbackRead, callbackWrite)
サーバソケットを生成する。
function ServerSocket.startServer()
サーバソケットを開始する。
function ServerSocket.accept()
接続受け入れ待ち
property ServerSocket.clientCount
接続中のクライアント数。
function ServerSocket.send(data)
データ(文字列またはオクテット列)を送信する。
function ServerSocket.receiveAsString(size)
文字列を受信する。
function ServerSocket.receiveAsOctet(size)
オクテット列を受信する。
property Socket.aliases
ホスト名エイリアス(配列)。
property Socket.addresses
アドレスエイリアス(配列)。
function Socket.getHostInfo(hostname)
ホスト情報を取得する。

9月 19日 (月)

1. アキバのエロゲ店内でナイフを使った傷害事件

秋葉原のエロゲ取り扱いをしているソフマップ14号店の店内で、お客さん同士の口論から、ナイフで背後から斬りつけるという傷害事件が発生した。

真偽のほどは不明だが、2chへの書き込みを紹介されているブログ(エントリー下部の【関連リンク】)には、『「キモイ」発言が発端で口論。刺した方は高校2年生らしい』となっているのも見られる。

未成年がエロゲショップ?入店だけなら問題ないか。

斬ったの?刺したの?【秋葉原】 ソフマップ14号店でヲタ同士による傷害事件発生によると、刺傷事件のようですが。

「キモい」「キモくない」で刺されちゃ堪らんな。

2. 吉里吉里

昨日、LunaNetworkのバイナリ作成をしていたときから嫌な予感はしていたのですが、今日ソースを追ってみて、予感が当たっていたことがわかりました。これ、複数のソケットを制御できません。クライアントソケット、サーバソケットがそれぞれ一つずつ、ソケットハンドルをクラス変数として持っているためです。LunaNetwork::Client::ConnectServerには接続中の場合は切断とはっきり書かれていますし。

こいつは手術が必要ですね。それとも、LunaSocket系に戻すか?

3. 誰も「本物のハイビジョン」を知らない

面白いことが書かれています。視聴者だけでなく、制作サイドもまた規格に振り回されているようですね。

3.1. 私見

今のテレビ放送事情って、HDTVだのデジタル放送だの、画質がどうの双方向性がどうの、なんだかもう、視聴者置いてけぼりです。まあ、正直言ってどうでもいいんですけどね。そこそこ綺麗に映ればいいんですよ、テレビなんて。本気で画質云々言ってるのは、一部の映像マニアだけじゃないんですか?

バジリスクと、十月から放映開始予定のリリカルなのはA'sがそこそこ綺麗に映ればそれで良し。画質に疎い俺にとっては、テレビなんてそんなもの。

あ、いや、待て。ゲームの画面は綺麗に映って欲しいな。

4. 吉里吉里

クライアントソケットとサーバソケット、それぞれインスタンスを作成できるように、staticの呪縛から解き放ちました。LunaNetwork::Clientクラス中のWSA Overlapped Completion Routine *1 中で、どのソケットなのかを知る方法がわからず(ソケットハンドルを受け取れないっぽい?)、どうしてくれようかと悩みましたが、結局この機能は切り捨てました。代わりに、関連する部分はWSAGetOverlappedResult()関数を使って何とかすることにしました。

とりあえずバイナリは作成できた *2 ので、あとは吉里吉里でこいつをどう扱うか。まあ、ゆっくり考えるとしましょう。

  • *1: リクエスト処理終了時にコールバックされる。winsock2.h中でLPWSAOVERLAPPED_COMPLETION_ROUTINEでtypedefされている。
  • *2: 正しく動作するかは別ですが。