木っ端拾いの材木流し

Cannot see the wood for the trees.

Outlook Express 6のメールを共有する

CドライブとDドライブに入れたWindows 2000Outlook Expressでメールを共有しようということで。
Outlook Express のメールを Windows 2000 と 9x で共有したいのですが - win:Outlook Express 使用法ヒント
http://homepage2.nifty.com/winfaq/c/oetips.html#972
上記はOutlook Express(OE) 5.01の場合。自分とこのはOE 6.00ですが、上記の手順に従うと既存のメールフォルダがこれから運用する方のOEで作られたメールフォルダで上書きされて既存のメールフォルダが空っぽになります。
OE 6.00の場合は以下のようにメールをバックアップして戻す必要があります。

  1. 現在 OE を運用している方の OS を起動します。
  2. OE を起動します。
  3. [ツール]−[オプション] をクリックします。
  4. [メンテナンス] タブをクリックし、「保存フォルダ」ボタンをクリックします。
  5. メールメッセージが保管されているフォルダをメモします。
  6. ESC キーを 2 回押した後で OE を終了します。
  7. 5.でメモしたフォルダの全ファイルをバックアップします。
  8. PC を再起動し、これから OE を運用する方の OS を起動します。
  9. OE を起動します。
  10. [ツール]−[オプション] をクリックします。
  11. [メンテナンス] タブをクリックし、「保存フォルダ」ボタンをクリックします。
  12. 「変更」ボタンをクリックし、5. でメモしたフォルダを設定して「OK」をクリックします。
  13. 「OK」をクリックします。(「新しいストアの場所は Outlook Express の再起動後に有効になります。」とかいうメッセージが出るか、何もメッセージが出ません。)
  14. 「OK」をクリック後、OE を終了します。
  15. これから運用する方のOEを起動します。(このとき5.でメモしたフォルダのメールが消えます。)
  16. 何もせずにOE を終了します。
  17. 5.でメモしたフォルダを開き、7.でバックアップしたファイルを戻します。同名のファイルはすべて上書きします。
  18. これから運用する方のOEをもう一度起動して、メールが読めることを確認します。

Outlook Expressで新規メールを読むことはほとんどありませんが、昔のメールファイルを読む場合に。
まあ、保存フォルダを変えなくてもdbxファイルをこれから運用するOEにコピーすれば良いという話もありますが。

PC Solarisご臨終

やってもうた。ディスクの修復をミスってデータからOSまで綺麗に消えた OTZ

PC Solarisマシンでディスクの読み取りエラーが発生。

formatコマンドのpartition printで表示されるブロック数とsyslogのError Blockの番号から照合するとswapに割り当てているパーティションだった。別にデータは入っていないのでformatコマンドのディスクの修復で修復してみることにした。

前準備。/ にスワップ用のファイルを作ってスワップに追加。

# mkfile 1G /swapfile01
# swap -a /swapfile01
# swap -l
(結果が表示される)

swap -dコマンドでスワップパーティションを削除しようとしたが、現在のスワップがダンプの出力先に指定されているから削除できないと言われたので/etc/vfstabからはずして再起動。

# vi /etc/vfstab
(現在のスワップを追加しているエントリをコメントアウト)
(/swapfile01をスワップとしてマウントするエントリを追加する。/をマウントするエントリよりうしろに書く)
# shutdown -i6 -g0 -y

再起動後formatコマンドで修復に入る。いきなりanalyzeメニューのサブコマンドを実行するとディスク全体(全パーティション)が対象かつ不良ブロックを修復しようとするので、setupで設定を変えておく。

# format
(省略)
> analyze
(省略)
> setup
(analyze entire diskはn)
(blockを指定する。swapパーティションの最初から最後まで)
(ループ回数は1で十分)
(自動repairはnoにする)
(ランダムテストはいらない)
(書き込みパターンなんたらもいらない)
(defect list restoreこれがわからん。no)
(veriry disk labelこれもわからん。no)
> config
(結果を確認)

設定変更後、readを実行。

> read
error blkno 46502
:

エラーになったブロックが出てくる。

ブロックの修復方法は2つ。repairサブコマンドで1ブロックずつ指定して修復する方法と、setupでRepair defective blocks: yesにしてからanalyzeメニューのサブコマンドを実行し自動修復する方法。

前回はreadで出てきた数十個の不良ブロックを1個ずつrepairコマンドで修復した。というのも、Repair defective blocks? yesにしてreadを実行してもエラーが修復されなかったため。*1

で、今回はread以外のサブコマンドを使ってみた。自分が選んだのはverify。よりによって。

verifyも他のサブコマンドと同様ブロック範囲を指定すればそこだけを上書きすると思っていたが、マニュアルをよく読むと、

