それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

lsof でIPを指定する /v4 or v6 / ポート使ってるプロセスを見る

lsof でIPを指定する

lsof で探すときに、指定したIPでリッスンしているものを見たいときにどうするのか、複数のIPがあると明示的に指定したいですね。

ポートを使ってるプロセスを見る

たとえば、22番を使ってるプロセスを探す。

lsof -i :22 -n

実例

$lsof -i :22 -n
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dropbear  3272 root    3u  IPv4    618      0t0  TCP 192.168.1.1:ssh (LISTEN)
dropbear 18793 root    0u  IPv4 853114      0t0  TCP 192.168.1.1:ssh->172.16.4.3:54401 (ESTABLISHED)

ip を@マークで指定する。

lsof では @マークで ip アドレスを指定することができる。

アドレス指定

lsof -i @192.168.1.201

アドレス・ポート指定

lsof -i @192.168.1.201:10000

IPv6の場合

いい感じに囲む必要がある。

ls of -i @[2001::::97c]:22

また、v6のIPすべてでリッスンしている場合は、次のようにv4/v6ともに具体的なIPなく表示される。

$sudo lsof -i :22
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     946   root    5u  IPv4  23026      0t0  TCP *:ssh (LISTEN)
sshd     946   root    6u  IPv6  23028      0t0  TCP *:ssh (LISTEN)

実際にやってみた例。

アドレス・ポート指定でどのアプリがリッスンしているか見ることができた。

root@jitsi:~# lsof -i @10.185.93.136:3479
COMMAND  PID      USER  FD  TYPE  DEVICE SIZE/OFF NODE NAME
turnserve 569 turnserver  36u  IPv4 17368603      0t0  UDP jitsi.lxd:3479
turnserve 569 turnserver  37u  IPv4 17368604      0t0  UDP jitsi.lxd:3479
turnserve 569 turnserver  38u  IPv4 17368605      0t0  UDP jitsi.lxd:3479
turnserve 569 turnserver  39u  IPv4 17368606      0t0  UDP jitsi.lxd:3479
root@jitsi:~# lsof -i @10.185.93.136:10000
COMMAND  PID USER  FD  TYPE  DEVICE SIZE/OFF NODE NAME
java    1341  jvb  155u  IPv6 17592832      0t0  UDP jitsi.lxd:10000

ss コマンドとの違い

lsof だと「プロセス」を探すので、wireguardのようなカネールモジュールのリッスンは見えない。

該当プロセスが見つからないとき、正確にポートをリッスンしているかどうかをみたいなら ss -nlu(udp) ss -nlt (tcp)を使ってもいいと思う。

2023-04-19 追記

IPv6の場合について追記。

2023-05-16 追記

ポートのみの場合と、ssとの違いについて言及

docker exec で root になる。/ docker exec を指定したユーザーで実行する

docker exec しても root になるとは限らない。

dockerのインスタンスによっては、Dockerfile の記述によっては、docker exec がユーザー root で実行できないことがある。

docker exec を強制的に root にする

uid をオプションに付けたら、強制的にrootユーザ で実行することができる。 -u UIDでUIDを指定することができる。

docker exec -u 0 -it XXXXXX bash 

docker exec で user を指定する。

指定したユーザで起動するには。まずUIDを調べる。UIDがわからないと指定できないし、Dockerのコンテナ内部でどのユーザーがどの番号で存在してるかわからないですね。

たとえば、psqlpostgresql で起動するとする。

# docker exec -it 6a7e5eca6505 getent passwd | grep post
postgres:x:999:999::/var/lib/postgresql:/bin/bash

そのUIDで起動する。

docker exec -it -u 999 6a7e5eca6505 psql

こうすれば、postgresユーザーをdocker exec で直接指定できる。 これで別のユーザーに成り代わってシェルを使えたりする。

apt が使えない docker インスタンスとかで使える

通常通り exec しても apt が使えないときとか。sudo が使えないときとか。

ps がないのでインストールしたいときとかに使える。

docker のイメージファイルはあれこれ省略されているので、ちょっとしたトラブルがあると困るのですが、権限がない程度で Dockerfile から書いて build するのはめんどくさすぎるので。ユーザーを指定されているDockerイメージを扱うためには、ちょっとしたコツがいる。

参考資料

https://stackoverflow.com/questions/59376888/become-root-in-a-docker-container

2021-05-27

表記ゆれ更新

ssh/config で ホストを踏み台にして、直接 lxc のコンテナにログインする。

LXCにssh コマンドでログインしたい。

lxcのコンテナに にいちいちSSHインストールしたりパスワード決めたり、公開鍵を設定するのがめんどくさい。

通常であれば次のようにログインする。

いったん、SSHでログインして、その後にlxc コマンドで shell を起動する。

takuya@local $ ssh lxc-host
takuya@lxc-host$
takuya@lxc-host$ lxc shell lxc-container-01

頻繁に実行しているとめんどくさいです。そこで ssh_config でconfig ファイルを設定してなんとかできないか考えました。

SSH経由でログインを自動化したい。

~/.ssh/configのファイルに記載します。

  Host lxc-container01
    Hostname lxc-host
    RequestTTY force
    RemoteCommand lxc exec --force-interactive  lxc-container-01 bash

ssh でlxc-hostにログインする設定をかき、ログイン後に実行されるRemoteCommandで lxc shell コマンドを実行するわけです。

SSH踏み台経由と組み合わせる。

踏み台を使う場合は次のように書きます。

  Host lxc-host
    Hostname lxc-host
    ProxyCommand ssh -W %h:%p ssh-GW

踏み台を使う場合は、ProxyCommandを書きますよね。 ProxyCommand はローカルで実行され、接続に使用されます。

これを、RemoteCommandと組み合わせてれば、良い訳です。これでGWを経由しつつ、LXCホストを踏み台にし、LXCコンテナのbashに1発でアクセスできるわけです。

組み合わせると次のようになります。

  Host lxc-container01
    Hostname lxc-host
    RequestTTY force
    ProxyCommand ssh -W %h:%p ssh-GW
    RemoteCommand lxc exec --force-interactive  lxc-container-01 bash

この設定では RequestTTY forcelxc exec --force-interactive を使って tty をAllocateしています。こうしないと制御文字(EOF/CTRL-Dなど)がうまく渡せません。

まとめ

  • RemoteCommand でSSHログイン後にリモートで実行するコマンドを指定
  • lxc exec --force-interactive でTTYを確保
  • RequestTTY force でローカルからリモートまでTTYでつなぐ

