WinSockで遊ぶ。題材としては、SSTPがお手軽でいいですね。
さて、簡単なテキストベースのTCP/IP通信ができたので、明日にでも本題に移るとしましょうか。
気が向いたとき
とか言っておきながら、一日と経たないうちに気が変わって、サーバ機能を実装してみました。
一応、簡単なクライアント〜サーバ間通信はできました。しかし、クライアントもサーバも、送受信機能は同期モードしかサポートしていないので、実用になるかというとちょっと、といったところです。試しに非同期モードも実装してみようと思ったのですが、Windowsメッセージループやら何やらわけがわからず、二時間余りで挫折。Windowsプログラミングって良く知らないんですよ、私(ォ
サーバ機能は置いといて、オクテット列データの送受信機能を追加しました。
// クライアント側のコードはこんな感じ Plugins.link("util_socket.dll"); Plugins.link("util_generic.dll"); var sendData = <% 53 45 4e 44 20 53 53 54 50 2f 31 2e 34 0d 0a 53 65 6e 64 65 72 3a 20 54 56 50 0d 0a 53 63 72 69 70 74 3a 20 5c 30 5c 73 5b 35 5d 83 49 83 4e 83 65 83 62 83 67 97 f1 91 97 90 4d 82 c9 91 ce 89 9e 82 b5 82 dc 82 b5 82 bd 5c 31 81 63 82 b3 82 e6 82 a9 0d 0a 43 68 61 72 53 65 74 3a 20 53 68 69 66 74 5f 4a 49 53 0d 0a 0d 0a %>; var sstp = new Socket(); // create socket sstp.open("localhost", 9801); // open socket sstp.connect(); // connect to server var sentSize = sstp.send(sendData); // send data var recvData = sstp.receiveAsOctet(128); // receive response data sstp.close(); // close(shutdown) socket System.inform(Debug.hexDump(recvData));
メモリ使用状況取得関数、OSバージョン情報取得関数を作りました。といっても、Windows APIの結果をそのまま返しているだけです。
メモリ使用状況のような揮発性の情報は、一回の呼び出しでまとめて取得したほうが良いですね。二度連続で呼んだとしても、同じ情報を得られるとは限りませんから。そういうわけで、まとめて取得した情報は、辞書配列でまとめて返すことにしました。
ところで、VER_SUITE_SECURITY_APPLIANCE ってどんな製品スイートなんでしょう。よくわかりません。
サーバリプレース中です。先にリプレース先、つまり新サーバを構築しているのですが、なかなかうまくいきません。
OSはLinuxということで、VineとかCentOSとかdebianとかいろんなディストリビューションを、インストールしてはアンインストールして、と繰り返していました。どれを入れても、ネットワークカードが不安定だったり、OSが起動しなかったり、それ以前にブートローダが起動しなかったり。なんでやねん。
なんでこんなに梃子摺るんでしょうか。
何が悪いんでしょうか。
…日頃の行い…(ギクッ)
リプレース中です。が、しかし!
ああ、もしかして、SMPは鬼門ですかね。インストール時にSMPカーネルを選ぶと、ディストリビューションを問わず、LILOがこけたり、kernelがパニクったりしますね。
ネットワークカードが不安定なのは良くわかりません。debian 3.0r4、CentOS 3.4 だとまともに動作しませんが、Vine 3.1/2.6 だと安定します。謎。
それにしても、Pentium III 800MHz って速いですねー。カーネルのコンパイルとか、今までのマシンと比べて、目に見えて違いますね。あとは安定してくれればいいんですが。
近所の古本屋、全体的に値上がりしててアレだなあ。
それよりも、自室の本を置く場所がアレだなあ。
吉里吉里で非同期送受信対応。
ここ数日、WWWで情報を集めたり、吉里吉里プラグインサンプルを参考にしたり、WinSock サンプルのソースを読んだりしているうちに、目処が立ちました。何とかなりそうです。
試行錯誤の末、クライアントモードでの接続〜送信はできました。多分、できてます。…本当に非同期になっているのかしらん。
今のところ、Windowオブジェクトを使用しないと、非同期モードにはできない仕様になってます。Window.registerMessageReceiver() メソッドでメッセージ受信関数を登録する必要があるので、この仕様は仕方がないと思います。
const CRLF = "\r\n"; var sendData = [ "SEND SSTP/1.4", "Sender: TVP", "Script: \\0\\s[5]私のしもべー\\1\\s[11]ええっ", "CharSet: Shift_JIS", "" ].join(CRLF) + CRLF; var win = new ASWindow(); var sstp = new Socket(); // create socket sstp.open("localhost", 9801, true, win); // open socket (as asynchronous mode) sstp.connect(); // connect to server var sentSize = sstp.send(sendData); // send data sstp.close(); // close(shutdown) socket
受信機能も近日中に実装したいところ。
あー、サーバ機能はねえ、まあ、アレですねえ(何)。
以前作った書籍管理プログラムに、ISBNから国名と出版社名を引く機能を追加しました。
夜だったか、朝方だったか。
揺れていたような、揺れていなかったような。
朝刊にも載っていなかったし、高層建築のような本棚も、積み上げてある空き箱類も無事だったので、あれはきっと夢だったんだろうなー、と考えつつ会社に着くと、「朝方なんだから朝刊に載るわけないじゃん」とか「寝ぼけてたんでしょー」とか、いろいろ突っ込まれました。「寝ぼけてるのはいつものことだよ!」って全然反論になってないし、いや、どうやら本当に揺れていたようですね。
ということは、私は地震で目を覚ましたことになります。震度3以下では起きませんから、すなわち震度4以上だったことになります。ふむ、結構揺れたのか。
影牢 II -Dark illusion-が出るようです。シリーズ二作目の影牢は名作なので、気になるといえば気になるのですが、前作(シリーズ三作目)の蒼魔灯は出来があまり良くなかったので、微妙ですね。
しかし、相変わらずミニスカートだな…
アキバでいろいろ買ってきました。重かったー。
寝る前にうっかり二十面相の娘と夕凪の街を読んでしまって、寝るのが遅くなりました。明日もきっと睡眠不足。
使いにくっ!
まあ、慣れの問題なんでしょうけど。MS-IMEのキーバインドに慣れてしまったせいで、ATOKのキー操作が全くできません。カーソル下で確定だっけ?ああ、覚えてないよ。ATOKを最後に使ったのは、高校生の時だったような。確か、一太郎Ver.3だか4だか、そのへん。いつの時代だよ。
とりあえず、キーバインドはMS-IME型に直しました。
アクセサリのカタカナ語英語辞書は便利ですねえ。
早い話、アストロロボSASA。めちゃ楽しいです。
Normal(Applica)で761万、Ultimate(Reminisce)で809万でした。うまい人はUltimateで1000万オーバーだそうです。すごいですね。
それにしてもこのゲーム、ロード時間が長すぎます。何とかならんかの。
早い話、エースコンバット。すごいクオリティです。
EasyでMission 1だけクリアしました。
Easyクリア。純粋に戦闘を楽しめますね。
そういや某5作目のThe Unsung War、ロックオン機能はバグってるし、ミッションは陰険だしで、全然やってないや。
ついにでました、Normal(Applica)で822万(リプレイ ver.1.02用)。かなり乱暴なプレイですが。
基本は開幕バーストで、ひたすらブレイクチェインを狙います。また、ボスをブレイクチェインで倒すと、地味ではありますがそこそこ点数が入ります。Clarino(3)だけはバーストせずに、逃げ回った方がいいような…へたれ?
Allで988万でした。1000万まであと少し。惜しかった
Normal(Applica)で、SP封印、バースト封印のマゾプレイ。スコアはALLで300万くらいでした。中途半端に辛いだけであまり面白くないので、このプレイは封印。
Ultimateでこんなことやったら、恐ろしい難易度になります。特に「ナ」×2戦が。
低スコアプレイ。Normal(Applica) ALLで116万でした。意外と難しいです。
プラグイン。make release で生成されるリリースファイルを、バイナリアーカイブとソースアーカイブの2種類に分けました。
プラグイン。動作をSQLiteプラグインやソケットプラグインに合わせた方がいいよなあ、ということで、汎用関数プラグインとグラフィックプラグインの仕様というかポリシーを変更。対応していない描画モードで描こうとしたときなど、ちょっとでも変な指示が来たときには、どんどん例外を投げる方針に切り替えました。
SQLite ver. 3.1.3 がリリースされたことに伴い、SQLitePlus ver. 3.1.3 もリリースされました。が、SQLitePlus 3.1.3 からは、Linuxでも動くようにソース刷新
され、文字コード変換にiconvが使われるようになり、主に文字列に関わる部分の仕様・インターフェースが変わりました。
大問題です。
SQLitePlusをバージョンアップさせるとなると、吉里吉里の自作プラグインである util_sqlite を書き換えねばなりません。試しにプラグイン側を書き換えてみたりしましたが、途中で挫折しました。かなり面倒くさいです。
しかしよくよく考えてみると、今のところ、吉里吉里プラグインとしては、Linuxで動かすとかShift_JIS、UTF8/16以外の符号化方法を使う予定はありません。ということは、無理にSQLitePlusをバージョンアップする必要はないわけです。結局、SQLitePlusはver. 3.0.7のままで、SQLite本体(DLL)はver. 3.1.3(or later)を使うことにしました。今後も、特に必要がない限り、SQLitePlus 3.0.7をベースに開発するかもしれません。
ROはよく知りませんが、面白い歌。
プラグイン。辞書配列をダンプしたいことが多々あるので、作っておきました。この程度ならTJS実装でもいいんですが、せっかくだからプラグインで。
var dic = %[ 'foo' => 100, 'bar' => 'xyzzy', 'hoge' => null ]; var text = dictionaryDump(dic, ' => ', '\n'); // text には // (string)"bar => xyzzy\nfoo => 100\nhoge => (object 0x00000000:0x00000000)" // が格納されます。
あとは、Bスプライン開曲線(チャイキンのアルゴリズム)描画関数のバリエーションを追加したり、垂直/水平線描画関数のバグを修正したり。
「ナ」×2戦をステージセレクトで練習。Reminisceで133万点、ブレイクチェイン252です(リプレイ)。バーストしなければチェイン数はもうちょっと増えるかもしれませんが、クリア時のバーストボーナスが減ってしまいます。難しいところ。
って書いてるそばから記録更新。150万点、274チェインです(リプレイ)。バーストボーナスよりもブレイクチェインで稼いだ方がいいみたいです。
某 Dual Pentium !!! on 440BXマザーなマシンですが、redhat linuxにしたらSMPでもあっさり動きました。今までの苦労は何だったのかと。
「ナ」×2戦、今日も記録更新。245万点、355チェインです(Ver.1.02用 リプレイ)。全ステージの中で最も稼げるところではないでしょうか。