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

Firebird 3.0 リリース [Firebird]

Firebird 3.0 がついにリリースされた
http://www.firebirdsql.org/en/news/firebird-3-0-is-released/
http://www.firebirdnews.org/firebird-3-is-released/

確か Jim Sterkey が MySQL AB に移籍した時に Firebird プロジェクトに
置き土産として残していったコードが Firebird 3.0 の始まりだったんだと思う。
http://www.itmedia.co.jp/enterprise/articles/0602/24/news031.html
http://www.firebirdnews.org/jim-starkey-joined-mysql-ab/
その時は、(Jim Sterkey がいなくなって先行きは不安だけど) 3.0 はすぐに出るだろうと思っていた。
Jim Sterkey が費やした時間を無視しても、もうあの時からリリースまでに10年以上かかったことになる。

途中、あまりにも時間が空いてしまったので、ということでポイントリリースした 2.5 が出たのですら 2010年10月なので、最後のメジャーリリースから5年半も経ってしまっている。

正直、もう 3.0 は出ないのかもしれないと思った時期もあった。
とにかく 3.0がリリースできたことで、Firebird の開発が盛り返すだろう。
実際、3.0のリリース前に 4.0 の Planning Board が公開されている。
http://www.firebirdsql.org/en/planning-board/
とても、予定通りの Time Schedule で進むとは思えないが、そうは言っても、あと5年も待つということはないだろう(と思いたい)。

3.0は、個人的にも、とても嬉しいリリースになった。
リリースまでに、あまりにも時間がかかり過ぎたおかげで、僕が統計関数の一部のコードを書いて、Release Notes に名前を刻むことができた
http://www.firebirdsql.org/file/documentation/release_notes/html/en/3_0/bk01ch09s05.html#rnfb30-dml-statistical
10年前には、まさか自分が Firebird のコードに Contribute することになろうとは想像すらしなかった。

Firebird 3.0 の統計関数 [Firebird]

これは Firebird Advent Calendar 2015 の http://qiita.com/advent-calendar/2015/firebird 22 日目の記事です

Firebird3.0 beta2 から統計算数が使えるようになりました。
ここで、統計関数と言っているのはこの表↓の中の stddev, variance 以外の関数のことです。
https://www.postgresql.jp/document/9.4/html/functions-aggregate.html#FUNCTIONS-AGGREGATE-STATISTICS-TABLE
SQL標準で定義されているものですので、当然 Firebird にも必要とされていた機能だと思っていました。
3.0 の alpha1 リリースあたりで、一部の Window 関数は実装されていましたが、上記の統計関数はまだ実装されていませんでした。
「Window 関数の処理を真似をすれば、一連の統計関数も実装できるんじゃね?」
ということを考えていました。

最新の状況を追いかけるために、Firebird をソースからコンパイルするようになって
http://nakagami.blog.so-net.ne.jp/2014-12-17
(Firebird のリポジトリは sourceforge の subversion のものが本物で JIRA で Issue を管理しているのですが)
GitHub のミラーリポジトリにダメもとで初期実装のプルリクエストを送ったらコメントのやりとりの末マージされました。
というわけで残りも段階的にプルリクエストを送って、無事マージされました。
ここらへん↓
https://github.com/FirebirdSQL/core/pull/2
https://github.com/FirebirdSQL/core/pull/3
https://github.com/FirebirdSQL/core/pull/4
初期実装を私がして(pull request して) Adriano dos Santos Fernandes さんが、コードレビュー、マージ、リファクタリングをしました。
リファクタリングによって、内部で管理している blob_id という数値を無駄遣いしなくなったので、良い形になったと思います。
beta2 で、この統計関数がマージされたものがリリースされました。
beta2 → RC1 の間には新機能は追加されていないので、3.0 にギリギリ間に合ったのかな、と思っています。

計算方法は、ここらへんに書いてあるんですが↓
https://github.com/FirebirdSQL/core/blob/master/doc/sql.extensions/README.statistical_functions.txt
https://github.com/FirebirdSQL/core/blob/master/doc/sql.extensions/README.regr_functions.txt
ぶっちゃけ PostgreSQL のドキュメント(もしくは Redshift のドキュメント)を読んだほうがいいです。
これらのなかで、戻り値について、PostgreSQLのドキュメントで
「浮動小数点型の引数ではdouble precision。それ以外ではnumeric」
となっているところは、 Firebird では double precision が返ってくる点が違います。
PostgreSQL の人は標準偏差が decimal で返ってきたら困らないんでしょうか?

Firebird3.0 は(まだ出てないけど)個人的に特別のリリースになりました。

