MacBook Pro 2020 13"でNieR Automataをプレイしたい

  • 投稿日:
  • by
  • カテゴリ:

NieR AutomataのPS4版を1周目クリアしたところでもっと高画質でプレイしたくなったけど、性能の良いGPUの載ったWindowsマシンは手元に無く1台組むほどのことでもなく、グラボというとMac miniのeGPUとして使ってるRadeon RX 580があるな、そうか、Boot CampでWindowsをインストールしてeGPUを使えるようにすれば良いじゃん、でもMac miniはメインだしSSDは512GBだからWindowsをインストールしたくないなぁ、おっと、MacBook Pro 2020なら1TB SSDやんけ、ということで掲題の件となったわけ。

あまりニーズがあるとも思えないけれど、動かした環境・手順をメモしておく。

ハードウェア

ソフトウェア

手順

  1. Boot CampでWindows 10をインストール。バージョンは厳密に1903のBuild 18362.30。これ以外のBuildや、1909などだとうまくいかなかった。
  2. Windowsの初期セットアップ後、Windows Update Blockerでアップデートを停止した後、Boot Campのインストーラを実行(自動で起動してくるけれど、無視してWUBを実行する)。
  3. Edgeブラウザをインストール。BootCampDrivers.comからのダウンロードは1903に入ってるIEだと出来ないので。
  4. Win10-Radeon-Software-Adrenalin-Apr2020-BootCamp-Red-Edition.zipをダウンロードして、適当なところに展開。こちらもWindows同様、バージョンは厳密にApr2020のRed Edition。これより新しいバージョンだとうまくいかなかった。
  5. 展開した中にDDU (Display Driver Uninstaller)のアーカイブがあるのでさらに展開したフォルダ内の、Display Driver Uninstallerを実行。オプションで一番下にあるUpdateの停止を選択した後、AMDのドライバを削除。セーフモードでなくても問題無い。
  6. ここがキモ。
    デバイスマネージャで4つあるPCI Expressルートポートのうち、3つを無効にする。
    devicemanager.png
    この図だと、[Tab]キーの横にある(左側手前)ポート「以外」を無効にした状態。ここにeGPUへのケーブルを接続する。[Esc]キー横にあるポートに接続したいなら、1・3・4番目のPCI Expressルートポートを無効にする。
  7. eGPUボックスの電源を入れてケーブルを接続する。VGAドライバなどのインストールが開始されるが無視して良い。
  8. 展開したWin10-Radeon-Software-Adrenalin-Apr2020-BootCamp-Red-Editionのフォルダにあるsetup.exeを実行。インストールが完了すると応答しなくなるが、数分おいて電源ボタンで再起動して構わない。
  9. eGPUに接続されているモニタをメインモニタにする。Dual Shock4をBluetooth接続して、Steamをインストール、NieR Automataをプレイする、と。

この簡潔な説明で「分からない」ヒトは、手を出しちゃダメ。当然無保証。素直にWindows PCを組むか買うかしてプレイしましょう。

USB 3.0ハブのノイズ問題

  • 投稿日:
  • by
  • カテゴリ:

Mac miniのUSB-Cポートを空けるために、USB-AポートにUSB 3.0ハブを追加して、あわよくばSDカードのリーダーも兼ねさせようと、Rocketek の USB 3.0カードリーダー、ポータブルアルミニウム3ポートUSB 3.0ハブアダプターというのを買ってみたところ、問題が。
まず、接続されるスピーカーやマイクなどがUSB 2.0なのでmacOSからはUSB 2.0ハブとして認識されてしまい、カードを読み込む速度が480Mbpsになってしまう。

そして、もう一点、こちらの方が致命的なのだけれど、電波ノイズが酷くてBluetoothマウス・キーボードが使い物にならない。

つまり、USBコネクタ部、ケーブル、ケーブルと本体の接続部のいずれかか分からないけれど、2.4GHzの電波ノイズが猛烈に出てることが推測される、と。これはアカンということで返品。
518tfzwLB1L._AC_SL1000_.jpg

それなら、本体とケーブルが分離していてケーブルが変更出来るハブならどうだろうということで、ORICO USB3.0 ハブ 4ポート 高放熱 アルミ USBハブを買ってみた。
61+0cgUeIyL._AC_SL1500_.jpg
付属する1mのケーブルで接続したところ、先のRocketekのものよりだいぶマシながら、やはりマウスが遅延する。

