【SQL】ORDER BY で NULL を最後にする場合の注意点

SQLでNULL値を含むカラムでソートを実施する場合、何も意識しないと最小の値として処理されてしまいます。

例えば次のようなレコードが存在する場合

test_tab

num
1
null
3
2



select * from test_tab order by num asc;
こんな書き方をすると次のような順で出力されます。

test_tab

num
null
1
2
3

null値が最小として扱われてしまいます。
null値を最後(この場合は最大)と扱いたい場合は下記のように書きます。

select * from test_tab order by num is null asc;

test_tab

num
1
3
2
null

お気付きとは思いますが、この書き方だけでは、null値が最大として扱われただけであって、通常のソートは行われていません。

そのため、下記のように書き直します。

select * from test_tab order by num is null asc, num asc;
こうすると下記のような出力になり、取りたい値となりました。

test_tab

num
1
2
3
null

まとめ

ORDER BY 時に利用出来る、カラム is null [asc|desc] はあくまでnull値の取扱をどうするか決めているだけなので、null以外の値にはソートが効いていないので、注意が必要。


ちょっとはまったので、参考までに
なお、DESCの場合は、挙動がまったく逆になるイメージです。

categories DB, IT関連 | Tags: | scot_exist | datetime 2011年4月6日 12:22 | コメントは受け付けていません。

【LDAP】LDAP障害時、ローカルアカウントを利用する方法(PAM)

Linuxのユーザ認証にLDAPを利用する場合の注意点を紹介します。

※設定方法等の詳細については今回は割愛します。

通常Linuxのアカウント認証にLDAPを利用する場合、PAMを経由して認証させるかと思います。
その時、LDAPサーバになんらかの障害が発生し、LDAPサービスを利用出来なくなった場合、
そのサービスを受けているクライアントサーバでは、ローカルユーザでのログインすら出来なくなります。

そこで、LDAPサービスを利用出来ない状況の場合は、即座にLDAP認証を諦め、ローカルアカウント認証に切り替える設定方法を紹介します。

なお、本記事は、nss_ldap, nsswitch, authconfigを利用している場合の話になります。

PAMの設定ファイルを誤って設定してしまうと、次回からログインすら出来なくなる可能性がありますので細心の注意を払って設定に臨んでください。また、作業する際は、設定後に接続確認を行うまで、現在利用しているターミナルを切断しないでください。

設定直後の各種設定ファイル

通常、ローカルユーザ認証をLDAPを利用するように設定した場合、各設定ファイルは次のようになるかと思います。


/etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so broken_shadow
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so


ここで注目すべきは12行目の「account」のpam_ldap.soを利用している部分です。
LDAPサーバを利用出来ない場面では、最終的に「default」で指定した「bad」に該当してしまいます。
そのため、最終的に、ローカルアカウント認証を行なう前に、「bad」として終了していまうのです。

/etc/ldap.conf
:
# Bind/connect timelimit
#bind_timelimit 30
bind_timelimit 120

# Reconnect policy: hard (default) will retry connecting to
# the software with exponential backoff, soft will fail
# immediately.
#bind_policy hard

# Idle timelimit; client will close connections
# (nss_ldap only) if the server has not been contacted
# for the number of seconds specified below.
#idle_timelimit 3600
idle_timelimit 3600
:


またこちらの9行目「bind_policy」はコメントアウトされていますが、デフォルトの設定は「hard」です。
この項目は、LDAPの再接続のポリシーを設定します。
「hard」の場合は、LDAPサーバへ接続出来る状態になるまで再試行を繰り返します(正確には2分くらいでタイムアウトします)
「soft」の場合は、LDAPサーバへ接続出来ない場合は、即座に諦め、次へ進みます。
ですので、デフォルトのままでは、LDAPサーバに障害が発生した場合、LDAP接続を諦めるまでに長い間再接続を試みる事になります。

オススメ設定


/etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so broken_shadow
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore authinfo_unavail=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022


注目すべきは先ほどと同じく、12行目の「account」の行です。
先ほどのコントローラ「default」「success」「user_unknown」に加え、「service_err」「system_err」「authinfo_unavail」のコントローラを追加しています。
いずれもignoreに設定し、マッチした場合は、この項目を飛ばして次に行きます。

/etc/ldap.conf
:
# Bind/connect timelimit
#bind_timelimit 30
bind_timelimit 120

# Reconnect policy: hard (default) will retry connecting to
# the software with exponential backoff, soft will fail
# immediately.
#bind_policy hard
bind_policy soft

# Idle timelimit; client will close connections
# (nss_ldap only) if the server has not been contacted
# for the number of seconds specified below.
#idle_timelimit 3600
idle_timelimit 3600
:


