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

structlog.get_logger() と configure()

structlogシリーズ、今回(たぶん最終回)は get_logger() について。ソースコードを解説していく前に、まず重要な挙動から。 >>> import structlog >>> from structlog import PrintLogger >>> def logger_factory(): ... print("creating logger") ... ret…

structlogのwrapped loggerとrendererについて

前回までの記事でstructlogの中心となるBoundLoggerの役割とコードについて解説しました。 structlogのBoundLoggerについて (1/n) - methaneのブログ structlogのBoundLoggerについて (2/2) - methaneのブログ ざっくりとシーケンス図にまとめると次のように…

structlogのBoundLoggerについて (2/2)

前回はBoundLoggerのコンテキスト管理とログメソッドについて解説しました。 methane.hatenablog.jp 今回はログメソッドが呼ばれた後の処理についてみていきます。 _proxy_to_logger() まずはログメソッドがどうなっていたかのおさらいです。 # FilteringBou…

structlogのBoundLoggerについて (1/n)

structlogを採用した場合、アプリ側がログを書くために使うインスタンスはBoundLoggerかそれをラップしたクラスのインスタンスになります。このクラスは重要なのでstructlogのドキュメントにもこのクラスのためのページがあります。 www.structlog.org struc…

pyenvを初心者に薦めるのはもうやめよう

Pythonのパッケージ・プロジェクト管理ツールはまだ乱立状態にあって、どれを使えばいいのかわからないから慣れたpyenv+pipを使おうという判断をする人がいるかもしれない。その判断自体は別に否定しないけれども、初心者に教える時にpyenvを教えるのはもう…

ryeをWindowsにインストールする

ryeをWindowsにインストールする方法を調べてみました。 準備 rye をWindowsで使うためには、開発者モードを使うことが推奨されている。 FAQ - Rye 開発者モードを有効にしないとシンボリックリンクが使えなくてジャンクションポイントやコピーが使われるよ…

Goのデータベースドライバが壊れた接続を消す方法

database/sql が壊れた接続をコネクションプールから削除するための、昔からある流れは、Query()やExec()が driver.ErrBadConn を返すと、database/sqlはその接続を閉じてリトライするというものです。 ErrBadConnには接続が壊れたことを示す役割とリトライ…

xor_bytesの高速化

websocketのフレームのマスク処理や暗号化処理などでバイナリデータ同士のxorが必要になることがあります。 Pythonのbytes型はxorを提供していないので自分で実装しないといけないのですが、この時 bytes([x ^ y for (x,y) in zip(data, mask)]) のような内…

pipのキャッシュの管理

MySQL 8.4がリリースされて、定番の「mysqlclient をインストールしたんだけど動かない」という報告が来た。これはpipが以前にビルドしたバイナリをキャッシュして再利用しているためで、前のバージョンのlibmysqlclientにリンクしたバイナリなのでバージョ…

Google Docs の日本語フォント設定と行間

Google DocsでデフォルトのフォントはArialだが、Arialは英字フォントなので日本語部分はブラウザの「標準フォント」が使われる。ページ分けしないDocsに議事録を書く場合などはいいが、ページ分けしたDocsやプレゼンテーションは閲覧者が同一のフォントで見…

タイムスタンプの精度を落とすときは切り捨てろ

とあるプロジェクトでナノ秒からミリ秒への変換で四捨五入してきた人がいて、時刻を扱うときは保存精度未満は切り捨てるべきというのが常識になっていないなーと思ったので。 2023-10-01 を、何年か表示する時に、2024年に丸める人はいないだろう。 13:45 が…

構造化ログに格納するトレースバックのフォーマット

structlogのドキュメントを読んでいると、 structured tracebacksというものが登場する。 structured logging が良いものなのだから、structured tracebacksも良いものなのだろうか? API Reference - structlog 24.1.0 documentation structlog.processors.…

uWSGIで大きいログが壊れないようにする設定

uWSGIがファイルやパイプにログを書くときは、各ワーカープロセスが直接ファイルやパイプに書く場合と、一旦masterプロセスにログを送ってmasterプロセスからログを書く場合があります。 masterプロセスにログを送る設定は --log-master ですが、このオプシ…

構造化ログ用のコンパクトなトレースバック minitraceback

Pythonのデフォルトの例外+トレースバック表示は、主にターミナル表示向けに調整されています。(次のPython 3.13からはカラー表示にも対応する予定です。) ターミナル表示用にフォーマットされたトレースバックは、(もちろんカラーを使わなければ)非構…

Goのerrorがスタックトレースを含まない理由

Twitterでこんな記事を見かけたので。 zenn.dev ジェネリクスの件もそうですが、Goの言語設計は現実主義なのになにか特別なポリシーによるものだと宗教化されてしまって、ファンには勝手に崇拝されてアンチにはディスられがちだなーと感じます。 Goのエラー…

structlogとloggingの併用方法について

