dT*blog

design and programming

NULL文字を削除する

csvデータをpostgresqlにインポートしようとしたら、エラーが。

ERROR:  invalid byte sequence for encoding "SJIS": 0x00

NULL文字が含まれているのが、納得いかないようす。NULL文字は目で見えない制御文字なので、どうやって削除したもんかなーと思ったら、trコマンドで簡単に除去できました。

$ cat src.csv | tr -d "\000" > dest.csv

これでインポートはバッチリでした。

続きを読む "NULL文字を削除する"

Posted by dT by 12:56 | Comments (0) | TrackBacks (0)

Linuxの圧縮/解凍コマンドまとめ

マイナーな圧縮形式になるとコマンドを忘れがちなので、まとめのメモ。

まずは基本の gz 形式から。(さすがに忘れないけど)

圧縮
$ gzip filename
解凍
$ gunzip filename.gz

続いて、tar.gz (tgz) 形式。(これも忘れないなあ)

圧縮
$ tar cvfz dirname.tar.gz dirname
解凍
$ tar xvfz dirname.tar.gz

bzip2 (bz2) 形式。

圧縮
$ bzip2 filename
解凍
$ bzip2 -d filename.bz2

tar.bz2 形式。

圧縮
$ tar cvfj dirname.tar.bz2 dirname
解凍
$ tar xvfj dirname.tar.bz2

Windowsとのデータやり取りの基本、ZIP形式。

圧縮
$ zip filename.zip file1 file2
解凍
$ unzip filename.zip

これまたWindowsとデータ交換するとよく出てくるLZH形式。

圧縮
$ lha -a filename.lzh file1 file2
解凍
$ lha -e filename.lzh

こんなところでしょうか。個人的には、tar.bz2形式とLZH形式の解凍が、いつも一発でいきません。あうあう。どうもオプションが覚えられないんだよなあ。チートシート、チートシート、と。

Posted by dT by 18:44 | Comments (0) | TrackBacks (0)

FTP専用ユーザーを作ってみる

年に1回くらい需要があることが分かったので、ここらへんでメモしてみる。

# useradd -s /sbin/nologin -M ftpuser
# passwd ftpuser
# mkdir -p /ftp/userdir
# usermod -d /ftp/userdir ftpuser
# chown ftpuser:ftpuser /ftp/userdir
# chmod 705 /ftp/userdir

useradd で /sbin/nologin を指定することで、telnet などでログインできないユーザを作成できる。また、-M オプションを付けると、ホームディレクトリを作成せずにユーザを作成するので、不要なメールボックスが作成されないで済む。FTP先のディレクトリは、usermod で後から設定してあげればOK。

ざっくりこんな感じ。

ただ、qmail が動いていると、メールボックスは無いんだけれども、/etc/passwd にエントリされるだけで、有効なアカウントと判断してしまう。だもんで、例えば ftpuser 宛にメールをすると、ローカル配送してしまう。まあ、メールボックスが無くてエラーになるので、目的を達成してはいるんだけど、"no mailbox" なエラーじゃないので、いただけない。

ここらへん、厳密に対処するのであれば、qmail でメールアカウントだけを削除する方法のように、ごにょごにょしてやらないといけない。ちょっと大げさ。

色んなサービスが動いていると、細かいところで厄介になるなー。

Posted by dT by 23:52 | Comments (0) | TrackBacks (0)

SSLのパスフレーズ入力を回避する方法

SSLを設定してApacheを立ち上げようとすると、秘密鍵のパスフレーズを問合せてくる。

手動で運用している分には問題ないのだけれども、スクリプトで起動するような操作をする場合に面倒くさいことになる。そこで、パスフレーズの入力を回避してみる。

# openssl rsa -in server.key -out server.key.nopass

これで、元の秘密鍵からパスフレーズ抜きの鍵を生成して、これを SSLCertificateKeyFile に指定してあげれば、次回の起動からはパスフレーズの入力なしで、Apacheを起動できます。わーい、便利。

