sironekotoroの日記

Perl で楽をしたい

Perl入学式で講師やりながら思った、過去の自分にしつこく教えてあげたかった事

この記事はPerl入学式 Advent Calendar 2017 17日目の記事です。

qiita.com

昨日(2018/02/03)に開催した「Perl入学式 in 東京 第3回」で配列操作とハッシュ変数、ハッシュの操作についての講師を担当しました。

教えることで学びを得られる、と言うのは本当のことで、理解の浅い部分があるなぁ、と思うことしきりです。

また、かつて自分が初学者だった時に早めに気づくことができれば・・・!ってことを思い出したりしました。今日はその、かつての「Perlの配列とかハッシュとかよう分からん」と言っていた自分向けのエントリです。

要約すると、配列もハッシュも、ようは一つの値の集まりなんよ!お前が表示したり変更したり追加したかったのは一つの値なんだから$つかえ!、ということをしつこく書いただけのエントリです。

$で始まるスカラー変数

Perlには一つの値しか代入できないスカラー変数があります。Perl入学式でいうと第2回の内容です。

github.com

use strict;
use warnings;

my $scalar = '123456';
print $scalar , "\n";   # 123456、改行

この $scalarスカラー変数です。

@で始まる配列変数だけど、個々の要素を指定する時は$なんだぜ

そして配列です。

@arrayが配列変数です。配列には複数の値を格納することができます。

配列変数@arrayの先頭の値を表示してみます。

use strict;
use warnings;

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

print $array[0] , "\n"  # 1、改行

配列@arrayの先頭にある値を直接print関数で表示しています。print関数の右側に注目すると、変数先頭の記号が @から$に変更されています。また、末尾に[0]が付け加えられています。

これは、配列内の一つの値を指し示す時の表記です。

配列の中の値を一つ指定するときは、スカラー変数を指定する時と同じように先頭の記号が$になります。そして配列の中の何番目に格納されている値なのか?を末尾にある[0]で指定しています。この[0]は「添え字」と呼ばれます。

強調したいのは、一つの値を表示する、値を削除するなり変更するなり、とにかく一つの値を指し示す時は元の変数がなんであれ、先頭の記号が$になる、ということです。

%で始まるハッシュ変数だって、個々のkeyに結びついた情報取ってくる時は$なんだぜ

ハッシュ変数から値を一つ指定するときも同様です。

github.com

%hashがハッシュ変数です。ハッシュには複数の値を格納することができますが、配列とは異なり、key => value というペアで値を格納します。

use strict;
use warnings;

my %hash = (
    name        => 'sironekotoro',
    tweet_count => 202540,
);

print $hash{name} , "\n";       # sironekotoro、改行
print $hash{tweet_count} , "\n";# 202540、改行

ここでもハッシュの中の値を一つ表示する時、変数先頭の記号が%から$に変化しています。配列の値にアクセスする時と同じです。

そして、ハッシュ内のどのkeyに結びついたvalueが欲しいのかを指し示すために、末尾に中かっこで括った{key}を加えます。

ここでも配列から一つの値を操作する時と同様、対象は一つの値なので、$を使います。

つまり・・・?

配列もハッシュも、一つの値の集まりなんよ!

お前が表示したり変更したり追加したかったのは一つの値なんだから$つかえ!

って事を、自分に教えてあげたら、も少し早く理解できたかなぁと思ったのでした。

Perl入学式を卒業したらこの本を読むと良いんじゃないかなの5冊

こんちゃす。sironekotoroです。

このエントリは Perl入学式 Advent Calendar 2017 - Qiita 9日目のエントリが空いてたので、こそっと入れました。

さっき12月10日のアドベントカレンダー見たら

perlを学ぶと彼女ができると教えてくれたので受講しました。

まじか沖縄行く

ではなく、

perl入学式も中盤になったところからperlの参考書どれ買ったらいいのか、と考えていたとき

とあり、そういえば、サポーターとしてお手伝いしてたPerl入学式 東京2017(上期)でも同じような質問があったなぁ、ということで、ここに個人的なオススメ本を紹介します。

