雨はそのままなら街を水浸しにする

今日、駅についたら、雨は止んでたけど、えらいことになってた。
駅を出て、道路を走ってたら、側溝がえらくゴーっと言っている。
それでなんだと思ったら、側溝にあまりにたくさん雨が流れて、
挙げ句の果てに側溝から水が噴き出していた…
今日は雨はたくさん降ったけど、しかし台風ですごい雨とかそんなことでもありませんからね。
明らかな欠陥でしょう。


駅があるあたりはまさに田舎ですが、市街地でもそんな感じ。
まともな側溝すらない道だってあります。
そんな道は、すぐ水であふれかえってしまう。歩くのもつらい。
しかし、実際のところ、都合の悪い道とそうでもない道というものがあるものです。
我が家の近所は比較的雨が降っても、水がたまってしまうことはないのだけど、何が違うのか見てみた。


側溝はしっかり引かれてますね。
だけど、側溝が雨であふれかえってることは、正直見たことない。
所々、ますが置かれてて、そこに雨水が入っていきます。
そこからどうなってるのか、見ると、道路の車道の端を通る、暗渠があるのだと思うのだけど、
そこに入っていくと。そこは太いので側溝よりもゆとりがあっていいですね。
車道の端のところも、いくらか水を回収できるようにグレーチングになっている。
だから、車道も水であふれかえることはない。まぁ落ち葉やらで効果が薄れてる場合は多いけど。
そこからどうなってるかは推測だと言われればそこまでだが、
団地の開発のときに調整池ってのを作ってるのだが、まずそこに放り込むと。
これはちょっと有利ですね。団地じゃなきゃこんなもんはないからね。
その調整池からは川につながってるはずで、川にはき出されると。
ここでポイントは川に一気にはき出すことはできないということ。そこが調整池の調整池たるゆえんです。


多分、水があふれてる側溝は、ひたすら側溝のまま川に雨水を捨てようとするから、
とんでもない量の雨が、あまり太くもない側溝を流れて、あふれてるんだと思う。
なかなか難しいことなのだけど、雨水管を整備するというのが解決法になると思います。
都市では下水道の整備の時、雨水も下水に入れるという方法を取ってるところがありますね。
これで側溝があふれかえることは防げるのでいいですね。整備も簡単だし。
ただ処理できない雨水と混ざった下水を川に捨てるという欠点があるので、なかなか難しいけど。
なんで雨水とかいたマンホールがたくさんあるのだろうと思うかも知れないけど、結構威力はすごいんですよ。
そう実感しましたよ。

注目を引きつけるMozillaってすごいよね

Mozilla Firefox 3.0の配布が始まりましたね。
ギネス記録に挑戦するとか言ってましたね。もっとも短期間でダウンロードされたソフトウエアだったかな。
達成可能そうだという話を聞いたが実のところどうなのだろう。
ここ最近Mozillaへの注目が強まってますからね。
Firefoxほどではないけど、Thunderbirdを使ってる人も結構多いですからね。
がんばっていただきたいものです。


今回のFirefoxはレンタリングとJavaScriptの高速化がテーマでしょうかね。
JavaScriptはFirefoxのアドオンの多様さを支えてきたりしてるすばらしいものです。
しかしその一方で、初めからある程度高機能なOperaに比べると動作が遅いという評判でした。
そこでJavaScriptの動作を速くした、レンタリング方法を変更した。
それによってすごく速くなりました。これはすばらしいですね。
少なくともInternet Explorerを使ってる人をMozillaに誘うのには問題がない程度にはよいかと。
まぁIE6のクセのある解釈を基準に作ったページは見れない、HTML・CSSについて辛口という点はあるけどね。


