PyCon APAC 2024参加レポート

小門照太@_skokadoです。今回はインドネシアで開催されたPyCon APAC 2024で登壇してきたので、その登壇内容をはじめイベント全体の内容を共有します。

PyCon APAC開催概要

PyCon APACはアジア太平洋地域におけるPyConのオーガナイザグループであり、毎年持ち回りで開催されています(ちなみに昨年2023年は日本で開催されました⁠。

PyCon APAC 2024会場入口
PyCon APAC 2024会場入口
PyCon APAC 2024の開催概要
開催日時 ワークショップ、スプリント:2024年10月25日(金)
カンファレンス:2024年10月26日(土⁠⁠、27日(日)
開催場所 インドネシア ジョグジャカルタ
URL https://2024-apac.pycon.id/

参加の目的

プロポーザルが採択され、スピーカーとして30分のセッションで登壇しました。

発表したトークのタイトルは「Developing Python Libraries Using Rust」でした。せっかくなので、登壇記録としてプロポーザルの提出から発表本番に至るまでの過程を簡単に記しておこうと思います。

テーマを選んだ理由

今回のトークは2024年9月に開催されたPyCon JP 2024で話したものと同じ内容でした[1]

また、私はそれまでRust言語に入門したことはなく「Rustはどうやら便利らしい」という印象しか持っていませんでした。しかし昨今はRye、uv、pydantic-coreなどRustで実装されたPython向けのツール、ライブラリがリリースされ、その使い勝手の良さや有用さが評価され始めていると感じていました。

「⁠⁠Pythonで利用できるライブラリをRustで実装する⁠とはそもそもどういうことか」を知ることをきっかけにRust言語にも入門したいと考え、トークのテーマに選びました。つまり今回のトークは完全に「登壇ドリブン学習」でした

準備

以下がPyCon JPおよびAPACでの発表に至る簡単な時系列です。

  • 5月31日:プロポーザル期限(PyCon JP 2024⁠
    • ※期限ギリギリで提出
  • 7月11日:採択通知(PyCon JP 2024)
  • 7月14日:プロポーザル期限(PyCon APAC 2024)
    • ※期限ギリギリで提出
  • 8月2日:採択通知 (PyCon APAC 2024)
  • 9月28日:発表本番(PyCon JP 2024)
  • 10月26日:発表本番(PyCon APAC 2024)

PyCon APACにプロポーザルを提出したのはPyCon JPの採択通知の後でした。同僚のrhoboro(PyCon JPで採択されたのに加えて)APACにプロポーザルを提出したとのことで、同じようにノリで提出しました [2]

社内Slackのやり取り
社内Slackのやり取り

PyCon JPとAPACのスケジュールの差はちょうど1ヵ月程度でした。そのためPyCon JPで発表した内容、資料を英語に翻訳して準備するのにちょうど良いタイミングだったと思います。

発表内容

改めて発表タイトルは「Developing Python Libraries Using Rust」⁠日本語版: ⁠Rustを活用したPythonライブラリの開発⁠⁠)でした。

発表中の筆者
発表中の筆者

本題はRust言語の概要と、Rustを使ってPythonライブラリを開発する方法について、でした。PyO3maturinによるサンプルコードを例に、Rustで実装したコードをPython向けにビルドする方法を説明しました。またベンチマーク結果として、一般的にPythonよりも処理速度が速いことを紹介しました。

エラトステネスの篩:Rustが最も高速だった
エラトステネスの篩:Rustが最も高速だった
愚直に素数を求める例:Cython(c++)とほぼ同じパフォーマンスだった
愚直に素数を求める例:Cython(c++)とほぼ同じパフォーマンスだった

最後に実際の活用例としてpydantic-coreの実装にも触れました。これは上記で説明したPyO3/maturinが利用されており、Pythonにおいて人気なフレームワークで、すでに導入されていることがわかりました。

発表資料、サンプルコードはGitHubから参照できるようになっていますので、ぜひご覧ください。

発表を終えて

PyCon JPでもそうでしたが、発表後は多くの方が話しかけてくれたり「Rustに入門してみようと思った」といった感想を伝えてくれてとても嬉しかったです。

「登壇ドリブン学習」から始まりPyCon JP、APACと2ヵ月続けての登壇が終わり、ほっとしています。約4ヵ月間におよぶイベントが終了した感じで充実感があり、プロポーザルを提出して本当に良かったです。

カンファレンスでの登壇はプロポーザルを提出しない限り機会を得られません。プロポーザルのテーマを⁠後で考えよう⁠とか⁠後で提出しよう⁠と考えてて期限を過ぎてしまうことは意外とよくあることなのではないかと思います。

勢い半分でもいいから"プロポーザルを出す!"ことの重要さを改めて実感しました。また、PyCon APACのプロポーザル提出のきっかけを与えてくれた同僚rhoboroにも感謝です。

印象に残ったキーノート⁠The Language of Programming Languages

Anthony Shaw氏のキーノート
Anthony Shaw氏のキーノート

我々開発者がプログラミング言語を扱う上での自然言語との関係性についてのトークでした。

プログラミング言語とは人間からコンピューターへ命令するためものですが、このトークでは人間同士のコミュニケーションを切り口とした自然言語に焦点があてられました。

はじめに

前半では、プログラミングと自然言語の歴史的な関係性について述べられました。

  • Pythonコーディングをするときは、2つの言語を知っている必要がある。英語Python
  • 3分の2のプログラミング言語は英語を母国語でない作者によって生み出された
  • しかし、プログラミング言語の構文には英語が用いられている
    • それは英語が世界で最も話者人口が多いから
プログラミングと自然言語
プログラミングと自然言語

システムで使用される言語

続いてコンピューターシステム内の「言語」の役割について述べられ、システムの多言語対応のための基本的なメカニズムとしてUnicode/UTF-8を含めた言語基盤について取り上げられました。

Unicode標準:160以上の文字体系、160,000以上の文字
Code Character
U+06A0 ڠ
U+B420
U+4740
U+A9C5
U+1F910 🤐
基本多言語面(BMP:Basic Multilingual Plane)の紹介
基本多言語面

今日、UTF-8はさまざまな環境で標準として受け入れられているが、Pythonは未対応

  • ASCII互換
  • JSON、TOML、YAML
  • 多くのテキストエディタやウェブサイト
  • プログラミング言語: Node.js、Go、Rust、Java
  • Python
Pythonではバージョン3.15からUTF-8をデフォルトに採用する予定(PEP686)
Pythonではバージョン3.15からUTF-8をデフォルトに採用する予定

LLMと言語

講演の後半ではLLMにおける多言語化の状況や課題、またLLM言語を活用してどのように言語の壁を取り払うか、というビジョンについて述べられました。

  • Multilingual Large Model and Curse of Multilinguality(大規模多言語モデルと多言語の呪い⁠
    • …大規模言語モデルを英語以外の言語で利用すると精度が下がってしまう場合がある。
  • 言語モデルに与える文章(プロンプト)はトークンに変換される
  • 頻繁に出現する(英語の)単語は固有のトークンを持つが、そうでない単語は複数のトークンで構成される
  • 約96%のトークンは英単語で、残りの4%は他の言語によるもの
  • したがって、言語モデルを英語以外で利用しようとしても同じようには反応しない
    • ヒンディー語では、同じ文でもトークン数が最大10倍になってしまう例も
トークンの変換によく使われる「バイト対符号化」(BPE:Byte Pair Encodin)
バイト対符号化

言語モデルには「文脈」を与えるとより効果的になる。たとえば「これを翻訳してください」と単に言うのではなく、実際に何をしようとしているのかという情報を与える。以下は効果的なプロンプトの例。

I'm writing an email to a colleague at work and want to introduce myself in Javanese.
What would be a formal introduction that is friendly and encourages us to work together well?

(職場の同僚にメールを書いていて、ジャワ語で自己紹介をしたいと思っています。
友好的で、一緒にうまく仕事ができるように促すような正式な自己紹介はどのようなものでしょうか?)

まとめ

総括として述べられた「Calls to Action(行動喚起⁠⁠」というスライドの要約です。

  • 英語が母国語でない人々を受け入れるコミュニティを奨励しよう
  • 英語が母国語でない人向けのツールやリソースを開発しよう
  • 英語が母国語でない人との仕事では、コミュニケーションの主言語に母国語を使おう
  • 英語圏以外の人がプログラミング言語にアクセスしやすくするためのプロジェクトに貢献、支援しよう
  • 英語を話す人は、新しい言語を学ぼう!

途中のスライドではジャワ語をもじった⁠JawaScript⁠という架空の言語を紹介したり、Pythonインタプリタのスタックトレースをインドネシア語にカスタマイズした例を動作させたりして、聴衆の興味を引くトークでした。プログラミング言語とは違う切り口の「言語」について、開発者同士のコミュニケーションについてもフォーカスされた、とても興味深い内容でした。

印象に残ったトーク⁠Don't break your library users

発表概要は以下のように紹介されています。

PyPI is full of amazing libraries. How did they do it? What does it take to keep a library relevant? What is the art of compatibility? Who are the users and where to find them?

Pythonライブラリの提供者に対して、ユーザーの利便性を維持する秘訣や互換性についての内容でした。発表者の過去の経験に基づき、具体的なコード例やそれらの教訓について話されました。

例⁠型チェッカーの破壊

はじめに、引数の変更がmypyなどの静的ツールや型チェッカーに与える影響について、例示を踏まえて紹介されました。

以下の関数コードがあったとする。

def order(food: str, quantity: int):
  if food == "Bakso":
    return cook_bakso(quantity)
  elif food == "Bakmi":
    return prepare_bakmi(quantity)
  else:
    raise ValueError("Only Bakso or Bakmi")

これを以下のように型ヒントを変更することを考える。

- def order(food: str, quantity: int):
+ def order(food: Literal["Bakso", "Bakmi"], quantity: int):
    if food == "Bakso":
      ...

これは安全かそうでないか?

関数の処理で行っていることはfood == "Bakso"という比較演算であり、これはstr型のみに限定されない[3]

このような場合に、Literal["Bakso", "Bakmi"] と型ヒントを変更してしまうと、利用者の静的チェッカーのテストを壊してしまう場合がある。

テストの破壊

続いて、ユーザーがテストでモックを使用している場合に、そのテストに破壊的変更を及ぼすケースが紹介されました。

class Warung:
-    def order(self, food: str): ...
+    def order(self, foo: str | bytes): ...

変更前の状態でユーザーがWarungクラスをモックしていた場合にも、型チェッカーによってエラーを発生させることとなる。

class MockWarung(Warung):
    def order(self, foo: str): ...

#[mypy] Argument 1 of "order" is incompatible with supertype "Warung"; supertype defines the argument type as "str | bytes"

まとめ

ライブラリ開発者が変更を加える際は、ユーザーの視点で考えることの重要さが強調して述べられました[4]。たとえば、ライブラリの新しいバージョンがリリースされたらユーザーはいつか移行する必要があるので、変更を早めに発表したり、移行方法のドキュメントを提供することが重要です。

それ以外に以下の観点が紹介されました。

  • ライブラリ利用者の多数派の影響をよく考えるべき
  • 「ユーザーのことを知る」
  • ユーザーのテストを実行じよう
    • マジで実行しよう
    • 全部実行しよう
    • 過去のバージョンに遡ってテストを実行しよう
  • 概念的なアドバイス
    • 開発者の目線で判断しがちだが、ユーザーの目線を学ぶべき
  • 将来の後悔を最小化する
    • 複数の選択肢がある場合は「ユーザーのコスト」に焦点を当てよう
    • 後戻りすることも重要

また「実践的なアドバイス」も箇条書きされていましたが、詳しい説明はあまりなされず意図を汲み取り切れなかったように思ったので、スライドを紹介するに留めておきます。

実践的なアドバイス
実践的なアドバイス

参加者との交流

キーノートスピーカーのAnthony氏と廊下で話す機会がありました。Anthony氏は9月に開催されたPyCon JPでもスピーカーとして日本に来ていましたが、直接話をするタイミングはありませんでした。

一緒に登壇した同僚とともに、Anthony氏との撮影
Anthony氏と

PyCon JPでのライトニングトークが印象に残っており、それについて聞いてみました。執筆時点(2024/11/4)でまだアーカイブが公開されていないのが惜しいのですが、J-POPの歌詞からマルコフ連鎖を生成して音楽再生とともに画面が動くアプリケーションを動かして、とても盛り上がっていました。

また、PyCon JPのLTで動かしていたアプリのコードも教えてもらいました。

クロージング

カンファレンス最後のクロージングでは、ライトニングトークやクイズイベントが開催されました。

クイズイベントは「PyTrivia」という名前で全15問出題され、正答数や回答速度によるポイントで順位が付けられました(TBSオールスター感謝祭のような形⁠⁠。出題内容はPythonに関することや今回のPyCon APACイベント、またはインドネシアにまつわることなど多岐にわたるもので、参加者として非常に楽しめました。

個人的に印象に残ったのは、Guid van Rossumの累計コミット数を多くの人が正答していて「みんな知ってるの!?」と思いました(たまたまかもしれませんが⁠⁠。私はその問題は不正解でした。

Q:「Guido van RossumのCPythonでのコミット数は?」
「Guido van RossumのCPythonでのコミット数は?」
残念ながら上位に食い込むことはできませんでした
残念ながら上位に食い込むことはできませんでした

最後に、次回のPyCon APAC 2025はフィリピンでの開催に決定したとのこと。日程は2025年3月1日~2日(!!)で、あと4ヵ月程度で開催となります。

PyCon APAC 2025
PyCon APAC 2025
URL:https://pycon-apac.python.ph/

また、プロポーザルの受付期間もすでに始まっています(12月15日まで⁠⁠。

運営スタッフの皆さん。3日間ありがとうございました
運営スタッフの皆さん。3日間ありがとうございました

おわりに

初めての海外登壇(と特に「登壇ドリブン学習⁠⁠)を通して、私自身として新しい技術領域のキャッチアップができたのはとても良い経験になりました。現地カンファレンスの熱量を感じ取れたりPythonコミュニティの一員としていっそう親近感を覚えることができたと思います。

また今回はPyCon JP Association運営の鈴木たかのりさん、寺田さん、清水川さんなど日本のメンバーも多く来ていたのは心強かったです(このお三方はほぼ毎回来られているとのことで、もし海外のPyConに参加する方がいれば連絡してみると、いろいろアドバイスをもらえると思います⁠⁠。

クロージング後、Japanメンバーで記念撮影
クロージング後、Japanメンバーで記念撮影

今後もPyCon JPをはじめ、Pythonコミュニティに携わる機会を作っていきたいと思います。

おすすめ記事

記事・ニュース一覧