<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
>

<channel rdf:about="http://blog.d-pad.co.jp/sugi/">
<title>あるソフトウェアエンジニアの戯言</title>
<link>http://blog.d-pad.co.jp/sugi/</link>
<description>日々の開発やサーバ管理のなかで出てきたあれや、これや、あんなことや、こんなこと</description>
<dc:language>ja</dc:language>
<items>
 <rdf:Seq>
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2010/1/post_51.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2010/1/post_50.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/12/post_49.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/10/post_48.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/10/post_46.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/8/post_45.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/8/post_44.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/8/post_43.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/8/post_42.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/6/post_41.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/5/post_40.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/4/post_39.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/3/post_38.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2009/3/post_36.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_33.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_32.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_31.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_30.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_28.html" />
  <rdf:li rdf:resource="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_26.html" />
 </rdf:Seq>
</items>
</channel>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2010/1/post_51.html">
<title>Linux版Acrobat Readerで日本語が表示できないときの対処方法</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2010/1/post_51.html</link>
<description>フォントの埋め込まれていない日本語PDFをAcrobatReaderで表示しようとしたときにダイアログが表示され、「日本語フォントをインストールしてください」と言われることがある。 これはlinuxのXにmsgothic.ttfがインストールされている場合に起きるらしい。（Linux版Adobe Reader 9で日本語が表示できない問題の解決法) これは環境変数 ACRO_DISABLE_FONT_CONFIG=1 を設定してやることで、回避することができる。  </description>
<dc:date>2010-01-26T13:05:13+09:00</dc:date>
<content:encoded>&lt;p>フォントの埋め込まれていない日本語PDFをAcrobatReaderで表示しようとしたときにダイアログが表示され、「日本語フォントをインストールしてください」と言われることがある。&lt;br />
これはlinuxのXにmsgothic.ttfがインストールされている場合に起きるらしい。（&lt;a href="http://d.hatena.ne.jp/pyopyopyo/20090726/p1" >Linux版Adobe Reader 9で日本語が表示できない問題の解決法&lt;/a>)&lt;/p>
&lt;p>これは環境変数 ACRO_DISABLE_FONT_CONFIG=1 を設定してやることで、回避することができる。&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2010/1/post_50.html">
<title>flash の外部スクリプトファイルの文字コードについて</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2010/1/post_50.html</link>
<description>flash の外部スクリプトファイル(Action Script)をemacsのデフォルトutf-8エンコードで保存すると、flashは正常に読み込みできません。 エンコーディングを utf-8-with-signature (utf-8BOMつき) で保存する必要があります。 備忘録がわりに。  </description>
<dc:date>2010-01-13T17:12:54+09:00</dc:date>
<content:encoded>&lt;p>flash の外部スクリプトファイル(Action Script)をemacsのデフォルトutf-8エンコードで保存すると、flashは正常に読み込みできません。&lt;br />
エンコーディングを utf-8-with-signature (utf-8BOMつき) で保存する必要があります。&lt;/p>
&lt;p>備忘録がわりに。&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/12/post_49.html">
<title>GoogleEarth 5.1 on Debian/GNU Linux sid amd64</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/12/post_49.html</link>
<description>sid の googleearth-package が新しくなったので、最新のGoogleEarthをインストールしてみたのだが、3Dの部分が表示されない。 原因は、nvidia-glx-ia32がインストールされていないことだった様子。（もちろん、グラフィックドライバがnvidiaであることが前提） </description>
<dc:date>2009-12-22T16:26:55+09:00</dc:date>
<content:encoded>&lt;p>sid の googleearth-package が新しくなったので、最新のGoogleEarthをインストールしてみたのだが、3Dの部分が表示されない。&lt;br />
原因は、nvidia-glx-ia32がインストールされていないことだった様子。（もちろん、グラフィックドライバがnvidiaであることが前提）&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/10/post_48.html">
<title>firefox 3.5 for linux 64bit</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/10/post_48.html</link>
<description>Debian GNU/Linux (experimental) の64bit版 iceweasel 3.5 (firefox) があまりにも落る。(exprimental版のパッケージをunstable(sid)で運用） いろいろと調べていたら、AURの firefox-pgo というパッケージが xulrunner を使わないバージョンの firefox で落ちない、という記述があった。（Linux 上で Firefox 3.5 + Flash プラグインが落ちる件, AURのfirefox-pgoでFirebugが動かない) それでは、モノは試しと、firefox 64bit版を野良ビルドしてみることに。  AUR/firefox-pgo 3.5.3-1の''Sources''セクションから、すべてのファイルをダウンロード。  適当なディレクトリに firefox-3.5.3.source.tar.bz2 を展開。  *.patch を適用。なぜか、100-system-hunspell-corrections.patch が patch コマンドでうまくあたってくれないので、手で編集してしまった。  Build Instructions を参考に、コンパイル環境を整える。  Debianの場合は、Linux Prerequisites の ''Debian/Ubuntu'' セクションを参考に。  これ以外に gcc と g++ も必要。Debian/sid では、どちらも4.4を用いた。   Configuring Build Options と Build and Install を参考にコンパイルするのだが、.mozconfig はすでにダウンロードしたものがあるので、mozconfig.x86_64 をリネームして利用する。  ここで障害に激突。 コンパイルがエラーになって、通らない。(これは、私の環境での話なので、他の環境では違うかもしれない） 調べてみると、MOZ_DFB &amp; CAIRO_HAS_DIRECTFB_SURFACE, Bug 466250 -  build failure for cairo-gtk2 build with a directfb cairo より、パッチを当てれば直る様子。 このパッチ を適用して、ついでに mozconfig の ac_add_options --enable-default-toolkit=cairo-gtk2  をコメントアウトして、コンパイル成功。 ソースツリートップ/ff-pgo 以下にコンパイルされたファイルが生成されるので、このディレクトリで make package を実行。 できあがった dist/firefox-3.5.3.en-US.linux-x86_64.tar.bz2 を適当なディレクトリにインストールして、作業完了。 しばらく使ってみて、問題なさそうなら、パッケージをここにアップロードしようと思います。  追記： 日本語の言語パッケージはこちらにあります   </description>
<dc:date>2009-10-09T19:49:48+09:00</dc:date>
<content:encoded>&lt;p>Debian GNU/Linux (experimental) の64bit版 iceweasel 3.5 (firefox) があまりにも落る。(exprimental版のパッケージをunstable(sid)で運用）&lt;br />
いろいろと調べていたら、AURの firefox-pgo というパッケージが xulrunner を使わないバージョンの firefox で落ちない、という記述があった。（&lt;a href="http://d.hatena.ne.jp/naoina/20090812/1250065017" >Linux 上で Firefox 3.5 + Flash プラグインが落ちる件&lt;/a>, &lt;a href="http://memo.officebrook.net/20090621.html" >AURのfirefox-pgoでFirebugが動かない&lt;/a>)&lt;br />
それでは、モノは試しと、firefox 64bit版を野良ビルドしてみることに。&lt;/p>
&lt;ul>&lt;li> &lt;a href="http://aur.archlinux.org/packages.php?ID=22296" >AUR/firefox-pgo 3.5.3-1&lt;/a>の''Sources''セクションから、すべてのファイルをダウンロード。&lt;/li>
&lt;li> 適当なディレクトリに firefox-3.5.3.source.tar.bz2 を展開。&lt;/li>
&lt;li> *.patch を適用。なぜか、100-system-hunspell-corrections.patch が patch コマンドでうまくあたってくれないので、手で編集してしまった。&lt;/li>
&lt;li> &lt;a href="https://developer.mozilla.org/en/Build_Documentation" >Build Instructions&lt;/a> を参考に、コンパイル環境を整える。&lt;/li>
&lt;ul>&lt;li> Debianの場合は、&lt;a href="https://developer.mozilla.org/En/Developer_Guide/Build_Instructions/Linux_Prerequisites" >Linux Prerequisites&lt;/a> の ''Debian/Ubuntu'' セクションを参考に。&lt;/li>
&lt;li> これ以外に gcc と g++ も必要。Debian/sid では、どちらも4.4を用いた。&lt;/li>
&lt;/ul>
&lt;li> &lt;a href="https://developer.mozilla.org/en/Configuring_Build_Options" >Configuring Build Options&lt;/a> と &lt;a href="https://developer.mozilla.org/en/Build_and_Install" >Build and Install&lt;/a> を参考にコンパイルするのだが、.mozconfig はすでにダウンロードしたものがあるので、mozconfig.x86_64 をリネームして利用する。&lt;/li>
&lt;/ul>
&lt;p>ここで障害に激突。&lt;br />
コンパイルがエラーになって、通らない。(これは、私の環境での話なので、他の環境では違うかもしれない）&lt;br />
調べてみると、&lt;a href="http://forums-test.mozillazine.org/viewtopic.php?f=23&amp;amp;t=1200005&amp;amp;p=6277595" >MOZ_DFB &amp;amp; CAIRO_HAS_DIRECTFB_SURFACE&lt;/a>, &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=466250" >Bug 466250 -  build failure for cairo-gtk2 build with a directfb cairo&lt;/a> より、パッチを当てれば直る様子。&lt;br />
&lt;a href="https://bug466250.bugzilla.mozilla.org/attachment.cgi?id=372770" >このパッチ&lt;/a> を適用して、ついでに mozconfig の&lt;/p>
&lt;blockquote>&lt;p>ac_add_options --enable-default-toolkit=cairo-gtk2&lt;/p>
&lt;/blockquote>
&lt;p>をコメントアウトして、コンパイル成功。&lt;/p>
&lt;p>ソースツリートップ/ff-pgo 以下にコンパイルされたファイルが生成されるので、このディレクトリで make package を実行。&lt;br />
できあがった dist/firefox-3.5.3.en-US.linux-x86_64.tar.bz2 を適当なディレクトリにインストールして、作業完了。&lt;/p>
&lt;p>しばらく使ってみて、問題なさそうなら、パッケージをここにアップロードしようと思います。&lt;/p>
&lt;hr />
&lt;p>追記：&lt;br />
&lt;a href="http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.5.3/linux-i686/xpi/ja.xpi" >日本語の言語パッケージはこちらにあります&lt;/a>&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/10/post_46.html">
<title>emacs の終了時に確認をする方法</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/10/post_46.html</link>
<description>emacsを使っていて、C-x .. と入力したいときに、誤って C-xC-c と入力してしまうことがあるよね、と話になってkill-emacsをwrapすればいいか？と思ってたら、ちゃんと始めから機能がついてました。 M-x customize-variable&lt;CR&gt;confirm-kill-emacs&lt;CR&gt;  を実行して、&amp;quot;y-or-n-p&amp;quot; を選択すればいいだけでした。  </description>
<dc:date>2009-10-01T14:49:28+09:00</dc:date>
<content:encoded>&lt;p>emacsを使っていて、C-x .. と入力したいときに、誤って C-xC-c と入力してしまうことがあるよね、と話になってkill-emacsをwrapすればいいか？と思ってたら、ちゃんと始めから機能がついてました。&lt;/p>
&lt;blockquote>&lt;p>M-x customize-variable&amp;lt;CR&amp;gt;confirm-kill-emacs&amp;lt;CR&amp;gt;&lt;/p>
&lt;/blockquote>
&lt;p>を実行して、&amp;quot;y-or-n-p&amp;quot; を選択すればいいだけでした。&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/8/post_45.html">
<title>携帯vCardからgmail用ふりがなデータつきvCardデータへ変換</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/8/post_45.html</link>
<description>gmailと自分の持っている携帯(softbank 821SH)との間で電話帳をsyncしたくて、いろいろ探していたのですが、gmailとはふりがなの同期ができないとの記述ばかりであきらめかけていました。 最近、変わったのかもしれませんが、gmailがエクスポートしてくれるvCardデータにそれらしきカラムがあるのを発見したので、結局自分で変換用のperl scriptを実装しちゃいました。 もし、同じようなことをしようとしていて悩んでいる人がいれば、なにかの足しにしてください。 vcard.pl #!/usr/bin/perl  # sharp携帯のvcardデータをgmail対応に変換するスクリプト  use strict; use warnings; use utf8; use Encode; use feature qw(say switch); use MIME::QuotedPrint;  my @cards; my $card; my @src = &lt;&gt;;  while (my $line = shift @src) {   $line =~ s/\r?\n$//;   while (@src and $src[0] =~ /^(\s|\=)/i) {     my $l = shift @src;     $l =~ s/^.(.*)\r\n$/$1/;     $line .= $l;   }   my ($key, $value) = split /:/, $line, 2;   given ($key) {     when ('BEGIN') {       $card = {};     }     when ('END') {       push @cards, $card;     }     when (/^(N|TEL|EMAIL|ADR|NOTE|URL)\b/) {       # デコードのみ       $value = decode_vcard(\$key, $value);       push @{$card-&gt;{$key}}, $value;     }     when (/^SOUND\b/) {       # デコードして、フリガナに       ($card-&gt;{'X-PHONETIC-LAST-NAME'}, $card-&gt;{'X-PHONETIC-FIRST-NAME'}) = split /;/, decode_vcard(\$key, $value);     }     when (/^X-GN\b/) {       # グループ名 - noteへ       push @{$card-&gt;{NOTE}}, decode_vcard(\$key, $value);     }   } }  # 出力 foreach my $v (@cards) {   print &amp;quot;BEGIN:VCARD\r\nVERSION:2.1\r\n&amp;quot;;   foreach my $k (keys %$v) {     if (ref $v-&gt;{$k} eq 'ARRAY') {       foreach my $val (@{$v-&gt;{$k}}) {         print Encode::encode_utf8(&amp;quot;$k:$val\r\n&amp;quot;);       }     } else {       if ($v-&gt;{$k}) {         print Encode::encode_utf8(&amp;quot;$k:$v-&gt;{$k}\r\n&amp;quot;);       }     }   }   print &amp;quot;END:VCARD\r\n&amp;quot;; }  sub decode_vcard {   my $key = shift;   my $src = shift;   my @dst;    return '' unless ($src);    my $charset;   my $encode;   if ($$key =~ s/(^|;)CHARSET\=(.*?)(;|$)/$3/) {     $charset = 'shift_jis'; # $1;   }   if ($$key =~ s/(^|;)ENCODING\=QUOTED\-PRINTABLE(;|$)/$2/) {     $encode = 1;   }    my @src = split /(.*?;)/, $src;   foreach (@src) {     if ($encode) {       $_ = decode_qp($_);     }     if ($charset) {       $_ = h2z(Encode::decode($charset, $_));     }     push @dst, $_;   }   return join('', @dst); }   sub h2z {   local $_ = shift;    s/ヴ/ヴ/g;   s/ガ/ガ/g;   s/ギ/ギ/g;   s/グ/グ/g;   s/ゲ/ゲ/g;   s/ゴ/ゴ/g;   s/ザ/ザ/g;   s/ジ/ジ/g;   s/ズ/ズ/g;   s/ゼ/ゼ/g;   s/ゾ/ゾ/g;   s/ダ/ダ/g;   s/ヂ/ヂ/g;   s/ヅ/ヅ/g;   s/デ/デ/g;   s/ド/ド/g;   s/バ/バ/g;   s/ビ/ビ/g;   s/ブ/ブ/g;   s/ベ/ベ/g;   s/ボ/ボ/g;   s/パ/パ/g;   s/ピ/ピ/g;   s/プ/プ/g;   s/ペ/ペ/g;   s/ポ/ポ/g;   tr[ァィゥェォッャュョアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛゜ー、。・「」\x{ff5e}\x{2225}\x{ff0d}\x{ffe0}\x{ffe1}\x{ffe2}]     [ァィゥェォッャュョアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛゜ー、。・「」\x{301c}\x{2016}\x{2212}\x{00a2}\x{00a3}\x{00ac}];    $_; }  </description>
<dc:date>2009-08-27T22:05:48+09:00</dc:date>
<content:encoded>&lt;p>gmailと自分の持っている携帯(softbank 821SH)との間で電話帳をsyncしたくて、いろいろ探していたのですが、gmailとはふりがなの同期ができないとの記述ばかりであきらめかけていました。&lt;/p>
&lt;p>最近、変わったのかもしれませんが、gmailがエクスポートしてくれるvCardデータにそれらしきカラムがあるのを発見したので、結局自分で変換用のperl scriptを実装しちゃいました。&lt;br />
もし、同じようなことをしようとしていて悩んでいる人がいれば、なにかの足しにしてください。&lt;/p>
&lt;h3>vcard.pl&lt;/h3>
&lt;pre>#!/usr/bin/perl

# sharp携帯のvcardデータをgmail対応に変換するスクリプト

use strict;
use warnings;
use utf8;
use Encode;
use feature qw(say switch);
use MIME::QuotedPrint;

my @cards;
my $card;
my @src = &amp;lt;&amp;gt;;

while (my $line = shift @src) {
  $line =~ s/\r?\n$//;
  while (@src and $src[0] =~ /^(\s|\=)/i) {
    my $l = shift @src;
    $l =~ s/^.(.*)\r\n$/$1/;
    $line .= $l;
  }
  my ($key, $value) = split /:/, $line, 2;
  given ($key) {
    when ('BEGIN') {
      $card = {};
    }
    when ('END') {
      push @cards, $card;
    }
    when (/^(N|TEL|EMAIL|ADR|NOTE|URL)\b/) {
      # デコードのみ
      $value = decode_vcard(\$key, $value);
      push @{$card-&amp;gt;{$key}}, $value;
    }
    when (/^SOUND\b/) {
      # デコードして、フリガナに
      ($card-&amp;gt;{'X-PHONETIC-LAST-NAME'}, $card-&amp;gt;{'X-PHONETIC-FIRST-NAME'}) = split /;/, decode_vcard(\$key, $value);
    }
    when (/^X-GN\b/) {
      # グループ名 - noteへ
      push @{$card-&amp;gt;{NOTE}}, decode_vcard(\$key, $value);
    }
  }
}

# 出力
foreach my $v (@cards) {
  print &amp;quot;BEGIN:VCARD\r\nVERSION:2.1\r\n&amp;quot;;
  foreach my $k (keys %$v) {
    if (ref $v-&amp;gt;{$k} eq 'ARRAY') {
      foreach my $val (@{$v-&amp;gt;{$k}}) {
        print Encode::encode_utf8(&amp;quot;$k:$val\r\n&amp;quot;);
      }
    } else {
      if ($v-&amp;gt;{$k}) {
        print Encode::encode_utf8(&amp;quot;$k:$v-&amp;gt;{$k}\r\n&amp;quot;);
      }
    }
  }
  print &amp;quot;END:VCARD\r\n&amp;quot;;
}

sub decode_vcard {
  my $key = shift;
  my $src = shift;
  my @dst;

  return '' unless ($src);

  my $charset;
  my $encode;
  if ($$key =~ s/(^|;)CHARSET\=(.*?)(;|$)/$3/) {
    $charset = 'shift_jis'; # $1;
  }
  if ($$key =~ s/(^|;)ENCODING\=QUOTED\-PRINTABLE(;|$)/$2/) {
    $encode = 1;
  }

  my @src = split /(.*?;)/, $src;
  foreach (@src) {
    if ($encode) {
      $_ = decode_qp($_);
    }
    if ($charset) {
      $_ = h2z(Encode::decode($charset, $_));
    }
    push @dst, $_;
  }
  return join('', @dst);
}


sub h2z {
  local $_ = shift;

  s/ヴ/ヴ/g;
  s/ガ/ガ/g;
  s/ギ/ギ/g;
  s/グ/グ/g;
  s/ゲ/ゲ/g;
  s/ゴ/ゴ/g;
  s/ザ/ザ/g;
  s/ジ/ジ/g;
  s/ズ/ズ/g;
  s/ゼ/ゼ/g;
  s/ゾ/ゾ/g;
  s/ダ/ダ/g;
  s/ヂ/ヂ/g;
  s/ヅ/ヅ/g;
  s/デ/デ/g;
  s/ド/ド/g;
  s/バ/バ/g;
  s/ビ/ビ/g;
  s/ブ/ブ/g;
  s/ベ/ベ/g;
  s/ボ/ボ/g;
  s/パ/パ/g;
  s/ピ/ピ/g;
  s/プ/プ/g;
  s/ペ/ペ/g;
  s/ポ/ポ/g;
  tr[ァィゥェォッャュョアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛゜ー、。・「」\x{ff5e}\x{2225}\x{ff0d}\x{ffe0}\x{ffe1}\x{ffe2}]
    [ァィゥェォッャュョアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛゜ー、。・「」\x{301c}\x{2016}\x{2212}\x{00a2}\x{00a3}\x{00ac}];

  $_;
}&lt;/pre>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/8/post_44.html">
<title>Google chromium Ubuntu版</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/8/post_44.html</link>
<description>やっと64bitバージョンの動くところが見られました。 （今迄、動かせてなかったのです） debian/sid でも januty 用のビルドでインストールできました。 PPA for Ubuntu Chromium Daily Builds  </description>
<dc:date>2009-08-25T21:46:21+09:00</dc:date>
<content:encoded>&lt;p>やっと64bitバージョンの動くところが見られました。 （今迄、動かせてなかったのです）&lt;br />
debian/sid でも januty 用のビルドでインストールできました。&lt;/p>
&lt;p>&lt;a href="https://launchpad.net/~chromium-daily/+archive/ppa" >PPA for Ubuntu Chromium Daily Builds&lt;/a>&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/8/post_43.html">
<title>テンプレート更新</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/8/post_43.html</link>
<description>テンプレートを少し変更してみました。 タイトルに画像なんか入れたりして。。。 twitter, mixiのURLも追加しました。 もしよかったら、リンクしてもらえると嬉しいです。  </description>
<dc:date>2009-08-18T12:04:36+09:00</dc:date>
<content:encoded>&lt;p>テンプレートを少し変更してみました。&lt;br />
タイトルに画像なんか入れたりして。。。&lt;/p>
&lt;p>twitter, mixiのURLも追加しました。&lt;br />
もしよかったら、リンクしてもらえると嬉しいです。&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/8/post_42.html">
<title>Mooseのお勉強（番外）</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/8/post_42.html</link>
<description>いつの間にやら、Mooseのマニュアル他の日本語訳を作ってくれている人がいました。多謝。 http://github.com/jpa/Moose-Doc-JA/tree/master github に納まっているので、以下のコマンドでチェックアウト可能です。（もちろんgitがインストールされている環境でないと実行できません） git clone git://github.com/jpa/Moose-Doc-JA.git  始めてgitを使ったので、チェックアウトできるまでに、ちと戸惑ったってのは内緒。  </description>
<dc:date>2009-08-07T18:21:58+09:00</dc:date>
<content:encoded>&lt;p>いつの間にやら、Mooseのマニュアル他の日本語訳を作ってくれている人がいました。多謝。&lt;/p>
&lt;p>&lt;a href="http://github.com/jpa/Moose-Doc-JA/tree/master" target="_blank">http://github.com/jpa/Moose-Doc-JA/tree/master&lt;/a>&lt;/p>
&lt;p>github に納まっているので、以下のコマンドでチェックアウト可能です。（もちろんgitがインストールされている環境でないと実行できません）&lt;/p>
&lt;blockquote>&lt;p>git clone git://github.com/jpa/Moose-Doc-JA.git&lt;/p>
&lt;/blockquote>
&lt;p>始めてgitを使ったので、チェックアウトできるまでに、ちと戸惑ったってのは内緒。&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/6/post_41.html">
<title>Google chrome linux版 公式ビルド</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/6/post_41.html</link>
<description>http://dev.chromium.org/getting-involved/dev-channel こちらから、googleがbuildしたchrome linux版（Mac版も）をダウンロードすることができるようになりました。 32bit版も64bit版もどちらもあります。 これで、自分でbuildする必要がなくなりました。 更新頻度はそんなに高くはないようですが、、、、 </description>
<dc:date>2009-06-15T21:25:21+09:00</dc:date>
<content:encoded>&lt;p>&lt;a href="http://dev.chromium.org/getting-involved/dev-channel" target="_blank">http://dev.chromium.org/getting-involved/dev-channel&lt;/a>&lt;br />
こちらから、googleがbuildしたchrome linux版（Mac版も）をダウンロードすることができるようになりました。&lt;br />
32bit版も64bit版もどちらもあります。&lt;br />
これで、自分でbuildする必要がなくなりました。&lt;br />
更新頻度はそんなに高くはないようですが、、、、&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/5/post_40.html">
<title>64bit linux版 Google Chrome その後 2 (2009/05/29追記)</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/5/post_40.html</link>
<description>またまた、更新。 書き留めておかないと、何を追加したのか、わからなくなってしまうので、ただのメモ。 今回のビルドで追加インストールが必要になった32bitライブラリ  libgconf2-dev  libglib2.0-dev  いずれも、getlibs (script on the Ubuntu forums) でインストール それにしても、chromeのコンパイルは時間がかかるなぁ。 何度かリトライしているとはいえ、レポジトリの更新まで含めてほぼ1時間かかってる。。。 ---- 2009/05/29 のビルドで必要になった32bitライブラリ  libasound2-dev  日本語の文字がトーフになって表示できなくなってしまっています。 前はできたのに。。。環境側が変わったせいなのだろうか  </description>
<dc:date>2009-05-07T22:03:49+09:00</dc:date>
<content:encoded>&lt;p>またまた、更新。&lt;br />
書き留めておかないと、何を追加したのか、わからなくなってしまうので、ただのメモ。&lt;/p>
&lt;p>今回のビルドで追加インストールが必要になった32bitライブラリ&lt;/p>
&lt;ul>&lt;li> libgconf2-dev&lt;/li>
&lt;li> libglib2.0-dev&lt;/li>
&lt;/ul>
&lt;p>いずれも、getlibs (&lt;a href="http://ubuntuforums.org/showthread.php?t=474790" >script on the Ubuntu forums&lt;/a>) でインストール&lt;/p>
&lt;p>それにしても、chromeのコンパイルは時間がかかるなぁ。&lt;br />
何度かリトライしているとはいえ、レポジトリの更新まで含めてほぼ1時間かかってる。。。&lt;/p>
&lt;p>----&lt;br />
2009/05/29 のビルドで必要になった32bitライブラリ&lt;/p>
&lt;ul>&lt;li> libasound2-dev&lt;/li>
&lt;/ul>
&lt;p>日本語の文字がトーフになって表示できなくなってしまっています。&lt;br />
前はできたのに。。。環境側が変わったせいなのだろうか&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/4/post_39.html">
<title>linux版 Google Chrome その後</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/4/post_39.html</link>
<description>先月に続いて、またもやビルドしてみました。 今回は、エラーが出て、コンパイルに失敗。(64bit環境での話。32bitなら問題ないと思われる） いろいろ調べてみた挙句、32bit版ライブラリが足りていないようだったので、以下のとおり対処。  64bit環境に32bit版のライブラリをインストールするユーティリティをscript on the Ubuntu forums から入手。  インストールしたら、以下のとおり実行  getlibs -p libfreetype6  これでちゃんとコンパイルが通るようになりました。 このへんは、 LinuxBuild64Bit にも、まだ書かれていない。  </description>
<dc:date>2009-04-15T19:13:12+09:00</dc:date>
<content:encoded>&lt;p>先月に続いて、またもやビルドしてみました。&lt;br />
今回は、エラーが出て、コンパイルに失敗。(64bit環境での話。32bitなら問題ないと思われる）&lt;br />
いろいろ調べてみた挙句、32bit版ライブラリが足りていないようだったので、以下のとおり対処。&lt;/p>
&lt;ol>&lt;li> 64bit環境に32bit版のライブラリをインストールするユーティリティを&lt;a href="http://ubuntuforums.org/showthread.php?t=474790" >script on the Ubuntu forums&lt;/a> から入手。&lt;/li>
&lt;li> インストールしたら、以下のとおり実行&lt;/li>
&lt;/ol>
&lt;blockquote>&lt;p>getlibs -p libfreetype6&lt;/p>
&lt;/blockquote>
&lt;p>これでちゃんとコンパイルが通るようになりました。&lt;br />
このへんは、 &lt;a href="http://code.google.com/p/chromium/wiki/LinuxBuild64Bit " >LinuxBuild64Bit&lt;/a> にも、まだ書かれていない。&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/3/post_38.html">
<title>Linux版Google Earth 5.0 の日本語表示</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/3/post_38.html</link>
<description>Linux版Google Earth 5。0 を debian の googleearth-package を使ってインストールしてみた。 $ make-googleearth-package --force  でパッケージの生成は一応完了。 $ dpkg -i  dpkg -i googleearth_5.0.11337.1968+0.5.4-1_amd64.deb  でインストールも完了。 $ googleearth  で起動すると、メニュー他の日本語表示が全然おかしい。 でいろいろ調べた挙句、 ここ にそれっぽい情報を発見。 /usr/lib/googleearth/libQtCore.so.4 /usr/lib/googleearth/libQtGui.so.4 /usr/lib/googleearth/libQtNetwork.so.4  の3つをリネームして起動するとちゃんと表示されるようになりました。 おそらく、関連するqt4まわりのパッケージがちゃんとインストールされていることが前提なので、うまく動かない場合は、そちらをチェックしてみるのがよろしいかと。  </description>
<dc:date>2009-03-16T19:05:17+09:00</dc:date>
<content:encoded>&lt;p>Linux版Google Earth 5。0 を debian の googleearth-package を使ってインストールしてみた。&lt;/p>
&lt;blockquote>&lt;p>$ make-googleearth-package --force&lt;/p>
&lt;/blockquote>
&lt;p>でパッケージの生成は一応完了。&lt;/p>
&lt;blockquote>&lt;p>$ dpkg -i  dpkg -i googleearth_5.0.11337.1968+0.5.4-1_amd64.deb&lt;/p>
&lt;/blockquote>
&lt;p>でインストールも完了。&lt;/p>
&lt;blockquote>&lt;p>$ googleearth&lt;/p>
&lt;/blockquote>
&lt;p>で起動すると、メニュー他の日本語表示が全然おかしい。&lt;br />
でいろいろ調べた挙句、 &lt;a href="http://tomcat.nyanta.jp/sb2/sb.cgi?eid=192" >ここ&lt;/a> にそれっぽい情報を発見。&lt;/p>
&lt;blockquote>&lt;p>/usr/lib/googleearth/libQtCore.so.4&lt;br />
/usr/lib/googleearth/libQtGui.so.4&lt;br />
/usr/lib/googleearth/libQtNetwork.so.4&lt;/p>
&lt;/blockquote>
&lt;p>の3つをリネームして起動するとちゃんと表示されるようになりました。&lt;br />
おそらく、関連するqt4まわりのパッケージがちゃんとインストールされていることが前提なので、うまく動かない場合は、そちらをチェックしてみるのがよろしいかと。&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2009/3/post_36.html">
<title>linux版Google Chrome を build してみた</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2009/3/post_36.html</link>
<description>http://code.google.com/p/chromium/wiki/LinuxBuildInstructions このページを参考にして、Google Chrome for linux を build してみました。 昨日、気がついたら、いままで書かれていた「buildしても、chromeは起動しませんよ」という注意書きがなくなっていたので、いろいろ期待しつつ。。。 環境は Debian/GNU Linux Unstable(sid) amd86_64。 （ http://code.google.com/p/chromium/wiki/LinuxBuild64Bit ） ソースのリビジョンは11321。 ちょっと前まで、ほとんどまともにbuildできなかったので、build自体はかなり手間取るんじゃないかと思っていましたが、リンクされるライブラリの設定にちょっとつまづいた以外は、わりとあっさりとbuild終了。 起動してみてびっくり。 ものすごく起動が速い。 もちろん、全ての機能が実装されているわけじゃないので、その分初期化しなければならないものも少いのでしょうが、ほとんど一瞬といっていいくらいでウィンドウが開いてデフォルトページが出てきます。 とりあえず、ざっと見てみて気がついたところを。 - 日本語フォントがうまく表示できないところがある - タブが開かない - オプションダイアログが出ない - UIはもちろん英語 - firefoxなどでは可能なウィンドウへのマウス中ボタンでのURLペーストができない - リリース版オプションをつけてbuildしたけど、デバッグライトいっぱい。 - Xのクリップボードがちゃんと処理できないないっぽい （gnomeのクリップボードは使えているみたい） Gmail とか 自分で開発してるwebアプリなどを実行してみたけれど、上記の問題を除くと、ちゃんと実行できている様子。 で、さっそくベンチマーク。 http://www2.webkit.org/perf/sunspider-0.9/sunspider.html エラーが結構出ていたようなので、ちゃんと実行できてないのかもしれないけれど、かなり高速。 ============================================ RESULTS (means and 95% confidence intervals) -------------------------------------------- Total:                 1335.6ms +/- 4.6% --------------------------------------------    3d:                   198.6ms +/- 3.4%     cube:                56.8ms +/- 11.3%     morph:               80.0ms +/- 7.0%     raytrace:            61.8ms +/- 8.3%    access:               132.4ms +/- 10.0%     binary-trees:         8.2ms +/- 27.1%     fannkuch:            40.0ms +/- 31.7%     nbody:               52.6ms +/- 4.9%     nsieve:              31.6ms +/- 2.2%    bitops:               114.8ms +/- 2.7%     3bit-bits-in-byte:    8.0ms +/- 11.0%     bits-in-byte:        20.4ms +/- 3.3%     bitwise-and:         48.0ms +/- 5.2%     nsieve-bits:         38.4ms +/- 1.8%    controlflow:            4.8ms +/- 21.7%     recursive:            4.8ms +/- 21.7%    crypto:                81.6ms +/- 6.8%     aes:                 29.2ms +/- 14.6%     md5:                 27.4ms +/- 4.1%     sha1:                25.0ms +/- 5.0%    date:                 205.4ms +/- 16.0%     format-tofte:        98.8ms +/- 26.2%     format-xparb:       106.6ms +/- 7.0%    math:                 140.8ms +/- 6.6%     cordic:              43.0ms +/- 5.4%     partial-sums:        73.4ms +/- 12.7%     spectral-norm:       24.4ms +/- 2.8%    regexp:                28.0ms +/- 30.3%     dna:                 28.0ms +/- 30.3%    string:               429.2ms +/- 3.5%     base64:              46.4ms +/- 2.4%     fasta:               75.6ms +/- 18.2%     tagcloud:            82.6ms +/- 19.1%     unpack-code:        136.6ms +/- 13.3%     validate-input:      88.0ms +/- 19.9% 参考までに、こちらは同じPCで実行した Forefix3.0.7の実行結果 ============================================ RESULTS (means and 95% confidence intervals) -------------------------------------------- Total:                  7729.8ms +/- 1.8% --------------------------------------------    3d:                    592.2ms +/- 17.5%     cube:                182.4ms +/- 30.4%     morph:               219.0ms +/- 15.6%     raytrace:            190.8ms +/- 11.2%    access:                797.6ms +/- 4.9%     binary-trees:        171.2ms +/- 4.0%     fannkuch:            245.6ms +/- 10.6%     nbody:               153.0ms +/- 19.0%     nsieve:              227.8ms +/- 4.7%    bitops:                486.6ms +/- 6.6%     3bit-bits-in-byte:   117.2ms +/- 11.7%     bits-in-byte:        139.8ms +/- 13.9%     bitwise-and:          89.8ms +/- 2.7%     nsieve-bits:         139.8ms +/- 14.2%    controlflow:           116.8ms +/- 2.0%     recursive:           116.8ms +/- 2.0%    crypto:                397.2ms +/- 6.1%     aes:                 145.2ms +/- 16.1%     md5:                 122.2ms +/- 2.2%     sha1:                129.8ms +/- 18.2%    date:                 1860.0ms +/- 2.1%     format-tofte:       1667.0ms +/- 2.1%     format-xparb:        193.0ms +/- 2.4%    math:                  528.4ms +/- 5.5%     cordic:              199.0ms +/- 5.4%     partial-sums:        168.8ms +/- 12.4%     spectral-norm:       160.6ms +/- 20.2%    regexp:                614.0ms +/- 7.0%     dna:                 614.0ms +/- 7.0%    string:               2337.0ms +/- 2.6%     base64:              174.0ms +/- 8.5%     fasta:               279.2ms +/- 0.9%     tagcloud:            542.4ms +/- 4.1%     unpack-code:        1094.4ms +/- 4.6%     validate-input:      247.0ms +/- 3.7% ちゃんと実行されているのだとすれば、かなり速いことがわかる  </description>
<dc:date>2009-03-11T11:55:06+09:00</dc:date>
<content:encoded>&lt;div style="float:right" class="image">&lt;img src="http://blog.d-pad.co.jp/sugi/pict/2009/3/pict_36.jpg">&lt;/div>
&lt;p>&lt;a href="http://code.google.com/p/chromium/wiki/LinuxBuildInstructions" target="_blank">http://code.google.com/p/chromium/wiki/LinuxBuildInstructions&lt;/a>&lt;/p>
&lt;p>このページを参考にして、Google Chrome for linux を build してみました。&lt;br />
昨日、気がついたら、いままで書かれていた「buildしても、chromeは起動しませんよ」という注意書きがなくなっていたので、いろいろ期待しつつ。。。&lt;br />
環境は Debian/GNU Linux Unstable(sid) amd86_64。 （ &lt;a href="http://code.google.com/p/chromium/wiki/LinuxBuild64Bit" target="_blank">http://code.google.com/p/chromium/wiki/LinuxBuild64Bit&lt;/a> ）&lt;br />
ソースのリビジョンは11321。&lt;/p>
&lt;p>ちょっと前まで、ほとんどまともにbuildできなかったので、build自体はかなり手間取るんじゃないかと思っていましたが、リンクされるライブラリの設定にちょっとつまづいた以外は、わりとあっさりとbuild終了。&lt;/p>
&lt;p>起動してみてびっくり。&lt;br />
ものすごく起動が速い。&lt;br />
もちろん、全ての機能が実装されているわけじゃないので、その分初期化しなければならないものも少いのでしょうが、ほとんど一瞬といっていいくらいでウィンドウが開いてデフォルトページが出てきます。&lt;/p>
&lt;p>とりあえず、ざっと見てみて気がついたところを。&lt;br />
- 日本語フォントがうまく表示できないところがある&lt;br />
- タブが開かない&lt;br />
- オプションダイアログが出ない&lt;br />
- UIはもちろん英語&lt;br />
- firefoxなどでは可能なウィンドウへのマウス中ボタンでのURLペーストができない&lt;br />
- リリース版オプションをつけてbuildしたけど、デバッグライトいっぱい。&lt;br />
- Xのクリップボードがちゃんと処理できないないっぽい （gnomeのクリップボードは使えているみたい）&lt;/p>
&lt;p>Gmail とか 自分で開発してるwebアプリなどを実行してみたけれど、上記の問題を除くと、ちゃんと実行できている様子。&lt;/p>
&lt;p>で、さっそくベンチマーク。&lt;br />
&lt;a href="http://www2.webkit.org/perf/sunspider-0.9/sunspider.html" target="_blank">http://www2.webkit.org/perf/sunspider-0.9/sunspider.html&lt;/a>&lt;br />
エラーが結構出ていたようなので、ちゃんと実行できてないのかもしれないけれど、かなり高速。&lt;/p>
&lt;pre>============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                 1335.6ms +/- 4.6%
--------------------------------------------

  3d:                   198.6ms +/- 3.4%
    cube:                56.8ms +/- 11.3%
    morph:               80.0ms +/- 7.0%
    raytrace:            61.8ms +/- 8.3%

  access:               132.4ms +/- 10.0%
    binary-trees:         8.2ms +/- 27.1%
    fannkuch:            40.0ms +/- 31.7%
    nbody:               52.6ms +/- 4.9%
    nsieve:              31.6ms +/- 2.2%

  bitops:               114.8ms +/- 2.7%
    3bit-bits-in-byte:    8.0ms +/- 11.0%
    bits-in-byte:        20.4ms +/- 3.3%
    bitwise-and:         48.0ms +/- 5.2%
    nsieve-bits:         38.4ms +/- 1.8%

  controlflow:            4.8ms +/- 21.7%
    recursive:            4.8ms +/- 21.7%

  crypto:                81.6ms +/- 6.8%
    aes:                 29.2ms +/- 14.6%
    md5:                 27.4ms +/- 4.1%
    sha1:                25.0ms +/- 5.0%

  date:                 205.4ms +/- 16.0%
    format-tofte:        98.8ms +/- 26.2%
    format-xparb:       106.6ms +/- 7.0%

  math:                 140.8ms +/- 6.6%
    cordic:              43.0ms +/- 5.4%
    partial-sums:        73.4ms +/- 12.7%
    spectral-norm:       24.4ms +/- 2.8%

  regexp:                28.0ms +/- 30.3%
    dna:                 28.0ms +/- 30.3%

  string:               429.2ms +/- 3.5%
    base64:              46.4ms +/- 2.4%
    fasta:               75.6ms +/- 18.2%
    tagcloud:            82.6ms +/- 19.1%
    unpack-code:        136.6ms +/- 13.3%
    validate-input:      88.0ms +/- 19.9%&lt;/pre>
&lt;p>参考までに、こちらは同じPCで実行した Forefix3.0.7の実行結果&lt;/p>
&lt;pre>============================================
RESULTS (means and 95% confidence intervals)
--------------------------------------------
Total:                  7729.8ms +/- 1.8%
--------------------------------------------

  3d:                    592.2ms +/- 17.5%
    cube:                182.4ms +/- 30.4%
    morph:               219.0ms +/- 15.6%
    raytrace:            190.8ms +/- 11.2%

  access:                797.6ms +/- 4.9%
    binary-trees:        171.2ms +/- 4.0%
    fannkuch:            245.6ms +/- 10.6%
    nbody:               153.0ms +/- 19.0%
    nsieve:              227.8ms +/- 4.7%

  bitops:                486.6ms +/- 6.6%
    3bit-bits-in-byte:   117.2ms +/- 11.7%
    bits-in-byte:        139.8ms +/- 13.9%
    bitwise-and:          89.8ms +/- 2.7%
    nsieve-bits:         139.8ms +/- 14.2%

  controlflow:           116.8ms +/- 2.0%
    recursive:           116.8ms +/- 2.0%

  crypto:                397.2ms +/- 6.1%
    aes:                 145.2ms +/- 16.1%
    md5:                 122.2ms +/- 2.2%
    sha1:                129.8ms +/- 18.2%

  date:                 1860.0ms +/- 2.1%
    format-tofte:       1667.0ms +/- 2.1%
    format-xparb:        193.0ms +/- 2.4%

  math:                  528.4ms +/- 5.5%
    cordic:              199.0ms +/- 5.4%
    partial-sums:        168.8ms +/- 12.4%
    spectral-norm:       160.6ms +/- 20.2%

  regexp:                614.0ms +/- 7.0%
    dna:                 614.0ms +/- 7.0%

  string:               2337.0ms +/- 2.6%
    base64:              174.0ms +/- 8.5%
    fasta:               279.2ms +/- 0.9%
    tagcloud:            542.4ms +/- 4.1%
    unpack-code:        1094.4ms +/- 4.6%
    validate-input:      247.0ms +/- 3.7%&lt;/pre>
&lt;p>ちゃんと実行されているのだとすれば、かなり速いことがわかる&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_33.html">
<title>google chrome にちょっとびっくりした話</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2008/11/post_33.html</link>
<description>ものすごく地味な機能だけど、google chrome でテキスト部分をダブルクリックすると、辞書を参照しているとしか思えないような選択の仕方をする。 Firefoxやその他のWindows/linuxのアプリケーションでは、日本語をダブルクリックして単語選択しようとすると、平仮名、片仮名、漢字の連続を単語として認識するのが通常の動作だけれど、chromeじゃ、辞書に応じた選択がおこなわれる。 例えば、「この記事編集部分では」なんて文字列があるとき、「編集」あたりでダブルクリックすると、Firefoxなどでは「記事編集部分」の6文字が選択されるが、chromeじゃ「編集」だけが選択されるという具合。 動作に遅延もないので、ネットワークにアクセスしながらやっているわけではなさそう。 はたして、どうやってるのか、、、、 わからなければ、ソースがあるんだから、探せばいいやん、ということで、ソースプログラムを当ってみた。 果して、問題の箇所を発見。（linux版 chromiumのソースツリーを探索しました） src/third_party/icu38/source/data/brkitr/.svn/text-base/cjdict.txt.svn-base  上記ファイルに40万語ほどの日本語辞書を発見しました。この辞書をもとに単語境界を検索している模様。 日本語以外にも簡体中国語とタイ語の辞書があるようなので、少くともこの二つの言語では同様の処理が可能なのではないかと推測される。 やるねぇ、google。  </description>
<dc:date>2008-11-14T19:40:21+09:00</dc:date>
<content:encoded>&lt;p>ものすごく地味な機能だけど、&lt;a href="http://www.google.com/chrome/" target="_blank">google chrome&lt;/a> でテキスト部分をダブルクリックすると、辞書を参照しているとしか思えないような選択の仕方をする。&lt;br />
Firefoxやその他のWindows/linuxのアプリケーションでは、日本語をダブルクリックして単語選択しようとすると、平仮名、片仮名、漢字の連続を単語として認識するのが通常の動作だけれど、chromeじゃ、辞書に応じた選択がおこなわれる。&lt;br />
例えば、「この記事編集部分では」なんて文字列があるとき、「編集」あたりでダブルクリックすると、Firefoxなどでは「記事編集部分」の6文字が選択されるが、chromeじゃ「編集」だけが選択されるという具合。&lt;/p>
&lt;p>動作に遅延もないので、ネットワークにアクセスしながらやっているわけではなさそう。&lt;/p>
&lt;p>はたして、どうやってるのか、、、、&lt;br />
わからなければ、ソースがあるんだから、探せばいいやん、ということで、ソースプログラムを当ってみた。&lt;br />
果して、問題の箇所を発見。（linux版 chromiumのソースツリーを探索しました）&lt;/p>
&lt;blockquote>&lt;p>src/third_party/icu38/source/data/brkitr/.svn/text-base/cjdict.txt.svn-base&lt;/p>
&lt;/blockquote>
&lt;p>上記ファイルに40万語ほどの日本語辞書を発見しました。この辞書をもとに単語境界を検索している模様。&lt;br />
日本語以外にも簡体中国語とタイ語の辞書があるようなので、少くともこの二つの言語では同様の処理が可能なのではないかと推測される。&lt;br />
やるねぇ、google。&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_32.html">
<title>Mooseのお勉強（5）</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2008/11/post_32.html</link>
<description> Moose::Cookbook::Basics::Recipe3  - ちょっといい加減な二分木の例  概要          package BinaryTree;          use Moose;           has 'node' =&gt; (is =&gt; 'rw', isa =&gt; 'Any');           has 'parent' =&gt; (              is        =&gt; 'rw',              isa       =&gt; 'BinaryTree',              predicate =&gt; 'has_parent',              weak_ref  =&gt; 1,          );           has 'left' =&gt; (              is        =&gt; 'rw',              isa       =&gt; 'BinaryTree',              predicate =&gt; 'has_left',              lazy      =&gt; 1,              default   =&gt; sub { BinaryTree-&gt;new(parent =&gt; $_[0]) },          );           has 'right' =&gt; (              is        =&gt; 'rw',              isa       =&gt; 'BinaryTree',              predicate =&gt; 'has_right',              lazy      =&gt; 1,              default   =&gt; sub { BinaryTree-&gt;new(parent =&gt; $_[0]) },          );           before 'right', 'left' =&gt; sub {              my ($self, $tree) = @_;              $tree-&gt;parent($self) if defined $tree;          };  例によって、ここまで   とりあえず、サンプルプログラムを読んだだけで、いままでのレシピにはなかった、いくつかのことがわかる。 列挙してみる  attributeの 'Any'型指定  has の predicate オプションの存在  has の weak_ref オプションの存在  has の lazy オプションの存在  has の default オプションへ 関数リファレンスを渡すということ  before の引数として、複数のメソッド名を渡すことが可能だということ  で、説明を読むに、それぞれ、以下のようなことらしい。 attribute の 'Any'型指定 どんな値でもいい。ようするに型の指定なし、ということ。isaオプションが未指定の場合と全く同じ。  has の predicate オプション そのattributeが存在するかどうかをチェックするメソッドをオプションに指定した名前のメソッドとして生成してくれる  has の weak_ref オプション そのattributeが weakend referenceだという指定。 weakened reference については「プログラミングperl」なりその他のドキュメントを当るべし。  has の default オプションに関数リファレンスを渡す defaultに渡す値が文字列または数値以外の(初期値を指すリファレンスになるような)場合は、リファレンスをそのままdefaultに設定してしまうと、すべてのインスタンスで実体が同じものを指してしまって具合が悪いので、関数リファレンス中で生成した個別の実体を指すようにしなくてはいけない。そのために、関数リファレンスをdefaultの値として渡す、ということですね。これで、初期値を得るために、この関数が実行されて、戻り値を初期値として設定する、という動作になる。これは、attributeの型がオブジェクトではなくて、array や hash の場合でも同様。(新しく生成した配列やハッシュのリファレンスを返す関数を渡す)  has の lazy オプション まず、defaultオプションがないときにはlazyオプションの指定はできない(するとクラス生成時(*)にエラーになる)。このオプションが指定されると、attributeの生成は可能な限り遅らされる。最初に値を格納しようとしたときは、初期値の生成は実行されずに、指定した値を格納する。逆に、値を読み出そうとしたときは、その時点で初期値を生成して、値を返す。  before の引数として、複数のメソッド名を渡せる  これは見たまま。おそらく、最後の引数をそれ以前の引数で指定されるメソッドに適用する、という実装になっているのだと思われる。ちなみに、このbeforeで設定される関数でツリーの枝に接続するノードのparentノードを自分自身に設定するようになっている。   </description>
<dc:date>2008-11-13T20:48:58+09:00</dc:date>
<content:encoded>&lt;h1> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe3.pod" target="_blank">Moose::Cookbook::Basics::Recipe3&lt;/a>&lt;br />
 - ちょっといい加減な二分木の例&lt;/h1>
&lt;h2> 概要&lt;/h2>
&lt;pre>         package BinaryTree;
         use Moose;

         has 'node' =&amp;gt; (is =&amp;gt; 'rw', isa =&amp;gt; 'Any');

         has 'parent' =&amp;gt; (
             is        =&amp;gt; 'rw',
             isa       =&amp;gt; 'BinaryTree',
             predicate =&amp;gt; 'has_parent',
             weak_ref  =&amp;gt; 1,
         );

         has 'left' =&amp;gt; (
             is        =&amp;gt; 'rw',
             isa       =&amp;gt; 'BinaryTree',
             predicate =&amp;gt; 'has_left',
             lazy      =&amp;gt; 1,
             default   =&amp;gt; sub { BinaryTree-&amp;gt;new(parent =&amp;gt; $_[0]) },
         );

         has 'right' =&amp;gt; (
             is        =&amp;gt; 'rw',
             isa       =&amp;gt; 'BinaryTree',
             predicate =&amp;gt; 'has_right',
             lazy      =&amp;gt; 1,
             default   =&amp;gt; sub { BinaryTree-&amp;gt;new(parent =&amp;gt; $_[0]) },
         );

         before 'right', 'left' =&amp;gt; sub {
             my ($self, $tree) = @_;
             $tree-&amp;gt;parent($self) if defined $tree;
         };&lt;/pre>
&lt;hr />
&lt;p>例によって、ここまで&lt;/p>
&lt;hr />
&lt;p>とりあえず、サンプルプログラムを読んだだけで、いままでのレシピにはなかった、いくつかのことがわかる。&lt;br />
列挙してみる&lt;/p>
&lt;ul>&lt;li> attributeの 'Any'型指定&lt;/li>
&lt;li> has の predicate オプションの存在&lt;/li>
&lt;li> has の weak_ref オプションの存在&lt;/li>
&lt;li> has の lazy オプションの存在&lt;/li>
&lt;li> has の default オプションへ 関数リファレンスを渡すということ&lt;/li>
&lt;li> before の引数として、複数のメソッド名を渡すことが可能だということ&lt;/li>
&lt;/ul>
&lt;p>で、説明を読むに、それぞれ、以下のようなことらしい。&lt;/p>
&lt;dl>&lt;dt>attribute の 'Any'型指定&lt;/dt>
&lt;dd>どんな値でもいい。ようするに型の指定なし、ということ。isaオプションが未指定の場合と全く同じ。&lt;/dd>
&lt;/dl>
&lt;dl>&lt;dt>has の predicate オプション&lt;/dt>
&lt;dd>そのattributeが存在するかどうかをチェックするメソッドをオプションに指定した名前のメソッドとして生成してくれる&lt;/dd>
&lt;/dl>
&lt;dl>&lt;dt>has の weak_ref オプション&lt;/dt>
&lt;dd>そのattributeが weakend referenceだという指定。 weakened reference については「プログラミングperl」なりその他のドキュメントを当るべし。&lt;/dd>
&lt;/dl>
&lt;dl>&lt;dt>has の default オプションに関数リファレンスを渡す&lt;/dt>
&lt;dd>defaultに渡す値が文字列または数値以外の(初期値を指すリファレンスになるような)場合は、リファレンスをそのままdefaultに設定してしまうと、すべてのインスタンスで実体が同じものを指してしまって具合が悪いので、関数リファレンス中で生成した個別の実体を指すようにしなくてはいけない。そのために、関数リファレンスをdefaultの値として渡す、ということですね。これで、初期値を得るために、この関数が実行されて、戻り値を初期値として設定する、という動作になる。これは、attributeの型がオブジェクトではなくて、array や hash の場合でも同様。(新しく生成した配列やハッシュのリファレンスを返す関数を渡す)&lt;/dd>
&lt;/dl>
&lt;dl>&lt;dt>has の lazy オプション&lt;/dt>
&lt;dd>まず、defaultオプションがないときにはlazyオプションの指定はできない(するとクラス生成時(*)にエラーになる)。このオプションが指定されると、attributeの生成は可能な限り遅らされる。最初に値を格納しようとしたときは、初期値の生成は実行されずに、指定した値を格納する。逆に、値を読み出そうとしたときは、その時点で初期値を生成して、値を返す。&lt;/dd>
&lt;/dl>
&lt;dl>&lt;dt>before の引数として、複数のメソッド名を渡せる&lt;/dt>
&lt;dd> これは見たまま。おそらく、最後の引数をそれ以前の引数で指定されるメソッドに適用する、という実装になっているのだと思われる。ちなみに、このbeforeで設定される関数でツリーの枝に接続するノードのparentノードを自分自身に設定するようになっている。&lt;/dd>
&lt;/dl>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_31.html">
<title>Mooseのお勉強（4）</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2008/11/post_31.html</link>
<description> Moose::Cookbook::Basics::Recipe2  - 簡単な銀行口座の例  概要 package BankAccount; use Moose;  has 'balance' =&gt; (isa =&gt; 'Int', is =&gt; 'rw', default =&gt; 0);  sub deposit {   my ($self, $amount) = @_;   $self-&gt;balance($self-&gt;balance + $amount); }  sub withdraw {   my ($self, $amount) = @_;   my $current_balance = $self-&gt;balance();   ($current_balance &gt;= $amount)     || confess &amp;quot;Account overdrawn&amp;quot;;   $self-&gt;balance($current_balance - $amount); }  package CheckingAccount; use Moose;  extends 'BankAccount';  has 'overdraft_account' =&gt; (isa =&gt; 'BankAccount', is =&gt; 'rw');  before 'withdraw' =&gt; sub {   my ($self, $amount) = @_;   my $overdraft_amount = $amount - $self-&gt;balance();   if ($self-&gt;overdraft_account &amp;&amp; $overdraft_amount &gt; 0) {     $self-&gt;overdraft_account-&gt;withdraw($overdraft_amount);     $self-&gt;deposit($overdraft_amount);   } };  例によって、転写はここまで。    気になったところ この例で気になったのは、extends でも before でもなくて、BankAccount の withdraw メソッドの中にある confess という関数。 文脈から warn とか die とか croak みたいなもんだろうな、とは想像がつくのだけれど、実際に実行してみないことには、、、ということで、実行してみる。 withdraw に balance 以上の値をわたして実行してみると、以下のような出力が返ってきた。 Account overdrawn at BankAccount.pm line 14 BankAccount::withdraw('BankAccount=HASH(0x9c9ef50)', 101) called at BankAccount.pm line 30 Class::MOP::Class:::before('CheckingAccount=HASH(0x982a6e8)', 151) called at /usr/lib/perl5/Class/MOP/Method/Wrapped.pm line 47 Class::MOP::Method::Wrapped::__ANON__('CheckingAccount=HASH(0x982a6e8)', 151) called at /usr/lib/perl5/Class/MOP/Method/Wrapped.pm line 89 CheckingAccount::withdraw('CheckingAccount=HASH(0x982a6e8)', 151) called at moose.pl line 13  ようするに、バックトレース付きの croak ってことですね。おそらく Moose.pm からexport されている関数だろうし、APIリファレンスを当たれば説明がでているのだろうけど、今回は放置。。。。 FOOTNOTES の (4) を読むと、''throw an error'' とあるので、やはり croak と同様に die を実行するみたい。 あと、上の概要に示されているソースプログラムをmainプログラムの末尾にくっつけて実行してみたら、 Can't locate object method &amp;quot;balance&amp;quot; via package &amp;quot;BankAccount&amp;quot; at moose.pl line 27.  といわれてエラーになってしまった。(''moose.pl line 27'' はちょうど ''$self-&gt;balance($self-&gt;balance + $amount'' の行) BankAccount.pm って別ファイルに保存して use BankAccount; すれば正常に動作したので、なにかがマズかったんだろうけれど、なにがマズかったのかまでは未調査。 FOOTNOTES の (2) で クラスが使用される前にロードされていなければならない、みたいなことが書いてあるので、コンパイルされる順序の問題のようだ。 ようするに、該当するクラスを new する前に use するなり、定義してやるなりしないといけないということのよう。  その他のハイライト  has のオプションで isa に 'Int', default に 0 を設定している (BankAccount の ''balance'' attribute)。コンストラクタに引数として渡されない限り、この初期値で初期化される。  has のオプションで isa の値にクラス名が使える。(CheckingAccount の ''overdraft_account'')  スーパークラスのメソッドの実行前に実行される ''before'' method modifier。 SUPER::method_name(args) を使ってもほぼ同じことが実現可能だが、スーパークラス側の引数が追加された場合などに追従するのが大変になる。  isa=&gt;'BankAccount' と指定されているときに'CheckingAccount'はBankAccountのサブクラスなので、代入可能である。(通常のオブジェクト指向と同じ)   </description>
<dc:date>2008-11-12T20:01:59+09:00</dc:date>
<content:encoded>&lt;h1> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe2.pod" target="_blank">Moose::Cookbook::Basics::Recipe2&lt;/a>&lt;br />
 - 簡単な銀行口座の例&lt;/h1>
&lt;h2> 概要&lt;/h2>
&lt;pre>package BankAccount;
use Moose;

has 'balance' =&amp;gt; (isa =&amp;gt; 'Int', is =&amp;gt; 'rw', default =&amp;gt; 0);

sub deposit {
  my ($self, $amount) = @_;
  $self-&amp;gt;balance($self-&amp;gt;balance + $amount);
}

sub withdraw {
  my ($self, $amount) = @_;
  my $current_balance = $self-&amp;gt;balance();
  ($current_balance &amp;gt;= $amount)
    || confess &amp;quot;Account overdrawn&amp;quot;;
  $self-&amp;gt;balance($current_balance - $amount);
}

package CheckingAccount;
use Moose;

extends 'BankAccount';

has 'overdraft_account' =&amp;gt; (isa =&amp;gt; 'BankAccount', is =&amp;gt; 'rw');

before 'withdraw' =&amp;gt; sub {
  my ($self, $amount) = @_;
  my $overdraft_amount = $amount - $self-&amp;gt;balance();
  if ($self-&amp;gt;overdraft_account &amp;amp;&amp;amp; $overdraft_amount &amp;gt; 0) {
    $self-&amp;gt;overdraft_account-&amp;gt;withdraw($overdraft_amount);
    $self-&amp;gt;deposit($overdraft_amount);
  }
};&lt;/pre>
&lt;hr />
&lt;p>例によって、転写はここまで。&lt;/p>
&lt;hr />
&lt;h2> 気になったところ&lt;/h2>
&lt;p>この例で気になったのは、extends でも before でもなくて、BankAccount の withdraw メソッドの中にある confess という関数。&lt;br />
文脈から warn とか die とか croak みたいなもんだろうな、とは想像がつくのだけれど、実際に実行してみないことには、、、ということで、実行してみる。&lt;br />
withdraw に balance 以上の値をわたして実行してみると、以下のような出力が返ってきた。&lt;/p>
&lt;blockquote>&lt;p>Account overdrawn at BankAccount.pm line 14&lt;br />
BankAccount::withdraw('BankAccount=HASH(0x9c9ef50)', 101) called at BankAccount.pm line 30&lt;br />
Class::MOP::Class:::before('CheckingAccount=HASH(0x982a6e8)', 151) called at /usr/lib/perl5/Class/MOP/Method/Wrapped.pm line 47&lt;br />
Class::MOP::Method::Wrapped::__ANON__('CheckingAccount=HASH(0x982a6e8)', 151) called at /usr/lib/perl5/Class/MOP/Method/Wrapped.pm line 89&lt;br />
CheckingAccount::withdraw('CheckingAccount=HASH(0x982a6e8)', 151) called at moose.pl line 13&lt;/p>
&lt;/blockquote>
&lt;p>ようするに、バックトレース付きの croak ってことですね。おそらく Moose.pm からexport されている関数だろうし、APIリファレンスを当たれば説明がでているのだろうけど、今回は放置。。。。&lt;br />
FOOTNOTES の (4) を読むと、''throw an error'' とあるので、やはり croak と同様に die を実行するみたい。&lt;/p>
&lt;p>あと、上の概要に示されているソースプログラムをmainプログラムの末尾にくっつけて実行してみたら、&lt;/p>
&lt;blockquote>&lt;p>Can't locate object method &amp;quot;balance&amp;quot; via package &amp;quot;BankAccount&amp;quot; at moose.pl line 27.&lt;/p>
&lt;/blockquote>
&lt;p>といわれてエラーになってしまった。(''moose.pl line 27'' はちょうど ''$self-&amp;gt;balance($self-&amp;gt;balance + $amount'' の行)&lt;br />
BankAccount.pm って別ファイルに保存して use BankAccount; すれば正常に動作したので、なにかがマズかったんだろうけれど、なにがマズかったのかまでは未調査。&lt;br />
FOOTNOTES の (2) で クラスが使用される前にロードされていなければならない、みたいなことが書いてあるので、コンパイルされる順序の問題のようだ。&lt;br />
ようするに、該当するクラスを new する前に use するなり、定義してやるなりしないといけないということのよう。&lt;/p>
&lt;h2> その他のハイライト&lt;/h2>
&lt;ul>&lt;li> has のオプションで isa に 'Int', default に 0 を設定している (BankAccount の ''balance'' attribute)。コンストラクタに引数として渡されない限り、この初期値で初期化される。&lt;/li>
&lt;li> has のオプションで isa の値にクラス名が使える。(CheckingAccount の ''overdraft_account'')&lt;/li>
&lt;li> スーパークラスのメソッドの実行前に実行される ''before'' method modifier。 SUPER::method_name(args) を使ってもほぼ同じことが実現可能だが、スーパークラス側の引数が追加された場合などに追従するのが大変になる。&lt;/li>
&lt;li> isa=&amp;gt;'BankAccount' と指定されているときに'CheckingAccount'はBankAccountのサブクラスなので、代入可能である。(通常のオブジェクト指向と同じ)&lt;/li>
&lt;/ul>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_30.html">
<title>Mooseのお勉強（3）</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2008/11/post_30.html</link>
<description> Moose::Cookbook::Basics::Recipe1 - (古典的な)Point型の例  概要    package Point;    use Moose;       has 'x' =&gt; (isa =&gt; 'Int', is =&gt; 'rw', required =&gt; 1);    has 'y' =&gt; (isa =&gt; 'Int', is =&gt; 'rw', required =&gt; 1);     sub clear {        my $self = shift;        $self-&gt;x(0);        $self-&gt;y(0);    }     package Point3D;    use Moose;     extends 'Point';     has 'z' =&gt; (isa =&gt; 'Int', is =&gt; 'rw', required =&gt; 1);     after 'clear' =&gt; sub {        my $self = shift;        $self-&gt;z(0);    };     ....     # hash or hashrefs are ok for the constructor    my $point1 = Point-&gt;new(x =&gt; 5, y =&gt; 7);    my $point2 = Point-&gt;new({x =&gt; 5, y =&gt; 7});     my $point3d = Point3D-&gt;new(x =&gt; 5, y =&gt; 42, z =&gt; -5);  解説 古典的な Point の例である。Perl 6 Apocalypse 12 や K&amp;R C にも似たような例が載っている。  Perl 5 の他のクラスと同様、Mooseのクラスもパッケージとして定義する。 Mooseは &amp;quot;use Moose&amp;quot;を宣言した時点で &amp;quot;strict&amp;quot; 及び &amp;quot;warnings&amp;quot; を自動的に有効にする。 パッケージにMooseが読込まれると、'sugar'関数がエクスポートされる。これらは、Mooseのキーワードとして機能する。これらはperlのキーワードではないが、パッケージにエクスポートされた時点でそのように振る舞うように設計されている。 Moose は作成されたパッケージを自動的に Moose::Object のサブクラスとして定義するようになっている。 Moose::Objectクラスは属性(attribute)やその他の機能を果たすようなコンストラクタを提供する。詳しくは Moose::Object を参照のこと。   と、ここまで書いたけど、全部訳していると、時間がかかってしょうがないので、これ以降は、気がついたことや、やってみたことなどだけ、、、   method modifier メソッドをサブクラスで変更したい場合は、 method modifierを使う。 例には after キーワードで after 'clear' =&gt; sub {   my $self = shift;   $self-&gt;z(0); }; なる例が出てくる。 これを、 override キーワードを使って override 'clear' =&gt; sub {   my $self = shift;   super();   $self-&gt;z(0); }; とやっても、全く同じになる。 ここで、疑問発生。 引数がsuper()関数にも全く同じものが渡っているのだが、perlの関数引数(@_)ってば、呼び出された側で書換え可能だったはず。 どうなってるのかと思って、 use Moose;  extends 'Point';  has 'z' =&gt; (isa =&gt; 'Int', is =&gt; 'rw', required =&gt; 1);  override 'clear' =&gt; sub {   my $self = shift;   $_[0] = 10;   super();   $self-&gt;z(0); };  # hash or hashrefs are ok for the constructor my $point1 = Point-&gt;new(x =&gt; 5, y =&gt; 7); my $point2 = Point-&gt;new({x =&gt; 5, y =&gt; 7});  my $point3d = Point3D-&gt;new(x =&gt; 5, y =&gt; 42, z =&gt; -5);  $point3d-&gt;clear('a'); こうやってみた。 すると、 Modification of a read-only value attempted at test.pl line 26.  とのことで、関数への引数は read-only でロックされてしまうようだ。  </description>
<dc:date>2008-11-10T19:11:28+09:00</dc:date>
<content:encoded>&lt;h1> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe1.pod" target="_blank">Moose::Cookbook::Basics::Recipe1&lt;/a> - (古典的な)Point型の例&lt;/h1>
&lt;h2> 概要&lt;/h2>
&lt;pre>   package Point;
   use Moose;
  
   has 'x' =&amp;gt; (isa =&amp;gt; 'Int', is =&amp;gt; 'rw', required =&amp;gt; 1);
   has 'y' =&amp;gt; (isa =&amp;gt; 'Int', is =&amp;gt; 'rw', required =&amp;gt; 1);

   sub clear {
       my $self = shift;
       $self-&amp;gt;x(0);
       $self-&amp;gt;y(0);
   }

   package Point3D;
   use Moose;

   extends 'Point';

   has 'z' =&amp;gt; (isa =&amp;gt; 'Int', is =&amp;gt; 'rw', required =&amp;gt; 1);

   after 'clear' =&amp;gt; sub {
       my $self = shift;
       $self-&amp;gt;z(0);
   };

   ....

   # hash or hashrefs are ok for the constructor
   my $point1 = Point-&amp;gt;new(x =&amp;gt; 5, y =&amp;gt; 7);
   my $point2 = Point-&amp;gt;new({x =&amp;gt; 5, y =&amp;gt; 7});

   my $point3d = Point3D-&amp;gt;new(x =&amp;gt; 5, y =&amp;gt; 42, z =&amp;gt; -5);&lt;/pre>
&lt;h2> 解説&lt;/h2>
&lt;p>古典的な Point の例である。Perl 6 Apocalypse 12 や K&amp;amp;R C にも似たような例が載っている。&lt;/p>
&lt;p>Perl 5 の他のクラスと同様、Mooseのクラスもパッケージとして定義する。 Mooseは &amp;quot;use Moose&amp;quot;を宣言した時点で &amp;quot;strict&amp;quot; 及び &amp;quot;warnings&amp;quot; を自動的に有効にする。&lt;/p>
&lt;p>パッケージにMooseが読込まれると、'sugar'関数がエクスポートされる。これらは、Mooseのキーワードとして機能する。これらはperlのキーワードではないが、パッケージにエクスポートされた時点でそのように振る舞うように設計されている。&lt;/p>
&lt;p>Moose は作成されたパッケージを自動的に Moose::Object のサブクラスとして定義するようになっている。 Moose::Objectクラスは属性(attribute)やその他の機能を果たすようなコンストラクタを提供する。詳しくは &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Object.pm" target="_blank">Moose::Object&lt;/a> を参照のこと。&lt;/p>
&lt;hr />
&lt;p>&lt;big>&lt;big> と、ここまで書いたけど、全部訳していると、時間がかかってしょうがないので、これ以降は、気がついたことや、やってみたことなどだけ、、、&lt;/big>&lt;/big>&lt;/p>
&lt;hr />
&lt;h2> method modifier&lt;/h2>
&lt;p>メソッドをサブクラスで変更したい場合は、 method modifierを使う。&lt;br />
例には after キーワードで&lt;/p>
&lt;pre>after 'clear' =&amp;gt; sub {
  my $self = shift;
  $self-&amp;gt;z(0);
};&lt;/pre>
&lt;p>なる例が出てくる。&lt;br />
これを、 override キーワードを使って&lt;/p>
&lt;pre>override 'clear' =&amp;gt; sub {
  my $self = shift;
  super();
  $self-&amp;gt;z(0);
};&lt;/pre>
&lt;p>とやっても、全く同じになる。&lt;br />
ここで、疑問発生。&lt;br />
引数がsuper()関数にも全く同じものが渡っているのだが、perlの関数引数(@_)ってば、呼び出された側で書換え可能だったはず。&lt;br />
どうなってるのかと思って、&lt;/p>
&lt;pre>use Moose;

extends 'Point';

has 'z' =&amp;gt; (isa =&amp;gt; 'Int', is =&amp;gt; 'rw', required =&amp;gt; 1);

override 'clear' =&amp;gt; sub {
  my $self = shift;
  $_[0] = 10;
  super();
  $self-&amp;gt;z(0);
};

# hash or hashrefs are ok for the constructor
my $point1 = Point-&amp;gt;new(x =&amp;gt; 5, y =&amp;gt; 7);
my $point2 = Point-&amp;gt;new({x =&amp;gt; 5, y =&amp;gt; 7});

my $point3d = Point3D-&amp;gt;new(x =&amp;gt; 5, y =&amp;gt; 42, z =&amp;gt; -5);

$point3d-&amp;gt;clear('a');&lt;/pre>
&lt;p>こうやってみた。&lt;br />
すると、&lt;/p>
&lt;blockquote>&lt;p>Modification of a read-only value attempted at test.pl line 26.&lt;/p>
&lt;/blockquote>
&lt;p>とのことで、関数への引数は read-only でロックされてしまうようだ。&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_28.html">
<title>Mooseのお勉強（2）</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2008/11/post_28.html</link>
<description> Moose::Coockbook 各Cookbookのレシピの目次  Mooseの基礎  Moose::Cookbook::Basics::Recipe1 シンプルなPoint のMooseによる実装例。 attribute とsubclass のデモ。   Moose::Cookbook::Basics::Recipe2 シンプルな銀行口座の例。もう少し複雑なクラス。 サブクラス内のメソッドとmodifier のデモ。   Moose::Cookbook::Basics::Recipe3 ちょっといい加減な二分木の例。 いくつかのattributeの機能のデモ。型(type), weak reference, predicate(どのオブジェクトに属しているのか）, 初期値、それにattributeのアクション（''uction''と書かれているが''action''のTYPO?)   Moose::Cookbook::Basics::Recipe4 副型（subtype)と単純な会社クラス構造の構築。 独自の型の作成、 ''BUILD''メソッド（コンストラクタ）、 サブクラスでのオーバーライドの使い方を紹介。   Moose::Cookbook::Basics::Recipe5 副型（subtype)と強制（coercion)をつかったRequestクラス。 型の強制（coercion)を含む型についての追加の例   Moose::Cookbook::Basics::Recipe6 内部引数（？、 The Augment/inner)についての例 ''augment'' method modifireのデモ。メソッドオーバーライドのような方法を提供する   Moose::Cookbook::Basics::Recipe7 immutable を使ってMooseを高速化。 アクセサやオブジェクトの動作を劇的に高速化するimmutable class を作る   Moose::Cookbook::Basics::Recipe8 トリガを使った複合連結の管理(TODO) （まだ説明がありません）   Moose::Cookbook::Basics::Recipe9 Builderメソッドとlazy_build builder機能はattributeの初期値に継承可能でroleを構成できる機能を提供する   Moose::Cookbook::Basics::Recipe10 演算子のオーバーロード、副型(subtype),強制（coercion) 演算子のオーバーロード、強制、副型を目の色が決定される仕組みをモデルにしてデモします。   Moose::Cookbook::Basics::Recipe11 BUILDとBUILDARGS(TODO) この機能を解説するちょうどいいデモを求めています！！   MooseのRole 以下のレシピはどのようにしてMooseのRoleを使うかを解説しています。   Moose::Cookbook::Roles::Recipe1 Moose::Roleの例 trait とか mix-in などとして知られている role についてのデモ。 role は コードの再利用に関して サブクラスとは別のアプローチになる方法を提供します。   Moose::Cookbook::Roles::Recipe2 より進んだ role の使いかた - メソッドの外部定義（exclude)およびエイリアス（aliasing) roleの一部分をクラスのなかに含めたいと思うことがあるでしょう。また,roleの全体を含めたいと思ったときにいくつかのメソッドがもともとあるメソッドと衝突することがあるかもしれません。メソッドの外部定義やエイリアスを使用すればこのような問題に対処できます。   Moose::Cookbook::Roles::Recipe3 実行時role制御 （まだ説明がありません）   Meta Moose 以下のレシピは Mooseを使ったオブジェクトシステムの拡張をおこなうための meta class の書き方を解説しています。   Moose::Cookbook::Meta::Recipe1 metaの世界へようこそ(どうしてmetaが必要なの？) もし、どうしてこのmetaなるものが面白いのか、何を心配すべきなのかと考えているのであれば、このレシピを読んでください。   Moose::Cookbook::Meta::Recipe2 meta-attribute, ラベルつきattribute Mooseを拡張するひとつの方法は attribute metaclass を使う方法です。attribute metaclass は has によるattribute を拡張し、追加のattributeの機能を使えるようにします。   Moose::Cookbook::Meta::Recipe3 attribute trait を使ったラベルの実装 拡張されたMoose の attribute metaclass は様々な機能をもたらします。ただし、attributeはひとつのmetaclassしか持つことはできません。roleをattribute metaclassに適用することによって、attributeの機能を構成することができます。   Moose::Cookbook::Meta::Recipe4 metaclass への ''table'' attribute の追加 あなたが作成したclassにより多くの情報を詰め込みたいなら、 &amp;quot;Moose::Meta::Class&amp;quot; を拡張しましょう。方法はいたって簡単ですが、もうちょっと砂糖を入れたいと思ったときは Moose::Cookbook::Extending::Recipe2を読んでください。   Moose::Cookbook::Meta::Recipe5 metaclass trait として実装された ''table'' attribute この例は 前のレシピで実装した class の metaclass を metaclass trait として実装したものです。   Moose::Cookbook::Meta::Recipe6 immutabilization systemにhookをかける(TODO) Mooseには ''immutabilization'' といわれる機能があります。''__PACKAGE__-&gt;meta()-&gt;make_immutable()'' をclass(やattribute, roleなど)を定義したあとに呼び出すことで、Mooseがどのようにしてオブジェクトの生成やattributeへのアクセスなど、そういったものを最適化するかを知ることができます。 metaclassを作成したら、immutabilization systemにhookをかける必要があるかもしれません。これは metaclass class, meta method classや可能ならmeta-instance classなどを含む多くのスポットを横断します。 このレシピはimmutabilize属性の拡張をおこなう方法を示しています。   Moose::Cookbook::Meta::Recipe7 meta-instance(TODO) （まだ説明がありません）   Mooseの拡張 これらのレシピは更なるMooseの拡張や ''MooseX''モジュールの作成の方法について書かれています。   Moose::Cookbook::Extending::Recipe1 Mooseの拡張の概要 Mooseを拡張するには、いくつもの方法があります。このレシピでは、それぞれの方法について概要を示し、その方法がどういう場合に適切かを示します。   Moose::Cookbook::Extending::Recipe2 基本object class roleの構築 多くの基本object class拡張はroleによって構築することができます。この例ではclassに抽象的なMooseX::Debuggingモジュールを使った基本object class をデバッグするroleを示します。   Moose::Cookbook::Extending::Recipe3 alternate base object class の構築 Mooseを使っているとmeta extensionを持った、alternate(代理) base object classを使いたいと思うようなことがあるかもしれません。あるいは、&amp;quot;extends 'MyApp::Bsse'&amp;quot;とtypeすることなしに別の機能を持った同じような class を使いたいと思うようなことがあるかもしれません。   Moose::Cookbook::Extending::Recipe4 Moose.pmのような、Mooseスタイルの砂糖 このレシピでは、&amp;quot;Moose.pm&amp;quot;の置き換え方法を示します。&amp;quot;MooseX&amp;quot;モジュールAPIのようなもの、特にmetaclassやbase object classのデフォルト動作を変更したい場合など。   おつまみ Moose::Cookbook::Snack::Keywords Moose::Cookbook::Snack::Types   </description>
<dc:date>2008-11-06T19:44:16+09:00</dc:date>
<content:encoded>&lt;h1> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe1.pod" target="_blank">Moose::Coockbook&lt;/a>&lt;/h1>
&lt;p>各Cookbookのレシピの目次&lt;/p>
&lt;h2> Mooseの基礎&lt;/h2>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe1.pod" target="_blank">Moose::Cookbook::Basics::Recipe1&lt;/a>&lt;/h3>
&lt;p>シンプルなPoint のMooseによる実装例。&lt;br />
attribute とsubclass のデモ。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe2.pod" target="_blank">Moose::Cookbook::Basics::Recipe2&lt;/a>&lt;/h3>
&lt;p>シンプルな銀行口座の例。もう少し複雑なクラス。&lt;br />
サブクラス内のメソッドとmodifier のデモ。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe3.pod" target="_blank">Moose::Cookbook::Basics::Recipe3&lt;/a>&lt;/h3>
&lt;p>ちょっといい加減な二分木の例。&lt;br />
いくつかのattributeの機能のデモ。型(type), weak reference, predicate(どのオブジェクトに属しているのか）, 初期値、それにattributeのアクション（''uction''と書かれているが''action''のTYPO?)&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe4.pod" target="_blank">Moose::Cookbook::Basics::Recipe4&lt;/a>&lt;/h3>
&lt;p>副型（subtype)と単純な会社クラス構造の構築。&lt;br />
独自の型の作成、 ''BUILD''メソッド（コンストラクタ）、 サブクラスでのオーバーライドの使い方を紹介。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe5.pod" target="_blank">Moose::Cookbook::Basics::Recipe5&lt;/a>&lt;/h3>
&lt;p>副型（subtype)と強制（coercion)をつかったRequestクラス。&lt;br />
型の強制（coercion)を含む型についての追加の例&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe6.pod" target="_blank">Moose::Cookbook::Basics::Recipe6&lt;/a>&lt;/h3>
&lt;p>内部引数（？、 The Augment/inner)についての例&lt;br />
''augment'' method modifireのデモ。メソッドオーバーライドのような方法を提供する&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe7.pod" target="_blank">Moose::Cookbook::Basics::Recipe7&lt;/a>&lt;/h3>
&lt;p>immutable を使ってMooseを高速化。&lt;br />
アクセサやオブジェクトの動作を劇的に高速化するimmutable class を作る&lt;/p>
&lt;h3> Moose::Cookbook::Basics::Recipe8&lt;/h3>
&lt;p>トリガを使った複合連結の管理(TODO)&lt;br />
（まだ説明がありません）&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe9.pod" target="_blank">Moose::Cookbook::Basics::Recipe9&lt;/a>&lt;/h3>
&lt;p>Builderメソッドとlazy_build&lt;br />
builder機能はattributeの初期値に継承可能でroleを構成できる機能を提供する&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe10.pod" target="_blank">Moose::Cookbook::Basics::Recipe10&lt;/a>&lt;/h3>
&lt;p>演算子のオーバーロード、副型(subtype),強制（coercion)&lt;br />
演算子のオーバーロード、強制、副型を目の色が決定される仕組みをモデルにしてデモします。&lt;/p>
&lt;h3> Moose::Cookbook::Basics::Recipe11&lt;/h3>
&lt;p>BUILDとBUILDARGS(TODO)&lt;br />
この機能を解説するちょうどいいデモを求めています！！&lt;/p>
&lt;h2> MooseのRole&lt;/h2>
&lt;p>以下のレシピはどのようにしてMooseのRoleを使うかを解説しています。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Roles/Recipe1.pod" target="_blank">Moose::Cookbook::Roles::Recipe1&lt;/a>&lt;/h3>
&lt;p>Moose::Roleの例&lt;br />
trait とか mix-in などとして知られている role についてのデモ。 role は コードの再利用に関して サブクラスとは別のアプローチになる方法を提供します。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Roles/Recipe2.pod" target="_blank">Moose::Cookbook::Roles::Recipe2&lt;/a>&lt;/h3>
&lt;p>より進んだ role の使いかた - メソッドの外部定義（exclude)およびエイリアス（aliasing)&lt;br />
roleの一部分をクラスのなかに含めたいと思うことがあるでしょう。また,roleの全体を含めたいと思ったときにいくつかのメソッドがもともとあるメソッドと衝突することがあるかもしれません。メソッドの外部定義やエイリアスを使用すればこのような問題に対処できます。&lt;/p>
&lt;h3> Moose::Cookbook::Roles::Recipe3&lt;/h3>
&lt;p>実行時role制御&lt;br />
（まだ説明がありません）&lt;/p>
&lt;h2> Meta Moose&lt;/h2>
&lt;p>以下のレシピは Mooseを使ったオブジェクトシステムの拡張をおこなうための meta class の書き方を解説しています。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Meta/Recipe1.pod" target="_blank">Moose::Cookbook::Meta::Recipe1&lt;/a>&lt;/h3>
&lt;p>metaの世界へようこそ(どうしてmetaが必要なの？)&lt;br />
もし、どうしてこのmetaなるものが面白いのか、何を心配すべきなのかと考えているのであれば、このレシピを読んでください。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Meta/Recipe2.pod" target="_blank">Moose::Cookbook::Meta::Recipe2&lt;/a>&lt;/h3>
&lt;p>meta-attribute, ラベルつきattribute&lt;br />
Mooseを拡張するひとつの方法は attribute metaclass を使う方法です。attribute metaclass は has によるattribute を拡張し、追加のattributeの機能を使えるようにします。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Meta/Recipe3.pod" target="_blank">Moose::Cookbook::Meta::Recipe3&lt;/a>&lt;/h3>
&lt;p>attribute trait を使ったラベルの実装&lt;br />
拡張されたMoose の attribute metaclass は様々な機能をもたらします。ただし、attributeはひとつのmetaclassしか持つことはできません。roleをattribute metaclassに適用することによって、attributeの機能を構成することができます。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Meta/Recipe4.pod" target="_blank">Moose::Cookbook::Meta::Recipe4&lt;/a>&lt;/h3>
&lt;p>metaclass への ''table'' attribute の追加&lt;br />
あなたが作成したclassにより多くの情報を詰め込みたいなら、 &amp;quot;Moose::Meta::Class&amp;quot; を拡張しましょう。方法はいたって簡単ですが、もうちょっと砂糖を入れたいと思ったときは &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Extending/Recipe2.pod" target="_blank">Moose::Cookbook::Extending::Recipe2&lt;/a>を読んでください。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Meta/Recipe5.pod" target="_blank">Moose::Cookbook::Meta::Recipe5&lt;/a>&lt;/h3>
&lt;p>metaclass trait として実装された ''table'' attribute&lt;br />
この例は 前のレシピで実装した class の metaclass を metaclass trait として実装したものです。&lt;/p>
&lt;h3> Moose::Cookbook::Meta::Recipe6&lt;/h3>
&lt;p>immutabilization systemにhookをかける(TODO)&lt;br />
Mooseには ''immutabilization'' といわれる機能があります。''__PACKAGE__-&amp;gt;meta()-&amp;gt;make_immutable()'' をclass(やattribute, roleなど)を定義したあとに呼び出すことで、Mooseがどのようにしてオブジェクトの生成やattributeへのアクセスなど、そういったものを最適化するかを知ることができます。&lt;br />
metaclassを作成したら、immutabilization systemにhookをかける必要があるかもしれません。これは metaclass class, meta method classや可能ならmeta-instance classなどを含む多くのスポットを横断します。&lt;br />
このレシピはimmutabilize属性の拡張をおこなう方法を示しています。&lt;/p>
&lt;h3> Moose::Cookbook::Meta::Recipe7&lt;/h3>
&lt;p>meta-instance(TODO)&lt;br />
（まだ説明がありません）&lt;/p>
&lt;h2> Mooseの拡張&lt;/h2>
&lt;p>これらのレシピは更なるMooseの拡張や ''MooseX''モジュールの作成の方法について書かれています。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Extending/Recipe1.pod" target="_blank">Moose::Cookbook::Extending::Recipe1&lt;/a>&lt;/h3>
&lt;p>Mooseの拡張の概要&lt;br />
Mooseを拡張するには、いくつもの方法があります。このレシピでは、それぞれの方法について概要を示し、その方法がどういう場合に適切かを示します。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Extending/Recipe2.pod" target="_blank">Moose::Cookbook::Extending::Recipe2&lt;/a>&lt;/h3>
&lt;p>基本object class roleの構築&lt;br />
多くの基本object class拡張はroleによって構築することができます。この例ではclassに抽象的なMooseX::Debuggingモジュールを使った基本object class をデバッグするroleを示します。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Extending/Recipe3.pod" target="_blank">Moose::Cookbook::Extending::Recipe3&lt;/a>&lt;/h3>
&lt;p>alternate base object class の構築&lt;br />
Mooseを使っているとmeta extensionを持った、alternate(代理) base object classを使いたいと思うようなことがあるかもしれません。あるいは、&amp;quot;extends 'MyApp::Bsse'&amp;quot;とtypeすることなしに別の機能を持った同じような class を使いたいと思うようなことがあるかもしれません。&lt;/p>
&lt;h3> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Extending/Recipe4.pod" target="_blank">Moose::Cookbook::Extending::Recipe4&lt;/a>&lt;/h3>
&lt;p>Moose.pmのような、Mooseスタイルの砂糖&lt;br />
このレシピでは、&amp;quot;Moose.pm&amp;quot;の置き換え方法を示します。&amp;quot;MooseX&amp;quot;モジュールAPIのようなもの、特にmetaclassやbase object classのデフォルト動作を変更したい場合など。&lt;/p>
&lt;h2> おつまみ&lt;/h2>
&lt;p>&lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Snack/Keywords.pod" target="_blank">Moose::Cookbook::Snack::Keywords&lt;/a>&lt;br />
&lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Snack/Types.pod" target="_blank">Moose::Cookbook::Snack::Types&lt;/a>&lt;/p>

