徒然なるままに、日ぐらしP/Cに向ひて――
メインメニュー
ブログカレンダー
2008年 9月
« 8月   3月 »
 123456
78910111213
14151617181920
21222324252627
282930  
WordPress カテゴリ一覧
WordPress 検索


富士カメラ5

Kestrel とは、チョウゲンボウのことです。ハトくらいの小さな猛禽類、つまりワシの仲間で、ハヤブサに似ています。
チョウゲンボウにはホバリングという特技があります。よく農地の上空で空中に停止している姿が見られます。小さいけれどカッコイイ、そして最近は都会でも繁殖している頼もしいタカです。
このサイトのURLは、そんなチョウゲンボウから名前を借りました。

2008年9月11日(木曜日)

Delphi でも LDAP

カテゴリー: - flyman @ 23時34分20秒
軽井沢、白糸の滝。夏休み最後の日曜日、案外犬を連れた人が多かった。

Novell eDirectory へのLDAP認証だが、Delphiでも試してみた。クグってみたところ、SynapseというDelphiで使えるTCP/IPツールにLDAPクライアントが見つかった。Synapseは以前にも別の目的で試したことがあったが、LDAPは今回が初めてだ。

LDAPサーバーへの接続は簡単だ。今回は、ユーザーIDとパスワードで認証し、OKならアトリビュート値を返すような関数にしてみた。

LdapSeek というユニット仕立てだ。

{*
 * [Ararat Synapse] を使用して LDAP(eDirectory) にアクセスする
 *                                    Copyright(c) flyman
 * Version 0.10 2008/09/10
 *}
	
unit LdapSeek;
	
interface
	
uses
  Classes, Windows, SysUtils, ldapsend;
	
Function LdapAuth(userID, password : String; AttrList : TStringList) : Boolean;
var
  Host : String;
  Port : String;
  Version : Integer;
  Search : String;
	
implementation
	
{指定ユーザー、パスワードの認証
 認証に成功すると、AttrListにアトリビュート値が入る
 認証に失敗すると False を返す}
Function LdapAuth(userID, password : String; AttrList : TStringList) : Boolean;
var
  ldap: TLDAPsend;
  al,gl : TStringList;
begin
  Result := True;
  AttrList.Clear;
	
  ldap:= TLDAPsend.Create;
  al := TStringList.Create;
  gl := TStringList.Create;
  try
    ldap.TargetHost := Host;
    ldap.TargetPort := Port;
    ldap.Version := Version;
	
    if ldap.Login then begin
      ldap.UserName := 'cn=' + userID + Search;
      ldap.Password := password;
      if ldap.Bind then begin
        {検索したいアトリビュート名のリストを作る}
        al.Append('dn');
        al.Append('passwordMinimumLength');
        al.Append('loginDisabled');
        al.Append('nLSLicensesUsed');
        al.Append('sn');
        al.Append('nRDRegistryData');
        al.Append('loginMaximumSimultaneous');
        al.Append('passwordRequired');
        al.Append('Language');
        al.Append('passwordAllowChange');
        al.Append('objectClass');
        al.Append('uid');
        al.Append('groupMembership');
        al.Append('loginTime');
        al.Append('cn');
        al.Append('securityEquals');
        al.Append('ACL');
        al.Append('nRDRegistryIndex');
        al.Append('networkAddress');
        al.Append('fullName');
        al.Append('ndsHomeDirectory');
	
        ldap.Search('cn=' + userID + Search, False, '(objectclass=*)', al);
        gl.Text := LDAPResultdump(ldap.SearchResult);
	
        AttrList.AddStrings(gl);
      end else begin
        AttrList.Add('*** Bind Failure ***');
        Result := False;
      end;
      ldap.Logout;
    end else begin
      AttrList.Add('*** Login Failure ***');
      Result := False;
    end;
  finally
    ldap.Free;
    al.Free;
    gl.Free;
  end;
end;
	
end.

こんな感じだ。なんのことはない、eDirectoryだからといって、特段変わったテクニックは必要ない。
認証が必要なければ ldap.UserName と ldap.Password をブランクにしておけば Anonymusで接続してくれる。その上で ldap.Search すれば必要なアトリビュート値を取り出すことが可能だ。

この関数は、Formのボタン押下イベントから、以下のようにして呼び出す。

uses LdapSeek;
	
