timemachineバックアップ失敗対策のその後

以前の記事ですが、

https://isehara-3lv.sakura.ne.jp/blog/2025/04/06/apple-silicon系のmacbookでnasへのtimemachineバックアップ失敗/

この時点でまだバックアップ設定は成功していなかった

<第一段階の設定の追加>

・NASは毎日5:00AMに起動していて、数時間経過(毎日のバックアップが完了したと思う頃)したら電源オフをプログラム設定している

・MacBook設定 -> これはハズレだったので週一のリフレッシュブートに戻す

% sudo pmset repeat wakeorpoweron MTWRFSU 05:10:00

% pmset -g sched

Repeating power events:

  wakepoweron at 5:10AM every day

設定を戻した、restartと他の設定は共存できないから

% sudo pmset repeat restart S 05:00:00

% pmset -g sched

Repeating power events:

  restart at 5:00AM Saturday

・TimeMachinEditorはバックアップできなかったらリトライする設定 -> 本質ではないけどリブート後の自動スタート(ログオンしたらtimemachineが自動起動)には有効であった

・バッテリーでディスプレイオフ時にスリープさせない -> 本質ではない

<ログファイルから対策>

(2025/4/10)

今朝うまくいかなかったログをLLMに入れると、解決案として~/Logを除外するというのがあったから除外を設定

但しアプリの設定も復元したいならば全部を除外してはいけない

—————————–

~/Library/Application Support や ~/Library/Preferences を 除外しないように注意。

アプリによっては ~/Library/Containers に大事なデータを保存していることもある。

—————————–

とあったからその三つのディレクトリは対象にした

 

設定後のシステムログからtimemachineバックアップ関連を抽出

log show --predicate 'subsystem == "com.apple.TimeMachine" AND eventMessage CONTAINS "Backup"' --style syslog --info --start "2025-04-13 05:00:00" --end "2025-04-13 06:00:00" --timezone local

〜〜〜前後省略して結果だけ〜〜〜

2025-04-11 05:41:47.556152+0900  localhost backupd[504]: (TimeMachine) [com.apple.TimeMachine:CopyProgress] Finished copying from volume “Data”

      77624 Total Items Added (l: 3.7 GB p: 3.89 GB)

      23459 Total Items Propagated (shallow) (l: Zero KB p: Zero KB)

    2718279 Total Items Propagated (recursive) (l: 467.4 GB p: 236.17 GB)

    2795903 Total Items in Backup (l: 471.1 GB p: 240.06 GB)

      66165 Files Copied (l: 3.37 GB p: 3.54 GB)

       9056 Directories Copied (l: Zero KB p: Zero KB)

       2271 Symlinks Copied (l: 171 KB p: Zero KB)

      17029 Files Move Skipped (l: Zero KB p: Zero KB) | 17029 items propagated (l: 4.12 GB p: 4.1 GB)

       6430 Directories Move Skipped (l: Zero KB p: Zero KB) | 2677791 items propagated (l: 463.29 GB p: 232.06 GB)

         80 Files Cloned (l: 191 KB p: 328 KB)

         52 Files Delta Copied (l: 332.8 MB p: 346.6 MB)

この時刻がデスクトップから見える終了時刻、実際にはこの後unmount処理されて終了

以上で3日間は正常(土曜日は再起動後にtimemachineが走り始めたけど、これはTimeMachineEditorの設定が効いている)なので、とりあえず問題は回避できていると思って良さそう、要はtimemachineバックアップでLogファイルをロックできなくてバックアップ処理が途中で止まっていたのが問題で、対象(復元には無関係だろう)のLogファイルをバックアップの処理対象から除外したということ、除外した三つのLogディレクトリをバックアップ時に同じことが起こらないのかという疑問はありますが

 

admin

YoloとEfficientNetの違いと用途

ラズパイ5のカメラから動画取り込んでリアルタイムの認識は、

https://isehara-3lv.sakura.ne.jp/blog/2025/03/29/yoloを使ってみる/