その他の応用方法

肝になる設定はRemoteCommandなので、踏み台に設置する authorized_keys に書くことで、鍵で識別して接続を振り分けてしまうことができる。

今回は、lxc だが。 docker exec -it でも同じようにすることで、ちょくせつDockerのインスタンスに入れる。

sshの公開鍵authorized_keys ファイルの制限機能について調べてみたら楽しかった. - それマグで!

Snap でインストールしたApp/コマンドの man を見る。

snap でインストールしたコマンドの man が見つからない。

たとえばLDX をインストールしている場合でも、man はない。

takuya@m75q-1:~$ man -k lxc
lxc: nothing appropriate.

LXDのman を見たいんだ。

MANPATH をなんとかすれば見れそうだが

通常であれば、MANPATH をなんとかすれば見れます。

export MANPATH=":/snap/$APP/current/share/man"

LXC/LXDの場合は。manpageそのものがない。

でもLXDの場合は、manpage が存在しないのでインストールされていない。

そもそもmanがないので、MANPATHで解決しない。

調べた結果 manはなかった。

manがないんですよ。man はオワコンなんです?

--help を使えって言われた。

takuya@:~$ lxc shell --help
Description:
  Execute commands in instances

  The command is executed directly using exec, so there is no shell and
  shell patterns (variables, file redirects, ...) won't be understood.
  If you need a shell environment you need to execute the shell
  executable, passing the shell commands as arguments, for example:

    lxc exec <instance> -- sh -c "cd /tmp && pwd"

  Mode defaults to non-interactive, interactive mode is selected if both stdin AND stdout are terminals (stderr is ignored).

Usage:
  lxc exec [<remote>:]<instance> [flags] [--] <command line>

Flags:
      --cwd                    Directory to run the command in (default /root)
  -n, --disable-stdin          Disable stdin (reads from /dev/null)
      --env                    Environment variable to set (e.g. HOME=/home/foo)
  -t, --force-interactive      Force pseudo-terminal allocation
  -T, --force-noninteractive   Disable pseudo-terminal allocation
      --group                  Group ID to run the command as (default 0)
      --mode                   Override the terminal mode (auto, interactive or non-interactive) (default "auto")
      --user                   User ID to run the command as (default 0)

Global Flags:
      --debug            Show all debug messages
      --force-local      Force using the local unix socket
  -h, --help             Print help
      --project string   Override the source project
  -q, --quiet            Don't show progress information
  -v, --verbose          Show all information messages
      --version          Print version number

参考資料

https://discuss.linuxcontainers.org/t/how-can-i-make-use-of-man-pages-with-the-snap-package/2572/2

https://stackoverflow.com/questions/34445796/how-do-i-configure-ssh-proxycommand-correctly-to-run-docker-exec

ubuntu で kvm qemu インストール

ubuntuqemu kvm を入れて仮想マシンを作る準備をする。

kvm + qemulibvirt 一式をぱぱっと入れる。

kvm が使えるか調べる。

sudo apt install cpu-checker

KVMが使えるか調べる

takuya@ubuntu01:~$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

qemu kvm と libvirtd をインストールする。

sudo apt -y install qemu-kvm libvirt-daemon-system \
libvirt-daemon virtinst bridge-utils libguestfs-tools virt-top

インストールの確認

takuya@ubuntu01:~$ systemctl status libvirtd
● libvirtd.service - Virtualization daemon
     Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-11-30 13:02:12 UTC; 2s ago
TriggeredBy: ● libvirtd-admin.socket
             ● libvirtd-ro.socket
             ● libvirtd.socket
       Docs: man:libvirtd(8)
             https://libvirt.org
   Main PID: 3232 (libvirtd)
      Tasks: 17 (limit: 32768)
     Memory: 5.9M
     CGroup: /system.slice/libvirtd.service
             └─3232 /usr/sbin/libvirtd

Nov 30 13:02:12 ubuntu01 systemd[1]: Starting Virtualization daemon...
Nov 30 13:02:12 ubuntu01 systemd[1]: Started Virtualization daemon.
Nov 30 13:02:12 ubuntu01 libvirtd[3232]: libvirt version: 6.0.0, package: 0ubuntu8.5 (Christian Ehrhardt <christian.ehrhardt@canonical.com> Thu, 08 Oct 2020 07:36:06 +0200)
Nov 30 13:02:12 ubuntu01 libvirtd[3232]: hostname: ubuntu01

いつもググるのでメモを残します。

windows で multipass を動かす

multipass を windows にインストール

windowsubuntu の実行環境を手軽に使いたかった。

choco install multipass

UAC のPSから使う。

multipass は UAC 昇格後のPSから使うように設計されている。

基本的な使い方は以下の通り。

新しくインスタンスを起動する

multipass  launch --name sample01

メモリ・ディスク容量・CPU数を指定して、新しいインスタンスを作る。

multipass launch --name sample01 --disk 20G --cpus 8  -m 8G

シェルに入る。

multipass  shell sample01

シェルに入る(別の方法)

## docker exec  / lxc exec 的な方法
multipass  exec sample01 bash 

インスタンスを削除する(データは残る。)

multipass  delete sample01

削除済みのインスタンスを完全に消去する。

multipass  purge 

wsl から使う。

私は WSL1 を使っているので直接EXEを叩けば使える。

alias を設定しておくと便利。

alias multipass=/mnt/c/ProgramData/chocolatey/bin/multipass.exe

標準はHyper-Vが使われる。

multipassはデフォルト設定では、Hyper-V を使うので、Hyper-Vの管理画面から、インスタンスを制御できる。

もしトラブったらそこを見ればいい。

UACなしだと、delete && purge ができない。

Admin権限のユーザーであればUAC昇格 なしでも launch や shell は動くのですが、delete purge がうまく動かずHyper-Vインスタンスが消されずに残ってしまう。

もし、Hyper-Vを使っているのであれば、次のフォルダのアクセス権限を取得しておけば、削除される。(はず)

C:\Windows\System32\config\systemprofile\AppData\Roaming\multipassd

virtualbox をバックエンドに使用する。

purge がHyper-Vでうまく行かないのであれば、 Virtualboxを利用する。

hyper-Vの代わりにVirtualBoxを使うように設定する。

choco install virtualbox
multipass set local.driver=virtualbox

わたしの場合、フォルダのアクセス権限を取得しておいて、virtualbox で起動することにした。

virtualbox を使うと、ファイルは次にの場所に設置される。

仮想ハードディスクなどは次の場所に設置された。

