2007年11月アーカイブ

OSインストール後、真っ先にやる作業は

1) iptablesでパケットフィルタリング
2) 不要サービス停止
3) 不要パッケージ削除

なのだが、どれが不要サービスなのか、ココを見れば一目瞭然。
前回の続き。今度は、ブラウザで表示できるようにしてみた。

sh-3.00$ cat example2.pl
#!/usr/bin/perl
#print "Content-type: text/html;\n\n";
print "Content-type: text/html; charset=UTF-8\n\n";
print "<HTML>\n";
print "<BODY>\n";
$hr = "-" x 96;
$time = localtime;

print "$hr<BR>\n";
print "$time のディスク使用量<BR>\n";
print "\n";
print "<pre>\n";
system("/bin/df -h");
print "</pre>\n";
print "\n";

print "$hr<BR>\n";

print "$time のメモリ使用状況<BR>\n";
print "\n";
print "<pre>\n";
system("/usr/bin/free");
print "</pre>\n";
print "\n";

print "$hr<BR>\n";

print "CPU使用率<BR>\n";
print "\n";
print "<pre>\n";
system("LANG=C /usr/bin/sar -u 1 10");
print "</pre>\n";
print "\n";

print "$hr<BR>\n";

print "<BR>\n";
print "</BODY>\n";
print "</HTML>\n";


ブラウザで実行した結果は以下の通り。

------------------------------------------------------------------------------------------------
Fri Nov 16 20:49:52 2007 のディスク使用量

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                       66G  1.3G   61G   3% /
/dev/sda1              99M   24M   71M  25% /boot
none                 1014M     0 1014M   0% /dev/shm
/dev/sdb1              68G  355M   64G   1% /home

------------------------------------------------------------------------------------------------
Fri Nov 16 20:49:52 2007 のメモリ使用状況

             total       used       free     shared    buffers     cached
Mem:       2075952     834476    1241476          0     106752     581424
-/+ buffers/cache:     146300    1929652
Swap:      2031608          0    2031608

------------------------------------------------------------------------------------------------
CPU使用率

Linux 2.6.9-55.0.12.EL (nullpopopo.blogcube.info)     11/16/07

20:49:52          CPU     %user     %nice   %system   %iowait     %idle
20:49:53          all      0.00      0.00      0.00      0.00    100.00
20:49:54          all      0.00      0.00      0.00      0.00    100.00
20:49:55          all      0.00      0.00      0.00      0.00    100.00
20:49:56          all      0.00      0.00      0.00      0.00    100.00
20:49:57          all      0.99      0.00      0.00      1.98     97.03
20:49:58          all      0.00      0.00      0.00      0.00    100.00
20:49:59          all      0.00      0.00      0.00      0.00    100.00
20:50:00          all      0.00      0.00      0.00      0.00    100.00
20:50:01          all      0.99      0.00      0.99      4.95     93.07
20:50:02          all      4.90      0.00     11.76      0.00     83.33
Average:          all      0.70      0.00      1.30      0.70     97.31

------------------------------------------------------------------------------------------------
コマンドラインで出力するのに、以下のスクリプトを作成した。

sh-3.00$ cat example1.pl
#!/usr/bin/perl

$hr = "-" x 96;
$time = localtime;

print "$hr\n";
print "$time のディスク使用量\n";
print "\n";
system("/bin/df -h");
print "\n";

print "$hr\n";

print "$time のメモリ使用状況\n";
print "\n";
system("/usr/bin/free");
print "\n";

print "$hr\n";

print "CPU使用率\n";
print "\n";
system("LANG=C /usr/bin/sar -u 1 10");
print "\n";

print "$hr\n";


実行結果は以下の通り。

sh-3.00$ ./example1.pl
------------------------------------------------------------------------------------------------
Fri Nov 16 20:37:43 2007 のディスク使用量

Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       66G  1.3G   61G   3% /
/dev/sda1              99M   24M   71M  25% /boot
none                 1014M     0 1014M   0% /dev/shm
/dev/sdb1              68G  354M   64G   1% /home

------------------------------------------------------------------------------------------------
Fri Nov 16 20:37:43 2007 のメモリ使用状況

             total       used       free     shared    buffers     cached
