AREKORE

daikikatsuragawaのアレコレ

ノートブックをキレイにするためのTips

「PyCon APAC 2023」のPoster Sessionにおいて発表した「ノートブックをキレイにするためのTips」を記事として書き起こしたものになります。

2023-apac.pycon.jp

ポスターは以下から閲覧が可能です。

speakerdeck.com

概要

Jupyter NotebookやGoogle Colaboratoryなどのノートブックは、データ分析などの目的で使用されるインタラクティブにコードの記述や実行が可能な開発環境です。作成したノードブックを他者や未来の自分が改めて閲覧や実行をする可能性がある場合、実装の意図を伝えるために可読性を高く、意図した振る舞いを担保するために堅牢性を高くすることが大事です。ただし、ノートブックはそれ自体がソフトウェアとして実装されるものではないことから、可読性や堅牢性を向上させるメリットとコストのトレードオフを特に注意する必要があります。本発表では、ノートブックの可読性や堅牢性を向上させる(キレイにする)ために、可能な限りコストをかけずにメリットを得る方法(Tips)を紹介します。ご自身の管理されているノートブックの状況に合わせて、採用を検討してください。

管理コストの低いパラメータの扱い方

調整の可能性があるパラメータは、様々なセルに記述するのではなく、可能な限り少ないセルに集約すると、見通しが良く、管理コストが低くなります。そして、ノートブックの冒頭にあると、さらに見通しが良いです。実行毎に指定する値は、実行者が入力する仕組みにすると、その旨を伝えられます。

パラメータの集約

# 乱数の種
RANDOM_SEED = 2023
# PyCon APAC 2023のセッション数
NUMBER_OF_SESSIONS = 5

実行者が入力する仕組み

email_address = input("Eメールアドレスを入力してください: ")
Eメールアドレスを入力してください: 

コードに残さないセキュアな情報の扱い方

他者への共有が望ましくないパスワードなどのセキュアな情報は、漏洩するリスクから、コードでの管理が望ましくありません。実行者に入力させる仕組みにするか、環境変数として管理をすると、その旨を伝えられます。

実行者が入力する仕組み(入力内容をマスク)

from getpass import getpass
password = getpass("パスワードを入力してください: ")
パスワードを入力してください: 

環境変数として管理

import os
password = os.environ.get("PASSWORD")

意図を伝えるための変数と定数の定義

変数や定数を定義する際は、型ヒントやデータクラスにより、どんな内容を意図しているのかを示すことができます。

型ヒントによる意図の表現

conference_name: str = "PyCon APAC"
conference_year: int = 2023

データクラスによる意図の表現

from dataclasses import dataclass
@dataclass
class Conference:
    name: str
    year: int
conference = Conference(name="PyCon APAC", year=2023)

マジックナンバーの防止

マジックナンバーになり得る値は列挙型で定義をしておくことで、以降のコードにおいてマジックナンバーを防止することができます。

列挙型によるマジックナンバーになり得る値の定義

from enum import Enum, unique
@unique # 重複を防止
class Prefecture(Enum): # ※一部省略
    TOKYO = 13
    OSAKA = 27
print(f"PyCon APAC 2023の開催地:{Prefecture(13).name}")

後続処理への影響を避けるバリデーション

後続処理が期待していない値を検知するために、可能な限り早期にバリデーションをすると良いです。また、データのバリデーションを実現するライブラリであるpydanticを活用することで、パラメータや変数(定数)を容易かつ早期に検知することが可能です。

早期のバリデーション

FIRST_YEAR = 2010
assert conference_year > FIRST_YEAR

早期のバリデーション(pydantic)

from pydantic.dataclasses import dataclass, Field
FIRST_YEAR = 2010
@dataclass
class Conference:
    name: str
    year: int = Field(ge=FIRST_YEAR)
conference = Conference(name="PyCon APAC", year=2023)

関数の振る舞いを伝える簡易なテスト

doctestを使うことで、関数の振る舞い伝える簡易なテストの実現ができます。それに加えて、テストであることによって関数が意図した振る舞いであることを担保できます。

doctestを使った簡易なテスト

def add_year(year):
    '''
    >>> add_year(2023)
    2024
    '''
    return year + 1
import doctest
doctest.run_docstring_examples(add_year, globals())

セル内の冪等性を担保した変数の扱い方

特定のセルを複数回実行した場合であっても、後続処理に意図した値を伝えるために、セル内の冪等性を担保した変数の扱い方をすると良いです。例えば、変数を使いまわさない(変数の再代入をしない)ことが挙げられます。

