Zinnia hacks tomorrow. (2023/6)

2023/06/02 (Fri)

_ 今日はずっと雨らしい。台風が身のまわりに最も近付くのは明日のようだ。



=

_ 線状降水帯がわりと近所にあるようで、断続的に強烈な雨になっている。 ここ2時間くらいは北の方にずれていっているようで、綾瀬川が 氾濫のおそれがあるということで八潮で高齢者等避難の発令が。 これから夜明けまでかなりの勢いで降りつづけるようだ。

_ 家の庭も排水が追いつかず数cmほどの水溜まりになってしまっている。 風はさほど強くないようだ。


2023/06/03 (Sat)

_ スマホから警報が数回流れてきたりで何度も起こされたが、 警戒したほど風も強くなく、朝にはほぼ雨は止んでいた。ひとまず 身近なところではとくに問題はなさそうだった。横須賀の実家も とくになにもなかったらしい。たしかにアメッシュ見ていても 三浦半島はほとんど雨が降っていないように見えたしな


2023/06/04 (Sun)

_ 風はまだ強いものの天気はよさそうだったので自転車やら歩きやらで いろいろ体を動かした。


= カメラ

_ E-PM2とSuper-Multi-Coated Takumar 28mm F3.5 の組み合わせが快適すぎて 出番がかなり増えている。

_ 一方少し出番が減りぎみだったSuper-Takumar 55mm F1.8 は これまた少し出番が減っている EOS Kiss DX につけてみた。 絞り優先なら露出はカメラ任せにできるし、M42のマウントアダプタは チップがついているのでフォーカスエイドが動かないこともない。 とはいえもともとオートフォーカスが不調なのでフォーカスエイドもあまり あてにはならないようだが…

_ やはりまったくピントが合っていない写真が何枚か。肉眼では 問題ないと思ったんだが… 夕方になるとそういう写真が増えてきているので 肉眼ではある程度絞った状態じゃないとピントを 合わせることはできていないのかもしれない。 無限遠を通り越しているものと、やたら手前に来ているものがあるので やはり視力の限界なのだろう。

_ 夜はSuper-Takumar 55mm F1.8とE-PM2の組み合わせで散歩してみた。 E-PM2はわりと暗いところでもしっかり写ってくれるので、F1.8 の 1/40秒の 手持ちで撮影するとISO8000〜16000あたりでそこそこ綺麗に撮れていた。 12000を超えるとさすがにざらざらがきびしいが、10000前後までなら 全然よいと思えるくらいだ。フレアも楽しめるし夜の撮影も楽しいな。

_ smc PENTAX-DA L 1:4-5.8 55-300mm を買った。 見た目の状態も悪くないし、55mmはじまりというのはAPS-Cであれば とても扱いやすい画角で、もうこれ1本でいけるんじゃないかと 思えるほどだ。

_ キットレンズ版と単体販売版があり、それぞれスペックが異なるようだ。 もちろん後者の方がいろいろある…というよりはキットレンズはそこから いくつかの特徴を捨てたのだろう。マウントがプラスチックになって、 フードが別売になって、クイックシフト・フォーカスという、AF後に ピントリングまわしてフォーカスの微調整ができる機能もなくなっているらしい。 そして私が買ったのはキットレンズ版だった。コーティングや レンズ構成などには変化がないので、光学性能には影響がないだろう

_ 同じ店に片割れと思われる18-55mm もあったのだけど、そちらはさほど 状態がよいようには見えなかったのでスルーした。


2023/06/05 (Mon)

_ 今日は出社

_ 往路はわりと混んでいるのであれこれ広げて何かをするというのが 難しい。復路は空港始発を避ければほとんど混まないのでゆっくり 調べものをしたりドキュメント読んだりといったことができている。


2023/06/06 (Tue)

_ また久しぶりの更新になってしまった。 記録を残していなかったわけではなく、書きかけのエントリの加筆をいつまでも やらずにずるずると1ヶ月以上が経過してしまっていただけだった。 今回の更新で4/26の途中からアップされている。


= カメラ

_ smc PENTAX-DA L 1:4-5.8 55-300mm を試す。ボディはもちろん *ist DL2。 期待通りすばらしい使用感と写りだった。 花とかを撮るときにはD70とAF Nikkor 70-210mm が第一選択だったのだが、 今後は *ist DL2 の出番が増えそう。55mmはじまりというのがとてもよい。 300mm まで望遠できるのも便利だし、*ist DL2はISO800くらいなら 画質のペナルティがほとんどないように見える。玉ぼけも綺麗だ。 レンズは400g台でほどよい重量感。ボディも小型軽量なのに グリップ感がとてもよく、EOS Kissやα55Vに比べると 圧倒的に持ちやすくて使いやすい。よって最高の組み合わせに感じられる。 いやーうれしい

_ 最短撮影距離が1.4mなのであまり寄れないが、それでも距離を保って 300mmにすればかなり大きく写すことができる(最大撮影倍率は0.28倍)ので 花などを写すにはぴったりだ。 うるさいと言われていたオートフォーカスも、まあ確かに小さな音ではないけれど このくらいの音がするレンズは他にもたくさんあるので、 屋外で使っている限りでは私はとくに気にならなかった。

_ これまでいろいろなレンズに手を出してきたけど、 似たようなスペックで写りの違いを楽しむといったような欲求は今のところ あまりないようで、使いやすいものがひと揃えできたらわりと 満足してしまうらしい。そうなると35〜40mmはじまりのM4/3の望遠ズームレンズが あれば今の私にとってはそれが終着駅なのではないかという気がとてもする。 E-PM2を買おうとしていた1年半前は、ダブルレンズキットをずっと狙っていて 結局タイミングが合わず14-42だけのレンズキットを買ったので、 未だにM4/3の望遠ズームレンズというのは手にしたことがない。


2023/06/08 (Thu)

_ ちょっと事情があって前日から事務所でテレワークしていた。 湿度は高いものの室温はあまり上がらず過ごしやすい。

_ 私にはあまり懐いていないジェイクだが、いなければいないで 私のことを探しまわっていたらしい。断続的に、ほとんど夜通しそんな 調子だったので妻もジェイクも体調を崩したらしい…


2023/06/09 (Fri)


= カメラ

_ 雨雲が途切れた隙に公園をまわってみた。 Super-Multi-Coated Takumar 200mm F4 をまだ一度も試していなかったので EOS Kiss DX につけて持っていった。望遠なら多少はピントが合わせやすい はずなんだがやはり肉眼ではピントを掴みきれていないようだ。 動いている鳥などにピントを合わせるのは絶望的。

_ このレンズは絞り羽根に油がまわっているようで少し抵抗があるようだ。 今日は天気がよくなかったので開放しか使っていないし、 自動絞りをするわけではないのでそこまで問題ではないように思うが…

_ この時期はいろんな種類のアジサイと菖蒲が咲いているので一年で一番 カラフルだ。雨上がりは水滴も綺麗で写る色も濃くなっているような気がするので とても楽しい。

_ 望遠の単焦点というのはほとんど触る機会がないのでまだ馴染めない。 普段は50〜70mmくらいで、必要に応じてズーム、というような位置づけで 馴染んでいるだけであって、今日は200mmだけでいってみようというのは かなり覚悟が必要だ。フルサイズ換算100mm相当くらいまでなら、 そういう日もあっていいかなあ〜と思えるようにはなってきているので、 多少は望遠寄りには慣れてきているとは思うのだが


2023/06/10 (Sat)

_ 梅雨入りしたのかな? また明日から雨らしいので妻とジェイクと散歩に 出たりで過ごした。

_ ジェイクは単にテンションが低いだけなのか、どこか具合が悪いのか、どうも 元気がない気がする。おいしいおやつを見せると欲しがって追いかけてくるし、 そういうときの表情はいつも通りのジェイクなんだけど、ふとした拍子に 緩慢な動きになったり、冴えない表情をしたりしており心配だ。


= カメラ

_ *ist DL2 と smc PENTAX-DA L 1:4-5.8 55-300mm の組み合わせ。 今のところ快晴の日に巡り合っていないので青空とか雲などを写すことが できていない。

_ AFの性能がいまひとつなこともありとくに望遠側でピントを外していることが たまにあった。


2023/06/11 (Sun)


= プレゼン

_ わりと近所に安く借りられるホールがあるので 新入社員向けプレゼンを40分くらいやってくれないかという話が先月の22日にあった。 そういえばSDL-offももう長いことやっていないし、期間を決めて 出しものをするということをやってきていない。 会場おさえたのは7/7なので、話があった時点では1ヶ月半くらいの猶予があった。

_ 単にPowerPointでスライドを用意して発表するというのでは 自分が作り上げるものも、話す内容もだいたい即座に想定できるし、 完成→発表までにどういうプロセスを踏むのかも高精度に想定可能だと思う。 そしてできあがったスライドや発表内容は、いつもの私の話しているものから 大きく逸脱しない、こぢんまりとしたものになってしまうことも予想できる。 準備、発表時間ともにまとまった時間をもらえるわけだし、 せっかく新入社員向けに話をするのであればこちらも今までにやったことがないものに チャレンジするくらいのことはしないとな…!! という気持に。 テクノロジー関係の話というテーマをもらっていたので、 スライド自体がプレゼンのねた、という過去何度もやってきたものを 再度やってみることにした。

