sironekotoroの日記

Perl と Mac の初心者の備忘録

Perl入学式 第2回までの範囲(+α)でROT13

ROT13 というのは、簡単な暗号の一つです。

暗号化した文字列 uryyb jbeyq を以下の表をもとに置換すると、hello world という文字列になります。

変換前 a b c d e f g h i j k l m
変換後 n o p q r s t u v w x y z
変換前 n o p q r s t u v w x y z
変換後 a b c d e f g h i j k l m

名前の通り、 a は 13文字後の n に置換されており、他の文字も同様です。13文字後が z 以降になる場合には、a に戻ります。

ja.wikipedia.org

さて、これを Perl入学式の第2回までの範囲でやってみましょう!

Perl入学式の第2回は四則演算、配列、配列操作の関数、forを使った繰り返しまで、でした。

github.com

書いてみたものがこちらです。

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;

my $secret_str = 'uryyb jbeyq';          # 暗号化済みの文字列
my @secret_str = split "", $secret_str;  # 暗号化文字列を1文字ずつ配列に格納

my @alphabet = ( 'a' .. 'z' );    # アルファベットが1文字ずつ格納された配列

# 暗号化した文字列を1文字ずつ処理する。
for my $char (@secret_str) {

    if ( $char eq ' ' )
    {    # 文字ではなく、スペースだったらそのまま表示
        print $char;
    }
    else {

        my $i     = 0;  # ループが何回目かを保存する変数
        my $index = 0;  # アルファベットの何文字目かを保存する変数
                        # @alphabetの添え字と同じ

        for my $c (@alphabet) {     #アルファベットを1文字ずつ取り出して比較する

            if ( $char eq $c ) {    # 文字列なので比較は eq
                $index = $i;        # 合致したら $indexに何番目のアルファベットだったか保存
            }
            else {
                $i++;               # 合致しなかったら、$indexに1加える
            }
        }

        my $recover_index = $index + 13;   # 今回の暗号は13文字ずらしたことがわかっているので、
                                                                  # 13文字進めたものを本来の文字列の添字とする

        if ( $recover_index > 26 ) {    # 13文字分添字を足したら、アルファベットの文字数を超えた場合

            print $alphabet[ $recover_index % 26 ]; # 剰余で26を超えた分だけ添字にする

        }
        else {
            print $alphabet[$recover_index];        # 添字をそのまま使う
        }
    }
}

ううむ、書けなくはないのですが、ちょっと長いですね・・・でも書けないことはないです!

lastでforをぬけてみる。

さて、ここから第2回の範囲を超えていくとどうなるのか?というのをやっていきます。

for 文や while 文などの繰り返しの中で、途中で抜けたいときに使う last を使います。ちょっとだけ短くなりました。変数も1つ($i)消えました。

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;

my $secret_str = 'uryyb jbeyq';
my @secret_str = split "", $secret_str;

my @alphabet = ( 'a' .. 'z' );

for my $char (@secret_str) {

    if ( $char eq ' ' )
    {
        print $char;
    }
    else {

        my $index = 0;

        for my $c (@alphabet) {

            if ( $char eq $c ) {
                last;               # 文字が合致した場合には、そこで抜ける
            }
            else {
                $index++;
            }
        }

        my $recover_index = $index + 13;

        if ( $recover_index > 26 ) {

            print $alphabet[ $recover_index % 26 ];

        }
        else {
            print $alphabet[$recover_index];
        }
    }
}

index関数で、何文字目かを文字列から取ってみる

さらに超えていきます。Perlindex 関数は以下のように用います。文字列から、特定の文字が何番目にあるかを返す関数です。

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

my $alphabet = 'abcdefghijklmnopqrstuvwxyz';

my $index = index $alphabet, 'a';
print $index . "\n";    # 0

$index = index $alphabet, 'n';
print $index . "\n";    # 13

$index = index $alphabet, 'z';
print $index . "\n";    # 25

この index関数があれば、アルファベットの添え字が何番目かを調べるのにforを使う必要がなくなりますね!

for文 の中にある for文(入れ子のfor文) が消えてすっきりしました。

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;

my $secret_str = 'uryyb jbeyq';
my @secret_str = split "", $secret_str;

my @alphabet = ( 'a' .. 'z' );

# index関数を使うため、アルファベットを格納したスカラー変数を用意
my $alphabet_str = join "", @alphabet;

