M.Y. 雑感ブログ

札幌からWebの技術などを発信しています。

Project Kinoko Pt.1 Phaser とわたし

github.com

プロジェクトキノコというものを始めてみた。

オンライン協力プレイゲームの試作である。

幾度となくこういうプロジェクトは虚無に帰したので、今回こそはちゃんとリリース1.0.0までやりたい(と毎回言っている)。

今回のコンセプトは、

  • リアルタイムオンラインゲーム技術知りたい
  • 画像的なリソース最小限にしたい
  • とにかく早くリリース出来る形にしたい

で。

利用技術としては、

  • Phaser.js : Github でもトレンドらしいjsのゲームエンジン
  • node.js : js/htmlファイルのサーブとWebsocketサーバ
  • Websocket : オンライン協力を実現するためのサーバ。まだ中身は全然考えてない。
  • Typescript : 実は初めて触るレベルなので、ちゃんと使えるようになっておく奴
  • webpack : コンパイル用。なんか難しかった
  • gulp : サーバ側コンパイル用。サーバ側もwebpackでやりたかったけど、よくわからなかったからgulpさんにした
  • vscode : エディタ。いつもの。

あたり。

f:id:expert88:20170723002416p:plain

機能としてはまだ

  • キャラクタのタップ移動
  • Mobの出現
  • Mobのターゲット

くらいしか出来ていないので、ゲームとして成り立ってない。

色々考えてるのは /specs/ 以下にメモってあるけど、とりあえずゲームとして成り立たせる所までさっさと作りたい。

Phaserさんの使い方が中々難しくて進んでいない問題はある。 enchant.js なら書けるんだけど、もう死に体だからダメね…

今後は Phaser や Websocket 周りの記事をかけたら書こうかなと思う。

シンデレラ 5th ライブ 幕張LV 行ってきました雑感

THE IDOLM@STER CINDERELLA GIRLS 5thLIVE TOUR Serendipity Parade!!! 幕張公演 2日目にライブビューイングで札幌から参加した感想記事。

今まで5th全国ツアーは、1つ目の宮城を除き、石川は現地まで1泊2日の遠征で、その後も大阪・静岡とライブビューイングで参加してきた。

石川に行って「なんで宮城ライビュ見なかったんだろう…」と後悔している勢。

一応最近のCDはレンタルなり購入なりで揃えているので、大体の曲はわかっているレベル。正しアニメ時の曲などは持ってないものもあったりして、静岡では Heart Voice と 心もよう がわからなかったです。でもわからなかったけど凄く心に残る良い曲だった…😤

さて、今回の幕張公演では、ななみんこと山下七海(大槻唯役)が一番の期待で、まこ姉こと杜野まこ姫川友紀役)の笑顔を見るのが楽しみで楽しみで。

二人とも最高にかわいかったわけですが、今回も無論登場したシンデレラ15人全員最高だったのである。

続きを読む

Laravel のDBトランザクション機能を見てみる

Laravel 5.4 からはトランザクションに関するメソッドが trait 化されているのでとても分かりやすい。

Concerns(関心) というくくりで trait 分けしているみたいです。その trait の使い方自体も面白いですね。

\Illuminate\Database\Concerns\ManagesTransactions(v5.4.11)

マルチプルトランザクション

まず、トランザクションは複数回かけることが出来そうです。

<?php
DB::beginTransaction(); // ここで `$this->getPdo()->beginTransaction();` が走る
DB::beginTransaction(); // ここでは `SAVEPOINT trans2;` が走る
DB::commit(); // ここは何もしない
DB::commit(); // ここで `$this->getPdo()->commit()` が走る

SAVEPOINT とは MySQL のリファレンス にある通り、トランザクション中の任意の場所にセーブポイントを作成し、ロールバック時にそのセーブポイント後の行操作だけを戻す、という動作を行えるようです。

セーブポイント後の行ロックは解放されないので注意ということも書いてありますね。

マルチプルトランザクションのロールバック

マルチプルトランザクションの途中でロールバックが発生した場合はどうなるでしょうか。

<?php
DB::beginTransaction();
DB::select('SELECT name FROM tbl_users WHERE id = 1;')[0]->name; // "aa"
DB::update("UPDATE users SET name = 'hoge' WHERE id = 1;");
DB::select('SELECT name FROM tbl_users WHERE id = 1;')[0]->name; // "hoge"

DB::beginTransaction();
DB::update("UPDATE users SET name = 'foo' WHERE id = 1;");
DB::select('SELECT name FROM tbl_users WHERE id = 1;')[0]->name; // "foo"

