すぐわかるオブジェクト指向Perl 2周目
「オブジェクト指向Perlマスターコース」から一時撤収
- 2016年8月
- 分からないなりに読み進む、という選択肢はあるものの、どうにもやる気が出ずに眠くなる
- 自作スクリプトを書いていて、「俺のオブジェクト指向Perlはこれで良いのだろうか?」という不安を放置している
- なんでもクラス内のプロパティに格納するクセがついてしまった。あまり良い事ではなさそうなので矯正したい
- というわけで、もう一度基礎に立ち返る事にする。
- もひとつ。高名な・・・寿司LoverでCTOでゲーマーで技術顧問のnaoyaさんのこのツイートを見て決心したというのもある。
技術書はどんどこ新しいの読むんじゃなくて、これはと思ったのを何回も読むのが力がつくと思われます
— Naoya Ito (@naoya_ito) 2016年8月2日
第1章
- さらっと。
File::Find
はホント素晴らしいよな・・・- サブルーチンを引数で渡す、っていう意味が今ならわかる。
第5章
上のプログラムで
$codeRef = \&daikeiNoMenseki(3,4,5);
の用にサブルーチンに引数を渡してしまい、コードレフの取得とサブルーチンの実行を一気に行おうとしては(?)いけません。
上のように書いた場合は、&daikeiNoMenseki(3,4,5)
によってサブルーチン実行がおこり、戻り値17.5という無名スカラーへのリファレンスが$codeRef
に入りますが、そんなことしたい人は絶対にいないと思います。
138p
- サブルーチンの実行と戻り値の取得が出来て楽でよさそう、とか思ったけど、なるほど。
第11章、というよりも「翔丸」
- 途中、クラスとインスタンスの説明で能條純一のコミック「翔丸」を取り上げて説明する部分があり、一度読んだときによく分からなかったんですね
- 二回目を読むにあたり、原作全3巻を読んでみたんですが・・・主人公がカッターナイフをふるう都度(そんで仲間が増える都度)「インスタンス」「インスタンス」って思い浮かんできて別の意味で楽しかったです
- でも原作読まないと分かんないよなぁ、これ
- 翔丸 - Wikipedia
- うちだったらどんなたとえを使うだろう・・・
- 吸血鬼
- クラスオブジェクト:吸血鬼、ヴァンパイアロード?
- コンストラクタ:噛みつき
- インスタンスクラス:血を吸われた人
- メソッド:噛みつき、引っ掻く
- ゾンビ
- 吸血鬼
- なかなかに難しい
第11章(翔丸抜き)
- 自分である程度オブジェクト指向でプログラムを書いてみて、改めてこの本を読み返すと本当によく分かる。
- そして、最初に読んだ時、いかに適当に読み飛ばしていたか・・・
- まぁ、それでもそれなりに書けるんだから、この本すごい、Perlすごい
- クラス、クラスオブジェクト、インスタンスオブジェクト、コンストラクタ、オブジェクト、プロパティ、メソッド、メッセージ、分かる!わたしにも分かるぞ!
第12章
- プラグマモジュール、 overload の "0+" って何?って思ったけど、 Perl の演算子の一つなんだ・・・
- オブジェクトと数値や文字列を同時に引数にとる時、第一引数がオブジェクトになるよう、自動的に引数の順番が並べ替えられる。
- 並べ替えが行われた場合には、第3引数に真値が入る
- すごい、1周目やったときの記憶が無い・・・
第14章
- Calendar::Simple を使った CGI
- だけど2周目なので、ちょっと変えて軽量 WAF の Mojolicious::Lite を使って実装
#!/usr/bin/env perl use Mojolicious::Lite; use Calendar::Simple qw(calendar); use Time::Piece; # Documentation browser under "/perldoc" plugin 'PODRenderer'; get '/' => sub { my $self = shift; my $t = localtime; my ($year,$month,$day) = split /-/ , $t->ymd; my $cal = calendar($month , $year); $self->stash( cal => $cal ,year => $year , month => $month); $self->render('index'); }; post '/' => sub { my $self = shift; my $year = $self->param('year'); my $month = $self->param('month'); my $cal = calendar( $month, $year ); $self->stash( cal => $cal ,year => $year , month => $month); $self->render('index'); }; app->start; __DATA__ @@ index.html.ep % layout 'default'; % title 'Welcome'; Welcome to the Mojolicious real-time web framework! <form action ='<%= url_for %>' method='post'> <%= number_field 'year' , style => 'width:50px' %>年 <%= select_field 'month' => [(1..12)] %> <input type='submit' value='表示'> </form> <table border=1> <tr> <th>日</th> <th>月</th> <th>火</th> <th>水</th> <th>木</th> <th>金</th> <th>土</th> </tr> % for my $week (@$cal){ <tr> % for my $day (@$week){ <td><%= $day %></td> % } </tr> % } </table> @@ layouts/default.html.ep <!DOCTYPE html> <html> <head><title><%= title %></title></head> <body> <%= content %> </body> </html>
2周目を終えて
オブジェクト指向Perlマスターコース 第3章 〜 第5章
「遅れてきたもの」の悲しみ
- この「オブジェクト指向Perlマスターコース」は2001年の初版をつかっているのだけど、誤記?にぶつかった。
- さてさて正誤表は、と思ったら出版社が無い
- 正確には同じ名前の出版社はあるんだけど、もうプログラミング言語書籍の仕事してない
- 正誤表無しは辛い・・・
- けどまぁ、古代の古文書だって正誤表無いだろうし、分かる範囲でがんばってこう
そんで、「うちより後」にこの本を読む人のために気づいたところは書いておこう
- でも、この本を手に取る位の人であればいらないんじゃ・・・とも思う
今日見つけたのはこれ
- 114p リスト3.1 クラスCD::Music
- 誤、と思われる
$self->{_room} = $roomif $room; $self->{_shelf} = $shelfif $shelf;
- 文脈からいってこうだろうな
$self->{_room} = $room if $room; $self->{_shelf} = $shelf if $shelf;
- 123p 118pの
name
からget_name
への変更が反映されてないので直す - 128p
use Carp 'croak'
が必要 - 129p AUTOLOAD から呼び出したチェック用サブルーチン
_accessible
がうまく動かず、常に偽を返す
{ sub _accessible { my %_attrs = ( _name => undef, _artist => undef, _publisher => undef, _ISBN => undef, _tracks => undef, _rating => undef, _room => undef, _shelf => undef, _incr => '1', ); return exists $_attrs{ $_[1] }; } }
第4章、第5章
すぐわかる オブジェクト指向 Perl 第9章 オブジェクト指向モジュールの活用
ありがたい!
@sironekotoro さんいつもお世話になります! Calendarモジュールですが、CPANからは消えていますがtarballからインストールできます。お暇があれば下記の記事をご覧ください! https://t.co/8K3vmAj0pq > 日記 2016-05-02
— 深沢千尋@すぐわかる電子出版 発売中! (@query1000) 2016年6月27日
- !!!
- ありがとうございます作者さん、おかげで本を全部味わう事が出来る!
- ってことで、飛ばしていた9章にチャレンジ
- まずは、Calendarモジュールのインストールに再挑戦。
- ダウンロードのリンクは http://blog.query1000.com/archives/43923166.html の記事先頭にある
- インストールはcpanm任せ
cpanm --install http://ftp.auckland.ac.nz/CPAN/modules/by-module/Calendar/YEWENBIN/Calendar-v0.4.2.tar.gz
「すぐわかる オブジェクト指向Perl」という本
そうそう、この本について、dankogai氏が書評を書いているのを発見
404 Blog Not Found:$this->get if $you->learn(slow) - 書評 - すぐわかるオブジェクト指向Perl
リャマやアルパカは、私から見るとずいぶんとゆっくりなのだけど、それでも速すぎる生徒がいることを忘れてはならないのだ。しかし、本書なら大丈夫。カメでも学べます。
- まさにこの言葉通り。ドジでのろまな亀の自分でも、とっかかりを掴むことができた
- 一つの物事を体系的に学ぶとき、インターネットよりは本で一気通貫で学ぶのが、とても良いと再認識させられた
今日の午後3時間くらい悩んでいた事
オブジェクト指向の勉強中・・・
クラスを作ったパッケージ内にある変数に、メソッドを経由してアクセスしたい
- testClass クラス の中の access サブルーチンから、おなじパッケージ内の $str にアクセスしたい
- 不精をして、1つのファイルで
package
で分けることでクラスを作ったりという事をしておりました(フラグ
# test.pl use 5.012; use warnings; use utf8; binmode STDOUT, ':encoding(UTF-8)'; # オブジェクト作成 my $object = testClass->new; # オブジェクト経由でメソッド動かして、 # testClassの中の $str の値を表示させたい print $object->access; # ----- main パッケージここまで ----- package testClass; # packageの中にはあるけど、メソッドの中には無い変数 my $str = 'testClass package'; # コンストラクタ sub new { my $class = shift; my $name = {}; bless $name , $class; } # このメソッドで同じ pakcage の中にある $str を返す sub access { my $class = shift; return $str; } 1;
- が、エラー
Use of uninitialized value in print at ...
$str にアクセスできない・・・なぜだ
このあと、
use strict
外したり、my
の代わりにour
とかlocal
使うなどするも解決せず。
解決
- ちゃんとファイルを分けたら動いた
- でも、なぜ1つのファイルで分けたらダメなのか理解できず
- 不精はいかん、ってことだけど、うーん、なぜだ。分からん。
# test.pl use 5.012; use warnings; use utf8; use testClass; binmode STDOUT, ':encoding(UTF-8)'; # オブジェクト作成 my $object = testClass->new; # オブジェクト経由でメソッド動かして、 # testClassの中の $str の値を表示させたい print $object->access;
# testClass.pm package testClass; # packageの中にはあるけど、メソッドの中には無い変数 my $str = 'testClass package'; # コンストラクタ sub new { my $class = shift; my $name = {}; bless $name , $class; } # このメソッドで同じ pakcage の中にある $str を返す sub access { my $class = shift; return $str; } 1;
しかし・・・
- testClass.pm の $str を
{ }
で囲むと動かなくなる・・・これではカプセル化が・・・ううむ
オブジェクト指向Perlマスターコース 第1〜2章
「遅れてきた自分」が感じる Perl の素晴らしさ
- うちのように齢 30 超えてプログラムに興味を持った人にとっては、Perl はとても良い選択
- なんせ、「枯れた言語」であるので、大昔の本でも今に生かせる知識がある
- 他にも枯れた言語はあるけど、すぐに実行できて、分かりやすく、コミュニティ活動があり、未だに web の第一線で使われている、という Perl の有り難さがある
ということで「オブジェクト指向Perlマスターコース」
- 先に学んでいた「すぐ分かるオブジェクト指向Perl」で参考書籍にあげられていた本
- Amazon では新刊は入手できず、マーケットプレイスで入手
- 「枯れた言語」だと参考書籍も安く上がってありがたい
- でも、申し訳なさもある・・・著者の方には一銭も入らないわけだし
- Perl 本の新刊はちゃんと買うようにしているんだけどね
- 正直、!5年前(2001年)に出た本を買うのは勇気がいったが、ま、買わない事には無駄かどうかも分からない
- 1つ得るものがあって、ずっと生かす事が出来れば、安い投資である
第1章 オブジェクト指向入門
- いきなり収穫があった
- オブジェクト指向の概念とその別名
概念 | 別名 |
---|---|
オブジェクト | クラスインスタンス、インスタンス変数 |
クラス | ユーザー定義型、オブジェクトテンプレート、メタオブジェクト、パッケージ、モジュール |
オブジェクト属性 | フィールド、スロット、インスタンス変数、メンバオブジェクト、データメンバ |
クラス属性 | クラス変数、クラスフィールド、インスタンス変数、メンバオブジェクト、データメンバ |
オブジェクトメソッド | インスタンスメソッド、セレクタ、ハンドラ、メッセージハンドラ、フィーチャ、メンバ関数、オペレーション、パッケージオペレーション |
クラスメソッド | 静的なメソッド、静的なメンバ関数、共有メソッド |
メソッド呼び出し | メソッド起動、メッセージ、イベント |
インターフェイス | プロトコル、機能集合 |
継承 | サブクラス化、クラスの特殊化、導出 |
カプセル化 | データ隠蔽、データプライバシー |
総称クラス | テンプレート、パラメータ化クラス、総称パッケージ、総称モジュール |
多態的メソッド | 仮想関数、総称メソッド、優先オペレーション、メソッド |
抽象メソッド | 純粋仮想関数、延期機能 |
スーパークラス | 親クラス、基底クラス |
サブクラス | 子クラス、派生クラス |
- まぁ、正直言うとこの表みたときに感じたのは「殺意」
- こんなに別名多いのかよ!
- なるほど、Web から拾い読みしてただけでは用語が混ざって、一生オブジェクト指向わかんないなぁ
- 今だったらもっと増えてそう
第2章 Perl入門
- この辺りはさらっと
- 今までの積み重ねが生きてる感
- とはいえ、
wantarray
はサブルーチンからの返り値チェックに積極的に使っていきたい
sub subroutin { return wantarray(); }; my $scalar = subroutin(); print $scalar , "\n"; # "" my @array = subroutin(); print @array , "\n"; # 1
- 型グロブの存在意義、今まで全く理解できなかったんだけど、以下の説明で腑に落ちるところがあった
しかし型グロブでは、さらにもう1つの重要なテクニックとして、選択的に割当を行う 事が出来る型グロブに様々な種類のリファレンスを割り当てた場合、対応する種類の型グロブのスロットのみが置換される。
perl *SOURCE = \$SOURCE1; *args = \@ARGV; *do_it = sub {print "coin' it!\n"};
つまり上記3つの割り当てで、$SOURCE
は$SOURCE1
の別名になるが、@SOURCE
,%SOURCE
,&SOURCE
などは影響を受けない。同様に、@args
は@ARGV
の別名になり、&do_it
は無名サブルーチンの別名になる。
(中略)
この割り当ての動作はポリモーフィズムの一例である。つまり、刺激(割り当て)は常に同じであるが、反応(型グロブで実際に変更される部分)は、割り当てられている値のデータ型に依存する。
最近のPerlの勉強とか:2016年06月
最近やっている事
- 「すぐわかるオブジェクト指向Perl」を読み終えた後、既存の自作プログラムの改修をやっておりました
- RSSフィードを持ってきて、自分の好きに変形して出力するもの
- 以前に作ったものはこういうもの
- これを以下のように変更
作りなおしてみて
- RSSフィードごとに異なる部分と共通処理部分を分離する、というのが実現できて嬉しい
- さらに楽
- オブジェクトの中のデータをメソッドでグニグニするという感覚を得る事が出来た
- それは既に
Time::Piece
とかWeb::Scraper
で使わせてもらっていた事ではないか!という気づき
これからのPerl勉強
- 他の既存プログラムの改修
- さらなるPerlの勉強
- あと、テストを書く習慣が無いので、身につけないとなぁ
- いまは
Data::Dumper
使ってsay Dumper $hogehoge
頼み
- いまは
PerlTidi
頼みなので、ちゃんと Perl Best Practice 読む- それに、そろそろ仕事で本格的に楽をするためのプログラム組みたい・・・
- 楽をして儲かるとなお良い・・・
- やりたい事いっぱいだ!
そういえば
- 昔を思い出す
- 「オブジェクト指向?知らなくても動くプログラム作れるよ」
- 「リファレンス?知らなくても動くプログラム作れるよ」
- 「ハッシュ?知らなくても(略」
- そんなふうに考えていた時期が俺にもありました
- 構造や働きをまとめることで結果、楽をする事が出来るって素晴らしい事なんだよなぁ
- きっともっと楽をしたり、出来る事が広がる知識があるはず
- なにより、「俺の考えた最強のプログラム」作って動かすのはとても楽しい!
One More Thing
- Javascript も勉強してたけど、自作Perlスクリプトを作り直すのが楽しくて手を付けてなかったので再開させる
すぐわかる オブジェクト指向 Perl 第13章 オブジェクトクラスの継承、デストラクタ、永続化
オブジェクトクラスの継承
デストラクタ
- オブジェクトが破棄されると呼び出されるメソッド
- どんな使い道があるんだ?
書いてもいいし、書かなくてもよい
- なるほど
- どんな使い道があるんだ?
オブジェクトの永続化
オブジェクトの永続化は DESTROY でオブジェクトの中身をファイルに書き出し、 new でファイルからオブジェクトを再構築するとスマートです
- スマートっていうか、割と原始的感ある
- でも、確かに、この方法であれば、プログラムを終了してもデータは永続化できるなぁ
- と思ってたら
Storeble
モジュールの話が出てきた - さらに、
Data::Dumper
でデータを永続化する方法も
読み終えた・・・まだ残ってる
- 第14章はCGIとCPANのお話なので、これは読むだけで飛ばすと。
- いや、やっぱCGIのところはやっておこう
- CGI久々すぎて、Apacheの起動の仕方忘れてた
- シバンをつけるの忘れてた
- chmod でパーミッション変えるの忘れてた
CGI
「すぐわかる オブジェクト指向 Perl」を読み終えて
- 何だろう、とてもじんわりと感動してる
- ずっと憧れてきた「オブジェクト指向プログラミング」を素材から触れて行く感覚が良い
- 「続・はじめてのPerl」読んでもよく分からなかったけど、まぁ、オライリーの本は復習用・到達度確認用と思うことにする
- 今読んだら、最初に読んだ時よりもずっと深く理解できる気がする
- 不思議と、今までのプログラミングでは感じることが無かったのだけど、この本でオブジェクトを作っている時は、「俺は今このプログラムの神なんだ」という不思議な感覚があった
- そして、業務で出会う「出来のよろしくないプログラム」に思いを馳せたり
- 「神様」のレベルや、想像力が無いと出来上がるものもそれなりだよね、って
- そんで、 cpan などで見つけたモジュールで、既に
hogehoge->new
とか、オブジェクトを使っていたんだな、という感慨が新たに。- ずっとそばにいたんだなぁと
- 読んでよかった、挑戦してみてよかった
- 一通り初心者本を読んで、次のステップに飢えていた、でも「続・はじめてのPerl」は難しいという自分にぴったりだった
- 後は自作のスクリプトでどう生かすか、だよなぁ
- まだまだ勉強は続く