for my $char (@secret_str) {

    if ( $char eq ' ' ) {
        print $char;
    }
    else {

        my $index = index $alphabet_str, $char;  # index関数で何文字目かを調べる

        my $recover_index = $index + 13;

        if ( $recover_index > 26 ) {

            print $alphabet[ $recover_index % 26 ];

        }
        else {
            print $alphabet[$recover_index];
        }
    }
}

三項演算子を使う

まだ、短くすることはできるのでしょうか?もちろん可能です。ただ、「第2回までの範囲をそれほど逸脱しない」となると難しいですね・・・次で最後とします。

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;

my $secret_str = 'uryyb jbeyq';
my @secret_str = split "", $secret_str;

my @alphabet = ( 'a' .. 'z' );

# index関数を使うため、アルファベットを格納したスカラー変数を用意
my $alphabet_str = join "", @alphabet;

for my $char (@secret_str) {

    if ( $char eq ' ' ) {
        print $char;
    }
    else {

        my $index = index $alphabet_str,
            $char;    # index関数で何文字目かを調べる

        my $recover_index = $index + 13;

        # 三項演算子
        $recover_index
            = $recover_index > 26 ? $recover_index % 26 : $recover_index;

        print $alphabet[$recover_index];

    }
}

添字が26より大きかった場合を処理していたif文が消えています。

これは三項演算子を用いた条件分岐の書き方です。三項演算子Perlだけではなく、C言語Java, PHPにもあります。

ja.wikipedia.org

Perl入学式の第2回までの範囲から、last, index, 三項演算子を用い他スクリプトを書いてみました。

同じ結果をもたらすスクリプトでも、行数や変数の数が大きく変わってきます。

Perl入学式の範囲から越境して、いろいろな関数を触ってみてください!

perldoc.jp

Perl入学式第3回までの範囲だと・・・?

2020年01月25日はPerl入学式 in東京の第3回です。

perl-entrance-tokyo.connpass.com

ハッシュと正規表現を使うことで、ROT13は更にわかりやすくなり、更に短くすることも可能です。

(多分)講義では取り上げませんが、このブログでは第3回の範囲でROT13を書いてみたいと思っています。

Perl入学式 in 東京 秋開講 第2回 ピザ会でのお題「コラッツの問題」

Perl入学式 in 東京では各回の講義終了後にピザ会(ピザ&ジュース代は参加者負担)を開催しており、そこでサポーター・受講者さんと雑談などをしております。

サポーター含め参加者が抱えているプログラムの問題や、詰まってしまったところを相談したり、エディタやGitの使い方、PerlExcelなど他のツール・ソフトの連携方法、業界の動向について話したりしています。全体的にゆるーい雰囲気です。

その中で、id:xtetsuji さんが課題が出し、志願者がコードを書いてその場で発表、という試みを行っています。

今回のお題:コラッツの問題

xtetsujiさんからのお題ですが、今回は「コラッツの問題」でした。コラッツ・・・聞いたことないですね・・・コラッタの仲間かな?来年ねずみ年だし・・・

コラッツの問題 - Wikipedia

コラッツの問題は、「任意の正の整数 n をとり、

n が偶数の場合、n を 2 で割る
n が奇数の場合、n に 3 をかけて 1 を足す

という操作を繰り返すと、どうなるか」というものである。

ねずみ関係なかった。

このコラッツの問題を 1, 2, 3, 4, 5 ・・・ と与える数字を変えていき、どのような経緯で数値が変わっていくかを出して欲しい、というものでした。

コラッツの問題を解くには・・・?

この問題は今回学習した、「繰り返し」と「条件分岐」に「四則演算」で解くことができますが、それだけではちょっと足りません。

例えば、n = 5 とすると以下のような経緯を経て1になります。

5: 16 -> 8 -> 4 -> 2 -> 1 -> end

n = 7 の場合にはこう。

7: 22 -> 11 -> 34 -> 17 -> 52 -> 26 -> 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1 -> end

つまり、与える数によって繰り返しの数が異なります。繰り返しの数が読めない場合、ちょっとした工夫が必要です。

それは、特定の条件の時に繰り返しを終わらせる last です。

繰り返し を抜ける last

これは Hello world! を10回表示するスクリプトです。

for ( 1 .. 10 ) {
    print "Hello world!\n";
}

これに1行加えます。

for ( 1 .. 10 ) {
    print "Hello world!\n";
    last;
}

