Landscape トップページ | < 前の月 2003-03 2003-04 次の月 2003-05 >

Landscape - エンジニアのメモ 2003-04

月ごとの記事一覧
2007年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2006年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2005年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2004年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2003年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2002年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
日ごとのページ
2003-04/ 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日

2003-04-30 (Wed)

* 98円 * 42.01L + 税206円 = 4323円

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [給油]



* changelog.pm の設計

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

オブジェクトのリストアップ。

ChangeLog オブジェクト。
date_part の集合体。
count メソッド
get_date_list メソッド。
イテレータをどこに実装しよう?

date_part オブジェクト。
日付単位の ChangeLog メモ。
ヘッダ部分と ボディ部分に分かれる。

ヘッダは、日付部分、名前部分、メールアドレス部分から成る。これらは単数。
ボディは、subject と message に分かれる。これらは単数または複数。

・・・。うーん、オブジェクト指向の設計の定石がわからないな。
なんだか煩雑になってるだけのような気がする。
悩んでもきりがないので、以下の方針で進めようと思う。
・とりあえず html 変換のために必要な関数群と正規表現群を実装。
・tdiary のコードを読み、どのような設計になってるかを学ぶ。
・tdiary をお手本として changelog.pm を仕上げる。

とりあえず必要な関数と正規表現をリストアップしよう。

共通関数
・html エスケープ
・漢字コード変換 今は必要ないけど、そのうちきっと欲しくなる。

本文部分を生成するには、
・ChangeLog を日付単位に分割して返す
・日付単位に分割された ChangeLog を、さらに subjet 単位に分割して返す
・subject を subject-header と subject-body に分割して返す
・subject-body に対し、置換とリンクを設定する

ヘッドラインを生成するには、
・ChangeLog を日付単位に分割して返す
・ChangeLog から、subject の一覧を返す (p: 付きの subject も含む)
・ChangeLog から、subject の一覧を返す (p: 付きの subject は含まない)

こんなところか。

* C# から 接続 MS SQL Server 2000 への接続テスト

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [C#]

SqlConnection con = new SqlConnection("server=10.3.31.89;database=NorthWind;user id=sa;password=;");
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM Customers;", con);
con.Open();
SqlDataReader sqldr = sqlcmd.ExecuteReader();
while (sqldr.Read()) {
    Console.WriteLine(sqldr["CompanyName"].ToString());
}
sqldr.Close();
con.Close();

* 新型肺炎:感染防止のための必要知識 うがいと手洗いは必須

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [メモ]

www.mainichi.co.jp/news/flash/shakai/20030430k0000m040146000c.html

2003-04-29 (Tue)

* Redhat9 を入手するには

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

Redhat Linux スレ用のテンプレ。

▼ Linux: Redhat9 を入手するには
● インストールして使うだけなら、shrike-i386-disc1.iso から disc3 をダウンロード。
開発などでソースコードも必要なら、shrike-SRPMS-disc1.iso などもダウンロード。

● どの iso イメージにも日本語版が入っています。
RedHat Linux 7.1 以降は、日本語版が本家に統合されました。
650MB の CD-R メディアに収まります。700MB のメディアを用意する必要はありません。

- Redhat9 ミラーサイト http://www.redhat.com/download/mirror.html

http://princo.org:8080/linux/redhat/9.0/iso/
ftp://jpix.ftp.ne.jp/pub/redhat/linux/9/en/iso/i386/
ftp://61.206.118.113/pub/RedHat9/
ftp://ftp.kddlabs.co.jp/pub/Linux/packages/RedHat/redhat/lin ...
ftp://ftp.riken.go.jp/pub/redhat/redhat/linux/9/en/iso/i386/
ftp://ftp.sfc.wide.ad.jp/pub/Linux/redhat/linux/9/en/iso/i38 ...

- Winny を使ってダウンロードする http://www.geocities.co.jp/SiliconValley/2949/

以下の3行を、winny ディレクトリの download.txt に追加する。
(OS) RedHat Linux 9 shrike-i386-disc1.iso,,0,0,400c7fb292c73b793fb722532abd09ad,1
(OS) RedHat Linux 9 shrike-i386-disc2.iso,,0,0,6b8ba42f56b397d536826c78c9679c0a,1
(OS) RedHat Linux 9 shrike-i386-disc3.iso,,0,0,af38ac4316ba20df2dec5f990913396d,1

- BitTorrent を使ってダウンロードする

BitTorrent Files for Slashdot Effect Victims http://f.moya.scarywater.net/

- md5sum

400c7fb292c73b793fb722532abd09ad shrike-i386-disc1.iso
6b8ba42f56b397d536826c78c9679c0a shrike-i386-disc2.iso
af38ac4316ba20df2dec5f990913396d shrike-i386-disc3.iso

* 「人生を変える80対20の法則」/リチャード・コッチ/98年、TBSブリタニカ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [メモ]

http://www5a.biglobe.ne.jp/~NKSUCKS/jinseiw.html
パレートの法則その他の説明と書評。
人生を変える80対20の法則人生を変える80対20の法則

リチャード コッチ / Richard Koch / 仁平 和夫
発売日: 1998/05


amazon で詳しく見る   bk1で詳しく見る

* 竈@佐野ジャスコ店のラーメン

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ラーメン]

〒327-0821 栃木県佐野市高萩町1000-1 TEL:0283-20-5252

友達と一緒に行く。途中、東北自動車道佐野インター付近で大渋滞に遭遇。
世間様はゴールデンウィークの真っ最中なので仕方がないか。

