ChaichanPapa-World !

燈明日記(2010/02

◆ インデックス

◆ 2010年2月

2010-02-28 米国債を買ってはいけない!

以下のように、亀井さんとんでもないこと言ってますね。

亀井静香金融・郵政改革相は3日、日本郵政グループのゆうちょ銀行の資金運用について、米国債や社債などに多様化していくべきだとの考え方を示した。』

http://www.asahi.com/business/update/0204/TKY201002030498.html

基軸通貨であるドルを発行できるアメリカは、輸入した物をドルで払い、輸入した国には、そのドルで米国債を買わせ、ドルを還元させてアメリカ経済を回しています。

これは、アメリカのドルが回っているだけなので、日本には影響ないのですが、ここに上記引用のように円を入れると、円をアメリカに持っていかれてしまう可能性あるのです。


基軸通貨であるドルをほぼ無料(タダ)で発行できるアメリカの米国債を円で買うわけですから、タダで円をアメリカに渡しているのとイコールになるのです。

つまり、日本の資産である円がアメリカに流出してしまうわけです。

なので、米国債を買ってはいけないのです!

2010-02-28 日銀とデフレ脱却の切り札

以下のように、前回、前々回とデフレ脱却の切り札をご紹介してきました。

今回はその3弾です!


まず、デフレとは、経済全体で見た場合、需要が小で供給が大となり、需要と供給のバランスが崩れることです。

需要が小で供給が大になると、当然の如く物価が持続的に下落していきます。


それは、同時に貨幣価値の上昇も意味するのです。

同じ金額の貨幣でより多くのものを買えるようになるからです。


では、逆に貨幣価値を下落させれば物価は上昇し、デフレ脱却ができるわけです。

貨幣価値を下落させるには、貨幣供給量を増やせばいいわけです!


実は、日銀(日本銀行)は紙幣を沢山刷って、お金を供給量することができるのです。

つまり、日本は、日銀がお金を沢山供給すれば、すぐにデフレ脱却ができるのです!


しかし、日銀はそれをしません。

日銀は、インフレが大嫌いなのです。


インフレになれば、貨幣価値が下落するので、お金持ちの人(国はセレブが支配?)はそれを望まないです。

確かに、供給するものがなくて、貨幣(需要)を増やせば、問題がありますが、今の日本は供給能力があり余っていて、デフレギャップが40兆を上回っているとのことです。


なので、現状、日銀は理論上40兆までお金を供給すると丁度、需要と供給がつり合い、デフレ脱却ができるのです。

しかし、日銀はそれをしません。


ある意味、日銀がデフレ脱却の切り札を握っているのですね。これが!

参考:

2010-02-27 改行でsubmitしないようにするには?

HTMLのfrom要素にtext属性のinput要素が1つの場合、submitボタンを押さなくても、テキストボックスに改行を入力した瞬間にsubmitされてしまいます。

たぶん、親切心からそういう仕様になっているのだと思いますが、submitしたくない場合もありますね。

以下は、そうした(submitしない)場合のサンプルを組んでみました。

<html>
<body>
<script type="text/javascript">
var fg = 0;
function test() {
    if (fg == 1) {
        fg = 0;
        return false;
    }
}
function chk(e) {
    if (e.keyCode == 13) {
        fg = 1;
    }
}
</script>
<form name="F1" action="test02.html" onSubmit="return test()">
<p><input name="I1" type="text" size="20" onKeyPress='chk(event)'></p>
</form>
</body>
</html>

注意点として、『e.keyCode』のkeyCodeは、頭文字の「k」を間違って大文字の「K」にすると全く動作しなくなりますね。

2010-02-27 IE8にできない!

まずは、会社での話しです。

先日、IE7が良く落ちる(異常終了)との記事を書きました。

なので、IE8にバージョンアップしたのですが、会社にはレガシーなHTMLのイントラ資産が沢山あって、IE8では表示がおかしくなるとの理由で、IE7に戻して評価してくれと言われました。

本当は、IE8の表示の方が正常なのに……。

ということで、IE8からIE7に戻しました。

ちなみに、IE8は、全く異常終了しないし、痒いところに手が届く機能が随所にあって、凄く気に入りました。


つぎに、家での話しです。

OSはWIN2000で、ブラウザはIE6を使っています。

先日、ユーチューブでのサポートブラウザからIE6が外されるとのことで、IE8にバージョンアップしようとしたら、なんとWIN2000は対象外なのです。

そこで、Firefox3.0.18にしたのですが、フォントの大きさやスクロールや起動時間に馴染めず、結局、Opera10.10にしました。

こちらは、フォントの大きさやスクロールや起動時間に問題はありませんでした。


最後に、まとめの話しです。

ということで、IE8は凄く良いのですが…、会社でも家でもIE8にできないのです!

ちなみに、IE8もよかったけど、Opera10.10も、いい感じです。

あっそうそう、IE8からIE7に戻したら、例の異常終了が直るかなと期待しましたが、ダメでした。やはりIE7は、ウインドウを閉じないようにしないとなりませんね。

2010-02-27 MSワードで全角文字を複数指定して一気にすべてを半角文字にするには

MSワードで全角文字を複数指定して一気にすべてを半角文字にしたいケースに遭遇しました。

試行錯誤でマスターしましたので、ここにメモしときます。


Word2003

Word2007

また、逆の『MSワードで半角文字を複数指定して一気にすべてを全角文字にするには』は、上記の逆をすればいいですね。

2010-02-26 世紀の対決 マオ vs ヨナ

バンクーバー女子フィギアスケート、しなやかなキムヨナと一生懸命な浅田真央。

キムヨナが『金メダル』、浅田真央は『銀メダル』。

浅田真央の奇跡の逆転はありませんでした。


しかし、ショートの時の笑顔とフリーの時のトリプルアクセル2回は、記憶に残りました。

4年前のトリノの時は、年齢が少し足りず…4年間の猛練習後、そしてそれがフリーの4分間に集約する…。

しかも、オリンピック出場が出来るか出来ないかまでのスランプを乗り越えての『銀メダル』。素晴らしい!


しかし、日本人を逆撫でするキムヨナの発言が気になりました。

『ライバルはいません』とか『オリンピックは難しくなかった』とか…。

韓国人って…竹島占領といい…(嫌いだ)。


4年後は、共に23才、2人の成長と再対決が楽しみです。

年も、生まれた月も、身長も、体重も、美人さも、カワイイさもほぼ同じな2人…。

マオちゃんのリベンジが始まる!


実は、浅田真央の一生懸命さが、ちゃいちゃんにそっくりで…。

また、フリー終了後のインタビューでの悔し泣きが、ちゃいちゃんに本当に生き写しで…。

2010-02-26 『Attribute::Protectedのソースを読んでみました!』を手直ししました!

以下をかなり手直ししました。

もの凄く、Perlの勉強になりました。

2010-02-24 真央ちゃん、おめでとう!

まだ、フリーが残っていますが、ショートプログラムで完璧納得の演技が出来て、本人も嬉しそうでした。

なので、今の時点でも、『おめでとう!』と言いたい!

見ている方も、調子が良いのが良く分かり、安心して見てられました。


しかし、キムヨナ…、完璧な真央ちゃんの上をいきましたね。凄いを通り越して……。

明後日のフリーでは、キムヨナが先で、真央ちゃん後ですね。奇跡の逆転はありますかね?

宿命のライバル、キムヨナVS浅田真央、神さまは最高の演出をしてくれました。


とにかく、このオリンピックという緊張感の中で、本人が納得できた滑りができたことが、なによりです。

たぶん、日頃の練習の積み重ねの成果ですね。見習わなくては、いけませんね。

浅田真央ちゃん、フリーもがんばれ!!

もちろん、キムヨナも!

2010-02-23 竹島とは何か?

昨日、2月22日は「竹島の日」とのことでした。

竹島問題は、歴史的に込み入っています。分かり易く整理してみました。


むかしむかし、日本と韓国の間に2つ島がありました。


フランス人は、韓国の領土「竹島」をみつけて「アルゴノート島」と名づけました。

イギリス人は、韓国の領土「竹島」をみつけて「ダジュレー島」と名づけました。


そして、「シーボルト事件」で有名なシーボルトが天保11(1840)年に日本地図を作った時に以下のようにしました。

つまり、「ダジュレー島」は「竹島」なのに間違って「松島」としてしまったのです。

その後、「アルゴノート島」と「ダジュレー島」が同じ島だと分かり、「アルゴノート島」は無かったものとされました。


この段階で、「ダジュレー島」は、昔「竹島」と言っていたのに「松島」なってます。

そして、「松島」は、すでに使われているので、成行で、昔「松島」と言っていた島を「竹島」としたのです。


と言うことで現代では、日本と韓国の間の2つ島は、昔とは真逆の以下のようになりました。


しかし、「竹島」は、ご存知の通り、韓国に不法占拠されてます。

ちなみに、「松島」こと「ウルルンド」は韓国の領土になってます。


つまり、韓国は位置的には「ウルルンド」を、名前的には「竹島」の両方を自分のものとしたのです。

尚、1954(昭和29)年9月、口上書をもって竹島の領有権問題を国際司法裁判所に付託することを韓国側に提案しましたが、同年10月、韓国はこの提案を拒否しました。

また、1962(昭和37)年3月の日韓外相会談の際にも、小坂善太郎外務大臣より崔徳新韓国外務部長官に対し、本件問題を国際司法裁判所に付託することを提案しましたが、韓国はこれを受け入れず、現在に至っています。

http://www.mofa.go.jp/mofaj/area/takeshima/g_teiso.html

韓国って国は…もう!


2010-02-22 遅ればせながら国母問題に思う

服装や着こなしは、自由が基本だと思います。

まして、国を背負うオリンピック選手場合は、良い結果を出すためにリラクッスしなければなりません。


国母選手の自分のスタイルである着こなしのどこに問題があるのでしょうか?

全日本スキー連盟や大臣がとやかく言うことではないのでは?


もし、服装や着こなしまで強制するようだと、日本は軍国主義国家と変わらないと思う。

あくまでも日本は、自由主義国家なのだからね!

2010-02-22 Attribute::Protectedのソースを読んでみました!

本ブログの読者の方からAttribute::Protectedモジュールを教えて頂いて、ソースを見たのですがチンプンカンプンだったので、少し調べてみました。

ちなみに、本モジュールは、Javaライクなアクセス修飾子(Public,Private,Protected)をPerlのsubに実装するもののようです。

とにかく、このソースを読むとPerlの柔軟さがわかって、すごくPerlの勉強になりましたよ!


◆ソースプログラム(Attribute::Protected)
package Attribute::Protected;

use 5.006;
use strict;
use warnings;

our $VERSION = '0.03';

use Attribute::Handlers;

sub UNIVERSAL::Protected : ATTR(CODE) {
    my($package, $symbol, $referent, $attr, $data, $phase) = @_;
    my $meth = *{$symbol}{NAME};
    no warnings 'redefine';
    *{$symbol} = sub {
 unless (caller->isa($package)) {
     require Carp;
     Carp::croak "$meth() is a protected method of $package!";
 }
 goto &$referent;
    };
}

sub UNIVERSAL::Private : ATTR(CODE) {
    my($package, $symbol, $referent, $attr, $data, $phase) = @_;
    my $meth = *{$symbol}{NAME};
    no warnings 'redefine';
    *{$symbol} = sub {
 unless (caller eq $package) {
     require Carp;
     Carp::croak "$meth() is a private method of $package!";
 }
 goto &$referent;
    };
}

sub UNIVERSAL::Public : ATTR(CODE) {
    my($package, $symbol, $referent, $attr, $data, $phase) = @_;
    # just a mark, do nothing
}

1;
__END__
http://cpansearch.perl.org/src/MIYAGAWA/Attribute-Protected-0.03/lib/Attribute/Protected.pm

◆使用例
  package SomeClass;
  use Attribute::Protected;

  sub foo  : Public    { }
  sub _bar : Private   { }
  sub _baz : Protected { }

  sub another {
      my $self = shift;
      $self->foo;  # OK
      $self->_bar;  # OK
      $self->_baz;  # OK
  }

  package DerivedClass;
  @DerivedClass::ISA = qw(SomeClass);

  sub yetanother {
      my $self = shift;
      $self->foo;  # OK
      $self->_bar;  # NG: private method
      $self->_baz;  # OK
  }

  package main;

  my $some = SomeClass->new;
  $some->foo;  # OK
  $some->_bar;  # NG: private method
  $some->_baz;  # NG: protected method
http://cpansearch.perl.org/src/MIYAGAWA/Attribute-Protected-0.03/lib/Attribute/Protected.pm

とりあえず、以下が分からなかったので調べて見ました。


まず、「サブルーチン属性」と「Attribute::Handlersモジュール」は以下で理解する。

要は、サブルーチンにサブルーチン属性を指定すると、本処理とは別の処理ができるようになるのです。


UNIVERSALは、すべてのクラスのルートとなるクラスで、ここでPublic,Private,Protectedの各メソッドを定義する。

すると、これらがサブルーチン属性で起動されるようになる。


『*{$symbol} = sub {…}』は、呼ぼうとしている関数のあるパッケージのシンボルテーブル登録で、呼ぼうとしている関数名を含む型グロブをハッシュキーとして一連のCarp::croak等と、そして、最後に『goto &$referent;』で本来の処理へGoToしているロジックを、関数リファレンスとして、シンボルテーブルに再定義しています(意味通じるかな…)。


とにかく、CODE実行時(実際はコンパイルの最後?)にサブルーチン属性で起動され、上記のように実行されてから、置き換えた後の自関数を実行する。

つまり、サブルーチン属性での起動でシンボルテーブル登録の関数を置き換えるて、従来の処理の他に+αの処理をすることにより実現しているようです。

これは、すごい発想力ですね。


あと、ベアワードの「NAME」は、シンボルテーブルから関数名をもとめるためのハッシュキーになるようです。

また、「caller」と「caller->isa」は、察しの通り、呼ばれた関数や継承した関数が分かるようです。


ということで、まだまだ未熟ですが、ここまで調べてみました。

しかし、サブルーチン属性は、タイ変数と双璧をなす、Perlのヘンタイ仕様ですね!


シンボルテーブルについては、以下を参照のこと。

2010-02-21 愛用品、つぎつぎ壊れる!

ショップ99で買った折畳式ビニール傘と老眼鏡が壊れました。

また、義姉からプレゼントされた万歩計付きベルトの万歩計も壊れました。


折畳式ビニール傘は、以下のように約3年間使っていました。

老眼鏡も、約3年間使った、一番気にってたヤツでした。

万歩計は、約1年間使っていました。


貧乏なので、大事に使っていたのに、ここに来て、つぎつぎに壊れてしまいました。

形ある物は、いつかは壊れると言いますが…、悲しいですね。


折畳式ビニール傘くん、老眼鏡くん、万歩計くん、これまでありがとう!

2010-02-21 Javaサーブレットでのクラスの修正

成り行きでプログラム歴30年以上あるのですが、実は、Javaの仕事にはご縁がありませんでした。

しかし、今回始めて、Javaサーブレットでのクラスの修正をしました!


Eclipseでクラスのソースを修正して、上書きするとコンパイルまでも出来てしまう環境になっていました。

実は、Eclipseを使うのも始めてでした。


Javaは、Perlと違い、文字列の扱いがVBレベルなので、WEB系のようにテキストを沢山使う処理系では、大変ですね。

Javaを反面教師として、改めて、Perlでのテキストの扱い易さを実感しました。

とりあえず、昔に勉強で作成した以下のページが凄く参考になりました。

このページを作っておいてよかった。

改めて過去の自分へありがとう…と言いたい!!

2010-02-20 アプールパー(a pool par)のライブ

前回、『アプールパー(a pool par)と言うバンド』の記事を書きましたが…。

今回、2月17日に本八幡のBフラットバーで『アプールパー(a pool par)』のライブを見て来ました。

長男の曲はすでにアップしてある曲ばかりなので、奏恵さんとDくんの曲をアップしました。

2曲とも、凄くいい曲なので、是非、お聴きください!!


◆ 恋火 / a pool par(宇都宮 奏恵)

D



◆ 無題 Song For / a pool par(Dくん)

D


とにかく、はやくブレイクしてね!

2010-02-20 Bシェルスクリプト基礎文法最速マスター

前からの「Bシェルスクリプトのすすめ」をリメイクしてアップしました。

まとめへの登録、よろしくお願い致します。

また、以下も見やすく整理しました。

2010-02-18 IE7を異常終了させないようにするには

IE6からIE7に換えると、IE7は、やたらブラウジング中に異常終了します!

ネットでも、結構有名なことみたいです。

対策としては、プラグインやツールバーをアンインストールや無効にすると、直ることがあると書かれていますが…全然効かないですね。

結局、IE6に戻せば…などとアドバイスされていますね。IE8も出ているのに…。


で、IE7を異常終了させないようにする方法をあみだしました。

ブラウジング中にリンクをクリックすると、新規ブラウザが立ち上がる場合がありますね。

すると、IE7はタブブラウザのこともあり、つい、用済みのブラウザを右上の「×」で終了させてしまいます。

実は、これが異常終了をする原因のようなのです。


逆に言うと、ブラウジング中に新規ブラウザが立ち上がった場合、用済みでも、決して用済みのブラウザを終了させないのです。

すると、IE7は異常終了しなくなるようなのです。

2010-02-18 昨日は長男ライブを見に行きました!

日記が一日空いてしまいましたが、昨日は、会社から帰ってきて、すぐ千葉(本八幡)の長男のライブに行きました。

相変わらず、能天気な長男を見ることができました。


実は、正確には長男のライブでなく、アプールバーというバンドのライブです。長男はそのバンドのボーカルのようです。

まぁ、ギターがヘタだからなぁ…。音感はいいので練習を沢山すれば、上手くなれると思うんだけれど…。


ライブでは、バンドのメンバーのDくんとかなえさんの曲の動画が取れたので、今度、ユーチューブにアップしたいと思っています。

また、長男を応援してくれる人達とも交流が出来て、大変有意義なライブでした。これからも、長男をよろしくお願い致します。

2010-02-16 老人介護とデフレ脱却の切り札

まず、デフレを簡単にいうと、社会レベルでお金が滞る状態のことです。

つまり、デフレを脱却するには、お金が滞らないで、流れる状態を作れば良いわけです。


では、どこでお金が滞こっているのでしょうか?

実は、老人の貯金等の金融資産が1400兆円あるそうです。そう、ここで滞こっているのです。

これをフローさせれば、デフレ脱却ができるのです。たぶん。


ちなみに、日本はマスゴミの誤った情報によって大借金国のように報道されていますが、借金しているのは日本政府であって、日本国は244兆円の純資産がある世界一のお金持ちの国なのですね…これが。本当だよ!


ではどうやって、ご老人のこのお金をフローさせるかというと…その前に、なぜこれだけ溜め込んだかを推察します。

一番の理由は、老後の介護の心配が大ですね。


つまり、老人介護の社会保障を充実させて、老後の介護の心配を無くすのです。

そして、相続税を高くして、贈与税を低くするのです。


すると、老後の心配が無くなり、亡くなってからの相続ではなく、生きているうちに貧乏な若い世代に贈与する流れができるのです。

これで、お金が滞ることなく、フローしはじめ、老人介護もデフレ脱却も解決するわけです!

参考:

2010-02-15 CO2削減とデフレ脱却の切り札

まず、デフレを簡単にいうと、社会レベルでお金が滞る状態のことです。

つまり、デフレを脱却するには、お金が滞らないで、流れる状態を作れば良いわけです。

お金が流れる状態とは、仕事が沢山あって、給料が上がり、消費活動が活発化することですね。


一方、CO2削減は、なんといっても火力エネルギー削減が大ですね。

つまり、石油等の火力エネルギーから太陽光等の自然エネルギーに置き換えればいいわけです。


で、CO2削減とデフレ脱却の切り札を2つ思いつきました!

これを国家を揚げて推進(減税とかエコポイントとかいろいろ)するのです。


すると、国家レベルで太陽光発電や電気自動車関連の業界が活性化されて、仕事が沢山増えますね。

これで、仕事が沢山あって、給料が上がり、消費活動が活発化のデフレ脱却スパイラルに入れるのです。


家の太陽光発電で電気自動車の電気も賄えるし、なんたって、世界初の家と車についてCO2ゼロ国家になれるのです。

どうですか、この切り札は?


そして、結果的に国が経済的に豊かになれば、リストラも自殺もなくなるのです!パチパチ!!

あっ、それから、若い人が安心して結婚ができて、子作りもできて、少子化問題も解決!すごい!

2010-02-15 アプールパー(a pool par)と言うウェブサイト

前回、『アプールパー(a pool par)と言うバンド』の記事を書きましたが…。

今回、『アプールパー(a pool par)と言うウェブサイト』ができたらしいので、リンクしときます。

とにかく、はやくブレイクして、親孝行してください。お願いします。


◆ 道 / 小池啓仁

D

2010-02-14 基礎文法最速マスターカテゴリのまとめ

2/10から2/14まで、以下を『基礎文法最速マスターカテゴリ』へ追加しました。


基礎文法最速マスターカテゴリのエントリ数が77になりました。

スモールトークやパワーシェルも出てきましたね。

たれ込みやトラバ、大歓迎です。見つけしだい本カテゴリに登録させて頂きます。

まだ出てこない大物は、VB.NET、C言語、コボルぐらいですかね。

まだまだ、期待しています。

2010-02-13 デフレと自殺

昨日、「日本がデフレなワケ」の記事を書いたあと、デフレが12年間が続いてるの「12年間」に思い当たるふしがありました。

そう、自殺者が3万人超えたのが丁度12年前で、そして3万人超えが、12年間連続てしいるのです。

つまり、デフレと自殺が同期して12年間連続てしいるのです。


これは、偶然の一致でしょうか?

いえいえ、やはり経済的な原因で自殺した人は、かなりいるものと思います。


実は、橋本元首相や小泉元首相が緊縮財政を行わなければ、デフレにはならず、一億総中流が続いていた可能性が高いのです。

しかし、今更言ってもしょうがありませんね。


とにかく、一日も早く、デフレから脱却して、リストラや自殺などない社会になって欲しいのもです。


そう言えば、昨日、ご紹介した本の著者:三橋貴明氏が参議院選挙に立候補するらしいです。

この三橋貴明氏が当選すれば、デフレから脱却のキーマンになる可能性は大ですね!


尚、以下の本を読むと三橋貴明氏という人間が明らかになりますよ!

超売れっ子2ちゃん出身作家が明かすネットでビジネスに成功する方法

超売れっ子2ちゃん出身作家が明かすネットでビジネスに成功する方法

2010-02-12 日本がデフレなワケ

ご存知、今、日本はデフレスパイラルに入っています。

デフレでは、物が安くなり、企業は儲からず、社員の給料は下がり、リストラや自殺が増える…。


このデフレの切っ掛けは、12年前の1998年の橋本元首相の緊縮財政とのことです。

つまり、12年間つづいているのです。確かに、この12年間は、給料が横ばいですね。


デフレスパイラルから脱するには、国債を沢山発行して、公共投資をするしかないとのことです。

しかし、国債発行をさせないようにする黒幕が3者いるのです。

財務省は、緊縮財政が省益という伝統があり、世の中がいくらデフレになろうと、緊縮財政をおこなうのです。

日銀は、インフレが大嫌い、とかく少しでもインフレになりそうだと、デフレ政策をおこなうのです。

小泉・竹中コンビの2人は、橋本元首相と同様に緊縮財政を推進、特に竹中元蔵相は教科書通りの政策を行ったが、現実は教科書通りには行かなかった。


民主党には、国債を沢山発行して、公共投資を沢山して、デフレスパイラルを脱して欲しいものです。

ちなみに、国債を沢山発行しても、97%は日本の投資家が買うので、全く問題がないとのことです。


参考:

2010-02-11 三男、高校合格!!

うちの三男が、昨日高校受験で、今日合格発表がありました。

無事、合格することができました!!

やったー!おめでとう!


長男は、24歳のミュージシャン志望で、夢を追いつづけており、落ち着かない。

次男は、19歳の大学1年で、遊びまくっていて、落ち着かない。

三男は、15歳の中学3年で、今度、高校生になるバスケットマンで、落ち着かない。


おとーさんは、まだまだ、がんばって家族を経済的に支えないとなりません。

定年退職をする先輩を見るたびに羨ましくなる、年頃になりました…。

そうそう、老眼鏡の度数も2.5(55〜60才)になりました。


三男の合格した高校は、実は、私、長男、次男、ママが通った高校の中で、一番学力が高い学校です!

しかし、すでに部活は、バスケット部に決まってます。バスケットがんばってね!もちろん勉強もね!

2010-02-11 Perlオブジェクト基礎文法最速マスターを手直し

今日は、以下の『Perlオブジェクト基礎文法最速マスター』を手直ししました。

よく読むと、ブックマーク数が増えない原因が分かったような気がしました。

結果的に自分だけにしか、わからない感じになっている箇所が、結構ありましたね。

とりあえず、読者の人にも分かり易くなるように見直しました。


そして、本ブログがイマイチなのは、基本的に自分用のメモになってる点ですね。

読者の人にも、分かり易くする工夫が、足りなかったのですね。

これを克服すれば、アルファーブロガーになれますかね…(^^;。

2010-02-10 基礎文法最速マスターカテゴを手直し

今日は、以下の『基礎文法最速マスターカテゴリ』を手直ししました。

今日、あらたに3つ加えて、エントリー数は、今、『71』です。

まだ出てこない大物は、VB.NET、C言語、コボル、パワーシェルぐらいですかね。

まだまだ、期待しています。

2010-02-09 がんばるよ!

仕事の方が、大変になってきて、内心、納期を延ばしてもらえると思っていたら、現実は厳しい結論に…。

しかも、残業規制だし、また、仕事を外に出す予算もない…。

いや〜、本気を出さないと、ヤバイなぁ〜。


明日は、三男が高校受験だし。

今、リストラされるわけには行きません。

おとーさんは、がんばるよ!

2010-02-08 宿直

毎度、月に一度の宿直です。行ってきまーす!

唯一の法華経修行なので、頑張ってきまーす!


本ブログは、ほぼ毎日更新しますので、もっと日記的なことを書いていこうと、最近思っています。

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


また、以下も、もっとわかりやすく、リライトしていこうと思っています。

やはり、分かりやすい内容でないと、ブックマーク数も増えませんね。ネット意思は正直です。

2010-02-07 絵文字がUnicode化される!!(パート3)

前回(第6回)からすぐでましたね。「パンドラの箱」第7回。

この記事の著者もWG2に顔文字のユニコード化の修正案を提出して、参加するとのことですね(凄い)。

絵文字や顔文字がユニコード化すると世界はどう変わるのですかね…。


ちなみに、WG2とは、国際標準化機構 (ISO) と国際電気標準会議 (IEC) の合同技術委員会 (ISO/IEC JTC 1) 第2小委員会 (SC2) 第2作業部会 (WG2)のことですね。

2010-02-07 YouTubeが採用しているストリーミングのロイヤリティ無料期間が延長

YouTubeが採用しているストリーミングのコーデック技術「H.264」のロイヤリティ無料期間が、2015年まで延長することになりました。

広く使われているビデオエンコード技術「H.264」の特許をライセンスしているグループが、ストリーミングメディアへの無料提供を更新し2015年まで延長することを選択した。競合するオープンソース陣営に攻撃材料を与えないための決定だ。

 MPEG LAは特許を所有する26者に代わってH.264関連の特許1000件以上をライセンスしている。2010年末まで続く現在の方針では、ビデオ視聴が無料である限り、H.264の技術を使ってビデオをストリーミングするインターネットサイトにロイヤリティを課していない。

 2010年より先のライセンス条件がどうなるのか、多くの人がMPEG LAの発表を待っていた。米国時間2月2日、MPEG LAはストリーミングでの使用を無料とする方針を2015年12月31日まで延長することを明らかにした。

http://japan.cnet.com/news/media/story/0,2000056023,20408103,00.htm

5年間延びたことが、どう転ぶか…。

MPEG LAの天下になるか、オープンソース陣営の天下になるか?

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

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


しかし、柳の下に2匹目のドジョウはいませんでしたね。

ブックマークの数が違いすぎる…

2010-02-06 Perlオブジェクト基礎文法最速マスター

Perl5でのオブジェクトの基礎を解説したいと思います。

Perlでのオブジェクト指向と言えば、モダンPerl系ではMooseモジュール等なのですが、今回は、あくまでも基礎編です。


Perlで最速にオブジェクトをマスターするには、まず、「リファレンス」と「use宣言」と「bless」の3つが理解できていないとなりません。


なぜかと言うと、Perlでのオブジェクトはblessされたリファレンスなのです。また、Perlでのクラスはモジュールなのです。そのモジュールでの一番の謎は、use宣言なのです。


なので、はじめにこの3つを理解してから、そのあと「オブジェクト」と「オブジェクト指向」について解説していきます。

つまり、以下の順番です。



リファレンスについて

普通、リファレンスといえば、一覧の機能参照のことですが、Perlでリファレンスといえば、言語仕様のアドレス参照のことなのです。

まぁ、PerlでのリファレンスをC言語でいえば、アドレス演算ができないポインタのようなものなのです。


たとえば、配列変数 @array のリファレンス(参照)は、 \演算子で取得することができます。

以下は、配列変数 @array のリファレンスをスカラー変数 $array_ref1 へ格納しています。

my @array = (1,2,3);
print $array[2], "\n"; # 3番目の要素を表示
my $array_ref1 = \@array; # 配列変数のリファレンスをスカラー変数へ格納

つぎにリファレンスから元の値を求めたい時は、デリファレンスすると言います。

デリファレンスには、参照先の変数の識別子を先頭に付け足す方法と矢印演算子『->』を使う方法の2通りがあります。

print $$array_ref1[2], "\n";  # 3番目の要素を表示;
print $array_ref1->[2], "\n"; # 3番目の要素を表示

リファレンスの利用場面は、私が思いつくところでは以下のケースです。


◆多次元配列を処理するケース
my $array_ref1 = \@array; 

配列変数の@の前に、\をつけると、配列のリファレンスが取得できます。

上記は、配列@arrayのリファレンスを$array_ref1へ格納しています。

また、無名配列のリファレンスを格納することもできます。

my $array_ref2 = [ 1, 2, 3, 4 ]; 

リストを [ ] でくくると、無名配列になり、そのリファレンスを$array_ref2へ格納しています。


つぎに、リファレンスから元の値を取得することをデリファレンスといいます。

my $array_ref2 = [ 1, 2, 3, 4 ]; 
print $array_ref2->[3]; #デリファレンス

ちなみに、『->』は矢印演算子といい、リファレンスをデリファレンスします。


補足:リファレンスの元をリファレントいいます。

つまり、$array_ref1がリファレンスで、\@arrayがリファレントです。


この機能を利用すると多次元配列の処理が可能です。

以下は、配列変数 @a の要素に配列のリファレンスを各々格納していて、結果的に2次元配列にしています。

@a = ( [ qw(00 01 02) ],
       [ qw(10 11 12) ],
       [ qw(20 21 22) ]);
for $i (0 .. $#a) {
    for $j (0 .. $#{$a[$i]}) {
        print '$a[' . $i . '][' . $j . ']=' . $a[$i][$j] . '   ';
    }
    print "\n";
}

尚、上記では『->』矢印演算子がありませんが、大括弧(ブラケット)や中括弧(ブレース)の間にはさまれた矢印は省略可能なのです。


◆関数をリファレンスでコールするケース

関数のリファレンスも配列と同様にできます。

sub01("aaa");   # 普通にコール
$sub = \&sub01;
$sub->("aaa");  # リファレンスでコール
sub sub01 {
    print "--- sub01 $_[0]---\n";
}

『$sub = \&sub01;』で関数のリファレンスを格納して、『$sub->("aaa")』でコールしています。


◆関数の引数へ配列を渡すケース

Perlでの関数の引数はリストです。

引数に配列変数を渡すとリストに展開されてしまい、普通は上手く配列変数を渡せません。

そこで登場してくるのが配列変数のリファレンスです。

リファレンスなら、上手く配列変数を渡せるのです。

my @bbb = ("bbb", "ccc", "ddd");
my @xxx = ("xxx", "yyy", "zzz");
sub02("aaa", \@bbb, \@xxx);  
sub sub02 {
    print "--- sub02 $_[0]---\n";
    print "--- sub02 $_[1]->[0]---\n";
    print "--- sub02 ${$_[1]}[1]---\n";
    print "--- sub02 $_[1][2]---\n";
    print "--- sub02 $_[2][0]---\n";
    print "--- sub02 $_[2][1]---\n";
    print "--- sub02 $_[2][2]---\n";
}

◆ 関数のリターン値にするケース

関数のリターン値でblessしたリファレンスが返された場合、それは、他言語でいうオブジェクトと同じ感じになるのです。

my $date = DateString->new();
print $date->to_string, "\n";

package DateString;
sub new {
    my $class = shift; # 第一引数は、クラス名が渡される。
    my $time = shift || time();
    return bless { time => $time }, $class; # blessしたリファレンスを返す。
}
sub to_string {
    my $self = shift;
    return scalar localtime $self->{time};
}


use宣言について

Perlをやり始めると、requireはすぐ分かるんだけれど、useって謎だなぁって思いますね!

今回は、そんなuseの謎に迫ります。


はじめに、requireは、C言語でいう%includeと同じで別ファイルにあるソースを実行時にあたかも自ソースとして読み込みます。

つぎに、useは、実行前(コンパイル時)にあたかも自ソースとして読み込みます。


実行前というのは、Perlではコマンド起動時にコンパイルしてから実行するという2段階方式になっているのです。

つまり、useはコンパイルに実行され、requireはコンパイルに実行されるのです。


そして、読み込んだソース(モジュール)にpackage宣言がない場合、useとrequireでは、これ以外の違いはありません。

しかし、モジュールにpackage宣言があると、ちょっとややっこしくなるのです。


まず、モジュールでなく、メインソースの方には、package宣言がありませんが、実は、デフォルトでmainというpackage名になっています。

つまり、逆に言うと、package宣言のないモジュールは、mainモジュールなのです。

一方、モジュールの方は、package宣言でpackage名をmain以外で指定すると、当然ですがメインソースとは別のpackage名になりますね。


しかし、別のpackage名になっても、useには他モジュールを、あたかも自モジュール(mainモジュール)にあるようにする仕組みがあるのです。

たとえば、以下のサンプル mainモジュールとModuleモジュール をご覧下さい。

いきなり、importが出てきますが、これは、Moduleモジュール内でExporterモジュールを継承していて、Exporterモジュール内のメソッドなのです。


◆サンプル

・mainモジュール

#use Module;
BEGIN { require Module; Module->import;} # use Module; と等価
print sumx(5,3),"\n"; # Moduleモジュールのsumx関数があたかも自関数のように使える

・Moduleモジュール

package Module;
use base Exporter;          # use Exporter; our @ISA = qw(Exporter); と等価
our @EXPORT = qw(&sumx);
sub sumx {
 return $_[0]+$_[1]; # 渡された引数2つを加えて返す処理
}
1;

◆補足

Moduleモジュールでは、『use base Exporter』でExporterを継承して、『our @EXPORT = qw(&sumx);』でsumx関数をエクスポートしています。

mainモジュールでは、『Module->import;』でModuleモジュールでエクスポートしたsumx関数をインポートしています。



blessについて

useやモジュールとリファレンスが理解出来てくると、blessが気になってきますね!

今回は、そんなblessの謎に迫ります。


blessを一言でいうと、リファレンスとパッケージを紐付けます。


たとえば、以下を見てください。

use strict;
use warnings;

my %test_HASH = (aaa => 'XXX', bbb =>'YYY');
my $test = bless \%test_HASH, 'package01';  # リファレンスとパッケージを紐付け

print '-->', $test->{aaa}, '<--', "\n";
$test->test01(3);
print '-->', $test->{aaa}, '<--', "\n";

package package01;
sub test01 {
    print "第1引数は$_[0], 第2引数は$_[1]です。", "\n";
    my $obj_self = shift;
    $obj_self->{aaa} = 'ZZZ';
}

『my $test = bless \%test_HASH, 'package01';』で、%test_HASHのリファレンスとpackage01のパッケージを紐付けています。

そして、blessのりターン値が%test_HASHのリファレンスなのですが、だだのリファレンスでなく、blessで紐付けられたpackage01パッケージも含まれるのです。

なので、『$test->test01(3);』のようにpackage01パッケージのtest01サブをコールすることが出来るのです。


コールする時、『->』矢印演算子を使うとtest01サブでは、自動的に第1引数が自リファレンスになるのです。

なので、『$obj_self->{aaa} = 'ZZZ';』でリファレンスからもとのハッシュ変数にアクセスして書き換えが可能なのです。


結果的にリファレンスが、ハッシュ変数(プロパティ)とサブルーチン(メソッド)を持つことになるのです。

プロパティとメソッドと言えば、そう、オブジェクトになるのですね…これが!!



オブジェクトについて

えーと、Perlでは一つのパッケージが一つのクラスになります。

つまり、パッケージ名がクラス名になるのです。


また普通、クラスには、オブジェクトを構築するコンストラクタがあります。

コンストラクタは、blessでリファレンスをクラス名に紐付けて、リターン値にします。

コンストラクタの呼び出し側では、リターン値を変数に格納して、インスタンスとします。


って、文章で説明しても分かり辛いので、以下のソースを見て感じとってください。

use strict;
use warnings;

print "\n", '◆ポイント1の例(パッケージ名(クラス名)が第1引数)', "\n";
package00->test00(3); # クラス名に矢印演算子で関数をコールする

package package00;
sub test00 {
    print "第1引数は$_[0], 第2引数は$_[1]です。", "\n";
    my $class = shift;
    print "第1引数は $class でクラス名になります。\n"
}


print "\n", '◆ポイント2の例(blessリファリンス(オブジェクト)が第1引数---', "\n";
my %test_HASH = (aaa => 'XXX', bbb =>'YYY');
my $test = bless \%test_HASH, 'package01';

print '-->', $test->{aaa}, '<--', "\n";
$test->test01(3); # インスタンスに矢印演算子で関数をコールする
print '-->', $test->{aaa}, '<--', "\n";

package package01;
sub test01 {
    print "第1引数は$_[0], 第2引数は$_[1]です。", "\n";
    my $obj_self = shift;
    $obj_self->{aaa} = 'ZZZ';
    print "第1引数は $obj_self  でオブジェクトになります。\n"
}


print "\n", '◆ポイント3の例 オブジェクト例(委譲)---', "\n";
my $obj_package02 = package02->new(); # newはオブジェクトコンストラクタでこれを起動(委譲)する
                                      # $obj_package02にはインスタンスが格納される
print '-->', $obj_package02->{bbb}, '<--', "\n";
$obj_package02->test02(4);            # オブジェクトのメソッドを起動する
print '-->', $obj_package02->{bbb}, '<--', "\n";

package package02; # パッケージは、Perlではクラスになる
sub new {
    print "第1引数は$_[0]でクラス名です。", "\n";
    my $class = shift;
    my %test_HASH = (aaa => 'XXX', bbb =>'YYY');
    return bless \%test_HASH, $class;
}
sub test02 {
    print "第1引数は$_[0], 第2引数は$_[1]です。", "\n";
    my $obj_self = shift;
    $obj_self->{bbb} = 'ZZZ';
    print "第1引数は $obj_self  でオブジェクトになります。\n"
}


オブジェクト指向について

Perlは元々は、オブジェクト指向言語ではありません。

しかし、柔軟な言語仕様のPerlでは、オブジェクト指向言語のように振る舞うことも可能なのです。


普通、オブジェクト指向プログラミングでは、以下の要素が必要です。


ということで、カプセル化とオーバーロード以外は、大丈夫なのです。

以下に、クラス、コンストラクタ、継承、多態性、オーバーライドを使用したサンプルを書いてみました。


◆サンプル
use strict;
use warnings;

my $obj;
my $hiki = shift;

if ($hiki eq '1') {
    $obj = Otokonoko->new();
}
else {
    $obj = Onnanoko->new();
}
print $obj->getName(), "\n";
$obj->shumi();


package Person;
sub new {
    my $class = shift;
    my $self = {
        Name => $class,
    };
    return bless $self, $class;
}
sub getName {};


package Otokonoko;
use base 'Person';
sub getName {
    my $self = shift;
    return $self->{Name};
}
sub shumi {
    print "バスケ\n";
}


package Onnanoko;
use base 'Person';
sub getName {
    my $self = shift;
    return $self->{Name};
}
sub shumi {
    print "ケーキ作り\n";
}

◆実行結果
C:\perltest>perl tatai.pl 1
Otokonoko
バスケ

C:\perltest>perl tatai.pl 2
Onnanoko
ケーキ作り



たぶん相互リンク

2010-02-05 基礎文法最速マスターカテゴリのまとめ

今日は、基礎文法最速マスターカテゴリをまとめました。

まだ出てこない大物は、VB.NET、C、コボル、スモールトーク、パワーシェルぐらいですかね。

まだまだ、期待しています。凄いの出て来いや〜(高田風)

2010-02-04 基礎文法最速マスターカテゴリ

本カテゴリは、いろいろなプログラム言語等の入門レベルのコンテンツをまとめたリンク集です。

始めにid:perlcodesampleさんが『Perl基礎文法最速マスター』をまとめられたら…つぎからつぎへと他の言語のが出てきました。

沢山出てきたので、カテゴリにまとめてみました。皆さまのお役に立てれば幸いです。


2010年3月2日現在 88 エントリーです。


◆スクリプト系

◆オブジェクト指向系

◆Web系

◆マクロ系

◆手続き型系

◆関数型系

◆問い合わせ系
◆アルゴリズム系

◆ハード制御系

◆プログラム言語以外系

◆まとめ系

◆未分類系(単に私が理解できていないため未分類になっています)

2010-02-03 久々にホットエントリになりました!

昨日、寝る前に、前に書いた『正規表現』の初心者向け記事が、丁度、基礎文法最速マスターになるのではないか…と思いつく!

30分で、その記事をアレンジして、『正規表現基礎文法最速マスター With Perl』としてアップしました。

久々にホットエントリにさせて頂きました!パチパチ!

ブックマークして頂いた皆さま、ありがとうございます。


他の基礎文法最速マスターも簡素に分かりやすく紹介していて、基礎文法最速マスターシリーズは、素晴らしい!

始めにまとめた『Perl基礎文法最速マスター』のid:perlcodesampleさんには感謝感謝です。

しかし、こんなに凄いことになるとは、想定外でしょうね…、id:perlcodesampleさんが一番驚いているかもです。


新たな基礎文法最速マスターの発掘とカテゴリ分けは、もう少し、日にちを置いて、落ち着いてから行いますね。

基礎文法最速マスターシリーズは、本当にすばらしいコンテンツばかりなので、カテゴリ分けすれば、仕事でも結構つかえそうですね。

ということで、今後の基礎文法最速マスターシリーズの発展が楽しみです。

2010-02-02 正規表現基礎文法最速マスター With Perl

Perlでの正規表現のサンプルと文法一覧です。

他の言語をある程度知っている人はこれを読めば正規表現の基礎をマスターして正規表現を書くことができるようになっています。

簡易リファレンスとしても少し利用できると思います。


他言語からの人は、正規表現を使う機会がなかったかもしれませんが・・・。

Perlでは、正規表現を使うための言語と言っても過言ではありません。

正規表現を使うことによりテキスト(文字列)編集処理が飛躍的に楽になるのです。


では、まずはじめにテストデータ、family.txt を用意します。

このテストデータを元にしてサンプルプログラムを踏まえて解説をしていきますね。


・family.txtファイルの内容
macha koike
yachu koike
chaichan koike
hiro koike
mama koike
papa koike
koike 6
ni-bo- horie yasashii
nee-nee horie chottokowai
60 horie
ma-kun murai
sachi murai
kazumasa murai
hisa


◆マッチング

まず始めに、苗字が『koike』の人をマッチさせてみましょう。(サンプル01 sample01.pl)

while($_ = <STDIN>){
   if($_ =~ /koike/){
      print $_;
   }
}

上記は、標準入力からデータを読み込んで一行づつループし、その行データに『koike』がマッチするか調べ、マッチした時に行データを標準出力しています。

『$_ =~ /koike/』の式はマッチした時は、真を返し、マッチしない時は、偽を返します。

では、実行してみましよう。

% sample01.pl < family.txt
macha koike
yachu koike
chaichan koike
hiro koike
mama koike
papa koike
koike 6
・補足1

逆にマッチしない時は真を返し、マッチした時は偽を返すには『$_ !~ /koike/』とします。



◆アンカー

まずいことに、名前以外の koike 6 もマッチてしまいました。

そこで、koikeという文字列がデータの末尾に一致する場合のみに限定します。(サンプル02 sample02.pl)

while($_ = <STDIN>){
   if($_ =~ /koike$/){
      print $_;
   }
}

/koike$/の『$』は、文字列の末尾にマッチする記号で、アンカーと言います。

アンカーには、他に文字列の先頭にマッチする『^』と単語の境界(正確には、単語の先頭あるいは末尾)にマッチする『\b』、それ以外の部分にマッチする『\B』があります。

では、実行してみましよう。

% sample02.pl < family.txt
macha koike
yachu koike
chaichan koike
hiro koike
mama koike
papa koike

今度は上手く行きました。


・アンカー『^』の検索(サンプル03 sample03.pl)

つぎに、アンカー『^』を使って『k』で始まる人を検索してみましょう

while(<STDIN>){
   if(/^k/){
      print;
   }
}

尚、『$_』は省略可能です。

% sample03.pl < family.txt
koike 6
kazumasa murai

・補足2

また、アンカーには、 文字列の先頭にマッチする 『\A』 と文字列の末尾にマッチする 『\Z』 があります。

『\A』 と 『^』 、『\Z』 と 『$』 は機能がよく似ていますが、複数の行がある文字列を対象に正規表現を行った場合、『^』 は改行の直後にもマッチしますが、『\A』 は文字列の先頭にしかマッチしません。

また、『$』は改行の直前にもマッチしますが、『\Z』は文字列の末尾にしかマッチングしません。



◆文字クラス

また、よけいな koike 6 がマッチしてしまいました。

そこで、koike 6 には数字が入っていますので、数字があるとNGにすればいいわけです。

ですが、発想を変えて、数字以外の文字が連続するとしても同じです。


・数字以外の文字が連続の検索(サンプル04 sample04.pl)
while(<STDIN>){
   if(/^k[^0-9]+$/){
      print;
   }
}
% sample04.pl < family.txt
kazumasa murai

今度は上手く行きました。

まず、[〜]は文字クラスといって、[0-9]の場合は 0から9までの1文字にマッチします。

[^0-9]は文字クラスの中に ^が付くことによって文字クラスの否定を意味します。

文字列のアンカーの『^』とは別物です。

[^0-9]+の+は1回以上の『繰り返し』という意味です。

つまり、0-9以外の一文字の繰り返しになります。

$は末尾にマッチのアンカーの$です。


・1語の名前を検索(サンプル05 sample05.pl)
while(<STDIN>){
   if(/^\S+$/){
      print;
   }
}
% sample05.pl < family.txt
hisa

\Sも文字クラスで、空白文字以外を表します。

つまり、^\S+$ は先頭が空白文字以外で、これがかつ一回以上の繰り返しで、末尾までになります。


・3語の名前を検索(サンプル06 sample06.pl)
while(<STDIN>){
   if(/^\S+\s+\S+\s+\S+$/){
      print;
   }
}
% sample06.pl < family.txt
ni-bo- horie yasashii
nee-nee horie chottokowai

\sも文字クラスで、空白文字(空白,タブ,改行)を表します。\Sの反対です。

つまり、^\S+\s+\S+\s+\S+$ は先頭が空白文字以外で、これがかつ一回以上の繰り返した後、空白文字を一回以上の繰り返し、空白文字以外一回以上の繰り返し、空白文字を一回以上の繰り返し、空白文字以外一回以上の繰り返しで、末尾までになります。


・文字クラス一覧
    [ABC]           A,B,Cのいずれか1文字    
    [A-Z]           A〜Zまでのいずれか1文字
    [A-Za-z0-9]     A〜Z, a〜z, 0-9までのいずれか1文字    
    [^ABC]          A,B.C以外の文字
    [^A-Z]          A〜Z以外の文字  
    \w              英数文字。[a-zA-Z0-9]と同様    
    \W              \w以外の文字
    \d              数値文字。[0-9]と同等    
    \D              \d以外の文字
    \s              空白文字(空白,タブ,改行)     
    \S              \s以外の文字
    \b              単語の区切り
    .               任意の一文字

・補足3

/koike/ だと koikesでもマッチしてしまいますが、/\bkoike\b/だと回避できます。

・補足4

\wと\Wは、アスキー系以外では機能しない場合があるらしい。



◆メタキャラクタとエスケープ

正規表現において特殊な意味を持つ文字をメタキャラクタと呼びます。

    + * ? . ( ) [ ] { } | \ $ ^

\は、メタキャラクタの本来の作用をエスケープし、

メタキャラクタ以外では書かないのと同じになります。

たとえば、


^\^ は、^という文字で始まる行にマッチ

\\ は、\自体にマッチ


また、\Qと\Eの間に挿入された文字列は全部の文字の前に \ が挿入されたものと同じです。

/\o\)\+\>/ と /\Qo)+<\E/ は同じ。



