htmx

https://htmx.org/
フロントエンドのjavascriptライブラリ。
reactやvue.jsと違い、サーバ側から組み立て済みのHTMLを送ってもらうことでクライアントの受け持つ過度な複雑性を取り除くという哲学で作られている。

------------------------------
reactやvue.js
------------------------------
【サーバ】                                                          【クライアント】
DB等からデータ取得          →(通信:データ)→                       データ以外のレイアウト表示
                                                                    データから表示内容組み立て
                                                                    組み立てられた表示内容を表示

------------------------------
htmx
------------------------------
【サーバ】                                                          【クライアント】
DB等からデータ取得          →(通信:組み立てられた表示内容)→       データ以外のレイアウト表示
データから表示内容組み立て                                          組み立てられた表示内容を表示

QRコードの大きさの決まり方

https://www.qrcode.com/about/version.html
https://www.qrcode.com/about/error_correction.html
https://www.keyence.co.jp/ss/products/autoid/codereader/basic2d-qr-types.jsp

概要

QRコードの大きさは「バージョン」と呼ばれ、データ内容の量と誤り訂正レベル(L,M,Q,Hの4レベルがある)の組み合わせによって決まる。
「モデル2」仕様のQRでは、バージョン1=24セルの正方形から、バージョン40=117セルの正方形のバージョンが規格で決まっている。バージョンが1つ上がると、縦横4セルずつ大きくなる。
データ内容の格納の方法は、数字、英数字、漢字、バイナリ、混合データ……の5パターンがある。
・数字、英数字、漢字、バイナリの場合
単純に文字数またはバイト数がデータ量になる。この方式だと文字数が同じなら同じサイズのQRになる。
・混合データの場合
「文字種類・文字数・データ本体」の繰り返しがデータ内容になり、それぞれに定義されたビット数の合計がデータ量になる。
この方式だと文字数が同じでも異なるサイズのQRになる場合がある。


各モードで使える文字種類・データ量の詳細

https://www.tech-jp.com/QRCode/EncodeData.html
・数字モード
0~9の数字のみを扱える。
1文字が3.3ビット(3文字で10ビット)で符号化される。
・英数字モード
0~9の数字とアルファベット大文字とスペース等一部の記号のみを扱える。
それ以外の、例えばアルファベット小文字が入る場合は8ビット(バイナリ)モードが使われる。
1文字が5.5ビット(2文字で11ビット)で符号化される。

「0123456789」の10種類の数字
「ABCDEFGHIJKLMNOPQRSTUVWXYZ」の26種類のアルファベット大文字
「 $%*+-./:」の9種類の記号 ※スペース文字含む
……の、合計45種類。

・漢字モード
シフトJISの全角キャラクタのみが扱える。
シフトJISに特化することで、全角1文字が13ビットで符号化される。
・8ビット(バイナリ)モード
全ての文字を扱える。普通のテキストファイルと同じ形式。
1文字が8ビットで符号化される。ECIコードで指定されない限り、漢字はSJISで符号化される。
ECIコードの指定によりUTF-8などを扱うこともできる。

3-way merge の「3方向」とは何か?

https://ja.stackoverflow.com/questions/52019/git-%E3%81%AE-3-way-merge-%E3%81%A8%E3%81%AF%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AB%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A7%E3%81%99%E3%81%8B
・方向1「現在ブランチのコミット」
・方向2「マージ対象ブランチのコミット」
・方向3「現在ブランチとマージ対象ブランチの共通祖先コミット」
……の3つのコミットを元にしているので3wayマージである。



実際にマージ結果を作成する手順は以下。
X と Y の共通祖先となるコミット B (base) を見つける。
「X と B の diff」、「Y と B の diff」をそれぞれ求める。
2つの diff の結果を比較して、マージ結果を作成する。

対して 2-way merge は、単に「現在ブランチのコミット」「マージ対象ブランチのコミット」の2つのdiffからマージ結果を作成する。

棒倒し法による迷路作成

var makeMaze = mazeSize => {

	// 外枠を作成
	var fld = [...Array(mazeSize)].map(_=>[...Array(mazeSize)].map(_=>0));
	var initMap = (fld,y,x) => (x==0 || y==0 || x==mazeSize-1 || y==mazeSize-1) ? 1 : fld[y][x];
	fld = fld.map((arr,y)=>arr.map((_,x)=>initMap(fld,y,x)));

	// 内側に柱を作成
	var isEven = n => n % 2 == 0;
	var spawnPole = (fld,y,x) =>  ( fld[y][x] == 0 && isEven(x) && isEven(y) ) ? 2 : fld[y][x];
	fld = fld.map((arr,y)=>arr.map((_,x)=>spawnPole(fld, y, x)));

	// 柱を倒す
	var downPole = (fld,x,y) => {
		if (fld[y][x] != 2) { return; }
		// 最上段は4方向、それ以外は3方向のうちランダムで方向を決める
		var n=Math.floor(Math.random() * (y == 2 ? 4 : 3));
		// 倒す方向を算出して倒す
		var py=Math.round(Math.sin(Math.PI / 2 * n));
		var px=Math.round(Math.cos(Math.PI / 2 * n));
		fld[y+py][x+px] = 3;
	};
	fld.forEach((arr,y)=>arr.forEach((_,x)=>downPole(fld,x,y)));

	// 表示
	fld
		.map(arr=>arr.map(n=>n==0 ? ' ' : '#'))
		.forEach(arr=>console.log(arr.join("")));

};

makeMaze(21);

ECIプロトコル, ECIモード

https://reference.aspose.com/barcode/ja/net/aspose.barcode.generation/eciencodings/
拡張チャネル解釈識別子。(ECIEncodings enumeration)
QRコードに含まれるデータをエンコードするために使用される情報(文字コード種類など)。
実データとしてはQRコード先頭に「\000026」(UTF8の場合)などのデータが入った形になっており、古いQRリーダの場合はECIがあるQRコードを正しく読み込めない場合がある。