このようにすると、Hello world!は1回のみ表示されます。処理が last に到達すると、その繰り返しから抜けると動きとなります。

コラッツの問題、何回ループするかは分からないので、とりあえず10000回くらいにしておきます。

lastを使う条件は n = 1 になった時です。

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

print "input number > ";

my $input_num = <STDIN>;
chomp $input_num;

print "$input_num: ";

for ( 0 .. 10000 ) {

    if ( $input_num == 1 ) {
        print "end\n";
        last;
    }
    elsif ( $input_num % 2 == 0 ) {

        # n が偶数の場合、n を 2 で割る
        $input_num = $input_num / 2;
    }
    else {
        # n が奇数の場合、n に 3 をかけて 1 を足す
        $input_num = $input_num * 3 + 1;
    }

    print $input_num . " -> ";

}

last のようにループ内で使える関数は nextredo があります。

perldoc.jp

回数を指定しないループ、無限ループ

先ほどの解き方だと、10000回の繰り返しで終わらなかった時には途中で終わってしまいます。

このように、繰り返しの回数が分からない場合には while を使います。Perl入学式のテキストでは「落ち穂拾い」として掲載しています。

落ち穂拾い: while ループ

while を使う時には無限ループにならないよう、ループを終わらせる処理を入れることが必要です。last ですね。

もし、処理を書き間違えて無限ループになってしまったら、Ctrl(Control)キーを押しながらCを押すことで強制的に止めることが可能です。

コラッツの問題のwhile版です。

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

print "input number > ";

my $input_num = <STDIN>;
chomp $input_num;

print "$input_num: ";

while (1) {

    if ( $input_num == 1 ) {
        print "end\n";
        last;
    }
    elsif ( $input_num % 2 == 0 ) {
        # n が偶数の場合、n を 2 で割る
        $input_num = $input_num / 2;
    }
    else {
        # n が奇数の場合、n に 3 をかけて 1 を足す
        $input_num = $input_num * 3 + 1;
    }

    print $input_num . " -> ";

}

繰り返しを繰り返す

さて、当初のレギュレーションでは与える数が変わっていく・・・というものでした。

今回はループの中にループを作る「二重ループ」で実現してみました。このような二重ループは「入れ子いれこ構造」「ネスト構造」などとも呼ばれます。

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

for my $number ( 1 .. 10 ) {

    print "$number: ";

    while (1) {

        if ( $number == 1 ) {
            print "end\n";
            last;
        }
        elsif ( $number % 2 == 0 ) {

            # n が偶数の場合、n を 2 で割る
            $number = $number / 2;
        }
        else {
            # n が奇数の場合、n に 3 をかけて 1 を足す
            $number = $number * 3 + 1;
        }

        print $number . " -> ";

    }

}
1: end
2: 1 -> end
3: 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1 -> end
4: 2 -> 1 -> end
5: 16 -> 8 -> 4 -> 2 -> 1 -> end
6: 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1 -> end
7: 22 -> 11 -> 34 -> 17 -> 52 -> 26 -> 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1 -> end
8: 4 -> 2 -> 1 -> end
9: 28 -> 14 -> 7 -> 22 -> 11 -> 34 -> 17 -> 52 -> 26 -> 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1 -> end
10: 5 -> 16 -> 8 -> 4 -> 2 -> 1 -> end

二重ループについては、掛け算の「九九の表」をスクリプトで再現してみる、ってのも良いかもしれません。

Perl入学式の第2回までの範囲で書いてみるとこんな感じですかね。

スペースの扱いをもっとスマートにしたい!という人は printf 関数に挑戦してみると良いと思います。

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

print '    1  2  3  4  5  6  7  8  9' . "\n";

for my $tate (1 .. 9){
    print "$tate:";
    for my $yoko ( 1 .. 9){

        if ($tate * $yoko < 10){
            print '  ' . $tate * $yoko;
        }else{
            print  ' ' . $tate * $yoko;
        }
    }
    print "\n";
}
    1  2  3  4  5  6  7  8  9
1:  1  2  3  4  5  6  7  8  9
2:  2  4  6  8 10 12 14 16 18
3:  3  6  9 12 15 18 21 24 27
4:  4  8 12 16 20 24 28 32 36
5:  5 10 15 20 25 30 35 40 45
6:  6 12 18 24 30 36 42 48 54
7:  7 14 21 28 35 42 49 56 63
8:  8 16 24 32 40 48 56 64 72
9:  9 18 27 36 45 54 63 72 81

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