Mem:       2075952     834156    1241796          0     106624     581300
-/+ buffers/cache:     146232    1929720
Swap:      2031608          0    2031608

------------------------------------------------------------------------------------------------
CPU使用率

Linux 2.6.9-55.0.12.EL (nullpopopo.blogcube.info)         11/16/07

20:37:43          CPU     %user     %nice   %system   %iowait     %idle
20:37:44          all      0.99      0.00      0.99      0.00     98.02
20:37:45          all      0.00      0.00      0.00      0.00    100.00
20:37:46          all      0.00      0.00      0.00      0.00    100.00
20:37:47          all      0.00      0.00      0.00      0.00    100.00
20:37:48          all      0.00      0.00      0.00      2.00     98.00
20:37:49          all      0.00      0.00      0.00      0.00    100.00
20:37:50          all      0.00      0.00      0.99      0.00     99.01
20:37:51          all      0.00      0.00      0.00      0.00    100.00
20:37:52          all      0.00      0.00      0.00      0.00    100.00
20:37:53          all      1.00      0.00      0.00      0.00     99.00
Average:          all      0.20      0.00      0.20      0.20     99.40

------------------------------------------------------------------------------------------------

次のエントリには、これをブラウザで表示するにはどうするかを書きます。
時刻表示は、unixのdateコマンドより楽かも知れない。
今日のネタは、これ。

sh-3.00$ cat example1.pl
#!/usr/bin/perl

print "------------------------------\n";

$data = localtime;
print "現在時刻を表示する\n";
print "$data\n";

print "------------------------------\n";

$time = time;
print "現在時刻をUNIXTIMEで表示する\n";
print "$time\n";

print "------------------------------\n";

$gmtime = gmtime(time + 0);
print "現在時刻をGMTで表示する\n";
print "$gmtime\n";

print "------------------------------\n";


実行結果は以下の通り。

sh-3.00$ ./example1.pl
------------------------------
現在時刻を表示する
Wed Nov 14 23:00:10 2007
------------------------------
現在時刻をUNIXTIMEで表示する
1195048810
------------------------------
現在時刻をGMTで表示する
Wed Nov 14 14:00:10 2007
------------------------------

.htaccessを使った、アクセス制限やリファラ制限、指定されたサイト以外からの直リンク禁止を
一発でジェネレートしてくれるサイトがあった。

mod_rewriteで他所のサイトにブッ飛ばすのも、コレの応用でできると思われる。
実例は帰ってから書くとするか。。。はよ帰りたい。
会社でヒマしてるので、バーチャルマシンを1個作ってみたが、
うっかりしてタイムゾーンをEST(米国東海岸時間)で作ってしまった。

$ date
Wed Nov 14 14:05:56 EST 2007

(;゚д゚)ァ....

さてどうしようとGoogle先生に聞いてみたら、/usr/share/zoneinfo にある地域ファイルを
/etc/localtimeとしてコピーしてやればよいとのこと。
日本時間(JST)は/usr/share/zoneinfo/Japan なので、

1) # rm -f /etc/localtime
2) # cp -p /usr/share/zoneinfo/Japan /etc/localtime
3) $ date

確認してみる

$ date
Wed Nov 14 14:20:03 JST 2007

これでよし。
ベーコンとアスパラとほうれん草があるので、

レシピ ☆ほうれん草&アスパラ&ハムのパスタ☆ by キャラメルバニラ