Firefox 3.0でもこのページは全く問題ありません。
そもそも、FirefoxのCSS解釈などの変更はさほど大きくないはず。
Acid2にしても実用的ではないようなCSSの解釈を要求するようなものですからね。
ですから、それを正しく表示できるようになったことはあまり重要ではないですね。
まぁ1つの指標にはなりますけど。しかしCSSの規格をすべて正しく実装する必要はないのが現実だと思うよ。
多くの部分で標準的なCSSの実装をしていると考えればいいと思う。
そういう意味ではInternet Explorer 7も評価に値すると思う。
そう、再度このページのIE 7での表示を見つめ直してみた。
その結果、完全に再現できていると言っても、現実的には差し支えないとわかった。
まぁ1箇所明らかな問題があったのだが、hr要素についてなので、明文化された規定がないらしい。
それでも意図した表示ができるように少し改造を加えたらできたので、全く問題なんてないです。
あとは個性と考えよう。なのでOKです。
あと、Opera 9.5がリリースされました。インストールしてみた。
見た目が結構変わったな。これも今まで通り表示はOKです。
まぁ何が言いたいかというと、知ってる限りではInternet Explorer 6以前以外はほぼ正しい表示をするということです。
基本的にはシンプルなページですから。


ところで、日本でのWebブラウザのシェアはどんなもんなのかね?
世界的なデータでは76%がInternet Explorer、18%がMozilla Firefox、6%がSafariとのこと。
ただ、ヨーロッパはFirefoxの人気が高いし、Macは日本ではあまりユーザーいないし、
実際のところ日本では90%がInternet Explorerで、Firefoxはせいぜい6%まででしょう。
まぁそう考えると多数派はInternet Explorer、さらに都合が悪いのはほとんどがIE 6だということ。
実際使ってると、IE 7では不都合があるときがたまにあると。といっても僕は遭遇したことないけど。
まぁそんな不安のある人でも、IE 6とMozilla FirefoxかOperaかSafariは共存できますから。
一つ、作者の正しい意図を汲めるブラウザで見るのもいいかもしれませんね。
それにしてもFirefox勢いあるね。
Mozilla Japanはフォクすけなんてキャラクタを作るし…WebブラウザとかメーラーだけでここまでやるMozillaはすごいと思う。

ややこしいけど全部加法定理で説明できる

三角関数にまつわる公式はえらく多いですね。
覚えられたもんじゃない。
まぁ倍角の公式とかは加法定理で簡単に出せるので、まぁいいんだけど…
三倍角の公式とかは結構めんどくさいよな。まぁ加法定理2回使えばいいんだけどね。
しかし覚えれたもんじゃない。
積を和になおす公式。積分でたまに役立つが、これもなかなか覚えられないね。
まぁ作り方は覚えてるから、倍角の公式を使えば出せるけど…
という話です。


ところで加法定理なんてのは覚えるしかないような気がする。
cos(x+y)=cos x cos y – sin x sin y
sin(x+y)=cos x sin y + sin x cos y
x-yになったとしてもx+(-y)と解してやればいい。cos(-y)=cos y、sin(-y)=-sin yだからね。
これを思い出すにはどうすればいいかという話だが、Wikipediaにはこんな方法が載ってた。
eiθ=cosθ+i sinθ、オイラーの公式ってやつです。
回路の計算で、3+j4=5ej0.927やら表せるから、極座標表示のかけ算・割り算は簡単だという話があったので知ってる。
指数法則を使えるからだね。大きさはかけ算、角度は足し算でいいと。便利ですね。
jは回路の計算で使う虚数単位だから数学のiそのものですね。iなんて書いたの久しぶりだ。
もっとも、実際計算するときには、むしろ5∠0.927のような書き方をしてたけど。意味は同じですよ。
で、この式を使うと、これが思い出せると。
ei(x+y)=eix×eiy=(cos x + i sin x)(cos y + i sin y)=(cos x cos y – sin x sin y)+i(cos x sin y + sin x cos y)
ここで、ei(x+y)=cos(x+y)+i sin(x+y)と比較すると、さっきと同じ結果が得られると。
なるほど、確かにこれなら思い出せるな。もっとも頻繁に使う式なので忘れることはありませんが。


