オープンソースカンファレンス2021 Online/Spring
2021/03/06 nikkie
ふだんPython書いてますか?
ふだん書いている方向け
Pythonで何をやってますか?(機械学習、データ分析、etc.)
顔出し 推奨👨💼
質問お気軽に どうぞ💬
Zoomのチャット中心に拾います
PyCon JP 2021 座長
指針:怠惰、DRY、KISS(最近のブログ) etc.
Love anime!!(@ 🎺🎷🔥 🌈 🏔🏕 👩🎨🐯🐟 🐴🍚🚿)
PyCon JP
PyCon JP Association
PyCon JP (イベント)
PyCon JP Association
Py thon Con ference as PyCon
プログラミング言語Pythonについてのカンファレンス(国際会議)
世界各地で開かれている(オンライン参加、楽しいですよ)
日本最大級 のPyCon(Kyushu, Shizuoka, Hiroshimaなど地域PyConもあります)
2011年から毎年開催。2018, 2019は参加者 1000名 規模
詳しくは PyCon JP の歴史
10/15(金)、16(土)に仮決定!
ティザーサイト Coming soon ...
スタッフ募集中!! 🙏 Help us! 🙏
PyCon JP (イベント)
PyCon JP Association
日本国内の Python ユーザーのために、Python の普及及び開発支援を行う為に、継続的にカンファレンス(PyCon)を開くことを目的とした非営利組織
「日本国内のPythonユーザのために、Python の普及及び開発支援 を行う」
Python Boot Camp(初心者向け Python チュートリアル) 相談会やってます
PyCon JP TVをはじめます!! 👉 YouTube をチェック!
PyCon JP(カンファレンス)は、その年の座長に 委託 (nikkieはAssociationのメンバーでは ない です)
2019 Python言語最新情報
Pythonのアップデート情報の整理(例:Python 3.7~ dataclass)
2020 Python開発環境の整え方
Pythonのインストール、venvなど
よければ見てみてください
やりたい という方は、ぜひ飛び込んで
Pythonを触ったことがなくてもスタッフはできます(活躍している方がいます)
IT系の職種でなくてもスタッフはできます(活躍している方がいます!)
タイムテーブル(オンライン/現地併催)
スポンサープラン
予算
etc.
スタッフmtgの ブログ記事 を書く
メール でのやり取り(スピーカー、スポンサー)
Webサイトの構築
nikkieはスタッフ活動でPython使っています
注:使わなければならないという話ではないです
やり方は自由
費用対効果を考えよう
やり方は自由 だから
スタッフ活動と並行して、エンジニアとして 力をつけられる 💪道(手を動かす道)を選ぶ
費用対効果
繰り返す退屈なタスクを自動化し、省力化 & 毎回 同じ質 (2x staff 🏋️♂️)
自動化できないタスクに人間は注力
自動で止まるSlackリマインダー (Googleスプレッドシートから投稿)@ PyCon JP 2020
いずれも動作環境はAWS Lambda
JIRA/Confluenceのチェック(実装中)
プロポーザルレビュー Webアプリ @ PyCon JP 2020
他のスタッフが作業を進めやすくするための 環境整備
今回紹介する事例
タイムテーブル作成はマイナーなタスク(みんながやるわけではない)
共有したいのは、Pythonで自動化するときの 考え方
具体的なタイムテーブル作成ロジックに興味ある方は ソースコード をどうぞ
スタッフ用のタイムテーブル
企画段階で カンファレンスの全体像を描く のに使う
Googleスプレッドシートで共有
カンファレンスの 全体像 =この時間帯はどの部屋で、基調講演/トーク/パーティー etc.
並行しているトラックが分かる(スタッフ配置のイメージ)
5分刻みで具体化していく(初版は荒く15分刻み)
解決したい課題
タイムテーブル作成をPythonにやらせよう
スタッフから意見をもらい、トークの枠を 並べ替え
現地開催➡オンライン開催と方針転換(ベースにしつつも大きく変更)
休憩時間変更で ◯印を移動
お昼のあとのトーク、30分➡️45分と並べた
意見を聞いて45分➡️30分に並べ替える
解決案
時間帯の変更と 整合するように◯印を並べ替える のがツラい
人間👨💼:時間帯だけにフォーカス
機械🤖:時間帯を元に○印を出力(Python🐍にアサイン)
人間が 時間帯・部屋・コンテンツを配置 し、YAMLで表す
2日間のカンファレンスなら 1日目.yml
と 2日目.yml
- rooms: ["#pyconjp_1", "#pyconjp_2", "#pyconjp_3", "#pyconjp_4", "#pyconjp_5"]
start: 11:50
end: 12:35
title: トーク(45分)
プログラムは入力されたYAMLを元に、タイムテーブル(◯印付き)を出力
出力先としてGoogleスプレッドシートもサポート
$ python main.py pyconjp2020-day1.yml \
> --step_min 5 \
> to_sheet <シートのID> \
> <サービスアカウントのJSONファイルのパス> \
> --output_worksheet_name pyconjp2020_day1
登場人物 整理
ライブラリ 扱い方 確認
徐々にスクリプトを作る
登場人物 整理
ライブラリ 扱い方 確認
徐々にスクリプトを作る
やりたいことの登場人物をまず考え、使うライブラリを決める
参考 岩崎さん 「入門書を読み終わったらなにしよう? 」(スライド19)
入力:YAML形式のファイル
出力:Googleスプレッドシート
Pythonはサードパーティライブラリが 豊富
検索 してメジャーなライブラリを掴む
目的が達成できそうなものを 選択
PyYAML の情報が多く見つかった
ドキュメント が古い(Python 2系での記述)が、他のブログの情報でカバーできた
gspread の情報が多く見つかった
ドキュメントを確認(Quick Example、Authentication、Examples)→ 使いやすそう
Sheets API を呼び出している
Sheets APIの有効化と、認証情報(サービスアカウント)の入手は、GCPのConsoleで操作が必要
サービスアカウントの設定は『仕事がはかどるPython自動処理 全部入り。』を参照した
登場人物 整理
ライブラリ 扱い方 確認
徐々にスクリプトを作る
使いたいライブラリを pip install
(仮想環境を利用しています)
参考:2020 Python開発環境の整え方 (venv
, pip
)
ドキュメントの サンプルコード をPythonの 対話モード で実行
(venv) $ python
>>>
sample.yml
---
- rooms: [Room A, Room B, Room C]
start: 9:00
end: 10:00
title: 素敵なオープニング
>>> 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
>>> 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
を指定すると、すべて文字列として読み込まれる
>>> import gspread
>>> gc = gspread.service_account()
>>> wks = gc.open_by_key("スプレッドシートのキー").sheet1
https://docs.google.com/spreadsheets/d/<スプレッドシートのキー>/edit#gid=0
>>> wks = gc.open_by_key("スプレッドシートのキー").sheet1
>>> rows = [[1, 2], [3, 4]]
>>> # A1, A2, B1, B2に値が入る
>>> wks.update("A1", [[1, 2], [3, 4]])
一行をリストで表す。それを要素とするリストを引数に update
を呼び出す
登場人物 整理
ライブラリ 扱い方 確認
徐々にスクリプトを作る
対話モードで確認したコードを少しずつ スクリプトに移す
確認したPyYAMLの使い方を移動
確認したgspreadの使い方(の一部)を移動
python -i スクリプト
がオススメ
-i
オプション(python -i
)最初の引数にスクリプトが指定された場合(中略)、スクリプトかコマンドを実行した後にインタラクティブモードに入ります。
-i
オプションスクリプトを実行した後に 対話モードに入る ので、少しずつ作る際に便利
例:ワークシート wks
が取得できたら移動してスクリプト実行
$ python -i main.py
>>> # wks を使った処理を試す
登場人物 整理
ライブラリ 扱い方 確認
徐々にスクリプトを作る
ライブラリは 検索 して掴み、ドキュメント を確認
対話モード や -i
オプションを駆使して、扱い方を確認。徐々に スクリプトに
タイムテーブル作成ロジックの実装はAppendixや GitHub をどうぞ!
力をつけるため、楽をするために、Pythonを使っています
Pythonで自動化するときの考え方を紹介
スタッフやりませんか? 🙏 Help us! 🙏
フィードバックは ftnext/2021_slides へ(質問Issue歓迎)
References、Appendix が続きます(よろしければどうぞ!)
k8sのリソース定義やGitHub Actionsの設定の経験から、YAMLを選択した
YAMLの定義に合わせて◯印を配置するので、宣言的 に書くならYAMLという連想(というか偏見)
他の候補としては、INIやTOML
JSONは見送り。人に見やすくインデントを入れて、タイムテーブルを表現するのが大変そう
カンファレンススタッフとしてコードを書いて広げるエンジニアリング・ライフ
July Tech Festa 2020/07
Remote.py #1 2020/05
1つのスクリプトで動かした後、ファイルに分けて切り出した
次に書くとしたらテストコードから
Python 3.8.6
PyYAML 5.4.1
gspread 3.7.0
ファイル分割の裏にある考え方
main.py
を 短く
詳しくは 陶山さん「自信を持ってコードを書こう 」(スライド31)
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)
collections.abc.Sequence
(ドキュメント)を継承し、__getitem__
と __len__
を実装
👉 for
文で繰り返せる ようになる
詳しくは 清水川さん「Pythonはどうやってlen関数で長さを手にいれているの? 」(YouTube)
See Issue #34
時間の扱い
文字列 ➡️ datetime.time
オブジェクト
X分刻みとの足し算
argparse with Enum(実験的)