C:\Windows\System32\config\systemprofile\AppData\Roaming\multipassd\virtualbox

万が一の場合は、ここのフォルダを全消ししたら良さそう。

multipass の Virtualbox を表示する。

https://multipass.run/docs/using-virtualbox-in-multipass-windows

hyper-v みたいに、仮想マシンの管理画面でMultipassのゲストを確認するには、次のようなコマンドで pstoolsを使って起動する。

choco install pstools
PsExec.exe -s -i $env:VBOX_MSI_INSTALL_PATH\VirtualBox.exe

hyper-v に戻すには

multipass set local.driver=hyperv

multipass 便利ですね。

カーネルビルドとかやってると完全仮想化のマシンが欲しくなる。削除・作成・起動ができる環境が手に入るのはとても嬉しい。

multipass の bash-completion とかも

wsl で multipass 使うなら bash-completion もあれば便利 ubuntu から持ってきた bash-completion を bashrc に追記しておく

#export PATH="${PATH}:/mnt/c/ProgramData/chocolatey/bin/multipass.exe"
alias multipass=/mnt/c/ProgramData/chocolatey/bin/multipass.exe
# Copyright © 2017-2019 Canonical Ltd.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

_multipass_complete()
{
    _multipass_instances()
    {
        local state=$1

        local cmd="multipass list --format=csv"
        [ -n "$state" ] && cmd="$cmd | \grep -E '$state'"

        local instances=$( \eval $cmd | \grep -Ev '(\+--|Name)' | \cut -d',' -f 1 )

        local found

        _get_comp_words_by_ref -n := -w WORDS -i CWORD cur prev
        for instance in $instances; do
            found=0
            for ((i=2; i<CWORD; i++)); do
                if [[ "${WORDS[i]}" == ${instance} ]]; then
                    found=1
                    break
                fi
            done
            if [ ${found} == 0 ]; then
                opts="${opts} ${instance}"
            fi
        done
    }

    local cur cmd opts prev prev_opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    cmd="${COMP_WORDS[1]}"
    prev_opts=false
    multipass_cmds="transfer delete exec find help info launch list mount purge \
                    recover shell start stop suspend restart umount version get set"

    opts="--help --verbose"
    case "${cmd}" in
        "info")
            opts="${opts} --all --format"
        ;;
        "list"|"ls")
            opts="${opts} --format"
        ;;
        "delete")
            opts="${opts} --all --purge"
        ;;
        "launch")
            opts="${opts} --cpus --disk --mem --name --cloud-init"
        ;;
        "mount")
            opts="${opts} --gid-map --uid-map"
        ;;
        "recover"|"start"|"suspend"|"restart")
            opts="${opts} --all"
        ;;
        "stop")
            opts="${opts} --all --cancel --time"
        ;;
        "find")
            opts="${opts} --show-unsupported --format"
        ;;
    esac

    if [[ ${prev} == -* ]]; then
        case "${prev}" in
            "--format"|"-f")
                opts="table json csv yaml"
                prev_opts=true
            ;;
            "--cloud-init")
                _filedir
                return
            ;;
        esac
    fi

    if [[ "$prev_opts" = false ]]; then
        case "${cmd}" in
            "exec"|"stop"|"suspend"|"restart")
                _multipass_instances "Running"
            ;;
            "connect"|"sh"|"shell")
                _multipass_instances "Running"
                _multipass_instances "Stopped"
                _multipass_instances "Suspended"
            ;;
            "start")
                _multipass_instances "Stopped"
                _multipass_instances "Suspended"
            ;;
            "delete"|"info"|"umount"|"unmount")
                _multipass_instances
            ;;
            "recover")
                _multipass_instances "Deleted"
            ;;
            "mount")
                local source_set=0
                local prev
                _get_comp_words_by_ref -n := -w WORDS -i CWORD cur prev
                # Scan through the current command line to detect if the source
                # positional arg has been set.
                for ((i=2; i<CWORD; i++)); do
                    if [[ "${WORDS[i]}" != -* ]] && \
                       ([[ "${WORDS[i-1]}" != -* ]] || [[ "${WORDS[i-1]}" == *=* ]]); then
                            source_set=1
                            break
                    fi
                done

                if [ ${source_set} == 0 ] ; then
                    if [[ ${prev} != -* ]] || ([[ ${prev} == -* ]] && [[ ${prev} == *=* ]]); then
                        _filedir -d
                        return
                    fi
                elif [ ${source_set} == 1 ] && [[ ${prev} != -* ]]; then
                    _multipass_instances "Running"
                    _multipass_instances "Stopped"
                    _multipass_instances "Suspended"
                fi
            ;;
            "transfer"|"copy-files")
                _multipass_instances "Running"

                COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                if [[ "${#COMPREPLY[@]}" == "0" ]]; then
                    _filedir
                    return
                fi
            ;;
            "help")
                opts=$multipass_cmds
            ;;
        esac
    fi

    if [[ ${COMP_CWORD} -eq 1 ]]; then
        opts="${opts} ${multipass_cmds}"
    fi

    if [[ -n "${opts}" ]]; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
    fi

    return 0
}
complete -F _multipass_complete multipass

参考資料

2020年、良いなと思えたオンプレ(self-hosted)可能ソフトウェア

目次

今年インストールしてオンプレ(self-hosted)可能なソフトウェア

2020 年も終わりを迎えるの。今年インストールして、良かったソフトウェアを上げていきたいと思う。

今年のテーマは脱Googleで、できる限りクラウドのサービスに頼らずに、自前でサーバーにインストールしてデータを扱っていきたいと思う。クラウドサービスの積み上がる請求額に怯える暮らしから脱却したいです。Take Back my own data and Control.

ここに挙げた以外にもたくさんインストールしたり試しているのですが、今年インストールして使い始めて良かったものをまとめておきます。

getoutline

https://www.getoutline.com/

このメモを書いているツール

マークダウンを使ってノートを保存するツールは色々あるが、サーバーにインストールして使えるもの、複数人が使えるもの、権限設定ができるものは限られている。

テーブル(表組み)を手軽に作れるのもポイントが高い。

キーボードショートカットに対応していてリンク挿入や装飾などが手軽なのがいい。

マークダウンで記述できるが、クリック操作でマークダウンをソースを取り出せないのがちょっと悲しい。

今年ようやく日本語IMEに対応して、使い始めた。ずっと進化しているるので、今後が楽しみ。

Qiita よりも書きやすく、Nota ScrapBokほどではない感じ。でもデータを個人で管理できる強みがある。

Bitwarden

