forget for get

覚えるために忘れる

FlatBuffersチュートリアル(日本語)PHP

公式ドキュメントが英語で、日本語の情報があまりみつからないので、やってみてまとめます。
公式チュートリアルは1ファイルで書き読みやってるけど、今回は書き・読み2ファイルに分けます。

 

FlatBuffersとは

Google社が開発しているクロスプラットフォーム対応のシリアライゼーションライブラリ。
Jsonと違い、パースやunpackingが不要でデータにアクセスできるので高速。
Cocos2d-x、FacebookAndroidアプリなどで使われている。

https://google.github.io/flatbuffers/index.html

 

環境

centos8、PHP7.4

 

作業ディレクトリ作成

mkdir fbwork
cd fbwork

 

FlatBuffersをクローン

git clone https://github.com/google/flatbuffers.git

flatbuffers/php/下にphp用のライブラリがある

flatc(FlatBuffersのコンパイラ)をビルド(初回のみ)

yum install gcc-c++ cmake
cd flatbuffers
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
make
ln -s /flatbuffersのフルパス/flatc /usr/local/bin/flatc
cd ../

スキーマを作成

vi monster.fbs

namespace MyGame.Sample;
enum Color:byte { Red = 0, Green, Blue = 2 }
struct Vec3 {
  x:float;
  y:float;
  z:float;
}
table Monster {
  pos:Vec3;
  hp:short = 100;
  name:string;
  color:Color = Blue;
  weapons:[Weapon];
}
table Weapon {
  name:string;
  damage:short;
}
root_type Monster;

 スキーマコンパイル

flatc --php monster.fbs

MyGame/Sample/以下にファイルが作成される
Color.php Monster.php Vec3.php Weapon.php

 

書き込みサンプル

vi WriteSample.php

<?php
function __autoload($class_name) {
  $class = substr($class_name, strrpos($class_name, "\\") + 1);
  $root_dir = dirname(__FILE__);
  $paths = array(join(DIRECTORY_SEPARATOR, array($root_dir, "flatbuffers", "php")),
                 join(DIRECTORY_SEPARATOR, array($root_dir, "MyGame", "Sample")));
  foreach ($paths as $path) {
    $file = join(DIRECTORY_SEPARATOR, array($path, $class . ".php"));
    if (file_exists($file)) {
      require($file);
      break;
    }
  }
}

$builder = new \Google\FlatBuffers\FlatbufferBuilder(1024);

$weapon_one_name = $builder->createString("Sword");
$sword = \MyGame\Sample\Weapon::CreateWeapon($builder, $weapon_one_name, 3);
$weapon_two_name = $builder->createString("Axe");
$axe = \MyGame\Sample\Weapon::CreateWeapon($builder, $weapon_two_name, 5);

$weaps = array($sword, $axe);
$weapons = \MyGame\Sample\Monster::CreateWeaponsVector($builder, $weaps);

$name = $builder->createString("Orc");

$pos = \MyGame\Sample\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0);

\MyGame\Sample\Monster::StartMonster($builder);
\MyGame\Sample\Monster::AddPos($builder, $pos);
\MyGame\Sample\Monster::AddHp($builder, 300);
\MyGame\Sample\Monster::AddName($builder, $name);
\MyGame\Sample\Monster::AddColor($builder, \MyGame\Sample\Color::Red);
\MyGame\Sample\Monster::AddWeapons($builder, $weapons);
$orc = \MyGame\Sample\Monster::EndMonster($builder);

$builder->finish($orc);
file_put_contents("monster.dat", $builder->sizedByteArray());

 

php WriteSample.phpと実行すると、バイナリファイル(monster.dat)が生成される。

読み込みサンプル

vi ReadSample.php

<?php
function __autoload($class_name) {
  $class = substr($class_name, strrpos($class_name, "\\") + 1);
  $root_dir = dirname(__FILE__);
  $paths = array(join(DIRECTORY_SEPARATOR, array($root_dir, "flatbuffers", "php")),
                 join(DIRECTORY_SEPARATOR, array($root_dir, "MyGame", "Sample")));
  foreach ($paths as $path) {
    $file = join(DIRECTORY_SEPARATOR, array($path, $class . ".php"));
    if (file_exists($file)) {
      require($file);
      break;
    }
  }
}

$contents = file_get_contents("monster.dat");
$bb = \Google\FlatBuffers\ByteBuffer::wrap($contents);

$monster = \MyGame\Sample\Monster::GetRootAsMonster($bb);

echo $monster->getHp() . "\n";
echo $monster->getName() . "\n";
echo $monster->getColor() . "\n";
echo $monster->getPos()->getX() . "\n";
echo $monster->getPos()->getY() . "\n";
echo $monster->getPos()->getZ() . "\n";

 

php ReadSample.phpと実行すると、バイナリファイル(monster.dat)を読み込んだ結果を表示します。

 

FlatBufferバイナリをJSONにパース

flatc --json --raw-binary monster.fbs -- monster.dat

JSONファイル(monster.json)が生成される

 

参考

公式チュートリアル

https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html

FlatBuffersをPHPで使ってみる

https://labs.gree.jp/blog/2015/11/14495/

 

WindowsアップデートしたらVM(VirtualBox、Vagrant)が起動しなくなった

結論から書くと、

WindowsアップデートしたらVMが起動しなくなった。

Windowsアップデートでホストオンリーアダプタが消えてしまったのが原因。