purge ディスク上のデータをすべて削除し、いかなる手段でも取り出せないようにします。ディスク全体 (またはディスクのセクション) に 3 種類のパターンを書き込むことにより、データを削除します。検査に合格すると16 進のビットパターンがディスク全体 (またはディスクのセクション) に上書きされます。
デフォルトで欠陥ブロックを修復します。
verify 最初の検査に合格すると、ディスク全体の各ブロックに固有のデータを書き込みます。次の検査に合格すると、データを読み取り、検証します。ディスク上の既存のデータは破壊されます。デフォルトで欠陥ブロックを修復します。
Solaris 10 System Administrator Collection - Japanese - Solaris のシステム管理 (デバイスとファイルシステム) - 15. format ユーティリティー (参照情報) - format のメニューとコマンドの説明 - analyze メニュー

ひとつ上のpurgeと比べるとverifyには「ディスク全体」のうしろに括弧書きがない。つまりsetupのStarting block number: やEnding block number: で選んだブロック番号の範囲とは関係なく、ディスクのすべてのデータを上書きする。えー。

このときはまだそれに気づかず、

analyze> verify
 Ready to verify (will corrupt data). This takes a long time,but is interruptable with CTRL-C.
 Continue? y

はい消えたー。(CV:愛川欽也)
verify終了後にreadを実行するとエラーは出なくなった。formatコマンドを終了して再起動。この時点ではまだ操作できている。

再起動後、BIOS:OK→Primery Boot(ブルーバックのメニュー):OK→Secondary Boot(白バックのメニュー):黒い背景にloading boot.iniとだけ表示された状態で停止。本当にありがとうございました。

*1:Restore defect list? とRestore disk label? の設定がまずかったのかも知れない。前回はたしかno,noで実行した。この2つのオプション、何をどこからどこに復元するのか説明されていない。Restore defect list? で言うと、readなどで見つかった不良ブロックをディスク上のprimeryのdefect listに書き込むことを言っているのか、backup defect listをprimeryに上書きすることを言っているのか不明。

Cygwin上のAWKでの改行コードの扱われ方

特定の文字列を含むセクションだけを抜き出すの続き。

すっきりしてないのですが、改行を含めて Unix 系 OS と同じにするなら BINMODE で実行するのが望ましいのかもしれません。

特定の文字列を含むセクションだけを抜き出す (続き) - 日本 GNU AWK ユーザー会 0.2

情報ありがとうございます m(_ _)m CygwinだけでなくGAWKにもBINMODEというのがあったのですね。調べてみたらGAWKのドキュメントに記述がありました。

Under OS/2 and DOS, gawk (and many other text programs) silently translate end-of-line "\r\n" to "\n" on input and "\n" to "\r\n" on output.

http://www.kt.rim.or.jp/~kbk/gawk-3.1/gawk.html#SEC257

Cygwin上のGAWKを「Under OS/2 and DOS」と呼んでいいか微妙ですが、GAWKが"\r\n"を"\n"に変換しているようです。で、BINMODE=rとすると入力ファイルの改行コードをそのままGAWKで処理すると。勉強になりました。
(10/19追記)
AWKの偉い人らしいきむらさん*1が調査結果を公開されていました。ありがとうございます。
本当はちゃんと書きたかったのですが時間がないため簡単なご紹介のみでご容赦下さい。

手順としては

  • Cygwin上のCプログラムで入力の改行コードが自動変換されることを確認
  • AWKデバッグモードで動かして、最初の入力時点で改行コードが自動変換されることを確認
  • ソースを追いかけてlibcが原因と特定

という流れです。
問題解決力の高さは問題を切り分ける分解能の高さからくるんだなと感じます。

*1:よく見たら上のGNU Awk ユーザーズガイドの訳者さんじゃないか!

特定の文字列を含むセクションだけを抜き出す

見出し("*"で始まる行)+それに続く複数行の本文+日付区切り"====="で構成されたテキストから特定の文字列を含むセクションを抜き出す。

gawk 'BEGIN {q="検索したい文字列"; IGNORECASE=1; ORS="\r\n"} $0 ~ ("^*[^*]+" q) {o=1} (/^*[^*]/ && $0 !~ q) || /^=====/ {o=0} o {print}' 入力ファイル

cygwingawkで改行コードがCR+LFのファイルを処理する場合、ORS="\r\n"で出力レコードセパレータを指定する。(無指定だとLFになる)
cygwingawkは入力行区切りの扱いがちょっと変で、RSが無指定の場合は改行コードがCR+LFでもLFでも行区切りとして認識する。デフォルトのRSが"\r\n|\n"なのかと思ったが、RS="\r\n"とするとどちらの改行コードも認識せず、RS="\n"だとどちらも認識する。cygwinがbinmodeでもtextmodeでも現象は同じだった。gawkの内部で最初にCR+LFをLFに変換してから処理しているように見える。

