PerlとRubyがくしゅう帳

プログラミングの勉強会の参加記録や学んだことなど。 twitter ID : @tomcha_です。 最近は主にPerl関連の勉強会やコミュニティに参加しています。

カテゴリ: 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文となっています。



実行すると、それぞれの猫がちゃんと喋ってくれました。

neko


<まとめ>
猫はかわいい。

次のステップ、継承、移譲はもう少し書式に慣れてから調べることにする。仕組みを理解し、イディオムを覚えてしまえば、どうって事無いはず・・・。

 

※ 先日のnamba.pmで、ブログ記事にする許可を頂いたので書きました。

いつもコンテンツ力の高いツイートで楽しませてもらっている某職質王氏にインスパイアされて、perl鍋という、ミニハッカソン?みたいな勉強会で、twitterAPIを題材にプログラムを作ってみました。
 

コンテンツ力の高さ・・・それは言葉のセンスもさることながら、次から次へと脳から湧き出る脳内物質まかせに紡ぎ出される、怒涛の連続ツイートではないでしょうか。


ということで、連続ツイートをしている時の脳内の状態を数値化してみようと考え、ツイートしている時に出ている脳内の汁dopamineの出る速度を数値化してみました。

書いたコードはこんな感じです。



TwitterAPIから色々な人のTLを取得する方法は、Net::Twitter::Lite::WithAPIv1_1オブジェクトを使用し、user_timelineメソッドの引数'user_id'に対象の人のtwitterID番号を設定しメソッドを実行すれば、TLの内容が配列のリファレンスで取得できるのでそれをデリファレンスして使用します。
配列(リファレンス)の中身も、ハッシュのリファレンスが入った、複雑な入れ子構造になっているので、Data::Dumperで中身の階層と必要なデータ位置を確認してやる必要があります。
膨大な入れ子構造のままだと把握しにくかったので、今回は必要なデータ(ツイートされた時刻)だけ取り出して新たな配列に格納、それを基礎として色々処理しました。
TLをごっそり取得って、某職質王氏の提唱するネットストーキングを支える技術っぽいですね。


さて、このコードを使って色々な人の数値を測定し実験してみました。ちなみに汁速度の単位はnionと勝手に命名しました。


まずは、Perl入学式のP総裁の脳汁量

papix氏

普通にtwitterを使っているとこんな感じでしょうか。
 
 

次に、リスペクトする面白エンジニアh先生の脳汁量

hisaichi氏

さすがですね。100 over、200 overもありますね。


最後に、このコードを書く動機付けとなった、職質王氏の脳汁量

moznion氏

連続ツイートの数が多いです。しかも、最高値、350 over?!コンテンツ力、凄い!




書いたコードの課題点

・変数や関数等の名前の付け方が適当すぎて、自分でもわかりにくい。元々、数カ月前に途中まで書いたコードの続きを作ったのですが、前書いたコードを自分で読んで、分かりにくかったのは問題。


・思いつくままにダーッと書いたコードなので、別のプログラムでも再利用したり、読みやすくする為に、いくつかのサブルーチンに分けた方が良いのかな?と思った。
->namba.pmで、「そもそも再利用しようとしてコードを分割し、成功した試しがない。コードは再利用も視野に入れて設計し予め小さな単位で書く意識が必要」と教えて頂きました。なるほどです。



最後に

面識がほとんど無いのに、勝手にネタにしてすみませんでした。勝手にネタに使わしてもらったのに、快くブログ記事の許可を頂きありがとうございます。




※ twitterAPIで測定対象のツイートを取得し、3分以内のツイートを連続ツイートとみなし、速度を計測。

※※ 連続ツイート数が10を超えると、脳内がかなり危険なトランス状態に違いないという推測で、評価数値がぐんと上がる様にバイアスをかけてみました。

~perl入学式の部~

先週、perl入学式#3にゆるふわサポーターとして参加して来ました。サポーターとしての参加は2回目。

今回の目玉は、講師がスペシャルゲストの @moznion 氏。 かなり笑いをとってたのが印象的でした。個人的には、ライブでコンテンツ生成の現場を見ることが出来たのが良かった。


昨年と違って、

・今年は隔月開催となり1回の講義で学習する量が増えた

・時間の都合上?冒頭の前回までのおさらいが省略された


前者は、1回の講義で詰め込む量は増えたけれど、講義資料はネットで見られるし、何より1回の参加で出来ること(使えること)がたくさん増えるので、復習も楽しく捗りそうで昨年より良いかも。


後者は途中参加や、前回欠席組のパターンはつらいかなーと思いました。自身で前回までの資料を自習するしかないく、その部分はメールやTwitterでフォローする仕組みがまだ浸透していないのかな、と。

自習・復習して分からないところがあれば、遠慮無くTwitterで質問を投げれば、ガチサポーターの皆様方が丁寧に教えてくれますよ!



~namba.pmの部~

今回の目玉は、八王子から参戦のスペシャルゲスト @moznion 氏。こちらでもコンテンツ力をこれでもかというくらい、発揮しておられましたですね。

個人的に聞きたかったTestの話や考え方を聞けたのは大きかった。自分のような趣味でコードを書いている者にとっては、こういう場って、人の繋がりとリアルな現場の知識が増える貴重な場だったりするので、非常に有意義でしたし楽しいです。


一枚LT以降、後半から二次会にかけては、もう、酒が回ってひたすら楽しい時間でした。

