Landscape トップページ | < 前の月 2003-09 2003-10 次の月 2003-11 >

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

月ごとの記事一覧
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-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日

2003-10-31 (Fri)

* XANO明朝フォント

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

XANO mincho : JIS X 0213 free TrueType font
http://www.asahi-net.or.jp/%7esd5a-ucd/freefonts/XANO-mincho ...
ついに日立と契約してフォントを開発・配布する神が降臨。
内田明氏って、あの fj などの NetNews で有名な内田氏か。

2003-10-30 (Thu)

* XBRL で使われる用語についてメモ

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

結局は XML の用語だけど。

- XML Schema

文書構造定義。DTD はスキーマの一種。
XML Schema では、データ型や名前空間など DTD よりも高度な機能が定義されている。
スキーマって懐かしい響きだな。社会学の「準拠枠」を思い出すよ。

- XLink

リンク。オブジェクト間を連結するもの。かなり多機能で抽象的な概念。
HTML の <a href="http://www.google.co.jp/">Google</a> は単純一方向リンク。
XLink ではさらに 多方向へのリンクや双方向のリンクも定義できる。
また、外部のファイルでリンク情報を定義し、文書と分離することもできる。

2003-10-29 (Wed)

* date コマンドって超便利

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

date --date で書式を指定すれば、自由自在に日付計算ができる。一か月前とか18年前とか5日後とかの日付や曜日を簡単に求められる。また、+%Y などの出力書式文字列と同時に使うこともできるので、日付と時刻を好きな形式で整形して文字列として出力できる。

JM 読んでたらしっかり書いてあった。
date date.1 in GNU_sh-utils
http://www.linux.or.jp/JM/html/GNU_sh-utils/man1/date.1.html

perl の Date::Calc モジュールも調べてみたんだけど、
一行プログラムを書くときは date コマンドの方が使いやすそう。

- YYYY-mm-dd や YYYYmmdd 文字列を得る

%F で YYYY-mm-dd 文字列を得ることができる。数字が一桁の場合はゼロ詰めされる。%Y-%m-%d と書いても同じ。
%F  same as %Y-%m-%d

$ date +%F
2004-06-24

ハイフン - を入れない YYYYmmdd 文字列がほしいなら、%Y%m%d と書けばよい。
$ date +%Y%m%d
20040624

- HH:MM:SS 文字列を得る

時分秒がほしいなら、%T を使う。数字が一桁の場合はゼロ詰めされる。コロンを入れたくないなら、%H%M%S と書けばよい。
$ date +%T
10:50:02

$ date +%H%M%S
105007

- apache のログを grep するために、一か月前の月名と西暦を得る

$ date --date '1 month ago' +%b/%Y:
Sep/2003:
ちなみに apache のログはこんな感じ。
10.3.31.91 - - [29/Oct/2003:09:40:53 +0900] "POST /cgi-bin/hiroaki/bad.cgi/read HTTP/1.1" 500 615

- 10日後

$ date --date '10day' +%Y%m%d
20031108

- 「・・・15年ぶりだね」

$ date --date '15 year ago'
Wed Sep 13 15:48:42 JST 2000

注意。上記の例は結果を2000年9月13日にしたいがために、事前に以下のコマンドを実行してシステムクロックを変更してあります。
# date --set 2015-09-13

- ago の位置で結果が変わる

ago より前の指定を現在から引き算しているようだ。複雑なのであんまり深追いしたくないな。
$ date --date '4year ago 2month 5day 2hour 8minute 58second'
Mon Jan  3 18:03:24 JST 2000

$ date --date '4year 2month ago 5day 2hour 8minute 58second'
Fri Sep  3 18:03:31 JST 1999

2003-10-28 (Tue)

* logrotate は二度死ぬ

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

昨日 2003-10-27 に仕込んだ logrotate が動いているかをチェックしたところ、見事に失敗していた。

Google で logrotate ローテート されない を検索したところ、原因がわかった。
要するに、もう一日経たないとローテートされないということだ。
次からは、config ファイルが正しいことと /var/lib/logrotate.status にエントリが
追加されたことを確認しておく必要があるな。

logrotateの設定
http://kamoland.com/comp/logrotate.html
/var/lib/logrotate.status に,ローテイト対象ファイルごとに,前回実行日時が記録されている.

