sironekotoroの日記

Perl と Mac の初心者の備忘録

Perl入学式 in 東京 第5回 〜Webアプリ編〜 の最終問題で色々やってみた

Perl入学式 in 東京 第5回 〜Webアプリ編〜 の最終問題で色々やってみた

これは、2018年現在のPerl入学式カリキュラムにある最終問題をベースに色々とやってみたものです。

今回の講義でMojoliciousがインストールされていれば、ソースをコピペして来てmorboで実行するだけでローカル環境で試すことができます。

Perl入学式 2018 第5回 最終問題で色々やってみる — Bitbucket

本来、この行数(500行超)になる前に適切に分割するもんなんですが、今回は以下のこだわりのもとでやってみました。

  • 1枚スクリプトでやってみる(コピペしやすい)
  • HTMLのタグを極力排してMojoliciousのタグヘルパーを利用する
  • 書き込み内容の永続化
  • インストールが必要な外部モジュールは利用しない(コピペしてすぐ動かせる)
  • CSSフレームワーク Bootstrap4の利用
  • JavaScriptを利用した入力補助、ボタンon/off制御
  • とりあえずの管理者ログイン実装(危険)

HTMLのタグを極力排してMojoliciousのタグヘルパーを利用する

Mojoliciousのタグヘルパーについては木元先生が書いてくれたGitHubのページを参考にしました

Mojolicious::Plugin::TagHelpers · yuki-kimoto/mojolicious-guides-japanese Wiki · GitHub

先に言っておきますが、全部をタグヘルパーで記述する必要はないです。
まぁ、修行と興味本位です。

例えば、ページの表題にあたるH1タグをHTMLではこのように書きます。

<!-- html -->
<h1>ページタイトルだよ</h1>

Mojoliciousのタグヘルパーを使うと、以下のように書くことで上記と同じHTMLが出力されます

# Perl, Mojolicious
%= t h1 => 'ページタイトルだよ'

HTMLタグの中に複数の属性が設定される場合、HTMLは以下のように記述します

<!-- html -->
<h1 id='red-h1' style='color:red'>赤いタイトルだよ</h1>

Mojoliciousのタグヘルパーを使った場合です。( ) 内部の書き方がハッシュですよね

# Perl, Mojolicious
%= t h1 => (id => 'red-h1', style => 'color:red') => '赤いタイトルだよ'

フォームタグ<form></form>など、タグとタグの間に、他のタグが挟まる場合

<!-- html -->
<form action="/logout" method="POST">
  <input class="btn btn-warning float-right mx-auto" type="submit" value="ログアウト">
</form>

Mojoliciousでは1行で収まらない場合には begin と end で挟む必要があります

# Perl, Mojolicious
%= form_for '/logout' =>( method => 'POST') => begin
  %= submit_button 'ログアウト' => (class => 'btn btn-warning float-right mx-auto')
% end

無理くり1行に納めることもできますが、可読性が厳しくなります。ファットカンマ => でつなげるのがメソッドチェーンぽくはあってカッコいい気はするんですが

# Perl, Mojolicious
%= form_for '/logout' => ( method => 'POST') => submit_button 'ログアウト' => (class => 'btn btn-warning float-right mx-auto')

書き込み内容の永続化

Perl標準モジュールのStorableを利用しました。

perldoc.jp

StorableはPerl標準モジュールなので、use Storable; と1行追加することで利用することが可能です。
いつから標準モジュールなんかな?とおもったらPerl5.7の頃からってことで、2000年頃からみたいですね。

$ corelist Storable

Data for 2018-06-26
Storable was first released with perl v5.7.3

Storableのnstore関数を利用して、変数をファイルに出力して保存するスクリプトです。

use strict;
use warnings;
use Storable qw(nstore);

# 配列を設定
my @perl_entrance = ( 'Sapporo', 'Tokyo', 'Osaka', 'Fukuoka', 'Okinawa' );

