Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
5年分のツケを一気に払った話
Search
Soogie
September 26, 2024
Programming
3
2.4k
5年分のツケを一気に払った話
Talk at PyConJP2024, 2024/09/27
Soogie
September 26, 2024
Tweet
Share
More Decks by Soogie
See All by Soogie
生成AIを活用した初学者向けPython講座
soogie
1
180
PyHack#141今日やったこと
soogie
0
530
レビュー駆動学習のススメ_StaPy#83
soogie
0
590
職場にPythonistaを増やす方法
soogie
2
730
StaPyの効能
soogie
0
590
Stapy#25_LT
soogie
1
840
無料でできる,Cloud9上で開発してHerokuにデプロイする手順を共有します(再)
soogie
0
1k
無料でできる、Cloud9上で開発してHerokuにデプロイする手順を共有します
soogie
2
2.1k
Develop on Cloud9 & Deploy to Heroku for FREE!!
soogie
0
130
Other Decks in Programming
See All in Programming
Combinatorial Interview Problems with Backtracking Solutions - From Imperative Procedural Programming to Declarative Functional Programming - Part 2
philipschwarz
PRO
0
110
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
1.7k
ゆくKotlin くるRust
exoego
1
150
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
2
550
認証・認可の基本を学ぼう後編
kouyuume
0
250
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
170
まだ間に合う!Claude Code元年をふりかえる
nogu66
5
890
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
7
2.3k
これならできる!個人開発のすゝめ
tinykitten
PRO
0
120
Graviton と Nitro と私
maroon1st
0
130
Navigating Dependency Injection with Metro
l2hyunwoo
1
170
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
170
Featured
See All Featured
The untapped power of vector embeddings
frankvandijk
1
1.5k
First, design no harm
axbom
PRO
1
1.1k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
170
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
Designing Experiences People Love
moore
143
24k
Test your architecture with Archunit
thirion
1
2.1k
Building Applications with DynamoDB
mza
96
6.8k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
210
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
510
Optimizing for Happiness
mojombo
379
70k
Transcript
5 年 分 の ツ ケ を 一 気 に
払 っ た 話 Takeshi Sugiyama a.k.a. soogie(すーぎー) 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 1 https://x.gd/TOkaP
お 前 誰 よ ? • 事務系サラリーマン(1988~) • プログラミングは趣味&独学 BASIC(1977~)VBA(1995~)R(2014~)
※C,TurboPascalもちょっと • Python(2014~) みんなのPython勉強会(2015~) 何度か登壇、LT PyConJP2016、2018、2021登壇 Python Boot Camp TA × 5回 Python関連書籍の出版前レビュー× 20冊+ 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 2
ト ー ク内 容 話すこと • Python3.6→Python3.11での苦労話 • 3rdパーティパッケージのVer Upに伴う諸問題
話さないこと • 技術的負債をため込まない上手なやり方
背 景 • 現状問題なく動いているシステムをいじりますか? • PythonやパッケージがVer Upしただけで修正 しますか? • 非エンジニア組織で、他人が書いた現状問題なく
動いている業務アプリをいじる勇気ありますか? 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 4
た ま っ て い く ツ ケ 5 年
分 の ツ ケ を 一 気 に 払 っ た 話 5 Pythonは毎年新しいバージョンがリリースされていく サードパーティパッケージも日々バージョンが上がっていく たまに機能追加しようとするとネットで調べたコードがPython3.6では動かない
た ま っ て い く ツ ケ 5 年
分 の ツ ケ を 一 気 に 払 っ た 話 6 Pythonは毎年新しいバージョンがリリースされていく サードパーティパッケージも日々バージョンが上がっていく たまに機能追加しようとするとネットで調べたコードがPython3.6では動かない 仕事はアプリのメンテではなくアプリを使うこと 気にはなるけど、新しい機能を使わなければ困らない
何もしない人には過失はない。しかし何もしないことほど 大きな過失が人生にあろうとは思えない。 下村湖人(教育家・小説家、1873ー1930) “ ” 5 年 分 の ツ
ケ を 一 気 に 払 っ た 話 7
業 務 系 機 械 学 習 We b ア
プ リ 「 X 」 ( 仮 名 ) 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 8 • 5年前に開発され、4年前に引き継ぎ • 「ドキュメントなし」「テストコードなし」「書いた本人たちは退職・異動」の3重苦 • ドキュメントを作った話はPyConJP2021のアーカイブをご覧ください • その後テストも書いたし後輩にソースコードレベルでレクチャもしてきた
X ( 仮 名 ) の 仕 組 み 5
年 分 の ツ ケ を 一 気 に 払 っ た 話 9
発 生 し た 5 つ の 問 題 5
年 分 の ツ ケ を 一 気 に 払 っ た 話 10 ホントはもっといろいろあったけど今日は割愛
問 題 1 : フ ァ イ ル ア ッ
プ ロ ー ド で 落 ち る 現象:学習用データをアップロードしようとすると落ちる 発生個所:pandas.DataFrame.to_dict(orient="record") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 11
問 題 1 : フ ァ イ ル ア ッ
プ ロ ー ド で 落 ち る 現象:学習用データをアップロードしようとすると落ちる 発生個所:pandas.DataFrame.to_dict(orient="record") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 12
問 題 1 : フ ァ イ ル ア ッ
プ ロ ー ド で 落 ち る 現象:学習用データをアップロードしようとすると落ちる 発生個所:pandas.DataFrame.to_dict(orient="record") ポイント:正しくは「"records"」 。単なるtypoだけどなぜ今まで動いていた? ソースコードを読む 対応:typoを修正 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 13 【pandas1.4】 pandas.core.frame.py elif orient.startswith("r"): orient = "records" 【 pandas2.2 】 pandas.core.methods.to_dict.py orient = orient.lower()
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 14
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 15
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 16
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 17
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 18
問 題 2 : 機 械 学 習 で 落
ち る 現象:ロジスティック回帰でLASSOを使うと落ちる(他いろいろ) 発生個所:sklearn.linear_model.LogisticRegression(penalty="l1") ポイント:LogisticRegressionのsolverパラメータのデフォルト値が"liblinear"から 0.22以降はL1ペナルティに対応していない"lbfgs"に変わった 公式ドキュメントを読む 対応:solver='liblinear'を明示的に追加 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 19
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 20
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 21
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 22
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 23
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 24
問 題 3 : 結 果 を 格 納 す
る と き に 落 ち る 現象:機械学習後にMongoDBに結果が保存されず落ちる 発生個所:pymongo.collection.save() ポイント:MongoDB4.2以降はdb.collection.save()というAPIがなくなった 公式ドキュメントの変遷を現行のVer7からさかのぼる MongoDB4.1まで:save()だけで新規か更新かはいい感じに判断 MongoDB4.2以降:新規なのか更新なのか明示的に指定が必要 対応:やりたい内容に応じてinsert_one()とreplace_one()を使い分け 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 25
問 題 4 : B o r u t a
オ プ シ ョ ン で 落 ち る 現象:特徴量選択手法でBorutaをオプション指定すると落ちる 発生個所:boruta.BorutaPy() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 26
問 題 4 : B o r u t a
オ プ シ ョ ン で 落 ち る 現象:特徴量選択手法でBorutaをオプション指定すると落ちる 発生個所:boruta.BorutaPy() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 27
問 題 4 : B o r u t a
オ プ シ ョ ン で 落 ち る 現象:特徴量選択手法でBorutaをオプション指定すると落ちる 発生個所:boruta.BorutaPy() ..../site_packages/boruta/boruta_py.py 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 28
問 題 4 : B o r u t a
オ プ シ ョ ン で 落 ち る 現象:特徴量選択手法でBorutaをオプション指定すると落ちる 発生個所:boruta.BorutaPy() ポイント:borutaがNumPy1.20で廃止されたnp.int等を使っている PyPI上は2019年のVer0.3のまま。作者のGitHubではパッチが当たっている ※2024/8/14にPyPI上のborutaが0.4.3になり今は解消&scikit-learn1.5.1に包含 対応:boruta_py.pyにパッチ当て(np.を取る) 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 29
問 題 5 : 作 成 済 み モ デ
ル を 呼 び 出 す と 落 ち る 現象:旧バージョンで作成したモデルを呼び出すと落ちる 発生個所:pandas.read_pickle() 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 30
問 題 5 : 作 成 済 み モ デ
ル を 呼 び 出 す と 落 ち る 現象:旧バージョンで作成したモデルを呼び出すと落ちる 発生個所:pandas.read_pickle() ポイント:モデルはscikit-learnのオブジェクト。scikit-learnのバージョン違いにより オブジェクトの内部構造(メソッドやプロパティ)が変わり 古いバージョンのオブジェクトのpickleを新バージョンで読み込むことができない 対応:プログラム的には打つ手なし。どうする? 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 31
3 つ の 対 応 案 5 年 分 の
ツ ケ を 一 気 に 払 っ た 話 32 新 旧 工数大 工数小 問題を先送りし ツケをため込み続ける
3 つ の 対 応 案 5 年 分 の
ツ ケ を 一 気 に 払 っ た 話 33 新 旧 工数大 工数小 問題を先送りし ツケをため込み続ける 5年分の作成済みモデ ルを新バージョンですべて 作り直して再保存
3 つ の 対 応 案 5 年 分 の
ツ ケ を 一 気 に 払 っ た 話 34 新 旧 工数大 工数小 旧バージョンで作成した モデルを読み込めないこ とを許容 問題を先送りし ツケをため込み続ける 5年分の作成済みモデ ルを新バージョンですべて 作り直して再保存
対 応 方 針 決 定 5 年 分 の
ツ ケ を 一 気 に 払 っ た 話 35 新 旧 工数大 工数小 旧バージョンで作成した モデルを読み込めないこ とを許容 万一に備えたX Classic X Classic
め で た し 、め で た し ⚫ いろいろあったけど、X(仮名)は新しい環境でリリース完了
⚫ 5年分のツケを一気に清算して(一部踏み倒したけど)めでたし、めでたし 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 36
め で た し 、め で た し ? ⚫
いろいろあったけど、X(仮名)は新しい環境でリリース完了 ⚫ 5年分のツケを一気に清算して(一部踏み倒したけど)めでたし、めでたし ⚫ 2024年5月、scikit-learn1.5(boruta0.4.3含む)リリース ⚫ 2024年6月、NumPyが18年ぶりのメジャーアップデートで2.0に ⚫ MicrosoftからTeamsのincoming webhook機能廃止の告知 5 年 分 の ツ ケ を 一 気 に 払 っ た 話 37
ま と め 5 年 分 の ツ ケ を
一 気 に 払 っ た 話 38 一番の教訓は「ツケはため込まないのが一番」 ドキュメント、テストの整備は前提 常に最新化といかないまでも大きなバージョンアップの際 には新しいバージョンでの動作確認はしておきたい (NumPy2.0とか) レガシーコード化させないためのテストコードの書き方は 午後にいいトークがあります
Enjoy! Enjoy!