◆繰り返し
    A+              1個以上連続したA(A, AA, AAA, ...)
    A*              0個以上連続したA(  , A, AA, AAA, ...)
    A?              0または1つの任意文字(  , A, B, C, ...)
    A{5}            5回繰り返し。 AAAAAと同じ
    A{3,}           3回以上繰り返し。 AAA+と同じ
    A{3,5}          3回以上5回以下繰り返し。 AAAA?A?と同じ


◆ 最大マッチと最小マッチ

たとえば、以下のようなデータがあったとします。

<h1>Koike family</h1> <h2>Home Page</h2> <h3>By chaichanpapa</h3>

このデータからタグのみ除去してみましょう。

タグは < ではじまり、 > で終わる文字列です。

その文字列の中を「.」の任意の一文字で「*」で0回以上の繰り返しとして指定します。

ですので、以下のようなプログラムになります。

・サンプル(sample10.pl)
while(<DATA>){
      s/<.*>//g;
      print;
}
__END__
<h1>Koike family</h1> <h2>Home Page</h2> <h3>By chaichanpapa</h3>

では、実行してみましょう。

% sample10.pl

%

改行のみの表示だけになってしまいました。

実は、perlでは、パターンマッチがもっとも長い文字列とマッチする最大マッチなのです。

ですから、<h1>Koike から chaichanpapa</h3> まで削除されてしまいました。