変数を使いまわさない(変数の再代入をしない)

year = 2023
# year = year + 1
next_year = year + 1 # 冪等
# print(year)
print(next_year) = year + 1 # 冪等

その他

  • テキスト(Markdown)のセルによる説明の追加
  • 適度なセルの分割
  • 適度なファイルへの分割
  • フォーマッターの導入
  • リンターの導入
  • Gitの導入
  • 「すべてのセルを実行」で問題なく実行されることを確認
  • CI(継続的インテグレーション)の導入
  • コードレビューの実施(意図が伝えられていない箇所の洗い出し)
  • 「出力をすべて消去」した上で管理(オプション)

技術カンファレンスにおけるポスター発表の準備(備忘録)

先日、PyCon APAC 2023という技術カンファレンスにポスターセッションのスピーカーとして参加してきました。

2023-apac.pycon.jp

ポスターセッションでの発表(以下、ポスター発表)では、スライドを使った発表とは異なる準備が必要でした。本記事はそんなポスター発表の準備の備忘録です。今後、PyConに限らず、技術カンファレンスにおいて、ポスター発表をする方々の参考になれば幸いです。

参考までに作成したポスターは以下です。

speakerdeck.com

準備

前提として、用意していただける展示パネルのサイズは90.0cm×180.0cmでした。せっかくなので1枚のポスターを用意したい、その上でなるべくポスターのサイズを大きくしたいと考え、A0(84.1cm×118.9cm)を選択しました。

ポスターを作成するために使用するツールは「Google Slides」を選択しました。

www.google.com

Google SlidesでA0のポスターを作成するためにページ設定を84.1cm×118.9cmに変更しました。

デザインや様式については「学生・研究者のための伝わる! 学会ポスターのデザイン術」を参考にしました。

印刷はラクスルさんを利用しました。

raksul.com

他社さんとの比較が十分にはできていませんでしたが、よく名前を知っていたのが決め手で選択しています。用紙の種類について、今回印刷するポスターは画像がなく、文字が多かったため、半光沢紙を選択しました。PDFで入稿しました。

半光沢紙(オンデマンド印刷専用紙)

・特徴

オンデマンド専用の紙種です。 フォト光沢紙よりも光の反射を抑えた仕上がりで、文字が多いデザインにおすすめです。

引用:用紙の種類ガイド(ポスター印刷) | ご利用ガイド|印刷のラクスル

ありがたいことにかなりキレイに印刷していただきました。

ポスター

持ち運びはDAISOの「書類ケース 大」を使いました。

書類ケース 大jp.daisonet.com

ポスターが届く時の段ボールでも良さそうだったんですが、値段も「300円(税込330円)」安くオススメです。久しぶりに使ってみると、フタが取れたりしていたので、養生テープなど貼ったりして安定させることが良さそうです。

その後

Speaker Deckにて公開しました。

speakerdeck.com

まとめ

本記事をベースラインとして捉えていただいて、技術カンファレンスのポスター発表に興味のある方にとって参考になれば幸いです。

PyCon APAC 2023の振り返り

先日、PyCon APAC 2023にポスターセッションのスピーカーとして参加してきました。

2023-apac.pycon.jp

本記事はその記録です。

カンファレンス感

トーク

当日に会場で、後日にYouTubeで視聴しました。特に印象に残った3選を挙げます。

好きとか嫌いとかはいい、練習してテストを書けるようになるんだ

ftnext.github.io

テストコードの一歩目として非常にオススメです

引用:好きとか嫌いとかはいい、練習してテストを書けるようになるんだ

自分の発表でも言及していたのですが、低コストで導入できる「better than nothing」な打ち手として、doctestがオススメなんですよね・・・

docs.python.org

Pythonで スナップショットテスト

speakerdeck.com

スナップショットテストとは?


● 前回成功時の結果との一致を確認するテスト 


引用:Pythonで スナップショットテスト/ pyconjp2023 - Speaker Deck

そもそも「スナップショットテスト」を初めて知りました。選択肢という点で得られるものがありました。

業務で使える一歩進んだPython使いになるために

speakerdeck.com

すごく大事だと思っているテーマがまとまっています。

● インデントが深すぎると脳への負荷が高すぎる → 複雑度をツールで計測したり、for 文になったら分割。とにかく小さくする。

引用:業務で使える一歩進んだPython使いになるために / To become an advanced user of Python that can be used at work - Speaker Deck

複雑度や凝縮度を計測するツールとしては、以下などが考えられますね🤔