Virtualboxを起動して、「ファイル」→「ホストネットワークマネージャー」で

既存の設定を「x除去」、新規で「+作成」(必要ならIPアドレスを設定)

VMの「設定」→「ネットワーク」→「アダプター2」で、作成したホストオンリーアダプタを選択

VMを起動して解決!

 

 

職場についたらまずPC起動して、vagrant upでVMを起動します。

しかし、VMの起動に失敗しました。

こんなエラーコード、、

「Stderr: VBoxManage.exe: error: Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter' (VERR_INTNET_FLT_IF_NOT_FOUND)」

「VBoxManage.exe: error: Failed to attach the network LUN (VERR_INTNET_FLT_IF_NOT_FOUND)」

「E_FAIL (0x80004005)」

 

ためしにVirtualBox起動して、そっちから起動してみるも、

同じエラーコードを表示して失敗、、

「E_FAIL (0x80004005)」

 

Windowsアップデートした直後だったので、それが原因くさい。

 

ググってみると、VirtualBoxをアップデートしろだの、Vagrantをアップデートしろだのある。

 

結果的にはこれと同じでした。

tyoimemo.blogspot.jp

 

Windowsアップデートでホストオンリーアダプタが消えてしまったらしい。

Virtualboxを起動して、「ファイル」→「ホストネットワークマネージャー」で

既存の設定を「x除去」、新規で「+作成」(必要ならIPアドレスを設定)

VMの「設定」→「ネットワーク」→「アダプター2」で、作成したホストオンリーアダプタを選択

VMを起動して解決!

 

VirtualBoxVagrantの最新バージョンをインストールしなおしてVM作り直して、結局同じエラーで起動に失敗して、最終的に以前遭遇して解決した問題と同じだったっていう、、

 

 

 

Oculus Quest2+Virtual Desktop+WiFi6でPCVRを無線で体験

事前準備

こちらを参考に。

 【OculusQuest】無線でPC版のVRが体験できる!Virtual Desktopの使い方 | CGメソッド

PCにSteam、SteamVR、Virtual Desktopをインストール。

エストにVirtual Desktop(有料)をインストール。

SideQuestからクエストにVirtual Desktopのパッチをインストール。

使ってみる

バーチャルデスクトップストリーマーを起動
エストでバーチャルデスクトップを起動
steam起動して右上のVRを押す

Oculus Quest2でclusterに入る

上の状態で、ブラウザからcluster起動

WiFi6ルーター

WiFi6じゃないと映像や音声が途切れ途切れになる可能性があります。

mysqlからinsert文を出力

テストデータ入れたけど、migrationをやり直したい。
テストデータ消えちゃう、insert文ほしいな、、というとき。

 

mysqldumpでinsert文のみダンプ(where句で条件指定)

mysqldump -u username -ppassword --no-create-info dbname tablename -w "where_condition" > dumpfilename.sql

たとえばこう

mysqldump -u root -proot123 --no-create-info dbz users -w "id < 5" > user_data.sql

CodeIgniter3がPHP7.4だとエラーが出るのを解消

CodeIgniter3を使ってる環境をPHP7.4にしたらエラーが出た

A PHP Error was encountered
Severity: 8192
Message: Array and string offset access syntax with curly braces is deprecated
Filename: libraries/Profiler.php
Line Number: 108
Line Number: 138
Line Number: 557

 

原因

PHP 7.4.x で推奨されなくなる機能

https://www.php.net/manual/ja/migration74.deprecated.php

波括弧を使った、配列や文字列のオフセットへのアクセス
波括弧を使って配列や文字列のオフセットにアクセスする文法は推奨されません。$var{$idx} でなはく $var[$idx] を使って下さい。

 

該当の個所の波括弧を角括弧に修正

system/libraries/Profiler.php(108, 138, 557行目)

$this->_compile_{$section} = TRUE;
$this->_compile_{$method} = ($enable !== FALSE);
if ($this->_compile_{$section} !== FALSE)

$this->_compile_[$section] = TRUE;
$this->_compile_[$method] = ($enable !== FALSE);
if ($this->_compile_[$section] !== FALSE)

 解決!

 

VSCODEでLaravelのFacadeもコードジャンプできるようにする

Laravelはファサードを多用していて、IDEでコードジャンプができない。
laravel-ide-helperを使うと解決。

 

laravelにide-helperを入れる

composer require barryvdh/laravel-ide-helper
php artisan ide-helper:generate

_ide_helper.phpが生成され、ここを経由してコードジャンプできるようになる。

コード補完もできるようになる。

 

github.com

CircleCIメモ

GitHubやBitbucketと連携して、プッシュしたらビルドしてテストしてデプロイができる。
月1000分まで無料で使える。
 
ユーザ登録
https://circleci.jp/signup/
GitHubでログインする(Bitbucket使ってる人はBitbucketでログイン)
 
Gitリポジトリのトップに
.circleci/config.yml
を作成。
 
version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.3-stretch-node-browsers
    working_directory: ~/repo
    steps:
      - checkout
      - run: scp -oStrictHostKeyChecking=no -P ${DEPLOY_PORT} ~/repo/* ${DEPLOY_USER}@${DEPLOY_SERVER}:~/web/projecta

workflows:
  version: 2
  build_and_deploy:
    jobs:
      - build:
          filters:
            branches:
              only:
                - master