きり丸の技術日記

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

技術

AngularのValidatorを変更するならupdateValueAndValidityも呼ぶ

始めに タイトルの出オチ記事です。 Angularにて、状態によってユーザーをnameで検索したり、emailで検索するinputがありました。 emailの場合は完全一致してほしいので、入力値がemail形式であることを検証し、nameの場合は検証しないようにしたいです。 今…

Gitにコミットした中身を検索する (目的行の変更ハッシュを探したいときに)

始めに 小ネタ。ライブラリを管理しているときに、いつから依存関係に含まれているか、削除されているかを調べるために使用したコマンドを残します。 ユースケース 特定の記載が入ったコミットを探す 環境 git 2.43.0 実装 次のコマンドで、uv.lockに含まれ…

Dockerをzstdで圧縮する。少しでも軽くしたい

始めに 先日の記事にて、FastAPIのイメージが1GBになってしまった件を書きました。何か対策できないかと調査していく中で、gzipではなく、zstdで圧縮することで高い圧縮率と高い解凍速度を達成できることを知りました。 今回の記事ではzstdでDockerイメージ…

Rust製のPythonライブラリは軽いと思ってた

始めに pydantic等のPythonのライブラリはコア部分がRustで書かれていて、Pythonでも十分な処理速度が確保されている、という表現をされることがあります。 そのため、基本的にはRustで作られたライブラリに移行しようとして、テンプレートエンジンのjinja2…

正規表現の\wは使う時は注意。特にOpenAPI

始めに 正規表現には\wというメタ表現があります。私のプロジェクトではフロントのTypeScript, バックエンドにRuby, Pythonを使用しておりました。 もともとは正規表現を使用しないチェックロジックを使用していましたが、それぞれの言語で実装漏れが発生し…

JetBrains IDEでcURLをhttpファイルにコピペすると修正してくれる

始めに 小ネタ。タイトルだけの出オチ記事。 環境 PyCharm 2024.3.1 Professional Edition 例 httpファイルに一般的なREST APIのcURLをコピー&ペーストすると次のように変換されます。 curl -X 'POST' 'http://localhost:8000/tasks' -H 'accept: applicatio…

DataGripで接続先をまとめたい(JetBrains製ならどれでもOK)

始めに 現在、私は複数のプロジェクトに参画していて、保守作業する際には接続先をプロジェクトごとに切り替える必要があるのですが、すべて接続先をフラットに管理していました。接続先名で無理やりprefixを付与して管理していたのですがDataGripにはフォル…

nullは不明値なのでnullで一意制約をかけられない

始めに レコードの有効期間を表示したいときに、start_at, end_atのカラムを用いて表現していました。そして、end_atがnullの場合にアクティブなレコードとして表現しようとしていました。しかし、このやり方ではデータの管理方法に失敗するとアクティブなレ…

Pythonでflatmapをする

始めに 小ネタ。PythonでNestした配列に対して、flatなデータにしたいと思った時の処理を残します。 環境 Python 3.13 実装 構造が2階層だけならfrom itertools import chainのlist(chain.from_iterable(input_))を使用する。 from itertools import chain a…

PyCharmでuvから生成される.venvをSDKに指定する

始めに 小ネタ。 PyCharmにてryeやuvを直接指定することはまだできませんが、uvから生成される.venvは指定可能だということに気付いていなかったのでそれを記載するだけのメモです。 環境 PyCharm Professional 2024.3 ※ PyCharm Communityでもできるかもし…

ビルド時間短縮のために途中ステージをpushする

始めに 弊社のシステムではECSを使用しているのですが、ここ最近Dockerイメージのビルド時間が大幅に延長されてしまっていました。そのうち、大幅な時間を占めているのがライブラリのインストール時間で、CPUの使用率が高くなって応答が非常に遅くなっていま…

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

簡単にBasic認証を実装したり検証したりするためにNGINXを使用しつつ、ついでにBasic認証まで含めているDockerイメージがあったので素振りしました。 環境 Docker 26.0.0 beevelop/nginx-basic-auth 対応 localhost:80にアクセスしたらBASIC認証がかかってお…

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

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

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

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

PydanticでEmailStrを拡張する

始めに pydanticにはEmailStrというemailを検証するための拡張クラスがあります。しかし、Emailの仕様としてはUTF-8を許容しているものの、システム的にはASCIIしか許容したくないことがあります。その場合に向けて、EmailStrを継承してASCIIのみ許容する拡…

Pythonでgroup_byしたいならdefaultdictを使う

始めに Pythonでデータをグループ化する際、defaultdictを使用すると簡単かつ効率的に実装できます。この記事では、defaultdictを使ったgroup_byの実装方法と、itertools.groupbyとの違いについて解説します。 環境 Python 3.12.6 実装 defaultdictを使用す…

【障害】SentryのtracePropagationTargetsの指定を誤った

