移転しました
下記に移転しました.
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を使って参照カウンタを増減していたり、カウンタの増減の前後で不正なデータアクセスを起こさせない仕組みなどを説明されてました。
表とハッシュと連想配列 (@finalfusion さん)
タイトル間違っているかも。Pythonを含む様々な言語におけるハッシュ実装の仕組みとその違いについての紹介でした。言語ごとにハッシュ値の作り方がまったく違うのが面白かったです。ハッシュサイズは素数にするべきか、2の冪乗にするべきか、とか、単純にビットシフトさせたものをハッシュ値として使っちゃう、とか。是非読み比べてみたいところ。
dict実装の効率化 (@methane さん)
Python 3.2 では小さなdict (small table) はオブジェクト内に埋め込まれていて、ある程度の大きさになると外部にメモリを確保してそちらのみを使うようになるらしい。そうなるとsmall tableのスペースが無駄になるので、そんなものは最初からオブジェクト内に含めないようにすることで省メモリ化しようという話。小さなdict用にfreelistを用意しておいてそこから割り当てたり、memsetをコールする回数を減らして効率化を図ったりしているそう (この辺りは聞き逃してしまいました)。
結果は思ったよりも良くなく、もう少し効いても良さそうなのになー、と感じました。
プログラム内蔵方式
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" }
取得できた。以上が基本的な使い方。
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