https://bitwarden.com/

まだパスワードを「記憶している」の?

パスワード管理はソフトウェアに任せる。自動生成・自動保存・自動入力までやってしまうのは当たり前の時代です。記憶よりも器械です。

パスワードをGoogle Chromeに記憶させるのも怖い。多くの人が使うソフトウェアはそれだけ狙われやすい。Chromeを狙うマルウェアは後をたたない。また何よりもGoogleにすべてを依存するのも恐ろしい話だ。GoogleがアカウントをBANまたはシステムダウンさせたらと考えると少し怖い。(実際に今年起こった)。パスワードくらいは自分で管理したい。Google Chromeのパスワード管理はとても安全で、もしパスワード自動保存してない人は今すぐまずChorme自動保存から使い始めるべきと個人的には思うのですが、Google Chromeに保存したパスワードをiOS(iPhone)から更新・保存のwrite管理が不便すぎて不満でした。

パスワード管理ソフトウェアを導入するにしても 1password にロックインされるくらいならiCloud keyChains 使いたいと思う。いろいろソフトウェアを検討した結果、Bitwardenに行き着いた。自分で管理できるものでソースコードGPL公開されていて誰でも手軽に安全に、自動入力・自動保存・自動生成ができ、OS環境問わず使えるもの、これを満たしてくれるのがBitwardenだった。

bitwarden のパスワード管理以外の便利機能。

メモ機能が個人的に気に入ってる。

メモを機能でセキュアなメモを残せる。メモ機能で、パスワードではないが、重要な記録を残せる。写真にとって保存できる。

パスワード記録ににドメイン名・ID・パスワード以外に、メモを残せる。複垢だったり、同一ベースドメインで複数サーブビスが動いているとき、メモを残せるので、このアカウントがどの契約だったかすぐわかる。さくらインターネットの管理画面ログインなど、複数契約で複数アカウントを持っているときに重宝する。

すべてをbitwarden に

1月にインストール後に使い始め、4月にはすべてのパスワードをBitwardenに移動する決断に至った。約1年が経過し、今では生活必需品になった。iOS版、Windows版、Chrome拡張、コマンドラインツールと生活に必要な一式がすべて提供されているのもポイントが高い。5年先くらいまでは戦えそう。

OpenProject

https://www.openproject.org/

プロジェクト管理ツールはあまたあるけど、どれも帯に短し襷に長しになっている。ソフトウェアの設計者のプロジェクト管理思想が具現化しているので、汎用に使えそうなものはなかなかない。

openproject は、ガントチャート、プロジェクト親子関係、タスクの親子関係、進捗入力、プロジェクト作成のテンプレ化、進捗入力のテンプレ化ができるので、入力項目も選択肢一覧をカスタムフィールドとして自分で定義することができる。ソフトウェア開発以外の、どんなプロジェクトにも対応可能だ。顧客ごとに管理する部署や受発注でも使えそうなので面白い。

カンバンの管理ソフトはあまたあるので、うまく連携設定してあげたい。

git連携が不得意なので、gogs や bare repo などとうまく設定連携していてあげたい。

Gogs

Gogs: A painless self-hosted Git service

古き良き(?)、昔のGithubのウェブ画面を実現している。機能が少ない。が、むしろ分かりやすい。

Git初心者に良い。スッキリしててわかりやすい。

Gogsはシンプルにcommits/ Issue / pull req/ wiki の機能で構成されている。分かりやすい。

gitweb ほど無味乾燥でなく、gitlab/githubほどゴチャゴチャしてない。

ここ数年のgithub は多機能とプロジェクト管理機能が増え、チケット管理とIssue管理ソフトウェアになった。pull/push するシンプルな使い方には増えすぎかもしれない。コミットログをブランチごとに見るだけでもgithubのプロジェクト画面を右往左往することがある。

gitlab/github は多機能でとても使いやすいが、多機能ゆえに、非プログラマの人たち(デザイナ・文書作成)にはまだ敷居が高が高いらしく。データをやり取りするのにGithubはUIが難しすぎる。

GitLabも多機能であるが、シンプルに左バーにまとまっているので素敵だが、gitlab-ci.yml をつかってCI/CDをオンプレで回したい以外の用途でインストールは躊躇する。

Git初学者や初心者、多機能がいらないひとたちとgitのやり取りするのに本当におすすめ。インストールも楽ちん。

Jitsi

https://jitsi.org/

オンライン会議ツール。jitsi の発音は、ジッチィ・ジッツィの発音に近い

Google MeetやZoomに代替にとても良い。

Mattermostから連携させると、Slack・Discord・Teamsの代替としてとてもいい。

通話品質は設定次第なので、評価は分かれると思う。使用感として、会議中に複数人が同時に発言した際、音声が途切れない印象。Meetsは発言が被ると消える印象があるので好対照だった。またDiscordほどノイズキャンセルが強力でもなためキーボード音は入りノイズ判定で警告が出たりも多かったがDiscordのようにノイズ判定でマイク入力をカットしない印象だった。

インストール後にSTUNやSSLP2Pのe2e設定がわかりにくい。ユーザー認証周りがめんどくさい。それを除けば最高に使いやすい。

他と違う変わった機能としてyoutube 動画を一緒に閲覧したり、youtube Liveにデータを流したり、youtube関係がある。OBS使わずにブラウザのタブ1枚で、youtubeを扱えるのは便利。

jitsi単体で使うより、Mattermostに追加する感じで使っている。なぜならmattermostに通話関係の機能がなく、MattermostからJitsiへの連携がありこれが使いやすい。

Slackはああなってしまったので、Slack離れをするためMattermostを使うことになったが通話機能にJitsiを使うことでとても使いやすいコラボ環境が入手できる。

iOSアプリも用意されており、日常使いや会議開催また授業で大活躍できる。

Google Meetにおすすめのソフトウェアだと思います。

n8n.io

https://n8n.io/

Workflowを作り上げるWebUIデザインとタスク作成のわかりやすさが良かった。

Zapier や IFTTや Node-REDが比較対象になると思いますが、Node-REDよりはZapierに近い感じ。

どこをどこをつなぐなど、視覚的に取り扱えるので、流行りのノーコード・プログラミングっぽいRTAごっこができます。でも実際にはJSONだとかHTTP GET/POSTを知らないと使えないですけど。「プログラミングを知らなくても作れる」と、「知ってる人が手軽に書けるGUI」はまた別物なのですが、世間ではごっちゃにされている印象は少なからず受けますよね。

