So-net無料ブログ作成

Zope4(Plone5.2) のインストールと実行 [Python]

これは、(第96回)Python mini hack-a-thon の記録です。

Zope のFirebird Database adapter で Zope4 で動くやつあるの?
という Issue が来た
https://github.com/nakagami/Products.FirebirdDA/issues/2
ので Zope4 で何とかならないか調べてみた


Zope4 を(Python3で) 一番簡単にインストールする方法として、 Plone 5.2 の インストール方法のページを寺田さんに教えてもらった。

https://www.starzel.de/blog/four-options-to-try-plone-5-2-on-python-3

一番下、Update: のところの、 github のリポジトリをクローンしてbuildout する方法で動いた。
$ git clone git@github.com:plone/buildout.coredev.git coredev
$ cd coredev
$ git checkout 5.2
$ python3.7 -m venv .
$ ./bin/pip install -r requirements.txt
$ ./bin/buildout
$ ./bin/instance fg


で、Product.FirebirdDA を加えて buildout してみると・・・

diff --git a/buildout.cfg b/buildout.cfg
index 1d5298c77..9b03fa230 100644
--- a/buildout.cfg
+++ b/buildout.cfg
@@ -1,3 +1,6 @@
 [buildout]
 extends =
     core.cfg
+
+develop =
+     src/Products.FirebirdDA
diff --git a/core.cfg b/core.cfg
index 5392330ef..95e74b137 100644
--- a/core.cfg
+++ b/core.cfg
@@ -35,6 +35,7 @@ config-directory = ${buildout:directory}/etc
 # hook for custom eggs. In local.cfg this can be extended
 # with += to add custom eggs for whatever intend.
 custom-eggs =
+     Products.FirebirdDA

 # non-immersive development helpers commonly needed for Plone Core Development
 devtool-eggs =

ZSQLMethd とか、いろいろ関連する Products が動かないっぽいなー・・・
ということで、そう答えてクローズした。

・・・と思ったら、
ZMySQLDA は動くよー、と言われたので Reopen
https://github.com/nakagami/Products.FirebirdDA/issues/2#issuecomment-464300313

今日はここまで

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

MySQL 8.0 の caching_sha2_password 認証 [Python]

これは これは、BeProud Advent Calendar 2018 https://adventar.org/calendars/3338 の21日目の記事です。

2018年といえば MySQL8.0 が GA になりました。

MySQL 8.0 では、 caching_sha2_password という認証メソッドがデフォルトになりました。
https://dev.mysql.com/doc/dev/mysql-server/latest/page_caching_sha2_authentication_exchanges.html
ざっくり言うと、データーベースの中に保存してあるハッシュ化されたパスワードと、
一時的な nonce でハッシュした値でパスワードが一致しているか確認するアルゴリズムです。

それまで長いこと mysql_native_password という認証メソッドがデフォルトでした。
https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase_authentication_methods_native_password_authentication.html
20 バイトの scramble とパスワードをハッシュした値が一致しているかを確認するアルゴリズムです。
よくある、シード付きのハッシュパスワードです。

私は、 CyMySQL という PyMySQL からフォークした MySQL のドライバーをメンテナンスしています。
https://github.com/nakagami/CyMySQL
まず、このドライバーでcaching_sha2_password プロトコルの実装をすることができました。

気をよくした私は、 Go 言語のドライバーで実装し pull request を送って、無事マージしてもらえました。
https://github.com/go-sql-driver/mysql/pull/794
わーいわーい。

さらに気をよくした私は、elixir のドライバーの pull request も送りました。
3か月の放置された後、10日程前に、無事マージされました。
https://github.com/xerions/mariaex/pull/236
わーいわーい。

pythonでプロトタイプを書いて、ほかのプログラミング言語に実装・・・11日目と同じでしたね。
https://nakagami.blog.so-net.ne.jp/2018-12-11-1
コメント(0) 
共通テーマ:日記・雑感

動く疑似コードとしての Python [Python]

これは、BeProud Advent Calendar 2018 https://adventar.org/calendars/3338 の11日目の記事です。


2018-10-21 にあった tokyo.ex#9 というイベント
https://beam-lang.connpass.com/event/103873/
の LT で、
「elixir のPostgreSQL ドライバーに Pull Request を送ってマージされたよ、わーい」
という話をした。
PostgreSQL 10 で実装された scram-sha-256 authentication method に対応したものだ。