重要開示

  • 私はオライリーの「初めてのPerl」に挫折してます(3回くらい)
  • 第5版を本で書い、挫折し、そのあと他の本で修行を積み、電子版で第6版を書って読破(というのか?)しました
  • 以下で紹介するのは「はじめてのPerl」を読む前の本、と言えるかもしれない

Perl入学式を卒業したらこの本を読むと良いんじゃないかなの5冊

かんたん Perl

gihyo.jp Perl入学式で聞き流してしまったことがある、わからないことがあったが聞けなかった、入学式の範囲をもっと詳しく勉強したい、知りたい、という人にオススメしたい本。
Perl入学式で学ぶ範囲の復習に最適です。
サンプルプログラムも豊富で、エラーについての解説もとても丁寧です。挫折ポイントを先回りして潰してくれる感があります。
Perl本の出版は少なくなっている中、2016年出版とかなり新しいのもポイント高いです。

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

gihyo.jp Perl入学式で基礎は押さえた、Perl入学式の範囲からさらに一歩進めた学習がしたい!って人にオススメ。
Perlにおけるリファレンスがわからない、という方には絶対の自信を持ってオススメします。うちはこの本のおかげでリファレンスを理解できました。
この本の半分くらいはリファレンスについて、本当に丁寧に丁寧に説明してます。

あと、この本ではソースコードを編集した時、「どこを編集したか」がわかりやすいです。
Perlに限らず、他の本では編集した部分だけが掲載されて、それがコードのどこなのか?で迷うことがあるのですが、この本では比較的そういうことが少なくて、とても学習しやすい本です。

また、「オブジェクト指向」というと、JavaC++の知識前提で語る本が多いなか、この本はそのような前提知識なしにオブジェクト指向について学ぶことができます。
これはPerl第一言語の自分にとって、本当にとても有難いことでした。

Perl CPANモジュールガイド

www.wgn.co.jp Perl入学式で簡単なスクリプトは組むことができた、でも実際にプログラムで何をすれば良いのかわからない・・・という人にはこれ。 様々なPerlのモジュールとその簡単な使い方を紹介している本です。
この本を読んでいると、「あれも出来るのでは?これも出来そうでは?」とアイデアや欲望(大事)が湧いてくる本です。

2011年の本なので、当然、2017年現在のサービス(例えばLINE)についてのモジュールは載っていないのですが、「このモジュールがあったんだから、他のサービスのモジュールあるだろ」って探すとあっさり見つかったりします。そういうキッカケをくれる本です。

なお、LINEとPerlについてはこちらをどうぞ
第44回 LINE Messaging APIで作るchatbot―LINE::Bot::APIとngrokでお手軽に!(1):Perl Hackers Hub|gihyo.jp … 技術評論社

もっと自在にサーバを使い倒す 業務に役立つPerl

gihyo.jp Perlを学びつつ、では実際にどうやって使っていくのか?を解説している本です。
題名に偽りなしで、これを読むことで「あの仕事、Perl使うことで楽できそう」という欲望(超大事)がフツフツと湧いてくる本です。
特に、吐き出されたログをExcelで編集して集計、みたいな仕事をやっている人に読んでいただけると、「Perlしゅごい・・・」ってなること請け合いです(4年くらい前の自分)

Perlについて語ろう

Perlについて語ろう

Perlについて語ろう

kindle本で、内容はPerlについて発行していたメルマガを編集したものです。
タイトルからするとエッセイ?と思うんですが、さにあらず。スカラー変数、配列、ハッシュ、リファレンス・・・つまりPerl入学式の範囲から始まり、mojoliciousというフレームワークでWebサイトを作るところまでをソースの解説を交えつつ書いています。 他の本に比べて基本的な解説は少ないですが、Perl入学式で学んだ内容を踏まえ、もう少しで手が届くかも・・・?という感じのレベルになってます。

ということで

