sironekotoroの日記

Perl で楽をしたい

詳解! GoogleAppsScript完全入門 で詰まったところ

Perl入学式 in 東京のピザ会でみた@xtetsujiさんの超絶ライフログシステムや、家電価格の定点観測を Google スプレッドシートで行うなんかを見て、俺もいっちょやってみたい!と思って購入したのがこの本

土日ごとにやっていたこの本も終盤。なんというか、いままで「ホスティング借りて、スクリプト置いて、cronで動かさんとなぁ・・・」って思ってたことが、GASだけで完結でそうで、Google様すげぇ・・・ってなってます。

で、そんな中で詰まったところがあったので、おすそ分け。

17章 外部サイトへのアクセス サンプル 17−3−3 「お天気Webサービス」から天気情報を取得する , 第1版 423pのスクリプトです。

function myFunction() {
  var cityId = 130010;
  var url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=';
  var response = UrlFetchApp.fetch(url + cityId);
  
  var json = JSON.parse(response.getContentText());
  Logger.log('%sエリア -%s-%s 地方の天気:',
             json.location.area,
             json.location.prefecture,
             json.location.city
            );
  Logger.log(json.description.text);
  
  json.forecasts.forEach(function(forecast,i,array){
    Logger.log(
      '%s %s の天気 : %s / 最高気温 :%s',
      forecast.dateLabel,
      forecast.date,
      forecast.telop,
      forecast.temperature.max.celsius     # ここ
    );
  });
}

これは、GASからlivedooreの天気用法APIを叩き、返って来たJSONをパースしてログに出す、というもの。ここでエラーが出たのは最後の方にある行、 forecast.temperature.max.celsius

現在は2018年2月25日15時過ぎですが、実行すると以下のエラーが出ます。

TypeError: null からプロパティ「celsius」を読み取れません。(行 15、ファイル「WebAPI活用」)

で、生JSONとか見たんですが、ちゃんとオブジェクトあるし、綴りも間違ってないし・・・と悩んだのでした。

しかし、よくよく見てみると・・・画像の一番下です。

f:id:sironekotoro:20180225150634p:plain

あ、forecastに格納されている配列の3つ目、添え字でいうと[2]のtemperature.maxnullだ!ってことに気づいたのでした。おそらく、時間が進むとここに値が入ったりするのかなぁ、と思ってます(未確認)

ということで、雑にif文で回避したりするなどして先に進んだのでした。後半のforEach直後にif文で抜けるようにかいてます。

  json.forecasts.forEach(function(forecast,i,array){

    if (!forecast.temperature.max){return}

    Logger.log(
      '%s %s の天気 : %s / 最高気温 :%s',
      forecast.dateLabel,
      forecast.date,
      forecast.telop,
      forecast.temperature.max.celsius
    );
  });

この本も残りわずか、頑張りまする

ハッシュリファレンス使うほどのデータ構造なんて作る事も使う事も無いよなーと思っていたけど、欲しいデータはいつだって複雑なデータ構造の中にあった

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

qiita.com

こんにちは。アドベントカレンダーの空欄は埋めていきたい欲のsironekotoroです。

Perl入学式 in 東京では、講義終了後、希望者が集ってピザを食べながら雑談をする時間を設けています。

昨日(2018/02/03)、そこで興が乗って発表したスクリプトを2つほど紹介します。

テーマは、ハッシュリファレンス使うほどのデータ構造なんて作る事も使う事も無いよなーと思っていたけど、欲しいデータはいつだって複雑なデータ構造の中にあった、です。

名状し難い欲望に名前があるかも知れない

Webページから任意の情報を取得する際に使うのがスクレイピングツールです。

が、そのまえに昔話。

かつて「Webページから欲しい情報だけ抜き出すような、都合のいい技術ないかなー」と思っていました。

当時はそれを実現できる技術の名前を知らず、また聞ける人がいなかったので、検索しようがありませんでした。やりたいことに名前がついていることに気づけば、そこからの実現速度は驚異的に上がります。

自分が知らないことも、他の人なら知っているかもしれません。ってことで、Perl入学式ではサポーターに色々と質問してくださいね。

欲しい情報だけ取得したけど、その情報はハッシュリファレンスの中にいる

Perlスクレイピングツールというと、Web::Scraperを使うのが良いです。Perlを知れば知るほど、応用範囲が深く大きく広がる素晴らしいツールです。ここでは単純な例を示します・・・しかし!

取得した情報はハッシュリファレンスの中に格納されています!なんてこった!22行目にある$resに格納されているのは、スクレイピング結果を格納したハッシュリファレンスです。

my $res = $scraper->scrape($url);

37行目ではこの$res に格納されている配列リファレンス(記事一覧)情報を、Perl入学式第3回でやった「デリファレンス」で配列に戻してしています。

my @news_titles = @{ $res->{news_titles} };

このハッシュリファレンスの中に入っているスクレイピング結果が、単なる値(スカラー)なのか、配列リファレンスなのか、そこを意識して情報を扱っていきます。

つまり、Perl入学式 第三回を復習して理解すればハッシュリファレンスからデータを引き出すのも怖く無い!スクレイピングで欲しい情報がウホウホ!ということですね。

use strict;
use warnings;
use Web::Scraper;
use Encode;
use URI;

# URIモジュールで$uriに取得先のwebページのアドレスを格納。
my $url = URI->new('https://news.yahoo.co.jp/');