追記

現象がつかめませんが、gawk の Texinfo ファイルを読む限り Cygwin だから特別とかいうこともなさそうです。

Cygwin の gawk - 日本 GNU AWK ユーザー会 0.2

たとえば、

1行目[CR][LF]
2行目[CR][LF]

という内容のinfileがあって

gawk 'BEGIN{RS=文字列1;ORS=文字列2}{print}' infile > outfile

でoutfileに出力すると、文字列1、文字列2の指定に応じて実際のoutfileの内容は以下のようになりました。

# RS ORS 実際のoutfileの内容
1 無指定 無指定 1行目[LF]
2行目[LF]
2 無指定 ORS="\n" 1行目[LF]
2行目[LF]
3 無指定 ORS="\r\n" 1行目[CR][LF]
2行目[CR][LF]
4 RS="\n" 無指定 1行目[LF]
2行目[LF]
5 RS="\n" ORS="\n" 1行目[LF]
2行目[LF]
6 RS="\n" ORS="\r\n" 1行目[CR][LF]
2行目[CR][LF]
7 RS="\r\n" 無指定 1行目[LF]
2行目[LF][LF]
8 RS="\r\n" ORS="\n" 1行目[LF]
2行目[LF][LF]
9 RS="\r\n" ORS="\r\n" 1行目[LF]
2行目[LF][CR][LF]

自分はgawkの動作を以下のように考えていました。

  1. infileを先頭文字から読む
  2. RSで指定されたパターンが現れるとそのパターンの前までの文字列を1行と認識
  3. 1行と認識した文字列の末尾にORSで指定された文字列を付けて出力

これが正しいとすると、#4〜#9の出力は以下のようになるはずです。

# RS ORS 想定されるoutfileの内容
4 RS="\n" 無指定 1行目[CR][LF]
2行目[CR][LF]
5 RS="\n" ORS="\n" 1行目[CR][LF]
2行目[CR][LF]
6 RS="\n" ORS="\r\n" 1行目[CR][CR][LF]
2行目[CR][CR][LF]
7 RS="\r\n" 無指定 1行目[LF]
2行目[LF]
8 RS="\r\n" ORS="\n" 1行目[LF]
2行目[LF]
9 RS="\r\n" ORS="\r\n" 1行目[CR][LF]
2行目[CR][LF]

しかし実際の出力とは異なります。
実際の出力を見ると、以下のように動いているような気がします。

  1. infileを先頭文字から読む
  2. [CR][LF]が現れると無条件で[LF]に変換する
  3. 変換後の文字を読んでいき、RSで指定されたパターンが現れるとそのパターンの前までの文字列を1行と認識
  4. 1行と認識した文字列の末尾にORSで指定された文字列を付けて出力

こう考えると#4,#5で[CR]が消えたり#7,#8,#9の1行目と2行目の改行コードが異なる理由も説明できます。
コメントされていた『cygwin自体でどうmountしているかということと』についてはbinmode,textmodeの両方でマウントした場合で同じ結果が出たので、mountが原因では無いのではと思っています。
……という訳なんですが、うまく伝えられてるかな。あ、Linuxでは試していないのでcygwin特有ではないかも知れません。

基礎から始めるデータベース入門セミナー

オラクル通信の連載。オラクル社のサイトにはバックナンバーへのリンクも連載の一覧も無いので勝手にリスト化。

*1:ラクル通信のタイトルは「Structured Query Language(SQL)とは?」となっているが第5回タイトルの誤植と思われるため編者により修正

*2:こっちは誤植ではない。内容がループしてるのか?

「ニンテンドーDSブラウザ」は携帯ゲーム機をPDAに進化させるかも

ちょっと古いニュースですが、ニンテンドーDS向けブラウザが出るそうです。
ニンテンドーDSブラウザー - えむもじら

最初は余り気にならなかったのですが、関連する次の記事を読んで印象がかなり変わりました。
革命的デバイス - いつか作ります - 断片部

単なるブラウザだと考えると「ブラウザにわざわざ金を払うの?」とか「他の事をする時は結局カセットを入れ換えなきゃならないじゃない」と思うわけですが、ブラウザ上で動く数々のWebサービスがDSで使えると考えれば、色々な使い道が考えられます。
PDAの代表的な機能であるスケジュール管理、アドレス管理等を行うWebサービスは既に存在しますし、Flash等で作られたゲームをDSで遊ぶ事もできるかも知れません。

当面のポイントは

  • JavaScript,Flash等のクライアントサイド技術にどの程度対応しているか
  • DSの操作感を活かしたコンテンツが提供されうるか

といった所でしょうか。

というわけで、マージンFXのひまわり証券さん、ニンテンドーDS Lite欲しい!<結局それかよ