社会人から始めたプログラミング

プログラミング、エンジニアに関することでの備忘録、シェアしたい情報などを共有するためのブログです。

子どもがスマホで勝手に撮った写真300枚を、AIと作った自作ツールで仕分けた話

うちの子はスマホを渡すと、無邪気に写真を撮りまくる。気づくとカメラロールには、床、天井、指、ブレブレの顔、ほぼ同じ構図の連写が大量に溜まっていた。その数、およそ300枚。

いい写真も混ざっているのが厄介で、全部消すわけにはいかない。かといって1枚ずつ確認して消すのは苦行。既存のアプリも探したが、「クラウドに写真をアップロードする」タイプが多く、家族写真を外部サーバーに送るのは気が進まなかった。

ないなら作ればいい、ということでAI(Claude)に相談しながらツールを作った。

フォトえらび: https://photo-erabi.pages.dev

フォトえらび(デモ画像)

(無料・登録不要・Chrome/Edge対応。お試しデモモードあり)

できること

  • ブレ・ピンボケ、暗すぎ、単色でなにが写ってるか不明、指の写り込みっぽい写真を自動で「消す候補」に振り分け(理由付きで🤖バッジ表示)
  • そっくりな連写はグループ化して、見比べながら1枚だけ残せる
  • 顔検出つき: 「ドアップで見切れ」「顔がブレてる」を消す候補にしつつ、いい笑顔の写真は自動でひいきして残す側に
  • 動画対応: フレームをサンプリングしてブレた動画も候補に
  • 自動判定のきびしさは「ゆる/ふつう/きびしめ」で切替可能
  • 「消す」と判定してもいきなり削除せず、フォルダ内の「_削除候補」フォルダに移動するだけ。最終確認はサムネイル一覧+拡大表示つき

こだわり: 写真を1枚も外部に送らない

このツールはただのHTMLファイル1枚で、処理はすべてブラウザ内で完結する。サーバーには何も送信しない。

  • フォルダへのアクセス: File System Access API(フォルダを選ぶだけで読み書き)
  • iPhoneのHEIC写真: libheif(WASM)をWeb Workerで並列実行してブラウザ内で変換
  • ブレ検出: ラプラシアン分散。「画面のどこにもピントが合っていない」判定にブロック分割を併用
  • そっくり判定: dHash(perceptual hash)のハミング距離
  • 顔・笑顔検出: face-api.js(TensorFlow.js)。これもブラウザ内で動く

「顔認識までローカルでやるの?」と思われるかもしれないが、今のブラウザは普通にできる。むしろ子どもの写真を扱うツールこそ、こうあるべきだと思う。

AIとの開発について

実装はほぼClaudeに任せて、自分は「実際に使ってみてのフィードバック」に徹した。「消す候補がもっと出ていい」「そっくり写真はどっちを残すか自分で選びたい」「この写真が弾けてない(実物を渡す)」のような要望を投げると、実際のサンプル画像を計測してしきい値を調整してくれたのが面白かった。

体感としては、コードを書く時間より「何が欲しいかを言語化する時間」が圧倒的に長い。逆に言えば、言語化さえできれば動くものが出てくる。

使い方

  1. スマホの写真をPCのフォルダにコピー(iPhoneはUSB+イメージキャプチャが楽。AirDropなら100枚ずつ小分けが安定)
  2. https://photo-erabi.pages.dev をChrome/Edgeで開いてフォルダを選ぶ
  3. 自動チェック後、一覧を見ながらポチポチ修正して、最後に移動を実行

写真を用意しなくても、トップページの「お試しデモ」でサンプル画像を使って動きを見られます。

おわりに

同じ悩みを持つ親は多いはず。無料で公開しているので、カメラロールが子どもの芸術作品で溢れている方はぜひ。感想・要望はThreads(@hi_its_ok)まで。

【解決済み】PostgreSQLに繋がらない!『ユーザー不在』と『ポート競合』の地獄を乗り越えるデバッグロードマップ

序章:開発者が陥る接続エラーの「三重苦」

PostgreSQLへの接続で、「FATAL: role not exist」や「Connection refused」という複数のエラーが絡み合い、何が原因かわからなくなった経験はありませんか?

これは、エラーの真の原因が他の問題によって巧妙に隠蔽されている「三重苦」の状態です。この記事は、私がColima/Docker環境で直面したこの複雑な問題を、**「ネットワーク → 認証 → ユーザー」**の順に切り分け、解決に至ったデバッグロードマップの記録です。

表面的なエラーメッセージではなく、システムの各層をチェックすることの重要性をお伝えします。


第1章:すべての元凶 — ネットワーク競合の罠

接続エラーが出たとき、認証やユーザー名を疑う前に、まずポートが物理的に開いているかを確認する必要があります。これが、すべての問題を隠蔽していた「真犯人」です。

1.1 ツールの嘘を暴く:ローカルプロセスとの戦い

私が直面した当初のエラーは認証に関するものでしたが、最終的に原因を突き止めたのは、ポートの占有でした。

Dockerが使用するポート5432を誰が使っているかを確認します。

sudo lsof -i :5432

【ハマった壁と真実】

lsofの結果、DockerではないローカルにインストールされたPostgreSQLサーバーがポート5432を占有していました。このローカルサーバーが接続を横取りしていたため、Dockerコンテナにアクセスできなかったのです。

さらに、このプロセスをkillしても、すぐにシステムサービスが再起動させてしまうという問題が発生しました。

1.2 解決策:自動再起動を伴うプロセスの永続的な停止