n8nは必要なリクエストログはしっかり残るし、コピーして作成するようなこともできる。ただし、Webhookで受け取ったJSONデータから必要箇所を抜き出して、次のWebhookを起動するようなパス廻しまで手軽にできるかというと、そこまででもない。

PreBill

https://github.com/shoynoi/prebill

年間契約のサービスや、月額サービスの更新日をリマインドしてくれる。

半年残して解約はもったいないなぁ。などとケチってると、更新日に解約を忘れ、更に一年継続しちゃうミスを防げるかもしない。クラウドサービスや携帯電話の料金が高くなりがちなのは、月額サービスの更新月を忘れて解約ミスが発生しすることも一因だとおもうし、年間いくら掛けているのか可視化することもとても重要。

年間でいくら払っているのかを可視化しつつ、契約満期直前にサクッと解約できるようにしておくためにリマンドがとても重要。

年間総額の計算と閲覧、リマインド・メールを送信してくれる。

リマインドは通常であれば、カレンダー経由で行うのでカレンダーに忘れずに登録しておけば良いのですが、カレンダーの登録だと、自分がいつどこでいったい全部で何件の何円契約してるかが一覧の視認性が悪くなるので、このように手軽に管理できるものはいいなと思います。クラウド貧乏を避けたい。

できれば、iOSカレンダーやGoogle カレンダーにiCal エキスポートとか欲しかった。

でも、ないものは作ればいいんだってのが、ソースコードが公開されてる良さですね。

OPNSense

https://opnsense.org/

ルータ用OSの代表的存在

今年始めに、家庭内のネットワークをx86 ルータに変更したのですが、その時からOpenWrtを使っているのですが、予備回線の方はwrtではなく、OPNSenseを使っています。

両者を1年使ってて、単なるルーターとして動作させるのであればOPNSenseのほうが扱いやすいなと思ったので挙げておきます。

特に良かった点が、次の3点。

自動的にアップデートされるのがいい。
WEB画面だけでほとんどできる。
バックアップと復元が使いやすい 。

ルータとして十分な機能を備えていて、なおかつWEB-UIで設定できるのでスマホから操作できる。PPPoEとIPoEつないで、ファイアウォールを設定してOpenVPNDDNSを設定するなら、このOPNSenseを入れておけば十分。使い方もそんなに難しくない。x86のNUCやArm ボードが格安なので、自由に設定できるルーターをおいておくには良い。ルーターと無線APを一緒にしていると、無線APを増設が手間になったり、買い替え後に設定をメーカー提供の画面でチマチマやっていくのは苦痛すぎるので、一家に一台設置してもいいと思う。Wifi機能は進化が早いのでルーター機能とわけて管理しておくほうが5年程度運用するとトータルコストでお得になるかもしれない。

ただベースがBSDなので、SSH経由で使うには、Linuxとコマンドと体系が異なるので、iproute2 や systemd もないしファイル・システムもext4でもZFSもなくUHSなのでLinuxしか使ってない人にはちょっととっつきにくいかもしれない。

ただ無線LANサポートが微妙、BSDなのでドライバが少なく動作するUSB-Wifiも少ない。そのためWiFiSoftbank AirをAPを使うことに。11ac 1300 のAPになれる、契約終了後のSoftbank Air4が捨てられてるので養子にすることに。Wifi扱うならOpenWRTの方がドライバサポートが多くてが良いですね。

LXC container

https://linuxcontainers.org/lxc/introduction/

docker や k8s をみんながやってる中、私がコツコツと使っていたのが、 LXC/LXD と multipass 。

LXCで作るコンテナは、Dockerとは違い、仮想マシンしてるので、systemd があったりカーネルをいじれたり、手軽に実験環境を作成・削除するのが便利だった。

virtualbox や libviet qemu+kvmでもいいのだけれどLXCとして使い方と管理が共通化されているので、ここまで紹介したソフトウェアを試験的に動かしたりインストール手順を確認するのに活躍してくれた。

最後に。

今年は粛々と脱Google依存とクラウド貧乏を防止を目指している感じでした。

来季は、暗号化ストレージまわりや、LDAP認証周りNAS周りをめんどくさいが対応していきたいなと思ったり、お仕事を含めOpenLayersOSM周をやるので、Mapでも脱Googleを目指して頑張れればなと思います。脱Googleをしても、最後に残るGmailだけはどうしても依存してしまう。

mac でdig が応答しないときに、/etc/resolv.confを疑う

mac でdig が応答しない

dig が応答しないんですよね。dig

dig t.co 
### 応答しない。困った

@つけてDNSサーバーを明記すると動く

dig t.co @1.1.1.1
## 応答する。あれれ

resolv.conf が行方不明。

takuya@~$ sudo ll /etc/resolv.conf
ls: cannot access '/etc/resolv.conf': No such file or directory

ln -s すれば解決。

sudo ln -s /var/run/resolv.conf /etc/resolv.conf

原因が相変わらず不明。

消える少し前に、networksetup コマンドとコントロールパネルで、VLANなどのネットワーク構成設定を変更した。多分そのへんなのだろう。

以前にも同じようなことが起きていた。

OSX の /etc/resolv.conf が消えてぶっ飛んでた。→ファイル作って解決 - それマグで!

aptインストールを速くする(no-install をデフォルト設定とする)

急いでいるときに、すこしでもaptを速くしたい

apt の src を高速なミラーとかローカルミラーを使えば少し早くなる。んだけど、それだけだとまだ足りない。

Aptで余計なものを入れなければいいんだと思うんですよね。

apt.conf にrecommends と suggestを除外する設定を書く

tee を使って apt に no-recommends と no-suggests を書き込む

echo -e  "APT::Install-Suggests 0;\nAPT::Install-Recommends 0;" | sudo tee /etc/apt/apt.conf.d/00-no-install-recommends

実際にコマンドを実行するとこんな感じ.

takuya@ubuntu01:/etc/apt/apt.conf.d$ echo -e  "APT::Install-Suggests 0;\nAPT::Install-Recommends 0;" | sudo tee /etc/apt/apt.conf.d/00-no-install-recommends
APT::Install-Suggests 0;
APT::Install-Recommends 0;

最後に設定が有効になったか確認

apt の設定が有効になったかは、apt-config コマンドを使えばわかる。

apt-config dump  | grep Install

次のように、recommends と suggest がインストール無効(0)が有効になったのがわかる。