で、付属するケーブルの品質は期待出来ないと思ったので念の為買っておいた、Cable Matters USB 3.0 ケーブル USB Type A オス オス ブラック 5Gbps 1.8mに変更。

あら不思議、全くマウスもキーボードも全く問題なく動作する、と。

USB-AだろうがUSB-Cだろうが、USB 3.0だと2.5GHz付近の電波ノイズが出るので、コネクタやケーブルがきちんとシールドされてないと、2.4GHzのBluetoothやWiFiに影響が出まくる、という実体験だった。

追記:付属のケーブルを剥いてみた。シールドなんて無かった、イイネ?
20210423115244.jpg

pg_prewarm on worker nodes

  • 投稿日:
  • by
  • カテゴリ:

I'd like to load all the distributed tables on worker nodes to the memory with pg_prewarm. But the coordinator node doesn't propagate a query, 'SELECT pg_prewarm', to the worker nodes. So, I wrote a simple procedure to execute pg_prewarm on worker nodes.

On coordinator node:

CREATE OR REPLACE PROCEDURE pg_prewarm_all() 
AS $$
DECLARE
  cur1 CURSOR FOR
	SELECT shard_name FROM citus_shards;
	shard_name_rec RECORD;
BEGIN
  OPEN cur1;
  LOOP
    FETCH cur1 INTO shard_name_rec;
      EXIT WHEN NOT FOUND;
    RAISE INFO '%', shard_name_rec.shard_name;
    PERFORM run_command_on_workers($cmd$ 
      SELECT pg_prewarm('%', 'buffer');
      $cmd$), shard_name_rec.shard_name;
  END LOOP;
  CLOSE cur1;
END;
$$
LANGUAGE plpgsql;
citus=> call pg_prewarm_all();
INFO:  github_events_102008
INFO:  github_events_102009
INFO:  github_events_102010
...snipped...
INFO:  github_users_102069
INFO:  github_users_102070
INFO:  github_users_102071
CALL

Check pg_buffercache on worker node:

citus=> SELECT c.relname, count(*) AS buffers
        FROM pg_buffercache b INNER JOIN pg_class c
        ON b.relfilenode = pg_relation_filenode(c.oid) AND
           b.reldatabase IN (0, (SELECT oid FROM pg_database
                                 WHERE datname = current_database()))
        GROUP BY c.relname
        ORDER BY 2 DESC
        LIMIT 10;
       relname        | buffers 
----------------------+---------
 payload_index_102008 |    1099
 payload_index_102038 |    1076
 payload_index_102036 |    1070
 payload_index_102018 |    1069
 payload_index_102016 |    1008
 payload_index_102022 |     988
 payload_index_102032 |     967
 payload_index_102034 |     937
 payload_index_102020 |     922
 payload_index_102030 |     920
(10 rows)

パスワードをハードコードすることになるので、ちょっとセキュリティ的にどうなのって感じだけど、以下のスクリプトを~/bin/に置いて(例えば"restart"という名前で)、chmod 755しておきパスを通しておけば、restartコマンドで再起動してBluetoothキーボードでログイン出来るようになる。あるいは、Automatorでサービスにしておいて、Finderのサービスから選ぶようにしておいても可。

#!/bin/bash

readonly rootpass="macos_root_password"
readonly username=$(whoami)
readonly userpass="your_password"

expect -d -c "
spawn sudo fdesetup authrestart
expect -exact \"Password:\"
send -- \"${rootpass}\n\"
expect -exact \"Enter the user name:\"
send -- \"${username}\n\"
expect -exact \"Enter the password for user '${username}':\"
send -- \"${userpass}\n\"
expect eof
"

Azure Arc Enabled PostgreSQL Hyperscale (Citus)をやっていき

  • 投稿日:
  • by
  • カテゴリ:

Azure Arcはハイブリッドクラウドを管理するためのソリューションで、Azure以外のパブリッククラウドやオンプレミス環境を一括してAzure Portalから扱うことが可能になるんだけども、このArcを使ってKubernetes上にAzure Database for PostgreSQL Hyperscale (Citus)を構築することも出来ると。

