hikihashiのブログ -5ページ目

hikihashiのブログ

主に購入したガジェット系の感想と、カメラで撮った写真の感想を気ままに書いています。

 今日は横浜の高島屋へ、8/26〜9/7まで開催している「バナナマンのせっかくグルメ!!博覧会」でお昼を食べてきたので、そちらについて書いていこうと思います。

 

 

 

 午前10時半頃に到着したのですが、最終日前日の日曜ということもあり、まだお昼前なのにたくさんのお客さんがおり、イートインのコーナーもすでに長蛇の列になっていました。

 

 

 イートインのラーメン屋は2つあったのですが、もう一つのラーメン屋「TAKETORA」がすでに列が非常に長かったこともあり、個人的にはもう一つの「寿製麺よしかわ」の方が気になっていたので、こちらで食べてきました。

 

 

 ネットでは煮干しそばの画像だけだったので、煮干しそばを食べるつもりで並んでいましたが、メニューを見ると鴨のまぜそばがあったので、煮干しそばは家族に少し分けてもらうことにし、まぜそばを選びました。

 

 

 自分はラーメンを頼むとき、丼ものが欲しくなるので、後で食べるときにお腹いっぱいで食べれなくならないか心配されましたが、食べなかった方が後悔するので、いわし丼を付けることにしました。

 

 

 まぜそばの麺なので太麺でしたが、柔らかいので食べやすく、もちもちとしていたので、少し食べさせてもらった煮干しそばの細麺よりも好みの麺でした。

 

 鴨肉は自分がたまに食べる食感と異なり、柔らかいけれど、それなりに弾力があり、噛みちぎるよりも一口で食べた方が食べやすい感じで、食感は生肉に近いので、ローストビーフみたいに低温調理なのかな?と勝手に思いながら食べていました。

 

 また、写真奥の方にぼやけて見えづらくなっていますが、しっかり火が通った鴨肉もあり、普段食べる鴨肉と違い、独特のクセみたいな味もなかったので、美味しかったですのですが、クセみたいな味が好みな部分もあるので、鴨ってこんな味だったけと思いました。

 

 

 いわし丼は600円とラーメンと比べると割高感はありますが、いわしの刺身は美味しく、タレも刺身によく合っていたので、個人的には鴨肉やラーメンよりも美味しいと思ってしまいました。

 

 丼をつけるとお腹いっぱいにならないか不安でしたが、今回はラーメンを大盛りにできないこともあり、通常サイズだったからか、体重気にしなければまだまだ食べれそうだと感じました。

 

 

 お昼を食べた後は店舗内を少しだけ写真を撮りつつ、お土産を買ったりしました。

 

 

 お土産を購入後、「GELATERIA GELABO」でメロンのソフトクリームを食べてきました。

 

 

 ソフトクリームは急がないと溶けてしまうため、焦って写真を撮った影響で、最初の写真は上の部分が切れてしまいました。

 

 

 メロンのソフトクリームは1つだけ頼み、メロンは家族三人で分けて食べました。

 

 ソフトクリームを食べると高い確率で頭が痛くなり、今回も途中で痛くなったものの、味は程よい甘味で美味しかったので、食べれて良かったと思います。

 

 アイスクリームを食べた後は冷凍のもつ鍋を購入して高島屋を後にしました。

 

 

 今回もたくさん食べたので、今日の夜体重を測るのは少し怖いですが、今日は体重を気にせず食べると決めたので、体重は諦めようと思います。

 

 とりあえず、今回はここまでにし、疲れてしまったので、今日は早めに寝ようと思います。

 今回はブログに載せる写真にウォーターマークを入れる作業を手動から自動化したので、そちらについて書いていこうと思います。

 

 

 今まで手動で写真のリサイズとウォーターマークを入れていたのですが、手動で行うのはやっぱり手間で、たまに外食した写真でブログを書こうと思っても、RAW現像まではしても編集する気までは起きず、結局書かずに終わることがほとんどでした。

 

 自動化の方法を調べても以前は理解できず、今も理解できているわけではないものの、生成AIに聞けば、Pythonを理解しなくても画像の一括処理を行うスクリプトを作成してくれたりと、以前よりも自動化のハードルは下がったので、今回試してみることにしました。

 

 

 今回はPythonというAIの動画を見ていると言葉を聞くことがあるけれど、どういうものか自分には理解できていないプログラミング言語を使って行いました。

 

 自分がPythonというものを理解していなかったので、1回では上手くいかず、2時間ぐらいかかったものの、当時挫折してしまったことを思うと、何日かけてもできなかったことが、たった数時間でできるようになったことにびっくりです。

 

 

 試行錯誤の結果、特定のフォルダ(赤枠のフォルダ)に保存した画像を2MBにリサイズし、ロゴマーク(オレンジの枠のロゴ)を合成して保存用フォルダ(青枠のフォルダ)に保存することができるようになりました。

 

 

 無事にリサイズと透かし入れができるようになったので、最近食べた天丼と蕎麦の写真を早速保存してみました。

 

 

 写真を保存してすぐに保存用フォルダを確認したところ、数枚程度の写真であれば、一瞬で処理が完了していました。

 

 今後は先に一括処理を行ってから、編集が必要な写真だけをAffinity Photoで編集すれば、画像のデータが小さくなるので、不要なメモリを使わずに済むかもしれないと思いました。

 

 

 一括処理をした画像がちゃんと2MB以下にリサイズできているか確認するため、画像をアップロードしてみました。

 

 

 

 ちゃんと2MB以下にリサイズされていたので、特に編集しなくても問題なくアップロードすることができました。

 

 ロゴマークの位置も思った場所に置くことができ、サイズも最初大きくなってしまったのですが、コードの数字を書き換えることで簡単に想像通りのサイズに変更することができました。

 

 数枚だとリサイズも透かし入れもそこまで時間のかかる作業ではないものの、ファイルに保存するだけで10秒もかからずに終わってしまったため、一括処理ってこんなに便利だったのかと感動しました。

 

 

 Pythonを使った自動化スクリプトの作成は数ヶ月ほど前にローカルLLMを色々と試していた頃、Obsidian Web Clipperで保存した記事の内容を要約させ、別のフォルダに保存させる作業を自動化した時に使ったのですが、やり方をすっかり忘れました。

 

 コードなどはGeminiに書いてもらうので、良いのですが、せめてどこに入力するかぐらいは覚えておきたいので、最後にメモを残そうと思います。

 

 下準備として画像処理用ツールをターミナルに下記のコードを入力してダウンロードするとのこと。

