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

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

World Wide Walker:「Perlベストプラクティス」まとめ を読んでふと「Ruby使えばいいのに」と思った
[「Perlベストプラクティス」一通り読んだのでまとめ] えーと、先日 Ruby信奉者の本拠...

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 メタ文