# 配列をリファレンス化してStorableモジュールのnstore関数でファイルに保存する
# スクリプトと同じ場所にarchive.fileが作成される
nstore( \@perl_entrance, 'archive.file' );

出力したファイルarchive.fileから変数に戻すスクリプトです

use strict;
use warnings;
use Storable qw(retrieve);

# nstoreで保存したファイルをretrieveで変数に戻す
my $array_ref = retrieve('archive.file');

# 変数の中身は配列リファレンスなので、デリファレンスして中身を表示する
for my $i (@{$array_ref}){
    print "$i\n";
}

ただし、このStorableで保存したファイルは中身を単純に見ることが可能です。

$ cat archive.file
pst0

Sapporo
Tokyo
Osaka
Fukuoka
Okinawa

特定の行だけ取り出す、保存する際にも一旦全て変数に展開し直す必要があります。
可用性やセキュリティを考えた場合、データベースなどを使う必要があります。
が、まぁ自分で使うぶんにはこんな感じでお手軽に保存が可能です。

今回は投稿がPOSTされた時点でファイルから既存の投稿を全てretrieveで配列リファレンスに戻してpush、そのあとに再度ファイルに書き出しています。
GETでのアクセス時には同じく、既存の投稿を全てretrieveで配列リファレンスに戻してコントローラーのetnriesに渡しています。

ファイルの読み込み処理がGETとPOSTで発生するのですが、全く同じ処理なので、サブルーチンload_fileを作って対応しています。

# ファイルから書き込み内容を取り出す
sub load_file {

    my $entries;

    # ファイルが存在するとき
    if ( -e $data_file ) {
        return retrieve($data_file);
    }
}


get '/' => sub {

    # 引数のコントローラーオブジェクトを受け取る
    my $c = shift;

    # サブルーチンload_fileから書き込み内容を
    # 配列リファレンスとして取得
    my $entries = load_file();

    # 配列リファレンスをテンプレート部で利用するために
    # stashに保存する
    $c->stash( entries => $entries, admin => $c->session->{admin} );

    # indexテンプレートを描画する
    $c->render('index');
};

CSSフレームワーク Bootstrap4の利用

Mojoliciousはwebアプリケーションフレームワークですが、Webデザインに関わるCSSフレームワークとしてTwitter Bootstrapというものがあります。
今回はこれを利用しました。

getbootstrap.com