しばらく前に新宿の本店で食べたが、そのときは花の季みたいな印象で、あまり美味しいと感じなかった。今回は期待せずに行ったせいか、まあまあ食べられる、と感じた。スープは魚系の香りを感じる。ベースは鳥と豚両方を使っているようだ。

google で検索したところ、鶏ガラ、豚骨、昆布、煮干しがベースだそうだ。
http://web.archive.org/web/20021230144621/http://www.geociti ...
壁に貼ってある説明書きの通り、スープは少しぬるめ。チャーシューは柔らかく、自然にほぐれるタイプ。メンマのクセのある香りはいただけない。肝心の麺は、かんすいの匂いが少し鼻につくが、まあまあ旨い。

2003-04-27 (Sun)

* sanyo の車載用 CD プレイヤー CDF-R880 の取り付け

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: []

先月買った sanyo の 車載用 CD プレイヤー CDF-R880 を車に取り付け。車通の人は取り付けなどと呼ばずにインストールと呼ぶようだ。また、取り付けをやってくれる業者はインストーラと呼ぶ。今回はお金がございませんので、自分で取り付けられるなら自分でやってしまいたいところだ。

- 下調べ

まず自分で車を分解して取り付けできるかどうかを見極める。ソニーモバイルのサイトでは、車種別、年式別の分解と取り付け方法を pdf で提供している。もちろんソニー製のカーオーディオやカーナビのための分解と取り付けのマニュアルなのだが、外装パネルの外し方、純正オーディオの取り外し方、スピーカーの取り付け方、センサーコードなどの配線の仕方は同じなので、十分役に立つ。何より、多数の自動車メーカーが網羅されており、非常に心強い。トヨタ、日産、三菱、マツダ、ホンダ、BMW やポルシェ、フェラーリ、フォード、GM ・・・きりがないのでこの辺でやめておくが、主要なメーカーならちゃんとマニュアルが用意されている。

ソニーモバイル の車種別フィッティングガイドマニュアル
http://www.mobile.sony.co.jp/fit/fit.html

上記サイトのマニュアルを見たところ、自分でも取り付けできそうだったのでやってみることにした。難しすぎるようだったらカー用品店などでお願いするつもりだった。

- いざ分解

とりあえずパネルを外して、中を見てみることにした。ネジの位置はフィッティングガイドマニュアルのおかげで簡単にわかったのだが、すべてネジを外したのにパネルが外れない。どうやら、はめ込み式になっている部分があるようで、かなり力を加えないと外せないようだ。力を込めたり、マイナスドライバをテコのように使ってなんとか外すことができた。

- うーん、どう見てもケーブルの形状が違うんだけど・・・

車側から出ているケーブルと、CD プレイヤーの電源入力端子の形がどう見ても違う。フィッティングガイドには「日産車用配線キット RC-101N をご利用ください」と書いてある。アダプタを使うのかな。そういえば CD プレイヤーの付属品でアダプタが入っていた。これを使うのかな、と思って端子をみると、また違う様だ。よく考えれば、CD プレイヤーにはアダプタは一つしか入ってなかったが、これだけですべてのメーカーの車に取り付けられるわけがない。また、フィッティングガイドには「日産車用配線キット」とメーカーを名指ししてある。

つまり、さらにアダプタを用意しなければならないんだろう。オーディオの取り付け作業は初めてなので、仕組みを理解するまでちょっと時間がかかった。

- アダプタ選び

車についているケーブルは、純正デッキのことしか考えてない形状になってる。
そこで、純正デッキを汎用のインターフェイスに変換するアダプタが必要。
市販の CD プレイヤーには、アダプタで変換してから接続する。

要するに、
電源 -> 純正カセットデッキ & チューナー を、
電源 -> 変換アダプタ -> CD デッキ とすることが必要。

変換アダプタを買いに、ビバホーム若松原店へ。実は各メーカー用にたくさん種類があり、大変迷った。同じメーカーでも年式によって分かれており、適合する物を選ばなければならない。最終的にアダプタの形状を見て判断。税込み1260円なりぃ。

しかし、面倒だよなあ。インターフェイスを統一しておいてくれれば、変換アダプタなんて買わなくて済むし、配線もすっきりするのに・・・。

- あとは簡単

アダプタさえあれば、あとは簡単。同じ色のケーブル同士を繋いでいくだけだ。繋ぎ忘れや繋ぎ間違いがないことを確認してからスイッチを入れると、音が出た。うれしい。うん、いい音だね。CD ウォークマンからの出力をカセットテープみたいなアダプタに変換してアンプ入力してた時と比べ、音も良くなった。やっぱり余計な変換なしに CD の出力をアンプに入力した方が良い。細かい音もちゃんと聴こえる。素晴らしい。

- CDF-R880 は外部入力端子付き

CDF-R880 は前面右下に AUX 端子が付いている。これがあれば、将来的に mp3プレイヤーとかを繋ぎたくなったりても安心。CD プレイヤー部分が壊れてもアンプとして使えるし。あと、オフィシャルサイトには CD-R としか書いてないので CD-RW は非対応なんじゃないか、と不安になるかもしれないが、取り扱い説明書にはきちんと CD-RW 対応と書いてあった。実際に CD-RW 使えてるし。

CDF-R880 SANYO Car Audio & Accessory
http://www.sanyo-car.co.jp/caraudio/cdfr880.html
三洋のオフィシャルページ。

2003-04-26 (Sat)

* ln コマンドでシンボリックリンク作成

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [unix]

TARGET へのリンクを DIRECTORY に作成する。いつも TARGET と DIRECTORY の順番で迷ってしまうのでメモ。

$ ln -s TARGET DIRECTORY

