SSブログ

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 最大の危機でした。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

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 にも接続できます。
コメント(0)  トラックバック(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 をあげてください
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird で Go [Firebird]

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

Go の Firebird ドライバーは↓ここにあります
https://github.com/nakagami/firebirdsql

python のドライバーを書いていてプロトコルはある程度わかっているので、golang の勉強にと思って書いてみました。

インストールはこれ
https://github.com/nakagami/firebirdsql#installation

例はこんな↓感じ
https://github.com/nakagami/firebirdsql#example
・・・ですが、接続文字列の指定の仕方が違うくらいなのであとは、database/sql のドキュメントを読むなどしてください
http://golang.org/pkg/database/sql/

ついこの間まで、Firebird3 beta1 では動かなかったんですが pyfirebirdでの経験
http://nakagami.blog.so-net.ne.jp/2014-12-20 を反映して、今は Firebird beta1 で動くようになりました

golang の習作として書いてみたのですが、自分でこれを使った golang のコードをほとんど書いてないので、どれくらいちゃんと動くかわかってません。

ただ、 SQL database drivers の Wiki に載ってるのに動かないという報告もないので、
https://code.google.com/p/go-wiki/wiki/SQLDrivers
だいぶちゃんと動いてる気がしてます。
自分は Windows でテストしてないのですが、Windows で動いている報告も受けました。

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird をソースからビルドして Ubuntu 14.10 にインストールする [Firebird]

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

http://nakagami.blog.so-net.ne.jp/2013-10-19 の内容の更新。
今回は、Ubuntu のインストール直後からの手順を整理する

公式の Firebird のビルドに関するドキュメント↓これ(古いけど)
http://www.firebirdsql.org/en/building-the-code-posix/

(以下手順)

ubuntu 14.10 をインストール
(省略)

必要なパッケージのインストール
$ sudo apt-get install autoconf libtool make g++ btyacc \
libicu-dev libtommath-dev libncurses5-dev libreadline-dev zlib1g-dev

前回同様 Github からソースを取ってくるので git をインストールして clone
$ sudo apt-get install git
$ git clone https://github.com/asfernandes/firebird.git

コンパイル&インストール
$ export LANG=C
$ cd firebird
$ ./autogen.sh
$ make
$ sudo make install

make install の途中で SYSDBA のパスワード聞かれる

Please enter new password for SYSDBA user: XXXXXXX ←(SYSDBA のパスワード)

このあと
Segmentation fault (core dumped)
って出ちゃうけど、ちゃんと SYSDBA の password 設定されるっぽい。

パスに /usr/local/firebird/bin を追加すると isql コマンドとか使える。
/usr/local/firebird の下と、↓のディレクトリにファイルがおかれる模様
Adding system startup for /etc/init.d/firebird ...
/etc/rc0.d/K20firebird -> ../init.d/firebird
/etc/rc1.d/K20firebird -> ../init.d/firebird
/etc/rc6.d/K20firebird -> ../init.d/firebird
/etc/rc2.d/S14firebird -> ../init.d/firebird
/etc/rc3.d/S14firebird -> ../init.d/firebird
/etc/rc5.d/S14firebird -> ../init.d/firebird

これらのファイルを削除すれば現状復帰できそう(未確認)

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird3の新しい設定項目(接続関連) [Firebird]

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

Firebird3 では、クライアントとサーバーを接続するための新たな設定を firebird.conf に記述できるようになりました。
デフォルトでは、Firebird3 で実装されたセキュリティの高い接続が行われるようになっていますが、そのままだと、 Firebird2.5 までのクライアント(アプリケーション)との接続に失敗してしまいます。
firebird.conf の設定を変更すると(secureではないですが) Firebird2.5 と接続していたクライアントアプリとの接続ができるようになっています。

【概要】
大きく、
- 認証と暗号化のための秘密鍵の交換のための設定
- 通信路の暗号化をするかどうかと、そのアルゴリズム
が設定できます。
また、Firebird3 beta2 から、
- 通信データの圧縮を行うかどうかの設定
もできるようです。

以下、 firebird.conf の設定項目について

【認証と鍵交換】
AuthServer: サーバーが認証のために待ち受ける認証プロトコル
AuthClient: クライアントが接続を試みる認証プロトコル。

それぞれ、カンマで区切るとその順番にそのメソッドで認証を試みます。
取りうる値は以下の通り
- Srp(デフォルト) SRP で認証と鍵交換を行う
- Legacy_Auth 平文でパスワードをやり取りして認証し、通信路は暗号化しない
- Win_Sspi Windowsの認証(すみませんよくわかりません)

Legacy_Auth が Firebird 2.5 までと互換性あります


【通信路の暗号化と圧縮】
WireCrypt: 通信経路を暗号化するかどうか
- Disable 無効。暗号化なし。Firebird 2.5 までと互換性あり。
- Enable(デフォルト) 有効(クライアント設定)暗号化ありで接続を試みる
- Required(デフォルト)必須(サーバー設定)クライアントが Disable で接続を試みた場合エラー

CryptPlugin: 暗号化方式(現状 Arc4 しか選択できない)
- Arc4 RC4 で暗号化する

WireCompression: 通信を圧縮するかどうか。β2から実装
- true 圧縮する
- false (デフォルト) 圧縮しない

【古いクライアントから Firebird3 に接続する場合の設定例】
Firebird3 のサーバーが、古いクライアントからの接続を受け付けるには
サーバーの firebird.conf に
AuthServer = Srp,Legacy_Auth
WireCrypt = Enabled

と書けばよいです

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Python から Firebird を使う [Firebird]

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

【はじめに】

Python から RDBMS にアクセスするための仕様が PEP249 として定義されています。
https://www.python.org/dev/peps/pep-0249/
PEP249 に準拠した Firebird のデータベースドライバーについて書きたいと思います。


【Firebird 用 データーベースドライバー】

Firebird に以下のようなデーターベース・ドライバーが存在します。

[KInterbasDB(obsoleted)]
http://www.firebirdsql.org/en/python-driver/
古くから存在していますが、 Author が亡くなって引き継ぐ人がいないためPython2.7 まででしか動作しません。
C拡張を使っているため、速度は速いと想像できますが、今後メンテナンスされることはなさそうなのでお勧めしません。
久しぶりに調べましたが pypi にも登録されていないようです


[FDB]
https://pypi.python.org/pypi/fdb/
現在の Firebird プロジェクト公式の database driver です。
パッケージは pip install fdb でインストールできますが、
ctypes を使ってクライアントライブラリを呼び出しているので、ほかに
fbclient.so(Windows の場合は fbclient.dll)が必要になります

fbclient.so (fbclinet.dll) のインストールは、例えば、 Ubuntu であれば

$ sudo apt-get install libfbclient2

でもインストールできると思いますが、
クライアントマシンにFirebird サーバーをインストールしてしまうのが簡単だと思います

[pyfirebirdsql]
https://pypi.python.org/pypi/firebirdsql/
Python だけで書かれた(pure python)実装です

$ pip install firebirdsql

でインストールできます。
結果セットのデータサイズが非常に大きいと、上記2つのドライバーより遅くなると思います。


【使い方】
簡単な例は https://github.com/nakagami/pyfirebirdsql/#example にあります
import するパッケージが違うだけで、上記どのパッケージでも同じ感じで使えます

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Zope(Plone) から Firebird にアクセスする [Firebird]

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

【はじめに】
Python で書かれた Zope という Web Application Server があります。
また、Zope で構築された CMS の Plone があります。
Plone について紹介された最近のスライドを見ると雰囲気がわかるかもしれません。
http://www.slideshare.net/takanory/plone-features-and-trends

Zope には RDBMS と接続するための仕組み Zope Database Adapter があります。
今回、 Zope (Plone) と Firebird の Zope Database Adapter の FirebirdDA を
インストールしてみたいと思います。

【インストールと動作確認】
現状、 Zope 単体でインストールするよりも、いろいろ同梱された Plone の Unified Installer を使ってインストールするのが簡単なので、Plone の Unified Installer を使ってインストールします。

基本的には http://nakagami.blog.so-net.ne.jp/2013-08-21 の手順に従いました。
Plone のバージョンが 4.3.4 に、 Ubuntu が 14.04 に微妙に上がりましたが、基本は同じです。
以下が、実行したコマンドと設定ファイルの修正記録

$ sudo apt-get install libxml2-dev libxslt1-dev

$ wget https://launchpad.net/plone/4.3/4.3.4/+download/Plone-4.3.4-r1-UnifiedInstaller.tgz
$ tar zxvf Plone-4.3.4-r1-UnifiedInstaller.tgz
$ cd Plone-4.3.4-UnifiedInstaller
$ ./install.sh standalone --without-ssl
$ cd ~/Plone/zinstance
$ ./bin/plonectl start

インストールの最後にでるアカウントとパスワードでログインできる
見落としたら ~/Plone/zinstance/adminPassword.txt にあるのでそれを参照します

次に Firebird の Database Adapter FirebirdDA をインストールします。
https://github.com/nakagami/Products.FirebirdDA
https://pypi.python.org/pypi/Products.FirebirdDA/

buildout.cfg の eggs の項に1行を追加して

eggs =
...
Products.FirebirdDA

以下を実行。

$ ./bin/buildout
$ ./bin/plonectl restart

ここまでで Database Adapter のインストールができました
次に、Database Adapter のオブジェクトを追加します

「ZMI(Zope管理インタフェース)」のリンクをクリック
select type to add に「 Firebird database connection」を選択して Add
screen0.png
Id、Title、 Data Source を入力して「Add」をクリック
screen1.png
できたオブジェクトをクリックして「Test」タブをクリック
screen2.png
テキスト欄に SQL文を入れて「Submit Query」で結果が表示される
screen3.png
ここまでが、インストールと接続確認になります。

【アプリケーション構築】
この FirebirdDA を使って Firebird に接続して、参照・更新するような
アプリケーションの形にするには、ZSQLMethod を書いて、
テンプレートから呼び出します。

続きは、 以下を参照してください。

The Zope2 Book 19. Relational Database Connectivity
http://docs.zope.org/zope2/zope2book/RelationalDatabases.html
ZSQL method User's Guide
http://www.zms-publishing.com/content/e3493/e1038/e3527/e3529/ZSQL_Methods_Users_Guide_ger.pdf

【最後に】
過去のブログエントリの日付を見ると、自分は1年3ヶ月振りに Plone をインストールしたようです。
最近、メールで「FirebirdDA が動かないんだけど」という問い合わせがあり、
そのために上記手順を実施したので、せっかくなので記録として残しました。
ちなみに、Zope のバージョンが上がるのにともなって、FirebirdDA が
動かなくなっていたようです。FirebirdDA を修正して 0.6.4 をリリースしました。

いきなり、ニッチな話になってすみません。
明日は、(もう少し一般的な) Python から Firebird を使うことについて書きたいと思います。

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird wire Protocol version 11 の変更 [Firebird]

(自分以外には全くなんの役にも立たないが、後で自分が見るためのエントリー)

ここ↓で書いた FB3 との SRP での鍵交換と RC4 による暗号化は試行錯誤の末できた。
http://nakagami.blog.so-net.ne.jp/2013-10-24
Firebird のソースの firebird/src/auth/SecureRemotePassword/srp.cpp の中の
ソースを呼んだり、dumpIt() 関数の呼び出しを追加して isql コマンドの
ネゴシエーション中の途中の計算値を出力したりして、なんとかなった。

ところが、 op_allocate_statement の op_response が返ってこない
どうもこれ↓な気がする。
http://firebird.1100200.n4.nabble.com/Protocol-version-11-changes-td1123730.html

わかる範囲で整理すると、以下のような感じ
protocol 10: Interbase6.0 -> Firebird 2.0 までの古いやつ
protocol 11: ptype_lazy_send Firebird 2.1 から
protocol 12: ?? Firebird 2.5 から?
protocol 13: SRP+RC4 Firebird 3 から

(2014-07-13追記)
http://sourceforge.net/p/firebird/mailman/message/32598285/

(2014/11/04追記)
2014/10/30 リリースの firebirdsql0.9.5 で対応できた
golang のドライバーも直せた
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感