</content:encoded>
</item>

<item rdf:about="http://blog.d-pad.co.jp/sugi/contents/2008/11/post_26.html">
<title>Mooseのお勉強（1）</title>
<link>http://blog.d-pad.co.jp/sugi/contents/2008/11/post_26.html</link>
<description>Mooseのドキュメントを読んでの覚書  Moose::Intro  new, DESTROYメソッドは作ってはいけない   Class  class は attribute を持つことができる  class は method を持つことができる  class は superclass を持つことができる  class は method modifier を持つことができる  class では role が実行されることがある  class は コンストラクタとデストラクタを持つことができる。（ただし、new, DESTORYという名前ではなく BUILD(), DEMOLISH() という名前のメソッドになる）  コンストラクタには名前つき引数を与えてインスタンスのattributeを初期化することができる  class は metaclassを持つ。 metaclassには meta-attribute, meta-method, meta-role が含まれる。 metaclassはインスタンスから取得できるclassの定義そのもの。    Attribute  attribute は read/writeフラグ, 型, アクセサメソッド,  delegation, 初期値、その他を持つ。  attribute はそのまま参照することはできない（してはいけない）。かならずアクセサを使って参照/書換えをおこなう。    Method  普通に sub で関数を作ればいい。    Role  Javaでいうところのinterface  role は attribute を持つことができる  role は method を持つことができる  role は method modifier を持つことができる  role は required method (Javaでいうところの abstruct function) を持つことができる  role を定義するには Moose::Role を use する    Method Modifier  method modirier をつかって、method に hook をかけることができる  ''before'', ''after'', ''around'', ''augment'' が使える  ひとつのmethodに複数のmodifierをかけることができる    型（Type)  attributeには型による制約を付けることができる  ''Str'', ''Num'', ''Bool'', ''HashRef'' などのMoose組込型がある  クラス名をそのまま型名として使える    Delegation  attribute が class のときにそのクラスのインスタンスメソッドに別名を付けてアクセスできるようにする機能(?)  例えば下のように定義されているとき、$obj-&gt;date_of_last_login() は last_login-&gt;date() として機能する （で、いいのかな？）   has 'last_login' =&gt; (   is =&gt; 'rw',   isa =&gt; 'DateTime',   handles =&gt; { 'date_of_last_login' =&gt; 'date' }, );  コンストラクタとデストラクタ  コンストラクタは BUILD() として定義する。 Moose::Object の new メソッド内から呼び出される  デストラクタは DEMOLISH() として定義する。    metaclass  metaclassを使ってインスタンスから class の定義を取得することができる。  Moose::Object の meta() メソッドを呼び出してそのインスタンスのmetaclass を取得できる。取得したmetaclassデータは Moose::Meta::Class オブジェクト。    </description>
<dc:date>2008-11-05T21:21:28+09:00</dc:date>
<content:encoded>&lt;p>Mooseのドキュメントを読んでの覚書&lt;/p>
&lt;h1> &lt;a href="http://search.cpan.org/~drolsky/Moose/lib/Moose/Intro.pod" target="_blank">Moose::Intro&lt;/a>&lt;/h1>
&lt;ul>&lt;li> new, DESTROYメソッドは作ってはいけない&lt;/li>
&lt;/ul>
&lt;h2> Class&lt;/h2>
&lt;ul>&lt;li> class は attribute を持つことができる&lt;/li>
&lt;li> class は method を持つことができる&lt;/li>
&lt;li> class は superclass を持つことができる&lt;/li>
&lt;li> class は method modifier を持つことができる&lt;/li>
&lt;li> class では role が実行されることがある&lt;/li>
&lt;li> class は コンストラクタとデストラクタを持つことができる。（ただし、new, DESTORYという名前ではなく BUILD(), DEMOLISH() という名前のメソッドになる）&lt;/li>
&lt;li> コンストラクタには名前つき引数を与えてインスタンスのattributeを初期化することができる&lt;/li>
&lt;li> class は metaclassを持つ。 metaclassには meta-attribute, meta-method, meta-role が含まれる。 metaclassはインスタンスから取得できるclassの定義そのもの。&lt;/li>
&lt;/ul>
&lt;h2> Attribute&lt;/h2>
&lt;ul>&lt;li> attribute は read/writeフラグ, 型, アクセサメソッド,  delegation, 初期値、その他を持つ。&lt;/li>
&lt;li> attribute はそのまま参照することはできない（してはいけない）。かならずアクセサを使って参照/書換えをおこなう。&lt;/li>
&lt;/ul>
&lt;h2> Method&lt;/h2>
&lt;ul>&lt;li> 普通に sub で関数を作ればいい。&lt;/li>
&lt;/ul>
&lt;h2> Role&lt;/h2>
&lt;ul>&lt;li> Javaでいうところのinterface&lt;/li>
&lt;li> role は attribute を持つことができる&lt;/li>
&lt;li> role は method を持つことができる&lt;/li>
&lt;li> role は method modifier を持つことができる&lt;/li>
&lt;li> role は required method (Javaでいうところの abstruct function) を持つことができる&lt;/li>
&lt;li> role を定義するには Moose::Role を use する&lt;/li>
&lt;/ul>
&lt;h2> Method Modifier&lt;/h2>
&lt;ul>&lt;li> method modirier をつかって、method に hook をかけることができる&lt;/li>
&lt;li> ''before'', ''after'', ''around'', ''augment'' が使える&lt;/li>
&lt;li> ひとつのmethodに複数のmodifierをかけることができる&lt;/li>
&lt;/ul>
&lt;h2> 型（Type)&lt;/h2>
&lt;ul>&lt;li> attributeには型による制約を付けることができる&lt;/li>
&lt;li> ''Str'', ''Num'', ''Bool'', ''HashRef'' などのMoose組込型がある&lt;/li>
&lt;li> クラス名をそのまま型名として使える&lt;/li>
&lt;/ul>
&lt;h2> Delegation&lt;/h2>
&lt;ul>&lt;li> attribute が class のときにそのクラスのインスタンスメソッドに別名を付けてアクセスできるようにする機能(?)&lt;/li>
&lt;li> 例えば下のように定義されているとき、$obj-&amp;gt;date_of_last_login() は last_login-&amp;gt;date() として機能する （で、いいのかな？）&lt;/li>
&lt;/ul>
&lt;pre>has 'last_login' =&amp;gt; (
  is =&amp;gt; 'rw',
  isa =&amp;gt; 'DateTime',
  handles =&amp;gt; { 'date_of_last_login' =&amp;gt; 'date' },
);&lt;/pre>
&lt;h2> コンストラクタとデストラクタ&lt;/h2>
&lt;ul>&lt;li> コンストラクタは BUILD() として定義する。 Moose::Object の new メソッド内から呼び出される&lt;/li>
&lt;li> デストラクタは DEMOLISH() として定義する。&lt;/li>
&lt;/ul>
&lt;h2> metaclass&lt;/h2>
&lt;ul>&lt;li> metaclassを使ってインスタンスから class の定義を取得することができる。&lt;/li>
&lt;li> Moose::Object の meta() メソッドを呼び出してそのインスタンスのmetaclass を取得できる。取得したmetaclassデータは Moose::Meta::Class オブジェクト。&lt;/li>
&lt;/ul>

</content:encoded>
</item>

</rdf:RDF>