PyCon JPのスタッフ活動の中でこんなふうにPython使ってます

PyCon JPのスタッフ活動の中でこんなふうにPython使ってます

Event

オープンソースカンファレンス2021 Online/Spring

Presented

2021/03/06 nikkie

Zoomのチャットでアンケート

ふだんPython書いてますか?

Zoomのチャットでアンケート その2

ふだん書いている方向け

Pythonで何をやってますか?(機械学習、データ分析、etc.)

最初にお願い

  • 顔出し 推奨👨‍💼

  • 質問お気軽に どうぞ💬

    • Zoomのチャット中心に拾います

お前、誰よ

  • 我が名は にっきー @ftnext / @ftnext

  • ふだんPython書いてます

    • 自動化、Webアプリ(プライベート)

    • 機械学習(データサイエンティスト)

お前、誰よ(続)

  • PyCon JP 2021 座長

  • 指針:怠惰、DRY、KISS(最近のブログ) etc.

  • Love anime!!(@ 🎺🎷🔥 🌈 🏔🏕 👩‍🎨🐯🐟 🐴🍚🚿)

PyCon JP (曖昧さ回避)

  • PyCon JP

  • PyCon JP Association

PyCon JP (曖昧さ回避)

  • PyCon JP (イベント)

  • PyCon JP Association

PyCon JP

  • Py thon Con ference as PyCon

  • プログラミング言語Pythonについてのカンファレンス(国際会議)

  • 世界各地で開かれている(オンライン参加、楽しいですよ)

PyCon JP

  • 日本最大級 のPyCon(Kyushu, Shizuoka, Hiroshimaなど地域PyConもあります)

  • 2011年から毎年開催。2018, 2019は参加者 1000名 規模

  • 詳しくは PyCon JP の歴史

PyCon JP 2021

PyCon JP (曖昧さ回避)

  • PyCon JP (イベント)

  • PyCon JP Association

PyCon JP Association

日本国内の Python ユーザーのために、Python の普及及び開発支援を行う為に、継続的にカンファレンス(PyCon)を開くことを目的とした非営利組織

一般社団法人PyCon JP Associationについて

Associationの活動 1/2

  • 「日本国内のPythonユーザのために、Python の普及及び開発支援 を行う」

  • Python Boot Camp(初心者向け Python チュートリアル) 相談会やってます

ref: 2020年のOSCでのAssociationの発表資料

Associationの活動 2/2

  • PyCon JP TVをはじめます!! 👉 YouTube をチェック!

  • PyCon JP(カンファレンス)は、その年の座長に 委託 (nikkieはAssociationのメンバーでは ない です)

AssociationとOSC

よければ見てみてください

PyCon JPのスタッフ活動 の中でこんなふうにPython使ってます

ボランティア

../_images/202103_osc_staff_talk_volunteer_image.jpeg

参加要件はありません

  • やりたい という方は、ぜひ飛び込んで

  • Pythonを触ったことがなくてもスタッフはできます(活躍している方がいます)

  • IT系の職種でなくてもスタッフはできます(活躍している方がいます!)

PyCon JP 2021に向けて現在考えていること

  • タイムテーブル(オンライン/現地併催)

  • スポンサープラン

  • 予算

  • etc.

スタッフ活動の一部を紹介

  • スタッフmtgの ブログ記事 を書く

  • メール でのやり取り(スピーカー、スポンサー)

  • Webサイトの構築

スタッフ申込フォーム

PyCon JPのスタッフ活動の中で こんなふうにPython使ってます

  • nikkieはスタッフ活動でPython使っています

  • 注:使わなければならないという話ではないです

スタッフの考え方(抜粋)

  • やり方は自由

  • 費用対効果を考えよう

https://manual.pycon.jp/staff/attitude.html

nikkieはなぜPythonを使う? 1/2

  • やり方は自由 だから

  • スタッフ活動と並行して、エンジニアとして 力をつけられる 💪道(手を動かす道)を選ぶ

nikkieはなぜPythonを使う? 2/2

  • 費用対効果

  • 繰り返す退屈なタスクを自動化し、省力化 & 毎回 同じ質2x staff 🏋️‍♂️)

  • 自動化できないタスクに人間は注力

Python as PyCon JP staff 事例 1/2

いずれも動作環境はAWS Lambda

Python as PyCon JP staff 2/2

Timetable as YAML

