PHP7.4でGLUT(FFI extention)

PHP 7.4からFFIが使えるようになったとのことでGLUTを試してみました。

※php.iniで「extension=ffi」しておきます。

<?php
	require("gl.php");
	require("freeglut.php");

	$pargc = FFI::new("int");
	$argv = FFI::new("char**");

	$glut->glutInit(FFI::addr($pargc), $argv);
#	$glut->glutInitDisplayMode(GLUT_RGBA);
	$glut->glutCreateWindow("php ffi glut.");
	$glut->glutDisplayFunc( function () {
		require("gl.php");       #下でスコープの外に出したソースを載せています。
		require("freeglut.php");
		$gl->glClear(GL_COLOR_BUFFER_BIT); 

		$gl->glColor3f(1.0, 0.0, 0.0);

		$gl->glBegin(GL_POLYGON);
			$gl->glVertex2f(-0.5, -0.5);
			$gl->glVertex2f(0.5, -0.5);
			$gl->glVertex2f(0.5,  0.5);
			$gl->glVertex2f(-0.5,  0.5);
		$gl->glEnd();

		$gl->glFlush();
		//$glut->glutWireCube(1.0);

		echo "using memory (byte): ";
		var_dump(memory_get_usage());
	});
	$glut->glutMainLoop();

上のソースとライブラリをダウンロード

マニュアルによるとFFIで呼ぶ関数に渡すコールバック関数は終了するまでメモリをつかんだままになったり、ロードしたFFIのオブジェクトが渡らない(※追記↓)みたいだったりでまだ気を付けてください。

参考:PHP マニュアル - Basic FFI usage

コールバック関数の中でFFIした関数の呼び出しはFFI::cdefした変数を、コールバック関数の中でglobal 変数名とすることでFFIのオブジェクトを呼び出せることが分かりました。

<?php
	require("freeglut.php"); #変更
	require("gl.php");       #変更

	$pargc = FFI::new("int");
	$argv = FFI::new("char**");

	$glut->glutInit(FFI::addr($pargc), $argv);
#	$glut->glutInitDisplayMode(GLUT_RGBA);
	$glut->glutCreateWindow("php ffi glut.");
	$glut->glutDisplayFunc( function () { #変更
		global $gl; #追記

		$gl->glClear(GL_COLOR_BUFFER_BIT); 

		$gl->glColor3f(1.0, 0.0, 0.0);

		$gl->glBegin(GL_POLYGON);
			$gl->glVertex2f(-0.5, -0.5);
			$gl->glVertex2f(0.5, -0.5);
			$gl->glVertex2f(0.5,  0.5);
			$gl->glVertex2f(-0.5,  0.5);
		$gl->glEnd();

		$gl->glFlush();
		
	});

	$glut->glutMainLoop();

アプリケーションのウィンドウを半透明にするやり方(Windowsの場合)

GUIPropViewアプリケーションをダウンロードして、アプリケーション名またはウィンドウクラス名を調べて、コマンドプロンプトからGUIPropViewのアクションオプションを実行。

GUIPropView.exe /Action Transparent Alpha 150 Process:vvvv.exe Class:TMViewPatch
GUIPropView.exe /Action Transparent Alpha 255 Process:vvvv.exe Class:TMViewPatch

参考→https://www.nirsoft.net/utils/gui_prop_view.html

jetson nanoのデフォルトゲーム

/usr/share/man/ja/man6$ ls -1 | sed "s/\(.*\).[1-9].gz/\1/" | xargs man -f | grep \(6\)

adventure (6) - 探検ゲーム
arithmetic (6) - 簡単な算数のクイズ
atc (6) - 空港管制官ゲーム
backgammon (6) - バックギャモンのゲーム
banner (6) - プリンタ用に大きな見出しを出力する
battlestar (6) - 情熱的な冒険ゲーム
bcd (6) - "入力をパンチカード、紙テープに変換する"
bs (6) - 戦艦ゲーム
caesar (6) - シーザー式暗号法の解読
canfield (6) - ソリティアカードゲームキャンフィールド
cfscores (6) - ソリティアカードゲームキャンフィールド
cribbage (6) - カードゲームクリベッジ
factor (6) - factor は素因数分解を行なう, primes は素数を求める
fish (6) - ``Go Fish'' 遊び
fortune (6) - "おもしろくためになる格言を無作為に表示する"
hack (6) - 運命の洞窟の探検
hangman (6) - hangman ゲーム
intro (6) - ゲームプログラムの紹介
mille (6) - Mille Bornes で遊ぶ
morse (6) - "入力をパンチカード、紙テープに変換する"
number (6) - アラビア数字を英語に変換する
phantasia (6) - ターミナル間ファンタジーゲーム
pig (6) - 入力をぶたラテン語に変換するのだブー
pom (6) - 月齢表示
ppt (6) - "入力をパンチカード、紙テープに変換する"
primes (6) - factor は素因数分解を行なう, primes は素数を求める
quiz (6) - ランダムな知識試験
rain (6) - 雨の降る様を表示する
random (6) - ファイルからのランダムな行選択、あるいは乱数
robots (6) - 悪質なロボット達を撃退する
rogue (6) - 運命の洞窟を探検する
rot13 (6) - シーザー式暗号法の解読
sail (6) - マルチユーザ版ゲーム「帆船の戦い」
snake (6) - 画面上の追いかけゲーム
snscore (6) - 画面上の追いかけゲーム
teachgammon (6) - バックギャモンのゲーム
trek (6) - トレッキーのためのゲーム
wargames (6) - 私とゲームをしませんか ?
worm (6) - いも虫を成長させるゲームで遊ぶ
worms (6) - 端末ディスプレイに蟲を這わせる
wump (6) - 地下洞窟で Wump を狩る

です。

arm64のJetsonでLLVMのビルドが普通に通ったぞ!?

Emscripten - Building Emscripten from Source
https://emscripten.org/docs/building_from_source/index.html#installing-from-source

パッケージのLLVMやClangは使わず、LLVMとbinaryenをビルドしてemscriptenを公式リポジトリからクローンすれば動いた。

https://github.com/llvm/llvm-project

cd build/
cmake ../llvm -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS='lld;clang' -DLLVM_TARGETS_TO_BUILD="host;WebAssembly" -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF
cmake --build . 

https://github.com/WebAssembly/binaryen

cmake . && make

https://github.com/emscripten-core/emscripten

【Ubuntu】キーボード・マウスリピーターSynergyをGNOMEのユーザースタートアップアプリケーションに登録して自動で接続させる

スタートアップアプリケーションズを起動する。

Synergyクライアントの起動コマンド(synergyc --name <client name> <server host or ip>)を以下のように登録する。

ユーザーの設定で、自動ログイン(AUTO LOGIN)を設定しておく。

サーバー側のSynergyを開始しておき、ログオフか、リブートしてログインしてキーボードやマウスがクライアント側で動くのを確認する。