いまさら VoIP 網
はじめに
皆さんの自宅には固定電話、いわゆる “家電”(いえでん)が置いてありますか?
アメリカで発明された電話機が日本に渡ってきたのは 1877 年(明治 10 年)のことです。 その翌年には国産の電話機が作られるようになり、1890 年(明治 23 年)には日本で電話サービスが開始されました。 その後、関東大震災や太平洋戦争を経て、電話機や電話交換機にはさまざま改良が加えられていきました。 電話は重要な通信網としての役割を演じ、1968 年(昭和 43 年)には全国の加入者数が 1000 万を突破しました。 固定電話の加入者数は 1996 年(平成 8 年)にピークを迎え、6153 万件を記録しています。 しかし、世も平成を迎えれば携帯電話やブロードバンド接続のインターネットが普及し、令和となればスマートフォンが当たり前となってしまいました。 固定電話の加入者は 2011 年(平成 23 年)の時点でピーク時の半数となり、2023 年(令和 5 年)の 12 月には 1400 万件を割って減少を続けています。 この傾向を受け、NTT 東日本及び NTT 西日本は従来の電話網である公衆交換電話網(Public Switch Telephone Network: PSTN)からインターネットを利用した IP 網への切り替えを進めました。 つい先月である 2024 年 12 月 25 日、PSTN は完全に IP 網に移行し、電話交換機は遂にその役目を終えました。
ところで、天下の NTT が IP を用いて電話サービスを提供している世の中ですから、私たちも IP を用いて電話サービスを実現できるはずです。 インターネットは自由ですから、令和の世の中に IP 電話網を構築してもよいのです。
この記事では、フリーの IP-PBX(Private Branch eXchenge)である MikoPBX をインストールする方法を紹介します。 MikoPBX は Proxmox で管理される LXC コンテナ上に構築された Ubuntu 環境において、Docker を利用してインストールされます。 また、内線番号の追加方法、SIP を用いて他の PBX と相互接続する方法を紹介します。 さらに、これまでの実運用で得られた実際的な知見を共有します。
動作確認環境
Proxmox Virtual Environment (Node)
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
# uname -a
Linux dekopon.local.kusaremkn.com 6.8.12-5-pve #1 SMP PREEMPT_DYNAMIC PMX 6.8.12-5 (2024-12-03T10:26Z) x86_64 GNU/Linux
Ubuntu (Container)
# cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.1 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
# uname -a
Linux mikochan 6.8.12-5-pve #1 SMP PREEMPT_DYNAMIC PMX 6.8.12-5 (2024-12-03T10:26Z) x86_64 x86_64 x86_64 GNU/Linux
フリーの IP-PBX システム
電話の接続を制御するためには電話交換機が必要です。 IP 電話網における電話交換機は IP-PBX と呼ばれます。 フリーの IP-PBX システムの実装にはいくつかの選択肢がありますが、ここでは MikoPBX を選択します。 MikoPBX はシンプルな Web UI によって制御できます。 他の IP-PBX システムにありがちな、サブスクリプションを勧誘する広告が表示されることもありません。
MikoPBX をインストールする方法はいくつか挙げられますが、今回は Proxmox で管理される LXC コンテナ上に Ubuntu をセットアップし、Docker を利用してインストールする方法を紹介します。 この方法は煩雑であるように思われますが、他の PBX と相互接続する際に真価を発揮します。
LXC コンテナの作成
ここでは、MikoPBX をインストールするための LXC コンテナを作成します。
Proxmox のインストールやテンプレートの準備
Proxmox を利用できる環境を用意します。 Proxmox をインストールする方法はこの記事で述べません。 Proxmox 公式のガイドなどを参考にインストールしてください。 また、Ubuntu 24.04 Standard の CT Template(ubuntu-24.04-standard
)を利用しますから、ダウンロードしてください。
コンテナの用意
コンテナの作成
Proxmox の Web UI を開き、Create CT から新規コンテナを作成します。
Create CT を押下すると表示されるダイアローグ
ダイアローグが表示されるため、必要な設定項目を入力します。 少なくとも、以下の項目を設定する必要があります:
-
Hostname:
コンテナのホスト名を設定します。 人間向けの名前を設定します。 -
Unprivileged container:
チェックを外します(重要)。 コンテナ内で Docker を利用するために必要です。 -
Password あるいは SSH public key(s):
ログインに用いるパスワードあるいは公開鍵を設定します。
テンプレートの選択
Next を押下するとコンテナのテンプレートを訊ねられます。 ここでは、Ubuntu 24.04 Standard を選択します。
コンテナのテンプレートを選択
ディスクサイズの設定
Next を押下するとディスクサイズを訊ねられます。 特段の理由はありませんが、32 GiB 程度を指定しておくと良いと思います。
ディスクサイズの設定
CPU コア数の設定
Next を押下すると CPU のコア数を訊ねられます。 これもまた特段の理由はありませんが、2 コア程度を指定しておくと良いと思います。
CPU コア数の設定
メモリやスワップのサイズの設定
Next を押下するとメモリやスワップのサイズを訊ねられます。 またもや特段の理由はありませんが、いづれも 4096 MiB 程度を指定しておくと良いと思います。
メモリやスワップのサイズの設定
ネットワークの設定
Next を押下するとネットワークの設定について訊ねられます。 本来であれば、ここで固定された IP アドレスを指定すべきです。 しかし、PBX の相互接続の章で述べる Tailscale を利用した接続方式のみを用いる場合、DHCP や SLAAC によって自動的に割り当てられる動的な IP アドレスでも運用できます。
ネットワークの設定
DNS の設定
Next を押下すると DNS の設定について訊ねられます。 ここでは、少なくとも DNS サーバの設定を行います。 1.1.1.1 などの DNS サーバを指定しておけば問題ありません。
DNS の設定
最終確認
Next を押下するとコンテナの設定について確認されます。 問題がなければ Finish を押下して設定を確定します。
最終確認
追加の設定
LXC コンテナの上で Docker を利用するため、追加の設定が必要です。 コンテナを格納している Node(Proxmox それ自体)の Console を開き、/etc/pve/lxc/xxx.conf に以下を追加します。 ただし、xxx の部分は上で作成したコンテナの ID を指定します。
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net dev/net none bind,create=dir
lxc.apparmor.profile: unconfined
lxc.cap.drop:
lxc.cgroup.devices.allow: a
lxc.mount.auto: proc:rw sys:rw
lxc.mount.entry: /dev/fuse dev/fuse none bind,create=file 0 0
追加の設定
LXC コンテナの起動
LXC コンテナの作成が完了したら、起動して設定を進めます。 左側のペインから作成したコンテナを選択し、右上にある ▶ Start を押下します。
コンテナの起動
ログインユーザ名は root、パスワードはコンテナ作成時に設定したものです。
ソフトウェアアップデート
コンテナを起動したら、まずソフトウェアを更新しておきます。 次のように実行します。
# apt update && apt upgrade -y
この操作によってカーネルがアップグレードされるかもしれません。 再起動しておくと確実に適用されます。
# reboot
MikoPBX のインストール
Docker を利用した MikoPBX のインストール方法は、公式のドキュメントに一通りまとまっています。 ここでは、これを参考に Docker 及び Docker Compose をインストールし、MikoPBX をインストールします。
Docker 及び Docker Compose のインストール
まず、依存関係をインストールします。 次のように実行します。
# apt update
# apt install apt-transport-https ca-certificates curl software-properties-common
続いて、Docker 公式リポジトリの GPG 鍵を追加し、Docker のリポジトリを登録します。 一部のコマンドに非推奨の項目を含むため、警告が表示されるかもしれません。
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Docker CE をインストールします。
# apt update
# apt install docker-ce
Docker Copmose をインストールします。 最後に、正常にインストールできているか確認するため、docker-compose のバージョン情報を表示します。
# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose --version
ユーザやディレクトリの作成
MikoPBX が内部で利用するユーザやディレクトリを作成し、権限を設定します。
# adduser --disabled-password --gecos "" www-user
# mkdir -p /var/spool/mikopbx/cf
# mkdir -p /var/spool/mikopbx/storage
# chown -R www-user:www-user /var/spool/mikopbx/
Docker Compose の設定ファイル
Docker Compose のための設定ファイルを記述します。 以下の内容を compose.yml と名付けて保存します。 保存するディレクトリは root ユーザのホームディレクトリで構いません。 container_name、hostname、及び PBX_NAME などの値を適切に編集してください。
services:
mikopbx:
container_name: "mikopbx"
image: "ghcr.io/mikopbx/mikopbx-x86-64"
network_mode: "host"
cap_add:
- NET_ADMIN
entrypoint: "/sbin/docker-entrypoint"
hostname: "mikopbx-in-a-docker"
volumes:
- /var/spool/mikopbx/cf:/cf
- /var/spool/mikopbx/storage:/storage
tty: true
environment:
- ID_WWW_USER=${ID_WWW_USER}
- ID_WWW_GROUP=${ID_WWW_GROUP}
# Change the station name through environment variables
- PBX_NAME=MikoPBX-in-Docker
# Change the default SSH port to 23
- SSH_PORT=23
# Change the default WEB port to 8080
- WEB_PORT=8080
# Change the default WEB HTTPS port to 8443
- WEB_HTTPS_PORT=8443
MikoPBX の起動
Docker Compose を利用して MikoPBX を起動します。 以下のように実行すると、MikoPBX がデタッチ状態で起動します。
# export ID_WWW_USER=$(id -u www-user)
# export ID_WWW_GROUP=$(id -g www-user)
# docker compose up -d
docker compose
コマンドのログを表示するには、以下のように実行します。 ただし、mikopbx の部分には compose.yml に記述した container_name の値を指定します。 ログの表示を終了するには Ctrl+C を押下します。
# docker logs mikopbx -f
しばらくすると、ログの末尾に https:// から始まる URL が表示されます。 Web ブラウザからこの URL にアクセスすると MikoPBX のログイン画面が表示されます。 このとき、“警告: 潜在的なセキュリティリスクあり” などのように警告が表示されることがありますが、“危険性を承知の上で使用” などを選択し、アクセスします。
MikoPBX のログイン画面
MikoPBX の初期設定
ここでは、MikoPBX の初期設定を行います。
パスワードの設定
MikoPBX の Web UI からログインを行います。 初期ユーザ名及びパスワードは admin 及び admin です。 ログインするとパスワードの変更を求められるはずです。 より強力なパスワードに変更してください。 パスワードの変更は System → General settings → Web interface password から行えます。 同時にユーザ名を変更できます。
パスワードの設定
既存設定の削除
続いて、機能紹介のため(?)にプリインストールされている設定項目を削除します。 全設定の削除は System → General settings → Delete all system settings から行えます。 設定を削除するには文字列 delete everything を入力する必要があります。 日本語で利用している場合でも delete everything を入力する必要があります。
既存設定の削除
MikoPBX の運用
内線番号の設定
同一局内に接続される端末同士での通信を内線と呼びます。 内線を利用するためには、各端末に内線番号を割り当てる必要があります。 内線番号を追加するには Telephony → Extensions から Add new extension を押下します。
内線番号を追加
New employee の画面では、追加する内線番号についての情報を登録します。 以下の項目を設定してください:
-
Username:
端末の名前や利用者の名前を設定します。 人間向けに表示される文字列です。 -
Extension:
内線番号を設定します。 IP 電話にログインする際のユーザ名になります。 -
Mobile number, Email address:
適宜設定します(必須ではありません)。 -
Password:
IP 電話にログインする際のパスワードです。 既に文字列が入力されていますが、任意の文字列を設定できます。
内線番号の登録
内線番号の桁数
内線番号の桁数の上限は初期設定で 3 桁に設定されています。 この上限を設定するには、System → General settings → Main の Maximum length of extension を設定します。
内線番号の桁数設定
IP 電話クライアントの設定
インターネット上には IP 電話の機能を提供するソフトウェアが数多く公開されています。 ここでは Linphone をお勧めします。 このソフトウェアは Ubuntu や macOS、Microsoft Windows の全てで利用でき、さらに iOS や Android 上でも利用できます。
Ubuntu を利用している場合、Linphone を apt 経由でインストールできます。 デスクトップ環境であれば、linphone-desktop が便利です。
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install linphone-desktop
インストールの完了後、ソフトウェアを起動すると次のような画面になるので “SIP アカウントを使用する” を選択して進みます(画面の表示には若干の差があるかもしれません)。
SIP アカウントを使用する
いくつかの機能を利用するためには Linphone アカウントが必要である旨が表示されるため、I understand を選択して続行します。
機能制限の警告
この画面で SIP アカウントの情報を入力します。 ユーザ名の項目には内線番号を設定します。
その他の項目には内線番号を登録した際の情報を入力します。
SIP アカウントの情報
登録したプロファイルが自動的に選択されない場合があります。 その場合、アカウント情報が表示されている部分をクリックあるいはタップして登録したプロファイルに切り替えます。
プロファイルの切り替え
接続確認のために 000063 番に電話を掛けてみましょう。 この番号に電話を掛けると、機械音声が自分の電話番号を読み上げてくれます。 MikoPBX が正しく動作していて、正常に通信できているのならば音声が聞こえてくるはずです。 また、他の端末が内線に接続されている場合、内線番号に電話を掛けることで通話を行えます。
000063 に電話を掛ける
PBX の相互接続
PBX 間の相互接続を実現する方法を紹介します。
Tailscale のインストール
PBX 同士を相互接続するために Tailscale を用います。 PBX は SIP サーバを含んでおり、SIP サーバをインターネットに晒すことは気が引けますから、MikoPBX を収容しているホスト(つまり今回の場合はコンテナである Ubuntu)に Tailscale をインストールします。 インストールと設定の方法の詳細な説明は省略します。 基本的には、https://tailscale.com/download に挙げられているコマンドを実行します。 正常に Tailscale をインストールでき、正常に Tailnet に接続できている場合、Tailnet 経由で MikoPBX にアクセスできるようになります。
# curl -fsSL https://tailscale.com/install.sh | sh
Tailnet 経由で PBX を共有する場合、MikoPBX を収容しているホストの Tailnet 上の接続情報を共有しておく必要があります。
着信用設定の作成
他の PBX からの接続を受けるためのプロバイダ設定を行うには、次のようにします:
- Call Routing → Telephony providers から Connect SIP を押下します。
- Provider name に from-any などわかりやすい名前を入力し、Account type を Incoming Refistration に設定します。
- ここで表示されている Username 及び Password を接続したい交換局の運営者に配布します。
- 複数の PBX からの接続を同時に受け付けるため、Advanced setting の Advanced Options に以下の内容を記述します。 ここで、max_contacts の値に設定した数だけの PBX が同時に接続できます。 この記述を省略した場合の値は 1 です。
[aor]
max_contacts = 100
着信用設定の作成
発信用設定の作成
他の PBX に接続するためのプロバイダ設定を行うには、次のようにします。
- Call Routing → Telephony providers から Connect SIP を押下します。
- Provider name に from-KusaReMKN などわかりやすい名前を入力し、Account type を Outgoing Refistration に設定します。
- Provider host URL or IP address に接続先のホスト名、あるいは IP アドレスを入力します。 さらに、User Name に相手側の SIP-TRUNK-XXXXXXXX 形式のユーザ名を、Password にパスワードを入力します。
発信用の設定の作成
接続状況の表示
ここまでの接続について、相互に接続できていれば、次のように表示されます。
接続状況の表示
着信ルーティングの設定
実際に着信を受けるためには Incoming routing の設定が必要になります。 最も簡単に設定するには以下のようにします:
- Call Routing → Incoming routing から Add a new rule を押下します。
- Provider を from-any に設定します。
- The call will be forwarded to を Direct to employee (match by DID) に設定します。
着信ルーティングの設定
発信ルーティングの設定
実際に発信するためには Outbound routing の設定が必要になります。 設定するには以下のようにします:
- Call Routing → Outbound routing から Add a new rule を押下します。
- Rule name を適当な名前に設定します。
- Number begins with を適当なプレフィクスに設定します。
- The rest of the number consist of the specified number of digits の値を削除します。
- Before you start the call cut off の値はプレフィクスの番号の桁数と同一に設定します。
- Through the provider は対象のプロバイダを選択します。
発信ルーティングの設定
他の PBX の端末に電話を掛ける
他の PBX の端末に発信するには、プレフィクスに続いて相手局の内線番号に掛けます。
他の PBX の端末に電話を掛ける
実運用上の留意点
ここでは、実運用で得られた知見を共有します。
実際の電話機を接続したい!
MikoPBX による IP 電話網に実際の電話機(黒電話も!)を接続できます。 このために、YAMAHA RT57i などの VoIP ルータを利用します。 これについては、後日、別の記事で解説します。
(追記)公開されました! VoIP ルータを使って黒電話を IP 電話機にする
日本語の呼出音の修正
MikoPBX には日本語用の案内音声や信号音の一式をまとめたセットがあります。 しかし、この設定ファイルに記述されている日本語の呼出音(電話を掛けたときのプルプルプルの音)には誤りがあるかもしれません。 この呼出音をそのまま利用していると、一部のモデム等が呼出音を話中音と勘違いして正常に通信できない場合があります。
該当する MikoPBX の設定ファイルは /etc/asterisk/indications.conf です。 MikoPBX の Web UI では、左側に表示されるメニューの System にある System file customization から確認・編集できます。 該当部分は [jp]
セクションの ring =
から始まる行です。
[jp]
description = Japan
ringcadence = 1000,2000
dial = 400
busy = 400/500,0/500
ring = 400+15/1000,0/2000
congestion = 400/500,0/500
callwaiting = 400+16/500,0/8000
dialrecall = !400/200,!0/200,!400/200,!0/200,!400/200,!0/200,400
record = 1400/500,0/15000
info = !950/330,!1400/330,!1800/330,0
stutter = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400
ここで ring の値である 400+15/1000,0/2000
は次のような意味を持ちます:
- 400 Hz の信号と 15 Hz の信号とを同時に 1000 ミリ秒出力する
- 無音を 2000 ミリ秒出力する
- 以上を無限に繰り返す
ここで問題があるのは 1. の部分です。 NTT の公開している技術参考資料を参照すると、呼出音は “400±20 Hz 以内を 15 以上 20 Hz 以下の信号で変調(変調率 85±15 % 以内)” と記述されています。 より厳密には、事業用電気通信設備規則(昭和六十年郵政省令第三十号)に規定があり、第三十三条に規定されています(条件は別表第五号に示されています)。 上の設定ファイルの記述はこれを満たしていません。 よりそれらしい呼出音を記述した ring の値は 400*15/1000,0/2000
であるはずです。
しかし、400*15/1000,0/2000
を記述しても変調率が足りず、一部のモデムでは話中音に勘違いされてしまいます。 この問題は、変調波を 20 Hz にしたり(400*15/1000,0/2000
)変調後の信号成分を直接記述したり(385+400/1000,0/2000
)することで回避できます。 変調後の信号成分を直接記述すると、変調率の高い信号を得ることができるため、こちらをおすすめします。
これらを踏まえて、上の設定ファイルを編集するために sed(1) を利用する例を示します。 この例では、[jp]
セクションの ring[[:space:]]*=
から始まる行全てを置き換えています。
sed -i -e '/^\[jp\]$/,/^\[.*\]$/ {' \
-e '/ring[[:space:]]*=/c\ring=385+400/1000,0/2000' \
-e '}' "$configPath"
上の設定ファイルを適用するには MikoPBX 全体を再起動する必要があるかもしれません。 特に、Docker 上の MikoPBX の場合、docker compose
を実行しなおす必要があるかもしれません。
電話番号の名付けかた
YAMAHA RT57i などの日本の VoIP ルータを利用する場合、日本の電話番号と同様のルールで電話番号(内線番号や局番)を設定することで、トラブルを避けられるかもしれません。 しかし、必ずしもこのように設定する必要はありません。
日本の固定電話の番号は 0AB-CDE-FGHJ で表され、0AB〜J 番号と呼ばれます。 ここで、先頭の 0 は国内プレフィクス、ABCDE は局番(市外局番と市内局番)、そして FGHJ は加入者番号です。 これを見ると、内線番号は加入者番号にあたりますから、内線番号の桁数は 4 桁にしておくと良さそうです。
また、110 や 119、177 などの 1 から始まる番号は 1XY 番号と呼ばれており、特別な用途に使われています。 VoIP ルータによっては、この番号に対して特別な処理をしている場合があるため、避けたほうが良さそうです。 つまり、加入者番号の先頭の数字は 2–9 にしておくと良さそうです。
局番についてはまちまちですが、ABC の部分に 0 は含まれないようです(一部の例外があります)。 なんとフリーダイヤルの 0120 は局番ではありません! 面倒ごとを避けたいのであれば、局番は 1–9 で始め、0 を含めるべきではなさそうです。
PBX 間ホップ
電話網が成長し、多くの PBX をもつようになると、全ての PBX の間で相互接続を行うことは大変困難になると思われます。 PBX 間ホップはこの問題を解決します。
System → System file customization から /etc/asterisk/extensions.conf を選択します。 Mode を Add to end of file に変更し、以下の内容を追記することで、PBX 間のホップを実現できます。 これにより、例えば、東京広域電話網の MKNETEL 局と接続されていて PEPEPPER 局と接続されていないような局から 0-510-0-617-1005 のようにコールすることで MKNETEL 局を踏み台に PEPEPPER 局の端末を呼び出すことができます。 しかし、プレフィクス番号や内線番号として先頭に 0 のつくものは利用できなくなります。
[applications]
exten => _0.,1,Answer()
same => n,Gosub(all_peers,${EXTEN:1},1)
same => n,Hangup()
おわりに
おわりです。
スクラップ “令和にもなって VoIP 電話網を作ろうとしているお前らへ” には、より多くの技術速報が投稿されているかもしれません。 興味があれば目を通してみてください!
謝辞
飽きの来ないネタを提供し、そして様々な技術サポートを提供してくれた yude 氏に心から感謝します。 電話機や各種機器の購入を渋る私の財布の紐を緩め、そして電話網の発展にこの上なく献身してくれた Jiminy 氏に心から感謝します。 実際に電話網を構成し、多くの発見をしてくれた東京広域電話網のメンバ諸氏に謝意を示します。
参考
- 鈴木利雄, 川治健一, 関口理希, 石川智士, 伊藤智博, 立花和宏. 日本の家庭を隅々までつないだ黒電話. 科学・技術研究. 2016, Vol.5, No.1, pp.123–128. DOI:10.11425/sst.5.123
- 総務省. 令和 6 年版 情報通信白書. 総務省. p.120. https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r06/pdf/00zentai.pdf
- 島津忠承. NTT東西の固定電話がIP網へ完全に移行、電話交換機が役割を終える. 日経クロステック(xTECH). 2024-12-15. https://xtech.nikkei.com/atcl/nxt/news/24/02003/, (Accessed 2025-01-13).
- VoIp-Info.jp contributors. Asterisk indications.conf. VoIp-Info.jp. Updated 2016-05-27, (Accessed 2024-12-18).
- 東日本電信電話株式会社. 電話サービスのインタフェース 第 6.1 版. Web116.jp. 2023-09, (Accessed 2024-12-18).
Discussion