jump to navigation

ATOKダイレクトでLDAP検索して部署名・役職補完

2008-11-24 19:34 Posted by
nase
in : プログラミング
server.jpg

社内で他所の部署から送られてきたメールに返信するとき、相手の役職が分からないことがたまにあります。これはメールの署名に自分の役職を書く習慣が一般的に無いためかもしれません。かといって、こちらから役職を書かないわけにも行かず。

また、相手が部署名を短縮して書いてきており、そんなときに限って署名が付いていないというケースもあります。

これまで、こんなときは社内のアドレス検索システムを使って毎回確認していたので面倒でした。

そこで今回作ったのは「名字のふりがな」からLDAP検索して「部署・役職」を補完するATOKダイレクト・プラグインです。

(※あくまで試しに作ってみたもので、そのまま誰もが使えるものではありません。「こんなこともできそうだ」という話。ソースのみの公開です。)

Rubyで作るATOKダイレクト・プラグイン

2008年10月末頃にジャストシステムから「ATOKダイレクト API for Perl/Ruby」が公開され、RubyとPerlでATOKダイレクトのプラグインが作れるようになりました。

ATOK2008から追加されたATOKダイレクトの機能は、元々WebAPI等を使ったプラグインをジャストシステム自身が公開していましたが、今ひとつ影の薄い存在でした。

それがこのRubyとPerlに対応したAPIが公開されてから、シンプルな仕様と応用性の高さにより、にわかに注目を集めています。(ドキュメントやデバッグツールが揃っており、試用版で気軽に試せます)

参考ページ

ATOKダイレクト API for Perl / Ruby | さらに使いこなす | ATOK.com
APIの説明ページ。とりあえずここだけ読めばプラグインが作れる。
【ハウツー】ATOKダイレクトAPI for Perl/Rubyで気軽にATOKを拡張しよう! (1) | マイコミジャーナル
解説記事。手順を追った説明で分かりやすい。
ATOKダイレクト 開発者ブログ
開発者の方がATOKダイレクトの情報をまとめられています。要チェック。

ATOKダイレクト LDAP検索プラグイン

今回私が作ってみたプラグインはこんな感じで動作します。(社内のアドレス帳がLDAPで公開されている前提)

名前(ふりがな)を入力してCtrl+InsertでATOKダイレクトを呼び出すと・・・

atok_direct_ldap_1_s.gif
「しま」で検索

検索結果が変換候補として表示されます。

atok_direct_ldap_2_s.gif
部署と役職が補完される

Enterで普通に確定すると「部署名 名前(短縮役職名)」となります。「(短縮役職名)」のところは課長なら「K」、主任なら「S」といった具合。

また、Shift+Enterで確定すると、ツールチップで表示されている代替内容で確定されます。今回こちらには部署名を省いた「名前(短縮役職名)」のみを使用しています。

ソースコードは以下の通り。素人作で内容は補償できませんのであしからず。LDAPの検索部分は「ruby/LDAPでADに接続する」のコードをほぼそのまま使わせていただきました。

Ruby/LDAPのライブラリは「ruby-ldap gem for Windows」のバイナリで動作確認しています。なお、LDAPのbaseDNや使用しているスキーマ・属性などは環境によってまちまちと思いますので、適宜修正が必要になります。(ふりがなの属性が存在しない場合は使用できません)

#! /usr/bin/ruby -Ku

require 'ldap'
require "nkf"

#################################################
# ATOKダイレクト Rubyスクリプト モジュール インターフェイス
# ※このテキストは必ずUTF-8で記述すること
#  扱う文字列は全てUTF-8前提であるとする
#################################################