_ スライドがねた…といってもSPS2をやっていた頃からもう15年(!)くらい 経過しているわけだし、当時とは自身や周囲の状況も変わっているだろう。 Cで書いていた初代SPSや、C#で書いていたSPS2で断念したものの中で最も 大きいトピックはレンダリングにWeb技術を活用するというものだと思う。 当時に比べるとHTML5やWebGLなどもあるし、JavaScriptを中心とした ものたちもたくさんあるので、今度こそHTML5+CSS3をベースにしておきながら、 WebGLで3Dエフェクトもたくさん、というようなスライドが実現できるだろうと 考えた。

_ Webの技術を使いたいという点でいうと、これも2年くらい停滞している 動画編集の、とくにサブタイトルなどの加工に使おうとしたときに必要となるものと、 スライドを作るために必要となるものはかなり近いと思われるので、 このあたりの試行錯誤の過程で両方を一気に解決することも期待できると思う。

_ 他にも未知または不慣れな環境を使ってゆくという縛りを重ねてゆくことも 考えたが、本当に完成しない可能性もあるからむずかしいところだ。 TypeScript は導入のハードルがさほど高くないように見えるから これくらいはやるか…Tauriという Rust版Electronみたいなものがあるようで、これなら嫌でもRust触らなきゃいけなく なるので丁度いいかな…とも思ったが、撃退される可能性もあるし、そもそも 今回はあまりサーバサイドで何かをするという想定がないので、どれ使っても 大差ないような気もする。それならSAFE Stackをもっと触っておきたいという 気持の方が強いかもしれない。

_ PowerPointでは表現の難しい、丁寧なアニメーションや視線の誘導に役立つ トランジション、Webアプリならではの機能、たとえば会場限定で Webサーバにつなげてもらえばスライドを配信できます、とかニコ動風の コメントが流せます、とか、そういったものを盛り込むことができれば、 単に派手さを求めたわけではないということが伝わると思うし、 スライドの主旨であるテクノロジーへの対応についても多少は説得力がある感じで 表現できるのではないかと思う。

_ 他に思いついている要素がいくつかあるので並べておく。どの程度実現できるかは 分からないが…

_ まずPDFにもできるようにしたい。明暗の激しい変化は避けるようにしたいと 思いつつ、それなりに動きはあるので、そういうものを大画面で見ることに 慣れていない人や苦手な人は当然いると思うので、紙に出したスライドを 見るだけでもついてゆけるような構成にしたい。

_ Webサービスを用意する… というのは前述の通り。あとは3D系のエフェクトを きちんと対応して、さらに物理エンジンを組込むなどもねたとしてはやっておきたい。 Box2DはJavaScriptにも移植されているらしいし。あとはページセレクタなども きちんと実装したいところだ。


= スライドの構成

_ 普段ならFreeMindに書いて構成つくっていって、PowerPointに落とすという 流れになっており、そちらは慣れているので素早く正確にできるわけだが、 ならPowerPointでいいんじゃないかという気もちょっとするが、 アニメーションとか、凝ったことをする気にならないのでスライドは 画一的なものになりがちだ。箇条書と少しの表やスクリーンショット といった感じ

_ 今回はいろいろ勝手が違うし表現手法も異なるのでプロット的なものを 文章でまとめてみようと思う。

_ 大きな流れは、テクノロジーの進歩→原理原則→エンジニアの未来像、 というような感じだ。テクノロジーの進歩というのは、どのように 進歩してきたのかをタイムライン的に見せるのと、それによって 雇用にどのような変化をもたらしたのか、といった話を整理する。 「計算すること」が職業となり、競争力となっていた時代があり、 それが人手を離れても継続しているという構図、 それから「クラウド化する世界」で描かれた電力とクラウドの対比、 本質とは何か?みたいな話など。

_ 本質への理解は原理原則に還元する力につながり、今あるものでどのような 選択肢があってどういう点でメリット・デメリットがあるのかを見分ける力になる、 といったような話につづく。

_ そして昨今はとくに生成AIとよばれる分野で人間の職業を脅かすようなことに なっているが、そのような時代にエンジニアとして生きるというのは どういうことなのか、道具によって損われない部分として人間の価値は どこに生まれるのか、価値とはいわんが人間である以上考えなければ ならないことは何か、人間を相手にする仕事がAIにとってかわるのか、 残るものがあるのか? といった考察を経て、AIを道具として使いこなすための 人間のありかたを考える、みたいな大きな話をする…のか?

_ 最後に、使ったツールやフレームワーク、素材などをスタッフロール的にまとめて、 それを流しつつ質疑応答を受けて、時間があればボーナストラックとして スライドそのものの動機やテクノロジについての解説、自分にとってどういう チャンレンジだったのか、などを見せる、といった感じだろうか。 最近は時間は決まっているがその中で話す内容を決めていないといった タイプの発表ばかりなので、話が長くなる傾向があり、 今回のような形式で40分をどのように使ってゆくのかはまだ あまりイメージが沸いていない状態だ。


= 実現方法の考察

_ 今回あれこれと枠組を作るつもりでいるが、それ自体は仕事の外でも 使いたいので仕事にはせず、勤務時間中はそうやって作っておいた 枠組を用いたスライドの作成に専念し、そこで生まれたアイディアを 勤務外の取組にフィードバックしてゆく、というイテレーションにするつもりだ。

_ 過去に動画編集のほうであれこれ調べたり試した結果、 ShotCutで各フレームごとにちょっかいを出す手順はひとまず確立しているが、 やはりHTML5とCSS3を積極的に使ってゆきたいというところで手が止まっている。 今回の取組によって html5-animation-video-renderer みたいなアプローチと組み合わせることでフレームごとにHTML5と 合成させるという手立ては作れそうだ。 WebView2とかCEFなどがLinuxでheadlessで動く日を待っていたが、 どちらかというと Puppeteer や それのベースになっている Chrome DevTools Protocol (CDP) を追及したほうが 筋がよいような気がしてきている。Puppeteer は実現方法が異なるものの Selenium と カバーしている領域がとても近いので、Puppeterひとつでいろいろ 応用が効いてよい…のかもしれない。ただせっかくWebDriverみたいなものが できているのだから、そっちはそっちでなくなってほしくないなあと思う。 まあRPA用途だとなくなることはないのかな

_ なおPuppeteerよりも後発の Playwright の 人気もあるらしい。Puppeteerのforkらしいけど、Microsoftが 主導でやっているように見える。ということはRPAもこっち方面で 実現したいとかそういう思いがあるのだろうか? Playwright for .NET があるのでF#からも扱いやすそう。

_ スライドの実現方法について。WebGLだけにしてしまうとテキストなどの レンダリングを自力でやらなければいけない。これだとHTML5のよさを 生かしていないので、基本はHTML5+CSS3で書いておいて、それをWebGLで動かす、 なんてことができればよいのだが、現実的な方法が思いついていない。 canvas をWebGLのテクスチャにする方法はあるようだけど、 HTML5をcanvasに持ってくるのは html2canvas くらいしか方法が見当たらない。 html2canvasは中でブラウザを実装しているようなものみたいなので、 その努力と再現性はすばらしいと思いつつ、行や文字ごとにテクスチャを作る… みたいなことをするにはいくらなんでもオーバースペックだろう。

_ …と思っていたが、 ページ全体をキャプチャして、各要素に対応する座標がとれれば1枚テクスチャで 全部表示できるということに気付いた。これならいけるかもしれない。 getBoundingClientRect() と window.page[XY]Offset を組み合わせると 位置はとれるようだ。ただelementの位置なので文字ごとの位置はとれないし、 文字ごとの位置がとれてもリガチャーなどを考えれば領域が重なることも あるだろう。文字ごとの位置が必要ならBLRみたいに1文字ずつ spanで囲んでしまえばよいかもしれない。 領域が重なっていたらそれを1つの領域としてあつかうこともひとつの 手かもしれない。しかしこれをリアルタイムで実行できるものなのだろうか? ひとまず実験だな

_ ICS という会社の技術記事は 私がやろうとしていることの多くをカバーしているし非常に分かりやすいしで貴重だ。

_ View Transitions API というのがあるのか。この会社の記事はひと通り読みこんでおいたほうが よさそうだ。少なくともここ2~3年のものは試行錯誤するよりも有用な気がする。

_ ひとまずHTML5+CSS3でレンダリングしたページの各文字をbounding box的に 解析できるようにするところから着手だろうか。それができればhtml2canvas経由で WebGLに持ってゆくこともできるし、双方が得意なところをそれぞれで 実現してゆくということができると思う。なおcanvsを複数重ねてWebGLや canvas2dなどを重ねて表示するなんていう手法もあるらしい。

_ 最終的にはフレーム番号を与えられたらそれに対応するラスターデータを 返すようになることが目標だけど、そのときに使えなくなってしまう技術 (アニメーション系)が多いので、まずは望む見た目やインタラクションを 実現してから、必要に応じて置き換えてゆくようなアプローチがよいかなと思う。