それでその次に頻繁に使うのが倍角の公式だな。
sin 2x=sin(x+x)=cos x sin x + sin x cos x=2sin x cos x
こっちは簡単。僕も覚えてる。
ただ厄介なのがcosの倍角の公式。こっちの方が有益なんだけどね。
cos 2x=cos(x+x)=cos x cos x – sin x sin x=cos2x-sin2x= 1-2sin2x = 2cos2x -1
sin2xかcos2xしか残らないので便利だけど、符号がなぁ…
それでこの式を変形すると、sin2xとcos2xをそれぞれcos 2xを使った式で表すことができると。
これは有益。だからこの式の作り方を覚えておいて、30秒で加法定理から作れればまぁいいかと思ってる。
三倍角の公式は加法定理を2回使ってやる、まさに作業だけど…まぁさっきの倍角の公式を利用させてもらおう。
sin 3x=sin(x+2x)=sin x cos 2x+cos x sin 2x=sin x(1-2sin2x)+2sin x cos x cos x=sin x-2sin3x+2sin x(1-sin2x)=3sin x-4sin3x
cos 3x=cos(x+2x)=cos x cos 2x-sin x sin 2x=cos x(2cos2x -1)-2sin x sin x cos x=2cos3x-cos x-2cos x(1-cos2x)=-3cos x+4cos3x
何が言いたいかというと、sin3x、cos3xをsin x,cos x,sin 3x,cos 3xを使って表すことができると。
使うことはめったにないけど、三倍角の公式でできるんだと知っておくといいかもしれない。


三倍角の公式も大概厄介だが、ただの作業だ。
それ以上に困るのが積を和になおす公式だな。sin x sin yを三角関数の足し算で表したいと言うこと。
さて、加法定理を使いたいので、α=(x+y)/2、β=(x-y)/2と置こう。これがポイント。
すると、sin x sin y=sin(α+β)sin(α-β)=(sinαcosβ+cosαsinβ)(sinαcosβ-cosαsinβ)=sin2αcos2β-cos2αsin2β
=(1-cos 2α)/2×(cos 2β +1)/2 – (cos 2α +1)/2×(1-cos 2β)/2=1/4(cos 2β+1-cos2αcos 2β-cos2α-cos 2α+cos 2αcos 2β-1+cos 2β)=1/2(cos2β-cos2α)
=1/2{cos(x-y)-cos(x+y)}、と出てきた。確かにあってる。
という風に、この手のやつは、無理矢理足し算にすれば解けることは確か。
あと2通りあるけど、それも結局そう。しかしあまりに疲れる。
こんな積分、することはあまり多くはないかもしれないけど、すごい手間なのは確かだ。


即席で作るのも結構めんどくさいけど、符号とか間違えて覚えてると痛すぎる。
それを考えると即席で作るのも意外と悪くありません。
が…コストがかかりすぎる。そこら辺が難しい。
しかし、すべて加法定理から出てきた式なんですよね。
なんでこんなに公式が多いのか、三角関数は有益だけど、めんどくさいことの証明みたいな気がする。
変形できるとえらく簡単になることは多いからね。
ぱっと簡単にできる人はすごいね。なかなかそんな人いないけど。

図書館は無限書庫ではない

学校の図書館で雑誌の処分をするというので、それを譲り受けることに。
部で受け取るということにしたのだけど、趣旨に無関係そうな本も希望してみた。
その結果が今日出たのだが、ほとんどもらえないと。
もともと期待してなかったけど、教員が研究室行きにする本と重なるのが多かったと。
仕方ないですね。まぁそう思いながら図書館から本をもらっていきました。


図書館も結構雑誌を買うのだけど、そうするととにかく増えてしまうんだよね。
それで、どこでもだいたい適当に処分することになるわけだな。
市立図書館で処分してるのはよく見ますね。
だいたい利用者に持って帰ってもらうと。そういうことですね。
こんなことするのは雑誌だけですよね。他の本ではあまりないでしょう。
というかそれをするのは図書館としてまずい気がする。
雑誌は古くなればあまり重要ではないということなのでしょう。
新聞もそうですよね。もっとも新聞の場合は縮刷版とかで保存してるけどね。
なぜ東京版なのかわからないけど。あれ微妙に違うんだよね。広告だけでなく、紙面の作りも。
内容もほとんど一緒だけど、ちょっと違ったり。けど載せてることは基本的に同じだから不思議。


まぁ有益に使わせていただくことにしましょう。
これとは直接関係ないことなのだけど、携帯電話のメールで迷惑メールがひどすぎる。
30通しかメールボックスはプールできないのだけど、適当に消すのにも金がかかるのは困る。
基本的にSoftBank Mobileのメールは一定量までの受信が無料なのでその点では有利。
その制度を利用できるSoftBankメールはSmartPhoneにとってありがたいこと。
だけどサーバーメールボックスがあふれるのはどうしようもない。この程度で済んでると考えるべきなのだろうか。
もっとも受信後30日でメールボックスからは消されるらしいけどね。それよりペースが速いのでね。

