徒然メモ

技術的なことを書いたり書かなかったり

perl入学式#4補講に参加してきました

毎月参加してるperl入学式 4月15日に開催された#4は仕事の都合で行けなかったので結構無理を言って有給もらって参加しました。 有給取れるよう調整してくださった関係者各位に感謝。

というわけでまずは#3までのおさらいから始まり。 その前に今回の資料はこれ http://nqounet.github.com/presentation/20120415_perlentrance4

前回までのおさらい

まずは基本のおまじない。

[perl]

!/usr/bin/env perl

use utf8; use strict; use warnings; binmode STDIN,  ":utf8"; # 標準入力 binmode STDOUT, ":utf8"; # 標準出力 binmode STDERR, ":utf8"; # 標準エラー出力

[/perl]

もうここまでの記述はテンプレートつくっておくのが一番ですね。 そのあとはprint文、変数、配列、条件分岐、比較演算子、繰り返しなどなど 前回までに解説のあったことのおさらいです。 おさらいの最後に練習問題をやりました。

おさらい問題

標準入力(STDIN)から値を5つ受け取って「受け取った値の全て」と
「数値としての最大値」を表示するプログラムを作ってみよう

回答方法

  1. for文と配列を使って書いて実行してみよう
  2. (余裕があれば)「数値としての最小値」も表示してみよう
  3. (余裕があれば)数値として0が入力された場合にエラーを出すようにしよう

まず最初につくった回答がこれ

[perl]

!/usr/bin/env perl

use utf8; use strict; use warnings;

binmode STDIN,  ":utf8"; # 標準入力 binmode STDOUT, ":utf8"; # 標準出力 binmode STDERR, ":utf8"; # 標準エラー出力

my @input; print "0以上の整数を5つ入力してくださいn"; for my $i (1 .. 5) { chomp(my $input = <STDIN>); if ($input != 0) { push (@input,$input); } else{ print "エラーですn"; } }

print "入力された値は@{input}です。n"; my @input2 =sort{$a <=> $b}@input; print "最大値は${input2[-1]}です。n"; print "最小値は${input2[0]}です。n";

[/perl]

がここで問題がsort関数使って配列内を並び替えてから最大値を最小値を取りだした のですが これは禁じ手だったというわな。 次回以降で解説される予定だったそうな。 というわけでやり直し。

それでつくりなおしたのがこれ

[perl]

!/usr/bin/env perl

use utf8; use strict; use warnings;

binmode STDIN,  ":utf8"; # 標準入力 binmode STDOUT, ":utf8"; # 標準出力 binmode STDERR, ":utf8"; # 標準エラー出力

my @input; my $max; my $min; my $tmp;

print "0以上の整数を5つ入力してくださいn"; for my $i (1 .. 5) { chomp(my $input = <STDIN>); if ($input != 0) { push (@input,$input); } else{ print "エラーですn"; } }

print "入力された値は@{input}です。n"; $max = $input[0]; $min = $input[4]; for my $i (0 .. 4){ $tmp = $input[$i]; if ($tmp <= $max){ $max = $tmp; } if($tmp >= $min){ $min = $tmp; } }

print "最大値は${max}です。n"; print "最小値は${min}です。n"; [/perl]

最大値と最小値をif文で取り出すようにしました。 これ後で見直すと2回目のfor文の$iか $tmpかのどっちかいりませんね。 まあこれでも動きました。 がこれだと0が入力された際配列に何も格納されないまま 処理 されてしまうので ちょっと問題ありです。

そこで修正したのが以下の通りです。

[perl]

!/usr/bin/env perl

use utf8; use strict; use warnings;

binmode STDIN,  ":utf8"; # 標準入力 binmode STDOUT, ":utf8"; # 標準出力 binmode STDERR, ":utf8"; # 標準エラー出力

my @input; my $max;my $min; my $tmp;

print "0以上の整数を5つ入力してくださいn"; while (@input < 5){ chomp(my $input = <STDIN>); if ($input != 0) { push (@input,$input); } else{ print "エラーですn"; } }