takuya@ubuntu01:/etc/apt/apt.conf.d$ apt-config dump  | grep Install
APT::Install-Recommends "0";
APT::Install-Suggests "0";
DPkg::Pre-Install-Pkgs "";
DPkg::Pre-Install-Pkgs:: "/usr/sbin/dpkg-preconfigure --apt || true";
AptCli::Hooks::Install "";
AptCli::Hooks::Install:: "[ ! -f /usr/bin/snap ] || /usr/bin/snap advise-snap --from-apt 2>/dev/null || true";

ついでに ミラーサーバも設定しておく

URL=http://ftp.jaist.ac.jp/pub/Linux/ubuntu/
sed -i "s|http://archive.ubuntu.com/ubuntu/\?|${URL}|" /etc/apt/sources.list

または mirror+http://mirrors.ubuntu.com/mirrors.txt を使う。

コピペ用

sudo su
echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4
echo -e  "APT::Install-Suggests 0;\nAPT::Install-Recommends 0;" |  tee /etc/apt/apt.conf.d/00-no-install-recommends
URL=http://ftp.jaist.ac.jp/pub/Linux/ubuntu/
sed -i -r "s|http://(jp.)?archive.ubuntu.com/ubuntu/?|${URL}|" /etc/apt/sources.list
sed -i -r "s|http://security.ubuntu.com/ubuntu/?|${URL}|" /etc/apt/sources.list
apt update 
apt upgrade

manページもインストールしないほうが速い。

いらないときは、入れないほうが作業速いよ。

/etc/dpkg/dpkg.cfg.d/01-nodoc または /etc/dpkg/dpkg.conf.d/01-nodoc

# Delete locales
path-exclude=/usr/share/locale/*

# Delete man pages
path-exclude=/usr/share/man/*

# Delete docs
path-exclude=/usr/share/doc/*
path-include=/usr/share/doc/*/copyright

コピペ用

 cat <<EOF > 01-nodoc
# Delete locales
path-exclude=/usr/share/locale/*

# Delete man pages
path-exclude=/usr/share/man/*

# Delete docs
path-exclude=/usr/share/doc/*
path-include=/usr/share/doc/*/copyrigh

EOF
sudo mv 01-nodoc /etc/dpkg/dpkg.cfg.d/01-nodoc

参考資料

man apt-config

tpm デバイスでパスワード入力省略でcryptrootをブートさせられる。

tpmバイスLinuxでも使いたい。

TPM搭載されてるんだ。だからWindowsのbitlocker的な暗号化デバイスのパスワード入力レスの起動をやりたかった。

ずっとやりたかった。でもあまりに手間が多かったので見送っていた。

気づいたら、専用のツールが公開されていました。早速使ってみました。

TPMを使ってdm-crypt を解除したい!

windows BitLocker のようにLinuxでもluks/dm-cryptの 暗号化ストレージを起動時にTPMでアンロックしたい。

パスワードなしでTPMでアンロックできれば、とても気軽に暗号化ストレージを使えるようになる。

TPMバイスでアンロックする。

tpm2KeyUnlockというレポジトリが出現していた。これを使えば、誰でも簡単にLUKSのdm-cryptデバイスを透過的に扱えるようになる。

簡単な概要

まず、Ubuntuをインストールします。ストレージ選択時に、dm-cryptをチェックします。暗号化ストレージのパスワードを決めておきます。

ここまで暗号化ストレージを作ってインストールができます。

しかし、OS起動時に/boot/efi が / にアクセスするために、起動にロック解除が必要です。

この起動時のロック解除に使う「キー(鍵)」をTPMバイスに入れて起動時に利用します。TPMから鍵を取得して、LUKSのルートのアンロックを行って通常通り起動が可能になります。またTPMバイスとOSはセキュアブートで保護し第三者のアクセスを排斥します。

使い方。

対応ファイルを github から取ってきます。

git clone https://github.com/anedward01/tpm2KeyUnlock
cd tpm2KeyUnlock

github のファイルには exec のパーミッションがないので付与します。

find -type f | xargs -I@ chmod 755 @

./setup をします。これで設定が始まります。

sudo ./setup

私の環境の場合、 sudo ./setup では動作しませんでした。

次のコマンドを入れて、hookをコピーしないとだめだった。tpm取得に失敗してた。

sudo cp tpm2Hook /etc/initramfs-tools/hooks/tpm2
sudo cp tpm2Hook /usr/share/initramfs-tools/hooks/tpm2

crypttab にアンロックコマンドを設定します。

crypttab の暗号化ストレージのUnlock設定で、tpm を使ったアンロックを指定しました。

sudo -E  vim /etc/crypttab
## 
dm_crypt-0 UUID=XXXX luks,discard,keyscript=/usr/local/bin/passphrase-from-tpm
takuya@ubuntu01:~$ sudo cat /etc/crypttab
dm_crypt-0 UUID=XXXXXX /usr/local/var/tpm-manager/secret.bin luks,discard,keyscript=/usr/local/bin/passphrase-from-tpm
takuya@ubuntu01:~$

これで再起動したら、TPMのキーを使ってパスワードを入れなくても暗号化ストレージがロック解除されてブートされました。感動。

万が一動かない場合。

efibootmgr でブート順を変更すればいい。

私の環境ではすでにインストールされていた EFI-manager が ubuntu の通常のブートローダーを使って起動するように設定されていたので、再起動してもブートローダーが有効にならなかった。なのでEFIの起動順序を変更しておいた。UEFIの一覧を取得したり、EFIのデバイスの一覧を取得したり、EFIの起動順を設定するにはefibootmgrというEFIを管理するコマンドを使う。

takuya@ubuntu01:~$ sudo efibootmgr -a -b 0005
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000,0005,
Boot0000* ubuntu
Boot0005* TPM2 EFI Stub

## 整理統合し直して次のようにした。

takuya@ubuntu01:~$ sudo efibootmgr
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002,0000
Boot0000* ubuntu
Boot0002* TPM2 EFI Stub


ここで、TPM2を使う設定になっているので、ubuntu を使って起動すれば、cryptroot の unlock が聞かれるはずである。 また、dm-crypt デバイスパスフレーズやキーファイルは予備で作って厳重に保存しておく必要がありますね。

問題は、tpm のアンロックが、他のOSからできないようにしてあるかというところや耐タンパ性ですね。 まぁそこはtpm を信じるしかないですね。

必要であれば

EFIの設定よりBIOSで指定した順序が優先されることがあるので、BIOS画面に変更し、ブートを変更する必要がある。 SecureBootをONにして、UEFIの順序をTPM最優先する。

参考資料

https://threat.tevora.com/secure-boot-tpm-2/

