LDAPの概念とアーキテクチャ

LDAP (Lightweight Directory Access Protocol)

ディレクトリサービスへ接続する為に使用されるプロトコル。

ディレクトリサービス
  • ディレクトリ内の情報をユーザ名などのキーで検索する事を可能にするサービス。
  • 検索・参照に特化して最適化され高速化がなされている。
ディレクトリ
  • 階層構造を持つグループで情報を管理する。
ディレクトリ情報ツリー(Directory Infomation Tree: DIT)
  • LDAPにおける情報を管理する為の階層構造の事。
  • 情報は識別名(Distinguished Name: DN)という一意の名前で記述される。
相対識別名(Relative DN: RDN)
  • エントリの相対的な位置における名前。
  • 同一階層内では一意でなければならない。
  • 別階層においては同名のエントリが存在してもかまわない。
別名エントリ
  • 別階層に存在する複数のエントリを、同一エントリとして参照させる事が可能になる機能。

X.500

ネットワーク上での分散ディレクトリサービスに関する国際規格。

  • OSIネットワークをベースとしている為、運用負荷が高く、TCP/IPでの運用には向いていない。
  • X.500をベースにTCP/IPネットワークでの使用を前提に作られたプロトコルがLDAP

LDIF(LDAP Data Interchange Format)

テキストファイルでディレクトリ情報を記述する様式。

エントリ
  • 管理される個別のデータ。
  • 1つのエントリは複数の属性をもち、それぞれの属性値が格納される。
属性
  • エントリに登録できる情報。
属性値
  • 属性に登録された情報。
オブジェクトクラス(objectClass)
  • エントリの型を決定する属性。
  • オブジェクトクラスによってエントリに必ず必要となる属性(必要属性)と、入れてもよい属性(許可属性)が決まる。
  • 一つのエントリは、必ず1つ以上のobjectClassを持つ必要がある
LDIFのフォーマット
# コメント
dn: 属性値
属性記述子: 属性値

#ルートノード
dn: dc=example,dc=com
objectClass: dcObject
dc: example

#abc部署
dn: ou=abc,dc=example,dc=com
objectClass: organaizationalUnit
ou: abc

#vzx部署
dn: ou=vzx,dc=example,dc=com
objectClass: organaizationalUnit
ou: vzx

#Taro Yamadaのエントリ
dn: cn=Taro Yamada,ou=abc,dc=example,dc=com
cn: Taro Yamada
sn: Yamada
  • エントリとエントリの間には空白を入れる
  • 下位のエントリが正常に登録される為には、それ以前に上位のエントリが登録されている必要がある。
  • バイナリデータや改行を含む値、':'や'<'、スペースで始まる値、スペースで終わる値、印字できない文字などの特殊なデータを記述したい場合は、base64エンコードして記述する。
  • 属性値に他のファイルを指定したい場合には':<'としてファイルのURIを記述する。
# base64でエンコードした値を記述
cn:: TESMhsdifksd8s7dfe8f7sjd78swy29s

# 属性値に他のファイルを指定
cn:< file:///tmp/value
標準的に利用される属性
o 組織名(OrganizationName)
ou 組織単位(OrganizationalUnitName)
c 国名(countryName)
cn 一般名称(CommonName)
sn 姓(SurName)
dc ドメイン構成要素(Domaincomponent)
mail 電子メールアドレス(mail)
telephoneNumber 電話番号(telephoneNumber)

changetype

ディレクトリにエントリを追加/削除したり、エントリの情報を変更する為にLDIFに記述するディレクティブ。

  • エントリを追加/削除したり、エントリの情報を変更する場合changetypeをLDIFに記述し、ldapmodifyコマンドを実行する。
エントリを追加

chagetype: addを使用

dn: cn=Taro Yamada,ou=abc,dc=example,dc=com
changetype: add
cn: Taro Yamada
sn: Yamada
mail: taro@example.com
objectclass: person
エントリを削除

changetype: deleteを使用

dn: cn=Taro Yamada,ou=abc,dc=example,dc=com
changetype: delete
エントリの属性を追加・削除・変更

changetype: modifyを使用

  • 複数の属性を操作する場合は'-'で区切って複数行指定する。
