読者です 読者をやめる 読者になる 読者になる

Python

matplotlibを使って計算時間をプロットしてみた

matplotlibを使って、JavaのHashSetとArrayListのcontainsの実行速度を測った結果を図にしました。loglogグラフなので、ArrayListはO(N)でHashSetはO(1)でしょうか。測定方法とテストの詳細は「実装パターン」の付録Aに載っています。 使ったデータ N 1 10 1…

xhr2でバイナリデータを送信するテスト

xhr2でバイナリデータを送信するテストです。ボタンをクリックするとクライアントから3バイトの情報がArrayBufferで送られます。それを(wsgi)サーバーがバイナリとして受け取り、それをそのままクライアントに送り返します。クライアント側で受け取った3バイ…

testモジュールのtest_supportを使えば、重いテストが一目瞭然

unittest.mainをテストランナーに使うと、途中経過では'.'が書き込まれるだけで、どこのテストの実行で詰まっているのか、よくわかりません。test_support.run_unittestはテストクラスの登録は手動にはなりますが、現在実行中のテストメソッドが何なのか知ら…

assertはOオプションでスキップされる

知ってました?多分知らないのは恥ずかしいことだと思いますが、知りませんでした。 # assert.py #!/usr/bin/env python2.7 assert(0) print 'skiped assert(0)' を使って、実験してみます。 $ python assert.py Traceback (most recent call last): File "a…

テストケースのロードを自動化した

テストコードを今まで個別に実行してましたが、ファイルが増えてきた(20くらい)ので、メタクラス(TestMeta)を使って、テストケースを自動で集めて一度にすべてalltests.pyで実行するようにしました。 #!/usr/bin/env python2.7 # alltests.py from test impo…

python2.7にしたらunittestにskipが追加されてた

どういうときにテストはスキップすべきでしょうか。多分、pythonのバージョンだとか、OSによって分けるのに使うことは悪いことではないと思います。今回ぼくがskipした理由は、単にすぐに解決できそうにないからというものでした。解決しないからといって、…

もしpythonにyieldを埋め込む関数があると

以前、コルーチン化することで関数のテストのしやすさが上がるんじゃないかと考えたことがあります。そのときはpythonでyieldを使っていたのですが、テストのためだけにyieldを入れることはまずありえないです。替りにコメント中のyieldを実行する関数YIELD…

3-SATを解く乱択アルゴリズムを実装してみた

数学ガール-乱択アルゴリズム-の9章にある3-SATを解く乱択アルゴリズムをPythonで実装してみました。p336の強正美優問題は正しく計算できるところまで確認しました(テストではupdateとbf_three_satを使ってます)。ラウンドあたりの成功率が妥当かどうか調べ…

dotcloudを使ってみた

一つ前の記事で紹介した"Tour of BASIC"をdotcloud上にアップしてみました。 使い方については動画を見たら分かるかと思うので、再掲しておきます。 動画: url:http://hellobasic-nnabeyang.dotcloud.com/index.html

Basic言語のインタプリタのwebuiを作ってみた

こんな感じです。 とは言っても"Tour of Go"をいじってGoの代わりにPLYに入ってたBASIC言語を実行するように変えただけなんですけれども(serverもpythonに変えた)。

PLYの中にBASIC処理系が入ってた

PLYはPython製のlexer,yaccなんですが、その中のexampleとしてBASIC処理系が入っていました。BASIC言語はさわった事が無かったので、次のようなシェルを作って遊んでみました。一応、viとも連携してファイルを編集(edit_ fpath)、削除(rm fpath)、そしてBASI…

cmdモジュールでファイルパスを補完(readline)

コマンドラインツールを作るとき、外部ファイルを読みだしてゴニョゴニョすることが多々あるかと思いますが、そんなとき、ファイルパスを補完するように書かないと、正直使えません。Pythonのcmd.Cmdを継承すると、そういうことが簡単にできます。そういうこ…

wsgiで静的ファイルを扱うサーバーを書く

