2004年05月12日

Perl の書式

先日 ASP (VBScript) のコーディングをしていると書きましたが、
本日は Perl にて、ログ解析 & 結果のメール送付の Perl スクリプトを書いていました。
書いていたのは、せいぜい 200 Line ぐらいの簡単なものなのですが、
直前まで VBScript を書い (たり読んだりし) ていたために、
言語仕様が頭の中でゴチャゴチャになって、
かーなり時間がかかったのでした。

Perl の場合は文字列比較に eq とか cmp とか使いますが、
VBScript の場合は = (== ですらない) だったり、
Perl の (拡張) 正規表現の扱いが一瞬わからなくなったり
( =~ s/^hoge(.*)$/$1/ とかです)
関数を使うべきなのか演算子なのかもぐちゃぐちゃになって、
大変苦労しました。
どちらも中途半端なレベルなのが問題です・・・(汗)

個人的には Perl が超便利でお薦めですが、
Windows の技術者として VBScript も捨てがたいという、
微妙な状況です。
とりあえず、明日からはまた VBScript ですが、
果たしてゴチャゴチャ感は解消されるのか、乞うご期待です。

Posted by k-square : 23:50 | Linux/UNIX | コメント (0)

2004年05月27日

perl もいいけど・・・。

やっと perl をそこそこ利用できる (決して「使える」ではありません)
ようになってきました。
perl はとってもとっても便利です。
ですが、やっぱりこれはプログラム言語です。
ある程度完成されたロジックを実行するのに向いたものだと思います。
テキストデータをインタラクティブに扱うには、perl は「悪くない」程度でしかありません。
人がデータを確認しながら修正するにはもうちょっと、インタラクティブ性の
強いツールの方が便利です。

さて、テキストデータを処理する上でもっとも
インタラクティブ性の強いツールといえば、なんでしょう?
すぐに思い浮かばないかもしれませんが、最強は editor だと思います。
聞けば納得でしょ?

じゃぁ、その次にインタラクティブ性の強いツールは?
と聞かれると、私は UNIX/Linux のシェルで使うコマンド群だと思います。
つまり、 sed awk grep uniq sort cat head tail tr などこの辺のコマンド。
単機能 (といえるほど機能は低くありませんが) を一つずつ実行しながら、
実行結果を確認できるうえ、パイプでつなぐことで、
だんだん処理を進行させていくことができる、
という点で大変便利です。

ってわけで、どのようなデータが入っているか、
完全に想定しきれていないテキストデータをいじるには、
通常のコマンドがお薦めです。
実行しながら、結果を逐一確認しやすいですし、便利便利♪

さて、今日はこの便利なコマンド群を使いながら、
UNIX 上で組織改正作業を行っていました。
ディレクトリの情報を更新した上で、
その更新内容を、ディレクトリを利用するサーバ郡に、配布する。
という作業です。
簡単そうに聞こえますけど、
「日次でのバッチ更新機能」というものに問題が起こらないように、
データの整合性に注意しながらの更新ですのでかなり大変です。

どれぐらい大変かというと、5 時間かかるぐらい。(具体的っ!)

謎解きみたいで楽しいことは楽しいんですが、
やっぱり、今日は疲れました。

そして、その作業の中で一つだけ考えることがありました。
"abc" という文字列と "bcd" という文字列両方を含む行 以外
というのはどうやって表現するのが一番楽だと思いますか?

awk '{ if( $0 ~ /abc/ && $0 ~ /bcd/ ){}else{ print $0 } }'
とか、
perl -e 'while( <> ){ if( /abc/ and /bcd/ ){}else{ print; } }'
とかできますが、
( if の論理式を反転させずに、空文をつかって else で処理するのは私の好みです )
個人的には
grep -v abc ファイル名 > tempfile
grep abc ファイル名 | grep -v bcd >> tempfile
なんかが楽で好きかも知れません。 (データ順序に対してルーズな場合のみ)

なんか、ほかにかっこいいほう方があったら、
コメントでぜひ教えてください♪

Posted by k-square : 21:17 | Linux/UNIX | コメント (0)

2004年06月09日

shell script

#!/bin/sh
から始まればそのファイルはシェルスクリプトです。
(インタプリタが shell であればシェルスクリプトです)
Linux / UNIX を利用する方であればご存知のことでしょう。

さて、このシェルスクリプトですが、
on memory での処理には向きませんが、
十分なスクリプト言語だと思います。
( on memory 処理=全てパイプライン=非現実的 )
そして、かなり強力なのですが、そのかわりかなりの難問がついてまわります。
それは、処理されるデータをコマンドで記述することになるため、
コマンドの能力を知っていることが必要なことと、
データの流れを全て頭の中で想像しないと、
何が起こっているかわからないということです。

さて、ここでやや話は飛びますが、
私は awk スクリプトを使うのが (多少) 得意です。
正規表現も結構使えるほうです。
そういう人がシェルスクリプトを書くと、
かなり強力にいろいろ記述できて便利なのですが、
自分でも読むのが面倒なスクリプトができます。
(コメント行あわせて 1000Line とかは結構普通にあります)

そうなってくると、入り組んだスクリプトは
読むことが苦痛でしかないようなスクリプトになってきます。
# というか、私自身でさえ読むことが苦痛です (笑)

さて、こういうスクリプトって、誰に引き継げば良いと思いますか?
仕様書は書いてありますが、
仕様書があっても、今のところ変更できる人がいないと思うんです・・・。
う〜〜ん。
どうしよう?
だれか、何とかする方法を教えてください・・・。
私がいなくなっても、対応をできるようにするのが望ましいのですが、
いい方法が思い浮かびません。
"銀の弾丸" が無いのは納得ですが、何か良い案はありませんでしょうか・・・。

Posted by k-square : 22:09 | Linux/UNIX | コメント (1)

2004年06月25日

メールは Linux / UNIX に分類する?

今日は久々に技術的なことを書いてみます(笑)
これでも一応 SE なので・・・。

みなさんパソコンでメールをご利用になっている方が
大半だと思いますが、メールのエンコーディングについてのことを
多少なりともご存知の方はほとんどいないものと思います。
MUA (メーラのこと) を使ってると、メールのエンコーディングのこととか、
全く意識しなくていいので、知らなくて当然です。
そのため、まずはメールの (日本語の) エンコーディングについて多少の解説。

  • Subject や From などのヘッダ部分の日本語は MIME エンコーディングを行う

  • MIME エンコード後の連続する white space (半角スペース , タブ , 改行) は
    ただの区切りの文字列とされ、半角スペースとはみなされない

  • メール本文は JIS (7bit)

がとりあえず基本です。
(かなりはしょってますし添付ファイルはとりあえず無視してます)

Linux / UNIX から sendmail とか SMTP でメールを送ろうとする人は、
避けて通れない道なので、とりあえずこれは覚えておいてください。
その上で考えることなのですが、
MUA ってこれを当然のように正しく処理してほしいですよね?
ね?ね?
でも処理できない MUA がウチの会社にははびこってます。

