hns - 日記自動生成システム - Version 2.19.7

void GraphicWizardsLair( void ); //

otsune GWL
FreeBSD, AfterEffects, RETAS, animo, DigitalAnime, Linux, Mac OS, Win2k

[Who is otsune?] [title] [message] [Policy] [注目エントリー] [top]
Twitter Status :


Namazu for hns による簡易全文検索
詳しくは 詳細指定/ヘルプを参照して下さい

検索式:

先月 2006年10月 来月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31


2006年10月01日() [長年日記]

#1 [FreeBSD] FreeBSD-SA-06:22.openssh_

cd /usr/src
make update
cd /usr/src/secure/lib/libssh
make obj && make depend && make && make install
cd /usr/src/secure/usr.sbin/sshd
make obj && make depend && make && make install
Permalink: http://www.otsune.com/diary/2006/10/01/1.html#200610011
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-01 00:00:00 By otsune

2006年10月06日(金) [長年日記]

#1 [home][mobile] pic@nicからMy WILLCOMへの統合で、番号登録が上手く行かない

どうも WILLCOM|Pic@nicからの移行、My WILLCOMへの電話番号登録が出来ないお客さまへ_
契約情報に固定電話またはIP電話番号が登録されていない
に引っかかっているらしい。
ちゅーか1回線しか登録していないんだから、その1回線ぐらい問答無用にMy WILLCOMに加えさせてくれよ。
Permalink: http://www.otsune.com/diary/2006/10/06/1.html#200610061
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-06 00:00:00 By otsune

2006年10月07日() [長年日記]

#1 [mac] iTerm 0.9.0にアップデート

iTerm_ が0.9.0になったので入れ替え。
標準のTerminalでもtcshを使う時はウインドウ設定から「ターミナルインスペクタ→エミュレーション→非ASCII文字をエスケープする」をオフにすれば日本語も問題なく使えるので特に問題ないんだけど。やっぱりタブ使えるiTermは便利。
Permalink: http://www.otsune.com/diary/2006/10/07/1.html#200610071
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-07 00:00:00 By otsune

2006年10月09日(月) [長年日記]

#1 [TeX][DTP] 「医学書等数式を取り扱う印刷会社」で、TeXが嫌がられているという凄い話

日本のフルバッチシステムで著名なTEXについて_ から。
M.C.P.C.: TEX原稿を印刷業界で持てあましている件_ から見つけた。そのM.C.P.C.でも説明されているように
まず、TEX は PostScript 書き出せるので印刷屋さんに出せるよね、ていう、研究者側の意見がありますが、古き良き時代と違って、印刷屋さん側の PS 処理系は異常進化を遂げてしまったので、実際には生 PS を取り扱うっていうケースは少なくて(ドラッグ&ドロップしかしないね)、むしろ PS はバックヤードに隠れて作業しているというのがほとんどの印刷屋さんでの扱いです。だから、研究者側が思っているように、GhostScript で出力できたから出るだろ、ていう次元の話ではないです。
という感じで「PostScriptにさえすれば問題なく印刷物に成る」という常識が、DTPでは通用しなくなっているとのこと。

コメントを読む(1) [ コメントする ]

Re: 「医学書等数式を取り扱う印刷会社」で、TeXが嫌がられているという凄い話 by 太洋    2006/10/09 11:10
全ページ、ノンブルや目次まで含めて完全原稿をTEXで組んでくれるなら皆歓迎するので...
Permalink: http://www.otsune.com/diary/2006/10/09/1.html#200610091
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-09 00:00:00 By otsune

#2 [FreeBSD][jail] jailでプライベートアドレスにWebサーバーを立てて、IPv6で待ち受けたlighttpdで転送してアクセスさせるTips

arved's weblog: This Blog and IPv6_ から。
apacheのmod_proxyで似たようなことは良くやるけど、確かにlightyでも出来るよな。
Permalink: http://www.otsune.com/diary/2006/10/09/2.html#200610092
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-09 00:00:00 By otsune

#3 [neta] ソーシャルブックマークに同じblogをいくつも登録していたら「このblogのRSSフィードをRSSリーダーに登録しておきますか?」とおせっかいする機能

というのが clmemo@aka: ソーシャル・ブックマークからフィード・リーダーへの登録喚起が出きないものか_ で。
今まで手動で何にも困っていなかったから、その発想はなかったわ。
あとは「ソーシャルブックマークはやたらと使うけど、RSSリーダーへの登録はしんどいからやっていない」という類いの人の需要を掘り起こせればよさそう。
発展アイデアとして、「あなたはこの○○タグと○○キーワードが含まれたblogエントリーを良くブックマークしています。なので○○キーワードのタグと検索RSSフィードをリーダーに登録しますか?」みたいなのとか。
普通にネットを見ているだけで、その傾向に従って「Amazonおすすめ」みたいな感じで関連エントリーが出てくるってイメージか。
Permalink: http://www.otsune.com/diary/2006/10/09/3.html#200610093
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-09 00:00:00 By otsune

#4 [neta][sysadmin] BINDやApacheのバージョン番号を隠す手法はセキュリティアップにはほとんど役に立たないので、わざわざやる事はオススメしない

どさにっき なぜバージョンを隠すのか_ を読んで同意。
まぁ「バージョンは外から見えないので、アップデート勧告が出ていても慌てて上げる必要は有りません」みたいな寝言を言うシステム管理者は論外中の論外で、この職業では生きていられないだろうから捨てておくとして。
Permalink: http://www.otsune.com/diary/2006/10/09/4.html#200610094
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-09 00:00:00 By otsune

2006年10月10日(火) [長年日記]

#1 [neta][mobile] ついに「ケータイで小説を入力しました」という気まぐれコンセプトのギャグに現実が追いついたのか

ケータイ小説とケータイ漫画: suadd blog_
 ・「パソコンよりもケータイの方が早く打てる」
 ※これまでに書籍を出した作家は全員ケータイで執筆
この人たちがパソコンを使う時は「QWERTYキーボードは使いにくい。USBでケータイつないでそれで文字入力したほうが使いやすいよ」とか文句言うのだろうか。
まぁQWERTYキーボードは英語圏向けの文字入力インターフェースで、日本語入力には非効率だと思うけど。

コメントを読む(1) [ コメントする ]

Re: ついに「ケータイで小説を入力しました」という気まぐれコンセプトのギャグに現実が追いついたのか by Nanasi    2006/10/10 12:16
>USBでケータイつないでそれで文字入力したほうが使いやすいよ http://www.watch.imp...
Permalink: http://www.otsune.com/diary/2006/10/10/1.html#200610101
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-10 00:00:00 By otsune
Permalink: http://www.otsune.com/diary/2006/10/10/2.html#200610102
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-10 00:00:00 By otsune

2006年10月11日(水) [長年日記]

#1 [mixi] mixiは、日記ごとに「この日記はマイミク○○グループには読める」「これは全体公開」「これはマイミクのマイミクが読める」という細かい閲覧許可設定が出来ないという欠点があるのを忘れがち

WEBネタ!: mixi(ミクシィ)の問題点−画一的なマイミク関係_
実生活では多くの方は相手によって多少なりとも付き合い方を変えていると思います。例えば、仕事上の同僚とはクールに仕事の話、それに対し友人とはマニアックな趣味の話というような方もいるでしょう。しかし、mixiでは「仕事上の同僚」も「趣味の合う友人」も同じマイミクという枠組みの中に入る。
を読んで。
これ2004年にmixiが始まったときに、さんざん文句を言っていたシステム的な欠点だなぁ。
まぁ閲覧系をキャッシュしてサーバーの負荷対策せざるを得ないmixiだと、細かい許可設定が実現する事は当分あり得ない気がする。
本来であれば、マイミクをグループわけしてパーミッションを設定できるとか。そこまで出来なくても、せめて「この日記は全体公開。そっちの日記はマイミク限定」ぐらいの設定は出来て当然だと思っていたもんな。
Permalink: http://www.otsune.com/diary/2006/10/11/1.html#200610111
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-11 00:00:00 By otsune

この記事へのトラックバック[1]