{$R *.dfm}
	
procedure TForm1.Button1Click(Sender: TObject);
var
  AttrList : TStringList;
begin
  Memo1.Lines.Clear;
  LdapSeek.Host := '10.9.225.214';
  LdapSeek.Port := '389';
  LdapSeek.Version := 3;
  LdapSeek.Search := ',ou=users,o=flynet';
  Screen.Cursor := crHourGlass;
  AttrList := TStringList.Create;
  try
    // ユーザーID、パスワード、アトリビュート値の入れ物を渡す
    if LdapAuth(EditUSER.Text, EditPASS.Text, AttrList) then begin
      // ここに認証成功時の処理を書く
    end else begin
      // 認証失敗 !!
    end;
    Memo1.Lines.AddStrings(AttrList);
  finally
    AttrList.Free;
    Screen.Cursor := crDefault;
  end;
end;

――サンプル用コードとしてはちょっと適当じゃないかも知れないが、まあ、こんな感じで作ってしまったので勘弁して欲しい。
* LdapSeek の uses に余計なモノが入っている。オリジナルでは他にも関数やプロシージャを入れているので、それ用のユニットも読み込ませているのだ(どれが不要だか判らなくなったので、そのまま残してある)。

LDAPサーバーに認証要求を投げたり、PCのログインユーザーの所属するグループ一覧を取得したり、色々な用途が思い浮かぶ。
私はまだ試していないが、LDAPサーバーの値(LDIF)を書き換えることも可能なようだ。
今回は Novell eDirectory が相手だったが、Active Directory でも、OpenLdap でも、基本は同じみたいなので勤務先のディレクトリサービスが変更になっても大丈夫、使えるワザである。


2008年9月9日(火曜日)

言葉の乱れ

カテゴリー: - flyman @ 22時45分22秒

皆さんは最近の日本語の乱れについてどう感じているのでしょう?
例えば、【ダチョウの卵が売ってる「道の駅」、『道の駅うりまく』】(たまたまググったら引っかかった)って、ダチョウの卵が「道の駅」を売ってるって意味にしかなりません。
『売る』の誤用はネット上ではかなり頻繁に見かけますが、書いている人たちは判っていてわざと誤用しているんでしょうか、それとも本当に自動詞と他動詞の区別も付かないほどXXなんですかね。

英語の略語のメチャメチャさも、時として鼻につきます。
『バイク』は元々バイシクル=自転車の略で、オートバイなら『モーターバイク』だし、酷いケースになると『サイクル』をオートバイの意味で使ってたり(これも本来は自転車の意)。以前は本屋で自転車の雑誌かと思って手に取ったらオートバイの雑誌であきれたりしたものですが、さすがに今は慣れました。
まあ、英略語では、電話を表す『TEL』とか(彼の地ではPhone)、『シャープペンシル』>>『シャープペン』>>『シャーペン』に至ってはもう意味が違ってるし(尖らせる?)。
でも、これらは和製英語だと思えば、まあ、我慢も出来なくはない、こともない、こともない、か……。

日本語の乱れはそうはいきません。
『ご教授下さい』これも多いですね。かなり恥ずかしいでしょう。――大学教授をヨメに貰うのか? 結構なオバサンじゃないか??

ら抜き言葉はいまもって慣れません。バカっぽくて――
でも、『チョーXX』は大丈夫です。若干バカっぽくもありますが、誤用じゃないですし、古文の『いとXX』と同じ用法ですね。

℃-uteの歌の歌詞にも、
『歯ブラシして――』(通学ベクトル)ってありますが、普通は『歯磨きして』ですよね、つんくさん。
『何にも 変えがたい――』ってのもあります(JUMP)。これを『なんにもかえがたい』と歌っていますが、『なににも』ならともかく『なんにも』では意味が違っちゃいます。『変えがたい』は、『代えがたい』の誤字ですね(オリジナルの歌詞カードがどうなっているのかは知らない)。せっかく良い歌でも言葉の誤用があるとイマイチ好きになれないんですよね、つんくさん。

