sironekotoroの日記

Perl と Mac の初心者の備忘録

Perl入学式 in 東京第4回でピザ会でのお題「双六」

Perl入学式 in 東京第4回でピザ会でのお題「双六」

今回の id:xtetsuji さんからのお題は双六で「あがり」までの平均何回サイコロを振れば良いか?を計算するものでした。 問題のレギュレーションは既にサポーターの id:nishiru3 さんが書いてくれております。 @nishiru3++

nishiru3.hatenablog.com

うちはこんな感じで解いてみました。平均6.3回振ればゴールにたどり着けそう、って感じですかね・・・

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

my $number_of_trials      = 1000000;    # 試行回数。
                                        # 100回とか10万回とか変えられるよう、変数に入れておく。
my $number_of_dice_rolled = 0;          # サイコロを振った合計回数を格納する変数。


for ( 1 .. $number_of_trials ) {        # 試行回数分繰り返す

    my $sum = 0;             # 1試行あたりのサイコロの目の合計を初期化
    while ( $sum < 10 ) {    # 目の合計(双六のマスの位置)が10以下の時は繰り返す
        $number_of_dice_rolled++;   # サイコロを振った回数 +1 する
        $sum += int( rand(6) + 1 ); # サイコロを振る(1〜6の目が出る)

        # サイコロの目の合計(双六のマスの位置)が3の倍数、かつ、
        # サイコロの目の合計が10未満の時は「振り出しに戻る」
        if ( $sum % 3 == 0 && $sum < 10 ) {
            $sum = 0;
        }
    }
}

print $number_of_dice_rolled / $number_of_trials;

今回のピザ会は盛況だった

他にも

とネタが多くて、一通り書いてからブログ公開だとしばらくかかりそうだなーってことで、先にかいた双六から公開しまする。

Perl入学式 2019 in東京 第4回 お疲れ様でした

受講された方、サポーターの方、大変湿度の高い中、お疲れ様でした。
講師をやったジャージの人です。

Perl入学式第4回です。カリキュラム改定に伴い、Perl初学者には難しい(しかし避けては通れない)「リファレンス」で1回丸々使う回となりました。

講義に利用したスライドはMarkdown形式で公開しています。復習に使ってください。

github.com

また、講義中に数回言及しましたが、練習問題も骨のあるものになっています。ぜひチャレンジしてみてください!

github.com

問題の意味がわからない、とか、このような解答例はどうだろう?という方はSlackのPerl入学式チャンネル(招待フォーム)やtwitterハッシュタグ #Perl入学式 をつけて聞いてみてください。
応答速度、監視頻度などの面からSlackの方をお勧めします。

リファレンス!

過去のエントリで大体語り尽くしてる感があるので、そちらで・・・

sironekotoro.hateblo.jp

sironekotoro.hateblo.jp

docs.google.com

講義の最後にもオススメしましたが、Perlのリファレンスに関しては、完全な自信をもって深沢千尋さんの「すぐわかる オブジェクト指向 Perl」をお勧めします。

ピザ会

今日はネタが多くてちょっと後日にまとめて書く予定です。

  • いつもの id:xtetsuji さん出題、サイコロゲームの試行回数

  • Perlライフゲーム

  • Perlでお絵かき Imger

  • Webサイトの死活監視を並列で処理したい!AnyEvent

解決したいコード、困っているコードをプロジェクターに映し出して、いろいろとみていくの、楽しかったですね。モブプログラミングってあんな感じなのかな。

次回予告

次回は8月の後半での開催を予定しています。やるのはWebフレームワーク、Mojoliciousモジョリシャスです。PerlとMojoliciousを通して、Webアプリケーションの骨組みとデータの流れを学習していきます。

やっとこさSledgeが動いた

Sledgeを知っていますか?

Sledgeスレッジというのは、PerlのWebアプリケーションフレームワークです。