でもまあKubernetesを自前で構築するのは面倒なので、Azure Kubernetes Service (AKS)のクラスタをデプロイしてそこにHyperscaleを立てちゃう、という記事がAzure Arc Jumpstartに公開されてると。面倒じゃ無い人は自前のKubernetesを用意すれば、もちろんそこにHyperscale (Citus)も構築できます。比較的簡単に。

要はAzure Resource Manager Template (ARM Template)なんで、こいつをちょいちょいと編集して実行すれば良いのだけれど、例によって例のごとく英語なんで、手順の主要なところだけ日本語で解説しましょう、というのがこのエントリーの主旨。macOSでの手順なので、Windowsでやりたい人は適宜読み替えるかWSL上でやってください。

さて。まずはレポジトリをコピります。gitが入ってない人はいませんよね?ここからつまづくようだと、先生ちょっと不安です。

git clone https://github.com/microsoft/azure_arc.git

Azure CLIはインストールされてると思うけれど、無ければHomebrewでインストール、有るならアップグレードしときます。

brew install azure-cli
brew upgrade azure-cli

SSHのキーが要るので、作ってない場合は以下で。

ssh-keygen -t rsa

キーは.ssh/id_rsa.pubに出来てるので、あとで

cat ~/.ssh/id_rsa.pub | pbcopy

すればクリップボードに。自分は以下のaliasを設定しちゃってますが。

alias pbkey="cat ~/.ssh/id_rsa.pub | pbcopy"

これで最新のazコマンドが使えるようになってると思うので、ログインします。

az login

つぎにサービスプリンシパルを作成。MyAzureArcDataは任意の文字列で。

az ad sp create-for-rbac -n "http://MyAzureArcData" --role contributor

何回かリトライするかもしれないけどちょっと待ってれば作成されます。あとで使うのでファイルにコピペして保存しとく。作成時にリダイレクトしておいてももちろん可。

