とりあえず多重継承をやめるよ

プログラミング言語 Ruby」が一段落した*1ので、次の積読まつもとゆきひろ コードの世界」を読み始めた。今、2章中盤くらい。

まつもとゆきひろ コードの世界?スーパー・プログラマになる14の思考法

まつもとゆきひろ コードの世界?スーパー・プログラマになる14の思考法

ずっと、「多重継承するとスパゲッティになるなぁ」と思ってたんだけど、いろいろ納得した。そおいうことかー!

Stream を継承した、ReadStream, WriteStrem があって、さらに ReadWriteStream を作るという話のとこで、「単一継承だとそうなるよね、どうするんだ?」とか思ったけど、そこで Mix-in ですか! Readable と Writable 作って、Mix-in ですよ。
Ruby は単一継承しかできなくて、こういう時どうするんだ、とか思ってたのも氷解した。やっぱり Module 作って include するのかなぁとか、ぼんやり思ってたのもだいぶしっくり来た。←というか、「プログラミング言語 Ruby ほんとにちゃんと読んだのかレベル」ですかねw

あと、Java などの静的言語における「仕様の継承」と「実装の継承」の話もあって、Javaインターフェイスは何となくわかった。Moose の Role は Javaインターフェイスじゃないとかって話題も少しわかった気がする。

PerlMoose があるから、多重継承はなるべく避けて Mix-in しよう。今まで Angelos 見て何となくまねてたけど、だいぶわかったんじゃないか?

あああああ、モダン Perl 入門にも Moose の Role はそういうもんだって書いてあったね。わかってるねん、わかってるねんで!

この本おもろいなぁ。理解が進むって楽しいなぁ。スーパープログラマにはなれなくても、ヘボプログラマのヘボは取れそう。周りに迷惑をかけることも減りそう >_<

追記

そして次のページ読んだら、「多重継承は良くないものだ」というのは誤解と書いてあった。「うまく使わないと問題が起きることがある」だそうだ。

そして、「Mix-in は多重継承と別物ではなくて、多重継承の使い方のテクニックの一つ」とあった。なるほど−。

*1:Ruby プラットフォームの所に差し掛かったけど、もう使いながら見た方がよさそう。

20分

演劇だったらだいぶ長い。小劇場系のお芝居で長くてもたいていは2時間、その中で主役クラスの長い独白があっても20分ってのはなかなか無いと思う。
観客を20分つなぎ止めていられる人は相当なものだと思う。

まぁ、芝居ではないので話す内容をちゃんと作って、ゆっくりしっかり話せば何とかなるよ。緊張すると絶対早口になるからなぁ。

資料が一つできたのでさっき練習したら「えーっと」言いまくってたw
kansai.pm でも何か連呼してたんだよなぁ。たぶん本番でも言うなぁ……。

もう一回やって言葉に詰まるところを見直した方が良いかもしれないな。

資料的には詰め込もうと思うと20分は結構短いかも。LazyWay はどうだろうなぁ。20分ぶんの資料作れるかなぁw 今日はもう帰って明日の夜やろ。

[Keynote] Keynote のテーマを作る

ちなみに自分の KeynoteiWork 06 の Version 3。

  1. スライドを新規に作成、テーマは白紙がいい
  2. メニューの[表示]→[マスタースライドを表示]で左側にマスタースライドが出る。
    • マスタースライドに絵を置いたりしていくとウインドウに付いてるメニューからマスターで選択できるようになる
  3. 使いたいマスターを全部編集したら、[ファイル]→[テーマとして保存]で、保存

これで次回からテーマとして選べて、選択すると作ったマスタが使えるようになる。

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
}

今はリフレクション、メタプログラミングの章に入ってきたところ。

週末日記

土曜日は陣馬山に登った。かなり一日が長く感じたのがよかった。帰る頃にはリフトに乗ったのが昨日かと思うくらい。

以前であれば、翌日は寝つぶすことが多かったんだけど、日曜日は会社のエアコン取り替え工事のため、朝8時に会社へ行き、エアコン工事のおじさんと談笑しつつ、lazy-people.org の cacti をいじるw

そのまま、ちょっとした雑務を片付けて、15時くらいにお昼を取って家に帰って、残ってる洗濯ものとかした。ズボンの泥が落ちてなかったw

今週末はなかなか充実したなぁ。(ちなみに先週末は実家に帰ってました。近い距離にもかかわらず約半年ぶりw サーセンw)

自分で作ったスクリプトを登録してグラフ作る

MRTG もそうなんだけど、デフォルトの memory usage が MemFree だけなので、Cached と Buffers も足したのを出すように変更した。(今考えたら cached と buffers を別途グラフにして、MemFree に stack すればよかった。)

新しくスクリプトを登録する

  1. Data Input Methods -> Add
    • Name は適切に
    • Input Type は Script/Command を選択
    • Input String は script の path を指定
      • cacti の path に replace される
      • は Input Fiels に追加したものが配置される
  2. 保存すると Input Fields と Output Fileds が入力可能になるので編集する
    • 引数に渡したいものなどを Input Fields に
    • Output Fileds はスクリプトの出力内容

Data Templates を登録する

  1. Data Templates -> Add
    • 適当に埋める
    • Data Input Methods で登録したものを選ぶ
  2. 保存すると Custom Data が入力可能になるので編集する
    • Grep String とかに引数で渡すものを追加する

使用する Data Templates を Data Sources に登録する

  1. Selected Data Template に Data Template で登録したものを選ぶ
  2. localhost を選ぶ

保存すると Data Source Path が表示される

Graph Templates を登録/編集する

  1. 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";