個人的には、複雑度や凝縮度を改善させるためのリファクタリングを実施するにあたって「ツールを活用した目標の設定と評価の導入*1」は必要だと考えています。それぞれがどのような使い勝手なのかを確認し、どのように活用できそうか考えてみたいところです。

スポンサーブース

「この会議を実現するためにスポンサーしていただいている企業の方々とは話さないといけないな」という考えのもとで9割ほどの企業とお話しさせていただきました。ノベルティも沢山いただきました。特に気に入っているのは、Findyさんからいただいた「タイポ用心」のお守りです!

技術カンファレンスではありますが、技術軸でさまざまな企業が取り組む事業を認識したり、解像度を高められたりしたので、良い時間を過ごせたとは思います。

ポスターセッション

ポスターセッションにて、「ノートブックをキレイにするためのTips」というタイトルで発表しました。

speakerdeck.com

ポスター発表では課題に共感いただいたり、打ち手に納得してもらえたり、フィードバックをいただいたりと、良い時間となりました。本発表では、ノートブックにおけるセキュアな情報の扱い方を紹介していましたが、タイムリーなことに、Google Colaboratoryではシークレットを管理する機能がリリースされたようです。とても便利そうですね。

また、これまでオンラインで参加していたコミュニティ(飛騨高山Pythonの会 - connpassはんなりプログラミングの会 - connpass)の方々とも初めてオフラインで挨拶したりとしました。

前回は最後から2番目が発表だったこともあり、それまで物理的にも気持ち的にもバタバタしていたため、発表以外の行動が十分ではなかった気がしています。今回は逆にインタラクティブな発表であったためかバタバタせず、割といろんな行動ができたと思っています。そのため、全体としてとてもいい時間を過ごせたと思っています。

アフターパーティーには参加していなかったのですが、そこでも展示していただいたようです。少しでも話の種になっていたらうれしいです。

その他

スプリントについて、昨年は参加したものの、今回は参加しませんでした。雰囲気が公開されていたのですが、会場や特にランチが良さそうで後悔しています。

発表においてノートパソコンは不要だったことと、荷物の制約もあり今回は持参していませんでした。iPhoneで十分でした。たまにはそんな参加もいいかもしれないです。

改めてですが去年も発表していました。

daikikatsuragawa.hatenablog.com

この一年で、去年の発表やその資料を見てくださって話してくださる方が数人いました。そのときに、あらかじめ自分の考えを理解してもらえていて、一度の発表がジワジワと恩恵をもたらしてくれるんだと実感しています。今回も会期は終えたものの何かにつながればいいなと淡い期待を抱いています。

まとめ

そんな様子でPyCon APAC 2023に参加してきました。運営の方々、本当にありがとうございました。様々な観点で、とても学びの多い機会になりました🙋今年は結果的にスポンサーブースに重心を置いていましたが、「社会の課題に対して、技術を使ってどのように解決するのか(しているのか)」と言った話を伺えたことが、よかったです。…それでは、来年もよろしくおねがいします🙇

次回のPyConJPは2023年9月らしいですね。

2023年1月〜6月のアレコレ

これは何?

2023年1月〜6月のアレコレを記録します。最近思ったことや思い出したことも書きます。ただし、殴り書きのままこの日(6月末)を迎えてしまったのでじわじわと追記する形式とします…

LLMな時代

昨年末頃からですがLLM(大規模言語モデル)な時代になりましたね。自分もChatGPTサブスクリプションプラン(ChatGPT Plus)にしてしまうほど使っています。アプリケーションとして公開されていることもあり誰でも使えるのがとてもいいですね。これからも使いこなしていきたい。活用方法を模索していきたい。

ポケモンの大会に挑む選手の方々がカッコイイ

最近、改めてポケモンが流行っていることもあり、アンテナを張っています。大会の動画を観戦したり、大会出場者のブログを読んだりしています。先日(2023年6月10日〜11日)はPJCS2023(ポケモンジャパンチャンピオンシップス2023)という大会がありました。

www.pokemon.co.jp

戦略的な奥深さも感じますが、各選手が各試合に対して振り返っていたりして、試合に挑む姿勢についても参考にもなります。

「PJCS2023ポケモンカードゲーム部門マスターリーグ」で優勝した方はルーティーンとしてご飯や願掛けなどにもこだわっているようで、自分もいざという時のルーティーンを決めておきたいと思いました。

note.com

自分も何かしらの大会に本気で挑みたい。

“願掛け”といえば

自分もいざという時のルーティーンを決めておきたいと思いました。