https://gist.github.com/nakagami/db99822eef3033acfbfe11241cc15547

この時のメインテーマは 「Jose Valim さんはいい人」だった。

これを、BeProud Advent Calendar 目線で語ると、elixir で実装する前に、自分が書いた Pure Python のPostgreSQL ドライバー https://github.com/nakagami/minipg に scram-sha-256 認証のメソッドを実装して動作を確認できたことが大きかったと思う。
https://github.com/nakagami/minipg/commit/d4ef01ae2867b267c4e4dca8550b9cfce0a61ccc

自分の慣れもあるだろうけど、python は、ビルトインのライブラリも充実していて、例えば、今回であれば
「hashlib と base64 と hmac 使えばできるはず!」
という予想ができて、逆に、python のライブラリを活用しても実装するのが困難な機能は、他言語で実装するのは無理だろう、という信念に基づいて実装できた。
Python は実行は遅いけど、検証のために「とにかく動くものを作る」のには、とても適していると思う。

まあ、正確に言えば、先に Python で実装して、
「なんか、自分書いたら勉強になるプログラミング言語で、まだ、この機能が実装されてないドライバーはないかなぁ・・・」
と探した結果なんだけれども。

Python で、PostgreSQL のドライバーといえば psycopg2 がデファクト・スタンダードだが、リファレンス実装として Pure Python の PostgreSQL ドライバーを書いておいて良かった・・・と思う今日この頃

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

韓国人女性プログラマーの思い出(総集編) [Python]

これは、 PyLadies Advent Calendar 2018 の8日目の記事です
https://adventar.org/calendars/3116

そういえば、昨年も PyLadies Advent Calendar 2017 に参加したんだった  https://adventar.org/calendars/2462
今回も Python はあんまり関係なく、女性とプログラマーについて書く。

過去、何度か、前職で韓国人女性プログラマーと一緒に仕事をした話を書いた。
https://nakagami.blog.so-net.ne.jp/2010-06-18
https://nakagami.blog.so-net.ne.jp/2012-05-12
https://nakagami.blog.so-net.ne.jp/2016-09-12

ざっくり言うと、
- オフショア開発がブームになる前に、韓国人や中国人に日本に来てもらってソフトウェア開発をしようというブームがあった
- 韓国では、それに合わせて「日本語とプログラミングを学んで日本で働こう」みたいなブームがあった
- 韓国に「日本語+プログラミング」の専門学校がたくさんできて、そこで、日本の勤務先の斡旋もしてくれた
- 日本に働き始めると、リーマンショックで仕事がなくなった
ということで、転職を余儀なくされていた。

彼女たちの転職の条件は2つ
- 当面の給料が払われること
- 就労ビザを発行してもらうための会社側の手続きをしてくれること
将来にわたっての職の安定なんて考えてなかったと思う。

会社の規模や信用度によって、ビザの期限は1~3年だったが、そのビザが切れる前に再発行してもらうためには、受け入れ側の会社から提出しなくてはいけない書類があった。
信用も実績もない会社だったので、前回より多くの資料の添付を求められて、それでいて発給されるビザは1年だった。
(そして、現実問題としてアメリカ人と比べて韓国人の就労ビザ発給は難しかった)
会社も、やったことない手続きで大変だったと思うが、日本人なんか転職して来ないんだからしょうがない状況だった。
彼女らはJava とか PHP を書いていたけど、転職で Python を書くことになった。別にプログラミング言語は何でもよかったんだと思う。就労ビザさえ発給されれば。
僕が社会人になった頃の労働基準法では女性の深夜勤務は禁止されていたので、女性が深夜勤務することに抵抗があったが、彼女らはそんなのは気にしてなかった。
きっと、日本に来た時からそんな風に働いてたんだろうなぁ。

その時、結果として本人達にも会社にも良い結果になった。会社の業績はうなぎのぼりで大きくなり彼女らは引き続き日本で働けた。
「プログラマーって性別も国籍も関係なく、本人の努力と能力で未来が切り開ける職業なんだなー」
ってことを強く思った。


