オンラインNetHackプレーヤーリリース
まだうまく再生できないttyファイルがいっぱいあるのに何やってんだと怒られそうですが、TTYShare 上で NetHack をあそべる機能をつけました。
いままで NetHack というものの存在は知っているだけでやったことはなかったんだけど、これを作りながらちょっと覚えはじめてみている。むずかしい><
実装としてはすごく簡単で、Flash 側はほとんど tty プレイヤーと同じ。URL から tty データを読むかわりに、Socket クラスを使って受信するようにして、キーボード入力を送り返すのをつけただけ。
サーバー側は POE。こっちもすごくシンプルで、接続があったら nethack を起動して、あとはその標準入出力をそのままネットの入出力につないてあげる感じで OK。
AS3 かわいいよ AS3。
Class::Accessor::Fast 改
use base qw/Class::Accessor::Fast/;
sub new { shift->SUPER::new( @_ > 1 ? {@_} : $_[0] ); }
っていうだけのモジュールがほしい件。
HHK
最近 pro 買って使ってるんだけど微妙だなぁ。lite2 ほどではないけれども。
とりあえずこの配列は耐え切れないので mayu 追加ってみた。
key *Backspace = *ReverseSolidus
key *ReverseSolidus = *Backspace
key *Esc = *GraveAccent
key *GraveAccent = *Esc
Twitterにaddしてみて
向こうもaddしてくれるかどうかで自分のことを知られているか試すメソッド。
今日の更新
要望の多い再生スピード変更を仮実装。
1~9 のキーで再生速度が変わります。1で等倍、9で9倍速。
UI はもちょいできてから作ります。
テステス
とかいうサービス作りました! まだ激しくバギってますが、皆様の罵声を受けつつ徐々に直していく所存です。
書き忘れたけどさっきの update_schema.pl
は
./script/myapp_update_schema.pl dbi:mysql:tablename username password
見たいな感じで DSN を渡す必要がある。めんどう。
ここら辺があれでまだヘルパーにはなってない。
Schema::Loader 使い方
僕の中で流行ってる使い方があるのでかぶせて書いておいてみる。mizzy さんの二個目の例を自分ルール化させた感じ?
作業は一般的なCatalystアプリのディレクトリ構造上であるとして、そこに新しく schema というディレクトリを作成。
そんで、
- schema/lib/Schema/{TableName}.pm
に各テーブルのリレーション定義とかメソッドとかを自分で書く。実際にこのライブラリは Catalyst にロードされない。
上記ファイルを元に Schema::Loader
の make_schema_at
を使い
- lib/MyApp/Schema.pm
- lib/MyApp/Schema/*.pm
にコードを自動生成して、そちらをロードするという感じ。こちらのコードは自分では書き換えない。
コード自動生成は script/myapp_update_schema.pl
にこんなのを書いてそれを実行している。
#!/usr/bin/env perl
use strict;
use warnings;
use FindBin;
use File::Spec;
use lib File::Spec->catfile( $FindBin::Bin, qw/.. schema lib/ );
use DBIx::Class::Schema::Loader qw/make_schema_at/;
die unless @ARGV;
make_schema_at(
'MyApp::Schema',
{ components => ['ResultSetManager', 'UTF8Columns'],
dump_directory => File::Spec->catfile( $FindBin::Bin, '..', 'lib' ),
dump_overwrite => 1,
debug => 1,
},
\@ARGV,
);
@INC
に schema/lib
をくっつけてから make_schema_at
してるだけ。ワンライナーでもできるけど見通しが悪いので。
これで普通の make_schema_at
でつくられる Schema ファイルに自分で schema/lib/Schema/ 以下に書いた定義がくっついて出力されるという寸法。
Schema::Loader
でダイナミックロードを使っていると各テーブルクラスにはリレーション定義やメソッド拡張のコードだけをかけばいいのでシンプルになって好きなんだけど、そうすると起動時のオーバーヘッドがあるし、ResultSetManagerがつかえなくていやんというときに、これだとまぁイイとこどりのような感じにできる。
実際にいじるファイルは schema/lib 以下のファイルで、それらのファイルを更新するたびに update.pl を実行するというのがあれだけどまぁ自動化できる。してないけど。
難点は、schema/lib 以下のファイルでsyntax errorがあっても何も言われないこと。
何も言われないというか、syntax error があるファイルは
# Loaded external class definition for 'MyApp::Schema::TableName'
ってのが出ないだけという。どこがエラってるのかとかがわからないので、がーーって書いてどこか typo してたりするとはまるかも。