でやってみたけれど、EfficientNetとの比較をラズパイ5でやってみる

Yoloのコードは極めてシンプルだけれども、EfficientNet(TFlite上で動作)は

前処理(cv2使用)やラベルテキスト(ImageNetLabels.txt)からの抽出処理を自前でやらないといけない、まあコードはLLM生成ではありますが

判定を甘くして、上位5個の候補を出力しています、TF(Tensor Flow)だともう少しコードは簡単らしいけれども

# 画面全体から尤もらしい物体を選択する

import cv2
import numpy as np
import matplotlib.pyplot as plt
import tflite_runtime.interpreter as tflite

# モデルロード
interpreter = tflite.Interpreter("EfB3_imagenet.tflite")
interpreter.allocate_tensors()

# 入出力情報
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

# 画像前処理
img_path = "test.jpg"
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_resized = cv2.resize(img, (300, 300))
input_data = np.expand_dims(img_resized, axis=0).astype("float32")

# 推論
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])[0]

# ラベル読み込み
with open("ImageNetLabels.txt", "r") as f:
    labels = [line.strip() for line in f.readlines()]
if labels[0].lower() == "background":
    labels = labels[1:]  # ずれを修正

# 結果表示
top_k = output_data.argsort()[::-1][:5]
for i in top_k:
    print(f"{labels[i]}: {output_data[i]*100:.2f}%")

# 結果を画像に描画
for i, idx in enumerate(top_k):
    label = labels[idx]
    score = output_data[idx]
    cv2.putText(img, f"{label}: {score*100:.2f}%", (10, 30 + i*30),
                cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)

# 表示と終了処理
img_bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
while True:
    cv2.imshow("Window", img)
    if cv2.waitKey(1) & 0xFF == ord('q'):  # qキーで終了
        break
cv2.destroyAllWindows()

<Yolo>

 

 

<EfficientNet>

 

ということで目的によっての使い分けですが、person検出目的ならばYoloだろうというのが現時点、EfficientNetのラベルテキスト(ImageNetLabels.txt)にはpersonというラベルは存在してません

人検出で軽量化を目指すなら、TFlite + efficientdet_lite0.tfliteのような解もありそうですが、ラベル(coco_lables.txt)には80分類ぐらいあります、ちなみにyoloは50分類

 

admin

SpotifyConnect vs AirPlay

時々ではありますが、iPadでSpotifyを動作させているときに、接続が切れてしまう時が月一ぐらいで発生する

iPad(Spotifyインストール) — Node 2(BlueSound)/Volumio2(Raspberry PI zero)の構成でSpotify ConnectでNode 2を選択すれば、Node 2が再生権利を持っていてダイレクトにSpotifyを再生します、接続切れ問題発生時は多くはNode 2のリブート、あるいはWi-Fiルーターの再起動で回復しますが、今回は回復せず

代替え手段としてAirPlayがありますが、これはCD品質なのでそこそこ音は良いのですが、iPadでデコードするから消費電力は増加するはず、Spotify Connectの時はiPadは単なるコントローラーで、iPadは音楽再生時の音源処理がないから

AirPlayを使ってみると、遅延(再生スタート・停止時の)があるようです、と言ってる間に復旧したから原因は不明、Spotify Connectを無効にしてしまうタイミング(一時的にアカウント無効になったとか)があるとしか思えないけども

 

admin

Apple Silicon系のMacBookでNASへのtimemachineバックアップ失敗

まあ以前からMx系のMacBookでは問題は時々起きていますが、

https://isehara-3lv.sakura.ne.jp/blog/2023/10/08/しばらくtimemachineが遅延で完了してなかった/

timemachineeditor使って、毎日早朝にNASのHDDにバックアップしてますが、

最近ほぼ確実にtimemachineバックアップに失敗して、マニュアルでバックアップ起動してます、おそらくIntel CPUに比較してApple siliconのパワーマネージメント系エンハンスが原因だろうと思うので、