Jaybird (JDBC ドライバー)の Firebird 3.0 対応 [Firebird]

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

Firebird の JDBC ドライバー jaybird の歴史は長く、継続してリリースされていて安定して使えているというイメージです。

ある日、現在 jaybird の開発とメンテナンスをメインでしている Mark Rotteveel さんが firebird-devel の Mailing list で Firebird3 の protocol 13 の変更の詳細について質問していたのを見かけて
http://sourceforge.net/p/firebird/mailman/message/34316685/
「あれ? protocol13 の実装していなかったの?プロトコルの詳細の説明は(英語で)できないけど、実装ならできるかも」
と思いました。

幸い、その頃ソースコードリポジトリが sourceforge の subversion からGitHub に移っていたので
https://github.com/FirebirdSQL/jaybird
(subversion だと使い方も忘れたし、どこにパッチ送っていいかわからないけど、GitHub で pull request なら送れるぞ)
段階を追って pull request 送り、無事マージされました。
https://github.com/FirebirdSQL/jaybird/pull/3
https://github.com/FirebirdSQL/jaybird/pull/4
https://github.com/FirebirdSQL/jaybird/pull/5
https://github.com/FirebirdSQL/jaybird/pull/6

コードを書くことよりも、英語でコードレビューにコメントすることのほうがだいぶ大変でした。
あと、マージする前に
「Software License Agreement のレターにサインして送ってくれ」
と言われ、規定フォーマットのレターにサインしてスキャンしてメールで送り返しました。
そういう、ソースコードに関係ないところのやりとりが英語できない僕には大変でした。

現在は
「master にマージされたけど、そのコードが含まれたバージョンはリリースされていない」
という状態です。
Firebird 3.0 が出た直後ぐらいにはリリースされるかなー、と楽しみにしています。

私の Firebird 情報源 [Firebird]

これは Firebird Advent Calendar 2015 の http://qiita.com/advent-calendar/2015/firebird 17 日目の記事です

Firebird News http://www.firebirdnews.org
ここは、公式ではないのですが、もう何年もコンスタントに Firebird とその関連情報が更新されていて、私の情報の入手元のほとんどはここです。
Firebird 公式サイト http://www.firebirdsql.org の News も、ほとんどが、この Firebird News で紹介されているので、公式サイトは興味があったニュースの時だけ見たりします。

Mailing List は、この↓リストの中にいろいろあります。
http://www.firebirdsql.org/en/mailing-lists/

その中で Firebird Developpers' Lab は、全部は(英語的にも、内容の難しさ的にも)読めませんが Subject に興味を持った時にスレッドを読んでいます。
流量はそんなに多くないし、Jim Starkey や Dmitry Yemanov が投稿してるのでミーハー気分で subscribe しても良いと思います。
それ以外の Mailing LIst は購読してないのですが、良さそうなのがあったら教えてください。

最近気づいたのですが、
- IBPhoenix の Howto のページ http://www.ibphoenix.com/resources/documents/how_to
- IBSurgeon の記事 http://www.ibsurgeon.com/en/articles/
あたりを読むと役に立ちそうです

一般に知られていませんが、 Firebird のソースコードリポジトリの中の doc ディレクトリの下は、開発に合わせてきちんとメンテナンスされています。
https://github.com/FirebirdSQL/core/tree/master/doc
トピック毎にテキストに分割されているので、いささか読みづらいですが、 BNF のシンタックスと使用例が書かれているので、慣れると読めます。例えば昨日のエントリの説明はこれ↓
https://github.com/FirebirdSQL/core/blob/master/doc/sql.extensions/README.identity_columns.txt

正直あまり Firebird 固有の情報源は少ないんですが、 Firebird は SQL標準に近いので SQL を書く範囲ではあまり困らないんではないかと思います。

・・・が、いい情報源があったら教えてください

Firebird3 の新しい Identity カラム [Firebird]

これは Firebird Advent Calendar 2015 の http://qiita.com/advent-calendar/2015/firebird 16 日目の記事で、昨日の木村さんのエントリー http://blog.kimuradb.com/?eid=877448 の続きです

Interbase/Firebird を開発していた人たちは、オートインクリメントする型というのは、リレーショナルデーターベースの理論から外れるからということからか、導入に消極的だったように思います。

Firebird 1.x(Interbase 6.0)では、generator という整数列を生成するオブジェクトから trigger で値を設定するのが一般的でした。
http://firebirdfaq.sourceforge.net/faq29/