広い農地を生かすことはできるのか?

最近Simcity4をしてたんだが、あれは不思議なことが多い。
その一つが農業地区のことなんだけどね。
一応、内部的には低密度工業地区の扱いになってます。
しかし結構不思議な話ですよね。確かに、作物を作るという意味では工業ですけど。


日本の都市計画で同様のものは何かなと思ったんだけど、
市街化調整区域かなぁ…しかしその名前からもわかるように都市計画から見捨てられた地域ということだ。
どうも調べると、農業のための施設や、農家の家は建てれるらしい。
まぁ逆に言えばその程度ということ。
それとは別に農用地区域というのもあるらしいけど。


実際のところどうなのか知らないけど、学校に行く道中に、
市街化調整区域っぽいところがある。
売土地という看板が建ってたんだが、用途地域:市街化調整区域と書いてあったから。
まぁただ、その看板の建ってた土地というわけではないんだけどね。けど土地の使われ方もそんな感じだったので。
しかし、どんどん荒れ地になっていく。しかも開発するにも市街化調整区域だから何もできないと。
そんな感じにも見えた。まぁ乱開発の方が怖いのかも知れないけど。
一方、そこから進んでいくと、農地がたくさんあるのだが、結構いい感じですね。
ここは多分成功してる例。
我が家のあるあたりは、用途地域のない区域、ということで一見どんな建物でも建て放題です。
実際は制限あるけど。特に団地だと開発の計画通りに建てないといけないらしいからね。
異様な光景と言えばそうなのだけど、田んぼの中にぽつんと小さな工場があったり、
その向かい側には住宅がたくさん、さらに倉庫があったりとかなり不気味。
そんなことはあるけど、しかし結構生き生きしてる印象はありますよね。
実際そういうもんらしいですよ。


と、いろいろ言いましたけど、実際は農地だって無制限に作ったりつぶしたりはできませんからね。
それだけでも乱開発の歯止めにはなりそうなもんですよね。
Simcity4では工業地域だけど、実際は住宅地域と混在したようなのがいいですよね。
なかなか難しいけど、そんなものを簡単に作れればおもしろいと思うな。
実際なかなかないけどね。

最近の地下鉄はいろいろあるらしい

さて、最近、東京の明治通りの地下に地下鉄が走るようになったと。
ここで大阪とかなら、明治通線とかなりそうなもんだが、副都心線なんて名前になりましたね。
関東の人はこれで直感的に理解できるのだろうかね。
ただ、地図でみると、東京の地下鉄は一定の道路の下を通ってるのじゃなくて、道路を縫うように進んでる感じだよな。
だから道路の名前を路線名に取るとかえって混乱するのかな?


どうも趣旨としては、今まで山手線を介して乗り換えてた人たちを相互乗り入れで運ぶというものらしい。
まぁいろいろあると思うけどね。
そういう趣旨のものというと、今せっせと工事してる阪神なんば線とかあるよな。
今まで環状線・御堂筋線・谷町線・四つ橋線・千日前線なんかで移動してた人たちが、直接移動できると。
そういう路線を彼ら、東京メトロは作ったと。
しかしA社・メトロ・B社と乗り継ぐと3回も運賃払うから高そうな気がするけどね。実際はどうなんだろ?
ただ、メトロの運賃は結構安い気がする。いや、実際はどうか知らないけど。


そういえば、もう1年以上前になるのだけど、大阪に地下鉄今里筋線ができた。
リニアメトロ、リニアモーターを採用した地下鉄、最近多いですよね。
とにかくトンネルの断面を小さくする工夫をしていて、そんな過程でできたものらしい。
以前、長堀鶴見緑地線、これもリニアメトロなんだが、それに乗ったとき、えらく窮屈に感じた。
あれはなんだったんだろうか。エアコンのせいかな。
昨日大阪に行ったとき、地下鉄に乗ったのだが、ちょっとルートを曲げてどんなもんか見学してきた。
そうそう、大阪の地下鉄は最短距離の運賃で、どんなルートに乗ってもいいことになってる。
例えば天神橋筋六丁目~南森町は運賃は堺筋線に乗ったものとして計算するけど、
実際は谷町線に乗ってもかまわない。そういう制度らしい。
ホームには柵が取り付けられてて、電車が来ると、同期して開く。
うまいこと同期してるので、あんまりいらいらしなかった。これはいいことだ。
それで、ドアが閉まってすぐに発車する。
ワンマン運転なのにね。ワンマンの電車って運転席から毎度離れるから時間がかかりそうなもんだが。
改良されたのか、結構広々して見える。まぁ幅は狭いらしく、前の人に足がぶつかりそうになるが。
まさに路面電車。さすがに路面電車はもっと狭いか。
それで、乗り換えのため降りたのだが、降りたとき、運転士の目の前に鏡があるのに気付いた。
だから、鏡を見ながら、スイッチを押してドアの開け閉めをしてたんだろう。
そう、だからドアが閉まってすぐ走り出せたんだろう。金はかかりそうだが、いい方法だな。