カーネルのバージョンアップが来ても対応できるんですよね。

2020-12-15カーネルのバージョンアップが来ても起動してました。マイナーバージョンアップなら対応できそうです。

まだ、1ヶ月くらいしか運用してないので、長期間に亘りアップデートなどに対応しながら継続的稼働が可能なのか、これは結論が出てません。

2021-11-11

EFI/UEFIのキーワードで検索マッチせず、efibootmgrのコマンドが思い出せなくて困ったのでひたすらキーワードを追加

2021-12-22

apt upgrade したら efi が壊れたのでtmp2ツールをいれなおして再構成した。

takuya@ubuntu01:~$ sudo efibootmgr
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002
Boot0002* Ubuntu

2022-01-04

tpm2-initramfs-tools がリリースされてて、debain のパッケージにあるけど、まだ誰も使ってない。

2023-04-24

ubuntu のアップグレードをしたら、ビルド失敗した

‘RAND_get_rand_method’
src/tss2-esys/esys_crypto_ossl.c: In function ‘iesys_cryptossl_random2b’:
src/tss2-esys/esys_crypto_ossl.c:519:5: error: ‘RAND_get_rand_method’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations]
  519 |     const RAND_METHOD *rand_save = RAND_get_rand_method();
      |     ^~~~~
      

最新版で以下の準備をして再ビルドしたらうまく行った。

sudo apt install tpm2-openssl
sudo rm /usr/local/src/tpm2-tss

EFIが再構成されダブリが出たので調整し直した

sudo efibootmgr
[sudo] password for takuya:
BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0001,0000
Boot0000* TPM2 EFI Stub
Boot0001* Ubuntu

Evernoteでブログが更新できなくなりました。

evernoteが使えない。

作業しながらメモとスクショを保存しておき、あとでまとめてEvernoteからはてなブログに投稿していました。

ところが、Evernote社がクライアントソフトを互換性なく更新したため、過去のマークダウン記事が喪失してしまいました。

マークダウンをつけ直しになっています。

Evernote 社の変更

Evernote社がソフトとAPIのLimitを変更したので、はてなブログ経由でEvernoteの記事を挿入する機能が全くうまく動かないようになっています。

記事がかけない。

Evernoteのソフトウェアが変更されたせいで、記事を書くのにすごく時間がかかっています。

記事を書くために、作業中のメモから直接投稿ができなくなくなって、記事を書く負担が増大していて更新がどんどん遅れています。。。。

php xdebug の接続(localhost/phpstorm/php-builtin webserver)

IDEphp-xdebugブレークポイントを使いたい。

IDEphp-debug を使ってブレークポイントを設定し任意の場所で変数の内容をダンプしたい。

はじめに

phpxdebug を使えば phpstorm や vscode などでブレークポイントを使うことができる。

接続形態

xdebugphp のプロセスは、次のような(ちょっと特殊?)接続の形態をとる。

phpstorm ( IDE/debugger )  127.0.0.0:9000   <----connect --- phpサーバー

ここでは、矢印が右から左につながっていることがポイント。

PHPのランタイム(インタプリタ)がソースコードの実行時に、phpstorm(IDE)に接続することでデバッグ機構が動作する。

手順の概要(やること)

全体の流れは、こんな感じになる。

ここでの、ポイント

  • IDEがポートをリッスンして待ち受ける
  • PHPが実行時にXdebug経由で、IDEのポートへ接続する

接続がポイントになります。「IDEがポートをリッスンして待ち受ける」ということを忘れないでください。

builtin-sever と phpstorm の接続

phpにバンドルされている builtin-web-server  とphpstorm を接続する。

ここでやること

  • builtin-web-server   を xdebug 有効で起動する。
  • phpstorm がxdebug を待ち受ける。
  • ブラウザで起動した builtin-web-server に接続する。
  • ビルトインWebServerを起動する -ビルトインWebServerでphpのWEBアプリケーションを動かす。

builtin-web-server  を起動して動作チェック。

最初に、空っぽのPHPプロジェクトを作っておく

f:id:takuya_1st:20201215001225p:plain

プロジェクト内に、コンテンツを作る。

f:id:takuya_1st:20201215001229p:plain

ビルトインWebServerをxdebug 付きで起動して、動作チェックする。

php -S 127.0.0.1:8000 -t public

起動した。

f:id:takuya_1st:20201215001236p:plain

ブラウザで接続して起動をチェックする

f:id:takuya_1st:20201215001232p:plain

ビルトインWebServerが動いたたら、今度はXdebugを有効にして起動する。

これで、Xdebugが有効になって起動する。

php -d xdebug.remote_autostart=1 \ 
-d xdebug.remote_enable=1 \ 
-d xdebug.remote_host=127.0.0.1 \ 
-d xdebug.remote_port=9000 \ 
-d xdebug.remote_connect_back=1 \ 
-d xdebug.remote_log=/tmp/xdebug.log \ 
\ 
-S 127.0.0.1:8000 \ 
-t public

もちろん、php-xdebug がインストールされている必要があるので、インストールされていない場合は、 有効にしておく。 例は、WSL1  のdebian/ubuntu です。

sudo apt install php-xdebug
sudo phpenmod xdebug

phpstorm でXdebugの接続を受け入れる

右上のボタンを押して、ポートをリッスンして受け入れる。

初期状態

f:id:takuya_1st:20201215001240p:plain

リッスン中

f:id:takuya_1st:20201215001244p:plain

リッスンしたらブラウザからアクセス。

ブラウザから、ビルトインWebServerにアクセス

f:id:takuya_1st:20201215001251p:plain

すると、ビルトインWebServerのXdebugが、PHPStormに接続に行く。

PHPStormがこの接続を受け入れるか聞いてくる。Acceptすると接続され、許可設定が記憶される。

f:id:takuya_1st:20201215001247p:plain

ブレークポイントを設定する。

php側にブレークポイントを設定しておく。

f:id:takuya_1st:20201215001254p:plain

再度、ブラウザで開く。すると実行は一旦停止される。

phpstorm がアクティブになり、ブレークポイントで止まっていることがわかる。

f:id:takuya_1st:20201215001259p:plain

ブレークポイントをResume(再開)してあげる

f:id:takuya_1st:20201215001304p:plain

最後まで実行されると、ブラウザに結果が表示される。

f:id:takuya_1st:20201215001308p:plain

Xdebugって超簡単に接続できます。

他の言語のデバッガと大きく異る。