Pythonでアプリケーションのロギングライブラリとして標準ライブラリのlogging以外を使うときは、loggingを使ってる既存のコードをどうするかを考えないといけない。アプリケーション自体の中身を全部一気に書き換えるとしても、依存ライブラリがloggingを使…

PythonのマルチスレッドWSGIサーバーの選定

今までuWSGIをシングルスレッド、マルチプロセスで使っていたのだけれども、昔に比べて外部のAPI呼び出しが増えているのでマルチスレッド化を検討している。 uWSGI uWSGIでマルチスレッドを有効にした時は、各workerスレッドがacceptする形で動作する。スレ…

net.ConnのReadとWriteの振る舞いについて

Go-MySQL-DriverでカスタムのDialをサポートしていたり圧縮プロトコルサポートのコードをレビューしていたりして、利用している Write() の実装が多様化してきたので、「Write(p)って Read(p)みたいに n が len(p) より小さい場合にループで続きを書き込まな…

Go-MySQL-Driver v1.8.0 をリリースしました

github.com/go-sql-driver/mysql (a.k.a. Go-MySQL-Driver)のv1.8.0をリリースしました。 個人的に重要だと思う点を紹介していきます。 charset/collationの扱い ちょうどGREEさんのBlogで話題になっていた件です。 go-sql-driver/mysql も MySQL 8.0 もデフ…

構造化ログから構造化イベントへ

オブザーバビリティ・エンジニアリング作者:Charity Majors,Liz Fong-Jones,George Mirandaオーム社Amazon オブザーバビリティ・エンジニアリングの5章のタイトルは「構造化イベントはオブザーバビリティの構成要素である」です。構造化イベントの定義は5.1…

構造化ログのタイムスタンプ形式

みんなtai64nを使おう。と言いたいところだけれど、サポートしてるところが見当たらないのでナシだ。 個人的に好きなのはナノ秒単位のUnixタイムスタンプだ。 OpenTelemetryのOTLPでもナノ秒タイムスタンプを使っている。 "logRecords": [ { "timeUnixNano":…

構造化ログのフォーマット logfmt vs JSON lines

構造化ログのプラクティスをあちこちで調べていたら、logfmtを推奨する記事を見つけたので調べてみました。 先に結論を言うと、JSON linesを使っておくのが良さそうです。 logfmt について logfmtとはスペース区切りで key=value を並べたフォーマットです。…

Goのライブラリに対する再現コードを置く場所

Goのライブラリのメンテナをしていると、再現コード付きのIssue報告をもらうことがあります。 さて、そのサンプルコードをどうやって動かせばいいでしょうか?ディレクトリを作って go mod init して、、、というのは面倒ですよね。 ライブラリのコードにデ…

Ryeを使っていると uv venv が動かない

Ryeを使っている状態で uv venv をすると、次のようなエラーになります。 $ uv venv × Querying Python at `/Users/inada-n/.rye/shims/rye` failed with status exit status: 2: │ --- stdout: │ --- stderr: │ error: unexpected argument found │ --- pyt…

Ryeの中のuvを使う

uvにはまだ self update の機能がありません。 Homebrewにはすでにuvが追加されて頻繁にアップデートされているので、Homebrewユーザーは brew install uv がおすすめです。 Homebrewを使ってない環境でuvをインストールし手軽にアップデートするには 、rye …

uvとRye

先週にRuffを開発しているAstralがuvを発表しました。 astral.sh uvは現在のところはvenv, pip, pip-toolsの基本的な機能を提供していますが、将来は"Cargo for Python"になることを目標にしています。 一見すると乱立しているPythonのパッケージ管理ツール…

resticとRustとCACHEDIR.TAG

古いHDDをUSB外付けケースに入れてバックアップ用に利用しているのですが、rsyncを使ったバックアップやmacのTimeMachineが遅くなるので、最近はrestic を使っています。 resticを使っていて感じたメリットをいくつか紹介しておきます。 効率性 ファイルをそ…

PEP 723がAcceptされて、pipx runで依存ライブラリがあるスクリプトを実行できるようになっていた

時間がなくて議論を追っていなかったのですが、標準ライブラリ以外に依存したスクリプトを手軽に配布・実行するための提案である PEP 722 と PEP 723 がしばらく前から議論されていて、先月にPEP 723の方がAcceptされていました。 PEPのサンプルを引用してお…

ryeでPythonを実行すると "Cannot read termcap database; using dumb terminal settings." が出る

2024/02/26 追記 2/24リリースから改善されたので、下記の対応は不要になりました。 Release 20240224 · indygreg/python-build-standalone · GitHub Rework of the terminfo database on Linux distributions. ncurses now looks for the terminfo database…

Homebrewのmysqlはinnovation releaseを使うので注意

MySQLのInnovation Releaseは新機能の追加だったりdeprecatedなAPIの削除だったりがどんどん入ってきて、しかもバグ修正リリースは存在せずに次のInnovation Release待ちになる。古典的な言い方をすればアルファ版的な存在だ。 Homebrewユーザーは、 brew in…

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。