2005年07月

2005年07月29日

トラブル発生 DDNS編

アクセスログを見ていたら、昨日のアクセスが全くない!
急にこうした事態になるとパニックになって何がなにやら・・・。
ローカルアドレスが変わった?
 ファイヤーウォール?
  サーバダウン?
思いつくのはいっぱいあるけれど、あわてふためいて確認できない。
えっとIPアドレス確認する方法ってなんだっけ・・・。
ファイヤーウォールいじったけど、あれのせい??

結局、グローバルIPアドレスが変わったにもかかわらず、ダイナミックDNSサイトに通知されてなかったのが原因らしい。
前回通知したのが、今月の頭。
私が借りているダイナミックDNSサイトは、ルータが対応していて自動的に通知する仕組みになっています。

一応毎日通知する設定にしたのに・・・。

あぁ、びっくりした。
だもんで、ルータはあまり過信しないことにしました。っていうか最近ルータが調子悪い。
で、じゃぁ、ちょっと自分で通知する簡単なスクリプトを書いてみようってことで。

ソースは続きを見るで続きを読む
campanella_77 at 17:07|この記事のURLComments(0)TrackBack(0)VineLinux 

Movable Type - 画像アップローダー修正

MovableType用の画像アップローダーの修正。
表示部分を写真風にしました。

画像もアップできて、クールなCSSとJavaScriptを使ったタグもクリップボードにコピーしてくれます。

以下参照。

ブログ表示用の画像。



サムネイル用の画像。




campanella_77 at 16:58|この記事のURLComments(0)TrackBack(0)VineLinux 

2005年07月28日

Vine Linux - PHPスクリプトでユーザ作成

PHPでユーザを追加できないかと思い立ち、あれこれ実験してみました。

Server構築奮闘記
campanella_77 at 23:26|この記事のURLComments(0)TrackBack(1)VineLinux 

2005年07月25日

料理 ヒジキと梅干し

※ 使用されている画像は、個人的に作成したアップローダーを使用しています。
自鯖をもっていれば、画像のアップロードも楽。
試作段階ですが、使用したいって方はお知らせください。
※ 当方のブログはJavaScriptで画像を表示させたりしています。
JavaScriptをオンにした状態でご覧ください。


ヒジキには豊富に食物繊維が含まれています。
基本的に緑黄野菜 = 食物繊維が豊富と、思われていますが、実際は一日に必要な食物繊維を緑黄野菜から摂取するのは、非常に困難でしょう。それだけ緑黄野菜には食物繊維が含まれていません。
一日に必要な食物繊維は20〜25gといわれています。
レタス1個に含まれる食物繊維が、3gといわれてるので8個分ほどですか。
それに対してヒジキは、乾燥重量の55%程が食物繊維になります。
詳しくはこちら
今回は、このヒジキを使った超簡単料理を紹介します。
材料
乾燥ヒジキ 一握り
和風ダシ 少々
梅干し 1個


店で売られている物はたいてい30g程の乾燥ヒジキが入ったものだと思います。10g程食べれば、5〜6gの食物繊維をとることが出来ることになります。
写真が乾燥したものを取り出した状態。
水につける前にざるに入れて軽く水洗いをします。
水洗いが終わったらそのままボールに水を入れた物の中に浸して、15〜20分ほど待ちます。
好みにもよりますが、10分ぐらいでも大丈夫だと思います。


これが時間が経ってふやけた状態。
かなり膨張しているのがわかると思います。
10倍にふくらむ・・・なんて書かれていたりしますが、実際は2〜3倍ほどです。
ちょっと食べてみて、固いようでしたらもう少し水につけておきます。
食物繊維は消化されないので固いままだと、お腹を壊してしまう可能性もあるので気をつけてください。


おなじみ梅干しです。
あまり入れすぎると辛くなるのでほどほどに・・・。
いつも通り、千切りにして潰します。


和風ダシ少々をふりかけ、梅干しも入れてかき混ぜます。
和風ダシはとけにくいので、少々のお湯で溶かしてからかけるとうまくいくと思います。
ダシがまんべんなく行き渡ったら完成です。


こんな感じ。
一般的にはダシと一緒に煮て・・・・なんて時間がかかる代物なのでしょうけれど、これだけでも十分美味しいです。
むしろ、さっぱりしてこっちの方が美味しいかも。
一度に多く食べ過ぎると、お腹がパンパンにふくれてしまうので注意。

campanella_77 at 13:11|この記事のURLComments(2)TrackBack(1)料理 

料理 そうめん

※ 使用されている画像は、個人的に作成したアップローダーを使用しています。
自鯖をもっていれば、画像のアップロードも楽。
試作段階ですが、使用したいって方はお知らせください。
※ 当方のブログはJavaScriptで画像を表示させたりしています。
JavaScriptをオンにした状態でご覧ください。


材料
そうめん 1人分一束
和風ダシ 少々
昆布茶 少々
醤油 少々
梅干し 1個


これが今回の主役、そうめんです。
そうめん以外にも、うどん・そばも売ってました。同じシリーズで。
全てドンキホーテで200円弱で安い!
1キロ入りなのでこれ一袋買えば結構もちますしね。
そうそう、結構ゆで時間が違ってきて、そうめんが2分程度なのに対して、うどんが8分ほど。そばが4分ほどらしいです。
沸騰した2リットルほどのお湯が入った鍋に、一束入れます。
一束100gですが、パスタのそれと違って結構量が多いので、あまり食べたくないって場合は、減らしてください。


梅干しを刻みます。
一人分1個で十分です。
すっぱいのが苦手な人は半分で。
包丁で切り刻んだら、細かく叩くような感じで。


