Python のフレームワーク Flet で macOS 用デスクトップアプリをビルド

2023年末にリリースされた Flet のバージョン 0.18.0 では、以前からあった pack より良いビルド方法 build が導入されました。自分も macOS 用にビルドしてみたのですが、なぜか一つの環境では Hello, Flet とだけウィンドウに表示されるアプリがビルドされ、いろいろ試すも解決できず。そしてつい数日前の 2024/1/16 に、主に flet build 関連の bug fix がなされたバージョン 0.19.0 がリリースされたので、macOS 用デスクトップアプリをビルドしてみました (flet 0.21.2 で Audio コントロールを使用する場合のビルド方法は別記事にまとめました)。

リリースのあった公式 discord: https://discord.com/channels/981374556059086931/981375816489402408

公式 GitHub の change log: https://github.com/flet-dev/flet/blob/main/CHANGELOG.md

公式 flet build の解説ページ (英語): https://flet.dev/docs/guides/python/packaging-app-for-distribution

まずはビルド前の Python スクリプトを簡単にご紹介

パスワード生成アプリを作りました。今回は Flet のビルドの紹介をメインとするので、アプリ自体の細かい説明は省きます。が、簡単に何ができるかというと、好きな文字数で、好きな特殊文字を含んだ、ある程度強度のあるパスワードを生成することができます。生成されたパスワードはコピーボタンでクリップボードにコピーできます。Safari が作ってくれる強力なパスワードが使えないサイトや、もっと強度を強くしたい、等の用途で活躍します。パスワード強度をチェックしてくれるサイト (bitwarden 等) で強度を調べると解析されるまで数世紀かかる等と結果が出て面白いです。

コードは GitHub に置いてあります: https://github.com/tokyohandsome/passgen.py/blob/main/fletpassgen.py

今回の Flet アプリ。Generate で生成し、Copy でクリップボードにコピー。文字数と特殊文字はキーボードから入力可能

環境

  • macOS: 14.2.1
  • 仮想環境 (pipenv): 2023.10.24
  • Python: 3.11.6
  • 追加モジュール: flet (バージョン: 0.19.0) 自動的に flet-core と flet-runtime も入っている
  • Rosetta
  • Xcode: 15.2
  • Git: 2.29.2
  • cocoapods: 1.14.3_1
  • Flutter: 3.16.7

手順

  1. 仮想環境を作る
  2. flet をインストール (バージョン 0.18.0 以上、今回は最新の 0.19.0)
  3. コードを書く、もしくは持ってくる
  4. 動作確認
  5. Flutter とその他必要なものを一式インストール
  6. アプリ名のフォルダを作り、以降はその中で作業
  7. assets フォルダを作り、アイコン (icon.png) を格納
  8. 手順 3. のコードを main.py とリネームしてコピー
  9. main.py の最後、メイン関数を呼び出す行を ft.app(main) だけにする
  10. requirements.txt に追加モジュールを書く
  11. ビルドテンプレートを GitHub からクローン
  12. ビルドテンプレートのコピーライト表記などを編集
  13. ビルド実行

部分的に細かく (手順 1~4)

仮想環境はお好きなのを使って良いと思います。Python は 3.8 以降、flet は特にバージョン指定せず pip install flet で良いでしょう。自分で書いた Flet アプリのコードが無ければ、上記のボクの GitHub からコピーしたものを適当な名前 (例: fletpassgen.py) で保存してください。python3 fletpassgen.py で動作することを確認したら、デスクトップアプリビルドに必要な諸々をインストールします。

Flutter とその他必要なものを一式インストール (手順 5)

ビルドには元祖である Flutter や開発言語の Dart とその他必要なもの一式をインストールする必要があります。基本的には一度済ませれば何度も行う必要はありません。以下は Apple Silicon (M1、M2、M3 シリーズ) の場合です。Flutter のサイトを参考に全て準備しましょう。

1. Rosetta: 以下を実行してインストール

sudo softwareupdate --install-rosetta --agree-to-license

2. Xcode 15: このページ右上の Download から Xcode 15 をダウンロードし、インストール

3. Cocoapods: 以下を実行してインストール

brew install cocoapods

4. Git: 以下を実行してインストール

brew install git

5. Flutter: ページ中頃のあたりの手順に従い、自分の CPU 用の Flutter SDK をダウンロードし、適当なフォルダ (例では ~/development/) に移動して .zip ファイルを展開、最後に環境変数 PATH にパスを追加 (以下の handsome を自分のユーザ名に変えて、~/.zshrc に追加し、source ~/.zshrc で読み込み)

export PATH="/Users/handsome/development/Flutter/flutter/bin:$PATH"

ビルドの準備 (手順 6~12)

Flet アプリとしての動作が確認できたら、最終的なアプリ名のフォルダを作り、中に入って準備を進めます。今回は fletpassgen という名前のアプリにします。

mkdir fletpassgen
cd fletpassgen
mkdir assets
open assets

最後の open assets で Finder でフォルダを開くので、アプリのアイコンに使用したい 512×512 ピクセルの画像ファイルを icon.png に従った名前で保存します (フォーマットは他に .bmp.jpg.webp が対応)。今回は使いませんが、その他アプリで使用する音声やテキストなどのファイルも assets フォルダに保存します。

アイコン画像について余談: 画像ファイルが無くても Flet のアイコンが使われるので、ビルドはできます。ボクは画像生成 AI 、Stable Diffusion の mac 用クライアントアプリ Mochi Diffusion を使ってアイコンを生成しました。参考までに本記事の最後にモデルやプロンプトを貼っておきます。

次に、Flet アプリのコードを main.py としてコピーしてきます。

cp ../fletpassgen.py main.py

Python コード最後の main 関数呼び出し部分が ft.app(main) じゃない場合は変更します。

#if __name__ == "__main__":ft.app(target=main) だったりしたら変更
ft.app(main)

requirements.txt には追加が必要なモジュールを記載するのですが、pip freeze > requirements.txt で書き出すと様々なエラーでビルドが止まり、ハマりました。今回のように標準のモジュールしか使用していない場合は、flet だけあれば大丈夫です。iOS や Android 用にビルドする場合も注意が必要なので、詳細は公式ページを見てください。

flet

コマンド + i でコピーライト表記が正しく表示されるように、テンプレートを公式の GitHub からクローンして cookiecutter.json の中身を書き換えます。以下例ではエディタに vi (vim) を使用していますが、お好みでどうぞ。

git clone https://github.com/flet-dev/flet-build-template
vi flet-build-template/cookiecutter.json

ハイライトした、7-9行目だけいじってます。

{
    "out_dir": "",
    "python_module_name": "main",
    "project_name": "",
    "project_description": "",
    "product_name": "{{ cookiecutter.project_name }}",
    "org_name": "com.peddals",
    "company_name": "Peddals.com",
    "copyright": "Copyright (c) 2024 Peddals.com",
    "sep": "/",
    "kotlin_dir": "{{ cookiecutter.org_name.replace('.', cookiecutter.sep) }}{{ cookiecutter.sep }}{{ cookiecutter.project_name }}{{ cookiecutter.sep }}",
    "hide_loading_animation": true,
    "team_id": "",
    "base_url": "/",
    "route_url_strategy": "path",
    "web_renderer": "canvaskit",
    "use_color_emoji": "false"
}

ビルド実行 (手順 13)

何もかも気にせずとりあえずビルドするなら、flet build macos でかまいません。バージョンを指定し、テンプレートをローカルに作ったものから読み込ませるなら、もうちょっと長く以下のように実行します (バージョン --build-version は指定しなければ 1.0.0 になるので、このサンプルではあえて 1.0.1 にしています)。(以下、Flet 作者の Feodor による説明を元に訂正 2024/01/25) ビルドテンプレートの指定は公式の説明に理解が及ばず、当初以下のように書いていましたが、--template の後に相対パス指定になります。修正前の方法でもビルドできますが、あるべき書き方にコマンドも修正しました。テンプレートの指定は相対パス (relative path) と公式ドキュメントにありますがうまくいかないので `pwd` を頭に付けて絶対パスとして指定しています。また、テンプレート指定のオプション自体が公式だと --template_dir (アンダースコア) になっていますが、0.18.0 と 0.19.0 では --template-dir (ハイフン) が正解でした。

flet build macos --build-version "1.0.1" --template flet-build-template

やや待って Success! が表示されれば完了です。build/macos/ の下に、アプリ fletpassgen.app が作られています。ボクの書いた fletpassgen.py を M1 mac mini でビルドすると、大体 3分 10秒くらいで完了しました。基本的に高効率コアが 6-8 割の使用量で推移し、所々パフォーマンス (高性能) コアのスパイクが見える感じです (他にもアプリが動いているので、はっきりとしたことはわかりませんけど)。

