きり丸の技術日記

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

2024-01-01から1年間の記事一覧

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を拡…

Pythonのpandasで月の第2営業日を求める

始めに 各月の第2営業日に処理したいバッチ処理がありました。 PythonのpandasのCustomBusinessMonthBeginで営業日を計算できそうだったので、各月の営業日を求める方法を記載します。 環境 Python 3.12.3 holidays 0.50 pandas 2.2.2 実装 祝日と営業日につ…

Pythonのpandasで3営業日後を調べる

Pythonで営業日換算するときにpandasの型に営業日換算できる型があったので素振りしました。 なお、個人的にpolarsというpandasよりも高速処理できるライブラリに移行しようとしていますが、polars側には今回紹介する型がないので自作する必要があります。 …

SQLAlchemyで同一項目でアプリとDBの値を変更する(hybrid_property)

例えばDBで論理削除しているユーザを画面上で表示する際に「削除済ユーザ」と表示したい。PythonのSQLAlchemyであれば、画面上の表示は「削除済ユーザ」としつつ、DBの値は元の「きり丸」としておくことが可能です。 今回の記事では、SQLAlchemyを使用してア…

Pythonでswitch文を書きたい(match, パターンマッチング)

Pythonでは3.10からパターンマッチングができるようになりました。Pythonではswitchではなく、matchで他言語のswitchと同等機能を提供できます。なお、当然ながらswitch文がない3.10以前はif... elif... elif... elseしかできないです。 環境 Python 3.12.3 …

MissingGreenletが起きたときの対応

処理高速化のためにSQLAlchemyを非同期処理で使用していると、気を付けないとMissingGreenletというエラーが発生します。その対策をブログにします。 環境 Python 3.12.3 sqlalchemy 2.0.30 ゴール AsyncSessionを使用している最中に、次のエラーが出たとき…

【Git】マージ済みのリモートブランチをローカルブランチから削除する

Gitでブランチを切って開発しているとローカルブランチはすぐに複数増えてしまいます。今回の記事では、リモートリポジトリが存在しない場合にローカルブランチもワンライナーで削除するためのメモ。 環境 Git 2.34.1 WSL Ubuntu 22.04.4 LTS ゴール マージ…

FastAPIのHTTPExcrptionはログに出しても空文字列の可能性がある

FastAPIでHTTPExceptionをログに出力しようとした時のメモ。 環境 Python 3.12.3 FastAPI 0.103.1 0.110.0 対応 少し古いFastAPIのライブラリなら、reprを使用してシリアライズしてください。もし、strで検証しても空文字列でなければ、そのままでも問題あり…