ちょうどアドベントカレンダーも空いてしまったので、自分が買って読んでよかったなぁ、という本をあげてみました。
大きな本屋も少なくなってきている昨今、なかなかPerl本を書店で見ることないかもしれないのです。
そういう時は、大きな図書館を探してみると良いです。
(あとブックオフ

かつて、技術書はちょっと高い?とも思っていたんですが、
「この機能がわかるなら、この部分が動いてくれるなら魂売っても良い!」
とか思うようになってくると、3000円くらいで教えてくれるの本当に安いなって思います。

以上、Perl入学式を卒業したらこの本を読むと良いんじゃないかの5冊でした。

Perl入学式で勉強した後の力試しに良さげなサービスの紹介

こんちゃす。sironekotoroです。

このエントリは Perl入学式 Advent Calendar 2017 - Qiita 6日目のエントリです。
昨日はPerl入学式東京の名講師、 @xtetsuji さんでした。

いきなり私事ですが

最近色々あり、転職だー!と意気込んでいろいろと見ているのですが、面白げなサイトを見つけました。

注意:これはPerl入学式 Advent Calendar 2017 のエントリですが、Perl入学式がこのサイトを推している訳ではありません。

転職サイトPaizaで行なっているスキルチェックです。

paiza.jp

Paizaのスキルチェック

ランクは難易度の高い順に S,A,B,C,D の5段階があります。
ランクDの問題は80問ほどあり、Perl入学式で学んだ知識で十分解けます。
ランクCは40問ほど。こちらはリファレンス使わないと面倒な問題がありますが、解けます。
入学式に参加している人、または入学式を終えた人の力試しとしてちょうど良いです。

やってみる、その前に

以下は、ログインしなくても解ける掛け算の問題です。

掛け算 (paizaランク D 相当)
https://paiza.jp/learning/multiplication

ここでおもむろに

  • 入力欄右上の「使用する言語」で「Perl」を選択
  • 入力欄の文字を全部消す
  • 入力欄に print $]; と入力
  • 「提出前動作確認」ボタンを押す

当然不正解となります。 しかし

提出コードのアウトプット 5.022001

Perlのバージョンが5.022であり、Perl入学式でインストールしたPerlと互換性がありそう、ってことが分かります。
また、ここで使えるPerlは、List::Util等の便利モジュールも利用可能になっています。

やってみる

この掛け算問題はデモなので、解法の例を挙げておきます。
本番の問題を情報共有するのはNGです。 あと、データは標準入力から改行付きで渡されるので、chomp忘れないように気をつけましょう。

use strict;
use warnings;

# 最初の行の入力を変数`$first_num`で受け取る
my $first_num = <STDIN>;

# 次の行の入力を変数`$second_num`で受け取る
my $second_num = <STDIN>;

# 上記二つの変数についてる改行文字を削除する
chomp ($first_num , $second_num);

# 二つの変数を掛け算して、答えを$answerに入れる
my $answer = $first_num * $second_num;

# $answerを出力する
print STDOUT "$answer\n"

もひとつ、短いバージョンも

use 5.022;
my @a = <STDIN>;
chomp @a;
say $a[0]*$a[1];

Paizaのスキルチェックで良かったところ

普段自分のコードでは除外している考えやシチュエーションがあり、新鮮で面白いです。
本職のプログラマさんはこんな感じで時間に追われながらコード書いてるんかなぁ、と思ったり、テストコードちゃんと用意するのも大変そうとか、本職プログラマの方のお仕事の大変さがちょっとだけ見える気がします。

Paizaのスキルチェックでイケてないところ

提出時にいくつかのテストケースでテストを行うのですが、そのテストデータは公開されません。
ですので、テストに通らない時は「何がおかしいのか?」ってのを問題文や入力値のとりうる範囲から探っていくことになり、これが割とキツイです。
あと、他の人のアーティスティックな回答とか見られないの残念かつもったいない気がしますね・・・まぁ、本来は転職に使う用のものなので仕方ないか。

おまけ

なお、転職活動や業務引き継ぎ資料の作成そっちのけでこのサイトのスキルチェックを行い、ランクA、Bが解けなくて本当に悔しくなり、

  • 「この問題、遠い昔に聞いた『順列』とやらを使えば良さそうだけど、分からないからコードにできない」
  • 「このデータ、規則性はありそうだけどコードで表す方法わからない」
  • 「やはりアルゴリズムとか数学の勉強しなくてはいけないのでは?」