Firebird 2.0 SEQUENCE が作られ、値の取得に NEXT VALUE FOR UPDATE という構文が導入されました
http://www.firebirdsql.org/refdocs/langrefupd20-create-seq.html
http://www.firebirdsql.org/refdocs/langrefupd20-nextvaluefor.html
insert into employee (id, name) values (next value for a_seq, 'Alice')
とすると、ID 列に値がインクリメント入りますが、ID列を指定しないで値を入れたい場合は、トリガーで設定することになります。
http://symfoware.blog68.fc2.com/blog-entry-929.html
次の値を取ってくる構文がちょっと違いますが、Generator の例と同じですね
この機能は、 SQL標準で定義されているため、それに合わせるために導入されたもののようです。

Firebird 3.0 からは Identity というものが用意されました
https://github.com/FirebirdSQL/core/blob/master/doc/sql.extensions/README.identity_columns.txt

create table employee (
id integer generated by default as identity primary key,
name varchar(15)
);

と定義できるようになりました。このテーブルで

insert into employee (name) values ('Alice')

とすると id 列を指定しなくても、値がオートインクリメントで入ります。

id 列の開始値を変更するのは

alter table employee alter id restart withe 1000;

とするようです。(次に insert した時には1001 が入る)

テーブルに ID 列があることを想定している O/R マッパーが一般的になってきたので、ようやくか、という感じです。

Firebird の思い出(後半) [Firebird]

これは Firebird Advent Calendar 2015 の http://qiita.com/advent-calendar/2015/firebird 13 日目の記事で、 http://nakagami.blog.so-net.ne.jp/2015-12-11 の続きです

2008年になって、 python の Firebird データーベースドライバー
KInterbaseDB のメンテナンスが危機的状況ということを知って、ずっと気になっていました。
そして、2008年12月に Python3.0 が出て、今後、データーベースドライバーを
Python3 対応にしていかないといけないであろうに、その目処が全く立っていない
という状況になってしまいました。

2008年後半から2010年前半のどこかのタイミングで、このドキュメント(当時は Githubでないどこかにあった)を発見しました。
https://github.com/cincuranet/FirebirdSql.Data.FirebirdClient/tree/master/Documentation
このドキュメントを見ただけではわかりませんでしたが、
isql とサーバーの間で、どんなデータをやり取りしているか調べるスクリプトを書いて、
実際にやり取りされるデータと上記のプロトコルドキュメントを見比べると、
うっすらと、データーベースドライバーが書けそうな気がしてきました。
現実的な路線として
- 不具合があっても、機能的に KInterbasDB に劣っていてもよいので、とにかく動くもの
- C 拡張は難しいので、 pure python のもの
- Python2 で動かなくてよいので、Python3 で動くもの
を目標にしました。

2010-09-26 に Protocol Version 10 (Interbase6.0相当)で
Python3 で動作する最低限のものができて、 PyPI にリリースできました。
https://pypi.python.org/pypi/firebirdsql/0.1.0
Python2 で Firebird に接続したい人は、KInterbasDB を使ったほうが
安定して速いので、pure python のドライバー使わないだろうと思ったのですが、
リリース直後の反応は、「Python2 では動かないのか?」という問い合わせが多くて、
ほどなく Python2 でも動くようになりました(しました)。

最初のリリース後、Firebird 公式の python 用ドライバー FDB の開発が始まりリリースされました。
もし、FDB があったら、python のドライバーを書こうと思わなかったでしょう。
僕がリリースするまで、誰も python のドライバーを書き直そう(もしくは KInterbaseDB を Python3 で動くようにしよう)
と思わなかったことは、結果として僕にとってラッキーなことでした。
・・・と書くと、すんなりと完成したようにも見えるかもしれませんが、
完成するかどうかわからない状態で試行錯誤している時には、
「ここまで時間をかけて完成しなかったら、今までの労力が無駄になってしまう」
というあせりはありました。完成して本当に良かったと思っています。

あらためて見直してみると、2008年から2010年中頃まで2年半は、断続的にではありますが
プロトコルの資料探したり、Interbase6 の Developper's Guide を読んだり、
あーでもないこーでもないとパケット観察しながら思考錯誤してたりしてたようです。
思うに、これだけ長く挫折せずに続けられたのは、代わりになる Python のドライバーが
出現できなかったことと、Firebird 本体の開発が停滞していて「まだ追いつける」という
気がしてたからだと思います。停滞万歳。