単なるkillは応急処置にしかなりません。サービスマネージャーを通じてサービス自体を停止させることが必須です。

  1. サービスの特定と停止: HomebrewでPostgreSQLをインストールしていたため、以下のコマンドでサービスを停止しました。 ```bash

    Homebrewサービスを通じて永続的に停止

    brew services stop postgresql ```

  2. ポートの解放確認: sudo lsof -i :5432の出力が空になったことを確認します。
  3. Dockerを再起動: ポートが解放されたことを確認し、Dockerコンテナにポートをバインドさせます。 bash docker compose restart postgres

教訓:エラーメッセージを信じるな。まずlsofでポートが空いているかを物理的に確認すべし。ネットワークの競合は、すべての接続エラーを隠蔽する最初の関門です。


第2章:パスワードの闇 — 認証エラーの正体とリセット術

ネットワーク競合を解決した後も、「パスワード認証に失敗しました」というエラーが残りました。これは、正しいパスワードがわからなくなっているサインです。

2.1 究極の解決法:パスワードを強制リセット

パスワードが不明な場合、認証を一時的に無効化し、パスワードを上書きリセットするのが最も早い方法です。

  1. pg_hba.conftrustに設定: pg_hba.confを編集し、127.0.0.1/32からの接続を一時的にtrust認証(パスワード不要)に変更し、コンテナを再起動またはリロードします。

  2. パスワードなしでログイン: trust認証が効いている間に、パスワードなしでログインします。

    psql -h 127.0.0.1 -p 5432 -U postgres -d postgres
    # パスワードを尋ねられても何も入力せずEnter
    
  3. パスワードをリセット: ログインに成功したら、新しい安全なパスワードを設定します。

    ALTER USER postgres WITH PASSWORD 'MyNewSecurePwd';
    \q
    
  4. セキュリティの復元: 必ずpg_hba.conftrustを**md5に戻し**、Dockerを再起動します。

教訓:パスワード不明時は、認証を一時的にバイパスし、パスワードを上書き設定する。これが、認証問題の最速ルートです。


第3章:ユーザー不在の怪 — カスタムイメージとロールの罠

最終的に、認証が突破できない問題の背景には、**「FATAL: role "postgres" does not exist」**という、カスタムDockerイメージ特有の問題がありました。

3.1 存在しないユーザーでのロックアウト

データボリュームをリセットしてもpostgresユーザーが作成されないのは、カスタムイメージが標準のpostgresロールを作成しないか、別の名前の管理者ユーザーを作成しているためでした。

私は最終的に、内部接続を試みたログから**「new_admin_user」**というユーザーが生存していることを突き止め(自分で名前とパスワードを設定して作成できていたユーザー)、そのユーザーとして接続を試みることで、ロックアウトを解除できました。

3.2 最終的な接続情報(読者向け)

複数のエラーを乗り越えた後の最終的な接続情報は、以下のようになりました。

項目 解決後の値 備考
ホスト名 127.0.0.1 一旦接続を確認するため、host.docker.internalではないものを使用
ユーザー名 postgres リセットとリネームで復活させた正しい管理者名
パスワード MyNewSecurePwd 自分で設定し直した値

まとめ:複雑なデバッグを効率化するロードマップ

複雑なエラーに遭遇した際は、闇雲に設定をいじるのではなく、下位レイヤーから確実に切り分けていくことが重要です。

  1. ネットワーク層sudo lsof でポートの競合(Connection refusedの原因)を排除する。
  2. 認証層pg_hba.confを**trust**にして、パスワードの問題を切り分ける。
  3. ユーザー層psqlでログインし、**\du**で実際に存在するユーザーを確認する。

この経験が、皆さんのデバッグ時間短縮に役立つことを願っています。

AVCHDの動画をiPadやiPhoneで見れるようにする方法 / 大量の動画だったので Macと iMovie と ffmpegで解決

簡単な流れ

  1. AVCHDをMacでmovファイルに変換(iPad / iPhoneで見れるように)

  2. Mac標準アプリ(iMovie)でAVCHDをMOVファイルに変換

  3. Mac のターミナルで mov を mp4に変換

経緯

知人からビデオカメラで撮影したらAVCHDのファイルだったのでiPadで視聴できず。 Macで簡単にMOVファイルに変換してみたがiPadで視聴できず。 ターミナルでmovをmp4に変換してやっとiPadでも視聴できるようになったので共有です。

やり方

  1. iMovieでAVCHDファイルを読み込む(ドラッグ&ドロップが楽です)

  2. 読み込み完了後、読み込んだファイルを1つ選択

  3. 1つ選択した状態で、 メニュー > ファイル より「Finderに表示する」を選択 選択したMOVファイルといっしょに他にも変換された動画も同じ場所にあります!

  4. ターミナルのアプリを開いて brew install ffmpeg のコマンドを入力 (動画ファイル変換ツール ffmpeg 結構時間かかったので半日ぐらい放置しました)

  5. インストールされたあと、 ffmpeg -i test.MOV test.mp4 と打てば変換できます。

6.(必要だったら)複数ファイルを同時に変換したい場合、上書きせずに出力結果を得たい場合、次のようにする手があります。

対象のフォルダに移動: まず、ターミナルでMOVファイルが保存されているディレクトリに移動します。例えば、デスクトップにあるフォルダの場合は次のようにします。

cd ~/Desktop/your_folder_name

さらに mkdir mp4_output で出力先を書いて

for file in *.mov; do
    ffmpeg -i "$file" "mp4_output/${file%.mov}.mp4"
done

と書けば移動した先のmovファイルがmp4_outputフォルダに出力されます。

以上!