結局、東北の震災をきっかけに親に説得されて泣く泣く帰国したり、産休ののち出産して復職することなくやめたりして、あの時の韓国人女性たちは、もう誰もその会社に残ってない。
本人たちには不本意だったと思うが、良い思い出のまま会社を離れてくれて僕にとっては良かった。

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

RHEL8 とUbuntu のPython2.7 [Python]

RHEL8.0 の beta がリリースされたそうで、python3.6 と並んで python2.7 (も、まだ)サポートされるようだ。

https://developers.redhat.com/blog/2018/11/14/python-in-rhel-8/

yum install python3
で python3.6 が
yum install python2
で python2.7 がインストールされる。
それぞれ「python3」「python2」というコマンドで 実行できるが「python」を実行しようとしてもコマンドがないと言われる。

alternatives --set python /usr/bin/python3

とすると python で /usr/bin/python3 が起動されるけど、そういう使い方は推奨しない、とのこと。

Ubuntu の次のLTS は20.04 だと思うので、次の LTS にはpython2.7 は含まれないだろうが、Ubuntu 18.04 が 10年サポートされそう
https://gihyo.jp/admin/clip/01/ubuntu-topics/201811/16

ディストリビューションに付属する python2.7 であれば、セキュリティパッチは開発して当て続けてくれるだろう。

みんな早く python3 に移行して欲しいなぁという思いもありつつ、既存のものは python2.7 で使えるなら、できればこのままにしておきたいというものもあり、悩ましい。
正直な感想を言えば、ちょっと安心した。

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

Plone Conference 2018 Talks Day2 [Python]

日本で行われた Plone Conference 2018 に参加した。
国際カンファレンスなんて色々ハードル高くて無理!と思っていたが、terapyon のおかげで出られた。ありがとう。

- トレーニング2日
- トーク3日
- スプリント2日

のうちトークの 1.5日(2日目と3日目の午前)だけ出られた .

分かっていたことではあるが、しみじみ
「英語、何喋ってるか全然わからんなー」
と思った。
他の日本人は、みんな英語できて偉いなーと思う。偉いなーとは思うが、自分は生い先短いのし、英会話はあきらめた。
ただ、リスニングに比べたら読むのは大分マシなようで言っていることに比べるとスライドに書いてあるは大分わかった。
英語の読み書きはもうちょいできるように頑張りたい。

Jim Fulton のトークは、スライドに説明の記載があって ZODB がツリー形式のオブジェクトデーターベースだ、ということも知っていたので何の発表かはわかった。
http://jimfulton.info/talks/plone-2018

10年前に、Jim Fulton のキーノートセッションを僕が直接聞くことがあるなんて想像できなかった。
Jim Fulton は昔と変わらず新しいことにチャレンジしているようで、Jim Fulton が genvet, async wait, react という言葉が出るとは思わなかった。
ちなみに、react の話題が多かった。

Python3 で動くようになるようだし、しばらくしたら Plone をインストールして久しぶりにちょっと動かして見ようかな、と思った。
コメント(0) 
共通テーマ:日記・雑感

Django のデーターベースルーター [Python]

複数のデーターベースの接続先を設定して、

Article.objects.using('smapdb').filter(条件...)

というように、 using() をつけると指定のデーターベースへの QuerySet が取得できる。

モデル毎にアクセスするデータベースを切り替えたいというときには、データーベースルーターというのを使えいいらしいというのは聞いていたが、必要になって調べてみると、(また)tokibito さんが以前書いていた。ありがたやありがたや。

https://tokibito.hatenablog.com/entry/20160202/1454344534

ただ、試してみるとコードがちょっとおかしい。
allow_relation() と allow_migrate() で、myapp でないときの処理が足りないようだ。
また、 db_for_read() と db_for_write() は間違ってはいないけど、 if 文の条件に合わない場合に None をかえしているのがわかりにくい

MyAppRouter を以下のようにしたら、意図した結果になった。

class MyAppRouter:
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'myapp':
            return 'smapdb'
        return None
    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'myapp':
            return 'spamdb'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if (obj1._meta.app_label == 'myapp' and
           obj2._meta.app_label == 'myapp'):
           return True
        elif (obj1._meta.app_label != 'myapp' or
           obj2._meta.app_label != 'myapp'):
           return True
        return False

    def allow_migrate(self, db, app_label, model=None, **hints):
        if app_label == 'myapp':
            return db == 'smapdb'
        else:
            return db != 'smapdb'

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