スリープさせない設定にして、1回目はバックアップ取れてた、まあまだこの先はわからないけれどもね、ダメなら次を考える

timemachineeditorのマニュアル見る限りも、sleep時のバックアップは不安定と書いているし

https://tclementdev.com/timemachineeditor/

schedule wakesのリンク先には、

https://support.apple.com/ja-jp/guide/mac-help/mchl40376151/mac

sleepを解除する方法の記載、最初からスリープさせなきゃ良いだろうと取れる

 

P.S. (2025/4/7)

ハズレ、でした

 

admin

iTermが原因で夜間のUpdate適用ができなかった

ターミナルソフトをiTerm2に変えると、夜間のアップデート適用に失敗していた、

原因はiTerm終了時に確認を求める設定だからと言うことで、設定のPrompt before closingをneverに設定すれば良いと、確かにアプリ閉じる時に確認されなくなった

 

admin

VMware上のUbuntu24.04のファイル領域拡張

滅多に行わない作業ということと、Ubuntuのバージョンで変わってきている様子、

概ね目安は80%に達したら拡張というふうに考えているので、10GBだけ拡張、参考は以下のサイト

https://qiita.com/mcyang/items/a32b914db073f308a3cb

やることは、

① 物理ボリューム拡張

② 論理ボリューム拡張

③ ファイルシステム拡張

の3点になります、実行結果だけですが、

およそ50%まで余裕ができました、

コンテナが標準で使うようになって、VMwareのUbuntuの出番は少ないのですが、何かの時には出番というところ

 

admin

MacBook Proのターミナルが開かなくなった

突然ですが、Pythonのスクリプト起動中にターミナルが使えなくなりました、正確にはターミナルが消滅して、起動しようとしても以下のメッセージ出て起動ができない

ターミナル使えなかったらパソコンとしては無価値だから代替え手段を探すとiTermというのがあるらしいのでインスト

https://iterm2.com

無論コマンドラインではできないからappをダウンロードして起動すると、

普通に使えそうです良かった、というかターミナルの強化版だから、最初からiTerm使ってた方が良かったんじゃないかな

他にないか調べると、Rustで書かれたAlacirttyというのもあるからこれも入れてみた

https://alacritty.org/index.html

dmgだからターミナルなくてもインストできる

P.S. 2025/4/1

原因を探ってみると、ChatGPTの回答の参照リンク(以下)

https://qiita.com/koma3/items/5df98663463571a14272

に該当していて、以下の対応ディレクトリ(ちょうど起動出来なくなった頃のタイムスタンプのファイルが存在)を一時的にデスクトップに退避すると起動出来ました、まあ標準ターミナルはもう使わないけどね

 

admin

YOLOを使ってみる

ラズパイ5でカメラから取り込んだ画像の処理は、今ならYOLOがそこそこの精度で使えそうだからやってみた

全体の流れと動作確認できるPythonスクリプト

https://techblog-ai.com/【raspberry-pi-5xカメラ】yolov8-リアルタイム推論-usbカメラ-picameraモ/

Yoloのインスト

https://techblog-ai.com/【raspberry-pi-5】yolov8のインストール方法/

但しpipでpicameraインストしてはあかんらしい(見つからないと言われたよ)から、aptでインストした

$ sudo apt install -y python3-picamera2

前の仮想環境(venv)は汚染されたぽいから、新たな仮想環境(venv2)を作る、picameraも別環境だから再度インスト必要

静止画像からの検出スクリプトを動かしてみると

$ cat yolo.py
from ultralytics import YOLO
model = YOLO("yolov8x.pt")
results = model('test.png', save=True)

学習済みモデルの最高精度版(yolov8x.pt)をダウンロードしてきて検出してます、これは壁紙のスクショ(test.png)をターゲットに実行、結果の画像は省略

次にラズパイカメラの動画からの検出は、

こんな感じで、モバイル用の辞書(yolov8n.pt)でも精度は高そうですね