直前でこんなことを言っていましたが、最近の「ここぞ!」という時は以下のようなことをしていました。

  • 髪を切る&整える
  • 服をクリーニングに出す
  • 家族の物を見る&身につける

定めたい。

夏休みの自由研究

実家で掘り返す機会があり、中学生の頃の夏休みの自由研究を見返しました。仮説を立てた上でそれを検証するというフォーマットに従っていることや、1年目で発覚した課題に対して2年目で挑むという点で、大学以降で実施していた学術研究に通づるものがあるなと思い、我ながら感心した。その頃から大切なことを身につけていたのかもしれない。おそらく助言をくれたであろう両親、ありがとうございます。

「面白い話に昇華できる日々を送ること」

地元の家族や友人からするとちょっと珍しい人生を送っているのでそのネタを仕込む意識で過ごしていました。しばらくその意識がなくなっていましたが、仕事関係の方にも「面白い話(成否に関わらず何かしら挑戦した話)を用意しておけ!」と言われ、改めて意識しようと思っています。

フォトスキャン by Google

限られた時間でいくつかの写真をスキャンしスライドショーを作るという任務がありました。個人的にはちゃんと?スキャンしたい派なのですが、時間が限られているのでそうもいかず…そんな時、これがとても便利でした。大抵うまくいく。

www.google.com

ITは幸せな社会に貢献している。

未経験を経験し続ける

未経験を経験すること(0→1)はハードルが高いですが、経験してしまえば学びも多く、2回目、3回目のハードルは低い。意図して未経験を経験し続けます。

「逃げたら一つ、進めば二つ」

引用:機動戦士ガンダム 水星の魔女 公式サイト

心がけたい。

ちょっと贅沢なジュース

「アラン・ミリア」、ここぞという時に飲んでいます。

youtu.be

実は…

社会人としての転換期です。明日からも頑張ります💪

2023年

あけましておめでとうございます。

今年はこんな感じで頑張ろうと思います。

alu.jp

アドベントカレンダー作成記2022

これは何?

2019年以降、Qiitaのアドベントカレンダーに参加していました。今年はある機械学習ネタを公開したいと思っていたのですが、マッチングするテーマがありませんでした。そこで「機械学習」というテーマのアドベントカレンダーを作成しました。是非、ご覧ください。

qiita.com

私としてはテーマを作ること自体が初めてだったので、諸々を振り返ります。

振り返り

まずは全体について数字で結果を振り返ります。以下、2022年12月26日時点での数値です。

項目 件数
参加者 3
購読者 43
いいね(合計) 21
記事数 6

提示した数値がそれぞれ0ではなく、少なくとも意味のあるアドベントカレンダーを作成ができたとは思っています。Better than Nothingです。関わってくださった皆様、ありがとうございます🙇‍♂️。

ただし、アドベントカレンダーという企画を想像すると、記事数が25件を超えなかったことは残念ではあります。理由は以下だと思っています。

  • 作成日が遅かった(11/23)
  • 自分に影響力がない
  • 最悪自分が埋められる状態にない

一回やってみたので次回は色々と作戦を立てられるかと思いました。来年リベンジしたく思います。

ちなみに・・・

冒頭でこんなことを記載していました。

今年はある機械学習ネタを公開したいと思っていたのですが、

実はこれは間に合わず断念しました・・・これは後に本ブログにて公開したく思っています。

アウトプットはいいぞ2022

これは何?

2022年、id:daikikatsuragawaの個人的なアウトプットをまとめます。それぞれに対して「アウトプットはいいぞ」なポイントも記録します。

※以下のアドベントカレンダーに参加しています。

qiita.com

記事投稿

日頃の学びを抽象化し、コードスニペットとして整理し、記事として公開しました。

qiita.com

qiita.com

ここで感じた「アウトプットはいいぞ」なポイントは以下です。

  • 技術についての理解を深められた
  • 辞書的な扱いができる(便利)

記事投稿企画への参加+受賞

Qiitaの記事投稿企画へ参加しました。

qiita.com

そして、受賞しました🏆

zine.qiita.com

「pandera」×「外部データの読み込み」×「日本語の記事」という点で、新規性と有用性のある内容の記事を公開できたと思っています。正直、「いいね」の数は比較的少ないと感じていましたが、良い評価をしていただき、こんな高価なものまでいただきました。自分とってはトロフィーです。

jp.sharp

  • 技術についての理解を深められた
  • 自身の記事が価値のあるものだと認識できた(評価してもらえた)
  • 賞品(物理)をいただいた
  • 後述する「LTでの登壇」、「カンファレンスでの登壇」に繋げられた
    • 内容についてもだが、プロポーザルの採択につなげる根拠となった

