概要
紹介します
環境
- macOS 15.7.1
- UTM 4.7.4
- Ubuntu 24.04
共有設定
マウント
sudo mkdir -p /mnt/share
sudo mount -t 9p -o trans=virtio share /mnt/share
最後に
特にツールのインストールは不要でした
qemu-guest-agent も不要っぽいです
紹介します
sudo mkdir -p /mnt/share
sudo mount -t 9p -o trans=virtio share /mnt/share
特にツールのインストールは不要でした
qemu-guest-agent も不要っぽいです
plist を作成し launchctl に登録すると管理が楽になります
今回の設定は Mac 起動時に自動で SD-WebUI も起動する設定です
停止した場合に自動で再起動したい場合は KeepAlive=true を設定します
<?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>local.mac.sdwebui</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/user01/Documents/work/stable-diffusion-webui-forge/webui.sh</string>
<string>--force-upcast-attention</string>
<string>--listen</string>
<string>--api</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/user01/Documents/work/stable-diffusion-webui-forge</string>
<key>StandardOutPath</key>
<string>/tmp/sdwebui.log</string>
<key>StandardErrorPath</key>
<string>/tmp/sdwebui.err</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
ターミナルを立ち上げてフォアグラウンドでプロセス管理すると辛い場合には素直に launchctl 化しましょう
直接 plist を見るしかないのでシェルスクリプトを使いましょう
#!/bin/bash
# launchctl list で "local.mac" を含むタスクのラベルを取得
labels=$(launchctl list | grep local.mac | awk '{print $3}')
echo "Label -> Schedule"
for label in $labels; do
# plist の候補パス
plist_path=""
for dir in ~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons /System/Library/LaunchDaemons; do
if [ -f "$dir/$label.plist" ]; then
plist_path="$dir/$label.plist"
break
fi
done
if [ -z "$plist_path" ]; then
echo "$label -> plist not found"
continue
fi
# plist を JSON に変換して jq でパース
json=$(plutil -convert json -o - "$plist_path" 2>/dev/null)
if [ -z "$json" ]; then
echo "$label -> failed to parse plist"
continue
fi
echo "$label ->"
# RunAtLoad
run_at_load=$(echo "$json" | jq -r '.RunAtLoad // empty')
if [ "$run_at_load" == "true" ]; then
echo " RunAtLoad: true"
fi
# StartInterval
start_interval=$(echo "$json" | jq -r '.StartInterval // empty')
if [ -n "$start_interval" ]; then
echo " StartInterval: every $start_interval seconds"
fi
# StartCalendarInterval (複数対応)
intervals=$(echo "$json" | jq -c '.StartCalendarInterval // empty')
if [ -n "$intervals" ]; then
echo " StartCalendarInterval:"
echo "$intervals" | jq -r 'if type=="array" then .[] else . end | " Hour: \(.Hour // "-"), Minute: \(.Minute // "0")"'
fi
echo "-------------------------"
done
Label -> Schedule
local.mac.1 ->
StartCalendarInterval:
Hour: 1, Minute: 0
Hour: 4, Minute: 0
Hour: 7, Minute: 0
Hour: 10, Minute: 0
Hour: 13, Minute: 0
Hour: 16, Minute: 0
Hour: 19, Minute: 0
Hour: 22, Minute: 0
-------------------------
local.mac.2 ->
StartCalendarInterval:
Hour: 8, Minute: 0
-------------------------
local.mac.3 ->
StartCalendarInterval:
Hour: 8, Minute: 5
-------------------------
local.mac.4 ->
StartCalendarInterval:
Hour: 5, Minute: 30
Hour: 11, Minute: 30
Hour: 17, Minute: 30
Hour: 23, Minute: 30
-------------------------
local.mac.5 ->
StartCalendarInterval:
Hour: 9, Minute: 0
Hour: 12, Minute: 0
Hour: 18, Minute: 0
Hour: 21, Minute: 0
-------------------------
local.mac.6 ->
StartCalendarInterval:
Hour: 8, Minute: 5
-------------------------
もっと簡単に確認できる方法はないだろうか
azw 形式で保存されているようです
~/Library/Containers/com.amazon.Lassen/Data/Library/eBooks/
にあります
ここに例えば
ls -1 ~/Library/Containers/com.amazon.Lassen/Data/Library/eBooks/656E9450124248548B2D10040C0D5C49/8E5F7013-72F0-4E8F-BAA6-7CDEB12AF911/
BookManifest.kfx
BookManifest.kfx-shm
BookManifest.kfx-wal
CR!0B9WM943SN7XB8HF8PSND9217QTB.azw8
という形式で保存されています
パーソナルドキュメントもそうですが一度 kindle にファイルをアップロードすると PDF などでダウンロードできなくなります
azw という独自の形式を kindle アプリで復号化して閲覧しているようです
なぜ調子悪くなるのかそしてなぜこれで改善するのかは不明
https://www.reddit.com/r/apple/comments/116uxf6/solved_apple_mac_mini_m2_pro_wifi_issue/
要は再起動ではなく電源オフ -> オンをしてみましょうということです
Mac というよりかはルータの設定の可能性もあります
HG8045Q の場合はデフォルトだと Wifi の各周波数帯が自動になっており不安定になることがあるので Wifi チャネルを 1 or 36 に固定しましょう
Mac は一度起動すると基本シャットダウンしないので定期的にしましょうということなのだと思います
Apple Sillicon 上に BlueStacks Air をインストールしアプリを起動するまでの手順を紹介します
まだベータ版です
ここ https://www.bluestacks.com/ja/mac からインストールします
通常の Bluestacks は homebrew でインストールできますが Air は直接ダウンロードしインストールします
ダウンロードした dmg からインストールしましょう
インストールが完了したらアプリーケーション配下に移動した「BlueStacks.app」を起動します
起動すると初回は広告のような動画が流れます
起動すると以下のような画面になります
必須なのでログインしましょう
ログイン後 Google Play のアップデート処理がかかるので待ちましょう
かなり時間がかかる印象です、1時間は見たほうがいいかもしれません
「Search for Games & Apps」から好きなアプリを検索します
どうやらまだ起動できないアプリが多いようです
執筆時点では Pokemon TCG はプレイできませんでした
Apple Sillicon で BlueStacks を動かす場合は Air を使いましょう
ただしまだベータ開発で動作しないアプリがあるようです
なぜかシステムデータの領域と「写真」の領域がずっと計算中の状態で終わりませんでした
再起動やスポットライトの再構築、キャッシュクリア、First Aid、ひたすら待つなど主にやるべき手段はすべて試したのですがダメでした
今回はそのときの対処方法を紹介します
今回のポイントは写真アプリでした
システムデータも計算中なのですが写真も計算中でこっちが怪しいなと思いいろいろ試したらビンゴでした
写真アプリを開き -> 設定 -> 一般 -> システム写真ライブラリとして使用を選択します
これだけです
これで再度ストレージの容量を確認するとすぐに計算が終了しました
おそらく iCloud との連携部分で計算が終わらない状態だったのだと思います
もし他でも計算中の場合は一度 iCloud との同期の設定を見直すといいかなと思います
アプリ名で絞り込んでからウィンドウの一覧を取得する方法もありますがプロセスとして独立してる場合にはそれだと取得できないことがあるのですべてのアプリを取得してからアプリ名でウィンドウを絞り込み操作します
hs.hotkey.bind({"cmd", "alt"}, "S", function()
-- hs.applicatoin.find -> app:allWindows ではミューレータを検知できないのですべてのアプリを取得してからアプリ名で対象のウィンドウを絞り込む
local activeWindows = {}
local apps = hs.application.runningApplications()
for _, app in ipairs(apps) do
if app:name() == "MuMu Android Device" then
local windows = app:allWindows()
for i, win in ipairs(windows) do
table.insert(activeWindows, win)
end
end
end
-- 各ウィンドウにサイズと位置を指定、左上の角が指定したX/Yの開始位置
local width = 275
local height = 527
local center_device_x = 960 - (275 / 2)
local toolbar_mergin_height = 25
local positions = {
-- 上段
{x = center_device_x, y = 0, w = width, h = height},
{x = center_device_x - width, y = 0, w = width, h = height},
{x = center_device_x + width, y = 0, w = width, h = height},
{x = center_device_x - (width * 2), y = 0, w = width, h = height},
{x = center_device_x + (width * 2), y = 0, w = width, h = height},
-- 下段
{x = center_device_x, y = height + toolbar_mergin_height, w = width, h = height},
{x = center_device_x - width, y = height + toolbar_mergin_height, w = width, h = height},
{x = center_device_x + width, y = height + toolbar_mergin_height, w = width, h = height},
{x = center_device_x - (width * 2), y = height + toolbar_mergin_height, w = width, h = height},
{x = center_device_x + (width * 2), y = height + toolbar_mergin_height, w = width, h = height},
}
for i, win in ipairs(activeWindows) do
if positions[i] then
win:setFrame(positions[i])
end
end
end)
制御するウィンドウをハッシュに登録してあとからウィンドウを操作するようにしています
ツールバーにある hammerspoon から reload config できるのが一番ですが実行中の hammerspoon でツールバーを選択するとクルクルになるので reload できません
またアクティビティモニターで強制終了してもいいですが hammerspoon が動いているとカーソル位置を持っていかれるので大変です
一番簡単に終了できる方法を紹介します
ターミナルで以下を実行します
or
これが一番てっとり早いです
終了後は途中から実行したり最初に戻って再実行すれば OK です
HammerSpoon で長いタスクを実行する場合はカーソル情報が HammerSpoon に乗っ取られるので必ず強制終了する道を残しておきましょう
過去 に HammerSpoon で紹介しましたがうまく動作しないケースがあるようです
その場合は event.types.leftMouseDragged イベントをうまく使うとドラッグアンドドロップできるようになります
function dragMouse(pointA, pointB, sleep)
local event = hs.eventtap.event
local xdiff = pointB.x - pointA.x
local ydiff = pointB.y - pointA.y
-- ここの割り算の3の数が少ないほどドラッグが滑らかになる
-- 速いドラッグにしたい場合は数を大きくする
local loop = math.floor(math.sqrt((xdiff * xdiff) + (ydiff * ydiff)) / 3)
local xinc = xdiff / loop
local yinc = ydiff / loop
sleep = math.floor((sleep * 1000) / loop)
midPoint = {x=pointA.x, y=pointA.y}
for i = 1,loop do
midPoint.x = midPoint.x + xinc
midPoint.y = midPoint.y + yinc
newPoint = {x = math.floor(midPoint.x), y = math.floor(midPoint.y)}
hs.mouse.absolutePosition(newPoint)
event.newMouseEvent(event.types.leftMouseDragged, newPoint):post()
hs.timer.usleep(sleep)
end
newPoint = {x = math.floor(pointB.x), y = math.floor(pointB.y)}
hs.mouse.absolutePosition(newPoint)
event.newMouseEvent(event.types.leftMouseDragged, newPoint):post()
end
hs.hotkey.bind({"cmd", "alt"}, "T", function()
local upSlideStartPoint = {x=500, y=500}
local upSlideEndPoint = {x=200, y=200}
-- カーソル位置を移動
hs.mouse.absolutePosition(upSlideStartPoint)
-- マウスを押した状態にする
hs.eventtap.event.newMouseEvent(hs.eventtap.event.types.leftMouseDown, upSlideStartPoint):post()
-- マウスを押しながら移動する
-- 1の数字の部分を調整することでドラッグアンドドロップのスピードが変わる
-- 数が少ないほど速くなる
dragMouse(upSlideStartPoint, upSlideEndPoint, 1)
-- マウスを離す
hs.eventtap.event.newMouseEvent(hs.eventtap.event.types.leftMouseUp, upSlideEndPoint):post()
end)
ポイントはカーソルを移動した際に event.types.leftMouseDragged を実行する点かなと思います
多くのサンプルはマウスダウンをしてそのままカーソルを移動してその後マウスを上げるになっているのですがそれだとダメなようです
Hammerspoon は Mac でショートカットキーを設定しそのショートカットキーに割り当てられたスクリプトを実行し Mac の操作を自動化できるツールです
今回はインストールからマウスクリックとスワイプ操作を実装してみました
アプリケーションの一覧に hammerspoon のアイコンがあるのでクリックして起動します
するとツールバーに hammerspoon のアイコンが常駐するようになるのでこれで起動完了です
システム設定 -> プライバシーとセキュリティ -> アクセシビリティ
で権限を付与してあげましょう
システム設定 -> 通知
から hammerspoon の通知を許可してあげましょう
まずは Hello World です
ツールバーにある hammerspoon のアイコンをクリックし「Open config」を選択します
するとテキストエディタが起動するので以下の lua スクリプトを貼り付けましょう
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "W", function()
hs.alert.show("Hello World!")
end)
これで準備 OK です
ツールバーのアイコンから「Reload config」しキーボードで cmd + ctrl + alt + w キーを押すと Hello World と表示されることが確認できます
Open config で開けるファイル ~/.hammerspoon/init.lua にあります
これを直接好きなエディタで編集してから Reload config しても OK です
長いのでキーは cmd + alt + c にしています
特定の箇所を左クリックする場合は hs.eventtap.leftClick します
最後に完了を知らせるために hs.notify.new で通知していますが毎回通知が来て面倒という場合には Hello World で使った hs.alert.show を使うのがいいかなと思います
lua の場合コメントハイフン2つで表現します
hs.hotkey.bind({"cmd", "alt"}, "C", function()
-- 座標を指定してクリック (例: X=500, Y=300)
local clickPoint = {x=500, y=300}
-- マウスカーソルを指定位置に移動
hs.mouse.absolutePosition(clickPoint)
-- 左クリックイベントを発生させる
hs.eventtap.leftClick(clickPoint)
-- 通知でクリック完了を知らせる (任意)
hs.notify.new({title="Hammerspoon", informativeText="Left click at (500, 300)"}):send()
end)
なぜかテキストが選択状態にはならないようですがちゃんとこれでドラッグアンドドロップできてします
newMouseEvent で leftMouseDown して押しっぱなしにしたあとに移動させて leftMouseUp させます
hs.hotkey.bind({"cmd", "alt"}, "C", function()
-- スワイプの開始座標と終了座標を設定
local startPoint = {x=500, y=500}
local endPoint = {x=700, y=700}
-- マウスカーソルを開始位置に移動
hs.mouse.absolutePosition(startPoint)
hs.timer.usleep(50000) -- 50ms待機
-- マウスダウン (押しっぱなしにする)
local mouseDown = hs.eventtap.event.newMouseEvent(hs.eventtap.event.types.leftMouseDown, startPoint)
mouseDown:post()
hs.timer.usleep(300000) -- 300ms待機 (長押しエミュレート)
-- スワイプの動作 (滑らかな移動)
local steps = 50 -- ステップ数
for i = 1, steps do
local progress = i / steps
local currentPoint = {
x = startPoint.x + (endPoint.x - startPoint.x) * progress,
y = startPoint.y + (endPoint.y - startPoint.y) * progress
}
hs.mouse.absolutePosition(currentPoint)
hs.timer.usleep(5000) -- 5ms待機 (スムーズに移動)
end
-- マウスアップ (クリック解除)
local mouseUp = hs.eventtap.event.newMouseEvent(hs.eventtap.event.types.leftMouseUp, endPoint)
mouseUp:post()
end)
以下で強制的にウィンドウをアクティブにしても選択状態にはなりませんでした
テキストを選択状態にするには別の方法があるのかもしれません
local app = hs.application.get("Google Chrome")
if app then
app:activate() -- アプリケーションをアクティブにする
else
hs.alert.show("Google Chrome is not running!")
end
Mac の HammerSpoon で Mac の自動操作を試してみました
ショートカットキーをフックにして動作するのでこのあたりも自動化できるとさらに便利かなと思いました
他にもいろいろと使い道がありそうなのでもう少し触ってみて追加の Tips があればまた紹介します
Homebrew を使います
# nvm
export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh" # This loads nvm
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion
一度ターミナルを終了して再度起動してバージョンが表示されるか確認します
=> 0.40.1
or
内部的には nvm のインストールスクリプトが実行されているだけですが mac の場合は Homebrew でインストールしたほうが Brewfile にエクスポートもできるのでいいです
exiftool コマンドを使います
カレント配下の jpeg ファイルの exif をすべて削除します
for i in `ls *.jpg`; do exiftool -all= -overwrite_original ${i}; done
HEIC には使えないので注意です
HEIC を jpeg に変換するのはプレビューを使ってファイル -> 書き出しでできます
毎回同じ設定をするは面倒なので前の設定を引き継ぎます
これでいけるはずです
少し Mac のバージョンが古いですが Apple Sillicon Mac でも同じ手順でインストール可能です
まずはアカウントから作成します
こちらから作成します
好きなユーザ名とパスワードを設定します
ユーザ名が少し曲があり推測しやすい名前は登録できないので注意しましょう
登録時にメールアドレスは不要なのであとで登録します
アカウントが登録できたらメールアドレスを設定します
確認用のメールがくるので URL をクリックすればメールアドレスの登録は完了です
Roblox.dmg をダウンロードしてインストールするだけです
Roblox.dmg はいろんなダウンロード方法がありそうですがログインした画面のままやる方法を紹介します
まずは適当なゲームを選択します
そしてプレイボタンを押します
もし Roblox がインストールされていない場合はダウンロードボタンが表示されるのでそこから Roblox.dmg をダウンロードできます
ダブルクリックしてインストールを開始します
展開すると RobloxPlayerInstaller.app があるのでこれを実行すれば OK です
インストールが完了すると Rolblox が自動で起動します
先ほど作成したアカウントでログインしましょう
ログインが完了するとゲームの一覧が表示されるのであとはプレイしたいゲームをダウンロードしてプレイしましょう
もしかしたらサーバ側にゲーム情報があるのでダウンロードは不要っぽいです
読み込めればゲームが始まります
Mac に Roblox をインストールしゲームを開始する方法を紹介しました
かなり簡単にできる印象です
コントローラなども設定すればできると思います
ゲーム自体のインストールは不要っぽいですが描画などはそれなりのスペックを要するのでゲームをプレイする際はそれなりのスペックのマシンを使いましょう
答え: Skype for cloud からダウンロードしましょう
Mac、iPhone の Skype では再生もダウンロードもできない状態です
なぜか Mac 上だと再生もダウンロードもできません
ダウンロードしようとすると「ダウンロードに失敗しました」と表示されます
ここhttps://web.skype.com/?openPstnPage=true にログインするとブラウザで Skype が使えます
ここからだとダウンロードも再生もできました
Skype for Mac だとうまくダウンロードできない場合には Skype for cloud を試してみてください
それでもダメな場合は Windows クライアントなども試す価値はありそうです
その場合の対象方法を紹介します
System Settings -> Language & Region の Applications に Kindle アプリを追加する
するとちゃんとログイン画面も日本語になり接続先も Amazon.co.jp になります
ログインするとスマホ側の Kindle や SMS でログイン通知が来ると思います
システム側のデフォルト言語を英語にしている場合は Amazon.com に接続に行ってしまうようなので注意しましょう
携帯番号の設定やメールアドレスを co.jp と .com で分ける方法もあるようですが一番てっとり早いのは Language & Region を使う方法かなと思います