がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

今のところの「糖尿病」の対策:小まとめ

とりあえず、薬物療法はがっつりと「お医者様の領域」なので、食事療法と運動療法の側の、個人的雑感を、ざっくりと。
当然ですがおいちゃん「医師ではありません」し「個人の見解」程度なので、参考程度にごらんくださいませ。

まず先に「チューニングの基本は計測」なので、今回だと「血糖値の計測が出来るようになる」のが最優先。
一端は「1日に1~2回」くらいはかって、せめて200を切るくらいまで、は、思いっきりがんばりませう。端的には「がっつりと糖質を削る」「運動をする」あたり。
それ以降についてはまぁ緩やかに。確か「食後で140、2時間くらい経つと100くらい」が「普通の人の値」だったと思ったので、この辺まで頑張れるとベターなんじゃないか、と。

んで。
とりあえず「食事のコントロール」と「運動のコントロール」は、多分「両輪だろうなぁ」と。
運動のほうは、基本的には「有酸素でカロリーをある程度減らす」と「筋トレでそもそもの基礎代謝を上げるの両輪がよいぽい。
がっつりやっている人は知らんが、運動不足のおいちゃん的には「とりあえずまず歩く」からstart、かなぁ。
出来たらエアロバイクくらい漕ぐとよさげ。「2日に1回」くらいのペースの時は、色々と調子がよかった気もする。

結構色々ありそうなのが、食事。
おいちゃん的には
・緩やかに低糖質
・ある程度の低脂質
難消化性デキストリンが結構有効打になった
って感じでした。