print "入力された値は@{input}です。n"; $max = $input[0]; $min = $input[4]; for my $i (0 .. 4){ $tmp = $input[$i]; if ($tmp <= $max){ $max = $tmp; } if($tmp >= $min){ $min = $tmp; } }

print "最大値は${max}です。n"; print "最小値は${min}です。n"; [/perl]

何が変わったのかというと最初の標準入力のところがforループからwhileループに なったこと 0が入力された場合はエラーですとだけ表示されて変数に値が格納されないため5個0以外 の数位が格納されるまでループが回り続けます。 これで問題は解消。 問題にfor文と配列を 使ってって書かれたのが微妙に罠な感じがするけどまあ気にしない。 あとはモジュールの紹 介として最大値を最小値をさくっと取り出せるモジュールの 紹介がありました。 実際に使って 描くとこれが

[perl] $max = $input[0]; $min = $input[4]; for my $i (0 .. 4){ $tmp = $input[$i]; if ($tmp <= $max){ $max = $tmp; } if($tmp >= $min){ $min = $tmp; } } [/perl]

[perl] my $max = max(@input); my $min = min(@input); [/perl]

こうなります。 2行になってしまいました。 モジュールってすばらしい。 ここでいったん休憩。

cpamモジュールの紹介

次にcpamモジュールの紹介がありました。 ここは資料を見てもらうのが早いしわかりやすいかなと。 というわけでカット。 他にも正規表現のざっくりとした解説などなどありました。 このあたりも詳細は資料を見てください。

ハッシュを使おう

ハッシュとは配列の一種。インデックスの代わりに文字列をキーとして値を参照する。 連想配列ともいう。定義するときは「%hash」的な感じで頭に%をつけるとハッシュと して定義される。 値を取り出すときは「{}ブレース(中括弧)」を使う。 ハッシュも配列と同様に以下のように定義できる。

[perl] my %hash1 = (‘one’, ‘two’, ‘three’, ‘four’); my %hash2 = (‘1’, ‘2’, ‘3’, ‘4’); [/perl]

しかしこの場合だと奇数番にある値はキーとして処理され偶数番にある値はキーに紐付く値として処理される。

たとえば

[perl] print "$hash1{one}n"; [/perl]

とした場合は「two」と表示される。 また配列と異なる点として

[perl] print %hash1; [/perl]

とした場合は格納されている値がランダムに表示される。

他にも

[perl] print "%hash1n"; [/perl]

とした場合は格納されている値は表示されず「%hash1」と表示される。 ハッシュを定義するときは以下のように書くとわかりやすくあとあとのメンテナンスも楽になる

[perl] my %hash  = ( ‘key1’ => ‘value1’, key2   => ‘value2’, ); [/perl]

「=>」はファットカンマと呼ばれカンマとほぼ同じ意味を持つ。 またハッシュの最後の値の後のカンマは必須ではないが後日値を追加することや順番を入れ 替えるときに カンマをつけ忘れて正常に実行されないといったことを避けるためにつけておくほうがベター。 ハッシュの便利なところは値に対してキーで名前付けできるので取り出したい値を覚えやすくまたその値が どういう値なのかソースをみて理解しやすいということらしいです。 このあたりは実際に使いこんでみるとわかるのかな。

ハッシュの中身を確認する方法としてはeachという関数を使う。 この関数はハッシュのキーと値をペアで返す関数。 資料にある以下のソースコードを実際に実行するとこうなる。

[perl] my %nqounet = ( twitter => ‘nqounet’, age     => ‘38’, lang    => ‘Perl’, ); while ( my ($key, $value) = each %nqounet ) { print "$key : $valuen"; } [/perl]

実行結果

lang : Perl twitter : nqounet

age : 38

データの中身を簡単に確認する方法

配列やハッシュはデータの中身をみるのが面倒。 特にハッシュはprint文1行では簡単に見れないからめんどくさい。 それを簡単に見るために使うのが「Data::Dumper::Concise」というモジュールを使う。 資料の以下のサンプルプログラムを実際に実行するとこんな感じに表示される