module Atok_plugin

  #################################################
  # 取得処理を実行する
  # ・設定した候補を返すことが可能
  #  ・最大で100個の候補を返すことができる
  #  ・候補には、
  #   1.表記
  #   2.コメント
  #   3.ツールチップ(確定文字列かURLジャンプ文字列)
  #   を設定できる
  # ・何もセットしなかった場合、処理結果は何もないと判断される
  # ・引数で渡される情報に含まれる文字列は、全てUTF-8である
  # ・返す情報に含める文字列は必ずUTF-8にする必要がある

  def ldap_search(serarch_keyword)
    #コネクションを作成
    conn = LDAP::Conn.new("192.168.1.xxx", 389)
    #LDAPのバージョンを設定
    conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION,3)
    res_array = Array.new
    begin
        #接続する
        conn.bind()
        #baseDNの指定
        base='ou=People,dc=my-domain,dc=com'
        #検索方法を指定。ここではサブツリーまで検索する
        scope = LDAP::LDAP_SCOPE_SUBTREE
        #検索フィルタの設定
        filter = "(sn;lang-ja;phonetic=#{serarch_keyword})"
        #実際に検索
        conn.search2(base,scope,filter){ |entry|
            #結果の出力
            res_array.push( {
              'myouji'    => entry["sn;lang-ja"].to_s,
              'full_name' => entry["cn;lang-ja"].to_s,
              'syozoku'   => entry["ou;lang-ja"].to_s,
              'tel'       => entry["telephoneNumber"].to_s,
              'yakusyoku' => entry["title;lang-ja"].to_s
            } )
        }
        #エラー処理
        rescue LDAP::ResultError
            #errcode = conn.err
            #$stderr.puts(conn.err2string(errcode))
        ensure
        conn.unbind()
    end
    return res_array
  end

  def yakusyoku_henkan(yakusyoku)
    case yakusyoku
      when "事業部長"
        return "JB"
      when "部長"
        return "B"
      when "課長"
        return "K"
      when "主任"
        return "S"
      when "担当"
        return "T"
      else
        return "?"
    end
  end

  def run_process(a_request_data)
    result_data = Hash.new
    candidate_array = Array.new
    ldap_search(NKF.nkf("-s -xm0", a_request_data['composition_string'])).each do | kouho |
      candidate_array.push( {
        'hyoki'            => "#{kouho['syozoku']} #{kouho['myouji']}#{yakusyoku_henkan(kouho['yakusyoku'])}" ,
        'comment'          => "#{kouho['syozoku']} #{kouho['full_name']} #{kouho['yakusyoku']} #{kouho['tel']}" ,
        'alternative'      => "#{kouho['myouji']}#{yakusyoku_henkan(kouho['yakusyoku'])}" ,
        'alternative_type' => "definite_string"
      } )
    end
    result_data['candidate'] = candidate_array
    result_data
  end
  #################################################
end

見ての通り短いコードで、ほぼコピペなので私自身は大したこともやっていません。ポイントはRubyやPerlの知識があれば誰でもアイデア次第でこのようなプラグインが作れてしまうということ。

ますますATOKが手放せなくなりそうです。

参考書籍

入門LDAP/OpenLDAP―ディレクトリサービス導入・運用ガイド 入門LDAP/OpenLDAP―ディレクトリサービス導入・運用ガイド

今回はどちらかというとLDAPのテスト環境をセットアップするのに苦労しました。LDAPは専門用語が多かったので、この書籍のおかげでだいぶ救われました。非常に分かりやすくまとめられており、前半だけ読めばLDAPについて大分理解できます。オススメ。後半は様々な応用について。


課長島耕作 課長島耕作

サンプルデータで名前を使わせてもらいました。このマンガを読んだことは無いのですが、役職といえばこの人かなと。コード内のその他の役職はWikipediaから一般的な名前を拾っています。


追記@2008-12-28

機能強化版を作ってくれた人がいました。ありがたやー。

Comments»

1. Sadaaki.blog - 2008-12-14

ATOKダイレクト for LDAPアドレス帳…

「ATOK 2008」で導入された、新たな機能拡張の仕組みである「ATOKダイレ (more…)


*Comments and trackbacks will appear after it is approved by the administrator.