Creating Flutter bootstrap project...OK
Customizing app icons and splash images...OK
Generating app icons...OK
Packaging Python app...OK
Building macOS bundle...OK
Copying build to build/macos directory...OK
Success!
カラーだとこんな感じ

完成したアプリは Universal

アイコンはもちろん、バージョンとコピーライト表記も反映されている

ビルドされたアプリはアプリケーションフォルダにコピーしてダブルクリックで開けます。プライバシーとセキュリティで実行許可を与える必要はありません。Universal バイナリなので、試していませんが Intel mac でも動きそうです。アプリにした後の動作自体は CLI から実行したときと変わりありません。ウィンドウが開くときに若干もたつきがあり、Flet デフォルトのウィンドウが開いてから、指定したウィンドウにリサイズしてコンテンツを表示する、という動きも同じです。自分のコードの最適化か、Flet のアップデートで解決するかもしれません。

感想

実に良いです。これまで tkinter や、そのラッパー pysimplegui を使って GUI アプリを幾つか作りましたが、Flet は断然作りやすく、デザインはモダンで、今回紹介したようにビルドも簡単です。今後試したいこととしては、mac で Windows 用にビルドはできないようなのでParallels を使用したビルドを試したり、iOS やウェブ (サーバサイドでは無く、スタティック) 用にビルドすることも試したいと思います。一気にやれることが増え、やりたいことも増えてすごく楽しいですね。mac をお持ちの方は、ぜひお試しあれ (もちろん Windows や Linux の方も)。

Image by Stable Diffusion

Date:
2024年1月15日 23:05:04

Model:
realisticVision-v20_split-einsum

Size:
512 x 512

Include in Image:
masterpiece, best quality, retro future, cyber, disco computer, password generator

Exclude from Image:

Seed:
3224310018

Steps:
20

Guidance Scale:
20.0

Scheduler:
DPM-Solver++

ML Compute Unit:
CPU & Neural Engine

(解決済み) macOS 「書類」以下のフォルダが Finder の移動メニューやターミナル.app から直接開けなかった

いつからかわからないんですが、mac の書類フォルダ (~/Documents) 以下のフォルダが Finder で直接開けなくなってしまっていました。原因はわからずじまいなのですが、解決できたので共有します。

きっかけ

現在の macOS のバージョンは Sonoma 14.2.1 です。実は以前から、ひょっとしたら Big Sur 11.0 あたりからターミナルで open ~/Documents/Python/hoge とかやってもウィンドウが開かないなと気になってはいたのですが、そんなに実害も無いしまあいいか、と放置していました。ところが今日、GitHub Desktop をいじっていた時に症状が現れました。同アプリで Show in Finder ボタンをクリックすると、本来開くべき書類フォルダ数階層下のフォルダでは無く、かわりに自分のホームフォルダがヘンな感じで開いたのです。これはやっぱりおかしい、解決しておかないと面倒なことになりそうだぞ、と言うことで調べ始めました。

↑これクリックで↓これが現れた (自分のホームディレクトリ)
本来は書類フォルダのもっと下の方にあるフォルダが開いてくれないとおかしい

症状

ターミナルアプリで ~/Documents フォルダ以下の様々なフォルダを open コマンドで開いても、同じく自分のホームしか開いてくれません。開いた Finder のウィンドウで書類フォルダをクリックすれば、内部のフォルダは全て開けます。ミュージック (~/Music) やダウンロード (~/Downloads) などの内部にあるフォルダも同様の手順でターミナルから開けます。書類フォルダの中にあるフォルダだけ、直接 Finder で開けないのです。Finder の「移動」メニューから「最近使ったフォルダ」で書類フォルダ以下のフォルダを指定したときも同じ動作です。右クリックから「新規タブで開く」を選んでも同じ。とにかく Finder が、書類フォルダ自体とその配下のフォルダを直接開くことができず、仕方なくホームフォルダを開いている感じでした。

どうやって解決したか

いろいろ試しましたが、最終的には Finder の表示方法をリストに変更することで解決したようです (元々は、カラム表示がダメだった雰囲気)。手順をもう少し細かく書くと、まず書類フォルダを開き、ウィンドウ上部にある表示からリストを選びます。

↑か↓

その後、アクションメニューから「表示オプションを表示」します。

コマンド + J でも OK

開いた小さいウィンドウの「常にリスト表示で開く」にチェックを入れ、一番下の「デフォルトとして使用」をクリックし、閉じます。これで、書類フォルダや配下のフォルダが Finder のリスト表示で開くようになりました。

勝利宣言

Finder は、小さな親切か大きなお世話かわかりませんが、あるウィンドウで表示方法を変更すると、次に新しく開いたウィンドウも表示方法が踏襲されたりします (条件はよくわからず)。なので、不具合を再現してみようと、上記設定をした後に表示方法をカラムにしたりギャラリーにしたり閉じたり開いたりを繰り返していたところ、最終的に不具合はぱったり発生しなくなりました。カラム表示でもサブフォルダが開くんです。よって、原因不明ながら、上記手順で解決、と言ってしまおうと思います。

他に試してダメだったこと (参考まで)

Image by Stable Diffusion

Date:
2024年1月3日 17:56:25

Model:
realisticVision-v20_split-einsum

Size:
512 x 512

Include in Image:
comicbook-style, gray hair guy looking for a missing folder in a book library

Exclude from Image:

Seed:
2520942867

Steps:
20

Guidance Scale:
20.0

Scheduler:
DPM-Solver++

ML Compute Unit:
CPU & Neural Engine

mac でラズパイ起動用 SD カードや USB メモリをまるごとバックアップする簡単な Python スクリプト

ラズパイで使用している SSD が突然読み込めなくなったので、おおよそ1年前にバックアップしてあったディスクイメージを別の SSD にリストアし、諸々1年分を作り直しました。当然すごく面倒だったので、外付けメディアのバックアップを取る極シンプルな mac 用 Python スクリプトを書きました。ターゲットのデバイスを指定すると、バックアップの後イジェクトまでやってくれます。

いちおう、環境

  • macOS: Sonoma 14.2
  • Python: 3.11.6
  • 追加パッケージ等: 不要

普通にやるならこんな手順

mac に記憶デバイスを接続して一覧を表示、ターゲットとなるデバイス番号を確認、デバイスをアンマウントして、バックアップ開始、終了したらイジェクトして、記憶デバイスを物理的に取り外す、というのが一連の手順になります。Ubuntu がインストールされた 128GB SSD をバックアップしたときの例はこんな感じです ($ 以降が入力するコマンド)。

$ diskutil list external
... 省略 ...
/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *128.0 GB   disk4
   1:             Windows_FAT_32 system-boot             268.4 MB   disk4s1
   2:                      Linux                         127.8 GB   disk4s2
... 省略 ...
$ sudo diskutil unmountDisk /dev/disk4
Password:
Unmount of all volumes on disk4 was successful
$ sudo dd if=/dev/rdisk4 of=RPi3BP_128GB_20231218-1.img bs=6M status=process
127999672320 bytes (128 GB, 119 GiB) copied, 2054 s, 62.3 MB/s
20350+1 records in
20350+1 records out
128035674112 bytes (128 GB, 119 GiB) copied, 2054.98 s, 62.3 MB/s
$ sudo diskutil eject /dev/disk4
Password:
Disk /dev/disk4 ejected

最初のコマンドは接続されている記憶デバイスの一覧を表示するのですが、external を付けて外付けディスクのみ表示させています。複数表示される場合は、表示される SIZE の値を頼りにするか、接続前に一度 diskutil list external を実行し、メディアを接続してから再度 diskutil list external で追加されたメディアの番号を確認します。

dd コマンドの説明:

  • if は、入力ファイルを指定。上の例の /dev/rdisk4 は、シーケンシャルにアクセスされるデバイスを指定しているので、/dev/disk4 とやるより速い
  • of は、出力ファイルを指定。上の例は、コマンドを実行したディレクトリに .img の拡張子を付けて書き出し
  • bs で、一度に処理するブロックサイズを指定。m1 mac mini (16GB RAM) でいくつか値を変えてテストした結果、6M (6メガバイト) が一番安定して速い速度で処理できた
  • status=process を付けると、実行中に進捗状況が表示される

mac 専用 Python スクリプト (とは言ってもほぼシステムコマンドを逐次実行)

import subprocess
import sys
import os
from datetime import datetime

