プログラミングPerl 第1章 Perl概説
とうとう聖典へ
- Perlを本格的に勉強しはじめて3年、Perlの聖典とも言える「Programming Perl」通称「ラクダ本」に着手する
- なお、先にやっていた「オブジェクト指向Perlマスターコース」「モダンPerl入門」はまだ自分のレベルが本に達してないので一旦撤収
- 特に「モダンPerl入門」は解説している部分以外のスタブやドライバを書けないと厳しい
第1章の感想
- Perl初心者本の「まとめ」的内容
- ゼロから『この本でPerl始めろ』と言われたら挫折する
- Perlの入門書を複数、Perl入学式、それと業務でやってるLinuxオペレーションの知識が無いと厳しいと感じる
- 少なくとも、過去の自分がいきなりこれに手を付けてたら、絶対挫折してた
- 初心者向け本からコツコツとやってて良かった
- 他の言語を習得していれば、それとの対比でいけるかもしれない
- 逆に、初心者向け本から積み重ねたPerlの知識があれば、第1章で書いてある事が理解できる
- 「読める!私にも読めるぞ!」
- ただし、2003年の本(第3版)だけあり、現在では推奨しない書き方もあるので、そこは置き換えて考える必要がある
ファイルハンドル扱うときの引数が2つとか
open (SESAME , "<filename" );
現在は引数は3つが推奨されていたはず
open (SESAME, "<" , "filename" );
欄外がいい
- 欄外の注釈、訳注に味があり、「ほうほう、なるほど」と思わせる記述が多くて、ページ進めるの楽しみ
[訳注] 原文は "You can't grep dead tree." dead tree(枯れ木)とは、紙の事である。(例えばオンラインドキュメントを紙に印刷したものを、dead-tree versionと呼ぶ。)この文は、「印刷したドキュメントをgrepすることはできない」という意味である。 (はじめに:xxii)
Programming Perl、いきなり「印刷したドキュメントをgrepする事が出来ない」とかぐっとくる言葉がある。先日の運用ミスで、紙での手続き + 人間のダブルチェックが必要になった我が部署の運営に聞かせたい言葉だ・・・
— sironekotoro (@sironekotoro) 2016年12月18日
歴史的な経緯を話せば、もともとPerlではユーザ定義のサブルーチンを呼び出す際には、必ず頭にアンパーサンド
&
を付ける必要があった。(中略)しかしPerlのバージョン5では、アンパーサンドは省略できるようになり(後略) (第1章 19p)
- なるほど、サブルーチン呼び出す時の
&
が取れたんはPerl5からの話なのね、などなど
驚き
先日、初めてQiitaに投稿した記事内のスクリプトと、20pで記載されていたスクリプトの流れがほとんど同じで「えええ〜!」ってなった
- Perl入学式 を卒業したら、仕事が楽になった話 - Qiita
- ログをリストで受け取って、foreachループのなかのforeachループを回して項目ごとに情報をまとめる、というもの
- 例示されたスクリプトと、自作のスクリプトが似てたってのがめちゃくちゃ嬉しい
- とりあえず大きく道は外してなさそう、と思って
第1章を終えて
モダンPerl入門 第1章 近代的なオブジェクト指向
増補改訂版を待ちながら
- (モダンPerl入門増補改訂版(仮))http://codezine.jp/book/modernperl2
- なお
初版 : 2009年2月9日
刊行日: 2014年1月予定 - 待っていても仕方ないので、今あるものでなんとかする!
感慨深い
オブジェクト指向を学ぶには・・・
- Perlだけではなく、やはり本家のJavaも学ばねばならないのだろうか?
- いやいや、それをいうなら元祖smalltalkから
- そもそも、なんでオブジェクト指向を学ぶのか?学ぶ事自体が目的なのか?
- 学ぶ事自体は楽しいんだけど、それだけではうちの作りたいプログラムが完成しないんよね・・・
そもそも
- 「必要な事だけ学べればいい」って思っていたけど、「必要なものが何か」が分かっていないのが初心者
- 「リファレンス?無くてもプログラム作れるじゃーん」と思っていた数年前の自分を思い出す
- オブジェクト指向もそう
- 必要になったときに学ぶ、でも良いんかな。今までもそうだったし
- 解決の選択肢を多く持っておけば、あとあと楽になるだけど、時間とお金のトレードオフなのよね
- うまく出来てる
- こういう事を中学生で分かってたら、人生変わってたかしらねぇ・・・
Moose
- 初心者ながらに「重い・多機能」という事だけは知っていたモジュール
- 手作りでオブジェクトを
bless
していて感じつつあった、オブジェクトのプロパティの整合性を確認する方法なんかが組み込まれてて、「あぁ、俺の疑問はたいてい先人が解決してくれている」と感謝を新たに - Roleって考え方もいい。継承だけではなく、役割・出来る事での関連性でクラスをまとめられる。素敵!
Macbook Airの環境整備 20160921
管理者権限が必要な AppleScript アプリをパスワード入力無しで動かす
AutoChargeInHabit
- 実際に効果があるのかどうかは、比較対象となる MacBook Air が無いので不明
分からないのだけど、「鰯の頭も信心から」的に使わせてもらっております
- 信仰にはお布施が必要なんでちゃんと 1000円くらい donate したぜ
時々バッテリの状態をメモってた
ちなみに、交換バッテリは 7150mAh らしい
MacBook Air 13" (Mid 2012 through Early 2015) Battery (661-7474) - iFixit
Replacement 7150 mAh battery compatible
バッテリに神経質にはなっていないけど、長持ちするならその方がいいよねぇ、と思ってます
- しかし、真に神経質でない人ならこのソフト入れないだろうから、ちょっとは神経質なのだろうか
なお、MacBook Air の充放電回数の上限は1000回との事
- Mac ノートブックのバッテリーの充放電回数を確認する - Apple サポート
- さっき自分の MacBook Air 確認したらちょうど500回だった
起動の都度のパスワード入力が鬱陶しい
このソフトを MacBook Air の起動時に立ち上がるようにしていたのだけど、都度管理者パスワードを聞かれるわけです
メンドイなぁ・・・と思いつつ、しかし解決法もわからずで2年間
勉強の合間の気分転換で手を入れてみたところ、なんとかなったので備忘録もかね書いておきまする
- なお、試行錯誤に3時間ほどかかった模様
最初は、「自動でパスワードを入力しよう」と思い、 Automator などをいじってみたんですが、パスワードをテキストボックスに入力できず
作者は 「
sudo
で動かしている」との事ですが、当方ではsudo
で動かしてもパスワードを要求される結局、AppleScript で一部を書き換えることに
- ところで、 AppleScript って情報めっちゃ少ない・・・うちのググラビリティが及ばない分野でした
書き換えるのは権利者権限を要求する
AutoChargeInhibit2RunRoot.app
- これを AppleScript エディタで開き
オリジナル
do shell script theAppPath & " &>/dev/null & " with administrator privileges
変更後。******** の部分にMacの管理者パスワードを入れる
do shell script theAppPath & " &>/dev/null & " password "********" with administrator privileges
これで管理者権限を求められる事がなくなりました
- 起動、再起動の都度入力を求められていたパスワードを入れる事がなくなり、しかも自分でなんとかできたって事で、結構感動したのでした
追記
- この記事を書きながら「時々バッテリの状態をメモってた」って何よ?と
- プログラマの三大美徳を信条とするなら、これを自動化するべきではないだろうか?
- まだまだ怠惰が足りない
# MacBattery.pl # その時点のバッテリの再大容量ログを # YYYY-MM-DD hh:mm:ss ???? # の形式でファイルに出力する use 5.012; use warnings; use Time::Piece; binmode STDOUT, ':encoding(UTF-8)'; my $command = 'ioreg -c AppleSmartBattery | grep MaxCapacity'; my $max_capacity = $1 if ( `$command` =~ /(\d+)/ ); my $t = localtime(time); my $date = $t->ymd .' '. $t->hms; my $save_filename = 'Mac_MaxCapacity.txt'; open my $FH, '>>', "$save_filename" or die qq{Can't open file "$save_filename":$!}; say $FH $date , ' ' , $max_capacity; undef $FH;
- こいつを cron に登録して・・・え? MacOS X にcron ないの?
- めんどくせぇ・・・ってなったが、真の怠惰目指して頑張る
Scheduling Timed Jobs
Note: Although it is still supported, cron is not a recommended solution. It has been deprecated in favor of launchd.
- plist ファイルの書き方をググる
- 起動時のみ設定
- plistファイルに 755 の権限つけたけど、必要かどうか試してない・・・
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>pl.Mac_MaxCapacity.perl.plist</string> <key>ProgramArguments</key> <array> <string>perl</string> <string>/scriptdir/MacBattery.pl</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
- 起動時に .pl で指定されたファイルに出力された事を確認
すぐわかるオブジェクト指向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 を
{ }
で囲むと動かなくなる・・・これではカプセル化が・・・ううむ