「bind_policy」を「soft」に設定しています。
先ほど説明したように「soft」にする事で、接続に失敗したら、即座に再接続を諦めます。

これらの設定をする事により、LDAPサーバに障害が発生した場合は、ローカルアカウントではログイン出来るようにすることが出来ます。
実際に利用する場合は、まずテスト環境を構築して試してみてくださいね。

でわでわ☆

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

categories IT関連, Linux/Unix, サーバ技術 | Tags: , , , | scot_exist | datetime 2011年1月29日 15:22 | Comments (1)

【日記】26回目の誕生日(ちょっと重い話あり)

こんばんは☆

久しぶりの更新が日記ですよorzもっとがんばってちゃんと書くように頑張ります☆

とりま、今月の1月20日に26回目の誕生日を無事迎える事が出来ました。

沢山の方からお祝いの言葉を頂いたり、プレゼントを頂いたりしてほんと感謝感激です☆

腕時計、CD、本、エヴァのエントリープラグの箸、うまい棒(年齢分)、誕生日ケーキetc…
ほんと感謝です☆みなさんありがとう☆

誕生日を迎えるたびに思う事ですが…
本来死ぬはずだった年齢の約7倍も生きる事が出来て本当に幸せだと思います。
まだ、色んな事が体験出来るし、知る事が出来る。
頑張れば頑張った分だけ自分に返ってくる。
自分の存在が、誰かの役に立つ事が出来る。

なんか未来があるってすごいっすよねっ!
映画のパクリになりますが、

「明日が来る事の奇跡」

ほんとそう思います。

……


実は自分2回ほど本当に死に掛けてるんですよ…

4歳の時と6歳の時に。

4歳の時は、よくある話かもしれませんが、お風呂で溺れました…
当時、お酒をおじいちゃんに貰っていて、ほろ酔い気分でお風呂に入ったとき、
フラフラになってお風呂で溺れたって話。
気絶して浮いてた自分を、気にして見に来てくれたおじいちゃんが助けてくれたって話です。
まぁこっちはよくある話ですね。





※注意:ここからは、ちょっとグロテスクな表現が含まれていますので、心臓の弱い方はお控えください。






続きを読む »

categories 日記 | scot_exist | datetime 2011年1月21日 03:46 | コメントは受け付けていません。

【Git】git add: ステージする(索引に追加)コマンドとオプション

コンテンツをステージするコマンド(git add)

今回はコンテンツをステージするコマンド「git add」に焦点を絞って解説したいと思います。
Gitでは、コミット(git commit)を実行する前にステージ(索引に追加)する必要があります。
簡単な流れとしては次のようになるかと思います。

$ git add testfile
$ git commit

オプション一覧

Gitのコマンドにはサブオプションが多数存在します。
その中でも特に利用頻度が高そうなものを紹介していきたいと思います。

ショートオプションロングオプション説明
<filepattern>…追加するファイル名を指定します。
-n–dry-run追加されるファイル名を表示します。実際には追加されません。
-f–force無視ファイル(.gitignore)を無視して追加します。
-u–update既にGit管理下にあるファイルの内、変更点のあるものだけをステージします。
-A–all-uの挙動に加え、.gitignore で無視されていないファイルをステージします。
-N–intent-to-add後にステージされる事を記録します。git diff を使った場合、差分表示が行えます。
–(ハイフン2つ)オプションとファイルを明示的に切り分けます。例えば「-n」という名前のファイルをステージする場合に利用します。

使用例


<filepattern>


一つのファイルを指定
$ git add testfile

複数のファイルを指定
$ git add testfile1 testfile2 testfile3

ドット「.」指定
$ git add .

カレントディレクトリ配下すべてステージする。
この時、.gitignoreで指定されたファイル以外のすべてのファイルをステージします。


ファイルグロブ「例えば: *.c」

次のようなファイル構成の場合

a.c
abc.c
b.c
test/
test/c.c
test/d.c
$ git add *.c

追加されるのは

a.c
abc.c
b.c

の3つになります。


-n, –dry-run: 追加されるファイル名だけ出力する(実際に追加はされない)

$ git add testfile -n
add 'testfile'

-f, –force: 無視ファイル(.ignore)さえも無視してステージする

次のようなファイル構成の場合

testfile1
testfile2
.gitignore

.gitignoreの中身

testfile2

「-f」オプションを指定してステージする

$ git add . -f

追加されるファイルは

testfile1
testfile2
.gitignore

のすべてのファイル。
「-f」を指定しないと下記のようなファイルだけ追加されます。

testfile1
.gitignore

-u, –update: 既にGit管理下にあるファイルの内、変更点のあるものだけをステージする