今回紹介する事例

注意事項

  • タイムテーブル作成はマイナーなタスク(みんながやるわけではない)

  • 共有したいのは、Pythonで自動化するときの 考え方

  • 具体的なタイムテーブル作成ロジックに興味ある方は ソースコード をどうぞ

タスク:タイムテーブル作成

  • スタッフ用のタイムテーブル

  • 企画段階で カンファレンスの全体像を描く のに使う

  • Googleスプレッドシートで共有

スタッフ用タイムテーブル(イメージ)

../_images/202103_osc_staff_talk_staff_timetable.drawio.png

スタッフ用タイムテーブル(イメージ)

  • カンファレンスの 全体像 =この時間帯はどの部屋で、基調講演/トーク/パーティー etc.

  • 並行しているトラックが分かる(スタッフ配置のイメージ)

  • 5分刻みで具体化していく(初版は荒く15分刻み)

変更しづらい😫

解決したい課題

タイムテーブル作成をPythonにやらせよう

PyCon JP 2020 タイムテーブルは何回も変更

  • スタッフから意見をもらい、トークの枠を 並べ替え

  • 現地開催➡オンライン開催と方針転換(ベースにしつつも大きく変更)

    • 休憩時間変更で ◯印を移動

トーク並べ替えの例

お昼のあとのトーク、30分➡️45分と並べた

../_images/202103_osc_staff_talk_timetable_before.drawio.png

トーク並べ替えの例

意見を聞いて45分➡️30分に並べ替える

../_images/202103_osc_staff_talk_timetable_after.drawio.png

💡タイムテーブルの出力(◯印)は自動で

解決案

役割分担!

  • 時間帯の変更と 整合するように◯印を並べ替える のがツラい

  • 人間👨‍💼:時間帯だけにフォーカス

  • 機械🤖:時間帯を元に○印を出力(Python🐍にアサイン)

Timetable as YAML 1/2

  • 人間が 時間帯・部屋・コンテンツを配置 し、YAMLで表す

  • 2日間のカンファレンスなら 1日目.yml2日目.yml


- rooms: ["#pyconjp_1", "#pyconjp_2", "#pyconjp_3", "#pyconjp_4", "#pyconjp_5"]
  start: 11:50
  end: 12:35
  title: トーク(45分)

Timetable as YAML 2/2

  • プログラムは入力されたYAMLを元に、タイムテーブル(◯印付き)を出力

  • 出力先としてGoogleスプレッドシートもサポート

Demo


$ python main.py pyconjp2020-day1.yml \
>     --step_min 5 \
>     to_sheet <シートのID> \
>     <サービスアカウントのJSONファイルのパス> \
>     --output_worksheet_name pyconjp2020_day1

Timetable as YAML どう作るか?

  • 登場人物 整理

  • ライブラリ 扱い方 確認

  • 徐々にスクリプトを作る

Timetable as YAML どう作るか?

  • 登場人物 整理

  • ライブラリ 扱い方 確認

  • 徐々にスクリプトを作る

登場人物 整理

Timetable as YAMLの登場人物

  • 入力:YAML形式のファイル

  • 出力:Googleスプレッドシート

登場人物をPythonでどう扱う?

  • Pythonはサードパーティライブラリが 豊富

  • 検索 してメジャーなライブラリを掴む

  • 目的が達成できそうなものを 選択

🔍「python yaml」

🔍「python Googleスプレッドシート」

補足:Googleスプレッドシートにプログラムからアクセス

Timetable as YAML どう作るか?

  • 登場人物 整理

  • ライブラリ 扱い方 確認

  • 徐々にスクリプトを作る

扱い方 確認

  • 使いたいライブラリを pip install (仮想環境を利用しています)

  • ドキュメントの サンプルコード をPythonの 対話モード で実行


(venv) $ python
>>>

PyYAML 扱い方確認

sample.yml


---
- rooms: [Room A, Room B, Room C]
  start: 9:00
  end: 10:00
  title: 素敵なオープニング

PyYAML 扱い方確認


>>> import yaml
>>> with open("sample.yaml") as f:
...     data = yaml.load(f)
...
<stdin>:2: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.

Warningについて:https://github.com/yaml/pyyaml/wiki/PyYAML-yaml.load(input)-Deprecation

PyYAML 扱い方確認