if not os.getuid()==0:
    sys.exit(">> 管理者権限が必要です。'sudo python3 clibackup.py' の形式で再度実行し、パスワードを入力してください。")

subprocess.run(["diskutil", "list", "external"])
dnum = input(">> バックアップする記憶デバイスの番号を数字で入力してください('q' を入力すると終了)。\n>> (例: /dev/disk9 の場合は 9 を入力)\n>> /dev/disk?: ")
if dnum == 'q':
    print('終了しました。')
    sys.exit()
print(f">> ターゲット /dev/disk{dnum} をマウント解除します。")
subprocess.run(["diskutil", "umountDisk", "/dev/rdisk"+dnum])

timestamp = datetime.now().strftime("%Y%m%d%H%M")
#cmd = ["dd", "if=/dev/rdisk"+dnum, f"of=/Volumes/External HDD/SD_Card_Backup/backup_{timestamp}.img", "bs=6M", "status=progress"]
cmd = ["dd", "if=/dev/rdisk"+dnum, f"of=backup_{timestamp}.img", "bs=6M", "status=progress"]

print("\n>> 以下のコマンドを実行してバックアップします:")
for i in range(len(cmd)):
    print(cmd[i], end = " ")
print("\n")

process = subprocess.run(cmd)

print(f"\n>> バックアップが完了しました。デバイス /dev/disk{dnum} をイジェクトします。")
subprocess.run(["diskutil", "eject", "/dev/disk"+dnum])

保存先ディレクトリを指定する場合は、18行目の様に of= の後にパスを入れてください。ダブルクォーテーションでくくってあるので、スペースがあってもエスケープは不要です。作られるディスクイメージのファイル名は、年月日時分を含んだ backup_YYYYmmddHHMM.img になります。実行時の「分」までファイル名に含めているため、既存のファイルを上書きすることは無いでしょう。エラー処理の一切はしていないのであしからず。

使い方

sudo python3 clibackup.py で実行します (sudo を忘れると、メッセージを表示して終了します)。パスワードを入力すると、マウントされている外付け記憶デバイスの一覧が表示されるので、バックアップしたい USB ドライブなり SD カードなりのディスク番号を入力するとバックアップがスタートします。もし対象がわからない場合、一度接続していない状態で本スクリプトを実行し q で終了、その後メディアを接続して再度スクリプトを実行すると、前回は表示されていなかった /dev/disk があるはずなので、その番号を指定します。バックアップが完了すると自動でメディアをイジェクトするので、そのまま mac から取り外してかまいません。

実行例

Raspbian が入った 16GB の micro SD カード (SanDisk Ultra Class 10 A1 MicroSD HC I) を、mac mini の内蔵 SSD にバックアップしたときの実行例です。速度は 34MB/s、大体 8分ほどで完了しています。使用する記憶デバイスや接続の仕方次第で速度は結構違います (本記事頭で使用している SSD は、62.3MB/s)。自分は 2つのパーティションに分けた外付け 4TB HDD があるので、/dev/disk6~8 も表示されていますが、これらも環境によって変わります。

% sudo python clibackup.py 
Password:
/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk4
   1:             Windows_FAT_16 RECOVERY                1.7 GB     disk4s1
   2:                      Linux                         33.6 MB    disk4s5
   3:             Windows_FAT_32 boot                    72.4 MB    disk4s6
   4:                      Linux                         14.1 GB    disk4s7

/dev/disk6 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *4.0 TB     disk6
   1:                 Apple_APFS Container disk8         2.0 TB     disk6s1
   2:                 Apple_APFS Container disk7         2.0 TB     disk6s2

/dev/disk7 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +2.0 TB     disk7
                                 Physical Store disk6s2
   1:                APFS Volume External HDD            1.4 TB     disk7s1

/dev/disk8 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +2.0 TB     disk8
                                 Physical Store disk6s1
   1:                APFS Volume handsome's mac mini...  673.7 GB   disk8s1
   2:                APFS Volume Buffalo HDD             1.0 TB     disk8s2

>> バックアップする記憶デバイスの番号を数字で入力してください('q' を入力すると終了)。
>> (例: /dev/disk9 の場合は 9 を入力)
>> /dev/disk?: 4
>> ターゲット /dev/disk4 をマウント解除します。
Unmount of all volumes on disk4 was successful

>> 以下のコマンドを実行してバックアップします:
dd if=/dev/rdisk4 of=backup_202312231503.img bs=6M status=progress 

  15904800768 bytes (16 GB, 15 GiB) transferred 474.073s, 34 MB/s   
2532+1 records in
2532+1 records out
15931539456 bytes transferred in 474.873141 secs (33549043 bytes/sec)

>> バックアップが完了しました。デバイス /dev/disk4 をイジェクトします。
Disk /dev/disk4 ejected

記憶デバイスへの書き込み

スクリプトを書いていないので、手動でいくつかコマンドを打ってください。手順は本記事最初のサンプルと同様ですが、入出力が逆になります。dd コマンドでは、if= (入力ファイル) にディスクイメージ、of= (出力ファイル) に USB や SD カードなどの /dev/rdiskディスク番号 を指定します。出力先を間違うと取り返しがつかないことになり得るので、注意してください (サンプル通りに実行して大事なデータが消えてしまっても当方では責任とれません)。以下は、/dev/disk4 に SD カードがマウントされているときの例です。メディアを抜いた状態で diskutil list external を一度実行し、メディアをさしてから再度実行すれば、増えた /dev/disk が該当の記憶デバイスになります。

(記憶デバイスを接続していない状態で実行)
$ diskutil list external

(記憶デバイスを接続して再度実行)
$ diskutil list external
... 省略 ...
/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk4
   1:             Windows_FAT_16 RECOVERY                1.7 GB     disk4s1
   2:                      Linux                         33.6 MB    disk4s5
   3:             Windows_FAT_32 boot                    72.4 MB    disk4s6
   4:                      Linux                         14.1 GB    disk4s7
... 省略 ...
$ sudo diskutil unmountDisk /dev/disk4
Password:
Unmount of all volumes on disk4 was successful
$ sudo dd if=backup_202312231503.img of=/dev/rdisk4 bs=6M status=process

Image by Stable Diffusion

Date:
2023年12月23日 16:42:10

Model:
fruity-mix_split-einsum_compiled

Size:
512 x 512

Include in Image:
comicbook-style, cloned sheep standing side by side

Exclude from Image:

Seed:
3723203146

Steps:
25

Guidance Scale:
20.0

Scheduler:
DPM-Solver++

ML Compute Unit:
CPU & Neural Engine

ユニバーサルコントロールがいい感じ

Mac mini (M1) と MacBook Air (Intel 2019) を macOS 12.3.1 にし、iPad mini (第 5世代) を iPadOS 15.4.1 にアップデート。ユニバーサルコントロールを有効にして、ワンセットのマウスとキーボードで操作してみました。最初の感触としてはすごくいいです。3つの Apple デバイス+1つのモニタが、シームレスに操作できています。使い切れていない機器が再び使えるようになりそうですよ。

まずやることは、OS のアップデート、そしてユニバーサルコントロールの有効化

すでに macOS 12.3 と iOS 15.4 ではユニバーサルコントロールに対応していましたが、今回それぞれバグフィックスがされたバージョンをインストールしました。計測していませんが、macOS のアップデートは1時間くらい?iOS は 30分くらい?という感じです。どちらも再起動後、設定を有効にすれば使えるようになります。

そもそも完了しているとは思いますが、全てのデバイスが同じネットワーク内にいて、同じ Apple ID でサインインしている必要があります。その他の条件は Apple のページ (特にシステム条件) を確認してください。Mac と iPad それぞれの設定場所は以下の通りです:

macOS: アップルマーク > システム環境設定… > ディスプレイ > ユニバーサルコントロール … > 全部 (もしくは上から 2つ) にチェックを入れて、完了

接続された後、それぞれの位置を移動できます。左から、MBA、Mac Mini メイン、サブ、下に iPad mini。なんと、M1 搭載 Mac に標準の機能だけで 4画面!

iPadOS: 設定 > 一般 > AirPlay と Handoff > カーソルとキーボード (ベータ版) にチェック

iPad はここにチェックを入れるだけ

最初にできるのは横のつながりだけ?

Apple のデモを見ていたときには、あたかも置いてある方のデバイスのモニタにマウスカーソルが移動できるような雰囲気ではありましたが、さすがにそれぞれのデバイス同士で位置情報を交換しているわけでは無いです。ざっと試した感じでは、モニタの端にマウスカーソルを持って行ってから、さらに画面の外に持って行こうとすると、未接続のデバイスにカーソルが移動します。そうやって接続してから、Mac のディスプレイ設定で上のスクリーンショットのように気に入った場所に移動しましょう。下にも配置できます。iPad 画面の縦横も反映されるので、Sidecar より便利ですね。

