PerlとRubyがくしゅう帳

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

2013年08月

perl入学式放送局で西のazuma(猫)さんが紹介されていた書籍「UNIXという考え方」を読了。

いわゆる”ごく一般層”の人にとっては、パソコンの選択肢といえばWindowsかMacの2択でしかなく(MacOSXもつい数年前まではどちらかといえばマニア向けでしたね)、UNIX、Linuxなんてコンピューターマニアの人が使う別世界のものという感覚ではないでしょうか。(昔、ある日突然2chが終わるという事態をUNIX板の人が救ったというフラッシュアニメがありました。。。懐かしい。)


かくいう自分も、perlのコミュニティに参加する様になってから、MacOSXをCUIのターミナルから操作したり、初歩的なUNIXコマンドを覚えたり、Vim(やEmacs)といったエディタの使い方を覚えたり、といった事を「なんとなく」すすめていましたが、この本を読んで一歩深い”思想的なもの”の理解を深めることが出来ました。


そういう初心者の人に、是非おすすめの本です。古本でも意外と安いです。


この本は、いわゆる操作の入門書では無いので、パソコンを操作しながら読み進める本ではなく、UNIXというOSの設計思想の文章を読み進める本なので、この本で知識のバックボーンを理解してから’Linux操作入門’的な本を学習するとより効率が良いかなと思いました。(自分もこれから勉強します)


とりあえず読了しての覚え書き

・プログラムは小さく、単一機能を目指す

・小さいプログラムを繋げて大きな仕事をする

・その為のパイプとSTDIOの仕組み

・シェルスクリプトを使いこなす

・データは互換性の高いフォーマット、ASCIIテキスト形式で

・速度はハードの進化にまかせる。トリッキーなコードより、移植性(可読性)の高いコードを


プログラミングの学習が進めば進む程、必要な知識はどんどん増えていきますが、知識と知識が繋がって理解できると、結構楽しいですね。

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徹底攻略」の方はまだ未開封状態です。

このページのトップヘ