マグマ火炎砲を所持していたことに気づきました。いつの間に入手していたんでしょう?
今日もINFERNO「灼熱」で武器稼ぎをしましたが、何も出ませんでした。俺の「THE 地球防衛軍2」には、超級武器のデータが入ってないんじゃないかと。(←単に運が悪いだけです)
TeXを参考にしているせいか、文字の配置、ルビの振り方等、かなり美しく組版されています。これ、そのまま頂こうかな。
SQLitePlus 3.0.7に付属していたisqliteを、一部日本語化しました。ついでに、インタラクティブモードのコマンドにエイリアスindexesを追加しました。index という単語の複数形はindices とindexes がありますが、isqliteにはデフォルトでindicesしかなかったので。
isqliteはもともとシンプルに作られているので、折を見ていろいろ改造してみましょうか。
プラグイン。util_sqliteのmakeにはsqlite3.libとsqlite3.dllが必要なのに、makeコマンドだけではこの二つが生成されません。予め別に作成しておく必要があります。前から思っていたんですが、これ、面倒です。だったら対処しろよ、との心の叫びに従って、Makefileを改良しました。これでようやく真の「make一発」になりましたよ、ああ楽ちん。
ちなみに、make release一発で、全ライブラリ再作成、全ドキュメント再作成、全リリース用アーカイブファイル作成までやってくれるので、私は楽ちんです。作者(私)にしか恩恵がないですけど。
プラグイン。使い道が不明な関数、global.getClassInstanceInfo(obj)のドキュメントを書き忘れた気がします。はい、忘れてました。
DXライブラリLunaから、ソケットライブラリであるLunaSocket、LunaSocketAsyncIO、LunaSocketServerAsyncを引っこ抜いて、これらだけでコンパイルが通るようにしました。
…した矢先、Luna本家ではすでに、LunaSocket系がLunaNetworkに移行されていることに気づいてがっかり。
INFERNO「灼熱」。相変わらず超級武器が出ません。「殺虫スプレー」はもういいから、ハーキュリーとかUMXA-V2を出してくれ。
放置気味だったティンクルスタースプライツをプレイ。キャラクタモードの最後の空欄、ドラゴンスター リアリー・ティルがなかなか出てこず、ストーリーモードを何周もしました。ほとんど「作業」でした。運が悪かったのでしょうか。
ギャラリーにサターン版OPが追加されたので、鑑賞。この下手くそな歌はほとんど音波攻撃ですね。この歌い方はとても独創的ですね。PS2ということもあって、画質はかなり向上しています。まあ、サターン版ではハードの制約上、画質を落とさざるを得なかったわけで、PS2版で本来の画質になった、というところでしょう。ただ、画質は向上しても歌唱力は向上しなか…うわ、何をす…
で、NEOGEO版。ラスボスが凶悪ですね。特にエキストラアタック。PS2版ではずいぶん弱体化しているように感じますが、やっぱり歳のせ…うわ、何(略)
怪しげな関数を思いつきました。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");});
アホです。配列をこんなことに使うなよ…
冗談はさておき。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
でもダメです。まあ、これができたからといって、どうということもないのですが。
より高度なクロージャとは?にあった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は素敵だと思いました。
ネットワーク関係。構想中。こんなイメージで進めてみましょうか。
秋葉原のエロゲ取り扱いをしているソフマップ14号店の店内で、お客さん同士の口論から、ナイフで背後から斬りつけるという傷害事件が発生した。
真偽のほどは不明だが、2chへの書き込みを紹介されているブログ(エントリー下部の【関連リンク】)には、『「キモイ」発言が発端で口論。刺した方は高校2年生らしい』となっているのも見られる。
未成年がエロゲショップ?入店だけなら問題ないか。
斬ったの?刺したの?【秋葉原】 ソフマップ14号店でヲタ同士による傷害事件発生によると、刺傷事件のようですが。
「キモい」「キモくない」で刺されちゃ堪らんな。
昨日、LunaNetworkのバイナリ作成をしていたときから嫌な予感はしていたのですが、今日ソースを追ってみて、予感が当たっていたことがわかりました。これ、複数のソケットを制御できません。クライアントソケット、サーバソケットがそれぞれ一つずつ、ソケットハンドルをクラス変数として持っているためです。LunaNetwork::Client::ConnectServerには接続中の場合は切断
とはっきり書かれていますし。
こいつは手術が必要ですね。それとも、LunaSocket系に戻すか?
面白いことが書かれています。視聴者だけでなく、制作サイドもまた規格に振り回されているようですね。
今のテレビ放送事情って、HDTVだのデジタル放送だの、画質がどうの双方向性がどうの、なんだかもう、視聴者置いてけぼりです。まあ、正直言ってどうでもいいんですけどね。そこそこ綺麗に映ればいいんですよ、テレビなんて。本気で画質云々言ってるのは、一部の映像マニアだけじゃないんですか?
バジリスクと、十月から放映開始予定のリリカルなのはA'sがそこそこ綺麗に映ればそれで良し。画質に疎い俺にとっては、テレビなんてそんなもの。
あ、いや、待て。ゲームの画面は綺麗に映って欲しいな。
クライアントソケットとサーバソケット、それぞれインスタンスを作成できるように、staticの呪縛から解き放ちました。LunaNetwork::Clientクラス中のWSA Overlapped Completion Routine *1 中で、どのソケットなのかを知る方法がわからず(ソケットハンドルを受け取れないっぽい?)、どうしてくれようかと悩みましたが、結局この機能は切り捨てました。代わりに、関連する部分はWSAGetOverlappedResult()関数を使って何とかすることにしました。
とりあえずバイナリは作成できた *2 ので、あとは吉里吉里でこいつをどう扱うか。まあ、ゆっくり考えるとしましょう。