ボタンのデザイン、タイトルや入力欄の位置、既存エントリなど、ページの全てに利用しています。
1枚スクリプトで収めるため、BootstrapのプログラムはWeb上から取得しています。レイアウト部に書いてあるリンクがそれです。
Bootstrapのページにあるリンクの書き方を、Mojoliciousのタグヘルパーを利用した書き方にしました(意地

    %# bootstrapに必要となるな外部リンク
    <%= stylesheet 'https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css' => (
      integrity => 'sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO',
      crossorigin => 'anonymous'
      ) %>

JavaScriptを利用した入力補助、ボタンon/off制御

ホームページではGET/POST通信を利用してデータの送受信を行い、その内容でHTMLを変化させます。
しかし、ページを移動せず、今見えているHTMLの内容だけを変更したい・・・そういう時にはJavaScriptの独壇場です。

JavaScriptにもフレームワークがあります。JQueryやReact、AngularにVueなどなど。
しかし、よくわからないので生のJavaScriptを書いてみました。
結果、この1枚スクリプト500行超のうち100行近くがJavaScriptという大惨事になりました・・・
大体は入力欄の状態とボタンの状態を結びつけるところで悲惨な感じになってますね(他人事
この反省を踏まえ、Vue.jsというフレームワークを勉強中です。スッキリ書きたい。

百人一首APIAjax

また、Ajaxという方法を用いて、百人一首のデータをダミーデータとして入力欄に記入するスクリプトも追加しています。
これは自分で投稿のテストをやっている時にいちいちダミーデータ入れるのが面倒だった、というのからスタートしてます。

百人一首APIは下記サイトのものを利用させてもらいました。おかげで雅な掲示板になりました。

クジラ 百人一首 API

投稿する都度、百人一首APIに聞きに行くのは負荷になると思い、このアプリの起動時に一度だけ全ての短歌を取得しています。

# 百人一首取得関数から百人一首を取得する
# APIの負荷を避けるため、一度だけ全短歌を取得しておく
my $POEMS = get_hundred_poems();

# 中略

# 百人一首をAPIから取得する
sub get_hundred_poems {

    # MojoliciousのWebユーザーエージェントを使う
    my $ua = Mojo::UserAgent->new;

    my $tx
        = $ua->build_tx(
        GET => 'http://api.aoikujira.com/hyakunin/get.php?fmt=json' );

    $tx = $ua->start($tx);

    if ( my $res = $tx->success ) {
        return $res->json();
    }
}

Perlの変数に保存して、そこからランダムに返して満足していたのですが、せっかくなのでMojoliciousのコントローラに短歌を一つだけJSONで返すものを作ってみました。
これでJSONでデータをやり取りすることができます。

Ajaxによるデータの取得、それを利用したHTMLの更新っての、確か2000年代に一度JavaScriptを勉強してやろうとして挫折したところでした。
当時はWeb2.0とか言われた時代で、いろいろなサイトのデータを自分で組み合わせてサービスを実現する、マッシュアップというものが流行った時代です。
それを指をくわえて見ていた自分が、穴だらけとはいえ(なんせエラー処理書いてない)曲がりなりにも実装できたってのは本当に嬉しいことでした。

# 百人一首の中から、ランダムに一つをJSON返す
get '/select_poem' => sub {
    my $c = shift;

    # 0〜99のランダムな数字を求める
    my $index = int( rand(100) );

    # 百人一首から一つ選ぶ
    my $select_poem = $POEMS->[$index];

    # JSON形式で返す(返した先ではajaxで解釈する)
    $c->render(
        json => {
            number => $select_poem->{no},
            name   => $select_poem->{sakusya},
            mail   => '@example.com',
            body   => $select_poem->{kami} . ' ' . $select_poem->{simo},
        }
    );
};

とりあえずの管理者ログイン実装(危険)

実はここが最もよくわからないところでした。

IDとパスワードをアプリに送り、認証がokであればその旨をCookieに残す。
その後の通信はCookieの中に認証(した証)があるかどうかで管理者として扱って良いか、都度判断する。 原理は知っていたつもりなのですが、いざそれを実装しようとすると全く訳が分からなくなってしまいました。

ただ、MojoliciousでCookieを受け取り、フィールドを設定し値を更新する、ということを経験できたことは良かったです。

という訳で、穴だらけの管理者ログイン実装です。どんだけ穴かっていうと、Cookieをデコードすると普通に「お、管理者ログインしてんな」ってのが見えます。

CookieValueをコピペして・・・ f:id:sironekotoro:20180826124923p:plain

JavaScriptコンソールでBASE64でデコードすると、なんかそれっぽいフィールドが f:id:sironekotoro:20180826124925p:plain

じゃぁどう実装するのが正解なんだよ!って話ですが、今後にご期待ください。
あ、管理者IDとパスワードはソースにベタガキしてあります。

色々やって見た感想

意外だったのはBootstrapで画面をちょっと小綺麗にしたら、やる気と改善アイデアがどっと出て来たこと。
いままではデザインにはそれほど興味がなかったんですが、自分自身でも意外な変化でした。
デザインが及ぼす影響って大きいなぁって思い知りました。

それと世の中に数多あるWebサイトなんですが、いろいろな仕組みの上で作られているんだなぁ、と実感することができました。
情報処理試験で知ってはいたCookieなんかを自分が実装できなくて、知っていることと作ることは別よな、と痛感しております。

本当はピザ会中にこのスクリプトを自分のVPSで実行して参加者さんに触って欲しいと思ってたんですが、準備不足に知識不足で叶わなかったことが残念です。
Mojoliciousアプリをお手軽セキュアに展開する方法も探していかんとなぁ、というところです。

Perl入学式 in 東京 第5回 〜Webアプリ編〜

Perl入学式 in 東京 第5回 〜Webアプリ編〜

昨日、東京で開催された「Perl入学式 in 東京 第5回 〜Webアプリ編〜」にサポーターで参加したものです。
34度を超える猛暑の中集まっていただき、みなさま本当にお疲れさまでした。

練習問題、復習問題の解答例

講義資料中にある練習問題の解答例です。 うまく解けない時とかに参考にしてください。 うまく動かない時はご連絡ください。

練習問題・最終問題

Perl入学式 2018 第5回 練習問題 profile — Bitbucket

Perl入学式 2018 第5回 練習問題 fizzbuzz — Bitbucket

Perl入学式 2018 第5回 最終問題 — Bitbucket

Perl入学式を終えた方へ

去年同じようなエントリ書いていたんで、リンク貼っておきます。

sironekotoro.hateblo.jp

Perl入学式一周やってみたけどわからなかった、出られなかった回がある、という方、再度の参加も歓迎です。
in 東京では秋開講も予定しています。

参加するほどではないけど、質問があるという方、Perl入学式のslackやTwitterハッシュタグ #Perl入学式 で質問してみましょう。
slackは公式ページ(http://www.perl-entrance.org/)メニューの「チャット招待」からどうぞ。

誰かに教える、ということで学びが深くなるということは、ある程度社会人経験があると実感するところだと思います。
より深くPerlを知りたい方、Perlで業務を楽にしたい方、Perlでいろんな欲望を満たしたい方、Perl入学式は卒業生さんからのサポーターも募集しております。
サポーター希望の方はslackへ。

あと、来月六本木のメルカリさんのところでPerlのイベントがあります。「はじめてのPerl」翻訳の近藤嘉雪さんも壇上に立たれるとのことなので、初心者さんは色々と質問できる良い機会です。

roppongipm.connpass.com

今年〜来年にPerlのお祭りYAPC::Japan Tokyoが開催されます。
Perlの話はもちろん、いろんなシステムやサービスの構成、ベストプラクティスや新しい知見を得られる場です。参加を強くお勧めします。うちも参加予定です。

yapcjapan.org

おまけ

Mojoliciousで作った掲示板アプリについての解説が長くなりそうだったので、別エントリに起こします・・・

書きました

sironekotoro.hateblo.jp

Perl入学式 in 東京 第4回 サブルーチン/正規表現編 の練習問題&復習問題の解答例

Perl入学式 in 東京 第4回 〜サブルーチン/正規表現編〜

昨日、「Perl入学式 in 東京 第4回 〜サブルーチン/正規表現編〜」の講師を担当したものです。 猛暑の中集まっていただき、みなさま本当にお疲れさまでした。

練習問題、復習問題の解答例

講義資料中にある練習問題の解答例です。 うまく解けない時とかに参考にしてください。 うまく動かない時はご連絡ください。

練習問題

Perl入学式 2018 第4回 練習問題 simple_calc.pl — Bitbucket

Perl入学式 2018 第4回 練習問題 output_array_and_hash.pl — Bitbucket

Perl入学式 2018 第4回 練習問題 perl_checker.pl — Bitbucket

Perl入学式 2018 第4回 練習問題 love_food.pl — Bitbucket

Perl入学式 2018 第4回 練習問題 regexp_replace.pl — Bitbucket

Perl入学式 2018 第4回 練習問題 while_input.pl — Bitbucket

復習問題

Perl入学式 2018 第4回 復習問題 calc.pl — Bitbucket

Perl入学式 2018 第4回 復習問題 food.pl — Bitbucket

自作スライド

今回の正規表現編でつかったスライドです。自分で言うのもなんですが、結構いい出来だと思うんですよねー。
ただし、「メタ」の部分は除く。
メタフィクション(フィクションについてのフィクション)という文脈を元に、「文字についての文字」「文字をあらわす文字」と解説をつなげたかったのですけど、全く力及びませんでした。

docs.google.com

おまけ

もし、正規表現を使わずに特定の文字を探そうと思ったら・・・?
正規表現を使わずに文字のパターンマッチ non_use_regex.pl — Bitbucket

ピザ会で出たお題「connpassのページ下部にあるフィード欄の情報を取得する」
connpassのページ下部にあるフィード欄の情報を取得する — Bitbucket

次回のPerl入学式 in 東京

8月25日(土曜日)を予定しています。是非ご参加ください〜!

Perl入学式 in 東京 第3回 〜配列/ハッシュ編〜 の練習問題&復習問題の解答例

Perl入学式 in 東京 第3回 〜配列/ハッシュ編〜

昨日、「Perl入学式 in 東京 第3回 〜配列/ハッシュ編〜」の後半の講師を担当したものです。 みなさま本当にお疲れさまでした。

練習問題、復習問題の解答例

講義資料中にある練習問題、復習問題の解答例です。 うまく解けない時とかに参考にしてください。 うまく動かない時はご連絡ください。

練習問題

Perl入学式 2018 第3回 練習問題 array_pop_shift.pl — Bitbucket

Perl入学式 2018 第3回 練習問題 array_push_unshift.pl — Bitbucket

Perl入学式 2018 第3回 練習問題 hash_profile.pl — Bitbucket

Perl入学式 2018 第3回 練習問題 hash_func.pl — Bitbucket

Perl入学式 2018 第3回 練習問題 array_ref.pl — Bitbucket

Perl入学式 2018 第3回 練習問題 hash_ref.pl — Bitbucket

最終問題

Perl入学式 2018 第3回 最終問題 region_ref.pl — Bitbucket

復習問題

github.com

Perl入学式 2018 第3回 復習問題 vote.pl — Bitbucket

Perl入学式 2018 第3回 復習問題 score.pl 2-1 — Bitbucket

Perl入学式 2018 第3回 復習問題 score.pl 2-2 — Bitbucket

Perl入学式 2018 第3回 復習問題 score.pl 2-3 — Bitbucket

Perl入学式 2018 第3回 復習問題 score.pl 2-4 — Bitbucket

Perl入学式 2018 第3回 復習問題 score.pl 2-5 — Bitbucket

リファレンス、さっぱりわからないというあなた

第3回の後半っていうと、Perlのデータ構造、リファレンスについてやるんですが、まぁー、初学者殺しですよねー
うちもそうでした。やられた口です。リファレンスわかりませんでした。
でも大丈夫です。わからなくてもプログラムは書けます。

うちがPerl入学式受講生だった2013年、講師をしていたpapixさんが
リファレンスは、繰り返し何回もやって体で覚えるしかない!
と言っていて、プログラミングでそんな脳筋理論が出てくるとは・・・って思ったもんですが、今ならわかります。
リファレンスは脳筋です。

繰り返し何回もやって体で覚えるしかない

リファレンスの数をこなす・・・?
でも問題集の設問は限られているし・・・?
大丈夫です。講師をしている途中でも言いましたが、自分の身の回りにある情報をPerlのデータ構造にしてみるのが良いです。

  • 都道府県名をkeyに、県庁所在地をvalueにしたハッシュを、北から順に配列に入れてみたらどのような構造になるか?
  • 都道府県名をkeyに、その県で見られる民放のテレビ局(おそらく複数?)をvalueに入れ、北から順に配列に入れてみたらどのような構造になるか?
  • 将棋の棋譜をデータ構造で再現するには?
  • 年度別に、各月の給料支給額を格納するには?そして格納した給与支給額を年度別に合計したり平均値を出すには?
  • 株価の時系列データから、特定の日時だけ抜き出すのに楽そうなデータ構造は?

などなど。
そして、自分が作ったデータ構造からデータを引き出せなかったり、そもそも、どのようなデータ構造にすれば良いかわからない・・・というときは、どうぞPerl入学式のslackやtwitterハッシュタグ #Perl入学式 でつぶやいてみると、教えてくれる人が現れるはずです。多分。

適切な参考書はありますか?

これに関しては自信を持って深澤千尋さんの「すぐわかる オブジェクト指向Perl」をおすすめします。

タイトルにはリファレンスの文字もないのですが、Perlオブジェクト指向を学ぶためにはリファレンスが必要、そのためにリファレンスについて勉強しましょう!と始まって、書籍全体の半分くらいのページを割いて懇切丁寧にリファレンスを解説してます。

うちだけではなく、他の方もオススメしている本です。ぜひ参考にしてください。

gihyo.jp

あと、ごくごくわずかな一部の方に好評だった、いらすとやさんを利用したスライドを載せておきます。成仏してくれ・・・
でも楽しかったんで、また作るかも!

docs.google.com

Perl入学式 in 東京 第2回 〜構文基礎編〜 の練習問題&復習問題の解答例

Perl入学式 in 東京 第2回 〜構文基礎編〜

え、前に記事書いてからもう2ヶ月近く経ってたの・・・

昨日、「Perl入学式 in 東京 第2回 〜構文基礎編〜」の前半の講師を担当したものです。 みなさまお疲れさまでした。

練習問題、復習問題の解答例

講義資料中にある練習問題、復習問題の解答例です。 うまく解けない時とかに参考にしてください。 うまく動かない時はご連絡ください。

練習問題

Perl入学式 2018 第2回 復習問題 hello_perl.pl — Bitbucket

Perl入学式 2018 第2回 練習問題 scalar_practice.pl — Bitbucket

Perl入学式 2018 第2回 練習問題 hello_stdin.pl — Bitbucket

Perl入学式 2018 第2回 練習問題 calc.pl — Bitbucket

Perl入学式 2018 第2回 練習問題 question_word.pl — Bitbucket

Perl入学式2018年 第2回 練習問題 question_num.pl — Bitbucket

Perl入学式 2018 第2回 練習問題 for.pl — Bitbucket

Perl入学式 2018 第2回 練習問題 fizzbuzz.pl — Bitbucket

Perl入学式 2018 第2回 練習問題 join.pl — Bitbucket

Perl入学式 2018 第2回 練習問題 split.pl — Bitbucket

復習問題

github.com

Perl入学式 2018 第2回 復習問題 stdin.pl — Bitbucket

Perl入学式 2018 第2回 復習問題 sum.pl — Bitbucket

Perl入学式 2018 第2回 復習問題 factorial.pl — Bitbucket

Perl入学式 2018 第2回 復習問題 even_or_odd.pl — Bitbucket

ピザ会で紹介したスライド

最高なのでみんな見て!

speakerdeck.com

次回のPerl入学式 in 東京

「魔の第3回」と言われ、Perlでの最初の山場である「リファレンス」をやります。

まぁ、逆にいうと、これ越えるとしばらく山場ないんじゃないかなって感じです。

それに、リファレンスわからなくても死にはしない。プログラムが組めないわけではない(面倒だけど)という程度のことです。

たくさん試行錯誤して、たくさん書いてやっていきましょう。

YAPC::Okinawa 2018 ONNASON

行ってきました。初沖縄上陸。
3月1日に到着。1日と2日昼は観光して、2日の夕方からの前夜祭に参加しました。

前夜祭

綺麗なコードの書き方

!?ってなったのはこれ。
情報処理試験の問題集に出ていたステガノグラフィーってやつ?いや、あれは単に画像の中に情報を隠してるだけだから・・・ではこれは一体?画像ファイル(ビットマップ)をそのままperlで実行!?できるんだ・・・

素早かったです。

Perlと私

togaerror.hatenablog.com

信大の学生さん。「Perl入学式」の資料を見て自習してくれるとか、すごい嬉しいじゃないですか。

YAPC::Okinawa 2018 ONNASON 当日

今回の会場は「沖縄科学技術大学院大学 OIST」。ホールがめちゃめちゃ広く、またWiFiも途切れることなく、快適に過ごすことが出来ました。

なお、外は猛烈な雨。

Webサービスを監視するときに僕達が考えたこと

speakerdeck.com

B会場ながら、ベストトーク2位に食い込んだpapix師すごい。
うちの今のお仕事は異常値検出後フローにおける終端・・・異常値が出ていることをお客さんに「口頭で」伝えるお仕事なのですが、その手前で何をすべきか、何を考えておくべきか、何を揃えておくべきか、といったことが語られていて、良かったです。

YAPC::Okinawa 曖昧な文脈自由文法となんか理論的な話

正規表現技術入門 ――最新エンジン実装と理論的背景:書籍案内|技術評論社

初心者にもやさしい語り口調で、さすが教職だなぁと思いつつ。
懇親会でもお伝えしたのですが、中学高校くらいの数学が、大学レベルになると垣根を越えて文章の構造の解析に当てはめて利用されるというのがとても驚きで、新鮮で、本当に良かったです。
今回のテーマとおり、うちの頭の中で架け橋がかかったなぁという感じでした。

WordPress運用を支えるPerl

techplay.jp

事前に
「今回はWordPressPerlで活用する話をするんですよー」
と聞いていて、あー、WordPressが吐き出したログとかアドオンとか、移行用に吐き出したエントリをPerlでごにょごにょやる話かなー・・・と思ったら全然違って、こういう話だった。

思えば、nginxやPHP,Rubyなどが出てきているけど、ApachePerlも滅んでいないわけで、そうなると、mod_perlまだまだ活用の場十分広いのでは?と思うなどしました。
あと、発表ではプロジェクタにiPadを接続、それでプレゼンというスタイル。iPadで指をグリグリすると、映し出されたスクリーン上でレーザーポインタ的なマーカーが動くというもので、これは新しい。

そういえば、社内イントラサイトで一番アクセス数があるのは「社員懲戒」のページ、という話を思い出しました。

ノンプログラマーのプログラミング活用法

speakerdeck.com

YAPC::Asia 2013 のPerl入学式出張版に出ていたということで、あぁ、同級生だったんか・・・と思いつつ。
「編集」という文章を扱う仕事でVimPerlを使ってみたら・・・という内容。
プログラマの三大美徳ってのがあるんですが、まさにツールを使い尽くして意のままに動かし、楽をする「怠惰」の極み。
うちはツールに使われていて、まだまだ「勤勉」だなぁ、いかん、と反省しきり。

Perlを中心としたワンライナーあれこれ

speakerdeck.com

Perlといえばワンライナーも魅力なんですが、その基礎には「UNIX哲学」があるという話。「UNIXという考え方」は東京戻ってきて、通勤途中に再読はじめました。

LT

アナグラ君が公開処刑されてたんで、懇親会で
「うちの会社きなよー、女性比率高いから機会は多いよ。
 ただし今学んでいる専門やプログラミングは一切生かせない。
 この門をくぐる者は一切の希望を捨てよ」
みたいなことを雑に伝えたりしました。

後から思ったんですが、社内恋愛、うまくいってる間は最高なんですが、ミスると仕事と周囲の人間巻き込んで死ぬのでオススメしてはいけなかった・・・

おっさんとなった今は「そんなに彼女欲しいもんかねー」などと思うけど、じゃあ自分が20代の時はどうだったかっていうと、血涙その他の体液たれ流しながら彼女ほしいとか思ってたので、いっぱい失敗して年取るとどうでもよくなって楽です。早く年取れ!(雑

懇親会ではオリオンビール飲めて、寿司もたべて、豚足も食べて、素敵な感じで過ごせて幸せでした。

本当にスタッフ、そしてスポンサーのみなさんありがとうございました。

次回は東京!

yapcjapan.org

今から楽しみ〜

詳解! 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
    );
  });

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