MariDB Connector/C がデフォルトでSSLを強制するようになった

MariaDB 11.4 がGAになり、SSLが自動で有効になるようになりました。合わせてMariaDB Connector/Cも3.4からデフォルトでSSLを利用し、かつサーバーの証明書を検証するようになりました。 これにより、MariaDB Connector/C 3.4以降のライブラリを利用してMySQ…

小さい文字列からASCII外のバイトを見つけたい

Pythonの内部処理で、与えられたUTF-8の文字列がASCII文字のみを含むかをテストするコードを書いています。 size_t型が8バイトの時、ポインタを char* から size_t* にキャストして、0x8080808080808080ullと論理積を取れば8バイトを一度に処理できます。 単…

"Missing Signed-By in the sources.list(5) entry for" を解消する

開発機をUbuntu 24.04 にアップデートしてしばらく経って、 apt update したときに表示される次のwarningが今更気になった。 N: Missing Signed-By in the sources.list(5) entry for 'http://ftp.riken.go.jp/Linux/ubuntu' 試しに /etc/apt/sources.list …

ワイヤレスイヤホンの高音質通話をやっと体験できた

SOUNDPEATS Air4 Pro というイヤホンを使っていて、結構通話品質が良い。去年発売のモデルだと結構有名なメーカーの製品でも金属管の中を通したかのようなエコーがかかる製品があったりするけれども、このイヤホンはかなり自然な音で通話できる。今はセール…

Python 3.12.7 で msgpack におけるメモリリークが修正された

github.com Python 3.12から参照カウントを固定化するImmortal Objectが導入されたのですが、それがinterned string全てを強制的に固定参照カウントにしてしまっていました。 Pythonの文字列はimmutableなので、短くて大量に同じ値が出てくる可能性がある文…

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 …

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