ChaichanPapa-World !

燈明日記(2010/04

◆ インデックス

◆ 2010年4月

2010-04-30 WEB脆弱性のアクセス制御や認可制御の欠落とは

◆アクセス制御の欠落と対策

アクセス制御の欠落とは、ログインが必要なサイトでは、ログイン情報によりアクセス制御を掛けますが、たとえば、そのログイン情報がメールアドレスだった場合は、他人にも知られ得る情報であり、そのような情報の入力だけでログインできてしまうのは、アクセス制御機能が欠落していると言えます。

アクセス制御の対策は、他人にも知られ得る情報でなく、パスワードなどの入力を必要とするように、ウェブアプリケーションを設計する必要があります。


◆認可制御の欠落と対策

認可制御の欠落とは、上記の「アクセス制御の欠落」をなくして、ログインを実装しても、ログイン者が他のログイン者の情報(データベース)にアクセスできてしまうことがあります。このような実装は、認可制御機能が欠落していると言えます。

認可制御の対策は、ログイン者がアクセスできる情報(データベース)の範囲をつねに考慮するように、ウェブアプリケーションを設計する必要があります。


また、本記事は、以下URL先を大変参考にさせて頂きました。問題があればコメント欄でご指摘ください。

2010-04-29 WEB脆弱性のディレクトリ・トラバーサル(Directory Traversal)とは?

「../../」のような相対パスを使用し、システム内の任意ファイルへアクセスする攻撃手法をディレクトリ・トラバーサルという。

システム内のディレクトリ間を自由に横断(トラバース)できることが攻撃名称の由来で、パス・トラバーサルとも呼ばれる。


とにかく、CGIとしては、GET(引数)とPOST(hidden)で、ファイル名のみでファイルパスを指定しないように設計をすること。

また、万が一、ファイル名にファイルパスを付加された場合を想定して、そのようなパスを削除するように設計をすること。


◆ ディレクトリ・トラバーサル対応のサンプルプログラム
#!c:/perl/bin/perl.exe
use strict;
use File::Basename;
use CGI;

my $form = new CGI;
my $file_name = $form->param('file_name');
local $/;

my $dir = 'c:/wk/';                # パス情報をプログラム内で持つ
$file_name = basename($file_name); # パスを指定されてもファイル名だけにする
                                   # openは、パス名とファイル名で連結する
open(my $fh, '<', $dir . $file_name) or die "$file_name, open err ($!)";

my $wk = <$fh>;
print <<"HERE1";
Content-type: text/plain; charset=Shift_JIS;

<html>
<body>
<h1>test</h1>
<p>$wk</p>
</body>
</html>
HERE1

尚、上記は、XSS対応にはなっていませんので、ご注意を!

XSSに関しては、後日まとめる予定です。


◆ 補足

『./』は自ディレクトリです。

『../』は、親ディレクトリです。

たとえば、bbbディレクトリにtest.txtがあったとします。

すると、

cat /aaa/bbb/test.txt

cat /aaa/bbb/ccc/ddd/../../test.txt

は、同じになるのです。


また、本記事は、以下のURL先を大変参考にさせて頂きました。問題があればコメント欄でご指摘ください。

2010-04-28 エクスプローラで別ウィンドウで開くには?

IEでなく、普通のエクスプローラでフォルダを開くと、どんなに頑張っても別ウィンドウで開くことができません。

しかし、フォルダの中身比較とかで、どうしても別ウィンドウで開きたい場合が結構ありますね。


で、ググルとあるにはあるのですが、レジストリ操作とか結構大変です。

そこで、簡単な方法を見つけましたので、ご紹介いたします。


◆準備
  1. WINDOWSフォルダにあるexplorer.exeをコピーします。
  2. Documents and Settingsフォルダの自分フォルダのSendToフォルダを開きます。
  3. SendToフォルダへ右クリックで『ショートカットの貼り付け』を行います。
  4. すると、SendToフォルダにexplorer.exeのショートカットが作成されます。

◆エクスプローラで別ウィンドウで開く方法
  1. 別ウィンドウで開きたいエクスプローラ内のフォルダを右クリックします。
  2. 『送る』で、先ほど作成した『explorer.exeへのショートカット』選択します。
  3. これで、別ウィンドウでエクスプローラを開くことができるようになります。

2010-04-27 宿直日

某教会の宿直です。宿直は、現在、唯一の修行になっています。

今月は、2回あり、2回目です。

ということで、修行に行ってきます。

実は、修行といっても、お経(法華経)を読んだり、話し合い(法座)をするだけなのですが…。

2010-04-26 6W3Hとは?

普通、5W1Hは、

です。

あと、Whom(誰に)とHow many(どのぐらい)とHow much(いくら)を加えて6W3Hです!


今日は以下を見直しました。

2010-04-25 祝ブックマーク1000!!!

えーと、今日、本『燈明日記』のブックマーク数が1000になりました!!

アクセス数やエントリ数の割りには、ブックマーク数が少ないのですが、やっと1000になりました!

これからも、皆様、よろしくお願い致します。


ちなみに、以下が『燈明日記』のブックマーク数ベスト10です。

  1. 正規表現基礎文法最速マスター With Perl - 燈明日記
  2. Perlオブジェクト基礎文法最速マスター - 燈明日記
  3. 基礎文法最速マスターカテゴリ - 燈明日記
  4. WEB脆弱性のインジェクションとは? - 燈明日記
  5. JavaScriptでのthisとapplyの関係とは - 燈明日記
  6. PerlでSMTPモジュールを使ったメール送信(バージョンアップ版) - 燈明日記
  7. GoogleのMicrosoft無効化戦略 - 燈明日記
  8. Perlでのコンパイル? - 燈明日記
  9. Perlの謎(その10)サブルーチンの呼び出し方 - 燈明日記
  10. pack関数とunpack関数の基本を理解する - 燈明日記

2010-04-25 WEB相談室閉鎖!!

WEB相談室は、2010/4/30をもって、諸事情により書き込み閉鎖します。

2000年の2月より開設して10年を経過しましたが、昨今、OKWave、はてな、Yahoo!知恵袋が全盛で、WEB相談室の役割は終えたとの認識です。

一時は、2ch並みのアクセス数と書き込み数がありましたが、現状は、その面影が無い状態が4年以上もつづいています。


尚、すべての過去ログに関しては、たぶん、私が生きている間は参照可能です。

まだまだ、何かのお役に立てれば、幸いです。


皆様、長い間『WEB相談室』をご利用頂き誠にありがとうございました!


尚、WEB相談室管理人こと『ちゃいちゃんパパ』は、ブログ『燈明日記』に居ますので、何かありましたらコメントをください!

どんなコメントでもお待ちしています。


では、かつて栄光の『WEB相談室』よ! さらば!

2010-04-25 WEB脆弱性のCSRF(クロスサイト・リクエスト・フォージェリ)とは?

普通、Webページの入力項目に対して入力をして、書き込みを押すと、その入力データがサーバーに送られます。

たとえば、このWebページで、入力をしないで、悪意のあるページにアクセスしたとします。


すると、それだけで悪意のある入力データがサーバーへ送られる可能性があるのです。

そして、このような攻撃をCSRF(クロスサイト・リクエスト・フォージェリ)と言います。


たとえば、確認のページが、以下のようになっていたとします。

<form action="commit.php" method="post">
<input type="hidden" name="new_name" value="脆弱 太郎">
<input type="hidden" name="new_address" value="大阪府">
<input type="submit" name="back" value="戻る">
<input type="submit" name="commit" value="実行">
</form>

このときに、実行を押さず、以下のような悪意のページにアクセスしたら…。

<form action="http://○○/commit.php" method="post" name="f1">
<input type="hidden" name="new_name" value="いぱくん">
<input type="hidden" name="new_address" value="東京都">
</form>
<script>document.forms['f1'].submit();</script>

アクセスしただけで、submit()が実行されて、脆弱 太郎・大阪府でなく、いぱくん・東京都が書き込みされてしまうのです。


これ、mixi(ミクシィ)のような会員制のサイトでは、自分のIDで悪意の第三者に書き込みがされてしまうのです。

当然、その書き込みが、不正送金、商品購入、退会処理の場合があるわけです!


CSRF対策としては、使用者と開発者では以下があります。


◆使用者としてのCSRF対策

とにかく、会員制のサイトにログインしたら、ログアウトするまではサイト以外のページにアクセスしない。


◆開発者としてのCSRF対策

更新ページで、秘密情報挿入やRefererチェック等で、なりすましを厳しくチェックします。


具体的な対策は、以下を参照してください。


尚、本記事のサンプルは、上記URLを大変参考にさせて頂きました。問題があればコメント欄でご指摘ください。

2010-04-24 WEB脆弱性のインジェクションとは?

インジェクション(injection)の意味は、内部に何かを注入することです。

そして、WEB脆弱性のインジェクションには、以下の3つがあります。

  1. SQLインジェクション
  2. OSコマンドインジェクション
  3. HTTPヘッダインジェクション

つまり、SQL、OSコマンド、HTTPヘッダの各々に、Webページから悪意のコマンドをインジェクションされることなのです。


◆SQLインジェクション

たとえば、$uidと$passhをWebページから入力(POST)される以下のSQLがあったとします。

$query = "SELECT * FROM usr WHERE uid = '$uid' AND pass = '$passh'";

$uidに「taro'--」と入力されたら、以下のように展開されます。

$query = "SELECT * FROM usr WHERE uid = 'taro'--' AND pass = ''";

すると、SQLで「--」はコメントになりますので、パスワードがなくても以下のSQLが発行されてしまうのです。

$query = "SELECT * FROM usr WHERE uid = 'taro'";

これ、Delete文もインジェクションされるケースもあり、私は実際にテストで体験しております。DBがクリアされました!


◆OSコマンド・インジェクション

たとえば、$fromをWebページから入力(POST)される以下のopen文があったとします。

$from =~ s/"|;|'|<|>|\|| //ig;
open(MAIL, "|/usr/sbin/sendmail -t -i -f $from");

$from に「`touch[0x09]/tmp/foo`」と入力されたら、以下のように展開されます。

$from =~ s/"|;|'|<|>|\|| //ig;
open(MAIL, "|/usr/sbin/sendmail -t -i -f `touch[0x09]/tmp/foo`);

すると、touchコマンドが実行されてしまいます。


◆HTTPヘッダ・インジェクション

たとえば、$numをWebページから入力(POST)される以下のHTTPのLocationがあったとします。

$cgi = new CGI;
$num = $cgi->param('num');
print "Location: http://example.jp/index.cgi?num=$num\n\n";

$num に「3%0D%0ASet-Cookie:SID=evil」と入力されたら、以下のようなクッキーが発行されてしまうのです。

Set-Cookie: SID=evil

◆インジェクション対策

ということで、WEBアプリケーションは、上記3つの対策を打たないといけないわけです。

対策は、以下を参照してください。

尚、本記事のサンプルは、上記URLを大変参考にさせて頂きました。問題があればコメント欄でご指摘ください。


あと、他にも以下の対策も必要ですね。

2010-04-23 Word2003で一部が印刷されない!!

オートシェイプで書いたフローチャートで、複数ある図形の中に書いてある文字列が、一つだけ印刷されないのです。

その一つだけを、一度消して、再度作りましたが、現象は変わらずでした。

で、ぐぐると以下がありました。

早速、使用中以外の.tmpファイルをすべて消して、印刷をしましたが、これも現象は変わらずでした。

で、結局以下で上手くいきました。

  1. 一つだけ印刷されないページの図形全体を別ページに一時的にコピー
  2. 一つだけ印刷されないページ全体をクリア
  3. 一時的にコピーした別ページをクリアしたページへコピー

とりあえず、これで上手くいきました。

とにかく、このような場合は、部品単位で作り直してもNGで、ページ単位で作り直すと上手くいくようです。

2010-04-22 Word2003で半角数字が印刷すると全角数字に戻る!!

Word2003で見出しの項目番号を相互参照した場合の番号数字は、デフォルトで全角です。

これ、どうあがいてもデフォルトを変えて、半角にすることができません。


そこで、メニューの書式の「文字種の変更」で、一つ一つ全角から半角にするのですが、印刷すると全部全角に戻ってしまうのです!

相互参照箇所が100個あれば、100個とも元に戻ってしまうのです(泣)


試行錯誤した結果、相互参照の場合の半角への変換は、「文字種の変更」でなく、相互参照の番号数字を右クリックして「フィールドの編集」で書式に半角文字を指定します。

すると、印刷しても半角のままで全角に戻ることはなくなります。


これは、相互参照の番号数字の実体はフォントでなくフィールドコードなので、いくら「文字種の変更」にてフォントを変えてもダメで、「フィールドの編集」の半角文字指定にて半角のコードを挿入するのが正解のようです。

2010-04-21 LinuxバージョンとApacheバージョン

とりあえず、レッドハットとフェドラのLinuxバージョンが知りたい時は、コマンドでなくて、/etc/issueファイルの内容を直接見るとわかります。

$ cat /etc/issue
Red Hat Enterprise Linux Server release 5.3 (Tikanga)
とか
Fedora release 9 (sulphur)

一方、Apacheのバージョンは、httpデーモンを-vオプションで起動するとわかります。

$ /usr/sbin/httpd -v
Server version: Apache / 2.2.3
Server build: Nov 12 2008 08:10:28

2010-04-20 1Q84 Book 3 を読み終えた!!

今日、1Q84 Book 3を読み終えたので、次の本を買いに本屋さんへ行ったら、1Q84 Book 3 は売り切れでした!

いや〜、発売日当日(4/16)に買って正解でした。


感想は、もちろん、メチャクチャ面白かったですよ!

最後は、ハッピーエンドでしたが、かなり、謎が残りましたね。

これは、1Q84 Book 4 がかなり期待できそうです。


たぶん、1Q84の世界から1984の世界に戻った2人ですが、たぶん、また1Q84の世界に引きずり込まれるような気がします。

なにせ、謎だらけですから…。


ざっと思いつくだけで、以下がありますね。


前に書いた1Q84の記事をご紹介します。


1Q84 BOOK 3

1Q84 BOOK 3

2010-04-20 道・セカンドキッス・Re:ワールド

先日(4/18)に上野のライブハウスへ a pool par のライブを見に行きました。

長男に頼まれた通り、3曲の動画をとり、ユーチューブへアップしました。


3曲ともメチャクチャいい感じの曲ですよ!

是非、お聴きください!!


特に、かなえちゃんのセカンドキッスは素晴らしい曲です。

切ない乙女心が、おじさんにも伝わってきました!


◆ 道 / a pool par

D


◆ セカンドキッス / a pool par

D


◆ Re:world / a pool par

D


◆ 関連リンク

2010-04-19 手直し

以下の2つを手直し(追記)しました。

2010-04-18 ITエンジニア必見!『2038年問題』とは!

現在のパソコンやサーバーは、64ビットマシンも出てきましたが、まだまだ32ビットマシンが主流です。

32ビットで整数を表現すると、1ビット目は正負を表し、0が正の整数、1が負の整数となります。

なので、正の整数の最大値は31ビットで表され、2進数で0111 1111 1111 1111 1111 1111 1111 1111となり、10進数で2,147,483,647です。


一方、UNIX(liunx)系の32ビットマシンは、1970年1月1日0時0分0秒(UTC)からの経過秒数を使用しています。

この経過秒が、2038年1月19日3時14分7秒を過ぎると、なんと、2,147,483,647を超えてしまうのです。

すると、1ビット目が1になり、負の整数になってしまって、コンピュータが誤動作する可能性があるのです。


2038年には、すべて64ビットマシンになっていれば、問題がないかというと、実は、現在でもすでに影響が出ているのです。


あと28年、これは、2000年問題のレベルでなく、もっともっと深刻な状態になる可能性がありますね。

しかし、プログラマ特需の可能性も大なので、ものは考え様かも…。


とりあえず、28年後は、私は80才を軽く超えていますので、現役でいる可能性は限りなくゼロに近いです。

あ、そうそう、『2038年問題』の2年前にも『2036年問題』があります。


こちらは、NTPの時刻の表現に1900年1月1日 0時0分0秒 (UTC) からの積算秒数を使用しています。

この値は32ビット符号なしで表現されるため、すなわち42億9496万7295秒までしか表現できません。

これが、2036年2月6日 6時28分15秒(2月7日という説もある)にオーバーフローしてゼロになります。

NTPの時刻はWindows系で標準使用されているので、こちらも結構深刻ですね。

(WindowsではActive Directoryにおいて時刻同期が必須となったためNTP機能が標準で組み込まれている)


ということで、『2038年問題』と『2036年問題』は、若いITエンジニアの人には必見ですね!


追記(簡単にまとめると)

2010-04-17 HTTP Cookiesとは?

今回、セキュアなWEBの勉強ということで、HTTP Cookieをテストしてみました。

なにを今更…と思っているかもしれませんが、クッキーを知っているつもりでも、実は知らなかったりしますよ。

なのでとりあえず、以下の2つをリンクしときます。


HTTP Cookiesとは?

HTTPだけだとステートレスなので、複数ページに遷移するセッション管理ができません。

そこで、ブラウザ(PC)内にステータスを記憶しておき、その記憶をサーバーとやり取りすれば、セッション管理ができるようになりますね。

その記憶のことをクッキーといいます。


しかし、クッキーはこれだけではないのです。

クッキーの有効期限やクッキーを送り返すURLやドメイン名を指定することができるのです。

特に、URLやドメイン名が指定できるということは、設定したサーバー以外のドメインのサーバーにもクッキーが送れてしまうということなのです。

確かに、この辺は、セッション管理では便利なのですが、反面、悪意のハッカーに狙われるところでもあるのです。


あと、HTTPSで通信する時は、secure属性を必ずつけましょうということです。


クッキーセット
print "Set-Cookie: NAME=値; expires=値; domain=値; path=値; secure \n";

クッキーゲット
print "$ENV{'HTTP_COOKIE'}\n";

環境変数 HTTP_COOKIEへ該当するすべてのクッキーが返される。(【例】HIRO=aaa; YASU=bbb;)



今回、クッキーのテストして気がついた点を2つメモしときます。

ちなみに、テスト環境は、クライアントはWindowsXPでIE7、サーバーは2台ともWindowsXPでIIS6です。

2010-04-16 長男(a pool par)のライブ告知です!!

もちろん、ちゃいちゃんパパも行きますよ!

って、ユーチューブにアップする動画を撮ってくれと、頼み込まれました…、しょがないなぁ…撮ってやるか〜


とりあえず、長男のブログからライブ告知の引用です!

4月18日

場所 上野BRASH

チケット 2500円

出演/ つっちょ/奥村慎也/AgeAshi/TheFlau/a pool par

僕たちの出番は19時からです


アクセス方法

JR上野駅中央改札口を出て駅構内を直進。広小路出口をでてすぐ左手のデッキの階段を上ります。

左正面に見える常陽銀行と日本生命のビルを目指します。

デッキを降りて常陽銀行と日本生命の間の道を入り、そのまま直進100メートルくらい歩くと左手にあります


日比谷線、銀座線は上野駅3番出口を出て道沿いの日本生命の脇の道を入り、そのまま直進100メートル左手にあります

住所 東京都台東区東上野3ー16ー3東宝ビルB1です!!

電話番号

03 6240 1333

わかんなかったら僕に連絡ください

HIROHITO’S DIARY 告知!!

とりあえず、yhaoo地図『東京都台東区東上野3ー16ー3東宝ビルB1』の引用です。

http://map.yahoo.co.jp/pl?type=scroll&lat=35.710692353263&lon=139.77782756324&z=18&mode=map&pointer=on&datum=wgs&fa=ks&home=on&hlat=35.710692353263&hlon=139.77782756324&layout=&ei=utf-8&p=

2010-04-16 1Q84 Book3発売!!!

今日は、1Q84 Book3の発売日です!

万が一を思って、数日前に通勤途中の本屋さんで予約をしましたが、やはり平積みで沢山売っていましたね。


通勤の帰りに少し読むことができましたが、やはり、めちゃくちゃ面白いですよ!

少し、ネタバレしちゃうと、今までは『青豆』と『天吾』の章が交互でしたが、『牛河』『青豆』『天吾』の3つの章が交互になっています。


『青豆』の章があるということは……そう、青豆ちゃんは、自殺をしなかったのです!!!

いかん、ネタバレここまで…。


とりあえず、前に書いた1Q84の記事をご紹介します。



すぐ本屋さんへいってください!

いや、今の時代はアマゾンで!

1Q84 BOOK 3

1Q84 BOOK 3

2010-04-15 『Perlのよいところ』バージョンアップ

当初、4個からスタートした『Perlのよいところ』が9個になりました。

これ、『基礎文法最速マスターシリーズ』のように他の言語で『xxx言語のよいところ』が出てくるといいなぁとか思っています。

是非、言語のよいところを探してみてくださいね!

2010-04-14 WINDOWSでのhostsファイル

今月は配置転換の月で、場所が変われば、PCのIPアドレスやコンピュータ名が変わったりしますね。

すると、今まで動いたプログラムが動かなくなったりします。


今回、名前解決が不正なケースに遭遇したので、応急処置のWINDOWSのhostsファイルについてご紹介します。


名前解決のDNSサーバーが間違っている場合、本来は登録情報を直してもらわないといけませんが……

DNSサーバーはどの部門で管理しているのかわからなかったり、すぐには直らないケースもありますね。


そんな場合は、Windows系では、『C:\WINDOWS\SYSTEM32\DRIVERS\etc』フォルダにhostsというファイルがあり、そこに以下のようなIPアドレスとサーバー名+ドメイン名の対応を登録します。

192.111.222.111  hostname.xxx.co.jp

すると、DNSよりこちらのhostsの方が優先されるので、アクセスが出来るようになるのです。


しかし、サーバー名+ドメイン名が本来とは全く異なるIPアドレスに名前解決されて、当然そのサーバーにアクセスができず、アンチウィルスやファイヤーウォールでブロックされているのかなと思いすべて無効にしてもアクセスできない…ブラウザでは明らかにアクセスしているのに、IISのログには、アクセスされた形跡なし…。


そこで、コマンドプロンプトからnslookupしたら、なんと全く異なるIPアドレスが返ってきた!!

という実際にあったお話しでした。

2010-04-13 働くことの意味とは?

ん〜最近、働くのが辛く、早く定年退職できないかなぁ…なんて思う日々が続いていました。

また、サブプラム&リーマンショックからのリストラプレッシャーにも耐えるのが辛いし…。


しかし、三男が今年高校進学ということで、あと最低3年間は耐え忍ばないと…とか思っていました。

そんな中、今月事務所の引っ越しがあり、身辺整理をしていると、昔読んだ以下の本を見つけまた。

今の心境にピッタリだったので、あっと言う間に読み終えました。

そして、気がつきました。

働くことは、「自分はここに生きて、存在している」という事実を、自分に対して、そして周囲の人々や世の中に対して、はっきりと証明する行為なのです。

そして、職場とは、さまざまな試練を通じて、自分を成長させるため、大チャンスなのですから。

とにかく、リストラのことなど気にせずに、また子供のためにでもなく、自分の成長のために…働くんだと!

大事なので、もう一度書きますね『自分の成長のために働くんだと!』




この本に書いてあった『楽しく働くための三カ条』もメモしときます。


楽しく働くための三カ条

そう、「信じること」と「決心すること」が大事!



働くことの意味がわかる本

働くことの意味がわかる本


実は、今、気が付いたのですが『働くことの意味とは?』は、『生きることの意味とは?』とイコールではないでしょうか!

2010-04-12 セキュアなSQL

テストでSQLインジェクションを体験しました。本当にDBがクリア出来てしまいました!


ということで、以下の『安全なSQLの呼び出し方』をリンクしときます。


尚、MS SQL Serverの場合は、以下の2点を気をつければ大丈夫のようです。

他のフリー系DBは、なんかもっと厄介ですね(リンク先を見てください)。


ちなみに、『安全なウェブサイトの作り方』もリンクしときます。

2010-04-11 まる10年

実は、4月6日は、ちゃいちゃんの10回目の命日でした。

今年は、お友達がもう大学卒業で、社会人1年目なので、当然平日は休みでないので、もう来ることもないかな…10年もたったし…。

とか思っていましたが、会社が終わった後や休みの日に、今年も親友5人が来ていただきました。正確には1人は、留守の時に、もう1人はお手紙で…。

つまり、3人にお会いできました。この5人は毎年来ていただいているちゃいちゃんの大親友です。

本当に毎年毎年、ちゃいちゃんことを忘れないでいていただいて本当にありがたいです。

皆さん、綺麗なお嬢さんに成長していて、この大不況の中、みんなちゃんと就職ができて、凄い子ばかりです。

とにかく、毎年この「桜咲く季節」には、ナイーブになってしまいますね。パパはまだまだ頑張るよ!ちゃいちゃん!


D

2010-04-10 Perlのよいところ

本格的にPerlをやり始めた2007/4から3年間が経ちました。

その間に感じたPerlのよいところを書きたいと思います。


その前に、私のPerl歴をちょっと…。

1996年頃からC言語によりCGIのプログラムを作る仕事をしてきました。

1998年に趣味でインターネットをはじめた時に、プロバイダでC言語がサポートされていなく、サポートのあるPerlを勉強しました。

この頃は、仕事ではPerlを使っていなかったので、リファレンス正規表現も良く知りませんでした。

単にPerlでBBSの掲示板CGIとページカウンタCGIを作るレベルでした。


その1998年から約10年経った2007/4に、縁あって、Perlでの仕事をやり始め、本格的にPerlの勉強をはじめました。

その軌跡がPerlノートになりました。


で、その間に私が感じたPerlのよいところは、以下の9点です。

  1. 正規表現が言語と一体化されているところ
  2. リファレンスにより多次元配列が自由自在なところ
  3. 処理するデータが文字列やバイナリ値で区別がないところ
  4. コンパイルする必要がないところ
  5. 文字列の中で変数展開ができるところ
  6. 記述が省略できるところ
  7. CPANがあるところ
  8. 色々な方法でコーディングができるところ
  9. マジシャンのようなところ

1. 正規表現が言語と一体化されているところ

正規表現を使うのに、いちいち正規表現オブジェクトや関数等の必要がなく、正規表現が言語と一体化されていて、テキストの検索処理や置換処理が非常にラクなところ。


2. リファレンスにより多次元配列が自由自在なところ

前もってエリアの確保とかの必要がなく、インデックスを付けてアクセスするだけで、多次元配列が自由自在にできるところ。

特にハッシュと配列の組み合わせは、他言語でいう構造体配列を簡単に表現ができて、すばらしい!


3. 処理するデータが文字列やバイナリ値で区別がないところ

他言語では、文字列とバイナリ値で区別して処理をしないとなりませんが、Perlでは、その区別がありません。

区別がないので、処理が非常にシンプルに書けるのです。


4. コンパイルする必要がないところ

ご存知のようにPerlは、インタープリタなのでコンパイルする必要がありません。

なので、ソースを修正するだけで簡単に動くわけで、これになれるとコンパイルが必要な言語には戻りたくなくなります。


5. 文字列の中で変数展開ができるところ

他言語では普通、文字列に変数を含めたい時は、文字列連結で行います。

Perlでは、文字列の中で変数展開が普通にできますね。

実は、文字列の中で関数コールもできるのです。

use strict;
print "aaaaaaa @{[&test()]} bbbbbbb";
sub test {
    return "ABCDEF";
}

6. 記述が省略できるところ

ループ系での当たり前の代入処理等は、デフォルトで『$_』という特殊変数を用いるようになっていて、代入文等を記述しなくてもよく、尚且つ『$_』そのものも記述しないでいいところ(実は、わるいところでもあるかも)

while ($_ = <DATA>) {
    if ($_ =~ /^h.*e$/) {
        print $_;   # hogeを表示する
    }
}

# 上と同じ
while (<DATA>) {
    if (/^h.*e$/) {
        print;   # hogeを表示する
    }
}
__END__
hoge
foo

7. CPANがあるところ

実は、私は、CPANのモジュールをあまり使ったことがないので、ここにあげる資格はないのですが、やはり、PerlといえばCPANなのですかね。とりあえず、あげときます。


8. 色々な方法でコーディングができるところ

普通の言語では、大体同じようなコーディングになりますが、Perlでは十人十色です。

結城 浩先生のPerlクイズなど、まさに十人十色の回答がありましたね。


9. マジシャンのようなところ

他の言語だとえらく大変な処理を、Perlだとあっという間に出来てしまい。

マジシャンになった気分になれるとか!

とにかく、Perlのラクさを体験したら、もう2度と他の言語には戻れませんね!


えーと、ここまで読んで頂いたのも何かのご縁です。

皆さまが思った、Perlのよいところをコメントで教えて頂ければ幸いです。

2010-04-07 ブログ3月分をウエブページへ変換

ブログ3月分をウエブページへ変換しました。

2010-04-06 配列の代入と比較

Perlでの配列変数同士の代入は普通に出来ます。

代入先配列と代入元配列の関係は、代入すると代入先配列は代入元配列とイコールになります。

つまり、要素数も要素の並びも同じになりますね。

use strict;
use warnings;

local $, = ' ';
my @aaa = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
my @bbb = ('a', 'b', 'c', 'd', 'e');

@aaa = @bbb;
print @aaa;

一方、比較は普通にはできません。たとえば、以下はイコールになってしまいます。

my @bbb = ('a', 'b', 'c', 'd', 'e');
my @ccc = ('x', 'b', 'c', 'd', 'e');

if (@aaa == @ccc) {
    print "イコール\n";
}
else {
    print "ノットイコール\n";
}

これは、単に要素数の比較なって、上記は、たまたま要素数が同じなのでイコールになるのです。

つまり、配列同士の比較は、意外と難しいのです。

正攻法では、要素をループで比較すればいいですね。たとえば、以下の感じ。

if (ArrayCmp(\@aaa, \@ccc)) {
    print "イコール\n";
}
else {
    print "ノットイコール\n";
}

sub ArrayCmp {
my ($a, $b) = @_;
    # 要素数は同じか?
    return 0 if @$a != @$b;
    # 要素値は同じか?
    for (0..$#$a) {
         return 0 if $a->[$_] ne $b->[$_];
    }
    return 1;
}

しかし、比較するのにわざわざsubするのもアレなので、なにか良い方法がないかとググルとありました。


@deff = grep { !{map{$_,1}@array2 }-> {$_}}@array1;
perlで2つの配列を比較する方法について - あなたの疑問をみんなで解決 まぐまぐ!Q&A

これは、すばらしい!

grep、map、無名ハッシュの組み合わせが絶妙ですね。

ポイントは、mapで@array2を元にハッシュを作成して、それを中カッコで無名ハッシュリファレンスにして、そのハッシュのキーにgrepで@array1からもってくる…。

これが理解できれば、Perl初心者は卒業ですね。

分かりやすい解説が引用先に書いてありましたよ。


ちなみに、上記の@deffには、@array2と@array1がイコールだと偽が返り、ノットイコールだと一致しなかった要素値が返ります。

2010-04-06 新党「ろうがい」!

今週10日(土)に平沼氏を党首とした新党「老害」が結成するそうだ。

党名は、平沼氏が、「ひらがな」のほうが良いのではないかと言っているらしく、新党「ろうがい」になる模様である(笑)。

思想も政策についても全くバラバラで、各方面からは一体何をやりたいのか解らないとの声が多い。

愛国心を強調する者こそ売国者|ライジング・サン(甦る日本)

そんなに権力にしがみつきたいのですかね。

若い世代に任せるって発想がないのですかね。

こんな、棺桶に片足を入れている人たちを応援するわけないですね。国民は。

2010-04-05 誤送信の恐怖

現代では、企業にとって情報漏洩が最大の恐怖です。

また、社員もメールやFAXの誤送信がリストラ評価になってしまうので恐怖です。


なので、メールやFAXを送信する時は、細心の注意が必要ですね。

しかし、めちゃ忙しいと、魔が差して誤送信をしてしまうのですね。人間って…。


その後、お詫びメールや上司からの説教を嫌ってほど体験するわけです。

これで終わればいいのですが…切られてしまう人もいますね。


あと、メールの添付ファイルも間違えないようにしないとなりません。

また、逆に本来送信しないといけない相手に送信忘れで、あとから指摘されて怒られるとか…。


とにかく、メールやFAXの送信には、細心の細心の確認の確認の注意が必要です!

ということで、自戒をこめたネタでした!

2010-04-04 子供手当ての意外な財源?

デフレギャップが通説では35兆〜40兆で、とりあえず40兆あるとします。

なので、政府(日銀)は、40兆までは、お札を刷ってもインフレにはなりません。


一方、子供の数は、とりあえず、1738万人とします。

平成19年4月1日現在のこどもの数(15歳未満人口。以下同じ。)は、前年より14万人少ない1738万人で、昭和57年から26年連続の減少となり、過去最低を更新しました。

http://www.stat.go.jp/data/jinsui/topics/topi211.htm

すると単純に子供一人あたりの金額は、以下のようになりますね。

40000000000000 / 17380000 = 2301495.97

これを子供手当て26000円で割ると

2301495.97 / 26000 = 88.5

これを12ヶ月で割ると

88.5 / 12 = 7.3

つまり、子供手当ての財源は、お札を刷るだけで、約7年ももつのです!

2010-04-04 デフレの原因は長年の自民党の政治にあった!!

デフレの時は、GDPが伸び悩みます。

GDPは、ご存知のように国内総生産で、ちなにみGNPは国民総生産です。

またGDPは、以下の式で表すことが出来ます。

GDP = 民間消費 + 民間投資 + 政府支出 + 純輸出

で、政府が自由に調整できるのは、政府支出なのですが、これがなんと20年間以上も世界最低レベルになっているのです!

つまり、自民党は、ここ20年間、わざと政府支出を抑えて、GDPを低くして、デフレにしていた疑惑があるのです!

ということが、この本には書いてありました。

さらば、デフレ不況 -日本を救う最良の景気回復論―

さらば、デフレ不況 -日本を救う最良の景気回復論―

2010-04-03 想定外エラーはevalでキャッチ!

たとえば、PerlでCGIプログラムを組んでいるとします。

ご存知のようにWeb系では想定外のエラーが頻発します。

しかし、ブラウザにはCGIエラーと出るだけで、何のエラーで、何ライン(プログラムソース)で発生したかが分かりません。


そんな時は、ソースをまるごとevalブロックにしてしまうのです。

すると、想定外エラーをキャッチすることができるのです。


また、想定外エラーメッセージは特殊変数『$@』へ入ります。

しかも、プログラムソースの何ラインで発生したかも入っていますよ!


つまり、何のエラーで、何ラインでエラーが起きたのかが分かるのです。

eval {
    # 本来のCGIの処理をここに書きます。
};
if ($@) {
    print "Content-type: text/html\n\n";
    print "<html><body><h1>想定外エラー($@)</h1></body></html>\n";
}

補足:

evalブロックは、ブロックだけど実行文でもあるので、閉じ中カッコのあとにセミコロンが必要です。

また、想定外エラーの時は、$@にエラー文字列がセットされるので真となり、エラーでない時は、未定義なので偽となります。


補足2:(以下はkitsさんから、またまた教えて頂きました。いつもありがとうございます!)

CGIで想定外エラー(致命的エラー)が出た時は、とりあえず、Webサーバーのエラーログを見るクセをつけるとなにかと吉です。IISよりApacheのエラーログの方がプログラマを幸せにしてくれますね。

また、上記のようにevalしなくとも、以下の一行を入れると同等の効果があるようです。

use CGI::Carp qw(fatalsToBrowser); 

2010-04-02 4月スタートダッシュ

いや〜、忙しかった!

新年度開始(4月1日)の朝の朝礼当番から始まり、 4月スタートダッシ日中 4月スタートダッシは4つのシステムに精神的圧力を掛けられ、夕方はすっかり忘れていた某教会の宿直へ…。


なんで、同時期に4つのシステムが動きはじめる!

今、去年の年末からを抱えていた3つのシステムが佳境で、もう一つの眠っていたシステムが半年振りぐらいに動きだす。

メールが来るたびに不具合メールなのかと思ってしまう。精神的に辛い…。


ということで、いろいろと書きたいことは、あるのですが、時間的余裕と精神的余裕がありません。

土日になんとか、まとめて見ます。では、また!