となり、N予備校に入学したのを良いことに中学数学からやり直すという本末転倒、目的と手段の入れ替わりみたいなことになってますが、楽しいんでokとします。解の公式、美しいですよね。

明日は・・・まだ決まってない?ので是非誰か参加を〜!

Perl入学式で勉強して、情報処理試験の問題を解こう!& おまけ

こんにちは

本年はPerl入学式(東京)でサポーターやっておりますsironekotoroです。

このエントリは Perl入学式 Advent Calendar 2017 - Qiita の2日目です。

qiita.com

Perl情報処理試験問題に出ていた事があった

出オチです。

平成18年度 春期 テクニカルエンジニア(情報セキュリティ) 午後I 問題
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2004h16_2/2004h16a_su_pm1_qs.pdf
問1「Webサイトのセキュリティに関する次の記述を読んで、設問1~4に答えよ。」

ブラウザからユーザーのデータを送信する際、留意すべき知識を問う問題です。
留意しないと、いずれ徳丸先生が来る事態になります。
是非一度チャレンジして見てください。

注意

残念なことに試験問題へのPerlの採用は2011年まで。代わりに入ったのはECMAScriptでした。

情報処理推進機構情報処理技術者試験:新着:情報セキュリティスペシャリスト試験(SC)で出題するプログラム言語の変更について
https://www.jitec.ipa.go.jp/1_00topic/topic_20111026_sc_yougo.html

それって

・・・Perlやっても今の情報処理試験の問題解けないじゃん!
いえいえ、Perlやってると不思議と他のプログラム言語のつくりとか分かるんですよこれが。
プログラム言語はだいたい英語で書かれてますし、大体の言語で if とか for の仕組みが大きく違うわけではないです。

また、この試験問題の巻末に「プログラム言語Perlの用例・解説」があります。
これがPerl入学式で学ぶ内容とほぼ重なっている事に驚きました。
つまり、Perl入学式やってりゃ試験問題程度のコードは読める!

注意:Perl入学式最大の難所、三日目の悪魔、記号がキモい、Perl初心者転がし、等の異名を持つ「リファレンス」は含まれておりません。

まずPerlでプログラムの基本おさえていきましょう!
分からなくなっても、サポーターが質問に答えてくれるのがPerl入学式です。

さて、明日はYAPC::Okinawa 2018 ONNASON で会える好青年、YAPC運営ブログでおなじみの AnaTofuZ 君です。エモい記事に期待です。

blog.yapcjapan.org

おまけ:プログラム言語Perlの用例・解説

巻末の「プログラム言語Perlの用例・解説」を復習の意味も込めて書写してみました。 openの引数が2つしかないなど、今時なコードではないのですが、Perlの基本は抑えられているという印象です。

試験の過去問題の使用に関しての注意書き

なお、この書写はIPAガイドラインを見て、大丈夫と判断して書写・掲載しております。

IPA 独立行政法人 情報処理推進機構情報処理技術者試験:よくある質問
https://www.jitec.ipa.go.jp/1_09faq/_index_faq.html

試験センターで公表している過去の試験問題の使用に関し、許諾や使用料は必要ありません。(ダウンロードでのご利用も特に問題ございません。)
 ただし、以下の留意点を必ず確認の上、ご使用ください。

【留意点】
著作権は放棄していません。
・教育目的など、情報処理技術者試験制度、情報処理安全確保支援士制度の意義に反しない限り、公表されている過去問題を問題集やテキストに使用される際、許諾および使用料の必要はありません。
・出典は明記してください。
 [例]「出典:平成○年度 ○期 ○○試験区分 午前 問1 設問2」
 また、問題の一部を改変している場合、その旨も明記してください。
・公表しているPDF以外の電子データの提供はできません。
 (PDFセキュリティの解除方法は提供できません。)

続きを読む

Software Design 2017年12月号

うわ、ずいぶんとblog書いてなかった・・・

最近、ドワンゴN予備校に入学しました。

www.nnn.ed.nico

