プログラミング
Immichの連写写真を自動でまとめるツールを作りました(immich-burst-stacker)
ディズニーで増えた連写写真を、撮影時刻とphashで自動判定してImmichのスタックにまとめるPython CLIの仕組みを紹介します。実コードの抜粋、安全なscan→確認→applyの流れ、22,431枚から2,351スタックを検出した結果までまとめました。
9 本の記事
プログラミング
ディズニーで増えた連写写真を、撮影時刻とphashで自動判定してImmichのスタックにまとめるPython CLIの仕組みを紹介します。実コードの抜粋、安全なscan→確認→applyの流れ、22,431枚から2,351スタックを検出した結果までまとめました。
プログラミング
ObsidianなどのMarkdown記事を、note.comの下書きとしてそのまま投稿できる自作のCLI/GUIツール note_uploader の紹介です。noteのエディタでは貼れないテーブルを画像に変換し、記事内の画像を自動アップロードし、数式をnoteの記法に書き換えます。複数アカウントの切り替え、投稿済み記事の更新・公開・削除、PVの取得まで、実装コードの抜粋を交えて仕組みごと説明します。コード一式はこのページでMITライセンス・無料のzipとして配布しています。
プログラミング
note.comには公開された公式APIがありません。そこでMarkdownの自動投稿ツールを作るために、ブラウザの通信を観察してnoteの内部APIを一つずつ確かめました。下書きの作成・保存・公開に使うエンドポイント、画像アップロードのpresigned URL、公開PUTが全置換で設定を吹き飛ばす罠、noteのエディタが受け付けるHTMLの形(uuid属性・インラインコード・数式の記法・URLの埋め込みカード・目次)、そして連続アクセスでIPごとブロックされた実話まで、実際に叩いたパスとコードの抜粋つきで記録します。
プログラミング
PandasでCSVを読み込むときに出る UnicodeDecodeError と文字化けの原因を、文字コードの仕組みから説明します。pd.read_csv() が既定でUTF-8として読むこと、Excelで保存したCSVがcp932になりやすいこと、encoding='cp932' を指定して解決する方法、おまけとしてExcel側で文字化けしたときにメモ帳でANSI保存する手順をまとめました。
プログラミング
Obsidianで書いたMarkdownを他のプラットフォームに持っていくとき、二重角カッコのwikiリンクと画像リンクが標準Markdownと違うので表示が崩れます。フォルダを選ぶだけで配下のmdファイルをまとめて標準Markdown形式に書き換えるPythonスクリプトの全文と、正規表現の中身の解説、実際に変換したときの画面をまとめました。標準ライブラリだけで動きます。
プログラミング
ローカルの .md ファイルを構造を保ったままNotionのネイティブブロックとして一括取り込みするPython製ツールの紹介です。Notionに貼ると崩れる理由、行ベースのパーサ・装飾の重なり解決・2000字と100件の上限処理という実装の中身を抜粋コードで説明し、モジュール構成、テスト162件の内訳、Notion側の設定手順、使い方の3シナリオ、よくあるトラブルまでまとめました。
プログラミング
複数のMarkdownファイルをAIに読ませやすい1ファイルに整形しながら結合する、Windows向けの自作GUIツール Markdown Combiner の紹介です。自然順ソート・YAMLフロントマター除去・見出しレベル変換・ファイル名のH1挿入という4つの処理を、実装コードの抜粋を交えて内部の動きまで説明します。ロジック約100行・tkinter画面約130行・ユニットテスト62件の構成です。
プログラミング
YAMLフロントマター付きのMarkdownファイルを選ぶだけで、はてなブログへ投稿・更新できるWindows向けの自作デスクトップアプリ Hatena Blog Publisher の紹介です。AtomPubとWSSE認証、本文をCDATAでそのまま送る仕組み、記事IDをファイルに書き戻して新規と更新を自動判定する設計を、実装コードの抜粋を交えて説明します。ユニットテスト44件の内訳と既知の制限も載せています。
プログラミング
Google TakeoutのZIPを、EXIF整備済み・撮影年フォルダ分類・重複なしの写真ライブラリに変換するWindows向けツール gphoto_backup の紹介です。作った背景から導入手順、シナリオ別の使い方、コマンドとconfig.iniのリファレンス、トラブルシューティングまでまとめました。