では、タグのみ削除するにはどうしたらいいでしょう?

それには最小マッチの ? を指定します。

・サンプル(sample11.pl)
while(<DATA>){
      s/<.*?>//g;
      print;
}
__END__
<h1>Koike family</h1> <h2>Home Page</h2> <h3>By chaichanpapa</h3>

では、実行してみましょう。

% sample11.pl
Koike family Home Page By chaichanpapa

今度は、タグが除去され、上手くいきました。


・補足5

最大マッチと最小マッチは、英語(perlretut.pod)での"maximal match"と"minimal match"の訳です。

しかし、訳者によって、最長マッチと最短マッチや最多マッチと最少マッチになっていますね。

ちなみに、私は、すP派です。



◆グループ化と選択

文字列を繰り返すときは()を使ってグループ化します。

    koi(ke)+        koike, koikeke, koikekekeなどにマッチします。
     
    いくつかのパターンのどれかにマッチさせるときは | を使います。
    (選択はパフォーマンスがあまり良くないとのことです。)

    macha|yachu     machaかyachuにマッチします。
    koike(X|Y)      koikeXかkoikeYにマッチします。


◆カッコを使った記憶

また、グループ化した部分は後から参照することができます。

これを後方参照といい、 同じ正規表現内で後方参照を行うには、\1, \2... を用います。

    /(koike)\1/    koikeが2回連続する文字列にマッチします。