しかし、今里筋線はどう考えても地下を走る路面電車だな。
正直副都心線みたいな路線とは違いますよ。まぁそれがいいのかもしれないけど。
まぁ地下鉄ってのはそういうもんです。なかなか儲からないでしょうねぇ。
せめて儲からない地下鉄なら、かかる人件費を減らしたいと。
だからワンマン運転したいけど、そのためにはスムーズに運転できる装置をつけないといけないと。
どっちの方が安いのか知らないけど、意外と装置も安いのかも知れないね。
柵もその一環で、ホームから転落するのを防いだり、安全確認の助けにしたり、いろいろ使い道のあるものらしいよ。

ポインタをPerlはやんわりとリファレンス言う

またPerl。
今日はリファレンスとサブルーチンだ。


リファレンスはポインタに似ているかも知れない。
まぁ使い道としては似てるわな。他のサブルーチンから値を書き換えたり、配列の配列を作るのに作ったり。
リファレンスの特徴は何のリファレンスでもスカラーであるということが1つある。
スカラーというのは$から始まる変数。すなわち、普通の値・文字列のことだ。

$ref1=\$_;
$ref2=\@myarr;
$ref3=\%myhash;
$ref4=\&mysub;

どう考えてもわかりにくい。こんなもん好き好んで使うものではないと思えてしまう。
ところで、配列は、スカラーの配列しか作れない。けど配列のリファレンスはスカラー。
だから配列のリファレンスの配列を作れば、配列の配列になると。なるほど…

@refs=(\@arr1,\@arr2);
print "$refs[0]->[1]\n";
print "${$refs[0]}[1]\n";

実際の使い方は、リファレンスとアロー演算子を組み合わせる方法が1つある。
リファレンスの指す配列の1番目が欲しければ->[1]、リファレンスの指すハッシュのキーが’smith’が欲しければ->{‘smith’}。
ここではリファレンス$refs[0]の指す配列の1番目だからこうなってる。
もう1つは、リファレンスを配列に戻して使う。
$refが、配列のリファレンスなら、@$ref、ハッシュのリファレンスなら%$refで表される。
さて、ここでは${$refs[0]}[1]となってるが、これは配列@{$refs[0]}の1番目という意味。Perlの配列はこうだよね。
@$refs[0]ではなくて@{$refs[0]}なのは解釈の順番がおかしくなるから。そんなときは{}で囲めばOK。
どっちでも好きな方を使えばいい。
もっとも$ref->[0]->[1]->{‘smith’}->[5]のようなものは、[]や{}に挟まれた->は省略してよいので、
$ref->[0][1]{‘smith’}[5]で構わない。だから、実は$refs[0]->[1]は$refs[0][1]でもOKです。
もちろん2つの方法を織り交ぜて、$$ref[0]->[1]->{‘smith’}->[5]、省略して$$ref[0][1]{‘smith’}[5]でもいい。
僕の感想では、ひたすらアロー演算子でつなげていく方がわかりやすい感じがします。


しかし、いちいち配列の配列を作るのに、中に入れる配列を作って、やるのはめんどくさい。
なので直接、配列のリファレンスを作る機能がある。

@refs=( [10,'あ'],[20,'う'] );
$hashref={'smith'=>[10,'foo'],'apple'=>[20,'bar']};
foreach(@refs){ foreach(@$_){ print "$_\n"; } }
print "$hashref->{'smith'}[0] : $$hashref{'smith'}->[1]\n";

