SSブログ

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 で書けないかな。
コメント(0) 
共通テーマ:日記・雑感

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 でも動くようになってデバッグしやすそう
と理解した。

(自分では計測してないけど)速そうなので期待大だけど、もうちょいビルトインモジュールが動くようにならないと厳しいなぁ。
コメント(0) 
共通テーマ:日記・雑感

DjangoCongress 2022 [Python]

https://django.connpass.com/event/259310/


長いコロナ禍の中、あまり出かけることがなくなって出不精になっていたが、思い切って出かけてよかった

発表資料(の一部)はこちら
https://togetter.com/li/1972175

聞いた話の中では、 Nikkei さんの事例が面白かった。

パフォーマンスのために go で書き直している(書き直そうとしている?)ところはあるが、

- Django 管理サイトと、マイグレーションがいい
- 教育面、プロジェクトテンプレートの蓄積
- 試しに FastAPI も使ってみたが(Nikkei さんの使い方では)そんなに速くならなかった

ということで、まだまだ Django を使っていく感じだった。
よかった。自分も、このまま Django 使っていってよさそうだ。

他のトークやLT で、事例紹介で「ここの QuerySet の書き方をこう書き換えたら速くなった」という話をいくつか聞いて、「あるあるだねー」と思うことも多々あった。
PyConJP よりもさらにテーマが絞られているので、仕事で Django を使っている身としては、色々と面白かった。

せっかくなので、会場にいた人と話ができるといいと思ったけど、なかなか知らない人には話しかけられないので、知っている人としか話できなかった。それは残念。

コメント(0) 
共通テーマ:日記・雑感

PyCon JP 2022 [Python]

先週の金土と PyCon JP 2022 が開催され参加してきた。
久しぶりにたくさんの人に会った。
会社の同僚にも久しぶりに会った。

新型コロナにより引きこもりで出かけるのに億劫になっていたし、配信を見ることもできたが参加してよかった。

ただ、新型コロナ対策なのか、会場の都合なのか雑談できる場所がなくて
セッション中は、スポンサーブースにも静粛が求められて、
ほぼセッションを聞かずにウロウロしてそこらへんで見つけた人と話をしていた僕にしたら、
会場の参加者が雑談できる余地は欲しかったな(話を聞くならリモートでもできるし)と思った。

印象に残った話としては、
1日目の Mark Shannon さんの Python の高速化の話は面白かった。
具体的な話をされたらわからなかったが、これまでの Python 高速化の取り組み例の紹介に
重点をおいていて、自分にも理解できるなようだった。

印象的だったのは
- Python C API が動かせることを重要視していた
- どれくらい高速化できるかは、今後、どれだけ投資が得られるかにかかっている
と Mark Shannon さんが考えていたこと。

高速化については、数人の天才のひらめきで実現されるのかと思っていたが、
計測と改善の繰り返しで、金があれば速くできるとのこと。
JavaScript くらいに投資が得られれば JavaScript くらい速くなるかもしれないとのこと。
コメント(0) 
共通テーマ:日記・雑感

SSL証明書リストのありか [Python]

自分メモ

Pythonで参照しているSSL証明書リストのファイルパスを確認する方法
https://qiita.com/kai_kou/items/21809a358e00b971d2d3

独自(root)CA のインストール方法
https://qiita.com/msi/items/9cb90271836386dafce3

pem: Easy PEM file parsing
https://pypi.org/project/pem/

Python requestsライブラリは認証局の証明書をどう管理する?
https://dev.classmethod.jp/articles/how-to-manage-ca-root-certs-for-requets-library/

Certifi
https://certifiio.readthedocs.io/en/latest/
https://pypi.org/project/certifi/

check-tls-certs
https://github.com/fschulze/check-tls-certs

そのうち、自分で(pythonで)サーバー証明書の検証をやってみたい
https://stackoverflow.com/questions/46553338/how-to-verify-certificate-signature-in-pyopenssl
https://milestone-of-se.nesuke.com/sv-advanced/digicert/digital-certification-summary/
コメント(0) 
共通テーマ:日記・雑感

Products.ZSQLiteDA 0.7.4 リリース [Python]

わりと最近 Products.ZSQLiteDA のアイコンが表示できないよーという Issue をいただいた
https://github.com/nakagami/Products.ZSQLiteDA/issues/8

