So-net無料ブログ作成
検索選択

はじめての GitHub を観察して [Python]

昨日の
第8回 Pythonもくもく会 @アライドアーキテクツ(恵比寿)
http://mokupy.connpass.com/event/14343/
で、nobolis さんが、はじめての Git で、はじめての Github で英語ドキュメントを和訳して Pull Request を投げようとしていた。

参考にしていた書籍は「GitHub 実践入門」
http://gihyo.jp/book/2014/978-4-7741-6366-6
この書籍の選択は良かったと思う。
(頭のいいひとは、参考書の選択を間違えないなぁ)

「きれいな Patch にしてから Pull Request を出すという流儀もありますが、それは大変なのでとりあえず今日は歴史を修正しないで Pull Request を出せばいいんじゃないですか」
という話をした。
最終的に、とりあえず一回ドキュメントの Pull Request を出していた。
途中で色々試行錯誤していたようだったので、そこまでたどり着いたのはすばらしい。

横で観察していて

- Upstream からの fork
- Fork した自分のリポジトリからの clone
- ローカルリポジトリでのブランチ作成、修正、add、 commit、 push
- 自分のリポジトリから Upstream への Pull Request
- その他、適宜 pull

と、ひとつひとつはコラボレーション(他人の足を踏まずに作業する)のためには意味があることなのだけれども、初めての人のは手順が多くて大変だなあ、ということを再認識した。
GitHub のfork が、Git 的には clone と同じというあたりがややこしい。

いままでは Subversion はおろか、RCS までさかのぼったどんな VCS も使ったことないところからだったから、さぞかし大変だったろう。
(・・・ひょっとして、過去の歴史を知らないほうがわかりやすいのかな?)

最初に EUC-JP で修正したテキストをコミット& push して文字化けしてた。
僕にとっては馴染みのある失敗なのだが、ああいうのを IT業界でないひとが、周囲にいる人に聞かずに一人で解決するのは大変だろうなぁ。

最近、仕事では GitHub にリポジトリがあるという話をよく聞く。
使い方を教えなくても、皆が知っているということはやりやすいことだろう。
気がつくと、GitHub は使えてあたりまえという時代になっていた。
OSS もGitHub にホスティングするものが特に最近急激に増えてきた。
オープンデータやオープンなドキュメントをGitHub に公開している
例もちらほらあって、もうソースコード開発のためだけのものじゃない。

最初に GitHub というサービスを知ったときには、OSS開発者の中の尖った人だけが使うものという印象だったが随分と広がりを持つようになって、僕は全く見る目がないということを思い知る今日この頃

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

PostgreSQL の driver minipg を -m オプション付きで実行できるようにする [Python]

python を起動するときのオプションに -m というのがあって、

$ python -m foo

とすると foo モジュールをスクリプトとして実行します。
・・・とのことですが、もうちょい正確にいうと、 foo がモジュールだったらfoo.py を実行、foo がパッケージだったら foo/__main__.py を実行ということのようです

このオプションを使うことは、僕自身はあまりなくて
python -m SimpleHTTPServer で、HTTP Server が立ち上がるというのと
python -m profile foo.py で foo.py を実行してプロファイル情報を表示する
というのを実行したことがある、程度でした。

・・・が、データーベースのドライバーで、データーベースにクエリを投げた結果が表示できるようになったら、ひょっとしたら便利かな、と思ってやってみました。
こいつ↓を pip install minipg でインストールして
https://pypi.python.org/pypi/minipg/0.5.1

$ echo 'select * from foo' | python -m minipg -U user -W password -D db_name

とすると、クエリーが実行されて結果が標準出力に出力されます

psql コマンドを使えば同じ(以上の)ことはできると思うので、この機能があってどれくらいうれしいかわからないけど、 argparse の使い方と -m オプションで実行される機能のサンプルとして機能を追加しておきます。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Plone の日本語 Splitter c2.splitter.janome の公開 [Python]

Plone の日本語 Splitter c2.splitter.janome を公開しました。
Plone へのインストールは、ここ↓を参照してください
https://github.com/nakagami/c2.splitter.janome
(・・・といっても eggs に1行追加して buildout の実行だけです)

インストール後の設定については↓ここを参照してください。
http://takanory.net/plone/basic/splitter/
(「日本語での検索設定」の ejSplitter を c2.splitter.janome に読み替えてください)