man ln によると、TARGET だけを指定したときはカレントディレクトリに TARGET へのリンクを作成するとのことなので、一引数だけの指定をした方が良いかもしれない。

2003-04-25 (Fri)

* lo_import を使用できるユーザの設定

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Postgres]

Postgres の管理者以外のユーザーでも、ラージオブジェクトをインポートできるようにする。
UPDATE pg_shadow SET usesuper = true WHERE usename = 'hiroaki';
これを実行しておかないと、lo_import() 時に弾かれる。

2003-04-24 (Thu)

* Squid の http -> FTP 変換 (ftp over http proxy)

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Squid]

ブラウザが ftp://ftp.ring.gr.jp/pub/linux/ に Squid 経由でアクセスするとき、
以下のようなリクエストが投げられる。
GET ftp://ftp.ring.gr.jp/pub/linux/ HTTP/1.1
Host: ftp.ring.gr.jp

当然、ID/Password を指定することも可能。
GET ftp://anonymous:saitou-hiroaki%40example.com@ftp.ring.gr.jp/pub/linux/ HTTP/1.1

アップロードするときは、PUT メソッドを使えば可能。ただし、私が使っている HTTP プロキシ経由では試してない。Netscape を使って LAN 内の ftp サーバ に対し PUT することはできた。

Squid 経由だと、FTP アップロードするときに Netscape は以下のようなリクエストを投げているようだ。
PUT ftp://anonymous:saitou-hiroaki%40example.com@ftp.ring.gr.jp/pub/linux/Zip7Search.dll HTTP/1.0
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.78 [en] (Windows NT 5.0; U)
Pragma: no-cache
Host: ftp.ring.gr.jp
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
Accept-Encoding: gzip
Accept-Language: ja,en
Accept-Charset: iso-8859-1,*,utf-8
Content-Length: 6144
以下、ファイルの中身のデータがバイナリで続く。

上記リクエストで、アップロード先のパスは PUT リクエストに含まれているけど、ローカルファイルのパスはどこで指定してるんだろうか? カレントのファイルが対象になるんだろうか?

もちろん、anonymous だと ftp.ring.gr.jp にアップロードはできないのでエラーになった。ちなみに Squid から返ってきたエラーは以下の通り。PUT を STOR に変換してるのがわかる。

HTTP/1.0 500 Internal Server Error
Server: Squid/2.2.STABLE5
Mime-Version: 1.0
Date: Thu, 24 Apr 2003 09:55:52 GMT
Content-Type: text/html
Content-Length: 896
Expires: Thu, 24 Apr 2003 09:55:52 GMT
X-Squid-Error: ERR_FTP_PUT_ERROR 0
X-Cache: MISS from unknown
Age: 286
Via: HTTP/1.0 hostname (Traffic-Server/4.0.19 [cMs f ])
エラー
FTP アップロードは失敗しました

以下の URL を PUT しようとした際に:
ftp://anonymous@ftp.ring.gr.jp/pub/linux/Zip7Search.dll
Squid は以下の ftp コマンドを送りましたが:

        STOR Zip7Search.dll

このような結果を受け取りました.

        Zip7Search.dll: Permission denied on server. (Upload)

この意味は次の通りです:

  パス,パーミッション,ディスクの空き容量を確認し,再度試してください.

Generated Thu, 24 Apr 2003 09:55:52 GMT by unknown
(Squid/2.2.STABLE5)

追記。
2004-05-11 に「lftp で FTP Over HTTP Proxy」という記事を書いた。

* やっぱり自分好みの ChangeLog -> html 変換スクリプトが欲しい

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

- 欲しい機能


・タイトルリスト
ページ右側に、日付とその日のタイトルの一覧、およびそのリンクが欲しい。

・可能な限り厳正な html を出力したい

・・・あれ? これだけか・・・? あとは検索かなあ?
tdiary や hns にあるコメントを付加する機能とかは必要ないよね。

- 仕様

ChangeLog クラス
メソッド
ChangeLog ファイル読み込み、出力
とりあえず読み込みだけ実装しよう。

データ取得
get_date_part() 日付単位に split して返す。
get_suject() 指定された date_part を subject 単位に split して返す。

ChangeLog2html クラス
メソッド
タイトル一覧を返す
subject 一覧を返す
本文を返す

* Perl チュートリアル

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

Perl Tutorial: Start (日本語訳)
http://web.archive.org/web/20030421165224/http://plaza27.mbn ...
原文は http で agora.leeds.ac.uk/Perl/ にあるらしいけど、DNS 正引きできない。

* ChangeLog メモを日付ごとの固まりに split する正規表現

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

my @date_part = split(/^(?!\t|\n)/m, $str);

* bash で第二引数の補完

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [bash]

- 2003-03-31 に書いた bash の補完で悩む。

chown は 第2引数にファイル名をとるのだが、
complete -u {su,finger,chown}
だと引数の位置にかかわらずユーザ名しか補完してくれない。

- tcsh ならば引数位置による補完対象を指定できるようだが、bash では指定できないようだ。

- Working more productively with bash 2.x