例)
"/var/log/messages" 2003-4-20

このファイルに該当行が存在しない場合,まず初回logrotate実行時に該当行がその当日日付で作成され
(このときローテイトは実行されない!), 2回目から実際のローテイト処理が行われる.

- テストしたら昨日の疑問も氷解

圧縮方法とレベルは gzip -9 でいいようだ。
テストで /usr/sbin/logrotate /etc/logrotate.d/sqlserver_backup -v したら、以下の出力があった。
compressing new log with: gzip -9 /home/hiroaki/backup/kessandb_current_sql_server_backup.1

2003-10-27 (Mon)

* DB サーバのバックアップファイルのローテーションと圧縮

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

毎日 MS SQL Server からデータをダンプしたものを ftp でバックアップサーバに転送してはいるが、ファイル名が同じなので毎回上書きされてしまう。ちょっと怖いので、一週間でローテーションすることにした。
compress オプションも追加。一日で 80MB 弱のサイズだから、ちょっとでも小さくしたい。
そもそも MS SQL Server は圧縮してくれてないようだし。

試しに gzip -9 kessandb_current_sql_server_backup してみたら、80MB が 12MB まで縮んだ。
実際は gzip じゃなくて compress をだったり、圧縮レベルも違うかもしれないけど。

ということで、以下を /etc/logrotate.d/sqlserver_backup として作成。
/home/hiroaki/backup/example_db_current_sql_server_backup {
    daily
    rotate 8
    compress
    nocreate
}

2003-10-26 (Sun)

* chalow の進化すべき方向

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

先週 chalow 0.13 から chalow 0.20 にバージョンアップした。
RSS 対応、ftp URL 対応、tdiary テーマ対応と、いろいろ変わってた。

なんで私は chalow を使ってるんだろう。
他にもいろいろ blog ツールやメモツールはあるのに、なぜ chalow を使うのか。
それを考えると、私は chalow をどのようにカスタマイズしていけばいいかがわかるだろう。
ChangeLog メモの良さ
・テキストファイル一つで済む
・覚えることが少ない
なんと言ってもこの2つだろう。

HTML エスケープはツール側で勝手にやって欲しい。
元はメモなんだから、それをマークアップするのはツールでやって欲しい。
リンクは自動的に張って欲しい。

ちょっと chalow を使ってるサイトを見てこよう。

・・・なんか書いてることが既出な気がしてきたのでここで打ち切る。内容も文が繋がってないが、このままにしておく。

2003-10-25 (Sat)

* chalow 0.20 に乗り換え

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

一通りカスタマイズと CSS の適用も終わったので、0.20 にバージョンアップしてみた。
誰も使わないであろう RSS アイコンがまぶしいぜ。

2003-10-24 (Fri)

* 最新 n 件の subject を段組で表示

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

tDiary やニュースサイトでおなじみの最新記事の見出し表示。
chalow でもくっつき RSS という形で実装されてるけど、chalow だけで完結させたい。

ソースをいじって見出しを出力させることはできるけど、
chalow がバージョンアップしたらそれに追従して修正をするのは大変だし、
そもそもそこまでやるなら tDiary や MovableType を使った方がいいのかもしれない。

どうしようかなー。

2003-10-23 (Thu)

* CSSを用いた段組の作成のコツ

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

http://www.fromdfj.net/html/column.html
float を使った方法と、position を使った方法を解説。

2003-10-21 (Tue)

* プライベートアイテムだけのエントリで parse error

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

プライベートアイテムしかないエントリが存在する ChangeLogメモを chalow0.20 に処理させると、
reading "/home/hiroaki/testlog.txt"
parse error at /home/hiroaki/chalow-0.20/chalow.org line 375.
というエラーになります。

プライベートアイテムしかないエントリの例
2003-10-21 Saito Hiroaki <mail@example.com>
    * p: 仕事: 大事なサーバのパスワード
    foobarbuzz

2003-10-20 Saito Hiroaki <mail@example.com>
    * メモ: 2ちゃんねるターボ用 proxy 設定ファイル
    http://www.geocities.co.jp/SiliconValley/8222/2chturbo.html