Sentryの設定を軽い気持ちで変更したところ大規模障害につながってしまったので、もう忘れないようにするためのメモ。 環境 @sentry/angular-ivy 7.144.0 発生事象 S3へのファイルアップロードに失敗した。 原因 tracePropagationTargetsの指定を誤ってしま…

PydanticのJsonはそのまま使わないほうがいい

始めに PydanticにはJsonという便利な型があります。便利ではあるのですが、素のJson型では開発しづらい点があったので自分のアプリケーションでは拡張して使っています。 今回の記事では何に困ったのか、どのように拡張したのかを記載します。 環境 Python …

SQLAlchemyで大文字小文字を区別せず比較する(lower, ilike)

始めに email等の項目は大文字小文字を区別せずに比較したいことがあります。 その場合には小文字化して比較することになります。今回の記事では、PythonのSQLAlchemyで使用するlowerとilikeを素振りします。 環境 Python 3.12.3 SQLAlchemy 2.0.31 lower DB…

SQLModelで親と一緒に子テーブルを削除する(cascade_delete, ondelete)

始めに 外部キー制約があるレコードを削除するとき、参照元テーブルよりも参照先テーブルを先に削除する必要があります。 Railsの場合、次のようにdependentに定義しておくと、Parentテーブルを削除したタイミングでChildテーブルも削除されます。 class Par…

SQLAlchemyではselectinloadを使うのが安定

始めに 自分用メモ。sqlalchemyではeager loadをする際にsubqueryloadとselectinload等々さまざまなload方法を指定できます。 しかし、片方はdeprecatedまでは設定されていませんが、非推奨なloading方法なのでそれを忘れないようにするための記事です。 環…

Pydanticではミュータブルでもdefault, default_factoryのどっちでもよさそう

結論 pydanticではdefaultもdefault_factoryも同等の結果を返却しそう。 始めに 小ネタ記事。Pythonではデフォルト引数にミュータブルな値を指定したうえで、ミュータブルな操作を行うと、同じインスタンスを共有してしまいます。 def default_param(param: …

Pythonのenumをintで継承しなくてもIntEnumが標準化されてた

始めに 過去にPythonのenumはint等のプリミティブ型を継承すると便利という記事を投稿していました。 その後、Python3.11にてIntEnumやStrEnumが標準化されていることを知ったので共有します。 環境 Python 3.12.4 実装 intEnumの使用方法は次のとおりです。…

FastAPIでDIのメソッドにパラメータを渡す(同期も非同期も)

始めに FastAPIにてメソッドやクラスをDIできますが、DI時に部分的に処理を差し替えたい時があります。その時にパラメータを渡せば処理を差し替えられますが、少々ハマったのでそれをブログにします。 環境 Python 3.12.4 FastAPI 0.112.0 実装 同期処理の場…

FastAPIで任意のHttpStatusと任意の型を返却する(JSONResponse)

始めに FastAPIではHTTPExceptionを使用すればHttpStatusを200以外でも返却可能です。しかし、エラー詳細は1つしか返却できません。ファイルのエラーハンドリングでは多数のエラーが発生した場合には、複数のエラーを返却したいユースケースがあります。 Exc…

PythonのPydanticでdatetimeのシリアライズフォーマットを決める

始めに Pythonにてアプリケーション内ではdatetimeとして扱いつつ、APIとしてはYYYY-mm-dd等の特定のフォーマットの文字列で返却したいことがあります。 今回はPydanticを用いて実装する方法を記事にします。 環境 Python 3.12.4 Pydantic 2.8.2 実装 field_…

FILTER関数で足りない行を見つける(Google スプレッドシート)

始めに 小ネタ。 更新系処理にて1000レコードあるemailが含まれているCSVをアップロードしたときに、DB側には999レコードしかない時には1レコード足りないために処理が失敗するとします。その場合どのレコードがDBに足りないかを調査する必要があります。 今…

【詳細不明】NoInspectionAvailable を回避する

始めに ※ 自宅で検証した際には実装できなかったので詳細は不明です。 テスト実装中に次のエラーが発生しました。 E sqlalchemy.exc.NoInspectionAvailable: No inspection system is available for object of type <class 'models.User'> 発生原因が不明ですが、発生しないように</class>…

Ngrokで無料プランでドメインを固定できるようになっていた(2023/08/16 以降できたらしい)

2023年8月16日からできるようになっていたのを、単純に知らなかったので共有するだけのブログです。 ローカルで外部からAPIを実行する検証をしたい時があります。たとえばWebhookの検証だったり、Outlook連携の検証だったり。 そのときにローカルのAPIをHTTP…

PythonでSoftAssersionをする(use pytest-check, avoid assertion roulette)

自動テストの原則として、1テストに1検証とした方が良いです。これが複数あった時には失敗箇所が分かりづらくなってしまうため、その状態をバッドパターンとしてAssertion Rouletteと呼びます。 今回の記事では、PythonのTestフレームワークであるPytestを拡…