次のようなファイルの状態の場合

testfile1 Git管理下で変更なし
testfile2 Git管理下で変更あり
testfile3 Git管理下ではない
$ git add -u

testfile2 だけがステージされます。


-A, –all: "-u"の挙動に加え、Git管理下になく、.gitignore で無視されていないファイルもステージする

次のようなファイル構成の場合

testfile1 Git管理下で変更なし
testfile2 Git管理下で変更あり
testfile3 Git管理下ではない
testfile4 Git管理下ではない
.gitignore

.gitignoreの中身

testfile3
$ git add -A

次のファイルがステージされます。

testfile2
testfile4

-N, –intent-to-add: 後でステージされる事を記録する

git diff を使った場合、差分表示が行えます。
次のようなファイル構成の場合

testfile1 Git管理下ではない

比較すると

$ git diff

Git管理下ではないため、比較しようとしても何も出力されません。
また次のように

$ git add testfile1
$ git diff

としても、同様に比較する事が出来ません。これはaddしたとしても、まだコミットされていない状態のため、Gitとしては比較できないためです。
次のようにする事で、git diff コマンドで比較する事が出来ます。

$ git add testfile1 -N
$ git diff
:
+testdata1

また、git commit -a を行う場合にも有効なオプションです。


–(ハイフン2つ): オプションとファイルを明示的に切り分けます。

次のようなファイル構成の場合で且つ「-n」だけをステージしたい場合

-n           ←ファイル名
testfile1

単純に次のようなコマンドを発行してもGitとしては「-n」オプションなのか、ファイル名の「-n」なのか判断出来ません

$ git add -n
Nothing specified, nothing added.
Maybe you wanted to say 'git add .'?

「-n」オプションとして解釈されてしまい、ファイルが不正として扱われてしまいます。
こんな時はオプションと、ファイルを明示的に切り分けて指定します。

$ git add -- -n

「–(ハイフン2つ)」以降はファイル(正確には引数)として扱われるため、ここでいう「-n」はファイル名として解釈されます。


入門Git

categories Git, IT関連 | Tags: | scot_exist | datetime 2011年1月8日 01:02 | コメントは受け付けていません。

【Git】bashで補完機能を有効にする(bash-completion)

今回は、Gitをbashで利用する上で、設定しおくと便利な補完機能について解説したいと思います。

bash-completionとは

通常bashでは、TABキーを押すことで、ファイル名の補完が行えます。
bash-completionはこの機能を拡張し、例えば sshコマンド時のホスト名等を補完したりすることが出来ます。


bash-completionをインストールする

bash-completionは下記のURLからDLする事が可能です。

http://bash-completion.alioth.debian.org/

現在最新版は

bash-completion-1.2

bash-completionをダウンロードする
$ wget http://bash-completion.alioth.debian.org/files/bash-completion-1.2.tar.bz2

URLは適宜読み替えてください。


bash-completionをインストールする
$ tar xvjf bash-completion-1.2.tar.bz2
$ cd bash-completion-1.2
$ ./configure
$ make
# make install

Gitの補完機能を使ってみる

bash-completionのデフォルトではGitコマンドを補完するためのスクリプトが含まれていませんので、
別途追加する必要があります。


git-completionをインストールする

今回は、git.kernel.org のリポジトリから最新のgit-completionをダウンロードします。

http://git.kernel.org/?p=git/git.git;a=blob_plain;f=contrib/completion/git-completion.bash;hb=HEAD


git-completionをダウンロードする
$ wget 'http://git.kernel.org/?p=git/git.git;a=blob_plain;f=contrib/completion/git-completion.bash;hb=HEAD' -O git-completion.bash

git-completionをインストールする
# mv git-completion.bash /usr/local/etc/bash_completion.d/git

※環境によってインストール先が異なるかもしれません。


git-completionを設定する
# vi /etc/bashrc

ファイルの末尾に次を追加

# bash_completion
BASH_COMPLETION=/usr/local/etc/bash_completion
BASH_COMPLETION_DIR=/usr/local/etc/bash_completion.d
BASH_COMPLETION_COMPAT_DIR=/usr/local/etc/bash_completion.d
if [ -f /usr/local/etc/bash_completion ]; then
    . /usr/local/etc/bash_completion
fi


/etc/bashrc の再読み込み

$ . /etc/bashrc
git-completionの確認
$ git [TAB]

TABキーを2回押すと、候補一覧が表示される。
この時、「add」や「commit」等、Gitに関するコマンドが候補として表示されればOKです。


categories Git, IT関連, Linux/Unix | Tags: , , | scot_exist | datetime 2011年1月7日 00:01 | コメントは受け付けていません。