また、プライベートアイテムしかないエントリの場合、
chalow はエントリーヘッダのみを出力してしまいます。

「プライベートアイテムを削除した結果エントリーヘッダしか残っていない」という場合、
375行目で (.+)\Z の部分がマッチしないのでエラーとなっているようです。
die "parse error" unless ($e =~ /\A(\d{4}-\d\d-\d\d.+?\n)(.+)\Z/sm);

以下のように + を * に修正することでとりあえず parse error は回避できますが、
エントリーヘッダのみ html 出力してしまうという現象までは回避できません。
die "parse error" unless ($e =~ /\A(\d{4}-\d\d-\d\d.+?\n)(.*)\Z/sm);

もっと根本的なところで直す必要があると思い、プライベートアイテム削除ロジックを
changelog 全体をクリーニングしている部分に移動させました。
以下がそのパッチです。
もっとよい方法があれば教えてください。
--- chalow.org    Tue Oct 21 20:10:23 2003
+++ chalow    Wed Oct 22 17:39:02 2003
@@ -259,10 +259,6 @@
       s/^($day)\s.+/$1  $user/;
    }

-    # 秘密の項目を外に出さないように削除
-    # 例: * p:秘密メモ: YTがまたやらかした。しょうもないやつだ。
-        s/\n\t+\* p:.+?^(\t+\*|$)/$1/gms;
-
    # エントリをパーズして、文字列置き換え
    parse_entry($_, \%{$all_entries{$day}});
    }
@@ -983,6 +979,11 @@
    $$strp =~ s/\n[\s\t]+(\n\S)/\n$1/gm;
    # \n(\s+)\n\t* ほげ: ... の $1 を消す
    $$strp =~ s/\n[\s\t]+(\n[\s\t]+\*\s+)/\n$1/gm;
+    # 秘密の項目を外に出さないように削除
+    # 例: * p:秘密メモ: YTがまたやらかした。しょうもないやつだ。
+    $$strp =~ s/\n\t+\* p:.+?^(\t+\*|$)/$1/gms;
+    # 秘密の項目を削除した結果、空になったエントリを削除
+    $$strp =~ s/^\d{4}-\d{2}-\d{2}.*?\n(?=(\d{4}-\d{2}-\d{2}.*?\n)|\Z)//gm;
    # 項目内での段落区切り表す空行をタブ行にする
    $$strp =~ s/\n(\n\t[^\*])/\n\t$1/gm;
}

2003-10-20 (Mon)

* バッテリー液を補充

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

- バッテリー液を補充してみた

エンジン始動時に回転が安定しないのは、バッテリー液が減ってるからかもしれない。
トステムビバの駐車場でボンネットを開けて見てみたが、どうもよくわからん。
マニュアルとにらめっこしてると、親切なおじさんが来てくれた。
「バッテリーかい? 上がっちゃってるなら直結してやるよ。」
上がってるんじゃなくて点検してることと、異常の見極め方がわからないことを伝えると、
いろいろ教えてくれた。

「外から見てこの線から下に液面が下がってないことを見るんだ。
外から見てもわからないときは、直接中を見る。
10円玉かなんかでこの部分を回して蓋を取るんだよ。
蓋を取ってもわからないときは、ほら、こうやって車体を揺すって液面を見るんだ。」

それでもよくわからなかったけど、親切にいろいろどうもありがとう、
とお礼を言っておじさんと別れた。

とりあえずバッテリー液を買ってきて補充してみよう、
確かバッテリー液って硫酸で、純水を補充するんだよな。
ということで、店内へ。バッテリー液は・・・と。あった。
ん? 安いな。1リットルで 148円。2リットルでも168円か。
500円位するのもあったけど、それには強化液が入ってるらしい。
別にF1に出る訳じゃないし、まあそんなもんいらないでしょ、
ということで1リットルのボトルを1本購入した。

一番左の蓋を開けて補充。・・・うーん、ちょっと入れすぎちゃったか?
これってやばいんじゃなかったかな。ていうかやっぱり液面がよくわからないな。
あと 950ml くらい余ってる気がするけど、これでいいか。

ボンネットを閉めて、エンジンをかける。なんか始動がスムーズな気もするな。
・・・でも、こんな速く効果が出るわけ無いよな。充電した訳でもないんだし。

