So-net無料ブログ作成

Go言語 の Firebird driver 2016 [Firebird]

この記事は Firebird Advent Calendar 2016 http://qiita.com/advent-calendar/2016/firebird 20日目のエントリーです

私がスクラッチから書いている Go 言語の Firebird driver について。
まずは、過去の記録を見ていただくとして

http://nakagami.blog.so-net.ne.jp/2014-12-23
http://nakagami.blog.so-net.ne.jp/2015-12-08

機能も一通り動いているので、やれやれ、もうこれでやることないぞ、と思っていたら、
「Go1.8 で database/sql の機能が拡張されるからよろしくね」
https://github.com/nakagami/firebirdsql/issues/36
という Issue が立った。

「うーん、英語も Go言語もよくわからないし、これはどうすればいいんだ?」
と思っていたら
mattn さんにより日本語解説が書かれた
http://mattn.kaoriya.net/software/lang/go/20161106232834.htm
しかも、今までやったことなかったけど build constraints というので、
Go のバージョンでコンパイルするかしないかを分けられることを知った
http://mattn.kaoriya.net/software/lang/go/20161202095532.htm
ありがたやありがたや

ちなみに、この mattn さんの解説の時から今までで仕様の変更が少しあった。
BeginContext という関数がなくなって、代わりに
BeginTx という関数になり、その関数で
context.Content の他に、 IsolationLevel と ReadOnly かどうか
のstruct の txOptions というオプション変数を渡すようになった。
https://github.com/golang/go/blob/master/src/database/sql/driver/driver.go#L199

Firebird のドライバーについては
「複数の結果セット」はサポートせず、それ以外の関数は
形だけでも実装しようと思っている(現在進行形)
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird4.0 Plannning [Firebird]

この記事は Firebird Advent Calendar 2016 http://qiita.com/advent-calendar/2016/firebird 19日目のエントリーです

昨年(2015年)の秋頃の話では
- 2015年中に Firebird3.0 をリリース
- Firebird3.0 リリースの少し前に Firebird 4.0 のブランチを作る
- 次のリリースは Firebird3.0 リリースから一年半後くらいにはしたいよねー
- そのためには、来年(2016年)の年末には 4.0 alpha 1 をリリースしたい
となっていました。

はい、2016年の年末を迎えて、振り返ると、やはり予想通り遅れて、
いつもの Firebird ですね。
でも、地道に進めているところも、いつもの Firebird だと思います。

Firebird のリリースの Plannning Board はここにあります
http://www.firebirdtest.com/en/planning-board/

Mandatory features の中では、テーブル名などの識別子が31文字より長い
ものが使えるようになっているようです(素晴らしい)

JIRA を見る方が現状にあっているようで、PlanningBoard の項目のいくつかは
Firebrid4.0 alpha1 から先送りされているようです。
http://tracker.firebirdsql.org/secure/IssueNavigator.jspa?reset=true&mode=hide&sorter/order=DESC&sorter/field=priority&resolution=-1&pid=10000&fixfor=10731

Planning Board や JIRA を見ると、次のバージョンでは

- 識別子に31文字以上使える
- レプリケーションやスタンバイ機能
- User/Role の機能追加
- Window 関数のさらなる追加

あたりが実装されそうです
(バックアップ/リストアも改善されるかも)

2.0 → 3.0 に 10年の月日がかかったわけですが、
2020年くらいに Firebird 4.0 が出てくれるといいなぁ、と思う今日この頃です
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird ADO.Net Provider の Current status [Firebird]

この記事は Firebird Advent Calendar 2016 http://qiita.com/advent-calendar/2016/firebird 16日目のエントリーです

stable なバージョンは、最新が 5.7.0.0 で bugfix だけみたいですが
https://blog.cincura.net/233588-ado-net-provider-5-7-0-0-for-firebird-is-ready/
5.6.0.0 で .NET Core がサポートされているそうです。
https://blog.cincura.net/233580-ado-net-provider-5-6-0-0-for-firebird-is-ready-with-net-core-support/
(.NET Core についてはよくわかっておらず・・・)

5.0.0.0 のリリースで
http://www.firebirdsql.org/en/news/ado-net-provider-5-0-0-0-release/
- Boolean support
- srp authenticaiton support
- null indicator
といった Firebird3.0 の機能のへの対応が完了していますので、デフォルトのfirebird.conf のFirebird3.0 に接続できると思います。

ちなみに .NET Framework は当然として、随分前から Mono でも動くようになっています。
以前に srp authentication の pull request を送った時は、
https://github.com/cincuranet/FirebirdSql.Data.FirebirdClient/commits?author=nakagami
私は、 Windows の環境がなかったので Mono 上の MonoDevelop でコンパイルして動作確認しました

ここら↓で環境作ったときですね
http://nakagami.blog.so-net.ne.jp/2015-08-29
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Jaybird (Firebird JDBC Driver) の Current status [Firebird]