ただし当然ながら、これはセキュリティ上、好ましくないので、単純に「めんどくせえなあ」ということなら、やめておいた方が良いと思います。そういう意味では、裏技ですね。

ちなみに、

# apachectl startssl

として起動しようとしたら、怒られてしまった。

Apache2.2からは、startssl などと書かずに、普通に start や graceful でSSL起動ができるようになったとのこと。ほう、こりゃまた便利な世の中ですなあ。

ということで、

# apachectl start

のコマンド一発で、パスフレーズ入力もなく、SSLを意識せずにApacheの運用が出来るようになりました。お疲れさまでした。

Posted by dT by 23:19 | Comments (0) | TrackBacks (0)

独自ネームサーバでドメイン解決できなくて

新規にドメインを取得し、自分でネームサーバを立てて運用をしようとするも、うまくいかずに数日ほどハマる。

ゾーンファイルを書き換えたりすることは日常的に行っており、DNSの仕組みも把握していたので、ゼロから構築するのもイージーだろうと思っていたら、まあ、色んなミスを重ねてハマりまくった。反省の意味も込めて、メモ書き。

続きを読む "独自ネームサーバでドメイン解決できなくて"

Posted by dT by 13:09 | Comments (0) | TrackBacks (0)

IPエイリアスでサーバに複数のIPを割り当てる

1台のサーバで複数ドメインの SSL 対応をやることになって、サーバ(というかNIC)に複数のIPアドレスを割り当てることになった。名前ベースの VirtualHost だと SSL 対応できないからね。VirtualHost で複数 SSL 運用するのであれば、IPベースしかないわけです。

こういう場合は、IPエイリアスを使うのが定石。

# ifconfig eth1:0 xxx.xxx.xxx.11 netmask 255.255.255.240
# ifconfig eth1:1 xxx.xxx.xxx.12 netmask 255.255.255.240

こんな感じで、NIC(ここではeth1)に複数IPアドレスを割り当てていけば OK なんだけど、このままだと、再起動時に設定が無効になっちゃう。仕方なく network の起動スクリプトに、同じコマンドを記述して起動していたんだけど、Redhat なら静的ファイルで管理できるみたい。

# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
BROADCAST=xxx.xxx.xxx.15
HWADDR=xx:xx:xx:xx:xx:xx
IPADDR=xxx.xxx.xxx.10
NETMASK=255.255.255.240
NETWORK=xxx.xxx.xxx.1
ONBOOT=yes
TYPE=Ethernet

という NIC に対して、次のようにエイリアスファイルを作っていけば OK みたい。

# vi /etc/sysconfig/network-scripts/ifcfg-eth1:0
DEVICE=eth1:0
BOOTPROTO=static
BROADCAST=xxx.xxx.xxx.15
HWADDR=xx:xx:xx:xx:xx:xx
IPADDR=xxx.xxx.xxx.11
NETMASK=255.255.255.240
NETWORK=xxx.xxx.xxx.1
ONBOOT=yes
TYPE=Ethernet

# vi /etc/sysconfig/network-scripts/ifcfg-eth1:1 DEVICE=eth1:1 BOOTPROTO=static BROADCAST=xxx.xxx.xxx.15 HWADDR=xx:xx:xx:xx:xx:xx IPADDR=xxx.xxx.xxx.12 NETMASK=255.255.255.240 NETWORK=xxx.xxx.xxx.1 ONBOOT=yes TYPE=Ethernet

これまで1枚の NIC に対して 1つのファイルなんだと思っていたので、エイリアスの場合どうするのかなーなんて思っていたんですが、IPエイリアスごとにファイルを用意して管理できるんですねー。これは良いこと知りました。ありがとうございます。

Posted by dT by 10:42 | Comments (0) | TrackBacks (0)

Apache2.2とTomcatを連携させるmod_proxy_ajp

Apache2.2系では、Tomcatと連携するのに、mod_jk を入れずとも mod_proxy_ajp モジュールを使って対応できるようなので、試してみた。

