PowerShellコマンドラインでお手軽にスピードテストを実行する (With Speedtest by ookla)

# とにかくお手軽にスピードテストがしたいぞ
webブラウザーを開いて[fast.com](https://fast.com)とか[SpeedTest by Ookla](https://speedtest.net)とかを確認すればよいのはわかるんだれけども「手元でコマンド1発でやりたいぞ!!」と思ったのでちょっと調べてみたら簡単にできたので備忘録として記事にしました。

# Ooklaが様々な環境用にCLIで使えるスピードテストのアプリを出している
まずは[Ooklaのページ](https://www.speedtest.net/apps/cli)をご覧いただくとわかるのですが
  * macOS
  * Windows (64bit版のみ)
  * Linux
  * FreeBSD

の環境にそれぞれCLIのアプリケーションを提供しています。
本記事は以降、Windowsをターゲットにアプリケーションの導入について記載します。

## WindowsにSpeedtest CLIを導入する
本節では導入方法を2つ紹介します。
1つはwebページから実行ファイルをダウンロードしてくる方法。もう一つはwingetを用いて導入する方法です。

### 1. webから実行ファイルをダウンロードしてくる
このページの読者は大体文字だけで行けるだろうという前提でかっ飛ばして説明すると
1. [ダウンロードページ](https://www.speedtest.net/apps/cli)の下の方に「Download for Windows」のボタンがあるのでクリック
1. zipファイルがダウンロードされるので、然るべき手順で展開(一応ウィルススキャンはかけてね)
1. フォルダーの中にreadme.mdとspeedtest.exeか入っている。
1. readme.mdはMarkdown形式の取り扱い説明書、speedtest.exeがコマンドラインでスピードテストを実施する実行ファイル
1. あとは自分の好きな場所に配置して、環境変数のPATHに配置場所を追加してやればWindows TerminalなりPowerShellコンソールウィンドウなりでスピードテストを実行することができます。
※なお、speedtest.exeをダブルクリックで実行するとテストを実施した後ウィンドウが閉じるので、必ずターミナルウィンドウを開いて実行してください。

### 2. wingetを使って導入する
```powershell:キーワード「speedtest」でリポジトリを検索
winget search speedtest
```
を実行するとこんな感じでパッケージ一覧が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352775/025372f7-90e3-771c-b38c-328dc653b475.png)

一番下に「Speedtest CLI」というのが居ます。こいつがOoklaが提供しているSpeedtestのCLI版になります。
こいつを導入するので
```powershell:wingetでOokla.Speedtest.CLIを導入
winget install Ookla.Speedtest.CLI
```
を実行します。
実行が完了すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352775/08995063-b7f2-d984-b9e7-3cc6c31d7423.png)
という具合に、環境変数の設定まで自動でしてくれます。マーベラス!!
ターミナルウィンドウを1度閉じて(Windows Terminalもコマンドプロンプトも１度プロセスを終了しないと環境変数の更新が適用されない)再度開けば``Speedtest``でコマンドが実行できるはずです。

### 【盛大な勘違い】ターミナルウィンドウを閉じて開きなおしてもspeedtestコマンドが見当たらない
```powershell:speedtestコマンドを探してみる
Get-Command | Where-Object -Property Name -Like "*speedtest*"
# 結果が返ってこない
```
という事象にあたりました。
環境変数を確認したところ、ユーザー環境変数のPATHにSpeedtestの実体が保存されているパスが設定されていたので「これはもしや再起動しないとダメ??」と再起動してみましたが、状況は変わらず……
まさかね?と
```powershell:speedtestのバージョン情報を表示させてみる
speedtest --version
```
すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352775/02d76ec3-4f59-50b4-eee4-c010334a83ec.png)
と結果が返ってきました。

つまるところ、PowerShellコマンドレットに``speedtest``というコマンドレットやエイリアスは追加されません!!
あくまでも「speedtest.exe」という実行可能ファイルがシステムに追加されるということになりますので
上の``Get-Command``で探すというのはそもそも筋違いという話でした。

# 実際に実行してみる。
では、色々実行してみた結果を貼り付けて終わりにしたいと思います。
ますばオプション何もなし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352775/55b9d0b5-a9f7-827c-d67f-e417956d4e82.png)
下りと上りの回線速度以外にサマリーページのURLまで載ってきますね。