http://www.caliban.org/bash/index.shtml#completion
ではどうやってるのかな、と見てみたが、何やってるか良くわからん。
以下は bash-completion-20030419.tar.gz からの抜粋。
# chown(1) completion
#
_chown()
{
    local cur prev user group i

    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    prev=${COMP_WORDS[COMP_CWORD-1]}

    # options completion
    if "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '-c -h -f -R -v --changes \
        --dereference --no-dereference --from= --silent --quiet \
        --reference= --recursive --verbose --help --version' -- $cur ) )
        return 0
    fi

    # first parameter on line or first since an option?
    if [ $COMP_CWORD -eq 1 ]
; then
        if [[ "$cur" == [a-zA-Z]*[.:]* ]] && \
           [[ ${BASH_VERSINFO[1]} > 04 ]]; then
            user=${cur%%?(\\)[.:]*}
            group=${cur#*[.:]}
            COMPREPLY=( $( compgen -P $user':' \
                    -g -- $group 2>/dev/null) )
        else
            COMPREPLY=( $( compgen -S ':' -u $cur ) )
        fi
    else
        _filedir
    fi

    return 0
}
complete -F _chown $filenames chown

ざっと読んだ限りでは、_chown() という関数を作り、それをchown の補完対象として呼び出すようにしている。_chwon() の前半は chwon のオプションを補完。後半は引数の補完だが、第一引数かどうかを判定し、第一引数だったらユーザ名、そうでなかったらファイル名を補完しているようだ。

なんか面倒だなあ。zsh に乗り換えた方が良いのかなあ。

2003-04-23 (Wed)

* ChangeLog メモ整形スクリプト

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

- 2003-04-182003-04-22 から続く整形スクリプト。

- 今までとは別の one liner を考えた。今回の方が表記自体はスマートだと思う。

(?!PATTERN) は、「否定の先読み」を表す。
$ perl -p -i.bak -e 's/^((?!\t)(?!\d{4}-\d{2}-\d{2}\s+.*?<.*>).+)/\t$1/; s/\s+$/\n/;' /home/hiroaki/log.txt

- でも性能が悪いみたい。

$ time perl -p -i.bak -e 's/^((?!\t)(?!\d{4}\-\d{2}\-\d{2}\s+.*?<.*>).+)/\t$1/; s/\s+$/\n/;' /home/hiroaki/log.txt

real    0m0.567s
user    0m0.470s
sys    0m0.080s

うーん、複雑な正規表現はコスト高いのかなあ? そんなに複雑でもないと思うけど・・・。

2003-04-22 (Tue)

* 便利ツール

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

- changelog_util.sh

#!/bin/bash
# ChangeLog memo util

# setting
LOG_PATH=/home/hiroaki/log.txt

DATE_STR=`date +%Y%m%d%H%M%S`
BACKUP_DIR=/home/hiroaki/backup/changelog
BACKUP_FILE_PATH=${BACKUP_DIR}/log.txt_${DATE_STR}.bak

# main routine
cp ${LOG_PATH} ${BACKUP_FILE_PATH}
perl -p -i.bak -e 'if ($_ =~ /^[^\t]/) { if ($_ !~ /^\d{4}-\d{2}-\d{2}\s+.*?<.*>$/) {$_ = "\t" . $_;} $_ =~ s/\s+$/\n/;}' ${LOG_PATH}
/home/hiroaki/chalow-0.13/chalow ${LOG_PATH} -c /home/hiroaki/chalow-0.13/cl.conf &>/dev/null
find /home/hiroaki/backup/changelog/ -type f -mtime +7 |xargs /bin/rm -f

- 整形スクリプトの所要時間を計測。

perl で整形を実行中に書き込みしたりすると、
排他制御してないのでいろいろ問題出るかなあと思ったので。
$ time perl -p -i.bak -e 'if ($_ =~ /^[^\t]/) { if ($_ !~ /^\d{4}-\d{2}-\d{2}\s+.*?<.*>$/) {$_ = "\t" . $_;} $_ =~ s/\s+$/\n/;}' /home/hiroaki/log.txt

real    0m0.480s
user    0m0.390s
sys    0m0.070s

なんだ、楽勝じゃん。Pentium 133MHz のマシンでこれしか時間かかってないわけだし。

* ChangeLog メモを整形する

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

- 毎回タブ付けてキレイにインデントしながらメモを取るなんてかったるいことやってられねーよ、

ってことで、perl one liner。
というか単にふつーに書いたスクリプトを無理矢理 one liner にしただけだったりする。
$ perl -p -i.bak -e 'if ($_ =~ /^[^\t]/) { if ($_ !~ /^\d{4}-\d{2}-\d{2}\s+.*?<.*>$/) {$_ = "\t" . $_;} $_ =~ s/\s+$/\n/;}' /home/hiroaki/log.txt

* ユーザディレクトリでの cgi 実行

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Apache]

httpd.conf の <IfModule mod_alias.c> に以下の行を追加する。
ScriptAliasMatch /~(..*)/cgi-bin/(.*) /home/$1/public_html/cgi-bin/$2

- httpd.conf に以下の行を追加する。sonic ではこの方法を採用。

<Directory /home/*/public_html/cgi-bin>
  AddHandler cgi-script .cgi
  AllowOverride FileInfo AuthConfig Limit
  Options ExecCGI
</Directory>

- httpd.conf の <Directory /home/*/public_html> で

AllowOverride に Options を追加し、.htaccess で ExecCGI できるようにする。
.htaccess に以下の記述を追加。
<Limit GET POST>
  AddHandler cgi-script .cgi
  Options ExecCGI
</Limit>

* ユーザ毎の cron の設定ファイルのパス

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

/var/spool/cron/

2003-04-21 (Mon)

* Postgres で データベース名の一覧を取得

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Postgres]

psql -l -P format=unaligned -P fieldsep=, -P tuples_only |perl -F, -lane "if (@F[0] ne 'template0') {print @F[0]}"
template0 は接続エラーになってしまうため除外する。

* apachectl coinfigtest で httpd.conf の文法チェック

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Apache]