phpXdebugはちょっと癖があります。他の言語がSSH経由でサーバーとして起動中のプロセスにアタッチするのにたいし、PHP-Xdebug はサーバーがIDEへアタッチしてきます。理屈がわかればかんたんです。

今回のポイント

xdebugリモートデバッグではXdebugがIDEへ接続へ行く

使うにはXdebugがロードされる環境であればいい、サーバーはApacheでもビルトインWebServerでもphp-fpm でも php-cgi でもなんでもいい。IDEはリッスンが必須。。VisualStudio CodeでもPHPStormでもなんでもいい

次は、Laravelの起動とLaravelからのXdebugです。

Laravelのartisan serve は、その内部でシェル 経由でビルトインWebServerを起動するため、少し挙動が異なります。注意が必要です。

qemu-img コマンドをubuntuにインストールする方法

qemu-img コマンドを入れたい。

qemu-imgがどこにあったかなと忘れてしまったので、探した。

apt-file で検索。

takuya@ubuntu01:~$ apt-file search qemu-img
qemu-utils: /usr/bin/qemu-img
qemu-utils: /usr/share/man/man1/qemu-img.1.gz

なるほど qemu-utils か

qemu-utils をインストール

sudo apt install qemu-img

これで、コマンドを使えるようになった。 apt-file 便利

grub の起動メニューを一覧してデフォルト起動を変更する

grub メニューを毎回選ばずに済ませたい。

カーネルを更新したり、デュアルブートをしていると、起動デフォルトを変えたい時がある。 そのときは、grub-set-default を使う。そのさいに、起動メニューの番号を取得したい。

grub の設定ファイルを取ってくる。

export GRUB_CONFIG=`sudo find /boot -name "grub.cfg"`

中身をgrep する。

sudo grep 'menuentry ' $GRUB_CONFIG | cut -f 2 -d "'" | nl -v 0

メニューはこんなかんじ

     0  Ubuntu
     1  Ubuntu, with Linux 5.4.0-59-generic
     2  Ubuntu, with Linux 5.4.0-59-generic (recovery mode)
     3  Ubuntu, with Linux 5.4.0-58-generic
     4  Ubuntu, with Linux 5.4.0-58-generic (recovery mode)
     5  Ubuntu, with Linux 5.4.0-54-generic
     6  Ubuntu, with Linux 5.4.0-54-generic (recovery mode)

一時的な変更

sudo grub-reboot 3

デフォルトを変更する。

sudo grub-set-default 3
sudo reboot

永続的な変更

Grubはここを基準に設定されているので、初期値としての0を除外しなくちゃいけないみたい。

sudo vim /etc/default/grub
#GRUB_DEFAULT=0
GRUB_DEFAULT=3
sudo update-grub

参考資料

https://unix.stackexchange.com/questions/43196/how-can-i-tell-grub-i-want-to-reboot-into-windows-before-i-reboot

https://www.digitalocean.com/docs/droplets/how-to/kernel/use-non-default/

phpstorm でシンプルなコンソール実行デバッグ設定

phpstorm でphpデバッグ phpstorm で コマンドラインのコンソールで実行したphpデバッグする設定。

実行環境には、phpstorm 20202.2 と WSL でインストールしたphp を用いる

wsl のphp を使ったときに、ファイルを実行してブレークポイントで止めることをする。

wsl を使う場合のプロジェクト設定。

新規作成でプロジェクトを選ぶ。

f:id:takuya_1st:20210113100922p:plain新規で空のphpプロジェクト

f:id:takuya_1st:20210113100925p:plain デバッグしたいスクリプトを作る。 f:id:takuya_1st:20210113100929p:plain Run→ debug を選ぶ f:id:takuya_1st:20210113100933p:plain

ファイルをどうやって実行するかを選ぶ。

ここで、インタプリタを設定する。

f:id:takuya_1st:20210113100937p:plain なにもしてないと、インストール済みのPHPを探してくれるが、WSLの場合は自分で指定しないと探してくれない。 f:id:takuya_1st:20210113100940p:plain

f:id:takuya_1st:20210113100944p:plain インタプリタを設定する。

f:id:takuya_1st:20210113100948p:plain インタプリタの種類を選ぶ。WSLやVagrantSSHはここで設定する。 f:id:takuya_1st:20210113100951p:plain

WSLを選ぶと、WSLの中から which php して自動的に選んでくれる。

f:id:takuya_1st:20210113100955p:plain ここでは、プロジェクト単位の設定になる。もし全体に設定して使いまわしたいときはチェックを外せばいい。いつでもできるので確実に動くのを確認してから外したらいい。

f:id:takuya_1st:20210113100959p:plain 設定が終わったら、インタプリタが設定される。インタプリタとコード分析のベースとなるバージョンを選んで・・・ f:id:takuya_1st:20210113101005p:plain これでデバッグが実行できるようになる。いん f:id:takuya_1st:20210113101009p:plain

デバッグで実行すると次のような画面になる。下側にデバッグウインドウが表示される。

f:id:takuya_1st:20210113101013p:plain ブレークポイントを設定してデバッグで実行すると、ブレークポイントでちゃんと止まるようになる。

f:id:takuya_1st:20210113101019p:plain

ここでは、phpはシンプルにコマンドから php-cli を実行している。

phpstorm が php-cliを実行するときにデバッガを有効にして起動してくれる。

デバッグが実行されると次のようなプロセスが生えている。 f:id:takuya_1st:20210113101033p:plain このコマンド実行から、分かる通り、PHPStormがデバッグ起動時にphpデバッグオプションを渡して起動している。 さらに言えば、php-cliCLIphpデバッグで使っているのは xdebug である。

グローバル設定のxdebug が有効無効にかからわず、起動時にXdebugを有効にして起動しているのである。

この起動時に「Xdebug」を有効にして起動する。という考え方は ビルトインサーバーやLaravel artisan でサーバー起動するときにも使えるので覚えておくと便利だと思う。

当然だが、xdebugをインストールしていないとデバッグはできないのでエラーになる。(インストールして使用可能が大事なので、有効無効は問わない)

f:id:takuya_1st:20210113101025p:plain

そして、Xdebugのリモートデバッッグではあるのだが、PHPStormのリモートデバッグのリッスンは内部的に自動で行われるらしく おもしろいことに、デバッグ中でもリッスンのアイコンはDisconnectedのママである。

f:id:takuya_1st:20210113101029p:plain また、デバッグ中にnc でコネクションを張ろうと思っても、refuseされた。WSLのポートの取り扱いのせいかもしれない。

f:id:takuya_1st:20210113101037p:plain