MacBook Air (Intel) を生かせそうな予感

性能がかなり控えめで、たまーにリビングで Mac を使うときにしか稼働させることの無くなってしまった Intel CPU の MacBook Air (Retina, 13-inch, 2019) ですが、ユニバーサルコントロールのおかげで生き返りそうです。Mac mini と一緒に机で使うときは、3枚目のモニタとしてメールを開きっぱなしにしておけます。また、トラックパッドでページをめくれるので、リビングでは外付けモニタ的に iPad の Kindle で技術系書籍を開き、MBA でプログラムを書くなんて便利な使い方ができます。自分の用途では Sidecar より便利です (Sidecar は iPad を縦表示にできず、フルスクリーンでは使えない)。ただし、Kindle ではダブルクリックやドラッグで文字を選択することはできないようで、おそらく amazon 側の対応が必要な感じです。

ベータ版だからか、サポート外か?

ファイルのドラッグアンドドロップもできるということで、iPad のスクリーンショットをファイルに保存し、マウスで Mac のデスクトップに持ってこようとしましたができませんでした。できないどころか、Mac mini のディスプレイ設定から iPad mini が消え、MBA では見えているけど iPad mini の画面位置を移動できず、他のことをしていたらいつの間にか復活、という動作になりました。そもそも写真のドラッグアンドドロップは対応していないのかもしれません。使い続けていると、できそうでできないことが他にも見つかりそうです。少なくともデバイス間のテキストのコピペは問題なさそうです。

これは困る。iPad mini ではキーボード配列が日本語になってしまう

Mac mini M1 にインストールはできるものの、頻繁にクラッシュして使い物にならない Pythonista3 を iPad mini で起動していじってみました。使い慣れたキーボードで操作できるなんて最高です!と報告して本投稿を終了、と思ったのですが、なんだか様子がおかしい。どういうことかというと、キーボード配列が日本語 JIS 配列になってしまっていて、HHKB Pro 2 の英語キーボードではアンダースコアが入力できないのです。ググってみても、日本語キーボードが英語キーボードと認識されてしまうという情報は多いのですが、逆はみつかりませんでした。果たしてユニバーサルコントロールの問題なのか調べるために、iPad に USB-A コネクタを追加するアダプタでキーボードをつないだところ、結果は同じでした。日本語配列キーボードとして認識されてしまいます。

キーボード配列問題のワークアラウンド

本日確認できた唯一の解決方法は、iPad の使用言語を English にすることです。

iPad: 設定 > 一般 > 言語と地域 > iPad の使用言語 > English にして続ける

iPad のメニューが全て英語になるので、英語が苦手な方は注意

同じ言語と地域の画面の、言語を追加で英語を追加してもダメで、英語の優先順位を日本語より上にすると iPad の使用言語が English になり、上と同じ事に。なので、この記事を書いている現在では iPad 自体の使用言語を変えることがキーボードのレイアウトと合わせる唯一の方法のようです。いつかキーボードのレイアウト問題が解消するといいですね。

感想

Macbook + iPad のモバイル時の利便性や、M1 搭載 Mac でも擬似的にとはいえ 3画面 (以上) 使える使えるのはすごくいいですね。Mac 間では遅延や操作のしづらさもありません。無料の OS のアップデートだけで使えるので、複数の Mac や iPad を持っている方はいろいろ試してみたら良いと思います。ボクは以前購入した、iPad を Mac の外付けモニタにできる duet という 2,000円くらいしたアプリを削除する決心が付きました。最後にひとつ。どうやらユニバーサルコントロールで接続されていると、接続元 (?) がアクティブである間は接続先デバイスもアクティブであり続けるため、その分バッテリが減ってしまいます。モバイルで使用するときには、バッテリの使用状況に注意するようにしましょう。

Intel iMac から M1 Mac mini へ移行した記録 (読み物編)

娘のパソコンを iMac (Retina 4K, 21.5-inch, Late 2015) から Mac mini (M1, 2020) にしました。スペックや実際の移行方法など難しい話は別記事にします。こちらでは、読み物的な内容をまとめています。パソコン初心者 (自分の親や子供) にパソコンを買ってあげる、自分のパソコンの知識に自信は無いがなんか満足度が高いのが欲しい、昔から Mac っていいよなーって思っている、そんな方に読んでもらえるように書きました。

子供の iMac がくたびれてきた

小学生の娘は妻のお下がりの iMac を使っていたのですが、さすがに 6年も使っているとモニタの色味がおかしくなってきました。特に左右の端がピンクがかってきて、これは良くないな、と。娘が、新しいパソコンを買ってもらった友達と比べて自分のマイクラ動画はカクカクしている、とこぼすこともよく聞くように。さらに言えば、最近はなぜか Time Machine も上手にバックアップをとれなくなってきたし、Fusion Drive も単品 SSD と比較したらやっぱり遅い。そろそろ替え時かな、という思いが自分の中で大きくなってきました。

これまでは年代物で親のお古の Mac を 2台使わせていましたが、実際のところ一日の中で Mac を使う時間は家族で一番長いのです。主な用途のイラスト描きや YouTube 視聴は問題無いものの、マイクラにシェーダーやリソースパックを入れて Replay Mod で記録しながら QuickTime で録画するとか、編集した動画を書き出すとか、実は親よりもパソコンの性能を要求する使い方をしているのも事実。誕生日まで 3ヶ月ほどあるものの、安く手に入れられればそのタイミングで新しい Mac を買い与えることにしました。

Windows PC にしなかった理由

初期の動画は iMove を使っていた娘ですが、無料で高機能な DaVinci Resolve を少しかじり、現在はゆっくりムービーメーカー4 で YouTube 動画を作っています。同アプリは Windows 10 & 11 用のフリーウェアで、有料アプリの Paralles Desktop バージョン 16 に Windows 10 Home 環境を作り、その上で動作させています。他にもいくつか Windows 専用アプリを使用しているため、移行先も Windows が動くコンピュータである必要があります。娘の仲の良いお友達はみんな Windows PC ユーザです。親であるボクは完全 Windows 環境の会社の IT マネージャをやっているので、Windows PC という選択肢も無いわけでは無い。しかしそうしませんでした。いくつかある理由の一つは、娘が Windows OS の見た目をダサいと思っていて、macOS の方が良いと思っていたから。そしてもう一つは、娘以上にボクがそう思っているから。と、まぁダサいナウいの話は置いておいても、あまたある Windows PC の筐体やスペック、価格、サポート体制、評判などを調べ上げて最適なものを選定し、導入後は自宅でも Windows PC のサポートをしなければならなくなる、ということを考えると全く気分が乗らなかったからです。そんな自分を正当化するために、2週間ほどは Intel PC vs M1 Mac 的な YouTube を見まくりました。そして、性能、価格、発熱量、先進性などという要素を元に、Apple Silicon (M1 チップ) 搭載 Mac が最適であるという結論に至ったのです。Parallels Dekstop は早々に M1 チップ対応を謳っていましたし、逆に Windows で Mac 用アプリを動かすソリューションは知りません。

Parallels サイトより。確かに。

Mac mini M1 にした理由

Windows アプリを使用するための互換性から Intel Mac も考えなかったわけでは無いですが、Apple のラインナップからなくなることがわかっている製品を購入するよりも、これから各メーカさん・開発会社さん・OSS 開発者さん達による対応が進んでいくであろう M1 チップを搭載したコンピュータを子供に与えることに、何らかの意味があるように思えました。またちょうどこの頃 (2022年 2月)、Apple が近々発表する新製品の噂が各方面で記事にされていました。話半分で探ってみたところ、どうやらパワフルなものが中心になりそうで、Mac mini M1 がモデルチェンジしそうな感じもありません。歴代 Mac mini もモデルチェンジのが頻度が低かったですし、新機種登場による値下がりも期待薄です。また、娘は液晶タブレットを使ってイラストを描いているため、Macbook Air や Pro ではメインモニタが小さくて不便です (使っていた iMac は 21.5 インチ)。小学生なので持ち運んでドヤることもありません。こういった事から、本体は Mac mini M1 搭載モデルで決定しました。…といいつつ、当初は iMac M1 を第一候補として USB ポートのやりくりや設置場所の検討をしていました。娘が選ぶのは紫かな、水色かな、なんて思いながら必要な機器の金額を足していくと、どうしてもトータルが 27万円を超えることに。さすがにその金額はきびしいぞ、と。で、必要なハードウェア構成を考えてみると、キーボードとマウスは持っているし、使用中の iMac の 21.5インチ Retina 4K モニタは解像度を半分にしているので高解像度は必要ない。音は常にヘッドフォンで聴いているし、調べてみると Vtube 系アプリの顔認識には 720p のウェブカメラで十分らしい。さらに、会社の福利厚生の一環であるベネフィット・ステーションの Apple Store 割引は iMac M1 には使えないが、Mac mini M1 は対象ということが判明 (Apple Store に電話して聞きました)。ボクが使っている Dell の QHD 解像度モニタ なら 3万円台なので、トータルで 20万円かからない。ということもあり、Mac mini M1 となった次第です。