その後、2013年の8月頃に GO言語の勉強をしてみたら、思いのほか書ける気がしました。
http://nakagami.blog.so-net.ne.jp/2013-08-24
サンプルコードは書いたので、次は習作として何か使える(使われる)ものを書きたいと思いました。
そして書いたのが、Firebird のデーターベースドライバーでした。
(GO言語のよいドライバーがなかったので)
この時は、 プロトコルの理解も進んでいて Python の動く実装もあったので、思ったよりすぐ動くようになりました。
ちゃんとした記録がなくてよくわからないのですが、2014-04-14 の頃には一般に知られるようになったようです
http://www.firebirdnews.org/another-firebirdsql-driver-for-go-golang/

仕事でちょっと使って、いつかまた役に立つだろうと Firebird の開発状況のウォッチを続け、
気がつくと、Firebird を使わずに、 Firebird のドライバーを書いてばかりいて、
(しかも、仕事には関係なく)なんだか不思議なことです。

Firebird の思い出(前半) [Firebird]

これは Firebird Advent Calendar 2015 の http://qiita.com/advent-calendar/2015/firebird 11 日目の記事です

Firebird を最初に知ったのは、日経コンピューターの OSS 特集でした。
多分 2001年か2002年頃の記事です。
RDBMS として PostgreSQL と MySQL が紹介されていた中で、小さいコラムで Firebird が紹介されていました。

商用のRDBMSから派生して Windows でもきちんと動作して、よさそうなのに、あんまり誰も使ってないっぽいなぁ・・・というのが第一印象でした。

その後、Firebird を職場の Windows に(こっそり)インストールしました。
そのとき、Firebird 1.0.3 だったので 2002年か2003年だったと思います。
・・・と思ったけれど、木村さんや林さんが 2002年だったということは、
http://blog.kimuradb.com/?eid=877444
僕がインストールしたのは、2003年かな?使い始めた頃にはユーザー会のサイトはあったように思います

それまでは、開発の現場にいたのに、たまたまとある企業のIT部門に「派遣のSEさん」 の肩書きのもと、なんでもパソコン相談係をすることになったときのことでした。
全く開発環境もなく、与えられた事務用のパソコンだけで仕事をするのは初めての経験でした。
雇う側も雇われる側もよくわからずに雇用されてしまったように思います。
(求めらてたのは、ベンダーとの打ち合わせに参加とか、納品物の確認とか作業の立会いとか、そんなんだったのですが・・・)
いろいろな雑用の合間に、必要に迫られて Zope(Python) + Firebird で(こっそり)社内アンケート収集システム的なのを作りました。
そのときにデータを入れるのに使ったのが Firebird でした。
職場の普通のパソコンで(別途 OSをインストールせず)特別に開発環境を用意したりライセンス料払ったりしないで目的を遂行できて満足でした。
その職場には8年半ほどいましたが、そのシステムは無事僕が辞めるまでに用済みになり、ホッとしました。なにしろ、Firebird は全然世にも職場にも普及せず、わかる人も興味ある人も自分しかいなかったものですから。

ただ、その時のようにいろいろ制約のある職場環境に巡り合った場合、また使うことがあるんじゃないか。と思い、その後も開発状況をウォッチするようになりました。なにしろ Firebird はその頃から Windows でも Linux でも安定して動作し、ライセンス的な制約もなかったものですから。

2004年に Firebird2.0 が出そうなあたりまでは順調に見えました。
http://www.itmedia.co.jp/enterprise/articles/0409/16/news085.html
その後、急激に開発が進んでいないように見え、 Jim Sterkey が MySQL AB に入って Firebird Project から離れた時
http://nakagami.blog.so-net.ne.jp/2006-02-24
プロジェクト、もうダメかなと思いました。
リリーススケジュールは遅れに遅れて・・・外からは止まっているように見えました。
しっかりしたコードベースがあるのに、ソースがあるだけじゃダメなんだなぁ、と。

さらに、 Firebird Firebird2.1 リリースで Python ドライバーの KIntebasDBが動かなくなり2007年7月に KInterbasDB の開発者 Davis S. Rushby が27歳で亡くなっていることが発覚し
http://nakagami.blog.so-net.ne.jp/2008-01-10
その後、パッチがマージされ 2.1 で動くようになったものの、
http://nakagami.blog.so-net.ne.jp/2008-07-01-1
メンテナンスできる人がいなくなって非常に厳しい状況になっていることを知りました。
この頃、僕も KInterbasDB のソースを読んだんだけれども、 C 拡張は使われているし、Firebird のネットワークプロトコルも知らないし、という状況で、読み解くの必要なメンテナンスを実施するのも無理そうでした。
Firebird を python 以外で使うことは考えていなかったので、
「これじゃ、もしも Firebird の 2.5 や 3.0 が出せたとしても KInterbasDBが動かないかもしれないじゃないか」
と思いました。