Perl入学式 2019 in東京 秋開講 第2回

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

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

www.perl-entrance.org

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

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

講義の途中でちょっとだけ使ったスライド

わかりやすい変数名をつけて、3ヶ月後の自分を救いましょう!

docs.google.com

FizzBuzzの素晴らしさ

講義中も何度か言いましたが、FizzBuzz問題は「繰り返し」「条件分岐」というプログラムの基礎を内包した素晴らしい問題です。

是非、次回の講習までにFizzBuzzをマスターしてしまいましょう!

FizzBuzzや配列については、このブログの昨年の記事も参考にどうぞ。

sironekotoro.hateblo.jp

ピザ会のお題

ちょっと長くなったので別エントリに起こします。起こしました

sironekotoro.hateblo.jp

次回のPerl入学式 in東京は1月25日!

既にconnpassに掲載しています。皆様の参加をお待ちしています!

perl-entrance-tokyo.connpass.com

おまけ

Sublime Text 3 の Build System で (システム|ユーザー)Perl を動かす

今日は、Sublime Text 3 というテキストエディタで、書いたそばから Perl スクリプトを実行できる Build System についての解説です。

同様の記事は検索するとそれなりにあるんですが、自分用にも残しておこうと思いました。

なぜなら、ブログとかホームページサービスってよく消えるんですよね・・・

他にも、いろいろ。

だから、誰かが書いてくれたものが残っていて、検索できるからいいかな?ではなく、自分で書き残しておくことにも意味があるなぁ、と思ったんですね。

Sublime Text 3 の Build System で システム Perl を動かす

Sublime Text 3 の初期状態では、Build System に Perl はありません。悲しい。

そこで、追加していきます。

この記事を書いた環境は以下となります。

  • macOS Mojave (10.14.6)
  • Sublime Text 3 (Version 3.2.2, Build 3211)

メニューから以下のように進みます。

Tools -> Build System -> New Build System...

untitled.sublime-build というタブが開かれます。初期状態はこれだけ。

{
    "shell_cmd": "make"
}

これを以下のように編集し、保存します。ファイル名は Perl.sublime-build とします。

{
    "cmd": ["perl", "-w", "$file"],
    "file_regex": ".* at (.*) line ([0-9]*)",
    "selector":"source.perl"
}

これだけです。

早速、Sublime Text 3 の新しいタブで以下のPerlスクリプトを作成し、 Build System で動かしてみましょう。ファイル名は perl_ver.pl とします。

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

print "Perl version: " . $^V ;

特殊変数 $^V を使っています。これは実行しているPerlのバージョンを表示する、定義済みの変数です。定義済みなので my は不要です。

自分の環境(macOS Mojave)では Perl version: 5.18.4 と表示されます。

Sublime Text 3 の Build System で ユーザーPerl (plenv) を動かす

Perl入学式でもお伝えしているように、 Perl にはインストールの仕方によって「システムPerl」と「ユーザーPerl」とに分けることができます。

システムPerlとユーザPerl

OSに最初から入っているPerlを システムPerl と呼ぶことがあります。

それに対して、自分専用・開発専用のPerl環境である ユーザPerl を構築することもあります。本格的な開発においては、ユーザPerlを利用することが多くなっています。

とはいえ、単にPerlの勉強を始める、という状況であれば、システムPerlでも十分です。

Perl入学式では「システムPerl」を利用しながら、Perlを勉強していきます。

システムPerlを使うのであれば、上記の設定だけで動きます。

しかし、 plenv などで複数のユーザーPerlを入れている場合、 plenv で利用している Perl のバージョンが Build System で反映されません。

このため、ターミナルと Build System で実行する Perl バージョンが異なる、という現象が発生します。

ターミナルで実行

2019-12-19 12:10:36 ~/Dropbox
$ plenv -v
plenv 2.2.0

2019-12-19 12:11:31 ~/Desktop
$ plenv global
5.28.1

2019-12-19 12:11:36 ~/Desktop
$ perl perl_ver.pl
Perl version: v5.28.1

Sublime Text 3 の Build System で実行

Perl version: v5.18.4
[Finished in 0.0s]

同じスクリプトを動かしても、ターミナルでは 5.28.1Sublime Text の Build System では5.18.4

