Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
限界環境CPython rev. seccamp2025
Search
らすぴー
August 14, 2025
Technology
0
21
限界環境CPython rev. seccamp2025
らすぴー
August 14, 2025
Tweet
Share
More Decks by らすぴー
See All by らすぴー
kernel-vm-ittekita-yuukousai
raspython3
0
64
kernelvm-brain-net
raspython3
0
880
pyconjp2024-wince
raspython3
0
16
seccamp2024-edictionary-python-TLS
raspython3
0
17
Other Decks in Technology
See All in Technology
プロダクトのコードから見るGoによるデザインパターンの実践 #go_night_talk
bengo4com
1
2.4k
M5製品で作るポン置きセルラー対応カメラ
sayacom
0
180
「れきちず」のこれまでとこれから - 誰にでもわかりやすい歴史地図を目指して / FOSS4G 2025 Japan
hjmkth
1
300
GoでもGUIアプリを作りたい!
kworkdev
PRO
0
140
ユーザーの声とAI検証で進める、プロダクトディスカバリー
sansantech
PRO
1
130
Uncle Bobの「プロフェッショナリズムへの期待」から学ぶプロの覚悟
nakasho
2
110
ガバメントクラウド(AWS)へのデータ移行戦略の立て方【虎の巻】 / 20251011 Mitsutosi Matsuo
shift_evolve
PRO
2
190
AWS 잘하는 개발자 되기 - AWS 시작하기: 클라우드 개념부터 IAM까지
kimjaewook
0
130
オープンソースでどこまでできる?フォーマル検証チャレンジ
msyksphinz
0
130
これがLambdaレス時代のChatOpsだ!実例で学ぶAmazon Q Developerカスタムアクション活用法
iwamot
PRO
6
1k
ニッポンの人に知ってもらいたいGISスポット
sakaik
0
120
AWSでAgentic AIを開発するための前提知識の整理
nasuvitz
1
110
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Unsuck your backbone
ammeep
671
58k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
870
We Have a Design System, Now What?
morganepeng
53
7.8k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Producing Creativity
orderedlist
PRO
347
40k
Rails Girls Zürich Keynote
gr2m
95
14k
Git: the NoSQL Database
bkeepers
PRO
431
66k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Transcript
限界環境CPython rev. seccamp2025 らすぴー / RasPython3 (@RasPython3) 1
注意事項 • これは2024年夏のPyCon JP 2024で行った野良発表 「Python3をWindows CEに移植した話」 の二番煎じrev. seccamp2025となっています •
時間の都合で当時のスライドを流用しており、大変読みにくく なっているかと思われます • そもそも説明が雑です 2
目次 1. 自己紹介 2. 電子辞書で動くPython 3. 事の発端 4. Pythonのバージョン選定 5.
パッチ適用 6. ビルドツールの選定 7. configure.acの改造 8. Makefile.pre.inの改造 9. WinCEに無いAPIの実装 10.コンソール問題 11.同名DLL問題 12.その他の問題 13.追加モジュールについて #rev. seccamp2025 14.追加移植: tqdm 3
自己紹介 活動名 RasPython3 / らすぴー X: @raspython3 普段やってること 各種ウェブツールづくり Discordのボットづくり
Linuxいじり 電子辞書いじり ネットワーク関連 etc. 4
電子辞書で動くPython • 電子辞書Brainについて • SHARPの電子辞書シリーズ • Windows CE(WinCE)が動作 • 2021年以降のモデルは別OS
• 2chなどで自作アプリやハックが 盛んだった • 今年5月頃にインターネット接続に ついに成功 • Kernel/VM@関西11回目で発表したよ 5 SHARP Brain PW-SH7-W 自分が持ってる機体の色違い
電子辞書で動くPython • 2007年頃まで開発されていた、WinCEで動く 「PythonCE」が存在 • v2.3.4 ~ v2.5 まで対応 •
独自コンソールにより対話モードが使用可能 • numarrayなど一部の追加モジュールも https://sourceforge.net/projects/pythonce/ 6 CPythonのWinCE移植版 「PythonCE」のアイコン
事の発端 電子辞書でPythonをいじりたかったが、動作するPythonの バージョンが2.5と古かった → Python3はないのかと調べてみたが無さそう ...じゃあ移植しちゃえばいいのでは? 7
事の発端 電子辞書でPythonをいじりたかったが、動作するPythonの バージョンが2.5と古かった → Python3はないのかと調べてみたが無さそう ...じゃあ移植しちゃえばいいのでは? 8 EOLを迎え需要もない 環境に無茶苦茶アプロ ーチで移植して専門家
を怖がらせましょう!
Pythonのバージョン選定 移植開始時期 ... 2023年4月頃 → v3.10.10 stable stable rc alpha
stable beta rc stable 3.9 3.10 3.11 3.12 9 ココ→
パッチ適用 Python2.5から時が流れ、WinCE用の記述はほぼ消えている そのため、2.5当時の記述を引っ張ってくる必要があった 手がかり • PythonCEのreadme • WinCE用のマクロ等 ... _WIN32_WCE
や MS_WINCE • 3.6の時に適用された、WinCE対応の名残を削除するコミット 10
パッチ適用 https://github.com/python/cpython/commit/10108a7b9affa61719a1dc1863 edb2bdb3402fd1 Windows CEのサポートを削除した。 それは完了することはなく、Windows CEは もはやPythonに関連するプラットフォームで はない。 11
ビルドツールの選定 Pythonで使えるビルドツール: • Makefile + gcc ... LinuxとMac • Visual
Studio + Visual C++ ... Windows • SCons + eVC4 ... Windows CE (PythonCE) 12
ビルドツールの選定 当時使用できた環境 • Raspberry Pi 3B & ZeroW • Chromebook
→ Windows系のビルドツールの使用が困難 → WinCE向けのgcc「cegcc」を使うしかない 13
ビルドツールの選定 そういえば... 1. Windows用の追加のソースはPC以下にまとまっている 2. Linuxで使うソースファイルの多くはWindowsでも使っている → Linuxのビルドスクリプトに手を加えたらどうにかなるのでは 14
configure.acの改造 まずは何も手を加えずに ./configure --host=mingw32ce --target=mingw32ce → mingw32ceは非対応とエラー • WinCE用の記述を追加 15
Makefile.pre.inの改造 WinCEで使うソースファイルのリストを記述 • Windowsで使うソースファイル • PythonCEに存在したWinCE用のソースファイル • PC/wince_compatibility.* • PC/WinCE/_tkinter/*
• 今回の移植で新たに作成したファイル • WinCE/* • Modules/_io/winceconsoleio.c 16
WinCEに無いAPIの実装 主にPC/wince_compatibility.*で対応 • strerr • wcsnlen • dup • CommandLineToArgvW
• CreateSymbolicLink • GetFileType • *_s 17
コンソール問題 コンソールがない場合(電子辞書など)、Pythonの標準入出力を扱 えない PythonCEでは独自のコンソールを用意していたが、 Pythonスクリプトによる疑似コンソールだった → Win32APIで窓を作り、readline や WriteConsole を独自実装
18
コンソール問題 問題発生 ... 電子辞書で stdin や stdout が使えない stdin, stdout,
stderrのファイル記述子は本来は 0, 1, 2 そのすべてが無効になっていた(-1) → fileno や isatty を別に実装して偽装 19
同名DLL問題 WinCEでは、ロードを試みるDLLと同名のDLLをほかのプログラム がすでにロードしていた場合、ロード済みのDLLを使いまわす →複数のPythonが入っていると挙動がおかしくなる 例 • Python3の_tkinter.pydを読み込もうとしてPythonCEの _tkinter.pydを使おうとしてしまう • Python3.10.14のpython310.dllを使おうとしてpython3.10.0の
それを使ってしまう 20
同名DLL問題 解決策 • *.pyd → *.cp310-wince_arm.pydに変更 • python310.dll と python3.10.exe
双方にハッシュ値を 埋め込み、実行時に検証する 21
その他の問題 • 環境変数がない environ.iniという設定ファイルを作成、また --env-set オプションや --env-path オプションを追加することで対応 • pyファイルを直接実行できない
レジストリにpyファイルが登録されないため、pyファイルをダブルク リックしても実行できない → PYTHONASSOCIATEREG という環境変数を追加、起動時にレジストリ設 定をできるように 22
その他の問題 • ModuleNotFoundError: No module named ‘os’ なぜかosがインポートできない(!?) 原因: “os.py”
が “OS.PY” になっていた!(ファイルシステムの問題) → PYTHONCASEOK を設定することにより対応 • python310._pthを使った時の挙動がなんか変 なんかドキュメントに書いてある通りの挙動じゃない... → ドキュメントの日本語訳が間違っていた!(現在は修正済み) 23
追加モジュールについて 現在(2025/08/14)、以下の追加モジュールが移植されている • cffi • cryptography • 現行バージョンはRust使用のため古いバージョンのみ • PyCryptoDome
• Numpy • OpenSSL • PIL (Pillow) • Pyftpdlib • requests 24
追加モジュールについて cryptographyや標準のsslモジュールを動作させるためには OpenSSLが必要 海外の方で、OpenSSLをWinCEに移植している人がいた が、電子辞書では動作せず... さらに、そのビルドにはVisual Studioを使っていた https://www.hpcfactor.com/forums/forums/thread-view.asp?tid=20731&start=1 25
追加モジュールについて そこで、cegccでOpenSSLをビルドすることを試みた ところが、OpenSSLもerrnoや環境変数を使うためビルドに失敗 これらも独自に実装すると、かなり面倒なことになる → Pythonで使うことを前提に、python310.dllに依存させたら いいのでは 26
追加モジュールについて 結果...うまくいった! これがうまくいかなかった場合、別途フル装備のcoredllを 使わなければならず、ライセンスの問題で配布が困難だった 最終的に、Pythonのビルド途中でOpenSSLもビルドして、Python のDLLに変更があっても問題なく動作できるようにした 27
#rev. seccamp2025 追加移植: tqdm • プログレスバーを簡単に表示できる 便利ライブラリ • ピュアPythonライブラリなので、 何も考えずにプログラムのコピペで
インストールできる • pip等が使えない(!)ので... 28
#rev. seccamp2025 追加移植: tqdm よーし早速動かしてみよう... 29 まあ想定内...
#rev. seccamp2025 追加移植: tqdm ...(範囲選択により真の姿をあらわにする) 30 崩壊★
#rev. seccamp2025 追加移植: tqdm Q. なぜ崩壊したのか? A. 疑似コンソールの実装が雑&中途半端だから。 • キャリッジリターンが未実装
• というか制御文字きちんと処理してない • だって面倒臭かったんだもん... 31
#rev. seccamp2025 追加移植: tqdm キャリッジリターンを雑に実装した結果... 32 成功!!! (豆腐は許して)
最後に • 皆さんも限界・異常環境にお好みの言語を移植しましょう! • 使えるAPIが少なかったりする制限あり環境がおすすめ • 標準APIの内部挙動を学べるよ • インタプリタやコンパイラの内部挙動も学べるよ •名刺が大量に(400枚以上)余っているので
ぜひ交換しましょう!!!!! 33