とりあえず多重継承をやめるよ
「プログラミング言語 Ruby」が一段落した*1ので、次の積読「まつもとゆきひろ コードの世界」を読み始めた。今、2章中盤くらい。
まつもとゆきひろ コードの世界?スーパー・プログラマになる14の思考法
- 作者: まつもとゆきひろ,日経Linux
- 出版社/メーカー: 日経BP社
- 発売日: 2009/05/21
- メディア: 単行本
- 購入: 50人 クリック: 1,711回
- この商品を含むブログ (110件) を見る
ずっと、「多重継承するとスパゲッティになるなぁ」と思ってたんだけど、いろいろ納得した。そおいうことかー!
Stream を継承した、ReadStream, WriteStrem があって、さらに ReadWriteStream を作るという話のとこで、「単一継承だとそうなるよね、どうするんだ?」とか思ったけど、そこで Mix-in ですか! Readable と Writable 作って、Mix-in ですよ。
Ruby は単一継承しかできなくて、こういう時どうするんだ、とか思ってたのも氷解した。やっぱり Module 作って include するのかなぁとか、ぼんやり思ってたのもだいぶしっくり来た。←というか、「プログラミング言語 Ruby ほんとにちゃんと読んだのかレベル」ですかねw
あと、Java などの静的言語における「仕様の継承」と「実装の継承」の話もあって、Java のインターフェイスは何となくわかった。Moose の Role は Java のインターフェイスじゃないとかって話題も少しわかった気がする。
Perl も Moose があるから、多重継承はなるべく避けて Mix-in しよう。今まで Angelos 見て何となくまねてたけど、だいぶわかったんじゃないか?
あああああ、モダン Perl 入門にも Moose の Role はそういうもんだって書いてあったね。わかってるねん、わかってるねんで!
この本おもろいなぁ。理解が進むって楽しいなぁ。スーパープログラマにはなれなくても、ヘボプログラマのヘボは取れそう。周りに迷惑をかけることも減りそう >_<
追記
そして次のページ読んだら、「多重継承は良くないものだ」というのは誤解と書いてあった。「うまく使わないと問題が起きることがある」だそうだ。
そして、「Mix-in は多重継承と別物ではなくて、多重継承の使い方のテクニックの一つ」とあった。なるほど−。
20分
演劇だったらだいぶ長い。小劇場系のお芝居で長くてもたいていは2時間、その中で主役クラスの長い独白があっても20分ってのはなかなか無いと思う。
観客を20分つなぎ止めていられる人は相当なものだと思う。
まぁ、芝居ではないので話す内容をちゃんと作って、ゆっくりしっかり話せば何とかなるよ。緊張すると絶対早口になるからなぁ。
資料が一つできたのでさっき練習したら「えーっと」言いまくってたw
kansai.pm でも何か連呼してたんだよなぁ。たぶん本番でも言うなぁ……。
もう一回やって言葉に詰まるところを見直した方が良いかもしれないな。
資料的には詰め込もうと思うと20分は結構短いかも。LazyWay はどうだろうなぁ。20分ぶんの資料作れるかなぁw 今日はもう帰って明日の夜やろ。
Object.send でメソッドを呼ぶ
ruby は変数に接頭辞がないから、perl で $obj->$method() みたいなことやるのにどうしたらいいんだろ、とか思ってたらプログラミング言語 Ruby に出てきた。
Object に send ってメソッドがあって、o.send :method_name で呼び出せる。
perl のこのコードは
my $hoge = Hoge->new; foreach my $method ( qw/one two three/ ) { print $hoge->$method() . "\n"; } package Hoge; sub new { bless {}, shift; } sub one { 1 } sub two { 2 } sub three { 3 }
ruby で書くとこんな感じ
class Hoge def one; 1; end def two; 2; end def three; 3; end end hoge = Hoge.new [:one, :two, :three].each {|x| puts hoge.send x }
今はリフレクション、メタプログラミングの章に入ってきたところ。
自分で作ったスクリプトを登録してグラフ作る
MRTG もそうなんだけど、デフォルトの memory usage が MemFree だけなので、Cached と Buffers も足したのを出すように変更した。(今考えたら cached と buffers を別途グラフにして、MemFree に stack すればよかった。)
新しくスクリプトを登録する
Data Templates を登録する
- Data Templates -> Add
- 適当に埋める
- Data Input Methods で登録したものを選ぶ
- 保存すると Custom Data が入力可能になるので編集する
- Grep String とかに引数で渡すものを追加する
使用する Data Templates を Data Sources に登録する
- Selected Data Template に Data Template で登録したものを選ぶ
- localhost を選ぶ
保存すると Data Source Path が表示される
Graph Templates を登録/編集する
- Graph Template Items に適当に登録する
- Data Source は さっき登録した Data Template を選ぶ
Graph Management で編集した Graph Template を確認する
追加した Data Source が None だったりしたら、Data Source を選んで保存しておく
何がどう絡んでるかは何となくわかった。どうせ覚えるなら RRDtool の使い方覚えた方が良さ気な気もした。グラフ化はわかりやすいけど、何のデータなのかわからんとダメだね。SwapFree が MemFree のグラフに乗っかってて見方を誤解してたり。
作った script
linux_memory2.pl MemFree で MemFree + Buffers + Cached
linux_memory2.pl SwapUsage で SwapFree - SwapTotal
#!/usr/bin/perl my $keyword = shift; if ( $keyword =~ m{MemFree} ) { $keyword = qr/(?:MemFree|Buffers|Cached)/; } if ( $keyword =~ m{SwapUsage} ) { $keyword = qr/(?:SwapFree|SwapTotal)/; } open(my $PROCESS, "/proc/meminfo"); my $total = 0; my %swap = (); foreach my $line ( <$PROCESS> ) { if ( $line =~ m{\A $keyword :? \s+ (\d+)}xms ) { my $value = $1; $swap{total} = $value if $line =~ m{SwapTotal}xms; $swap{free} = $value if $line =~ m{SwapFree}xms; $total = $total + $value; } } close($PROCESS); if ( exists $swap{total} && exists $swap{free} ) { $total = $swap{total} - $swap{free}; } print $total . "\n";