[perl]

!/usr/bin/env perl

use utf8; use strict; use warnings;

binmode STDIN,  ":utf8"; # 標準入力 binmode STDOUT, ":utf8"; # 標準出力 binmode STDERR, ":utf8"; # 標準エラー出力 use Data::Dumper::Concise; # Dumperという関数を生成

my %nqounet = ( twitter => ‘nqounet’, age     => ‘38’, lang    => ‘Perl’, );

print Dumper( %nqounet ); [/perl]

実行結果

{ age => 38, lang => “Perl”, twitter => “nqounet”

}

1行で表示されました。 楽ちん!

たくさんの情報を持ちたい

多くの情報を持ったハッシュを作りたいときにハッシュの中に配列を代入すると残念なことになる。 詳細は資料で!

でどうするかというとリファレンスを用いて階層構造を作る。 サンプルプログラムは資料の通りなので割愛

ざっくり自分の中でリファレンスをまとめると変数や配列、ハッシュの1つ以上のスカラー値を持ったものを tarで固めてそれを変数や配列に格納する感じという認識になった。 厳密に言うと違う気もするけど今回のところはそんな感じの認識。

宿題のリファレンスを使った練習問題

Dumperすると、以下のようになるような変数を作成してください

====================================================
{
  luigi => {
    color => "green",
    initial => "L"
  },
  mario => {
    color => "red",
    initial => "M"
  }
}
====================================================

んで自分がつくったプログラムがこれ

[perl]

!/usr/bin/env perl

use utf8; use strict; use warnings;

binmode STDIN,  ":utf8"; # 標準入力 binmode STDOUT, ":utf8"; # 標準出力 binmode STDERR, ":utf8"; # 標準エラー出力

use Data::Dumper::Concise; # Dumperという関数を生成

use Data::Dumper::Concise;

my %luigi = ( color => "green", initial => "L", ); my %mario = ( color => "red", initial => "M" ); my %brothers = ( luigi => %luigi, mario => %mario, ); print Dumper %brothers; [/perl]

なんか最後がかなりはしょった感あるけど今回のまとめはこんな感じです。 次回の#5はまた仕事の都合で参加できないんですが#5の補講はたぶん行けるかな。

最後になりましたが今回の講師をしてくださった若林さんありがとうございました。

Perl入学式#2に参加しました。

2/25に開催されたPerl入学式#2に参加してきました。

前回の#1では環境の構築で今回はPerlでプログラムを書いていくまずはお作法を覚える回といった感じでしょうか。

文末は「;」で終わらせるとか「#」でコメントアウトだとかの基本から

バンPerlコマンドの指定をする

use strict; use warnings; use utf8;

といった基本ののおまじないの説明。

変数、配列、連想配列(ハッシュ)の説明