= Three.js

_ ドキュメントが充実している。WebGLを直接いじるか、こういうものの力を 借りるかで悩むが、OpenGL系もたまに触っては長い時間放置…みたいなことを 繰り返していてあまり進歩がないので、準備期間の大部分をWebGLを飼いならすのに 消費するなんてことにもなりかねないから、やはりThree.jsの力を借りたほうが いいかなという気がしている。


= vector / raster

_ ラスターイメージは canvas 自体がけっこうやってくれそうに見える。 Path や Shader は… Pathはある。SVGからPathを作ることもできるらしい。 Shaderなしでもgradientやshadowができるようだ。これはお手軽

_ で、Shaderはないように見える。クリッピングやcompositがあるので そちらでカバーできる範囲もあるだろう。


= bounding box

_ spanを挿入して、getBoundingClientRect で rect とってきて、 重ねておいたcanvasに矩形を表示させるところまでできた。 span挿入はPoorman's BLRでやっているものがそのまま使えるのだが、 canvasに描画するあたりで少し詰まった。スタイルシートでサイズを 指定するというのができないらしいので、 JavaScriptで直接widthとheightをセットするようにしなければいけないようだ。

_ 座標がとれるようになったので、 html2canvas でラスタイメージとれればそのままテクスチャにできるし、WebGLに持ってゆくのもすぐだろう。


2023/06/12 (Mon)


= プレゼン

_ webpack の学習をした。 TypeScriptのコンパイルも通すような 設定ができるようになったのでひと段落

_ しかしビルドが遅い。まだ空っぽに近いプロジェクトで5秒くらいかかる。 逆にでかいプロジェクトになってもそこまでかからない… ?ならいいんだが

_ JavaScriptの手軽さを超えるメリットが出てくるのはどのくらいの 規模からなんだろう。

_ 昨日あれこれ考えて、ひとまず超えるべき関門が定められてきたので以下に 箇条書しておく。かならずしも順番は一定ではない


= Perspective

_ gluPerspective 的な指定しかできない環境で glFrustum に相当する 指定をするためにはどうすればいいのか? もちろん計算すればよい (gluPerspectiveは内部で計算してglFrustumを呼んでいるのだから、 その逆をすればよい) のだが、どういう変換になるのか?

void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);
quaternion での表現は Microsoftのドキュメント に載っている。 行列はKhronosにもあった。 glOrthoglFrustumgluPerspective

_ SPS2ではどういう指定をしていたのかを確認。 SDLのEnter2DMode をほとんどそのまま使っているようだ。 原点を中心にしたかったので、 -width/2 ~ width/2、-height/2 ~ height/2 で、 nearが1.0fでfarが10.0f。その後 translate (0.0f, 0.0f, -3.0f) した 後に scale(3.0f, 3.0f, 1.0f) をしている。LookAtは呼んでいない。

_ OpenGLの場合カメラの初期位置は原点で、Z軸マイナスの方を向いているらしいので、 -3.0f に移動させてそこに配置させ、3.0f倍して表示することで原寸にしている ようだ。このあたりは拡大縮小をどうにか実現したくて試行錯誤した可能性が高い。 オリジナルは glOrtho してるだけだ。Orthoならどこに表示しても大きさ 一緒なのでこれでいいのだろう。

_ AOSP の中に gluPerspective から glFrustum を呼んでいるコードが 見つかった。 なのでこの逆をやればいいのだろう。中心が原点であるという仮定になるが 比較的シンプルな式になるようだ。fovyが90度だとtanは1になるので、 top と zNear はイコールになりシンプルでよさそう。 aspect は簡単に求められるし、zNearとzFarはそのまま渡せばよいということに。

_ ひとまずこの仮説が正しいか試してみよう。画面全体のcanvasに2Dと3Dで それぞれドット指定して位置が一致(洒落)すればいいのだろう。

function newFrustumCamera(width: number, height: number, zNear: number, zFar: number): THREE.PerspectiveCamera {
  const aspect = - width / height
  const fovy = Math.atan((-height / 2.0) / zNear) * 360.0 / Math.PI
  return new THREE.PerspectiveCamera(fovy, aspect, zNear, zFar)
}
これでひとまずdot-by-dotの表示ができそうな感じだ。 矩形しか表示してないので上下左右裏表が問題ないかは確認できていないが

_ 今までまったく意識していなかったが視野角はzNearに依存するらしい。 って定義考えれば当たり前なんだが、あまりに視野角が広すぎるとZ方向の 移動に対して不自然に見えてしまうことになる。あとzNearよりも 前に持ってくることでさらに拡大…ということはできない。 クリップされてしまうからな

_ 少し時間を置いて考えてみたが、上記の関数でzNearをそのまま使っているから zNearより近いところに置くと見えないというだけで、zNearよりも後ろで dot-by-dotになるような視体積を設定すればいいだけの話だった。 試してみたところわりと良好な結果に

_ こうなってくると視野角をきちんと定めつつdot-by-dotの場所を動かす といった対応の方が自然な見た目を追及しやすいのかもしれない。 今までこのあたりは天下り的にやっていたのできちんと理解できれば応用も 考えられるということか。 あと、本当に奥行きに依存せずに2Dに特化したければOrthoでやる方が安定するとは思われる。

_ …fovを指定しつつ視体積の真中あたりでdot-by-dotにできそうなロジックを書いた。

function newFrustumCamera2(width: number, height: number, fovy: number, zDepth: number): THREE.PerspectiveCamera {
  const aspect = - width / height
  const zZero = (height / 2.0) / Math.tan(fovy * Math.PI / 360)
  const camera = new THREE.PerspectiveCamera(-fovy, aspect, 1, zZero + zDepth)
  camera.position.set(0, 0, zZero)
  return camera
}
z = 0 に置けば原寸大となるような設定にしたつもり。使いやすいのかどうかはいまひとつ分からないが…


2023/06/13 (Tue)


= スライド

_ 昨日一生懸命考えたPerspectiveづくりについて、 【Three.js】スクロールでぐにゃぐにゃする画像を実装する にほとんど同じロジックが実装されていることを発見してしまった。 ちょうどいい距離 (dist) を計算してそこにカメラのZ軸を移動させるところまで 同じだった。まあ独力で導き出すことはどちらにしても必要だっただろう…

_ 昨日まわった結果以下のようなサイトがとても役に立ちそうだと思っている。

React は近日中にやらなければいけないので React Three Fiber はよいとっかかりになるかもしれない。


= XR (VR/AR/MR)

_ WebGL系はXRとの親和性も高いというのは今後見逃せない点かもしれない。 drikinさんが瀬戸さんとの対談で VRChat を 激賞していて、少なくとも知らないままでいていいわけではないという点で いろいろ説得力のある話だと思った。一方 Second Life は… 経済を築くという点では先行しているしオワコンというわけでもないのだろうか? (少し眺めた後) やっぱり終わっていたらしい。


= html2canvas

_ 似たようなソリューションは 他にも dom-to-image などがあるらしい。 dom-to-image は SVG内にHTMLを描画させるという技術を使っており、 ブラウザ内の再現性は高そうに見えるが、一方で外部リソースなどは 一切使えないのでそのあたりの手当が大変らしい。 html2canvas は内部でレンダリングしているのでそういう制限はないようだ。

_ npm install html2canvas してみたところ、まとめられたjsの中には html2canvasが入ったんだが、TypeScriptでimportができないので コンパイルが通らない。 Three.js はできているのに、なんでだろう? webpackの基本を理解していないのでこういうことになりがちだ。

_ Module Resolution を見る限りではきちんと 検索可能なパスにいそうな気がするんだが… tsc に --traceResolution というのを つけると検索状況を出力してくれるらしい。のだがwebpackでどう指定すればいいのか

_ tsconfig.json に `"traceResolution": true` を入れればいいようだ。

======== Resolving module 'html2canvas' from 'C:/local/webpacktest/src/index.ts'. ========
Module resolution kind is not specified, using 'Classic'.
File 'C:/local/webpacktest/src/html2canvas.ts' does not exist.
File 'C:/local/webpacktest/src/html2canvas.tsx' does not exist.
File 'C:/local/webpacktest/src/html2canvas.d.ts' does not exist.
File 'C:/local/webpacktest/html2canvas.ts' does not exist.
File 'C:/local/webpacktest/html2canvas.tsx' does not exist.
File 'C:/local/webpacktest/html2canvas.d.ts' does not exist.
File 'C:/local/html2canvas.ts' does not exist.
File 'C:/local/html2canvas.tsx' does not exist.
File 'C:/local/html2canvas.d.ts' does not exist.
File 'C:/html2canvas.ts' does not exist.
File 'C:/html2canvas.tsx' does not exist.
File 'C:/html2canvas.d.ts' does not exist.
Directory 'C:/local/webpacktest/src/node_modules' does not exist, skipping all lookups in it.
File 'C:/local/webpacktest/node_modules/@types/html2canvas.d.ts' does not exist.
Directory 'C:/local/node_modules' does not exist, skipping all lookups in it.
Directory 'C:/node_modules' does not exist, skipping all lookups in it.
File 'C:/local/webpacktest/src/html2canvas.js' does not exist.
File 'C:/local/webpacktest/src/html2canvas.jsx' does not exist.
File 'C:/local/webpacktest/html2canvas.js' does not exist.
File 'C:/local/webpacktest/html2canvas.jsx' does not exist.
File 'C:/local/html2canvas.js' does not exist.
File 'C:/local/html2canvas.jsx' does not exist.
File 'C:/html2canvas.js' does not exist.
File 'C:/html2canvas.jsx' does not exist.
======== Module name 'html2canvas' was not resolved. ========
んー探して欲しいのは c:/local/webpacktest/node_modules/html2canvas/ なんだけど、そっちは見に行ってくれていないようだ。 Module Resolution のページに書かれているのと違うじゃないか… と思ったが、Strategy に Classic と Node というのがあるらしいということに 気付いた。 tsconfig.json に "moduleResolution": "node" を指定したらいろいろ進んだ。