add: 追加する属性記述子
追加する属性記述子: 属性値

delete: 削除する属性記述子
削除する属性記述子: 属性値 (指定しなくても構わない)

replace: 変更する属性記述子
変更する属性記述子: 属性値


dn: cn=Taro Yamada,ou=abc,dc=example,dc=com
changetype: modify
add: telephoneNumber
telephoneNumber: xxx-0987-xxxx
-
delete: description
-
replace: mail
mail: yamada@example.com

Ruby1.9 - システムコマンドの出力を受け取る


rubyのスクリプトの中でOSのコマンドを実行して、その出力を受け取りたいって時はこんな感じでいいんだろうか?execとかsystemだと受け取れないよね?とても自信がない。


たとえばpingを実行して、出力の中からレスポンスタイムを抜き出して返したいみたいな。一応、失敗したらもう一度試みて、それでも駄目なら0を返す感じにしてみた。

#-*- coding: UTF-8 -*-

def ping(host, limit = 2)
  return 0 if limit == 0
  cmd = "ping -c 1 #{host}"
  begin
    io = IO.popen(cmd)
  rescue
    raise
  else
    response_time = ''
    io.read.gsub(/\n/, '').gsub(/^.*time=(.*?)\s.*/){response_time = $1}
    if response_time.empty?
      ping(host, limit - 1)
    else
      response_time
    end
  ensure
    io.close if io
  end
end

ping('192.168.0.1')       #=> "0.271"

プリンとイカめし

昨日に引き続き、暇に任せて圧力鍋で料理してみました。


まずはイカめし。
本当はもち米で作るんだけど、米を買う習慣が昔からないのでもち米買わずに、普通にコシヒカリで作ったけどかなり美味い。イカとかもうホロリとほぐれるし、ほのかなショウガの香りが食欲をドンドン促進します。酒が進みますわ。


IMG_0149


IMG_0146


そしてデザートにプリン。
ちょっと砂糖の分量が多くて甘かった。あと、蒸しが少しあまかった。おっと意図せず韻を踏んだぜ。
けど滑らかさは合格ラインかな。


IMG_0150

角煮と煮卵つくた

圧力鍋借りたので早速、角煮と煮卵作ってみたよ。マジ美味。


IMG_0141


IMG_0143


IMG_0144


こちらのレシピを参考にさせて頂きました。
豚の角煮と煮玉子 by ゆきんこさん [クックパッド] 簡単おいしいみんなのレシピが122万品

はじめてのgitとGitHub for Mac

昨日初めてgitとgithubを使ったのでメモ。環境はMac OS X Snow Leopard

まずはgitをインストール

macの場合、macportsとかgit-osx-installerとかありますが、せっかくなので最新のソースからインストール。

$ wget http://www.kernel.org/pub/software/scm/git/git-1.6.4.2.tar.gz
$ tar zxvf git-1.6.4.2.tar.gz
$ cd git-1.6.4.2
$ ./configure
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install


インストールが完了したら、名前とメールアドレスの登録をしとかないと、ローカルホスト名とか表示されてちょっと恥ずかしい。

$ git config --global user.name 'username'
$ git config --global user.email username@example.com

レポジトリを作成してコミット

まずはプロジェクト名のディレクトリを作成して、レポジトリを初期化。

$ cd ~
$ mkdir testapp
$ cd testapp
$ git init


適当にファイルを作ってコミットする。

$ touch testfile
$ git add testfile
$ git commit -m 'first commit'

GitHubのアカウント作成、SSH公開鍵の登録

GitHubにアクセスしてSign upから以下の情報を入力してアカウント登録。

  • ユーザ名
  • メールアドレス
  • パスワード
  • SSH公開鍵


SSH公開鍵は空白でもアカウントは作れるので、後から登録してもいい。鍵の作成方法はHelp.GitHub - Generating SSH keysに詳細な手順があるので、手順通りに実行して貼付けるだけ。ファイル名とかはデフォルトで良いのでpassphraseの入力くらい。

$ cd ~/.ssh
$ ssh-keygen
$ cat id_rsa.pub | pbcopy

最後のコマンドで公開鍵がクリップボードにコピーされるので、あとは登録フォームのSSH Public Key欄に[command + v]で貼付けるだけ。