といったところでした。 それらの説明が終わったところで簡単な課題をやってみようということで 4問ほどやりました。 課題と自分が書いたコードはこんな感じです。

  1. 値を入力して入力された値の2乗の数値を出力する [perl] #! /home/nullpop/perl5/perlbrew/perls/perl-5.10.1/bin/perl use strict; use warnings; use utf8; binmode STDIN,":encoding(utf8)"; # 標準入力をUTF-8エンコード binmode STDOUT,":encoding(utf8)"; #標準出力をUTF-8エンコードする printf "値を入力してください:"; my $int = <STDIN>; my $ans = $int ** 2; print "$int の2乗は$ans n"; [/perl]
  2. 値aと値bを入力して入力された値の平均を出力する [perl] #!/home/nullpop/perl5/perlbrew/perls/perl-5.10.1/bin/perl use strict; use warnings; use utf8; binmode STDIN,":encoding(utf8)"; # 標準入力をUTF-8エンコード binmode STDOUT,":encoding(utf8)"; #標準出力をUTF-8エンコードする print "値aを入力してください:"; my $numa = <STDIN>; print "値bを入力してください:"; my $numb = <STDIN>; my $ans = ($numa + $numb) / 2; print "$numa と $numb の平均は$ans  です。n"; [/perl]
  3. 身長を体重を入力してBMIを表示させる [perl] #!/home/nullpop/perl5/perlbrew/perls/perl-5.10.1/bin/perl use strict; use warnings; use utf8; binmode STDIN,":encoding(utf8)"; # 標準入力をUTF-8エンコード #binmode STDOUT,":encoding(utf8)"; #標準出力をUTF-8エンコードする print "身長を入力してください(cm):"; my $numa = <STDIN>; #単位をcmからmに変換する $numa = $numa / 100; print "体重を入力してください(kg):"; my $numb = <STDIN>; #BMIの計算 my $ans = $numb / ($numa **2); print "あなたのBMI値は$ans です。n"; [/perl]
  4. 時間、分、秒、を入力し合計何秒か表示させる [perl] #!/home/nullpop/perl5/perlbrew/perls/perl-5.10.1/bin/perl use strict; use warnings; use utf8; binmode STDIN,":encoding(utf8)"; # 標準入力をUTF-8エンコード binmode STDOUT,":encoding(utf8)"; #標準出力をUTF-8エンコードする print "時間を入力してください:"; my $numa = <STDIN>; my $hour = $numa * 3600; print "分を入力してください:"; my $numb = <STDIN>; my $min = $numb * 60; print "秒を入力してください:"; my $numc = <STDIN>; my $ans1 = ($hour + $min + $numc); print "1回目に入力されたのは $ans1 秒です。n"; print "2回目n"; print "時間を入力してください:"; my $numa2 = <STDIN>; my $hour2 = $numa2 * 3600; print "分を入力してください:"; my $numb2 = <STDIN>; my $min2 = $numb2 * 60; print "秒を入力してください:"; my $numc2 = <STDIN>; my $ans2 = ($hour2 + $min2 + $numc2); print "2回目に入力されたのは $ans2 秒です。"; my $ans3 = $ans2 - $ans1; print "1回目と2回目の差は$ans3 秒です。n"; [/perl]

課題4問終わったところで時間となりそのあとは懇親会となりました。 懇親会では 熱い意見交換が繰り広げられ個人的には非常に参考になりました。 最後に名刺交換となりましたがまさかの名刺を忘れていくということをやらかしてしまった。次回は忘れずに持っていかねば。

次回Perl入学式#3は3月18日に今回と同じ十三の水交ビルで行われるそうです。 ATNDから申し込みできるので興味がある方で時間が合う方はぜひ。

今回の#2の同じ内容の補講についても3月11日に行われるそうなので今回時間が合わなかった人はこちらに参加すればいいんじゃないかな。 補講もATNDから参加申し込みできるので行きたい人はお早めにどぞ。

Apache HTTP Server 2.4.1 をビルド

CentOS5.7と6.2の環境どちらも同じ手順で行いました。

167 wget http://ftp.riken.jp/net/apache//httpd/httpd-2.4.1.tar.gz 168 wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.4.6.tar.gz 169 wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.4.1.tar.gz 170 wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.30.tar.gz 171 tar zxvf apr-1.4.6.tar.gz 172 cd apr-1.4.6 173 ./configure --prefix=/usr/local/apr-1.4.6 174 make 175 make install 176 cd .. 177 tar zxvf apr-util-1.4.1.tar.gz 178 cd apr-util-1.4.1 179 ./configure --prefix=/usr/local/apr-util-1.4.1 --with-apr=/usr/local/apr-1.4.6/ 180 make 181 make install 182 cd .. 183 tar zxvf pcre-8.30.tar.gz 184 cd pcre-8.30 185 ./configure --prefix=/usr/local/pcre-8.30 186 make 187 make install 188 cd .. 189 tar zxvf httpd-2.4.1.tar.gz 190 cd httpd-2.4.1 191 ./configure --prefix=/usr/local/apache-2.4.1 --enable-load-all-modules --with-apr=/usr/local/apr-1.4.6/ --with-apr-util=/usr/local/apr-util-1.4.1/ --with-pcre=/usr/local/pcre-8.30/ 192 make 193 make install