_ JSだとoptionに適当にobject渡していればよかったのだが、 html2canvas ではそこが Partial<Options> というのになっていて、 Options という choice type のPartialになっているらしい。Partialってなんだ

_ なるほど、 全部optionになるような感じらしい。 それにしてもTypeScriptはlearn.microsoft.com にドキュメントないのだろうか?

_ …ひとまずできた。

await html2canvas(document.querySelector("body") as HTMLBodyElement,
{
  canvas: document.querySelector("#Canvas2d") as HTMLCanvasElement
})
7shiさんが 書いてる ように上にちょっと空白ができる。 それにしても 7shi さんは私の関心のある領域の一歩先につねにいるような 感じがする。この感覚はもう10年以上続いている… すごい人だが不思議な人ではある。

_ 余白ができるだけでなく、アンダーラインの位置なども微妙に変わるようだ。 まあレンダラが違うのだから完全一致というのは難しいのだろう… Firefox の開発ツールだとcanvasのプレビューを表示してくれるんだが、 Chromeにはないらしい。

_ ともあれこれで1枚canvasを入手できたので、これをテクスチャにすることで いろいろ楽しめるだろう。ずれているのは、ずれていると分かっていれば オフセットつければいいだけなのであまり大きな問題ではない。↑ のコードでは 実在するcanvasに描画させているが、指定しなければcanvasを作ってくれるので、 オフスクリーンレンダリングもOKだろう。

_ 3D関係で調査などを必要としていた部分がだいぶ進捗したので、 そろそろ1つにまとめてあれこれ試行錯誤ができる状態にしてよい気がする。 あとそろそろrepositoryの整備もしたほうがよさそうだ。実験と枠組の構築と、 コンテンツの構築、の都合3つだろう

_ 1枚テクスチャとるならCDPを使うという手もあるだろうか。 その場合はNode側で保存しておいてダウンロードということになるのかな。 ただこれなら完全に見た目通りのものがとれると思われる。

_ 要素技術で足りていないのはあとはcanvas→Three.jsのテクスチャ化と、 PDF化といったあたりだろうか。 jsPDF というのが あるらしいのでそこからだろうか

_ CanvasTexture というのがあるようだ。canvasと同期とれそうに見える。 となると3Dにしたものをさらにテクスチャ化することもできるのだろう


= スライド ふたたび

_ 先日ナイツ塙のチャンネルで伊集院が言っていた、言いたいことを簡潔な 文章でまとめておいて、そこから各種修飾をしてボリュームを調整するという 話に感銘を受けたので、私も今回の発表で端的に言いたいことを まとめておくことにしたい。

_ 自分の存在の大きさと限界を知る、かな? 自分を通してしか理解できないし、 だから経験などが豊富な方がよい。一方で限界もある。といった筋の話。 もっと削ぎ落とすなら「自分の存在を知る」になるだろうか。 それどういう意味?という点でも掴みがあるかもしれない。 そしてこの手法はFreeMindと親和性が高いとも思う。


= 歯医者

_ 治療はつづく。今日は土台づくりと型どりだったらしい。 歯茎を削るものなのかチクチクと痛い。歯を削るときのように あと1nanosecも耐えられないですということはまったくなく、単に 不快な痛みという程度なのだがそれなりに出血はしたようだ。 夜まで血の味がおさまらなかった


= カメラ

_ 久しぶりに晴れ間が見えたので *ist DL2 と smc PENTAX-DA L 1:4-5.8 55-300mm の組み合わせを持ち出した。 雲多めの大好きな景色なので堪能した…が、空と雲を写すならもっと広角の 方が楽しいと思えるのでむずかしいところではある。


2023/06/15 (Thu)


= カメラ

_ ハードオフに寄ったら4/3のレンズを2つ見つけた。 ひとつは40-150mmので中古3300円と安くも高くもないので見送り。 35mmマクロは思わず買ってしまった。使えるボディないのに

_ あとミラー脱落ジャンクのEOS 5Dが3300円だった。 あれは買っておいてもよかったような気がしている。 来週まで売れ残っていたら買うか… というと大抵売り切れているんだが


= WebGL関係

_ 昨日は休みだったのだが特に何もしなかった。

_ アニメーション、エフェクト、トランジション等をあれこれ試すために UIやらを整備したテストベッドを作りたい。その中で試したものを フレームワークに組み込んでゆくなど。これでrepositoryの責任分担も やりやすくなるだろう。


= jsPDF

_ 電車移動中に試してみる。 HTMLから直接PDFというのも できる らしい。 内部でhtml2canvasを呼んでいるようだ。

_ 別のサイトにあったサンプルでは html2canvas で手に入れたcanvasから PNGを手に入れてそれをPDF化しているなんていう首をかしげる対応をしていたが、 ↑の方法だときちんとcanvasを直接PDF化してくれているようで文字の コピペなどもできる。ただ用紙サイズの指定等ができていないので ページにおさまるようなサイズの指定というのができていないし、 あとフォントを指定しないと化け化けになってしまうようだ。 スライドのフォントと合わせたいところなのでこのあたりの整理も必要そうだ。


= WebUSB

_ CCID使えないかな、と思ったら制限されているらしい。

_ 読みごたえのある スライド があった。

_ jbirkholz / webusbAuth という試みもあるようだが、 やはり動かなくなっているらしい。WebAuthnは別途APIが作られた らしい

_ API っていっぱいあるんだな


= 小さいタスク

_ 移動中でもできそうな小さなタスクを考える。


= Deck.js

_ repository。 けっこう前に更新が止まっているようだ。

_ div に deck-container というクラスをつけて、 その中で section を入れてゆくらしい。 section には slide というクラスを つけていて、そのクラスでとってきた配列を渡して遷移という感じのようだ。


= Impress.js

_ repository。 最近も更新があるようだ。デモスライドがおしゃれだ

_ 発表者画面があるのはよい。トランジションは3D配置の移動がメインなのかな

_ トランジションは今回は自力で(も)やりたいので、このあたりは要検討

_ stepクラス間を遷移するらしい。遷移先が複数持てるようだ。 これ以前流行したやつだが…私はそんなに好きじゃない


= WebSlides

_ article の中の section がスライドらしい。

_ 遷移をこういうのに任せる気がないならよいCSSフレームワークを 採用したほうがいい気がしてきた。明日はそのあたりの評価からだろうか


2023/06/16 (Fri)


= CSS

_ スライド系のフレームワークのスタイル指定をどうやっているのかを眺めてみる。

_ WebSlidesを見てみたところ段組表示なのにliで作っており、 デバッグツールで見ると「フレックスコンテナー」のアイテムとして 構成されているらしいと知った。フレックスコンテナーとは何か?

_ Flex Box Module というものらしい。 Androidのあれに似ているな

_ CSSまわりは独立したねたとして研究しようと思う。


= 稲妻エフェクト

_ 今回は背景が明るめの想定なので稲妻エフェクトが有効に働くかは疑問だけど…

_ 【Unity VFX】魔法陣 + 落雷エフェクト 解説。考えかたはとても勉強になった。 セルルック調の3D雷エフェクトの作り方~素材編~ も。

_ How to Generate Shockingly Good 2D Lightning Effects。 これはXNAなのでC#で書かれていてわかりやすかった。

_ Lightning Generator と、 ここから辿れるコンテントはflash時代のAction Scriptで書かれていて親しみやすい。いろんな物理現象っぽいエフェクトなどが勉強できそうだ。

_ nVidiaのスライド(pdf)

_ 【three.js】を使用したかっこいいWebGLスニペットまとめ


= CSS Framework

_ 【2023年トレンド】おすすめのCSSフレームワーク40選!効率的にデザイン作成をおすすめのCSSフレームワーク39選|メリットやデメリットも紹介など。 それはもう選んで勧めていると言っていいのだろうか

_ Awesome CSS Frameworks を見ながら考える。 Tailwind CSS を見てみたのだが、 クラス等を駆使して一貫性のある見た目を構築するというCSS本来の 目的に逆行しているんじゃないかという印象を抱いた。 クラスを元にスタイルを「ビルド」するという実現方法も、 いけてない印象を受けた。が、 ユーティリティーファーストとTailwind CSSのススメ というのを読んで、 コンポーネントとして一貫性を求めるのであれば、 CSS単体でのコンポーネント性はあまり重要ではないというのは 一理あるかなと思えてきた。そう言われてみればスタイルとそれを構成する HTMLが分離されている必然性はかならずしもないような、そうでもないような

