« 2008年02月17日 - 2008年02月23日 | メイン | 2008年03月02日 - 2008年03月08日 »



2008年02月24日 - 2008年03月01日 アーカイブ

2008年02月26日

javaのldap(ディレクトリサービス)ビューア使ってみました

システムインフラ系の維持管理にも当然開発があるのですが、これまでそういう案件で仕事をしたことがありませんでした。今はグループウェアを使ったウェブ系の仕事をしているのですが、アカウントの管理や認証なんかは避けて通れないですね。
以下のソースは、ディレクトリサービスを参照して実装したアカウントのプロパティを全部表示するプログラムです。ディレクトリサービスとはウィンドウズのアクティブディレクトリとかです。とかと言いましたが、それしか知りません。フヒヒ。

今回これを作ったのは、「とあるユーザアカウント情報を持ったXMLファイルがあるので、そのアカウントから適宜AD情報を引いてくれ」という依頼を受けたからデス。それに伴い、ADにはどんなプロパティがあるのか知りたかったため作りました。システムインフラ系の維持管理開発はそんなんばっかだと思いますが、知らなかったことなんでポストしておきます。
ちなみにSystem.out.printlnはリダイレクトしてファイルに落としてください。ファイルライター作るのがメンドイときはいつもそうしてます。
java LdapViewer > log.txt

こんな感じ。

// LDAP関係
import javax.naming.*;
import javax.naming.directory.*;
import java.util.*;

public class LdapViewer {