【Plone を知らない人向けの解説】
Plone は Zope という python 製 Web Application Framework 上に構築された Contents Management System です。
http://plone.jp/
https://plone.org/

来る 6/13, 6/14 に、 Plone Symposium Tokyo 2015 という Plone の国際イベントが日本で開催されます。
興味のある方は参加してみてはいかがでしょう。

【janome を知らない人向けの解説】
janome は、 pure python で書かれた形態素解析器です
http://mocobeta-backup.tumblr.com/post/115843098157/pure-python-janome
python から使う形態素解析器には MeCab を使ったパッケージ mecab-python があるのですが、インストールの難易度が高く障壁になっていました。 janome は

pip install janome

でインストールできます。

【謝辞】
bigram の Splitter である c2.splitter.twocharactersをパクリベースにしました
c2 の namespace のままパッケージを公開することに快諾いただいた CMSコミュニケーションズの寺田さんに感謝します。

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

janome のソースコードを読む(つづき) [Python]

これは「第7回 Pythonもくもく会 @アライドアーキテクツ(恵比寿)」
http://mokupy.connpass.com/event/13840/ の記録で、かつ http://nakagami.blog.so-net.ne.jp/2015-04-11 の続きです。

前回のこれ↑の直後に、python2.7 と python3.4 の両方で動くような修正の pull request を送ったのだが、今日、それが動いていないことを発見。超恥ずかしい。
言いわけをさせてもらうと python setup.py test でエラーメッセージが出ていなかったので大丈夫だと思っていた。

そのことは @moco_beta さんは(当然ながら)気づいていたようなので、お任せして、もっと真剣にソースコードを読むことにした。

前回のソースコードリーディングのあとで、 http://mocobeta.github.io/janome/ ここに紹介されている「自然言語処理の基礎」の第3章を読んだので、さっぱりわからないから、クラス名が何を意味してるか多少わかる状態からのソースコードリーディングとなった。

fst.py は、何をしているかわからないけど、まあそういうもんだから知らなくてもいいな、と理解した。そんなわけで、今日は一日かけて lattice.py と tokenizer.py の300行弱のコードを読んだ。
・・・が、ほぼ一日にらんでいたが完全に理解するまでには至らない。うーん、難しい。
結局のところ経路探索の問題で、Lattice.backward() で逆順にたどって最小コストのものだけを取得していることはわかった。
しかし、Lattice の、すべての経路をたどる方法がよくわからない。そんなことできないのかも知れないけど、できないのかどうかもよくわからない。
Lattice の内部に snodes と enodes の2つメンバーを持たなければいけない意味もわからない。
どっちかひとつにまとめることはできないんだろうか?

インデックスの始まりが 1〜になっている部分があったり、 Lattice.conn_costs のようにメンバーは宣言されているけど使ってない変数とかあって、参考にしたソースコードの影響とか、試行錯誤した名残があるのかな、と思った。

(2015-04-20追記)
snodes には node の先頭文字の位置が、 enodes には node の最後の文字が入る位置が記録してあって、どちらも必要なようだ。


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

janome のソースコードを読む(まだ途中) [Python]

これは「(第53回)Python mini Hack-a-thon」の記録です
http://pyhack.connpass.com/event/13504/

前回は mecab をインストールしてソースを読んでました。
http://nakagami.blog.so-net.ne.jp/2015-03-28
・・・が、まあ自然言語解析の素養がないのでさっぱりわかりません。

その後、たまたま Janome という Pure Python の形態素解析器がリリースされました
http://mocobeta.github.io/janome/
今日は、これをインストールしてソースを読みました(まだ途中)

何が書いてあるかさっぱりわからないことには変わりないですが、だいぶ読みやすく分量も少なく、
解析器全体で 1000行以内なので、
「ふーん、この程度でできるんだー」
という感じはしました。
(まだ、mecab のごく一部の機能しかないのですが)
せっかくなので、もうちょっと勉強したいと思います。

Python3.4 でしか動かなくて、これはこれで良いと思っているのですが、 Python2.7 でも動くようにしたらうれしいかな・・・

(追記)
これを書いた直後に python2.7 で動くバージョンのブランチが作成され、パッケージがリリースされてた

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

Python を使う人が増えて [Python]