以下のコマンドを実行するだけ。
# /usr/local/apache/bin/apachectl configtest

2003-04-19 (Sat)

* おきらく Perl プログラミング入門

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

http://www.geocities.co.jp/SiliconValley-Oakland/1680/xperl/

- perl オブジェクト指向についての文書がある。記述が詳細でわかりやすい。

とくに、継承についての記述が役に立つ。
http://www.geocities.co.jp/SiliconValley-Oakland/1680/xperl/ ...

- クロージャ (closure) の利点と使い方についての文書もある。

http://www.geocities.co.jp/SiliconValley-Oakland/1680/xperl/ ...
クロージャを一言で説明すると、「実行する関数とアクセス可能な局所変数をまとめたオブジェクト」

2003-04-18 (Fri)

* ChangeLog メモ整形スクリプト

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

- 先頭にタブが入っていない場合で、日付の行ではなかった場合にタブを付加する。

#!/usr/bin/perl
use strict;

defined($ARGV[0]) or die __FILE__ . ": target file not specified\n";
my $memo_file = $ARGV[0];
my @line = &ReadFile($memo_file);
my $str = '';
foreach my $buf (@line) {
  if ($buf =~ /^[^\t]/) {
    if ($buf !~ /^\d{4}-\d{2}-\d{2}\s+.*?<.*>$/) {
      $buf = "\t" . $buf;
    }
  }
  $buf =~ s/\s+$/\n/;
  $str.= $buf;
}
&WriteFile(1, $str, $memo_file);

# 引数で指定されたファイルを読み込み、呼び出し側のコンテキストに応じた形で返す
sub ReadFile($) {
  my $target_file = $_[0];
  my @lines = ();

  if (! -e $target_file) {
    die(__FILE__ . ": error: ReadFile(): $target_file not found.");
  }
  if (! -r $target_file) {
    die(__FILE__ . ": error: ReadFile(): $target_file: permission denied.");
  }
  open(FILE, $target_file) or die(__FILE__ . ": error: ReadFile(): can not open $target_file.");
  flock(FILE, 1);
  @lines = <FILE>;
  close(FILE);

  return (wantarray ? @lines : join('', @lines));
}

# テキストデータをファイルに書き込む
# 引数1 : 0のとき追記、1のとき上書き
# 引数2 : データ (スカラー)
# 引数3 : ファイル名
# 返り値 : 書き込み成功のとき 1
sub WriteFile($$$) {
  my ($overwrite, $data, $target_file) = @_;
  if (-e $target_file) {
    if (! -w $target_file) {
      die(__FILE__ . ": error: WriteFile(): $target_file: permission denied.");
    }
  }

  my $err_msg = __FILE__ . ": error: WriteFile(): Can not open $target_file.";
  if ($overwrite) {
    open(FILE, ">$target_file") or die($err_msg);
  } else {
    open(FILE, ">>$target_file") or die($err_msg);
  }
  flock(FILE, 2);
  print(FILE $data);
  close(FILE);

  return 1;
}

2003-04-17 (Thu)

* Postgres バックアップスクリプト version 1.1

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Postgres] [バックアップ]

postgres の pg_dump のデータが溜まりすぎて、DAT にバックアップできなくなっていた。
2002-09-11 に書いた Postgres バックアップスクリプトに n 日以前のファイルを消すという処理を追加し、以下のようにした。また、バックアップ対象 DB を psql -l から取得するようにした。

pg_dumpall を使っていないのは、ラージオブジェクトを扱うためと、データベース毎にバックアップファイルを分けたかったから。

動作を確認した環境は PostgreSQL 7.2.1 + TurboLinux 6.5 Server だ。凝ったことはしていないので、バージョンが異なっても動くはずだ。cron に仕込んで夜間バッチなどで動かすときは、postgres 関連コマンドやディレクトリへのパスを設定するのを忘れずに。以下のスクリプトでは、 # Setting の部分で 環境変数を設定している。

#/bin/sh

# PostgreSQL database backup script
# Version 1.1 [Apr. 17, 2002] Add routine: deleting exipired files.
# Version 1.0 [Sep. 10, 2002] First release.
#  Saito Hiroaki  <example@example.com>

# * Feature
# Dump to DATABASE_NAME_YYMMDD.pgdmp.
# Delete expired pgdmp file.
# Output log.

# Setting
PATH="$PATH":/usr/local/pgsql/bin
PG=/usr/local/pgsql
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":$PG/lib
export PGLIB=$PG/lib
export PGDATA=$PG/data

# Get all DB name
TARGET_DB=`psql -l -P format=unaligned -P fieldsep=, -P tuples_only |perl -F, -lane "if (@F[0] ne 'template0') {print @F[0]}"`

DIR=/home/postgres
LOG=$DIR/pgdump.log
BACKUPDIR=$DIR/dbbackup
EXPIRE_DAY=90

# Main routine
echo "pg_dump start." `date` >>$LOG
date=`date +%Y%m%d`

for db_name in $TARGET_DB
do
  DUMP_FILE_PATH=$BACKUPDIR/${db_name}_${date}.pgdmp
  /usr/local/pgsql/bin/pg_dump $db_name -b -o -Fc > $DUMP_FILE_PATH 2>>$LOG
  echo "Database $db_name backup complete." `date` >>$LOG
done

echo "pg_dump complete." `date` >>$LOG

echo "Delete expired pgdmp file start." `date` >>$LOG
find $BACKUPDIR -type f -daystart -mtime +$EXPIRE_DAY |xargs /bin/rm -f
echo "Delete expired pgdmp file complete." `date` >>$LOG