タイトルの通り、SimpleHTTPServerのように動くwsgi的なアプリケーションを書きました。HTTPRequestHandlerの部分が少し癖があるので、標準のハンドラではこのアプリケーションは動かないと思います。あとはエラー処理もしていないですね。 #!/usr/bin/env p…

webブラウザからのリクエストを書き出す

前回書いたHTTPRequestHandlerのhandleメソッドを次のように書き直して、ブラウザから送られてくるリクエストを調べるツール?を作ってみました。JavaScriptの場合とかも試してみたいとも思いますが、今回はHTMLのフォームからPOSTメソッドでリクエストを送…

HTTPリクエストハンドラ:ディレクトリ一覧

HTTPリクエストハンドラにディレクトリ一覧機能だけ追加 import StringIO .. def send_head(self): path = "." + self.path if os.path.isdir(path): return self.list_directory(path) .. def list_directory(self, path): f = StringIO.StringIO() f.write…

HTTPリクエストハンドラを書く

PythonのSimpleHTTPServerはクライアントからのreqestを受け取るとそれをRequestHandlerClassに渡してインスタンス化します。これはSocketServerモジュール中のBaseServerを見ると分かります。 def finish_request(self, request, client_address): """Finis…

HTTPリクエストのモックを作る

SimpleHTTPRequestHandlerを利用してHTTPリクエストのモック(MockConnection)を作りました。というのはたぶん奇妙な言い方で、SimpleHTTPRequestHandlerの動作を確認してみました。 #!/usr/bin/env python2.6 import unittest from test import test_support…

rangeの文字版c_rangeを書いた(binasciiの使用例)

Python Learners!で教えて貰ったのですが、rubyだと"('!' .. '?').each{ |e| print e, ' ' }"で、"! \ " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; ?"を書きだすことができるんだとか。rubyは数字も文字の場合も扱えるのでPythonのrangeより賢いじ…

PySQLite(2)

読み書き部分は完成しました。モジュールとして使うときは、次のように使います。 #!/usr/bin/env python2.6 # -*- coding: utf-8 -*- import unittest import os from pysql import * class DBTests(unittest.TestCase): def test_create_table(self): if o…

sqliteのデータベースファイルを読み込む(3)[LIMITの実装]

前回のソースコードにDBクラスを追加しました。LIMIT offset, limit句はcursorをoffsetまで進めて、limit回値を返します。つまりoffset回だけ、cursorを動かすことになるので、offsetを設定してもそれだけのコストはかかります。また、cursorのレベルで見れ…

sqliteのデータベースファイルを読み込む(2)

sqliteのdbファイルを読み込むpythonスクリプトを書いています。読み込むことがある程度できるようになったら、書き込みもできるようにもしたいです。前回から変わったところはselect文みたいにカラムを指定する(現在は何番目のカラムかを数字で指定する)こ…

sqliteのデータベースファイルを読み込む

前回から大きく変わったところはないですが、sqlite_master以外のテーブルも読み込むように変更しました。以前のようにデータベースファイルだけ指定すると、sqlite_masterのレコードが標準出力されます。 $./select.py test.db (1, 'table', 'Products', 'P…

sqlite_masterの中身を読み込む(2)

前回のものはページタイプ(INTKEY|LEAF_DATA|LEAF)のときのみ読み込めるスクリプトでしたが、ページタイプが(INTKEY|LEAF_DATA)のときも読み込めるように変更しました。例えばtracのデータベースファイルを読み込んでみると、次のように表示されます。 rowid…

bitstringを使ってみた

$ sqlite3 test.db SQLite version 3.7.7.1 2011-06-28 17:39:05 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> CREATE TABLE Products(name text, price integer, locale text); sqlite> CREATE TABLE People(name t…

Insertion Sort

SQLiteのソースコードリーディングしているのですが、ぼくはソート・アルゴリズムについてあまり勉強したことがないので、アルゴリズムのところでいちいち躓いています。SQLiteで使われているアルゴリズムは本にも載っているような古典アルゴリズムがほとん…

マージソート(SQLite)

アルゴリズムの名前が分からないのですが、途中でマージは使われているのでマージソートの一種でしょうか。ぼくが見ているSQLiteのままのコード(pcache.cの457行目-のpcacheMergeDirtyListがmergeに、pcacheSortDirtyListがsortに対応します)だと一緒にする…

N-WAY MERGE の実装(2)

"ORDER BY"のときにSQLite中で動いているsort関数について調べているのですが、前回のは少しinputと結果が違っているようで、実はこんなのだと今のところ思っています。やっていることはcountの大きさのトーナメントを用意して、inputの配列の0-(count-1)成…

N-WAY MERGEの実装

SQLiteの中のソート関数(ORDER BYを書いたときに内部で動く関数)を読んでいたら、複数のソートされた配列をマージしていたので、それをpythonに焼き直してみました。アルゴリズムとしては、各配列の第0要素をエントリして、一番小さな数を決めるのにトーナメ…

ワークフローを正規表現で制御する案

簡単なワークフローは状態遷移図で表すことができます(簡単でなくても気力があればできるけど)。それならば、ワークフローの設定を有限オートマトンでやれば良いんじゃないのかなと思って、ちょっと書いてみました。すぐ下にあるテストコードの一番下にあ…

trac-adminにコマンドを追加する

tracはweb uiだけでなく、CLIもtrac-adminという名前で提供しています。CLIのコマンドはメインプログラム内で制御されているケースが多いと思いますが、それではcoreを弄らずにコマンドを追加することができなくなります。tracの場合、trac-adminはコマンド…

tracプラグインの書き方

trac(0.12)のプラグインを書いてみました。以下のファイルをプロジェクトディレクトリにあるpluginsにおいたら設定無しに動きます。プラグインを普通のpythonファイルで書くときにしないといけないことは、revisionを書くことと、最低1つtrac.core.Component…

propertyを継承する

まずpropertyはclassのようです。なので継承して、次のようにgetterをはじめからproperty側で定めるようなことができます。 def test_extends_property(self): class getclassname_property(property): def __init__(self): property.__init__(self, self.ge…

DFAベース正規表現エンジンを追加(Python)

前回のものにDFAを構成しながらマッチングするクラスを追加しました。 class State(object): def transfer(self, c, nlist): pass def appendTo(self, nlist): nlist.append(self) SuccessState = State() class CharState(State): def __init__(self, c): s…

NFAベースの正規表現エンジン(Python)

lexerを書いていないので、全体で100行少しです。インプットとしては正規表現をpostfix形式に変換して入力する必要があります。'a|b'の場合'ab|'といった感じです。あとは文字列の接続に'.'を使ってます。なので'abc'は'ab.c.'、'ab*c'は'ab*.c.'となります…

HTML Lexerを書いてみた

厳密にHTMLの仕様に基づいて作っているわけではないですが、htmlっぽいタグとかをトークン化するものを書きました。open_tagの後にちゃんとclose_tagがあるかとか、そういった仕事はしません。それはParserなどがする仕事としてます。標準ライブラリのHTMLPa…

Pythonでインターフェース

良い方法なのかは疑問ですが、__metaclass__を使って、メソッドの定義を強制することができます。 #!/usr/bin/env python2.6 import unittest import itertools import sys class EntryType(type): def __new__(cls, name, bases, d): interface = ('get_siz…

コンポジットオブジェクトのテスト

コンポジットオブジェクトが含むオブジェクト全てを走査して、等しいかどうか見れるような__eq__があったら、テストしやすいはずです。更に__repr__で文字列にして、どのようなオブジェクトが含まれるか確認できるともっと便利です。そのようなメソッドは実…

少ない記述量で、コンストラクタで指定するフィールドを増減させる(Python)

子クラスが独自に持つフィールドをtupleで指定すると、自動的にコンストラクタで指定できるフィールドに変化するパターンを紹介します。tupleで指定するというのは、このような感じのことです。 class Child(Parent): fields = ('child_field1', 'child_fiel…

Pythonで多重継承を禁止する

継承の仕方に制限をつけたいときもあるかと思います。そんなときはtypeを継承して自分の好きなタイプを作って、__metaclass__で指定してみましょう。多重継承の他にも、メソッドに制限をつけることもできるでしょう。(以下の例では、継承数を1にしているので…

reST記法をおぼえるためにreSTプレビュー用webサーバーを作ってみた

ぼくはreST記法をおぼえていません。だからSphinxもあまり使えません。挑戦はしましたが、毎回、コンパイルを通さないと見れないようです。こんなのC言語を知らずにC++でしかもSTLガンガンなコードを書くようなもんです。でもSphinxは使いたいと思っています…

jinja2の設計

これはjinja2の設計の紹介であり、壮大な"hello, world"の実装と見ることもできます。非常に簡略化したjinja2(=MY_jinja2)を使って、おおよその構造をソースコードで示したい(あまり日本語では説明できない)のですが、そのためにはせめてjinja2と同じように…

Pythonで読み込み専用フィールドを作る

読み込み専用のフィールドをPythonを作るとき、propertyを使う方法があると思います。しかし単純にpropertyを使うだけだと、フィールドが変更することは不可能ではありません。 def test_property(self): class A(object): def __init__(self, i): self.i = …

jinja2の簡単な原理(exec関数の使われる実例)

python製のテンプレート・エンジンjinja2がどんな処理しているのか勉強してみました。メタクラス,ジェネレーターなどpythonらしい書き方をいくつかおぼえることができました。あと、exec関数の使い方。これは、pythonらしいのか不明ですが、jinja2で具体的な…

thread/threadingモジュールを使ってエコーサーバーのテストを書く

webサーバー/クライアントを実装するとき、server/clientが正しく連携するかテストしたいかと思います。しかし、serverとclientをシングルスレッドで同時に扱うことはできないので、単純にunittestを使っただけでは完全な自動テストを書くことはできません。…

ファイル操作の練習とStringIO(3)

前回までにStringIOと同じように動作するモジュールMY_StringIOを実装するところまで話が進みました。実装自体にストーリーを付けたり、意味のあるまとめ方をするのは難しいと思うので淡々と実装を進めることにします。MY_StringIOにはまだwriteすらありませ…

ファイル操作の練習とStringIO(2)

前回ファイルIOのテストは面倒だという話をしました。それでStringIOモジュールがfileobject(open(filepath)で生成される)をエミュレートしているので、StringIOを調べようということになったと思います。StringIOモジュールの動作を知るには、ソースコード…

StringIOの文字列の連結について(python2.6)

StringIOを読んでいるとわざわざ文字列連結のためにself.buflistというリストを用意して、joinして文字列を連結させています。ところが、こんなのself.bufと+演算子だけでできてしまいます。考えられるのは、リストを生成して、joinする方が速いということで…

ファイル操作の練習とStringIO(1)

ファイルにアクセスして、色々と細かい操作をしないといけないことはあるかと思いますが、ぼくは正直ファイル操作処理がOS任せになってブラックボックスなところもあって馴染めません。さらにファイル操作した後、ファイルの内容が変更してしまっては、くり…

Python2.6のC拡張モジュールを使ってオブジェクトをCで書いてみた(3)

前回までにオブジェクトにメソッドを追加する以外のことはやったので、ここではメソッドを追加してあげましょう。テストはtestStringに書いてありました。コメントアウトされてる部分を元に戻します。 def testString(self): s = String.new('abc') self.ass…

Python2.6のC拡張モジュールを使ってオブジェクトをCで書いてみた(2)

前回はコンストラクタを定義しました。次はgetattrを定義して、フィールドにアクセスするところまで進めます。テストの方は、testStringを復活させます。 def testString(self): s = String.new('abc') self.assertEqual(3, s.length) # self.assertEqual('a…