この前、
「古くから Python をやってる人にとって、最近 Python を使い始めた人のことはどう思ってるんですか?」
という質問を受けた。要するに、古参が「この新参者め!」と思ってないかってことかと。
他の人は知らないが、僕にとっては新しい人が増えて Python が普通のものになるのはとても嬉しい。
昔は、
「nakagami さんに Python とかいうマイナーが言語でスクリプト書かれたけど他の人には保守できない。Perl のがいいのに」
みたいなことを言われたりしたが、今なら Python で書くことに文句を言われないだろう。

数値解析・統計をやっているような自分とは違う分野の人と知り合いになるのも楽しい。
書籍も、良い内容のものが増えてくる。
「PyConJP のチケットさばけるだろうか?いつまで続けられるんだろうか?(参加するだけだけど)」
と心配していたが、今の状況だとチケットはすぐさばけそうだし、セッションのクオリティも維持できる気がしている。

国内のことだけじゃなくて、パッケージングが整理され便利なパッケージが PyPI に登録されたり、PyPy が CPython より速くなったり Cython(旧 Pyrex)が進化したり。
人が増えるということは、単純に色々な取り組みが増えて、新しい発見もあるし便利にもなる。
何か困ったことがありましょうか。

ただ心配なこともある。例えば

- メシを食うためにだけ Python を使っている人が増える
- COBOL 世界の業務のやり方が無理矢理導入される

みたいなことだ。

上は、ループをかけない Java プログラマーや Ruby を知らない Rails プログラマーみたいな人が増えるってこと
下は、「アルファベット2ケタと数値○ケタで機能を表す。番号を採番する担当者がいる」みたいな世界

実際、僕は見てないが
「あー、頑張って Django で書いちゃったのねー」
みたいなのもあるらしいので、その時は近い・・・かも。

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

Jython の開発版をビルドして実行する [Python]

これは、「第5回 Pythonもくもく会 @アライドアーキテクツ」の記録です
http://mokupy.connpass.com/event/11807/

Jython 2.7 Beta4 が最近出ました
http://fwierzbicki.blogspot.fi/2015/02/jython-27-beta4-released.html

次は RC だそうですが、Beta3 が出たのが去年の8月なので、今年中に final がリリースできるかどうか予断を許しません。(Jython の開発は非常にゆっくり進んでいる)
ただ、そろそろプロダクションに使ってもいいレベルだと思っています。コミッターの皆さんは開発版を使っているに違いありません・・・と思うくらいに。

リリース時には、2.5.3 と同じようなインストーラーが用意されるようです。
また、最近のbeta も含むリリースでは Maven Central にも jar ファイルが上がっているので、そこからインストールしても良いと思います(←よくわかってない)

私は開発リポジトリの最新をビルドしています。以下、ビルド手順

【用意するもの】
- mercurial(ソースを取得するため)
- JDK1.7 以降(私は Ubuntu 上の Oracle JDK1.8 を使ってます)
- Apatche Ant

【手順】
$ cd $SOMEWHERE
$ hg clone http://hg.python.org/jython
$ cd jython
$ ant
(これで $SOMEWHERE/jython/dist/jython-dev.jar ができる)
$ export PATH=$PATH:$SOMEWHERE/jython/dist/bin


【実行例】
jython とだけ打つと、インタラクティブシェルが立ち上がります。
java のクラスが import できる以外は、使い方はほぼ CPython 2.7 と同じ。
$ jython
Jython 2.7b3+ (default:301e2a08b0c9, Feb 25 2015, 03:48:16)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_31
Type "help", "copyright", "credits" or "license" for more information.
>>>


【pip install】(追記)
今日知ったが
$ jython -m ensurepip
を実行すると
$SOMEWHERE/jython/bin/pip ができて pure python 2.7 のパッケージなら
$ $SOMEWHERE/jython/dist/bin/pip hogehoge

もしくは
$ jython -m pip install hogehoge
で package hogehoge が jython の環境にインストールできる

$SOMEWHERE/jython/dist/Lib/site-packages にインストールされている

ひえー、すごい
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

PostgreSQL のSQL:2006 統計関数((第51回)Python mini Hack-a-thon の記録) [Python]

SQL:2006 で、分散、標準偏差などの記述統計とか相関関数が定義されて Oracle, DB2, SQLServer では使えるっぽい。