pip3 install pillow watchdog

 それから、下記のコードをテキストエディタというWindowsのメモ帳みたいなアプリを開いて貼り付け。

import os
import time
from PIL import Image, ImageEnhance, ImageOps
from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer

# --------------------------------------------------
# パス設定(環境に合わせて修正してください)
# --------------------------------------------------
WATCH_DIR = "/Users/NAME/Pictures/SILKYPIX"  # 監視対象フォルダ
OUTPUT_DIR = "/Users/NAME/Pictures/Ameba"  # 保存先フォルダ
LOGO_PATH = "/Users/NAME/Pictures/logo.png"  # 使用するロゴ画像 (透過PNG)

# 設定値
TARGET_SIZE_BYTES = 2 * 1024 * 1024  # 2MB
LOGO_RATIO = 0.12  # 写真の横幅に対するロゴの大きさ (例: 15%)
MARGIN_PX = 20  # 端からの余白 (px)


def process_and_save_image(src_path):
    """画像を処理して2MB以下で保存する"""
    filename = os.path.basename(src_path)
    output_path = os.path.join(OUTPUT_DIR, filename)

    # フォルダの自動作成
    os.makedirs(OUTPUT_DIR, exist_ok=True)

    # SiILKYPIXからの書き出し完了を少し待つ(ファイルロック回避)
    time.sleep(2)

    try:
        with Image.open(src_path) as img:
            # 1. Exifに基づく画像の回転補正
            img = ImageOps.exif_transpose(img)
            working_img = img.convert("RGBA")

            # 2. ロゴマークの合成
            if os.path.exists(LOGO_PATH):
                with Image.open(LOGO_PATH) as logo:
                    logo = logo.convert("RGBA")

                    # ロゴのリサイズ(長辺の一定割合に合わせる)
                    target_logo_width = int(working_img.width * LOGO_RATIO)
                    logo_aspect = logo.height / logo.width
                    target_logo_height = int(target_logo_width * logo_aspect)

                    resized_logo = logo.resize(
                        (target_logo_width, target_logo_height),
                        Image.Resampling.LANCZOS,
                    )

                    # --- 【変更箇所】左下の配置位置計算 ---
                    pos_x = MARGIN_PX
                    pos_y = working_img.height - target_logo_height - MARGIN_PX

                    # 合成
                    working_img.paste(
                        resized_logo, (pos_x, pos_y), resized_logo
                    )

            # 3. RGB変換(JPEG保存用)
            final_img = working_img.convert("RGB")

            # 4. 2MB以下に収める品質・サイズ自動調整
            quality = 95
            while quality >= 30:
                final_img.save(output_path, "JPEG", quality=quality)
                file_size = os.path.getsize(output_path)

                if file_size <= TARGET_SIZE_BYTES:
                    print(
                        f"成功: {filename} を保存しました ({file_size / (1024*1024):.2f} MB / Quality: {quality})"
                    )
                    break

                # 容量オーバーの場合は品質を下げる
                quality -= 5

            # 品質調整のみで2MBを下回らない場合の解像度リサイズ退避処理
            if file_size > TARGET_SIZE_BYTES:
                final_img.thumbnail(
                    (working_img.width * 0.8, working_img.height * 0.8),
                    Image.Resampling.LANCZOS,
                )
                final_img.save(output_path, "JPEG", quality=85)
                print(f"リサイズ適用して2MB以下に収めました: {filename}")

    except Exception as e:
        print(f"エラー発生 ({filename}): {e}")