またフレーム周波数は数フレームぐらいでは動いてくれているようです

Yoloは負荷重いから、CPU温度は60℃ぐらいまでアップしてファンは常時回転してますが

 

admin

ラズパイ5のPythonでの音声入力デバイス指定

USBマイクの接続先をUSB2.0のコネクタからUSB3.0にしたら同じコードで入力がされない状態に、コメントアウトしている# device=2,を指定しないとダメ

import vosk
import pyaudio
import json
import numpy as np
import sounddevice as sd
import queue
import threading
import time

class VoskSpeechRecognizer:
    def __init__(self, model_path='./vosk-model-ja-0.22'):
        # モデルの初期化
        vosk.SetLogLevel(-1)
        self.model = vosk.Model(model_path)
        self.recognizer = vosk.KaldiRecognizer(self.model, 16000)
        
        # キュー設定
        self.audio_queue = queue.Queue()
        self.stop_event = threading.Event()
        
        # マイク設定
        self.sample_rate = 16000
        self.channels = 1
        
        # スレッド準備
        self.recording_thread = threading.Thread(target=self._record_audio)
        self.recognition_thread = threading.Thread(target=self._recognize_audio)
        
    def _record_audio(self):
        """
        連続的な音声録音スレッド
        """
        with sd.InputStream(
            samplerate=self.sample_rate, 
            channels=self.channels,
            dtype='int16',
            # device=2,
            callback=self._audio_callback
        ):
            while not self.stop_event.is_set():
                sd.sleep(100)
    
    def _audio_callback(self, indata, frames, time, status):
        """
        音声入力のコールバック関数
        """
        if status:
            print(status)
        self.audio_queue.put(indata.copy())
    
    def _recognize_audio(self):
        """
        連続的な音声認識スレッド
        """
        while not self.stop_event.is_set():
            try:
                audio_chunk = self.audio_queue.get(timeout=0.5)
                if self.recognizer.AcceptWaveform(audio_chunk.tobytes()):
                    result = json.loads(self.recognizer.Result())
                    text = result.get('text', '').strip()
                    if text:
                        print(f"{text}")
            except queue.Empty:
                continue
    
    def start_recognition(self):
        """
        音声認識の開始
        """
        self.stop_event.clear()
        self.recording_thread.start()
        self.recognition_thread.start()
    
    def stop_recognition(self):
        """
        音声認識の停止
        """
        self.stop_event.set()
        self.recording_thread.join()
        self.recognition_thread.join()

def main():
    recognizer = VoskSpeechRecognizer()
    
    try:
        print("音声認識を開始します。Ctrl+Cで終了できます。")
        recognizer.start_recognition()
        
        # 無限ループを防ぐ
        while True:
            time.sleep(1)
    
    except KeyboardInterrupt:
        print("\n音声認識を終了します...")
    finally:
        recognizer.stop_recognition()

if __name__ == "__main__":
    main()

原因はいまいち不明ですが、もとのソースにマイクのチャネル指定はなかった訳だけど、USB3.0側にすると明示しないとダメそうです

sounddeviceで検索すると、0指定にするのが正しそうですが、0にするとエラーが出ます

2はシステムのデフォルト指定なので、それはそれで正しそう、但し2が常にデフォルトではあると限らないから、

device= “sysdefault”,

とデフォルト指定と明示した方が、音声入力手段が複数あれば別ですが、一個しか無いんだったらこれが汎用で使えそうです

$ python
Python 3.11.2 (main, Nov 30 2024, 21:22:50) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sounddevice as sd
>>> print(sd.query_devices())  # すべてのデバイス一覧を表示
   0 SF-558: USB Audio (hw:0,0), ALSA (1 in, 0 out)
   1 UACDemoV1.0: USB Audio (hw:2,0), ALSA (0 in, 2 out)
   2 sysdefault, ALSA (128 in, 0 out)
   3 spdif, ALSA (1 in, 0 out)
   4 lavrate, ALSA (128 in, 0 out)
   5 samplerate, ALSA (128 in, 0 out)
   6 speexrate, ALSA (128 in, 0 out)
   7 pulse, ALSA (32 in, 32 out)
   8 speex, ALSA (1 in, 0 out)
   9 upmix, ALSA (8 in, 0 out)
  10 vdownmix, ALSA (6 in, 0 out)