私はこのスクリプトを postgres スーパーユーザの crontab に仕込んで毎日実行している。postgres スーパーユーザ以外で動かすこともできるとは思うが、データベースにアクセスするためにパスワードを要求されたりするかもしれず、いろいろ手間がかかりそうな予感。管理者権限を使いたくないという意見もあるかもしれないが、バックアップというのは本来管理者やオペレータが行う作業だし、素直に postgres スーパーユーザで実行してしまった方が楽だ。

「一般ユーザとして全部のデータベースをバックアップする」という状況ってあまり考えられない。どうしても管理者権限を使いたくないなら、以下のオプションを使ってできるんじゃないかと思う。試してないけど。
-U, --username=NAME      connect as specified database user
-W, --password          force password prompt (should happen automatically)

2003-04-16 (Wed)

* n 日以前のタイムスタンプを持つファイルを消す

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

$ find /home/postgres/dbbackup -type f -daystart -mtime +n |xargs /bin/rm -f

-mtime +n の n に日数を指定できる。find って便利だね。
cron で毎日実行すれば、毎日ディレクトリを監視して一定期間を過ぎたファイルを消す、ということができる。

2003-04-15 (Tue)

* http の CONNECT メソッド

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [http]

CONNECT メソッドを使った外部とのトンネリング。

- 172.16.4.1 の場合

$ telnet 172.16.4.1 17216
Trying 172.16.4.1...
Connected to 172.16.4.1.
Escape character is '^]'.
CONNECT www.google.com:443 HTTP/1.1
Host: www.google.com

HTTP/1.0 200 Connection established

Connection closed by foreign host.

- 172.16.4.2 の場合

$ telnet 172.16.4.2 17242
Trying 172.16.4.2...
Connected to 10.2.4.2.
Escape character is '^]'.
CONNECT www.google.com:443 HTTP/1.1
Host: www.google.com

HTTP/1.1 200 Connection established
Date: Tue, 15 Apr 2003 11:10:45 GMT
Age: 0
Connection: close
Via: HTTP/1.0 hostname (Traffic-Server/4.0.19 [c sSf ])

Connection closed by foreign host.

* http の OPTIONS メソッド

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [http]

OPTIONS を使うと、そのサーバで使用可能なメソッドを取得できる。

$ telnet 10.3.31.90 80
Trying 10.3.31.90...
Connected to 10.3.31.90.
Escape character is '^]'.
OPTIONS * HTTP/1.1
Host: localhost

HTTP/1.1 200 OK
Date: Wed, 16 Apr 2003 02:35:15 GMT
Server: Apache/1.3.26 (Unix) PHP/4.2.1
Content-Length: 0
Allow: GET, HEAD, OPTIONS, TRACE

Connection closed by foreign host.

* proftpd のタイムアウトの設定

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [proftpd]

proftpd.conf にタイムアウトの設定を記述できる。

TimeoutLogin 300
TimeoutNoTransfer 3600
TimeoutStalled 3600
TimeoutIdle 3600

単位はすべて秒。
TimeoutLogin: ログイン時にタイムアウトになるまでの時間。
TimeoutNoTransfer: ログイン後、無通信状態でタイムアウトになるまでの時間。
TimeoutIdel: サーバーとクライアント間で何も通信が無い状態でタイムアウトになるまでの時間。
TimeoutStalled: 転送開始後にデータが流れていない状態でタイムアウトになるまでの時間。

* 日付と表題一覧を付加2

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

- 2003-04-15 に作った「日付と表題一覧を付加する」perl スクリプト、実はバグあり。

my @part_by_date = ($source =~ /^(\d{4}\-\d{2}\-\d{2}.*?)\n\n/msg);
これじゃ日付以外のところに \n\n があると、それ以降が無視されてしまう。
まあ使ってないからいいんだけど。

* 日付と表題一覧を付加

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

- 作ったけど適用してない。どこに適用するのが適切なのかを探す時間がないから。

$source は html エスケープなどのサニタイズが完了していることが条件。
my $tmplt_dt = '<dt>%s</dt>';
my $tmplt_dd_start = '<dd><ul>';
my $tmplt_dd_end = '</ul></dd>';
my $tmplt_li '<li>%s</li>';
my $html = '<dl class="subject_list">';
my @part_by_date = ($source =~ /^(\d{4}\-\d{2}\-\d{2}.*?)\n\n/msg);
foreach my $part (@part_by_date) {
  my $date = ($part =~ /^(\d{4}\-\d{2}\-\d{2})/)[0];
  $html .= sprintf($tmplt_dt, $date);
  $html .= $tmplt_dd;
  my @subject = ($part =~ /^\t\*\s+(.*?)$/mg);
  foreach my $subject_str (@subject) {
    $html .= sprintf($tmplt_li, $subject_str);
  }
  $html .= $tmplt_dd_end;
}
$html .= '</dl>';

* Postgres の VARCHAR(n) の文字数ってマルチバイト対応?

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Postgres]

2003-04-14 の ChangeLog について調査。

- VARCHAR(n) の文字数とは、SQL92 の定義に則れば、

「処理系の定義する特定の文字集合」 の文字数である。

- しかし、7.2 未満の Postgres は上記仕様を満たしていなかった。

7.2 からは上記の仕様に準拠するようになった。
[pgsql-jp 23148] Re: VARCHAR(n)のn
http://ml.postgresql.jp/pgsql-jp-old/pgsql-jp/2001Sep/msg001 ...
もともとPostgreSQLのマルチバイト実装におい
ては,『処理系の定義する特定の文字集合』とは,データベースごとに決まる
エンコーディングです.日本のユーザならたいていEUC_JPでしょう.