Buono! の歌にも、『星の羊たちが 草を噛んでいるわ』(星の羊たち)というのがあります。間違いではありませんが、普通、羊は草を噛んでいるのではなく食(は)んでいます。ね、橋本淳さん。
でもこれはきっと意図的に変えてあるんじゃないか、とも思いますが、どうなんでしょ。
*星の羊たち、とっても良い曲です。大好きです。(^_^ゞ

*写真と文は、関係ありません。写真は小淵沢。


2008年9月8日(月曜日)

この週末は……

カテゴリー: - flyman @ 23時55分15秒

以降の文と写真は何ら関係なし。

突然、プリンタ [CANON PIXUS MP770] の色がおかしくなったと思ったら、電源が落ちた。そして、二度と起動しなかった……。
4年と少し、よく働いてくれたプリンタだったが、今朝、燃えないゴミとして引き取られていった。

そこで、ニューモデルが出てくるまでの後一月を、MP770 の前に使っていた古いプリンタでしのごうと、引っ張り出してきた。CANON の BJ-F850、実はこちらもペーパーフィードが出来なくなって引退させたのだが。
捨てずに置いておいたものを引っ張り出し、分解してなんとか動かないものかと悪戦苦闘していたら――ペーパーフィードのローラーの奥からシャープペンが出てきた。 :-o
……娘の仕業か。

ともあれ、新製品が出てくるまではしのげそうではある。

この週末は、無線のアクセスポイントは壊れるわ、電気屋の帰りに土砂降りに遭うわ、ちょっとツキが無かったかな。

しかしこのサーバー、またまたまたまた激重で、昨夜は接続を放棄せざるを得なかった。なんとかしてくれー(安いんだから、仕方がないけど、ぼやきたくもなるよ)。


2008年9月6日(土曜日)

Apache+ldap+eDirectory

カテゴリー: - flyman @ 23時54分09秒

『ldap』という言葉はずいぶん前から知っていたし、意識もしていた。けれども、それは他人事であり私が関与することなど無いと思っていた。
しかし、世はセキュリティ重視の時代、ここに来てJSOXまで施行されるに至り見ないふりを続けるのも心苦しくなってきた。
そこで取りあえずldap認証を経験してみることにした。

ところが、私の勤務先ではいにしえよりNovellのNetwareをサーバーとして使っている。多くの企業ではMicrosoftのActive Directoryを使っているのだろうが、こちらはNovellのeDirectory、さて、うまくいくのか。

まずはeDirectoryサーバー側でldapが動いているか確認する。
ポートスキャンすると、389番ポートは開いている。[NLDAP.NLM]とか[LDAPSDK.NLM]とか[LDAPXS.NLM]とか、ldap関連のモジュールも動いているようだ。
どうやらサーバー側の準備は整っているように見受けられる。

では、早速ldapを使ってみよう。
どうやって?
最初はXOOPSにldap認証をやらせようかと思ったのだが、簡単には出来そうになかったので諦め、ApacheのBasic認証にldapを使うことにした。

ここのところ、実験用サーバーといえばCentOSだ。今回もCentOS5を使った。インストールされているApacheのバージョンは2.2.3だった。

/etc/httpd/conf/httpd.confを見ると、
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
と、デフォルトでldap関連モジュールは組み込まれているようだ。

後は認証の設定を書けば良いだけである。

今回はドキュメントルートにBasic認証を掛けてみることにする。

と、ここでeDirectoryの登録内容を確認しておきたい。って、これにエライ苦労をしたんだが。
結局、ldapを操作できるツールを落としてきて、それで設定をLDIFエクスポートした。ここにたどり着くまで[Novell ConsoleOne]やらなんやらとずいぶん格闘してしまった。
さて、そのLDIFの抜粋である(セキュリティ上の理由から、適当に書き換えてある)。
ここではユーザー[MyName]が、[MyGroup]と[EVERYONE]グループに所属している。

LDIF の抜粋

[MyName]ユーザーの定義はおおむね次のようになってる。

dn: ldap://netware.mydomain.co.jp:389/cn=MyName,ou=users,o=flyshonan, ou=users,o=flyshonan,t=FLY_TREE
uid: MyName
groupMembership: cn=MyGroup,ou=users,o=flyshonan
groupMembership: cn=EVERYONE,ou=users,o=flyshonan
cn: MyName
securityEquals: cn=MyGroup,ou=users,o=flyshonan
securityEquals: cn=EVERYONE,ou=users,o=flyshonan

[MyGroup]グループの定義は次のとおりだ。

dn: ldap://netware.mydomain.co.jp:389/cn=MyGroup,ou=users,o=flyshonan, ou=users,o=flyshonan,t=FLY_TREE
equivalentToMe: cn=MyName,ou=users,o=flyshonan
equivalentToMe: cn=OtherName,ou=users,o=flyshonan
uniqueMember: cn=MyName,ou=users,o=flyshonan
uniqueMember: cn=OtherName,ou=users,o=flyshonan
cn: MyGroup

では、Apacheのコンフィギュレーションに戻ってみよう。
ドキュメントルートの設定を書こう。
場所は、/etc/httpd/conf/httpd.conf内か、あるいは/etc/httpd/conf.dにldap.confファイルを作成してそこに書いても良いだろう。今回は後者の方法を採った。


AuthName “Authorized users Area”
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL “ldap://netware.mydomain.co.jp:389/ou=users,o=flyshonan,t=FLY_TREE?uid?”
Require valid-user

[AuthName]に指定した名前は、認証要求ダイアログに表示される。適当な名前を付けておく。
[AuthType]はBasic認証なので"Basic"とする。
[AuthBasicProvider]には"ldap"を指定する。
[AuthzLDAPAuthoritative]は、この認証方式がコケたときに他の認証方式を使うかどうかの指定だ。ここでは"off"にしておいた。
[AuthLDAPURL]には、ldap検索パラメータURLを指定する。シンタックスは[ldap://host:port/basedn?attribute?scope?filter]だ。ここにフィルターを書くことも出来る。
[Require]には"valid-user"を指定する。これは認証された全てのユーザーを許可する。

ここで、HTTPサーバーを再起動しよう。
service httpd restart
クライアントからアクセスしてみる。

認証要求ダイアログが表示されたら、ユーザー[MyName]で接続可能なこと、別のユーザーでは接続が拒否されることを確認しておく。
――うまくいっているようだ。

ここまではeDirectoryだからといって特に変わった設定は必要なかった。
インターネットに公開しているサーバーに、社員専用エリアを作りたいときなどには、この設定で行けそうである。
しかし、イントラネットなどではさらにアクセス可能なユーザーを絞りたい場合も多いだろう。そんな時には、
Require valid-user
の代わりに、
Require user MyName OtherName
のように、ユーザーをスペースで区切って並べることが出来る。NetwareではユーザーIDの大文字小文字を区別しないが、Requireディレクティブに書くと、大文字小文字が区別される。
しかし、これも一人二人ならまだしも、数十人、数百人になると現実的ではなくなる。
そんな時にはグループ単位で認証したいものだ。
そこで、設定ファイルを以下のように書き換えてみた。


AuthName “Authorized users Area”
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL “ldap://netware.mydomain.co.jp:389/ou=users,o=flyshonan,t=FLY_TREE?uid?”
AuthLDAPGroupAttribute memberUid
AuthLDAPGroupAttributeIsDN off
Require ldap-group MyGroup

が、なぜかうまく行ってはくれなかった。
error_logを見ると、次のようなログが書かれていた。

[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(373): [client 10.9.228.10] [30892] auth_ldap authenticate: using URL ldap://netware.mydomain.co.jp:389/ou=users,o=flyshonan,t=FLY_TREE?uid?
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(454): [client 10.9.228.10] [30892] auth_ldap authenticate: accepting MyName
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(691): [client 10.9.228.10] [30892] auth_ldap authorise: require group: testing for group membership in “MyGroup”
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(697): [client 10.9.228.10] [30892] auth_ldap authorise: require group: testing for member: MyName (MyGroup)
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(713): [client 10.9.228.10] [30892] auth_ldap authorise: require group “MyGroup”: authorisation failed [Comparison complete][No such object]
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(826): [client 10.9.228.10] [30892] auth_ldap authorise: authorisation denied

グループ認証が出来ていないらしい。
“ou=users"の部分が"ou=MyGroup1″、"ou=MyGroup2″のように分かれていれば簡単だったんだろうけど。まあ、今更言っても始まらない。
ここから悪戦苦闘の末、設定ファイルを次のようにしてみた。


AuthName “Authorized users Area”
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL “ldap://netware.mydomain.co.jp:389/ou=users,o=flyshonan,t=FLY_TREE?uid?”
Require ldap-attribute groupMembership="cn=MyGroup,ou=users,o=flyshonan”

[Require]でアトリビュート値をチェックするようにした。LDIFの情報から、"groupMembership"アトリビュートを調べれば良いことが判った。
これでHTTPサーバーを再起動したところ、望み通りの動作をしてくれた。
“Require ldap-attribute"を複数設定することで、複数のグループにアクセスを許可することも出来る。
また、"Satisfy all"ディレクティブを書けば、複数の条件全てを満たすユーザーのみ認証することも出来る。
これでイントラネットサーバーに部署毎のディレクトリを用意することも出来そうだ。WebDAVと組み合わせてもおもしろそうだ。

Novell eDirectoryはメジャーでは無いかも知れないが、ldapサーバーとしても十分に使えそうだ。今後はApache以外での使用も検討していくつもりだ。

# もうすぐバーレーン戦だ。ここはすっきりと勝って欲しい。――負けるとかなり厳しい事になる――


2008年9月5日(金曜日)

巣箱(その2)

カテゴリー: - flyman @ 22時42分09秒
こちらの巣箱も昨秋に掛けたもの。今年のゴールデンウィークにはゴジュウカラの番が出入りしていた。
入り口はシジュウカラサイズに作ったので、少しばかり狭かったようだ。
湿気で屋根が反り、少し隙間が出来てしまった。
屋根を開けると、かなりの悪臭が……。シカの堅いスジ肉を煮込んだときのような、胸が悪くなりそうな獣臭だ(って、普通の人はそんな肉、煮ないよね)。
まあとにかく、巣を取り出すと、その下に木の皮が1?2センチほども敷き詰められていた。
――ゲジゲジが2匹、あわてて飛び出した。

苔と獣毛、それにわずかに黄色とピンクの色の付いた素材はなんだろう?
臭くて顔を近付けて調べる気にはならなかった(本当に気分が悪くなった)。
こちらの巣箱も掃除して、屋根を締め直してから木の上に戻しておいた。

巣箱ガイドのページでは、巣箱をよく利用する鳥としてシジュウカラが上げられている。で、シジュウカラサイズに作ったのに入ったのはゴジュウカラだった。
もう一つの巣箱はムクドリサイズだったのが、入り口をかなり拡張されて使われている。鳥の住宅事情にも色々あるらしい。

以前に、隣の瓦屋根に作られたスズメの巣から雛が落ちたときに、適当な箱で臨時の巣箱を作って雛を入れたことがあった。台所の窓の上に粘着テープで留められたその巣箱に、ちゃんと親鳥はエサを運び、数日後、雛は無事に巣立っていった。――その後、親たちはその巣箱で二度目の産卵をした。おかげで窓の外がピーチクパーチクうるさい、とカミサンに怒られた。


2008年9月4日(木曜日)

巣箱

カテゴリー: - flyman @ 22時52分45秒
去年の秋に掛けた巣箱。
今年のゴールデンウィークにはまだ空き家だったのだが、誰かが利用していたらしい。
改築したのはアカゲラ辺りだろうか。かなり間口を広げられている。
巣材は苔と動物の毛だ。何の毛だろう?
太い直毛は鹿か? どこで集めるのだろう?

巣箱は掃除してまた木の上に戻しておいた。来春も店子が来るだろうか。


2008年9月3日(水曜日)

ようやく夏休み

カテゴリー: - flyman @ 16時42分35秒

『Rails 覚え書き』のリンクが辿れなくなっていた。理由は不明だが、特に変更を加えた憶えもないので、サーバー側の問題か――。今はページを作り直してあるが、コメントは消えてしまった。

さて、ヘッドの削り直しをしていたギアペグの自作ウクレレだが、ようやく組み直しが完了した。

ヘッドを薄くし、それに合わせてネックも再加工、全体を再塗装した。
ペグも左右2個ずつに変更した。ヘッドを薄くした分、ペグの軸が約5mmほど突出することになった。

ヘッドが軽くなって随分持ちやすくなった。

さて、遅い夏休みをとった。

浅間山の鬼押し出し。手持ちで3枚撮ったものを CANON Photo Stitch で結合した。……山は反対側。
鬼押し出しの溶岩の隙間にヒカリゴケが見える。

28 queries. 0.040 sec.
Powered by WordPress Module based on WordPress ME & WordPress

ヘッドライン
nikkansports
IT Pro
レスポンス
テーマ選択

(4 テーマ)