Perl鍋に参加させてもらった

初心者ですが急遽参加させていただきました。
邪魔にならないようにと思って臨みましたが、がっつり教えていただきました。
せめて私にできること・・・少しずつでも前進してアウトプットしていきたいと思います。

私の中でPerl入学式→なにわPerlPerl鍋のステップは描いていたのですが、
いかんせん年齢も年齢ですし(1年単位での成長では厳しい。)、
もう次回のPerl入学式は今期最終回で、このままでは触らなくなって終わってしまうという危機感を覚えました。
Perl入学式は何度でも受講可能とはいえ、できれば来年はもう一歩先へすすみたい、
とにかく今期が終わるまでに自分の意識を高めるためにも、できるだけ密に追い込む環境を作りたいと思ってます。

傍から見たら「それぐらい自分で学べばいいのに」と思うようなことでも、
質問してみるとそこから広がったりもするので、参加できる機会があれば逃したくないと思います。
私が参加することによってご迷惑をおかけしている方々、すみません。その分いつかお役にたてるように頑張ります。

今日学んだこと
テスト駆動開発の手順と内容(しかもライブラリと名前空間の意味が結構理解できた)
・Markdownますますすごい(テキストに記録されていたものがその場で立派な記録として出来上がってしまった)
・Mojolicious::Liteの動きの基本はweb!webの仕組みを学ぶ必要あり。
Perlでできることがちょっと見えてきた
Perlをやっている人みんながみんなWeb関連のプログラムを作ってるわけではないこと
Perlでもサイトを作れるもよう!

今後の目標
第1段階
GitHub使えるようになる
・Markdownで書き慣れる
・HTML学ぶ
・リーダブルコード(読みやすい書き方)を学ぶ
・webの仕組みについて学ぶ(getとpostとか)

第2段階
・自分で問題を作って解く
・定期実行でアラートメールを送る(Cron?)
・PCを買う
オブジェクト指向について学ぶ

GitHubのSSHで停滞

1ヶ月ほど前にGistを使いたくて(blogに問題の答えをきれいに表示させたかった)登録し、ひと通りの作業をやってみました。
でもちょっとサボると一切の記憶がありません。
ので、確かSSHで停滞して終わったので、続きを記録しながらやってみることにしました。
(Bitbucketと悩んで結局GitHubにしました。理由は覚えてません。。。)


そもそもは、blogとかでアウトプットすることで自分の頭の中が整理される、と皆さんに教えて頂いて、書くことに。
確かに整理することで、不明瞭な箇所が明確に把握できるし、振り返りも容易にできます。

  
今回振り返って、SSHの何で詰まってたかを思い出しました。
・/.sshの中をのぞこうにも、管理者権限でどうやってみる?
・その中にconfigファイルを作るとなって、vi起動するも、vimってどうやって保存して終わるの?
・":"を押せばノーマルモードからコマンドモードになるので、そこでwだ!と書いてるものの、なぜかうまくいかない。
・保存できたものの、今度は/.ssh下にconfig.swpとconfig.swoができてて、しかも両方ファイルタイプ不明で開けない。。。(結局これらはバックアップというか一時的に保存されていたものだったので、削除。)
GithubでKeyには、id_rsa.pub(公開鍵) の内容を貼付ける、とあるけどどこをコピーするの?
・$ pbcopy < ~/.ssh/id_rsa.pub →と見たけど、このコマンドはMac用でLinuxでは使えない問題。
・↑Linuxでは”xsel”らしく、標準では入ってない。。。ので入れる。
 $ sudo apt-get install xsel
エイリアスを指定すると簡単に使えるみたいだけどもうそれは後日!)
 $ cat ~/.ssh/config/id_rsa.pub | xsel --clipboard --input