更新頻度にあまりにもムラがありすぎるなゆたにっき:mixiは日記の閲覧許可設定を提供するべき「だった」か
void GraphicWizardsLair( void ); //さんの10/11分の記事とそのリンク先の記事を見て...

2006年10月12日(木) [長年日記]

#1 [Perl][book] 「Perlベストプラクティス」一通り読んだのでまとめ

オレの個人的な読後の復習として、メモを日記に書いておく。とりあえず7章まで。8章以降は 13日_ に書いた。(誤解している可能性はあるので指摘は大歓迎。鵜呑みしても保証できない)
Perlベストプラクティス/Damian Conway_
目次は oreilly.co.jp_ で。
Internet Archive: Details: YAPC::Asia 2006 Tokyo "Perl Best Practices"_ で、YAPC::Asiaの講演ビデオを見る事が出来る。

1 1.1.1 堅牢性:

参照の変数名は_ref付きに。
テーブルから正規表現を生成してDRYに。
if-elsif-elsif-elseの連鎖は止めてテーブル参照に。
エラー発生でundefを返さずに例外を出す。
ソースをコピペしないでサブルーチンやモジュールにまとめる。

1 2.1 かっこ:

K&Rスタイルで書く。
my @names = (
    'hoge',
    'fuga',
);
BSDスタイルとGNUスタイルは使わない。

1 2.2 キーワード:

キーワードと開きカッコのあいだにスペースを入れる。サブルーチンと混同しないように。
for my $result (@results) {
    print_sep();
}

1 2.3 サブルーチンと変数:

サブルーチンや変数名と後続の開きカッコのあいだにスペースを入れない。

1 2.4 組み込み関数:

組み込み関数や特定の標準モジュールサブルーチンは不要なカッコを使わない。carp, croak, first, max, prompt。
while (my $record = <$results_file>) {
    chomp $record;
    my ($name, $votes) = split "\t", $record;
    print 'Vote for ',
    #略
}
サブルーチンとしてカッコを付ける時はあいだにスペースを入れない。
while (my $record = <$results_file>) {
    chomp( $record );
    my ($name, $votes) = split("\t", $record);
    print(
        'Vote for ',
    #略
    );
}

1 2.5 キーとインデックス:

ハッシュのキーや配列のインデックスと周囲のカッコのあいだにスペースを入れる。
$candidates[$i] = $incumbent{ $candidates[$i]{ get_region() } };

1 2.6 演算子:

2項演算子の前後にスペースを入れる。優先度の低い演算子の左右に2こ以上のスペースを入れて見やすくする。
単項演算子(「!」や「-」)と変数のあいだはスペースを入れない。
名前付き単項演算子(sin. cos, exp)は関数のようにスペースを入れる。

1 2.7 セミコロン:

ブロックに文が一つしかなくてもセミコロンを付ける。
文が一つだけのmapプロック、grepブロックの場合はセミコロンを省略する。

1 2.8 コンマ:

複数行リストの値のあとにコンマを入れる。最後の行(値)のあとにもコンマを入れる。

1 2.9 行の長さ:

一行の文字数は78列まで。

1 2.10 インデント:

スペース4つのインデントを使う。

1 2.11 タブ:

タブは使わない。vimは:set expandtabで。
文字としてタブを使う場合は\tで。

1 2.12 ブロック:

1行に1つの文。mapとgrepも。

1 2.13 チャンク化:

処理ごとに分割して前後に空行を入れて段落にする。段落の先頭に1行コメントを入れる。

1 2.14 Else:

}とelseは別の行に。
    if ($hoge) {
        $fuga++;
    }
    else {
        $hige++;
    }

1 2.15 縦の整列:

関連する値は縦に整列させる。

1 2.16 長い文の分割:

長い式は演算子の前で分割する。

1 2.17 非終端式:

文の途中に長い式が有る場合は、変数に代入して独立させる。

1 2.18 優先度による分割:

長い式は最も優先度の低い演算子でわける。

1 2.19 代入:

長い代入式は=の前でわける。
$predicted_val
    = ($minimum + $maximum) / 2
      + $predicted_change * max($fudge_factor, $local_epsilon);

1 2.20 3項演算子:

長い式の3項演算子は?と:を縦に揃える。

1 2.21 リスト:

長いリストはカッコで囲む。
my @months = qw(
    January  February  March
    April    May       June
    July     August    September
    October  November  December
);

1 2.22 自動レイアウト:

perltidyを使う。(今のバージョンのperltidyなら、~/.perltidyrcに-pbpを書くか-pbpを指定すれば良い)

1 3.1 識別子:

命名規則。
パッケージは<名詞>::<形容詞>::<形容詞>
変数は$<形容詞>_<名詞>もしくは$<名詞>
参照テーブルとして使うハッシュや配列は%<名詞>_<前置詞>。前置詞はofやforなど。
サブルーチンは<動詞>_<名詞>か<動詞>_<形容詞>_<名詞>など。(<動詞>[_<形容詞>]?_<名詞>[_<前置詞>|<分詞>]?)

1 3.2 ブール:

is_validやhas_foundなど真偽値にちなんだ名前にする。

1 3.3 参照変数:

リファレンス変数の名前には_refを付ける。

1 3.4 配列とハッシュ:

配列は複数形、ハッシュは単数形の名前を付ける。
例外として、参照テーブルとして一つの値を取り出すために使う配列は単数形。

1 3.5 アンダースコア:

単語の区切りはアンダースコアで。キャメルケースは使わない。

1 3.6 大文字の使い分け:

サブルーチン、メソッド、変数、ラベル付き引数の名前は小文字のみ。
パッケージ、クラスには大文字と小文字を。
定数には大文字のみを。
例外として固有名詞や略語や単位はなじみのある表記に従う。(HTTP、W3C::XHTML、LaTeX、Mbps)

1 3.7 略記:

省略する時はorigやlenやdescなど先頭を使う。orgnやlnghやdscnなど母音省略はしない。

1 3.8 意味不明な略記:

省略するのは意味が分かるときだけにする。

1 3.9 意味不明な名前:

last、set、left、right、no、secondなど、意味が複数ある単語を名前に使わない。

1 3.10 ユーティリティサブルーチン:

モジュールやクラスの内部専用のサブルーチン名には、先頭に_を付ける。

1 4.1 文字列デリミタ:

