複数のXcodeがインストールされている環境でFlutterを使う

アプリケーションフォルダーには以下の2つのバージョンのXcodeが入っている。
* /Applications/Xcode 13.4.app
* /Applications/Xcode 14.1.app

「flutter doctor」を実行するとXcodeが見つかっていない。

% flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.3.7, on macOS 12.6 21G115 darwin-arm, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[!] Xcode - develop for iOS and macOS
    ✗ Xcode installation is incomplete; a full installation is necessary for iOS development.

今回、FlutterはXcode 14.1.appを使用するように設定する。

以下のコマンドを実行する。
xcode-selectの引数にXcode 14.1.appのパスを指定する。

sudo xcode-select --switch "/Applications/Xcode 14.1.app/Contents/Developer"
sudo xcodebuild -runFirstLaunch

「flutter doctor」を実行すると成功した。

% flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Xcode - develop for iOS and macOS (Xcode 14.1)

PHP7.1からMySQL8に接続するための設定

PHP7.1からMySQL8に接続するための設定

ポイントは2点。
(1)パスワードの認証方式の変更
(2)文字コードの設定

(1)パスワードの認証方式の変更

以下のようなエラーが出たときの対策。

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

PHP 7.1.16またはPHP 7.2.4よりも前のバージョンのPHPでは、MySQL8のデフォルトのパスワード認証方式caching_sha2_passwordに対応していない。
(参考: PHP: 要件 – Manual

パスワード認証方式をmysql_native_passwordに変更する必要がある。

(1-1) 既存のユーザーのパスワード認証方式を変更する

既存のユーザーのパスワード認証方式を確認する。

SELECT user, host, plugin FROM mysql.user;

plugin列が「caching_sha2_password」なら新しい認証方式になっている。

既存のユーザーのパスワード認証方式を変更する。

ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'XXXX';

(1-2) 新規のユーザーのパスワード認証方式を変更する

新規に作成するユーザーのパスワード認証方式を変更ため、my.cnfに以下の行を追加する。

[mysqld]
default_authentication_plugin=mysql_native_password

(2)文字コードの設定

以下のようなエラーが出たときの対策。

SQLSTATE[HY000] [2054] Server sent charset unknown to the client.

my.cnfに以下の行を追加する。

[mysqld]
collation-server=utf8mb4_unicode_ci
character-set-server=utf8mb4

最後にMySQLを再起動する。

$ sudo systemctl restart mysqld

supervisorがエラーになったときの対応メモ

「supervisor.sock no such file」エラー

$ supervisorctl start
unix:///var/run/supervisor/supervisor.sock no such file

このエラーが発生したときはsupervisor.sockファイルを作成する。

$ sudo touch /var/run/supervisor/supervisor.sock
$ sudo chmod 777 /var/run/supervisor/supervisor.sock

「supervisor.sock refused connection」エラー

$ supervisorctl start
unix:///var/run/supervisor/supervisor.sock refused connection

このエラーが発生したときはsupervisorを再起動する

$ sudo systemctl restart supervisord.service

Pythonのプール値を「is」と「==」で比較する

Pythonの「==」は値を比較し、「is」はオブジェクトの同一性を比較する。
「==」を使用するとき、異なるオブジェクトでもTrueになることがある。

i = 1
print(i == True) #=> True
print(i is True) #=> False

上のコードでは、
変数iはTrueに評価される値のため、「i == True」はTrueになる。
変数iはTrueではないため、「i is True」はFalseになる。

「if i:」と「if i == True:」は、iがTrueに評価される値なら、という意味になるが、
「if i is True:」は、iがTrueなら、という意味になる。

「is」と「==」のどちらを使うべきかは、使用する目的によって決まる。