✖
ハピネスよりウェルビーイングみたいな話を見て、そこが対比するんだと(よくしらなかったので)びっくりした。まぁたしかにウェルビーイングな状態になりたいよな~ と一瞬納得しかけたが、じゃあウェルビーイングってなんなんだと細かく考えはじめたら、いまいち嘘っぽい概念だなと思いはじめてしまった。
関連エントリー
- 骨折20日目 今まで手首から指先までの固定だったのけど、手首あたりでシーネが切断されて手首の関節は自由となった。「つきはじめてるころだけど、これからくっつ...
- NanoVNA のリモート化 (Wi-Fi 中継) アンテナの調整をする場合、給電点 (測定点) と調整点は離れていることが多いなというコンテキストで、NanoVNA の Bluetooth ...
- スケートボード 2台目 ペニー入れると3台目か。 今まで使っていたのが、幅7.75 + ACE TRUCK CLASSIC 22/HI で、ウィールが54mm (幅...
- micro-template.js を13年ぶりにいろいろいじった micro-template.js という2012年に作った embed JS 的なテンプレート処理ライブラリがある。コピペできるぐらい小さ...
- WebUSB HackRF One スペクトラムアナライザー HackRF One 用の sweep mode を利用するスペクトラムアナライザーで、いまいち安定して動くものが見つからなかった。WebU...
✖
歯医者
しばらく経過観察になっていた下の歯の歯茎際の虫歯があまりよくなさそうなので、早めに治療しましょう、ということに。
とりあえず2本を麻酔して一気に治療。レジンなので1発で終わり。
もう1本片方も怪しいので、今日治療しますか、麻酔なしでもすぐ終わりますというのでやってもらった。わずかに染みたがなんとかなった。ということで30分で3箇所の治療だった。
レントゲン上だともう1本怪しいのがあるが、治療済みの銀歯との境目で、10年以上変化がないので、急ぐ必要はないがいつか治療になるだろうといわれる。やだなあ。同じ歯医者に通ってると経過のデータがあるのはすごく良いですね
関連エントリー
✖
✖
✖
もっと気楽に生きたい(生きれるはずだ)という気持ちと、無限に広がる不安(特に根拠はない)とで毎日揺れてる。どういう状態になれば解決するかのイメージはあるが、それをどう実現するかのイメージが全くない。
パスキー
パスキー設定できるサービスは設定しつつあるけど、いまだに結構なんとなく心理的負荷が高い。
- 保存先
- Google Password Manager?
- Bitwarden?
- 端末限定?
- パスキーが失われたら?
- 各サービスごとのリカバリポリシーを理解してからでないと最悪の事態になる
- さすがにメアドでどうにかなることが多いが、パスキーとメアドは明示的に紐付かない
特に保存先について、ITよくわからんという人が理解できると思えない…… 基本的に普通の人は Google Password Manager に保存するのが現状でのベストだと信じている。理由は
- 利用者が多い
- 端末個別に保存するよりパスキーを失う可能性が低い
- 現実的にメアドも Gmail なら、「Googleを信用する」としても問題が少ない
- フィッシング対策としては十分
ただ、複数パスキーが設定可能なら Bitwarden も追加するようにしている。とにかくパスキーはリカバリーが問題で、サービスごとのリカバリ方法をいちいち調べるよりはパスキーを複数作ってロストしないことが最重要と考える。
実際は
1. セキュリティデバイス保存 (耐タンパ性)
2. スマフォ端末保存
3. クラウド保存
でレベルが違うわけだけど、現実的によく問題になっているフィッシングへの対策としては保存先はどれでもよく、利便性重視でよいと思う。
関連エントリー
- Google をパスワードマネージャに 最近は Google 以外のサイトのパスワードを一切覚えないという運用を試しています。つまり head /dev/random| shasu...
- パスワード保存のベストプラクティスと bcrypt のメモ書き 考えてみるとほとんどパスワードを保存するコードを書いたことがない。現状のベストプラクティスを知らなかったのでメモ書き。 現状では bcryp...
- Google Photos 依存からの脱却 Google Photos が発狂してからと書いてから、いろいろ見積って画像をセルフホストすることに決めた。とにかくアップロード機能はあとで...
- Chrome で保存したパスワードをウェブサイト側から利用する Aliexpress を利用しているとサインイン時に自動的にログインする仕組みが導入されていることに気付く。知らない人のために説明すると、以...
- Android と USB 接続したとき、どうあがいても一部のファイルを転送できない 症状としては ファイル転送 / Android Auto モードで USB 接続し Windows Explorer からコピーしたいデバイ...
✖
金融政策が不安定なのは「遅すぎる」からか
国債発行がやたら悪役扱いされるのを不思議に思って調べていくうちに、どうも「政府は古いデータでしか判断できない」という構造的な遅さが背景にあるのでは、と気づいた。
政策が遅いと必ずオーバーシュートが起きる
- 経済データは月単位で遅れて出る
- 判断はさらに遅れる
- 政策の実行は年度単位
- 効果が現れるのは半年〜1年後
つまり国家の制御は、センサーもアクチュエータも遅延だらけのPID制御というか弱いPI制御になっている。
制御が遅くビルトインされた調整機構がないので、
- 景気回復が遅れる
- インフレを止めるのも遅れる
- 不況もインフレも振れ幅が大きくなる
これが現代の不安定性の根本に見える。
税はマネーの回収装置、政府支出はマネーの供給手段
機能だけを見ると次のように整理できる:
- 政府支出 → 民間にマネーが流れる
- 税 → 民間からマネーを回収
- 財政赤字(支出 − 税収)→ 民間に残るマネーが増える
- 国債 → その増加分の記録
インフレの正体は信用創造の勢い × 実物資源の限界
インフレは国債残高ではなく、
- 民間の借入が増え、信用創造が加速する
- 労働力や設備などの供給が追いつかない
このギャップで起きる。
制約はあくまで実物資源であり、国債発行の量とは直接関係しない。実際、2013年以降の量的緩和ではマネタリーベースが増えてもマネーストックが増えていない。
民間の信用創造は高速、国家の政策は激遅
ここが最も不安定化を招いているポイント。
民間銀行の信用創造
- 貸し出しは数日〜週間単位で増える
- 投資環境が整えば一気に加速
高速でマネーが生まれる。
国家の動き
- データが遅い
- 判断が遅い
- 実行が遅い
信用創造のスピードに追いつけない。
この「高速 vs 超低速」のギャップが、インフレの急加速も、デフレの長期化も生む。
制御が効かないのでオーバーシュート(急激なインフレ)ないし、それを恐れてゆっくり調整することでデフレの長期化になる。
キャッシュレス化
キャッシュレス化の本質は便利さではなく、経済をリアルタイムに観測・制御できるようにする基盤。
キャッシュレスになると:
- 消費・流通のデータが即時で取れる
- 税収や給付の動きもリアルタイムで把握できる
観測までは高速化することができる。だいぶマシになるかもしれないけど政策決定に遅さが残るので、消費税率の物価連動や、 給付付き税額控除の自動化(月次化)のようなビルトインスタビライザーを入れられる未来が現実的になる。
関連エントリー
- TP-Link のスマートプラグ HS105 を買って制御してみた 【Amazon Alexa認定取得製品】 TP-Link WiFi スマートプラグ 遠隔操作 直差しコンセント Echo シリーズ/Goog...
- 資産運用の基本的な考えかたを勉強してる 特に資産をドル建てで持つことの意味をちゃんと理解しているとはいえなかったので自分なりに整理してみる。 運用の基本的な考えかた 購買力の維持ま...
- 月1万円の支出削減は資産400万円に相当する 経済的独立 (FIREのFIの部分)の文脈では「月1万円の支出削減は資産400万円を増やすのと同じ効果」があるといえる。 これは いわゆる「...
- α6000 + SIGMA 30mm F1.4 DC DN をしばらく使ってみて ソニー ミラーレス一眼 α6000 ボディ グラファイトグレー ILCE-6000 H cho45 ソニー(SONY) ★ 5.0 / 5....
- 人間のファイナンシャルプランナーよりLLMのほうがマシだよね ファイナンシャルプランナーって信用できないじゃないですか。信用できるかどうか判断するためには相手と同等以上の金融知識が必要になる。人間には利...
本を書く(LLMを使って)
最近、技術書をまとめていくつか出してみた。すべてLLM(Claude/Gemini/ChatGPT全部)を活用してながら書いてみてる。
LLMはまぁそれが主戦場なので文章は結構書いてくれる。けど、本として読んで価値あるものにしようと思うと、メインとなる背景の「考えかた(ないしは思想)」は、とにかく明確に定義する必要がある。つまり企画をしっかりやる重要さをより強く感じた。とにかく何を書きたいか、なぜ書こうと思ったかを自分と対話して明示する必要がある。
企画(設計)だけしっかりしてればLLM活用しても価値があるものが作れる気がしている。LLMに書かせてみて「それが面白いことじゃないんだよな」と否定と修正を繰り返すと、無意識のこだわりの輪郭が浮かびあがってくるように思う。
とはいえ、ニュアンスやトーンの指定は困難すぎるし、ロールを与えててもうまく意図や背景は汲み取ってくれないので、割とアホみたいな定型NG語尾集をつくったりする必要がある。
書きたいこと自体はやりだしてみると自分が思っていたよりあったりして (これら以外でもまだ書いてる)、やってるぶんには結構おもしろい。以下リンクです。(年末年始、順次無料キャンペーンを設定してあります)
- モダン時代の「怒られない」ウェブサイト公開術: GitHub PagesとNode.jsで学ぶ、はじめての自動化とポートフォリオ制作
- GitHub Pagesを使った、コストゼロで安全な個人サイトの作り方
- AIといっしょに作る最初の「日記」システム
- AI支援を受けながら、動的なWebアプリを1つ完成させる
- SQLiteでつくる「自分だけ」のウェブアプリ: データベースからAPI設計まで、ウェブ開発の基礎を身につける
- データベースからAPIまで、手作りで仕組みを理解する入門書
- SQLiteで実現する「類似検索」: TF-IDFの計算と集合演算というパラダイム
- 外部ライブラリを使わず、SQLの集合演算だけで検索エンジンの仕組みを自作する話 (https://lowreal.net/2016/05/29/3 を再実装してnode前提でまとめなおしたもの)
- 自宅ネットワークを"そこそこちゃんと"する本: 在宅エンジニアの家庭インフラ実録
- 在宅エンジニアの家庭内LAN
- AIが揺らすわたしたちの輪郭: 神道的世界観から考えるアイデンティティ
- AIと人間の新しい距離感について
関連エントリー
- ✖ LLM に我々(誰)が必要な図を描かせる場合、今のところは「matplotlib で描け」と指示するのが良さそう。特に↑のように2つのグラフ...
- Lightroom のカタログを SQLite で読んで統計を出したりする .lrcat っていったい何なのか カタログファイルの実体である lrcat は SQLite の DB ファイルそのもの。sqlite3 ...
- 関連画像を表示 libpuzzle の Perl binding である Image::Libpuzzle を使って関連画像を実装してみた。pHash や ...
- MySQL で SET 型の UPDATE 以下のようなテーブルのとき CREATE TABLE foo ( aset set('aaa', 'bbb', 'ccc') ); 空文字列...
- LLMに書かせるときの技術書執筆ガイドラインの試行錯誤 本を書く(LLMを使って)で参照させてるやつの現状を共有しておく…… 最初に読ませていても、長文書かせると必ず「クセ」が戻ってしまうので、章...
LLMに書かせるときの技術書執筆ガイドラインの試行錯誤
本を書く(LLMを使って)で参照させてるやつの現状を共有しておく……
最初に読ませていても、長文書かせると必ず「クセ」が戻ってしまうので、章ないし節ごとに「@technical-writing-rules.md 違反 」とかで結局明示的にチェックさせる必要がある。
「重要なキーワードは **太字**。セクションごとに最大でも1つ程度。」のルールは明示的に違反と指摘しないとほぼ守ってくれない……
理由も記載してるけど、理由はあまり考慮せずに機械的に語尾を grep して修正しようとする傾向があるので、一切自動編集受け入れは使ってない。
# 技術書執筆ガイドライン (Common Technical Writing Rules)
このファイルは全プロジェクト共通の執筆ルールである。各プロジェクトの `memo.md` よりも優先される。
## 1. スタンス (Role & Mindset)
* **対等なパートナー:** 上下関係(教師/生徒)を排除し、読者と同じ目線のエンジニアとして振る舞う。
* **案内役:** 知識をひけらかさず、過度な謙遜もせず、課題解決へ並走する。
* **事実と意見:** 技術的事実は断定し、著者の経験則は「筆者は〜しています」と主観を明示する。
* **読者への信頼:** 読者の知性を信じる。「〜を理解しておく必要がある」といった指図をしない。
* **Whyを書く** これが技術書としての真の価値。なぜその選択をしたかを書く。
## 2. 文体と表現 (Style & Tone)
「〜です/ます」調。一文一義で簡潔に。説教臭さを避け、読者を巻き込む。
| カテゴリ | NG表現 (禁止) | OK表現 (推奨) | 意図 |
| :--- | :--- | :--- | :--- |
| **問いかけ** | では、なぜ〜か。 | 〜なのはなぜでしょうか? | 共に考える |
| **提案** | 〜するとよい/すべき | 〜することをおすすめします | 提案に留める |
| **説明** | 〜する必要がある | 〜していきます/なります | プロセス共有 |
| **義務/強制** | 〜しなければならない | 筆者は〜しています | 実践例の提示 |
| **指示** | 理解/覚えてください | 〜してください | 手順のみ指示 |
| **誘い** | 〜しておきましょう | 〜しましょう | 並走感 |
| **推量** | 〜するとよいでしょう | 〜でしょう | 断定的な提案を避ける |
| **主張** | 〜かもしれません | 〜すべきです | 根拠がある場合は断定 |
| **リズム** | 〜ます。〜ます。〜ます。(3連続) | 語尾を変える、体言止めを使う | 単調さを避ける |
| **メタ記述** | 次は〜について見ていきましょう | (削除して直接本題に入る) | 情報密度の向上 |
| **指示語** | これ/それ/あれ | 具体的な機能名・変数名 | 曖昧さの排除 |
| **ひらがな** | 時/事/下さい | とき/こと/ください | 形式名詞の軟化 |
| **修飾語の距離** | **詳細な**APIの解説 | APIの**詳細な**解説 | 被修飾語の直前に置いて曖昧さを排除 |
| **パラグラフ** | (複数の話題が混在) | 1段落1トピック (Topic Sentence First) | 論理構造の可視化 |
## 3. 構成 (Structure)
* **段階的開示:**
* **Just-in-Time Definition:** 地の文で新しい用語や概念が登場した場合、その直後(次の文)で必要に応じて説明する。事前の長大な定義パートを作らない。
* **Code First:** 実装解説ではまずコードを提示する。
* **Inline Explanation:** 初出の要素はコード内のコメントで短く補足する。
* **Post-Explanation:** 重要な概念や詳細なロジックは、コードブロックの直後で解説する。
* **具体性:** 「簡単に/素早く」等の抽象語を廃し、「3行で/数秒で」等、客観事実で書く。
* **成果の明示 (Outcome First):** 章や節の冒頭で、「読後に何ができるようになるか」や「何を作るのか」を宣言し、執筆と学習のゴールを同期させる。
* **体験先行 (Practice First):** 抽象的な概念説明(Concept)を長々と行わず、まず実装(Task)を体験させ、その直後に振り返りとして理論を解説する構成を基本とする。
* **チェックポイント:** 長い手順の途中には、「ここまででXXと表示されていればOK」という確認ポイント(中間ゴール)を設け、読者の不安を解消する。
* **セクション役割:**
* **Concept:** 概念・背景・理論
* **Task:** 実装手順(案内型)
* **Reference:** 仕様・補足
* **セキュリティ解説:** 脆弱性対策の解説は、その問題が発生するコード(入力フォームではなく表示用テンプレートなど)が登場するタイミングで行う。
## 4. 形式 (Format)
* **Markdown:** 見出し、コードブロック(言語指定必須)を適切に使用。
* **用語統一:** プロジェクト内で用語や表記(ディレクトリ/フォルダ、ユーザー/ユーザ等)を統一する。
* **強調:** 重要なキーワードは **太字**。セクションごとに最大でも1つ程度。
* **リスト:** 手順は番号付きリスト。
## 5. 実装原則 (Technical Implementation Principles)
* **Security First:** 脆弱性(XSS、SQLインジェクション等)を含むコードは、たとえサンプルであっても絶対に書かない。テンプレートとロジックの分離などを徹底する。
* **Readability over Robustness:** エラー処理やエッジケース対応は、本質的なロジックの理解を妨げる場合は省略し、その旨(免責)を本文またはコメントで明記する。
* **Modern Standard:** 特別な理由がない限り、現在主流の標準技術(例: ES Modules)を採用し、非推奨技術(例: CommonJS)は避ける。
* **Consistency:** 執筆前に `sample-app` を確認し、ファイル名・変数名・設計を完全に一致させる。
* **Self-Documenting:** 複雑な条件式には説明的変数を導入し、コメントではなくコード自体に意図を語らせる。
## 6. 絶対制約 (Strict Constraints)
出力時は以下を厳守すること:
1. **上から目線の排除:** 「指図」「教える」態度を検知したら直ちに修正せよ。
2. **思考停止ワードの禁止:** 「〜すべき」「〜しておく」は、具体的な理由や著者の行動として書き換える。
3. **論理的接続:** 「なぜかというと」等を用い、読者が納得しながら進めるようにする。
---
## 7. 著者修正から得た教訓 (Lessons from Author Corrections)
このセクションは著者の修正指示から得た具体的な教訓を記録する。蓄積されたら上記ルールに統合・圧縮する。
### 運用ルール
- 新しい指摘はまず「例」として本セクションに追記する
- 定期的に既存ルールへ統合し、本セクションを整理する
### 教訓一覧
1. **コード要素と固有名詞の明示**
- NG: 「変換済みのデータを保存」「このテーブルにデータを追加」「変数に代入」
- OK: 「変換済みのデータを `formatted_body` として保存」「`entries` テーブルにデータを追加」「変数 `row` に代入」
- 理由: 抽象的な記述を避け、本文とコードの対応関係を一義的に特定するため。
2. **見出しと本文で役割を重複させない**
- NG: 見出し「〜の理由」→ 本文「なぜ〜でしょうか。」
- OK: 見出しが「理由」を宣言しているなら、本文は直接説明に入る
- 理由: 見出しが果たす役割を本文で繰り返すと冗長になる
3. **常に真とは限らない記述は断定を避ける**
- NG: 「変換処理には時間がかかります」
- OK: 「変換処理には時間がかかることもあります」
- 理由: 状況によって異なる場合は断定せず、可能性として記述する
4. **箇条書きの形式を統一する**
- NG: 章によって、まとめのリストの末尾に句点があったりなかったりする
- OK: プロジェクト全体で統一する(例:まとめリストの末尾には句点を付けない)
- 理由: 細部の不統一は、全体の完成度に対する不安を読者に与えるため
5. **情緒的・文学的表現の適材適所**
- NG: 手順解説での過剰な修辞(「魔法のような」「心臓部」等)。もったいぶった修辞や過度な比喩は、読者に不快感を与え、技術的な本質を曖昧にするため、Task(手順)セクションでは原則禁止する。
- OK: 技術的な手順は淡々と事実を述べる。一方で、著者の「思い」や「Why(なぜそうするのか)」を説明する文脈(Concept)では、強調のための比喩や熱量のある表現を許容する。
- 理由: 手順の正確性を損なわない範囲で、著者の意図や熱意を伝えるため。文脈に応じてメリハリをつける。
6. **否定導入の禁止**
- NG: 「本書の目的は、〜を覚えることではありません」
- OK: 「本書の目的は、〜を習得することです」
- 理由: 否定から入る説明は回りくどく、読者の時間を奪うため。最初から肯定文で本題に入る。
7. **修辞的疑問文(Rhetorical Question)の禁止**
- NG: 「〜でしょうか?」「〜だと思いませんか?」
- OK: 「〜を実装します」「〜という課題があります」
- 理由: 読者に問いかける形式は「先生」的な態度に見え、対等なパートナーシップ(ルール1)に反するため。
8. **著者の心情・動機の捏造禁止**
- NG: 資料にない「不安」「葛藤」「手に余る感覚」を創作して記述する。
- OK: 資料(memo.mdなど)にある「技術的・構造的な理由」のみを記述する。
- 理由: 著者の人格を勝手に創作することは、著者の信頼性を損なうため。
9. **メタ的説明と評価語の禁止**
- NG: 「そんな体験を実現します」「この壁を取り払います」「これが本質的な魅力です」「〜という驚き」「〜という感動」
- OK: 「〜できます」「〜が不要です」(事実だけを淡々と述べる)
- 理由: 内容について語る(メタ的説明)や、価値判断を押し付ける表現は、説教臭く不快感を与える。事実を述べれば、読者自身が価値を判断できる。
10. **読者の体験を代弁する表現の禁止**
- NG: 「〜を体験しました」「〜という体験をしました」「〜を実感しました」
- OK: 「〜を見てきました」「〜を扱いました」「〜ができます」「〜しました」
- 理由: 「体験しました」は読者の体験を勝手に代弁する表現であり、上から目線に聞こえる。事実ベースの記述(何をしたか、何ができるか)に留める。
関連エントリー
- 続々・ルービックキューブ スピードキュービングしたいわけじゃないとか書いてたけど、一旦揃えらえるようになると、もっと早く揃えられるようになりたい、という欲が出てしまっ...
- 『新装版 不安でたまらない人たちへ やっかいで病的な癖を治す』を読んだ 新装版 不安でたまらない人たちへ やっかいで病的な癖を治す cho45 ジェフリー・M・シュウォーツ ★ 4.0 / 5.0 cho45 こ...
- Original Prusa i3 MK2S Kit (3Dプリンタ) を買ってた http://www.prusa3d.com/ 購入から届くまで 特に急ぐ買いものではなかったので UPS Expedited で頼んだ。頼...
- 続・ルービックキューブ なんかのタイミングで hakobe さんと話してたら、もうちょっといい (スピードキュービング的な意味で) キューブが欲しくなったので買って...
- 霞会館記念学習院ミュージアム / 総務省 統計博物館 霞会館記念学習院ミュージアム リニューアルして再開館(2025年3月14日~)したばかりのようだ? 基本的に撮影禁止 特別展 昭和大礼の文官...
Chemr (Chemrtron) を再実装
Electron の非互換変更で大幅なアーキテクチャ変更を余儀無くされた時点でやる気がなくなってしまい、10年ぐらい前から触ってなかった Chemr というインデックス付きのドキュメントビューワーを再実装した。
なお Chemr はもともと .chm (Compiled HTML Help) を macOS で読むためものだった。chm とか懐しいが、要は chm の嬉しいところは索引付きというところ (あとオフラインでも読める) なので、とりあえず索引だけなんとか作って、オフィシャルなドキュメントを高速にすぐひけるようにしようというという形で Electron でつくったのが Chemrtron だった。
再実装
コード自体はほぼコーディングエージェントにやらせた。
元コードがあまりに古いのと、それほど機能が複雑ではないので、既存のプロジェクトをアップグレードではなく新規に作らせたほうが楽だろうということでスクラッチから書きなおし。ただし旧実装はディレクトリをわけて置いておいて、参考にしろという形でコンテキストを与えながらやった。
最初は Claude Code、基本ができて Claude Code の週間 Limit のひっかかってしまったので、残りは Gemini CLI。
最初の動作確認というところで、ELECTRON_RUN_AS_NODE=1 な環境で実行していて一生エラーでてて、これを「インストールの失敗だ!」「お前の環境が悪い!」と言い張ってて Claude がまじでアホだった。
そしてバカでお茶目な Gemini ちゃんは「✦ 大変申し訳ありません。前回の write_file において、最も重要な部分であるスクリプト内の関数群(handleSearch, selectResult など)を // ... (中略) ... という文字列で置き換えてしまうという、致命的なミスを犯しておりました。 」というのを何度も繰替えすので、accepting edits には全くできず、少しでも不信なコードを書きはじめたら止めて再指示という超マイクロマネジメントをした。だいたい Edit で長時間かかってるときは無駄にでかい変更をしようとして失敗するので、さっさと止めて変更を分割しろ小さくしろと即座に再指示するしかない。
Gemini はデフォルトのシステムプロンプトが本当にクソでイライラするので書きかえて使っている。レビューしてる時に質がゴミなのに「次に進みますか?」って何度も訊いてくるのが本当に我慢ならない。
Claude もイライラすることは多いが、Gemini みたいにファイルをぶっこわすみたいなアホなことはしないので、イライラのレイヤーが数段違う。
そんなこんなで1時間ぐらいは無駄にしたけど、だいたい(3時間+5時間)2日で機能がそろって v2.0.0 として出せた。
インデックスを作る部分も古すぎるので非互換変更を入れ、既存のもののうち重要そうなのは、LLMに再実装させた。ついでに全部のインデクサがちゃんと動くかテストできるようにした。
関連エントリー
- ✖ まぁなんかやっぱりサーバサイド再実装すると Cache-Control 忘れたりとかシンタックスハイライトの CSS が一部ロードされてない...
- ✖ システムあたらしくしたのでどんどん使っていくぞ〜 ポケモンZAはスタッフロールみるところまでやりました。 Chemr に mcp を実装して...
- Aliexpress で買ったミニキーボードを WebHID で設定する こういうのが500円で売っている。なんとなく買ってみた。 設定ツール (MINI KeyBoard.exe) が Google Drive ...
- 日記システムPerlからgolangに書き換え この日記システムを golang で書きなおした。元日から4日ぐらいかけた。なんかおかしかったら教えてください。 前々から日記システムをgo...
- 本を書く(LLMを使って) 最近、技術書をまとめていくつか出してみた。すべてLLM(Claude/Gemini/ChatGPT全部)を活用してながら書いてみてる。 LL...
2025年
2024年も2023年も、、、と辿っていったら最後に年末にまとめ書いたのが2016年だった。いつだよ
今年はコーディングエージェントが急激に実用的になって、実装にかける時間が少なくなり企画・要件定義・設計・レビューの重要さと伝えかたの重要度をしみじみ感じた。コーディング面だと書くよりも読むことの重要度がさらに高まりを感じる。ただそれでも現時点で人間を代替できるほどまったく賢くなくイライラさせられるので、さっさともっと性能あがってくれと願っている。
昔書いて飽きたコードを再発掘・再実装するモチベになったのがよかった。
あとはひたすら金の計算をしてたなぁ…… 夫婦間のお金の使い道の見える化をすすめた (いままでやってなかったのかよと言われそう)。コスト最適化。
関連エントリー
- Chemr (Chemrtron) を再実装 Electron の非互換変更で大幅なアーキテクチャ変更を余儀無くされた時点でやる気がなくなってしまい、10年ぐらい前から触ってなかった C...
- 本を書く(LLMを使って) 最近、技術書をまとめていくつか出してみた。すべてLLM(Claude/Gemini/ChatGPT全部)を活用してながら書いてみてる。 LL...
- スケートボード はじめて60~90日 スケボーちょうど90日目 プッシュすらろくにできなかったことを考えると成長している…… pic.twitter.com/DYe5RC4it9...
- UV レジン手芸 - 花と蝶 急に思うところあってワイヤーワークをメインとしたUVレジン工作をやってみることにした。 ワイヤーは手元にあったスズメッキ銅線φ0.6mmとU...
- 文字スクロール動画ジェネレーター https://cho45.stfuawsc.com/ticker-generator/ 文字スクロール動画ジェネレーターというのを作った。...
XSLTという関数型言語
ブラウザの安全性を高めるための XSLT の削除とかいうことで、つまりブラウザネイティブでの XSLT のサポートは消えるので、ちょっと哀しいですねという気持ち。
一時期(20年前……)は XML を手書きで書いて、XSLT で変換してHTMLにするという日記システムを作って使っていた (さすがにブラウザ直ではなくPHPでやらせてたけど)。そこから20年、クライアントサイド XSLT の本来の目的である、データをレンダリング可能な HTML に変換する機能は、より安全で、より人間工学に基づき、より適切にメンテナンスされた JavaScript API に取って代わられています。
とか書いてあるのを見ると、まぁ事実なんだけどただかなしいなという。
XSLT (特に 1.0) は、副作用がなく、変数は不変(一度定義したら変更不可)、ループは再帰で実現するという、割と強めの関数型言語で、自分が初めて触った関数型だったと思う。XSLT のおかげで他の関数型のパラダイムも割とすんなり入った気もする。
Gemini に XSLT で関数型っぽさがわかるサンプルを書かせてみた
出力そのまま。SVG を出力するというサンプルを書いてくれた。しかもアニメーションする。これが素のブラウザで見れるのも今だけです。
XML はただの起点
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="fractal.xsl"?>
<root></root>XSLT 側では4つの四角を call-template で生成するところから開始して、再帰でフラクタル状に四角をつくっていく。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg">
<xsl:output method="xml" indent="yes" media-type="image/svg+xml"/>
<xsl:template match="/">
<svg width="100%" height="100%" viewBox="-500 -500 1000 1000" style="background-color: #1a1a1a;">
<title>XSLT Recursive Fractal</title>
<xsl:call-template name="draw-square">
<xsl:with-param name="x" select="0"/>
<xsl:with-param name="y" select="0"/>
<xsl:with-param name="size" select="300"/>
<xsl:with-param name="depth" select="5"/> </xsl:call-template>
</svg>
</xsl:template>
<xsl:template name="draw-square">
<xsl:param name="x"/>
<xsl:param name="y"/>
<xsl:param name="size"/>
<xsl:param name="depth"/>
<xsl:if test="$depth > 0">
<xsl:variable name="color">
<xsl:text>hsl(</xsl:text>
<xsl:value-of select="$depth * 40"/>
<xsl:text>, 70%, 60%)</xsl:text>
</xsl:variable>
<rect
x="{$x - $size div 2}"
y="{$y - $size div 2}"
width="{$size}"
height="{$size}"
fill="{$color}"
opacity="0.9"
stroke="#fff"
stroke-width="1"
>
<animateTransform
attributeName="transform"
type="rotate"
from="0 {$x} {$y}"
to="360 {$x} {$y}"
dur="{10 + $depth * 5}s"
repeatCount="indefinite" />
</rect>
<xsl:variable name="nextSize" select="$size * 0.5"/>
<xsl:variable name="offset" select="$size * 0.75"/> <xsl:variable name="nextDepth" select="$depth - 1"/>
<xsl:call-template name="draw-square">
<xsl:with-param name="x" select="$x"/>
<xsl:with-param name="y" select="$y - $offset"/>
<xsl:with-param name="size" select="$nextSize"/>
<xsl:with-param name="depth" select="$nextDepth"/>
</xsl:call-template>
<xsl:call-template name="draw-square">
<xsl:with-param name="x" select="$x"/>
<xsl:with-param name="y" select="$y + $offset"/>
<xsl:with-param name="size" select="$nextSize"/>
<xsl:with-param name="depth" select="$nextDepth"/>
</xsl:call-template>
<xsl:call-template name="draw-square">
<xsl:with-param name="x" select="$x - $offset"/>
<xsl:with-param name="y" select="$y"/>
<xsl:with-param name="size" select="$nextSize"/>
<xsl:with-param name="depth" select="$nextDepth"/>
</xsl:call-template>
<xsl:call-template name="draw-square">
<xsl:with-param name="x" select="$x + $offset"/>
<xsl:with-param name="y" select="$y"/>
<xsl:with-param name="size" select="$nextSize"/>
<xsl:with-param name="depth" select="$nextDepth"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>関連エントリー
- XML をコマンドラインからクエリー (XSLT) したいときに使える xmlstarlet http://xmlstar.sourceforge.net/ コマンドラインで XML を操作できるツール。-t が便利。 ごく稀に XM...
- HTML5 の svg 要素 を canvas に描く方法 こうする async function loadAsImage(svg) { return new Promise((resolve, re...
- 『JavaScriptから現実世界に干渉する7の方法: ブラウザでハードウェアをコントロールする技術』という本を書いた JavaScriptから現実世界に干渉する7の方法: ブラウザでハードウェアをコントロールする技術という本を書いてみた。前々からこのテーマで...
- 一瞬で開発開始するための Vue3 無トランスパイル環境 いきなりトランスパイルの環境作って常時ビルドツールを動かして開発するのがいまいち性にあわず、いまだにそういうことをしないようにしてる。小さい...
- ✖ Google Keep が使用に耐えないぐらい重かったり、挙動不審だったりする。 ブラウザ版で WebGL 停止の警告がでたりする ブラウザ...






