ChaichanPapa-World !

燈明日記(2008/07

◆ インデックス

◆ 2008年7月

2008-07-31 フェルマー・人生力・フレームワーク

勝間和代のビジネス頭を創る7つのフレームワーク力 ビジネス思考法の基本と実践

「残業ゼロ」の人生力

数学ガール/フェルマーの最終定理

今日、会社の帰りに府中駅の啓文書店で『数学ガール/フェルマーの最終定理』(結城本)を買いました。

ついでに、弾さん絶賛の『「残業ゼロ」の人生力 』も売っていたので買いました。

実は今、勝間本『ビジネス頭を創る7つのフレームワーク力』を読んでいるんです。


勝間本は、読んでいてついていけないなぁ・・・と、つくづく思いました(謎)。

でも、頑張り屋の勝間さんには好感がもてました。


とりあえず、勝間本は、ちょっと置いといて、先に結城本を読もうと思います。

しかし、いきなり最大公約数が出てきて、なんだっけ?・・・状態ですが・・・。

結城先生、はなからの出だし、引き込まれました。素敵でした。これからが楽しみです。

2008-07-30 wantarrayとは

すぐわかる オブジェクト指向 Perl

以下を読んでいて、ハッシュのスライスは知っていたのですが、wantarrayは知りませんでした。

なので調べてみました。


wantarrayとは、共通関数の一つで、実行中のサブルーチンの戻り値に、リストを要求される場合には真を返し、スカラーを要求される場合には偽を返す。

#!/usr/bin/perl
use strict;
use warnings;

my @foo = hoge();
print @foo, "\n"; # 配列要素

my $foo = hoge();
print $foo, "\n"; # 配列要素数

sub hoge {
    my @array = ('AAA', 'BBB', 'CCC');
    return wantarray ? @array : $#array;
}

2008-07-30 「残業ゼロ」の仕事力

「残業ゼロ」の仕事力

あの弾さんが絶賛していた『「残業ゼロ」の人生力』を買いに行ったら、まだ発売(8月3日発売予定)されていなく、かわりにこの本『「残業ゼロ」の仕事力』を買いました。


で、感想ですが、ちょっと嫌な感じがしました。

残業をさせず、仕事のデットラインを設定して、社員を追い込んで集中させ、仕事力をアップさせる。

手強い上司ですね。

しかし、私は、たぶんついていけないな・・・たぶん逃げ出すかも。

こんなだから、負け組みになってしまったのか・・・。

逆に言うと勝ち組みになりたい人には、必読です!


これから発売の『「残業ゼロ」の人生力』も楽しみです!

2008-07-30 『数学ガール/フェルマーの最終定理』発売!!

数学ガール/フェルマーの最終定理

待ちに待った結城先生の新作『数学ガール/フェルマーの最終定理』が今日発売とのこです。

しかし、会社の帰りにいつもの書店に行きましたが、まだありませんでした。

明日は、府中の大型書店へ行って探してみます。

2008-07-29 初めてのRuby

初めてのRuby

やっと、『初めてのRuby』を読み終えました。

あの弾さんをはじめ、多くのRubyistが絶賛していた『初めてのRuby』です。


正直に言います。私のレベルでは絶賛すべきものがわからなかったです。

Rubyを知っている人でないと良さがわからないのかもしれません・・・。

ってじゃ、『初めてのRuby』でなく『初めてでないRuby』じゃないかって声が・・・。


Ruby初心者としては、もう少し、わかりやすいサンプルを多く載せて頂けたらと思いました。

とにかく、まだ、Rubyのコードを全然書いていないので、サンプルを沢山書いて体で覚えないとダメみたい。

だから、わかりやすいサンプルもっと沢山載せてください。お願いします。って誰にともなく・・・。


キターーーーーーーーー!!(7/31)

『初めてのRuby』の著者様からブックマークを頂きました!

光栄です。ありがとうございました!

2008-07-28 Rubyをやり始めまた!

とりあえず、Rubyリンク集

2008-07-27 Perlでの nオプションとダイアモンド演算子

たとえば、コマンドプロンプトから以下のコマンドを入力するとソース(x.txt)を読み込んで、行数を付加して、一行毎に全行を表示します。

eオプションはワンライナーの実行指定で、nオプションは、『while(<>)』ループ内でのワンライナー実行です。

ちなみに、『$.』には行数が入っている。

perl -ne "print $.,':', $_" x.txt
参考:
  • n オプションは、与えたプログラムの外側に下のようなループがあるのと同じような動作をします(実際に等価な処理は少し違います)。
       while(<>) {
          ....
       }

「<>」は、ダイアモンド演算子と呼ばれ、「標準入力から入力が与えられた場合はそちらを読み込み、ファイル名が引数として与えられた場合はファイルから読み込む」というとても便利な演算子です。

http://www.stackasterisk.jp/tech/program/perl04_04.jsp

ダイアモンド演算子「<>」は、標準入力と引数の両方が対応されているのですね。

2008-07-24 PerlでのシフトJIS漢字問題

WINDOWSでPerlスクリプトを組む時の漢字コードは、一番自然なのが、コードも入出力もシフトJISです。

しかし、シフトJIS漢字コードでスクリプトを組むと、不可解な世界に陥るのです。

そして、その不可解は、大きく分けて以下の2つの問題が原因なのです。


シフトJISの第2バイトコード問題

シフトJIS漢字は、第1バイトと第2バイトの2バイトで表現されています。

そして、第2バイトには、ASCII 1バイト文字『@-~(10進で64-126)』と、かぶるコードが割りついているのです。

この1バイト文字には、以下の問題発生が潜在的に含んでいるのです。

  1. 第2バイトの『\』0x5c問題 - \でその後に続く文字をエスケープしてしまう。
  2. 第2バイトの『\\』連続問題 - エスケープを入れた前の漢字が1の場合だった時、\が連続してエスケープにならない。
  3. 第2バイトの『\n』連続改行問題 - 1の場合で、後に続く文字がたまたま『n』だったら改行になってしまう。
  4. 第2バイトの『@』問題 - 漢字スペースの第2バイトは『@』と同じコードで、Perlでの配列変数と区別がつかなくなる。
  5. 第2バイトの『アルファベット』問題 - 漢字なのにアルファベットだと誤認識。また、アルファベットの大文字小文字で誤認識(lc関数)
  6. その他の第2バイト問題 - 明らかに問題がありそうなコード『{,},|,^,[,]』、他にもあるかも。

バイト列による漢字コード境界問題

漢字コードは普通2バイト以上で、これが連続した場合に漢字毎の境界を挟んで、たまたま別の漢字に認識されることがあるのです。

たとえば、シフトJISの場合、全角『c』の文字コードは 0x82 0x83 で、全角『d』は 0x82 0x84 で、全角『モ』は 0x83 0x82 です。

『cd』の場合、0x82 0x83 0x82 0x84 となり、2つの漢字コードの境界を挟んで、0x83 0x82となり、『モ』と同じになってしまうのです。


結論として、シフトJIS漢字コードでPerlスクリプトを組むには、相当な覚悟が必要なのです。

現象さえ見抜けば、回避する方法も、Perlでは、ほぼ用意されていますが・・・。

また、回避したコードは、他のOS上に移植した時に、例えばUNIX系とかでは動かなくなる可能性が大です。

ということで、漢字処理に関しては、以下のページがお奨めです。


尚、本記事は、以下のページを参考にさせていただきました。

しかし、このページは、Perlと文字コードに相当詳しくないと読みこなせないですね。

2008-07-23 日々過ぎていく・・・

毎日が、同じ感じに、あっという間に過ぎていく・・・。

生かされて生きているわけなんだけど、なぜか心に風が吹く・・・。

波があって、「やる気」と「虚しさ」が交互する。軽い躁鬱病か・・・。

というわけで、今日はここまで、おやすみなさい。

2008-07-22 続・範囲演算子『..』と『...』の違い?

昨日の続きです。きむら(K) さんに教えて頂き、大分理解が出来た感じです。

その成果を述べてみますね。


内部的には、フリッププロップのような・・・どうのこうのって話しになり、余計難しくなるので・・・略です。

外部的には、範囲演算子を挟んで両端に同じ値を指定した場合、『..』では、標準入力から両端の値と同じ値が来た時に真になり、同じ値以外は偽となる。

『...』では、両端の値と同じ値が来た時に真になり、つぎに同じ値が来た時までは真で、その次に同じ値が来る時までは偽になる。

言葉だと過去形と現在形での微妙な表現で、わかり辛いと思いますので、以下の両者の結果を比較してみてください。


ちなみに、範囲演算子の一般的な解説は、以下を参照願います。(4E0って何って場合は同じく)


『..』のサンプル
#!/usr/bin/perl
use strict;
use warnings;

my $cond;
while (<DATA>) {
    chomp;
    $cond = /START/ .. /START/;
    print "$_ \t $cond\n";
}
__END__
START
aaa
bbb
START
ddd
eee
START
ggg
hhh
START
jjj
実行結果
C:\test>perl hani1.pl
START    1E0
aaa
bbb
START    1E0
ddd
eee
START    1E0
ggg
hhh
START    1E0
jjj

『...』のサンプル
#!/usr/bin/perl
use strict;
use warnings;

my $cond;
while (<DATA>) {
    chomp;
    $cond = /START/ ... /START/;
    print "$_ \t $cond\n";
}
__END__
START
aaa
bbb
START
ddd
eee
START
ggg
hhh
START
jjj
実行結果
C:\test>perl hani2.pl
START    1
aaa      2
bbb      3
START    4E0
ddd
eee
START    1
ggg      2
hhh      3
START    4E0
jjj
範囲演算子リンク集

2008-07-21 範囲演算子『..』と『...』の違い?

ここ数日、『..』と『...』が、どう違うのかを悩んでいます。

とりあえず、現状でわかっている範囲演算子について述べてみます。


リストコンテキストでは、超簡単で、範囲のリストを生成します。

例えば、(1 .. 5)は、(1,2,3,4,5)と等価です。


スカラーコンテキストでは、わかっているところを書いてみます。

以下の例では、標準入力からWebページのテキストファイルを読み込んでいます。

そして、1行目から10行目を表示し、また、Webページ内のhtmlのbody要素を表示します。

while (<>) {
    if ( 1 .. 10 ) { print; }
    if ( /<body>/ .. /<\/body>/ ) { print; }
}

範囲は、標準入力のときには、現在の入力行を示す特殊変数『$.』と比較されます。


そして、以下の『"..." と ".."』の違いがわからないのです。

また、その違いは、sedとawkのコンマ演算子の違いだと書いてあるみたいなのですが、sedとawkでテストをしても違わず同じ結果になるのです。

スカラコンテキストで使われたときには、".." は真偽値を返します。この演算子は、フリップフロップのように 2 値安定で、 sed や awk や多くのエディタでの行範囲 (コンマ) 演算子をエミュレートするものとなります。各々の ".." 演算子がそれぞれに独立して自分の真偽状態を管理します。はじめは、左被演算子が偽である間、演算全体も偽となっています。範囲演算子は、いったん左被演算子が真になると、右被演算子が真である間、真を返すようになります。右被演算子が偽になると、演算子も偽を返すようになります。 (次に範囲演算子が評価されるまでは、偽とはなりません。 (awk でのように) 真となった、その評価の中で右被演算子をテストし、偽とすることができますが、1 度は真を返すことになります。 sed でのように、次に評価されるまで右被演算子をテストしたくなければ、 2 個のドットの代わりに 3 つのドット ("...") を使ってください。その他の点では、"..." は ".." と同様に振舞います.

http://perldoc.jp/docs/perl/5.6.1/perlop.pod

あと、以下のくだりも理解できない。なにを言っているのだろうか・・・。

偽としては空文字列が返され、真としては (1 から始まる) 順に並んだ数値が返されます。この通し番号は、新たに範囲が始まるごとにリセットされます。範囲の最後の数字には、文字列 "E0" がお尻につけられます。これは、数値としては何の影響もありませんが、範囲の終わりで何か特別なことをしたい場合に、目印として使うことができます。範囲の始まりで何かしたい場合には、通し番号が 1 よりも大きくなるのを待っていればよいでしょう。

http://perldoc.jp/docs/perl/5.6.1/perlop.pod

誰か、わかる方、教えてください。

2008-07-20 パッケージのサブルーチンコールとクラスのメソッド起動

Perlでは、パッケージのサブルーチンコールとクラスのメソッド起動は、実は、ほぼ同じものなのです。

まず、パッケージは、OO的にはクラスを表します。

また、パッケージのサブルーチンは、OO的にはメソッドを表します。

サブルーチンコールとメソッド起動では、ほぼ同じなのですが、引数の解釈が少し異なります。

それは、メソッド側では、第一引数が必ず、クラス名か、またはオブジェクトリファレンスになるのです。

では、それを見ていきましょう。

まず、以下のようにCarパッケージ(クラス)にnewサブルーチン(メソッド)があるとします。

# Carパッケージ(クラス)
package Car;
# newサブルーチン(メソッド)
sub new {
    my $this = shift;
    my ($color, $name, $cc) = @_;
    my $car = {
                color => $color,
                name  => $name,
                cc    => $cc,
              };
    return bless $car, $this;
}

メインパッケージからnewを呼ぶ場合

サブルーチンでは、頭に『パッケージ名::』で修飾します。

my $mycar = Car::new('Car', 'Green', 'セレナ', 2000);

または、括弧が省略可能です。

my $mycar = Car::new 'Car', 'Green', 'セレナ', 2000;

メソッドでは、頭に『パッケージ名->』で修飾します。(矢印形式)

my $mycar = Car->new('Green', 'セレナ', 2000);

または、メソッド名を後からパッケージ名で修飾します。(間接オブジェクト形式)

my $mycar = new Car 'Green', 'セレナ', 2000;

サブルーチンとメソッドの違いは、第一引数にクラス名(パッケージ名)を指定するかいなかです。

また、メソッドの場合は、メインパッケージにnew名やCar名のサブルーチンがたまたまある場合は、そちらが優先されます。


特に間接オブジェクト形式は、JavaやVBでのnewと見た目が同じでいい感じなのですが、でも私は、矢印形式の方をお奨めします。

理由は以下を参照してください。

2008-07-19 Perlでの『間接オブジェクト形式』とは

以下のつづきです。

以下のような形式でメソッドを起動することを『間接オブジェクトを使ったメソッドに起動』と言います。

METHOD INVOCANT (LIST)
METHOD INVOCANT LIST
METHOD INVOCANT

ちなみに、INVOCANT(インボカント)とは、パッケージ名(クラス名)または、オブジェクトを指すリファレンスです。

たとえば、newメソッド(インボカントはCar)とprintメソッド(インボカントはSTDERR)の場合は、以下の感じです。

$mycar = new Car('Green', 'セレナ', 2000);
print STDERR 'エラー情報1', "エラー情報2\n";

しかし、この『間接オブジェクト形式』には、2つの落とし穴あります。

1つ目は、他のリスト演算子と同じようにパースされるので、&&とandや||とorの優先順位の違いに注意が必要とされる。

たとえば、以下の感じ。

print STDERR "エラー情報\n" and exit(); # 『エラー情報』が表示される
print STDERR "エラー情報\n" && exit();  # 『エラー情報』が表示されない

2つ目は、INVOCANTに使えるのが、名前、添え字なしのスカラー変数、またはブロックだけに限られる。

たとえば、以下の感じ。

move $riders[$i];

は、

$riders[$i]->move;

でなく

$riders->move([$i]);

と解釈される。

2008-07-19 Perlでのループ変数の意外な性質

for文やforeach文のループ変数は、そのループのスコープで暗黙にmy宣言されたものになる!

これが理解できると以下の変(謎)が氷解する。

つまり、同名でもforeach文の前で宣言さてた変数とループ変数は別物になるのです! 意外でした。

ちなみに、ループ変数とは、以下のサンプルでは、foreachの『$wk2』のことで、my宣言した『$wk2』とは別物なのです。

use strict;
use warnings;

my $wk1 = "AAA";
my $wk2 = "BBB";
my @result = ("aaa");

foreach $wk2 (@result) {
    print $wk2, ' In foreach',"\n";
    &xxx();
}
print $wk2, ' In main', "\n";

sub xxx {
    print $wk2, ' In sub xxx', "\n";
}
実行結果
C:\Documents and Settings\test>test01.pl
aaa In foreach
BBB In sub xxx
BBB In main

また、ループ変数をmy宣言しても、our宣言しても、ループを抜けると元(ループに入る前)の値に戻る。

では、ループ変数をmy宣言した場合とour宣言した場合の違いは、ループ内でサブルーチンをコールした場合、そのサブルーチンでループ変数が参照できるかいなかです。(my宣言では参照できない。our宣言では参照できる。)

2008-07-17 Perlでの『単項プラス演算子』とは

たとえば、以下の『+』は、どのような意味があるのでしょうか(足し算?文字連結?)。

      $pat = quotemeta +(qw/ 表 /)[0];

これは、『単項プラス演算子』といって、『(qw/ 表 /)[0]』を引数として関数に渡す前に、引数の部分を先に処理してからその結果を関数の引数とするのです。

今回の場合は、quotemeta関数の引数は、一つでスカラーなので、これにあわせて先に『(qw/ 表 /)[0]』の処理をしているわけです。

もう少し詳しく言い直すと、リスト内をシングルクォートし、先頭要素(スカラー)を一つの引数として、quotemeta関数(引数は一つでスカラー)へ渡しています。


このように『単項プラス演算子』は、関数の引数を関数実行より先に評価する場合に有効です。


ちなみに、quotemeta関数は、文字列を一つ引数にとりますが、この文字列に対して英数字以外の文字の前にエスケープの『\』を挿入し、その文字列をリターン値で返します。


2008-07-17 Perlでの『new』とは

newは、Java系(C++,JavaScript等)やVB系(VB.NET,VBScript等)では、オブジェクトをコンストラクトします。

そして、Java系では「new演算子」、VB系では「newキーワード」と呼ばれています。

では、Perlのnewは、なんでしょうか・・・。


Perlの場合は、newという演算子やキーワードは存在しません。また、組み込み関数でもありません。

Perlでのnewは、単なるパッケージサブルーチン(メソッド)で、JavaやVBと同じように記述できるのは、『間接オブジェクト形式』と云う呼び出し方なのです。

逆に云うと『間接オブジェクト形式』での呼び出し方が、たまたまJavaやVBのnewと似ているだけなのです。

      my $mycar = new Car('Green', 'セレナ', 2000);

しかし、newは、先ほども述べましたが、単なるメソッドなので、普通の『矢印形式』でも呼び出せます。

      my $mycar = Car->new('Green', 'セレナ', 2000);

私としては、クラスから『->』で強く修飾されて明示される『矢印形式』の方がお奨めです。

なぜお奨めかというと実は、『間接オブジェクト形式』には、2つの落とし穴があるのです。それについては、そのうちに・・・。


2つの落とし穴、以下に書いてみました。

http://d.hatena.ne.jp/chaichanPaPa/20080719/1216451016

2008-07-16 サブルーチンの上書き(オーバーライド)?

id:fbisさんの記事で、以下のソースがスキル不足で読めなかったので、調べてみました。そのメモです。

実は、調べてもイマイチわからなかったのですが・・・。

 use Path::Class;
 use Perl6::Say;
 use Encode;

 no warnings 'redefine';
 local *IO::Dir::read = sub { decode 'shiftjis', readdir shift };

 for my $file ( dir('./hoge')->children ) {
     say encode 'shiftjis', $file->basename;
 }
http://d.hatena.ne.jp/fbis/20080711/1215749599

2008-07-15 多次元配列エミュレート

実は、私もよく知らないのですが、『$;』を調べていて辿りつきました。

Perl4の時代はリファレンスがなかったので、多次元を以下の方法でエミュレートしていたらしい。


ちなみに、『$;』は、デフォルト値が "\034"で、詳しくは以下を参照してください。


Perl4での多次元配列エミュレートサンプル(taji4.pl)
use strict;
use warnings;

print "--多次元配列エミュレート for Perl4--\n";
my %hash4 = (
              "0$;0" => 'A1', "0$;1" => 'B1', "0$;2" => 'C1',
              "1$;0" => 'A2', "1$;1" => 'B2', "1$;2" => 'C2',
              "2$;0" => 'A3', "2$;1" => 'B3', "2$;2" => 'C3',
            );
print $hash4{0,0}, " | ";
print $hash4{0,1}, " | ";
print $hash4{0,2}, "\n";
print $hash4{1,0}, " | ";
print $hash4{1,1}, " | ";
print $hash4{1,2}, "\n";
print $hash4{2,0}, " | ";
print $hash4{2,1}, " | ";
print $hash4{2,2}, "\n";
 C:\test>perl taji4.pl
 --多次元配列エミュレート for Perl4--
 A1 | B1 | C1
 A2 | B2 | C2
 A3 | B3 | C3

ちなみにPerl5での多次元ハッシュ&多次元配列サンプル(taji5.pl)
use strict;
use warnings;

print "--多次元ハッシュ--\n";
my %hash5 = (
              0 => {0 => 'A1', 1 => 'B1', 2 => 'C1'},
              1 => {0 => 'A2', 1 => 'B2', 2 => 'C2'},
              2 => {0 => 'A3', 1 => 'B3', 2 => 'C3'},
            );
print $hash5{0}{0}, " | ";
print $hash5{0}{1}, " | ";
print $hash5{0}{2}, "\n";
print $hash5{1}{0}, " | ";
print $hash5{1}{1}, " | ";
print $hash5{1}{2}, "\n";
print $hash5{2}{0}, " | ";
print $hash5{2}{1}, " | ";
print $hash5{2}{2}, "\n";

print "--多次元配列--\n";
my @array = (
              [ qw(A1 B1 C1) ],
              [ qw(A2 B2 C2) ],
              [ qw(A3 B3 C3) ],
            );
print $array[0][0], " | ";
print $array[0][1], " | ";
print $array[0][2], "\n";
print $array[1][0], " | ";
print $array[1][1], " | ";
print $array[1][2], "\n";
print $array[2][0], " | ";
print $array[2][1], " | ";
print $array[2][2], "\n";
 C:\test>perl taji5.pl
 --多次元ハッシュ--
 A1 | B1 | C1
 A2 | B2 | C2
 A3 | B3 | C3
 --多次元配列--
 A1 | B1 | C1
 A2 | B2 | C2
 A3 | B3 | C3

2008-07-15 AOUTLOADとは

AOUTLOADとは、該当関数が存在しないとき、AUTOLOAD関数を定義していれば、代わりにそれが呼ばれる仕組み。

  • AUTOLOAD関数を定義しておくと、関数呼び出しで名前が見つからなかったときに代わりに呼び出されます。
  • our $AUROLOAD を定義しておくと、呼び出された関数名を取得できます。
      aaaaiiiii( 1, 2 ); # 呼び出し側

      our $AUTOLOAD;
      sub AUTOLOAD {
          # ...
      }
http://d.hatena.ne.jp/perlcodesample/20080709/1215622869
参考

2008-07-15 XSとは

XSとは、PerlからC言語で書かれた関数を呼び出すための仕組み。


参考

2008-07-15 Mooseとは

Mooseとは、新しいPerlのOO(オブジェクト指向システム)の仕組み。

従来の後付けOOと違い、OOを簡素に表現出来る。

ただし、まだ、コアモジュールでないのでインストールが必要。


参考

2008-07-13 今日から東京のお盆です

お盆とは、超簡単に言うと、年に一度、夏場に『先祖供養』をする日のこと。


今日から3日間の7/13,7/14,7/15は、東京のお盆です。

場所によっては、7/16までのところもあるみたいです。

田舎では、8/15日前後にお盆があるみたいです。


で、今日某教会で、盂蘭盆会があり、そこで曹洞宗の尼さんの講演を聞きました。

心に残ったことをメモしときます。


仏教を凄く凄く簡単に言い表すと「やさしさ」とのことでした。

そして、譲る心が大切とのことでした。


欲張って得る心は、一時的には得ても、結局得ることはできず、譲ることによって初めて本当に得ることができる。

とのことでした。これは、私も納得で、確かにそうだと思います。


あと、相手に仏教を説くには、いくら口で説いてもダメで、背中で説かないとダメとのことでした。

つまり、自分の仏教実践を相手に見てもらうことが第一で、そこで相手が納得すれば、そこではじめて仏教を説くとのことでした。


それから、仏教は無欲の教えだと勘違いしている人が多いのですが、無欲でなく小欲の教えとのことでした。

確かに、無欲だと人類が滅んでしまいそうですね。


ということで、講演の後、家に帰ってきて、家のお盆の準備をして、もうそろそろ、ご先祖さまをお迎えします。

2008-07-12 駄文:お小遣い

テレビでサラリーマンのお小遣いがインフレの影響で3万円に減ったみたいなニュースがありました。

私は、ここ何十年も3万円でやって来ました(どうだ)。


私の3万円は、昼食代はもちろん交通費も含まれているのです。驚きましたか!

一月、実働日は約20日、一日の昼食代は500円で月10000円、交通費は約15000円掛かります。

したがって、事実上のお小遣いは、5000円なのです。


たまにある飲み会の会費は、虎の子ネット収入で賄うのです。

カリスマプログラマにもIT戦士にもなれなかった、平凡なプログラマの日常です。


あなたには、カリスマプログラマやIT戦士を目指して行動&勉強に精進してください!

2008-07-12 駄文:美術が『1』

三男(中2)が期末試験の美術で0点を取ってきました!

兄貴達(長男と次男)からは、『俺でも0点なんて取ったこと無い』とか、『koike家、始まって以来だ』とか、散々言われていました。

横で聞いていた私は、あぁDNAには逆らえない・・・などと思い、中学の思い出がよみがえりました。


当時、担任は美術の先生でした。そして、結構仲がよく、冗談の好きな先生でした。

そして、美術の課題で『今までに無いものをデザインしなさい』とのことでした。

これに対して、何を思ったか私は1円玉をリアルにデザインしたのです。


その結果、人生始まって以来、通信簿で『1』をとりました。

先生曰く、お前の願い通り『1』にしてあげたよ。うん・・・ありがとうございました。

2008-07-12 燈明日記6月分更新

燈明日記6月分をWEBページにしました。

しかし、以下のページの6月分更新が残っています。結構気が重い。

2008-07-11 疲れがたまったみたい

今週は、中頃から調子悪く、なのにブログを更新するために、家に帰ってもPerl三昧をしていたので、さずがにもう気力がなくなってしまったみたい・・・。

ということで、今日は、雑談です。


昨日が給料日で、お小遣いが入ったので、小飼弾氏こと弾さんが絶賛していた『初めてのRuby』を買いました。

この本は、他の言語使いが、初めてRubyを勉強するための本とのことです。私にドンピシャや!

まだ、全然読んでいないけど、そのうちに感想を書きますね。

初めてのRuby

初めてのRuby


そうそう、ずーっと積読状態だった『ベストプラクティス』読み始めました。

まだ、はじめの方だけど、私のコーディングスタイルと今のところ、ほぼドンピシャで快いです。

こちらも、そのうちに感想を書きますね。

Perlベストプラクティス

Perlベストプラクティス

2008-07-10 Dumperを使ってみました

printサブでの表示だけでなく、変数の内容をダンプして見たい時があります。

そんな時は、Dumperモジュールが使えます。


Dumperモジュールサンプル
use strict;
use warnings;

use Data::Dumper; 
#local $Data::Dumper::Sortkeys = 1; # ハッシュのキーをソートする
#local $Data::Dumper::Indent = 1;   # インデントを縮める
#local $Data::Dumper::Terse = 1;    # $VAR数字要らない
my $data1 = {    
         name => 'Ultra Seven',    
         human => 'Dan Moroboshi',    
         transform => 'glasses',    
         power =>[
                     'Emerium Beam', 
                     'Eye Slugger', 
                     'Wide Shot'
                 ],
    }; 
my $data2 = [
                'Ultra Seven',
                'Dan Moroboshi',
                'glasses'
            ];
my @data3 = ('Ultra Seven', 'Dan Moroboshi', 'glasses');
my %data4 = (name => 'Ultra Seven', human => 'Dan Moroboshi', transform => 'glasses');

print "-----ハッシュリファレンスのダンプ-----\n";
print Dumper $data1;  # ハッシュリファレンスが入っている
print "\n";
print Dumper %$data1; # 上のデリファレンス
print "-----配列リファレンスのダンプ-----\n";
print Dumper $data2;  # 配列リファレンスが入っている
print "\n";
print Dumper @$data2; # 上のデリファレンス
print "-----普通の配列のダンプ-----\n";
print Dumper @data3;  # 配列
print "\n";
print Dumper \@data3; # 上のリファレンス
print "-----普通のハッシュのダンプ-----\n";
print Dumper %data4;  # ハッシュ
print "\n";
print Dumper \%data4; # 上のリファレンス

表示結果
C:\test>perl dumper.pl
-----ハッシュリファレンスのダンプ-----
$VAR1 = {
          'human' => 'Dan Moroboshi',
          'transform' => 'glasses',
          'power' => [
                       'Emerium Beam',
                       'Eye Slugger',
                       'Wide Shot'
                     ],
          'name' => 'Ultra Seven'
        };

$VAR1 = 'human';
$VAR2 = 'Dan Moroboshi';
$VAR3 = 'transform';
$VAR4 = 'glasses';
$VAR5 = 'power';
$VAR6 = [
          'Emerium Beam',
          'Eye Slugger',
          'Wide Shot'
        ];
$VAR7 = 'name';
$VAR8 = 'Ultra Seven';
-----配列リファレンスのダンプ-----
$VAR1 = [
          'Ultra Seven',
          'Dan Moroboshi',
          'glasses'
        ];

$VAR1 = 'Ultra Seven';
$VAR2 = 'Dan Moroboshi';
$VAR3 = 'glasses';
-----普通の配列のダンプ-----
$VAR1 = 'Ultra Seven';
$VAR2 = 'Dan Moroboshi';
$VAR3 = 'glasses';

$VAR1 = [
          'Ultra Seven',
          'Dan Moroboshi',
          'glasses'
        ];
-----普通のハッシュのダンプ-----
$VAR1 = 'human';
$VAR2 = 'Dan Moroboshi';
$VAR3 = 'transform';
$VAR4 = 'glasses';
$VAR5 = 'name';
$VAR6 = 'Ultra Seven';

$VAR1 = {
          'human' => 'Dan Moroboshi',
          'transform' => 'glasses',
          'name' => 'Ultra Seven'
        };

結果的に、値は値毎に表示され、リファレンスはリファレンス毎に表示される。


参考

2008-07-09 リスト中の「,」と「=>」は同等か?

リスト中の「,」と「=>」は、ほぼ同等なのですが、微妙な違いがあります。

「,」は、単なるリストのデリミタですが、「=>」は、左側の値を暗黙にクォートします。

また、見た目でハッシュであることを明示します。

use strict;
use warnings;

local ($, , $\) = (', ', "\n");
my %hash1 = (
                Sun => '日',
                Mon => '月',
                Tue => '火',
                Wed => '水',
                Thu => '木',
                Fri => '金',
                Sat => '土',
            );
my %hash2 = (
                'Sun', '日',
                'Mon', '月',
                'Tue', '火',
                'Wed', '水',
                'Thu', '木',
                'Fri', '金',
                'Sat', '土',
            );

print %hash1;
print %hash2;

2008-07-08 誕生日

恥ずかしながら、今日、実は53歳になりました。ちなみに、現役プログラマです。


結城さんの『数学ガール/フェルマーの最終定理』の無料プレゼント抽選日が、丁度、誕生日だったので期待していましたが、はずれてしまいました。ちょと残念。


しかし、ここ数日で弾さんのブログに2回も取り上げて頂いて、アクセス数はもちろん、RSS購読数が11も増えて、なんとTopHatenarで1000番代に入りました。パチ!パチ!

64970のダイアリー中、今、1856位です。やったー!


これからも、地道に更新していきますので、燈明日記を、どうぞ、よろしくおねがいいたします。


そうそう、『数学ガール/フェルマーの最終定理』が発売されたら、すぐ読んで、ガンガン紹介しますね->結城先生。

2008-07-08 配列のprint表示を見やすくするには

普通、配列をprintすると要素がくっ付いて表示され、どこまでが要素データかわかりません。

以下の一行を先頭の方に入れると、それを見やすくすることが出来ます。

local ($, , $\) = (', ', "\n");
解説

ちなみに、「$/」は、入力レコードセパレータで、デフォルトは改行で、これにundefを代入するとファイル入力時にファイル全体を読み込むことができる。


サンプル(From DanScript)
use strict;
use warnings;

local ($, , $\) = (', ', "\n");
my @array = (0..6);
print @array;
for my $i (@array) { $i++ };
print @array;
C:\test>perl dan01.pl
0, 1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6, 7

2008-07-08 いろいろ考えないようにしよう!

最近いろいろ忙しく、今日も美容院に行って今帰って来たところです。

お陰さまで何とか動けるので本当に有り難いです(^o^)丿

それに、忙しい方が余計な事を考えずにいられていいみたいです。

私、いろいろ考え過ぎて心が不安定になっちゃうんです。そういう性格なのかな(^_^;)

まあ、病気のせいもあるけど、心配ばかりしてたら生きていかれない・・・苦しくて(+_+)

なので、いろいろ考えないようにしようと思います!

この先どうなるのかわからないし、わからない事を考えても仕方ないですよね(^_^;)

それより今日を精一杯生きること、私らしく生きることに努力できたらいいな(^○^)

なんて思うんです!そう思うと心が楽になりました!

全てはお任せですよね(^_-) 

2008-07-07 サブルーチン引数の参照渡しについて

ここ数日、私を悩ませた「@_の要素アドレス可変問題」ですが・・・、結局、私の「参照渡し」についての認識不足が原因でした。

弾さんの力強い一言で閃きました。

Perlにおいて、引数を格納する配列@_は、常に参照(reference)です。値(value)ではありません。

http://blog.livedoor.jp/dankogai/archives/51076794.html

私は、「参照渡し」を知ってはいたのですが、どこかで、なぜかC言語でのポインター渡しと勘違いをしていたみたいです。


ということで、復習してみます。

まず、サブルーチン引数の引き渡しには以下の2種類があります。

値渡しは、仮引数を変更しても実引数は変更されません。

ポインター渡しも、実は、ポインターを値渡しているのです(C言語では、そのポインターの指すところが変更できる。参照に対して変更をしているわけではない)。

一方、参照渡しは、仮引数を変更すると実引数も変更されます。

これは、仮引数が実引数のエイリアスになっているからなのです。


つまり、参照が入っている仮引数に値を代入することは、実引数に代入することとイコールなのです。

しかし、Perlでは、仮引数の配列に対して、リスト値で一括代入が可能です。

すると、現状の参照がリスト値で上書きされて置き換わってしまうのです。

そして、この時は、実引数を変更することはないのです。


ということで、胸のつかえが取れました。

関係者の皆さま、ありがとうございました!

2008-07-06 @_の要素の$_[0],$_[1]等は、格納するべきアドレスが可変!

普通、配列は以下のように、要素毎に代入しても、リストで一気に代入しても、要素のアドレスは変わりません。

use strict;
use warnings;

my @array;

$array[0] = "1";
$array[1] = "2";
print "array[0]-> " . \$array[0] . "\n";
print "array[1]-> " . \$array[1] . "\n";
print "\@array-> " . $array[0] . $array[1] . "\n";

@array = ("A", "B");
print "array[0]-> " . \$array[0] . "\n";
print "array[1]-> " . \$array[1] . "\n";
print "\@array-> " . $array[0] . $array[1] . "\n";
C:\test>perl haiaddre.pl
array[0]-> SCALAR(0x1625e80)
array[1]-> SCALAR(0x1625f40)
@array-> 12
array[0]-> SCALAR(0x1625e80)
array[1]-> SCALAR(0x1625f40)
@array-> AB

しかし、以下のように@_配列の要素の$_[0],$_[1]等は、格納するべきアドレスが可変なのです。

#!/usr/bin/perl
use strict;
use warnings;


my @array = ("1", "2", "3", "4", "5");

print "array-> @array\n";
print "array[0]-> " . \$array[0] . "\n";
print "array[1]-> " . \$array[1] . "\n";
arg1(@array);
print "array-> @array\n";

sub arg1
{
 my $cnt = @_;
 print ("in arg1 cnt -> $cnt\n");
 print "\$_[0]-> " . \$_[0] . "\n";
 print "\$_[1]-> " . \$_[1] . "\n";

 @_ = ("A", "B", "C", "D", "E");
 print "\$_[0]-> " . \$_[0] . "\n";
 print "\$_[1]-> " . \$_[1] . "\n";

 $_[0] = "UVW";
 $_[1] = "XYZ";

}
C:\MyWorks\Perl\arg>perl arg15.pl
array-> 1 2 3 4 5
array[0]-> SCALAR(0x275f50)
array[1]-> SCALAR(0x276004)
in arg1 cnt -> 5
$_[0]-> SCALAR(0x275f50)
$_[1]-> SCALAR(0x276004)
$_[0]-> SCALAR(0x185355c)
$_[1]-> SCALAR(0x1853550)
array-> 1 2 3 4 5
http://d.hatena.ne.jp/lolstep/20080705/1215241002

ということです。なぜ、こんな仕様にしたのだろうか・・・。

理由は以下を参照。

2008-07-05 「なぜ split $;, $_[1] なのかは宿題」の答え

まずは、問題。

1から100までの数をプリントするプログラムを書け。

ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm

弾さんの答え

tie my %fizzbuzz, 'Tie::Code' => sub {
    $_[0] % 15 ? $_[0] % 5 ? $_[0] % 3 ? 
    $_[0]      : 'Fizz'    : 'Buzz'    : 'FizzBuzz';
};

print "$fizzbuzz{$_}\n" for (1..100);

答えは感嘆せざるをえないほど簡単だ。

package Tie::Code;
use Tie::Hash;
sub TIEHASH { bless $_[1], $_[0] }
sub FETCH   { $_[0]->( split $;, $_[1] ) }

なぜsplit $;, $_[1]なのかは宿題ということで。

http://blog.livedoor.jp/dankogai/archives/50826956.html

そして、宿題の答えなのですが、わかりませんでした!

わかったのは、「split $;」しても、しなくても結果は同じになったということです。


$_[1]には1から100のスカラー値が設定されます。

そして「split $; $_[1]」すると配列値(ゼロ番目にそのスカラー値)になります。

しかし、これを受ける方(無名サブルーチン)で、第一引数の$_[0]になっていますので、スカラー値でも配列値も同じ値になりますよね。

実際、実行結果でも同じでした。


ちなみに、私的にソース解説をしときました。

tie my %fizzbuzz, 'Tie::Code' => sub {
    $_[0] % 15 ? $_[0] % 5 ? $_[0] % 3 ? 
    $_[0]      : 'Fizz'    : 'Buzz'    : 'FizzBuzz';
};

は、入れ子の3項演算子使用で、以下のようにすると意味が理解しやすくなります。

tie my %fizzbuzz, 'Tie::Code' => sub {
    $_[0] % 15 ? $_[0] % 5 ? $_[0] % 3 ? $_[0]
                                       : 'Fuzz'
                           : 'Bumper'
               : 'FuzzBumper';
};

尚、「・・・ 'Tie::Code' => sub{ ・・・」等でハッシュぽっく書いてあるけど、この無名サブルーチンリファレンスは、コンストラクタ(Tie::CodeのTIEHASH)の第2引数にセットされる。


print "$fizzbuzz{$_}\n" for (1..100);

は、以下と同じです。

for $_ (1..100) {
    print "$fizzbuzz{$_}\n";
}

2008-07-05 あの小飼弾氏のブログがらトラックバックされました!

オープンソースPerl系(謎)では、カリスマプログラマーとして超有名で・・・。

また、カリスマのアルファブロガーとしても知られている小飼弾氏のブログに本ページを取り上げて頂きました。

幸せ!幸せ!


しかし、こんな平凡なプログラマのページを取り上げて頂いて、いいのなかなぁ・・・と思いました。

実は、ここのところ「404 Blog Not Found」のプログラマ系記事(ページ)を読み漁っていました。

そして思ったことは、志のレベルが違うと、こうも差がついてしまうのかなぁ・・・ということです。


プログラミング能力はもちろん、言語に対しての博識、数学的なアルゴリズム、英語能力、その他・・・。

プログラマ歴28年の私は、今までなにをしてきたのかなぁ・・・と虚しくなってしまいました。


しかし、学ぶべきことが、まだまだ沢山あることがわかり、これからも、小飼弾氏のブログから学び盗みますね(^^;

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

2008-07-04 tie関数とは

説明するのが大変なので、どうしようかな・・・と思っていたら、以下のページを見つけました。

ようは、タイ変数を宣言したり、参照したり、代入したり・・・。

すると、裏で処理が動き、オブジェクトをコンストラクトしたり、とある処理結果が参照できたり、代入したものに対応したものを格納出来たりする。

データベースでのトリガーのようなものかな、たぶん。


tie関数の使い方
    tie タイ変数, クラス名, コンストラクタの引数リスト 

ちなみに、リターン値はオブジェクトが返る。後からtied関数で取得することも出来る。


tie関数使用例ソース
use Tie::Expression;
tie my %expression, 'Tie::Expression';
print "PI = $expression{ 4 * atan2(1,1) }.\n";
http://blog.livedoor.jp/dankogai/archives/51074461.html

tieするクラス例ソース
package Tie::Expression;
use warnings;
use strict;
our $VERSION = sprintf "%d.%02d", q$Revision: 0.1 $ =~ /(\d+)/g;
sub TIEHASH($) { bless \eval { my $scalar }, shift }
sub FETCH($$) { $_[1] }
1;
http://blog.livedoor.jp/dankogai/archives/51074461.html

タイ変数を宣言する時に指定する(tieする)クラスには、以下のメソッド名のメソッドを用意する。


以下の4種類のタイ変数があるらしい。


尚、詳しくは、ラクダ本を参照のこと。

2008-07-03 関数仮引数の$_[0],$_[1]等は、特殊な値が入る?

Perlでのサブルーチン引数は、参照渡しなので、要素毎($_[0] = "A";等)に代入すると、呼び出し元の値も書き換わります。

しかし、以下のサンプルでは、呼び出し元の値を書き換えているはずなのに、されません。なぜ?

#!/usr/bin/perl
use strict;
use warnings;


my @array = ("1", "2", "3", "4", "5");

print "array-> @array\n";
arg1(@array);
print "array-> @array\n";


sub arg1
{
    my @array = @_;

    print ("in sub -> @array\n");

    # そして書き換え
    @_ = ("A", "B", "C", "D", "E", "F");
}

C:\MyWorks\Perl\arg>perl arg8.pl

array-> 1 2 3 4 5

in sub -> 1 2 3 4 5

array-> 1 2 3 4 5

余裕でダメ。おかしい。

http://d.hatena.ne.jp/lolstep/20080702/1215003338

結論から言うと、よくわからないので、本日記でも、凄いパーラーズ(謎)へアピールしときます。

私も、ネットやラクダ本で調べてみたのですが、わかりませんでした。


ちなみに、私が現象から逆に推察してみると、関数コール直後の$_[0],$_[1]等には、呼び出し元の値へ直結する特殊な値が入っているのかな・・・と思う次第です。

なので、要素毎に代入すると呼び出し元の値が書き換わる・・・。


しかし、「@_ = ("A", "B", "C", "D", "E", "F");」のように要素毎でない方法で代入すると、特殊な値が上書きされて、普通の配列になってしまって、呼び出し元の値との直結が切れて、書き換わらない。


誰か、ちゃんとした理由教えてください!!


とりあえず、理由です。以下参照してください。

2008-07-02 Tie::Expressionモジュールの私的説明メモ

Tie::Expressionモジュールは、文字列中で式を実行したい時に使えます。

小飼氏は『仕組みは、呆れるほど簡単です。』との事でしたが・・・私にとっては、呆れるほど難しいかったので調べてみました。


モジュール使用例ソース
use Tie::Expression;
tie my %expression, 'Tie::Expression';
print "PI = $expression{ 4 * atan2(1,1) }.\n";
http://blog.livedoor.jp/dankogai/archives/51074461.html

モジュールソース
package Tie::Expression;
use warnings;
use strict;
our $VERSION = sprintf "%d.%02d", q$Revision: 0.1 $ =~ /(\d+)/g;
sub TIEHASH($) { bless \eval { my $scalar }, shift }
sub FETCH($$) { $_[1] }
1;
http://blog.livedoor.jp/dankogai/archives/51074461.html

モジュール使用例ソース説明

モジュールソース説明

尚、tie関数に関しては、後日、別途説明したいと思います。

2008-07-01 願いに沿って生きる・・・・・・修行

『開祖さまに倣いて』より引用です。

・・・「人間は、いくらでも幸せになってもいい。幸せになったら、その功徳をみんなにお分けすればいいんです。そうすれば、もっと幸せが増えるから」・・・

それは毎日の生活のなかで、小さな幸せ、小さな喜びを発見し、その喜んでいる心をそのまま口に出してみることから始まります。

どんな小さな喜びでも、それを言葉に表し、人に伝えてみることで、驚くほどまわりをあたたかく、幸せに変えていきます。

すると自分自身が、仏さまの説かれる法をより深く実感できるようになるのです。

ちょっと、章(願いに沿って生きる)の内容に関係ないところだけど、心に留まったので引用しました。

2008-07-01 warn() carp() die() croak() について

exit() は、単にプログラム終了なのに対して、die()は、例外送出。

  • die()は例外送出である
  • デフォルトではエラーメッセージをSTDERRに吐いてexitしてくれる
  • exit()はなるべく使わずにdie()を使え
  • OOなdie()もアリ
  • $SIG{__DIE__}で前処理も可能
     my $what_happened;
     eval{
         local $SIG{__DIE__} = sub {
             $what_happened = shift;
         };
         die "I am not dead yet";
         print "I will not be executed";
     };
     print STDERR qq(what_happend = '$what_happened'\n);
     die "normally";
http://blog.livedoor.jp/dankogai/archives/51048234.html