# webページの欲しい情報があるところをXPathで指定する。
# process 'XPath式', 'key名' => '取得形式(HTMLかTEXTか、など)'
# process 'XPath式', 'key名[]' => '取得形式(HTMLかTEXTか、など)'
# key名の後に[]をつけると、XPathで指定した要素を配列リファレンスとして取得する
my $scraper = scraper {
    process '//title', 'title' => 'TEXT';
    process '//div[@id="epTabTop"]//h1[@class="ttl"] | //p[@class="ttl"]',
        'news_titles[]' => 'TEXT';
};

# 上記で設定された情報に従い、対象のページから情報を「スクレイピング」する。
# スクレイピングした結果はハッシュリファレンス$resに格納される。
my $res = $scraper->scrape($url);

# $resから情報を引き上げる。
# $res->{key名}でアクセスする。
my $title = $res->{title};  # Yahoo!ニュース

# 取得した情報をMacで表示する。
# Windowsで表示する場合には以下に変更する。
# print encode('cp932' , $title), "\n";
print encode_utf8($title), "\n";

print "----------\n"; #区切り線

# ページのニュースタイトルを表示する
# news_title は配列リファレンスなので、デリファレンスして配列に戻す
my @news_titles = @{ $res->{news_titles} };
# 配列の要素をfor文で表示していく
foreach my $news_title (@news_titles) {
    print encode_utf8($news_title), "\n";
}

Web::Scraperについてはこのページが初心者向け。こちらのページの例ではAmazonのページからデータを取ってきてます。

use Web::Scraper; - 今日のCPANモジュール(跡地)

うまく動かなかったら、Web::Scraperがインストールされていないかも。となると、cpanm Web::Scraperをターミナルで実行して・・・え?cpanm入ってない?木本先生にお任せ!

cpanmによるPerlのローカル環境構築 - Perlゼミ(サンプルコードPerl入門)

WebAPIから帰ってくる情報は大体JSONで、それはやっぱり複雑なデータ

WebAPIというのは、HTMLのように人間が見やすい形ではなく、構造的なデータとして提供されている情報です。Amazonの商品情報APIなどが有名ですね。

人間に厳しいデータ表示形式の何が嬉しいか?というとプログラムが解釈しやすい形になっているのが嬉しいわけです。プログラムが解釈して、人間が欲しい情報だけを利用することができるわけです。

今回は、認証不要のAPIであるライブドア社の気象情報APIを利用してみます。

weather.livedoor.com

このAPIから返されるデータをPerlで取得し、千代田区の天気を表示してみます。

かつてはAPIが返すデータにも様々な種類がありましたが、現在は大体JSONという形式で提供することが多いようです。以下のリンクにブラウザからアクセスしてみてください。

http://weather.livedoor.com/forecast/webservice/json/v1?city=130010

もしかしたらブラウザが整形してくれたかもしれません。この、人間が見るにはちょっと厳しいデータをPerlの力を借りて構造化し、そこから今日の日付と天気、明日の日付と明日の天気予報を取得してみます。

18行目で取得したjsonのデータをperlのデータ構造にしています。

my $perlish_data = decode_json($json_data);

そして、例えば35行目のように、ハッシュリファレンス$perlish_dataから情報をスカラー変数$tomorrow_weatherに格納しています。

# ハッシュリファレンス内にある明日の天気
my $tomorrow_weather = $perlish_data->{forecasts}->[1]->{telop};

なお、プログラムの末尾にprint Dumper $perlish_data;コメントアウトして置いておきます。このコメントをとることで、データがどのような構造になっているかを把握することが可能です。

use strict;
use warnings;
use LWP::Simple qw/get/;
use JSON;
use Encode;
use Data::Dumper;

# ライブドア社の天気情報APIのURL;
# 末尾の番号は千代田区を指す
my $url
    = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=130010';

# get関数でページにアクセスし、応答結果を$json_dataに格納する。
my $json_data = get($url);

# json_のデータをPerlのデータ形式に変換する。
# 変換結果はハッシュリファレンスになっている。
my $perlish_data = decode_json($json_data);

# ハッシュリファレンス内にある取得時の日付
my $today_date = $perlish_data->{forecasts}->[0]->{date};

# ハッシュリファレンス内にある取得時の天気
my $today_weather = $perlish_data->{forecasts}->[0]->{telop};


# ハッシュリファレンス内にある明日の日付
my $tomorrow_date = $perlish_data->{forecasts}->[1]->{date};

# ハッシュリファレンス内にある明日の天気
my $tomorrow_weather = $perlish_data->{forecasts}->[1]->{telop};

# 取得時の日付を表示
print $today_date, "\n";

# Macで表示する場合。Windowsの場合には
# print encode('utf8',$today_weather),  "\n";
print encode_utf8($today_weather),  "\n";


print "----------\n"; #区切り線


# 取得時の日付を表示
print $tomorrow_date, "\n";

# Macで表示する場合。Windowsの場合には
# print encode('utf8',$tomorrow_weather),  "\n";
print encode_utf8($tomorrow_weather),  "\n";

# ハッシュリファレンス内のハッシュリファレンスの配列リファレンスのハッシュの・・・とデータをたどっていく。
# わからなくなったら
# print Dumper $perlish_data;

複雑なデータ構造はDumperで覗き見!

というわけで、世の中の有用なデータは大概複雑な構造の中にあることが多いです(個人の感想

そして、そういう複雑なデータで訳がわからなくなったら、Dumperで覗き見するのが一番です。

Webやいろんなデータ構造から欲しいデータを見つけ、うまいこと利用していきましょう!

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 数学の勉強法」にあった

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

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