また、正規表現外で後方参照を行うには、マッチ特殊変数 $1, $2... を用います。

$str = 'koike chaichan';
$str =~ /^(k.+) (c.*)$/i;
print $1, "\n"; # koikeと表示される
print $2, "\n"; # chaichanと表示される


◆マッチ特殊変数

マッチ特殊変数には、$1,$2,・・・の他に、$` , $& , $'等があります。

これらは、パターンマッチしたときに「マッチする前までの文字列」、「マッチした文字列」、「マッチした後の文字列」が各々、$` , $& , $' に格納されます。では、プログラムで確かめてみましょう。


サンプル sample14.pl
  $n = 0;
  while(<STDIN>){
        chomp;
        / \S+ | /;
        ++$n;
        print "*** $n ***\n";
        print "AAA: $`\n";
        if($& ne " "){
           print "BBB:" . substr($&, 1, length($&) -2) . "\n";
        } 
        print "CCC: $'\n";
        print "\n";
  }
% cat family3.txt
macha koike
sayuri koike chaichan
%
%
% sample14.pl < family3.txt
*** 1 ***
AAA:macha
CCC:koike

*** 2 ***
AAA:sayuri
BBB:koike
CCC:chaichan

まず、chompは $_ の末尾の改行コードを切り落とします。