White Space のエンコードもデコードも「自分仕様」だし、何とかしてください。
MUA の問題なのに途中のゲートウェイ
(メールゲートウェイのこと。ウィルスチェックとかやってます)
がおかしいんじゃないかとか、
サーバで何かの処理を入れてるんじゃないかと疑われて大変困ります (-_-#
なんていうメーラかはナイショですが、N の人はわかります(笑)

「ほんとに〜?」なんて疑っちゃだめですよ!
わざわざ ethereal でパケットキャプチャして、
raw データから送ってるデータを再生成してソースをみたんですから!
そして、愕然とした私・・・。
もしかして私が間違ってるのかと思って、RFC 探して読んだぐらいなんですから・・・

Posted by k-square : 23:13 | Linux/UNIX | コメント (0)

実例

ガーーン。
なんか書き終わった文書が movable type のエラーで全部消えました。
超ショック。
かなり詳しく MIME エンコードのことを書いたのに!!!
あーあ。やる気失います・・・。
ってわけで、MIME エンコードの解説はなくなりました。
ゴメンね〜☆
その代わり、シェルスクリプトとかの実例はっときますので許して!

シェルスクリプトならこんな感じ?
前使ったソースから抜き出したのでパイプラインじゃないけど、
やるべきことは伝わりますよね?

#!/bin/sh
TO='dev-null-to@yotta-zetta.com'
CC='dev-null-cc@yotta-zetta.com'
FROM='dev-null-from@yotta-zetta.com'
SENDMAIL='/usr/bin/nkf -E -j -m0 | /usr/sbin/sendmail -t -i -f '"$FROM"
awk '
BEGIN{
printf( "From: '"$FROM"'\n" ) | "'"$SENDMAIL"'"
printf( "To: '"$TO"'\n" ) | "'"$SENDMAIL"'"
printf( "Cc: '"$CC"'\n" ) | "'"$SENDMAIL"'"
# サブジェクトでぇす えへ。
printf( "Subject: =?ISO-2022-JP?B?GyRCJTUlViU4JSclLyVIJEckJyQ5GyhCIBskQiQoJFghIxsoQg==?=\n" \
"MIME-Version: 1.0\n" \
"Content-Type: text/plain; charset=\"ISO-2022-JP\"\n" \
"Content-Transfer-Encoding: 7bit\n\n\n" ) | "'"$SENDMAIL"'"
printf( "ここからが本文だよー\n" \
"echo で同じことするなら、cat とかで流し込むのもいいかもねー\n\n" ) | "'"$SENDMAIL"'"
# close したときに初めてパイプが閉じられて、メールが送られる。
close( "'"$SENDMAIL"'" )
}
' /dev/null

Posted by k-square : 23:57 | Linux/UNIX | コメント (0)

2004年06月29日

CSV

最近、SE よりの話をあんまり書いていない気がします。
仕事のことって、既になんか普通になってて、
取り立てて強く思わないんですよねー。
熱意が薄れちゃったのかなぁ?
その割には転職しようとしてるし、一体何なんでしょね?
ってわけで、たまには技術的なことを。

皆さんは csv ファイルをご存知でしょうか?
csv=comma separated value
の名前どおり "," をフィールドセパレータにした、テキストファイルです。
通常の場合は
awk -F, '{ほげほげ〜}' csvファイル
とかでフィールドを分けて処理できるのですが、コレではうまくいかない場合があります。
それは、csv ファイルの任意のフィールドの中に "," (カンマ) の文字が入っている場合です。

たとえばこんな感じです↓
"だいいちふぃーるど","第2フィールド","AT,フィールド"

コレは本来 3 つのフィールドですが、
前述のような書き方で awk で処理するとフィールドが 4 つとして処理されます。
というわけで、この不具合を避けるため、ダブルクォートの処理を考える必要がありますが、
この場合はダブルクォートの中のダブルクォートの処理はどうなるのかという、
問題が出てきます (普通に考えればエスケープシーケンス使います)
以上の注意点をわかってるのでちゃんとコーディングすれば、
処理で問題は起きないんですが、これが面倒だってことが問題です。

シェルスクリプトで処理するには面倒です・・・。
誰か助けて。
シェルスクリプトで csv を処理してる人、どうぞコード例貼ってください m(_ _)m
あーあー。素直に perl に逃げようかなぁ・・・

追記 2004/07/01 21:40
ごめんなさい。一つ間違いがありました。
ダブルクォートの中のダブルクォートはダブルクォート二つで表現するそうです。
(エスケープシーケンスじゃないようです)
つまり、「日本語ニホンコ"nihongo」 (ゴじゃなくコ" です) が CSV の
中の 2 番目のフィールドに現れた場合は以下のような CSV になります。

"だいいちふぃーるど","日本語ニホンコ""nihongo","AT,フィールド"

人に指摘される前に、間違いがわかってよかったぁ♪

Posted by k-square : 22:31 | Linux/UNIX | コメント (0)

2004年07月01日

大丈夫? → 仕様をだすだけ

とうとう転職
「一つだけ私にしかできない、大きなことがあるのでそれを最後の花にして去ります(笑)」
と書きましたが、この作業の中で CSV に関する作業があります。
自分でも「結構複雑ぅ〜」と処理の内容をあらかじめ想像しながら、
「コードを書く集中力」をためる必要があるレベルのものだったのですが、
コレをほかの人が書くことになりました。
私が転職しちゃうので、ほかの人にノウハウを貯めたいんだそうです。
その考え自体は OK だけれど、大丈夫なのかなぁ〜?

というわけで、私は仕様を書くだけになりました。
仕様を書くだけでいいなら書くけど、その実装に必要な注意事項とかわかるのかな〜?
「CSV ファイル A と B があり、A だけにユーザが存在すれば登録し、A と B 両方に存在すれば
ユーザを削除し、削除は 7 日間猶予する。削除猶予期間中に A または B からユーザが
居なくなれば削除はキャンセルする」
これを読んで

  • CSV の注意事項

  • 削除猶予の方法

  • キャンセルの方法

  • キャンセル後の削除猶予状態への再移行

などの注意事項を思い浮かべられるんでしょうか?
そして、それをシェルスクリプト or perl で記述できるコーディング力があるんでしょうか?
はぁ、怖いよぉ〜。大丈夫かなぁ〜?
でも、私は実務じゃないし、居なくなるし(笑)、まぁ、いっかな〜?
私もそれなりにお手伝いするけど、実際に書く人、がんばってね!

さて、コーディングが他の人になる、ということが決まる前に、
perl での CSV の処理についていい URL を見つけましたので、ココで紹介します。
CSV形式の行から値のリストを取り出す
意地で説明を読まずに、コードからだけ読み取ることを試し、
結構時間がかかりましたが、一応理解しました。

コレって正規表現というよりは正規表現を積極的に利用した perl 特有の処理方法です。
コレを素直に思い浮かべられた人こそ、まさに perler の名を冠するにふさわしい人物だと思います。
, (カンマ) の処理の違いを明確に理解できてる人じゃないと、
絶対「あれ?なんで?」って思うはずです (私もコッチのタイプ)

でも、こういうのを実現できる perl は、「すごい」という感想以外の何も浮かびません。
もっともっと使いこなしたいよ〜!!
私もまだまだです。まだまだがんばります。
転職はステップアップの手段。もっともっと上を見なきゃねっ!

Posted by k-square : 23:58 | Linux/UNIX | コメント (0)