- え? 6つ全部に補充するの?

帰ってきて、Google でバッテリー液 補充で検索したところ、衝撃の事実が。
「バッテリー液の補充は各蓋ごとにするものだ。」
左端だけじゃダメなんだ。補充液は残ってるから、暇をみつけてもう一度やろう。
今度はバッテリーを静電気防止のために濡れ布巾で拭いて、外から液面を確認するとしよう。
それでもダメなら取り外して確認かな。

その他にも、バッテリーの寿命は2年から5年とか、いろいろ勉強になった。

D・I・Yの百科事典/バッテリーの点検と交換
http://www.royal-hc.co.jp/diy/life/battery/

2003-10-15 (Wed)

* 2ちゃんねるターボ用 proxy.js をアップロード

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

2003-10-14 (Tue)

* Linux マシン pro の /dev/hda のバックアップと換装

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

pro の /dev/hda の調子が悪い。
3.5 GB よりも後ろの部分あたりに書き込もうとすると、IDE デバイスだかなんだかがそのまま無反応になってしまい、コンソールに延々とエラーメッセージが表示されるという状態になる。このまま使い続けるのは怖いので、ハードディスクを交換することにした。交換するドライブは /home が入っている。以下では、データの移行について調べたこと、試したことを記録する。

- やりたいこと

/home パーティションなので、新しいディスクにデータを全部引き継ぎたい。さてどうするか。

- 環境

OS: TurboLinux 6.5 Server

- /dev/hda について

$dmesg |grep hda
hda: Maxtor 84320D5, ATA DISK drive
hda: Maxtor 84320D5, 4119MB w/256kB Cache, CHS=525/255/63

$ df -h
/dev/hda1            4.0G  2.5G  1.3G  65% /home

ちょうど一台使われていないマシンがあるので、そのマシンに 84320D5 と 新しいドライブを接続し、knoppix を使ってコピーするとしよう。コピーは単純に cp -r でいいかな。この方法でファイルオーナーやパーミッションが引き継がれれればいいんだけど。

・・・と思ったけど、tar でやるのが楽なようだ。
[linux-users:58294] Re: HDD まるごと複製
http://search.luky.org/linux-users.5/msg07977.html

tar -c -l -S -f - / | (cd /newroot && tar -x -v -f -)
-c, --create 新しいアーカイブを作成する
-l, --one-file-system ローカルなファイル・システムに限定してアーカイブを作成する
-S, --sparse 疎らなファイルを効率的に処理する
-f, --file [HOSTNAME:]F Fというアーカイブ・ファイルまたはデバイスを使う(デフォルトは/dev/rmt0)

-f - がよくわからない。付けても付けなくても変わらなかった。もしかして、標準出力を意味するのだろうか?

() で括ってそこに 標準出力をパイプできるなんて初めて知った。もっとも、tar には -C, --directory DIR DIRにcdしてから動作を行なう があるから、-C を使ってもいいかも。

パーミッションとオーナーも同じにしたいが、
以下の報告があったため tar のマニュアルを確認してみた。
[linux-users:58424] Re: HDDまるごと複製
http://search.luky.org/linux-users.5/msg08107.html
> >  tar -c -l -S -f - / | (cd /newroot && tar -x -v -f -)
>
> これでやったわけですが、私は結局遠隔にあるコピー元?にログインして
> 一旦 tarball をつくって、それをダウンロードして手元で複製、という
> 工程になったので、標準入出力を使う上記方法にはならなかったのですが、
> 少なくとも一旦 tarball を作ってからの場合だと、復元の再に -p オプションも
> ないとだめのようです。パーミッションが狂ってしまって慌てました。

以前この ML で tar では symlink の owner.group が復元されないという
話がありましたが、大丈夫ですか?
正しく復元できたのでしたら、使用された tar の option, version を教えて
ください。

# cpio なら symlink の owner もちゃんと復元されるのですが、hard link
  の保存方法がわからなくて挫折。
  今は tar で full backup 取って、戻す時は tar xpf ... のあと / で
  ls -lR しておいたログを元に chown してまわっています。
  symlink の owner なんてどうでも良いと以前は思ってましたけど、apache
  で SymLinksIfOwnerMatch 使うようになってからは...