mod_proxy.so と mod_proxy_ajp.so が必要になるので、次のようにコンパイルする。とりあえず、他にも色々と必要だったりしたので、次のようにした。

# tar xvfz httpd-2.2.8.tar.gz
# cd httpd-2.2.8/
# ./configure --prefix=/usr/local/apache \
	--enable-so \
	--enable-shared \
	--enable-rewrite \
	--enable-ssl=shared \
	--with-mpm=worker \
	--enable-deflate \
	--enable-headers \
	--enable-dav=no \
	--enable-proxy-ajp \
	--enable-proxy \
	--enable-mods-shared=all
# make
# make install

Tomcat 側のデフォルトのAJPポートは 8009 なので、変更なければ、httpd.conf に次のように書けば終わり。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

<Location /manager/> ProxyPass ajp://xxx.xxx.xxx.xxx:8009/manager/ </Location>

これで、それまで http://xxx.xxx.xxx.xxx:8080/manager とアクセスしていたところ、http://xxx.xxx.xxx.xxx/manager とアクセスできるようになる、と。mod_jk に比べてすんごくラクチン。これは良いかも。

Posted by dT by 18:35 | Comments (0) | TrackBacks (0)

nss_ldap の接続タイムアウトを変える

PAM (Pluggable Authentication Modules)認証で、pam_ldap.so モジュールを使用するとき、LDAPに接続できないと、長いこと待たされる。LDAP側で管理しているユーザではなく、shadowファイルなどで認証チェックがOKとなっても、2分くらい待たされる。なんでじゃ。

PAMのsystem-authはこんな感じ。

#%PAM-1.0
auth        required      /lib/security/pam_env.so
auth        sufficient    /lib/security/pam_unix.so likeauth nullok
auth        sufficient    /lib/security/pam_ldap.so use_first_pass
auth        required      /lib/security/pam_deny.so

account required /lib/security/pam_unix.so broken_shadow account [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore authinfo_unavail=ignore] /lib/security/pam_ldap.so account required /lib/security/pam_permit.so
password required /lib/security/pam_cracklib.so retry=3 type= password sufficient /lib/security/pam_unix.so nullok use_authtok md5 shadow password sufficient /lib/security/pam_ldap.so use_authtok password required /lib/security/pam_deny.so
session required /lib/security/pam_limits.so session required /lib/security/pam_unix.so session optional /lib/security/pam_ldap.so

ついでに、nsswitch.confも。

 passwd:     files ldap
 shadow:     files ldap
 group:      files ldap

まあ、よくある基本的なLDAP認証の設定です。これで、LDAPに登録したアカウントでの認証もできるし、無論LDAPに登録していない元からのアカウントでの認証もできる。つまり、LDAPが落ちていても、shadowファイルとかに情報があれば、認証をパスできるわけです。

ところが、実際にLDAPを落として、SSHでログインを試みると、ログイン認証ごときに尋常じゃなく待たされる。ログ(/var/log/secure)を見てみたら、こんなことに!

sshd[29791]: Accepted password for plab from xxx port 3496 ssh2
sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server
sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server
sshd[29793]: nss_ldap: reconnecting to LDAP server (sleeping 4 seconds)...
sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server
sshd[29793]: nss_ldap: reconnecting to LDAP server (sleeping 8 seconds)...
sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server
sshd[29793]: nss_ldap: reconnecting to LDAP server (sleeping 16 seconds)...
sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server
sshd[29793]: nss_ldap: reconnecting to LDAP server (sleeping 32 seconds)...
sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server
sshd[29793]: nss_ldap: reconnecting to LDAP server (sleeping 64 seconds)...
sshd[29793]: nss_ldap: failed to bind to LDAP server ldap://xxx: Can't contact LDAP server
sshd[29793]: nss_ldap: could not search LDAP server - Server is unavailable

