きり丸の技術日記

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

Basic認証込みのNGINXイメージを扱う(beevelop/nginx-basic-auth)

簡単にBasic認証を実装したり検証したりするためにNGINXを使用しつつ、ついでにBasic認証まで含めているDockerイメージがあったので素振りしました。

環境

  • Docker
    • 26.0.0
  • beevelop/nginx-basic-auth

対応

localhost:80にアクセスしたらBASIC認証がかかっており、認証成功したらlocalhost:8080で公開しているサイトに対してリダイレクトしている例です。BASIC認証はデフォルトで次のパスワードになっています。

  • id
    • foo
  • password
    • bar
services:
  web:
    image: dockercloud/hello-world
  auth:
    image: beevelop/nginx-basic-auth
    ports:
      - 8080:80
    links:
      - web:web

設定できる環境変数は少ないので、Docker ImageのGitHubを読むと確認できます。

備考

クラスメソッド株式会社様が公開しているページもあったのですが、記事で使用しているイメージのquay.io/dtan4/nginx-basic-auth-proxyが古すぎるのでエラーで起動しませんでした。今回紹介したイメージは2023年10月19日に最新がプッシュされているので、イメージが古いということは無さそうです。

docker run -d -p 80:80 quay.io/dtan4/nginx-basic-auth-proxy
Unable to find image 'quay.io/dtan4/nginx-basic-auth-proxy:latest' locally
latest: Pulling from dtan4/nginx-basic-auth-proxy

docker: [DEPRECATION NOTICE] Docker Image Format v1 and Docker Image manifest version 2, schema 1 support is disabled by default and will be removed in an upcoming release. Suggest the author of quay.io/dtan4/nginx-basic-auth-proxy:latest to upgrade the image to the OCI Format or Docker Image manifest v2, schema 2. More information at https://docs.docker.com/go/deprecated-image-specs/.
See 'docker run --help'

終わりに

BASIC認証を元に検証したい内容があったのですが、Dockerイメージで最初からBASIC認証がかかっているとありがたいですね。

普通に調べるとNGINXの設定を頑張って設定する記事しか見つかりませんでした。もちろん、正攻法なのでこちらの記事が多いことはいいことですが。

簡単に検証できる環境ができてうれしいです。

参考情報

ハードウェア予約済みのメモリを減らす(軽くなるかも)

最近、自宅のPCでプログラミングをしていると非常に重くなり、フリーズを頻発してしまっています。そのため、早めに買い換えたいのですが、買い替えるまでに対応できることがないか思考錯誤したときのメモ。

なお、これを行ったことにより改善ができたわけではないので、あとで設定値を微調整をする予定です。

環境

  • Windows 11
  • AMD Ryzen 7 5800H with Radeon Graphics
  • メモリ 16GB

対応

自宅のPCがフリーズを頻発する原因はメモリが100%近くまで使用していることだと考えていたので、ハードウェア予約済みのメモリを減らす方向にしました。デフォルトのハードウェア予約済みのメモリが2GBから2.1GBほど使用していたので、これを減らします。

BIOS・UEFI設定画面に遷移する

次のコマンドを実行することで、シャットダウン後にBIOS設定画面へ遷移します。

shutdown /r /o /f /t 00

※ 他の方法もありますが、今回はこの方法を使用しました。

UMA Frame buffer Sizeを変更する

BIOSかUEFI設定画面のどこかにUMA Frame buffer Sizeを設定している箇所があります。その値がハードウェア予約済みのメモリを指しているので変更します。

変更後、タスクマネジャーを見るとハードウェア予約済みメモリが減っています。

もっと減らすには

  • Discrete Graphics
  • Dynamic Graphics

の上の設定のうち、Discreate Graphics側を選択するとよりハードウェア予約済みメモリを減らせそうです。私の場合は124MBまで削減できました。ただ、この設定まで変更すると、IDE起動時に時間がかかるようになったように感じるので、残しておいてもよさそうです。

終わりに

ゲーム用のグラフィックスとして確保しているメモリなのか、とりあえずデフォルトの2GBまでは不要そうです。2GBで不満なら、そもそもメモリが絶対的に足りていない気がしますが…。

まぁ、もともとはメモリに問題は無かったのですがWSLを使用するようになってからWSLで2GBメモリ消費しているので、ハードウェア予約済みのメモリが2GBから512MBになったことによって快適にプログラミングできればいいなと考えてます。

参考情報

Pydanticの拡張クラスで小文字化まで行う

始めに

PydanticでEmailStrを拡張するという記事を書きました。今回の記事では、PydanticでEmailStrを拡張するで行ったことをさらに拡張して、大文字小文字のどちらでもパラメータを受け取りつつ、小文字化してアプリケーションで受け取れるようにさらに拡張します。

環境

  • Python
    • 3.12.7
  • Pydantic
    • 2.9.2

実装

以前に追加したロジックでvalidate_half_and_full_emailのレスポンスを小文字化します。

from typing import Type, Any
import re

from pydantic import EmailStr, validator, GetCoreSchemaHandler
from pydantic_core import core_schema


class CustomEmailStr(EmailStr):

    @classmethod
    def validate_half_and_full_email(cls, value: str) -> str:
        if not re.search(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", value):
            raise ValueError("ERROR.EMAIL_VALIDATION")
        return value.lower() # ここだけ変更

    @classmethod
    def __get_pydantic_core_schema__(cls, source_type: Type[Any], handler: GetCoreSchemaHandler) -> core_schema.CoreSchema:
        email_schema = handler.generate_schema(EmailStr)
        return core_schema.chain_schema(
            [
                email_schema,
                core_schema.no_info_after_validator_function(
                    cls.validate_half_and_full_email,
                    core_schema.str_schema()
                ),
            ]
        )

次のテストで大文字を小文字化できていることがわかります。

class _Test(BaseModel):
    email: CustomEmailStr

class TestIsValid:
    @pytest.mark.parametrize(
        "value",
        [
            ("aiueo@example.com"),
            ("AIUEO@example.com"),
        ],
    )
    def test_is_lower(self, value):
        assert _Test(email=value).email == value.lower()

ソースコード

終わりに

記事としてはEmailStrを継承しているのでユースケースとしてはかなり狭いのですが、他にも拡張した型を使用することがあると思うのでその時に役に立てばよいかと考えております。

類似情報