上記報告を踏まえ、
ファイルオーナーとパーミッションを同じにするため以下のオプションを付けてみることにした。
--same-owner アーカイブ内のファイルのものと同じ所有属性でファイルを抽出する
-p, --same-permissions, --preserve-permissions 許可情報を全て抽出する

- 最終的に実行するコマンド

tar -c -p -l -S -f - / | (cd /newroot && tar -x -v -p --same-owner -f -)

- Hard Disk Upgrade Mini How-To 7. 元の HD から新しい HD へのファイルのコピー

http://www.linux.or.jp/JF/JFdocs/Hard-Disk-Upgrade/copy.html
に気になる記述がある。シンボリックリンクのオーナーの件だろうか・・・?
この Mini How-To の以前のバージョンではハードディスクをコピーするのに
tar コマンドも使えると書きましたがこの方法にはバグがあります。

- いざ環境作り

結局 knoppix はブートしなかった。
Uncompressing Linux... Ok, booting the kernel.
で止まってしまう。
http://www.dnsbalance.ring.gr.jp/archives/linux/knoppix/iso/ の knoppix_20030924-20031002.iso でもダメ。

仕方がないので、手元にあった debian woody 3.0 の CD でブートさせた。シェルを起動し、woody のインストーラでパーティションを切る。ディスク丸ごと1パーティションにした。次に、
# mke2fs -m 0 -cc -T news
でフォーマット。ロッカーに転がってたディスクなので、不良セクタがあるおそれがある。不良ブロックを検査 をするために、-cc で read-write test を実行するように指定した。

また、-m 0 オプションを付けて root 用の予約領域をゼロにした。これは、以下の情報を元にやってみたことだ。

Debian GNU/Linux スレッド Ver. 19
http://pc.2ch.net/test/read.cgi/linux/1065374560/193
http://pc.2ch.net/test/read.cgi/linux/1065374560/197
http://pc.2ch.net/test/read.cgi/linux/1065374560/200
193 :login:Penguin [sage] :03/10/15 21:52 ID:bLLfhwtE
ext3 な /home の空きが少なくなってきたので悪足掻きに

tune2fs -m 0 /dev/hoge

で reserved-blocks を無くした。sid で一般ユーザでやると

% /sbin/tune2fs -m 0 /dev/hda8
tune2fs 1.35-WIP (21-Aug-2003)
/sbin/tune2fs: 許可がありません while trying to open /dev/hda8
Couldn't find valid filesystem superblock.

とエラーが出るんだけど、woody だと一般ユーザでも出来ちった…

% /sbin/tune2fs -m 0 /dev/hda11
tune2fs 1.27 (8-Mar-2002)
Setting reserved blocks percentage to 0 (0 blocks)