いくら Perl後方互換性に優れているとはいえ、なんか嫌・・・とは思いませんか?うちは思います。生まれし日、時は違えども同じPerlを使いたい!

ということで、さらに設定を進めていきます。

Sublime Text -> Preferences -> Settings と進めると、左右に分割された編集画面が開きます。この右側の Preferences.sublime-settings -- User こちらを編集します。

{
    "build_env":
        {
            "PATH": "$HOME/.plenv/shims:$PATH"
        },
}

この設定を追加します。Sublime Text 3 の設定ファイルはJSON形式なので、この設定を末尾に書く場合には最後の , カンマを取り除いてください。

この設定を加えることで、 Build System のPerlがPlenvで設定したPerlを使ってくれるようになります。(追加後は Sublime Text3 の再起動が必要かも?)

これは、Sublime Text の Build Systemが .bashrc や .bash_profile 、はたまた .zshrc などの、いわゆるシェルで設定した環境変数を読み込んでいないため、ということのようです。

とりあえず、これで任意のバージョンのユーザーPerlSublime Text で動かすことができるようになりました。

余談1

plenv 、複数の Perl 入れらるのってどんなメリットがあるのかなー?とかつては思っていました。

お仕事の現場では、サービスの導入時期によって利用しているPerlのバージョンが異なっていることがあります。

  • サービスA: Perl 5.8.8
  • サービスB: Perl 5.16.4
  • サービスC: Perl 5.20.0

こんな感じで。