DB::rollback(); // `ROLLBACK TO trans2;` が走る
DB::select('SELECT name FROM tbl_users WHERE id = 1;')[0]->name; // "hoge"

DB::commit(); // `COMMIT;` する
DB::select('SELECT name FROM tbl_users WHERE id = 1;')[0]->name; // "hoge"

おお、途中まで戻って、コミットしたら途中までの結果がコミットされるんですね。

便利は便利なんですが、トランザクションの定義をしっかりしないとコワイことになりそう。

<?php
DB::transaction(function () {
  DB::update("UPDATE tbl_users SET name = 'hoge' WHERE id = 1;");
  DB::transaction(function () {
    DB::update("UPDATE tbl_users SET name = 'foo' WHERE id = 1;");
    throw new Exception;
  });
});

ちなみにこれも先ほどのコードと等価です。クロージャにより自動的にBEGINとCOMMIT(またはROLLBACK)を行ってくれるので、こちらの方が安全ですね。

デッドロック時の処理

デッドロックの場合にリトライ処理をさせることが出来ます。

<?php
$retries = 3;
DB::transaction(function () {
  DB::select('SELECT * FROM users WHERE id = 1 FOR UPDATE');
}, $retries);

これでトランザクション中にデッドロックしても、ロールバックして三回までリトライしてくれます。

<?php
$retries = 3;
DB::transaction(function () {
  DB::transaction(function () {
    DB::select('SELECT * FROM users WHERE id = 1 FOR UPDATE');
    DB::update("UPDATE users SET name = 'foo' WHERE id = 1;");
  });
}, $retries);

マルチプルトランザクションの場合にデッドロックが起こった時は、一旦全トランザクションを抜けなければならないので全てロールバックしてからリトライが行われます。

Phan Daemon mode 試用してみた

etsy/phan というPHPの静的解析ツールが最近話題です。

最新の0.9.2(PHP7.0の場合は0.8.4)で、 Phan Daemon Mode という仕組みが搭載されました。

クラス依存情報を持つ必要があるため、これまでは解析に関わるvendorを含む全てのファイルを対象とした解析の実行しか行えませんでした。

これは、CIなどのプロセスにおいては有効ですが、エディタによる編集作業中にエラーを指示してくれないことになり、フィードバックが遅れるという問題があります。

  • (Linux/Unix only) Add Experimental Phan Daemon mode (PR #563 for Issue #22), which allows phan to run in the background, and accept TCP requests to analyze single files. (The implementation currently requires the pcntl extension, which does not in Windows) Server usage: path/to/phan --daemonize-tcp-port 4846 (In the root directory of the project being analyzed) Client usage: path/to/phan_client --daemonize-tcp-port 4846 -l src/file1.php [ -l src/file2.php ]

新しい仕組みでは、バックグラウンドで常に全ファイルの解析を行ったものを保持して、エディタ等でファイル変更が生じた際にそのファイルだけを解析にかけることが出来るというものです。

利用wikiはこちら

実際に実行するのは簡単で、

# プロジェクト外にphanを置く
$ git clone https://github.com/etsy/phan.git /opt/phan
$ cd /opt/phan
# PHP7.1の場合はmaster、PHP7.0の場合は0.8ブランチで
$ git checkout -b 0.8 origin/0.8
$ composer install -o --no-dev
$ cd /path/to/project
$ /opt/phan/phan --daemonize-tcp-port 4846 --quick # `/.phan/config.php` を事前に置いておくの推奨
Warning: This daemon is slower when xdebug is installedListening for Phan analysis requests at tcp://127.0.0.1:4846

# 警告の通り、xdebug付きで実行すると遅くなるそうです。

これでデーモンプロセスが立ち上がるので、後はコマンドなりなんなりで

$ /opt/phan/phan_client -l src/TargetFile.php
Phan error: UndefError: PhanUndeclaredClassMethod: Call to method get from undeclared class \Config in src/TargetFile.php on line 10
...

のように単体ファイルで高速に解析が出来ます。

…とのことでしたが、xdebugをONにしているのが悪いのか、1ファイル解析するのに1分くらいかかったりしてました。

CPUとメモリもそれなりにムシャムシャするみたいなので、まだ安定運用は出来なさそうな雰囲気です。

クライアントをエディタに反映するプラグインemacs用vimスニペット くらいしか出ていません。

今後は Microsoft Language Server Protocol に従った出力をしようぜ、などの提案がなされています。今後に期待ですね。