- VARCHAR(n) の文字数とは直接の関係はないが、知っておくべき情報もいくつかあった。


- CHAR 型 はスペースでパディングされるために結構コストが高い。

[pgsql-jp 23075] Re: INSERT するときのサイズチェック
http://ml.postgresql.jp/pgsql-jp-old/pgsql-jp/2001Sep/msg001 ...
char型の場合、たとえばCHAR(10)で確保した列に100万行を挿入す
れば、その列にどんな長さの文字列を挿入しようとも、きっちり10
バイト×行数(この場合には1000万バイト)の領域が必要になりま
す。しかし、varchar型やtext型の場合には、実際に挿入した文字列
の長さ+4バイトしか使いません。ですから、長さがまちまちである
文字列を保持するのであれば、varchar型やtext型の方がリーズナブ
ルなわけです。

- CAHR と VARCHAR の違いと文字列長超過時のエラー

PostgreSQL 7.2.3 ユーザガイド Chapter 3. データ型
http://www.postgresql.jp/document/pg721doc/user/datatype-cha ...
SQL は 2 つの主要な文字データ型を定義しています。
character(n) と character varying(n) で、n は正の整数です。
これらのデータ型は 2 つとも長さにして n 文字分の文字列を保存できます。
超過している文字がすべてスペースの場合(この時は長さの限界で切り捨てられます)を除いて、
上限を越えた文字列をこの種の列に保存しようとするとエラーになります。
(この一風変わった例外は SQL 標準で要求されています。)
もし宣言された上限よりも文字列が短いときは character の値はスペースでパッドされ、
character varying の値は単により短く保存されます。
Note: PostgreSQL 7.2 以前では上限を越えた文字列は黙って切り捨てられエラーとはなりません。

あ、Postgres については調べられたけど、MS SQL Server については調べてないな・・・。

2003-04-14 (Mon)

* VARCHAR(n) の文字数ってマルチバイト対応?

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [SQL]

実装依存だったりするような予感。あとで Postgres と MS SQL Server で試してみよう。

2003-04-11 (Fri)

* 年月日指定をリンクに置換する正規表現

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl] [chalow]

- 2003-04-09 に引き続きちょっとだけ改良。

>YYYY-MM-DD または YYYY-MM-DD の ChangeLog という指定をすると、
<a href="#YYYY-MM-DD" title="YYYY年MM月DD日の ChangeLog">YYYY-MM-DD の ChangeLog</a>
に置き換えるようにした。追加したコードは以下の通り。
s!(((\d{4})-(\d{2})-(\d{2}))\s*の\s*changelog)!<a href="#$2" title="$3年$4月$5日の ChangeLog">$1</a>!ig;
s!(&gt;&gt;((\d{4})-(\d{2})-(\d{2})))!<a href="#$2" title="$3年$4月$5日の ChangeLog">$1</a>!ig;

* proftpd で anonymous からのアクセスを許可

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [proftpd]

/etc/proftpd/proftpd.conf を編集して設定する。
<Anonymous /home/samba/public> で、anonymous ユーザに公開するディレクトリを設定。

- anonymous ユーザをどのローカルユーザにマッピングするかを設定。

User                          ftp
Group                        ftp

- /etc/passwd のユーザ情報を確認し、ローカルユーザが使うログインシェルを設定しておく。

ftp アクセスしか許可しない場合は、そもそもシェルは必要ない。そういう場合、/sbin/nologin や /bin/false を使うそうだ。
ftp:x:14:50:FTP User:/var/ftpd:/bin/false
ログインシェルを設定しておかない場合、ftp の user コマンドは受け付けられるのだが、e-mail アドレスをパスワードとして入力するところで認証に失敗してしまう。最初は正引きできないドメインだとエラーになってログインできないのかと思ったが、どうやらログインシェルを設定していないためにエラーになっていたようだ。

- <Anonyumous /home/samba> などと chroot を指定した場合

<Anonymous> ディレクティブの外へのシンボリックリンクの追跡は無効なようだ。chroot なので当たり前だけど。ShowSymlinks on を記述しても無効。

* Linux で iso イメージをループバックマウント

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

# mount -r -t iso9660 -o loop /home/hiroaki/shrike-i386-disc1.iso /home/samba/public/iso/redhat9/disc
# umount /home/samba/public/iso/redhat9/disc1

JM の mount(8) も参考になる。
http://www.linux.or.jp/JM/html/util-linux/man8/mount.8.html

2003-04-10 (Thu)

* Perl で md5 ハッシュを扱う

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

仕事で md5 で生成したハッシュを使うかもしれないので、perl でサンプルコードを書くことにした。

md5sum を計算してくれるモジュールは標準ではインストールされていない。Digest::MD5 が良さそうなので、cpan から Digest-MD5-2.24 をダウンロードしてインストール。このモジュールを選んだのは、Perlの小技 http://member.nifty.ne.jp/hippo2000/perltips/ に紹介記事があったから。

Makefile.pl を実行し、make、su, make install でインストール完了。

ほほう、16進文字列32文字で表記する方法の他にも、base64 でエンコードした文字列 22 文字で表現する方法もあるのか。

2003-04-09 (Wed)

* ftp URL をリンクに置換する正規表現

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl] [chalow]