_ 少なくともスライドのようなstaticなページでこれを使うメリットは あまり思い浮かばなかったが、コンポーネントの利用を前提とした場合には 考慮に値すると思った。

_ 次に Pure.css。これは以前 使った記憶がある。JS不要だしスタイルに特化するという点ではよいのかもしれない。

_ Bulma は SAFE Stack の中で Fulma を使っていたので 名前は知っている。 このあたりをやっているうちにいろいろつながって くるかもしれない。 Bulma も CSS Only らしいしわりとシンプルのように見える。 やめた人の記述 もあった。 説得力あると思う。4年前の話らしいが今でも生きている話なのかは分からない。

_ そういえば CSS Modules という用語もあった気がする。

_ スライドのようなレイアウトに合うのはやはりFlexBoxを ベースにしているものがよさそうに見える。 そしてUIを作りこむわけではないのでそのあたりは別に使わない。 となると小さいものでも十分な気がする。あるいはプレゼン向けのフレームワークのCSSだけを使うとか


2023/06/18 (Sun)


= スライド要素

_ 地図と連動というのもやってみたいのだった。 beatmania IIDX DJTroopersのMilitary Splashみたいに 地形が動きながら場所を示すといったようなもの。 ただ会場がオンラインかどうかは分からないので リアルタイムにコンテントを取得するというのはむずかしいかもしれない。 オフラインでやるにはどうすればいいのだろう。あまり 重たいのは避けたい気分だが…

_ タイムラインも、アニメーションしつつ動かすということをしてゆく 必要がある。以前作ったものを ベースにしてもいいのだが、WebGLで実装するのもひとつの手かもしれないと 思っている。スタッフロール的な動きをしつつインタラクティブに流すことも できるといった制御をしようと思うと結局ある程度自分で作るほかないのかもしれない。


= Three.js

_ マウスドラッグでカメラを動かすモジュール (OrbitControl) を組み込んだ。

_ FPSカウンタは Stats.js というのが定番らしい。これも組み込んだ。


= 昼休み

_ を早目にとって11時前にハードオフに行ってみた。残念ながらというか予想通りというか、ミラー脱落の5Dは売れてしまっていた。3日も経過しているんだから当然なんだろう。がっかりしたが、躊躇ったら出会いはそこで終了なんだということを改めて思い知った。買わない理由はなかったなーと今にして思ったり、どうせ他にも問題があってまともに動かなかったんだろうなどとイソップ寓話のようなことを思ったりするので、躊躇うとろくなことがない


= モジュール化

_ Node のモジュールとして作っておいて、スライド側のrepositoryでそれを参照するようにする、というのがよいだろうか。


= JavaScriptのセミコロン

_ ちょっと誤解していたがASI(Auto Semicolon Insertion) という機能が働いているだけで、言語としてはセミコロンが文の区切として生きているという話は変わっていないらしい。

_ 文の終わりなのか、文の区切なのか?というと、JavaScriptは前者なので、本来文の終わりはセミコロンが必要であって、ないものはASIのルールに従って挿入されているに過ぎない、らしい。

_ ASIによって書き手にとって予期しない振舞いをすることもあるようだし、文末がセミコロンであるならそれがあったりなかったりする不統一は見栄えもよくないだろう。ということで今後はセミコロンをかならずつけるようにしようかなと思う。


= Three.jsと入力

_ マウスやキーボード、ゲームパッドなどを扱うにはどうすればいいか?

_ Three.js Examples にいろんなサンプルがある。公式のものよりシンプルなものが多いので便利かもしれない。

_ 同時に見ていた Three.js 3D Game Tutorial: In-Depth Course for All Levels でちょうどキー入力をあつかいだした。普通にwindowの "keydown" イベントをとってきているな

_ CSS3DRenderer というのがあるらしい。

_ CSS3DRendererでくるくる回せる画像一覧ページ作成。勉強になる


= UI

_ THREE.js でちょっとしたパラメータをいじる共通のUIフレームワークがあるようなので調べてみた。もともとは dat.gui というものだったらしいが最近は lil-gui に変わったらしい。


= 地図・または地形

_ Craft MAP。ラスターイメージでしか取得できない?

_ 立体地図(地理院地図3D・触地図) から辿れる 地理院地図Globe トップページ から 3Dデータが拾えるようだが… 基盤地図情報ダウンロードサービス というのもあるらしい。


= エフェクト

_ クロスフェードのサンプル は、テクスチャの違いだけで複数種類をサポートしているように見える。


= 組み込み

_ html2canvas した後にWebGLのコンテキストを作ることができない。「 A WebGL context could not be created. Reason: Canvas has an existing context of a different type」 だそうだ。html2canvasで読み書きするものと、WebGLで読み書きするもので階層を分けているんだが…

_ そもそもgetContext で手に入れたcontextをreleaseする方法が分からない。

_ 先にWebGLのコンテキストを作っておくしかないのだろうか? それならうまく動くようだ


= UV Mapping

_ 自分で頂点作ってるときはテクスチャ座標を与えるなんてさほど難しい話ではないが、Three.js ではあまりドキュメントがない気がする。

_ Three.jsテクスチャの部分切り抜きや回転・反転・伸縮 (UVマッピング) や、 【Three.js】UVマッピングによる平面ジオメトリのアニメーション操作(テクスチャーの入れ替え) などを参考にすればいいのだろうか

_ ↑のへんで紹介されている faceVertexUvs というのは見当たらないな。

_ Texture の offset と repeat を指定すればできそうな気がしつつ、これはgeometryとかmeshに与えられなければその数だけTextureが必要になるということでもあるのでは…

_ ひとまず offset と repeat にそれっぽい座標を与えれば表示できそうであることは分かった。が、上下反転しているのでこのままでは使えない。 flipY というそれっぽいプロパティがあるのだが効いていないようだ。 html2canvas かその後の段階で上下反転させるのがいいのだろう。


= 上下反転

_ html2canvas をする前に

ctx?.translate(0, height)
ctx?.scale(1, -1)
しておけばよいようだ。楽ちん


= 位置合わせ

_ だいぶそれっぽくなってきたが、まだまだ位置が合ってない。 html2canvas 時にマージンとられているのも問題だし、他にも問題がありそうな感じがする。

_ その後もあれこれと試して、だいたい期待通りの位置に表示できるようになった。getBoundingClientRect を使っているので、リンクのアンダーラインなどを含めた位置はとれないように見える。CSSで影を指定している場合などにも期待したサイズがとれないかもしれない。

_ 下の方になんかごみ?があるようだがまあいじっているうちに解決するだろう。 html2canvas でとってきたときに範囲外は黒になっているようなのだが、そこを使ってしまっているらしい。ただ場所によってその幅というか高さが変わっているのはなんでだろう?


2023/06/19 (Mon)

_ 7/7当日まであと20日を切ってしまった。見栄えはともかくとしてまずスライドを形にしてしまったほうがよい気がする。


= スライドフレームワーク

_ あらためて分析のつづきをする。

_ Deck.js は、 slide というクラスを集めてきて遷移するというシンプルなもの。 slideクラスはネストができて、ページ内の遷移はそれでやるらしい。ページ内遷移といいつつそれもページとして管理されているので、ページ内で5段階の遷移をしたら5ページとしてあつかわれるように見える。これはこれでシンプルで分かりやすい。

_ やはりWebSlidesがスライドのスタイルとして必要十分な感じがするのでこれでいいかなという気がする。拡張もそんなに難しくなさそうだし


= CSSフレームワーク

_ Pure.css を眺めた。グリッドの考えかたは分かりやすい。

_ Bulma は、 Pure.css よりもad-hocな感じを受けてしまうが、practical ではあるのかもしれない。

_ CSSフレームワークとして見た場合のWebSlidesは、これはこれでシンプルで分かりやすい。


= WebSlides

_ 開発ツールで見ると article に 「スクロール」というラベルがついており、現在表示されているsectionが先頭になって、次のページに行くときに最後にまわる、という動きをしているようだ。

_ このへんだろうか→ CSS オーバーフロー要素のはみ出し(オーバーフロー)。 webslides.js の scrollTransitionToSlide_ あたりが スライド間のトランジションをしているらしい。


= HTML...

_ あとはスライド自体をHTMLで書くかどうかだが… WebSlidesを見てもシンプルなマークアップになっているけど、やはり根本的に属性が多数あって階層を持ったHTMLは目に優しいとは思えない。


2023/06/20 (Tue)


= 発表

_ 7/7の16:25~ の60分らしい。60分!? もともと40分と聞いていたのだが

_ 音出しもできるかもしれないらしい。音が出ないかもしれないということで音のことはあまり意識していなかったんだが、出るとなれば少し工夫してみたい気持もある。

_ ひとまずスライドを起こしていって形をきちんとしたほうがよいかな…構成も時間も見えないままだと準備が進んでいるのかどうかも分かりづらい


= スタッフロールなど

_ CSSだけでもかなりのことができそうに思える。WebGLと組み合わせるときにどっちをメインにするのかはまだ悩んでいる。少し作ってみればまた見えてくることもあるのだろうけど