(xselについてはここ参考に→xsel - コマンドラインからXセレクションを操作する - Linux便利コマンド
(catはファイルの中を見るコマンド)

Githubログインして(サインイン)、自分のアイコンクリックでsettingクリック→左の一覧からSshkey
そこのkeyのところへ貼り付け。

ここまできてすでに前公開鍵登録できてたみたいだと発覚(でも手元のを上書きしたからやり直す)、とにかくある程度Linuxを扱えないと、何するにも時間がかかってしまいます。
基本的なことをまず学んでおかないと、ということに気付きました。

そしてこれで2時間費やして、今日は終了。

とりあえず自分の導入手順メモ

①$ssh-keygen -t rsa
ファイル名聞かれるのでそのままエンター(id_rsaとかいうデフォルト?のファイル作成されるもよう)
($HOME/.ssh/ディレクトリに秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が作成される。)
パス聞かれるので入力。
②cd ~/.ssh  #カレントディレクトリを.sshに移動して、
③chmod 600 id_rsa パーミッションの変更(所有者のみ読み書き可能)
パーミッションについては→◇属性とパーミッション〜その1◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆
④~/.ssh/configに設定を追加しておく。なお、~/.ssh/configファイルがなければ新たに作成する。
ホームフォルダ下にある/.ssh/configは、ルート権限でないと入れないので、ホームフォルダをAdministratorで入る。
(configファイルはなかったので、作成。→$vi ~/.ssh/config)
⑥以下の設定でssh -l git -i ~/.ssh/github_id_rsa github.comを省略。
Host github.com
HostName github.com
IdentityFile ~/.ssh/github_id_rsa
User git
$ ssh -T git@github.com
⑦パス設定してたら聞かれるので入力する。
⑧これでたら成功!
Hi oisius(名前)! You've successfully authenticated,
but GitHub does not provide shell access.

うまくいかない場合は
GithubのSSH通信設定 - Qiita

手順をきっちり記録しておけばよかったです。。
その場で記録していくにはまだまだ余裕がありません。今眺めてもさっぱりです。

参考サイト

SSHとは
このサイトを参考にしました。
SSHの仕組み!ぼんやりとした理解だったものをすっきりさせようの会 - nigoblog

・導入手順
このサイトを参考にしました(前回教えてもらったサイト)。
SSH認証キーをGitHubへ設定する。(Mac用) - Qiita
あとこれも。
ssh公開鍵認証を実装する(自分メモ) - Qiita

Perl入学式 第5回 「webアプリ」

今日学んだこと(本当は他にももっとある)と復習

  • Mojoliciousがフレームワーク(開発環境ツール)だってこと。 (Webアプリケーションフレームワーク)
    開発環境ってEclipseのようなものをイメージしていたので。 でもPCへの負担もなく軽く動くので助かる。

  • Mojolicious::Liteについて
    長くなるので別途記載

  • Markdownは思ってた以上に便利っぽいこと。
    Markdown記法で書いていたら、そのまま議事録をPDF化できたり、 html化できたりするとのこと。
    今テキストでどんどん書いていっていて、それをエクセルにまとめなおしているので 最初からMarkdown記法で書いていれば、2度手間は省ける。
    (でもある意味今は書き直すことで復習しているので、これはこれでよし)

  • WebAPI
    Webを通して、何かの処理を行うための、手段や決めごと。
    いろんな会社のWebAPIが公開されてる。(amazon楽天など)
    自分のプログラムでそれらの機能を使うことができる。

  • GitHub
    GitHubの活用方法。こんなことがしたいと思って検索すると、GitHubにあがってたりする。 そのまま全部自分のpcに取り込んだりもできるので便利。

  • Bootstrapブートストラップ(今最新は4)
    もともとTwitterが作った、HTMLのフレームワーク。(webサイトをかっこよくしてくれる素材集セット)
    BootstrapのCSSを読んで、コードを(Bootstrapのリファレンスにいろいろな使い方がのっているのでそれをひっぱってきて)貼り付けたら使える。

解決したこと

  • Perl入学式4の復習問題[food.pl]の中にあるmy $data=q{〜};のqの意味がわからなかった
    →シングルクォーテーションで囲うと同意
      q(〜)='〜'       qq(〜)="〜"

  • 空白のとり方や、if文を一文にするかわけるかなど、書き方の疑問
    →リーダブルコードの本を読むといい。また、一気に整えてくれるツールもある。
    (以前書いたコードが読みにくいからといって全体を整えてしまうと、全体が変更箇所(差分)と認識されるので、今回の編集箇所のみ選択して使用する)

  • いろんなコードで基本'シングルクォーテーション'が使われている理由
    →"ダブルクォーテーション"を使うのは、展開しますよという意味を持つとき。
    それ以外は'シングルクォーテーション'。

  • ハッシュの展開での疑問(下記2つの展開の違い)
    →本来ハッシュをこのように展開する必要がない。Data::Dumperを使えばすむので。
    (配列の場合だと普通に表示される。)

   my $aaa={name=>"oisius",address=>"Osaka"};
   print %$aaa,"\n";
   print "%$aaa","\n";
   ↓
   addressOsakanameoisius
   %HASH(0x8d468ec)      #%+$aaaという認識

今後の目標

第1段階
GitHub使えるようになる(ssh解決する)
・Markdownで書き慣れる
・HTML学ぶ
・リーダブルコード(読みやすい書き方)を学ぶ

第2段階
・自分で問題を作って解く
・定期実行でアラートメールを送る(Cron?)
・PCを買う

Perl入学式の練習問題をおさらいする (第4回)

第4回

[次のような機能を持つコードを作成しよう(simple_calc.pl)]
1.2つの引数の和を計算するaddと同様に, 2つの引数の差を計算するmin, 積を計算するmul, 商を計算するdiv
というサブルーチンを作ってみよう.
これらのサブルーチンが正しく実装できているか(与えた2つの引数に対して, 適切な値を返すか)を確認するコードを書いてみよう.

#----------------------
sub say {
    my $str = shift;
    print $str,"\n";  
}

#----------------------
sub add {
    my ($xxx,$yyy)=@_;
    return ($xxx+$yyy);
}
print "add=>";
say add(9,9);

#----------------------
sub min {
    my ($xxx,$yyy)=@_;
    return ($xxx-$yyy);
}
print "min=>";
say min(9,9);

#----------------------
sub mul {
    my ($xxx,$yyy)=@_;
    return ($xxx*$yyy);
}
print "mul=>";
say mul(9,9);

#----------------------
sub div {
    my ($xxx,$yyy)=@_;
    return ($xxx/$yyy);
}
print "div=>";
say div(9,9);


#----------------------
print "\n";
if (add(9,9)==9+9){
   say "add_ok";
}
if (min(9,9)==9-9){
   say ("min_ok");
}
if (mul(9,9)==9*9){
   say ("mul_ok");
}
if (div(9,9)==9/9){
   say ("div_ok");
}

[配列とハッシュをそれぞれ1つずつ定義してから, 第1引数に配列のリファレンス,
第2引数にハッシュのリファレンスを受け取り, その中身を出力する(for文などを利用して...),
サブルーチン(output_array_and_hash)を書いてみよう(output_array_and_hash.pl)]

my @xxx=("a","b","c","d"); 
my %yyy=("name"=>"yamada");

#サブルーチン(output_array_and_hash)
sub output_array_and_hash {
   my ($array,$hash) = @_;
   for my $aaa(@$array) {
	     print $aaa,"\n";
   }
   for my $bbb(keys(%$hash)) {
       print $bbb,"=>";
       print $hash->{$bbb},"\n";
   }
}

#サブルーチン呼ぶ
output_array_and_hash(\@xxx,\%yyy);

[このような配列のリファレンスを受け取り, リファレンスに格納された文字列について,
「loves」の後に記述されている好きな食べ物の単語を正規表現で取得し,
「papix -> meat」, 「boolfool -> sushi」のように表示するサブルーチン, love_foodを書いてみよう(love_food.pl)]


my $words_ref = [
'papix loves meat!',
'boolfool loves sushi!',
];

my $words_ref = ['papix loves meat!','boolfool loves sushi!'];

sub love_food{
  my $str = shift;
  for my $aaa(@$str){
     if ($aaa=~ /(.+) loves (.+)!/){
       print "$1->$2\n";
     }
  }
}

love_food($words_ref);

[この$strに格納された文字列を, 置換を利用して, 「I love perl」に書き換えるようなコードを書いてみましょう(regexp_replace.pl)]

my $str = 'I love ruby';

my $str = 'I love ruby';
$str=~ s/ruby/perl/;
print $str,"\n";

#変数を用いると
my $str = 'I love ruby';
my $word1 = 'ruby';
my $word2 = 'perl';
$str=~s/$word1/$word2/;
print $str,"\n";


[次のコードは, 標準入力から入力された文字列を, ひたすら$inputに代入するコードである.
...の部分を, 次の条件を満たすように書き換えてみよう(while_input.pl)]


while (chomp(my $input = )) {
...
}

1.文字列が0の場合, ループを抜ける(lastを使って...)
文字列がperlないしPerlを含む場合, 「Find Perl!」と表示する.
文字列に大文字小文字問わず, pythonの文字列が含まれる場合, 「Find Python!」と表示する.
文字列にperlないしrubyないしpythonが含まれる場合, 「Love Programming!」と表示する.

sub say {
    my $str = shift;
    print $str,"\n";  
}

while (chomp(my $input = <STDIN>)) {
  if ($input eq 0){
	last;
  }
  if ($input=~/perl/ or $input=~/Perl/){
  	say("Find Perl!")
  }
  if ($input=~/python/i) {
  	say("Find Python!")
  }
  if ($input=~/perl/i or $input=~/ruby/i or $input=~/python/i){
  	say("Love Programming!")
  }
}


2.文字列の先頭にpapixがある場合, 「Find papix!」と表示する.
文字列にHelloが含まれる場合, その後に続く単語xxxxを使って「Hello! xxxx!」と表示する.
例えば, 文字列に「Hello papix」が含まれる場合, 「Hello! papix!」と表示すればOKです.

sub say {
    my $str = shift;
    print $str,"\n";  
}

while (chomp(my $input = <STDIN>)) {
  if ($input =~/^papix.*/){
  	say("Find papix!")
  }
  if ($input=~/Hello(.+)/){
  	say ("Hello,$1")
  }
}

Perl入学式の練習問題をおさらいする (第3回)

第3回

[次のような操作をするコードを作成(array_func1.pl)]
1.('Alice', 'Bob', 'Chris') という配列を作って出力してみましょう。

my @array=("Alice","Bob","Chris");        
print "@array\n";       


2.関数を使って 先頭の'Alice'を取り出して出力してみましょう。

my $pickup = shift @array;  
print "$pickup\n";  

3.関数を使って末尾の 'Chris' を取り出して出力してみましょう。

my $pickup = pop @array;  
print "$pickup\n";  

[次のような操作をするコードを作成(array_func2.pl)]
1.('Alice', 'Bob', 'Chris') という配列を作って出力してみましょう。

my @array=("Alice","Bob","Chris");  
print "@array\n";

2.1の配列を元に、関数を使って ('Zappa','Alice','Bob','Chris','Diana') という配列を作って出力してみましょう。

unshift @array,"Zappa";  
push @array,"Diana";  
print "@array\n";  

[次のような挙動をするコードを作成(join.pl)]
1.("0120" "123" "XXX") という内容の配列を qw ショートカットを使って作ってみましょう。

my @array=qw/0120 123 XXX/;  
print "@array\n";  

2.1で作った配列を繋げてみましょう。なんだか電話番号っぽいので、ハイフン ('-') を間にはさみましょう。

my $number=join "-",@array;
print "$number\n";

[次のような挙動をするコードを作成(split.pl)]
1.文字列 "/usr/bin/env perl" という文字列をスラッシュ ('/') で分割し、配列に格納してみましょう。

my @array=split /\//, "/usr/bin/env perl";

2.その配列を出力した時の結果を予想してみましょう. 予想出来たら実際に出力してみましょう.

print "@array\n";

[次のような挙動をするプログラムを作成(hash_profile.pl)]
1.自分の名前 (name)、年齢 (age)、好きな食べ物 (food) を key にしたハッシュを作ってみましょう。

my %hash=(name=>"oisius",age=>39,food=>"rice");

2.key である name, age, food を用いて、それぞれの value をprintしてみましょう。

print "name->$hash{name}\n";
print "age ->$hash{age}\n";
print "food->$hash{food}\n";

[次のような処理を実行するコードを作成(hash_func.pl)]
1.hash_profile.plで作ったハッシュを用意し、そのハッシュの key の一覧を出力してみましょう。

print keys %hash,"\n";

2.existsで年齢の要素が存在するかどうかを確認してみましょう。

if (exists $hash{age}){
  print "exists";
}

3.ハッシュから、年齢(age)の要素を取り除いてみましょう。

delete $hash{age};

4.年齢(age)の要素を削除した後、きちんと削除したか確認します。key の一覧を表示した後、existsで年齢の要素が存在しないことを調べ、きちんと削除されている場合は"Age is not exist."と表示するようにしてみましょう。

print keys %hash;
if (exists $hash{age}){
  print "exists";
}else{
  print "Age is not exist.";
}

[下記のような名前・住所・年齢といった要素を持つリファレンスを新たに作成してみましょう]
さらに Data::Dumper を用いて、作ったリファレンスを出力してみましょう。(reference_dump.pl)
my $papix = {
name => 'papix',
address => 'Tokyo',
age => 25,
};

use Data::Dumper;
my $oisius = {
    name    => 'oisius',
    address => 'Osaka',
    age     => 39,
};
print Dumper($oisius),"\n";


[score.pl には上記のようなハッシュリファレンスがいくつか宣言してあります。]
各人物の perl, ruby, python ... といった言語の合計値を key sum の value としてリファレンスに追加しましょう。
例: $papix の合計値は 270 なので、以下のようになります。(ただし、key の順番がこの通りになるとは限りません)
my $papix = {
name => 'papix',
affiliation => 'namba.pm',
perl => 60,
python => 50,
ruby => 50,
php => 80,
binary => 30,
sum => 270, # => 各言語の合計ポイントが格納されている!
};

my $papix = {
    name        => 'papix',
    affiliation => 'namba.pm',
    perl        => 60,
    python      => 50,
    ruby        => 50,
    php         => 80,
    binary      => 30,
};
my $boolfool = {
    name        => 'boolfool',
    affiliation => 'namba.pm',
    perl        => 40,
    python      => 10,
    ruby        => 20,
    php         => 30,
    binary      => 10,
};
my $moznion = {
    name        => 'moznion',
    affiliation => 'hachioji.pm',
    perl        => 100,
    python      => 70,
    ruby        => 80,
    php         => 50,
    binary      => 50,
};
my $binarian = {
    name        => 'binarian',
    affiliation => 'hachioji.pm',
    perl        => 10,
    python      => 11,
    ruby        => 1,
    php         => 100,
    binary      => 100,
};
my $uzulla = {
    name        => 'uzulla',
    affiliation => 'hachioji.pm',
    perl        => 1,
    python      => 0.01,
    ruby        => 0.5,
    php         => 4,
    binary      => 0.01,
};

my @all=($papix,$boolfool,$moznion,$binarian,$uzulla);
my @words=qw/perl python ruby php binary/;

for my $darekasan(@all) {
  for my $word(@words){
    $darekasan->{sum}+=$darekasan->{$word};
  }
print Dumper($darekasan),"\n";
}

こういうとき、$darekasan->{sum}は初期化?

[復習問題]

1.vote.pl
1-1. リファレンスの作成
「自分の名前 (name)」と「好きな食べ物の配列のリファレンス (favorite_foods)」を持ったハッシュリファレンスを作成しましょう。(「好きな食べ物」は「配列」ですから、複数個必要ですね)
同様のハッシュリファレンスを2, 3個作ってみましょう。

my $oisius ={name=>"oisius" ,favorite_foods=>[qw/rice sushi/]};   #$oisius=|oisius|A001|
my $julien ={name=>"julien" ,favorite_foods=>[qw/tomato sushi/]};
my $coyote ={name=>"coyote" ,favorite_foods=>[qw/steak sushi/]};
my $skipper={name=>"skipper",favorite_foods=>[qw/rice steak/]};

#配列のリファレンスは[]

1-2. リファレンスを配列に格納
作成した複数のハッシュリファレンスを1つの配列に格納しましょう。
直に代入しても良いですし、すでにサブルーチン(関数)を学んだ後であれば、配列を操作する関数を使っても良いですね。

my @all=($oisius,$julien,$coyote,$skipper);
 #@all=|a001|a002|---   |a001|=|oisius|A001|---  |A001|=|rice|sushi|

1-3. ランキングの表示
どのような方法でも良いので、好きな食べ物のランキングを作って、表示してみてください。
複数のハッシュリファレンスを格納した配列を for でひと通り回して (各ハッシュリファレンスにアクセスし)、配列リファレンスfavorite_foodsの中身を別の配列にひと通り格納して……という方法が1つ考えられますね!

さっぱりなので回答を見て解読した。

#ランキングをセットする
#%ranking---key:食べ物名、値:票数
my %ranking;
for my $darekasan(@all){
  my @foods=@{$darekasan->{favorite_foods}};   
       #$darekasan->{favorite_foods}=|A001|なのでそのデリファレンス|A001|=|rice|sushi|
  for my $food(@foods){   #|rice|sushi|から一つずつ
    $ranking{$food}++;    
  }                       
}
print Dumper(%ranking);

#%ranking key  :rice|sushi|tomato|steak| 
#         value:2   |3    |1     |1    |


#%votes---key:票数、値:その票数を得た食べ物一覧(配列のリファレンスで格納)。
my %votes;
for $_(keys %ranking){       #ex.1巡目->rice,2巡目->sushi,3巡目->tomato,4巡目->steak
  push @{$votes{$ranking{$_}}},$food;  
      #@{$votes{3}}---$vote{3}は配列のリファレンス %ranking内の食べ物のkeyの値(票数)
}
#%vote key  :0   |1    |2     |3    | 
#      value:    |e001 |f001  |g001 |・・・e001=|tomato|steak|  f001=|rice|  g001=|sushi|


#票数でsortして表示する
for my $keys(sort{$b<=>$a} keys %votes){  #大きい順に並べ替える(%votesのkeyでsort)キーがsortされて$keysに入る
  print "$keys: \n";                        #ex.1巡目->3,2巡目->2,3巡目->1...
  for my $food(@{$vote{$keys}}){       
            #%voteの要素、$votes{$keys}の、デリファレンスした配列の中から1個ずつ取り出す
    print "$food\n";
  }
}


2.score.pl
score.pl には、下記のようなハッシュリファレンスがいくつか宣言してあります。

my $papix = {
name => 'papix',
affiliation => 'namba.pm',
perl => 40,
python => 10,
ruby => 20,
php => 0,
binary => 0,
};

2-1. 点数の合計

  *上部に同じ問題あり省略

2-2. 言語ごとの平均

$averageというハッシュリファレンスを新たに作り、各人物のperlrubypythonの平均値を格納してください。

my $papix = {
    name        => 'papix',
    affiliation => 'namba.pm',
    perl        => 60,
    python      => 50,
    ruby        => 50,
    php         => 80,
    binary      => 30,
};
my $boolfool = {
    name        => 'boolfool',
    affiliation => 'namba.pm',
    perl        => 40,
    python      => 10,
    ruby        => 20,
    php         => 30,
    binary      => 10,
};
my $moznion = {
    name        => 'moznion',
    affiliation => 'hachioji.pm',
    perl        => 100,
    python      => 70,
    ruby        => 80,
    php         => 50,
    binary      => 50,
};
my $binarian = {
    name        => 'binarian',
    affiliation => 'hachioji.pm',
    perl        => 10,
    python      => 11,
    ruby        => 1,
    php         => 100,
    binary      => 100,
};
my $uzulla = {
    name        => 'uzulla',
    affiliation => 'hachioji.pm',
    perl        => 1,
    python      => 0.01,
    ruby        => 0.5,
    php         => 4,
    binary      => 0.01,
};
my $sum;
my $cnt;
my $avg;

my @all=($papix,$boolfool,$moznion,$binarian,$uzulla);
my @words=("perl","ruby","python");

for my $darekasan(@all) {
  for my $word(@words){
    $sum->{$word}+=$darekasan->{$word};
    $cnt->{$word}++;
  }
}
for my $word(@words){
	$avg->{$word}=$sum->{$word}/$cnt->{$word};
}
print "sum--\n",Dumper($sum),"\n";
print "cnt--\n",Dumper($cnt),"\n";
print "avg--\n",Dumper($avg),"\n";


2-3. 五段階評価

下記を参考に、各人物の言語ごとの成績を5段階で出力して下さい。
全角文字を出力するので、冒頭(use warnings;の下など)にbinmode STDOUT, ":utf8";と書いておくとよいでしょう

0 - 19 =>
20 - 39 => ★
40 - 59 => ★★
60 - 79 => ★★★
80 - 99 => ★★★★
100 => ★★★★★

STDOUTの使い方は?と思ったけど、print関数は実はSTDOUTしている模様。

#!/usrr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
#binmode STDOUT, ":utf8";←これ入れると文字化けした。

my $papix = {
    name        => 'papix',
    affiliation => 'namba.pm',
    perl        => 60,
    python      => 50,
    ruby        => 50,
    php         => 80,
    binary      => 30,
};
my $boolfool = {
    name        => 'boolfool',
    affiliation => 'namba.pm',
    perl        => 40,
    python      => 10,
    ruby        => 20,
    php         => 30,
    binary      => 10,
};
my $moznion = {
    name        => 'moznion',
    affiliation => 'hachioji.pm',
    perl        => 100,
    python      => 70,
    ruby        => 80,
    php         => 50,
    binary      => 50,
};
my $binarian = {
    name        => 'binarian',
    affiliation => 'hachioji.pm',
    perl        => 10,
    python      => 11,
    ruby        => 1,
    php         => 100,
    binary      => 100,
};
my $uzulla = {
    name        => 'uzulla',
    affiliation => 'hachioji.pm',
    perl        => 1,
    python      => 0.01,
    ruby        => 0.5,
    php         => 4,
    binary      => 0.01,
};

my @all=($papix,$boolfool,$moznion,$binarian,$uzulla);
my @words=qw/perl python ruby php binary/;

for my $darekasan(@all) {
  print "name<",$darekasan->{name},">\n";	
  for my $word(@words){
  	print $word,":";
    if ($darekasan->{$word}>=0 && $darekasan->{$word}<=19){
    	  print "\n";
    	}elsif($darekasan->{$word}>=20 && $darekasan->{$word}<=39){
          print "★\n";
        }elsif($darekasan->{$word}>=40 && $darekasan->{$word}<=59){
          print "★★\n";
        }elsif($darekasan->{$word}>=60 && $darekasan->{$word}<=79){
          print "★★★\n";
        }elsif($darekasan->{$word}>=80 && $darekasan->{$word}<=99){
          print "★★★★\n";
        }elsif($darekasan->{$word}==100){
          print "★★★★★★\n";
    }
  }
}

2-5. JSON風Dumper (オプション)
どのような方法でもよいので、score.plで用意されたデータを, 次のようなフォーマットで出力するようにしてみてください.

出力例
[
{
"python":10
"binary":0
"name":"boolfool"
"ruby":20
"perl":40
"php":0
"affiliation":"namba.pm"
"sum":70
},
{
"python":50
"binary":0
"name":"papix"
"ruby":50
"perl":60
"php":0
"affiliation":"namba.pm"
"sum":160
}
]

my $papix = {
    name        => 'papix',
    affiliation => 'namba.pm',
    perl        => 60,
    python      => 50,
    ruby        => 50,
    php         => 80,
    binary      => 30,
};
my $boolfool = {
    name        => 'boolfool',
    affiliation => 'namba.pm',
    perl        => 40,
    python      => 10,
    ruby        => 20,
    php         => 30,
    binary      => 10,
};
my $moznion = {
    name        => 'moznion',
    affiliation => 'hachioji.pm',
    perl        => 100,
    python      => 70,
    ruby        => 80,
    php         => 50,
    binary      => 50,
};
my $binarian = {
    name        => 'binarian',
    affiliation => 'hachioji.pm',
    perl        => 10,
    python      => 11,
    ruby        => 1,
    php         => 100,
    binary      => 100,
};
my $uzulla = {
    name        => 'uzulla',
    affiliation => 'hachioji.pm',
    perl        => 1,
    python      => 0.01,
    ruby        => 0.5,
    php         => 4,
    binary      => 0.01,
};

my @all=($papix,$boolfool,$moznion,$binarian,$uzulla);
my @words=qw/name affiliation perl python ruby php binary/;

for my $darekasan(@all) {
  print "{\n";	
  for my $word(@words){
  	if ($word eq "name" || $word eq "affiliation"){
   	  print "\"",$word,"\"",":","\"",$darekasan->{$word},"\"","\n";
 	}else{
  	  print "\"",$word,"\"",":",$darekasan->{$word},"\n";
  	}
  }
  print "}\n";	
}

Perl入学式の練習問題をおさらいする (第1回と第2回分)

第1回の2部

[print命令を複数個使って, あなたのプロフィール(名前, 年齢, 大学etc...)を表示するスクリプトを書いてみよう]

print "私の名前は\@oisiusです\n";  
print "年齢は39歳です\n";  
print "大阪府に住んでます\n";


[2015からあなたの生年の西暦を引き算して, 満年齢を表示してみましょう]

print "私の年齢は、",2015-1976,"歳です\n";  

第2回

[Hello, Worldという文字列を出力する(hello.pl)]

print "Hello World\n";  

[自分の名前, 年齢, 身長などの情報をそれぞれname, age, heightといったスカラ変数に格納し,それらの値を出力する (profile.pl)]

my $name = "\@oisius";  
my $age = 39;  
my $height=169;  
print "$name/","$age歳/","$heightセンチ\n";    

[標準入力から0以外の整数を2つ読み込み,それらを四則演算(+, -, *, /)した結果を上の例のように出力する(calc.pl)]

print '1つ目の数字をどうぞ >';  
chomp(my $num1=<STDIN>);  
print '2つ目の数字をどうぞ >';  
chomp(my $num2=<STDIN>);  

print "$num1+$num2 -> ",$num1+$num2,"\n";  
print "$num1-$num2 -> ",$num1-$num2,"\n";  
print "$num1*$num2 -> ",$num1*$num2,"\n";  
print "$num1/$num2 -> ",$num1/$num2,"\n";  

@_papix_さんの回答下記。そっか。xとyでいいし、明示してあげるといいのか。
https://github.com/perl-entrance-org/workshop-2014-02/blob/master/question/calc.pl


[端末から文字列を一つ入力し, その文字列が$answerと一致したらOK, 外れたらNGと表示します(question_word.pl)]

print "type a word\n";
my $ans = "good";

chomp(my $str =<STDIN>);

if($str eq $ans){
   print "OK\n";
}else{
   print "NG\n";
}

[端末から数字を一つ入力し, その数字が$answerと一致したらOK, $answerより大きければtoo big, 小さければtoo smallと表示します(question_num.pl)]

my $ans=99;
chomp(my $num=<STDIN>);

if ($num==$ans){
  print "OK\n"; 
}elsif($num>$ans){
  print "too big\n";
}elsif($num<$ans){
  print "too small\n";
}

入力した値が, $answerから-5〜+5の範囲内(例えば, $answerが10なら, 5〜15)の場合, nearと表示するようにしてみましょう

my $ans=99;
chomp(my $num=<STDIN>);

if($num==$ans){
  print "OK\n"; 
}elsif($num>$ans){
  if($num-$ans<=5){
    print "near\/";
  }
  print "too big\/";
}elsif($num<$ans){
  if($ans-$num<=5){
    print "near\/";
  }
  print "too small\n";
}

あえてifの中にifを書いたけど、よくない?

if($str==$ans){
  print "正解\n"; 
}elsif($str>$ans && ($str - $ans) <=5){
  print "near\/";
}elseif(str>$ans){
  print "too big\n";
}elsif($str<$ans && ($ans - $str) <=5){
  print "near\/";
}

[配列@arrayにを使って3つの文字列を格納し, これを「文字列として」ソートしたものを出力する(sort.pl)]

my @array;
for my $i(0..2){
  print "type a word->";
  chomp($array[$i]=<STDIN>);
}

my @sort=sort @array;
print "@sort\n";


[1から100までの数字について, 以下のようなルールに従って表示を行う(fizzbuzz.pl)]
(その数字が3で割り切れるならFizz,5で割り切れるならBuzz,3でも5でも割り切れるならFizzBuzz)

for my $i(1..100){
  my $msg="";
  if ($i % 3 == 0){
    $msg.="Fizz";
  }	
  if ($i % 5 == 0){
    $msg.="Buzz";
  }
  if ($msg ne ""){
    print "$i ==> $msg\n";
  }
}

@tomchaさんの回答下記。値があるかないかの聞き方なるほど。スマート!
https://github.com/perl-entrance-org/workshop-2015-02/blob/master/answer/osaka/tomcha/fizzbuzz.pl

if($outstr){
    print "$outstr\n";
}else{
    print "$i\n";
}

第2回の復習問題

https://github.com/perl-entrance-org/workshop-2015-02/blob/master/src/practice.md

[端末から文字を入力し, その文字を表示する(stdin.pl)]

print "type a word->";
chomp(my $str=<STDIN>);
print "---> $str\n";

[1から100までの値を配列に格納し, その配列の全ての数値を足した結果を出力する(sum.pl)]

my $sum;
for my $i(1..100){
  $sum+=$i;
}
print "$sum\n";

[標準入力により数値を一つ読み込み, その数値を階乗した値を出力する(factorial.pl)]

print "正の数を入力して->";
chomp(my $num=<STDIN>);
my $total=1;

if ($num>0){
  for my $i(reverse(1..$num)){
    $total*=$i;
  }
  print "$total\n";
}else{
  print "err\n";
}

配列を使う・・・↓

chomp(my $num=<STDIN>);
my @array;
my $total=1;

$array[0]=$num;
if ($num>1){
  for my $i(1..$num-1){
    $array[$i]=$num-$i;
  }
  for (@array){
    $total *= $_;
  }
  print "total->$total\n";
}

0の階乗は1?


for文で1個目だけ違う処理の場合、for文の前に入れていいもの?

[標準入力により数値を一つ読み込み, その数値が偶数なら"even", 奇数なら"odd" という文字を出力する(even_or_odd.pl)]

print "数を入力して->";
chomp(my $num=<STDIN>);

if ($num%2==0){
  print "even\n";
}else{
  print "odd\n";
}

子育て一段落で、Perl入学式

これは、Perl入学式 Advent Calendar 2015 3日目の投稿です。
昨日は@tomcha_さんでした。私、大変お世話になってます。

はじめに

2015年度Perl入学式(大阪)を受講させていただいてます@oisiusです。
いつも教えていただくばかりで、自分からは何も発信していませんので、
一度くらいはと思い、書かせていただくことにしました。
(こういうものを書くこと自体はじめてですので、読みづらさや至らない点ご容赦ください。)

まだ今のところ、Perlの位置づけや、自分がPerlでどんなことができるのかよくわかっていませんので、
初心者の方へ向けて、「初心者が参加した勉強会自体の感想」として書かせていただきます。

自分のこと

39歳です。
新卒時に少しプログラミングの経験はあります。
とはいえ、ごく部分的なものを仕様どおりに組むだけでしたし、
10数年昔の話なので、ほぼ何も覚えていません。

現在は主に在宅での事務仕事で、10年以上同じ環境です。
非常に恵まれた環境ではありますが、基本一人での作業ですので、単調な日々が続くこともあり、
また自分から何か調べようとしない限り、新しい知識を得ることはない状況です。

きっかけ

子育てが一段落した数年前から少し時間に余裕ができ、
自分の現状に満足できなくなったのがそもそものきっかけです。何かはじめてみようと思い立ちました。

バドミントンを習ってみたり、観劇に出かけてみたり、
色々自分に合うものを探しましたがどれもしっくりこず、何かを学びたいと思いはじめました。
そうして自分にあうセミナーを探していて、今時は勉強会が活発だということを知り、
その中でPerl入学式を見つけました。
初心者でもOKという文言を何度も確認して、2015年度の開講を待つことにしました。

開講を心待ちにしていたわけですが、実際に申し込める日が来ても、非常に悩みました。
手持ちのパソコンが古いノートしかなく、OSがXPでメモリも1GB。
新しく買おうにも何を買ってよいのかすらわかりません。
結局ネットで調べて、手持ちのものをLinuxに入れ替えましたが、
Linuxもわからない、プログラミングもわからない、こんな状況でも大丈夫なのか質問をしました。
安心できるお返事をいただいて、決意をかためて参加となりました。

参加してみて

--本当に初心者でも参加できます(年齢制限もありません)--
他の勉強会では初心者対象と書いてあっても、よく読むと「学生限定」であったり「○○の技術に限って初心者」というものが多く、プログラミング初心者や、パソコンの扱いに長けていない人が参加可能な勉強会は、関西圏ではなかなかありません。

--スピードが早すぎないです--
受講形式なので、
[問題を解いて下さい→解答はこちら→次いきます]
という流れかと思っていたのですが、私が受講した内容では、
[問題を解いてください→(しばらくして)→私も解きます→ここはこうでしょうか?→こうですね→みなさんどうでしょうか]
という流れだったので、今のところ置いてけぼりになることがないです。うれしいです。
講師の方々も、皆さんがプロなわけではなくて、普段Perlに触れていない方も教えてくださるので、ペースが早すぎなくてとても助かります。

--質問しやすいです--
質問したら喜んでもらえます。ありがたい話です。
やる気があれば、どこまででも教えてもらえると思います。
サポーターの方々が、自分たちも教えることで学べるという考えでいてくださるので、参加者としても気が楽です。

--座席--
私は目がよくないこともあって、基本一番前に座ります。
座席は、講師の方に近い一番前の席か、一番後ろの席など、サポーターの方々に近い場所にしておくと、より聞きやすいです。

--家で一人で学ぶものとは全然違います--
資料が公開されているので、家で一人でも学べると思いますが、
 ・参加登録をすることで、自らを逃れられない環境に追い込むことができる。
 ・講師の方の解答や、組み方をみて、こういうパターンもあるのかと気付くことがある。
 (正解と思って組んでいても、実際の組み方としては色んな形がありますね)
 ・ツールの便利な使い方など、講師の方がさわっているのを見て知ることができる。
 ・懇親会に参加できる。
という意味でも、実際に参加されることを強くお勧めします。

--予習ができます--
サポートしてもらえるとわかっていても不安なので、去年の資料を見て予習しています。
参加登録時の詳細に、講義内容を具体的に書いてくれているので、去年と順番が違っていても確認できます。
大阪では"なにわPerl"もありますので、もし欠席したり、つまずいても補講感覚で参加させてもらえます。
そしてこの先ステップアップしたら"Perl鍋"にも参加できます!

懇親会について

絶対邪魔になるし浮くと思ったのですが、"参加したほうが色々質問もできます"とうかがって、
2回目に思い切って参加しました。
その後も"皆さん本当はもっと高度な話をしたいだろうな"と思ったりもするのですが、
Perlに限らず何でも質問できて、色んな角度から皆さんにこたえていただけるので、
こんなありがたい機会はないので、今後も遠慮なく参加します。

 ・最初に参加した懇親会でリファレンスが壁だと聞いたので、そこは絶対乗り越えようと思えた
 ・講義中は聞きにくいことでも、懇親会では聞ける
 ・要望を伝えることができる(こうしてほしいとか)
 ・思い込みが解決したりする(*1)
 ・思わぬ方向に新しい知識を得ることができたりする(*2)

 *1)プログラミングはいかに短く書けるかが重要で、センスのある人しかできないと思っていたのですが、
 今は容量が限られたものでなければ、みんながわかりやすいように書くのが主流だと教えてもらいました。
 *2)私は普段何事もエクセルでまとめるのですが、皆さんがエクセルは使わないと聞いて、
 マークダウンエディタの存在を知りました。
 他にもこんなことできますよとそこからまた派生していきました。

もうすでに受講して半年は経過しているわけですが、それでもまだ受講は4回目で、
懇親会に参加できたのは2回だけです。
ですが、懇親会のおかげで、全然知らなかった世界がすごく身近になって、
多くのカタカナも、少しずつ理解できるようになりました。

最後に

初心者や年齢で参加を迷われてる方、とりあえず一度参加されてみてはいかがでしょうか。
(初心者の方はやはり第一回(環境構築)から参加されると気が楽だと思います。)
是非懇親会への参加もおすすめします。
 
 
そしてこの場をお借りして。。
このような機会を設けてくださって、
また皆さん温かく受け入れてくださって、心から感謝申し上げます。
ありがとうございます。


上記、 Perl入学式 Advent Calendar 2015 3日目の投稿でした。 明日以降も楽しみにしております。