LTでの登壇

地元で開催されている「飛騨高山Pythonの会」にて何度か発表させていただきました。

hida-python.connpass.com

資料は以下に残しています。

speakerdeck.com

ここで感じた「アウトプットはいいぞ」なポイントは以下です。

  • 技術についての理解を深められた
  • 資料という成果物が残る
  • 情報交換できるコミュニティに参加できた(関連して他コミュニティへの参加にも繋がった)
  • 後述する「カンファレンスでの登壇」に繋げられた
    • 内容についてもだが、プロポーザルの採択につなげる根拠となった

カンファレンスでの登壇

「Open Source Conference 2022 Online Kyoto」に参加し、登壇しました。関連した記事を以下に残しています。

daikikatsuragawa.hatenablog.com

「PyCon JP 2022」に参加し、登壇しました。関連した記事を以下に残しています。

daikikatsuragawa.hatenablog.com

特に、PyCon JP 2022では質疑応答が盛り上がりまして、逆に得られるものが多かったです。以下の記事も書けました。

daikikatsuragawa.hatenablog.com

ここで感じた「アウトプットはいいぞ」なポイントは以下です。

  • 技術についての理解を深められた
  • CfP(プロポーザル)で採択される経験が得られた
  • 資料という成果物が残る
  • 情報交換できるコミュニティに参加できた(関連して他コミュニティへの参加にも繋がった)
  • 業界への貢献となった(誰かの役に立った)
  • 発表と議論のサイクルにより理解が深まった

スプリントへの参加

PyCon JP 2022ではスプリントがあったのでリーダー(ただしチームは一人)として参加しました。関連した記事を以下に残しています(再掲)。

daikikatsuragawa.hatenablog.com

限られた時間で何かしらの成果を生み出す場というのがよかったです。限られた時間で何かを生み出し切るということは様々なリスクを負って進めたり、諦めたりという意思決定のサイクルを繰り返す必要があり難しいことも多いですが、面白いですね。「better than nothing」の精神で形にしきりました。

ここで感じた「アウトプットはいいぞ」なポイントは以下です。

  • 成果物を生み出せた(残る)

OSS開発

OSS開発@GitHubはしばしば実施していました。Pythonへの理解が深まったからか、自分から送るプルリクエストの内容も様々になってきました。 特に、研究系のライブラリへのコントリビュートができています。

github.com

ここで感じた「アウトプットはいいぞ」なポイントは以下です。

  • 改修にあたって関心のある技術の理解を深められた
  • 業界への貢献となった(誰かの役に立った)

特に研究系のライブラリはアイデアが素晴らしい分、その魅力を使用者にそのまま伝えるための貢献が重要だと考えています。

キュレーション

反実仮想説明法のキュレーションを始めています。

github.com

ここで感じた「アウトプットはいいぞ」なポイントは以下です。

  • 技術についての理解を深められた
  • 技術を集約できる場を生み出せた

アドベントカレンダーの作成

意外となかったことや、去年存在して欲しかったということもあり「機械学習」のアドベントカレンダーを作成しました。

qiita.com

正直、本記事公開時点では埋まっていないですが、Better than Nothingの精神です。こちらについての諸々は後日公開します。

ここで感じた「アウトプットはいいぞ」なポイントは以下です。

  • Better than Nothingの精神を磨くことができた
  • ないものを生み出せた
  • ハードルを乗り越える経験が得られた

その他

その他、アウトプットに関連して記録しておきたいことを残します。全体を通して、「新規性のあることをする」を意識して取り組めたと思っています。自信の学びを目的の一つとしてるものの、同じ、もしくは優良版の発信が世の中に存在していれば、業界としては意味のないものになります。その上で、少なからず業界への貢献もできたのかと思います。またそれを「出し惜しみせず発信と議論(FB)のサイクルを繰り返す」も意識して取り組みました。関心のある技術を知っていること自体をアイデンティティと捉えがちですが、基本出し惜しみせず発信しました。おそらく出し惜しみしていると、より技術力のある方が発信し、いつかは誰もが知る世界になってしまします。そのため、サッサと発信するようにしました。ただ、発信と議論によるサイクルにより、逆に理解も深まったり、視座が広がり、チャンスが得られたり、新たにアイデンティティの種も得られました。どんどん発信することとします。このように意味のある発信はできていることもあり、それぞれが関連付られる状態、もっというと実務にも生きる状態にできたことがよかったです。