UNIXという考え方読了
perl入学式放送局で西のazuma(猫)さんが紹介されていた書籍「UNIXという考え方」を読了。
いわゆる”ごく一般層”の人にとっては、パソコンの選択肢といえばWindowsかMacの2択でしかなく(MacOSXもつい数年前まではどちらかといえばマニア向けでしたね)、UNIX、Linuxなんてコンピューターマニアの人が使う別世界のものという感覚ではないでしょうか。(昔、ある日突然2chが終わるという事態をUNIX板の人が救ったというフラッシュアニメがありました。。。懐かしい。)
かくいう自分も、perlのコミュニティに参加する様になってから、MacOSXをCUIのターミナルから操作したり、初歩的なUNIXコマンドを覚えたり、Vim(やEmacs)といったエディタの使い方を覚えたり、といった事を「なんとなく」すすめていましたが、この本を読んで一歩深い”思想的なもの”の理解を深めることが出来ました。
そういう初心者の人に、是非おすすめの本です。古本でも意外と安いです。
この本は、いわゆる操作の入門書では無いので、パソコンを操作しながら読み進める本ではなく、UNIXというOSの設計思想の文章を読み進める本なので、この本で知識のバックボーンを理解してから’Linux操作入門’的な本を学習するとより効率が良いかなと思いました。(自分もこれから勉強します)
とりあえず読了しての覚え書き
・プログラムは小さく、単一機能を目指す
・小さいプログラムを繋げて大きな仕事をする
・その為のパイプとSTDIOの仕組み
・シェルスクリプトを使いこなす
・データは互換性の高いフォーマット、ASCIIテキスト形式で
・速度はハードの進化にまかせる。トリッキーなコードより、移植性(可読性)の高いコードを
プログラミングの学習が進めば進む程、必要な知識はどんどん増えていきますが、知識と知識が繋がって理解できると、結構楽しいですね。
perlのオブジェクト指向の第一歩
perlのオブジェクト指向の書き方って難しい。ぱっと見わかりにくい。いや、初心者には全然わからない。
で、色々調べてコードを読んでみて、perlのpackageについて自分なりに頭の中でとりあえず整理がついたので備忘録。
※簡単なクラスを作ってみて、その動きを簡単に整理したものなので、おそらく
もっと高度な書き方や違う方法もあるはず。とりあえず第一歩の理解を忘れないように書いてみました。
<作り方>
perlのクラス設計はpackageという一かたまりで表現されている。
・大文字で始まるクラス名.pmのファイルがクラス(設計図)。
・クラスファイルの一行目は、package 大文字で始まるクラス名
・(インスタンス)メソッドは、サブルーチンで表現する。
・(インスタンス)変数(群)は、1つのハッシュで表現する。keyが変数名、valueが値。
<使い方>
作ったクラスを利用するには、use クラス名 の宣言をすれば良い。
クラスの使い方で一番わかりにくかったblessと$selfと$classについて
・$classに入れられる(shift)されるのは、クラス.pmへの参照。
・$selfに入れられる(shift)されるのは、newメソッドを呼び出された時に生成されたハッシュへの参照。
・bless関数は、$selfと$classを関連付けする関数。
メソッド(振る舞い)はどのインスタンスでも同じだから、どのインスタンスからも大元のクラス名.pmを参照し、書かれているサブルーチンが呼び出され、実行される。
インスタンス変数は、それぞれのインスタンスで個別の値を持つ必要があるから、newで生成される毎にインスタンス変数群即ちハッシュが生成され、それぞれに参照される。
あと、$classとか$selfにshiftされてるのは、perlの仕様ということで今は深く考えない。(呼び出された時にそれ自身の参照が@_の最初に格納されていて云々・・・という感じ。)
と理解すれば、うまいこと参照を使って表現されているなーと腑に落ちました。
で、オブジェクト指向恒例の猫クラスを作ってインスタンスを作ってみました。
sub saysとsub lovesがメソッド定義、sub nameとsub colorがインスタンス変数の代入、出力のアクセサです。アクセサはサブルーチン呼び出し時に値の引数が有れば代入、なければ参照を返してます。
Nekoクラスを利用したコード。Neko.pmは ./TestPackages/Neko.pm に入れていたので、場所を指定したuse文となっています。
実行すると、それぞれの猫がちゃんと喋ってくれました。
<まとめ>
猫はかわいい。
次のステップ、継承、移譲はもう少し書式に慣れてから調べることにする。仕組みを理解し、イディオムを覚えてしまえば、どうって事無いはず・・・。