金曜日, 8月 1, 2025

Windows11でディスプレイの電源を切りたい ( DisplayPort のホットプラグ対策 )

Windows端末を利用中に DisplayPort で接続するディスプレイ本体の電源を消すとウィンドウの再配置で表示が崩れる事があります。
原因は、DisplayPortの規格でホットプラグに関する仕様があることです。
なので簡単に解決する方法はWindowsの機能としてディスプレイの電源を切る方法です。

最も簡単な電源の切り方は電源オプションの設定で一定時間操作が無い場合に自動で切る方法
ws013533.jpg

しかし、操作はしていないがディスプレイの電源は切りたくないという場合もある
そこで手動にて任意のタイミングに実行する方法を調べると見つけました。
見つけたページ:https://tsutchii.com/display-off

コマンドプロンプトで以下のコマンドを実行

powershell (Add-Type '[DllImport("user32.dll")]^public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)

するとディスプレイの電源を消すことができます。
もちろん、マウスなどの操作でウィンドウの再配置によるレイアウト崩れも無く再開可能です。

でも毎回コマンドのコピペをするのはめんどくさいので、メモ帳などのテキストエディタを使い「Display_Off.bat」というファイル名でコマンドを保存して Stream Deck に割り当てました。 (もちろん、保存した「Display_Off.bat」をダブルクックで起動させても良い)
ws013534.jpg

これで離席時や寝る時などに直ぐディスプレイの電源を消すことができる

日曜日, 2月 2, 2025

壊れかけた HDD / SSD からデータ復元( ddrescue )

HDDやSSDの読み書きが不安定で直ぐに交換したいけど可能な限りデータを残して移行した。
そんな時に活躍するのが ddrescue です。



クローンならddコマンドと思う方もいると思います。
しかし、動作が不安定な状況でddコマンドを使用してもクローンに失敗します。
そこで、ddrescueコマンドを使用します。



ddrescueはクローンをしながら読み込めないデータは0埋め等を行いログを吐いてくれます。
そしてそのログからエラー箇所だけ再度リトライする事も可能という優れたコマンドなんです。



デバイスが認識しているかとクローン元と先をシリアル番号でしっかり確認しましょう

[root@ubuntu:~]# hdparm -i /dev/sda
[root@ubuntu:~]# hdparm -i /dev/sdb



ddrescueのインストール

[root@ubuntu:~]# apt-get update
[root@ubuntu:~]# apt-get install gddrescue



クローン開始(クローン元とクローン先は何度も確認してください)

[root@ubuntu:~]# ddrescue -f -n -v /dev/sda /dev/sdb rescue_logfile.log

-f:上書き
-n:エラーを0埋め
-v:ステータス表示
デバイス:コピー元 コピー先
ログ:任意のファイル名



エラーが出た場合のクローンリトライ(エラーが出なければやる必要ありません)

[root@ubuntu:~]# ddrescue -d -f -r3 -v /dev/sda /dev/sdb rescue_logfile.log

-d:ダイレクトアクセス(キャッシュを介さずにアクセス)
-f:上書き
-r:リトライ回数
-v:ステータス表示
デバイス:コピー元 コピー先
ログ:任意のファイル名(初回実施の名前と同じにする)



上記のリトライを数回繰り返してもクローンができない場合はその個所のデータ復元の可能性は低いです。
まれに読み込める事はあるので何度もリトライする事はお勧めします。

日曜日, 4月 7, 2024

SwitchBotのAPI活用とWebhook設定

SwitchBotでデータ取得

SwitchBotはAPIでデータの取得ができますが、APIの実行回数に制限がある事や、現在の状態を取得はできても過去のデータにはアクセスできません。
そこでWebhookを使い変更時にSwitchBot側から自前のサーバーに通知してもらう事で過去のデータを自前で保管する仕組みを作りました。



MySQLにデータベース構築

※DBの構築は省略
テーブル構成はこんな感じ(JSONの生で登録しています。)

フィールド 種別 その他
No int(11) auto_increment
Registration_Server_Time datetime -
input_json text -



Webhookを受け付けるページを作る

適当なWebサーバー(PHPが動く環境)を用意して設置します。
設置場所例:http://api.hogehoge.jp/SwitchBot/index.php

<?php
// POSTされたJSON文字列を取り出し
$json = file_get_contents("php://input");

//データベースに格納
//[連番][サーバー受信日時][JSON生データ]

if($json == ""){
	print("Not JSON");
}else{
	try {
	  $db = new PDO('mysql:host=localhost; dbname=データベース名', 'ユーザー名', 'パスワード');
	  $db->exec('SET NAMES utf8');
	  $stt = $db->prepare('INSERT INTO SwitchBot_Log(Registration_Server_Time,input_json) 
	  VALUES(:Registration_Server_Time, :input_json)');

	  $stt->bindValue(':Registration_Server_Time', date("Y-m-d H:i:s"));
	  $stt->bindValue(':input_json', $json);
	  $stt->execute();
	  $db = NULL;
	} catch(PDOException $e) {
	  die('エラーメッセージ:'.$e->getMessage());
	}
	print("Registration: OK");
}
?>



Webhookの登録

SwitchBotのデバイス状態に変化があるとSwitchBotのサーバーからWebhookで通知を受けれるように設定します。
※「Authorization」は事前にアプリから取得してください

# AUTH="Authorization:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

# curl -H ${AUTH} -H "Content-type:application/json" -d '{ "action":"setupWebhook", "url":"http://api.hogehoge.jp/SwitchBot/", "deviceList":"ALL" }' -X POST https://api.switch-bot.com/v1.0/webhook/setupWebhook | jq .



データベースを確認

JSONのデータが溜まっていれば成功です。
これで過去のデータにもアクセスができ色々と遊べそうですね。