どうやら認証処理うんぬんではなく、LDAPサーバに接続できるまで、時間を置きながら最大5回までチャレンジしているため、時間がかかりまくっているみたい。何らかの原因でLDAPサービスが落ちたとき、復旧でSSH接続しようとしたら2分かかりました、ってのはキツイ。もうちょっと空気読もうよ、nss_ldapさんっ!

実際、LDAPサービスの死活を判断するのに、トータル124秒も待って5回も再接続を試みる必要があるケースは少ないと思う。同じネットワークエリア内にドメインコントローラを置いたりするなら、これは大げさすぎるんじゃないか、と。

ということで、nss_ldapの再試行回数やタイムアウト時間を変更する方法。

続きを読む "nss_ldap の接続タイムアウトを変える"

Posted by dT by 11:22 | Comments (0) | TrackBacks (0)

Apacheをroot権限で動かす裏ワザ

Apacheはroot権限で起動したあと、セキュリティ確保のため、子プロセスを一般ユーザー(nobodyとか)で生成する。今日は、この子プロセスも、rootで起動しちゃおうという話。

CGIは通常、子プロセスの一般ユーザー権限で実行される。そのため、より高い権限が必要なファイル操作を行おうとすると、パーミッションエラーになったりする。この手の問題には、suexecで対処するのがセオリーだけど、「そもそも実行ユーザーをrootにしちゃえば、何でもできるんじゃないの?」というコペルニクス的転回があって、試してみたら、できちゃった。おおっ!

以下、その方法。


続きを読む "Apacheをroot権限で動かす裏ワザ"

Posted by dT by 19:09 | Comments (0) | TrackBacks (0)

DreamWearverソースのクリーンアップ

DreamWeaverで構築したサイトのソースが汚いので、5分くらいでクリーンアップするshを書いてみた。あとで汎用性あるように、改造するために、ここにメモ。

#!/bin/sh

echo 'remove Templates directory' rm -Rf Templates/
for FILE in `find . -name '*.html' -print` do echo ${FILE} while true do COUNT=`grep '<!-- Instance' ${FILE} | wc -l` if [ ${COUNT} -eq 0 ]; then break; fi perl -pe 's/<!-- Instance.*? -->//' ${FILE} > ${FILE}.$$ mv ${FILE}.$$ ${FILE} done done
exit

DreamWeaver自体にもソースのクリーンアップとか機能があるらしいんだけど、テンプレートから切り離したりしなくちゃいけないんで、面倒らしい。そこらへんDreamWeaver使いじゃないので、よく分からない。正攻法を調べる時間もなかったので、全部サーバに上げてもらって、shスクリプトで処理した次第。

DreamWeaverぐらいのソフトになれば、これ以上のことを、コマンド一発でやれそうな気がするのだけど。知っている人いたら、教えてくださいまし。

Posted by dT by 14:50 | Comments (0) | TrackBacks (0)

サイトへの全アクセスを特定ページに転送する方法

時限的なサイトの運営でよくあるのが、閉鎖時に「サイトのどのページにアクセスされても、『サービス終了のお知らせ』ページを表示させたい」という要件。具体例を出すと、

http://www.hoge.com/aaa/index.html
http://www.hoge.com/ccc/ddd/index.php

こういったHTTPリクエストに対して、常に

http://www.hoge.com/close.html

を表示させるというもの。

様々な方法があるとは思うのだけれども、個人的に常用しているのは、Apacheのmod_rewriteを使った方法。なぜ常用しているかと言うと、Apache以外のWebサーバーを運用したことが無いから。

以下、その方法。

続きを読む "サイトへの全アクセスを特定ページに転送する方法"

Posted by dT by 23:04 | Comments (0) | TrackBacks (0)

CGIアクセスをHTTPSへリダイレクトする方法

CGIへのアクセスをSSL通信にしたい。

ということで、真っ先に思い浮かんだのが、CGIへのリンク全てのURLを「https://~」というフルパスの記述に変える方法。でも、これだとSSL対応していないプラットフォームでの運用に支障が出るし、何より開発時と本番時で絶対パスを変えたりして、開発コストがかかりそう。

