なんか疲れているような気がする.眠い.
先週の続き.ESP32とJavaScriptで遊ぶ. WiFiつないで少し大きめのJSONが帰ってくるようなAPIにアクセスしようと思おうとSRAMが心もとない.実行中のプログラムをSRAMからどかせば大分ましになりそうなので,生成済みの中間コードをFlashメモリ上にキャッシュするようにして,それを実行するのが良さそう.二回目以降の起動速くなるしモジュール単位で処理すれば実用的なサイズのプログラムも実行できそう.
SPIFFSを使うと簡単にESP32のフラッシュメモリ上にファイルシステム作れるけど,mmapできるような仕組みはないのか...1ブロックに収まるファイルなら無理やりアクセスできるけど,大き目のデータをSRAMに読み出さずに使いたい場合は別の仕組み使ったほうが良さそう.
あと,いままでESP8266用にHTTPを生かしておいたのを閉じるためにHTTPSにしたけど,SSLのハンドシェイク遅くて悩ましい.
M5Atom,コネクタがType-Cなの良いけど,電源だけほしいとき丁度よいケーブルなかなかなくて面倒だな.
昨晩,Nature Remoが赤く光ってて反応しないなと思ったけど,障害起きてたのか.
On/Offしようとしても反応しないので,手動で部屋の照明切って寝たら,遅れてコマンド処理されたっぽくてOnになったのはひどい.深夜に全利用者の部屋の明かりつけたり,電力使用のピーク時間帯にエアコンを全開にするテロがいつか起きそう.
手軽に金属加工してくれるサービス探してて Meviy を見てたけど,やってるのミスミなのか.
ロボコンでミスミに材料注文したとき,後からエンドミルでサイズ合わせるつもりで少し大き目に注文したら,精度の指定ないのに指定した通りのサイズで端面加工済みの状態で届いて驚いたことある(大抵,精度を指定すると値段高くなる).次回から図面そのままの寸法で注文して届いたやつをそのまま使うようになった思い出.
CADのファイルアップロードできるみたいだけど,見積もりと注文のAPI整備してくれれば3DCAD上でボタン押したら加工済みの部品が家に届くマクロとか書けたり,なにかの組み立てキットを注文すると裏でそういうAPI呼んでるみたいなことできるのだけど.
先週の続きで紙の本を整理してたら,うっかり本を読み始めてしまって一日が終わった...
とても眠い..
OculusQuestのブラウザ,以前はBluetoothデバイスが見えてた気がしたのでそのうち使おうかと思ってたのだけど,気づいたらブラウザからBluetoothデバイスにアクセスできなくなってるような...Web Bluetooth API使ってる人はいないと思われて無効にされちゃったのかな.
* ESP32でJavaScriptを動かす日
ESP32,SRAMが512KiBも載ってるし,試しにJavaScriptで開発してみようと思ってたのだけど,QuickJSで遊んでるうちに別のもの作ってたりしたので,当初の目的に戻る.
とりあえず,QuickJS自体は素のC言語で書かれてるのでほとんど変更せずに普通にESP32でも動く.もともとlinuxとwin32のifdefが入ってるあたりを,ESP32用にいじるだけ.
ただ,malloc&freeが大量に呼ばれるのと,ほとんどの値をuint64_tで扱う必要があるのがメモリ少ない環境だと少ししんどい.あとUnicodeのテーブルがでかい.これは仕方ないけど,メモリリークさせると一瞬でメモリ食いつぶしてしまう.
QuickJS,基本的にJS_Get*/JS_Set*という名前の関数はメモリの所有権が移動して,受け取った側で使い終わったらリファレンスカウントを減らす思想っぽいけど,たまに例外があって困る.JS_SetPrototypeとかは渡す側で値を破棄しないといけないっぽい.
寝る日.
新宿.
なんだか熱っぽいけど,健康診断のついでに受けたインフルエンザ予防接種のせいかな.
QuickJS,V8と比べると小さいオブジェクトの生成が10倍くらい遅いなと思ったけど,ほぼmallocにかかる時間っぽい.
紙の本,最近はあまり買わないようにしてるけど,だいぶ嵩張ってきたので整理する.以前は業者に送ってPDFにしてたけど,今後また読む確率を考えると必要なときに電子書籍を買い直すので良い気がした.とりあえずブックオフの宅配買取申し込んでおく.350冊くらい詰めたところでダンボール箱が足りなくなったので残りは今度.
QuickJSしばらく触ったついでに https://github.com/binzume/mqo-jsmacro-plugin これをV8からQuickJSに置き換えてみる.エディタの正規表現での置換を駆使しながら置き換えたらすんなり動いた.今回やりたかったこととは別だけど.
array-like なオブジェクトが欲しいとき,getter/setterにプロパティの情報が渡らなくて色々面倒だったのだけど,プロパティの情報の取得時に getter/setter の data フィールドにインデックスの値を入れておいて,JS→C++のメソッド呼び出しをラップしている箇所で取り出して引数を一つ追加する感じにすればシンプルに書けそう.
久しぶりに趣味プログラミングでC++書いてたけど,最近のC++はテンプレートとconstexprでコンパイル時に何でもできてすごいな.そしてstd::wstring_convertはもう非推奨なのか...
Visual StudioだとC++20はまだ微妙っぽいけど,C++17の時点で色々便利.そしてC++むずい.
* QuickJS
良さげなので,V8使ってたやつを置き換えたりする.ただ,本格的に使おうとすると色々悩ましい箇所が多いな...
配列のように振る舞うオブジェクトが作りたいのだけど,組み込みのArrayは専用の実装が入ってるのか.V8でいう SetIndexedPropertyHandler をしたいときは,クラスをexoticにしてプロパティへのアクセスを横取りするしかなさそう.
ただ,JSAtomから直接インデックスに変換する手段は外部に公開されてないので,JS_AtomToValue() して JS_ToIndex() しろってことなんだろうか.一旦内部でstringを経由してたりしてパフォーマンス悪くなりそう.ついでにgetter,setterを返すと呼び出してくれるのだけど,getter,setterにはアクセスしようとしているプロパティは渡されないので不便.
あと, class_id が JSRuntime 単位ではなくてグローバルなので同じプロセスで色々実行してると class_array が大きくなる一方に見える(?)
やること溜まってるのだけど気力が足りない...
* QuickJS
数年に一度くらいの頻度で,JavaScriptエンジンが欲しくなって V8 をビルドしてる気がするけど,ビルドに必要なものが多かったり,数年ぶりに見ると結構インターフェイス変わってたりで面倒.ちょっとスクリプトの実行環境を組み込みたいようなときV8はオーバースペックなので,小さくて使うのが簡単そうな QuickJS を試してみる.
少し前にQuickJS使おうとしたとき,Visual Studioでビルドするのが少し面倒そうだったのだけど,探してみたらVisual Studioでビルドできるようにパッチ当てたものがいくつかあった.https://github.com/c-smile/quickjspp これが最新のQuickJSを追いかけてるっぽいので良さげ.
基本的には用意されているバッチファイルを実行するだけで,Visual Studioのソリューションファイルが生成される.
ただ,出力先ディレクトリの設定がおかしくてプロジェクト開けなかったので,とりあえずpremake5.luaで targetdir ".bin/%{cfg.buildcfg}_%{cfg.architecture}/"
としておく.あと,Releaseビルド時に一部の関数がdllimportに置き換わってconst変数の初期化時にアドレスを参照できないようなので,深く考えずflags { staticruntime "On" }
も追加(問題なのはceilとfloorくらいなので適当な関数でラップするだけで良いかも).
premake初めて触ったけどCMakeと比べて初めてでも読みやすくて良い感じ.
先月くらいから,たまにディスプレイのバックライトが怪しい気がしてたけど,気温が下がると調子悪いっぽい.
10年近く使ってるやつなので,そろそろ買い換えるか...
https://github.com/binzume/aframe-xylayout これ使ってる人がいるっぽいので気になってたバグを直しておく.
メモ:VR/MRデバイスのブラウザのバージョン.
-
Oculus Go
-
OculusBlowser/10.11 Chrome/84
-
Oculus Quest/Quest2
-
OculusBlowser/12.0 Chrome/86
-
Firefox Reality: Gekko/81 Firefox/81
-
HoloLens2
-
Microsoft Edge 44
-
Firefox Reality: Servo/1.0 Firefox/78
Oculus Goはもうサポート終了が近いからいいとして,HoloLens2...
(11/16追記) Goのブラウザは 10.12でChrome/86になっていた.