変数展開してほしい時だけダブルクォーテーションの"で囲む。(もしくはqq{ ... })
変数展開が無い場合はシングルクォーテーションの'で囲む。
文字列にシングルクォーテーションが含まれる時はq{ ... }で囲む。(\'は使わない)
文字列にシングルクォーテーションとかっこが含まれる時はq[ ... ]角カッコで囲む。
複数行に文字列がある場合はq{ ... }などの汎用的な囲みで統一する。

1 4.2 空の文字列:

空の文字列は''ではなくq{}を使う。

1 4.3 1文字で構成される文字列:

スペース一つは' 'ではなくq{ }を使う。
タブは"\t"を使う。
'"'や"\""は使わずに、q{"}やq{'}を使う。
join(',', @list)は使わずにjoin(q{,}, @list)を使う。

1 4.4 エスケープ文字:

数値エスケープではなく名前付き文字エスケープを使う。
$escape_seq = "\177\006\030Z"; #これではなく
use charnames qw( :full );
$escape_seq = "\N{DELETE}\N{ACKNOWLEDGE}\N{CANCEL}Z"; #これを使う

1 4.5 定数:

名前付き定数を使う。use constantは使わない。
use Readonlyを使う。

1 4.6 先頭のゼロ:

10進数の先頭に0を付けない。(8進数になってしまう)
8進数を使う時はoctを使用する。

1 4.7 長い数字:

桁の多い数字はアンダースコアで任意に区切れる。

1 4.8 複数行の文字列:

文字列に\nが含まれていてソースコードが一行に収まらないときは、改行の後で区切る。
$usage = "Usage: $0 <file> [-full]\n"
         . "(Use -full option for full dump)\n"
         ;

1 4.9 ヒアドキュメント:

文字列が2行を超える時はヒアドキュメントを使う。

1 4.10 ヒアドキュメントのインデント:

ヒアドキュメントはインデントが崩れるので、サブルーチン(ゼアドキュメント)か定義済み変数にする。

1 4.11 ヒアドキュメントのターミネータ:

END_で始まる大文字のターミネータを使う。

1 4.12 ヒアドキュメントの引用符:

変数展開しない場合はシングルクォーテーションの'でターミネータを囲む。
変数展開する場合はダブルクォーテーションの"で囲む。クォーテーションの省略はしない。

1 4.13 裸のワード:

ベアワードは使わない。use strict;を使う。

1 4.14 ファットコンマ:

ファットコンマの=>はペアの時に使う。
%default_service_record = {
    name => '<unkown>',
    rank => 'Recruit',
}
サブルーチンに名前付き引き数を渡すときに使う。
$text = format_text ({ src=>$raw_text, margins=>[1,62] });
定数を作成するときに使う。
Readonly my $ESCAPE_SEQ => "\N{DELETE}\N{ACKNOWLEDGE}\N{CANCEL}Z";

1 4.15 シンコンマ:

スカラーコンマは使わない。doとセミコロンを使う。コンマはリスト項目を分割する事にだけ使う。

1 4.16 優先度の低い演算子:

優先度の高い!演算子と、優先度の低い論理否定notを混在させない。
andとnotはいっさい使わない。
orはcroakなど例外を送出するときに使う。

1 4.17 リスト:

リストは全てカッコで囲む。
カッコ( )のかわりに間違えて角カッコの[ ]を使うと匿名配列になってしまうので注意。

1 4.18 リストのメンバーシップ:

文字列リストの有無はハッシュテーブルで。
その他リストの有無はList::MoreUtilsのany()で。

1 5.1 レキシカル変数:

どうしても必要なとき以外はmyによるレキシカル変数だけを使う。

1 5.2 パッケージ変数:

パッケージ変数は使用しない。
(アクセサを使ってレキシカル変数を使う)

1 5.3 ローカル化:

パッケージ変数をやむを得ず変更する時はlocalを使う。

1 5.4 初期化:

1 5.5 句読点変数:

use English;

1 5.6 句読点変数のローカル化:

1 5.7 マッチ変数:

正規表現のマッチ変数($` $& $' $PREMATCH $MATCH $POSTMATCH)はスコープがグローバルでどこで書き変わったのか混乱するので絶対に使用してはならない。
Regexp::MatchContextモジュールを使う。

1 5.8 ドル記号とアンダースコア:

$_の乱用は混乱の元。
for ( @_ ? @_ : $_ ) {
    s{hoge}{}xms; # これは良くない
}
ではなくて
for my $orig_args ( @_ ? @_ : $_ ) {
    $orig_args =~ s{hoge}{}xms;# こうする
}

1 5.9 配列のインデックス:

配列を最後から数える時はマイナスのインデックスを使う。

1 5.10 スライス:

配列スライスやハッシュスライスを利用する。
@frames[-1,-2,-3];
@active{'top', 'prev', 'backup'};
($frames[-1], $frames[-2], $frames[-3]);
($active{'top'}, $active{'prev'}, $active{'backup'});
と同じ。
@hoge[1..10]は1から10。
@hoge[-1..-9]はダメ(空リストになる)。@hoge[-9..-1]はok。

1 5.11 スライスのレイアウト:

スライスからスライスへの代入の時は項目ごとに縦に揃える。

1 5.12 スライスのファクタリング:

スライスのキーやインデックスが多い時はハッシュにまとめる。

1 6.1 ifブロック:

基本として、後置きのifではなくプロック形式の前置きifを使う。

1 6.2 ポストフィックスセレクタ:

例外としてnext, last, redo, return, goto, die, croak, throwの時は後置きifを使う。

1 6.3 ほかのポストフィックス修飾子:

後置きのunless, for, while, untilを使わない。

1 6.4 否定制御文:

unless, untilは使わない。
特にnotや!が含まれた二重否定や、不等号を含んだunlessは絶対に使わない。
ifを使う。

1 6.5 Cスタイルのループ:

for (my $i=1; $i<=$MAX; $i++)という3部構成のCスタイルのforは使わない。

1 6.6 不要な添え字:

ループで配列やハッシュのインデックスを使わない。
配列を直接ループさせる。
for my $client (@clients) {
    $client->hoge(); # ok
}
インデックスのループは重いからダメ。
for my $n (0..$#clients) {
    $clients[$n]->hoge(); # 重い
}
ハッシュはvaluesをループさせる。(valuesはコピーのリストではなくエイリアスのリストが返る)
for my $trans_word (values %trans_for) {
    if ( $trans_word =~ m/hoge/xms) {
        $trans_word = 'FUGA'; # ok
    }
}
キーでループすると重いからダメ。
for my $orig_word (keys %trans_for) {
    if ( $trans_for{$orig_word} =~ m/hoge/xms) {
        $trans_for{$orig_word} = 'FUGA'; # 重い
    }
}

1 6.7 必要な添え字:

ループ内では添字を1回以上指定しない。
必要な時はData::Aliasを使う。

1 6.8 反復子変数:

for, whileは$_ではなくmy $hogeで名前付きレキシカル変数を使う。

1 6.9 非レキシカルループ反復子:

forの変数は必ずmyを使う。

1 6.10 リストの生成:

リストから新しいリストを生成するときはforじゃなくmapを使う。
my @sqrt_results = map { sqrt $_ } @results;

1 6.11 リスト選択:

リストから不要な要素を削る時はgrepを使う。
リストから特定の値を検索するときはgrepかList::Utilのfirstを使う。

1 6.12 リスト変換:

リストをその場で変換する時はforを使う。
@temperature = map { F_to_K($_) } @temperature; # 重い
for my $measurement (@temperature) {
    $measurement = F_to_K($measurement); # ok
}

1 6.13 複雑なマッピング:

複雑なリスト変換はサブルーチン呼び出しにする。

1 6.14 リスト処理の副作用:

リスト関数で$_を変更しない。

1 6.15 マルチパート選択:

if-elsif-elsif-elseを連鎖させない。

1 6.16 値の交換:

matchのif連鎖はやめてテーブル参照にする。

1 6.17 表形式の3項演算子:

ifの連鎖のかわりに?:の3項演算子の連鎖を使う。

1 6.18 do-whileループ:

do-whileは使わない。

1 6.19 線形コーディング:

ループ内では除外条件を先に判定する。すべての項目を計算したあとで、まとめて判定するのではなく、計算項目ごとに判定する。

1 6.20 分散制御:

構造化しすぎで無理にループ終了を一元化しない。

1 6.21 やり直し:

whileではなくforやredoを使う。

1 6.22 ループラベル:

ループにラベルをつけて、next, last, redoで使う。

1 7.1 ドキュメントの種類:

ユーザーむけドキュメント、テクニカルドキュメントを区別して書く。

1 7.2 ひな形:

PODのテンプレートを使う。

1 7.3 拡張ひな形:

1 7.4 場所:

PODはソースと同じファイルに入れる。

1 7.5 近接性:

ドキュメントは一カ所にまとめる。

1 7.6 位置:

PODはファイルの最後におく。

1 7.7 テクニカルドキュメント:

開発者向けドキュメントは適当に分割する。

1 7.8 コメント:

プロックコメントテンプレートを使う。

1 7.9 アルゴリズムのドキュメント:

アルゴリズムの説明に1行コメントを入れる。

1 7.10 補足のためのドキュメント:

難しい部分は行末コメントを入れる。

1 7.11 防御的なドキュメント:

迷ったり悩んだところはコメントを入れる。

1 7.12 暗示的なドキュメント:

コメントを付ける必要があると思ったらコードを分かりやすく書き換えることを検討する。
分かりにくいところは事実を端的に述べるコメントを入れる。

1 7.13 言説的なドキュメント:

長いテクニカルドキュメントを書く時は=for =cutのPODを使う。
複数の段落やサンプルコードの埋め込みをしたい時は=begin =end =cutを使う。

1 7.14 校正:

PODはperldocなどで良く読み返して誤字脱字や分かりにくい文章を修正する。
Permalink: http://www.otsune.com/diary/2006/10/12/1.html#200610121
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-12 00:00:00 By otsune

この記事へのトラックバック[2]

World Wide Walker:「Perlベストプラクティス」まとめ を読んでふと「Ruby使えばいいのに」と思った
[「Perlベストプラクティス」一通り読んだのでまとめ] えーと、先日 Ruby信奉者の本拠...
http://www.business-planet.net/story/2972896/:void GraphicWizardsLair( void ); // 「Perlベストプラクティス」一通り読んだのでまとめ
void GraphicWizardsLair( void ); // 「Perlベストプラクティス」一通り読んだのでま...

2006年10月13日(金) [長年日記]

#1 [Perl][book] 「Perlベストプラクティス」一通り読んだのでまとめ(後編)

(あくまでも個人的な復習メモ。無保証。1章から7章までは 前日の日記_ に。誤解している可能性はあるので指摘は大歓迎)
Perlベストプラクティス/Damian Conway_

1 8章 組み込み関数:

組み込み関数を使いましょう。自分で作成したコードよりも高速できちんとデバックされている可能性が高い。

1 8.1 ソート:

ソート中にキーを再計算しない。(SHA-512等)
Perl5.8以降のsortのアルゴリズムはマージソート。計算オーダーはO(N log N)。
Orcishマニューバー。計算した結果がハッシュに有ればそれを使い、無ければ||=のor代入で計算してハッシュに入れる。
my %sha512_of;

@sorted_scripts
    = sort { ($sha512_of{$a} ||= sha512($a))
                cmp
             ($sha512_of{$b} ||= sha512($b))
      }
      @scripts;
Schwartzian変換。(シュワルツ変換)
@sorted_scripts
    = map  { $_->[0] }
      sort { $a->[1] cmp $b->[1] }
      map  { [$_, sha512($_)] }
          @scripts;
cmpと<=>の違い。Plagger/lib/Plagger/Feed.pm sort_entriesの例。一部整形。($self->entries->dateの数値でソートして、entriesを入れ替えている。降順)
    my @entries = map { $_->[1] }
        sort { $b->[0] <=> $a->[0] }
        map { [ $_->date, $_ ] } $self->entries;

    $self->{entries} = \@entries;
use Memoizeを使ってサブルーチンの返り値を覚えておく
use Digest::SHA qw( sha512 );
use Memoize;
memoize('sha512');

@sorted_scripts = sort { sha512($a) cmp sha512($b) } @scripts;
どれも一長一短なので、実際のリストでベンチマークを取って決める。

1 8.2 リストの反転:

reverseを使ってリストを反転する。降順sortが欲しい時は昇順sortをreverseする。
reverse sortは最適化されている。

1 8.3 スカラーの反転:

reverseを使ってスカラーを反転する。スカラーコンテキストを明確にするためscalar指定子を付ける。
add_email_addr(scalar reverse $email_address);

1 8.4 固定幅のデータ:

固定幅のデータを抜き出すにはunpackを使う。substrや正規表現はunpackより重い。
'A6 A10 A8'で6文字、10文字、8文字を取得する。
'@0 A6 @8 A10 @20 A8'で列0から6文字、列8から10文字、列20から8文字。
@の値は昇順じゃなくてもいい。

1 8.5 分離されたデータ:

可変幅のデータを抜き出すにはsplitを使う。
第1引数はセパレータ指定。第2引数は文字列。第3引数はフィールドの最大値。
第3引数は必要なフィールド数+1。できるだけ明示的に指定した方が良い。

1 8.6 可変幅のデータ:

可変幅の複雑なデータはText::CSV_XSを使う。
use Text::CSV::Simple;

1 8.7 文字列の評価:

文字列形式のevalは使わない。
eval qq{ sub $subname {...} };で変数名サブルーチンを作るぐらいなら、匿名サブルーチンとSub::Installerを使う。

1 8.8 ソートの自動化:

Sort::Makerでソートルーチン構築を検討する。

1 8.9 部分文字列:

lvalueのsubstrではなく引数4つのsubstrを使う。
substr($addr, $country_pos, $COUNTRY_LEN)
    = $country_name($country_code); # 重い!
ではなく
substr $addr, $country_pos, $COUNTRY_LEN, $country_name($country_code); # ok
にする。代入よりも引数4つのsubstrのほうが高速。

1 8.10 ハッシュ値:

lvalue方式のvaluesを利用する。
forループでvaluesを使うとエイリアスのリストが返るので、ループ中で代入できる(lvalueにできる)

1 8.11 グロブ:

<...>ではなくglobを使う。
入力演算だけで<>を使う。
my @files = glob($FILE_PATTERN);

1 8.12 スリープ:

sleepは整数しか有効ではない。秒単位。Time::HiResを使う。
select undef, undef, undef, 0.5;のhackは使わない。

1 8.13 mapとgrep:

mapとgrepの第1引数に式を使わない。いつもブロックをつかう。

1 8.14 ユーティリティ:

標準ライブラリの関数を使う。
Scalar::Util, List::Util, List::MoreUtilsの関数を使う。
Scalar::Util
  • blessed $scalar
  • refaddr $scalar
  • reftype $scalar
  • readonly $scalar
  • tainted $scalar
  • openhandle $scalar
  • weaken $scalar
  • is_weak $scalar
  • looks_like_number $scalar
List::Util
  • first {<条件>} @list
  • max @list
  • maxstr @list
  • min @list
  • minstr @list
  • shuffle @list
  • sum @list
  • reduce {<$a $bの2項演算>} @list
List::MoreUtils
  • all {<条件>} @list (any(), notall(), none()もある)
  • first_index {<条件>} @list (last_index()もある)
  • apply {<変換>} @list (リストのコピーに変換をかけて新しいリストを返す)
  • pairwise {<$a $bの2項演算>} @array1, @array2
  • zip @array1, @array2, ...
  • uniq @list

1 9.1 呼び出し構文:

サブルーチン呼び出しではカッコを使う。先頭に&を付けない。
(サブルーチンの参照は\&subnameを使う)

1 9.2 同音異義語:

組込関数と同じ名前のサブルーチンはダメ。

1 9.3 引数リスト:

必ず最初に@_を展開する。サブルーチンは引数を@_配列で受け取る。
$_[0], $_[1]は使わない。
sub hoge {
    my ($self, $context, $args) = @_;
    #略
}
例外は、@_を1回だけすぐに処理するラッパーサブルーチン。
sub say {
    return print @_, "\n";
}
#
say( 'Hello' );

1 9.4 名前付きの引数:

サブルーチン引数が3つ以上のときは名前付き引数のハッシュを使う。

1 9.5 欠けている引数:

引数があるかどうかチェックするときは、definedか!undef
引数をif !$argsで検証しない。

1 9.6 引数のデフォルト値:

@_を展開したらデフォルト値を解決する。デフォルト値を他の文で追加しない。
my $cols = exists $args_ref->{cols} ? $args_ref->{cols} : $DEFAULT_WITDH;

1 9.7 スカラーコンテキストでの戻り値:

スカラーを戻す時はreturn scalarを使う。

1 9.8 コンテキストに応じた戻り値:

リストを返すサブルーチンがスカラーコンテキストで呼ばれた時は明白な値を返す。
(配列の数なのか文字列なのかは、Perl組み込み関数でも実はバラバラだったりする。できるだけ分かりやすく想像しやすいスカラーを返す)

1 9.9 マルチコンテキストでの戻り値:

スカラーコンテキストで明白な値をしぼれない時はContextual::Returnを検討する。

1 9.10 プロトタイプ:

サブルーチンプロトタイプは使わない。

1 9.11 暗黙的なリターン:

省略しないで明示的なreturnを使う。

1 9.12 失敗のリターン:

失敗状態を返すには裸のreturnを使う。return undefは使わない。
(例外を使う)

1 10.1 ファイルハンドル:

裸のワードをファイルハンドルに使わない。

1 10.2 間接的なファイルハンドル:

レキシカル変数をファイルハンドルにする。
open my $filehandle, '<', $filename

1 10.3 ファイルハンドルのローカル化:

パッケージスコープのファイルハンドルを使う場合はlocalする。
(基本的にパッケージスコープは使わない)

1 10.4 きちんと開く:

IO::Fileを使うか引数3つのopenを使う。
use IO::File;
my $active = IO::File->new($ACTIVE_LOG, '<')
    or croak "Can't open '$ACTILE_LOG': $OS_ERROR";
open my $stdin, '<', '-' or croak "Can't open stdin: $OS_ERROR";

1 10.5 エラーチェック:

ファイルへのopen, close, printをするときは結果をチェックする。

1 10.6 クリーンアップ:

ファイルハンドルは出来るだけ速く明示的に閉じる。
open my $fh, '<', $config_file
    or croak "Can't open '$config_file': $OS_ERROR";

my @lines = <$fh>; # 読み込んだらすぐ閉じる
close $fh
    or croak "Can't close '$config_file' after reading: $OS_ERROR";

1 10.7 入力ループ:

for (<>)ではなくwhile (<>)を使う。
forはファイルを最後まで読み込んでからループする。whileは1行づつループする。
ただしfor my $n (2..1_000_000_000) {}のような大きな範囲のforループは、実行時評価に最適化されて、999999999個の整数のリストを生成しないので問題は出ない。

1 10.8 行ベースの入力:

ファイル全体を<>で読み込まず、1行ごとのI/Oを使う。
全体を読み込むのはスナップショットが必要な場合や、ファイルが不安定な時や、テキスト処理が複数行に渡る場合だけにする。

1 10.9 単純な丸呑み:

ファイルハンドルをdo{ }ブロックで囲む。
ファイル全体をどうしても一度に読み込む場合はFile::Slurp, sysread, do{ local $/; <$fh> };を使う。
my $code = do { local $/; <$in> };
sysread $fh, $text, -s $fh;

1 10.10 強力な丸呑み:

Perl6::Slurpを使ってストリームを一気に読む。
use Perl6::Slurp;
my $text = slurp $file_handle;
my @lines = slurp $file_name;
my @lines = slurp $file_name, {chomp => 1};

1 10.11 標準入力:

*STDINは使用しない。*ARGVを使う。(<>はデフォルトで<ARGV>になる)

1 10.12 ファイルハンドルへの出力:

printではファイルハンドルを中カッコ{ }で囲む。
print {$file} $name, $rank, $serial_num, "\n";
print {*STDERR} $name, $rank, $serial_num, "\n";
use IO::Handle
$file->print( $name, $rank, $serial_num, "\n" );
*STDERR->print( $name, $rank, $serial_num, "\n" );

1 10.13 単純なプロンプト:

対話形式で入力するときはプロンプトを表示する。

1 10.14 対話性:

プロンプト周りはややこしいので自分で書かない。IO::Interactiveを使う。

1 10.15 強力なプロンプト:

プロンプト表示はIO::Promptを使う。

1 10.16 プログレスインジケータ:

待つ処理が続く時は進行状況を伝える。
print {*STDERR} 'Connecting to server...';

1 10.17 自動プログレスインジケータ:

Smart::Commentsモジュールで###に続けて書いたコメントが自動的に表示されるのを使う。

1 10.18 自動フラッシュ:

selectを使った自動フラッシュは使わない。
自動フラッシュはIO::Handleのautoflush()を使う。
use IO::Handle;
*STDOUT->autoflush();

1 11.1 逆参照:

可能な限り矢印->で逆参照する。
${$list_ref}[0] # NG
ではなく
$list_ref->[0] # Ok
にする。
スライスの時は->は使えない。
@{$list_ref}[0, -1]; # ok
矢印を使うと[ ... ]がスカラーコンテキストになり最後のインデックスだけになる。
$list_ref->[0, -1]; # same ($list_ref->[-1], undef);

1 11.2 中かっこで囲まれた参照:

基本的に参照は中カッコ{ }で囲む。

1 11.3 シンボリック参照:

シンボリック参照は決して使わない。
(myによるレキシカル変数を使ってパッケージ変数は基本的に使わないので、シンボリック参照も使う必要がない)

1 11.4 循環参照:

weakenを使って循環データ構造からくるメモリリークを回避する。
use Scalar::Util qw( weaken );

1 12章 正規表現:

正規表現はPerlとは別のもう一つの言語だと思え。

1 12.1 拡張フォーマット:

いつも/xフラグを使う。
/xフラグが有効だと、正規表現でスペースや改行やインデントによる整形が使えるようになる。#コメントも使える。

1 12.2 行の境界:

いつも/mフラグを使う。

1 12.3 文字列の境界:

文字列の境界アンカーとして\Aと\zを使う。
「文字列の先頭」には\Aを使う。/mフラグで^を使わない。「文字列の末尾」には\zを使う。/mフラグで$を使わない。

1 12.4 文字列の末尾:

「文字列の末尾」には\Zでは無く\zを使う。
\Zのかわりに\n?\z。

1 12.5 任意の文字とのマッチ:

いつも/sフラグを使う。
/sフラグを使えばドット(.)は改行を含むすべての文字とマッチする。
「改行以外の文字とマッチ」は[^\n]を使う。

1 12.6 遅延フラグ:

Regexp::Autoflagsの義務化を検討する

1 12.7 中かっこのデリミタ:

正規表現が複数行になるときは/.../ではなくm{...}を使う。

1 12.8 その他のデリミタ:

/.../かm{...}以外のデリミタをいっさい使わない。

1 12.9 メタ文字:

エスケープされたメタ文字ではなく単数文字クラスを使う。
m/ \{ . \. \d{2} \} /xms; # NG
m/ [{] . [.] \d{2} [}] /xms; # Ok

1 12.10 名前付き文字:

エスケープされたメタ文字ではなく名前付き文字を使う。
use charnames qw( :full );

1 12.11 プロパティ:

[a-zA-Z]などではなく\p{Alphabetic}などのプロパティを使う。
perldoc perlunicode

1 12.12 ホワイトスペース:

特定の空白ではなく任意の空白をマッチさせる。
空白が要求される場所では\s+
空白を使用出来る場所では\s*

1 12.13 制約なしの繰り返し:

出来るだけ多くマッチするときは具体的に書く。
(.*)&よりも(.*?)&
(.*)&よりも([^&]*)

1 12.14 捕捉のためのかっこ:

カッコ( )はキャプチャーのためだけに使う。
選択のためのカッコは(?: )を使ってキャプチャーしない。

1 12.15 捕捉された値:

キャプチャーが成功して$1や$2に値が入ったかどうかはdefined $1を判定しない。
$1などには他の場所でキャプチャーされた値が入っているかもしれない。
$full_name =~ m/\A (Mrs?|Ms|Dr) \s+ (\S+) \s+ (\S+) \z/xms;
if (defined $1) { # NG!
    ($title, $first_name, $last_name) = ($1, $2, $3);
}
こうじゃなくて
if ($full_name =~ m/\A (Mrs?|Ms|Dr) \s+ (\S+) \s+ (\S+) \z/xms) {
    ($title, $first_name, $last_name) = ($1, $2, $3); # Ok
}
こうする

1 12.16 捕捉変数:

キャプチャーしたらすぐに適切な名前の変数に代入する。
my ($opt_name, $operator, $opt_val, $comment)
    = $config =~ m/ \A (\S+) \s* (=|[+]=) \s* ([^;]+) ; \s* \# (.*)/xms;

1 12.17 トークンごとのパターンマッチ:

/gcフラグでトークンに分解する。
\Gで「前回のパターンマッチの終わり」

1 12.18 表形式の正規表現:

配列から正規表現をjoin '|', map {quotemeta $_} reverse sort @_;で生成する

1 12.19 正規表現の生成:

複雑な正規表現は単純な要素に分解して定数に入れる

1 12.20 既製の正規表現:

Regexp::Commonを使う

1 12.21 選択肢:

一文字の選択(a|b|c)のかわりに文字クラス([abc])を使う

1 12.22 選択肢のリファクタリング:

前後の共通部分をまとめる

1 12.23 バックトラック:

バックトラックしない場所は(?>...)をつかう。
my $str = '(foo,bar,baz,hoge,fuga)';

$str =~ m{ [(] $ITEM (?> (?:,$ITEM)* ) [)] }xms;

1 12.24 文字列比較:

1つの正規表現マッチよりも個別にeqでマッチさせるほうが高速。
大文字と小文字を区別しないためだけに/iフラグ正規表現を使うよりも、lc()を使う方が高速。

1 13.1 例外:

失敗の時は、特別な値をreturnしたりフラグを使ったりしないで例外を出す

1 13.2 組み込み関数のエラー:

組み込み関数の失敗でも例外を出す。
Fatalモジュールを使う。
use Fatal qw( open close );

1 13.3 コンテキストに応じたエラー:

全てのコンテキストでエラーの例外だす。
Fatalで:voidマーカーは使わない。

1 13.4 システムエラー:

system関数は成功するとfalse、失敗するとtrueを返すので注意する。
systemを出来るだけ使わずにモジュールを使う。
Perl6::Builtines qw( system )を使う。

1 13.5 回復可能なエラー:

回復可能のエラーを含む全てのエラーで例外を出す。

1 13.6 エラーの報告:

いつもcroak()を使う。

1 13.7 エラーメッセージ:

エラー文は受け手が理解出来るように書く。

1 13.8 エラーの文書化:

1 13.9 オブジェクト指向例外:

データをハンドラに伝える時は例外オブジェクトを使う。

1 13.10 揮発性のエラーメッセージ:

エラー文が変化する可能性がある時は例外オブジェクトを使う。

1 13.11 例外階層:

例外処理が複数の場所にある場合は例外オブジェクトを使う。

1 13.12 例外処理:

例外オブジェクトは派生先から評価する。

1 13.13 例外クラス:

例外オブジェクトを自動的に作る。CPANのException::Classを使う。

1 13.14 例外の展開:

例外変数はレキシカル変数にコピーする。
my $exception = $EVAL_ERROR
Exception::Classのcaught()は$EVAL_ERRORを返すのでそれを代入してもよい。

1 14.1 コマンドラインの構造:

一貫性のあるコマンドラインオプションと引数を使う。

1 14.2 コマンドラインの規則:

標準の規則に従う。

1 14.3 メタオプション:

--helpなどを標準化する。

1 14.4 上書き処理を指定する引数:

入力と出力に同じファイル名を指定出来るようにする。
「unlink 出力ファイル名」の後に出力ファイルをopenする。
IO::InSituモジュールを使う。

1 14.5 コマンドラインの処理:

Getopt::Longを使う。
CPANのGetopt::Cladeを使う。

1 14.6 インターフェイスの一貫性:

インターフェース、ランタイムメッセージ、ドキュメントの一貫性を保つ。
Getopt::Euclidの=for Euclidを使う。

1 14.7 プログラム間の一貫性:

コマンドライン処理の共通機能はモジュールにする。

1 15.1 オブジェクト指向の使用:

オブジェクト指向はデフォルトではなく選択肢にする。

1 15.2 判断基準:

1 15.3 擬似ハッシュ:

擬似ハッシュは使用しない。

1 15.4 制限付きハッシュ:

制限付きハッシュは使用しない。

1 15.5 カプセル化:

ハッシュベースのオブジェクトではなく匿名スカラーでインサイドアウトオブジェクトを使う。
(Class::Accessor::Fastを使ってアクセサを作るのも有りか)

1 15.6 コンストラクタ:

すべてのクラスのコンストラクタの名前はnew()にする。

1 15.7 クローン化:

コンストラクタでオブジェクトを複製しない。
複製が必要ならclone()メソッドを実装する。

1 15.8 デストラクタ:

いつもデストラクタを定義する。
sub DESTROYでdeleteする。

1 15.9 メソッド:

メソッドはサブルーチンと同じガイドラインに従う。
メソッドの方がパラメータが少ない傾向が有る。
サブルーチンと違い、メソッドには組み込み関数と同じ名前を付けても良い。(組み込み関数と同じような機能のときに違う名前を付けると、類推が難しくなる)

1 15.10 アクセサ:

読み取りと書き込みのアクセサを別々に用意する。
get_とset_を使う。
(Class::Accessor::Fastを使うのがいいんじゃないか?)

1 15.11 lvalueアクセサ:

lvalueアクセサは使用しない。

1 15.12 間接的なオブジェクト:

間接的なオブジェクト構文は使わない。
new ObjectではなくObject->new()を使う。

1 15.13 クラスのインターフェイス:

最小限でなく最適なインターフェースを提供する。

1 15.14 演算子のオーバーロード:

演算子のオーバーロードは代数表記と同じ形のものだけにする。

1 15.15 型の強制変換:

オブジェクトをブール、数値、文字列に型変換するオーバーロードを検討する。

1 16.1 継承:

use baseを使う

1 16.2 オブジェクト:

インサイドアウトオブジェクトを使う。

1 16.3 オブジェクトのブレス化:

引数1つのblessを使用しない。

1 16.4 コンストラクタの引数:

コンストラクタの引数にはハッシュ参照を使う。ラベル付きの値を渡す。
sub new {
    my ($class, $arg_ref) = @_;

    my $new_object = bless anon_scalar(), $class;

    $client_num_of(ident $new_object) = $arg_ref->{client_num};
    $name_of(ident $new_object)       = $arg_ref->{client_name};

    return $new_object;
}

1 16.5 基底クラスの初期化:

ハッシュのハッシュを渡して、ベースクラスの引数をクラス名で指定する。
Class::Std::Utils

1 16.6 オブジェクトの生成と破棄:

生成、初期化、破棄のプロセスを分離する。

1 16.7 クラス階層の自動生成:

Class::Stdを使う。

1 16.8 属性の破棄:

デストラクタでClass::Stdで:ATTRを使う。

1 16.9 属性の構築:

初期化にClass::Stdの:ATTR( init_args => 'hoge' );を使う。

1 16.10 強制的な型変換:

強制的な型変換はClass::Stdの:STRINGIFY、:NUMERIFY、:BOOLIFYメソッドとして指定する。

1 16.11 累積メソッド:

SUPER::呼び出しのかわりにClass::Stdの:CUMULATIVEメソッドを使う。

1 16.12 自動的なロード:

AUTOLOAD()を使わない。
Class::StdのAUTOMETHOD()を検討する。

1 17.1 インターフェイス:

モジュールのインターフェースを最初に設計する。

1 17.2 リファクタリング:

重複するコードはサブルーチンにする。重複するサブルーチンはモジュールにする。

1 17.3 バージョン番号:

v1.0.3のvstringを使ってはダメ。
versionモジュールとqv(...)コンストラクタを使う。
use version; our $VERSION = qv('1.0.3');

1 17.4 バージョン要件:

「このバージョン以上じゃないと動作しない」という指定を書く。
use 5.006001;やuse only q( 5.6.1- !5.8.0 );を使う。

1 17.5 エクスポート:

エクスポートは慎重に。必要な場合にだけ使う。
@EXPORTと@EXPORT_OKで分ける。

1 17.6 宣言によるエクスポート:

宣言的なエクスポートを検討する。Perl6::Export::Attrsモジュールを使う。

1 17.7 インターフェイス変数:

モジュールのインターフェースの一部としてパッケージ変数を使わない。

1 17.8 モジュールの作成:

新しいモジュールを作る時はCPANのModule::Starterで自動生成を使う。
Module::Starter::PBPも使う。

1 17.9 標準ライブラリ:

自分でコードを1から書かずに、可能な限り標準ライブラリを使う。
perldoc perlmodlib

1 17.10 CPAN:

CPANモジュールを使用する。

1 18.1 テストケース:

最初にテストケースを作る。
コード本体を書く前にテストコードを書く。

1 18.2 モジュール型のテスト:

Test::Simple、Test::Moreを使ってテストを標準化する。
(今どきだったらTest::Baseか?)

1 18.3 テストスイート:

Test::Harnessを使ってテストスイートを標準化する。
proveコマンドが使える。

1 18.4 失敗:

失敗するテストスイートを作る。

1 18.5 何をテストするか:

起こりそうな事と、起こらなそうな事を両方テストする。
不正な動作を検出するのにふさわしい場所。
  • 有効範囲の最大値と最小値
  • 最小値よりも少し小さい値と、最大値よりも少し大きい値
  • 負数値、正数値、0
  • 非常に小さい負数値、正数値
  • 空の文字列と複数行の文字列
  • "\0"などの制御文字が含まれた文字列
  • ASCII以外の文字列(Latin-1、Unicode)
  • undefとundefのリスト
  • '0', '0E0', '0.0', '0 but true'
  • 空のリスト、空の配列、空のハッシュ
  • 重複する値が含まれたリスト
  • 決して入力される事の無い入力値
  • 必ず利用出来るはずのリソースとのやりとり
  • 数値が期待される場所への数値でない入力、数値が期待されない場所への数値の入力
  • 参照が期待される場所への非参照値。参照が期待されない場所への参照値
  • サブルーチン、メソッドへの引数の不足
  • サブルーチン、メソッドへの余分な引数
  • 順序がバラバラと位置指定の引数
  • 不正なラベルが付いたキーと値の引数
  • モジュールの不適切なバージョンのロード
  • これまで遭遇したことのあるすべてのバグ

1 18.6 デバッグとテスト:

デバッグの前に新しいテストケースを追加する。

1 18.7 制約:

いつもuse strictを使う。

1 18.8 警告:

いつも警告を明示的に表示する。
use warningsを使う。

1 18.9 正確さ:

use strictとuse warningsを使っていて警告が出なくても、正確であると決めつけない。

1 18.10 制約の無効化:

no strict 'refs'などを使う時は最も狭いスコープで使う。

1 18.11 デバッガ:

perlデバッガを習得する。

1 18.12 手動でのデバッグ:

手動でのデバッグはシリアライズされた出力をwarnする。
use Data::Dumper qw( Dumper );
warn Dumper ($results);

1 18.13 半自動デバッグ:

warnではなくSmart::Commentsの###も検討する。
Permalink: http://www.otsune.com/diary/2006/10/13/1.html#200610131
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-13 00:00:00 By otsune

2006年10月15日() [長年日記]

#1 [SNS] 全文検索エンジンでテキストが引っかかるけど、中に入るには会員に成る必要が有るというSNSはどうだろうか

M.C.P.C.: SNSを捨てよ、blogへ出よう_ から。
要するに「DTP業界専用SNS」みたいな業界特化型SNSが広まると、ますますアピールが出来なくなってタコツボ化するよなぁ。という話題。
いっそのことGREEみたいに「SNSだけどGoogleクローラーにテキストは拾われますよ」と言い切ってしまえば一挙両得?

コメントを読む(1) [ コメントする ]

Re: 全文検索エンジンでテキストが引っかかるけど、中に入るには会員に成る必要が有るというSNSはどうだろ by ねね    2006/10/16 04:24
タイトルだけ見てそれ、GREEですから!と突っ込もうとしたら本文に書いてあったorz
Permalink: http://www.otsune.com/diary/2006/10/15/1.html#200610151
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-15 00:00:00 By otsune

2006年10月18日(水) [長年日記]

#1 [neta] 正論だけど自らのマイナスになる意見は「プロらしくない」のでblogに書かない方が良い。……ってのも正論だけど、blogってそういうのが書いてあるから面白い

404 Blog Not Found:プロが正論にのぼせ上がってしまうと始末に負えない_ のコメント欄から。
花村さんの気持ちもわかりますけど,要するにめんどうな客がうっとおしいって言ってるだけですよね.他者(後にお客になる可能性のある人|過去にお客だった人)も見るブログに書くようでは精神的に未熟だと思います.
特に過去このような依頼をこの人にしたお客さんは「あぁ自分もこう思われてたんだ」と感じて,二度とこの人に依頼しないでしょう.
忙しくて相手にしていられないというなら他の税理士をお客さんに紹介すればいいだけなので,自らのマイナスになる意見を言う必要はないですね.その点もプロらしくないです.
これは全くの正論で、確かにその通りだと思う。プロの税理士として誰からも文句を言われないようにするためには、どんなにマイホーム信者が非合理的だと思っても言わない・書かないのが得策だろう。
ただ、これblogエントリー自体がメタ構造になっていて。「正論からはほど遠い無謀な企て」と言えるマイホーム信者批判を税理士自らがblogに書く事だって、少しでも無謀でなくすのがブロガーの心意気ではないのか?
……とも言えてしまう。
プロの技術者が稚拙な疑問をblogに書いておくと、素人や顧客がライバル社から「あの○○社の技術者はこんな些細な事も知りませんよ。○○社全体のレベルも未熟な証拠です」と、こじつけた悪用に利用されちゃうよ。だからblogには偏った持論を書かない方が「お得」だよ。
という雰囲気は面白くないよなぁ。
技術者なんて「お受験のお勉強文化」みたいな情報を記憶しているかどうかバトルよりも、「誰に聞けば分かるか・どこを調べれば原典にあたれるのか」というインデックスを知っている事の方が重要なんだから。そのライバル社の悪用はまったくの的外れだと言うリテラシーが素人にも広まってほしいぐらいだ。
逆に「これ知らなかった」ということや些細なことをblogで公開しているプロの方が、隠し事やハッタリが無くて信頼出来ますよ。という「お受験のお勉強文化」とは逆の視点を持ってほしいよなぁ。

1 徳力氏の書いていることも「プロが本音を書くと、そういう風に邪推される」という現象があるからかもな:

コメントを読む(2) [ コメントする ]

Re: 正論だけど自らのマイナスになる意見は「プロらしくない」のでblogに書かない方が良い。……ってのも正 by 正論だけど?    2006/10/19 01:09
そういう、賛否両論分かれるものにこそ議論する価値があるわけで、揉め事も起こせない...
Re: 正論だけど自らのマイナスになる意見は「プロらしくない」のでblogに書かない方が良い。……ってのも正 by shiro    2006/10/21 13:10
とりあえず、dan 氏より花村氏の文章の方が面白かった。どっちも相手( 花村氏 or 家買...
Permalink: http://www.otsune.com/diary/2006/10/18/1.html#200610181
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-18 00:00:00 By otsune

2006年10月19日(木) [長年日記]

#1 [mixi][www] このmixiのイイワケ文は「突然、無関係な文脈で誤解を狙った一般論を言い出す」という詭弁テクニックを天然でしているからマズいよな

スラッシュドット ジャパン | ミクシィ、画像に認可制御なしの欠陥を改修できず、ヘルプで弁解_
A. mixi は会員のみが見ることの出来る招待制サイトですが、mixi にアップした画像は、そのURLからmixi の外でも画像を見ることが出来てしまいます。ブロック機能実装に向け改善と検証を重ねている状況ですが、他人と共有する可能性のある画像を、100%外部から保護することはできないというのがインターネットの現状とも言えます。
その「インターネットの現状」は、「認証により閲覧を制限しているサイトでは」という文脈と、「ネットに一回でも流したデジタルデータでは」というネット一般論の文脈を混乱させて書いてある。
下手すると技術的に詳しくない人に対して「ネットではどんなに認証で制限しても、画像を見せないようにする事は無理なんだ」という誤解をふりまくデマになりかねない。
デジタルデータは、画像も文章も区別無く「データ」なんだから、画像だからといって出来ないという訳ではない。単に画像サーバーの負荷分散の都合とかで詭弁を書いているだけ。
もちろん 「mixiの画像ファイルは1日に23Gバイトずつ増える」---バタラ・ケスマCTO:ITpro_ という、文章データと画像データは桁違いだという現実があるから、同情できないわけではない。(個人的にバタラCTOの講演はYAPC::Asia 2006もカーネル勉強会にも参加して、この手の記事ではオフレコになりがちな質疑応答も全部聞いて認識している)

1 認証で制限をかけつつ画像はキャッシュさせて負荷を減らすのは難しいようだ:

Permalink: http://www.otsune.com/diary/2006/10/19/1.html#200610191
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-19 00:00:00 By otsune

2006年10月20日(金) [長年日記]

#1 [Perl][streaming] 「Shibuya Perl Mongers テクニカルトーク #7」が18:30からインターネット中継されることに

Shibuya Perl Mongers テクニカルトーク #7_ にて。
Permalink: http://www.otsune.com/diary/2006/10/20/1.html#200610201
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-20 00:00:00 By otsune

#2 [Mac] TextMateで日本語を入力するためにCocoaDialogを噛ませる方法

Typing Japanese in TextMate | Samurai Coder_ から。
まえは検索窓で日本語入力してそれをカット&ペーストするという回避法が提案されていたけど。
これは CocoaDialog_ を使って入力しようという話。
Permalink: http://www.otsune.com/diary/2006/10/20/2.html#200610202
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-20 00:00:00 By otsune

2006年10月22日() [長年日記]

#1 [neta] mixiに教えて君コミュを作るのは「*-users-MLはspamとその手の人を隔離しておく場所だから」みたいなTipsだったのか

{informa,computa,evolu}tion: 続々・mixiがなぜだめじゃないか_
Permalink: http://www.otsune.com/diary/2006/10/22/1.html#200610221
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-22 00:00:00 By otsune

#2 [mohican] J-CASTニュースで「モヒカン族」が取り上げられたがオレの肩書き違うな

J-CAST ニュース : 場の空気が読めない 「モヒカン族」_ から。
ウェブデザイナーではなくてシステム管理者が職業なのだが。
あとWikipediaに項目が出来ているというのは初めて知った。(Wikipediaのアカウント無いのでここでツッコミ入れておく)
モヒカン族 (ネット用語) - Wikipedia_
インターネットスラングで掲示板などの議論において正論を振りかざしながら相手を攻撃したり、
「攻撃」するのは似非であって、真のモヒカン族ではありません。真のモヒカン族の淡々とした指摘が、ムラ社会文化の人から邪推されて「攻撃」と誤解されることは多々有りますが。
はてなダイアリーが発祥とされ
これは明確に違います。
発祥はこのWeb日記の 2005年6月14日_ です。(主に展開されたのはhttp://mohican.g.hatena.ne.jp/のはてなグループだけど)
(はてなダイアリー)
それは「はてなグループ」であって、はてなダイアリーでは有りません。たとえるのならWiktionaryとWikipediaぐらい違います。

2 J-CASTのM記者が微妙に誤解して記事を書いたせいか、モヒカン族批判のニュースになっているな:

コメント欄_ の反応も仕方が無いか。
根本的にJ-CAST記者は「空気が読めない困ったタイプの人たち」というところに着目して記事を書いているが。元々のネタ展開として「モヒカン族が良いよ」とも「ムラ社会文化が良いよ」とも書かないように注意して書いたんだよなぁ。(J-CASTニュースは当然だけどJ-CAST記者の領域なので、何をどう解釈して記事を書いてもJ-CASTの自由だから良いんだけど)
まぁ2005年8月のネタを、つい数日前に「初めて知ったのですがどういう言葉なのか教えてください」と取材されて。モヒカン族はてなグループとかキーワードはほとんど読んでいないという感じだったので、ざっと説明したり。
ネーミングの経緯とか、当時ウォッチしていた新聞記者炎上のエピソードとかを話して。ネットは殺伐としたやり取りが多く、まるで大関東地獄地震の後かサザンクロスシティのようだと思ったよ。みたいな事を返答したりした。
あと今更だけど。
あれは技術者に対するステロタイプなイメージとして良くありがちな「ガリガリに痩せていて色白な理系メガネ君」というのを、あえて極端に逆サイドに振って、北斗の拳の筋骨隆々なモヒカン刈りの悪役雑魚になぞらえたギャップネタだったりするんだよな。(「汚物は消毒だぁ」で村人炎上をblog炎上に繋げるための前振りだとか、「サルまん」の弁髪編集者のギャップネタなどもイメージのネタ元だったりする)。だから「殺伐と淡々とした口調=荒くれ者で空気が読めない無礼者」という直結は解釈としては浅かったりする。あれは「おいおい、筋骨隆々のモヒカン刈りの男がキーボード叩いてネットバトルしているのかよ」というツッコミが欲しかったりもした(これはオレのネタ振りが甘かっただけなので仕方が無いが)。

2 忘れていたけど、結論部分の「モヒカン族への対処法」に関してはオレは取材でノータッチだな:

M記者が、おれのWeb日記の新聞記者炎上ウォッチ記事を読んでそう解釈したんだろうけど。
まぁ基本的にはあれを「モヒカン族対処法」として受け取ってもらっても、それはそれで良いんだけど。
モヒカン族の話題で一番言いたかった事はちょっと違って。
「空気が読めない無礼な奴だから、論理的に正しくても排除していいのだ」というムラ社会文化や、「論理的に間違っているから、どんなに感情面でマズくても正確に指摘すれば良いのだ」というモヒカン族文化は、鏡のようなもんじゃないかなぁ。どっちが良くてどっちが悪いというもんじゃないよな。んで「糸井重里メソッド」という、感情面に最大限に最適化された主張テクニックというのも有ったりするよね。優越感や自尊心や上下関係を気にしすぎたり、逆に気にしなさすぎたりして、ピュアに悩んでたりするのなら、まず面白おかしく分類して客観視するのも良いんじゃないかな。
……というような意図によるネタ話だったんだけど。
なぜか学者肌の人からは「モヒカン族というレッテルを貼って馬鹿にしているのか」と言われたり、群れを気にしすぎる人からは「ムラ社会文化の他人の目を気にすることをけなしている。殺伐と淡々としていればいいのだと煽動している」と言われたり。(多分、どっちの人も自分の性格の気にしている部分に引っかかったんだと思う)

2 2chスレ見た:

ウェブデザイナーだと思っている人はちゃんと読んでいないからどうでもいいとして。「otsune(本人) ◆Az5.wRptWI」って別人ですよ!
オレが2chに本人書き込みするときはBe付きで書き込みしてるって。

コメントを読む(6) [ コメントする ]

Re: J-CASTニュースで「モヒカン族」が取り上げられたがオレの肩書き違うな by Yuichirou    2006/10/22 18:43
> (Wikipediaのアカウント無いのでここでツッコミ入れておく) Wikipediaはアカウ...
Re: J-CASTニュースで「モヒカン族」が取り上げられたがオレの肩書き違うな by 民族浄化    2006/10/23 09:18
私はPC-VANの時代からモヒカン族です。プログラマです。 あらゆるジャンルで人の専門...
Re: J-CASTニュースで「モヒカン族」が取り上げられたがオレの肩書き違うな by パンツ    2006/10/23 10:03
なんだコラ ダイアリー? 瞳ダイアリーか? otsune殺すぞ 腰抜けが お前が取材を受け...
Re: J-CASTニュースで「モヒカン族」が取り上げられたがオレの肩書き違うな by パンツ    2006/10/23 10:08
おい、何だ 見てなかったら威勢のいいのがいるじゃねえか 民族浄化? 皆殺し? やって...
Re: J-CASTニュースで「モヒカン族」が取り上げられたがオレの肩書き違うな by ななし    2006/10/23 22:33
> 土足で踏み込んで荒らしてきました。 意図的に荒しているのであれば「偽モヒカン...
Re: J-CASTニュースで「モヒカン族」が取り上げられたがオレの肩書き違うな by Functional Unit Justified for Infiltration    2006/10/28 06:54
プロトタイプがmixiのコミュ(kusakabeさんコミュかどこか)で見られますね。この時は...
Permalink: http://www.otsune.com/diary/2006/10/22/2.html#200610222
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2006-10-22 00:00:00 By otsune

この記事へのトラックバック[4]

Kyan's BLOG III:モヒカン族
J-CAST ニュース : 場の空気が読めない 「モヒカン族」 えっと,要するに私のことです...
gekka blog:061023メモ
J-CAST ニュース : 場の空気が読めない 「モヒカン族」 記事タイトルからして斜め上だ...
日々の泡:理系
モヒカン族なんだそーで。 シム宇宙の内側にて ちょっとここモヒカン族が通りますよ ...
http://www.business-planet.net/story/2820748/:void GraphicWizardsLair( void ); // J-CASTニュースで「モヒカン族」が取り上げられたがオレの肩書き違うな
void GraphicWizardsLair( void ); // J-CASTニュースで「モヒカン族」が取り上げられ...