PyConJP2024に参加・登壇してきました

# はじめに
みずほリサーチ&テクノロジーズ株式会社の @fujine です。
2024/9/27-29に東京で開催されたPyConJP 2024に参加・登壇してきました。

https://2024.pycon.jp/ja

遅ればせながら、本記事では私の発表内容と、他セッションで特に面白かったものを共有させていただきます。

# 私の発表

## あなたのアプリケーションをレガシーコードにしないための実践Pytest入門

https://speakerdeck.com/mhrtech/pyconjp2024-pytest

今年度は`pytest`によるテスト事例を発表させていただきました。いくつかの開発案件にて`pytest`を導入して得られたノウハウをまとめたものです。発表資料は`Marp`で作成しました。

:::note
プログラムは通常、他のモジュール、実行環境、外部API、外部DBなど様々な要素に依存していることが多く、単体でのテストを難しくする要因となります。

これらの依存関係をどのように解消して単体テストできるようにするか、を具体的な事例を多数盛り込んで解説しました。

スライド後半にはテスト駆動開発（`TDD`）のデモを加え、テストファーストな開発手法の有用性を紹介しました。
:::

当日は多くの参加者にご聴講いただきました。この場を借りてお礼申し上げます。

以降の章では、私が特に面白いと感じたセッションを順不同で抜粋してご紹介します。

# Day1

## 5年分のツケを一気に払った話

https://speakerdeck.com/soogie/5nian-fen-notukewo-qi-nifu-tutahua

「ドキュメントが無い、テストも無い、開発者もいない」という**三重苦なレガシーコードをいかに苦労して改善したか**、のサクセスストーリーです。

パッケージ単体の互換性問題ならまだしも、パッケージ同士の依存関係が複雑だと問題解決がさらに困難になるため、セッションの苦労話はとても共感できました。

（最後のスライドで私の発表を少し宣伝していただけたようです。ありがとうございます！）

## ORM と向き合う

https://speakerdeck.com/hoto17296/orm-toxiang-kihe-u

便利だけとメンテが大変なORM、なぜ必要なのか、どうして辛いのか、他に方法は無いのか、といった疑問点を深掘りしています。

結構分かりやすいのに内容は深いです。全てをPythonだけで何とかしようとするのではなく、「**必要な責務さえ果たせるならば他言語のサービスを組合せても良い**」という発想の転換は大事だと思います。

「**無慈悲なインピーダンスミスマッチ**」はパワーワードですね笑

## MLOpsの「あるある」課題の解決と、そのためのライブラリgokart

https://speakerdeck.com/mski_iksm/mlopsno-aruaru-ke-ti-nojie-jue-to-sonotamenoraiburarigokart

データ・特徴量・パラメータ値・モデルやパイプライン全体の管理って結構大変ですよね。`Kaggle`などのコンペでも大量の試行錯誤を行うことが多いため、機械学習やるなら個人・チームを問わず`MLOps`は重要な技術要素だと思います。

`gokart`は初見でしたが結構簡単に使えそうな印象でした。これまで`scikit-learn`の`Pipeline`や`mlflow`を使ってましたが、`gokart`も試してみようかな。

## PythonのHTTPクライアントツール 徹底比較

https://speakerdeck.com/tatsuki12/pythonnohttpkuraiantoturu-che-di-bi-jiao

`requests`、`httpx`、`aiohttp`の比較セッションです。

`requests`は昔からお世話になってますが、これからは`requests`をベースにしつつ非同期処理もサポートしている`httpx`への切替を検討してみます。


## FastAPIでのasync defとdefの使い分け

https://speakerdeck.com/takashi1029/fastapidenoasync-deftodefnoshi-ifen-ke

「並行処理、並列処理、非同期処理は何がどう違うのか」がとても分かりやすかったです。

`async/await`はまだまだ初心者ですが、今年から`FastAPI`を勉強中なのでしっかり覚えていきたいです。

# Day2

## 【招待講演】PythonのUTF-8化

https://docs.google.com/presentation/d/1HXmhIMObv1_76OruS6cDARWreARuudachrgOvXXdDho

CPythonコアデベロッパーの方による講演です。`UTF-8`への移行にってこんなに大変だったんですね。

私の会社PCはずっとWindowsなので、`CP932`エンコーディングに起因するエラーには何度も悩まされました...2026年のPython3.15が待ち遠しいです。

## Pythonで 日本語処理 入門 〜フリガナプログラムを作ろう〜

https://slides.takanory.net/slides/20240928pyconjp