細かいことを知りたい人へ

もうちょっと細かいスペックも書いておくと、メモリは 16GB にしています。Parallels で Windows も走らせるので、16GB は必須です。SSD (ストレージ) は 1TB にしました。2TB は高すぎるし、動画を多く作る娘の用途では 512GB じゃ小さすぎます。安い外付けの SSD を追加するという使い方はある程度のコンピュータに関するリテラシや整理整頓スキルが要求されるので、現段階の娘には若干ハードルが高く、サポート (ボク自身の稼働) の頻度を下げるためにも 1TB としました。本体とは別になりますが、Time Machine によるバックアップ用に 2TB の外付け HDD を接続しています。コンピュータに詳しくない人がトラブルに遭う頻度と遭ってしまったときの損失を下げるための投資ですね。同じような理由で、キーボードとマウスも USB の有線接続です。原因不明の周辺機器認識しない問題に時間をとられないためには、有線接続の機器をお勧めします。

使用アプリの互換性を確認する

パソコンを新しくすると決めてから、娘が普段使ってるアプリの情報をもらいました。中身としては、ゲーム、イラスト関連、動画編集関連がほとんどで、Mac と Windows それぞれで使用しています。今の時代 Mac 専用のアプリは Apple 謹製のものくらいで、上でも書いた『ゆっくりムービーメーカー4』のような個人開発のアプリ (フリーウェア) や、大作ゲームはほぼ Windows 専用です。Mac 用アプリの動作状況を調べたところ、M1 チップに最適化されたもの、Intel 用に作られたものを M1 でエミュレーションして動作させるものの他、全く動かないものもあるということがわかりました。動かないものは 2つで、マイクラをリモートで一緒に遊ぶために使用していた VPN ソフトの Hamachi と、Mac から発せられる音とマイクから入力する音を同時に録音するために使用していた Sound Flower というツールでした。それぞれ代わりになるツールの存在が確認できたのでよしとし、実際に新しい Mac を購入してからインストールすることにします。

目的の再確認

今更ながら今回のプロジェクトの目的は、Mac 用マイクラ Java版をなめらかに動かすということにつきます。それ以外は親の都合やエゴと言って差し支えありません。で、肝心のマイクラ (正式名称: MINECRAFT JAVA EDITION) は M1 に対応しているのかというと…、未対応でした。確かに自分の Mac mini M1 で実行すると、Intel 用アプリとして動作しています。しかし調べてみると、MultiMC というランチャーを使い、Arm 用の Java を使用することで M1 ネイティブ動作させられることがわかりました。マイクラは Java という実行環境で動作するアプリのため、M1 用の Java で実行すれば良い、ということです。導入方法などの詳細は別記事にしようと思いますが、マイクラがぬるぬる動くということがわかったので、M1 搭載 Mac という選択肢は揺るぎないものになりました。その他のアプリ含め、動作状況は以下の通りです。

アプリ用途対応状況メモ
Minecraft Java Editionゲーム、建築、友達とマルチプレイ、YouTube 動画のネタ公式のままだと Intel のみ。MultiMC と macOS Arm 版 Java の利用でネイティブ有料。公式をダウンロードして遊んでも、全然大丈夫だが、M1 の恩恵は小さい
MultiMCマイクラを M1 ネイティブで動作させるM1 ネイティブ無料。これまで作ってきたマップや Mod、シェーダ (影 mod) も動く。設定はやや面倒
Robloxゲーム、友達と遊ぶ、チャット、動画のネタIntel無料。実際に試したが、十分遊べる
QuickTime Player画面収録 (録画)M1 ネイティブ無料。そりゃあ Apple 謹製ですから。macOS に同梱
OBS画面収録 (録画)まだ Intel無料。M1 対応版も開発中
Clip Studio Paint Pro (クリスタ)イラストM1 ネイティブ有料。amazon で購入
Live 2D Cubism Editor2D のイラストを Vtube アプリで動かせるようにするIntel無料版もありますが機能が限定的なため、我が家では学割を利用。小学生も在籍証明書を学校から発行してもらえば学割が利用できる
Parallels Desktop 16Windows を実行M1 ネイティブ (バージョン 16 以上)有料。ちょいちょいやってるセールがお勧め
Hamachiマイクラなどを友達と接続動作せず無料。VPN を簡単に構築できるソフト
ZeroTier同上M1 ネイティブ無料。オープンソース。Hamachi の置き換えに
Sound FlowerMac とマイクの同時録音のため動作せず無料。地声での実況系動画には必須だった
BlackHole同上M1 ネイティブ無料だがダウンロードには登録が必要。SoundFlower の置き換えに
Ladio CastMac とマイクの同時録音Intel無料。BlackHole と併せて使うことで、複数の音声入力を一つの出力先にまとめられる
Zoom友達との遠隔マルチプレイ中の音声チャット (映像も)M1 ネイティブ無料でも使える。1対1なら時間無制限。複数接続なら 1時間限定
Norton360アンチウィルス、統合セキュリティIntel有料。マイクラダウンロードサイトは怪しいところもあり、アンチウィルス系ソフトは必須
Wacom driver液晶タブレット Cintiq 13HD を使えるようにするM1 ネイティブ無料。妻が 1年ほど前に試したときは動きませんでしたが、今は大丈夫
Steamゲーム、Vtuber 的利用の FaceRigよくわからんSteam 自体は無料。FaceRig の必要性が無くたったため詳しく調べていない
KalidofaceLive 2D で作ったアバターをカメラから表情認識して動かすブラウザ依存?無料のウェブサービス。まばたきや顔の向きに合わせて動かすことができる
ffmpegマイクラの Replay Mod の録画をムービーとして書き出すM1 ネイティブ無料。Xcode と homebrew のインストールが必要

Windows 10 か Windows 11 か。Insider Preview しか選択肢は無いのか

Windows で絶対に動作させたいアプリは、ゆっくりムービーメーカー4とマイクラ統合版です。そのために動員する手持ちの有料アプリ (と OS) は、Parallels Desktop 16、Windows 10 Home、Minecraft Java 版、Minecraft Windows 統合版。できれば追加投資無しで、全てを使いたい。調べた結果は以下となりました。結論としては、Parallels Desktop は、バージョン 16を持っていればアップグレードの必要は無く、Windows は 11 Home の通常版をインストールでき、Windows 10 Home のキーでアクティベーションでき、マイクラ Java 版以外の使いたいアプリは動くことが確認できました。以下はそのまとめです。

アプリ用途対応状況メモ
Parallels Desktop 16Windows を実行M1 ネイティブ (バージョン 16 以上)ちょいちょいやってるセールがお勧め
Windows 10 HomeWindows アプリを実行マイクロソフトによる Arm 版 Windows 10 の提供が停止される←は Parallels のこちらを参照
Windows 11 HomeWindows アプリを実行Inside Preview だけじゃ無く、通常版も Parallels にインストールできる手持ちの Windows 10 Home のライセンスキーが使えるので追加投資不要
Minecraft Java 版Windows 専用 Mod を実行テストした限り、動かず…MultiMC で Arm 版 Windows 用 Java を使えばもしかして?
Minecraft 統合版Switch 版などとも遊べるArm 版が Microsoft Store からインストールして遊べた娘はマウスの動きが速すぎると言って、Windows とアプリ両方でマウスの感度を下げていました
ゆっくりムービーメーカー4YouTube 動画の作成Arm 版 Windows 11 で動いたArm 版 Win 10 での動作報告はいくつかありますが、Win 11 でも動作しました
UTAUボーカロイド的に音声合成で歌わせるArm 版 Windows 11 で動いた特に速くはなっていない感じ

