trax workshop: windows版traxソフトウェアをwineで動かして開発する
TRANSCRIPT
Windows 版 Trax ソフトウェアと Wine で作る Unix な開発環境
長名保範 (琉球大学工学部)
Wine ってなに?
POSIX なプラットフォームで Windows のバイナリが実行できるツール
Windows DLL の仕組みなどが提供され、バイナリがそのまま動く
Windows API のオープンな実装であり、エミュレータではない
WINE: Wine Is Not An Emulator
x86, x64 な Mac, BSD, Linux などで動く
2
今日のお題
Trax ソフトウェア (公式版) を Un*x な環境で動かしましょう
Mac, FreeBSD, Linux で動作チェックしました
自分の stdin/stdout な Trax プレーヤを接続しましょう
DOBY AI と戦えます (なんか知らないけど、あいつ強い...)
3
Windows な人はどうするの?
仮想 COM ポートドライバ com0com / com2tcp が使えます
前回 WS の児島先生の発表資料にあります
http://com0com.sourceforge.net
Windows「だけ」で作業してる場合、僕の話は関係ないかも...
4
必要なもの + 参考資料
wine と socat と screen か minicom をインストールした開発環境
ダウンロードだけでよいもの
Trax 公式ソフトウェア: http://www.traxgame.com/shop_download.php#v5
Trax プラグイン: fpga.dll (ICFPT への参加仮登録が必要)
前回ワークショップの児島先生の発表資料
5
Wine + socat のインストール
お使いの package system にたぶんあります
socat はない場合もあるかも・・・
前半戦で必要なのは wine です
6
Wine に Trax 環境をインストール
Wine でインストーラを実行するだけです% wine ~/Downloads/setuptrax511.exe
たまにインストーラのボタンが表示されなかったりするので、固まったかな、と思ったら tab キーを叩いて探しましょう...
インストール自体はすぐにおわります
MONO (.NET Compatibility) はなくても動きます
7
Wine の環境をみてみる
~/.wine に Wine の環境
dosdevices/ にデバイス
drive_c/ が C:\
% ls ~/.wine dosdevices/ drive_c/ system.reg user.reg userdef.reg
8
起動する
% wine ~/.wine/drive_c/Program\ Files/Trax/trax.exe
必ずしも実行ファイルが ~/.wine 以下にある必要はない
DLL とかの絡みがないものならどこに置いてもよい
Windows でネットワーク上に実行ファイルがあってもいいのと同じ
9
普通にできること
人-人の対戦
Utility → Lobby でネットワーク越しに誰かと対戦
DOBY AI と対戦 (要インストール・ライセンス認証)
fpga.dll によるシリアル接続は...?
10
Wineでのデバイスの扱い
~/.wine/dosdevices
デフォルトではドライブだけ存在
ここに com1 や lpt1 を作るとシリアルやパラレルが使える
% ls ~/.wine/dosdevices c: d: d:: e:: z:
11
com1 はどうやって作る?
普通のシリアルデバイス (pty device) で OK
つまり...ln -s /dev/ttyUSB0 ~/.wine/dosdevices/com1ln -s /dev/cuaU0 ~/.wine/dosdevices/com1
/dev/ 以下の permission はなんともしてくれないので自分で解決する
12
com1 はどうやって (続き)
/dev/ 以下にある (実在の) デバイスなら symbolic link すれば OK
~/.wine/dosdevices/com[1-9]
アクセス権限は /dev/ 以下の実体の方で解決する必要あり
devfs とか udev とかそのへんで、なんとか
なんにしても実体はただの PTY デバイス
13
socat を使ってみる
"socat アドレス1 アドレス2" が使い方の基本
たとえばこう% socat tcp-l:1234 tcp-l:1235
TCP/1234 と TCP/1235 が Listen状態になる
コンソールをふたつ開いてそれぞれに telnet するとチャット状態
14
socat x PTY
片方を pty にしてみましょう
-d -d をつけないとデバイス名が見えないので注意
TCP-listen なアドレスには reuseaddr を付けておくとよい
/dev/ttys004 へリダイレクトなどで読み書きすると、telnet から見える
15
% socat -d -d tcp-l:1235,reuseaddr pty socat[40200] N listening on ... socat[40200] N accepting connection ... [ここで telnet をつなぐ] socat[40200] N PTY is /dev/ttys004 [/dev/ttys004 をアクセス]
socat x サブプロセス
PTY なアドレスの場合にはコマンドの実行を行うことも可能% socat -d -d tcp-l:1235,reuseaddr exec:"ls -l",pty
telnet localhost 1235 するとファイルの一覧が見える
16
socat で Virtual null modem
これが socat で PTY を扱うときの基本形% socat -d -d pty,raw,echo=0 pty,raw,echo=0
ふたつのデバイス名が表示されるので screen / minicom などでアクセスしてみましょう
よくわかんなかったら echo と cat とかでもいいです
17
やりたいことを整理する
Virtual Null modem cable 的なものをつくる
片方の PTY は Wine の com1 にしたい
もう片方の PTY では自分の Trax player を走らせたい
18
~/.wine/dosdevices/com1
socat で作る PTY のデバイス名は毎回変わる
手動で ln -s するのって大変ですよね...
pty,raw,link=${HOME}/.wine/dosdevices/com1
これで自動的に symbolic link ができる
19
PTY に自分の bot を接続
これはさっきの例で出てきたやつ
exec:"path/to/my_player_program",pty,echo=0
20
これで準備完了... のはず...
さてここで TeraTerm を使ってテストしてみましょう
socat \pty,raw,link=${HOME}/.wine/dosdevices/com1 \tcp-l:12345,reuseaddr
21
どうしてこうなった
Wine が PTY を読むときに文字が落ちまくることがある
Windows 側のプログラムによってはまったく落ちないので、なにか Wine の Windows API 実装との相性...?
残念ながら Trax のプログラムはデータが落ちる側のグループです
22
黒魔術で対応しましょう
Trax の通信は公式には "Trax notation + newline"
でも実際には余計な改行とかスペースは受け取ってもらえる
通信では最初の2バイトが落ちることが多いので前後にスペースを挿入
23
こんな感じで動きます
std::cout << "\n__________" << move << "___\n_\n\n_\n";
24