* 11 default, ALSA (32 in, 32 out)

 

admin

ラズパイ5のドライブをSSDにする

そこそこSDカードの中身も落ち着いてきて、サイズも20GB/64GBぐらいになってきたので、運用寿命と速度を勘案してSSDにしました

仕様は写真から読み取れますが、アダプタボードとNVMe仕様のSSD、サイズは256GBでおそらく一生持ちそう

ディスクの作成は、SD Card Copierを使って行いました、

New Partition UUIDsにチェックは重要、チェックしないと完全クローンになるので、SDカードとSSD同時実装時に区別つきません

最初、チェックしないでコピーしたのでリカバリに苦労、以下LLMに聞きながら実行した手順、要は「MBR/GPTヘッダ完全削除
」をしないとダメのようです

同じUUIDでコピーした時のリカバリ手段、macで単純ディスク消去だと
MBR/GPTヘッダが残ってるらしく不完全な初期化です

$ diskutil list # SSDのドライブ番号を検索する(/dev/disk4 だった)
$ diskutil unmountDisk /dev/disk4	# 外付けSSD番号を指定
# MBR/GPTヘッダ完全削除
(初期化するからディスク名や形式は重要ではないはず)
$ diskutil eraseDisk JHFS+ NewDiskName /dev/disk4
$ sudo dd if=/dev/zero of=/dev/disk4 bs=1M count=100

インストールして、bootデバイスを探す時間は無駄なのでSSDを一番最初にアクセスするような設定に変更します

$ sudo rpi-eeprom-config --edit
 ファイルの461 -> 416に変更(右から順番に探して、6はSSDです)

eepromへの書き込みなので変更直後に同じコマンド打っても反映されずリブートでeepromから読み込まれることで設定が反映されてることを確認できます、また編集ファイルはtmpファイルで中身の妥当性の検証を行ってから本来の設定ファイルを書き換えます

$dfの結果はこんな感じ、

電源オン起動時間は体感でも明らかに早いし、アプリ(例えばブラウザ)の起動も早い、VNCでダミーHDMI入れてないから、相変わらずフレームレートは出ないけども

P.S. デスクアクセス性能

以前SDカードの値があったので比較してみる(上段2,530がSDカードで下段39,288がSSD)

$ sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash


     Category                  Test                      Result     
HDParm                    Disk Read                 90.82 MB/sec             
HDParm                    Cached Disk Read          90.94 MB/sec             
DD                        Disk Write                32.5 MB/s                
FIO                       4k random read            6317 IOPS (25268 KB/s)   
FIO                       4k random write           845 IOPS (3382 KB/s)     
IOZone                    4k read                   29989 KB/s               
IOZone                    4k write                  3288 KB/s                
IOZone                    4k random read            30032 KB/s               
IOZone                    4k random write           3268 KB/s                

                          Score: 2530                             


     Category                  Test                      Result     
HDParm                    Disk Read                 441.07 MB/sec            
HDParm                    Cached Disk Read          432.23 MB/sec            
DD                        Disk Write                345 MB/s                 
FIO                       4k random read            87521 IOPS (350085 KB/s) 
FIO                       4k random write           85333 IOPS (341333 KB/s) 
IOZone                    4k read                   132985 KB/s              
IOZone                    4k write                  169992 KB/s              
IOZone                    4k random read            63871 KB/s               
IOZone                    4k random write           181370 KB/s              

                          Score: 39288                                       

今時のベンチマークに比較して、めちゃくちゃ早いわけではないが、妥当な値と言えるだろう

 

admin