ftp URL もリンクに置換して欲しいので、以下の行を追加した。
s!(ftp://(?:$URLCHARS*))!<a href="$1">$1</a>!g; # ftp URL

2003-04-04 (Fri)

* ChangeLog メモ上の文字列の置き換え

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

- リンクにした方が便利そうなので置換してみる。

s!(\s)(google)(\s)!$1<a href="http://www.google.co.jp/" title="Google">$2</a>$3!ig;
s!(\s)(example)(\s)!$1<a href="http://www.example.co.jp/" title="example">$2</a>$3!ig;
s!(\s)(yahoo)(\s)!$1<a href="http://www.yahoo.co.jp/" title="Yahoo\! Japan">$2</a>$3!ig;
s!(\s)(2ちゃんねる|2ch\.net)(\s)!$1<a href="http://www.2ch.net/" title="2ちゃんねる">$2</a>$3!ig;
s!(\s)(/\.|slashdot)(\s)!$1<a href="http://slashdot.jp/" title="Slashdot Japan">$2</a>$3!ig;
s!(\s)(JM)(\s)!$1<a href="http://www.linux.or.jp/JM/" title="Linux JM project">$2</a>$3!ig;
s!(\s)(namazu)(\s)!$1<a href="http://www.namazu.org/" title="全文検索エンジン Namazu">$2</a>$3!ig;
s!(\s)(redhat)(\s)!$1<a href="http://www.jp.redhat.com/" title="RedHat Linux Japan">$2</a>$3!ig;
s!(\s)(debian)(\s)!$1<a href="http://www.debian.org/" title="Debian">$2</a>$3!ig;
s!(\s)(\@IT)(\s)!$1<a href="http://www.atmarkit.co.jp/" title="\@IT - アットマーク・アイティ">$2</a>$3!ig;
s!(\s)(winny)(\s)!$1<a href="http://www.geocities.co.jp/SiliconValley/2949/" title="Winny Web Site">$2</a>$3!ig;
s!(\s)(mozilla)(\s)!$1<a href="http://www.mozilla.org" title="mozilla.org">$2</a>$3!ig;
s!(\s)(postgres|postgresql)(\s)!$1<a href="http://www.postgresql.org/" title="PostgreSQL">$2</a>$3!ig;
s!(\s)(apache)(\s)!$1<a href="http://www.apache.jp/mirror/" title="The Apache Software Foundation (JP mirror)">$2</a>$3!ig;
s!(\s)(samba)(\s)!$1<a href="http://www.samba.gr.jp/" title="日本 Samba ユーザ会">$2</a>$3!ig;
s!(((\d{4})-(\d{2})-(\d{2}))\s*の\s*changelog)!<a href="#$2" title="$3年$4月$5日の ChangeLog">$1</a>!ig;
s!(&gt;&gt;((\d{4})-(\d{2})-(\d{2})))!<a href="#$2" title="$3年$4月$5日の ChangeLog">$1</a>!ig;
s!^(\t&gt;\s+.*)$!<strong class="quote">$1</strong>!igm;
s!^\t-\s(.*)$!\t<strong>- $1</strong>!igm;

2003-04-03 (Thu)

* 続 Perl でファイル名から拡張子を除いて返す

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

- 2002-09-30 のスクリプトは、. が全く存在しない文字列を渡したときに、

Use of uninitialized value のエラーになる。以下のようにするのが良いだろう。
ていうか要求仕様があいまいだなあ。
・拡張子が無いとき ex) access_log
・拡張子が複数ある時 ex) aceess_log.tar.gz
・拡張子しかないとき ex) .htaccess
上記の時に、どんな文字列を返して欲しいのかを決めないと作りようがない。

# ファイル名から拡張子を除いた部分の文字列を返す
sub get_base_name($) {
  my $file_name = shift;
  my $basename = $file_name;
  $basename =~ s/(.*)\..*?$/$1/;
  if ($basename eq '') {
    $basename = $file_name;
  }
  return $basename;
}

2003-04-02 (Wed)

* Redhat9 を入手するには

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

- Winny を使ってダウンロードする

Winny http://www.geocities.co.jp/SiliconValley/2949/
以下の3行を、winny ディレクトリの download.txt に追加する。
(OS) RedHat Linux 9 shrike-i386-disc1.iso,,0,0,400c7fb292c73b793fb722532abd09ad,1
(OS) RedHat Linux 9 shrike-i386-disc2.iso,,0,0,6b8ba42f56b397d536826c78c9679c0a,1
(OS) RedHat Linux 9 shrike-i386-disc3.iso,,0,0,af38ac4316ba20df2dec5f990913396d,1

- BitTorrent を使ってダウンロードする

BitTorrent Files for Slashdot Effect Victims http://f.scarywater.net/

- md5sum を確認する おすすめツール: http://www.md5summer.org/

Redhat9 md5sum 情報源: http://slashdot.org/comments.pl?sid=59033&cid=5633208
400c7fb292c73b793fb722532abd09ad shrike-i386-disc1.iso
6b8ba42f56b397d536826c78c9679c0a shrike-i386-disc2.iso
af38ac4316ba20df2dec5f990913396d shrike-i386-disc3.iso

* 自作の Perl モジュールのインストール先

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

自分で作った perl モジュールは、どこにインストールするのが適切なのか。
まず、$ perl -e 'foreach $path (@INC) { print "$path\n"; }' で @INC を確認。
/usr/lib/perl5/5.00503/i386-linux
/usr/lib/perl5/5.00503
/usr/lib/perl5/site_perl/5.005/i386-linux
/usr/lib/perl5/site_perl/5.005
site_perl が標準以外のパッケージがインストールされるディレクトリ。
今回は、aoencode.pm を /usr/lib/perl5/site_perl/5.005 にインストールすることにした。

- 他にも、use lib プラグマを使って、use する側でライブラリパスを追加する方法もある

use lib '/home/hiroaki/script';
use aoencode;

すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。