最新のPerlのバージョンに合わせていくのが理想ではありますが、時間、お金、人員などの兼ね合いでなかなかそうもいかない場合も多い・・・ものです(一般化

未だ現役なPerl5.8 & MySQL4.0とどう戦うか? ライブドアブログが生んだカオスとレガシーからの脱却 - ログミーTech

Perl がいかに互換性に優れた言語とはいえ、セキュリティ対策などでバージョン間で差異が発生することがあります。

そういったとき、任意のバージョンの Perl を切り替えて開発していきたい、となるわけですね。

余談2

Perl入学式では、開講時期の都度、利用しやすいエディタを受講生の方に勧めています。

私が受講生だった2013年当時は Sublime Text 2 でした。

https://github.com/perl-entrance-org/workshop-2013-01/blob/master/02.introduction/slide.md#sublime-text2

特にこだわりのない方は, Sublime Text2を試してみることをおすすめします.

これがうちと Sublime Text との出会いです。2014年に70$でライセンスを購入。今は80$になってますね。

とても使いやすく、十分に元を取れた投資でした。

余談3

Perlスクリプトを成形するPerlTidyというものがあり、それをSublime Text3から呼び出す Sublime PerlTidyというpackage(sublimetextのアドオン)があります。

github.com

これを動かした際にも、パスが通っていないよ!との警告が出たので、Sublime Text -> Preferences -> SettingsPreferences.sublime-settings -- Userを以下のように追加しています。Sublime Text3 の再起動が必要でした。

       "PATH": "/usr/local/bin/:$HOME/.plenv/shims:$PATH"

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

Perl入学式 2019 in東京 秋開講 第1回

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

春開講でカリキュラムを詰め込み過ぎてしまった反省から、従来の範囲に戻しての第1回となります。

今回ですが、Perlの学習内容としては以下のみとなり、特に復習問題はありません。

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

print "Hello World!";

Perlの復習問題はありませんが、今回学んだCUI(黒い画面)での操作については復習をお願いします。

普段GUI(マウスやタッチパッド)で行なっているファイル操作も、CUIとなると勝手が違うところが出てきます。

まずは繰り返し操作して慣れることが必要です。

第1回については、去年の記事も参考になると思います。

sironekotoro.hateblo.jp

Perl入学式 第2回は変数(スカラー変数)や条件分岐(IF文)、繰り返し(For文)などの「よりプログラムらしい事」について解説・実践していきます。

みなさんにお会いできるのを、楽しみにしています。

perl-entrance-tokyo.connpass.com

受講生さん&元受講生さんへ

私が2013年にPerl入学式を受講して、6年を過ぎました。

それとともに、初学者の視点・気持ちを忘れつつあります。

前提知識や前置き無しに何かを話していることも多いと思います。そういう時は私や周囲のサポーター、slackやtwitterで質問をお願いします。解説はもちろん、テキストの修正も含めて対応していきます。

また、自分の学習記録を残しておくこともおすすめです。成長した後に自分の足跡を振り返るというのは楽しいものです。

できればブログとして公開してくれると嬉しいです。

Visual Studio Codeの日本語化

今回、プログラムを書くためのエディタに「Visual Studio Code」を紹介しました。

インストール直後はメニューの言語が英語に設定されています。

以下の手順で日本語メニューに変更することができますので、英語に抵抗のある人は日本語化してみてください。私も日本語化しています。

  1. ウィンドウ左上の View -> Command Palette から Configure Display Languageと入力して候補を選択する。

  2. Install Addicional Languages を選択する。

  3. 左側のメニューから「日本語」を選択し、緑色の「Install」ボタンを押す。

  4. 一度Visual Studio Codeを閉じて、再度起動する。

  5. 英語表記に戻す場合には、1. から en を選択することで英語メニューになります。

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

Perl入学式 2019 in東京 秋開講 第1回

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

春開講でカリキュラムを詰め込み過ぎてしまった反省から、従来の範囲に戻しての第1回となります。

今回ですが、Perlの学習内容としては以下のみとなり、特に復習問題はありません。

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

print "Hello World!";

Perlの復習問題はありませんが、今回学んだCUI(黒い画面)での操作については復習をお願いします。

普段GUI(マウスやタッチパッド)で行なっているファイル操作も、CUIとなると勝手が違うところが出てきます。

まずは繰り返し操作して慣れることが必要です。

第1回については、去年の記事も参考になると思います。

sironekotoro.hateblo.jp

Perl入学式 第2回は変数(スカラー変数)や条件分岐(IF文)、繰り返し(For文)などの「よりプログラムらしい事」について解説・実践していきます。

みなさんにお会いできるのを、楽しみにしています。

perl-entrance-tokyo.connpass.com

受講生さん&元受講生さんへ

私も2013年にPerl入学式で受講してからPerl歴も6年を過ぎました。

それとともに、初学者の視点・気持ちを忘れつつあります。

前提知識や前置き無しに何かを話していることも多いと思います。そういう時は私や周囲のサポーター、slackやtwitterで質問をお願いします。解説はもちろん、テキストの修正も含めて対応していきます。

また、自分の学習記録を残しておくこともおすすめです。成長した後に自分の足跡を振り返るというのは楽しいものです。

できればブログとして公開してくれると嬉しいです。

Visual Studio Codeの日本語化

今回、プログラムを書くためのエディタに「Visual Studio Code」を紹介しました。

インストール直後はメニューの言語が英語に設定されています。

以下の手順で日本語メニューに変更することができますので、英語に抵抗のある人は日本語化してみてください。私も日本語化しています。

  1. ウィンドウ左上の View -> Command Palette から Configure Display Languageと入力して候補を選択する。

  2. Install Addicional Languages を選択する。

  3. 左側のメニューから「日本語」を選択し、緑色の「Install」ボタンを押す。

  4. 一度Visual Studio Codeを閉じて、再度起動する。

  5. 英語表記に戻す場合には、1. から en を選択することで英語メニューになります。

HTTP::TinyでBasic認証を超える

昨日今日とやっていた「AWSをはじめよう」ではWordPressのサイトを立てて、そこの管理者ページにApacheBasic認証をかけます。

で、読み終えた後にBasic認証越しの情報ってPerlは取れるんかなー?と思って、ググったら既にやってた方がいて、コードまで載ってた。ありがたい。

サンプルのコードのURLと認証情報書き換えただけでいけた。

HTTP::Tinyでやってみる

同じことを標準モジュールのHTTP::Tinyでもできるんかなー?と思ってやってみたらできたのであげる。

ちょっとだけ詰まったのは、base64エンコードするときに、第2引数に空文字を入れないと改行が入っちゃうということ。

HTTP::TinyMIME::Base64もコアモジュールなので大体は大丈夫なはず。

文字列連結にsprintfとか使っちゃってるのは明らかにお仕事の影響ですね・・・

追記

・・・!?できた。

これだとbase64エンコード云々もいらないじゃーん

#! /usr/bin/env perl
use strict;
use warnings;
use HTTP::Tiny;

my $user = 'user';
my $pass = 'pass';
my $url
    = sprintf( 'https://%s:%s' . '@認証後のURL',
    $user, $pass );

my $res = HTTP::Tiny->new->get($url);

print $res->{content} if $res->{success};