_ ひとまずWebSlidesベースで作ってみるかな… 置き換えてゆくのは後でもよいわけだし


= WebSlides

_ npm install を試みる。 deprecated だらけだな … そして失敗した。

npm ERR! gyp verb check python checking for Python executable "python2" in the PATH
npm ERR! gyp verb `which` failed Error: not found: python2
なんでPython? まあスライド作るだけならNodeの中でなくても問題ないので、ひとまず余計なことは考えずにスライド作ってみるか

_ ただHTMLを直接書くのはなあ… と早速余計なことを考えだしてしまうのだが

_ ともかく書き始めた… が、やはり勝手が違うせいであれこれ余計なことを考えてしまう。以前の「身を浄めるためのパワポ」を再度試してみるべきだろうか。発表のタイトルも決めなきゃいけないしなあ

_ 形を作っている間にあれこれとアイディアが生まれてくると思うので、まずは発表の大枠を掴むためにも慣れた環境で作ってみるというのがよいと思えてきた。


= View Transitions API

_ ドキュメントを眺めた限りでは、遷移前の状態はDOMのスナップショットをとって処理しているような記述になっていた。html2canvasはすごいと思うんだが、View Transitions API はポータブルな方法で用意されているのだから、これをうまく流用できればもうちょっと楽に対応できそうな気がしないでもない。まあ背景を透明でレンダリングしておいて文字だけのテクスチャを手に入れるといったことは html2canvas じゃないとできないような気もするが…


2023/06/21 (Wed)


= React.js

_ 評価開始した。 JSXが嫌で嫌で…と思っていたがまあなんだかんだで便利なのかもしれない。


= Puppeteer

_ 評価してみた。使いかたは難しくない…はずなのだが、うまくいったりいかなかったりする。内部エラーが起きているように見えるんだが、それが使いかたが悪いせいなのか、何らかの不具合を踏んでいるのかがいまひとつ分からない。


2023/06/22 (Thu)

_ いらいらする話が多い。組織の権限やら責任やら、職能やら役職やらに 絡んだあまり面白くもない話の、グレーなところに無神経に踏み込んで くるような話。お前はその無邪気で傲慢な言動をするために何か実績を挙げて 根まわしをしたのかと


= スライド

_ まずパワポづくりから。 あまりまとまりがなくて手がうまく動かない。が、 これはひとまず形にすることで身を浄めることを目的としたものなのでこれで問題ないのだろう。


2023/06/25 (Sun)


= Rogan

_ 自分の肘のあたりを状態を見ようとするとなんだかぼやけてよく見えない… というのがここ数年続いており、ふとした拍子に眼鏡を外して見てみたら くっきりと見えて、ああ細かい文字を見るときに眼鏡外して近づけて見ようとしている 先達の方々はこういう感覚だったのか…ということをようやく悟った。


2023/06/26 (Mon)


= スライド

_ 残り2週間を切った。いまひとつ進みがよくない。

_ PowerPointのスライドはひとまず殴り書きしてみた。まとまり、つながりがないし、ポイントも絞れていないが、それでもいったん形にしたのはよいことだと思う。


= Box2d

_ 基礎のトライアルは続いているが、パワポっぽい表示ができるだけではさすがにねたとして成立しないので、まず大ねたのBox2dをおさめておくことにする。先に鉄板ねたを片付けておいて気分を楽にしたい…

_ 今Box2dをWebで使おうと思ったらどのパッケージがいいのだろうか

_ Node だと @box2d/core これらしい。 repository は @box2d Monorepository と、その中で使われている erincatto / box2d らしい。 他にも…

などがある。SourceForgeのやつ (Box2DJS) はいくらなんでも古すぎるだろう。 一番上のは1ファイルで済むようだ。

_ ひとまず hecht-software / box2dweb を試すことにする。 demo.html はなぜか外部のJSをとりに行っていたので動かなかったが、そこを修正したら普通に動いた。

_ 先週までにページの中身を1枚テクスチャにしてレンダリング、というところまでできているので、これを組み合わせることで物理エンジンの配下に置くことができるだろう。Box2dの使いかたを思い出しつつ実装してみる。

_ TypeScriptから利用できない。

[tsl] ERROR in C:\local\webpacktest\src\index.ts(7,24)
TS7016: Could not find a declaration file for module './Box2D.js'. 'C:\local\webpacktest\src\Box2D.js' implicitly has an 'any' type.
Strictにしているとこうなるらしい。ひとまず 「//@ts-ignore」 コメントをつけた。

_ 「document.querySelectorAll」 で手に入るのは NodeListOf<Element> というものらしく、こいつには forEach くらいしか実装されていない。 Array.prototype.map を呼ぶ (.call) とmap ができるんだが、 手に入るのが unknown[] となっており思い通りの型になってくれていない。

_ そもそもTypeScriptにはシーケンスがないのだろうか? 軽く見た限りではないらしい。

_ … unknown[] を自分の想定する型にキャストするしかないのかな。ひとまずそうした。ひとまずこれで文字を初期設定してから、次フレーム以降も必要な情報として保持するというロジックが書けたので、あとはBox2dに位置と角度を計算してもらえばよい。

_ 等速運動をさせてみたが輪郭部分に少しちらつきを覚える。ダブルバッファリングじゃないのか?


2023/06/27 (Tue)


= Tlog

_ 今日はそこまで日射しが強いわけではなかったと思うんだが妙に蒸し暑く、 室温も29℃を超えてしまってなかなか下げることができなかった。


= 歯医者

_ 別の歯の治療に入った。前回ほどではないが麻酔の効きが悪く何発も入れて 削って神経抜いて… という大工事に

_ 今日もボルタレンを処方されたので麻酔切れる前にさっさと飲んだ。が、 次は夜中なのでそれまで起きているか寝てしまうかで悩んでいる。 目が覚めたら飲めばいいかなあ〜


= KZ-ZSTx

_ 2年くらい前からコスパのよい中華有線ヘッドホンとして流行していたらしい。 今使っているのは 以前書いていた MTI MB21BK というやつなんだが (結局Shure SE112は買いなおしていない)、 慣れたとはいいながらやはり耳に馴染みきっているとは言い難く、 3〜4時間つけていると 耳が痛くなってくるし、ケーブルもだいぶダメージがあるようで遠くない将来に 断線してしまうような気がする… ということでそんなに高くもない表題の ヘッドホンを試してみることにした。2000円台で買えるらしい。 中華製品らしく見た目がそっくりのものが他にもたくさんあり、 2023年版みたいなタイトルがついているものが半額で買えるようだったが、 ひとまず評判のよいほうを買ってみた。

_ 商品ページだとケーブルは編みこみのものだったが手元に来たものは 編みこみ風に見えないこともないが普通のストレートのケーブルだった。あまり かっこよくない。そしてドライバ部分がかなり大きく装着がむずかしい。 はじめて聞いたときはなんだこのスカスカな音は…と絶句してしまったが きちんと装着できていなかっただけのようだ。 きちんと装着してみるとなるほどすばらしい。ありがちな感想だけど、 聞き慣れた曲をこのヘッドホンで聞いてみると、こんな音が鳴っていたんだ、 という新しい発見があったりするくらいだ

_ ヘッドホン買うといつもどうしたもんかと思うburn-in、 今回はちょっとやってみることにした。ノイズやらスイープやら無音やらを延々と 流しつづけるというものらしい。2時間くらい試す。



= Box2d

_ hecht-software / box2dweb を使おうとしているのだが、importができない。サンプルを見ても script タグに入れる方法ばかりだ。かなり古いソースだしな… なんとか使える方法を考えないといかん

_ そもそもJavaScriptやTypeScriptにおけるimportやrequireのやっていることを理解しないといかん。

_ import はstatementなので値はとくにないようだ。 importするには対象のモジュールで export されていなければいけない。

_ モジュールの説明。TypeScriptだと import、export、require | TypeScript入門『サバイバルTypeScript』 これかな。この記事は歴史の話もしてくれていてありがたい。そういえばES ModuleとかCommonJSというのも漠然とした理解しかなかった。

_ どっちにしてもexportしていないオブジェクトにアクセスできないということなのかな、となると元ソースを少しいじらないといけない。といっても最後でexportするだけだが… ひとまずrequireができるようになった。


= FPS

_ window.requestAnimationFrame でコールバックしてもらうことを繰り返すことで画面の更新をかけることになるが、このときのfpsはどう決まるんだろう。

_ まず経過時間についてはコールバックの引数でもらえるtimestampを元に計算するらしい。ミリ秒単位。fpsは、普通に考えてブラウザのfpsに依存するんだろうけど… 上記ドキュメントによると、モニタのリフレッシュレート、または60Hzが多いらしい。W3Cの勧告は前者らしい。Vsyncを待つというわけではないのだろうか。仮に待ってくれるとしても状態の更新と描画は分けておきたいところだけど

_ 裏に隠れているときはrequestAnimationFrameのコールバックが呼ばれていないようだ。そういうもんなのか


= 2D/3D canvas