class ImageHandler(FileSystemEventHandler):

    def on_created(self, event):
        if event.is_directory:
            return
        if event.src_path.lower().endswith(
            (".jpg", ".jpeg", ".png", ".tiff")
        ):
            print(f"検知: {event.src_path}")
            process_and_save_image(event.src_path)


if __name__ == "__main__":
    event_handler = ImageHandler()
    observer = Observer()
    observer.schedule(event_handler, WATCH_DIR, recursive=False)

    print(f"監視開始: {WATCH_DIR}")
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

 フォーマットを「⌘+⇧+T」を押して「標準テキスト」へ変更後、名前をつけて保存する際に、拡張子を.pyにして保存。

 

 監視対象のフォルダ、保存用フォルダ、そしてロゴマークのパスはターミナルに貼り付ければ表示されるため、そちらを参照。

 

 Geminiに最初聞いた際、保存先をiCloud上のDocumentsに保存するよう指示があったが、iCloud上のフォルダに保存すると自動化が上手くいかなかったので、PC上に適当にScriptsという名前のフォルダを作成して保存。

 

 その後、Macで常時起動させるために設定ファイルを作るらしく、こちらもテキストエディタを使用して作成。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.autowatermark</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/python3</string>
        <string>/Users/NAME/Scripts/auto_watermark.py</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

 フォーマットを標準テキストに変更し、拡張子を.plistにして保存。

 

 保存場所をFinderを開いて、メニューバーから移動を選び、フォルダへ移動で「⁠~/Library/LaunchAgents⁠」と入力し、LaunchAgentsのフォルダを開いて、そこに作成した設定ファイルを保存。

launchctl load ~/Library/LaunchAgents/com.user.autowatermark.plist

 最後に上記のコードを入力すれば終わりだったのですが、ファイルの保存場所を当初iCloud上にしてしまったのが原因なのか、ターミナルで手動でオンにした時しか画像の処理が起きなかったため、ファイルの場所をローカル上へ移動。

launchctl unload ~/Library/LaunchAgents/com.user.autowatermark.plist
launchctl load ~/Library/LaunchAgents/com.user.autowatermark.plist

 最後に上記のコードを入力し、設定を読み込み直して無事に画像のリサイズと透かし入れを自動でしてくれるようになりました。

 

 

 とりあえず、今回も長く、上手くまとまらなかったものの、ブログに載せる写真を自動化で一瞬で処理できるようになったので、今後はちょっとしたことでも日記をかけたら良いなと思いつつ、今日は終わろうと思います。

 今回は「Eufy Security eufyCam 2C 1-Cam Kit」を設置してから2週間が経過したので、改めて感想を書いていこうと思います。

 

 

 物置に設置して今日で2週間が経つので、バッテリーの減りがどの程度か確認してみることにしました。

 

 

 2週間経過で100%→86%と14%低下していますが、バッテリーの状態が88%まで購入時点で落ちているので、バッテリーの減りは思ったよりも緩やかに減っているみたいです。

 

 表示されている数字がどこまで正しいかは残念ながら分かりませんが、これなら2〜3ヶ月は充電しなくても問題なさそうに思えます。

 

 

 

  当初物置の正面から見て右側にカメラを設置していたのですが、それだとお隣の庭が映ってしまっていたため、左側に設置することにしました。

 

 これにより、玄関側も映るようになったので、1日に何回かは人を検知し、録画されるようになりました。

 

 

 ただ、検知感度は最大にしているものの、玄関を出入りしても検知されないことが度々あるので、距離が離れているとやっぱり精度が落ちるみたいです。

 

 もう一台の屋外カメラ「Tapo C520WS」も道路を走る車は検知しても、歩いている人は検知してくれないので、ある程度距離があると上手く認識されないみたいです。

 

 

 最後にeufyアプリを使っていて気になる点を書いて終わろうと思います。

 

 一つはログイン台数の制限があることで、自分の場合はeufyアプリをiPhone 17、Mac mini、iPad Pro、iPad mini、Xperia Pro-Iに入れて使っています。

 

 iPhone 17とXperia Pro-Iはログイン状態を維持したまま使えているのですが、Mac mini、iPad Pro、iPad miniの場合は3つの内どれか1台しかログインできず、ログインし直すのが面倒なので、持ち出しが多いiPad miniで現在は使っています。

 

 個人的にはログイン台数の制限は使っていて不便なので、ログイン台数の制限がないTapoの方が使い勝手が良いと感じました。

 

 もう一つはカメラの設定のアイコンの隣にアラームっぽいボタンがあることです。

 

 

 右上にある設定の歯車アイコン横にアラームっぽいボタンがあるのですが、なんだか間違えて押してしまいそうと毎回設定を開く時に不安になります。

 

 ただ、今のところ一度も押したことがないので、正直アラームなのかよくわかっておらず、違うボタンの可能性もありますが、押したら音が鳴りそうで怖く、押したことがありません。

 

 他にも使い始めの頃は気になる点はありましたが、使っているうちに気にならなくなったので、2週間経っても気になる点としては以上の2点になります。

 

 

 とりあえず、今回も上手く言葉がまとまりませんでしたが、ここで終わろうと思います。