そ、そーゆーもんなん?(;´Д`)

197 : [sage] :03/10/15 22:33 ID:i5NBqHn0
>>193
予約領域ってゼロにしても大丈夫なのかな。

200 :login:Penguin [sage] :03/10/16 00:50 ID:kXslWQqp
>>197
rootは/home一杯になっても別に困らんから。

- mke2fs -cc って長いよ・・・

4GB のマシンで、仮想コンソールが2つあったので2台のドライブを同時並行でフォーマットしてみた。

- 実際の作業

コンソールでの作業だったため、文中のエラーメッセージは正確ではないので注意。もしかしたら入力したコマンドも実際のものと違っているかもしれない。

まず2台のディスクを移設用マシンに接続し、woody の CD-ROM でブートさせる。ALT + F2 でコンソールに切り替え、各ドライブをマウントする。/bin/cp -a でファイルを全部コピーする。今回は /home しかコピーしないので、これが一番簡単。
# /bin/cp -af /mnt/old/* /mnt/new

コピーが完了したら、新しいドライブを本番マシンに接続。本来ならばこれで作業が終わるはずだったが、ブートローダが起動しないという状況に見舞われた。完全に忘れていたが、今回の対象ドライブは /dev/hda である。ブートローダをインストールしなければならない。

woody の CD には lilo が入っているが、lilo を実行しようとすると、/target にルートファイルシステムをマウントしないと使えないよ、といったエラーメッセージが出てしまう。いくつか試行錯誤をしてみたがうまくいかない。ライブラリのバージョンが違う、といったエラーメッセージまで出てしまう。元のシステムは TurboLinux 6.5 Server であるため、整合性がとれないのだろうか? /sbin ってスタティックリンクしてるからライブラリは関係ないんじゃないか? と思っていろいろ試そうとしたが、諦めて TurboLinux 6.5 Server の CD-ROM でブートすることにした。ところが、今度はなんと lilo がない。/sbin にも /usr/sbin にもない。

CD に無くても、/dev/hdb に入ってるルートファイルシステムにあるじゃんと途中で気づき、/dev/hdb2 をマウントしようとするが、なんだかうまくマウントできない。これも当たり前で、/dev/hdb2 は swap パーティションだったのだ。 気づけば単純なことだが、無機質で乾燥したマシン室では注意力が落ちるということを、身をもって知らされた。ちなみに、/dev/hdb1 は /boot だ。

ルートファイルシステムをマウントし、lilo を実行。
/mnt/tmp/sbin/lilo -C /etc/lilo.conf
しかし、これでもうまくいかない。/boot/boot.b が無いとかいうエラーメッセージが出る。無ければコピーしてしまえ、ということで、
cp /mnt/tmp/boot/* /boot
を実行したが、今度は 0x100 なんてデバイスは知らないよ、といったメッセージが出る。

ここで一度 lilo について調べた方が良い気がしたので、JM で lilo の man を見る。すると、
-r root-directory 操作を行う前に、 chroot でルートディレクトリを変更する。
というオプションがあることに気づいた。これを指定してやればいいんじゃないか、と思い実行するとうまくいった。最終的に実行したのは、以下のコマンドだ。
/mnt/tmp/sbin/lilo -r /mnt/tmp -C /etc/lilo.conf

無事ブートローダのインストールが終わり、ドライブ換装作業は完了。pro は今快調に動作している。後で耐久テストでもやってみることにしよう。

2003-10-11 (Sat)

* Perl でハッシュの配列、配列のハッシュ

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

おさらい。

- ハッシュの配列

ハッシュコンストラクタ {} を使って無名ハッシュを作成し、
作成したハッシュへのリファレンスを配列に入れてあげると、ハッシュの配列を作れる。
my @list_of_hash = ();
foreach my $i (1..5) {
  my $hash = {
    name => 'hiroaki' . $i,
    count => $i
  };
  push(@list_of_hash, $hash);
}

アクセスは以下のようにする。
foreach my $hash (@list_of_hash) {
  printf("%s: %d\n", $hash->{name}, $hash->{count});
}

- 配列のハッシュ

# リストを返す関数を呼び出す
for $group ( "simpsons", "jetsons", "flintstones" ) {
  $HoL{$group} = [ get_family($group) ];
}

アクセス
$HoL{flintstones}[0] = "Fred";

- 参考

perldsc - Perl のデータ構造クックブック
http://www.kt.rim.or.jp/~kbk/perl5.005/perldsc.html
サンプル付き。おすすめ。

Perl小技集3 ハッシュの配列 配列のハッシュ
http://www.webkoza.com/doc1/perl_m.htm

あとは、Google で perl ハッシュの配列 配列のハッシュ を検索すれば十分だろう。

2003-10-10 (Fri)

* Postgres の MVCC とトランザクション

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

Postgres は MVCC というシステムを採用している。
MVCC は多版方式 (多版型同時実行制御 (Multiversion Concurrency Control) MVCC) の頭文字。
MVCC の特徴は、トランザクションはスナップショットを参照する、という点だ。

Chapter 9. 同時実行制御 PostgreSQL 7.3.4 ユーザガイド
http://www.postgresql.jp/document/pg734doc/user/mvcc.html

9.4. アプリケーションレベルでのデータの一貫性チェック PostgreSQL 7.3.4 ユーザガイド
http://www.postgresql.jp/document/pg734doc/user/applevel-con ...

- 実験

-- まず2つのトランザクションを SERIALIZABLE で開始する。
T1: BEGIN TRANSACTION;
T1: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
T2: BEGIN TRANSACTION;
T2: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- まず T1 が一行 INSERT し、行数を取得する。
T1: INSERT INTO test (time_str) VALUES (CURRENT_TIMESTAMP);
T1: SELECT count(*) FROM test;

-- 次に、T2 が全行を削除してしまう。
-- SELIALIZABLE なので、MVCC を採用していないシステムでは、
-- ここで T2 が待たされるが、Postgres では待ちが発生しない。
T2: DELETE FROM test;
-- T2 の count の結果は当然 0 になる。
T2: SELECT count(*) FROM test;

-- T1、T2ともに問題なく COMMIT できてしまう。
T1: COMMIT;
T2: COMMIT;

さて、トランザクションが終わったあとに count はいくつになるだろうか?
T2 が DELETE で全行を削除したので、答えは0と思うかもしれないが、正解は1だ。
T2 が DELETE によって削除したのは、テーブルの全行であるが、
そのテーブルの内容は T2 のトランザクションが開始した時点のものである。
そのため、トランザクション開始後に T1 によって INSERT された行は削除されない。
結果、1行だけ残る。
MVCC を採用していないデータベースでは、SERIALIZABLE であれば 0 行となるだろう。

「これでは SERIALIZABLE の意味がない」と思うかもしれないが、
SERIALIZABLE の仕様としてはこれで正しいようだ。
もちろん、同じ行を同時に更新や削除しようとした場合には、
SERIALIZABLE を維持できなくなるため、
ERROR:  Can't serialize access due to concurrent update
のエラーとなる。ちなみに、最近のバージョンの Postgres、少なくとも Postgres 8.0 では "could not serialize access due to concurrent update" にメッセージが変更されたようだ。

MVCC の優れた同時実行性を使いたくない場合は、明示的にテーブルをロックする必要がある。
MS のセミナーの講師が言っていたが、次期 SQL Server の Yukon では、MVCC を採用する予定だそうだ。

* デジタル証券によるコンテンツ流通システム

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

デジタル証券によるコンテンツ流通システム
www.geocities.co.jp/SiliconValley/2949/Digikabu.html

Winnyの将来展望について(2003/10/10)
www.geocities.co.jp/SiliconValley/2949/ny.html
で触れられていたデジタル証券によるコンテンツ流通システムについて。

- 要旨

コンテンツの流通は完全にコピーフリーであり流通経路は何でも良い。WEBでの公開やP2Pなどで。
(* 略)
もしユーザーがあるコンテンツの製作者に対して支援・投資したり、コンテンツに対して何らかの影響力を及ぼしたければデジタル証券を購入するという形で自らの資金をそのコンテンツに投入する。
タダで見たければ見られるということになる。

投資に対する動機付けが弱い気がする。結局、支援や援助しか資金が投入されないだろう。
株に値が付くのは、その会社の技術、資産、将来性を評価する人がいるからだ。
このシステムだと、「コンテンツに対して何らかの影響力を及ぼす」がどんなものになるかによって
値段が激変するだろう。
魅力的な付加価値が無いと、デジタル証券にはほとんど値段が付かないだろう。

個人でインディーズ CD を出してる人が P2P で作品を配布し、このシステムを使ったとする。
支援という意味でのデジタル証券を購入してくれる人はいるかもしれないが、
純粋な投資目的での資金投入は期待できないのではないか。
なぜなら、その作品は無償のコンテンツ配布だけじゃ利益が出ない。
それでは証券としての価値が出ない。
結局、作品とは別の販売促進としてしか使えないように思われる。

ただし、支援として投入される資金が十分に大きければ話は別だ。
また、デジタル証券を購入することが付加価値をもたらすのであれば、付加価値目当てに売れる。
渡辺浩二がよく書いているような世界が到来すれば、機能するとは思う。

2003-10-09 (Thu)

* SQL Server で電話番号を - で連結するストアド

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

以下のカラムを持つテーブルがある。
tel_shigai VARCHAR(6), -- 電話番号 市外局番
tel_shinai VARCHAR(6), -- 電話番号 市内局番
tel_bango VARCHAR(4), -- 電話番号
これを 出力するときは - で連結せよ、という仕様があった。

今までは単純に
tel_shigai + '-' + tel_shinai + '-' + tel_bango AS tel_no
としていたが、これだとどれかが NULL か 空文字でもハイフンがくっついてしまう。
全部空の場合は -- という出力になってしまう。

ということでユーザ定義関数を作成した。
郵便番号を連結する場合は、第三引数を null として渡す必要がある。
引数を可変長の配列で受け取ったりできればループを使って簡潔に書けそうだが、
どうも SQL Server2000 ではできないようなので if 文を連ねてみた。
-- 郵便番号、電話番号、FAX 番号を - で連結する
GO
DROP FUNCTION cat_number;
GO
CREATE FUNCTION cat_number(@arg1 VARCHAR(8), @arg2 VARCHAR(8), @arg3 VARCHAR(8))
RETURNS VARCHAR(64)
AS BEGIN

  DECLARE
    @str VARCHAR(64)
  IF (@arg1 IS NOT NULL) AND (@arg1 <> '') AND (@arg2 IS NOT NULL) AND (@arg2 <> '') BEGIN
    SET @str = @arg1 + '-' + @arg2
  END ELSE BEGIN
    SET @str = COALESCE(@arg1, '') +  COALESCE(@arg2, '')
  END

  IF (@str IS NOT NULL) AND (@str <> '') AND (@arg3 IS NOT NULL) AND (@arg3 <> '') BEGIN
    SET @str = @str + '-' + @arg3
  END ELSE BEGIN
    SET @str =  COALESCE(@str, '')  +  COALESCE(@arg3, '')
  END

  RETURN @str
END

* SQL Server で NULL と 文字列を連結する

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

CONCAT_NULL_YIELDS_NULL をオフにしておかないと、
NULL と文字列連結した結果は必ず NULL になってしまう。

SET CONCAT_NULL_YIELDS_NULL
http://www.microsoft.com/japan/msdn/library/ja/tsqlref/ts_se ...

* おとなの小論文教室。

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

http://www.1101.com/essay/

以前読んだ
Lesson126 考える方法をならったことがありますか?(2)
http://www.1101.com/essay/2002-12-11.html
は非常に参考になった。
自分の頭で考えるとはどういうことなのかを噛み砕いて書いてある。

2003-10-08 (Wed)

* w3m はすごい

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

pro に w3m をインストール。

w3m のページ
http://www2u.biglobe.ne.jp/~hsaka/w3m/index-ja.html から tar ball をダウンロード。
./configure でいろいろ質問に答えた後、make して make install。

すごい。table レイアウトがきちんとレンダリングされる。動作も軽い。
インライン画像を表示するをオフにしてしまったのは失敗だったかもしれない。
sonic には画像表示をオンにしてインストールしてみよう。
・・・と思ったけど、画像表示は X だけのようだ。当たり前か。

2003-10-07 (Tue)

* Windows2000/WindowsXP で telnet 時に使う文字コードを設定する

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

windows や NT4.0 とは異なる telnet クライアントなので、コマンドで設定する必要がある。

Telnetクライアントの使い方
http://www.atmarkit.co.jp/fwin2k/win2ktips/231telnetcmd/teln ...

set codeset japanese euc
で euc になる。

2003-10-02 (Thu)

* samba を inetd 経由で起動

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

- samba の使用するメモリが気になったので、inetd 経由による起動を検討してみた。

Google で samba inetd 起動を検索すると、いろいろヒット。
でも、inetd 経由で起動するデメリットも見つかった。
パフォーマンスが悪くなるかも、という意見の他にも、以下のような記述があった。

[samba-jp:08169] Re: UNIX Magazine 2001 年1 月号のSamba 記事
http://www.tac.tsukuba.ac.jp/~yamato/samba/8000/msg00169.htm ...
3) swat から制御する場合には inetd を使わない

これは知らなかった。でも、ちょっと考えればすぐに気づくなあ。

一方で、もっとボトルネックになる要素があるのでパフォーマンスはあまり悪くはならない、inetd 経由を推奨するという意見もあった。
[samba-jp:08187] Re: UNIX Magazine 2001年1 月号の Samba記事
http://www.tac.tsukuba.ac.jp/~yamato/samba/8000/msg00187.htm ...

わざわざ複雑にする必要もないと思うので、sonic と pro では現状のデーモンのままとしよう。

すべての記事の見出し (全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 はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。