iakioの日記 RSSフィード

2009-12-07

札幌Ruby会議02で発表してきました

| 23:41 | 札幌Ruby会議02で発表してきました  - iakioの日記 を含むブックマーク はてなブックマーク - 札幌Ruby会議02で発表してきました  - iakioの日記

んで、資料もUPしました。動画もあるみたいです。

段取りの悪さに自分で動画を見て笑いました。解説すると、

  • 最後のスライドの話をしたあとにうっかり脱線して別の話をはじめる
  • 別の話がおわって元に戻ろうとする
  • 「あ、プレゼンおわってた」

ということです。計算じゃないです。天然です。あと時間が押し気味だったので急いで話してるつもりだったんですが全然そうは見えないですね。でもリハの時点ではもっとグダグダでどうしようって感じだったし、やろうと思ってやれた部分も多少あるのでそこそこ満足してます。

他の言語との比較は、.soファイルをnmしてPQからはじまる関数を数えたものです。なんでラージオブジェクト関係は数えてないです。他の言語の関係者に怒られないうちにいっておくと、PerlにはDBIPythonにはDB-APIというインタフェースありきなので若干数が少ないのでしょう。あとPythonには他にも3つほどPostgreSQLのドライバがあるので別のと比べれば違う結果になっていたでしょう。

個人的には、LTのドロリッチの人と並列分散クローラの人が面白かったです。LT以外ではえにしテックのテックさんの愛されっぷりがパないっす。

あと、math-sapporoで僕が登校拒否児童みたいになってます。ごめんなさい。来週こそ行きます。

ちょっと前のpgcon09jにいってきて、僕とPostgreSQLとの付き合いも10年以上になって、もっと古い人もいるけどもっと新しい人がバリバリ活躍していたりして、で、それぞれの人が異なる背景でPostgreSQLと出会っているんだなって思ったわけです。で、その出会い方の数だけ、色んな思いやモチベーションがあって、例えば僕より古い人の原点みたいなのは、僕より新しい人達にはなかなか理解できないだろうなぁ。そういうのを伝える場があってもいいんじゃないかなぁなんてことを、Ruby会議の熱気の中で思いました。

Rubyが好きかどうかにかかわらず、Ruby会議にいってみれば何か気がつくことがあるかもしれません。

あと、RubyistRubyを思うように、それぞれのコミュニティにはそれぞれの歴史や文化が思いがあるということを心の片隅に止めておけば、世の中もう少し平和になるんじゃないかと思いました(自分も)。

トラックバック - http://postgresql.g.hatena.ne.jp/iakio/20091207

2008-09-04

ruby-pgをインストールするにはgem install pg

| 00:38 | ruby-pgをインストールするにはgem install pg - iakioの日記 を含むブックマーク はてなブックマーク - ruby-pgをインストールするにはgem install pg - iakioの日記

ruby-pgでPGconn#traceが使えないと書きましたが実は ruby-pg-0.7.9.2008.03.18では使えるようです(この時使っていたのはruby-pg-0.7.9.2008.01.28)。

なんだけどgemだとこの最新版は入らない様子。

ruby-pgで非同期通知 - iakioの日記 - postgresqlグループ

と書きましたが実はgemの名前がruby-pgからpgにかわっていたからでした。

# gem query -r -a -n pg

*** REMOTE GEMS ***

...
pg (0.7.9.2008.08.17, 0.7.9.2008.03.18, 0.7.9.2008.02.05, 0.7.9.2008.01.28)
...
ruby-pg (0.7.9.2008.01.28, 0.7.9.2008.01.24, 0.7.9.2008.01.08)

libpqのAPIをほとんど実装してるんじゃいないでしょうか。LLのPostgreSQLインタフェースの中で一番の出来かもしれません。

トラックバック - http://postgresql.g.hatena.ne.jp/iakio/20080904

2008-07-13

ruby-pgで非同期通知

| 14:10 | ruby-pgで非同期通知 - iakioの日記 を含むブックマーク はてなブックマーク - ruby-pgで非同期通知 - iakioの日記

http://postgresql.g.hatena.ne.jp/iakio/20080623で、ruby-pgでPGconn#traceが使えないと書きましたが実は ruby-pg-0.7.9.2008.03.18では使えるようです(この時使っていたのはruby-pg-0.7.9.2008.01.28)。

なんだけどgemだとこの最新版は入らない様子。

# gem query -r -n ruby-pg

*** REMOTE GEMS ***

ruby-pg (0.7.9.2008.01.28, 0.7.9.2008.01.24, 0.7.9.2008.01.08)

何ででしょう。

(2008-09-05追記:解決しました)

それはともかく最新のruby-pgでは非同期通知も使える、というかPGconn#notifiesは前からあったんだけどPGconn#socketが前は使えなかった。

//TODO PQsocket
/*
 * call-seq:
 *    conn.socket() -> TCPSocket
 *
 * Returns the socket file descriptor of this
 * connection.
 */

TODOになっていたんだけど、「それfdそのまま返していいんじゃなかろうか」と思ってたら最新版ではそう実装されました。

で、こんな風に使います。

con = PGconn.new("dbname=testdb")
sock = IO.for_fd(con.socket)
con.exec("listen foo")
while 1
    select([sock])
    con.consume_input
    p con.notifies
end

これを動かしつつ、別の端末からnotifyします。

=> notify foo;
NOTIFY
=> notify foo;
NOTIFY

すると、

$ ruby listen.rb
{:be_pid=>79597, :extra=>"", :relname=>"foo"}
{:be_pid=>79597, :extra=>"", :relname=>"foo"}

となるわけです。これをトリガと組み合わせると、データが更新されたときに何かするようなプログラムが簡単に書けます。

Perl + libeventはこちら。

no title

MarcoMarco2013/08/10 19:32That's a sensible answer to a chnileaglng question

PetyPety2013/08/14 19:36This is the ideal answer. <a href="http://fnyfeg.com">Evoeryne</a> should read this

2008-06-23

ruby-pgで拡張問い合わせ

| 17:22 | ruby-pgで拡張問い合わせ - iakioの日記 を含むブックマーク はてなブックマーク - ruby-pgで拡張問い合わせ - iakioの日記

ruby-postgresもpostgesl-prも全然メンテナンスされていないので、ruby-pgというのができたわけですが、まずこのruby-postgresとかpostgres-prとかruby-pgとかいう名前は何の名前なんでしょう。プロジェクト名と呼べばよいのかな。

404 Not Found

さて、ruby-pgにはpostgresというモジュールとpgというモジュールが含まれていて(ここがモジュール名だよね)、postgresはruby-postgres互換、pgというのは新しいけど多分postgresの上位互換のインタフェースで、かつlibpqをかなり忠実に実装したものになっています。

あと多分、昔はgem install postgresするとruby-postgresのpostgresモジュールがインストールされていたのが、現在ではruby-pgのpostgresモジュールがインストールされるようになっている、ということだと思います。ruby-pgpgモジュールをインストールしたい場合はgem install pgするのかな。

no title

pgではプリペアードステートメントなんかの拡張問い合わせも使えるようになってます。

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'pg'
=> true
irb(main):003:0> c = PGconn.open(:dbname=>'db1')
=> #<PGconn:0x824fce0>
irb(main):006:0> r = c.exec('select $1::int, $2::text', ['100', 'hello'])
=> #<PGresult:0x8245d44>
irb(main):007:0> r[0]
=> {"text"=>"hello", "int4"=>"100"}

irb(main):012:0> c.prepare("", "select $1::date")
=> #<PGresult:0x8237cf8>
irb(main):018:0> r = c.exec_prepared("", ["2008-01-01"])[0]
=> {"date"=>"2008-01-01"}
irb(main):019:0> r = c.exec_prepared("", ["2008-02-01"])[0]
=> {"date"=>"2008-02-01"}

PGconn#traceが使えないのが残念だなぁ。"TODO broken for ruby 1.9"だそうです(そんなの欲しがってるの僕だけですかそうですか)。

トラックバック - http://postgresql.g.hatena.ne.jp/iakio/20080623

2008-06-03

SQLインジェクションとDBD::PgPP

| 13:04 | SQLインジェクションとDBD::PgPP - iakioの日記 を含むブックマーク はてなブックマーク - SQLインジェクションとDBD::PgPP - iakioの日記

PostgreSQL8.1.4のリリースが2006年で、DBD::PgPPの0.05が2004年なので、standard_conforming_stringに対応していないのは当然といえば当然かもしれませんが。

こんどはPerlでの例。PerlからPostgreSQLを利用する場合には、DBIとDBD::Pgの組み合わせが利用される・・・と思うのだが、筆者の環境では中々DBD::Pgがインストールできなかったので、代わりにDBD::PgPPを使って検証してみた。PgPPはピュアPerlで記述されたPostgreSQL用インターフェースである。DBD::PgPP中のquote()のソースを見ると、文字の変換部は以下のようになっていた(バージョン0.05)。

徳丸浩の日記 - SQLインジェクション対策 - SQLエスケープにおける「\」の取り扱い

DBD::PgPPはもう使ってはいけないモジュールと言ってしまっていいかもしれなません。

「DBD::PgPP」の事例は脆弱性として取り扱われてもよいと思う。

はてなブックマーク - HiromitsuTakagiのブックマーク / 2008年06月03日

DBD::PgPPを使っている人はそう多くないのではないかと思いますが、Rubyのpostgres-prはかなり使われているのではないかと思います。これも同様の問題が発生すると思います(やっぱ2004年から更新されてないし)が、何をどうしろと言えるほど私はRubyを知りません。

  def self.escape(str)
    # TODO: correct?
    str.gsub(/\\/){ '\\\\' }.gsub(/'/){ '\\\'' }
  end

RaniRani2012/12/26 09:11This is way more hluepfl than anything else I've looked at.

trjoqntrjoqn2012/12/29 08:09tt57QG , [url=http://qkwgeephrern.com/]qkwgeephrern[/url], [link=http://xrhdurjpgorv.com/]xrhdurjpgorv[/link], http://snridnvpoaex.com/

トラックバック - http://postgresql.g.hatena.ne.jp/iakio/20080603