Perl Beginners #4 で、読めなかったコードを読んでもらった

これは私が実際に体験した話なんですがね、勉強会に行ったんです。Perl Beginnersって言って、隔月でやってて、もう4回目になる。私全部出てるんです。この勉強会の面白いのが、区民館とかそういうところを使うんですね。この日も銀座の区民館でやった。
受付に着きまして、今日の催しのボードを見たら、Perl Beginnersがない。変だなーと思ってたら受付の方が声かけてきて、「1号室の方ね?英語の」えっ……
まあ区民館の方だし、英語の名前の集まりだってことを言いたかったんだろうなと理解したんですが、どうもひっかかる。
嫌だなー、嫌だなーと思いながらも会議室の方に進んでいくと、いきなりフッと目に入った。
私が迷い込んだのは、Perl Beginnersじゃなくて、

PRL BEGINNERS だ っ た ん で す 。


ということで、Perl Beginners #4 に参加して、ビギナーズセッションもやらせてもらいました。

Opening Talk (ytnobodyさん)

  • MINI TIPS
    • オブジェクトがどのクラスか調べたい
$class_name = ref( $object );

Beginners Session

その1 papixさん
  • 自己紹介
    • Perl入学式代表取り締まられ役
  • 質問:オブジェクトを学ぶ上で、参考資料となるモジュールはないか?
  • CPANモジュールは?
    • たくさんありすぎ
    • 規模が大きいのは不適切
    • 玉石混交
  • 回答:ytnobodyさん
    • ピンク色のページが勉強になる
    • 読むより使うことで学んだ
    • LWP::UserAgentはわかりやすい
    • Githubに上げるに至るまでにやったこと
      • 先にハッシュリファレンスのことを覚えた
      1. ピンク色のページを読む
      2. ピンク色のページを参考に書く
      3. pmsetupを使ってモジュールを作る
      4. Module::Setupを使ってモジュールを作る
  • 回答:toku_bussさん
  • Hokkaido.pm Casualで聞いたときの答え
    • cpanm, Amon2, Mojolicious などが挙がった
  • 感想
    • papixさん初めて見たけどトークの冴えがすごい
    • プロの方々がどうやって勉強したかを追うのはためになる
その2 hsksyusk

わたくしでございます。
スライドはこちら。
Beginners Session at Perl Beginners #4
怪談風に話しましたがあまりウケませんでした。
簡単にまとめると、

  • Web::ScraperでHTML内のURLを取ろうとしたんだけど、Data::Dumperで出力したら以下のような意味のわからないコードが出てきた
$VAR1=bless(do{\(my$o='http://www.perl-beginners.org/2012/08/perl-beginners-4.html')},'URI::http');
  • これは何?
  • 読み方がわかんないんだけど。
  • なんで warn $res->{link}; で文字列が出力されたの?
  • 回答:ytnobodyさん、maka2_donzokoさん
    • blessは、オブジェクトを作るときに使う
    • 引数は2つ
      • 2つ目が、所属するパッケージ
      • 1つ目の引数で渡されるリファレンスのオブジェクトを、2つ目の引数のパッケージに所属させる。
        • ここでは、do{\...} を、 URI::http に食わせるイメージ
        • do で食わせるものは、ハッシュリファレンスだけ、実体は与えられない
    • Dumperで出てきたのがオブジェクトの実体
      • オブジェクトを直接出力させても、中の文字列が取れたのは、
      • 文字列が取れるのは、URIモジュールでオーバーロードしてるから
        • 文字列として呼ばれると、中の文字列を返すようになってる

オーバーロードについては、toku_bassさんが分かりやすいサンプルコードを書いて下さいました。
Perl Beginners #4 · GitHub

  • 感想
    • これに遭遇してから、blessとかで検索して件のピンクのページを読んでもいまいち理解できなかったので、すっきり。
    • 勉強になりました。

LT

ライブコーディングで学ぶPerlオブジェクト指向(ytnobodyさん)

ということで、それを踏まえて、Animalクラスのライブコーディングを見せていただきました。
コードはgithubに。
GitHub - ytnobody/PerlBeginners4-LT
作るAnimalたち*1と、そこで使ったオブジェクト指向の概念と合わせて読むとよろしいんじゃないかと。

  • Animalクラス
    • 声という変数を持ってる
      • newでcry変数を持たせる
    • 持っている声で鳴く能力がある
      • barkメソッド
  • 動物だけど鳴き声がニャーに決まってるCatクラス
    • use parentでAnimalクラスを継承
    • SUPER::hogeで親クラスのhogeメソッドを使える
  • 動物で飛ぶ能力を持つBirdクラス
    • Animalクラスを継承
    • subで飛ぶメソッドを追加
  • 猫と鳥を合成したキメラクラス
    • 鳴き声はニャー、飛ぶ能力を持つ
    • parent で二つ親を指定する
  • 同じく飛ぶ能力を持つBatクラス
    • 飛ぶ能力だけを独自に作る
      • そういうクラスをMixinという
      • Animal::Mixin::Flyクラスを作る
        • 中でExporterを使う
    • Batクラス
      • Animalクラスを継承
      • Animal::Mixin::Flyを使って、飛ぶ能力を使えるようにする。


その他、オブジェクト指向のコードを書くのに便利なモジュールも紹介

  • Class::Accessor::Fast
  • Mouse
    • 独自の書き方
  • 感想
    • 概念説明してもらいながらコード読むのは大変分かり易い。
    • オブジェクト指向を学ぶのに最適なサンプルな気がする
      • papixさんの「写す」向け?
名前空間とかの話(toku_bassさん)
  • 名前空間連想配列で実装されている
  • use Hoge::Foo; は、Hoge::Fooパッケージとは関係ない
    • ファイル名を指定しているから
    • eval, do, require, use どれもファイル名を指定しているだけで、パッケージ名ではない
  • モジュールでパッケージ名をtypoしたら(ファイル名はあってる)
    • ファイルは正常に読み込まれる
    • typoしたパッケージ名でパッケージが作られる
    • 実行時には正常なパッケージ名で呼ばれることになるので、名前の不一致でエラー
  • パッケージはグローバル
    • 完全な名前を指定すればどこからでも参照できる
    • 一度useで読み込めば、他でuseの必要はない
      • でも、パッケージ毎に use を書かないと管理できないので、書くべき。
  • use Data::Dumper; するだけで、 Dumperメソッドが直接使えるのはなぜか?
    • Data::Dumper->Dumper が、完全な名前で指定した形
    • Data::Dumperの中でExporterを使っていて、mainパッケージにメソッドがMixinされたので、Dumperだけで使えた。
  • 感想
    • Dumperが使えた理由を教えてもらえてありがたかった
      • いままで何の気なしに使ってました。
    • use も、cpanモジュールを使うためのもの、程度の理解だったので、理解が深まった。

渾身会

ハワイアンのお店でしたが、フロアが完全に女性で占められており、ガチホモ合コンと判断された我々はガラスで区切られた別室に隔離されました。トイレに液体ハミガキがあったので、あれを口に含んだら爆発すればいいと思います。


ytnobodyさんからオブジェクトの使いどころ的な話が聞けた。

  • 自分でモジュールを書くときは、継承とかはあまり使わないで書いてる
    • 継承は使いやすいけど可読性は悪くなる
    • なるべくサブルーチンだけで済ませてる
    • グローバル変数が必要になるような状況なら使う


最後は発表で出し損ねたスライドで締めます。

*1:パペットズーピロミィみたいですね