pycrypto から pycryptodome へ [Python]

Python には、PyCrytpo という暗号/復号ライブラリーがあって、便利なんだけど、もう5年も更新されてない死んだプロジェクトになってしまっていた。

これ、どうしたもんかなーと思ってたんだけど、手元の Ubuntu にインストールするにはあんまり困らないもんだから
「ま、いいか」
と思ってたんだけど、他に代わりになるものがないか調べたら今は pycryptodome というのがあった

https://pypi.org/project/pycryptodome/

PIL に対する Pillow や mysql-python に対するmysqlclient のように、 pycrypto から fork して別の名前で pypi に登録してくれているようなのだが、(・・・なので、使い方は基本的には pycrypto と同じ。バージョンが上がって削除されたメソッドもあるようなんだけど、使いそうなのは大丈夫っぽい)
なんといっても、Windows や osx の wheel が用意されているのがありがたい。

(追記)
別系統で、 cryptography というのがあるらしい
https://github.com/pyca/cryptography
これも、メンテナンスが継続されていてよさそう
コメント(0) 
共通テーマ:日記・雑感

DjangoCongress 2018 [Python]

昨日行われた DjangoCongress 2018 の Day 1 にSpeaker として参加してきた

https://djangocongress.jp/

人前で緊張するということはないけれども、
- 発表自体が尺に会うか(ものすごく時間が余ったり、時間が足りなくて話したいことが話せないのではないか)
- トラブルで画面に出せなかったりネットワークが使えなくて発表が台無しにならないか
が気になって、45分のトークは緊張した。

発表内容はこれ https://gist.github.com/nakagami/098db7387d78ab9c6aa85d77a0eeecf5

後半は駆け足になってしまったが、それも尺が余った場合に丁寧に話そうと思って用意していたものなので、自分的には満足のいく発表ができた。
内容は、 PyCon JP の CfP では通らないようなニッチな内容だったので、発表する機会が与えられて良かった。
終わったら、どっと疲れが出て、俺ってこの発表がこんなに重荷になってたんだなぁって自分で驚いた。

他の人のトークも、雑なアニメコラージュでうけ狙いみたいなのがなくて良かった。
みな「内容は雑でたいしたことないけど、有名人だから」みたいな発表ではなかった。そういう CfP があったのかどうか知らないけど。

自分のもほかの人のも、トーク中に聞いている人が twitter にハッシュタグ #djangocongress 付きで投稿してくれている人が多くいてよかった。トークの様子もわかるし、盛り上がっている感じも伝わるし。

なにより良かったのは、スタッフの人たちが終わったときに口々に「良かった」と表明していたことだった。
ボランタリーで無報酬でやって、達成感はあるものの自分の聞きたいトークも聞けなくて燃え尽きて終わってしまう→イベントが開催されないとなったら残念なので。

結局、100人という規模で食事とかノベルティとかいろいろしないで運営の負担が少なかったのが良かったと思う。
もしよかったら来年もできる範囲で開催されるといいなぁ、と思う。

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

Windows + Python 3.6 の msys2 + minitty で utf-8 [Python]

気が付いたら、Python3.6 では、Windows で、コマンドプロンプトとファイルシステム(フォルダー名、ファイル名)のデフォルトの encoding が utf-8になってた

https://www.python.org/dev/peps/pep-0528/
https://www.python.org/dev/peps/pep-0529/

以下のようなーコードで
import sys
print(sys.stdin.encoding)
print(sys.stdout.encoding)
print(sys.stderr.encoding)

print('あいうえお')
コマンドプロンプト上で
utf-8
utf-8
utf-8
あいうえお
こんな感じになった。

すばらしい

しかし自分が普段使っている Git for Windows (Msys2) + mintty で、
上記と同じWindows にインストールした python3.6 で実行すると
cp932
cp932
cp932
▒▒▒▒▒▒▒▒▒▒

となってしまう。

・・・結局、環境変数に

export PYTHONIOENCODING=utf-8

を設定したらutf-8 でうまく表示できた。

まだ、minitty で interactive shell が動かないんだけど、コマンドプロンプトでは interactive shell ちゃんと動くし自分の Windows 環境がだいぶ良くなった。

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