茹でている間に、汁の準備。
和風ダシと昆布茶を少々。
この和風ダシが決め手。
サティーで安いの売ってました。
(^ ^ ;ゞ


醤油を混ぜます。
これはどれくらいとは一言では言えませんが、適当でかまいません。
後で水で薄めるときに調節する感じです。
結構ダシの方はかなり薄めても味がでるので、醤油と水のバランスはその時々で調節してください。
水を少々入れれます。
今回はつけ麺風に食べていくので、ちょっと水を少なめで濃いめにします。


2分ぐらい茹でたら、火を止め2分ぐらい待ちます。
結構茹で上がったかの判断が難しいかもしれないですね。
吹き溢しに注意します。だいたい吹きこぼれるような感じになったら、火を止めて2分ほど待つような感じかもしれません。


茹で上がった麺を水で洗うようにして冷まします。
このようにボールでいったん水洗いして、ざるに移し替えて更に水を流す感じがいいと思います。
この時麺が引き締まるので、必ず水洗いするように。

よく水を切ります。


切り刻んだ梅干しを入れます。
お好みにより鰹節を入れると、また変わってきます。


出来上がり〜♪

夏はこうしたさっぱりした物がイイデスね。
ただし・・・・
そうめんとうどんは、炭水化物なので消化吸収が、そばに比べて速いようです。
よって、食べてすぐに血糖値が上がり満腹感がある反面、すぐにお腹が空いてしまうといった感じになるでしょう。
すぐにエネルギーに変えたいときは、そうめんやうどんを、長持ちさせたいときはそばを。

campanella_77 at 06:15|この記事のURLComments(0)TrackBack(0)料理 

料理 ピーナッツクッキー

※ 使用されている画像は、個人的に作成したアップローダーを使用しています。
自鯖をもっていれば、画像のアップロードも楽。
試作段階ですが、使用したいって方はお知らせください。
※ 当方のブログはJavaScriptで画像を表示させたりしています。
JavaScriptをオンにした状態でご覧ください。


試してガッテンでクッキーの作り方のコツをやっていたので、さっそく実験。
実は今回2回目。
1回目はなかなかうまく行きました。
今度は自分流にアレンジを加えてみて挑戦。
ピーナッツをたっぷり入れてみました。
材料
ピーナッツ 一握り
薄力粉 200g
バター 120g
卵黄 1個
砂糖 80g


今回はバタピーを使ったので、塩分を取り除くためによく洗って乾燥させました。
皮付きピーナッツでもよいと思います。


次に、ミキサーでピーナッツを粉々にします。なかなか全部いっぺんに粉々にならないし、大きさもまちまち。好みに合わせて、ザル等で大きさを揃えて必要な物だけ使うのもいいかもしれません。
今回は全部混ぜちゃいましたが・・・。


バターを溶かします。電子レンジで溶かしていきますが、必ず5秒ごとに止めては取り出し、シャモジ等で練ってまだ固さが残るようであれば再び電子レンジで5秒。といった感じでこまめにチェックしていきます。
最終的にマヨネーズのと同じ状態(ツヤツヤ光っている)になるまで繰り返します。
木のシャモジごと電子レンジにかけると、かなり熱を持つので注意してください。


こんな状態がベスト。
結構難しくて、液体にならないように注意してください。


バターに薄力粉を入れかき混ぜます。
ある程度混ざったら卵黄をいれ、ピーナッツを入れます。


こんな感じで、固めたらスライスしていく感じで切っていきます。この方法が一番よく混ざるそうです。
ピーナッツが多すぎると結構なかなか混ざりにくくて大変ですが。(^ ^ ;ゞ


完全に混ざったら、手で押し固めてボールから取り出します。
直径3〜5cm程の棒状にします。
この時2枚のまな板で挟んで転がすと、あっという間に綺麗な棒状になります。
結構伸びるので、長すぎる場合はちぎってください。私の場合も1本と半分程度になりました。
で、サランラップでくるんだら冷蔵庫へ。
30分ほど待ちます。


冷蔵庫から取り出すと、カチンコチンになっていると思います。
冷蔵庫の温度にもよりますが、あまり固くなるようでしたら早めに出してしまった方がいいと思います。
私の場合も、20分ぐらいで取り出してしまいました。
写真のようにスライスします。
だいたい1cm程がよいそうです。
ただ、ピーナッツが多めだったせいか、切っている間に気をつけないとぼろぼろに崩れてしまいます。


焼き上がってすぐの状態です!
今回は小さいトースターで焼いたのですが、160度で25分ほど。また、アルミホイールを敷いてそこに並べただけの状態で焼きました。
ピーナッツが入っているのでそれほど膨張しませんでしたね。ほとんど焼く前と後で大きさが変化がなかった気がします。
これが前回何も入れなかったときは、ドンドンふくらんできて隣とくっついてしまうほどだったんですけど。


これが、先ほどの材料で出来上がる量です。
結構いっぱい出来ます。(その分トースター1つで焼くのは大変ですが・・・。焼きあがっては新しいのを入れ・・・って感じで5回ぐらい繰り返しました・・・)
味はですねぇ。正直、焼き上がった直後よりも、冷めて固くなったときが最高。
焼き上がったときは、なんか柔らかかったです(笑)。
形はいびつですが、味は保証付き。
しいていうのならもう少し大きめのピーナッツの破片を入れた方が、楽しめたかなぁ。なんて。
カロリーメイトの類似品のスナックにもちょっと味が似てた(^ ^ ;ゞ。
でもおいしい〜。

campanella_77 at 05:55|この記事のURLComments(1)TrackBack(0)料理 

2005年07月23日

Movable Type - 画像アップを256倍楽に

livedoorの画像アップとかMovableTypeの画像アップって凄くめんどくさいですね。
なので、自分で専用のアップローダーを作っちゃいました。

ただ単に画像をアップするだけじゃなくて、

・アップした画像をサムネイルで管理。
・クリックでブログ投稿用タグをクリップボードにコピー。
・アップ時にサムネイル / ブログ表示用 / オリジナルサイズの3段階の画像を作成。

んで、作成されるタグがCSS+JavaScript付きの以下のような、手書きじゃ頭痛くなるような代物。

<SPAN STYLE="cursor: hand;" onClick="window.open('
http://fstyle.adaga.org/MT/img/200507/?img=20050722202943752.jpg&width=720&height=478'
, 'imgWindow' , 'width=720,height=478,toolbar=no,location=no,status=no,menubar=no,
scrollbars=no,resizable=no,top=100,left=50')"><IMG SRC="
http://fstyle.adaga.org/MT/img/200507/20050722202943752m.jpg " BORDER="1" ALIGN="LEFT"
WIDTH="300" HEIGHT="199" STYLE="BORDER-COLOR:#000000" HSPACE="10"
title="20050722202943752.jpg"></SPAN>

かなり便利。(*^_^*)
campanella_77 at 09:03|この記事のURLComments(0)TrackBack(0)VineLinux 

2005年07月22日

Apache ディレクトリのパーミッション

今更ながらだけれど・・・。
ディレクトリのパーミッションを「666」や「604」等にしていると、403ステータスコードを返すようになると思います。
これは、

「ディレクトリのパーミッションとその意味」
r:そのディレクトリを ls できる
w:そのディレクトリの中でファイルを作成・消去できる
x:そのディレクトリの中のファイルにアクセスできる

と、ファイルのそれとは少し意味合いが違ってくるためのようです。

campanella_77 at 02:55|この記事のURLComments(0)TrackBack(0)VineLinux 

2005年07月20日

Vine Linux - Apache ログ解析 050720

一応、Perl言語を利用したApacheログフォーマッター作成の作業は引き続き行っています。

Perlでの作業が一段落したので、今度はそれをブラウザに出力する作業に移っています。
ブラウザに出力する部分に関しては、PHPを使用しています。
配列に関しての関数が豊富ですし、今どきPHPが入っていない環境もないだろうし・・・。
Perlでの処理でほとんどデータを取り出しやすいように加工済みなので、こちらの作業はかなり楽です。
どちらかというと、デザインやユーザビリティ的な部分であれこれ考えたり悩んだりする方が多いぐらいです。

さて、一応、中間報告というか・・・。


アクセス元順位こちらの画像は、このApacheログフォーマッターをブラウザで出力したものの1つで、これは今まで来訪者がどこから飛んできたのか(アクセス元)を多い順に出力したものです。
見てもらうとわかりますが、圧倒的に「お気に入り/直接」が多いですね。80%程ですか。
こんな感じで、どこから飛んできたかを調べられればSEO対策もしやすいということで。
実際はサイト間移動も記録されてしまっているので、私のサイトのURLに関しては抜かしてあります(たとえば、トップページから掲示板に移動すると、アクセス元は私のサイトのトップページになり、こうした自分のサイトのデータは必要ないので)。
ただ、この場合あまりにも「お気に入り/直接」が多いので、実際どこからどのような比率で来ているかが見えにくくなってしまっています。


お気に入り/直接を除いた場合そこで、「お気に入り/直接」は省いた結果も出力できるようにしました。
見てもらうとわかりますが、先ほどの結果ですと、「お気に入り/直接」も含めたデータでは10%程度の割合だった「 google.co.jp 」が45%の割合だということがわかります。


操作メニューデザインとユーザビリティを考えると、JavaScriptを頼わざるをえないですね。
一応、リンクをクリックすると操作メニューを表示させるようにしました。
何が一番見たいか。を考えると、そうごちゃごちゃあってもまずい。かといってログ解析なので、全てのデータを見られるようなしようにしなくてはならないので、その辺を考えて突き詰めていきたいですね。
どうしてもサイトによって(人気のあるところとか)は、1つのページデータが膨大になってしまう可能性もあるので、JavaScriptを利用してマウスが乗ったときだけ表示させるようにさせようと思っています。
JavaScriptが使えない環境には、今のところ対応させるつもりはありません。


今月のアクセスデータおそらくもっとも重要だと思われる、月別アクセスデータ解析です。
説明はいらないと思いますが、ページとして出力されるもの(わかりやすくいえばHTMLファイルかCGI/PHPのみ)のアクセスログを調べ、日によってどれくらいのページを閲覧されたか、また、何人の方が来訪されたかを出力します。
カウンターCGI/PHPと違って、カウンターを設置したページのみといった限定されることもありませんので、正確にサイトの来訪者を調べることが出来ます。
実際、トップページというのはごくごく一部しかアクセスしません。特に、「google」をはじめ、検索サイトから来た方はほとんどがサイト内のどこかのコンテンツページに直接来て、トップページをアクセスしないまま去っていきます。
正直カウンターCGI/PHPは一種の目安としかならないことがわかると思います。


先月・先々月との比較私がもっとも勧めるのが、これ。「先月・先々月のデータとの比較」です。
先ほどのデータに、先月・先々月のデータを追加して出力されます。
一応、私のサイトも月ごとに増えていってはいるようですね。
(^ ^ ;ゞ


今のところこんな感じですか。
まだメニュー操作に関して突き詰めなくてはならないし、これで見やすいか?といった問題もあるので、180度変更する可能性もありますが、出力内容はこんな感じです。
campanella_77 at 14:25|この記事のURLComments(0)TrackBack(0)VineLinux 

2005年07月17日

Vine Linux - PerlをCronで動かすときの注意

ずっとApacheログフォーマッターの作成に取りかかって、あとはチャンと動作しているかを確認するだけというところになって、大きな壁が。

まず、Apacheのログをフォーマットするスクリプトが1つ。そして、新しく機能をつける場合は、別ファイルにして「system関数」でそちらを呼び出すしようにしました。
そうすれば管理も楽だし、見た目もすっきり。
たとえば、基本的なスクリプトの方では、「Apache」のログを読み込み指定されたディレクトリ内に、月ごとにファイルを分け、CSV形式で保存します。
それが終わると、「system関数」でRefererデータを月ごとにファイルに分けるスクリプトを呼び出します。
このようにして、たとえば、どのIPアドレスが何回来たかを記録するスクリプトとか、どのページにいくつアクセスがあったかを記録スクリプトとかを後々作成していき、基本スクリプトから「system関数」でそれらを次々に呼び出していく。

そんな青写真を描いていたのですが、どうもコマンドラインから起動させて実行させたときと、cronに登録して自動実行させたときと処理内容が違うようなんです。

その先ほど言った、Refererを扱うスクリプトがいくら様子を見ていても、動作している様子がない。
おかしいと思って、コマンドライン上から動作させてやるとチャンと動作している・・・。
「system関数」ではなく「requir」で呼び出しても変わらず・・・。
そんなこんなを1日半。

やっと原因がわかりました。
まず、cron で動作させるときは「system関数」及び「requir」等により外部スクリプトを実行させるときは、
必ず絶対パスを記述
しないとダメなようです。

それと、cronで動作させるときは、エラー出力が見られない訳なので、登録は以下のようにするとデバッグに役に立ちます。

3 4 * * * /root/shell/test.pl > /tmp/myShellLog.txt

この場合は、毎日午前4時3分に「/root/shell/test.pl」を実行し、(本来は)モニタに出力される内容を「/tmp/myShellLog.txt」に保存させる。
ということになります。
campanella_77 at 19:21|この記事のURLComments(0)TrackBack(0)VineLinux 

2005年07月16日

日記 - Apache ログフォーマッター

ちょっとApacheログフォーマッターが一段落。
参照

色々な機能を盛り込んだらえらく重くなってしまいました。
特に、どこから飛んできたのかをファイルに保存するしようにしたら、10数秒で終わってたものが50秒近くに。
これは、6MB程度のログの場合なのですが、2MB程度でも30秒かかっていたことを考えると、しょうがないのかなぁ。って。
ま、うまい方法もあるんだろうけれど、処理が簡潔だったのでちょっと時間のかかる方法を選択してしまいました。

そのせいか、それほど悩まないで出来た気がします。
って、悩んだけれど。

一応、動作させましたが、細かいデバッグはこれから少しずつみていこうかな。って感じです。

で、あとはブラウザ上から見れるようにするためのプログラムの作成ですね。
こちらは・・・PHPでやるつもりです。
Perlの方が汎用性(環境)は高いんでしょうが、PHPの方が楽そうだし、今回はデザインも含めたプログラムにしないといけないんで。

はぁ、どうなる事やら。でも、結構アクセスログって飽きずに眺めちゃうものなので、完成したらしたでしょっちゅう見るようになっちゃうのかな。
campanella_77 at 10:26|この記事のURLComments(0)TrackBack(0)perl 

Perl - ハッシュへ値を入れる?

ハッシュ(連想配列)にスカラー変数用の値を入れるとどうなるのでしょうか。
以下をみてください。

%arr = ();
print %arr = 1;
print "\n";
print %arr;

[ 実行結果 ]
1
1

###################################################
%arr = ();
print %arr = &func();
print "\n";
print %arr;

sub func{
return (1 , 2 , 4);
}

[ 実行結果 ]
12
1/8

###################################################
sub func{
return ("a" => "aaa" , "b" => "bbb" , "c" => "ccc" ,
"d" => "ddd" , "e" => "eee");
}

[ 実行結果 ]

aaaabbbbccccddddeeee
5/8

###################################################

# while で出力してみる

print %arr = &func();
print "\n";
print "arr:" . %arr;

while(($key , $value) = each(%arr)){
print "key:" . $key . " : value:" . $value . "\n";
}


sub func{
return (1 , 2 , 6 , 7 , 43 , 55);
}

[ 実行結果 ]
12674355
key:6 : value:7
key:1 : value:2
key:43 : value:55

###################################################
print %arr = &func();
print "\n";
print "arr:" . %arr;

while(($key , $value) = each(%arr)){
print "key:" . $key . " : value:" . $value . "\n";
}

sub func{
return (-122);
}

[ 実行結果 ]
-122
arr:1/8
key:-122 : value:

こんな挙動をします。

campanella_77 at 06:23|この記事のURLComments(0)TrackBack(0)perl 

2005年07月13日

Perl - コマンドライン上での引数

CGIに使う機会の多いPerlですが、今回のApacheのログ解析のようにコマンドラインから使用するプログラムのように、Perlで作成すると色々なものが作成できます。

汎用性が高くなるように、コマンドライン上から実行するときにおいて、引数で値が渡せるようにしておくとよいかもしれません。

引数を受け取るには、

$#ARGV : 引数の個数 - 1
$ARGV[0] : 1つ目の引数の値

下の例を参考にしてください。
#!/usr/bin/perl

if (-1 == $#ARGV){
print "引数が必要です\n";
}else{
$cnt = $#ARGV;
print "引数の数は" . ($cnt + 1) . "です\n";
}

foreach $value (@ARGV){
print $value . "\n";
}


[ 実行結果 ]

$ ./test.pl aaa bbb ccc
引数の数は3です
aaa
bbb
ccc

campanella_77 at 14:22|この記事のURLComments(0)TrackBack(0)perl 

Perl - 検索サイトからジャンプしてきたログ

Apacheログ解析です。
Eコマースやオンラインショッピングサイトを経営している場合、もっとも気になるログといえば、「どこから」訪れたかではないでしょうか。

8割のユーザが検索サイトから。という結果があるようです。

そこで、こうしたログも後で取り出しやすいように、ファイルに保存しておくことにしましょう。
各ログのRefererがあるものは、検索サイトと思われるURLを含んでいれば、専用のサイトに記録するようにします。

検索サイトといっても色々ありますが、代表的なものを選んで後でRefererとマッチさせます。
配列で格納しておけばマッチさせやすいでしょう。

# 検索サイト
@searchSites = ("www.google.co.jp/search" ,
"www.google.com/search" ,
"search.yahoo.co.jp/bin/" ,
"search.goo.ne.jp/" ,
"www.infoseek.co.jp/" ,
"search.biglobe.ne.jp" ,
"search.msn.co.jp/results.aspx" ,
"search.msn.co.jp/preview.aspx" ,
".excite.co.jp/search"
);


で、マッチさせるための関数は、


続きを読む
campanella_77 at 09:32|この記事のURLComments(0)TrackBack(0)perl 

日記 - ノー○ン・インターネット・セキュリティー

ノー○ン・インターネット・セキュリティーを使用してから何年が経つでしょうか。
数々のバージョンをインストールしてきましたが、そろそろ他のソフトに乗り換えるか真剣に考えたいと思っています。
と、いうよりアンチウィルス機能以外必要ないと思いますが・・・。

以下の経験がある方はいませんか?

・メッセンジャーがログインできない・失敗するときがある
・あろう事かWindowsアップデートが失敗する
・ハンゲームのID登録欄が見つからない!
・ネットワークを使用するソフトが固まる
・接続できませんのエラーがでる

そして、

・ノー○ン・インターネット・セキュリティーをいれている

私の場合は、Linuxをはじめルータの設定をあれこれ自分で設定しているのし、Windowsをインストールし直す事もたびたびあるので、このノー○ン・インターネット・セキュリティーの設定もきっちりしているつもりです。

で、上に上げた数々の症状も全てきっちり設定しました。
それでもこれらの症状が改善されないので、ノー○ン・インターネット・セキュリティーを無効にさせると・・・。
あら素敵。
今までのエラーが全く見かけない。

正直、ルータを入れているかぎり、ファイアーウォールが役になったなんていうのはほと〜〜んどないので、正直次からはアンチウィルスソフトだけでいいかなって。
WindowsXPでSP2(サービスパック2)を当てていればなおさら。

んでもって、今はかる〜いアンチウィルスソフトやら無料のものもあるし。
あえてこの高い代物にしなくてもいいかなって。

高い!遅い!迷惑!な、このソフトにもそろそろお別れの時。
campanella_77 at 08:15|この記事のURLComments(0)TrackBack(0)日記 

2005年07月11日

Perl - ダブル正規表現

正規表現には 後方参照 という便利な機能があり、これによってマッチしたものだけを取り出す。といったことも可能です。
PHPの正規表現は関数を用いて実現していました(JAVAなんかはもっとめんどくさい)が、Perlでは非常に簡単な(特殊な?)記述で実現できます。

後方参照では、$x(x は数値) といった特殊な変数にマッチした部分が格納され、前から順番に x に1から1つずつ増えていきます。
また、後方参照として取り出すには「 ( ) 」で囲んでやります。

さて、気をつけなくてはいけないのは、正規表現の後方参照は、今いったように特殊な変数に格納されるので、複数の正規表現を処理する場合は、次の正規表現を処理する前に、別の変数に格納させて待避させてやらなくてはなりません。

Apacheのログ分析プログラムを例に挙げてみます。
最初の正規表現は、ログの解析用です。
そしてそのあとに、ログの日付に関する部分に正規表現を使っています。

続きを読む
campanella_77 at 16:51|この記事のURLComments(0)TrackBack(0)perl 

Perl - use File::Path

今回Apacheのログを「 /home/httpd/log 」以下に保存したいと思います。
ま、プログラムをどうさせる前にこれらのディレクトリを作成してしまってもよいのですが、一応プログラム中で必要なディレクトリがなかった場合、作成させるようにしてみました。

Perlには、ファイルやディレクトリが有るかどうかを判断するためにいちいち特殊な関数を必要としません。ディレクトリが有るかどうかを判断するためには、以下のようにします。
if ( -d "/home/httpd/log"){
print "有りました\n";
else
print "有りません\n";
}

同じようにファイルがあるか確認する場合は「 -d 」の部分を「 -f 」にします。

次は、ディレクトリの作成です。
VineLinuxのコマンドを使えば、階層付きのディレクトリを作成できますが、mkpath関数を使うことで、同じようなことが出来るようです。
この関数を使用するためには「 File::Path 」というモジュールが必要らしいので「 use 」を使ってインクルードします。
以下では、ディレクトリの有無を確認してなければパーミッションを「 666 」で作成します。
$newPath   = "/home/httpd/log/";
if (! -d $newPath ){
use File::Path;
mkpath([$newPath] , 1 , 666)
|| die($newPaht . " : 作成に失敗");
}



campanella_77 at 13:15|この記事のURLComments(0)TrackBack(0)perl 

Perl - 関数 ファイル 1

Apacheログ解析プログラムでは、月ごとにログをまとめて保存します。
あまりにデータ量が多い場合は(一日で数千ヒットとか)、日ごとに分けた方がいいかもしれません。
なので、ファイルの管理が複雑になります。

0からファイルを作成していく場合よりも、ファイルに付け足していく。といった感じになります。

また、今回のプログラムはそれほど処理速度の速さを必要としないので、1つのデータを保存するごとにファイルのオープン・クローズも実行させるようにしました。
おそらくある程度処理速度は遅くなるとは思いますが、ファイルの保存処理は新しいログのみなので、頻繁にこのプログラムを実行させるようにすれば、極端な話し、新しいログが1つないし数個程度でしょうからそれほど影響があるとは思えません。

さらに、保存するときは関数を呼び出してファイルへのパスと保存するデータを渡してやるだけなので、記述も簡潔になります。
こちらのメリットの方が大きいでしょう。

さっそく関数化してみました。


続きを読む
campanella_77 at 12:07|この記事のURLComments(0)TrackBack(0)perl 

2005年07月09日

Perl - サブルーチン 1

Perlも他の言語と同じようにユーザー定義関数が自作できますが、多少ニュアンスが違うようです。
一応Perlの世界ではユーザー定義関数といわずにサブルーチンと呼ぶようです。
基本的には関数とは「0個以上の値を受け取り、処理をして0ないし1個の値を返す仕組みのもの」ということだと思いますが、Perlの場合はサブルーチンなのでどちらかというと、「ここからここまでの部分を別のファイルないし別の行に記述できる仕組みのもの」みたいな感じです。
よって、サブルーチン内で作成された変数はすべてグローバル変数です。

この仕組みを利用してもよいのですが、おそらく他の言語経験者では利用したい人はまれでしょう。また、はじめてプログラムを学ぶという人もこの変わった(?)仕組みを利用するのは避けた方が良いと思います。

では、他の言語のように引数を受け取って云々といった法則に従って次のような関数(?)を作成してみました。


続きを読む
campanella_77 at 20:55|この記事のURLComments(0)TrackBack(0)perl 

Perl 正規表現 Apacheのログ解析 2

前回のプログラムをもっと実用的にしてみました。
 #!/usr/bin/perl

$log = "/var/log/httpd/access_log";

if (FALSE == open(FILE , "<" . $log)){
print "ファイルのオープンに失敗です\n";
exit(1);
}
while($line = <FILE>){
if ($line =~ /^([^ ]*)[^\[]+\[([^ ]+) \+0900] \"
([^ ]+) (\/[^ ]*) ([^\"]+)" ([^ ]+) ([^ ]+) \"([^\"]*)
\" \"([^\"]*)\"$/){
$data = "$1,$2,$3,$4,$5,$6,$7,$8,$9\n";
print $data;
}
}
close(FILE);

\+0900] \"
の部分ですが、たいていApacheのログなら時間に当たる部分が
[01/Jul/2005:00:00:00 +0900]
のようになっているので、不必要な部分を削除するための正規表現になります。
+0900 以外の値が来てもいいように
[^\"]+\"
なんてやってもいい(「 " 」以外の文字が1文字以上で「 " 」までの文字列の意)のですが、全然処理速度が落ちてしまいますので、具体的に指定しています。

続きを読む
campanella_77 at 15:48|この記事のURLComments(0)TrackBack(0)perl 

Perl 正規表現 Apacheのログ解析

Apacheのアクセスログは、だいたい以下のような感じになっています。

xxx.xxx.xxx.xxx - - [01/Jul/2005:00:00:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://fstle.ddo.jp/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"

最初の半角スペースまでがIPアドレスかホスト名になります。
もし、IPアドレス・ホスト名だけ取り出して出力したい場合は、
 #!/usr/bin/perl

$log = "/var/log/httpd/access_log";

if (FALSE == open(FILE , "<" . $log)){
print "ファイルのオープンに失敗です\n";
exit(1);
}
while($line = <FILE>){
$line =~ /^([^ ]*) /;
print $1 . "\n";
}
close(FILE);

今回は、あとで処理がしやすいように、
IP/ホスト名,時間,メソッド,アクセスファイル,HTTPバージョン,ステータスコード,送信バイト数,Referer,ブラウザ情報
のように、この順番のCSV形式で保存するようにします。
よって取り出すための正規表現は、
続きを読む
campanella_77 at 10:20|この記事のURLComments(0)TrackBack(0)perl 

Perl 正規表現 1

Perl言語の特徴として文字列に強いことがあげられると思います。
特に正規表現は他の言語でも取り入れられています。

おそらくPerlの正規表現はもっとも簡単に(気軽に?)使用できる反面、使い方も奇抜になっています。
以下の例を見てみます。前回までのスクリプトを使用します。
#!/usr/bin/perl

$log = "/var/log/httpd/access_log";

if (FALSE == open(FILE , "<" . $log)){
print "ファイルのオープンに失敗です\n";
exit(1);
}
while($line = <FILE>){
if ($line =~ /help\.yahoo\.com\/help\/us/){
print $line;
}

}
close(FILE);

何をしたいかって言うと、1行ずつ読み込んでいく過程で読み込んだ1行に「
help.yahoo.com/help/us
」という文字列があれば画面に表示。
って感じでしょうか。
.(ドット) 」や「 /(スラッシュ) 」は正規表現の特殊な文字としてみられるので、「 \ 」でエスケープ(無効化)しています。
一応、米国のヤフーの検索ロボットが残すログだと思います。
ちょっと注意しなきゃならないのが、
$line =~ /help....
=~ です。「 =(イコール)」 ではありません。「 ~(チルダ) 」とのセットで、くっついてないと機能しません(これに気が付かなくてずっと悩んでた!)。

正規表現については Smart! Perl 正規表現 に乗っています。


campanella_77 at 07:52|この記事のURLComments(0)TrackBack(0)perl 

Perl ファイルの読み込み

ファイルの読み込みについてやってみます。
重要なとこだと思いますが、一気にやってしまいます。
たぶん他の言語をやっている人なら、サラッと目を通すだけですぐ使えると思います。

Perlのファイルからの読み込みは、記述的には少し特殊です。また、簡単です。
次の例を見てください。
#!/usr/bin/perl

$log = "/var/log/httpd/access_log";

if (FALSE == open(FILE , "<" . $log)){
print "ファイルのオープンに失敗です\n";
exit(1);
}
while(<FILE>){
print;
}
close(FILE);

これだけでファイルのデータをすべて出力してくれます。
ファイルから1行読み込む場合は
<FILE>
これだけです!これだけで1行がどんな長さであろうと、一発で読み込んでファイルポインタを次の行の先頭に移動してくれます。

で、while の条件式に、この「 <FILE> 」を指定してやると、ループ内に「 print 」と書くだけで読み込んだ1行を出力してくれます。
また、この例ではありませんでしたが、
print $_;
とやっても同じ結果になります。やはり、while の条件式に「 <FILE> 」を指定すると、読み込んだ1行を「 $_ 」に格納してくれます。
ただ単にファイルを読み込んで出力する場合は、どちらのやり方でもいいって事ですね。

ただし!「 $_ 」が有効になるときはそのまま出力するときだけのようです。以下はエラーになります。
while(<FILE>){
print length($_) . "\n";
}

この場合は、
while($line = <FILE>){
print length($line) . "\n";
}


campanella_77 at 06:37|この記事のURLComments(0)TrackBack(0)perl 

Perl 真偽と if 文

これからファイルを扱おうと思ったんですけれど、その前にいくつか気になることを済ませておきます。

まず、PHPなんかには「暗黙の定数」である、真偽やヌル値として「TRUE」や「FALSE」それから「NULL」なんかがありました。
C言語は「NULL」とか「\0」ですね。
Perlの場合は・・・。

あと、C言語やPHPでは、「{」「}」で囲む処理に関して、1行のみの場合は囲もうと囲まずとも同じ意味でした。たとえば、
if ($aaa)
print "aaa";
と、
if ($aaa){
print "aaa";
}

は、同じでした。
Perlの場合はどうなんでしょうね。
#!/usr/bin/perl

$bloo = FALSE;
if ($bloo)
print "FALSEです";
else
print "TRUEです";

実行結果。
$ ./test.pl
syntax error at ./test.pl line 7, near ")
print"
Execution of ./test.pl aborted due to compilation errors.

エラーになってしまいました。
正しくは、
#!/usr/bin/perl

$bloo = FALSE;
if ($bloo){
print "FALSEです";
}else{
print "TRUEです";
}

実行結果。
 $ ./test.pl
FALSEです

campanella_77 at 06:08|この記事のURLComments(0)TrackBack(0)perl 

Vine Linux - Perl Apacheログ解析プログラム

Perlも4回目?になりました。
えっと一応、私のこのブログではPerlを手取り足取り教えていこう。って感じではありません。
どっちかっていうと、私がPerlを思い出すためのとっかかり。って感じです。

それでも、ちゃんとしたプログラムが完成する頃には、もうあとはこれの応用だけ。みたいな感じで何でも出来てるようにはなると思うんですけど・・・。

で、何をやってくかって言うと、
Apacheのログ解析というか、そんなものを作ってみようかな。って。
簡単に説明をすると、「 /var/log/httpd/access_log
というApacheのログを「 /home/httpd/log 」以下に保存。
保存するに当たって、月別ごとにファイルを分けて保存していく。
たとえば、「200505.dat」のように。
更に、不必要なデータはこの時点で省きながら保存。
これに、いくつかログ解析用に取り出しやすい形で別ファイルに
保存したり。

こんな感じです・・・。
一応、このプログラムには以前言った要素がすべて入っている・・・予定です。

環境としては、Apacheのログファイルが
/var/log/httpd/access_log
とし、新たな保存先が
/home/httpd/log
以下とします。ま、ここに保存すれば、CGIやPHPで表示さ
せたりするのも楽かなぁ。と。

また、保存するログは、拡張子が「html」「php」「cgi」
「pl」「txt」等々。まだあいまいですけど。

あとは月ごとのアクセス数を簡潔に保存したものや、検索
サイトから飛んできたデータを収集したファイル等も作成
しようと思います。


campanella_77 at 04:02|この記事のURLComments(0)TrackBack(0)perl 

Vine Linux - 出力 print

今回は、最初のプログラム。最も簡単なものを書いてみました。
私も、もうすっかり忘れてます。
一応ファイル名は「test.pl」で保存しました。
#!/usr/bin/perl

echo "ああああああ";

実行させてみました。
 $ ./test.pl

そしたら!何かエラーがでました。
String found where operator expected at ./log.pl line 3,
near "echo "ああああああ\n""
(Do you need to predeclare echo?)
syntax error at ./log.pl line 3, near "echo "ああああああ\n""
Execution of ./log.pl aborted due to compilation errors.

なんでしょう・・・。
なんか「 echo "ああああああ"; 」がまずそうです。以下のように修正しました。
#!/usr/bin/perl

print "ああああああ";

実行させてみました。
 $ ./test.pl
ああああああ

Perlでは「echo」関数って無いのでしょうか・・・・。


っと、ついでに試してみました。文字列をつなぐときはどうするんでしょうか。
#!/usr/bin/perl

$str = "ああああああ";
$str .= "いいいいいい";
print $str;

実行。
 $ ./log
ああああああいいいいいい

$str が変数で、「 .(ドット) 」で文字列をつなぐことが出来ますね。
このへんはPHPと同じですね。
campanella_77 at 03:46|この記事のURLComments(0)TrackBack(0)perl 

2005年07月08日

Vine Linux - Perl 最初に

VineLinuxをはじめ、たいていのLinuxにはPerlはインストールされていると思います。
ので、エディタがあればすぐにでもはじめることが出来ると思います。
基本的にここではCGI用の説明ではなく、コマンドラインで使用するプログラムを作成する説明にしたいと思います。
まぁ、あんまり変わらないので気にする必要はないと思います。

Perl言語といっても範囲が非常に広いのですが、

・配列等の扱い
・ファイルの読み込みと書き込み
・正規表現
・日付
・その他これらに付随する細かいこと

これぐらい知っとけば、たぶんあとは何でも出来るとは思います。
オブジェクト指向はやりません。

さて、Perlを習うときにまず記述させられるのが、

#!/usr/bin/perl

この一行。これがなにかは、Linuxを扱わないとイメージがわからないと思います。
まず、コンソールを立ち上げて以下のように打ち込んでみます。

$ which perl
/usr/bin/perl  ←出力結果

whichコマンド は、指定されたプログラムがどこに収められているか教えてくれます。
この場合、「 /usr/bin/perl 」にある。ということですね。

Windowsなんかは、ファイルをダブルクリックした時に、起動するアプリケーションは、ファイルについた「拡張子」で判断されます。たとえば、
aaa.txt
であれば、メモ帳ですし、
bbb.html
であれば、ブラウザです。「html」の部分を「txt」に書き換えると、メモ帳が立ちあがります。

Linuxの場合は、ファイルの1行目の記述により判断されます。
よって

#!/usr/bin/perl
と記述すると、Perlエンジンが起動してこのファイルをコンパイル・実行してくれます。
PHPで動作させたければ、
#!/usr/bin/php
shで動作させたければ
#!/bin/sh

ですね。
Perl言語のように、スクリプト言語はファイルの先頭に、言語がどこにあるか指定する必要があります。
そのための1行ですね。
campanella_77 at 21:31|この記事のURLComments(0)TrackBack(0)perl 

Vine Linux - Perlでログ解析

以前C言語で作成したログ解析プログラムがどうも、うまく動作していない様子です。
また一から見直すのもうんざり。
PHPでやろうか。
どうせなら、もう少しリアルタイムで見れる方がいい。
なんて考えていたのですが、本屋でPerlの本をパラパラ。
一時期の飛ぶ鳥を撃ち落とすようなCGI/Perlの本は今は完全に裏舞台に回り、有名処系がひっそりと方をそろえて並んでいる有様。

パラパラめくったのだけれど、相変わらずPerlは入門用系が多くて、リファレンスブック(英和辞書みたいなもの)がないですね。
ただ読んでいると懐かしい記号の羅列に、色あせた想い出に胸を忍ばせる。
あの頃一生懸命読んでたよなぁ。なんて・・・。

そうだ、Perlでいこう。
もうすっかり忘れてしまっているし、0からの出発。
本はいらない。私のように他の言語を操っているものに必要なのは、使い方になれるだけです。

と、言うことでどうせなら、ブログに覚えたこと等も載せちゃえと。
たぶん、この私のPerl奮闘記シリーズが終わる頃には、誰しもがPerlを手足のように扱っている・・・・・事はないですね・・・。
campanella_77 at 19:21|この記事のURLComments(0)TrackBack(0)perl 

Vine Linux - サブドメインかディレクトリか

excite のブログは、URLがサブドメインとして与えられるようです。
このことによってアクセス数がどのように変化してくるか実験してみたいと思います。



取り立て新しいことを書くつもりはありません。
おそらくこちらに投稿したものをコピペして載せることになると思います。

デザインもクールだし。結構いいかも。

campanella_77 at 04:54|この記事のURLComments(0)TrackBack(0)VineLinux 

2005年07月07日

Vine Linux - Apache エラーログがすごいことに!

先日、ダイナミックDNSを利用して、新たなドメインを取得しました。
DNSとは簡単に言ってしまえば、NTTの住所から電話番号を調べてくれるサービスのようなもので、たとえば www.google.co.jp といった文字列をIPアドレスに変換してくれるサービスになります。

へぇ。どこにあるの?

なんて聞かれそうですが、これは色々なところにあります。ま、代表的なのが「co.jp」を管理しているとこ。さらに上の「jp」を管理しているとこでしょう。
どこにあるのかは私も知りません。どんな団体がサービスを提供しているのかもよく知りません。
(^ ^ ;ゞ
先ほどの「 www.google.co.jp 」も「co.jp」が付いているので、このサイトを見たいときはまず「jp」を管理しているところに言って、「co.jp」を管理しているところのIPアドレスを聞きに行きます。
次に今教えてもらったIPアドレスを元に「co.jp」に行って、「google.co.jp」のIPアドレスを聞きに行きます。
次に、今教えてもらったIPアドレスでもある「google.co.jp」に行って「www.google.co.jp」のIPアドレスを教えてもらいます。

いつ、そんなことをしているの?

あぁ。これはWindowsがやってます。
裏で勝手にこういう問い合わせをしてくれてます。

さて、私の場合はなんせ「co.jp」に登録するお金も、ドメインを取得するお金もないので、先ほどの「www.google.co.jp」でいう「www」の部分をフリーでかしてくれるところがありまして。
ダイナミックDNSサービスとかって言うんですけど、おかげで「fstyle.ddo.jp」というURLにアクセスすると、私の部屋に設置してあるVineLinuxの入ったマシンにアクセスできるという仕組みです。
「ddo.jp」というDNSサーバに登録しているって事ですね。「co」がないって?
はい。たぶん「ddo.jp」が「jp」のDNSサーバに登録してるんじゃないかなって。
このへんは私も余りよく知りません。

ただ、私の場合フレッツADSLなので、一応はルータで繋ぎっぱなんですけれど、たまーにIPアドレスが変わります。
そうするとそのたんびにIPアドレスを登録し直さなくてはならなりません。

つまり、基本はIPアドレスでアクセスするわけです。
でもDNSという決まり事があるが為に、文字でもアクセスできると。
マァ、NTTに住所から電話番号を問い合わせることを考えてみてください。電話は数字しか使えないので住所のような「文字」ではかけられないわけです。
それと同じ事です。

ンで、何が大変なことに。かっていうと・・・

このIPの登録なんですけれど、基本はダイナミックDNSサービスを提供しているサイトのページに行って、ボタンをクリックしなきゃならないんですが、それだとめんどくさい。
わすれるかもしれないし・・・。

なんで、自動でボタンを押してくれるプログラムを作っちゃえと。
PHPであれこれやりながら作ったんですけれど、これが・・・
デバッグをしている間裏でとんでもないことが起こっていたらしくて、エラーがどっさり。
PHPの場合、エラーがApacheのエラーログに記録されるようになっていて、

なんと・・・

220メガバイトになってるっ!!!!


エラーログって言うのは、マァ、サーバによってそれぞれ違ってくるんでしょうけれど、私のマシンの場合、だいたい1メガあるかどうかなんですけれど、220メガですよ!
行にして200万行っ!

すっごいですねぇ〜〜〜。

いやぁ、焦りました。マジで。


campanella_77 at 05:13|この記事のURLComments(0)TrackBack(0)VineLinux 
What's campanella
ライブカメラ公開中
kao.gif
訪問者数
  • 今日:
  • 昨日:
  • 累計: