From: Kouhei Sutou Date: 2008-06-17T22:07:55+09:00 Subject: [ruby-list:45083] [ANN] ActiveLdap 1.0.1 須藤です。 先日、ActiveLdap 1.0.1がリリースされました。 http://rubyforge.org/projects/ruby-activeldap/ ActiveLdapとはLDAPのエントリをActiveRecordと同じようなAPIで 操作するためのライブラリで、こんな風に書けます。 matz = User.find("Matz") matz.description = "The father of Ruby" matz.save! また、ActiveRecordと同じようにエントリ間の関係を定義して、簡 単にアクセスすることもできます。 class Member < ActiveLdap::Base belongs_to :groups, :many => "memberUid" end class Group < ActiveLdap::Base has_many :members, :wrap => "memberUid" end developers = Group.find("developers") developers.members # => [Member("Matz"), Member("ko1"), ...] ko1 = Member.find("ko1") ko1.groups # => [Group("developers"), Group("Rubyist"), ...] staffs = Group.find("RubyKaigi2009 Staffs") ko1.groups << staffs staffs.reload staffs.members # => [Member("ko1"), ...] 他の特徴は以下のとおりです。 * わりと真面目なLDIFパーサを持つ * わりと真面目なLDAPスキーマパーサを持つ * わりと真面目なDNパーサを持つ * ひととおりのuserPasswordハッシュ化サポート (CRYPT/MD5/SMD5/SHA/SSHA) * OpenLDAPだけではなく、Active DirectoryやeDirectoryとも うまく動くっぽい(報告例あり) * LDAPスキーマに則ったバリデーション機能 * ActiveRecordと同じバリデーション機能 * Ruby-GetText-Packageサポート * ActiveSupport/ActiveRecord 2.1.0サポート(←に依存している) * 複数のLDAPバックエンドをサポート ActiveLdapはLDAP接続のための機能をもっておらず、以下のライブ ラリをバックエンドとして利用してLDAPと接続します。 * Ruby/LDAP: http://raa.ruby-lang.org/project/ruby-ldap/ * 拡張ライブラリ * Net::LDAP: http://rubyforge.org/projects/net-ldap/ * Pure Ruby。リリースされているものだと動かない。 Subversionにあるやつを使わないといけない。 http://net-ldap.rubyforge.org/svn/branches/experimental_netldap/ * javax.naming.directory.ldap * JRubyのみで利用可能。大体動く。 javax.naming.directory.ldapは ruby 1.8.6 (2008-06-12 rev 6586) [i386-jruby1.1.2] というJRubyで単体テストを走らせて確認したくらいです。 (ほとんどのテストがパスする状態) 実際に使ってみて問題があるかどうかはわかりません。 検索する時の速度は以下のような感じになります。 (1) Ruby/LDAPを直接使う (2) Net::LDAPを直接使う # (1)より10倍くらい遅い (3) ActiveLdap + Ruby/LDAPを使う # (2)より3倍くらい遅い (4) ActiveLdap + Net::LDAPを使う # (3)より少し遅い Ruby/LDAPの方がNet::LDAPよりも圧倒的に速いのですが、 ActiveLdapが検索結果をオブジェクト化する部分がボトルネックに なるので、ActiveLdapレベルではバックエンドでの速度差はそんな にでないです。 ベンチマークの実行例: % ruby benchmark/bench-al.rb --config benchmark/config.yaml Populating... Rehearsal --------------------------------------------------------------- 1x: AL(LDAP) 0.240000 0.010000 0.250000 ( 0.278655) 1x: AL(Net::LDAP) 0.370000 0.020000 0.390000 ( 0.414705) 1x: AL(LDAP: No Obj) 0.010000 0.000000 0.010000 ( 0.015984) 1x: AL(Net::LDAP: No Obj) 0.050000 0.000000 0.050000 ( 0.073965) 1x: LDAP 0.000000 0.000000 0.000000 ( 0.002850) 1x: Net::LDAP 0.050000 0.000000 0.050000 ( 0.065836) ------------------------------------------------------ total: 0.750000sec user system total real 1x: AL(LDAP) 0.140000 0.010000 0.150000 ( 0.149693) 1x: AL(Net::LDAP) 0.170000 0.010000 0.180000 ( 0.188454) 1x: AL(LDAP: No Obj) 0.020000 0.000000 0.020000 ( 0.025716) 1x: AL(Net::LDAP: No Obj) 0.040000 0.010000 0.050000 ( 0.060187) 1x: LDAP 0.010000 0.000000 0.010000 ( 0.008380) 1x: Net::LDAP 0.040000 0.000000 0.040000 ( 0.048604) Entries processed by Ruby/ActiveLdap + LDAP: 100 Entries processed by Ruby/ActiveLdap + Net::LDAP: 100 Entries processed by Ruby/ActiveLdap + LDAP: (without object creation): 100 Entries processed by Ruby/ActiveLdap + Net::LDAP: (without object creation): 100 Entries processed by Ruby/LDAP: 100 Entries processed by Net::LDAP: 100 Cleaning... もし、LDAPを触る機会があったらどうぞ。