_ Box2dにはデバッグ表示というのがあって、今回利用しているJS版でも2Dのcanvasに対して描画する機能があるようだ。しかし3Dのcanvasが前に来ているとそれを見ることができない。

_ 2Dを前にして、3Dを後ろにして、普段は2Dを透明にしておけばいいか… と思ったんだが、そうするとマウスイベントなどを受け取ることができないようで、OrbitControls がうまく動いてくれない。まあOrbitControlsにはcanvasを渡せるので、2Dの方を渡してしまってもいい気がするが…


= PlayWright

_ Puppeteer を少し触ったので同じようなもんだろうと思ったら Locator というものを積極的に使うことになったらしい。そのかわりCSS SelectorやXPathによる指定が、非推奨?になったようだ。ぱっと見の印象ではRoleやテキストやらを使った絞り込みというのはCSS SelectorやXPathより退化しているんじゃないか?という感じがする。


= ???

_ Box2dの組み込みに取り組んでいる最中に元の動きを壊してしまったらしい。テクスチャが全部同じ文字になってしまう。回転をすると別の文字(だけど全部のポリゴンが同じ文字)になってしまうといった塩梅。そのあたりはいじった記憶がないんだが…

_ 昨日からGitで管理するようにしたので差分を見てみたけど、テクスチャ座標に関する部分をいじっているとは思えない。

_ 変更をstashしてみた。もちろん問題なくなった。ではどの部分が悪さをしているのか?

_ Box2dに関係するすべてのロジックをコメントアウトしたら出なくなった。ので、ここから少しずつ復元してゆく感じだな…

_ 初期化して外壁を作る部分を復活したらもうだめになった。ああ、requireの段階でもうだめだった。グローバルの空間を汚していて、そのどれかが既存の動きを損っているということか

_ ならもっと早い段階でやったらどうか? ということで DOMContentLoaded の先頭でやってみたがやはりだめらしい。

_ require やめて import に戻してみたら問題なくなったような… と思ったら気のせいだった。 import できるようにコードをいじったけど、やっぱり同じ症状が復活してしまうな… 変数とかではなくグラフィックのコンテキスト的なものなのだろうか?しかしDebugDraw以外ではグラフィックコンテキストをいじることはないしなあ

//#TODO remove assignments from global namespace
var Vector = Array;
var Vector_a2j_Number = Box2D.NVector;
これかな… でも、だとすればclosureの中でrequireすればなんとかなったりしないのだろうか

_ うーん、別のモジュールも試してみたほうがいいかなという気がしてきた。


2023/06/28 (Wed)


= Tlog

_ かなり注意深くエアコンやサーキュレータを動かしたつもりだったのだが 室温は上がる一方で、日中は29℃台後半のままだった。さすがにちょっと暑い。


=

_ 薬が切れても痛みはさほどなかったのでこのままで耐えられそうだな… ということで 追加の鎮痛剤は入れないでおいた。


_ VSCode の Asciidoc の extention が新しくなったらしい。


= React.js

_ Tutorialをひと通りやった。喰わず嫌いだったがTutorialを試した範囲では見通しもよくて好感度が高い。

_ Next.js に進む前にドキュメントをひきつづき読み進めてゆくつもり


= 物理エンジン

_ Box2dは @box2d/core を使ったほうが楽かなあと思えてきた。TypeScriptでも使えるし。

_ ただ2D物理エンジンライブラリは他にもあるので、そっちも考えていいのかなあという気もする。 たとえば Matter.js というのがあるらしい。

_ ABAさんのblogは過去に何度も読んだはずの内容だがあらためて学ぶことが多い。 2DゲームエンジンPhaserの描画をthree.jsで3Dにする物理エンジンMatter.jsをテキストでレンダリングSVGのPathの当たり判定を取る方法 など。

_ Matter.js はざっと見た感じゲームループを丸投げしているコードしか見当たらないので、Box2dみたいに経過時間を与えて遷移させるといったことはできないのだろうか? レンダラを外出しにはできるので、Matter.jsで動かしてもらった物体を表示するとかはそんなに難しくないと思うが、その場合はMatter.jsがメインでこちらがサブになっていまいあんまり嬉しくない。ゲームエンジンぽいものと割切ってしまえばそっちの方が楽ということもあるのかもしれないが…

_ と思ったら update もきちんとあった。従来の Engine.run は Runnerという仕組に変わったらしい。これなら見通しよさそうだね


= Matter.js

_ さっそく試してみたんだが、Rendererを有効にするとやはりテクスチャがおかしくなるね… Three.js にテクスチャとして与えているcanvasをいじっているからか… Box2dは無罪だったのかもしれない。ただ Matter.js は手軽そうに見えるのでやっぱりこっちでやってみるかなという気になっている。

_ pixel 単位で指定できるのはとてもお手軽。まあThree.jsの2D風座標系は中心を原点にしてしまっているので変換が必要だけど、まあそれは引けばいいだけなので簡単だ。

_ うーんとっても簡単… と言いたいところなんだが、文字に対応する矩形をworldに追加しようとすると壁を突き抜けてしまう。

matter.js:4308 Uncaught TypeError: Cannot read properties of undefined (reading 'index')
    at Collision._findSupports (matter.js:4308:54)
    at Collision.collides (matter.js:4135:35)
    at Detector.collisions (matter.js:5586:37)
    at Engine.update (matter.js:6415:35)
    at Runner.tick (matter.js:10559:16)
    at run (matter.js:10498:24)
これがexception

_ … 高さ or 幅がゼロのBodyが含まれていたからだったらしい。事前に弾いたら通った。

_ Render と Three.js のポリゴンの位置を合わせることができた。角度の設定がうまくいっていない… Render だと止まっているのに、Three.js 側だと一定の角速度で回転しつづけている。

_ いずれにしても Matter.js は親しみやすくていい。単位もピクセルやラジアンなど 3D表現では普通に使いたいものが普通に使えるし。

_ TypeScript にはスマートキャストはないのだろうか。if などでチェックしても結局その中で再度non null指定をしなければいけない感じになっている。

_ 回転が変だったのは rotateOnWorldAxis を使っていたせいだった。相対指定なので Matter.js から貰える現在の角度を毎回与えていたら回りつづけるのは当然だった。 setRotationFromAxisAngle に変えたところ無事に期待通りの動きになった。

_ 現在はRenderはRenderで2D canvasに描画させて、Three.jsの描画タイミングで位置と角度を取得しているのでフレームが少し遅れるようだ。まあこれはこれでいいのかもしれない。 ひとまず文字を落とすところまでできたので、これで飛び道具はひとつ確保できたということになるかな… 長かった。

_ これからの拡張に備えてコード整理中。いろいろいじっている最中にThree.jsがレンダリングできなくなってしまった。

WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost
THREE.WebGLRenderer: Context Lost.
THREE.WebGLRenderer: Context Restored.
コンテキストを失ってしまったらさすがに動かないだろう。 Restore した後のリカバリー処理をどうすればいいのか分かっていないがこれ本番で起きたらしんどいな

_ ひとつ山を超えたら先を見失ってしまいがちだ。あれこれ機能の切替をしたいのでキー操作への対応をしようかな


2023/06/29 (Thu)

_ 今日の体調はいまひとつ

_ Matter.js を入れてからFPSが40で安定してしまった。それまでは60FPSだった。30に下がるなら分かるが40なのか。 Renderを使うのをやめてupdateをこちらですれば改善すると思われる。マウスアクションとRenderは独立しているので問題ないと思われる。ただRenderのおかげで自前の描画とMatter.jsの思うところの描画が一致していることを確認できてとてもよい。


= ライブラリ

_ ABAさんの ブラウザゲームのプロトタイピングに役立つJavaScriptライブラリ は勉強になる。ただ8年前の記事なので今となっては少し古い。

_ lodash というのはJavaScript触っていてなんでこれがないのかというものが多く含まれていてよい気がするものの、その後JSも変わっていっているだろうし、TypeScript側では少し事情も異なる気がするし、今でも使われているんだろうか。 repository を見ると2年くらいactivityがない。issueは今でもやりとりされているように見えるが

_ foldが見当たらない。reduceはあるけど。そして filterMap がないのか。 compact というのが falsey な要素を取り除いた新しいリストを返してくれるらしいので、それを併用すればいいのだろうが… falsey とは false, null, 0, "", undefined, and NaN がそれにあたるらしい。

_ Underscore.js というのもあるらしい。 lodash は Underscore.js から fork したもののようだ。


= FPS

_ 関係するコードをいじった自覚はないが、今日は60FPS出ているな… フレームレートが下がる要因は他にありそうだ。


= ahomu / Talkie

_ HTML5ベースでスライドのフレームワークを作っているひと。 製作の動機が私の昨今の取り組みと重なるところが多くて参考になった。もちろん こちらの程度はかなり低いけど


= キーボードイベント

_ ABAさんの crisp-game-lib を参考にしながら、あちこちドキュメントをあたってみる。 Three.js ExamplesKeyboard Events では KeyboardState というクラスでやっているらしい。 どっちにしても document.addEventListener で keydown と keyup をフックしていることには変わらないようだ。 あとABAさんが紹介していた ericlathrop / game-keyboard もだいたい一緒 (documentじゃなくてwindowという違いはありつつ)。 そして押されたばかりなのか、押され続けているのかを判別するというロジックが必要なのもまあその通りという感じ


