複数バージョンのPHPをインストールしてみたかったので、phpenvを使ってPHPをインストールしました。
依存パッケージのインストールが必要だったので備忘録としてまとめます。
phpenvのアップデートプラグインを作ってみた
macOS環境で複数のPHPバージョンを動かしたくなって、phpenvを使ってみることにしました。
(環境構築周りは別途、書きました)
nmtysh.hatenablog.com
nmtysh.hatenablog.com
nmtysh.hatenablog.com
以前からnodenvを使っていて、プラグインなどをまとめてアップデートできるnodenv-updateプラグインを利用しているのですが、phpenv用を見つけることができませんでした。
無ければ、作ってしまえということで、大元のrbenv-updateからフォークして作成しました。
最初は phpenv update
として作ったのですが、うまく機能しないためデバッグ用のパラメーターをつけてコマンド( PHPENV_DEBUG=1 phpenv update
)を実行してみると、php-buildプラグインが持っている自身のプラグイン更新のためのコマンドと衝突してしまい作成したプラグインのコマンドが実行されていませんでした。
$ PHPENV_DEBUG=1 phpenv update + [phpenv:33] '[' -z '' ']' + [phpenv:34] PHPENV_ROOT=/Users/user/.phpenv + [phpenv:38] export PHPENV_ROOT + [phpenv:40] '[' -z '' ']' ++ [phpenv:41] pwd + [phpenv:41] PHPENV_DIR=/Users/user + [phpenv:50] export PHPENV_DIR + [phpenv:53] shopt -s nullglob ++ [phpenv:55] abs_dirname /Users/user/.phpenv/bin/phpenv +++ [phpenv:20] pwd ++ [phpenv:20] local cwd=/Users/user ++ [phpenv:21] local path=/Users/user/.phpenv/bin/phpenv ++ [phpenv:23] '[' -n /Users/user/.phpenv/bin/phpenv ']' ++ [phpenv:24] cd /Users/user/.phpenv/bin ++ [phpenv:25] local name=phpenv +++ [phpenv:26] resolve_link phpenv ++++ [phpenv:16] type -p greadlink readlink ++++ [phpenv:16] head -1 +++ [phpenv:16] /usr/bin/readlink phpenv ++ [phpenv:26] path=../libexec/phpenv ++ [phpenv:23] '[' -n ../libexec/phpenv ']' ++ [phpenv:24] cd ../libexec ++ [phpenv:25] local name=phpenv +++ [phpenv:26] resolve_link phpenv ++++ [phpenv:16] type -p greadlink readlink ++++ [phpenv:16] head -1 +++ [phpenv:16] /usr/bin/readlink phpenv +++ [phpenv:26] true ++ [phpenv:26] path= ++ [phpenv:23] '[' -n '' ']' ++ [phpenv:29] pwd ++ [phpenv:30] cd /Users/user + [phpenv:55] bin_path=/Users/user/.phpenv/libexec + [phpenv:56] for plugin_bin in '"${PHPENV_ROOT}/plugins/"*/bin' + [phpenv:57] bin_path=/Users/user/.phpenv/libexec:/Users/user/.phpenv/plugins/php-build/bin + [phpenv:56] for plugin_bin in '"${PHPENV_ROOT}/plugins/"*/bin' + [phpenv:57] bin_path=/Users/user/.phpenv/libexec:/Users/user/.phpenv/plugins/php-build/bin:/Users/user/.phpenv/plugins/phpenv-aliases/bin + [phpenv:56] for plugin_bin in '"${PHPENV_ROOT}/plugins/"*/bin' + [phpenv:57] bin_path=/Users/user/.phpenv/libexec:/Users/user/.phpenv/plugins/php-build/bin:/Users/user/.phpenv/plugins/phpenv-aliases/bin:/Users/user/.phpenv/plugins/phpenv-update/bin + [phpenv:59] export PATH=/Users/user/.phpenv/libexec:/Users/user/.phpenv/plugins/php-build/bin:/Users/user/.phpenv/plugins/phpenv-aliases/bin:/Users/user/.phpenv/plugins/phpenv-update/bin:/Users/user/.phpenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/user/.phpenv/bin:/usr/local/sbin + [phpenv:59] PATH=/Users/user/.phpenv/libexec:/Users/user/.phpenv/plugins/php-build/bin:/Users/user/.phpenv/plugins/phpenv-aliases/bin:/Users/user/.phpenv/plugins/phpenv-update/bin:/Users/user/.phpenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/user/.phpenv/bin:/usr/local/sbin + [phpenv:61] hook_path=:/Users/user/.phpenv/phpenv.d:/usr/local/etc/phpenv.d:/etc/phpenv.d:/usr/lib/phpenv/hooks + [phpenv:62] for plugin_hook in '"${PHPENV_ROOT}/plugins/"*/etc/phpenv.d' + [phpenv:63] hook_path=:/Users/user/.phpenv/phpenv.d:/usr/local/etc/phpenv.d:/etc/phpenv.d:/usr/lib/phpenv/hooks:/Users/user/.phpenv/plugins/phpenv-aliases/etc/phpenv.d + [phpenv:62] for plugin_hook in '"${PHPENV_ROOT}/plugins/"*/etc/phpenv.d' + [phpenv:63] hook_path=:/Users/user/.phpenv/phpenv.d:/usr/local/etc/phpenv.d:/etc/phpenv.d:/usr/lib/phpenv/hooks:/Users/user/.phpenv/plugins/phpenv-aliases/etc/phpenv.d:/Users/user/.phpenv/plugins/phpenv-composer/etc/phpenv.d + [phpenv:65] export PHPENV_HOOK_PATH=:/Users/user/.phpenv/phpenv.d:/usr/local/etc/phpenv.d:/etc/phpenv.d:/usr/lib/phpenv/hooks:/Users/user/.phpenv/plugins/phpenv-aliases/etc/phpenv.d:/Users/user/.phpenv/plugins/phpenv-composer/etc/phpenv.d + [phpenv:65] PHPENV_HOOK_PATH=:/Users/user/.phpenv/phpenv.d:/usr/local/etc/phpenv.d:/etc/phpenv.d:/usr/lib/phpenv/hooks:/Users/user/.phpenv/plugins/phpenv-aliases/etc/phpenv.d:/Users/user/.phpenv/plugins/phpenv-composer/etc/phpenv.d + [phpenv:67] shopt -u nullglob + [phpenv:69] command=update + [phpenv:70] [[ '' = \-\-\h\e\l\p ]] + [phpenv:70] [[ '' = \-\h ]] + [phpenv:75] case "$command" in ++ [phpenv:83] command -v phpenv-update + [phpenv:83] command_path=/Users/user/.phpenv/plugins/php-build/bin/phpenv-update + [phpenv:84] '[' -z /Users/user/.phpenv/plugins/php-build/bin/phpenv-update ']' + [phpenv:89] shift 1 + [phpenv:90] exec /Users/user/.phpenv/plugins/php-build/bin/phpenv-update + [phpenv-update:5] '[' -z /Users/user/.phpenv ']' +++ [phpenv-update:9] dirname /Users/user/.phpenv/plugins/php-build/bin/phpenv-update ++ [phpenv-update:9] cd /Users/user/.phpenv/plugins/php-build/bin ++ [phpenv-update:9] pwd + [phpenv-update:9] script_dir=/Users/user/.phpenv/plugins/php-build/bin + [phpenv-update:10] cd /Users/user/.phpenv/plugins/php-build/bin/.. + [phpenv-update:11] git pull Already up to date.
回避方法がわからないので、作成したプラグインの名前をphpenv-update-allに変更して対応しました。
mkdir -p "$(phpenv root)/plugins" git clone https://github.com/matayoshi/phpenv-update-all.git "$(phpenv root)/plugins/phpenv-update-all"
プラグインフォルダに git clone
してインストールすると phpenv update-all
コマンドが利用できるようになります。
$ phpenv update-all Updating phpenv Updating php-build Updating phpenv-aliases Updating phpenv-composer Updating phpenv-update-all
自分用に作ったプラグインなので動作保証はしませんが、良ければどうぞ。
macのChromeでサイトにログインする際にAndroid端末を使った本人確認(MFA)ができない(解決済み)
環境
- macOS Monterey 12.1
- Google Chrome 97.0.4692.71
- Android 12(Pixel 3a)
まとめ
Android端末を使って本人確認(MFA)をできるようにするには、mac側のChromeでBluetoothの使用を許可されている必要があります。
許可するには「システム環境設定」→「セキュリティとプライバシー」→「プライバシー」→「Bluetooth」で"Google Chrome.app"を許可します。
許可後に必要に応じてChromeを開き直します。
起きたこと
macのChromeでGoogleアカウントやFacebookログイン時にMFAの認証でAndroid端末を選択できるものの、タイムアウトして認証ができない。
- Googleアカウントの場合はAndroid側に認証の通知すら飛ばない(Android側でBluetoothをオンにすることは求められる)
- Facebookアカウントの場合(Googleアカウント以外)はAndroid側に本人確認の通知が飛ぶものの認証に失敗する(タイムアウトする)
- Android側の認証画面で「問題が発生しました」「パソコンに接続できません。他の確認オプションをお試しください」と表示される
試したこと
原因
mac側のChromeにBluetoothの使用が許可されていませんでした(許可が必要でした)。
- 「システム環境設定」→「セキュリティとプライバシー」→「プライバシー」→「Bluetooth」で"Google Chrome.app"が許可されている必要がある
- 許可リストでChromeが拒否(チェックがついていない)とエラーやメッセージは表示されずにタイムアウトする
- ChromeにBluetoothの使用を許可していなくても、ChromeがBluetoothを一時的にオンにすることは可能
まとめ(再掲)
Android端末を使って本人確認(MFA)をできるようにするには、
- mac側のChromeでBluetoothの使用を許可されている必要がある
- 「システム環境設定」→「セキュリティとプライバシー」→「プライバシー」→「Bluetooth」で"Google Chrome.app"を許可する
- 許可後に必要に応じてChromeを開き直す
- 「システム環境設定」→「セキュリティとプライバシー」→「プライバシー」→「Bluetooth」で"Google Chrome.app"を許可する
- Android側のChromeで「付近のデバイス」を許可する
- Bluetoothを有効にする(mac/Android両方)
Android側は位置情報サービスの有効化も必要かもしれない(元々オンだったので試してない)。
「パソコンに接続できません。他の確認オプションをお試しください」で検索してもヘルプページも出てこないので、対処するのに時間がかかりました。
ログインをやり直したり、MFAの認証設定を解除したりして試しまくりました。
Windows 10の端末で試したときに問題なく認証できたのは、アプリごとのBluetoothの使用許可設定が無いからなのかな(プライバシー設定で許可設定を大概、絞っているはずだけど変更した記憶がない)
トラブルシュートできるように適切なエラーメッセージを表示するというのは大事だと思いました。
今回の場合だと、「Bluetoothの使用が許可されていません」などのメッセージをmac側のChromeに出して欲しかったです。
IPQoSの設定を変えたらDS-Lite接続でもSSHができるようになった
最近、自宅のネット環境のIPv4接続をPPPoEからDS-LiteのIPv4 over IPv6に切り替えました。
とある日、インターネット上のサーバーにSSH接続しようとしたら、ログインが終わらず、しばらくするとエラーメッセージが出力されてコマンドが終了するようになってしまいました。
調べてみたら、どうやらパケットの優先度(DSCP値)の問題らしく、優先度設定をSSHのデフォルト値から変更したらSSHできるようになりました。
環境
現象
PPPoE接続の時には問題なくSSHできたサーバーに対して、DS-Lite接続でSSHできなくなりました。
ssh
コマンドでサーバーへの接続に失敗します。
ssh -vvv
を実行するとこんな感じの出力で失敗しました。
(手元にログが残っていなくて、 参考サイト の記述を持ってきたので実際出ていたログとちょっと違っているかも)
$ ssh -vvv user@host (略) debug2: channel 0: open confirm rwindow 0 rmax 32768 (略) Write failed: Broken pipe (もしくは「Timeout, server xxx.xxx.xxx.xxx not responding.」こんなメッセージかも)
解決策
ssh
コマンドに -o IPQoS=none
をつけるか、 ~/.ssh/config
に IPQoS none
を追加します。
$ ssh -o IPQoS=none user@host
または
# ~/.ssh/config Host * IPQoS none
いくつかサイトを見た感じでは IPQoS
の値は none
以外に 0
などでも良さそうです。
none
はOSのデフォルト値を使うということなので、OS側のデフォルト値が変わった場合は接続できないということが再発するかも。
回線側で許容されているプロトコルと優先度の組み合わせが分からないのでなんともいえませんが、OSのデフォルト値が変わった場合は他の通信にも影響が出そうな気がします。
参考サイト
- Can't complete SSH connection after successfully exchanging keys to Ubuntu from some networks - Server Fault
- フレッツ回線 + IPv6 環境で SSH できない - Qiita
- macOSでSSH接続が失敗(client_loop: send disconnect: Broken pipe)する · としつーる
- QoS - DSCP(Differentiated Services Code Point)とは
- フレッツ光ネクスト + IPoE で scp, cvs, rsync の SSH通信ができない問題:tsutsuiの作業記録置き場 - ブロマガ
DS216jの電池交換
NASにSynologyのDS216jを使っていますが、24/365で稼働させているわけではなく、1日のうちのある時間帯のみ、DSMのタイマー設定で起動と終了を行っています。
寒くなってきたある日、設定時間で起動せず、起動時間がズレるということが起こりました。
たまたまかと思っていたのですが、それ以降正しく起動しないので、電池切れを疑って電池交換をしました。
※ntp設定をしているので、起動後に時間がズレるのはかんがえにくいです。実際起動後に時間を確認すると正しい時刻になっていました。
発生した状況
- 指定時間に起動しない
- ズレた時間に起動する
- 全く起動しない
- 起動時のログがおかしい
- ズレた時間に起動するが、ログは起動設定した時間で記録されている
- 起動ログが全く記録されない
- シャットダウン直後(1分後ぐらい)に勝手に起動する(設定した起動時間ではない)
- 起動ログが全く記録されないため、どの時間として認識したのかも不明
環境
- DS216j
- 電池は CR1220
電池交換の手順
- DS216jの筐体を開けて、HDDを全て取り外します。
- 4隅のまるねじを外します。
- カバーから基盤を外すと裏側に電池(CR1220)が付いているので新品に交換します。
- 外した電池の電圧を測ってみたら0.9Vぐらいしかありませんでした(新品の電池は3V強でした)
- カバーに基盤を取り付けて元通りねじ止めします(ネジ穴が金属ではなくカバーの樹脂なので締めすぎ注意)
- HDDも取り付けて、カバーを閉めて完了。
電池交換後の不具合
電池交換をして、電源に接続した途端に勝手に起動しました。また、終了してもすぐに起動しちゃう状態になりました。
何度か試していたら、すぐにだったり、1時間ほど経過後だったり、いずれにせよ指定時間以外に起動してしまいました。
起動ログが全く記録されないため、どの時間として認識したのかも不明です。
対処したこと
- Synology NAS 本体の不具合が考えられる場合の確認手順 | Synology Inc.
- 起動時間設定を全て解除して、設定を保存した上で、再度、設定を有効化&保存(適用)
どちらが有効だったのかは分かりませんが、元通り、設定した時間に起動して、ちゃんと終了できるようになりました。
また、起動ログが正常に記録されるようになりました。