2004年07月02日

これも手順書が居るの?

引き続き転職に向けて、引き継ぎ資料の作成と、
説明を行っています。
その中でちょっと愕然としたのが、UNIX (HP-UX) にユーザの作成方法の
手順を書いてほしいというものでした。
ガガーーーーン。
超ショック。

useradd + passwd の手順をドキュメントに記述したところ、
それを読んで、 passwd が必須なのはなんで?と問われ、
パスワードを設定するまでログインできないアカウントですよー。
と応えたところ納得してもらえない様子・・・
最終的にはそういうもんだと思ったみたいなんですけど・・・。

なんなの?
全てを記述させようとする雰囲気は!!?
やめてよー。
マニュアルのマニュアルとか書くのはやだよぉ。
cron の設定の仕方とかも記述させようとするしぃ・・・
man 5 crontab , man crontab と回答しましたけど・・・。

見積もりは甘かったです・・・。
とってもとっても終わらない気がしてきました。
あぁ、、、。
でもがんばります。私の輝ける未来のために(前を向いてみた)

全然関係ないけど、この辺を読んで
今までの私の苦労がだんだんわかりそうな感じでしょ?(笑)

Posted by k-square : 22:56 | Linux/UNIX | コメント (2)

2004年07月27日

暇ぁ〜。

転職前で大して仕事もないのに、出社させられてます。
そういうわけで、会社に行っても何もすることが無く、
メッセンジャーで話し掛けて、友達の仕事を邪魔してます。
↑ かなりダメ人物(笑)

で、あまりに暇なので、仕方なく仕事をすることにしました。
どうせだから普段あんまりやら無いことってことで、
Cygwin 関連の処理をすることにしました。

syslog-ng のバージョンが大分新しくなっているので、
新しいバージョンが Cygwin で make できるように、情報を新しくしてみます。
Cygwin には resolv.h などのヘッダファイルが無いため、
make できなかったりする source が結構あり、
syslog-ng もそういう source のうちの一つですので、
その辺の対応の仕方を書きたいなぁと思ってます。

暇が続けば、ドキュメントが出来上がりますので、
もうちょっと待っててくださいね☆

Posted by k-square : 00:55 | Linux/UNIX | コメント (0)

2004年08月03日

結局私がやるんじゃん・・・。

あー。なんかむかつくというかうんざりというか。
大丈夫? → 仕様をだすだけ
で書いたとおり、私が転職前にやろうとしたことについて、
仕様をだすだけにして、後に残る人たちがそれを実際に作るってことに、
予定ではなってました。
で、まぁ、私もなるべく教えられるように、
すること無いのに会社に出てきていてあげたのに、
けーっきょく作り上げることが出来ないってことになりました。

元々納期は 7 月いっぱいで、
私なら 3 日間ぐらいでつくれるだろうから、まぁ大丈夫かな〜と
考えていたのですが、甘い甘い。大甘でした。
8 月 2 日の時点で私の作った評価項目さえ終えられず、
ソースの評価と、評価用データの作成を私に頼んでくる始末。
で、評価してみたら、まともに動かないという代物。

なにこれ?
変なところに発注した結果と全くいっしょじゃん。
ありえない・・・。
っていうか、マネージメントがあなたの仕事でしょ?
ぜんぜんマネージメントできてないじゃん。
間に合うように、途中で私に作らせるとかしないとだめじゃん・・・。
まぁ、自分で決めたことなんだし、私はいなくなるし、いいけど・・・。

で、評価が仕事だと思ってたので、「動きませんよー」
という評価報告で終わろうとしたら、
「デバッグまでがキミの仕事」
のようなことを平然と言ってのける始末。
怒りを抑えるためにちょっと無言になりました。
だいたい見るに耐えないようなソースを読んで、
簡単なところを修正してあげただけでも好意的なのに、
そこまでやって上げられるわけないでしょっ!
だいたいもっときれいに書きなさいよ。バカチンがっ!(感情的)

・・・なんて事は一言も言わず、新しいのを作るのはやめて、
過去にあるスクリプトを組み合わせて、
動くようにすることを提案し、うまいこと丸め込みました。
最初から私に作らせてれば、きれいに全てうまくいってたのに・・・。
はーぁ。だめだこの人 (会社) は・・・。
こういう人に反省を促すためにも、
本来なら絶対手出しせずにいたい所なのですが、
そうするときっと間違いなくうざいので、さらっと作ることにしました。


というわけで、5 時間程度かけて作り終えて、深夜に帰宅しました。
この 5 時間の中でほかの人が作ったスクリプトの
効率化 (実行時間 5 分程度 → 1 分強) もやってあげてるし、
もう十分以上に仕事はしたと思います。
もーぅ、文句言わせないからね。
休暇もとってやるぅ!

Posted by k-square : 03:28 | Linux/UNIX | コメント (0)

2004年08月25日

ssh-agent

ssh-agent のことを今まで誤解して理解していました。
ssh-agent はパスフレーズの入力無く、ssh を利用するためのもので (ここまでは正解)
スクリプトなどを使った通信のときに使うためのものだと思っていました (やや誤解)
ですが、実際は、公開カギ認証の ssh を利用する際に、
複数回のパスフレーズの入力を必要とせずに使うためのものでした。
これは大変便利です。

そして、さらに重要な機能があり、
私にとってはこれが ssh-agent を利用する目的だといっても過言ではありません。
それは認証転送機能。

あるサーバ A を踏み台にして他のサーバ B に ssh でアクセスするというとき、
通常ならば、クライアントにも A のサーバにも秘密カギを置いておかなければなりません。
A のサーバの root を複数名で使えるとき、
これでは 「暗号化路で保護されている」 という機能しか ssh は提供できません。
(複数名が A の root になりうるなら個人の秘密カギを複数名が利用できるということに他ならないため)
もちろん、パスフレーズで秘密カギが保護されては居ますが、
それ以外の保護がなくなってしまうため、
セキュリティ的 (というよりはプライバシー的に?) にはかなり好ましくありません。

それを考えて、私は 「ヤダなー」 と思って、
まわりの人に聞いてみた結果 ssh-agent を知ったわけです。
ssh-agent に ssh (クライアント) の認証転送機能を用いることで、
クライアントだけに秘密カギをおいて、A には秘密カギを置かなくてもいいという
機能があることがわかりました!!
これはステキです。
ssh (クライアント) の設定で認証転送機能が有効にされていないといけませんが
(OpenSSH のデフォルトでは無効でした)
それだけでオッケーです。
ssh の踏み台を使う人は既にご存知の人も多いとは思いますが、
ぜひともご利用ください☆
詳しい話は ↓ この辺が参考になると思います。
http://www-6.ibm.com/jp/developerworks/linux/020426/j_l-keyc3.html

使い方は
$ ssh-agent
$ ssh-add
$ ssh -A -2 サーバ
って感じです。
ssh には -A オプションを忘れないでくださいね。
( /etc/ssh_config に設定してもオッケーです)

ちょっと賢くなった今日でした♪

Posted by k-square : 22:41 | Linux/UNIX | コメント (0)

2004年09月14日

tcsh