Windows アプリの動作確認には M1 アプリ対応の確認よりも時間がかかりました。理由の一つは、日本のフリーウェアを M1 Mac + Parallels Desktop で動作させているような人の絶対数がそもそも少ないということ。情報が無いので、試してみるしか無い。それともう一つは、Arm 版 Windows 10 では x64 エミュレーションが行えなくなるような記事が見つかったことに起因します (ソースはこのあたり)。これはつまり、Arm 版 Windows 10 では Intel (x86 や x64) アプリが動かなくなるということです。マイクロソフトさんはその対応策として、Windows 11 へのアップグレードを推奨、ですって。さらにこちらの情報では Arm 版 Windows 10 の提供が停止されると言うことで、どのみち Windows 11 にする必要があるみたいでした。Windows エコシステムの良さは、古いアプリが新しい OS でもそのまま動くというところにあるとはいえ、Windows 11 の、しかも Arm 版でこれまでのアプリが動くのか。これは試してみないとわかりませんでした。結果は上の表の通り。マイクラ Java 版は Mac で使えるのでヨシということで娘には納得してもらいました。

アウトかグレーか半分か

ところで、Windows 11 と M1 Mac という点で調査を進めたところ面白いことがわかりました。おおっぴらにそのことに触れている大手メディア系サイトでは見つけられませんでしたが、通常版として使える Windows 11UUP dump というサイト手に入るのです。しかも Windows 10 の同じエディションのキーで本当の Windows としてアクティベーションできる。Parallels Desktop のインストール手順ページ含め大手のメディアでは Insider Preview 版 (要するに評価版) の Windows 11 をインストールできますよーとは表記していますが、評価版を娘に使わせ続けるのはトラブルがありそうで不安です。しかし通常版が使えるのであれば安心感は大きく向上します。UUP dump では海賊版の OS を配布しているわけでは無く、Microsoft 社が過去に公開したイメージをダウンロードし、インストール可能な ISO や VHDX 形式に変換するツールを提供しているので安心感があります。さらに、ボクと娘が持っている Parallels Desktop のバージョンは一つ前の 16 なのですが、16.5 以上であれば Windows 11 のインストールもできると。極めつけに、Yahoo ストアでは、Windows 10 や 11 のアクティベーションキーが数百円で買えることもわかりました。さすがに普通に amazon で買うと 1万円以上する OS が、メディア無しで文字列だけのアクティベーションキーまたはオンラインコードだけになったからと言って数百円になるというのはグレーかアウトか判断できません。不安な方は避けた方がいいと思います。ボクはというと、自己責任、怖いもの見たさ、ダメもと、人柱上等で 500円ほどの Windows 11 Home のキーを買ってみました。結果、Windows 11 のアクティベーションはできて、一ヶ月以上使えています。このあたりは覚悟のある方のみ試されたらいいと思います。

さて、やっと買う直前のフェーズに移行。とにかく安くしたい

使いたいアプリは M1 Mac でも、その上で動く Windows でも動作すると言うことが確認できたので、後は Mac 含めたハードウェアを安くという段階に入りました。Mac 以外に必須なのは、モニタ、キーボード、マウス、さらに我が家では web カメラとなります。特にこだわらない限り Mac 以外で高価なのはモニタですので、ここを安く抑えることがキーになります。だからといって値段だけで判断すると、品質や使い勝手で不満が出て、結局はより良いものを買い直すことになったりする危険もあるので、良い製品を安く買うということが重要になります。我が家では機能と価格のバランスが高い Dell モニタにすることにしました。ボクと同じモデルを探したのですが販売終了となっており、純粋な後継機はありません。QHD (解像度 2560×1440) で画面サイズは 23〜27インチ、USB Type-C 接続ができ、USB ハブとしても使える機種で探したところ、S2722DC が見つかりました。M1 Mac シリーズは USB ポートの少なさがネックなので、モニタがハブになっていくつかの USB 機器をつなげられるというのはコストカットになります。ボクの P2421DC と比較すると、解像度は同じなのに画面サイズが大きく、USB ハブとして使えるポートが 2つに減っていましたが、設置面積に問題は無く、評価を見るとP2421DC で問題のあった USB ハブ機能を使うためにケーブルの抜き差しが必要という問題も解消されているようで、こちらに決定です。Dell 製品は、納期に納得できれば直販サイトの価格が一番安いことが多いです (ビジネス向けしかり)。3月後半現在の価格は 46,536円になってしまっていますが、ボクは Dell 直販 20% オフの 34,110 円で購入し、納期は 2週間でした。同時期の amazon の価格は、2,000円割引が効いても 38,426円。プライムセールでも変化無しでした。ネットにはもっと安く買えたという情報もありますが、今は半導体不足による品不足や納期問題もあるようですし、35,000円程度で購入できれば十分いいところでしょう。間違って他のモデルを買ってしまわないよう、常にブラウザの左端のタブにページを開いておきました。

割引の効率

さて、最重要アイテムであり、最も高価でその分割引効果が一番大きいのはなんと言っても Mac mini M1 です。もちろんこれを買わなければ意味がありません。で、ベネフィット・ステーションの 3% 割引を使おうと思いつつ数日情報収集していたところ、とある方が YouTube で整備済製品の Mac mini を購入したとおっしゃっているのを聞きました。スペックはボクが選定した構成そのものです。これは盲点でした。amazon 含め、Apple Store 以外のショップではいわゆる吊るしモデルしか手に入らないのが普通です (「吊し、つるし」とはハンガーにつるされた洋服を買うように、自分好みにカスタマイズしない既製品を言います)。ボクはこれまで何年も、メモリやストレージのサイズを変更し、キーボードを US 配列にするというカスタマイズをしていたので Mac を整備済製品で入手するという考えに至りませんでしたが、確かに整備済製品は吊しとは違います (詳細は Apple 社のページ参照)。16GB メモリで 1TB の Mac mini M1 の筐体に傷が付いていたら、筐体だけ交換して販売されることもあるでしょう。というわけでその日から、日に数回 Mac整備済製品ページを覗きに行く日々が続きました。最初の頃は黒い Intel Mac mini や Intel Macbook Pro の大きな液晶モデルが現れては消えてという状況です。果たして娘の誕生日までに現れるのか、ま、最悪ベネフィット・ステーションもあるし、なんて思いながら 2週間ほど経ったある日の夕方、突然 iMac M1 が大量に現れました。多分全ての構成がそろっていて、カラーもいろいろ。もちろん 16GB メモリ 1TB SSD という構成のものもあり、パープルは無いけどブルーがある。じっくり見るとブルーの方が娘の好みに近い。キーボードは何が付いてるかわからないけど、どうせ今使っているものを使い続けるからどっちでもええわ。うーん、これ明日の朝には全部無くなってるかもしらん。今頃嗅覚の鋭い人たちや独立系メディアは祭りをやってるな。世の中がスペックやカラーに目移りしている間に絞り込みがほぼ終わっているオレがこのレースを制してやるぜ!

そして購入へ

整備済製品ページで iMac を見つけた時間に救われました。しらふの状態で十分冷静に検討することができたので。安くなっているとはいえ iMac M1 は 20万円を超えており、液晶タブレットを HDMI 接続するにはプラス 8千円ほどのアダプタも必要になります。キーボードなど、娘の用途には不要なものが多くその分高い。突然の出会いに胸が躍ったのは確かでしたが、見送ることにしました。我が家に向かい入れることはできない。その後 3日ほどかけて徐々に iMac は新しいユーザに買われて行きました。ひょっとしたら、いっせいに咲いた綺麗な花が徐々に枯れていくようだったかもしれません。しかしボクには確信めいた予感がありました。次に整備工場から出てくるのは Mac mini M1 に違いないという予感が…。

もったいぶりました

結果、狙ったとおりの Mac mini M1 16GB 1TB をポチれたのは、その数日後のことでした。確定するまで間違いが無いように何度もスペックを見直したのでずいぶん時間がかかりましたが、その間に売り切れることも無く、無事購入することができました。その流れで Dell のモニタを直販サイトでポチり、amazon ではお手頃な web カメラと念のための USB ハブをポチり、怒濤の勢いで購入作業を終わらせました。満足感と充実感。勝った感とやりきった感。Mac のリプレイスを決断してから 1ヶ月以上かかったと思いますが、機種の選定から購入までの一連のアクションがここに完結しました。

感想という体裁の余計な話

実際にモノが届いて接続したり、アプリのインストールや動作テストやデータの移行をしたり、そのつど娘の反応を見たり、というのがこの先続くわけですが、それら技術的にもまーまー細かい話は別の記事にまとめようと思います。なので、購入までの感想を書いてこちらの記事は終わりにします。

良かったこと