()の代わりに配列なら[]、ハッシュなら{}を使うとリファレンスを直接作る。
だからこんな風に扱えるわけだ。
配列のリファレンスは値の束として使えそうな感じがするよね。


さて、サブルーチンだが、基本的な使い方はこんな感じ。

&foo('100','John');
&bar(1..10);
sub foo{
print "$_[0] : $_[1]\n";
}
sub bar{
foreach(@_){ print "$_\n"; }
}

使うときはサブルーチンの名前の前に&を付ける。
引数は配列で受け取る点が1つ特徴。@_という配列に入る。
だから$_[0]で0番目の引数が受け取れるわけ。
引数は配列であると開き直った例が2つ目。1..10は1,2,3,4,5,6,7,8,9,10と書くのと違いはないね。
ところで、サブルーチンにもリファレンスというものがある。

$ref1=\&bar;
@arr=(11..20);
&$ref1(@arr);
$ref2=sub{ print "$_[0] : $_[1]\n"};
&$ref2('100','John');

直接リファレンスも作れますよ。
C#の機能に、匿名デリゲートとかラムダ式とかあるけど、あれも直接デリゲートを作る機能だ。
サブルーチンのリファレンスの使い道はデリゲートと同じだと思うけど、オブジェクトが絡んだときの扱いは調べてない。


配列で受け取る機能の欠点は、引数として受け取れるのはスカラーだけということ。
配列を1つ受け取る時は、さっきみたいにいけるけどね。
あと、shift,popを利用して、配列の前、後からスカラーの引数を引っこ抜くという方法もある。これは裏技的な方法だな。
そうそう、引数の@_の中身は変更すると反映されてしまうよ。仮変数ではないので注意。
さて、ここで配列・ハッシュ・サブルーチンを引数に取るためにはどうすればいいかというと、
リファレンスにしてもらって受け取ると言うこと。

@arr=('foo','bar','hoge');
&foreachdo( \@arr , sub{ print "$_[0]\n"; } );
&foreachdo( [1..10] , sub{ print $_*$_ . "\n"; } );
sub foreachdo{
foreach( @{$_[0]} ){ &{$_[1]}($_); }
}

第一引数に配列のリファレンス、第二引数にサブルーチンのリファレンスを取るということ。
こんな風にいろいろ使えるわけ。
ただ、いちいち\を付けないといけないあたり直感的じゃないな。ちょっと残念。


いろいろ調べてたが、感想は、どうもめんどくさいということ。
けど、直接配列・ハッシュ・サブルーチンのリファレンスを作るのは便利な場合が多いかな。
ガリガリ使うのはいやだけど、適当な場所で使うと便利そう。
まぁしかし、多次元配列を配列のリファレンスの配列という方法で実現できるのはよい発見だったな。
どうするんだろうと悩んでたんだが、すっきり解決した。

Perlにもコンパイルが必要なときがある

テスト終わった途端に用事がたくさん発生して困る。
このままだと1日しかレポートに割けないではないか…
怖いことになりそうだ。まぁそんなわけで今から少しづつやっていきますか。
データ処理がかなりめんどくさいはずだし。


相変わらずPerlで遊んでました。
PerlでMD5を使いたかったんですが、さて、どうしたものか。
実は、MD5のライブラリがあるんです。Digest/MD5.pmってやつが。
ただ、この.pmってやつはコンパイルしてやらないといけないんだ。
もっとも基本的なものはすでにコンパイルされたものが付属してくる。ActivePerlでは付いてきてた。
cpanってやつを使えば簡単にインストールできます。

# perl -MCPAN -e shell
cpan> install Digest::MD5

初期設定がかったるいが、ミラーサイトの選択以外はEnter連打でだいたいOK。
まぁこれでOKだったと思う。ちょっと混乱してしまったけど。


さて、これでMD5の使い方だが、多分これでOK。

#!/usr/bin/perl
use Digest::MD5;
print Digest::MD5::md5_hex("foo")."\n";

まず、useで使うパッケージを読み込む。
それでパッケージ名も指定してサブルーチンを呼び出し。
ちなみにmd5、md5_base64というのもあります。md5はバイナリそのまま。
どうもPerlでパッケージを使うときはuseを使ってやるとうまくいくらしい。
そりゃそうですよね。


