nmtysh.log

Tech系のネタや日々の独り言などを書いています。

phpenvのアップデートプラグインを作ってみた

macOS環境で複数のPHPバージョンを動かしたくなって、phpenvを使ってみることにしました。

(環境構築周りは別途、書きました)
nmtysh.hatenablog.com nmtysh.hatenablog.com nmtysh.hatenablog.com

以前からnodenvを使っていて、プラグインなどをまとめてアップデートできるnodenv-updateプラグインを利用しているのですが、phpenv用を見つけることができませんでした。
無ければ、作ってしまえということで、大元のrbenv-updateからフォークして作成しました。

github.com

最初は 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

自分用に作ったプラグインなので動作保証はしませんが、良ければどうぞ。

github.com

macのChromeでサイトにログインする際にAndroid端末を使った本人確認(MFA)ができない(解決済み)

環境

まとめ

Android端末を使って本人確認(MFA)をできるようにするには、mac側のChromeBluetoothの使用を許可されている必要があります。
許可するには「システム環境設定」→「セキュリティとプライバシー」→「プライバシー」→「Bluetooth」で"Google Chrome.app"を許可します。
許可後に必要に応じてChromeを開き直します。

起きたこと

macChromeGoogleアカウントやFacebookログイン時にMFAの認証でAndroid端末を選択できるものの、タイムアウトして認証ができない。

  • Googleアカウントの場合はAndroid側に認証の通知すら飛ばない(Android側でBluetoothをオンにすることは求められる)
  • Facebookアカウントの場合(Googleアカウント以外)はAndroid側に本人確認の通知が飛ぶものの認証に失敗する(タイムアウトする)
    • Android側の認証画面で「問題が発生しました」「パソコンに接続できません。他の確認オプションをお試しください」と表示される

試したこと

  • mac
    • 位置情報サービスの許可設定を切り替えてみる
    • Bluetoothのオフ・オンを試す
    • システム環境設定でChromeBluetoothの使用を許可する
  • Android
    • 位置情報サービスの権限設定を切り替えてみる
    • Bluetoothのオフ・オンを試す
    • Bluetoothのスキャン設定を切り替えてみる

原因

mac側のChromeBluetoothの使用が許可されていませんでした(許可が必要でした)。

  • 「システム環境設定」→「セキュリティとプライバシー」→「プライバシー」→「Bluetooth」で"Google Chrome.app"が許可されている必要がある
    • リストにChromeが無い状態でAndroidバイスを使ってMFAをしようとすると許可を求めるポップアップが表示される
  • 許可リストでChromeが拒否(チェックがついていない)とエラーやメッセージは表示されずにタイムアウトする
  • ChromeBluetoothの使用を許可していなくても、ChromeBluetoothを一時的にオンにすることは可能
    • Bluetoothはオンになるが、使用できないため認証プロセスがタイムアウトする
    • エラーが表示されないためBluetoothの使用が許可されていないことが判りづらい

まとめ(再掲)

Android端末を使って本人確認(MFA)をできるようにするには、

Android側は位置情報サービスの有効化も必要かもしれない(元々オンだったので試してない)。

「パソコンに接続できません。他の確認オプションをお試しください」で検索してもヘルプページも出てこないので、対処するのに時間がかかりました。
ログインをやり直したり、MFAの認証設定を解除したりして試しまくりました。
Windows 10の端末で試したときに問題なく認証できたのは、アプリごとのBluetoothの使用許可設定が無いからなのかな(プライバシー設定で許可設定を大概、絞っているはずだけど変更した記憶がない)

トラブルシュートできるように適切なエラーメッセージを表示するというのは大事だと思いました。
今回の場合だと、「Bluetoothの使用が許可されていません」などのメッセージをmac側のChromeに出して欲しかったです。

IPQoSの設定を変えたらDS-Lite接続でもSSHができるようになった

最近、自宅のネット環境のIPv4接続をPPPoEからDS-LiteIPv4 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/configIPQoS none を追加します。

$ ssh -o IPQoS=none user@host

または

# ~/.ssh/config

Host *
    IPQoS none

いくつかサイトを見た感じでは IPQoS の値は none 以外に 0 などでも良さそうです。
none はOSのデフォルト値を使うということなので、OS側のデフォルト値が変わった場合は接続できないということが再発するかも。
回線側で許容されているプロトコルと優先度の組み合わせが分からないのでなんともいえませんが、OSのデフォルト値が変わった場合は他の通信にも影響が出そうな気がします。

参考サイト

DS216jの電池交換

NASにSynologyのDS216jを使っていますが、24/365で稼働させているわけではなく、1日のうちのある時間帯のみ、DSMのタイマー設定で起動と終了を行っています。
寒くなってきたある日、設定時間で起動せず、起動時間がズレるということが起こりました。
たまたまかと思っていたのですが、それ以降正しく起動しないので、電池切れを疑って電池交換をしました。
※ntp設定をしているので、起動後に時間がズレるのはかんがえにくいです。実際起動後に時間を確認すると正しい時刻になっていました。

発生した状況

  • 指定時間に起動しない
    • ズレた時間に起動する
    • 全く起動しない
  • 起動時のログがおかしい
    • ズレた時間に起動するが、ログは起動設定した時間で記録されている
    • 起動ログが全く記録されない
  • シャットダウン直後(1分後ぐらい)に勝手に起動する(設定した起動時間ではない)
    • 起動ログが全く記録されないため、どの時間として認識したのかも不明

環境

  • DS216j
  • 電池は CR1220

電池交換の手順

  1. DS216jの筐体を開けて、HDDを全て取り外します。
  2. 4隅のまるねじを外します。
  3. カバーから基盤を外すと裏側に電池(CR1220)が付いているので新品に交換します。
    • 外した電池の電圧を測ってみたら0.9Vぐらいしかありませんでした(新品の電池は3V強でした)
  4. カバーに基盤を取り付けて元通りねじ止めします(ネジ穴が金属ではなくカバーの樹脂なので締めすぎ注意)
  5. HDDも取り付けて、カバーを閉めて完了。

電池交換後の不具合

電池交換をして、電源に接続した途端に勝手に起動しました。また、終了してもすぐに起動しちゃう状態になりました。
何度か試していたら、すぐにだったり、1時間ほど経過後だったり、いずれにせよ指定時間以外に起動してしまいました。
起動ログが全く記録されないため、どの時間として認識したのかも不明です。

対処したこと

どちらが有効だったのかは分かりませんが、元通り、設定した時間に起動して、ちゃんと終了できるようになりました。
また、起動ログが正常に記録されるようになりました。