>>> with open("sample.yaml") as f:
...     data = yaml.load(f, Loader=yaml.BaseLoader)
...
>>> data
[{'rooms': ['Room A', 'Room B', 'Room C'], 'start': '9:00', 'end': '10:00', 'title': '素敵なオープニング'}]

Loader=yaml.BaseLoader を指定すると、すべて文字列として読み込まれる

gspread 扱い方確認


>>> import gspread
>>> gc = gspread.service_account()
>>> wks = gc.open_by_key("スプレッドシートのキー").sheet1

https://docs.google.com/spreadsheets/d/<スプレッドシートのキー>/edit#gid=0

gspread 扱い方確認


>>> wks = gc.open_by_key("スプレッドシートのキー").sheet1
>>> rows = [[1, 2], [3, 4]]
>>> # A1, A2, B1, B2に値が入る
>>> wks.update("A1", [[1, 2], [3, 4]])

一行をリストで表す。それを要素とするリストを引数に update を呼び出す

Timetable as YAML どう作るか?

  • 登場人物 整理

  • ライブラリ 扱い方 確認

  • 徐々にスクリプトを作る

徐々にスクリプトを作る

  • 対話モードで確認したコードを少しずつ スクリプトに移す

    • 確認したPyYAMLの使い方を移動

    • 確認したgspreadの使い方(の一部)を移動

  • python -i スクリプト がオススメ

-i オプション(python -i

最初の引数にスクリプトが指定された場合(中略)、スクリプトかコマンドを実行した後にインタラクティブモードに入ります。

https://docs.python.org/ja/3/using/cmdline.html#cmdoption-i

-i オプション

  • スクリプトを実行した後に 対話モードに入る ので、少しずつ作る際に便利

  • 例:ワークシート wks が取得できたら移動してスクリプト実行


$ python -i main.py
>>> # wks を使った処理を試す

Timetable as YAML どう作るか?

  • 登場人物 整理

  • ライブラリ 扱い方 確認

  • 徐々にスクリプトを作る

Timetable as YAML どう作るか?

  • ライブラリは 検索 して掴み、ドキュメント を確認

  • 対話モード-i オプションを駆使して、扱い方を確認。徐々に スクリプトに

  • タイムテーブル作成ロジックの実装はAppendixや GitHub をどうぞ!

まとめ🌯:PyCon JPのスタッフ活動の中でこんなふうにPython使ってます

  • 力をつけるため、楽をするために、Pythonを使っています

  • Pythonで自動化するときの考え方を紹介

  • スタッフやりませんか? 🙏 Help us! 🙏

ご清聴ありがとうございました

フィードバックは ftnext/2021_slides へ(質問Issue歓迎)

References、Appendix が続きます(よろしければどうぞ!)

質問:なぜYAMLを選択?(JSONやTOMLもある)

  • k8sのリソース定義やGitHub Actionsの設定の経験から、YAMLを選択した

  • YAMLの定義に合わせて◯印を配置するので、宣言的 に書くならYAMLという連想(というか偏見)

  • 他の候補としては、INIやTOML

  • JSONは見送り。人に見やすくインデントを入れて、タイムテーブルを表現するのが大変そう

References 関連するアウトプット

Appendix:PyCon JPのスタッフ活動の中でこんなふうにPython使ってます

開発環境

  • Python 3.8.6

  • PyYAML 5.4.1

  • gspread 3.7.0

エントリポイントは薄く

スクリプト作成中のデバッグ

  • if __name__ == "__main__" ブロックのコードは python -i でデバッグ容易

  • 関数には breakpoint() を仕込むのがオススメ(2019 Python言語最新情報 もどうぞ)

dataclass


@dataclass
class Program:
    """ある時間からある時間までのプログラムを表す"""
    start: time
    end: time
    title: str
    rooms: list[str]

https://docs.python.org/ja/3/library/dataclasses.html#dataclasses.dataclass

ファーストクラスコレクション


@dataclass
class Programs(Sequence):
    """Programのファーストクラスコレクション"""
    programs: list[Program]

    def __getitem__(self, key):
        return self.programs[key]

    def __len__(self):
        return len(self.programs)

ファーストクラスコレクション 実装の仕組み

その他、実装で工夫した点

See Issue #34

  • 時間の扱い

    • 文字列 ➡️ datetime.time オブジェクト

    • X分刻みとの足し算

  • argparse with Enum(実験的)

EOF