とあるJavaScript本で勉強していたんですが、本の内容と付録CDROMでコードが異なるとか、コードの追加部分が分かりにくい等でめっちゃストレスが溜まっていたんですね。 一度、有料のオンライン講座?講義?的なものに挑戦したかったのと、増田で話題になっていたこともあり、興味本位での入学です。

anond.hatelabo.jp

ところが、ログイン後の初期画面に表示されていた「数学I」をちょっと覗き見し、その問題にちょっと手を出したところ、解けない・・・かつては解けた、二次関数のグラフが書けない・・・もう、超ショックを受け、一念発起、中学数学から復習してる昨今です。

平方根の付け外し、移項に伴う符号(+-)の逆転、指数計算とそれまでの学習全部を使って導く「解の公式」。 中学数学の中ボス感すごい。

{ \displaystyle
x = \frac{-b\pm \sqrt{b^{2}-4ac}}{2a}
}

で、タイムリーなことにSoftware Design 2017年12月号の特集は「ITエンジニアと数学」。

gihyo.jp

生きていると、たまに自分の欲しいものがタイミングよく現れることがあるんですが、今回もそう。 早速、最初に載っていた「モンティ・ホール」問題のスクリプトPerlで書いてみました。 元はPythonで書かれているのですが、構造や単語からなんとなく読めるのがプログラムのいいところですね。

use strict;
use warnings;

sub game {
    my $change_door = shift;

    my $prize  = int( rand(3) );    # 正解 0,1,2 のどれか
    my $choice = int( rand(3) );    # 最初の選択 0,1,2 のどれか

    my $open_door;   # モンティが開くドアの選択 0,1,2 のどれか

    while (1)
    { # モンティが選ぶドアが$pize,$choiceと重ならないようにループを回す
        $open_door = int( rand(3) );

        # 重ならない値が決まったらループを抜ける
        last if ( $open_door != $choice and $open_door != $prize );
    }

    if ($change_door) {    # 選択を変更する場合
           # ドアは0,1,2しかないので、数の決まったforを使う
        for ( my $new_choice = 0; $new_choice < 3; $new_choice++ ) {

            # 選択し直したドアは、最初にに選んだドア、
            # モンティが開けたドアと重ならないようにする
            if ( $new_choice != $choice and $new_choice != $open_door ) {
                # 条件に合致したら、新たに選択したドアの情報を$choiceに設定して抜ける
                $choice = $new_choice;
                last;
            }
        }
    }

    # 選択したドアが商品が入っていたドアなら1点
    if ( $choice == $prize ) {
        return 1;
    }
    # 外れてたら0点
    else {
        return 0;
    }
}

sub play {
    my ( $num, $change_door ) = @_;
    my $point = 0;

    for ( my $i = 0; $i < $num; $i++ ) {
        $point += game($change_door);
    }
    return $point;
}

my $num = 10000; # 試行回数

my $score = play( $num, 0 );
print "変更しない場合の勝率\t", $score / $num, "\n";

$score = play( $num, 1 );
print "変更した場合の勝率\t", $score / $num, "\n";

うちの結果はこんな感じでした。なるほど。

変更しない場合の勝率  0.3254
変更した場合の勝率   0.658

あと、「課外授業4 数学の勉強法」にあった

確実にわかる、自信が持てるところから再出発しましょう。高校レベル、あるいは中学レベルまで戻って勉強しなおしてみましょう。
(中略)
ノートとボールペンをどれだけ消費するか

これはうちの勉強方針とも合致してて、間違った方向にいってなさそう!と心強く思いましたわ。引き続き頑張りまする。

builderscon tokyo 2017に行ってきた

前夜祭

  • みんな大変な思いして、そんで前に進んで行っているんだなぁと

ベストトーク賞に投票した3つの発表

横山三国志に「うむ」は何コマある?〜マンガ全文検索システムの構築

