irb での ActiveLdap 操作時に LDAP クエリ文字列を標準出力に吐き出す方法

何かの操作を行う前に以下を実行する。

logger = Logger.new($stdout)
logger.level = Logger::DEBUG
ActiveLdap::Base.connection.instance_variable_set :@logger, logger

拡張クラスの操作を行った時点で logger がコピーされて効力無くなるようなので注意。

プロセスに関するメモ

ここで言うプロセスは情報システム上のプロセスの事ではない。ISMS 等でよく言われる意味でのプロセス、仕事上のプロセスを指す。情報システム上のプロセスは、むしろ仕事や組織の活動の単位を示す”プロセス”という言葉を模倣したものなんじゃないかと思う。

プロセスとは入力を受け、処理を行い、出力を返すものを言う。

判りやすいのは銀行などの窓口業務。口座からの現金引き出しを例にとれば、必要項目が記入された預金の引出票を受領する(入力)、記入内容に従い、要求内容の記録や内部処理、処理自体の記録などを行う(処理)、現金を顧客に渡す(出力)というのが預金引き出しプロセスの一連となる。

プロセスは内部処理にも使われる。社内の管理部門に対する申請などがこれにあたるし、実際のところ、一般に言う仕事の多くは、この入力→処理→出力というプロセスの枠組みによって行われる。ISMS 自身がこのプロセスの考え方に立脚しているから ISMS を運用・理解するうえでの基盤となるし、この枠組みを理解することは仕事を設計する上で大いに役立つものだと思う。

プロセスの概要は先の窓口業務の例がよく現わしているはず。以下はプロセスを構成する各フェーズについて記述する

入力フェーズ

リクエストと言い換えてもいいかもしれない。
処理に必要な情報を1セット揃えて入力する。付加情報なく実行可能な場合には、入力としては実施せよと要求するだけでも大丈夫かもしれない。定期的な処理などは明示的な入力を持たず、タイミングによって処理される。概念的には、時期が「実施せよ」という入力ともとれる。

処理フェーズ

主には入力の記録と、実際の処理、処理結果の記録などを行う。処理は上位ないし外部のプロセスに対して一部の処理を移譲する場合がある。処理は価値のために行う。

出力フェーズ

入力を受け取り、処理を行った結果を返す。または入力を受け付けた、という応答だけを返す。前者は同期的処理で、後者は非同期の処理。こう考えると、現実の窓口業務は非同期処理が多い。

また処理を行った結果を価値として返すが、返す先は入力を行った当人が少なくとも含まれ、またその他の誰かに非同期で返される場合もある。ここで言う非同期は、出力が届くタイミングと価値が返されるタイミングが一致しない場合を言っている。

RubyKaigi2010 企画「Rubyで扱うLDAPのススメ」無事終了しました&資料公開

人が集まるか大分不安だった企画ですが、二十数人の方々にお集まり頂きました。

ご参加くだった方、ご協力いただいた谷口さんカピバラさん岡澤さん、いろいろとご質問に答えてくださった須藤さん、ありがとうございました。この場を借りてお礼申し上げます。

拙いプレゼンでしたし、技術的には物足りなかったかもしれませんが、思いのほか質疑も多く頂き、また当初の目的であった「RubyコミュニティにLDAPを利用するための情報を提供する」ことは、これまでに作ってきた記事やこの発表で、ある程度達成できたのではないかと思います。どの程度かは、まだ測れませんがw

資料を公開します。私の資料と、事例を提供して一緒に発表してくださった谷口さんの資料です。ご活用ください。

RubyKaigi2010 企画 「Rubyで扱うLDAPのススメ」内容

明日 朝10時から、RubyKaigi2010 の企画(サブイベント)をやります。

話す内容は大体こんな感じです

  • LDAP 概略
  • RubyLDAP ライブラリ特徴比較
  • 事例紹介
  • 各ライブラリのコード例紹介
  • 参考資料一覧

LDAP の話にどれだけ人が集まるか不安だし、誰もいないと僕が可哀相だと思います!振るってご参加ください!(切実

ActiveLdap::Base#find の :filter キーに渡した引数の結果、どんなフィルタが生成されるかを確認する

タイトルが長い。

以前の記事で、ActiveLdap::Adapter::Base#parse_filter がフィルタのパーシングを行うという話を書いたのだけれども、これを外から確認したくなった。正確には、フィルタを手で書くのがすごく面倒で面倒で生きている意味が判らなくなったのでプログラムに任せたら素敵と思った。

先ず ActiveLdap::Adapter::Base なのだが ActiveLdap::Base.connection で取得できる。一方、parse_filter は private なので instance_eval とかを使う。

uid:hogehoge さんを検索するフィルタを取得する

>> filter = [:uid, "hogehoge"]
=> [:uid, "hogehoge"]
>> ActiveLdap::Base.class_eval{connection.instance_eval{parse_filter filter}}
=> "(uid=hogehoge)"

複雑なやつ

>> uid_filter = [:uid, 'u*']
=> [:uid, "u*"]
>> ou_or_filter = [:or, {:ou => ["dev", "manage", "operation"]}]
=> [:or, {:ou=>["dev", "manage", "operation"]}]
>> filter = [:and, uid_filter, ou_or_filter]
=> [:and, [:uid, "u*"], [:or, {:ou=>["dev", "manage", "operation"]}]]
>> ActiveLdap::Base.class_eval{connection.instance_eval{parse_filter filter}}
=> "(&(uid=u*)(|(ou=dev)(ou=manage)(ou=operation)))"

まとめ:便利だから使うといいかもしれない。

[ANN]RubyKaigi2010 企画 "Ruby で扱う LDAP のススメ" にご協力頂ける方を募集しています

Ruby には LDAP を扱うライブラリが幾つかある一方、LDAP 自体のマイナーさもあってか、まとまった情報が見当たらないな、と感じています(Ruby かどうかは関係ないかもしれませんがw)

これをある程度解決するために "RubyLDAP" な場合の選択肢とその事例を集め、で発表したいと考えています。RubyLDAP を扱うための情報や、ライブラリの選択に関する情報を Ruby コミュニティに提供したいと考えています。

この企画の実施にあたり、以下の内容でご協力頂ける方を募集します。

  • RubyLDAP を扱った事例をご提供頂ける方
  • 事例をご提供頂いたうえで、私と一緒に事例を発表頂ける方

各事例の情報はプレゼン資料にまとめ、公開したいと考えています。謝礼などは用意できないのですが、ご協力頂ける方がいらっしゃいましたら、以下の情報とともに tashen.hatena@gmail.com までご連絡下さいませ。

  • 利用したライブラリ
  • 事例のすごく簡単な内容。この時点では本当に簡単な内容でよいです。( 例: Ldap を利用した Unix アカウント管理アプリを作成した など)

ご応募お待ちしております。