そんなわけで、apache側の設定でリダイレクトさせるのが一番かなと思って、やってみた。

<FilesMatch "\.cgi$">
    RewriteEngine   On
    RewriteCond     %{SERVER_PORT} !^443$
    RewriteRule     ^/usr/local/apache/htdocs/(.*)$ https://www.hoge.com/$1 [L]
</FilesMatch>

SSL通信(443ポート使用)でないCGIへのアクセスを、mod_rewriteを使って、httpsへリダイレクト。.phpとか.doとか、拡張子が増えたときでも、これなら簡単に追加できそう。LocationMatch ディレクティブとか使って、もっとキレイに実現する方法もありそうだけど、とりあえずは良しとしよう。

いまだにApacheの設定は、うまくいくまで手探り。なかなか1発で思うように動いてくれた試しがない。慣れの問題なのかもしれないけど、そんなにApacheをイジることはないからなあ。

Posted by dT by 15:28 | Comments (0) | TrackBacks (0)

監査デーモンによる最悪のシナリオ

監視システムから、「DBサーバの/var 以下のディスク容量が残り少ないよ」というメールが届いたので見てみると、監査デーモン(audit)のログが思いっきり肥大化していた。のわー。

とりあえず、以下のページを参考に、ログ(save.*)を削除して、監査デーモンを停止してみた。監査デーモンじゃなくても、ちゃんと別経路で不正アクセスのログは取れるようにしているからね。

ペンギンさぁ~ん、遊びましょぉ~ - LauS(Linux Auditing System)のaudit
hamastaの日記 - CentOS ログイン不能

どうも RedHat ES3 の監査デーモンにはバグがあるらしく、ログがディスク容量を食い潰すとログインすらできない状況に陥ってしまうようだ。そのくせ、デフォルトで動作することになっている。だから、何も意識しないでサーバーを稼動させ続けていると、いつかサーバにログインできなくなるという最悪の結果が待っている。SSHログインはもちろん、コンソールログインすらできない(はず)。そうなったら、再起動以外に、打つ手なし。ガーン。

自宅サーバだったらログインできなくなっても再起動できるかもしれないけど、ミッションクリティカルな環境では、そんなこと言っていられない。まあ、そんなシステム運用するぐらいなら、監視デーモンに翻弄されることなんて無いだろうけど。

デフォルトで動いているデーモンは、もう一回見直した方が良いかもなあ。危ない、危ない。

Posted by dT by 18:14 | Comments (0) | TrackBacks (0)

Appletで半角英数字も日本語フォントにするには

JREの設定がデフォルトのまま、Appletで半角英数字と日本語の、いわゆる和欧混植をやろうとすると、英数字だけ等幅フォントになってカッコ悪い。いじめカッコ悪い。

すべて日本語フォントを使用するように変えてみようと、設定ファイルであるところの、fontconfig.properties を適当にイジってみたら上手くいったみたい。おお。

sequence.allfonts=japanese-iso10646,latin-1
sequence.allfonts.UTF-8.ja.JP=japanese-iso10646,latin-1

こんな感じで、latin-1 より先に日本語フォントが使われるように、検索順序を指定してやれば良いっぽい。よく分かってないけど。完全に自分メモです、これは。

ただでさえ慣れないJavaのフォント設定を、さらにフォント周辺が分かりづらいLinuxで行っていると、だんだん頭がおかしくなってくる気がする。ううう。

Posted by dT by 23:11 | Comments (0) | TrackBacks (0)

Linuxで使える日本語フォントはグダグダなのか

キレイなお姉さんは好きですか?
キレイなフォントは好きですか?

愚問すぎる。

それなのに、テキストを描画するJavaアプリケーションをLinuxサーバーで実行したら、文字が見るに耐えない汚さで出てきた。なんじゃこりゃあ!

アンチエイリアスをオフにして、デフォルトの東風フォントで描画すると、本当にミミズが這ったような字が出てくる。使い物にならない。ならば、評判の高いらしいM+IPAにしたらどうだろうか。しかし、これもイマイチ。