なんか間違えたらしいけど、最後にリリースしたの、一年半前の話だよ。
使えないわけじゃないらしく、誰も指摘してくれなかったのか、正直、これ使っている人がいる(もしくは動かしてみている人がいる)ことが驚きだなぁ。

ということで、(1回リリースしくじったりしながら) Products.ZSQLiteDA 0.7.4 をリリース。

修正よりも、 Zope のインストールに時間がかかった。

Zope のインストールは https://nakagami.blog.ss-blog.jp/2019-02-16 この時のメモが役に立った。
Plone 5.x が Python3.8 では動かなかったのがショックだったが、
Plone 6 が α4 まで出ているようなので、それに期待しよう。

ZMI 開くと「デザインが新しくないよ」と言われている。
dtml でテンプレート書いてるのを書き換えないといけないんだろうなぁ・・・と思いつつ、そのままにした。
コメント(0) 
共通テーマ:日記・雑感

Azure SQL Database と Python ドライバー [Python]

これは、
Data Platform for Microsoft Azure Advent Calendar 2021 https://qiita.com/advent-calendar/2021/azure-data-platform の 18日目です

Azure SQL Database は、SQL Server なので、SQL Server のデーターベースドライバーをインストールします。

SQL Server で公式に Python のドライバーとして pyodbc と pymssql が紹介されています。
https://docs.microsoft.com/en-us/sql/connect/python/python-driver-for-sql-server?view=sql-server-ver15
pyodbc は、Windows 以外だと、ODBC ドライバーのインストールが必要です。
Windows 以外で使う場合で、 ODBC ドライバーのインストール関連で、うまく動かないなーと言う場合は、Free TDS を使っている pymssql なら、普通は pip install pymssql だけでうまくいくと思います。

それ以外に、 pure python で書かれた pytds と minitds (拙作) があります。

pytds は pip install python-pytds でインストールします。
TDS で接続する場合(Azure SQL と接続する場合)は pip install pyOpenSSL で pyOpenSSL をインストールする必要があります。 pyOpenSSL の部分は pure python ではないです。

minitds は、周辺ライブラリも含めて pure python ですが、テストが十分でないかもしれません。
何か不具合があったら Issue に登録してください。

最近は、パッケージが wheel になっている場合が多いので、真に pure python が必要な場合はあまりないと思いますが、以前 Pythonista http://omz-software.com/pythonista/ で minitds を使っているという方からメールで質問をいただきました。確かに Pythonista のような環境では pure python である必要があると思います。
(他に、こんな状況ってあるかな?M1 Mac とか?)
コメント(0) 
共通テーマ:日記・雑感

paramiko を使い git リポジトリに ssh 接続をする [Python]

これは、 Python Advent Calendar 2021 https://qiita.com/advent-calendar/2021/python の14日目の記事です

そもそもの始まりは、この時 https://nakagami.blog.ss-blog.jp/2021-12-04
SageMaker Studio Lab から git リポジトリに ssh 接続できるとうれしいなぁ、と思ったこと。
git コマンドがあって ssh コマンドがない環境ってあんまりないと思うけど、これはそういう状況。

ssh 接続できると
- プライベートリポジトリにアクセスできる
- push できる
という利点がある。

GIT_SSHという環境に ssh 接続するコマンドを指定できることは知っていた。
なんとか、 SageMaker Studio Lab の環境で ssh 接続できないか・・・

試行錯誤の末、こんなスクリプトができあがった
https://gist.github.com/nakagami/bdae2e98bab06461041b169936c6bb70

Linux の場合(おそらく macOS/BSD でも)こんな感じ

1. ssh-keygen -t ed25519 -C "your_email@example.com" でキーペアを作る → .ssh/id_ed25519 と .ssh/id_ed25519.pub が生成される
2. https://github.com/settings/keys の SSH keys に ~/.ssh/id_ed25519.pub を登録
3. pip install paramiko
4. gitssh.py をどこかに置いて実行権限をつける (chmod +x gitssh.py)
5. .bashrc に環境変数 GIT_SSH として、gitssh.py のフルパスを設定(export GIT_SSH=/path/to/gitssh.py)

のような手順のあと、
git clone git@github.com:github/docs.git
で、ssh 接続 でリポジトリを clone できる。

秘密鍵は ${HOME}/.ssh/id_ed25519 を使うようになっているが、他のパスの秘密鍵を指定したい場合は gitssh.py の該当部分を書き換えて使う

・・・さて、そもそものきっかけであった SageMaker Studio Lab では、
上記で作成した公開鍵を .ssh/id_ed25519 に置いて、環境変数を設定してもうまく動かない。
outbound の port 22 が塞がれているようだ。残念。

