Weekly report 2017-W27

2017-W27 の日記。 ……日記?週記?

ニュース・知ったこと

いつの間にか FBX SDK 2018 が出てた (2017-07-08)

正確なリリース日時は不明。

まだ2017年も半分といったところなのに、既に FBX SDK 2018.1.1 (つまり FBX SDK 2018 のリビジョン2)が出ている。 翌月のナンバリングで発行する月刊雑誌とかじゃねえんだから……

2018.1.1 まででの変更点はだいたいバグフィックスとかオーディオ関連で、私が直接弄ろうという範囲への影響はなさそう。 FBX ファイル形式自体のバージョンも 7500 のままで一安心だ[0]

パブリック活動

Qvitter (と QvitterPlus) に merge request 投げた

Qvitter とは GNU Social で twitter ライクな UI を実現するためのプラグインであり、 QvitterPlus は Qvitter を更に拡張するプラグインである。

firefox における Qvitter のテキストボックスの挙動が google chrome と異なるため、改行の入力が投稿内容に正しく反映されなかった問題を修正した。 (テキストボックスで直接 Enter を押すと反映されなかったが、改行文字を含むテキストを C-v でペーストすると正しく反映されていた。)

問題の概要

Qvitter の queet 入力のテキストボックスには、 content-editable="true"div 要素と javascript による入力の解釈が使われているが、テキスト入力による div 要素内の内容の変化が firefox と google chrome で異なる。 たとえば、

改行1
改行2

改行3

改行4

のように入力すると、 div 内では以下のように HTML が形成される。

              <div>改行1</div>
<div>改行2</div>
<div><br></div>
<div>改行3</div>
<div><br></div>
<div>改行4<br></div>
            
firefox の場合 (キャプチャ画像)
              改行1<br>改行2<br><br>改行3<br><br>改行4<br>
            
google chrome の場合 (キャプチャ画像)
content-editable="true"div 要素内に作られる HTML 断片の違い

Qvitter や QvitterPlus においては、 <br> を改行文字に変換する処理がかけられており、結果 firefox では正しく改行入力が処理されていなかった。

改行の反映を正しく行うよう修正

これを修正するには、 <div> を行として扱ってやる、すなわち </div> の直前に <br> が暗黙に(或いは実際に)存在しているものとして扱い、それを実際に反映させてやればいいということになる。 今回は、修正する処理の周辺にあったコードで文字列に replace() を使っていたので、正規表現でどうにかした。 (/(<br>)*<\/div>/ にマッチしたものを '<br></div>' に置換してやる簡単なお仕事である。)

これが最初のコミットである。

エスケープ処理を追加

コード中のコメントによると、 jQuery で .text() を使っても <br> は改行文字にされないとのことで[1]、よって HTML 要素を無視してテキストだけを処理しようとする前に、 <br> をテキストに見えるものに置換する必要がある。 その置換先に選ばれたのが {{{lb}}} という文字列である。

しかし修正前のコード中ではエスケープ処理に {{{lb}}} から <br> への(元に戻す方向の)置換を実行しており、これにより本文がもともと {{{lb}}} という文字列を含んでいた場合、それも改行に置換されてしまう。 最初のコミットで修正したバグが健在であればこれも役立ったかもしれないが、修正された今となっては完全に余計なことである。

これを修正するため、エスケープ処理を追加し、以下のように実行されるようにした。

  1. {} をエスケープして !{!} に置換[2] ← new!
  2. <br>{{{lb}}} に置換
  3. !{!} のエスケープを {} に戻す ← new!
  4. {{{lb}}} を実際の改行文字に置換

これにより、本文中の {{{lb}}} という文字列を意図せぬ変換から保護できた。 これが第2のコミットである。

QvitterPlus への同様の修正

QvitterPlus とは Qvitter を拡張するプラグインだが、どうにもこれがイベントハンドラを上書きしており、 QvitterPlus を有効化している場合は Qvitter への修正が反映されない。 (最初、 Qvitter への修正が反映されない理由が思い当たらず、キャッシュを消してみたりいろいろ試して苦労した。) QvitterPlus の該当部分のコードを参照すると、 Qvitter で予め設定されたハンドラを解除し、改めて改造版のものを登録している。 この改造版のハンドラには Qvitter 由来のコードがそのままコピーされている(しかも修正が必要なコードは2箇所にコピーされていた)ため、こちらにも Qvitter と同等の修正を施した。

私的活動

gnusocial.cardina1.red の IPv6 サポート 🎉

これまで ConoHa では IPv6 アドレスが(たぶん DHCP で)17個ホストに配布されていたが、 2017-06-26 以降作成のインスタンスより、 v6 アドレスが1つしか設定されなくなった。 もちろん残り16個の(連続した) v6 アドレスも使用可能なので、そちらを docker コンテナに割り振ることで、ホストを大して弄らずともコンテナが v6 で外に接続できるようになった。 やったね! 🎉🎉🎉

詳細をブログに載せたかったが、単に docker-compose のネットワークを内部用と外部用で作っただけなので、まあ docker に慣れた人なら普通にできるのだと思う。 docker-compose その他諸々、そのうち暇ができたらパスワードとか除去したリポジトリを公開できるようにしたい[3]

進捗: fbxcel

fbxcel は FBX ファイルをロードするための Rust ライブラリ。

ゲームの方をいいかげん人に見せられるレベルまで実装したいと思ったので、ひとまず FBX データをロードして表示し、アニメーションするところまでいきたいと考えた。 今週実装したのは、読まれたノード群の解釈や利用を補助するユーティリティっぽいやつらである(実際はもう少し他にも実装しているが、まだ push していない)。

fbxcel のパーサ部分の実装はもうだいぶ昔に完成していて、あとは解釈の方をどう設計するかが問題なのだが、これがなかなか厄介だ。 かつて部分的に実装したこともあったのだが、 FBX SDK を見ると継承と動的多態の嵐、しかも型の種類が無限に(←これは誇張)あったので心が折れた。 よって今のところは「利用する側のアプリケーションが、自分に必要なものだけ自分で解釈してくれ」という方針だが、さすがに整数や文字列を enum へ変換したりとか、メッシュの頂点等の基本的なデータの扱いは、さすがに fbxcel 側で実装してやっても良いと思えてきたので、今週からはその方向で実装を進めている。

進捗: ゲーム (last-progress1)

リポジトリはまだ公開していない。 というかリモートに置いていない。 というのも、設計が駄目だと思ったら爆破して最初から再実装したりする[4]ので、公開しても結局捨てることになるからである。

今週は、とりあえず FBX の頂点をロードし、四角形以下を三角形分割し(これも自前実装)、表示するというところまで。 次に目指すのは法線とテクスチャの読み込み。 その次はボーンを読んで間接からグルグル回したい(たぶんかなり難しいと思う)。

メッシュを頂点だけ読み込んだ
今週の進捗

感想

ISO の週番号に合わせてまとめでも書こうと思ったんだけど、日曜の夜まで待つのどう考えても得策に思えないので、土曜〜金曜でやりたい。 でもそうなると番号付け (2017-W27 とか)どうしよう。

というか感想って何だ。