タグ:Perl ( 25 ) タグの人気記事
2013年10月24日の日記、あれこれタスク積もってます;
表題どおり、あれこれタスクが積もってます。

・19日にPerl入学式参加してきました。ブログ書かなきゃなんですが。。。

・Vimがいい感じにこなれて来ました。Perl入学式でマコピーさんに教わりました。(ただし hjkl でのカーソル移動は相変わらずあきらめモード。

・20日にGRANRODEOのファンクラブイベント「ロクデナシ!プラグナシ!」に行ってきました。

・Wordpressでサイト作成中です。ので近々(?)移籍します。

・iPhone5sにアクセサリつけましてめっちゃカッコいいです。が写真がとれない;iPhone3Gsを充電して撮る感じ?

などなど。。。
[PR]
by redchant | 2013-10-24 21:21 | 日記
2013年10月16日の日記、Mozillaらをバックアップ作戦!?
くたびれた;

仕事は定時でさっさと帰宅。やはりびしょ濡れ。
なんだかんだしてたら、22時になってしまいPerlの勉強どっしよっかなーと思って、そういえば Firefox とか Thunderbird のバックアップ全然とってないし、とるのも面倒いんだよなーと思って一念発起、Perlでバックアッププログラムを書いてみようと。

tarアーカイブしたいし、gzip圧縮したいしなのでCPANの出番だと。真面目にCPANに向かうのは初めてで、もちろんドキュメントは英語だし、使い方ビクビクしながら、遅々としてプログラミングしてました。
で、こんな時間になってしまい、明日は台風で西武鉄道が止まってる間は行かなくていいけども、西武線は風雨に強いし、どーしよっかなーと思ったけど、とりあえず完成度75%というところで今日はお終い。

スカスカの50行ぽっちのプログラムなんだけどね、くたびれたー;

c0050550_1454715.jpg

[PR]
by redchant | 2013-10-16 01:47 | 日記
hopeless...
さっぱりだ
読めば読むほどわからねー
c0050550_22104591.jpg


c0050550_2211738.jpg


[PR]
by redchant | 2013-10-10 22:19 | 日記
2013年10月09日の日記、ひたすらPerl!
・Oreilly刊の「詳説 正規表現」で正規表現の勉強。

もちろんPerlで。
そもそも正規表現を勉強するために Perl に入門したような気がするが。。。

全然すすまないし、なかなかおもしろいと感じるところが少ないのがキツイ。。。
まだまだ序盤;


・技評刊の「Perl徹底攻略」。

基本的な文法等の勉強ばかりで手つかずだった。もったいない。
始めてみたけど、Carton の存在意義がまだわからず。
今日はそこまで。

それから本書を改めてパラパラとめくってみたところ思ったこと。
YAPC::Asia前に購入したけど、参加した後だと、ネ申本だということがよくわかったっ!
執筆陣が豪華すぎる。
Perl が海外でどういう立ち位置にいるのか知らないけど、たぶんここまで充実したナウなPerl本は無いのではないかと思う。

ところで、Perl ってどうなのですか?
日本でだけ盛り上がってる?
日本でも・・・


・「すぐわかる オブジェクト指向 Perl」でオブジェクト指向/モジュールの勉強。

「Perl徹底攻略」に足りない話題と思ったので。
前半はすっ飛ばして。
Moose とか? Mouse とか? でこと足りちゃう感じですか?
よくわからないし、何ごとも「順序大事!」な不器用体質なので・・・


・Markdown

皆さんが、良く使用されているのでMarkdown記法でメモを取るよう気にしてます(今更;


今日は楽しかった。
[PR]
by redchant | 2013-10-09 23:38 | 日記
Hello, YAPC!

c0050550_0243648.jpg

YAPC::Asia 2013に参加してきました。
「家に着くまでは遠足」であるように「ブログを書くまでがYAPC!!」です。

c0050550_026456.jpg

他の方のブログ読みたいけど、発表スライド見たいけど、ファーストインプレッションで書きます。
以下、非常に長いです。

***********************

このブログはプログラミング・ITに特化したブログではないので一応説明が必要と思います。

YAPCとは


YAPCは、「やぷしー」と呼びます。「やっぷしー」でも良いみたいです。
YAPCは、Yet Another Perl Conference の頭文字です。
「Yet Another」というのは僕には訳せないのですが、簡単にいうと「公式ではない」という感じらしいです。
「公式である」でいうと、Appleだったら「WWDC」だったり、イメージ湧きやすいのだと、東京モーターショーだったり、東京ゲームショーだったり。
「Perl」というのはプログラミング言語のひとつです。
「Conference」は「会議」、「研究会」とか訳されたりしますが、「YAPC」の場合はそこまで堅苦しく意味しないようです。

僕とPerl


Perlを使い始めたのが今年の5月20日から。
唐突でした。
仕事では、Java や VB.NET などが多いです。まあこれはとりあえず書いただけですw
Perlを使うきっかけになったのが自分の「Webサイト作らなきゃ」ということが発端です。
で、WordPress で PHP って感じだったんですが、どうも PHP がおもしろくない。
つまらなくはないのですが、おもしろくないのです。
で LAMP の P が、PHP か Perl か Python というとこなので Perl を選択しました。
選択理由としては、
・名前をよく聞く
・小飼弾(@dankogai)さんのブログを読んでいる
・Pythonまったく存じません
というところです。
Rubyという選択肢もあったかと思いますが、小飼弾さんのブログ絡みで、

Perlの周りはおもしろい人が多い

というのが一番の理由になったのだと今思います。そして実感もしています。

〜YAPC


そんな Perl なのでどうせだったら「おもしろい人たち」に会いたい。
YAPC? 参加ポチリ。
Perl入学式? 参加ポチリ。
Perl入学式懇親会? 参加ポチリ。
YAPC懇親会? 参加ポチリ。
Perl入学式 in YAPC? おおっ!ポチリ。
Perl は僕を積極的にさせてくれます。

YAPC::Asia 2013 Day1 9/20


前夜祭は業務のため泣く泣くあきらめました。

1.今時のカジュアルなデータベース関連開発
初めてのセッション参加です。40分が短かった。正直さっぱりわからんでした。
トークは速いし、スライドはしゅんしゅん進むし、ついていけませんでした。
まあまだ自分が DB に接続するコード書いてないからが大きな要因です。

2.ランチセッション
超〜豪華なお弁当で感激しました。おいしかったです。

c0050550_0275241.jpg

自分サイトはWordPressと当初考えてましたが、Movable Typeで行こうかもと考え中。
MicrosoftのAzureは申し訳ないのですが全く興味がありません。でもプレゼンの方がPerlな方で面白かったです。
Perl を Windowsに標準で入れてください。(つまりサポートしてください。)

3.Vim実践入門
現在 Vim でコードを書いているので興味を持ったのですが、やはりトーク速い、スライドしゅんしゅん。
どうやらこのペースが標準らしいです;
内容は少し理解できました。
残念ながら僕は hjklキーでのカーソル移動はあきらめてます;
僕はどこでも、(環境でも自分でも)「標準」でありたいので、プラグインは導入しないと思います。
vimrcは少しカスタムしたいです。

4.Perlは他言語から(から|に)何を(学んだ|教えた)か
小飼弾さんのセッションだったのでとりあえず是が非でも聴講したかったのですが事件発生。
どうも部屋が空く様子がないなあとボーっとしてたら始まってた!クッ~、入れ替えなしか。。。
途中から床に座って聞きました。どうやらライブコーディングしているがプロジェクタは見えず。
しかし!
弾さんはお話しながら、聴講者を巻き込みながら、セッションするのです。
コード見えないのに内容がわかった。
これぞ「セッション」といえるものを見た気がします。
時間切れで終わり方が残念でした。なぜ20分。。。

5.LT Day1
技評のサイトを参考にさせて頂きました。(リンクは最後に。)

はじめに LT(Lightning Talk) すごい!
まさに Lightning!!!
すさまじかったです。
LTは、Perl でない人でも、IT でない人でも、体験すべき!

※すべてのLTについて書きたいのですが、際限無くなって途中で止めました。
個人的に印象的なトークについて書きました。

・yoshims85さん「ギークな異性を落とす魔法の言葉」
なにが Lightning だったかというと、会場を爆笑の渦に落とした Lightning!
c0050550_0321074.jpg


・sanematさん「Tachikomaで依存ライブラリの断続的バージョン上げ」
あ、あれ!?この人は?
懇親会で話しかけてくれたお人ではないですか!?
いま写真みてわかりました。失礼してしまったっ!
LTの内容も覚えてません!すみません!
なんかRubyの人って言ってたし!
懇親会ではとても気さくに話して頂けました。すげー体験だ。
あとで Tweet してみよう。。。

・yusukebeさん「YAPC::NA へ行ってきた」
Perl入学式でもお世話になりましたyusukebeさんでした。
「Webサービスのつくり方」「Perlについて語ろう」も読んでます。大変おもしろい内容の本です。
午後一だったか、HUB(慶大にはパブがある!)の前でお話かけさせて頂きました。
LT は Lightning ではなく、昨年ベストトーク賞獲得で行った「YAPC::NA」の経験をシェア。
ちなみに iPhone5s を手に入れたとか入れてないとかw

・egoproさん「んだっちゃだれ Sendai.pm」
Wikipedia
んだっちゃ、だれ〜 (そうに決まってるじゃん。「当然である」ことをいう時)

「んだっちゃだれ!」
「んだっちゃだれ?」
「んだっちゃだれ!」
仙台ではこんな感じで交際できるらしいです(だったかな?w)
スクリーンに YAPC::Tohoku と表示された時はちょっと感動モノでした。
表現したいことを簡潔に、完全に表現した、個人的にベストLTです。

・comewalkさん「オープンソースプロダクトに貢献するということ」
OSSに貢献することの大切さをトークされました。
スライドが非常にわかりやすく、こういうのをエコシステムと呼ぶのかな?
僕も実践します!

・songmuさん「Riji」
こちらのLTも爆笑がLightningでした。
なんと中国語! しかもスライドは英語!
中国語を聴きながら、英語を読みながら、日本語に訳すという稀有な体験をしました。
ブログが一瞬でできたのはスゴイ。

6.懇親会
はじめにsanematさん、まじすみません。ありがとうございました。
はじめて話しかけていただけたので、僕もその後リラックスしていろいろな人に話しかけることができました。

料理すごい!
ん万円包んでいくパーティより豪華でした!
お酒も際限なく!
お腹も気分も大満足でした。
Day1の締めくくり(実はその後新宿で呑みましたがw)はサイコーでした。


YAPC::Asia 2013 Day2 9/21


大変なミスをしてしまいました。
10時に日吉に着く算段で家を出発、電車にも乗ったのに、日吉に憑いたのが10時45分!!!?
なーぜー?
いや、理由はわかっているのです。
予定より早い時間の電車に所沢で乗ってしまい、それが副都心線に乗り入れず、池袋で副都心線乗り換えが徒歩で結構かかり(正直に言うと迷いました)、乗った電車が渋谷行きで、渋谷でまた乗り換えに時間がかかり、、、
前日に@yusukebeさんにトーク行くと約束したのに、
というか、当初のYAPCの目的は、@yusukebeさんの「Mojoliciousで作る!Webアプリ入門」と「Perl入学式」だっただけにYAPCが半分になってしまった気分になりました。。。
シェアされているスライドで勉強です(; ;)

ので、
1.Perl入学式 in YAPC::Asia 2013
Perl入学式は、第3回東京開催に参加させて頂きました。
今回もサポーターさんが多数でびっくりしました。
みなさん他のセッションは良いのですか?(特に Ruby vs Perl 見に行かなくて良かったですか!?)
本当にありがたいですが、どのような動機でサポーターをされてるのか気になります。
内容は WebAPI でした。
やはりインターネットから反応が返ってくるとおもしろい!
(cpanmに時間がかかってしまったのがもったいなかった;)
途中、小飼弾さんや「初めてのPerl」や「ラクダ本」の訳者の近藤嘉雪さんが様子見にいらっしゃいましたw
次回のPerl入学式も参加します!

c0050550_0325642.jpg


2.LT Day2

・kanさん「目指せ,テストカバレッジ100%」
まじでトークが速いよー、と半泣きで聞いた。
テストカバレッジについての話で、良いサービスがWeb上にあるがPerl対応してないけどモジュールで使えるよ、という。
ネットってすごいなと思いました。

・walf443さん「DBIx::RecordFactory」
やはり理解におよびませんでしたが、便利なんだなというのが感じられました。

・maka2_donzokoさん「今年のPerl同人活動報告」
Perl同人誌、買いました!

・barimiさん「初めてのPerl 〜つぶやいてないでコードかけ〜」
「マジか!!?」
Perl入学式 #3 の懇親会で目の前に座っていたのが僕です。
感じたことは「悔しい」です。
bot 作って LT もして。
悔しいです。

・papixさん「Perl入学式2013年度中間報告
Perl入学式でお世話になっている@__papix__さんですが、ネットでPerlを検索するとなぜかどこにでもいらっしゃいます。
すごい行動力とバイタリティを持っている人です。
こういう人がああいう人になっていくんだなあと思いました(w)

・takusさん「若者が Velocity Conferenceに参加して感じたPerlの現実」
技評サイトで知ったのですが、「Velocity Conference」というのはオライリー主催カンファレンスなのですね。
Perlの存在感がないとのことでした。Rubyとか熱いだったかな?
オライリー・ジャパンのサイトに行くとBookの一番上には Perl のカテゴリがあるんですよね。
気になってオライリーの本家(.com)を見にいってみましたが、特に Perl 推しということもなく Ruby でもなくアルファベット順でした。
オライリー・ジャパンに Perl Monger が書籍をよく買うとかとかの意図的な何かを感じましたw
Perlについては後で書くです。

3.Tomohiro Ikebeさん「management and Perl culture」
良い意味でも悪い意味でも印象的なトークでした。
先に悪い意味について触れます。
なぜ Perl を使っているのかについて「既存システムが Perl だったから」と。
その表現はなんだか残念だなあと思いました。
どうせなら、既存システムを Perl でどのような改善・拡張を行ったといった話が聞きたかった。
それから「Perl の文化は素晴らしいものである」と言う。
なにか「Perlは過去」という風に自分には聴こえてしまって残念だった。
だってこれから Perl をやろうとしているのだから。

次に良い意味で。
マネージメントについての話はとても勇気になりました。
エンジニアにはマネージャーが必要です。そのことがはっきり感じられました。
あと、「livedoor Blog 10th」10年続くサービス、確かにスゴイ!
これは Perl だから成し得たものと思える。

4.クロージング
運営をされた、牧さん、櫛井さんは運営を退くとのことです。僕の初めてのYAPCで切ない話でした。
でも YAPC は CARRY ON です。
カッコいいスライドでした。

ていうか、みなさん意外と(?)お若くて orz

***********************

こんな、YAPCでした。
最近、業務が忙しくて Perl 触ってなかったのは、反省点であると共に新たな刺激になりました。
あと、以下を実行します。

・MovableType(?)でさっさと自分サイト作成
・OOP
・pm作りたい(*1)
・トークやりたい
・Webアプリ
・できれば iPhoneアプリ
・できれば アンドロイドアプリ
・転職?

barimiさんによると自分に締め切りですね;
業務の都合上現在は締め切りつけられませんが早々に実行に移したいと思います。

200 OK


技評さんのレポート
YAPC::Asia Tokyo 2013 スペシャルレポート


*1
埼玉県所沢市近辺で PM 作りたいです。
なんだか疎外感ある埼玉県西部。
浦和・大宮にいくよりも池袋・新宿が近い。
埼玉アイデンティティ低い。(でも大好き埼玉!)
土曜・日曜に勉強会に都内にまで行かなくてもPM。
できれば、トトロ.pm(totoro.pm)という名称がいいです。

200 OK
[PR]
by redchant | 2013-09-24 00:37 | 日記
2013年08月25日の思ひ出、Perl入学式 in 東京 #3 に行ってきました!
アップが遅くなりましたが、8月25日(日)に、Perl入学式 in 東京 #3 に行ってきました。
(※日付間違ってたので直しました。2013年08月28日→2013年08月25日)
c0050550_20261498.jpg
こんなTシャツ着てました。
犯罪係数はこの通りではありませんのでご心配なく。

色々初物尽くしでした。
①五反田初下車
  ・街についてもっと雑多なイメージを持っていたんですが、(意外に(失礼;))キレイな街でした。
②初勉強会
  ・いい年ぶっこいて勉強会に初参加です。埼玉居住・勤務を言い訳にしてみる。
③もちろんPerl入学式も初。
④もちろん懇親会も初。

会場は、株式会社ガイアックスさまにて。
キレイなオフィスに感動した。(やっぱこうあるべきだよな、と泣く。)

開催時間は、13時~17時。
五反田で東西南北がわからなくなり、ちょっと迷子気分。
ギリギリセーフ。
(これからは地図の読めない女子に優しくしてあげようと改心。)
会場には、既にたくさんの参加者&サポーターさんが。。。焦;

さて、勉強会の内容の話。
・配列::More
・ハッシュ
・リファレンス

時間があっという間でした。
4時間はあっという間でした。
なにしろ、時計を確認することができないほど夢中になってしまいましたので。
あまり記憶がないですw

最後の問題は本当に難しかったけど、テーブルに付いてくださった@risouさんと@__papix__さんにアドバイスしてもらってなんとか出力したいことは出力できた!
だけど、「あの辺は、もっとこうやりたい、ああやりたい」があるので復習です。


<< 以下、勝手なことを書きます。独り言と思って頂いて。。。(/_;) >>
①席が遠かった
②故にスライドが少し見づらくてスライドとPCを交互に見ていてついていくのが大変だった
③追い打ちに@__papix__さんのトークが速すぎました(文句ではありません!);
④さらに追い打ちに@__papix__さんのコードタイピングが速すぎ→実行・実行結果→話に戻る、が速すぎて、コードの理解・実行結果の理解が追いつかなかった(文句ではありません!);


<< 以下、勝手な要望を書きます。独り言と思って頂いて。。。(/_;) >>
①勉強会中でも話が挙がってましたが、最後の問題は本当に難しかったです。でもレベルは下げて欲しくない。優しいレベル、難しいレベルと2問用意してもらえると本当にありがたい。


懇親会にも、果敢にも、参加させて頂きました。
<< 以下、勝手なことを書きます。独り言と思って頂いて。。。(/_;) >>
①懇親会、壁たけー!
  何の話をしているのかほとんどわからなかったです。
②でも、ちょっとした話でもプログラムに話(アイデア)がつながっていって面白かった。
③有名なPerl Mongerの話が聞けて面白かった、興味深かった。
  特に、ブログをよく拝見している小飼弾さんの話は笑いました。
④@__papix__さんとまこぴーさん(@mackee_w)はすごく愛されキャラでした。
⑤さらに、まこぴーさんは癒されキャラでもあるようだ。
⑥参加したのはサポータさんだけでしたか?(自分以外)
  Perl入学式の懇親会の入会式みたいなのがあったら・・・笑
⑦ゆーすけべーさんに話しかけたかった・・・
  ・話しかければよかったんですけど照れ屋さんで臆病なのでw
  ・「Perlについて語ろう」について聞きたいことがあったのですが。あとでTweetしてみる。
⑧他、お名前の出てきた知らなかった人達&会社さん
・おもしろほうじんかやっくさん
・まきさん
・もずにおんさん
・とくひろむさん
・おもろきさん
・そんむーさん


ということで、楽しかったんです。
「楽しかった」のが伝わらなそうな文章ですが、楽しかったんです。

主催された@__papix__さん、テーブルについて頂いた@risouさん、他サポーターの方々、参加された方々お疲れ様でした、ありがとうございました。

次回も(YAPC::Asia含め)参加予定です。よろしくお願いいたします。
(`・ω・´)ゞ


最終問題の僕のコード。
#! /usr/bin/env perl
use strict;
use warnings;

my $person1_hash_ref = {
name => 'person1',
foods => [qw( food1 food2 food3 )],
};

my $person2_hash_ref = {
name => 'person2',
foods => [qw( food1 food2 )],
};

my $person3_hash_ref = {
name => 'person3',
foods => [qw( food1 )],
};

my @person_hash_ref_array = (
$person1_hash_ref,
$person2_hash_ref,
$person3_hash_ref,
);

my %rank;
my @foods;
for my $person_hash_ref (@person_hash_ref_array) {

@foods = @{$person_hash_ref->{foods}};

for my $food (@foods) {
$rank{$food} += 1;
}
}

# %rankのデータ構造
# key = 食べ物の名前
# value = 数(この食べ物を好きな人の数)

my @sorted = sort {$rank{$b} <=> $rank{$a}} keys %rank;

print "ランキング" . "\n";
for my $key (@sorted) {
print "$key=$rank{$key}" . "\n";
}


実行結果。
ランキング
food1=3
food2=2
food3=1

[PR]
by redchant | 2013-08-30 22:09 | 日記
2013年08月21日の日記、再帰呼び出し
もお! 再帰呼び出しってば難しいんだから!!!

「続・初めてのPerl」の9章の練習問題4はそんな問題でした。
どんな言語でも一発ではうまく作れない。
この問題の場合は目安の時間は20分だったけど、なんだかんだ2時間くらいかかったw

再帰呼び出しって何かって説明します。
再帰呼び出しは、関数Aがあったとしてその中で関数Aを呼び出すような、呼び出しですw
具体例を挙げると、ディレクトリ構造とか。
会社の組織構造とか。
社長がいて、営業部があって、1課があって5人いて、2課があって3人いて、開発部があって10人いて、、、
なんか会社組織が詳しくないのであまり深くなりませんでしたが、「部」とか「課」がディレクトリ(フォルダ)で要員がファイルって感じです。
再帰呼び出しはディレクトリとファイルを列挙する例題がよく出されます。
同じ処理を繰り返してますよね。

社長のファイルがあるので表示、
営業部があるので営業部を掘る、
1課があるので1課を掘る、
5人のファイルがあるので5人表示、
上に処理が返されて、2課があるので2課を掘る、
3人のファイルが2人表示、
上に処理が返されて、(もう他にファイルorディレクトリがないので)上に処理が返されて、
開発部があるので開発部を掘る、
10人のファイルがあるので10人表示、
てな処理です。

自分なりにプログラムしたのが以下です。
#! /usr/bin/perl

use strict;
use warnings;

my $fh = *STDOUT;

&read_dir($fh, 0, ".");

sub read_dir {

my $fh = shift;
my $level = shift;
my $path = shift;

if (-f $path) {
print {$fh} " " x $level, $path, "\n";
}
if (-d $path) {

opendir my $dh, $path or die $!;
my @files = readdir $dh;
closedir $dh;

unless (@files) {
print {$fh} " " x $level, $path, ", empty directory.\n";
} else {
print {$fh} " " x $level, $path, " contains\n";
$level++;
for my $file (@files) {
next if ($file =~ /^(\.|\.\.)$/);
if (-d "$path/$file") {
&read_dir($fh, $level, "$path/$file");
} elsif (-f $file) {
print {$fh} " " x $level, $file, "\n";
}
}
}

}
}

なんだか、長ったらしくて恥ずかしいですが、いろいろ苦労して思う通りに出力できたので良しです!
【追記】
ちなみにハマったところは、「unless (@files)」の文です。
@filesをfalseとして判断するのはどうすればいいのかってところで。
unless以外もありますか?(あるだろうなあ。。。)
. contains
_template.pl
./alpaca_files contains
./alpaca_files/ch03 contains
./alpaca_files/ch04 contains
./alpaca_files/ch06 contains
./alpaca_files/ch11 contains
./backup contains
./backup/dir_ch08.06.02 contains
./backup/test1dir contains
./backup/test2dir contains
./backup/test3dir contains
_template.pl
ch09.07.pl
ch09.09.01.pl
ch09.09.02.pl
ch09.09.02_from.pl
ch09.09.02_to.pl
ch09.09.03.pl
ch09.09.03.pl~
ch09.09.04.pl
ch09.09.04.pl~


解答サンプルとしては、一度データを再帰的な構造に詰めて、そのデータを順次表示しています。
再帰的な構造とは、ハッシュでディレクトリ構造を表すことです。
データ取得とデータ表示で使い分けができるのでこちらのほうが先々便利そうですが、2回ループします。
僕は1回です!

(正直、解答サンプル見た時は「ずりぃ」と思いましたが。。。)

まあ、そんな感じで今日はあっという間に時間が過ぎてしまいました。
[PR]
by redchant | 2013-08-21 23:18 | 日記
2013年08月03日の日記、正規表現
そういやあっちゃそういやあなんですけど、
Perlを始めたきっかけは正規表現を学びたいから。
それがいつからかPerlメインになってきて。

でも、結城浩先生の「Perl言語プログラミングレッスン入門編」や
「初めてのPerl」、「続・初めてのPerl」と続けてきて、なかなかに正規表現も身につけているのを今日実感した。

まあ、やったことはダサくて、サクラエディタで正規表現で置換の繰り返し。。。

でも、妙に効率よくプログラミングできて(ASP.NETだけど;
PerlからVBを吐くかw
[PR]
by redchant | 2013-08-04 01:08 | 日記
2013年08月02日の日記、「続・初めてのPerl」7の5
JavaScriptでクロージャのことは理解したと思ったけど思ってただけだった;
「続・初めてのPerl」の第7章のセクション5の出来事です。
自分の頭の整理も兼ねて、もし誰かの役に立てば。

以下、ソースコードです。
わかりやすくするために、コメントと記述順を変えました。
#! /usr/bin/perl

# ディレクトリのサイズを計算するプログラム

use strict;
use warnings;
use File::Find;

# サイズを知りたいディレクトリ名の配列
my @dirs = qw( test1dir test2dir test3dir );

# 各ディレクトリとそれに対する2つの関数(ファイルサイズ加算とGetter)をハッシュに登録する
my %subs;
for my $dir (@dirs) {
# 下方で定義している関数を呼び出す。
my ($callback, $getter) = create_callbacks_sum_size();
$subs{$dir}{CALLBACK} = $callback; # ファイルサイズ加算関数
$subs{$dir}{GETTER} = $getter; # Getter
}

# 各ディレクトリを調査する(ファイルの探索はFile::Find::findにおまかせ)
for my $dir (keys %subs) {
# ファイルを見つけてはCALLBACK関数に渡す。つまりファイルサイズ加算している。
find($subs{$dir}{CALLBACK}, $dir);
}

# 結果を表示する
for my $dir (sort keys %subs) {
my $sum = $subs{$dir}{GETTER}->(); # ディレクトリサイズ取得
print "$dir has $sum bytes\n";
}

# 2つのクロージャのリファレンスを配列にセットして返す関数定義
sub create_callbacks_sum_size {
# クロージャされる変数。(ディレクトリ内のサイズを保持する)
my $total_size = 0; # 以下の2つのクロージャで使用する変数の初期化
return (
# クロージャその1:ファイルのサイズを $total_size に加算する。
sub { $total_size += -s if -f ; },
# クロージャその2:$total_size を返す。
sub { return $total_size; },
);
}

上記のプログラムで create_callbacks_sum_size が返している関数(のリファレンス)がそれぞれクロージャです。
このサンプルでは2つ返したいので配列にセットして返してますけど。
なにをクローズしているかというと $total_size です。
クロージャ、クローズとかいってますけど、要は内包しているってことです。
なにがつまづくって $total_size は create_callbacks_sum_size関数が終わったら使い捨てられそうなのに使い続けられるからです。
なにから使われるというと、create_callbacks_sum_size関数が作った2つの関数(クロージャ)でです。
つまり、$subs{$dir}{CALLBACK}にセットした関数と$subs{$dir}{GETTER}にセットした関数は生きているからです。

この感動伝わりますかね?w
Perlはオブジェクト指向プログラムも作れるのでクラスとかフィールドとかメソッドとかいうのでこんなの惑わないのかもしれないけど、まだそこまで行ってないので感動なのです。
[PR]
by redchant | 2013-08-02 23:08 | 日記
2013年07月24日の日記、Perl - リファレンスが難しい・・・
もお、Perlのリファレンスがむずかしい!
本当に理解できるようになるかな?
心配だっ(> <)

でも、この「続・初めてのPerl」はリファレンスについてはとてもわかりやすい説明がされてると思う。
「プログラミングPerl」はもっとわかりやすいかな?
深すぎてついていけないかな?;

さて、ぼくのグチを聞いてもらうために、リファレンスについて説明してみる。
説明してるうちに理解が深まるかもだし。

リファレンスはC言語でいうところのポインタです。(Cで言うなって?w)
簡単に説明するためあえて間違った言い方で説明すると、
ポインタはコンピュータ上のとある場所を指します。
それだけです。
よくある説明だと「住所」とか言います。
「なんだ簡単♪」と思うかもですが、簡単なのはここまでで。

住所がわかったところで、そこにあるデータ、ここでは「建物」が問題なのです。
とある住所にいる人に会いに行くとしましょう。
一軒家なら簡単です。
じゃあ、アパートでは?
階段を登ったり、ドアをいくつか通りすぎなければならないかもです。
じゃあ、会社のビルだったら?
小さな会社だったら直に4階にエレベータで上がって、営業部に行って呼んでもらうかもしれません。
じゃあ大きな会社だったら?
複数の会社が入ったビルだったら?
結構大変でしょ?

実は英語の「data」という単語は複数形だったりします。
「datum」という単語が単数形です。まあ、これは余談です。

で、C言語で言うところのポインタが、Perlで言うところのリファレンス(参照)です。
リファレンスを使って、ある人に会いに行くことをデリファレンスといいます。
リファレンスというより、デリファレンスが難しいのです。

さらにやっかいなことは、Perlのそのデータ参照(デリファレンス)のやり方が複数あることです。
Perlの標語的なものがあるのですが、

「やり方はひとつじゃないぜ!」

っていうのは確かに本当です。
(本当の本当はデータアクセスの方法のことじゃないんですけど。。。)
でも、そこは初心者には高い壁にはなっているでしょうね。

最後にデリファレンスの例です。

# 例とする為、ちょっと無意味なハッシュデータを2つ作る
my %gilligan_info = (
name => 'Gilligan',
);
my %skipper_info = (
name => 'Skipper',
);

# ハッシュのリファレンスを配列にセットする
my @crew = ( \%gilligan_info, \%skipper_info );

my $datum;# あえて datum に登場してもらいましたw

# 以下、処理を実行!

$datum = ${$crew[1]}{name};
print "1: $datum\n";

$datum = $crew[1]{name};
print "2: $datum\n";

# crew配列のリファレンスを取得
my $ref = \@crew;

$datum = ${@{$ref}[1]}{name};
print "3: $datum\n";

$datum = ${$ref}[1]{name};
print "4: $datum\n";

$datum = $$ref[1]{name};
print "5: $datum\n";

$datum = $ref->[1]->{name};
print "6: $datum\n";

$datum = ${$ref}[1]->{name};
print "7: $datum\n";

$datum = ${${$ref}[1]}{name}; # 最凶バージョン?
print "8: $datum\n";


なんと、このプログラムの結果表示は!
1: Skipper
2: Skipper
3: Skipper
4: Skipper
5: Skipper
6: Skipper
7: Skipper
8: Skipper


この例だと8通りのデータアクセス方法がありました。
まあ、リファレンスをわざわざ使ったからですが、まだ方法あるのでしょうか?
ちなみにこれを正しく実行するのに結構トライ&エラーしました orz

リファレンスこんな感じです。
でも、なんとかして Perl を身につけたいので頑張ります!
[PR]
by redchant | 2013-07-24 23:00 | 日記