2023/06/30 (Fri)


= キーボードイベント つづき

_ keydown と keypress の違いがいまひとつ分からない。発生するタイミングは同じように見える。あとオートリピートのたびにイベントが発生するのも謎。

_ そして押しっぱなしでフォーカス外して、キー離してフォーカス戻しても keyup が発生しないのも考えものだ。これはしょうがないのだろうか

_ ABAさんや他の方もやっているように、ユーザ側の update 指示によって溜めておいた情報を更新して… というやりかたになるのかな。そうじゃないとキーイベントのハンドラで全部制御書かなきゃいけなくなるのでしんどいのだろう。

_ code と key という似たようなものがあるが、 KeyboardEvent を見ると code はキーボードレイアウトを無視するという意味不明の註釈が。オートリピートされている間は repeat が trueになるらしい。

_ keypress だと押しっぱなしにしても repeat が true にならないようだ。またシフトキーなどを押しっぱなしにしていると、keydownは繰り返し発生するが keypressは発生しないようだ。となるとkeypressの意義って一体… と思ってしまう。… ああ keypress は廃止されたのか。通りで誰も使っていないわけだ

_ repeat = true のイベントが繰り返し来るのは最後に押しつづけたキーだけのようだ。たとえば a を押しっぱなしにした状態で b を押しっぱなしにしはじめると、b のイベントは repeat = true で繰り返し発生するが、 a のイベントは b を押しはじめた段階で発生しなくなる。 b を離しても a の repeat = true のイベントが再開することもない。

_ getLayoutMapKeyboardLayoutMap のpromiseが帰る… ? そんな時間かかる処理なの


= マークアップ つづき

_ We need a new document markup language - here is why 経由で、 PDML と、それをベースにした PML というものを知る。この手のマークアップはHTMLにおける属性の表現ができないものが多くて、to HTML の元にするのは苦しいところがあるのだけど、P(D)ML はそのあたりもきちんと意識していて、私が思うところのHTMLの重さを解消してくれているので非常に筋がよいように感じる… が、活用例があまり見当たらない。そんなに複雑なもんじゃないから自分でプロセッサ書くのもさほど大変ではなさそうだけど、残り一週間でそれをやるのはきつい


= 地図

_ 地図…というか地形と連動させたいという思いがあり、オフラインで使える地形の輪郭を探していた。

_ 日本の白地図 というのを見つけた。 マッピング・ガイド もあるのが親切で素晴しい。

_ 「カビパン男と私」というこのサイトはずっと前から知っている。 あらためて見てみるといろいろ発見が多いな… 縦書き対応とか見事だと思う。


= キーボード つづき

_ イベントで上げ下げを監視しておいて、 update が呼ばれるまでに新しく上げ下げされたものと、押されつづけているものを知ることができるようにする、というのが大枠の方針らしい。イベントは大量に来るのでそれをきちんと code ごとに溜めておくのと、update で使いやすい形式の入力を得つつ、現在の状態を都度問い合わせることもできる… と使いやすいのだろうか


= SVG

_ SVGLoader を使おうとしたが同一ディレクトリのSVGをとりに行かせたらCross Originだと怒られてしまった。

Access to fetch at 'file:///C:/local/webpacktest/dist/A%20Blank%20Map%20of%20Japan.svg' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome-untrusted, https, edge.
そうなのか。data でやるか、ページ内に置いて拾うかのどっちかかな… あるいはついにC/Sに踏み切るか…

_ ひとまずThree.jsを忘れてHTML5とSVGについておさえておく。

_ ただ出すだけなら img でも出せるらしい。あるいは object に出させることもできるようだ。

_ さて object に出した SVG の中身を取り出すにはどうすればいいのか? object までは辿りつけるし、その中身もありそうに見えるんだが、 querySelector などでとってこれない。 How can I get svg attached by object? によると .contentDocument.documentElement で取れそうに見えるが、そのreplyにあるように .contentDocument が null になってしまう。クロスオリジンというわけではないはずなのだが…

_ まあサーバでやるのが無難なのかもしれない。どうせサーバはいつかやらなきゃいけなかったわけだしちょうどいいのかも

_ …ねぼけていた。もともと webpackの設定時にサーバ対応していたのだった。 npm run start

_ ひとまずSVGが出るようになったが path の描画をしているつもりで中が真っ黒に塗り潰されているのと、あと想定よりかなり手前に描画されているなどの問題がある。とはいえまずは出たのでよしとする。

_ 「手前」のように見えるが縮小してゆくと同時にfar clipされているので、Z軸は正しいのか… XYがかなり離れたところにいるということだろう

_ …単純に「でかすぎた」だけだったようだ。左上座標を原点付近にすると遠くに表示されることになる。scaleを0.1にしたところ見えた。

_ マッピング・ガイドの指示にしたがって経度緯度からSVG内の座標を得ることができるようになったので、それを投影してみた。たぶん合ってそう

_ SVGといいマークのCircleといい、MeshBasicMaterialを使うと輪郭だけというわけにはいかないようだ。マークは画像などで代用できるとして、日本地図はどうしたもんかな



= 2023年上半期まとめ

_ ろくに更新しないまま上半期を終えようとしている。これを書いているのは10月だ(?)

_ あまり健康ではない感じだった。ちょっとしんどいけど休めば回復するという 感じではなく、ただ慢性的に不健康な感じ。 それは今に始まったことなのか?という読者諸氏もいらっしゃると思うが… 今でも読者がいらっしゃるのかも心許ないところではあるが、去年末くらいから 体調の悪さがひと段階進んだような感覚を覚えている。 運動がほとんどできていないことも原因のひとつだし、悪循環になっていると思う。 とはいえ走ったり自転車に乗ったりは辞めたくないもんだと思っている。

_ 慢性的な腰痛のほかに、 の治療が続いている。 数年に一回は体験する憂鬱な痛みが、親不知を抜いたことで開放されたと考えると これはこれで記念すべき年だったりするのかもしれない。

_ ZHTの更新頻度が激減したという変化もあった。 これを書いている10月現在も続いている。なんか凝ったことを書こうとしたりして その推敲が終わっていないからいつまでも上げられない… という悪循環。 あとは仕事がわりと詰まっていて、 仕事中のメモは業務日誌的なものに書いているので、そっちでだいぶ書きたいことは 書いてしまっているという状況も手伝って、まずこちらで記録を書くという 習慣が少し薄れている。

_ カメラ関係のイベントも少なめだった。店先で安くて古いMF単焦点のレンズを 見掛けると、おお、とは思うけど、 でも似たようなスペックのもう持ってるからなあ〜と踏み留まることが多い。 私のジャンクレンズ漂流はもう終着したのだろうか? おお、とは思うのだから まだ終わっていないとは思われるのだけど、ただ今の私の能力や感覚などでは、 似たスペックだけど写りはどう変わるのか? みたいなところに あまり強い関心が向かないところがあり、関心がまったくないわけではないけど 財布の紐を緩める(古い表現)には至らない、という程度の関心なのだと思う。 だから自分の持っているボディに合うレンズがひと揃え見つかったら、 それ以上の関心はそれほど…という感じだ。

_ 犬関係。 ジョンが泊まりに来てくれた。 体型もすっきりして健康そうになっていた。お子さまも二人目が誕生したそうで、 長男として幸せに暮らしているようだ。

_ ジェイクは、今年に入ってからわりと体調を崩しがちで、 血液検査をするとCRPが高くて、ステロイドなどを 処方してもらうと1〜2回の服用で即元気になって…2ヶ月くらい後に また食欲がなさそうで動きも鈍くなって… というような周期になっている。

_ あときちんと書いてこなかったと思うが、昨年夏から 妻がペットホテルを開業しており、 いろいろありつつも犬と触れ会える機会が増えているように思う。

_ 読書はひきつづきほとんどしていない。 カササギ殺人事件くらいか。あれは面白かったと思う。 あとは技術関係のドキュメントや電子書籍だけで、流し読みも多かったので 印象に残っているものはない。

_ 技術ねたは… オシロスコープ電子回路など これまで距離を置いてきたものに手を出した。長つづきしないのは 忙しいから… という言い訳をしてしまうものの、きちんと強化期間を設ければ 今度こそものにできるかもしれない…という程度の手ごたえは得ている。 しかしこれを書いている10月の段階では(しつこい)あいかわらずこっち方面に 時間を割けていないのでこのままではだめかもしれない。 3Dプリンタもほとんど進捗なしだ

_ あと、かなりWebのクライアントまわりの技術をなぞるチャンスができたのは よかったと思う。スライドの件と並行してReact関係に 手をつけたことで喰わず嫌いが解消されたのは大きかったと思う。 スライドの方は、いろいろチャレンジをしつつ 成果に満足がいかないという腑甲斐無い状態ではあるが、まあ何もしないよりは いいだろう… というような底辺の志でやっている。

_ 下半期は…どうなるんだろう? すでに残り2ヶ月なので大勢は決しているの だろうけど




Zinnia (zinnia@risky-safety.org)
Back