{
"appId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"displayName": "MyAzureArcData",
"name": "http://MyAzureArcData",
"password": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"tenant": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

今回がAzureArcDataを利用するのが初めて!という人は、リソースプロバイダを有効化する必要があります。以下。

az provider register --namespace Microsoft.AzureArcData

登録中は以下の通り、Registeringという表示。

az provider show -n Microsoft.AzureArcData -o table
Namespace               RegistrationPolicy    RegistrationState
----------------------  --------------------  -------------------
Microsoft.AzureArcData  RegistrationRequired  Registering

登録完了するとStateがRegisteredになるので、ウマ娘でもやりながら待っててください。

az provider show -n Microsoft.AzureArcData -o table
Namespace               RegistrationPolicy    RegistrationState
----------------------  --------------------  -------------------
Microsoft.AzureArcData  RegistrationRequired  Registered

登録完了したら、いよいよデプロイと行きたいところだけど、その前にAKSのバージョンをチェック。このエントリーを読んでる人はだいたい東日本人だろうからリージョンをAzure東日本にしてるけど、西日本人はAzure西日本にするのも悪くない考えです。

az aks get-versions -l japaneast -o table
The behavior of this command has been altered by the following extension: aks-preview
KubernetesVersion    Upgrades
-------------------  -------------------------
1.20.2(preview)      None available
1.19.7               1.20.2(preview)
1.19.6               1.19.7, 1.20.2(preview)
1.18.14              1.19.6, 1.19.7
1.18.10              1.18.14, 1.19.6, 1.19.7
1.17.16              1.18.10, 1.18.14
1.17.13              1.17.16, 1.18.10, 1.18.14

執筆時点では1.20.2はプレビュー、1.19.7がstableなので1.19.7を使いました。previewを敢えてデプロイしてバグを踏んでSupport Requestをあげてくれるのは大歓迎ですが?

次にパラメータファイルを編集しないといけません。パラメータファイルはgit cloneしたディレクトリのJSONなので、VimでもEmacsでもVSCodeでもnanoでもJeditでもお好きなエディタでどうぞ(宗教戦争を回避するスタイルで)。

cd azure_arc/azure_arc_data_jumpstart/aks/arm_template/postgres_hs
vim azuredeploy.parameters.json

JSONにパラメータの例が入っているので分かると思うけれど、sshRSAPublicKeyはcat ~/.ssh/id_rsa.pub | pbcopyしたやつ、SPN_CLIENT_ID / CLIENT_SECRET / TENANT_IDはサービスプリンシパルを作成した時の、appId / password / tenant、ARC_DC_SUBSCRIPTIONはaz account showのid、vmSizeはaz vm list-sizes -l japaneast -o tableで好きなのを(強火にすると高いよ!)。

POSTGRES_WORKER_NODE_COUNTとPOSTGRES_DATASIZEはIntegerなので、以下のようにダブルクォートを付けないこと。

        "POSTGRES_WORKER_NODE_COUNT": {
            "value": 3
        },
        "POSTGRES_DATASIZE": {
            "value": 524288
        },

ちょっと不安になるのが、POSTGRES_DATASIZEで、単位がMBになってる。Hyperscaleのストレージは現時点では512GB / 1TB / 2TBなので、とりあえず512 * 1024で524288を入れてみると。POSTGRES_SERVICE_TYPEはClusterIPで。

残りのパラメータはFQDNの衝突だけ気を付けて任意で。

さて、パラメータが揃ったのでデプロイ。しかし、なんでJSON中にリソースグループ名もリージョンも指定してるのにリソースグループを作ってくれないんだ?
jqで抜いてシェル変数にセットしておけばtypoしないのでよろしいかと。

rg=$(jq -r ".parameters.resourceGroup.value" azuredeploy.parameters.json)
lc=$(jq -r ".parameters.ARC_DC_REGION.value" azuredeploy.parameters.json)
az group create --name $rg --location $lc

az deployment group create --resource-group $rg \
--name arcdatapostgresdemo \
--template-file azuredeploy.json \
--parameters azuredeploy.parameters.json

はい、ここまで行けば後は20分ぐらい、アズールレーンでもやりながら待っててください。

Jumpstartのドキュメントでは、このあと、Windowsにログインしてホゲホゲしましょうとあるんだけど、別に手元にkubectlやpostgresql-clientがインストールされてれば、ダイレクトに操作すれば良いんじゃないの?となるので、vmSizeを指定したのは何だったんだ?となるんだけども、このWindowsにログインしないとデプロイが完了しないという罠が仕掛けてあるので、まだ消しちゃダメですw
なんでPowerShellにするかなぁ...。

2021-03-5追記:vmSizeはKubernetesのノードのサイズですね。Windowsのサイズではなかったです。

あ、ついでにkubectlとpostgresql-clientはインストールしておいてもバチは当たらないと思うので、MacのSSDが残り5%とかになってなかったら入れときましょう。5%になってる人はMacを買い換えて、このエントリーの最初からやり直しです。

az aks install-cli

すればkubectlはインストールされますし、

brew install postgresql-client

すればHyperscaleとお喋り出来るので、そこはよしなに。

さて、Azure Portalを開いてみると、リソースグループが2つ作成されていて、WindowsのVMがあります。
20210304225307.png

IPアドレスを見つけて、Microsoft Remote Desktopで接続します。
20210304225249.png

なんかPowerShellが走り出します。
20210304225850.png

kubectlが走り出して
20210304225938.png

コンテナ(正確にはポッド)が作られていきます。この辺で眺めているのに飽きてくるので、しばらく放置してTwitterでもやっててください。
20210304230104.png

Twitterから帰ってきましたか?油断している間に、arcpgc-0(HyperscaleのCoordinator Node)、arcpgw-0/1/2(HyperscaleのWorker Nodes)がRunningしちゃってますよ、予想に反して一発で動いちゃってるじゃん!
で、裏になってる画面にPostgreSQL InstanceのIPアドレスが表示されてますね?
20210304231656.png

psqlで接続してみましょう。

psql -h 20.46.123.242 -U postgres
Password for user postgres: 
psql (13.2, server 12.3 (Ubuntu 12.3-1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=#

うお、繋がった!ビックリした!

分散テーブルを作ってみましょう。

postgres=# CREATE TABLE hoge (id bigint);
CREATE TABLE
postgres=# SELECT create_distributed_table('hoge', 'id');
 create_distributed_table 
--------------------------
 
(1 row)

当然っちゃ当然ですけど、参照テーブルも作れますね。

postgres=# CREATE TABLE fuga (id bigint);
CREATE TABLE
postgres=# SELECT create_reference_table('fuga');
 create_reference_table 
------------------------
 
(1 row)

PostGISを有効にしてみる、と。

postgres=# CREATE EXTENSION postgis;
CREATE EXTENSION

はい、というわけで「Re:ゼロバイトから始めるYAML生活(ネット遮断環境で)」みたいな地獄を経験しないでも、Kubernetes上に作成されたAzure Database for PostgreSQL Hyperscale (Citus)が動いちゃったので、「Kubernetes完全に分かった」って言えるようになりましたね?現場からは以上です。

2021-03-05追記:AKSノードを追加してからWorker Nodeを30とかにすると、ちゃんと動きますね...。
20210305085320.png

ContainerCreatingになってるけど、そのうち動く。
20210305085311.png

PostgreSQLに20TB・89億件のデータを入れてみる

  • 投稿日:
  • by
  • カテゴリ:

そーだいさんがこんなことを呟いていた。

ふーむ。これはやってみないといけないですね。
普通のPostgreSQLではちょっと無理っぽい件数なので、Azure Database for PostgreSQL Hyperscale (Citus)に入れてみる。海外さんのPGstromという変態実装(褒めている)を使う方法もあるけれど、PaaSでRDBMSで、っていうとHyperscale (Citus)がまず候補かな、と。

ちょっとどんな感じか分からないので、IOPSが最大になる2TBのストレージを持つワーカーノードを20台で構成してみる。
20201009210014.png
全体としてはこんな感じ。 20201009210001.png

で、64vCPUのVMにPremium SSDのData Diskを付けたUbuntuにpostgresql-clientをインストールした上で20TBのCSVデータを用意。splitコマンドで適当なサイズに分割して、

$ find chunks/ -type f | 
xargs -n1 -P64 sh \
-c "psql -h riotbindex-c.postgres.database.azure.com -p 5432 -d citus --username=citus \
-c \"\\copy table1 from '\$0' WITH CSV\""
って感じに投入する。クライアントを64vCPUにしたのはpsqlを64並列でデータ投入するから。コーディネータノードも64vCPUなので良いだろうと思ったら、もう少しコーディネータには余裕があった。

投入するのに、約7時間かかった...。さて、入ってるかな?

citus=> \timing
Timing is on.
citus=> select count(*) from table1;
   count    
------------
 8887648000
(1 row)

Time: 7689798.324 ms (02:08:09.798)

デフォルトパラメータのままだと、89億件を数えるのに2時間かかる...。

さて、本筋はインデックスですね、やってみましょうこうですか分かりません。

psql > CREATE INDEX table1_index ON table1 (ev_type);
CREATE INDEX
Time: 4884228.616 ms (01:21:24.229)

というわけで、1時間21分24秒でした。

Wahoo ELEMNT BOLTを動画に表示する話

  • 投稿日:
  • by
  • カテゴリ:

先日来、OSMO Actionで撮影した動画にWahoo ELEMNT BOLTのデータを表示する、ということをやっている。元々、ELEMNT BOLTはCANYON用のマウントで搭載していて、これは下部にGo Proなどのアクションカメラのマウントもあるので、そこにOSMO Actionを装着した次第。OSMO Actionは記録する画質が2.7K以上で無いとRock Steadyという映像ブレ補正技術が効かず、2.7Kでは内蔵バッテリーで実測80分程度しか録画出来ないため、サドルバッグに入れたモバイルバッテリーまで1.5メートルのUSB-C to USB-Cなケーブルを引っ張り、タイラップでケーブルを固定している。

撮影した動画にELEMNT BOLTから出力したFITファイルのデータを表示するのに、まずはGarminのVIRB Editを試してみた。で、何が不満だったかというと、ギアが表示出来ないことと、動画とFITのタイミングを合わせるのが「地図上の位置」で行う点。自分が乗ってるCANYONはSRAM Force eTAP AXSにパワーメーターを追加しているが、シフターが無線なので現在ギアがいくつかということは、サイコンの画面でないと確認出来ない。なので、動画中でも「あー、この時、2-10までギア変えたのか」とか知りたい。タイヤの周長をL(mm)、ケイデンスをC(bpm)、フロントギア/リアギアの歯数をF/Rとすると、60CFL/1000000R(km/h)なので、ギアから計算される速度とサイコンの実測値の違いを確認したりもしたい。

じゃあ作るかということで、まずFITにfileコマンドして、まあバイナリだよねhexdumpするかなるほどFITというシグネチャが入ってるのね、まで数分。んでちょっとググって、FIT SDKを見つけてきて、ざーっと目を通す。んー、大して面倒じゃないけど、誰かパーサを書いてないかなぁ、とググる。最初に見つけたパーサは使い勝手が悪く、fit parserの検索結果を総当たりして見つけたのが、PyPIにあったfitdecode。FITファイルを食わせてとりまイテレータでメッセージ部分をダンプしてみると、問題無さそう。じゃあこいつで、というところまで小一時間。

ダンプは出来るようになったものの、フィールド名がunknownだったりするので、それを要・不要分けてdictの配列に突っ込むか否かを処理したり、FIT SDKには無い形式で保存されてるデータを変換したりをparseint()という関数にまず実装。ELEMNT BOLTのイメージを動画に合成するのに、PillowでPNGを出力してffmpegでオーバーレイする作戦にしたものの、Pillowが遅くてどうしたもんかなぁ、あ、ワークアラウンドがあるやん、で高速化に成功。でも、まだ遅いなぁ、ループ内に無駄な処理が多いからそれを直して、っと、はい、合成できた、までは結構時間がかかった。

githubに公開したやつは、ここまでを実装してある。手元のバージョンでは地図を表示出来るようにしてあるけれど、公開する前にちゃんとオブジェクティブに書き直したいわぁ...。

MariaDBでSpiderクラスタを作る

  • 投稿日:
  • by
  • カテゴリ:

半分仕事、半分興味本位でMariaDBのSpiderクラスタをAzure上に構築するスクリプトを書いたので、GitHubに晒しておいた。

半分しか仕事じゃないのはこれがPaaSのサービスでは無いからなんだけど、仕事に「含まれている」Hyperscale (Citus)はスケールアウト出来るPostgreSQLである一方、MySQL / MariaDBのスケールアウト出来る実装って何やろな?って感じでSpiderを選んでみた。

スクリプトを書いて動かしてみた雑感としては、Citusだとシャーディングの設定はcreate_distributed_table('table', 'shard_key')で済むところを、データノードでInnoDBのテーブルを作成しSpiderでspiderのテーブルを作成しないとならないところが微妙に面倒なので、ここは改良されると嬉しいかと。あとはCitusと比較すると様々な面で(特にエンタープライズで)不足してる機能があるので、このあたりを自前で補わないと実運用は厳しそうだなぁ、というところ。

2020.07.09 追記
VMだけで構成していたんだけど、ちゃんと仕事になるようにSpider Data NodeはPaaSのMySQLを使うバージョンも作ってみた。create_spider_with_orcas.shは、PaaSを使う方。解説は後日。

macOS構築自動化

  • 投稿日:
  • by
  • カテゴリ:

GitHubにアップしといた。

brew file、AppleScript (osascript)、シェルスクリプト等々を組み合わせて、おおむね自動化した。
ただし、Terminal.appを[システム環境設定]→[セキュリティとプライバシー]の[アクセシビリティ]と[フルディスクアクセス]に追加するのと、注記に入れているosascriptのワンライナーだけは手動で実行する必要がある。これはまあ、致し方ないなぁ。
あと、AppleScriptの部分はかなり怪しいしGUIの変化に大変に弱いので、果たして新しいmacOSが出たときに動くかは不明...。

Azure CLIをmacOSのzsh completionで使えるようにする

  • 投稿日:
  • by
  • カテゴリ:

微妙に動かない設定しか見つからなかったのでメモっておく。

zsh-completionをインストールする。

% brew install zsh-completion

で、エラーが出る。

zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?

compauditでチェックして、パーミッションを修正する。

% compaudit   
There are insecure directories:
/usr/local/share/zsh/site-functions
/usr/local/share/zsh

% chmod 755 /usr/local/share/zsh/site-functions
% chmod 755 /usr/local/share/zsh/

/usr/local/share/だけ変更すれば良い可能性もあり。

bash completion用のファイルを~/.azure/az.completionとしてダウンロードする。

% mkdir ~/.azure
% curl -o ~/.azure/az.completion https://raw.githubusercontent.com/Azure/azure-cli/dev/az.completion

~/.zprofileに以下を追加する。

if type brew &>/dev/null; then
    FPATH=$(brew --prefix)/share/zsh/site-functions:$FPATH

    autoload -Uz compinit
    compinit
fi

autoload -U +X bashcompinit && bashcompinit
source ~/.azure/az.completion