娘が親のおさがりじゃ無い現行の Mac を手に入れてからまだ 1ヶ月もたっていないのですが、忖度されないように極力さりげなく感想を聞いてみると「マイクラにキレイな影 Mod とリソースパック入れて録画してもぬるぬる動くようになったから最高」という反応が返ってきて安心しました。使う本人が最優先と思いながらも、実際は親の都合や趣味が多分に含まれたチョイスになっているわけで、娘が望んでいたことが実現できたのは素直にうれしい気持ちです。当初 Mac か Windows かで調査した時は、M1 がいくら速いと言ったって上位モデルの Intel/AMD CPU に性能はかなわないし、そもそもゲームが全然無いじゃないか、という趣旨の情報を多く目にしました。多くの Windows 専用アプリは Parallels で動くのですが、ハードウェアを酷使するゲームは動かないか、動いてもカクカクで遊べたものじゃ無いということです。ま、それはそうなんでしょうが、ファミコン世代・8 bit パソコン世代のボクにしてみれば、ゲームはゲーム機で遊ぶものであり、パソコンは何かを作る、実現するモノなんです。娘もゲームにはそれほど執着していないので問題ありませんでした。むしろ今後ゲームに傾倒することがあるとしても、Mac に向かっている間はゲームばかりにはならないということでもあり、クリエイティビティを伸ばしていきたい親としては好都合です。自分との違いも感じました。女の子だからなのかコンピュータのアーキテクチャやプログラミングに対する興味はおろか、カスタマイズして使いこなしたいという欲求も無く、最新の M1 チップ搭載!ということは娘には全く価値がないようです。でも、単に速いだけのパソコンというのとは違う、未来に期待できる M1 Mac を早い段階で与えられたことは、彼女のステキな未来に役立ってくれそうな、そんなワクワク感もボクに与えてくれています。ジョブズがこの世を去り、アイブは会社を去りましたが、M1 を始めとした Apple Silicon は、Apple 製品やコンピュータの世界を楽しいものにしてくれました。

結局どっちを勧めるか

お子さんをプロゲーマにさせてあげたい、ゲーム実況のスキルを伸ばしてあげたい、一緒に PC ゲームをしたい、という方は Windows の走る、Intel/AMD 搭載ゲーミング PC がいいと思います。もしそうではなく、上に書いた感想に共感できる方には、M1 を搭載したどれかの Mac をお勧めします。入門者向けには安いモデルでいいでしょう。まさに Mac mini は最適です。Macbook Air や Pro、iMac といった一体型は、液晶が壊れたら全て修理でその間は使えません。Mac mini なら本体さえ壊れなければ、その場しのぎの液晶モニタを買ってでも使い続けることができます。逆に、主な用途が変わればモニタだけ良いものに変えるだけで環境をアップグレードできるのです。モヤモヤするなら今日から整備済製品ページに足繁く通いましょう。

これも言っておきたい

最後に毒をひとつ。知らない情報や自分の想定を裏付ける・もしくは間違いだとわからせてくれる情報をブログや YouTube で入手しようと結構な時間を使いましたが、クソのような情報の多さに閉口しました。どこかから持ってきた情報を切り貼りして、スカスカの文章のあげくに「いかがでしたか」とまとめるフォーマットが多いですがその中には、ボクの記事をほぼ丸パクリしたものさえありました。日本の社会や人付き合いになじめず、ブログや YouTube で生活費を稼いで自立できたという人達には素直に良かったねという思いはあります。しかし、生活費を稼ぐためだけのペラッペラのクソ記事に自分の貴重な時間を使うことには納得できません。量産型クソブロガーや超薄型 YouTuber によってインターネットがウ○コ地帯になることはガマンなりません。少しでも多くのお父さんお母さんおばあちゃんおじいちゃんお姉ちゃんお兄ちゃんには、この世を、インターネットをより良いものにしていってくれる若い世代の育成にご尽力いただけたらと切に願うしだいでございます。また、日本語のソースだけでは偏りがあり、欲しいものにたどり着けない可能性が高いです。痛感しました。正しい判断をするには十分な情報が必要です。英語で、少なくとも読み書きができるスキルは必須であると思って間違いありません。TOEIC なら 750点程度です。苦手とか言っていたら世界から置いて行かれます。愛する人もしくは愛したい人がいるなら、とにかく英語スキルを磨いていきましょう。マイクラの mod や配布マップを導入するにも、英語は必須なのです。

ここまでお読みいただきありがとうございました。あなたの、そして未来を作る誰かのお役に立てたら幸いです。

Mac で brew upgrade したら tkinter が見つからなくなったが、解決した話

一年ほど前、Intel Mac で tkinter をいじっていたとき、いくらがんばっても日本語入力の時の選択肢を表示させる方法がうまくいかなかったので、しばらく tkinter 含めた Python の GUI からは離れていました。が、最近読み始めた本で tkinter を使っていたので気分が乗って、改めていろいろ試したところ、ハマった後に解決できたのでその方法のご紹介です。

結論から先に言うと、答えは brew info python に書いてあった

brew で Python を 3.9.1 から 3.9.6 にアップグレードしたときのログはロクに見ていなかったのですが、一晩寝かせた後に brew info python を叩いてみたところ、やるべきことが書いてあり無事解決できました。下の (略) に挟まれた部分です。tkinter はもう Python 3 に含まれ無くなったけど、まだインストールできますよ、という事を言っています。

% brew info python3
python@3.9: stable 3.9.6 (bottled)
Interpreted, interactive, object-oriented programming language
https://www.python.org/
(略)
tkinter is no longer included with this formula, but it is available separately:
  brew install python-tk@3.9
(略)

というわけで、もし brew upgrade で python3 を 3.9.x にアップグレードした後に tkinter が動かなくなった場合は、brew install python-tk@3.9 で tkinter も別途インストールしてあげてください。

ほんの最近まで、多分去年くらい?までの情報では「Python で GUI やるなら、まずは標準で入っている tkinter を試しましょう」と書かれていると思うんですが、少なくとも Mac の brew によるインストールでは標準では入っていない、ということですね。

動かなくなったときのエラーはこんな感じ

% python3 -m tkinter
Traceback (most recent call last):
File "/opt/homebrew/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py", line 188, in _run_module_as_main
mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
File "/opt/homebrew/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py", line 147, in _get_module_details
return _get_module_details(pkg_main_name, error)
File "/opt/homebrew/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py", line 111, in _get_module_details
__import__(pkg_name)
File "/opt/homebrew/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 37, in
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'

動かなくなった当日は、pipenv だとモジュールを読み込んでくれないような気がしていてずいぶんと余計な遠回り。一晩寝かせて Python 環境全体の再構築までを覚悟したものの、pipenv の外でも動かない。やったことをイチから見直して答えにたどり着けてヨカッタです。

Parallels Desktop 16 for Mac 早期ゴールデンウィークプロモーションで 25% オフ (2021年 4月 29日現在) (5月 3日改訂)

Parallels Desktop 16 for Mac が 25% オフのキャンペーンやってます

先日 M1 プロセッサ正式対応版のバージョン 16.5 が発表されたばかりの Parallels Desktop for Mac ですが、早期ゴールデンウィークプロモーションということで 25% オフのキャンペーンやっています。いつまで適用されるのかわからないので、気になっている方はこの機会にえいやっと入手してしまってはいかがでしょうか。

Parallels 日本語サイト

Parallels Desktop の簡単な説明と我が家での用途

Parallels Desktop for Mac とは、Mac 上で他の OS を実行する仮想環境です。Windows 10 や各種 Linux 等の OS を、Safari やメール等のアプリケーションと同じように Mac OS の上で動かすことができます。Mac ではリリースされていない Windows 用アプリケーションやゲームを実行することができるわけです。ボクの子供は Intel CPU が乗った数年前の iMac で Parallels Desktop を実行し、そこで Windows 10 Home 64bit を実行、その上でゆっくりムービーメーカー4を使って YouTube 動画を編集しています。編集中の動画再生はカクカクしており、書き出しの時間も専用の PC や Bootcamp を使用した方が早いのでしょうが、一台の Mac で Mac 用と Windows 用のアプリケーションを行ったり来たりしながら作業ができる、というのは実に快適です。OS やハードウェアに自分のやりたいことが制限されない、そういう自由を手に入れることができるのが、Parallels Desktop for Mac なのです。

一点注意すべき点は、M1 チップを搭載した Mac の場合、これまでの Intel チップ向け Mac OS や Windows を実行できないという所です。他にも、そもそもの Mac のスペックによっては実用に耐えないと言うこともあるでしょうから、不安な方は 14日間無料で利用できるトライアル版を試してみて購入の判断をするのがよいかと思います。