GitHubへリポジトリ作成、ローカルからGitHubへpush

アカウント登録が完了したらユーザのダッシュボードが表示されるので、[create a new one]とか[Create new Repository]あたりをクリックしてレポジトリを作成する。とりあえずプロジェクト名が入ってればOK。プロジェクト名はローカルのと合わせる。

レポジトリが出来たらあとはローカルからpushするだけ。

$ cd ~/testapp
$ git remote add origin git@github.com:username/testapp.git
$ git push origin master

誰かのレポジトリをforkする。

forkしたいレポジトリの[fork]ボタンをクリックするだけ。以上。
あとはローカルにcloneして編集してコミットした後にpush。

$ git clone git@github.com:username/fork_reponame.git


remote addとかはしなくていい。

$ git commit -a
$ git push origin master

cutagemを修正してみたりした

rubyをちゃんと勉強しようと思って、先週くらいからruby-1.9.1をちょこちょこと弄ってたんだけど、せっかくなのでgemの作り方も覚えようと思ってcutagemってやつを使ってみた。


OS: Mac OS 10.6
ruby: 1.9.1p243

$ gem sources -a http://gems.github.com 
$ sudo gem install genki-cutagem

インストールは問題なかったんだけど、いざ使ってみたら

$ cutagem testapp
/usr/local/lib/ruby/1.9.1/pathname.rb:969:in `glob': can't convert Pathname into String (TypeError)
	from /usr/local/lib/ruby/1.9.1/pathname.rb:969:in `glob'
	from /usr/local/lib/ruby/gems/1.9.1/gems/genki-cutagem-0.0.8.3/lib/cutagem.rb:180:in `select_template'

てな感じでエラーになった。


で、修正内容は以下のとおり。

diff --git a/lib/cutagem.rb b/lib/cutagem.rb
index 579d470..60f76fe 100644
--- a/lib/cutagem.rb
+++ b/lib/cutagem.rb
@@ -108,18 +108,18 @@ class CutAGemCommand
 
                begin
                        cp_r template, gemdir, :verbose => true
-                       Pathname.glob(gemdir + "**/gemname*") do |f|
+                       Pathname.glob(gemdir.to_s + "/**/gemname*") do |f|
                                new = f.parent + f.basename.to_s.sub(/gemname/, gemname)
                                puts "Rename #{f.relative_path_from(gemdir)} to #{new.relative_path_from(gemdir)}"
                                f.rename(new)
                        end
-                       Pathname.glob(gemdir + "**/gempath*") do |f|
+                       Pathname.glob(gemdir.to_s + "/**/gempath*") do |f|
                                new = f.parent + f.basename.to_s.sub(/gempath/, gempath)
                                puts "Rename #{f.relative_path_from(gemdir)} to #{new.relative_path_from(gemdir)}"
                                new.parent.mkpath
                                f.rename(new)
                        end
-                       Pathname.glob(gemdir + "**/*") do |f|
+                       Pathname.glob(gemdir.to_s + "/**/*") do |f|
                                next unless f.file?
                                f.open("r+") do |f|
                                        content = f.read
@@ -168,7 +168,7 @@ class CutAGemCommand
                templates = []
                u_templates = []
                if @user_templates.exist?
-                       Pathname.glob(@user_templates + "*").each do |t|
+                       Pathname.glob(@user_templates.to_s + "/*").each do |t|
                                t = [".cutagem/templates/#{t.basename}", t]
                                if t[1].basename.to_s == "default"
                                        u_templates.unshift(t)
@@ -177,7 +177,7 @@ class CutAGemCommand
                                end
                        end
                end
-               Pathname.glob(@templates + "*").each do |t|
+               Pathname.glob(@templates.to_s + "/*").each do |t|
                        t = ["#{t.basename}", t]
                        if t[1].basename.to_s == "default"
                                templates.unshift(t)

Dir.globの問題だと思うけど、1.9ではStringにしてから渡してやらないとエラーになるようです。
一応変更後もruby-1.8.6でも動作した(ような気がする)ので多分大丈夫かと。


なんか流れで初めてgitとかgithubとか使ってみたりした。
forkしてみたり、commitしてみたり。

404 · GitHub