幸いにも、 GitHub では、 443 ポートを使って ssh 接続できる。
Using SSH over the HTTPS port
https://docs.github.com/en/authentication/troubleshooting-ssh/using-ssh-over-the-https-port

スクリプトの
PORT = 22
となっているところを
PORT = 443
と変更し、
git clone git@github.com:github/docs.git
でなく
git clone git@ssh.github.com:github/docs.git
と、ホストに ssh.github.com を指定すると clone できた。

めでたしめでたし
コメント(0) 
共通テーマ:日記・雑感

Db2 (と Apache Derby) の pure python ドライバー [Python]

これは、 Python Advent Calendar 2021 https://qiita.com/advent-calendar/2021/python の11日目の記事です

今週 pure python の Db2 データーベースドライバ pydrda の最新バージョン (0.4.5)をリリースしました
https://pypi.org/project/pydrda/

最初に Db2 で動くようにできたのがこの頃
https://nakagami.blog.ss-blog.jp/2019-05-06

実のところ自分が、このドライバーのテストのために動かしている以外に Db2 で動いているのを見たことがなかったので、
(設定やインストールの問題で、自分以外には動かせていないんじゃないかという)
一抹の不安があったんですが・・・
この↓「不正なパスワードだと無限ループする」という不具合の修正の pull request で
https://github.com/nakagami/pydrda/pull/9
自分以外に動かせている人がいるということがわかりました。
・・・というわけで、今週、この pull request をマージしてリリースしました。

ちなみに IBM 製の python ドライバーは、これ↓
- https://pypi.org/project/ibm-db/
- https://github.com/ibmdb/python-ibmdb
API が PEP 249 に従ってなくて、python でデータベースにアクセスするプログラムを書いたことある人には難しく感じるのではないでしょうか。
また、C拡張の部分があるので、インストールにハマることもありそうです。
https://github.com/ibmdb/python-ibmdb/issues
(Mac から使えないという Issue 多いけど、海外では Mac から Db2 に接続するとかあるのか。日本では、その組み合わせはあまりなさそう)

Db2 に python で接続したい人(いれば) pydrda 使ってみてください

コメント(0) 
共通テーマ:日記・雑感

TLS1.3 のラッパー書いた [Python]

これは、 Python Advent Calendar 2021 https://qiita.com/advent-calendar/2021/python の7日目の記事です

今年、 Python で、 TLS 1.3 のラッパー書きました
https://github.com/nakagami/tinytls
https://pypi.org/project/tinytls/

簡単に言えば、ssl モジュール https://docs.python.org/ja/3/library/ssl.html みたいなやつ
ssl モジュールと比較すると

- TLS1.3 の TLS_CHACHA20_POLY1305_SHA256 暗号スィートしか使えない
- X25519 による鍵交換しかできない
- サーバー証明書を検証していない
- Python で実装しているので遅い

と、できないことだらけです。
普通は ssl モジュールを使えばいいので、役に立つものではないんですが、SSL/TLS のラッパーを書いてみるのは、昔からの憧れでしたので(なぜなら、実装するのが難しそうだから。そして、確かに難しかったのですが)曲がりなりにも形になって、とても嬉しいです。

Firebird のドライバーで ChaCha20 がどんなものかわかってきて
https://nakagami.blog.ss-blog.jp/2021-12-02
そういえば、 TLS1.3 で ChaCha20 が使われるようになったぞ。
プロトコルが、TLS1.2から比べて簡素化されたらしいし、サーバー証明書の検証を省略すれば TLS1.3 のラッパーが書けるかもしれないぞ
・・・と思ったのですが、楕円暗号による共通鍵交換とか、HMAC による署名とか、
色々組み合わされていて、ChaCha20 はその中の一部でしかなく、自分には予想以上に難しかったです。

このリポジトリー https://github.com/tex2e/mako-tls13 がとても参考になりました
そして、このブログ https://tex2e.github.io/blog/ 中でも https://tex2e.github.io/blog/crypto/chacha20poly1305 この記事が参考になりました。
どちらも @tex2e さん、すごい。

Python は、遅いんですが、sha256 などのハッシュ関数が組み込みライブラリにあって、数値が多倍長整数型に自然に拡張されるので暗号関連の
実証コードを書くには便利だなと思っています。
コメント(0) 
共通テーマ:日記・雑感