Perlのオブジェクト指向、PHPのオブジェクト指向というのはあんまり重要ではないことです。
しかし使ってる人いますよね。実はこのMD5にしてもオブジェクトを作っていろいろできるらしい。
あんまり積極的に使うものではないけど、便利になることもある程度の機能です。
PHPのオブジェクト指向はちょっと見たことはあるけど、実際使ったことはありません。
まぁしかし、おもしろいことはできそうですよね。
その前に、リファレンスとサブルーチンを使いたいもんだがな。
それで今度なんか試してみるかな。
余談だが…Perlのヒアドキュメントについて。

$foo = <<"EOF";
鈴木君は"$_"を食べた。
EOF

文字列のかわりに<<"EOF"か<<'EOF'を置くと。(EOFのところは任意)
それで、その直後に文字列を書いて、行を改めて最後にEOFを書くと。
<<"EOF"と<<'EOF'の違いは変数の展開のあたり。ここでは<<"EOF"なので展開される。
これを実行すると文字列の最後に改行が入るな。
なるほどねー。

死んでるメールアドレスに送ってこられても…

昨日の話の続きをしようと思ったのだが、ちょっと違う話。
もう5年ほど前になるか、メールアドレスを変更したんですよ。
それまでCATVの提供するメールアドレスだったんだけどね。
それとは別に、Yahoo! Mailを、後にGmail、現在はLibserverで自分でやってる。
メールアドレスが長いもんだから転送メールを使ってた加減で、それ以後メールアドレスの変更は起きてない。


なぜそうなったのかというと理由はいろいろあるのだが、
ただ1つの原因にとんでもない量のメールマガジンが届いていたと言うこと。
しかしもっと重要なのはいちいちPOPで受信するのがめんどくさかったということ。
POPって受信したらそれで終わりだからね。IMAPはサーバに残る。だからWebメールと併用も便利。
そんな経緯はあったのですが、プロバイダーのメールアドレスというのはそれはそれで有用ではあるので、再開発を検討しました。
それでとりあえずおびただしい量のメールマガジンの整理をすることにしました。
とりあえずメールを受信。とんでもない量だった。
しかしThunderbirdの迷惑メールフィルタでかなり弾けた。そう、迷惑メールも多いんです。
Libserverではある程度Postfixに弾かせてるけど、まぁそれでも多いからね。これは仕方ない。


迷惑メールははじきつつ、届いているメールマガジンを確認して、解除のURLを踏んだりしました。
ところで、メールマガジンの解除は多くはメール中のURLを踏むだけでOKです。
理由はいくつかあるでしょう。そもそもメールアドレスしか登録してないとか。
ただ会員登録とは別に解除だけURLでできることがあるんですよ。
退会のためにはログインが必要にも関わらずだ。
多分だが、メール配信の影響を受けるのはそのメールアドレスを現に使ってる人。
だからもしかすると、その人の家族かもしれない。
そんな無責任な人でも、退会するとなると本当に影響を受ける。たとえばポイントが消えたり。
だから、メールアドレスの現在の所有者はその会員を凍結できると。そういうことだと思います。
もちろんログインしないと解除できないのもあったよ。
ところがパスワード忘れてて、取り寄せをしたのもある。そんな場合は多くは退会をしたけど。
あと、メールの解除がきりがないので、パスワード取り寄せてログインして、退会したのもある。
いくつものメールマガジンを同時に送ってくるもので。


とりあえず現時点で出来る分は全部解除したつもり。けどどこに登録したかは覚えてないんだよね。
だから送ってきたのを手がかりに解除するしかない。
そんな果てしないことです。
それで、有益なメールマガジンがあるかと思ったのだが、まぁ1つだけあったわ。
JALマイレージバンクのメールマガジン。これはメールアドレスの変更手続きをしてなかったから。
きちんとしておきました。
しかし、このメールアドレスの再利用のあては本当にあるのかねぇ。まぁそうも思うわな。

マルチバイトを知ったperlは便利

perl 5.8からマルチバイト文字列への対応がすばらしくなりました。
これは日本語を使う人にとってはありがたい話だ。
書いてる途中でなんか飛んでしまったけど、気を取り直して書きますか。
と、その前に、マッチについてのメモ。

while($line=){
if( $line=~ m/^(.+)\s+([0-9])\s*$/ ){
print "$1 : $2\n";
}
}