そもそも、MSゴシックやOsakaに匹敵するような、無難な日本語ビットマップフォントというヤツが、Linuxには無いのか。分かったよ、それならアンチエイリアスをオンにしたらキレイになるんだろう…と思ったのに、やっぱり微妙な感じ。視認性が低い。

フォントについては、サーバー側でごにょごにょした結果を返すのではなくて、クライアント側のリソースを使えるようにした方が賢明かもしれない。ああ、その点ではFlashって便利だよなあ、としみじみ思う冬の夜。

さて、どうしたもんかな。

Posted by dT by 21:51 | Comments (0) | TrackBacks (0)

vi で記号名のファイルを開くには

「-hoge」とか「+」とかいうファイル名をviで開こうとしても、うまく開けない。そんなときは、これ。

$ vi -- -hoge

「--」を付けることで、それ以降の文字列をオプションとして認識しなくなる。これで記号始まりの名前を持つファイルも、viでちゃんと表示することができるようになる。

しかし、記号から始まるファイル名を付けるセンスがわからん。そういうファイルを開くと、大抵が一時的なメモやログだったりする。妙な名前でサーバー上にゴミは溜めて欲しくないなあ。それとも何かしらの操作ミスの結果なんだろうか…。謎は深まる。

Posted by dT by 13:00 | Comments (0) | TrackBacks (0)

タブ区切りのソート

jmapのヒストグラムは、初めメモリ使用量の降順でプリントされる。このままだと、「残留オブジェクトの多いクラスはどれだ?」という時に困るので、オブジェクト数の降順にチャチャッとソートする方法メモ。

続きを読む "タブ区切りのソート"

Posted by dT by 14:30 | Comments (0) | TrackBacks (0)

ポートを使用しているサービスを特定する

smtpとかimapとか特定のポートを使用しているプロセスを表示する方法は無いもんかと思って探したら、便利なのがありましたよ。しっかりプロセスIDまで示してくれる。

# lsof -i:25
# lsof -c smtp

psを横目にnetstatを眺め、それでも悶々とした青春の日々よ、さようなら。今後はこいつを徹底的かつスマートに使って、大人の階段を上ります。(意味不明)

Posted by dT by 20:09 | Comments (0) | TrackBacks (0)

FTP時刻が9時間ずれるとか

FTPクライアントでサーバに接続したら、日付のところが、実際の更新日時より9時間遅れて表示されるわけですよ。SSHでログインする場合は、問題ナッシング。

まあ、ぴったり9時間と言ったら、いつものアレなわけです。何がグリニッジだ。ファイルのくせに、イギリス気取りかよ。ここは日本だよ、東京だよ、新宿区だよ!

どうもFTPデーモン側で、ちゃんと設定しないといけないらしい。
(以下、vsftpd の場合。)

# vsftpd.conf
use_localtime = YES

これが NO になっていたり、そもそも use_localtime の指定が無いと、標準時で表示されてしまう。デフォルトが逆じゃないのかと思うんだけど…。

Posted by dT by 12:24 | Comments (0) | TrackBacks (0)

HOSTSファイルは何処だ

バーチャルホストの設定をローカルで確認するためには、クライアント機で名前解決するための仕組みが無いといけない。グローバルで見えるサーバーならば、DNSが同じことをしてくれるんだけどね。

Windowsマシンの場合、その仕組みを提供してくれるのが、HOSTSファイルだ。HOSTSファイルに、IPとホスト名のマッピングを書くことで、名前解決を行ってくれるというわけ。まあ、大体 linux と一緒です。

が、しかし。

HOSTSファイルが見つからないんである。その昔、「C:\Windows」あたりにあったのを見た気がしたんだけど、見つからない。どうも Windows XP からは配置場所が変わったらしい。時間を返せ。

C:\WINDOWS\SYSTEM32\DRIVERS\ETC