トライアル: https://www.parallels.com/jp/products/desktop/trial/

25% オフはなかなか大チャンス (なので、自分用にも購入)

“Parallels キャンペーン” 等とググってみると、いくつかのサイトで割引キャンペーンの情報が出てきますが、買い切り版 (アップグレードの権利は無いが、同じバージョンを追加料金なしでいつまでも使用できる) が 25% オフというのは、直販・販社経由のどちらでもなかなか無いようです。さらに、「早期ゴールデンウィーク」と謳っているので、後半にはやっていないかもしれません。というわけで、2021年 4月 25日、自分用にも買ってみました。 本記事を書いている 4月 29日現在、まだプロモーション中のようです。

買い方を簡単にご説明

https://www.parallels.com/jp/products/desktop/buy/?full

上のリンクから公式ウェブサイトにアクセスし、ライセンスを選択します。アップグレード版を使用するには、以前のバージョンの Parallels Desktop のライセンスキーを持っている必要があります。初めて購入する方は新規ライセンスを選択します。ボクはおそらく 20年ほど前に購入した Parallels Desktop 4 for Mac のライセンスがあったため、アップグレードを選択しました (これほど古くても、アップグレードできました。3,000円程度とはいえ、若き自分の投資に感謝)。

エディションは、家庭および学生向けでよいでしょう。買い切りで、Mac OS のアップグレードによって Parallels が実行できなくなるその日までは使い続けられます。

この段階ではまだ割引適用前の金額

【注意!】新規の単発購入は 9,818円ナリ (8,345円は、アップグレード権を含む年次更新サブスクの価格)

と、ここまで書いて、購入金額の不具合に気がついたので、新規購入の方は以下をお読みになった上で、金額が訂正されてからの購入にした方がよいかと思います。

新規の場合、左側の単発購入の金額は 8,345円のはずだが…

2021年 4月 29日 (祝・木) 現在、上記キャプチャの通り新規ライセンスで家庭および学生向けエディションを選び「今すぐ購入 8,345 円」をクリックした先のページでは、単発購入の価格がなぜか 9,818円になっています。クーポンコードに SAVE25 をコピペして適用をクリックしても、7,363円 (9,818円に対する 25% オフ) にしかならず、期待している 6,259円になりません。ボクが先週アップグレード版を購入したときには、3,903円 (5,204円に対する 25% オフ) になっていましたので、新規の単発購入だけの不具合の可能性があります。サポートに連絡しようとしましたが、祝日は営業していないようでしたので、フォームから訂正の依頼をしておきました。新規で購入される方は、前のページとこのページの価格を必ず確認することをお勧めします 【以下、5月 3日改訂内容】サポートに問い合わせたところ、新規の単発購入価格は 9,818円で正しく、サブスクなら 8,345円ということで、ボクの勘違いだったようです。確かに前のページでは「8,345円より」と書いてあるので、間違ってはいないですね。。。(ところで、5月 3日現在、黄金のプロモーションバナーは無くなっていますがクーポンコードは適用できるような?)

このページですることはこんな感じです:

  1. 単発購入か 1年間のサブスクリプションをクリック
  2. 左下にクーポンコード入力ボックスが無ければ、チェックを入れて表示する (上のキャプチャ参照)
  3. クーポンコード SAVE25 をコピー&ペーストして「適用」をクリック
  4. 合計金額が 25% オフになっていることを確認
  5. 氏名、住所、メアドを入力
  6. 支払い方法を指定、必要事項を入力して「次へ」

無事決済されれば no-reply@cleverbridge.com から、注文内容やプロダクトキーが書かれたメールが届きます (クレバーブリッジ社は、Eコマースパートナー企業として、Parallels の受注及び支払処理管理業務を行っているということです)。メールにあるダウンロードのリンクから Parallels Desktop をダウンロード&インストールするか、トライアル版をインストール済みであれば、プロダクトキーを入れてあげれば製品版として使用できます。

というわけで、今日はここまで

M1 チップに正式対応した Parallels Desktop 16.5 for Mac。Windows Insider Preview で Arm 版 Windows 10 をインストールしてちょろっといじっただけですが、キビキビ動いている感じです。個人的に取り立てて Windows でやりたいことも無かったので、とりあえず、ゆっくりムービーメーカー4 をインストールしてみました。使い方を知らないのであれですが、起動は確認できました。

他にもいろいろ試そうかとも思ったのですが、仕事以外で個人として Windows でやりたいことも特に無く、何かコメントいただければ試してみようと思います。

コロナ禍のゴールデンウィーク、時間はたっぷりありますからね。

Mac mini (M1, 2020) で Dell モニタの USB ポートが使えない、画面が表示されない時のワークアラウンド

Dell モニタに 20cm の USB-C の延長ケーブルを接続

Mac mini (M1, 2020) を購入した

いろんな方がレビューしてるように、パフォーマンスは素晴らしいです。アプリケーションも、Intel CPU 用機能拡張や VPN (具体的には LogMeIn HAMACHI) などシステムの深いところに食い込んだものは動かないケースが多いようですが、それ以外は概ね想定通りで、すごく満足しています。各デベロッパの対応も早く、毎週のようにサポートされるアプリケーションが増えるのを見られるのも楽しいですね。

Dell モニタの画面が映らない、USB ポートが使えない

しかし、メインで使用している Dell のモニタ P2421DC に USB-C で接続しながら同モニタの USB ポートをハブとして使用するにはコツがいることがわかりました。モニタに電源が入っている状態で Mac mini を起動すると、USB ハブにつながったキーボードから入力できないのです。映像は出力されています。Dell Latitude 5310 や XPS では当然全く発生しません。あまり気にしていませんでしたが、そういえば MacBook Air (Retina, 13-inch, 2019) でも USB-C ケーブルを抜き差ししていたことがあるので、Mac 起動時の USB 機器の接続フローと Dell モニタ側のそれがミスマッチしているように思えます。

ともあれ、日本語ではあまり同様の症状や解決策が無いようなので、投稿しておきます。

環境:

不具合の内容:

macOS 起動後、UCB-C ケーブルで接続された メインモニタのポート USB 3.0 x2 (側面)、USB 2.0 x2 (背面) に接続した機器を認識しない。キーボードやマウスからの入力も、iPad 等への給電も行えない。

下記ワークアラウンドを実行し、キーボードやマウスが使えるようになった後も、スクリーンロックしてしばらくした後にログイン使用とすると、キーボードからパスワードの入力はできるが画面がメインモニタに表示されないこともある。

不具合の再現方法:

モニタの電源が入っている (スタンバイ) 状態 で、Mac mini の電源を投入する。macOS 起動途中から画面は表示されるが、USB 機器は使用できない。

対処方法・ワークアラウンド:

Mac の起動前にできること:

Mac の電源を入れる前に、モニタの電源を切っておく。ボクの場合は HDMI 接続のモニタもあるため、そちらでパスワード入力画面が表示されてからメインモニタの電源を入れる。ごめんなさい、テストしているときはこの方法が有効だった (と少なくとも思う) のですが、最近はなぜか全くうまくいきません。以下をお試しください。

Mac の起動後にできること:

モニタとつながっている USB-C ケーブルを抜き差しします。OS が起動してしまった後では、モニタの電源 off/on では接続されません。Mac mini 背面からケーブルを抜き、モニタがスタンバイ状態に戻ったら再接続します。

ボクは少しでも簡単にケーブルの抜き差しができるようにと、USB 3.1 Gen2 規格に対応した延長ケーブルを amazon で購入しました。本投稿トップの画像のように、モニタ側にこのケーブルを挿し、画面に表示されなかったりキーボードが効かないときに矢印の部分を抜き差ししています。スイッチ付きの USB-C ケーブルを探したが信頼できそうな (Thunderbolt として使えそうな) ものが見つかりませんでした。Mac mini 本体のポートへのケーブル抜き差しに抵抗がある、設置場所的に無理という方はこちらをお勧めします。

今後の展望:

Intel チップの MacBook Air (macOS 10.15 Catalina -> 11.1 Big Sur) でも発生しますが、本体のキーボードでログインはできるし、USB-C ケーブルの抜き差しもたいした手間じゃ無い、ということであまり気にしていませんでした。設置場所によっては Mac mini のケーブル抜き差しは面倒なので、当面は Dell のモニタの電源を切る癖を付けるしかなさそう。Dell は2021年初頭までにMacバージョンのDell Display Managerを提供する (引用元) と言っているで、近い将来解決してくれると願いたいです。

© Peddals.com