【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の場合は、挙動がまったく逆になるイメージです。
【LDAP】LDAP障害時、ローカルアカウントを利用する方法(PAM)
Warning: getimagesize(http://images.amazon.com/images/P/4798018007.09.THUMBZZZ.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/blog/wp-content/plugins/simple-amazon/include/sa_generate_html_class.php on line 137
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サーバに障害が発生した場合は、ローカルアカウントではログイン出来るようにすることが出来ます。
実際に利用する場合は、まずテスト環境を構築して試してみてくださいね。
でわでわ☆


【日記】26回目の誕生日(ちょっと重い話あり)
こんばんは☆
久しぶりの更新が日記ですよorzもっとがんばってちゃんと書くように頑張ります☆
とりま、今月の1月20日に26回目の誕生日を無事迎える事が出来ました。
沢山の方からお祝いの言葉を頂いたり、プレゼントを頂いたりしてほんと感謝感激です☆
腕時計、CD、本、エヴァのエントリープラグの箸、うまい棒(年齢分)、誕生日ケーキetc…
ほんと感謝です☆みなさんありがとう☆
誕生日を迎えるたびに思う事ですが…
本来死ぬはずだった年齢の約7倍も生きる事が出来て本当に幸せだと思います。
まだ、色んな事が体験出来るし、知る事が出来る。
頑張れば頑張った分だけ自分に返ってくる。
自分の存在が、誰かの役に立つ事が出来る。
なんか未来があるってすごいっすよねっ!
映画のパクリになりますが、
「明日が来る事の奇跡」
ほんとそう思います。
……
…
実は自分2回ほど本当に死に掛けてるんですよ…
4歳の時と6歳の時に。
4歳の時は、よくある話かもしれませんが、お風呂で溺れました…
当時、お酒をおじいちゃんに貰っていて、ほろ酔い気分でお風呂に入ったとき、
フラフラになってお風呂で溺れたって話。
気絶して浮いてた自分を、気にして見に来てくれたおじいちゃんが助けてくれたって話です。
まぁこっちはよくある話ですね。
※注意:ここからは、ちょっとグロテスクな表現が含まれていますので、心臓の弱い方はお控えください。
続きを読む »
【Git】git add: ステージする(索引に追加)コマンドとオプション
Warning: getimagesize(http://images.amazon.com/images/P/4798023809.09.THUMBZZZ.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/blog/wp-content/plugins/simple-amazon/include/sa_generate_html_class.php on line 137
コンテンツをステージするコマンド(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】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です。