pdf2image [Python]
PDFファイルを1ページずつ画像にするライブラリ
https://pypi.org/project/pdf2image/
poppler っていうコマンドのフロントエンドなので 別途 poppler をインストールする必要がある。
ubuntu の場合
としておけば良さそう
poppler は、Linux デスクトップの PDF のプレビューに使われているものらしく素性は良さそう。
https://ja.wikipedia.org/wiki/Poppler
各ページを jpeg にして保存する場合の例
convert_from_path(パス名) や convert_from_bytes(バイナリデータ) で、 Pillow の Image オブジェクトのリストを返す
https://pypi.org/project/pdf2image/
poppler っていうコマンドのフロントエンドなので 別途 poppler をインストールする必要がある。
ubuntu の場合
apt install poppler-utils poppler-data
としておけば良さそう
poppler は、Linux デスクトップの PDF のプレビューに使われているものらしく素性は良さそう。
https://ja.wikipedia.org/wiki/Poppler
各ページを jpeg にして保存する場合の例
from pdf2image import convert_from_path for i, image in convert_from_path('example.pdf').enumerate(): image.save(f'{i}.jpg', "JPEG")
convert_from_path(パス名) や convert_from_bytes(バイナリデータ) で、 Pillow の Image オブジェクトのリストを返す
Python3 の tkinter [Python]
Python に標準で入っている GUI ツールキットということで便利な tkinter
以前、画像ファイルを表示するスクリプトを書いた
https://gist.github.com/nakagami/3764702
Pillow の力によって、アニメーション gif の画像を一コマづづ表示できる。
Python3 になって、(モジュール名など)色々変わったのにネットでは、古い Python2.7 の時のサンプルコードばかりで、残念だなと思っていた。
趣味で tkinter のコードを書こうかなと思っているのだが、まず、やりたいことができるか検証コードを書いた。
発生するイベント情報を print して、 マウスクリックした位置に赤い円を描画するスクリプト
https://gist.github.com/nakagami/b93521c7c369b4986e967f5fdeef1690
twisted で、tkinter のイベントを扱う例
https://gist.github.com/nakagami/2d58fac16c03fd5dab8608d81a8826ad
Python2.7 での example を書き換えたら Python3 でも動いてるっぽい。
終了できなかったが、ここの質問を見て https://stackoverflow.com/questions/71281691/cannot-stop-twisted-reactor-when-calling-reactor-stop
os._exit(0) で終了するようにできた。しかし、ちょっと乱暴なので気に入らない。もっと良い方法はないものだろうか。
自分の macOS の環境では、 Canvas に描画しても表示できなかったが、結局 brew で install していた Python3.11 をアンインストールして、公式インストーラー https://www.python.org/downloads/macos/ の Python3.12 をインストールしたら描画できるようになった。
Python のバージョンの問題ではなく brew の python の tk サポートに問題があるっぽい。
brew の Python も、そのうち直るかも。
以前、画像ファイルを表示するスクリプトを書いた
https://gist.github.com/nakagami/3764702
Pillow の力によって、アニメーション gif の画像を一コマづづ表示できる。
Python3 になって、(モジュール名など)色々変わったのにネットでは、古い Python2.7 の時のサンプルコードばかりで、残念だなと思っていた。
趣味で tkinter のコードを書こうかなと思っているのだが、まず、やりたいことができるか検証コードを書いた。
発生するイベント情報を print して、 マウスクリックした位置に赤い円を描画するスクリプト
https://gist.github.com/nakagami/b93521c7c369b4986e967f5fdeef1690
twisted で、tkinter のイベントを扱う例
https://gist.github.com/nakagami/2d58fac16c03fd5dab8608d81a8826ad
Python2.7 での example を書き換えたら Python3 でも動いてるっぽい。
終了できなかったが、ここの質問を見て https://stackoverflow.com/questions/71281691/cannot-stop-twisted-reactor-when-calling-reactor-stop
os._exit(0) で終了するようにできた。しかし、ちょっと乱暴なので気に入らない。もっと良い方法はないものだろうか。
自分の macOS の環境では、 Canvas に描画しても表示できなかったが、結局 brew で install していた Python3.11 をアンインストールして、公式インストーラー https://www.python.org/downloads/macos/ の Python3.12 をインストールしたら描画できるようになった。
Python のバージョンの問題ではなく brew の python の tk サポートに問題があるっぽい。
brew の Python も、そのうち直るかも。
PyConAPAC 2023 で感じた、あまりにもITエンジニアいない問題 [Python]
PyCon APAC で、トークは聞かなかったけど、ブースを出している会社さんには話を聞きにいった。
大きく、開発ツール、教育といった参加者を顧客ターゲットにした会社と、
顧客ターゲットとしてなくて、内部が Python で開発してますという会社に別れていたと思う。
後者の会社さんに、ブースを出した目的を聞くと、やはり採用だという。
参加している人たちは、Python で仕事していて、その中で今すぐ転職したいっていう人いないと思うけど、それでもいいの?と、そのものズバリを聞くと大概は、まずはプレゼンスを上げて、名前を知ってもらうことで、転職サイトなんかで検索で引っかかった時に、見たことある会社名、と思ってもらうというような話だった。
そして採用活動を、転職エージェントなんかでしても「なかなか合う人(=もうちょっと自分でできる人)がこない」ならいい方で、「採用したいが全く応募がない」というところもあるみたい?
コロナがあけて景気が良くなって、さらにあらゆるところで IT化がなされ、需要が等比級数的に増えているのに必要な技能を持った人間は、一定割合で自然発生的に増えるのを待つしかないからなんだろう。
今、中学校でプログラミングが必修化されて、大量にプログラミング嫌いな日本人を生み出していることと思うが、その中で、以前であればプログラミングの楽しさを知ることなく終わっていた人が目覚めるってことはあるんだろうから、多少は改善するのかも。
その代わり、プログラミングが嫌な思い出としてしか残ってない人を量産することになると思うが
30年前に、プログラマーなんて掃いて捨てるほどいるので 35歳くらいまでにマネージメントできるようにならないとダメだよと言っていたあれはなんだったの?
大きく、開発ツール、教育といった参加者を顧客ターゲットにした会社と、
顧客ターゲットとしてなくて、内部が Python で開発してますという会社に別れていたと思う。
後者の会社さんに、ブースを出した目的を聞くと、やはり採用だという。
参加している人たちは、Python で仕事していて、その中で今すぐ転職したいっていう人いないと思うけど、それでもいいの?と、そのものズバリを聞くと大概は、まずはプレゼンスを上げて、名前を知ってもらうことで、転職サイトなんかで検索で引っかかった時に、見たことある会社名、と思ってもらうというような話だった。
そして採用活動を、転職エージェントなんかでしても「なかなか合う人(=もうちょっと自分でできる人)がこない」ならいい方で、「採用したいが全く応募がない」というところもあるみたい?
コロナがあけて景気が良くなって、さらにあらゆるところで IT化がなされ、需要が等比級数的に増えているのに必要な技能を持った人間は、一定割合で自然発生的に増えるのを待つしかないからなんだろう。
今、中学校でプログラミングが必修化されて、大量にプログラミング嫌いな日本人を生み出していることと思うが、その中で、以前であればプログラミングの楽しさを知ることなく終わっていた人が目覚めるってことはあるんだろうから、多少は改善するのかも。
その代わり、プログラミングが嫌な思い出としてしか残ってない人を量産することになると思うが
30年前に、プログラマーなんて掃いて捨てるほどいるので 35歳くらいまでにマネージメントできるようにならないとダメだよと言っていたあれはなんだったの?
PyConAPAC 2023 に参加した [Python]
昨日、一昨日の PyConAPAC 2023 に参加した。
(今日やっているスプリントには参加してないです)
今年の PyConAPAC は、久しぶりに多くの人が集まれるイベントになった。
今回こそは、ちゃんとトーク聞くぞ!・・・という意気込みはあったのだが、
結局、そこら辺をうろうろして知り合いにあったら挨拶して近況を聞いて、
パーティーでたまたま隣になった人や知り合いの知り合いとして紹介された人と
少し知り合いになったりして終わってしまった。
コロナ禍で会社がリモートで仕事する体制になって、
自分も会社に行かなくなってしまったので、
自分の会社の同僚のことだけを考えても、久しぶりにあった人にも挨拶し、
slack 上では知っているけど、初めて会う人にも挨拶し、会社の OB にも会えて、みんな元気そうだったし、
長いことあってなくて、どうしてるかなーと思っているような人が、(その場にはいないものの)
知り合い経由で元気そうにしてることも聞けて嬉しかった。
Python の話は、ほとんどしなかった。
(今日やっているスプリントには参加してないです)
今年の PyConAPAC は、久しぶりに多くの人が集まれるイベントになった。
今回こそは、ちゃんとトーク聞くぞ!・・・という意気込みはあったのだが、
結局、そこら辺をうろうろして知り合いにあったら挨拶して近況を聞いて、
パーティーでたまたま隣になった人や知り合いの知り合いとして紹介された人と
少し知り合いになったりして終わってしまった。
コロナ禍で会社がリモートで仕事する体制になって、
自分も会社に行かなくなってしまったので、
自分の会社の同僚のことだけを考えても、久しぶりにあった人にも挨拶し、
slack 上では知っているけど、初めて会う人にも挨拶し、会社の OB にも会えて、みんな元気そうだったし、
長いことあってなくて、どうしてるかなーと思っているような人が、(その場にはいないものの)
知り合い経由で元気そうにしてることも聞けて嬉しかった。
Python の話は、ほとんどしなかった。
DjangoCongressJP 2023 [Python]
https://djangocongress.jp/
参加した
自分が見た中で興味深かったのは
- グラフデータベースを用いた Djangoアプリ作成入門
- データ分析者にとっての Django: Streamlit や Dash との比較
セッションの間の休憩やお昼休み時間が長くとってあったのがよかった。
みんな、真面目にトークを聞こうとして来ているので、トークがぎっちり詰まっているスケジュールだと、
僕のように参加した人との雑談を楽しみにしている人には肩身が狭いのだが、DjangoCongressJP では、トークも聞けて
雑談も出来て、ちょうどいいイベントだった。
パーティーとその後の二次会が本番だった。
久しぶりに会った知り合いや初めて会う同僚が多くて僕は楽しかったが、初めて参加した方が楽しかったか心配。
初めて参加した人が楽しくて来年も参加したくなるといいなと思った。
参加した
自分が見た中で興味深かったのは
- グラフデータベースを用いた Djangoアプリ作成入門
- データ分析者にとっての Django: Streamlit や Dash との比較
セッションの間の休憩やお昼休み時間が長くとってあったのがよかった。
みんな、真面目にトークを聞こうとして来ているので、トークがぎっちり詰まっているスケジュールだと、
僕のように参加した人との雑談を楽しみにしている人には肩身が狭いのだが、DjangoCongressJP では、トークも聞けて
雑談も出来て、ちょうどいいイベントだった。
パーティーとその後の二次会が本番だった。
久しぶりに会った知り合いや初めて会う同僚が多くて僕は楽しかったが、初めて参加した方が楽しかったか心配。
初めて参加した人が楽しくて来年も参加したくなるといいなと思った。
Python3.12 がリリースされた [Python]
Python 3.11 が昨年の10月にリリースされた時、今後は毎年10月に Python の新しいバージョンがリリースされると発表されていた。
そして 2023-10-02 に 3.12がリリースされた
https://www.python.org/downloads/release/python-3120/
その間に Python3.7 が Deprecated になった。
Python3.7 って、ついこないだじゃなかったっけ?・・・と調べたら 2018年だった。
5年ならしょうがないか。
最近 Deprecated になるビルトインライブラリ多い印象。
勢いがあって、開発者が多いからこそだと思うが、書いたコードが、Python のバージョンアップに追随しないと、どんどん動かなくなっていきそうで、おじさんには厳しい。
そして 2023-10-02 に 3.12がリリースされた
https://www.python.org/downloads/release/python-3120/
その間に Python3.7 が Deprecated になった。
Python3.7 って、ついこないだじゃなかったっけ?・・・と調べたら 2018年だった。
5年ならしょうがないか。
最近 Deprecated になるビルトインライブラリ多い印象。
勢いがあって、開発者が多いからこそだと思うが、書いたコードが、Python のバージョンアップに追随しないと、どんどん動かなくなっていきそうで、おじさんには厳しい。
PyPy を Python2.7 の代わりに使う [Python]
Ubuntu 22.04 では Python2.7 が apt でインストールできるが、Ubuntu の、その後のバージョンでは Python2.7 が apt ではインストールできなくなってしまった。
これは、あまり言わないほうがいいのかもしれないけれど、Python (正確にはrpython) で書かれた Python 実装の PyPy で、Python2.7 系と Python3 系が同時並行にメンテナンスされている。
https://www.pypy.org/
Ubuntu の場合
sudo snap install pypy --classic
で pypy コマンドがインストールでき、それが Python2.7 相当になっている
pypy -V
Python 2.7.18 (8d509266596ab6a70defcf87c8b29f57b8e32426, Jun 15 2023, 10:18:34)
[PyPy 7.3.12 with GCC 10.2.1 20210130 (Red Hat 10.2.1-11)]
PyPy の CPython との互換性はかなり高いので、もし Python2.7 でしか動かないコードがあって、Python2.7 の動く環境がないという場合は、PyPy を使ってみるのも手かなと思う。
・・・というところまで考えて、
Github actions で Python2.7 が drop された https://github.com/actions/setup-python/issues/672 が、 pypy2.7 でテストを実行できることに気づいた。
https://github.com/nakagami/CyMySQL/commit/eca2d81b1cadeef4c23ec3385bf9445abe79e24e
もちろん完璧ではないが、pypy2.7 でのテストを CPython2.7 でのテストの代わりとして実行することにした
これは、あまり言わないほうがいいのかもしれないけれど、Python (正確にはrpython) で書かれた Python 実装の PyPy で、Python2.7 系と Python3 系が同時並行にメンテナンスされている。
https://www.pypy.org/
Ubuntu の場合
sudo snap install pypy --classic
で pypy コマンドがインストールでき、それが Python2.7 相当になっている
pypy -V
Python 2.7.18 (8d509266596ab6a70defcf87c8b29f57b8e32426, Jun 15 2023, 10:18:34)
[PyPy 7.3.12 with GCC 10.2.1 20210130 (Red Hat 10.2.1-11)]
PyPy の CPython との互換性はかなり高いので、もし Python2.7 でしか動かないコードがあって、Python2.7 の動く環境がないという場合は、PyPy を使ってみるのも手かなと思う。
・・・というところまで考えて、
Github actions で Python2.7 が drop された https://github.com/actions/setup-python/issues/672 が、 pypy2.7 でテストを実行できることに気づいた。
https://github.com/nakagami/CyMySQL/commit/eca2d81b1cadeef4c23ec3385bf9445abe79e24e
もちろん完璧ではないが、pypy2.7 でのテストを CPython2.7 でのテストの代わりとして実行することにした
Cython 3.0.0 リリース [Python]
Cython 3.0 がリリースされたことを知った。
https://pypi.org/project/Cython/
breaking change があるらしいが・・・
と思ったら、ここにまとまっていた
https://cython.readthedocs.io/en/latest/src/userguide/migrating_to_cy30.html
驚いたことに Cython3.0 でも Python2.7 がサポートされているようだ。
試しに CyMySQL を python2.7 と python3.10 で unittest を実行してみたら、特に Error とか Fail とか発生しなかった。
最近は、 Cython よりも Rust を使われることが多いのかなぁという感じがしている。
Cython で使える C コンパイラをインストールするより Rust をインストールする方が簡単だからかな?
Cython で書くほうが Rust で書くより簡単だと思うし、Cython は、**うまく書けば** C言語で書くくらい速くなるだけでなく、C のライブラリを呼び出すコードが比較的簡単に書けるのがいい。
fugashi という MeCab のラッパーが Cython を使って MeCab の API を呼んでるらしい。
https://github.com/polm/fugashi
頭いいな、と思った。
Cython を使う側の視点から見ると、思ったよりドラステックな変化はないっぽいので、(習得し直さなくて良さそうなので)また、Cython で何か書いてみたいな。
NumPy のデータとのやり取りができるインターフェースがあるので NumPy と連携する何か Cython で書けないかな。
https://pypi.org/project/Cython/
breaking change があるらしいが・・・
と思ったら、ここにまとまっていた
https://cython.readthedocs.io/en/latest/src/userguide/migrating_to_cy30.html
驚いたことに Cython3.0 でも Python2.7 がサポートされているようだ。
試しに CyMySQL を python2.7 と python3.10 で unittest を実行してみたら、特に Error とか Fail とか発生しなかった。
最近は、 Cython よりも Rust を使われることが多いのかなぁという感じがしている。
Cython で使える C コンパイラをインストールするより Rust をインストールする方が簡単だからかな?
Cython で書くほうが Rust で書くより簡単だと思うし、Cython は、**うまく書けば** C言語で書くくらい速くなるだけでなく、C のライブラリを呼び出すコードが比較的簡単に書けるのがいい。
fugashi という MeCab のラッパーが Cython を使って MeCab の API を呼んでるらしい。
https://github.com/polm/fugashi
頭いいな、と思った。
Cython を使う側の視点から見ると、思ったよりドラステックな変化はないっぽいので、(習得し直さなくて良さそうなので)また、Cython で何か書いてみたいな。
NumPy のデータとのやり取りができるインターフェースがあるので NumPy と連携する何か Cython で書けないかな。
codon [Python]
この記事で codon というものを知る
https://www.theregister.com/2023/03/11/python_codon_compiler/
CPython より 10から100倍速く C/C++ 並に、時には C/C++ 以上に速い・・・とのこと
手元の Ubuntu に
https://github.com/exaloop/codon#install
にあるコマンドを実行して
export PATH=$HOME/.codon/bin:$PATH
と、パスを通したら動いた。
LLVM toolchain を入れないといけないかどうかは知らない(多分 apt でインストールしないといけない)
macOS も同じようにすれば動きそうだ
確かに https://github.com/exaloop/codon#examples このフィボナッチ数列の関数は動くが、
試しに手元のスクリプトを動かそうとすると
- ビルトインモジュールすら色々動かない
- 未定義のローカル変数があったりするとコンパイルエラー
- 例外が発生するところで core dump してしまって StackTrace はいてくれない
と、なかなかハードルが高い。
既存の CPython のソフトウェア資産が使えるというより
- C で書くより、 Python っぽい書き方で書いた方が書きやすいでしょ
- うまく書いたら CPython でも codon でも動くようになってデバッグしやすそう
と理解した。
(自分では計測してないけど)速そうなので期待大だけど、もうちょいビルトインモジュールが動くようにならないと厳しいなぁ。
https://www.theregister.com/2023/03/11/python_codon_compiler/
CPython より 10から100倍速く C/C++ 並に、時には C/C++ 以上に速い・・・とのこと
手元の Ubuntu に
https://github.com/exaloop/codon#install
にあるコマンドを実行して
export PATH=$HOME/.codon/bin:$PATH
と、パスを通したら動いた。
LLVM toolchain を入れないといけないかどうかは知らない(多分 apt でインストールしないといけない)
macOS も同じようにすれば動きそうだ
確かに https://github.com/exaloop/codon#examples このフィボナッチ数列の関数は動くが、
試しに手元のスクリプトを動かそうとすると
- ビルトインモジュールすら色々動かない
- 未定義のローカル変数があったりするとコンパイルエラー
- 例外が発生するところで core dump してしまって StackTrace はいてくれない
と、なかなかハードルが高い。
既存の CPython のソフトウェア資産が使えるというより
- C で書くより、 Python っぽい書き方で書いた方が書きやすいでしょ
- うまく書いたら CPython でも codon でも動くようになってデバッグしやすそう
と理解した。
(自分では計測してないけど)速そうなので期待大だけど、もうちょいビルトインモジュールが動くようにならないと厳しいなぁ。