CPython 3.2ソースコードリーディング第2回

今日はCPython 3.2ソースコードリーディング勉強会に参加してきました。

まず、この勉強会に参加したモチベーションから。

私はPythonをまったく使ったことがなかったのですが、最近意識的に使うようにしています。来年からの就職先ではPythonを重要な言語に位置づけているので今のうちに慣れておきたいって気持ちもあるのですが、一番は私が研究対象としている(C)Rubyと対比されることが多いからです。研究に役立つ知識が得られたら嬉しい。敵を知り、己を知れば百戦危うからず、みたいな。

肝心の勉強会の内容は次の通りです。

PyObjectの構造,CでOOPする方法 (@cocoatomo さん)

Cでオブジェクト指向言語処理系を実装する方法と、その実例としてCPythonのPyObject周りを説明されてました。CRuby処理系とほぼ同じ仕組みだったので、この辺りはすんなり理解できました。

参照カウンタ (@mayahjp さん)

Pythonにおける参照カウンタの話。Py_INCREFとPy_DECREFを使って参照カウンタを増減していたり、カウンタの増減の前後で不正なデータアクセスを起こさせない仕組みなどを説明されてました。

この辺りは積ん読状態のGC本を片手にしっかりと読んでみたいところ。

表とハッシュと連想配列 (@finalfusion さん)

タイトル間違っているかも。Pythonを含む様々な言語におけるハッシュ実装の仕組みとその違いについての紹介でした。言語ごとにハッシュ値の作り方がまったく違うのが面白かったです。ハッシュサイズは素数にするべきか、2の冪乗にするべきか、とか、単純にビットシフトさせたものをハッシュ値として使っちゃう、とか。是非読み比べてみたいところ。

dict実装の効率化 (@methane さん)

Python 3.2 では小さなdict (small table) はオブジェクト内に埋め込まれていて、ある程度の大きさになると外部にメモリを確保してそちらのみを使うようになるらしい。そうなるとsmall tableのスペースが無駄になるので、そんなものは最初からオブジェクト内に含めないようにすることで省メモリ化しようという話。小さなdict用にfreelistを用意しておいてそこから割り当てたり、memsetをコールする回数を減らして効率化を図ったりしているそう (この辺りは聞き逃してしまいました)。

結果は思ったよりも良くなく、もう少し効いても良さそうなのになー、と感じました。

SphinxとblockDiagで手軽にドキュメント (@tk0miya さん)

ドキュメント生成ツールSphinxと、Graphvizみたいな記法で簡単にシーケンス図などが描けるblockDiagなどの紹介でした。Sphinx面白いですね。機会があれば是非使ってみたい。blockDiagはJSONPでシーケンス図が描けてこれまた楽しそうなツールでした。



そんなこんなで4時間あっという間でした。とても楽しかったです。主催者、発表者のみなさん、ありがとうございました。

やっぱ勉強会は話者として参加したいなぁ・・・Pythonネタがあれば良いんだけど。

プログラム内蔵方式

Wikipediaの「プログラム内蔵方式」の項を読んでいたら、思っていた以上に複雑な考えだったのでメモ。合っているかは分からないです。

プログラム内蔵方式 - Wikipedia

"プログラム内蔵方式"の意味って複雑なんだな http://j.mp/e7RJkb
http://twitter.com/#!/n_hiroki/status/56803212933603328

配線プログラム≠プログラム固定
http://twitter.com/#!/n_hiroki/status/56804264965701632

"プログラム固定"とは実行可能なプログラムがただ一つかどうかの違い。配線プログラムであっても、物理的に差し替えることで別のプログラムを実行可能であればプログラム固定ではないってことでOK?
http://twitter.com/#!/n_hiroki/status/56805037019635712

えーっと、つまり"プログラム固定"とはプログラム自体を書き換えられるかどうかではなく、実行するプログラムを変えられるかどうかである、ってことか。
http://twitter.com/#!/n_hiroki/status/56805303601217536

バズワード(´・ω・`) "このように「プログラム内蔵」は厳密な意味で用いることのできない言葉であるため技術用語、専門用語としてはあまり使えない。きわめて曖昧な意味で使われている。" http://j.mp/e7RJkb
http://twitter.com/#!/n_hiroki/status/56806222090870784

アクセルを踏み込む

細切れの時間に読もうと鞄に忍ばせている本って、何週間、何ヶ月も入れっぱなしになってて、結局机の上に放り出されることがよくあります。結局重い思いをして、筋トレにしかならなかったり。

読むときは徹夜してでも一気に読み切ってしまう。それが私の最近の読書スタイルです。

ところで、某社長さん曰く、サービスを作る上で大事なことは「勝機 (商機?) が見えたら躊躇せずにアクセルを踏み込む」ことらしい。なるほど、確かにその通りだ。

アクセルを踏み込む大切さは何にでも当てはまる。「毎日コツコツ」じゃやっぱ駄目で、大事な時期にどれだけそれにコミットできるかが大事だと思います。

MongoDB を PHP から操作する

前回の記事でMongoDBをインストールできたので、PHPからMongoDBにアクセスできるように設定をした。

PHPの拡張モジュールのインストール

PHPからMongoDBにアクセスするために必要な拡張モジュールをインストールする。

$ sudo yum install php-pear
$ sudo pecl install mongo

mongo.iniファイルを新しく作る。

$ sudo vim /etc/php.d/mongo.ini
; Enable mongo extension module
extension=mongo.so

HTTPでMongoDBを操作したい場合は、apacheを再起動する。
$ sudo /etc/init.d/httpd restart

PHPからMongoDBにアクセスする基本操作

まず、PHPからデータの挿入を行ってみる。

$ vim test1.php
<?php
$mongo = new Mongo();
$db = $mongo->selectDB("test");
$col = $db->createCollection("test_col");
$col->insert(array("key" => "value"));

実行してみて、MongoDBに格納されているか確認。

$ php test1.php
$ mongo
> db.test_col.find()
{ "_id" : ObjectId("4ce4cb9b762fc80935000000"), "key" : "value" }

挿入されているのが確認できた。次に、PHPからデータの取得を行ってみる。

$ vim test2.php
<?php
$mongo = new Mongo();
$db = $mongo->selectDB("test");
$col = $db->selectCollection("test_col");
$cur = $col->findOne();

var_dump($cur);

実行してみて、MongoDBからデータが取得できているか確認する。

$ php test2.php
array(2) {
  ["_id"]=>
  object(MongoId)#6 (1) {
    ["$id"]=>
    string(24) "4ce4cb9b762fc80935000000"
  }
  ["key"]=>
  string(5) "value"
}

取得できた。以上が基本的な使い方。

参考

あとは、PHPのMongoのマニュアルを参照すれば何でもできそう。

PHP: Mongo - Manual

MongoDBのインストール

Fedora 12にMongoDBをインストールしたときのメモ。

$ sudo yum install mongodb mongodb-devel mongodb-server

サーバの起動

$ sudo /etc/init.d/mongod start

動作確認

$ mongo
MongoDB shell version: 1.6.3
connecting to: test
> db.foo.save({a:1})
> db.foo.find()
{ "_id" : ObjectId("4ce4b0ef2fc8b1cc66f4104a"), "a" : 1 }
> exit
bye