こんなところにあるなんて、気付かないだろう。やられた。あと拡張子が無いからメモ帳で開けないのもイライラする。また Vista になったら、別のところに行ってしまったりするんだろうか。面倒くさい。

Posted by dT by 10:01 | Comments (0) | TrackBacks (0)

NFSの設定

複数構成のアプリケーションサーバーでサービスを運用する場合、ソースは一元管理にすると、保守がラクチンになる。そこで使うのが、NFS

が、しかし。

NFSの設定なんて年に一度もしないので、いつも方法を忘れて、あーだこーだと時間を無為にしている気がする。なんだかなあ。ということで、以下、簡易手順メモ。

続きを読む "NFSの設定"

Posted by dT by 20:22 | Comments (0) | TrackBacks (0)

ディレクトリ名だけを取得する

カレントディレクトリへのパスではなくて、その名前だけを取得する方法が思い出せぬ。

文字列操作で強引に攻めても良いんだけど、きっとスマートな方法があるはず。そう思い始めてから1時間あまり。2年前の自分メモを見つけて、ようやく思い出した。そうそう、これこれ。

${PWD##*/}

これで、カレントディレクトリのパスについて、その先頭から「*/」パターンの最長マッチ部分が取り除かれ、無事ディレクトリ名だけを取得できる。おー、すげー、暗号かコレは。

続きを読む "ディレクトリ名だけを取得する"

Posted by dT by 22:09 | Comments (0) | TrackBacks (0)

bashプロンプトのカスタマイズ

bashのプロンプト表示をカスタマイズする場合は、シェル変数「PS1」をいじくる。

PS1="[\u@\h \W] \$"

これだけで、「街でよく見るbashプロンプト第1位」に輝くほど見慣れたプロンプトのできあがり。まあ、街でbashなんて見たことありませんが。

変数説明
\uカレントユーザー名
\hホスト名(最初のドットまで)
\Hホスト名(全部)
\w現在のディレクトリへのパス
\W現在のディレクトリ名
\d「Fri May 26」みたいな形式の日付
\thh:MM:ss 形式の時刻(24時間)
\Thh:MM:ss 形式の時刻(12時間)
\n改行
\!コマンドヒストリー番号
\#コマンド番号(ログイン後のコマンド実行回数)
\$UIDが 0 ならば「#」、そうでなければ「$」を表示

こんな感じで色々とプロンプトに埋め込むことができるみたい。あんまりやりすぎると使いにくくなりそうだけど、時刻関係は、実行時間の履歴に使えそうでちょっと便利かも。

Posted by dT by 12:34 | Comments (0) | TrackBacks (0)

ログイン時シェルの変更

FreeBSD は標準シェルが csh なのが気に入りません。

普段 Linux を触っているから、どうしても bash が恋しくなる。「今頃、bash のやつ、どうしてるかな…」なんて星空を見ながら思ったりしないけど、bash が恋しい。そんなわけで、シェルを bash に変更することにした。

あ、bash はインストール済みということで、話が進みます。

続きを読む "ログイン時シェルの変更"

Posted by dT by 03:43 | Comments (0) | TrackBacks (0)

カーネルのバージョンを調べるには

Linux OSのカーネル・バージョンを調べる方法が、いつまで経っても覚えられないので、もうあきらめることにした。

「半年に一度、使うか使わないかの知識なんて、覚えていてもムダだよ。さあ、僕と一緒に踊りませんか?」ということで、ここにメモしておく。とりあえず、左記のセリフの真意は、書いている本人も理解できないので、そっとしておいてください。僕は踊りません。

# cat /proc/version

さらに、もろもろのカーネル情報を知りたい場合は、次のコマンドで、ブート時のメッセージを参照することができる。

# dmesg 

しかし、こうしてエントリを書くと覚えてしまいそうな気がする。気のせいだと思うけど。

Posted by dT by 19:33 | Comments (0) | TrackBacks (0)

mod_rewrite モジュールを使ってみる

Apache へのアクセスをフックして、かなり強力な操作ができる mod_rewrite モジュール。これまでシコシコとアプリケーション側で対応していたものが、サクっとWebサーバが解決してくれる可能性大ですよ、これ。

豊富な機能をざっとながめて思いつくサービスとしては、httpアクセスのSSLへのリダイレクト、サブドメイン管理、リファラ判定などによるコメントスパム対策、ブラウザ判定や時刻によるリダイレクト。ブラウザ判定をうまく使えば、例えばフルフラッシュサイトで、検索エンジンのクローラにだけ別HTMLページを見せてSEO対策することもできそう。(そういう小賢しい対応は好きじゃないけど)

以下、大まかな機能と使い方のメモ。

続きを読む "mod_rewrite モジュールを使ってみる"

Posted by dT by 17:48 | Comments (0) | TrackBacks (0)

Apache に組み込まれているモジュール

現在 Apache に組み込まれているモジュールを確認する方法。

(静的に組み込まれているもの)
# /usr/local/apache/bin/httpd -l
(DSOで動的に組み込まれているもの)
# ls -l /usr/local/apache/modules
(1.3系ならば ls -l /usr/local/apache/libexec)

必要なモジュールがなければ、追加しましょう。

Posted by dT by 16:48 | Comments (0) | TrackBacks (0)

Apache にモジュールを追加する

いろいろなモジュールを組み込むことで、Apache の可能性が広がるっぽいことを知ったので、とりあえず入門としてモジュール追加を実行。今回は、URLを書き換えてムチャできそうな素敵なモジュール mod_rewriteを、まったりと追加してみる。

ちなみに、Apache についてあまりに知らなさすぎて、このエントリを書くのにスゲー時間をかけたのは秘密。業務で必要に迫られたわけもなく、プライベートでも全然使わないのに、なぜそんなに気合い入っているかは自分でも不明。きっと頭おかしくなったんだと思う。ううう。

以下、apache2.0系での手順。1.3系でやり方が大きく違うところだけ、別途記述します。なんでそんなに親切なのか。すごく疑心暗鬼。

続きを読む "Apache にモジュールを追加する"

Posted by dT by 15:40 | Comments (0) | TrackBacks (0)

Apache を知らないのは男の罪

Apache HTTP サーバ (以下 Apache) の多機能性に身もだえ中。

これまでは、恐るおそる conf ファイルを開いて、何となく ExecCGI とかいじるので精一杯だったけど、ちょっと調べたらスゴイ色んな機能であふれている。モジュールまわりとか、何ができるのか押さえておかないと、結構恥ずかしいんじゃないかという気がしてきた。罪なヤツだ。

Webアプリケーションの構築時、要件はアプリケーション側でとにかく実装しなければならないというルールが、いつの間にか自分のなかにできあがっていた。ブラウザでできることなら、全部それで済まそうみたいな。でも、サーバが得意なことは多い。Apache ができることを知っていれば、そもそもアプリの基本設計から変わってくる可能性も高い。

「Apache は tomcat と連携して表示さえしてくれればOK」とか短絡的だった考えをちょっと改め、サーバを使いこなしながら構築することを視野に入れないとなあ。今さらWebDAVとか調べようかな。

ということを書いてみたものの、そこまで画期的なモジュールや機能があるかというと、まだよく分かっていなかったりする。超勢いだけのエントリーで泣ける。

Posted by dT by 15:30 | Comments (0) | TrackBacks (0)

qmail でメールアカウントだけを削除する方法

メールサーバが、Webサーバやファイルサーバなどを兼ねている場合、サーバへのログインはできるけど、メールは利用できない特殊なユーザが必要になることがある。というか、今そういう状況になったんです。ハイ。

MTA に qmail を採用しており、一般的なインストールをしていると、useradd した時点でメールボックスが作成され、そのユーザはメールの利用が可能になる。普段はコレが便利なんだけど、今回に限っては余計なお世話。メールボックスとか、マジ要らねえ。

単純に Maildir