2003年にオープンソースとして公開されました。公式ページのurl(http://sl.edge.jp/)に残るように、開発したエッジ(後のLivedoor)の名を冠したプロダクトです。

公開から15年近く経っていますが、Webサービスのバックエンドとしてインターネットの片隅で稼働しており、うちもここ数ヶ月業務で触れているプロダクトです。

Sledge関連情報

インストールしようとググると、Apache1.3とmodperlでの構築を前提としている記事にあたります。

そして現在、Apache1.3とmodperlは現行のOSにインストールする方が難しい・・・ただし、一度動いてしまえば、これらの記事が大いに参考になります。

特にお世話になっている記事を紹介します。

techblog.karupas.org

blog.livedoor.jp

www.skyarc.co.jp

そして、貴重な活字での情報です。vol.1 で終わってしまっているのが悲しい・・・

Sledgeをインストールする

環境

macos 10.14 で試しています。

~/Desktop $ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.5
BuildVersion:   18F132

Perlは 5.28 を利用。

~/Desktop $ perl -v

This is perl 5, version 28, subversion 0 (v5.28.0) built for darwin-2level
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2018, Larry Wall
(中略)

Sledgeの立ち上げにはPlackを使います。 Plackのバージョンは 1.0047

~/Desktop $ perl -MPlack -le'print $Plack::VERSION'
1.0047
~/Desktop $ plenv -v
plenv 2.2.0

インストール

ソースをGithubからダウンロード

tokuhiromさんのPSGI対応版を使います。

~/Desktop $ git clone git@github.com:tokuhirom/Sledge.git
Cloning into 'Sledge'...
remote: Enumerating objects: 174, done.
remote: Total 174 (delta 0), reused 0 (delta 0), pack-reused 174
Receiving objects: 100% (174/174), 79.06 KiB | 487.00 KiB/s, done.
Resolving deltas: 100% (19/19), done.

作成したローカルリポジトリの中に入り、リモートブランチを確認します。

~/Desktop $ cd Sledge/
~/Desktop/Sledge (master) $ git branch --remote
  origin/HEAD -> origin/master
  origin/feature-psgi
  origin/master

origin/feature-psgi に切り替えます

~/Desktop/Sledge (master) $ git checkout -b future-psgi origin/feature-psgi
Branch 'future-psgi' set up to track remote branch 'feature-psgi' from 'origin'.
Switched to a new branch 'future-psgi'

ローカルにcloneしたリポジトリの中に eg/hello.psgi というファイルがあるので、これを一つ上の階層にコピーします。

~/Desktop/Sledge (future-psgi) $ cp eg/hello.psgi .

コピーしたファイルを編集します。

~/Desktop/Sledge (future-psgi) $ vi hello.psgi

3行目に use lib qw(lib/) を追加します。

use strict;
use warnings;
use lib qw(lib/);

plackupで立ち上げます

~/Desktop/Sledge (future-psgi) $ plackup hello.psgi
HTTP::Server::PSGI: Accepting connections at http://0:5000/

ブラウザで http://localhost:5000 にアクセスして、てすと と出てくればokです。 これはt/templateの中にあるunicode.htmlってのを読み込んで表示しています。

ここまで超苦労した

これ、上に書いてある手順だけだと簡単に思えるかもしれないけど、ここまで持ってくるの、めっちゃ大変だったんだからー

まぁ、主な理由はこの hello.psgi を見つけられなくて、会社にあるSledgeシンプル版を参考にして色々と遠回りしてたのが原因です。

このtokuhiromさんのPSGI対応版が独習用に良いんじゃないかな、というのはPerl入学式の2月の合宿でカルパさんやわいとんさんから聞いてはいたけど、そっから思いっきり回り道して、cartonでモジュールインストールしてみたり、会社で使っているやつを参考にして編集したりして、動かない日々が続いてたわけです。

で、なんとか自前で作ったページ(hello.psgiとは別)が動いて、やったー!って思ったらもっとシンプルな実装が元々あったというね。

とりあえず、これで動きました、という例を残しておきます。

Perl入学式 2019 in東京 第3回 お疲れ様でした

受講された方、サポーターの方、大雨の中お疲れ様でした。
講師をやったジャージの人です。

Perl入学式第3回となります。今回はカリキュラム改定に伴う進捗調整のため、前半を第1回、第2回の復習にあて、後半で正規表現を学びました。

講義に利用したスライドはMarkdown形式で公開しています。復習に使ってください。

github.com

問題の意味がわからない、とか、このような解答例はどうだろう?という方はSlackのPerl入学式チャンネル(招待フォーム)やtwitterハッシュタグ #Perl入学式 をつけて聞いてみてください。
応答速度、監視頻度などの面からSlackの方をお勧めします。

講義中のネタについて

Perlcon 2019

東欧にあるラトビアの首都・リガでPerlCon2019が開催されます。

Perl入学式の初代校長のpapixさん、Perl入学式 沖縄のAnaTofuZさんが登壇します。すごい!

perlcon.eu

perlcon.eu

講義中に使ったスライド

自作のスライドです。

特に、最後のページにある EverythingWindowsマシン使うなら必須のソフトだと思っています。CUIはまだ抵抗がある、という方にも優しいGUIのソフトです。ぜひ使ってみてください。

docs.google.com

お仕事での正規表現

最近の仕事で使った正規表現はこんな感じです。

# qwショートカットを利用
my @urls = qw(
    http://perl.example.com/sironekotoro.png
    http://perl.example.com/sironekotoro.html
    http://perl.example.com/cat.jpg
    http://perl.example.com/cat.doc
    http://perl.example.com/kuroneko.gif
    http://perl.example.com/kuroneko.js
);

for my $url (@urls) {
    if ( $url =~ /^http:.*[gif|jpg|png]$/ ) {
        $url =~ s/^http/https/;
    }
    print $url . "\n";
}

ピザ会のお題

Perl入学式 in東京 では講義終了後、希望者で集まりピザ会と称した懇親会を行っています。
(ジュース・ピザ代は実費)
昨年からそこで余興として xtetsuji さんが課題を出し、そこにチャレンジャーが回答して公開する、というようなことをやってます。

xtetsujiさんからのお題ですが、今回は「0〜99までの数字を漢数字を受け取ってアラビア数字にする」でした。

問題のレギュレーションはそのうちxtetsujiさんから公開されるはずですが、入力として与えられる文字列は以下です。

一 二 十 十一 三四 二十一 三十四 三十 三〇

これらの文字列を

1 2 10 11 34 21 34 30 30

に変換するスクリプトを作成します。

うちの回答は「ハッシュテーブルを使ったもの」「正規表現を使ったもの」の折衷型だったので、これを分離して2つのスクリプトに分けて掲載します。いずれも第3回までで習った内容のみで書いています。

あわせて、Perl入学式での範囲にない関数や正規表現を使ったものを「漢数字をアラビア数字にする(Perl入学式でやっていないところ)」として追加で載せておきます。

次回のPerl入学式

次回のPerl入学式 in東京は7月の開催を予定しています。

Perlを学ぶ初心者の鬼門、リファレンスをやります!時間があればHTML入学式もやるかもしれません・・・

皆さんの受講をお待ちしております!

Perl入学式 2019 in東京 第2回 お疲れ様でした

受講された方、サポーターの方、お疲れ様でした。
講師をやったジャージの人です。

カリキュラムを改版して臨んだ第2回となります。

講義に利用したスライドはMarkdown形式で公開しています。復習に使ってください。

www.perl-entrance.org

また、復習問題を用意しています。
第1回と第2回でやった内容のみで解ける問題となっています。ぜひ挑戦してみてください。
復習問題の解答例もありますので、参考にしてください。

問題の意味がわからない、とか、このような解答例はどうだろう?という方はSlackのPerl入学式チャンネル(招待フォーム)やtwitterハッシュタグ #Perl入学式 をつけて聞いてみてください。
応答速度、監視頻度などの面からSlackの方をお勧めします。

ピザ会のお題

Perl入学式 in東京 では講義終了後、希望者で集まりピザ会と称した懇親会を行っています。
(ジュース・ピザ代は実費)
昨年からそこで余興として xtetsuji さんが課題を出し、そこにチャレンジャーが回答して公開する、というようなことをやってます。

xtetsujiさんからのお題ですが、今回は「正弦波を描く」でした。

三角関数、昨年冬あたりに高校数学の復習でやっていたので

  • 正弦波: sin(サイン)を使う
  • 最大は 1
  • 最少は -1

というところまでは知っていたのですが、それをコードに起こすロジックがわからない・・・(5分くらいは考えた)

しかし、それでも何とか、それっぽいのを・・・と頑張った結果がこれです!それっぽい何かが出力されます。

xtetsujiさん曰く「似ている、近似・・・というよりも禁じ手ですね」

bitbucket.org

こんなの世に出していいんだろうか。ってまぁ、こういうのこそ晒していきましょう。晒しただけ強くなれます(強さとは

コードにコメントも書きましたが、Perl入学式の第1回, 第2回の内容で書いています。

リベンジマッチ正弦波を描く・実況中継

そもそも、昨年冬に俺は三角関数の復習をしたんじゃなかったのか?という悔しさがあります。
俺がやったのは問題の解き方だけなのか?という反省もあります。
ということでリベンジマッチです。

まず、Perlのsin関数とは、というところを調べます。

perldoc.jp

sin EXPR
sin

(ラジアンで示した) EXPR の正弦を返します。 EXPR が省略されたときには、$_ の正弦を返します。

ふむふむ。ラジアンが何かはともかく、数学用語だから数字入れてみればいいのかな?

print sin(1) . "\n"   # 0.841470984807897

やはり数字が返ってきた。でも、ラジアンが何者かを理解しないとsin関数はうまく使えないみたい。ではラジアンとは?

(ここで「ラジアン 中学生」「ラジアン 高校」「ラジアン わからない」「ラジアンとは」などでググる

ほーほー、三角関数を求める時の角度ではなく、円の半径と弧の長さから導き出されるものなのね。しかも、角度とラジアンの変換公式もある。

となると、こういう戦略はどうだろう

  1. $kakudo って変数を用意する。初期値は0
  2. whileループを用意・・・いや、無限ループが怖いからfor文にしておこう。最初は20回くらい処理を繰り返してみる
  3. ループ処理の中では、$kakudoを +30 していく
  4. $kakudoは360を超えても気にしない。2週目に入ったという感じで。スノーボードの720ターンみたいな(2回転するターン)
my $kakudo = 0;
for ( 1 .. 20 ) {
    print $kakudo . "\n";
    $kakudo = $kakudo + 30;
}

# 出力
# 0
# 30
# 60
# 90
# 120
# ...
# 570

よさそう。では、この角度をラジアンにするロジックを考える・・・その前に、Perlにそういう関数がないかな?って調べてみる。

Perl ラジアン」でググる

tutorial.perlzemi.com

やっぱりあった。しかもタイトルが既にうちの求めてるものそのまま。おなじみ、木本先生のサイト。安心して参考にさせてもらう。

use Math::Trig 'pi', 'deg2rad';

my $kakudo = 0;
for ( 1 .. 20 ) {
    print '角度:' . $kakudo . "\n";
    print 'ラジアン:' . deg2rad($kakudo) . "\n";

    $kakudo = $kakudo + 30;
}

# 出力
# 角度:0
# ラジアン:0
# 角度:30
# ラジアン:0.523598775598299
# 角度:60
# ラジアン:1.0471975511966
# ...
# 角度:570
# ラジアン:3.66519142918809

うんうん、よさそう。   でも、この変数 $kakudo わかりやすいけど、角度とラジアンの変換関数に揃える形で変数名を変えておこう。
あと、このラジアンの値をsin関数に与えるから、それ用の変数も用意しておこう。

use Math::Trig 'pi', 'deg2rad';

my $deg = 0;

for ( 1 .. 20 ) {
    # ラジアン
    my $rad = deg2rad($deg);
    # サイン
    my $sin = sin($rad);

    print 'サイン:' . $sin . "\n";
    print '-' x 10 . "\n";

    $deg = $deg + 30;

# 出力
# サイン:0
# サイン:0.5
# サイン:0.866025403784439
# サイン:1
# サイン:0.866025403784439
# サイン:0.5
# サイン:1.22464679914735e-16
# サイン:-0.5
# サイン:-0.866025403784438
# サイン:-1
# サイン:-0.866025403784439
# サイン:-0.5
# サイン:0
# ...
}

ちゃんと増えて、減って、増えて、を繰り返してる。けど、値が小さすぎて * で表示した時に困りそう。
あと、マイナスの値の時はどうしよう?

sinの最大値は1 , 最小値は -1 だから・・・1を足せば、0から2の間の値をとるようになるはず。
値が小さすぎる問題は、単純にsinの値を10倍くらいにしてみる。
sinって変数に足したり引いたりしちゃうと本来の意味が変わってしまうから、ちゃんと * の数を格納する変数 $star を新規に用意しよう。

use Math::Trig 'pi', 'deg2rad';

my $deg = 0;

for ( 1 .. 20 ) {
    # ラジアン
    my $rad = deg2rad($deg);
    # サイン
    my $sin = sin($rad);

    # sin + 1 を加えて正の値にしたものを
    # グラフを構成する * の数とする
    my $star = $sin + 1;

    # 最大値2,最小値0ではグラフに華がないので、
    # 10倍の値にする
    $star *= 10;

    # 小数点は邪魔なので、int関数で小数点を切り捨てた
    # 値に丸める
    $star = int($star);

    print 'グラフの * の数:' . $star . "\n";

    $deg = $deg + 30;

# 出力
# グラフの * の数:10
# グラフの * の数:15
# グラフの * の数:18
# グラフの * の数:20
# グラフの * の数:18
# グラフの * の数:15
# グラフの * の数:10
# グラフの * の数:4
# グラフの * の数:1
# グラフの * の数:0
# グラフの * の数:1
# グラフの * の数:4
# グラフの * の数:10
# グラフの * の数:15
# グラフの * の数:18

}

ちょっと数字の増減のペースが気になるけど、行けそうな気がする。
* を数字分だけ表示してグラフっぽくしてみる。
さらに、ループの数も増やして1000回くらいやってみる。 0.5秒ごとにループが回るように、高精度のsleepもいれちゃおう。 このあたりは昨日スクリーンで見た xtetsuji さんの模範解答を参考に。

そして完成したコードがこちら。

bitbucket.org

ということで、うちの回答リベンジ編でした。

おまけ

完成したコードの33行目を以下のように変更すると、同じ行でグラフが伸びたり縮んだりします

    printf("%-20s\r", '*' x $star);

Perl入学式 2019 in東京 第1回 お疲れ様でした

受講された方、サポーターの方、お疲れ様でした。
講師をやったジャージの人です。

毎期、新しい挑戦をしているPerl入学式ですが、今期はカリキュラムを改版して臨んだ第1回となります。

スライドはMarkdown形式で公開しています。

www.perl-entrance.org

また、復習問題も追加しました。
あわせて復習問題の解答例も作成しております。

第1回でやった内容のみで解ける問題となっています。時間のある時や大連休の時にぜひ挑戦してみてください。

欲望ドリブン!

プログラムに限らないのですが、何かの習熟・上達には「欲望」が欠かせません。

「仕事を早く終わらせたい」「仕事を楽にしたい」「もっと稼げる仕事に就きたい」「xxxな画像を集めたい」

なんでも良いです。欲望が大事です。

そして、Perl入学式沖縄のアナグラくんのスライドが超いいので置いておきます。
みんな見て!

Hello World ~我々は如何にしてプログラミングを学習して いくべきか、その議論で見えた一筋の道標とは~ - Speaker Deck

speakerdeck.com

第1回 落ち穂拾い

昨年秋に開校した際の補足記事です。参考にご覧ください。

sironekotoro.hateblo.jp

また、テキストエディタAtom, VSCodeを使ってPerlを快適に書くための設定を書いてみました。こちらもどうぞ。

ピザ会のお題

Perl入学式 in東京 では講義終了後、希望者で集まりピザ会と称した懇親会を行っています。
(ジュース・ピザ代は実費)
昨年からそこで余興として xtetsuji さんが課題を出し、そこにチャレンジャーが回答して公開する、というようなことをやってます。

今回の出題は、「元号 -> 西暦コンバータ」でした。

Perl入学式 第1回 ピザ会 課題 2019/04/13 · GitHub

この問題を解くためには第1回で学んだ

に加えて「正規表現」が必要です。
講義中に「正規表現ができると何が嬉しいんですか?」って聞かれたやつですね。
正規表現を使うと、「文字の並びのパターンから文字列の操作ができる」というのが嬉しいところです。

以下は平成のみのコンバータですが、ここでは文字の並びのパターンを

「先頭が文字2文字で、そのあとに数字が続き、"年"で終わる文字列」

として正規表現を使っています。解説を入れたらかえって分かりにくくなるという悲しみがあります・・・

平成○○年 と入力すると西暦にして返してくれる君 — Bitbucket

本来のxtetsujiさんの問題に沿った内容で回答したのが以下です。せっかくなのでおまけも実装してみました。

  • 全角数字を入れてもok
  • 昭和をS, 平成をH, とする短縮記法でもok

和暦を引数に与えると西暦年を応えてくれる — Bitbucket

(2019年04月20日 追記) 元号から西暦を求めるクイズも作ってみました。明日に控えDBスペシャリスト試験の直前勉強があまりにも捗らなくて現実逃避した結果です

https://bitbucket.org/snippets/sironekotoro/ge5aAA

Perl入学式 in東京 2019 第2回

5月中旬以降での開催を予定しています。

待ちきれないという方、過去の講義スライドも公開しています。そちらで予習をお願いします。

2018年度の講義資料

また、復習や疑問点がある方はぜひ、Perl入学式のSlackに参加してそこで問い合わせてください。
問い合わせの際に、問題のあるコードをブログやgist(GitHub), Snippet(Bitbucket)などに貼り付けてもらえると助かります。

このブログでも、Perl入学式に関するエントリを載せていますので、参考にどうぞ。

sironekotoro.hateblo.jp

それでは、第2回でもお待ちしています!

Perl入学式 2018 in東京 秋開講 第5回 お疲れ様でした

受講された方、サポーターの方、お疲れ様でした。 講師をやったジャージの人です。

スライド中の練習問題と復習問題ですが、昨年夏に書いた解答例をblogに掲載しています。 参考にしてください。 sironekotoro.hateblo.jp

あと、時々つかったスライドも置いておきます。 docs.google.com

以下、うちが用意していた資料です。

mojoliciousで作られている商用サイト

忘れていて講義中に言及できなかったのですが、今回学習したmojoliciousは以下の商用サイトで利用されています。

MVCのモデルを考えつつ、Webにどのような情報が送られ、処理されて表示されているか?を考えてみると良いと思います。

mojoliciousでfizzbuzz

今回の講義中、うちが詰まってしまったmojoliciousでfizzbuzzのコード、リベンジ編です。

3パターン用意してみました。

クリックすると展開されます gist.github.com

Perl入学式を卒業したら?

Perl入学式の卒業後、読んで自習してみると良いかも?という本については以下のエントリにリストアップしています。 sironekotoro.hateblo.jp

何度か言及しましたが、Perl入学式を修了すれば「初めてのPerl」で挫折することはありません。挑んでいきましょう。

2019年度のPerl入学式

カリキュラム・テキスト改版中

現在、カリキュラムの順番入れ替えをと講義テキストの改版を進めています。

新カリキュラムの構成は以下となっています。

  1. 環境構築(Windowsはmsys)
  2. 配列,ハッシュ,IF文,for文
  3. サブルーチン, 正規表現
  4. リファレンス
  5. Webアプリ(mojolicious)

Perl入学式 in東京 2019 第1回は4月13日開講!

perl-entrance-tokyo.connpass.com

Perl入学式は2周目, 3周目の参加も歓迎します。また、少し時間が空いての再参加ももちろん歓迎です。

すでにPerlが実行できる環境にある場合、15時からの参加をお勧めします。

そして、大阪でも2019年度 第1回の開催が告知されています。Perl入学式くんに襲われてる通天閣のイラスト、いいですね

perl-entrance-osaka.connpass.com

また、サポーターとしてPerl入学式を一緒に運営・盛り上げていってくれる方も募集中です。 教えたり、一緒に考えることで学びはとても深くなります。

参加はこちらから!

それでは、2019年度もよろしくお願いします!