## おまけ speedtest.md (Version1.2.0)を和訳しました。
導入の1.でも2.でもspeedtest.mdを読むことができます。(パスを通した状態でspeedtest.mdを開くと普通に開ける)
ただ、英語でしたので手元にあるVersion 1.2.0版の日本語訳をPowerShellのコメントルールベースで記述したものを置いておきます。
**追記**
2023-02-22: Get-Helpでパラメーターのヘルプが正常に取得できなかったのでテキスト形式として掲載。

```text:speedtest.mdの日本語訳
<#
.SYNOPSIS
speedtest(5) - Speedtest CLI by Ookla はあなたのインターネットコネクションにおけるスピードとパフォーマンスをテストするためのコマンドラインベースの公式クライアントです。

.DESCRIPTION
speedtestはクライアントと近くのスピードテストサーバー間におけるネットワーク接続の遅延、ジッター、パケットロス、ダウンロード側で、アップロード速度を測定するためのアプリケーションです。

.PARAMETER -h, --help
使い方の説明を表示しします。

.PARAMETER -v
ログの詳細さを設定します。複数設定することで詳細度が上がります(例 -vvv)

.PARAMETER -V, --version
バージョン情報を表示します。

.PARAMETER -L --servers
近くのサーバーを表示します。

.PARAMETER --selection-details
選択したサーバーの詳細を表示します。

.PARAMETER -s id, --server-id=
近くのサーバーで表示されたサーバーをID番号で指定します。

.PARAMETER -o hostname, --host=
近くのサーバーで表示されたサーバーをホスト名で指定します。

.PARAMETER -f <format_type> --format=<format_type>
出力フォーマットを指定します(デフォルトは human-readable)。
出力フォーマットは
    human-readable : 対話式フォーマット
    csv            : Comman Separated Value形式
	tsv            : Tab Separated Value形式
	json           : JavaScript Object Notation (コンパクト) 形式
	jsonl          : JavaScript Object Notation (  複数行  ) 形式
	json-pretty    : JavaScript Object Notation ( 整形済み ) 形式

.PARAMETER --progress-update-interval=<interval>
進捗を更新する頻度を100から1000[ミリ秒]の間で指定します。

.PARAMETER --output-header
CSVまたはTSV形式の出力ヘッダーを表示します。

.PARAMETER -u <unit_of_measure>, --unit=<unit_of_measure>
出力フォーマットが human-readable の際に使用する速度の単位を指定します。
デフォルトは Mbps です。
速度の単位は以下の通りです。

10進オプション(1000の倍数です)
     bps : ビット毎秒
    kbps : キロビット毎秒
    Mbps : メガビット毎秒
    Gbps : ギガビット毎秒
     B/s : バイト毎秒
    kB/s : キロバイト毎秒
    MB/s : メガバイト毎秒
    GB/s : ギガバイト毎秒

 2進オプション(1024の倍数です)
    kibps : キビビット毎秒
    Mibps : メギビット毎秒
    Gibps : ギビビット毎秒
    KiB/s : キビバイト毎秒
    MiB/s : メギバイト毎秒
    GiB/s : ギビバイト毎秒

.PARAMETER -a
出力フォーマットを auto-decimal-bits にするショートカットです。
auto-decimal-bits  は単位を10進ビットとして自動で設定します。

.PARAMETER -A
出力フォーマットを auto-decimal-bytes にするショートカットです。
auto-decimal-bytes は単位を10進バイトとして自動で設定します。

.PARAMETER -b
出力フォーマットを auto-binary-bits にするショートカットです。
auto-binary-bits   は単位を 2進ビットとして自動で設定します。

.PARAMETER -B
出力フォーマットを auto-binary-bytes にするショートカットです。
auto-binary-bytes  は単位を 2進バイトとして自動で設定します。

.PARAMETER -P <decimal_places>, --precision=<decimal_places>
小数点以下桁数を設定します(デフォルトは2、最大8)。
出力フォーマットが human-readable の時のみ利用可能です。

.PARAMETER -p <yes|no>, --progress=<yes|no>
プログレスバーを有効または無効にします(対話モードでのデフォルトはyesです)。

.PARAMETER -I <interface>, --interface=<interface>
サーバーに接続する際に特定のインターフェースをバインドするよう試行します

.PARAMETER -i <ip_address>, --ip=<ip_address>
サーバーに接続する際に特定のIPアドレスをバインドするよう試行します

.PARAMETER --ca-certificate=<path>
バンドルするCA証明書のパスを指定します。
Linuxマシンの標準では以下のパスのCA証明書がチェックされます。
    /etc/ssl/certs/ca-certificates.crt
    /etc/pki/tls/certs/ca-bundle.crt
    /usr/share/ssl/certs/ca-bundle.crt
    /usr/local/share/certs/ca-root-nss.crt
    /etc/ssl/cert.pem

スピードテストを実行するマシンに上のファイルがない場合は、
curlプロジェクトが提供する正規の最新CA証明書バンドルを
特定の場所に手動でダウンロードすることができます。
この特定の場所は、次の例のようにパラメータとして提供することができます。
    wget https://curl.se/ca/cacert.pem
    ./ookla --ca-certificate=./cacert.pem

.PARAMETER <CommonParameters>
CommonParametersはサポートしていません。

.NOTES
・出力結果について
結果は、レイテンシー、ジッター、ダウンロード、アップロード、パケットロス（利用可能な場合）、
および結果URLを含んでいます。
レイテンシーとジッターはミリ秒単位で表示されます。ダウンロードとアップロードの単位は、
出力形式と単位が指定されているかどうかに依存します。
人間が読める形式のデフォルトはMbpsで、機械が読める形式（csv、tsv、json、jsonl、json-pretty）は
最大精度でバイトを単位にします。パケットロスはパーセンテージで表され、実行中のネットワーク環境で
パケットロスが利用できない場合は「Not available」と表示されます。
バイト/秒の測定値は、バイト/秒の値を125,000で割ることにより、人間が読みやすい出力形式の
デフォルト単位であるメガビット（Mbps）に変換することが可能です。

例えば
    38404104バイト/秒 = 38404104 / 125 = 307232.832 キロビット/秒
        = 307232.832 / 1000 = 307.232832メガビット/秒

125という値は、1000 / 8から次のように導き出されます。
1バイト=8ビット
1キロビット=1000ビット

    1秒間に38404104バイト = 38404104 * 1バイトあたり8ビット = 1秒間に307232832ビット
        = 307232832 / 1000ビット/キロビット = 307232.832キロビット/秒

Result URLに".png "を付加することで、共有可能な結果画像を作成することができます。

・ネットワークタイムアウトの値
標準ではネットワークリクエストのタイムアウトは10秒に設定されます。
ネットワークの遅延テストで例外が発生した時のみ15秒に設定されます。

・エラーについて
深刻なエラーが発生すると、アプリケーションは0以外の返り値を返して終了します。
初期化エラーの例:
    サーバーに接続できませんでした(ネットワークに到達できません)
	設定の取得または読み込みができませんでした(設定エラー)
実行時エラーの例
[ERROR]: [1] HTTPの遅延テストに失敗しました。
[ERROR]: [36] ソケットを開けませんでした: 動作が進行中です。
[ERROR]: ホスト名の解決に失敗しました。テストを中止します。
[ERROR]: ホスト解決に失敗しました。実行フォーマットエラー
[ERROR]: ソケットを開けませんでした。ルーティングエラー
[ERROR]: サーバー選択 - 稼働中のテストサーバーが見つかりませんでした

.EXAMPLE
$ speedtest
   Speedtest by Ookla

      Server: SUNET - Stockholm (id: 26852)
         ISP: Bahnhof AB
Idle Latency:     5.04 ms   (jitter: 0.04ms, low: 5.01ms, high: 5.07ms)
    Download:   968.73 Mbps (data used: 117.5 MB)                                                   
                 12.10 ms   (jitter: 1.71ms, low: 6.71ms, high: 18.82ms)
      Upload:   942.13 Mbps (data used: 114.8 MB)                                                   
                  9.94 ms   (jitter: 1.10ms, low: 5.30ms, high: 12.72ms)
 Packet Loss:     0.0%
  Result URL: https://www.speedtest.net/result/c/d1c46724-50a3-4a59-87ca-ffc09ea014b2


.LINK
EULA
https://www.speedtest.net/about/eula

.LINK
Terms of use
https://www.speedtest.net/about/terms

.LINK
Privacy Policy
https://www.speedtest.net/about/privacy
#>
```

## 参考
https://www.speedtest.net/apps/cli

https://nyanshiba.com/blog/auto-speedtest/

https://qiita.com/tomatosum/items/40cc34015b1aa96bfc63

https://learn.microsoft.com/ja-jp/previous-versions/windows/powershell-scripting/hh847834(v=wps.640)?redirectedfrom=MSDN

https://learn.microsoft.com/en-us/powershell/scripting/developer/help/comment-based-help-keywords?view=powershell-7.3