きり丸の技術日記

技術検証したり、資格等をここに残していきます。

WSLで起動したサーバにiPhone等のモバイル端末からアクセスする

※ 家で検証したときはできなかったのですが、会社で検証したときはできましたので、残しておきます。

WSLで起動したサーバに対してiPhoneやAndroidからアクセスすることでモバイル端末の実機確認をしたかったのですが、単純にWSLのIPにアクセスするだけでは確認できなかったので手順を残します。

環境

  • WSL
    • Ubuntu 22.04.4 LTS

ゴール

iPhoneでWSL上に起動しているサーバにアクセスする。

詳細

管理者権限でコマンドプロンプトを起動します

管理者権限でコマンドプロンプトを起動します。私の過去記事に簡単に管理者権限でアプリケーションを起動する方法を残しているので、参考にしてください。

ホストマシン(Windows)でホストマシンとWSLのIPを調べます

コマンドプロンプトにてホストマシン(Windows)とWSLのIPを調べる。

ipconfig | findstr "IPv4 Address"
# ホストマシン と WSL の IPを調べる
# 例)ホストマシンのIP
# 192.168.10.106
# WSLのIP
# 172.25.208.1

ホストマシンからWSLへのポートフォワードを設定する

直接モバイル端末からWSLのサーバにアクセスできないので、ホストマシンにアクセスしたらWSLに転送する設定します。次の設定だとホストマシンの4200番ポートにアクセスしたら、WSLのサーバに4200番ポートでアクセスします。

ちなみに、4200番ポートはAngularのデフォルトのポートです。

netsh interface portproxy add v4tov4 listenport=4200 listenaddress=0.0.0.0 connectport=4200 connectaddress=172.25.208.1

iPhoneからWSLのサーバにアクセスする

モバイル端末からはホストマシンのIPにアクセスします。

http://192.168.10.106:4200

備考

ポートフォーワード設定を確認したかったり、削除したりしたい場合は次のコマンドを実行してください。

# 現在のポートフォワード設定を確認する
netsh interface portproxy show all

# 設定を削除する
netsh interface portproxy delete v4tov4 listenport=4200 listenaddress=0.0.0.0

自宅で動かなかった理由としては、Wifiのネットワーク分離機能が有効だったので、別端末からアクセスできないようになっていたからだと思われます。

基本は問題ないと思いますが、設定変更したことによって家の機器が接続できなくなったら困るので実施しませんでした。変にセキュリティを緩くする必要もありませんし。

終わりに

WSLはまだまだ難しいですね。ChatGPTも簡単に情報を提供してくれないので、困ったら頑張って解決する必要がありますね。

今後もWSLでハマったらブログに残していきたいです。

類似情報

Gmailでテキストメールを受信して確認する(クライアント問わない方法)

Gmailでテキストメールを送信する方法はたくさん見つかったのですが、受信してテキストメールを確認する方法は見つからなかったのでブログにします。

なお、GmailではHTMLメールとテキストメールを選んで受信はできません。そのため、受信するではなく、受信してテキストメールを確認するが本題です。

環境

  • Gmail
    • 20240320時点

確認方法

テキストメールを確認したいメールのソースを確認する

確認したいメールを開き、「︙」をクリックしてメッセージのソースを確認を選択します。

デコードしてテキストメールを確認する

メッセージのソースからテキストメールの箇所を探します。text/plainのブロックを探してください。画像では6LO86Kqから始まり、ZS5qcC8Kで終わるブロックです。

今回の場合、Content-Transfer-Encoding: base64というメールヘッダがbase64でencodeされていることを示しているので、こちらをbase64でdecodeするとテキストメールの内容を確認できます。

なお、base64でのencode, decodeが必要ない言語ではそのまま確認できます。

そもそもテキストメールとHTMLメールを両立できるのか

マルチパートメールという仕組みによって、テキストメールとHTMLメールを両立できます。ファイル添付ができるのもこちらの仕組みです。

詳細はSendgrid様のページで解説してくれています。

終わりに

メールについて詳しい仕様を知らなかったので、この方法で確認できるのを最近知りました。GmailがHTMLメールしか受信できないから、受信時にテキストメールを切り捨てているのかと思っていました。

基本的にはHTMLメールの検証だけでよいのですが、ごくまれにテキストメールの検証も必要だったのでこれで検証できると分かってよかったです。

参考情報

testcontainers-pythonでMinioを扱う

testcontainers-pythonでminioを使う際に少々手間どったのでメモに残します。

なお、この記事ではtestcontainers自体のメリット等については記載いたしません。

環境

  • Python
    • 3.12
  • boto3
    • 1.34.69
  • minio
    • 7.2.5
  • testcontainers
    • 4.1.1

ゴール

boto3minioに対してファイルアップロードできたことを検証します。minioについてはtestcontainersでセットアップします。

下準備

testcontainersminiodevDependenciesに加えます。各々のパッケージマネジャで読み替えてください。

rye add --dev minio
rye add --dev testcontainers

minioの起動

まずは、access_keysecret_keyを指定します。指定しない場合のデフォルトはminioadminです。

また、localの検証で使用しているminioと同じimageを指定しましょう。理由はわかりませんが、ライブラリではminio/minio:RELEASE.2022-12-02T19-19-22Z"を指定しています。

起動ポートを修正したい場合はportを指定しましょう。基本的にはデフォルトの9000で問題ないはずです。

from testcontainers.minio import MinioContainer

async def test_01(self):
    config = MinioContainer(
        access_key="minio", secret_key="minio1234", image="minio/minio"
    )

次に、get_client()で起動後のインスタンスを取得します。commandは簡単には渡せなさそうですので、このインスタンスを元に必要なバケットを作成します。今回はtmp.localバケットを作成しました。

次にDocker環境でテストする場合は不要ですが、それ以外の環境でテストする場合はTestContainersを外部からアクセスすることになるので、外部ポートを知る必要があります。minio.get_config()["endpoint"]でエンドポイントの情報を取得してください。今回の私は環境変数のS3_URLに格納しています。

with config as minio:
    minio_client = minio.get_client()
    minio_client.make_bucket("tmp.local")
    os.environ["S3_URL"] = minio.get_config()["endpoint"]W

そのほかに取得できる情報としては次のとおりです。

{
  'endpoint': 'localhost:32841',
  'access_key': 'minio',
  'secret_key': 'minio1234'
}

boto3をセットアップする

今まで設定したaccess_keysecret_keyS3_URLboto3の作成時に渡してください。

import os

import boto3  # type: ignore

boto3.client(
    "s3",
    endpoint_url=f"http://{os.getenv('S3_URL', 'localhost:9000')}",
    aws_access_key_id="minio",
    aws_secret_access_key="minio1234",
)

ファイルアップロードする

ファイルアップロードするロジックはboto3の使い方なので省略します。詳細はソースコードを見てください。

アップロードしたファイルを検証する

minioのインスタンスを操作すればアップロードしたファイルを確認できます。

minio_client.get_object("任意のbucket", "任意のキー").data

ソースコード

終わりに

miniotestcontainersのexampleとしては問題ないのですが、実際にboto3からアクセスしようとしたときにポートが分からなくて困りました。最終的な本番環境ではS3を使用する人が多いと思うので、boto3の方がexampleとしては嬉しいんですがね…。

ただ、今回testcontainersを使用してみましたが、正直な感想としてはテストが遅くなるのでちゃんとユースケースは絞って利用したいですね。並列実行のテストをするときに、今回のtestcontainersは役立つと思われます。

参考情報