    public static void main( String[] args ) {

        try {
            // InitialDirContextの作成
            Properties env = new Properties();
            env.setProperty( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
            env.put( Context.PROVIDER_URL, "ldap://ldapサーバ:ポート" );

            env.put( DirContext.SECURITY_PRINCIPAL, "アカウント" );
            env.put( DirContext.SECURITY_CREDENTIALS, "パスワード" );
            InitialDirContext ctx = new InitialDirContext( env );

            //検索して結果を表示
            SearchControls ctrl = new SearchControls();
            ctrl.setSearchScope( ctrl.SUBTREE_SCOPE );

            NamingEnumeration topLvlSrch = ctx.search( "OU=探すOU,DC=探すDC", "cn=アカウント", ctrl );
            while ( topLvlSrch.hasMoreElements() ) {

                SearchResult srchRslt = ( SearchResult )topLvlSrch.next();
                Attributes atrs = srchRslt.getAttributes();
                NamingEnumeration atrSrch = atrs.getAll();

                while ( atrSrch.hasMoreElements() ) {

                    Attribute atr = ( Attribute )atrSrch.next();
                    Enumeration elems = atr.getAll();

                    while ( elems.hasMoreElements() ) {
                        System.out.println( atr.getID() + " : " + elems.nextElement() );
                    }
                }

                // 個別に取得
                // Attribute atr = atrs.get( "mail" );
                // System.out.println( atr.getID() + " : " + (String)atr.get() );

            }
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }
};

via : LDAP Browser/Editor

[ 最近のエントリーとその関連エントリー ]


[ スポンサードリンク ]

2008年02月28日

やる夫がデザインパターンをやるようです 第2回

≪第1回第3回≫

やる夫は先日の失敗から継承について考えてみました。
Heroクラスを継承するヒーローたち全てが飛ぶわけではなかったのです。ということは、飛ばしてはいけない実装を個々のサブクラスにしてあげればよいわけです。
<やる夫>
     ____
   /      \ そういえばボケモントレーナーを実装したときに
  /  ─    ─\ punch()メソッドやkick()メソッドを
/    (●)  (●) \ オーバーライドしたな。。。
|       (__人__)    |
/     ∩ノ ⊃  /
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ / 
class Hero {
    punch()
    kick()
    jump()
    display()
    fly()
}
class ボケモントレーナー extends Hero {
    punch(){
        // ボケモントレーナー自身はパンチ出来ない。
        // 保持しているボケモンにパンチの指示を出す。
    }
    kick(){
        // ボケモントレーナー自身はキック出来ない。
        // 保持しているボケモンにキックの指示を出す。
    }
    display(){
        // ボケモントレーナー
    }
}
<やる夫>
       ____
     /⌒  ⌒\ だったら、飛ばないヒーローは、fly()メソッドを
   /( ●)  (●)\ 空実装してやればいいお
  /::::::⌒(__人__)⌒::::: \ 
  |     |r┬-|     |
  \      `ー'´     / 
やる夫は、Heroを継承するクラスにおいて、飛ばないヒーローはfly()メソッドをオーバーライドして何もしないようにすることを思いつきました。
class サザエさん extends Hero {
    display(){
        // サザエさんの表示
    }
    fly(){
        // サザエさんは飛ばない。なにもしない。
    }
}
<やる夫>
       ____
     /⌒  ⌒\ これで飛ばないヒーローたちを実現できるおww
   /( >)  (<)\ どう考えても天才の発想だおwww
  /::::::⌒(__人__)⌒::::: \ 
  |    /| | | | |     |
  \  (、`ー―'´,    /
       ̄ ̄ ̄ 

<アーキテクト>

お前はウチのきゅんぽな企画のこと知ってて言ってんのか?
ヒーローたちはリリースしても数ヶ月ごとにバージョンアップする。
ヒーローが追加される可能性だってあるわけだ。
てめぇはその度にfly()メソッドなんかを調べて
オーバーライドしていくのか?
        / ̄ ̄\
      /       \
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´ 

<やる夫>
       ____
     /⌒  ⌒\ ホジホジ
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \  ?
  |    mj |ー'´      |
  \  〈__ノ       /
    ノ  ノ 
やる夫はよくわかってないようですが、Heroクラスを継承している以上、そのサブクラスはfly()メソッドや、punch()メソッド、kick()メソッドに依存し続けなければなりません。
ということは、サブクラスが増える度にこれら全てのメソッドをチェックして、空実装でオーバーライドするか、固有の処理としてオーバーライドするか、あるいは、スーパークラスの処理をそのまま使うかなどを調査し、実装していくことになります。
いまのやる夫には、「ヒーローの型の一部だけがパンチしたり飛んだりキックしたりする」というわかりやすい方法が必要なのです。
<やる夫>

じゃあPunchableとかKickable、Flyableインターフェイスを
作ってこいつを必要なヒーローにインプリメントすりゃいいお。
       ____
     /⌒  ー、\ 
   /( ●)  (●)\
  /::::::⌒(__人__)⌒:::::\ 
  |     |r┬-/ '    |
  \      `ー'´     / 





<アーキテクト>
   / ̄ ̄\
 /   _ノ  \
 |   ( ●)(●)  てめぇはもう喋るんじゃねー
. |     (__人__)____
  |     ` ⌒/ ─' 'ー\
.  |       /( ○)  (○)\
.  ヽ     /  ⌒(n_人__)⌒ \  
   ヽ   |、    (  ヨ    |
   /    `ー─-  厂   /
   |   、 _   __,,/     \ 
やる夫が発案した方法はJavaで言うinterfaceのimplementsです。
スーパークラスからパンチ、キック、フライメソッドを取り除き、interfaceとして定義します。それを必要なヒーローに実装してあげる方法ですが、例えばパンチという振る舞いにほんのちょっとした変更が共通的に加わった場合に、パンチを実装しているクラス全てに変更をして回る必要があります。いわゆる重複コードです。ではどうすればよいのでしょうか。。。


この「やる夫がデザインパターンをやるようです 第2回」では、ソフトウェア開発において考える必要のある大事なこと、「変更」について述べてみました。そもそもアプリケーションは「変更」され続け、成長・変化していくものです。そうでないとユーザは使ってくれません。ですが、その変更部分をソースにばら撒くようなことはしたくありません。今のやる夫はそれを知る必要があります。

というわけで、第2回はここで終わります。

≪第1回第3回≫


[ 最近のエントリーとその関連エントリー ]


2008年02月26日

やる夫がデザインパターンをやるようです 第1回

第2回»

やる夫は、ニコニコゲーム製作会社に勤めています。ニコニコゲームはニンテンドゥープラットフォームで製作された「スーパーヒーロー大戦」を昨年リリースし空前の大ヒットを飛ばしました。もちろん第2弾を発売することとなり、やる夫はその第2弾のスパヒロ大戦2.0のプログラマとして携わっています。

スパヒロ大戦2.0のアーキテクトは、オブジェクト指向技術を使用し、登場する全てのヒーローの型が継承するHeroスーパークラスを作成しました。

   / ̄ ̄\   <アーキテクト>
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__) Heroスーパークラス作ったから
  |     ` ⌒´ノ  てめぇが作るヒーローはこいつを継承して使えや
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)






         |
     \  __  /
     _ (m) _
        |ミ|
      /  `´  \
       ____
     /⌒  ⌒\    <やる夫>
   /( ●)  (●)\   わかったおwww余裕だおww
  /::::::⌒(__人__)⌒::::: \
  |     |r┬-|     |
  \      `ー'´     / 
class Hero {
    punch()
    kick()
    display()
}
//> add yaruo hero class 20080226
class ガンダム extends Hero {
    display(){
        // ガンダムの表示
    }
}
class アトム extends Hero {
    display(){
        // アトムの表示
    }
}
class ウルトラマン extends Hero {
    display(){
        // ウルトラマンの表示
    }
}
・・・・ほかにもたくさん
//< add yaruo 20080226
今回のスパヒロ大戦2.0に登場するヒーローは30人を超えます。やる夫は徹夜に徹夜を重ねやっとのことで全ヒーロー分のベータ版の実装を終えました。


               _______
    :/ ̄| :  :  ./ /  #  ;,;  ヽ
  :. | ::|    /⌒  ;;#  ,;.;::⌒ : ::::\ :
    | ::|:  / -==、   '  ( ●) ..:::::|
  ,―    \   | ::::::⌒(__人__)⌒  :::::.::::| : で、できたお。。。
 | ___)  ::|: ! #;;:..  l/ニニ|    .::::::/
 | ___)  ::|  ヽ.;;;//;;.;`ー‐'ォ  ..;;#:::/
 | ___)  ::|   .>;;;;::..    ..;,.;-\
 ヽ__)_/ :  /            \


