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…

PySQLite(1)

以前からSQLite3のdbファイルを読み込むプログラムを書いていますが、それに書きこむ機能も追加しています。とりあえずPySQLiteと呼んでいます。まだ、レコードの大きさに制限がありますが、書き込みができるようになりました(削除とアップデートはまだでき…

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…

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

うまくいくときと、いかないときがあるのですが、sqlite_masterに書かれた内容を標準出力するプログラムを書きました(また直ったら更新すると思います)。現在のところは,リーフページのみ読み込めるのみです。まず読み込むためのsqlite3を使って読み込むファ…

64ビット整数を8ビット配列に格納

(uint64_t)64ビット整数を(uint8_t)8ビット配列に格納する際、8成分必要です。番兵を入れれば9成分でしょうか。同じ最大9成分でも、それぞれの成分の1ビット分を次があるかどうかを示すフラグにする方法も考えられます。メリットとしては、成分が少ないとき…

変数 = (式, 値); assert(値 == 変数);

C言語の文法にこんなのあったかなぁ.. #include <assert.h> #include <string.h> #define getVarint(p, v) (*(p+1) & 0xff)? (*v = *p, 1): get_varint(p, v) unsigned get_varint(unsigned char* p, unsigned int* v) { unsigned int a[4]; int i; assert(*p & 0xff); a[0] = *p</string.h></assert.h>…

Insertion Sort

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

マージソート(SQLite)

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

エンディアンについてのメモ

ビッグエンディアンで記録されている数値を読み出す処理が、逆なんじゃないかと思ったら、実はx86はリトルエンディアンで記録しているということでした。本当にそうなっているのかC言語で確認しました。 #include <assert.h> #include <stdint.h> #include <string.h> int main(void) { uin</string.h></stdint.h></assert.h>…

N-WAY MERGE の実装(2)

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

N-WAY MERGEの実装

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

定義のない構造体

SQLiteを読んでるとsqlite3_stmtという構造体が名前だけ出てきます。ところが定義がどこを探してもありません。どうやらsqlite3_stmt*のような構造体はvoid*のように使えるようです。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> typedef struct Str Str; int </assert.h></string.h></stdlib.h></stdio.h>…

Go節電プラグイン(trac):日本語化しました

setsuden4trac(490c305):日本語化のついでに、電気予報の情報も追加しましたが、ピーク時の使用率を書いてないことに気づきました。スナップショット TODO ピーク時の使用率を加える 修正しました(29d8479) APIが使えなかったときのエラー処理 速度が遅いの…

Go節電プラグイン(trac):タイムラインのアイコンを追加しました

Go節電APIを使ってtracタイムラインに電力使用量を表示するプラグイン、setsuden4trac(f2a236f...)を更新しました。今回は、電力使用量に応じてタイムラインのアイコンが青(90%未満)、黄(95%未満)、赤(95%以上)に変化するように変更しました(アイコンは関西…

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

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

Go節電プラグイン(trac):regionを設定ファイルから読み込むように修正しました

少し前からGo節電APIを使って、tracのTL上に電力使用量を表示するプラグインを書いています。今回は、電力会社(region)をtracの設定ファイルで変更できるように修正しました。設定ファイルには [setsuden] region = tokyo を追加すれば東京電力の電力使用量…

Go節電プロジェクトのtracプラグイン

前回書いたtracプラグインを改造して、電気使用量をTimelineに載せるプラグインsetsuden4tracを書きました。Go節電プロジェクトAPIを使わせていただいています。 ソースコードはgithubからダウンロードできます。 git clone git@github.com:nnabeyang/setsud…

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…