この記事は Firebird Advent Calendar 2016 http://qiita.com/advent-calendar/2016/firebird 15日目のエントリーです

Firebird 3.0 に関連するプロトコル追加について Pull Request を
送ったことについて、昨年の AdventCalendar に書きました
http://nakagami.blog.so-net.ne.jp/2015-12-20
その時点では「 master にマージされてリリースされていない」という状態で
Firebird3.0 もリリースされていませんでした。

その後 Firebird 3.0 がリリースされましたが Firebird 3.0 のWireprotocol 13 に対応したドライバー Jaybird 3.0 は現在 beta1
http://www.firebirdsql.org/en/news/jaybird-3-0-0-beta-1-is-now-available-for-testing/
http://www.firebirdsql.org/file/documentation/drivers_documentation/java/3.0.0-beta-1/release_notes.html

去年の夏頃に Pull Request を送って、
https://github.com/FirebirdSQL/jaybird/commits?author=nakagami
その頃にはまだ Firebird 3.0 がリリースされてなかったとはいうものの、データーベース関連の OSS のリリースは実に慎重だなぁ、と思う今日この頃です。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird 3.0 の統計処理用の集約関数 [Firebird]

この記事は Firebird Advent Calendar 2016 http://qiita.com/advent-calendar/2016/firebird 13日目のエントリーです

Firebird 3.0 で相関係数・標準偏差とその関連の値を求める関数が実装されました。
公式なドキュメントしては、 Firebird3.0 のリリースノートに説明があるので読んでください。
http://firebirdsql.org/file/documentation/release_notes/html/en/3_0/bk01ch09s05.html#rnfb30-dml-statistical

(PostgreSQLでは歴史的理由で残されている stddev, variance は、Firebird では実装されていませんが)PostgreSQL の統計処理用の集約関数に相当するので、日本語で読みたい場合は、PostgreSQL のリファレンスマニュアルを見るのが良いと思います。
https://www.postgresql.jp/document/9.6/html/functions-aggregate.html#functions-aggregate-statistics-table
ぶっちゃけ、私も、この PostgreSQL の表を参考に実装しました。

今年の Firebird Advent Calendar では、 meijik さんが、
「使い慣れたSQLに潜む実装依存: Firebirdの場合」
というテーマで連続して書かれてますが、標準偏差、分散に関連する関数についても、PostgreSQL で、戻り値の型が
「浮動小数点型の引数ではdouble precision。それ以外ではnumeric 」
となっているところは、Firebird では常に double precision が返ります。

関数の詳細について、日本語で書かれた良いドキュメントないかなーと探したのですが、
標準偏差と分散については Redshift のマニュアルがわかりやすいと思いました。
- http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_STDDEV_functions.html
- http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_VARIANCE_functions.html
残念ながら、そのほかの関数は Redshift では実装されてないようです
- http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_unsupported-postgresql-functions.html

これらの関数について pull request を送ってマージされた話は昨年の Firebird Advent Calendar 2015
http://nakagami.blog.so-net.ne.jp/2015-12-22 に書きました
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird のイベント機能の使い方 [Firebird]

この記事は Firebird Advent Calendar 2016 http://qiita.com/advent-calendar/2016/firebird 9日目のエントリーです

Firebird には Interbase の頃から、「イベント」という機能があります。
トリガーの中で post_event 'イベント名' とすると、
クライアントに、そのイベントが発生したことを通知できる機能です。

もちろん、クライアントライブラリがその機能を持っていなければ
使うことはできませんが、 pyfirebirdsql には、その機能があります。

例えば、 test_table のレコードが削除された時に 'event_d' という
イベントを発生させるトリガーを
CREATE TRIGGER trig_test_delete_event
    FOR test_table AFTER DELETE
AS BEGIN
    post_event 'event_d';
END
のように書きます。

pyfirebirdsql では一度に複数のイベントを待ち受けることができます
例えば、以下の例では event_a, event_b, event_d を待ち受けます

    conn = firebirdsql.connect('server', 'database', 'user', 'password')
    conduit = conn.event_conduit(['event_a', 'event_b', 'event_d'])
    result = conduit.wait()
    print(result)


そして、例えば test_table のデータを2レコード削除するようなクエリーを
delete from test_table; (←2レコードデータ削除されるとすると・・・)

他のクライアント(isqlなど)から実行すると

{'event_b': 0, 'event_a': 0, 'event_d': 2}

と print されます。
つまり、待ち受けていたイベントのどれかがポストされた時
{'イベント名': 発生回数} の辞書形式でデータを受け取ることができます
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

pyfirebirdsql 1.0 リリース [Firebird]

この記事は Firebird Advent Calendar 2016 http://qiita.com/advent-calendar/2016/firebird 6日目のエントリーです