しかしながら、ゲーム企画部は「今回のヒーローは空を飛ばすことで競合他社に勝利する」と決定し仕様の追加実装が、開発部に降りてきました。
ふむ。スーパークラスにfly()メソッドを追加すりゃ
全ヒーローが飛べるようになる。
     ____
   /      \
  /  ─    ─\
/    (●)  (●) \
|       (__人__)    |
/     ∩ノ ⊃  /
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ / 







こんなんよゆうだおwwwww
          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /
 |    |   l||l 从人 l||l      l||l 从人 l||l
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒)) 
class Hero {
    punch()
    kick()
    display()

    // add yaruo 20080226
    fly(){ /*ヒーローを飛ばすいろんな処理*/ }
}
やる夫はスーパークラスにfly()メソッドを追加し、これを継承するサブクラスは全て飛べるように対応しました。しかし。。。



ニンテンドゥー営業部も立ち会うキャラクターデモンストレーション当日、開発部に電話がかかってきます。
「おう。アーキテクトだ。てめぇの実装したヒーローをニンテンドゥーさんに見せたとこなんだが、ウーロン茶を液晶モニターに吹き付けられた。わかるか?いったいなんだってサザエさんが空を飛んでんだ?サザエさんは空をとばねぇ。そんくらいこのとはわかるな?てめぇのおかげで、次にお見せしようとしているヒーロー"ドカベン"をwktkして待っていらっしゃる。」
  あんな要求だったから
  挙動なんて大して確認してないお。。。。
       ______
      /  \    /\
    /  し (>)  (<)\
    | ∪    (__人__)  J | ________
    \  u   `⌒´   / | |          |
    ノ           \ | |          |




         ____
      /  \    ─\   チラッ
    /  し (>)  (●)\
    | ∪    (__人__)  J | ________
    \  u   `⌒´   / | |          |
    ノ           \ | |          |




         ____
      /::::::─三三─\
    /:::::::: ( ○)三(○)\
    |::::::::::::::::::::(__人__)::::  | ________
     \:::::::::   |r┬-|  / | |          |
    ノ::::::::::::  `ー'´   \ | |          | 
やる夫は全てのサブクラスが飛ぶべきではないことに気がつきませんでした。ではどのような設計を行えばよかったのでしょう。
というわけで、第1回はここでおわります。
※ワタシはゲーム開発の進め方・開発ワークフローは全く知りませんのでご了承ください。馬鹿にしているわけじゃありません

第2回»

[ 最近のエントリーとその関連エントリー ]


javaのldap(ディレクトリサービス)ビューア使ってみました

システムインフラ系の維持管理にも当然開発があるのですが、これまでそういう案件で仕事をしたことがありませんでした。今はグループウェアを使ったウェブ系の仕事をしているのですが、アカウントの管理や認証なんかは避けて通れないですね。
以下のソースは、ディレクトリサービスを参照して実装したアカウントのプロパティを全部表示するプログラムです。ディレクトリサービスとはウィンドウズのアクティブディレクトリとかです。とかと言いましたが、それしか知りません。フヒヒ。

今回これを作ったのは、「とあるユーザアカウント情報を持ったXMLファイルがあるので、そのアカウントから適宜AD情報を引いてくれ」という依頼を受けたからデス。それに伴い、ADにはどんなプロパティがあるのか知りたかったため作りました。システムインフラ系の維持管理開発はそんなんばっかだと思いますが、知らなかったことなんでポストしておきます。
ちなみにSystem.out.printlnはリダイレクトしてファイルに落としてください。ファイルライター作るのがメンドイときはいつもそうしてます。
java LdapViewer > log.txt

こんな感じ。

// LDAP関係
import javax.naming.*;
import javax.naming.directory.*;
import java.util.*;

public class LdapViewer {

    public static void main( String[] args ) {

        try {
            // InitialDirContextの作成
            Properties env = new Properties();
            env.setProperty( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
            env.put( Context.PROVIDER_URL, "ldap://ldapサーバ:ポート" );

            env.put( DirContext.SECURITY_PRINCIPAL, "アカウント" );
            env.put( DirContext.SECURITY_CREDENTIALS, "パスワード" );
            InitialDirContext ctx = new InitialDirContext( env );

            //検索して結果を表示
            SearchControls ctrl = new SearchControls();
            ctrl.setSearchScope( ctrl.SUBTREE_SCOPE );

            NamingEnumeration topLvlSrch = ctx.search( "OU=探すOU,DC=探すDC", "cn=アカウント", ctrl );
            while ( topLvlSrch.hasMoreElements() ) {

                SearchResult srchRslt = ( SearchResult )topLvlSrch.next();
                Attributes atrs = srchRslt.getAttributes();
                NamingEnumeration atrSrch = atrs.getAll();

                while ( atrSrch.hasMoreElements() ) {

                    Attribute atr = ( Attribute )atrSrch.next();
                    Enumeration elems = atr.getAll();

                    while ( elems.hasMoreElements() ) {
                        System.out.println( atr.getID() + " : " + elems.nextElement() );
                    }
                }

                // 個別に取得
                // Attribute atr = atrs.get( "mail" );
                // System.out.println( atr.getID() + " : " + (String)atr.get() );

            }
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }
};

via : LDAP Browser/Editor

[ 最近のエントリーとその関連エントリー ]


ツリータイプ・カテゴリー

open all | close all

リファラから検索


サイト内検索