`SudachiPy`による日本語の形態素解析とフリガナ処理を学べるセッションです。日本語処理では`GiNZA`も有名ですが、[内部の形態素解析では`SudachiPy`が使われています](https://github.com/megagonlabs/ginza?tab=readme-ov-file#works-applications-enterprise--sudachisudachipy---sudachidict---chive)。

（私は昔`janome`を愛用していたのですが、こうした言語処理は辞書の精度とボリュームが命なので、今は`SudachiPy`推しです。）

初心者向けの分かりやすい内容なため、Pythonで言語処理を始めて学ぶ方の学習コンテンツにも適しています。

## Streamlining Testing in a Large Python Codebase 

https://www.slideshare.net/slideshow/pycon-jp-2024-streamlining-testing-in-a-large-python-codebase-pdf/272062717

ソースコードの増加に伴う自動テストの実行時間の増加をいかに削減するか、という内容です。マルチコアによる並列テスト、インストールパッケージのキャッシュ、テスト済みコードの再テストやカバレッジのスキップ、などが紹介されています。

ちなみに`pytest`にも、`--last-failed`や`--failed-first`といった[前回失敗したテストケースから再開する](https://docs.pytest.org/en/stable/how-to/cache.html)オプションがあります。

:::note warn
`Skip Unnecessary Tests and Linters`の章ですが、**モジュール同士に依存関係がある場合、変更していないプログラムのテストが失敗する**可能性はあります。リグレッションテストを行うのであれば、一部をスキップせず全テストケースを実行するのが確実でしょう。
:::

## Pythonの数学機能を学ぼう！ その仕組みも学ぼう！

https://speakerdeck.com/curekoshimizu/pythonnoshu-xue-ji-neng-woxue-bou-sonoshi-zu-moxue-bou

普段何気なく使っている`int`や`float`がどのように実装されているのかをディープダイブできます。

- プログラミング言語によって、`n + 1 ≠ n`が保証されるかどうかは異なる
- `-5〜256`以外の整数値は動的に生成される
- [整数の精度に上限がない](https://docs.python.org/ja/3/library/stdtypes.html#numeric-types-int-float-complex)（メモリが許す限り表現できる）のはなぜか
- `int("1" * 4301)`はなぜ[エラー](https://docs.python.org/ja/3/library/stdtypes.html#integer-string-conversion-length-limitation)になるのか
- Python3.13で追加される`FMA`とはどんな数学関数なのか

など、数値を扱う奥深さを体感することができ、驚きの連続でした。

## 「巨人の肩の上」で自作ライブラリを作る技術

https://speakerdeck.com/upura/pyconjp2024

自作ライブラリ開発のポイントを紹介しています。
いきなりプログラムを書き始めるのではなく、

- 既存の類似パッケージや文献を調査し、「車輪の再発明」を回避
- 泥臭い調査を経て、自作ライブラリの要件を精緻化
- 要件をテストケースに落とし込み、テストファーストに開発

という開発スタイルは、自作ライブラリに限らず通常のシステム開発でも大いに有益だと感じ、とても共感できました。

## SQLModel入門 〜クエリと型〜

https://docs.google.com/presentation/d/1M1lyWhkIKTZLMbeikIqelNormVmolq8vfxFzu33qK3c

`SQLModel`による型安全なモデル定義やクエリの実装ノウハウです。全体で116枚、おまけも含めると146枚のスライドは読み応えがあります！

`FastAPI`と`SQLAlchemy`を組み合わせることは多いので、`SQLModel`で作ったモデルをそのまま`FastAPI`のレスポンスに使えるのは結構便利ですね。私も`SQLModel`を使ってみたいと思います。

> みなさんもCfPへの盛り込みすぎには気をつけましょう🥲

私もCfpに盛りすぎちゃってスライド作成が大変だった同志です。

## Rustを活用したPythonライブラリの開発

https://docs.google.com/presentation/d/1XJvbkwfhVvmOb-PAOr6paHhAvo6LC0GGRen-uM2rhBw

Rust製Pythonパッケージの開発手法を紹介しています。近年は`Ruff`や`PyDantic`など、Rust実装により高速化を図ったパッケージが増えてきましたね。

Rustは全く門外漢ですが、コードさえ書ければPythonへの組み込みは意外と難しくなさそうな印象でした。Python自体も[Faster CPython](https://github.com/markshannon/faster-cpython)プロジェクトにより徐々に高速化されており、今後の更なる性能改善が期待されます。

## データサイエンスのフルサイクル開発を実現する機械学習パイプライン

https://speakerdeck.com/carta_engineering/machine-learning-pipeline-realize-full-cycle-development-in-data-science

`MLOps`の改善事例です。`Luigi` → `Amazon SageMaker` → `Prefect`というワークフロー・パイプラインの変遷を通じて、当時の課題や解決方法の模索を追体験できます。

Python製ワークフローでは`Airflow`が真っ先に思い浮かびましたが、`Prefect`も結構使いやすそうですね。

`Airflow`は`MWAA(AWS)`、`Cloud Composer(Google Cloud)`、`Azure Data Factory`など主要なプラットフォームにも統合されている点が強みですが、小規模な開発と運用であれば`Prefect`から始めてみるのもアリだなと思いました。

## 実践Dash - 手を抜きながら本気で作るデータApplicationの基本と応用

https://speakerdeck.com/shinyorke/dash-for-python-and-baseball

`Dash`によるローコードな可視化ツール作成のセッションです。`Steamlit`よりも（比較的）レイアウト変更が柔軟でデータ可視化に強い、のが`Dash`の特徴のようです。

> どんなLow-codeでもちゃんとやろうとするとLowじゃなくなる

はまさに真理で、「要件やこだわりを思い切って削れる覚悟」が無いと追加機能がどんどん膨らんで結果的にハイコード開発になりがちだなぁと実感しています。

## Pythonで3次元CGを作りたい人のためのPyVista入門

https://aesthetic-toffee-c06202.netlify.app/

3DのCGを作成できる`PyVista`の紹介です。基本的な形状のポリゴンやテクスチャマッピング、光源の設定など、代表的な処理ができるようです。3D開発って敷居が高いイメージでしたが、こんなに簡単にできるとは驚きでした。

## Pythonと相互運用可能な静的型付け言語Erg

https://docs.google.com/presentation/d/12GhRTQqOUQEmnf1P0af_LDHRESK0UNhnzrjXRz0P4jc

Pythonの欠点を補完することを目的とした新言語`Erg`開発のプレゼンです。どのような言語にも何らかの欠点がある中、外部パッケージに頼るのではなく「新しい言語を開発する」というモチベーションは凄いと思います。

## プロダクションでのPython非同期ユースケース - Trio/Trio-Utilを中心に

https://speakerdeck.com/jrfk/trio-utilwozhong-xin-ni

ロボットを自律制御するための非同期処理の開発事例です。

非同期処理=`asyncio`と思いがちですが、あえて外部パッケージの`Trio`を当時採用した理由やその効果が解説されています。「構造化された並行性（`Structured Concurrency`）」という概念は勉強になりました。

ところで`nursery`（保育園）ってAPI名はセンスありますね。

## Getting Started with Open Source Contributions

https://stefaniemolin.com/getting-started-with-open-source-talk/

オープンソースプロジェクトに貢献するための心構えやアドバイスについてのトークです。

1. 初心者に優しく、活発で、自身の関心が強いプロジェクトを選ぶ
1. まずはドキュメントの加筆・修正から始め、コントリビュートの手順を習得する
1. イシューを眺め、自分が取り組めそうな課題を探したり、イシューにコメントする
1. バグのレポートや修正を通じて、メンテナーとの対話を深める
1. 自身のアイディアや機能追加を提案してみる

のように、難易度が低いものから徐々に取り組むことで、最初から大きな失敗をすることなく継続的にコントリビュートできそうです。

> Be polite and patient in all interactions.
>（あらゆるやり取りにおいて、礼儀正しく辛抱強くあること）

は特に大事なスタンスだと感じました。

## pytestプラグインを開発してDRYに自動テストを書こう

https://speakerdeck.com/inuatsu/pytest-puraguinwokai-fa-site-dry-nizi-dong-tesutowoshu-kou-c1a94f2c-e878-49e4-af46-b50e52d9eea1

複数のプロジェクトで共通的に使用するテスト用処理をプラグイン化した話です。

プラグイン開発と聞くと難易度が高そうですが、`pytest`では意外と簡単に作れるんですね。プロジェクト数が増えて`conftest.py`の管理が大変になってきたらやってみようと思いました。

# まとめ
本記事では、PyConJP2024の発表スライドを紹介させていただきました。

次回のPyConJP2025は、2025/9/26-27に広島にて開催予定です。来年度のCfpにも応募予定ですので、また会場で発表できる日を楽しみにしております。

https://pyconjp.blogspot.com/2024/10/pyconjp2025-co-chair.html