個人で気軽に使える環境だと、最近の PostgreSQL は使えるらしい。
https://www.postgresql.jp/document/9.3/html/functions-aggregate.html#FUNCTIONS-AGGREGATE-STATISTICS-TABLE

ということで実行して結果を確認するテストコード書いた
https://gist.github.com/nakagami/755bc066c5e9ee8354dd

仕様を見ると計算方法はわかりそうなんだけど、意味が分からない。
高校の数学や学部の2年までに少しは勉強したはずだが忘れた。

次は、基礎的な統計の勉強をしなくてはいけない。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird3 の ネットワークプロトコルと pyfirebirdsql 0.9.6 リリース [Python]

このエントリーは
(第49回)Python mini Hack-a-thon の活動の記録
http://pyhack.connpass.com/event/10256/

Firebird Advent Calendar 2014 の20日目の記事です
http://qiita.com/advent-calendar/2014/firebird

ここでも少し触れましたが、
http://nakagami.blog.so-net.ne.jp/2014-02-15-2

Firebird のネットワークプロトコルの機能については、以下のような変遷があります
(今回 Firebird のソースを調べ直しました)

PROTOCOL_VERSION10:
- Interbase6.0 と同じ。Firebird1.0 から Firebird2.0 まで

PROTOCOL_VERSION11:
- Firebird2.1。
- ptype_lazy_send という、リクエストに対するレスポンスを後でまとめて返すことによって性能向上をはかる
- WIN_SSPI という Windows の認証対応

PROTOCOL_VERSION12:
isc_dpb_utf8_filename という utf8 でファイル名を渡すパラメータの追加
op_cancel オペレーションの追加
(プロトコル上の変更はほとんどなし)

PROTOCOL_VERSION13:
- SRP プロトコルによる認証、鍵交換 (FB3 Alpha1)
- 通信データのの RC4 暗号化 (FB3 Alpha1)
- NULL のとき余分なデータを転送しない (FB3 Beta1)
- 通信データの圧縮 (FB3 Beta2)

pyfirebirdsql 0.9.5 では、PROTOCOL_VERSION13 の FB3 Alpha1 までの
機能を実装していました
https://pypi.python.org/pypi/firebirdsql/0.9.5

しかし、その後 NULL データを転送しない修正により Beta1 で動かなくなっていました
http://tracker.firebirdsql.org/browse/CORE-2897
https://github.com/asfernandes/firebird/commit/c41493c756cdd6c7118e396aeec814f1b14bed3a
がーん。
C++ のソースを見ただけではどこでどうしていいかわからなかったので、やり取りされるデータを観察しながら修正しました。
・・・というわけで、 0.9.6 をリリースしました
https://pypi.python.org/pypi/firebirdsql/0.9.6

Beta2 でリリースされるという通信データの圧縮はオプションなようなので、
今後プロトコル仕様に変更がなければFirebird3.0 のリリース版でも使えると思います

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

Python の Database driver の非同期 I/O サポートって何やればいいの? [Python]

https://github.com/nakagami/minipg/issues/1 の issue で
「gevent コンパチブルなの?」
と聞かれた。
非同期 I/O の機能のことを聞かれているのはわかったが、どういうAPI を実装すればよいのかわからない。

調べてみて、ひとつわかったことは、
「defacto なインターフェースはないからドライバー毎に好きにすればいい」
らしいこと。
pure python で書いた Database driver だったら、何らかの非同期 I/O のサポートを入れることはできそうなんだけど。
Python3.4 に asyncio モジュールが入ったことだし、どうせなら、そこらへんも加味した長いこと使われる形にしておきたい気がするのだが・・・

というあたりで止まってしまった

以下調べてヒットしたことをメモって後で読み直す(かも)

greenletを使う場合にはPostgreSQLを使う方がいいという話
http://d.hatena.ne.jp/mopemope/20100909/p1

[翻訳] geventのeventletとの比較
http://blog.liris.org/2010/04/geventeventlet.html

Python プログラマーのための gevent チュートリアル
http://methane.github.io/gevent-tutorial-ja/

Psycopg2 のドキュメント
http://initd.org/psycopg/docs/advanced.html#support-for-coroutine-libraries

Pinterest: geventでコードベースをマルチスレッドに
http://wazanova.jp/post/66168819162/pinterest-gevent


python3.4 の asyncio
https://docs.python.org/3/library/asyncio.html

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