にしよう、そうしよう。楽だし。今日は何もしたくない。
でも明日の弁当だけは作らなきゃ・・・。(`・ω・´)
今日もトゴシくんは虐められてます。
まるでスチュワーデス物語における、堀ちえみのような扱いです。
そんなトゴシくんの日常を、スクリプトにしてみました。

※ ホントは今日、会社はおやすみでした。

join関数で、配列中のデータの区切りを指定して表示してみます。

sh-3.00$ cat example1.pl
#!/usr/bin/perl

@data = ("ドジ","ノロマ");
$comment = join("で",@data);
print "とごしは $comment な亀である\n";
exit;

実行結果は以下の通りです。

sh-3.00$ ./example1.pl
とごしは ドジでノロマ な亀である



おまけにもう1つ


sh-3.00$ cat example2.pl
#!/usr/bin/perl

$data[0] = ("コーラ");
$data[1] = ("めろんぱん");
$comment = join("と",@data);
print "おい、とごし $comment 買って来い。\n";
exit;

実行結果は以下の通りです。

sh-3.00$ ./example2.pl
おい、とごし コーラとめろんぱん 買って来い。

perlでのgrep関数を使ってみた。意外と簡単。
プログラムは以下の通り。

sh-3.00$ cat grep01.pl
#!/usr/bin/perl
@array = ("apple", "application","pineapple","wine","windows");
$count = grep(/app/, @array);
@items = grep(/app/, @array);
print "件数は$count、内容は@items。\n";

appを含むものを引っ掛けてその件数と内容を表示する。

sh-3.00$ perl grep01.pl
件数は3、内容はapple application pineapple。



次に、先頭文字がappのものを引っ掛けてその件数と内容を表示する。

sh-3.00$ cat grep02.pl
#!/usr/bin/perl
@array = ("apple", "application","pineapple","wine","windows");
$count = grep(/^app/, @array);
@items = grep(/^app/, @array);
print "件数は$count、内容は@items。\n";

実行結果は以下の通り。

sh-3.00$ perl grep02.pl
件数は2、内容はapple application。



そして、大文字小文字を区別せずに検索してみる。

sh-3.00$ cat grep03.pl
#!/usr/bin/perl
@array = ("Apple", "aPPlication","piNeapple","wine","windows");
$count = grep(/app/i, @array);
@items = grep(/app/i, @array);
print "件数は$count、内容は@items。\n";

実行結果は以下の通り。

sh-3.00$ perl grep03.pl
件数は3、内容はApple aPPlication piNeapple。



「あなたのお名前なんてーの?」という質問に対して、自分の名前を回答する。
プログラムはこう。

#!/usr/bin/perl

print "What\'s your name ?";
$name = <STDIN>;  #画面からの入力
chomp($name);
print "$name is your name.\n";

実行結果
$ perl name.pl
What's your name ?togoshi ← togoshiと入力する
togoshi is your name.

ここでミソなのは、chompを使うことで、いらん改行を発生させないこと。
chompがないと、実行結果は以下のようになる。

$ perl name.pl
What's your name ?togoshi
togoshi
 is your name.


佐藤さん、鈴木さん、田中さん、吉田さんを一気に表示したいとき、配列変数を使うと楽ちんです。

配列変数を使わない例 ← まつがい
配列変数を一個一個使う例

#!/usr/bin/perl

$name[0] = "satou";
$name[1] = "suzuki";
$name[2] = "tanaka";
$name[3] = "yoshida";

print "$name[0]\n";
print "$name[1]\n";
print "$name[2]\n";
print "$name[3]\n";




配列変数を使った例

#!/usr/bin/perl

$name[0] = "satou";
$name[1] = "suzuki";
$name[2] = "tanaka";
$name[3] = "yoshida";

foreach ( @name ){    # $_に一行ずつ代入

    print ;     # $_ の内容を出力
    print "\n";

}




配列変数をひとまとめにして使ったほうが楽ちんですね。
というわけで、今日は配列変数を覚えました。飴ちゃんありがとう!
こないだ、pearネタを書いたら、それなりに反応があったようで、
きっと皆さんにとってちょっとしたハマりポイントだったのだろうと思ったのです。

それにしても今日は平和でした。午後一発目に「御社にメールしたけどエラー帰ってきちゃったのですがー」
というヘルプメールに対応したのですが、5分で解決。
専務から「○○社さんの環境をあーたらこーたらしたいんだけどー」という
相談事メールを貰うも、サーバの設定ちょこちょこ変えてどうこうってレベルじゃないし
誰も答えらんねーよこんなの・・・どうしたものかなー・・・と悩む。

1週間の疲れがドッと押し寄せてきましたよ。はぁ、、、。
業務で使うネタを教材にして勉強していけば、やった結果が目に見えてわかるだろうと思った。
まずは、UNIXコマンドでいうところのgrepとsedをperlでやってみた。

※さっきウソ書いてしまいました。
$ perl -ne 'print if (m/session (opened|closed)/)' /var/log/messages
$ perl -ne 'print if (m/session [opened|closed]/)' /var/log/messages

[]でくくっちゃうと、「session odc」なんていうログも引っ掛けてしまうので、
単語単位でひっかけたいなら、文字クラス「[]」ではなく、パターングループ「()」で
引っ掛けるべきなのですね。


■ メールのログから、送信成功の行を抜き出す

$ perl -ne 'print if (m/sent/)' /var/log/maillog
Nov  8 06:00:02 intra1 postfix/local[12546]: DC72F8F839C: to=<root@intra1.example.com>, orig_to=<root>, relay=local, delay=1, status=sent (forwarded as 01DEA8F8392)
Nov  8 06:00:02 intra1 postfix/smtp[12548]: 01DEA8F8392: to=<shasta@example.info>, orig_to=<root>, relay=mx.example.info[192.168.0.2], delay=0, status=sent (250 Ok: queued as 1BF4C76873C)
Nov  8 07:31:33 intra1 postfix/local[16078]: 5AFB38F8057: to=<root@intra1.example.com>, orig_to=<root>, relay=local, delay=0, status=sent (forwarded as AE9F58F824E)
Nov  8 07:31:34 intra1 postfix/smtp[16079]: AE9F58F824E: to=<shasta@example.info>, orig_to=<root>, relay=mx.example.info[192.168.0.2], delay=1, status=sent (250 Ok: queued as EF4807681A1)
Nov  8 09:01:01 intra1 postfix/local[19426]: 9620E8F8392: to=<shasta@intra1.example.com>, orig_to=<shasta>, relay=local, delay=0, status=sent (forwarded as A91608F839C)
Nov  8 09:01:01 intra1 postfix/local[19424]: 8F0DA8F83BB: to=<root@intra1.example.com>, orig_to=<root>, relay=local, delay=0, status=sent (forwarded as B02E18F8392)
・・・


■ 正規表現を使って、sshでのログイン|ログアウトの履歴を抜き出す

$ perl -ne 'print if (m/session (opened|closed)/)' /var/log/messages
Nov  8 15:39:31 intra1 sshd(pam_unix)[1709]: session opened for user shasta by (uid=0)
Nov  8 15:40:24 intra1 su(pam_unix)[1926]: session opened for user root by shasta(uid=1000)
Nov  8 15:46:06 intra1 su(pam_unix)[1926]: session closed for user root
Nov  8 15:46:06 intra1 sshd(pam_unix)[1709]: session closed for user shasta
Nov  8 15:48:15 intra1 sshd(pam_unix)[2722]: session opened for user shasta by (uid=0)
Nov  8 15:48:28 intra1 su(pam_unix)[2947]: session opened for user root by shasta(uid=1000)
Nov  8 15:48:46 intra1 su(pam_unix)[2947]: session closed for user root
Nov  8 15:48:54 intra1 sshd(pam_unix)[2722]: session closed for user shasta
・・・


■ ログの日付を置換してみる

元のログ
Nov  8 04:02:11 intra1 syslogd 1.4.1: restart.
Nov  8 04:02:26 intra1 clamd[2689]: Database correctly reloaded (299083 signatures)

$ perl -ne 'print if (s/Nov  /11\//)' /var/log/messages
11/8 04:02:11 intra1 syslogd 1.4.1: restart.
11/8 04:02:26 intra1 clamd[2689]: Database correctly reloaded (299083 signatures)
置換後は上記のようになった


■ ログの小文字を大文字にしてみる

元のログ
Nov  8 04:02:11 intra1 syslogd 1.4.1: restart.
Nov  8 04:02:26 intra1 clamd[2689]: Database correctly reloaded (299083 signatures)

$ perl -ne 'print if (tr/a-z/A-Z/)' /var/log/messages
NOV  8 04:02:11 INTRA1 SYSLOGD 1.4.1: RESTART.
NOV  8 04:02:26 INTRA1 CLAMD[2689]: DATABASE CORRECTLY RELOADED (299083 SIGNATURES)
置換後は上記のようになった

会社のサーバに、pear/Logをインストールしてくれと言われた。
pearって何ですか?というくらい無知なので、さりとて「できません」とは言えないので、
まずは自分のバーチャルマシンでリハーサル。
こんばんは。
今晩0時から0時半の間、およそ10分間
blogcubeサーバのkernelアップデートのため
再起動を行います。

ご迷惑をおかけしますが、よろしくお願いいたします。
perlで、文字列の表示と逆順表示(っていうの?)を教わった。

例えば
aiueo
oeuia

と表示したり

あいうえお
おえういあ

と表示したり。

#! /usr/bin/perl

use utf8;
binmode STDOUT, ":utf8";

$str = "あいうえお";

print "$str\n";

$str = reverse($str);

print "$str\n";


それと、単語を指定回数繰り返すのを教わった。
#! /usr/bin/perl

$str = "hello" x 3;

print "$str\n";

こうすると、
hellohellohello
と表示される。

「これができるのって、Perlくらいじゃないかなぁ」とのことだったので、
負けず嫌い(?)なおいらは、awkでやってみたw

$ echo hello | awk '{print $1$1$1}'
hellohellohello

けど、都度繰り返しの回数を変えたいときなどは、きっとPerlのほうがスマートにできそうな気がする。
もっともっと勉強しなきゃ。


今日は土台作ってきた。
今日で銀歯かぶせてオシマイかと思ったら
次回、水曜日がオーラスだって。やれやれだぜ。
どんなモジュールが入っているかを一覧にしてみた。
ググってみたら、そのものズバリな答えがあったので、
ブラウザでちゃんと改行して表示されるようになおしてみた。
中身はこう。

#! /usr/bin/perl
use strict;

my %mod_list;

print "Content-type: text/html;\n\n";
print "<html><body>";

listup($_) for grep {$_ ne '.'} @INC;
print "$_\<br\>\n" for sort keys %mod_list;
sub listup {
  my ($base, $path) = @_;
  (my $mod = $path) =~ s!/!::!g;

  opendir DIR, "$base/$path" or return;
  my @node = grep {!/^\.\.?$/} readdir DIR;
  closedir DIR;

  foreach (@node) {
    if (/(.+)\.pm$/) { $mod_list{"$mod$1"} = 1 }
    elsif (-d "$base/$path$_") { listup($base, "$path$_/") }
  }
}
print "</body></html>";

飴ちゃんにいろいろ教わってます。
まだ自分で課題見つけることができないので、
飴ちゃんのお題をこなすのがいい教材です。

自分のレベルはどんくらい?という指標が
http://d.hatena.ne.jp/naoya/20050809/1123563794
にあったので見てみたら、当然レベル1にも満たないわけで。

でもがんがる!(`・ω・´)シャキーン
わけわからん造語言わない
熱く語らない
香水臭くしない
しげるはそれほど黒くない

Solaris(SunOS5.7)で、ユーザのcron設定を行うには、ちょっとした罠がある。
$ crontab -e
で設定するところだけは、Linuxと同じでなんてことない作業なのだが、
ここに行き着くまで、ちょっとした(ほんとにちょっとした)罠にハマった。
誰にも聞かず(聞けず)にGoogle先生を頼ったわけですが。

ココによると、
/etc/cron.d/cron.allow に自分の名前が登録されている場合
または
/etc/cron.d/cron.allow が存在せず、
/etc/cron.d/cron.deny に自分の名前が登録されていない場合

に、cronの編集を行うことができる。

さらにもう1つ罠があって、Solarisでcrontabコマンドを実行すると、
デフォルトのエディタはedなので、普段viに慣れている私はちょっと混乱。
でも、Google先生は偉大なもので、先生の向こう側には神様がいました。
Solaris cron vi」でググったら、bashなりcshなりで環境変数を指定してやれば、
crontab -e コマンドで出てくるエディタがviになってくれる。


カスタム検索

カレンダー



このアーカイブについて

このページには、2007年11月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2007年10月です。

次のアーカイブは2007年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01