私が書き起こしてメンテナンスを続けている pure python の Firebird データーベースドライバー pyfirebirdsql については、一昨年と昨年の Advent Calendar でも言及していました

- http://nakagami.blog.so-net.ne.jp/2014-12-20
- http://nakagami.blog.so-net.ne.jp/2015-12-05

Firebird 3.0 の対応はベータリリースの頃にはできており、もう長いこと機能追加しないままバージョン番号が 0.9.12 になってしまったので思い切って 1.0.0 としてリリースしました。

検索してみたところ、Python mini Hack-a-thon #1 https://atnd.org/events/7474 の時に私が Github & pypi デビューした時がリリースの始まりだったようで http://nakagami.blog.so-net.ne.jp/2010-09-26-1 (ソースの Copyright を見ると、その前年あたりから開発してたっぽい)
version 1.0 のリリースというより、ここまで続けてこれたことと、この時参加した人の何人かが、いま同じ会社にいることが感慨深いです。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird3.0 の firebird.conf の記述 [Firebird]

この記事は Firebird Advent Calendar 2016 http://qiita.com/advent-calendar/2016/firebird 2日目のエントリーです

Firebird サーバーの設定については、 firebird.conf に記述するようになっていて

- 最初は全部コメントになっていて決まったデフォルト値が有効になっている
- 記述の仕方は firebird.conf にコメントとして記述されている
- Firebird3.0 では、データーベース(ファイル)毎に設定できる項目もできた

となっています。

Firebird 3.0 の Wireprotocol version 13 というバージョンに対応したデーターベースドライバー(クライアントライブラリ)を使えば、デフォルトの(全てコメント状態の) firebird.conf のままで使えますが firebird.conf の設定を適切にすれば、古いドライバーのクライアントアプリケーションから Firebird 3.0 のサーバーに接続することも可能です。

Firebird 3.0 は、以前のバージョンからパフォーマンスダウンにならないように慎重に開発されたようなので、サーバーリプレースの際には Firebird 3.0 にバージョンアップすることを考慮して良いと思います。

以下、古いデーターベースドライバー(アプリケーション)から Firebird3.0 に接続するための設定項目について解説します

[AuthServer]
認証方法。デフォルトでは、 Srp という、サーバーとクライアントが公開鍵を交換しあうことで秘密のセッションキーを取得するプロトコルで認証するようになっています古いクライアントから接続するためには、 Legacy_Auth を設定します

AuthServer = Srp, Legacy_Auth

と記述しておくと、サーバーはまず最初に Srp での認証を試み、クライアントが Srp認証に対応していないと Legacy_Auth で認証するようになります。

[UserManager]
ユーザー管理のデータベースにどの形式を使うかを指定します。
Firebird2.5 までの、セキュリティデーターベース(ログイン情報)をそのまま使う場合、
UserManager=Legacy_UserManager
と設定するようです。
Firebird3.0 のサーバーを新たに立てるなどした場合で、Firebird のデーターベースユーザーをその時新規に作るような場合は特に設定しないで良いと思います
(UserManager=Srp と同等になる)

- 新しいサーバーに Firebird 3.0 をインストールしユーザーを追加
- 古いサーバーから gbak でバックアップして新しいサーバーでリストア

の手順を踏めば UserManage の設定はしなくて良いはずです

[WireCrypt]
通信路を暗号化するかどうかデフォルトでは WireCrypt=Required となっていますが古いドライバーを使うアプリケーションの場合には
WireCrypt=Enable
もしくは
WireCrypt=Disable
とします。
WireCrypt=Enable は、通信経路の暗号化のネゴシエーションがうまくいけば暗号化し、ダメなら平文で通信します。
WireCrypt=Disable ならクライアントが通信経路を暗号化する機能を持っていても常に平文で通信します

[ServerMode]
Firebird2.1 まででは、Super Server と Classic Server が、 Firebird2.5 では、それに加えて SuperClassic というアーキテクチャーの
サーバーがそれぞれ別のバイナリとして提供されていましたが Firebird3.0 からはバイナリは一つになって、 firebird.conf の設定で切り替えるようになりました
Super/SuperClassic/Classic のいずれかを設定できるようです。
「あれ? 前にそうだったんで、 ClassicServer が使いたいんだけど、どこにいったの?」
というような場合に設定してください

ちなみに、古いドライバーだと firebird.conf に AuthServer, WireCrypt あたりを設定すると使えるようになりますが、Firebird 3.0 で実装された boolean 型のデータを select しようとすると(当然ならが)動作しないので、気をつけてください。

2014年の AdventCalendar に書いたエントリーも参考にしてください
http://nakagami.blog.so-net.ne.jp/2014-12-16
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

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 することになろうとは想像すらしなかった。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

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 は(まだ出てないけど)個人的に特別のリリースになりました。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感