/ \S+ | /; は「左右に空白を持つ非空白1文字以上か、または、1文字の空白」のマッチです。

つまり、今回の場合は、 *** 1 ***は「1文字の空白」のマッチで、 *** 2 ***は「左右に空白を持つ非空白1文字以上か」にマッチします。

そして、$` と $& と $' に各々の値が格納されます。尚、$&には前後にスペースが入っていますので、substr($&, 1, length($&) -2)で削除します。



◆置換処理

置換演算子(s///)を用いると、文字列の置換を行うことができます。

my $str = 'koike sayuri';
$str =~ s/(koike) sayuri/$1 chaichan/; # $strは 'koike chaichan' になる
print $str, "\n";

・修飾子

以下の修飾子を指定することにより、パターンマッチの振る舞いを変えることができます。

・i修飾子

i修飾子は、正規表現がアルファベットの大文字小文字を区別せずにマッチするようにするために指定します。

m/^chaichan$/i; # chaichanにもChaichanにもCHAICHANにもChAichanにもマッチする。

・s修飾子
#「.」が改行にもマッチするようになる
my $str = "aaa bbb\nccc ddd";
print "No Match1\n" if ($str !~ /bbb.*ccc/);
print "Match1\n"    if ($str =~ /bbb.*ccc/s);

・m修飾子
#m修飾子は、複数行として扱う
my $str = "aaa bbb\nccc ddd";
print "No Match2\n" if ($str !~ /^ccc/);
print "Match2\n"    if ($str =~ /^ccc/m);

・x修飾子

正規表現内の空白や改行が無視され、「#」以降はコメントとして扱われます。

# 1と出力
print 1 if 'Chaichan' =~ /
C
h
a
i
# コメント
c
h
a
n
/x;

・e修飾子

以下はあまり意味がないプログラムですが、3回『e』しています。

my $str = "hello world";
$str =~ s/\w+/subx()/eeeg;
print $str;

sub subx {
    return 'suby()';
}
sub suby {
    return 'subz($&)';
}
sub subz {
    ucfirst($_[0]);
}

C:\perltest>perl reg_e.pl
Hello World

・g修飾子

連続して何回もマッチの gですが、上記で『s/\w+/subx()/eeeg』を『s/\w+/subx()/eee』にすると、表示は『Hello world』となり、worldはそのままで、Helloだけ『h』が『H』になり、連続しなくなります。

逆にいうと、g修飾子を指定すると連続して何回もマッチするわけです。


・o修飾子

変数展開が最初の1回だけ行われます。

逆にいうと、o修飾子を指定しない場合は、毎回変数展開される。

my $str = "aaa bbb\nccc ddd";
my $regex = 'aaa';
for (1..10) {
    print "Match3\n" if ($str =~ /$regex/o);
}


◆拡張構文

Perlには、以下のような拡張構文があります。

拡張構文は、キャプチャ(カッコを使った記憶)を行わないため、マッチした部分を正規表現の中で\1、\2のように参照したり、後から$1、$2のような変数で参照したりすることができません。


以下は、拡張構文のサンプルです。すべてマッチします。

$bbb = '東京都庁';
$ccc = 'とうきょう都庁';
print "Match1", "\n" if ($bbb =~ /東京(?=都庁)/);  # 東京の後に都庁が続いている東京にマッチ
print "Match2", "\n" if ($bbb =~ /東京(?!議会)/);  # 東京の後に議会が続いていない東京にマッチ
print "Match3", "\n" if ($bbb =~ /(?<=東京)都庁/); # 東京の後に都庁が続いている都庁にマッチ
print "Match4", "\n" if ($ccc =~ /(?<!東京)都庁/); # 東京でないの後に都庁が続いている都庁にマッチ

ちなみに、拡張構文の「東京(?=都庁)」と普通構文の「東京(都庁)」は同じ結果になりますが、すべての拡張構文には後方参照がありません。

また、拡張構文では検索文字にパターンマッチ修飾子(imsx)が埋め込めます。

$_ = 'TOKYO';
# 普通構文
$ddd = 'Tokyo';
if (/$ddd/i) {
  print "$ddd\n";
}
# 拡張構文
$ddd = "(?i)Tokyo";
if (/$ddd/) {
  print "$ddd\n";
}


◆ 正規表現初心者卒業

上記がマスター出来たら、とりあえず、正規表現初心者卒業です。

しかし、正規表現は奥が深く、また、Perlが独自に拡張しています。

ですので、まだまだ、正規表現を極めようという人は、とりあえず以下で勉強をしてみてください。

再帰的な正規表現や正規表現の中にPerlコードを記述できたりと、高度なテクニックが書いてありますよ。




◆ 参考リンク

2010-02-02 絵文字がUnicode化される!!(パート2)

久しぶりに出ましたね。「パンドラの箱」第6回。

しかし、いいところで終わっています。

これからどうなんだよ〜、って感じで、第7回が待ち遠しいですね!

ちなみに、以下に前回「パンドラの箱」第5回の時のワタシが書いた記事をリンクしときます。

2010-02-01 最近、時間が経つのが凄く速い…

なんか、最近、特に時間が経つのが凄く速く感じます。

朝起きて、会社行って、仕事して、帰ってきて、ネットして、お風呂入って、寝る、そしてまた、朝起きて…

すると、このまま、あっと言う間に人生が終わって……。

人生ってなんなんだろう…とか、生きるとは…とか、またまた考えて、虚しくなってきたりするわけです。

まぁ、頑張るしかないですね…。