このようにマッチした結果の()の内容はそれぞれ、$1,$2…に入ると、そういうことです。
これを知らなかったのは非常に残念。活用していきたいものだ。
あと、複数マッチという機能もあるのだが、これはこの先で。


さて、UTF-8を内部エンコーディングに使うメリットは何よりその冗長性でしょう。
UTF-8の構造はとんでもなくリッチ。w:ja:UTF-8のエンコード体系を見ればよくわかるかと。
EUC-JPはASCII範囲内は8ビット目は0、範囲外はすべて1、けどそれだけの区別。
田中はEUC-JPではC5 C4 C3 E6というビット列だが、租鎮罅という文字列はC1 C5 C4 C3 E6 A1と、一見田中を含んでるように見えてしまう。
Shift_JISはさらに悲惨だけどな。
しかしUTF-8は、1ビット目の範囲と2ビット目以降の範囲は重ならない。なので文字の範囲がずれてしまうことは絶対にない。
だからこそデータ量がとんでもないことになるんだけど。ほとんどの文字が3ビットなのはそこにあるといっても間違えじゃないでしょう。
さて、このメリットを利用することはマッチとかで有用ですよ。

#!/usr/bin/perl
use utf8; #use encoding "euc-jp";
open(IF,"<:encoding(shiftjis)","./test.txt");
binmode(STDOUT, ":utf8");
while(){$data.=$_;}
%datas = $data=~m/([ぁ-ん]+)\s+([0-9]+)\s*/gm;
while( ($name,$value) = each(%datas) ){
print "$name : $value\n";
}

まず、use utf8;と書く。これはUTF-8でソースコードが書かれている印。
これを付けることでマルチバイト文字列関係のサポートがよくなる。
もしeuc-jpとかだったら、use encoding “euc-jp”;と書けばいい。ここからもわかるけどUTF-8は特別扱いです。
openは見慣れないかも知れないけど、3引数open、モードとファイル名を分けて書くと。
そのモードのところに:utf8か:encoding(shiftjis)などでエンコーディングを示す。ここもUTF-8だけ特別扱い。
ここで、STDIN・STDOUTを使うときはbinmodeでエンコーディングを後付けしないといけない。
実は普通にopenした後に、binmodeで後付してもOKです。まぁどっちにしてもエンコーディングは示そうと言うことです。
じゃないと「Wide character in print at…」と言われてしまう。
それで後はあまり変わらない。文字列を連結して、マッチさせてと。
ここで、複数マッチを使ってる。gオプションがそれ。mは改行コードの取り扱いのオプション。
それで()がないときはマッチしたの全部の配列を作ってくれる、()があるときは()の中身を順に取り出したのを並べた配列を作ってくれる。
だから、

すずめ 100
うさぎ 200

をやったときは()がなければ(‘すずめ 100′,’うさぎ 200’)の配列が、()があるときは(‘すずめ’,’100′,’うさぎ’,’200′)の配列が作成される。
ところが連想配列に入れている。
けど連想配列の初期化の方法は(‘キー1′,’値1′,’キー2′,’値2’)とする方法もある、(‘キー1’=>’値1′,’キー2’=>’値2’)の方が直感的だが。
そこからもだいたい理解できると思う。
それで連想配列をeachで1つ1つ取り出して、print、これで完了。
今回は出てこなかったけど、UTF-8基準でエンコード・デコードするencodeとdecodeがある。
今回はopen時にエンコーディングを指定したけど、STDIN,STDOUT以外は別にしなくてもエラー出ません。
ただ、そのとき変換が必要だから、encode,decodeを使うわけ。

use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
while(){
$data = Encode::decode('Guess',$_);
print OF Encode::encode('shiftjis',$data);
}

しかしせっかく指定しておけば自動変換できるんだから、まぁそれでいいと思う。
Guessは類推でやってくれるということ。


東アジアの人間からすれば、非常にありがたいことですね。
拡張から、本体に取り込まれていくというのは非常にありがたいことです。
いままでjcode.pmだったかな。
けど用意めんどくさいしね。どこにでもある安心というのはありますよね。
で、なぜこんなことが必要だったかは後に説明したいと思います。
文字コードとめんどくさいことになってしまったのさ。
そうそう、set utf8;などを付けなければ、いままでとあまり扱いは変わらないので、その点は安心。