どうも、血液検査で「中性脂肪」が上がるとHbA1cも高値をマークする傾向があったので(まぁ糖新生とかあるしなぁ)。
血液検査の結果次第ではあるのですが、「中性脂肪が高い」人は、これも下げて上げるとよい、ので。
そこで「ある程度の低脂質」と、結構有効打だったのが「難消化性デキストリン」。
この辺で、ある程度のガードが出来そうな気がする。
難消化性デキストリン
・デカい袋かって飲む
以外にも
キリン メッツ コーラとかで、入ってるのがある(特保でいくつかあるみたいです)
・食物繊維( https://www.otsuka.co.jp/nmd/product/item_310/ )を、食前に飲む
とか、いくつか方法があるので、お好みで。

糖質は、勿論「ドカ食い」は駄目、ってのは前提として。
後はなんとなし「GIが低いほうが割とよさげ」な気がするので、その辺も少し注意しつつ。
主食を、出来たら「夜くらいは控える(減らすか、なくす)」といいんじゃないかなぁ、と。次は「昼と夜」をカット。
糖質の量については、一端「1日に120~130g程度」を目安にすると、「それなりに絞れて」「そんなに無理がない」ような気がするです。

「脂と糖を減らしてなに食うねん?」の答えは「蛋白質」。
後は、間食だと
・ナッツ
・チーズ
・82%とかのチョコレートを少量
こんにゃくゼリー
とかが、割と便利かなぁ、と。
プロテインバーも低糖質のがあるので、探すと便利。高いのが多いですが、安いのもあるので(笑

料理の時の調味料として
・砂糖は使わない:ラカンントとエリスリトールを使ってます
 → 「みりん」は「酢」に置き換えると、案外と美味しいです(好みもあるんだろうけど)
・ケチャップも控える
・片栗粉は、サイリウムで置き換えるとよいですが使い方にコツがあるので注意

とか少し気を配ったり、食材的には
・カボチャとか芋類は控える
くらいからstartすると、割と緩やかにいけるのではないかなぁ、と。

あとは、個人的には「ローソンと仲良くなると低糖質がはかどりやすい」と思われます(笑
選べば、アイスとかも割と低糖質あるしねぇ。多分、商売の文脈は「ダイエット」なんだろうけど、まぁありがたい(笑

この辺が、出だしではないかしらん?

良書リスト 2021/08/31 版

いやちょいと別件で「書籍の一覧」をなんとなく書いていたのですが。
思ったよりボリューミーになったので(笑)、せっかくなんで書き残しておこうかなぁ、と。

なんだかんだ、年数を閲していると、読んだ書籍の量もそれなりに増えるものですなぁ、と、しみじみ。

なお
・カテゴリは結構雑に適当です
・順番に意味はありません

【基礎】
UNIXという考え方
https://www.amazon.co.jp/exec/obidos/ASIN/4274064069/

リファクタリング・ウェットウェア ―達人プログラマーの思考法と学習法
https://www.amazon.co.jp/exec/obidos/ASIN/4873114039/

達人プログラマーシステム開発の職人から名匠への道
https://www.amazon.co.jp/dp/4894712741

プログラミング作法
https://www.amazon.co.jp/dp/4756136494

石頭コンピューター
https://www.amazon.co.jp/dp/4535783721/


【学び方】
○ アプレンティスシップ・パターン ―徒弟制度に学ぶ熟練技術者の技と心得
https://www.amazon.co.jp/exec/obidos/ASIN/4873114608/

ソフトウェア職人気質―人を育て、システム開発を成功へと導くための重要キーワード
https://www.amazon.co.jp/exec/obidos/ASIN/4894714418/

プロフェッショナルたちの脳活用法
https://www.amazon.co.jp/exec/obidos/ASIN/4140882867/
プロフェッショナルたちの脳活用法2
https://www.amazon.co.jp/dp/4140883103/

乱読のセレンディピティ
https://www.amazon.co.jp/exec/obidos/ASIN/4594069967/

読書の技法
https://www.amazon.co.jp/exec/obidos/ASIN/4492044698/

「知的野蛮人」になるための本棚
https://www.amazon.co.jp/exec/obidos/ASIN/4569762026/

思考の整理学
https://www.amazon.co.jp/dp/4480020470/

知的生活習慣
https://www.amazon.co.jp/dp/4480068090/


【プログラミング】
○ コーディングを支える技術 ~成り立ちから学ぶプログラミング作法
https://www.amazon.co.jp/exec/obidos/ASIN/477415654X/

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
https://www.amazon.co.jp/exec/obidos/ASIN/4873115655/

オブジェクト指向入門 第2版 原則・コンセプト
https://www.amazon.co.jp/exec/obidos/ASIN/4798111112/
オブジェクト指向入門 第2版 方法論・実践
https://www.amazon.co.jp/exec/obidos/ASIN/4798111120/

熱血!アセンブラ入門
https://www.amazon.co.jp/exec/obidos/ASIN/4798041807/
大熱血! アセンブラ入門
https://www.amazon.co.jp/exec/obidos/ASIN/4798051543/

テスト駆動開発
https://www.amazon.co.jp/dp/B077D2L69C/

プログラミング作法
https://www.amazon.co.jp/dp/4048930524/

プレファクタリング ―リファクタリング軽減のための新設計
https://www.amazon.co.jp/exec/obidos/ASIN/4873112729/

新装版 リファクタリング―既存のコードを安全に改善する―
https://www.amazon.co.jp/dp/427405019X/

まつもとゆきひろ 言語のしくみ
https://www.amazon.co.jp/exec/obidos/ASIN/4822239179/

スモールコンパイラ の制作で学ぶ プログラムのしくみ
https://www.amazon.co.jp/exec/obidos/ASIN/4774121770/

コンパイラ―原理・技法・ツール
https://www.amazon.co.jp/exec/obidos/ASIN/478191229X/

コンパイラ: 作りながら学ぶ
https://www.amazon.co.jp/dp/4274221164/

コンパイラの構成と最適化
https://www.amazon.co.jp/dp/4254121776/


【コンピュータアーキテクチャ
コンピュータアーキテクチャのエッセンス[第2版]
https://www.amazon.co.jp/dp/4798167932/

ディジタル回路設計とコンピュータアーキテクチャ
https://www.amazon.co.jp/dp/4798147524/

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方
https://www.amazon.co.jp/dp/4873117127

CPUの創りかた
https://www.amazon.co.jp/dp/4839909865/
RISC-VとChiselで学ぶ はじめてのCPU自作
https://www.amazon.co.jp/dp/4297123053/
作ろう! CPU ~基礎から理解するコンピューターのしくみ
https://www.amazon.co.jp/dp/4839968519/

30日でできる! OS自作入門
https://www.amazon.co.jp/exec/obidos/ASIN/4839919844/
ゼロからのOS自作入門
https://www.amazon.co.jp/dp/4839975868/


【C / C++
プログラミング言語C 第2版 ANSI規格準拠
https://www.amazon.co.jp/dp/4320026926

プログラミング言語C++ 第4版
https://www.amazon.co.jp/dp/4797375957/

C++プライマー 第5版
https://www.amazon.co.jp/dp/4798143006/

Effective C++ 第3版
https://www.amazon.co.jp/dp/4621066099/
新訂版MORE EFFECTIVE C++
https://www.amazon.co.jp/dp/4621066064/


アルゴリズム
珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造
https://www.amazon.co.jp/dp/4894712369

○ みんなのデータ構造
https://www.amazon.co.jp/dp/4908686068

アルゴリズム・サイエンス:入口からの超入門 (アルゴリズム・サイエンスシリーズ 1―超入門編)
https://www.amazon.co.jp/dp/4320121678
アルゴリズム・サイエンス:出口からの超入門 (アルゴリズム・サイエンスシリーズ 2―超入門編)
https://www.amazon.co.jp/dp/4320121686

アルゴリズムクイックリファレンス
https://www.amazon.co.jp/exec/obidos/ASIN/4873114284/

アルゴリズムイントロダクション 第3版 総合版
https://www.amazon.co.jp/dp/476490408X/


【インフラ】
小悪魔女子大生のサーバエンジニア日記 ――インターネットやサーバのしくみが楽しくわかる
https://www.amazon.co.jp/exec/obidos/ASIN/477414522X/

マンガ式 IT塾 パケットのしくみ
https://www.amazon.co.jp/exec/obidos/ASIN/4774128430/

【改訂5版】図解でよくわかる ネットワークの重要用語解説
https://www.amazon.co.jp/dp/4297111713/

インターネットのカタチ―もろさが織り成す粘り強い世界
https://www.amazon.co.jp/exec/obidos/ASIN/4274068242/

アカマイ―知られざるインターネットの巨人
https://www.amazon.co.jp/dp/4040800176/

ポートとソケットがわかればインターネットがわかる――TCP/IP・ネットワーク技術を学びたいあなたのために
https://www.amazon.co.jp/dp/4774185701/

ジョークなしでインターネット技術は語れない!―ジョークRFCの本
https://www.amazon.co.jp/exec/obidos/ASIN/4899770251/

新装改訂版 Linuxのブートプロセスをみる
https://www.amazon.co.jp/dp/404891393X

マスタリングTCP/IP―入門編
https://www.amazon.co.jp/dp/4274224473/

プロフェッショナルIPv6
https://www.amazon.co.jp/dp/4908686041/


【DB】
データベースシステム概論
https://www.amazon.co.jp/dp/4621042769

データベース実践講義 ―エンジニアのためのリレーショナル理論
https://www.amazon.co.jp/dp/4873112753

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ
https://www.amazon.co.jp/dp/4798157821/

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ
https://www.amazon.co.jp/dp/4798124702/

プログラマのためのSQL 第4版
https://www.amazon.co.jp/exec/obidos/ASIN/4798128023/

SQLアンチパターン
https://www.amazon.co.jp/dp/4873115892/


【ビジネスとお金】
○ 人はなぜ形のないものを買うのか
https://www.amazon.co.jp/exec/obidos/ASIN/4757122233/

この世でいちばん大事な「カネ」の話
https://www.amazon.co.jp/exec/obidos/ASIN/4652078404/

プログラミングでメシが食えるか!?成功するプログラマーの技術と仕事術
https://www.amazon.co.jp/gp/product/479801558X
プログラミングでメシを食わせろ!!成功する開発チームのための技術と運営術
https://www.amazon.co.jp/gp/product/4798020974/
プログラムは技術だけでは動かない ~プログラミングで食べていくために知っておくべきこと
https://www.amazon.co.jp/exec/obidos/ASIN/4774165239/

小さなチーム、大きな仕事――働き方の新スタンダード
https://www.amazon.co.jp/dp/4150504814/


【セキュリティ】
欺術(ぎじゅつ)―史上最強のハッカーが明かす禁断の技法
https://www.amazon.co.jp/exec/obidos/ASIN/479732158X/

暗号技術入門 第3版
https://www.amazon.co.jp/dp/4797382228/

○ 体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践
https://www.amazon.co.jp/dp/4797393165/

ニッポンの個人情報 「個人を特定する情報が個人情報である」と信じているすべての方へ
https://www.amazon.co.jp/dp/4798139769/


【プロジェクトマネジメント】
○ 人月の神話
https://www.amazon.co.jp/dp/4864010056

マネジメント[エッセンシャル版] - 基本と原則
https://www.amazon.co.jp/dp/4478410232

世界一わかりやすいプロジェクトマネジメント 第4版
https://www.amazon.co.jp/dp/4862804438/

マンガでわかるプロジェクトマネジメント
https://www.amazon.co.jp/exec/obidos/ASIN/4274068544/

プロジェクトマネジメント標準 PMBOK入門: PMBOK 第6版対応版
https://www.amazon.co.jp/dp/4274221806/

熊とワルツを - リスクを愉しむプロジェクト管理
https://www.amazon.co.jp/dp/4822281868
アドレナリンジャンキー プロジェクトの現在と未来を映す86パターン
https://www.amazon.co.jp/dp/4822284018
ピープルウエア 第2版 - ヤル気こそプロジェクト成功の鍵
https://www.amazon.co.jp/dp/4822281108
ゆとりの法則 - 誰も書かなかったプロジェクト管理の誤解
https://www.amazon.co.jp/dp/4822281116
デッドライン
https://www.amazon.co.jp/dp/4822280535
デスマーチ 第2版 ソフトウエア開発プロジェクトはなぜ混乱するのか
https://www.amazon.co.jp/dp/4822282716


【ホスピタリティ】
リッツ・カールトンが大切にする サービスを超える瞬間
https://www.amazon.co.jp/dp/4761262788
サービスを超える瞬間 実例・実践編
https://www.amazon.co.jp/dp/476126442X

帝国ホテルの不思議
https://www.amazon.co.jp/exec/obidos/ASIN/4167328038/


【その他】
世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~
https://www.amazon.co.jp/dp/4839960100/

Webを支える技術 -HTTP、URI、HTML、そしてREST
https://www.amazon.co.jp/exec/obidos/ASIN/4774142042/

非属の才能
https://www.amazon.co.jp/exec/obidos/ASIN/4334034292/

ザ・テクニカルライティング―ビジネス・技術文章を書くためのツール
https://www.amazon.co.jp/dp/4320008847

プロフェッショナルの条件――いかに成果をあげ、成長するか
https://www.amazon.co.jp/dp/4478300593

失敗の本質―日本軍の組織論的研究
https://www.amazon.co.jp/dp/4122018331/

「超」入門 失敗の本質 日本軍と現代日本に共通する23の組織的ジレンマ
https://www.amazon.co.jp/exec/obidos/ASIN/4478016879/

失敗学 (図解雑学)
https://www.amazon.co.jp/exec/obidos/ASIN/4816341870

失敗学実践講義 文庫増補版
https://www.amazon.co.jp/exec/obidos/ASIN/4062766132/

[英和対訳]決定版 ドラッカー名言集
https://www.amazon.co.jp/exec/obidos/ASIN/4478014892

「文字コードを変換しつつCSVファイルを出力する」時の書き方

gallu.hatenadiary.jp で読み込みを書いていたのですが、書き出しをそういや書いてなかったなぁ、と思って。

先にちょろっと考察したいのが、Content-Type。
本来は text/csv が正解。
ただ、割とちょいちょい application/octet-stream を見かけて*1、まぁその辺は「どっちでもなのかなぁ」と。
なんか、以前に「"いいからとにかくダウンロードしろや"って時に octet-stream を使う」的な話を聞いた記憶があるのですが、ちょいとその辺はすみません曖昧な感じです。
とりあえず今回は、綺麗に text/csv を使います、が、まぁお好みで。

ダウンロードファイル名が「なんでもいい」のなら別なのですが、そうでなければまぁある程度指定をしたいと思うので、その辺は指定可能にしておきます。


ヘッダ出力が絡むので、一応「事前に ob_start() がcallされている」前提で記載をしています。
書いてなかったら、ob_end_clean(); をコメントアウトしてください。


出力データは $data に「配列の配列」の形で入っている前提です。

// キャッシュ破棄&終了
ob_end_clean();

// ダウンロード用ファイル名を作成
$download_filename = 'sample.' . date('Ymd') . '.csv';

// 必要なヘッダを出力
header('Content-Type: text/csv');
header("Content-Disposition: attachment; filename={$download_filename }");

// 出力用のハンドルの作成
$file_name = 'php://filter/write=convert.iconv.UTF-8%2FSJIS-win/resource=php://output';
$file_obj = new SplFileObject($file_name, 'w');

// 出力
foreach($data as $datum) {
    $file_obj ->fputcsv($datum);
}

細かい所をちょいちょいと忘れるので、メモ代わりに。

*1:excel とか名の付くヘッダは積極的に無視

共通化についての雑感

いわゆる「コードをひとまとめに、関数とかクラスとかそーゆー感じの箇所にまとめるか否か」ってあたりについて。
おいちゃん的には(一端、現状では)結論が出ていて

・「意味が同じ」ものは絶対に共通化しろ
・「機能が同じ」ものは、どっちでもいいけど共通化しておいたほうが楽
・共通化は二回目

ってな感じでございます。
似たような話は「「意味で括る共通化」と「機能で括る共通化https://gallu.hatenadiary.jp/entry/20160517/p1 」でもしているですが、まぁ。

かみ砕いて。

・「意味が同じ」ものは絶対に共通化しろ
これは鉄則。おいちゃんはよく「論理的共通化」とか呼称したりします、対になるのは「物理的共通化」で、これは後述。
わかりやすい所で「消費税の計算」とか。これを「2箇所以上に散らかす愚か者に最大級の災いあれ」。
「同じ意味」なんだから「1箇所にまとめる」は当然以前の問題でございます。

で、ここで地味にポイントなのが「共通化は二回目 https://gallu.hatenadiary.jp/entry/20150422/p1 」。
なんとなくで切り出すと結構しくじる事があるので、おいちゃんは「見え見えでわかりきっているものでも、グっとこらえて、二回目に共通化する」ようにしているです。

・「機能が同じ」ものは、どっちでもいいけど共通化しておいたほうが楽
これは「どっちでもいい」んですが「共通化しておいた方が(圧倒的に)楽だよ」ってお話と、そこで「あえて共通化しない意味がわからない」ので、結果「とっとと共通化しませう」となります(笑
簡単な例題としては「元値の10%(端数切り捨て)を計算する」処理。
これが「消費税」だったり「手数料」だったりするだろうと思うんですが(そこが一緒なら論理的共通化に基づいて"共通化しろ"で終了)。
「そうでない」場合は、別々に実装しても「とりあえず一端まとめて」もどっちでもよい……のですが、まぁ気付いたんなら

function 消費税計算($元値) {
    return 計算10%端数切り捨て($元値);
}
function 手数料計算($元値) {
    return 計算10%端数切り捨て($元値);
}
//
function 計算10%端数切り捨て($元値) {
    // 略
}

って書いておいたほうが単純に「楽」だなぁ、と。
まぁ勿論後で「手数料は端数切り上げになったのだよ」とか言われる可能性もありますのですが、ンな時は「言われたら書き換える」で終わり。特に何も困らないの感じ。
「共通化はしすぎないほうがいい」とかたまに伺うのですが、正直「意味がわからない」感じでございます。
なのでまぁ「どっちでもよい」のですが、「同じ事を2回書く」とか「2行以上をコピペする」んなら「とりあえず共通化しておいて」ってやっても手間変わらないんじゃなかろうかなぁ? と。

こんな風に考えているので
・「意味が同じ」ものは絶対に共通化しろ
・「機能が同じ」ものは、どっちでもいいけど共通化しておいたほうが楽
・共通化は二回目
ってのを、割とちょいちょい、お話をしたりする訳でございます。

あと、PHPだと「可変関数」とか「可変変数」とか「マジックメソッド」とかその辺を把握しておくと、この辺もまた「色々と"楽になる"事が多い」ような印象がございますので、おまけ的に。

phpでざっくりアドバイザリロック

いわゆる排他制御系。
いやまぁおいちゃん的には「セマフォ使えばいいじゃない終了」で終わるお話なんですが。
PHPセマフォ、一応「コンパイルで指定が必要(coreじゃない)」ので、稀に、極稀に「入ってない環境」とかあるので……いやまぁ「入れろ」って話なんですが。
・多重度1のみ
限定条件だと、まぁ「ファイルによるロック」は色々論外なのですが、もう1つ方法があるよねぇ、ってんで、アドバイザリロック。

端的には「バッチファイル自身を排他ロック」するやりかたで、これなら「バッチが異常終了」しても「プロセス落ちたからロックが外れる」ので、割と面倒が少のうございます。

実装もシンプルなのですが、まぁとどのつまり「実装してみたかった」ので、実装してみます。
なお本記事には「アドバイザリロックって単語をちょいちょい忘れるから備忘録用に記録している」わけではないことを初めに言い訳しておきます。

本題。

まずアドバイザリロックのコード本体は、こんな感じ。
AdvisoryLock.php

<?php
declare(strict_types=1);
function advisoryLock(string $filename) : bool
{
    // ここ、staticにしないと関数ぬけたらインスタンスがGCに行くからファイルcloseされちゃう
    static $file;
    //
    try {
        //
        $file = new SplFileObject($filename);
        if (false === $file->flock(LOCK_EX | LOCK_NB)) {
            return false;
        }

    } catch (\Throwable $e) {
        echo $e->getMessage();
        return false;
    }

    return true;
}

実験用のファイル。
AdvisoryLockExec.php

AdvisoryLockExec2.php
(中身は一緒)

<?php
declare(strict_types=1);
include('./AdvisoryLock.php');

$pid = __FILE__ . ':' . getmypid();
if (false === advisoryLock(__FILE__)) {
    echo "{$pid}  NG\n";
    exit;
}

sleep(3);
echo "{$pid}  ok\n";

で、一応実験。

[gallu@a.b.c.d ~]$ php AdvisoryLockExec.php & php AdvisoryLockExec.php & php AdvisoryLockExec.php & php AdvisoryLockExec2.php & php AdvisoryLockExec2.php & php AdvisoryLockExec2.php
[1] 2272
[2] 2273
[3] 2274
[4] 2275
[5] 2276
/home/gallu/AdvisoryLockExec2.php:2277 NG
/home/gallu/AdvisoryLockExec2.php:2275 NG
[gallu@ik1-315-17990 ~]$ /home/gallu/AdvisoryLockExec.php:2273 NG
/home/gallu/AdvisoryLockExec.php:2274 NG
/home/gallu/AdvisoryLockExec2.php:2276 ok
/home/gallu/AdvisoryLockExec.php:2272 ok

[1] 終了 php AdvisoryLockExec.php
[2] 終了 php AdvisoryLockExec.php
[3] 終了 php AdvisoryLockExec.php
[4]- 終了 php AdvisoryLockExec2.php
[5]+ 終了 php AdvisoryLockExec2.php
[gallu@a.b.c.d ~]$

まぁ、予想通りの期待通り。

まぁ「素直にセマフォにしとこうぜ」とか思うんですが、別解で「これならギリギリ」ってんで、軽めに。

3Dダンジョンを作ってみたい

front系苦手なのですがまぁ「3Dダンジョン作りたいなぁ」という欲求は以前からガチガチに強めなので(笑
とりあえず、試行錯誤を記録してみようかなぁ、と。

一応想定としては
・一端、JavaScriptcanvasワイヤーフレームの3Dダンジョンを作る
あたりが一端のゴールでふ。

んで。
とりあえず「3Dダンジョン書く」のに、マップデータは用意するとして、それを「読み込んで」「ワイヤー書く」必要があるので。
今回はまず「読み込む」あたりを。

f:id:gallu:20210611232754p:plain
こんな感じで、●が自分の位置想定で「n歩先」まで見れると仮定して、こんなxyの座標になると思うのです。
で「これ、計算できないかなぁ?」と思って、ちょりっと思考錯誤して出来るようになったので、メモかてがて。
調査込みなので「本当は関数なりメソッドなりにする」んだけど、その手前のコードをそのまま載せます。

<?php
declare(strict_types=1);
error_reporting(-1);

//
$data = [];

// 迷路で「どのマスまで見るか」
// 配列は[x軸, y軸]
for($i = 1; $i < 4; ++$i) {
    //
    $awk = [];
    // 0ので重複が出るから「一端keyに入れる」「後でkeysで取り出す」にする
/*
    // x軸
    for($x = ($i * -1); $x <= $i; ++$x) {
        $awk["{$x}, {$i}"] = true;
    }
    // y軸
    $x = $i;
    $xx = $i * -1;
    for($y = 0; $y <= $i; ++$y) {
        $awk["{$x}, {$y}"] = true;
        $awk["{$xx}, {$y}"] = true;
    }
*/
    // loopをまとめて
    for($z = 0; $z <= $i; ++$z) {
        // x軸
        $x = $z;
        $xx = $z * -1;
        $awk["{$x}, {$i}"] = true;
        $awk["{$xx}, {$i}"] = true;
        // y軸
        $x = $i;
        $xx = $i * -1;
        $y = $z;
        $awk["{$x}, {$y}"] = true;
        $awk["{$xx}, {$y}"] = true;
    }

    //
    $awk = array_keys($awk);
    sort($awk); // 見やすいように一端
    $data[$i] = $awk;
}
var_dump($data);

さて次は「Mapデータの持ち方」と、そしたら「レンダリング」かなぁ。

MySQLでUNIQUEに引っかかった時のAUTO INCREMENTの挙動

ちとうちの子から

MySQLでユニークキーとPKあるテーブルに対してON DUPLICATE KEY UPDATE張って、uniqueでの重複させるとauto increment値飛んじゃうんだね。。。

という興味深い話を聞いたので、早速実験。

CREATE TABLE test (
    id SERIAL,
    name VARCHAR(256) UNIQUE,
    PRIMARY KEY(id)
);

mysql> insert into test(name) values('n1');
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | n1   |
+----+------+
1 row in set (0.00 sec)

うんまぁ、ここまでは前提。

んでわ、確認。

mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'

mysql> INSERT INTO test (name) values ('n2') ON DUPLICATE KEY UPDATE name='n3';
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | n1   |
|  3 | n2   |
+----+------+
2 rows in set (0.00 sec)

……あ、ほんどだ飛んでる。

mysql> INSERT INTO test (name) values ('n3') ON DUPLICATE KEY UPDATE name='n4';
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | n1   |
|  3 | n2   |
|  4 | n3   |
+----+------+
3 rows in set (0.00 sec)

……続けると飛んでないなぁ。

mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> INSERT INTO test (name) values ('n4') ON DUPLICATE KEY UPDATE name='n5';
Query OK, 1 row affected (0.01 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | n1   |
|  3 | n2   |
|  4 | n3   |
|  6 | n4   |
+----+------+
4 rows in set (0.00 sec)

うん、エラーが起きると飛ぶ………はて?

mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> INSERT INTO test (name) values ('n5') ON DUPLICATE KEY UPDATE name='n6';
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | n1   |
|  3 | n2   |
|  4 | n3   |
|  6 | n4   |
| 10 | n5   |
+----+------+
5 rows in set (0.00 sec)

あ、回数分とんだw

mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n6');
Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO test (name) values ('n7') ON DUPLICATE KEY UPDATE name='n8';
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | n1   |
|  3 | n2   |
|  4 | n3   |
|  6 | n4   |
| 10 | n5   |
| 13 | n6   |
| 14 | n7   |
+----+------+
7 rows in set (0.00 sec)

うん「UNIQUEでエラーするとエラー回数分飛んで、一回insertするとリセットされる」ぽい。

mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n8');
Query OK, 1 row affected (0.01 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | n1   |
|  3 | n2   |
|  4 | n3   |
|  6 | n4   |
| 10 | n5   |
| 13 | n6   |
| 14 | n7   |
| 20 | n8   |
+----+------+
8 rows in set (0.00 sec)

しつこく確認&別に「ON DUPLICATE KEY UPDATE」じゃなくても、飛ぶねぇ……


……あれ? じゃぁ、PKの時にも飛ぶのん?

mysql> drop table test;
Query OK, 0 rows affected (0.07 sec)

mysql> CREATE TABLE test (
    ->     id SERIAL,
    ->     name VARCHAR(256) UNIQUE,
    ->     PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.28 sec)

mysql> insert into test(name) values('n1');
Query OK, 1 row affected (0.02 sec)

mysql> insert into test(name) values('n2');
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | n1   |
|  2 | n2   |
+----+------+
2 rows in set (0.00 sec)

前提作り直して。

mysql> insert into test(id, name) values(1, 'n3');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into test(id, name) values(1, 'n3');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into test(id, name) values(1, 'n3');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into test(name) values('n3');
Query OK, 1 row affected (0.01 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | n1   |
|  2 | n2   |
|  3 | n3   |
+----+------+
3 rows in set (0.00 sec)

ほむ、PKだと飛ばないのか。

mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n1');
ERROR 1062 (23000): Duplicate entry 'n1' for key 'name'
mysql> insert into test(name) values('n4');
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | n1   |
|  2 | n2   |
|  3 | n3   |
|  9 | n4   |
+----+------+
4 rows in set (0.00 sec)

UNIQUEで飛ぶのを確認。

ほむ……まぁ「auto increment、そもそも"連番保証"とかしてないし(確か、MariaDB の Galera Cluster だとノード数に応じて飛んだはずだし)」、ってのはあるんですが。
記憶はしておいて損がないネタ、かも、しれない……誰かよかったら「仕組み側」を書いていただけると喜んで読みに行きますwww