私が Linux / UNIX で最初に使ったシェルは bash (B shell 系) でした。
bash をはじめて使ったおかげで、B shell 系の shell script の書き方や、
環境変数の書き方に普通になじむことが出来たのですが、
その代わりに、csh 系の使い方がわからない人になってしまいました。
特に環境変数の設定や shell 変数の設定がわからなくて、
ずっと苦手意識をもっていました。

そして、そんな私の新しい職場はサーバ OS のほとんどが Solaris (SunOS) で、
デフォルト shell が tcsh です (csh 系)
しかーも、サーバによっては bash 自体が入ってません (T_T)
というわけで、利用できないものは仕方ないので、
仕方なく思いつつも積極的に tcsh を勉強することにしました・・・。

現在、会社に入って約 1 ヶ月。
history からの inline 置換実行機能はまだ使いこなせませんが、
tcsh の環境設定と、補完機能を使う分には特に問題なくなりました。
それもこれも、丹念な .cshrc を書いたおかげ(笑)
プロンプトも今まで使っていた bash そっくりにしてあります。
こうなってくると complete とかで補完対象を設定できる tcsh は bash よりも便利に
感じられるようになってきます。

そして、 bash と tcsh が区別無くつかえるようになったころ、
ワナが訪れるという仕掛けです。
# マーフィーの法則ですね・・・ (-_-;;
かかったワナは csh 系では inline での shell script が書けないというもの。

私は shell のコマンドラインで
$ for i in $( find ./ -type f -print )
> do
> basename=$( basename $i )
> mv $i /tmp/$basename
> done
なんてことを普通に書いたりしてたのですが、
これが使えないんです。
しかも、ほとんど無意識に書くので、
tcsh 上で書いて、改行を入れた瞬間にエラーが返ってくる
というのが何度もあります。 (サルでごめんなさい)

あぁー、tcsh でこの辺ってうまいやり方無いのかなー?
今はそのときだけ /bin/sh を起動してその上で書いてます。
(まさに inline shell script )
きっと明日からもサルで inline shell script を書いちゃうとは思いますが、
少しずつそれが減るように (謙虚?) 気をつけていきたいところです。

さぁー、あしたもがんばろー。

Posted by k-square : 23:59 | Linux/UNIX | コメント (2)

2004年09月15日

tcsh その弐

http://www.yotta-zetta.com/k-square/movabletype/archives/000102.html
↑ こちらでも書いた tcsh のワナ、に今日もかかりました。
今日のワナはいままでとはちょっと違ってます。

まず最初は
「tcsh では ' (シングルクォート) で囲まれてても変数展開が行われる」
というワナにかかりました。

sed 's/ABC/def'

っていうのは普通に使いますよね?
では、ディレクトリマップを置換するときはどうしますか?

sed 's/\/usr\/local/\/usr/g'

とかって書きますか?
これは読みにくすぎなので、セパレータに ! (エクスクラメーションマーク=ビックリマーク) を
使おうとして

sed 's!/usr/local!/usr!g'