builderscon.io

  • 画像認識してコマの抜き出し、抜き出したコマからOCRで文字認識、認識させた文字を使って検索、さらに翻訳
  • 公開されていた検証用サイト使わせてもらったんですが、ほんとよくできていて、これは潮出版社三顧の礼で迎えるべきプロダクトだと思いましたわ・・・
  • また、コマ分割アルゴリズムの明確さ、コスト意識溢れる設計、褒めるときりがない
  • 懇親会でも作者さんに感動した旨を伝えることができて、そこまで含めて完全に良かったです

Chrome拡張を使って様々なWebサービスをハックする

builderscon.io

  • 普段、FirefoxGreasemonkey使って業務用Webを勝手に使いやすくしているので、興味をもって聞かせてもらった話
  • うちの場合は想定ユーザが自分だけなので、自分だけが使えれば良い・・・というところで終わってしまっていたのだけど、この発表はチーム、グループに配布することを考えて便利に作り込んであるなぁという印象
  • あと、テーブルの並べ替えなんかは自分でもやってみたい

Ionic 3+ではじめる次世代アプリ開発(HTMLでiPhoneアプリをつくろう!)

builderscon.io

  • 激しい煽り口調はないのに、なぜか当日即インストールして、とりあえずサンプルアプリをMac上で動かすところまで持って行ってしまったionic3
  • HTML5だけでいいんです!」と言われつつも、裏で動いてるAngular4とかが気になって仕方ない
  • iPhone実機で動かすところまでやってみたけど・・・
=== BUILD TARGET MyApp OF PROJECT MyApp WITH CONFIGURATION Debug ===

Check dependencies
No profiles for 'io.ionic.starter' were found:  Xcode couldn't find a provisioning profile matching 'io.ionic.starter'.
Code signing is required for product type 'Application' in SDK 'iOS 10.3'

** ARCHIVE FAILED **
  • xcodeで何かする必要がありそう、ってところまではわかったが、厳しいので一旦離脱
  • やっぱ環境構築がネックだよなぁ・・・
  • 初心者向けハンズオンとかあったら行きたい

その他

  • 会場快適でした。YAPC2013、2014でお世話になったけど、広くて空調効いてて良かったです
    • そういえば、無線LAN全く切れなかった
  • ストラップというか、名札最高でした

Perl入学式 2017 東京 #4 と正規表現キャプチャ変数

  • 教える事で学ぶことがある、とよく言われますがこれは本当にそうで
my $words_ref = [
    'alice loves meat!',
    'bob loves sushi!',
];

このような配列のリファレンスを受け取り, リファレンスに格納された文字列について,「loves」の後に記述されている好きな食べ物の単語を正規表現で取得し,「alice -> meat」, 「bob -> sushi」のように表示するサブルーチン, love_foodを書いてみよう. https://github.com/perl-entrance-org/workshop-2017/blob/master/4th/slide.md

  • うちの解答例がこれ
use 5.012;
use warnings;

my $words_ref = [ 'alice loves meat!', 
                  'bob loves sushi!', ];

for my $line (@$words_ref) {
    if ( $line =~ /(\w+) loves (\w+)/ ) {
         say $1 , "->", $2;
    }
}
  • ここで、受講生の方から以下のようなコード書いたけど、この動作は仕様か?という質問があり
use 5.012;
use warnings;

my $words_ref = [ 'alice loves meat!',
                  'bob loves sushi!',
                  '    loves ramen' ];

for my $line (@$words_ref) {
    if ( $line =~ /(\w+) loves (\w+)/ ) {
         say $1 , "->", $2;
    }else{
        say "\$1 is " , $1; # $1 is bob
        say "\$2 is " , $2; # $2 is sushi
    }
}

  • 正規表現のキャプチャを連続して行なっている時、正規表現のキャプチャにマッチしなかった場合、キャプチャ変数 $1 , $2 の内容は、前回マッチの内容が残る?というもの

  • これ、知らなかったんですが、実際にそうらしく

キャプチャ変数が更新されるのは、マッチが成功した時だけである。マッチが失敗したら、たとえマッチの一部が成功したように見えても、キャプチャ変数の内容はそのまま残る。
Effective Perl 第2版 - Joseph N. Hall, JoshuaA.McAdams, briandfoy - Google ブックス

  • Effective Perl 第2版、持ってるんだけど全くわからなかった・・・