この頃が、僕の中の Firebird Project 最大の危機でした。

Firebird Go driver 2015 [Firebird]

これは Firebird Advent Calendar 2015 の http://qiita.com/advent-calendar/2015/firebird 8 日目の記事です

私がスクラッチから書きメンテナンスしている Firebird の Go Driver
https://github.com/nakagami/firebirdsql
について、昨年の Advent Calendar に書きました
http://nakagami.blog.so-net.ne.jp/2014-12-23
本記事は、その 2015 update 情報です。

今年は、go のリポジトリが github でも公開され、それに伴い Go Wiki が、github の Wiki に移されました。
Database Driver のページはこちら https://github.com/golang/go/wiki/SQLDrivers
引き続き firebirdsql へのリンクが載っていて一安心です。

昨年の12月以降の修正を

git diff 442a8d057d9bf3e0d08c8e1cf0680a52074430a8

で確認しました。以下の点について修正したようです。

- blob 型のデーターの fetch/insert ができるようになった
- 接続文字列で Role が指定できるようになった
- 不具合修正と少々のリファクタリング
- エラーメッセージをより新しい Firebird のメッセージに更新

Role を指定する場合、接続文字列のユーザー部分の最後に ":role名" を足して、
例えば、
user:password:role@serverhost:3050/path/to/database.fdb
のように指定します。

いまのところ機能を追加する予定はいまのところありません。
しかし、以下の点については、GO言語に機能が追加されたら対応したいと思っています。

- BigInteger の ModPow を計算するために github.com/cznic/mathutil が必要です
- Go に組み込みの decimal 型がないようなので、 double として受け取るようにしてます

昨年中にいくつかの不具合を Issue に報告していただき対応しましたので、現在は、だいぶ stable になっていると思います。
認証、暗号化の部分の Firebird3.0(protocol 13)対応もできていますので、デフォルトの状態で Firebird2.5 にも Firebird3.0 にも接続できます。

Python からpyfirebirdsql で Firebird に接続する 2015 [Firebird]

これは Firebird Advent Calendar 2015 http://qiita.com/advent-calendar/2015/firebird の 5 日目の記事です

昨年の Advent カレンダーと内容がかぶってしまいますがすみません
http://nakagami.blog.so-net.ne.jp/2014-12-08
http://nakagami.blog.so-net.ne.jp/2014-12-20

pyfirebirdsql https://pypi.python.org/pypi/firebirdsql/ は私がスクラッチから書いてメンテナンスしている pure python のFirebird データベースドライバーです。

Firebird の公式のデーターベースドライバーで FDB というものがあります。http://www.firebirdsql.org/en/devel-python-driver/ これは、 pure python ですが、ctypes モジュールから Firebird の shared library を呼び出す仕組みになっていて、別途 fbclient.so や fbclient.dll のインストールが必要です。
ちょっとインストールが面倒なためか、現状 pypi でのダウンロード数は pyfirebirdsql のほうが FDB より多くなっています。ただし、 pyfirebirdsql は TCP/IP による接続しかできませんので、embeded server を使いたい場合は FDB を使ってください。

pyfirebirdsql は python の 2.6, 2.7 および 3.3 以降で
$ pip install firebirdsql

でインストールできます。 pypy や Jython 2.7 や IronPython 2.7 でも動作します。
サンプルコード https://github.com/nakagami/pyfirebirdsql/#example

デフォルトの firebird.conf の設定で Firebird3.0 にも Firebird2.5 にも接続できます。
pyfirebirdsql の最新のバージョンは 0.9.12 で、昨年の 12/20 にリリースした 0.9.6 と比較すると

- Firebird3.0 の RC4 WireCrypto が有効な時、 PyCrypto がインストールされていればそれを使う(速い)インストールされてなければ pure python の実装を使います
- pyflakes でワーニングが出ないようにする(できるだけ)
- エラーメッセージを最新の Firebird 3.0 RC1 に合わせる
- Firebird 3.0 の時の認証パラメータの設定の仕方を変更
- 不具合修正(主に Firebird3.0関連)やソースコード整理

といったところが変わっています。
今のところ、機能的な追加の予定はなく、主に不具合修正を行っていく予定です。
Firebird1.5 や Interbase6.0 といった古いバージョンにも接続できるように気をつけているのですが、手元に検証環境がないので動作するかどうか不明です。もし、古いサーバーに接続できないなどありましたら github https://github.com/nakagami/pyfirebirdsql に issue をあげてください