こう書いたら bash とか /bin/sh とかでは実行できますが tcsh ではエラーが出ます。
あれー?と思って調べてみると ! が変数展開されてました (-_-;;
そして、さらに、タブとスペースを置換しようと思って ( タブを TAB で表記します)

sed 's/[ TAB]*//g'

と書いたのにタブがタブとして認識されず、
正常に入力できません。
^V (Ctrl + V) をいれて制御コードにしないと入りません。
あーーーーーーー。
むかつくむかつくむかつく。

私の場合 root での作業で間違いを防ぐために、
editor にコマンドを先に書いておいて、
コピペして一般 user での実行の成功を確認した後、
コピペで root で実際に実行する、というようなことをやるんですが、
# それだけ複雑なこと (パイプ 5 段ぐらいは普通です) をするってことで・・・
それが、コピペでは出来ないってことになります。
はぁ〜〜〜(ため息)

csh 系は インタラクティブな入力には向いてますが、
機械的なのには向いてないというのを、心より実感しました。
結局そういう時は /bin/sh を立ち上げてたり・・・。
今の私の心のよりどころは /bin/sh がどんな UNIX/Linux 系 OS にも入っていることです・・・。

Posted by k-square : 23:51 | Linux/UNIX | コメント (0)

2004年10月07日

Linux をつかう Windows 使い?

以前の会社は SIer に近いものの、
アプリケーションの開発がメインの会社でしたが、
(私の業務自体は情報システム部)
今度の会社はネットワーク回線業者 (つまりは法人向け一次プロバイダ)
なので、業務内容とプラットホーム環境が大幅に違います。

前者ではアプリケーションのプラットホームは Windows がかなり多いため、
(当然 UNIX のプラットホームもありますが、大規模案件に多いため数自体は少なめ)
Windows の技術者も安泰な感じですが、
後者では Network は動いてるのが当然と思われがちのため、
その考え方をベースにして、UNIX/Linux が主体のプラットホームです。
(再起動の必要な Windows は使い物にならない)

さて、ワタクシ、Linux/UNIX も一応一人前につかえますが、
主体を Windows においた技術者です。
そういう人が新しい会社に居ないためか、Windows の仕事は
基本的に全て担当できそうで、仕事自体は安泰ではあるのですが、
環境が厳しすぎます。

なんと言っても、Linux/UNIX のコマンドラインでできることを
主体に会社の環境が構成されている上、かなり restrict (制限が厳しい) なので
Windows の標準環境ではなに一つできません。
(接続方法は公開鍵認証の ssh のみとか普通です・・・)
それに気づいたため、他のアプリケーションはおいて置いても、
Cygwin をインストールして、当座は何とかしのぎ、
少しずつ環境が出来上がりつつありますが、今でも結構大変です。

Windows は Linux や UNIX 見たいに何でも標準コマンドでできる
環境じゃないんだってば!
Windows はそのためのソフトウェアを入れないといけないのっ!!!
コッチは環境を作るところからやらないといけないから、
最初は少し時間がかかるんだから、大目に見てよー。
はぁ。
なんとなく、今の会社に居ると、
会社で Linux をデスクトップを使ったほうがよさそうな気がしてきました(笑)
が、そうなると Windows の技術が薄れそうなので、
何とかこのまま頑張ってみます。

でもでも、いつのまにか Linux 使いになってても、みんな、笑わないでね?

Posted by k-square : 21:46 | Linux/UNIX | コメント (0)

2004年10月13日

.cshrc

.cshrc は csh 系のコンフィグファイルです。
csh 使いの方で知らない人は居ないことでしょう。
では実際に .cshrc をどれほどいじりますか?
私は昔から設定マニア的なところがあって(笑)
便利になるようにかなり細かく設定します。

その中で私のおすすめ設定を一つ。
root とそれ以外のユーザのときでは背景色を変えるというものです。
color が有効になるターミナルなら、かなり一目瞭然でお薦めです。

if ($uid == 0) then
set prompt='%{\e[30;47m\e]2;[%n@%m] %~\a\n\e[34;47m[%n@%m] %~\e[30;47m\n%}$ '
else
set prompt='%{\e[37;40m\e]2;[%n@%m] %~\a\n\e[32;40m[%n@%m] %~\e[37;40m\n%}$ '
endif

color の有効なターミナルの設定がわかる人は、
お分かりだと思いますが、
背景が黒なら一般ユーザで背景が白なら root です。
そして、元々が bash 使いなので、プロンプトが '$' で bash 的です(笑)
% と # 好きな人は $ のところを変更して実験してみてください。
おすすめです。
ちなみに、Window タイトルも設定されますのでわかりやすくて便利ですよー☆

Posted by k-square : 23:03 | Linux/UNIX | コメント (0)

2004年11月16日

crontab

初めて知りました。
crontab で空行がつかえないなんて。

いままで hp-ux , Linux , Cygwin を使っていましたが、
これらでは crontab の空行は評価されなかったと記憶しています。
これって覚え間違いじゃないですよね?
でも solaris では error になってしまうのね。
ガーーン。

最初 crontab で編集するたびに error メールが飛んできて、
crontab を確認しても、なぜか理由がわからなかったのですが、
まさか、こんなことが原因だとは・・・。

solaris で crontab に空行は禁物です。
syslog のコンフィグは tab 区切りです。(ついでに)
みなさんも覚えておきましょう☆

Posted by k-square : 22:31 | Linux/UNIX | コメント (0)

2005年02月08日

Solaris のなぞ

Linux/UNIX 使いの人は同意してくれるとおもいますが、
ログインしているユーザと別のユーザ権限で実行ファイルを実行したいときには、
su か sudo を使うことになります。
ところが、それを、Solaris で実施しようとするとできなかったり・・・。

su - user -c "command option"

という感じで実行しても実行されないので、
「なんでやねんっ!!」
とおもって

su - user

を実施してみてわかりました。
switch user ができません。
おそらく pam.conf なんかが関連してるのかなーとかおもってみましたが、
とりあえず、調査する暇もないので、
root で実施して chown , chgrp でお茶を濁しました。

Solaris (Sparc系) はハードウェアも OS も同じメーカが設計しているため、
何でもできていいのはオッケーなんですが、
Linux にない機能もあって、困惑することも多いです。
Solaris 使いの人は「Linux にはこんな機能ないだろ?」
とかおもうのかもしれませんけど、Linux 使いの人から見てみると、
「んな機能しらねーよ」とおもってみたり。
# なんか人格違いますけど気にしないでください(笑)
単純に勉強不足なので、どうしようかなー。
今の段階でも Solaris とか普通の管理者としては十分だとおもうのよね・・・。
経験がないことによる知識不足以外には多分足りないものはないとおもいます。
(かなり大きく出てみました(笑))

全然関係ないですが、とりあえず、
Linux/Solaris/Windows が使えてしまうと何でも屋にされてしまうというワナにかかります。
そして、それはおいしくないという二重のワナ。
スーパーサブは便利なんだから、それなりに優遇してくれなきゃー。
# というか私は Windows の技術者ですってば。

そして、最近も知人に別の会社に誘われました。
データセンターでの勤務経験があって、一人で70台以上のサーバをファイブ9システムで設計/運用した経験があって、
日本系企業と、外資の両方の勤務経験があり、
自律ネットワーク (OSPFとか) 以外についてはネットワーク設計についてまで理解できる人、
と言うととってもおいしく見えますから、お誘いだけは多々あります。
# 自分で書いてるのにまるで他人事に見えます(笑)
今のところ転職のつもりはないですが、
結構金額で心動く人なので (現実主義者) リスクに見合った金額であれば、
ぜひ転職させていただきますのでよろしくね☆

Posted by k-square : 02:09 | Linux/UNIX | コメント (0)

2005年08月04日

ntp の時刻合わせ

Internet Server を管理するような人で、ntp を利用していない人はいないことでしょう。
私の管理化の全てのサーバが ntp による時刻あわせを行ってます。
さて、この ntp での時刻合わせですが、ソフトウェアとしては、
xntpd か Windows Time かが標準だと思います。
(前者が Linux/Unix 系、後者が Windows 系)

私は Windows の技術者なので、後者については特に何の問題もありません。
前者についても特に難しい設定は無いので問題はないはずだったのですが・・・。
なぜか時刻の合っていない Linux サーバを発見したところから、謎がはじまります。

そのサーバは RedHat Enterprise Server 3.0 でした。(確か)
サーバには当然のように xntpd が入っており動作していました。
でも、なぜか時刻はずれています。
こういう場合はとりあえず ntpq で状況をみますよね?
すると複数のサーバがリストアップされていますが、
どれとも時刻合わせを行っていない状況が表示されます。

まぁ、大体においてこういう場合はパケットフィルタが原因のことが多いので、
iptables -L -n -v とかでフィルタルールを確認しても、
何の問題もありません。
あれれれーーー???
# ちなみに /etc/init.d/ntp start のときに自動で port を開けてくれるようです。
いまだに原因がわかってません。

うーんうーん。
とりあえず、date --set=" 時刻 " で時刻合わせしましたが、
(時刻は遅れていたので、ジャンプする分には問題ない)
原因がわかりません。
明日また調べてみます。。。
うーーーぅん。

-- 追記 23:09 --
えーっと、 drift ファイルを初期化 (cp /dev/null drift) したところ、
どうやら ntpq で時刻調整に入ったらしきことが確認できました。
drift ファイルって、今まで意識したことなかったんだけどなぁ・・・。
状況が好転したら、また追記で書き込みまーす。

-- 追記 23:30 --
無事に xntpd による時刻あわせができるようになりました。
ところで ntpq -p によるサマリと、ntpq を起動した後に peers を
実行したときの結果が微妙に違います。
UNIX で実行したときはいっしょなのに、Linux で実行すると違うんです。
多分、xntpd のバージョン違いによるものだと思うけれど・・・。
(peers での結果よりも ntpq -p での結果の方が情報がすくない)
おかげで peer してないのかと思ってはまりかけたのはナイショです。
ビミョーにコマンド結果が違うのはちょっと。。。。
# ある程度以上突っ込んだ内容では、はまりやすくていやな感じです。。。。

-- 追記 25:16 --
ごめんなさい。一つ前の追記はうそかいてます。
ntpq -p と ntpq のインタラクティブモードでの peers は全く同じ結果を表示します。
単に実行時期がたまたまずれたから、違っているように見えただけのようです。
ntpd が安定するまで予想以上に時間がかかったために、
私が誤解してしまったようです。
ってことで、ただの勘違いでした・・・。
(要は ntpq -p でオッケーよってことね。)

-- 追記 26:00 --
有用なドキュメントを探すのに手間取りました。
http://www.asahi-net.or.jp/~aa4t-nngk/ntpd.html
http://opt-1.matsc.kyutech.ac.jp/xntpd.html
後者の方が詳しく、前者の方が読みやすいです。
ファイアウォールだけではなく、restrict 設定したい人は是非読んでみて下さい。

Posted by k-square : 22:54 | Linux/UNIX | コメント (0)

2005年08月29日

auto negotiation

ネットワークの関係の仕事をしたことのある人は、
LAN の接続のときに、Auto Negotiation で問題が起こることがあることをご存知だと思います。
もちろん、そういう時は media type (であってるかな?) を固定して、
100M full , 10M half などを設定するわけですが、
具体的にサーバではどこで設定するのでしょう?

Windows のばあいは、
デバイスマネージャで NIC を選んで、[プロパティ]-[詳細設定]タブの
Media Type で設定できます。

コレは Windows のことですので当然知ってます。
では、Linux ではどうやるのでしょう?
知らなかったので、調べてみました。
とりあえず、コマンドでは、

ethtool -s eth0 autoneg off speed 100 duplex full

な感じ。
でも、このままだと OS のリブート時にまた auto negotiation されてしまうので、
ifcfg-eth0 にも設定を行います。

[root@server] ~
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR="192.168.xx.yy"
NETMASK="255.255.255.0"
NETWORK="192.168.xx.254"
HWADDR=aa:bb:cc:dd:ee:ff
TYPE='Ethernet'
USERCTL='no'
ETHTOOL_OPTS="autoneg off speed 100 duplex full"

こんな感じ。
とはいっても、これはディストリビューションに依存するので、
各自調査してから使ってくださいね☆
ちなみに関連 URL は ↓ なので参考にどうぞ
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/610netchk.html
http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ja/ref-guide/s1-networkscripts-interfaces.html

Posted by k-square : 20:02 | Linux/UNIX | コメント (0)

2005年09月08日

メールサーバ

メールサーバを気楽に立てる人がいますが、
たいていの人に問題なくメールを送れるようにするには、
結構ちゃんと意識して作らないといけません。
昔はオープンリレーな MTA であっても普通に送れたようですが、
現在はそうはいきません。
最近の spam 対策手法で以下のようなものがあるからです。

1. MTA のブラックリスト
2. 逆引きできないホストからの受信拒否
3. 逆引き結果がクライアントっぽいアドレスからの受信拒否
4. ホワイトリストにのっていないホストからの受信拒否
5. ブラックリストにもホワイトリストにものっていないホストからの受信の再試行確認

というわけで、きちんとメールの送れる MTA にするには、

1. MTA 利用者が spam が送れないように制御する
2. 逆引き/正引き/MXを正しく登録する
3. FQDN は mail や smtp などの文字列を含ませる。
それができない場合は、smarthost などを利用することを考慮する。
4. 自立 MTA で拒否されたメールを上流の MTA を利用して送信されるような設定を入れておく。
5. 再試行回数を短くしすぎないようにする (デフォルト値推奨)

ということをする必要があります。
特にケータイ宛てのメールについては、全て上流の MTA を
利用して送信されるように構成することをおすすめします。
ケータイのキャリアで拒否されるからという理由が主ですが、
プロバイダによっては、
hi-hoが「ポート25ブロッキング」を実施,携帯電話ユーザーへの迷惑メールを遮断
のような対策がある場合があるからです。


また、追加での注意点として、

1. From 詐称によるメールを Virus がばら撒いたりする
2. エラーメールによる攻撃をするために、From を詐称したメールを送信する
3. 同時に負荷をあげる攻撃のために容量のそこそこのファイルを添付する

ことがあるため、MTA のエラーメールに対して以下のような対策をすることをおすすめします。

1. 送信できなかったメールのエラーメール自体がエラーになったときは、
そのメールは削除するようにする。(/dev/null に捨てるか、削除スクリプトを cron でまわす)
2. エラーメールには元のメールを添付しない (ヘッダ情報をつけるぐらいにする)
3. 同一 IP からの接続回数が多い場合は、その接続を受け付けないようにする
(可能な場合のみ。難しいと思いますので。)


既に長いこと MTA を立てている人は問題ない場合が多いですが、
新たに MTA をたてたりするときは、気をつけるようにしてください。
いくつかのサーバは ident などでアクセスすることもあるので、
タイムアウトまでの時間 (おおむね 30sec) を浪費しなくていいように、
ident についてのパケットを捨てるのではなく、拒否するようにしましょう。
( drop せず、 reject しましょう)

一部のドメインには送れるから、相手サーバが悪いんだー。
なんていう考え方はとおりませんよ?
アドレスを間違えない限り全てのドメインに送れるように構築しましょうね。
受け取ってくれるドメインが寛大なだけなんですから。
# 何かいまいちな下請けを使ってしまったらしいです。。。

Posted by k-square : 23:15 | Linux/UNIX | コメント (0)

2005年09月15日

.tcshrc

以前 .tcshrc を書いて bash ぽくしてから、便利になったというようなことを書いたと思います。
そろそろ .tcshrc が落ち着いてきたので、ここで公開しようと思います。
かなりマニアックに設定しているので、
クォーティングを区別して利用できる人じゃないと、
理解できないかもしれません(笑)
# B-shell 系と C-shell 系のクォートの挙動が違うことをしってないと厳しいです。。。

が、理解できたときは便利な .tcshrc の参考として利用できるのではないでしょうか?
実際の業務で激しく利用しながら、アップデートを重ねているものなので、
参考にしてみてください☆
「proxy1 か proxy2 を経由しないとどのサーバ/ネットワーク機器にも接続できない」
という環境と考えながら読んでみて下さいね。

ちなみに各 alias の ssh トンネルがどういう用途のためなのかを理解できた人は、
トンネルマスターと呼んであげます。
# さながらクイズのようですけど。。。

それからそれから、このコンフィグは .tcshrc として使っていますが、
.cshrc として読み込んでもつかえますよー♪
# print revision
set hostname=`hostname`
if ("$hostname" == "proxy1"  ||  "$hostname" == "proxy2") then
        sh -c 'echo ".tcshrc rev.38" 1>&2'
endif


# initial setting
setenv USERNAME k-square
setenv HOMEDIR /home/${USERNAME}


# http://www.linux.or.jp/JM/html/tcsh/man1/tcsh.1.html
# default path setting
setenv PATH  /usr/local/bin:/usr/ccs/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/usr/ucb:/bin:/sbin:/usr/X11R6/bin:/usr/X/bin:/usr/openwin/bin:/usr/dt/bin:~/bin:${PATH}
if ( -d /home/k-square/GNU/bin ) then
        setenv PATH /home/k-square/GNU/bin:${PATH}
endif


# basical environmental setting
setenv MANPATH /usr/share/man
setenv PAGER less
setenv EDITOR vi
setenv EXINIT 'set exrc number noautoindent showmode showmatch tabstop=8 backspace=2'
setenv BLOCKSIZE k
umask 022


# additional setting
setenv NPX_PLUGIN_PATH /usr/j2se/j2re1_3_0/plugin/sparc


# cvs setting
if ( -d /opt/repository ) then
        setenv CVSROOT /opt/repository
else
        setenv CVSROOT /var/repository
endif
setenv CVS_ROOT CVS_ROOT


# japanese setting
# http://optik2.mtk.nao.ac.jp/~kawanomo/linux/slackware-9.1/tcsh.html
unsetenv LC_ALL
#setenv LANG ja_JP.eucJP
setenv LANG C
setenv OUTPUT_CHARSET EUC_JP
setenv JLESSCHARSET japanese-euc
set dspmbyte=euc
set dspkanji=euc
unset nokanji


# console setting (color)
# http://www2u.biglobe.ne.jp/~hsaka/tool.html#tcsh_prompt
# printf "\033]2;ssh-tonnel\007"
setenv TERM vt100
if ( "`tty`" == "/dev/console" ) then
        resize
endif
unset autologout
unset noclobber
set nobeep
set symlinks=ignore
set autolist
set filec
set notify
set color
set colorcat
if ( ${?tcsh} ) then
        if ( ${?color} ) then
                if ( "${USER}" == "root" ) then
                        #red background
                        #set prompt='%{\e[1;37;41m\e]2;[%n@%m] %~\a\n\e[0;34;41m[%n@%m] %~\e[1;37;41m\n%}$ '
                        #black background
                        set prompt='%{\e[1;37;40m\e]2;[%n@%m] %~\a\n\e[1;31;40m[%n@%m] %~\e[1;37;40m\n%}$ '
                else
                        set prompt='%{\e[0;37;40m\e]2;[%n@%m] %~\a\n\e[0;33;40m[%n@%m] %~\e[0;37;40m\n%}$ '
                endif
        else
                set prompt='%{\e]2;[%n@%m] %~\a\n[%n@%m] %~\n%}$ '
        endif
else
        # for csh
        set prompt="\
[${USER}@${HOST}] `pwd`\
$ "
endif
set prompt2='> '


# history setting
if ( ${?tcsh} ) then
        set histfile=${HOMEDIR}/.tcsh_history_$user
        set history=(9999 '%Y/%W/%D %T %h %R\n')
        set savehist=(9999 merge)
else
        set histfile=${HOMEDIR}/.csh_history_$user
        set history=9999
        set savehist=9999
endif
touch $histfile
chmod 600 $histfile


# complete setting (only tcsh)
# http://www2u.biglobe.ne.jp/~hsaka/tool.html#tcsh_complete
if ( ${?tcsh} ) then
        set complete=enhance
        set noglob
        complete {cc,gcc,g++}           'c/-[IL]/d/'    \
                                        'n/-c/f:*.c/'   \
                                        'n/*/f:*.[fco]/'

        complete {f77,g77}              'c/-[IL]/d/'    \
                                        'n/-c/f:*.f/'   \
                                        'p/*/f:*.[fco]/'

        complete gzip                   'n/-d/f:*.{gz,Z,tgz,TGZ}/'      \
                                        'n/*/f:^*.{gz,Z,tgz,TGZ}/'
        complete {gunzip,gzcat,zcat}    'n/*/f:*.{gz,Z,tgz,TGZ}/'
        complete com{,press}            'n/*/f:^*.Z/'
        complete unc{,ompress}          'n/*/f:*.Z/'
        complete tar                    'n/{,-}[crtux]*z*f/f:*.{tar.gz,tar.Z,tgz,TGZ}/' \
                                        'n/{,-}[crtux]*f/f:*.tar/'      \
                                        'n/*/f/'

        complete {vi,xvi,m,more}        'n/*/f:^*.{o,a,so,so.*}/'
        complete {jlatex,'tex2*'}       'n/*/f:*.tex/'
        complete {ghostview,'gv*'}      'c/-l/(andscape)/'      \
                                        'n/*/f:*.{ps,eps,pdf}/'
        complete lpr                    'n/*/f:*.{ps,eps}/'
        complete 'ps?*'                 'n/*/f:*.{ps,eps}/'
        complete 'tgif*'                'n/*/f:*.obj/'
        complete {netscape,Mo,Mosaic,lynx,Lynx} \
                                        'n/*/f:*.{htm,html}/'

        complete ps                     'n/-*u/u/'

        complete {,j}{man,whatis}       'n/-M/d/'       \
                                        'n/*/c/'

        complete {which,where}          'p/1/c/'

        complete alias                  'p/1/a/'
        complete unalias                'n/*/a/'
        complete set                    'p/1/s/'
        complete unset                  'n/*/s/'
        complete {set,print}env         'p/1/e/'
        complete unsetenv               'n/*/e/'

        complete {cd,gt,gb,chdir,pushd} 'p/1/d/'        \
                                        'n/-*/d/'
        unset noglob
endif


# alias setting
alias ls 'ls -F'
alias ll 'ls -laF'
if ( "`uname`" == "SunOS" ) then
        if ( -x /home/k-square/GNU/bin/ls ) then
                if ( ${?tcsh} ) then
                        alias ls 'ls-F'
                        alias ll 'ls -laF'
                else
                        if (${?color}) then
                                alias ls 'ls -F --color=auto'
                                alias ll 'ls -laF --color=auto'
                        endif
                endif
        endif
else if ( "`uname`" == "Linux" ) then
        alias ls 'ls -F --color=auto'
        alias ll 'ls -laF --color=auto'
endif
alias h 'history 20'
alias rm '/bin/rm -i'
alias rmf '/bin/rm -rf'


if ("$hostname" == "proxy1"  ||  "$hostname" == "proxy2") then
        # when you connect to proxy use command as below.
        # ssh  -L 65432:127.0.0.1:65432 ${USERNAME}@192.168.1.1;
        # ssh  -L 65432:127.0.0.1:65432 ${USERNAME}@192.168.1.2;

        # personalized alias
        alias cleanup   '/bin/rm -f  `find  '"${HOMEDIR}/trackinglog"' -daystart -name '"${USERNAME}.*"' -type f -mtime +1`'
        alias gnu-dist  "cd ${HOMEDIR}; tar cvf - GNU | ssh \!^ 'chmod 750 ${HOMEDIR}; tar xvf -;'"
        # ssh develop1 'tar cvf - GNU' | tar xvf -
        alias c-mynote  'ssh -L 65432:127.0.0.1:3389 admin@192.168.1.11'
        # sed -e 's/^setenv USERNAME k-square$/setenv USERNAME user01/'  /home/k-square/.tcshrc > /home/user01/.tcshrc

        # network devices
        alias c-l3sw    'ssh -1 ${USERNAME}@192.168.64.1'
        alias c-fw      'ssh -1  netadmin@192.168.64.2'
        alias c-l2sw    'telnet 192.168.64.3'

        # old solaris servers
        alias c-www   'ssh user@192.168.128.1'

        # standard solaris servers
        alias c-host1 'scp -q ~/.tcshrc ${USERNAME}@192.168.128.2:~/ >&/dev/null;    ssh ${USERNAME}@192.168.128.2;'
        
        # windows servers
        alias c-host2 'ssh -L 65432:127.0.0.1:3389 -R 8080:192.168.1.11:8080  admin@192.168.128.3;'

        # linux servers
        alias c-host3 'scp -q ~/.tcshrc ${USERNAME}@192.168.128.4:~/ >&/dev/null; ssh  -R 8080:192.168.1.11:8080  ${USERNAME}@192.168.128.4;'
endif


if ("$hostname" == "develop1"  ||  "$hostname" == "develop2") then
        # development server
        setenv PATH /var/tmp/k-square/development/sparc-sun-solaris2.8/bin:/var/tmp/k-square/development/bin:/usr/local/bin:/usr/ccs/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/usr/ucb:/bin:/sbin:/usr/X11R6/bin:/usr/X/bin:/usr/openwin/bin:/usr/dt/bin:~/bin:${PATH}
        setenv LD_LIBRARY_PATH /var/tmp/k-square/development/sparc-sun-solaris2.8/lib:/var/tmp/k-square/development/lib
        setenv CC 'gcc'
        setenv CFLAGS  '-O2'
        alias ls 'ls -F'
        alias ll 'ls -laF'
endif



if ("$hostname" == "spool1"  ||  "$hostname" == "spool2") then
        # spool server
        setenv PATH ${PATH}:/opt/iplanet/ims/bin/msg/admin/bin:/opt/VRTS/bin
        alias hashdir 'cd  /opt/iplanet/ims/bin/msg/admin/bin; ./hashdir'
        set imtalog="/opt/iplanet/ims/msg-spool/log/imta"
        set poplog="/opt/iplanet/ims/msg-spool/log/pop"
        set maillog="/opt/iplanet/spool/log/spool"
        set maildir="/opt/iplanet/spool/msg-spool/store/partition/primary"
endif


if ("$hostname" == "smtp1"  ||  "$hostname" == "smtp2") then
        # smtp relay server
        set queue="/opt/iplanet/ims/msg-`hostname`/imta/queue/tcp_local"
        set maillog="/var/log/ims/`hostname`"
        set ldaplog="/opt/iplanet/ids/slapd-`hostname`/logs"
endif


##### Memo: Convenient Key-Sequence on csh/tcsh
# Ctrl + c : Kill Current Process on this Terminal Window
# Ctrl + z : Pause Current Process on this Terminal Window
# Ctrl + d : Terminate Current Process on this Terminal Window
# 
# Ctrl + a : Move to Head of Current Commandline
# Ctrl + e : Move to End of Current Commandline
# Ctrl + u : Clear Current Commandline
# Ctrl + l : Clear Terminal Window
Posted by k-square : 23:41 | Linux/UNIX | コメント (0)

2005年09月17日

grep での正規表現

Linux/UNIX を使う人は正規表現をゼヒ知っておいてほしいところです。
逆に知らないと、謎の挙動に悩むことになります。
たとえば grep を使うときに IP アドレスを探そうとしましょう。

grep '192.168.1.0' ほにゃほにゃー

などとやってしまうと、
192.168.110.20 とかも平気で検索に引っかかってきます。
コレは正規表現で '.' (ピリオド=ドット) が任意の一文字に match するから。

とはいっても正規表現はプログラムによって、どこまでサポートされるのかが違いますし、
perl レベルなのか sed レベルなのかでは () (カッコ) の記述方法とかも違います。
というわけで、今回は正規表現を使わない方法について。

grep シリーズの中には fgrep という grep があります。
grep との違いは正規表現が有効か否か。
メールアドレスとか IP アドレスとか正規表現を利用したくないときに便利です。
実際に簡単な例で試してみると、こんな感じ。
# プロンプトは bash ポイですが、tcsh 上の処理です
ちょっと覚えてると大変便利ですよー。

[k-square@server] ~
$ cat > a
b
c
d
e
f
g
^D
[k-square@server] ~
$ fgrep '.' a

[k-square@server] ~
$ echo $status
1

[k-square@server] ~
$ grep '.' a
b
c
d
e
f
g

[k-square@server] ~
$ echo $status
0

Posted by k-square : 21:22 | Linux/UNIX | コメント (0)

2005年09月18日

オプションを使いたくないとき。

grep と fgrep の関係もそうですが、
意外と知らない人が多そうなことをちょっと思い出したので書いてみます。

Linux/UNIX ではオプションとして '-' (ハイフン=ダッシュ) の後に文字列を
入力することで挙動を制御します。
では、たとえばです。
'-g' という文字列を検索したいとき。

grep '-g' ファイル名〜

とかってやると怒られてしまいます。
実際に試して見ましょう。

[k-square@server] ~
$ cat > a
-f
-g
-a
-b
a
b
c
d
^D
[k-square@server] ~
$ grep '-g' a
grep: invalid option -- g
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

これはクォートで閉じても関係なく、 '-' から始まる文字は検索文字列ではなく
オプションとして扱われてしまうからです。
コレを防ぐには、 '--' を前に入れることで対処できます。
'--' はそれ以降にあるものはオプション以外のものとして扱うようになってます。

[k-square@server] ~
$ grep -- '-g' a
-g

この状態でもオプションを入れたいときは '--' の前に入れれば OK です。
こんな感じです。

[k-square@server] ~
$ grep -l -- '-g' a
a

この辺りのコトは、shell script を作る上で、
getopt の挙動を理解するとわかるようになると思います☆
# 普段使うのは getopts ですけどね♪

Posted by k-square : 02:50 | Linux/UNIX | コメント (2)

2005年10月26日

サーバのデバイス

基本的にサーバ屋の人は、サーバ自体のコンソール (ディスプレイ / マウス / キーボード / シリアル) で
直接入力して作業をするということはまれだと思います。
ターミナルサービス , VNC , X Window System , ssh , telnet なりの
リモート管理ツールを利用して設定を行います。
そのため、サーバでの LED の情報などは全く見る機会がありません。
そして、それが罠の始まり。

今日、大容量サーバのバックアップをテープデバイスにとっていました。
あまりに大容量のため、 1 本の SDLT テープ (320GBあります) にとりきれず、
2 本目の SDLT テープを挿入したところ、
「上書き不能メディア」だとエラーがでて、どうしてもバックアップの続きがおこなわれません。
新品の SDLT テープなのに、いったいなぜ・・・。
しかも、そのエラーの度に、テープカートリッジが吐き出されて、
リモートでの管理場所から、実サーバへとテープカートリッジを入れなおしに行くひつようがあり、
往復で 7 分程度かかります。

通常は複数のテープにまたがってバックアップすることはないため、
設定が悪いのだとおもって、いろいろな設定をいじったり、
メディアがおかしいのかと思って、新しいメディアを出してみたり。
所要時間は 60 分を越え、いらだちながら、テープカートリッジを再挿入したときに
LED に気づきます。
あれ?この黄色ランプって最初からついてたっけ?

普段は LED を見る機会がないため、普段のコトはわからないし、
LED を利用することがないため、LED が何の意味かもわからず、
マニュアルを調べて原因がわかりました。

「DLT ドライブのクリーニングを行ってください」

うう・・・。
普段のバックアップ時にクリーニングのエラーがでたら、
原因はすぐ特定できるのに〜〜!
よりによって、普段と違う作業の時にエラーがでたために、
原因究明に時間がかかってしまいました。
そして、デバイスのエラーなら、メディアのエラーじゃなくデバイスのエラーをだしてよぅ。。。

教訓。
たまには LED をみましょう!
(とはいっても、LED を見ること自体が現実的ではないのですが・・・)

Posted by k-square : 00:19 | Windows | コメント (0)

2005年10月27日

いまだに・・・。

いまだに csh / tcsh はつかえないみたいで。。。
標準エラー出力をまとめようとして、

[root@server] /where/am/i
$ truss -f ./command option > /var/tmp/truss-result.txt 2>&1
Ambiguous output redirect.

といわれてしまいました。
あーーーー。私は B-shell 系でしか生きていけなそうです。
うぇーん。。。
# 正しくは truss -f ./command option >& /var/tmp/truss-result.txt

はぁ。。。
そして、今トラブル対応中だったりします。
助けて・・・。
# 処理結果待ち中です。

Posted by k-square : 03:13 | Linux/UNIX | コメント (0)