非常に良いコミュニティですね。是非次回も参加したいものです。いや、YAPC::ASIA2013の方が先かな。


あと、氏の提唱するネットストーキングを支える技術、perl鍋で作ったスクリプトのブログ記事公開の許可を貰えたのも大きかった。みなさん、心が広い!

PerlでのTest駆動開発にチャレンジ


最近読み進めている「web開発の基礎徹底攻略」に、Rubyをサンプルとしたテスト駆動開発のやり方の記事が載っていたので、Perlでも試してみました。


ずっとオレ流でコードを書いているので、最近は名前の付け方、テストの書き方など、一歩深く学びたいなーと思っていたところに調度良い教材があったので、試してみました。


本の記事では、RspecというRubyのモジュールを使って、RubyでFizzBuzzクラスのコードを書くという記事だったので、Perlで試すにあたって、


・オブジェクト指向はまだ良くわかっていないので、sub fizzbuzzというサブルーチンを完成させる。

・fizzbuzz.plというファイルに、sub fizzbuzz というサブルーチンを作成し、引数を1つ与えると対応する値を返すコードとした。

・テストに使用するモジュールは、昨年のPerl入学式で教わったTest::Moreというモジュールを使う。

とい風にアレンジしてみました。


PerlでTestを書くにあたり、参考にさせていただいたサイトはxaicronさんのこちらの記事。


まずは、テストモジュールの土台を書いてみる。ファイル名の拡張子は.t。

use strict;
use warnings;
use Test::More;

#ここにテストを書いていく。

done_testing;


そして、テスト対象のモジュール名はfizzbuz.plとし、対象モジュールが読み込めるかのテストを書く。


require_ok( 'fizzbuzz.pl' );


テストは、記事の順序通り、テストを1つ増やして->通るコードを書き->コードを整理する(リファクトたリング)のサイクルを進めていきます。進め方は非常に丁寧に解説されており、初TDDの自分にもわかりやすい非常に初心者向けの良記事です。同じ手順を書いちゃう訳にはいかないので、最終的に出来上がったテストコードがこちら。



出来上がったFizzBuzzのコードがこちら。




テストが全て通ると、こんな感じに。

fizzbuzz


簡単なテスト駆動開発を試してみて感じたことは、fizzbuzzの最大の落とし穴、15の倍数の時(fizzbuzzを返すとき)のケースをテストで書いておけば、確実にコードの穴が発見出来て素晴らしって事です。

今までは頭の中だけでコードを考えて、いざ「出来た!」って動かしてみた時、自分自身で想定できていなかった事がポロポロあったのが、テストをちゃんと書いておけば防げるんだなーと思いました。


今後の課題は、もっと実用的なテストコードを書けるようになりたい。


しかし、「web開発の基礎徹底攻略」は初心者にとって、本当に分かりやすくていい本ですね。おかげで「Perl徹底攻略」の方はまだ未開封状態です。

perl徹底攻略の本を買いに行った時、並んでおいてあったweb開発の基礎徹底攻略が初心者には良い感じの本だったので購入し、こちらから読み始めました。

プログラミング言語(スクリプト言語)を学んで、色々webアプリを作るとなると、プログラミング言語以外にも色々な必要な知識が必要なことがわかってきた自分にとって、この本は超初歩的なことから解説してあるとても良い本です。(まだ読み始めたところですが)

perl入学式に入学するまでは、「perlってcgiとかいう掲示板つくるやつですよね?」的な非常に誤った認識をしていたので、cgiについて理解を深めるためにサンプルコードを試してみた。(P11 リスト1 ちなみに、リスト1の最後の行にヒアドキュメントの終端記号EOFを書かないと動きません。ミスプリ?)

まずは、MacbookAir単体でwebサーバーApacheを起動してCGIを試せる環境を設定。

参考にしたサイトはこちら

まず、MacOSX Mountain LionでApacheを使う為には、ターミナルからCUIで設定するしか方法が無いらしい。ターミナルで sudo -s コマンドでスーパーユーザーになって、apacheの設定ファイル

/etc/apache2/httpd.conf

を編集。

自分の環境では、ApacheからCGIが使えるようになる設定文

#AddHandler cgi-script .cgi

が397行目にあったので、#を消して有効にする。

自分のホームディレクトリに置いた実験用cgiファイルを実行できるように、

/etc/apache2/users/ユーザー名.conf

を編集。options の行末にExecCGIを追記。

Apacheの起動、停止、再起動はスーパーユーザー権限でターミナルで以下のコマンドを打つ。

apachectl start

apachectl stop

apachectl restart

ホームディレクトリ/sites/ の中にcgiのサンプルコードを置き、ファイルのパーミッションを755に変更、そしてブラウザからlocalhost/~ユーザー名/サンプルコード.cgiにアクセスすると、ブラウザにperlのコードの実行結果がきちんと表示されました。

今回学んだCGIの使いかた

・perlのコードのファイル名を.plではなく、.cgiにする。

・print命令で標準出力に出力されたhtmlを記述したテキストデータが、cgi -> webサーバ を通じて、クライアントのブラウザにhtml形式で返され、表示される。

cgi、ちょっとしたスクリプトなら、コードを書く手間は非常に楽。ブラウザで結果を手軽に確認できるのでこれはこれで面白かった。

ちょっとした実験なら、cgiも便利。

このページのトップヘ