2007/04/17

[技術系]   [サーバリプレース]RAIDユニットどうしよ

at 14:25JST
昼に「エイリアス2」の予約録画がはじまる直前、サーバが
「ピーッ!」
って鳴いてリブートした…。うう。

もうこれ以上液漏れコンデンサー搭載のM/Bとおつきあいしているわけにはいかないようだ。リプレースに着手することにした。

問題はRAIDユニットだ。ホットスワップのやつ。

今使っているものはBigDriveに対応していない。ハードを一から組み直すなら、今回新しいものに入れ替えないとチャンスを逸する。

それに、時期的にSATAに切り替えないとやばいだろう。3,4年後にはPATAは入手しづらくなりそうな気がする。

・BigDrive対応
・外部インターフェイス:SATA
・内部インターフェイス:SATA

かあ…。

Plat'Online - 【キャンペーン】DF-7505-B DataFree ミラーリングレイド(黒)(DF-7505-B/C)
http://online.plathome.co.jp/detail.html?scd=11841264
→SATA/SATA

Plat'Online - ACS-75170-W(ACS-75170-W)
http://online.plathome.co.jp/detail.html?scd=11841252
→SATA/SATA-PATAブリッジ
※ブリッジにてRAIDカードの処理はUltraATA133相当に互換されます。
※SATA II のHDDはSATA1に下位互換されるためNCQ等には対応しません。
※SATA II 300のHDDは製品の仕様上150の動作に固定してください。


Plat'Online - ARAID99-1000L-A/P-B(ARAID99-1000L-A/P-B)
http://online.plathome.co.jp/detail.html?scd=11840688
→PATA/PATA

で、ふと思い出した。

OSがWindows 2000 Serverだ…。起動ドライブSATAにするのが面倒だ…。あー。うー。うーん…。

2007/04/16

[技術系]   mp3を与えるとバコバコ歌詞ファイルを生成してくれるperlスクリプト

at 02:44JST
大塚愛の「CHU-LIP」を借りてきて、例によって歌詞が聴き取れないのでネットをさまよってたらちょっとびっくり。

詳細検索 - goo 音楽
http://music.goo.ne.jp/lyric/db.php

gooって、歌詞の条件付き検索ができるうえに表示画面がプレインテキスト(HTML)だ…。JavaScriptなどでコピー等できないようにはなってるが、そんだけ。ほかのサイトみたいにFlashじゃないんだ。

データ提供元の「Uta-Net」も歌詞表示画面は同じ。ただ、自由度の高い検索ができない=自動化に不便。
http://www.uta-net.com/

えー…えーんかいな、これじゃ簡単なスクリプトで自動取得し放題じゃん。いろんなフリーソフト使わなくてもいいんだ。と思ってカリカリ書いてみた。

getlyrics.pl

MP3ファイルを与えるとID3タグからそれっぽい曲を勝手に探し出して、同じディレクトリの.txtファイルとして書き出してくれる(強制上書き)スクリプト。MP3::Tag使ってます。動作確認はWindows XP SP2 + ActivePerl 5.8.6。スクリプトがEUC-JPになってないと正常動作しない。

ALI PROJECTの「ARISTOCRACY」で試したら、13曲中11曲であっという間に歌詞ファイルができた(なんつーアルバムで試してんねん)。


ぼくは日本語の聴き取りがヘタなので、一時期MP3の歌詞ファイルづくりにハマってた。しかし、テキストを拾うのがたいへんで最近は放置してたんだよね。これならやる気出そう。ま、あとタイムタグの挿入をしないと使い物にならないか…曲長を行数で割ってダミーの時間を入れていくようにしてもいいかな?

そういえば、前にフォーマット解析して作った歌詞データ内蔵化スクリプトはどこに行ったろ。

2007/04/15

[技術系]   SPFのギモン

at 15:16JST
まとめ:ホワイトリストとして、利用しているホストをリストアップしなくてはいけないので、所在を知られたくないホストまで不特定多数に公開してしまうことにならないのかな?

404 Blog Not Found:SMTP - SPF導入のすすめ
http://blog.livedoor.jp/dankogai/archives/50809900.html

たまにはてブ見ると憎悪を煽るようなエントリばっかり載ってて気持ち悪くなる。404 Blog Not Foundの技術系の話が入ってると一服の清涼剤だ…。

ぼくもたまにひまつぶしでSPFの導入を考える。いまの生活だとぜんぜんクリティカルな問題じゃないので放置しっぱなし…。これ読んで改めて導入を再検討した。と、そこでギモンが。

SPFって、早い話
「うちのドメインではこんなホストからメールを出しますよー」
というホワイトリストを不特定多数に公開するしくみだよね。

ということは、
「ぼく、ふだんこんなIPアドレスでネットにつなげてるけど、
 知らない人には教えたくないんだ」
って人には問題があるのではなかろうか…。これって既知の問題?

具体的には、たとえば
・サーバXをどこかのプレゼンスプロバイダで借りてドメインYとして運用している
・自宅では別のプロバイダと契約してインターネット接続する。固定IP接続。これを仮にホストZとする
という人がいる。これ自体は珍しくない。

で、SPFではホストZのIPアドレスをホワイトリストで公開しなくてはならない。すると、
「うひひ。ドメインYのやつ、超気にくわねー。
 お。SPFで調べたらホストZでつなげてんだな?
 うっしゃー、攻撃じゃー」
という第三者の餌食になる可能性が…。

反論:
1・そもそもホストZのIPアドレスはメールのReceivedに現れるので、“特定の”第三者にはもともと公開されているものである
2・サーバXにSMTP AUTHでつなげてメール送信するようにして、サーバX側でReceivedヘッダ削除させればいいだろ云々(以下技術的に楽しい話題)
3・ホストZをSPFで公開しなきゃいいじゃん。中立判定されるだけなんだから

1は、「不特定多数」には公開されていなかったものを公開しなくてはいけないという点でやはり問題がある気がする。2は一般のレンタルサーバオーナーにそういうことを求めてはいけない云々(以下技術原理主義者の怒りを買うような言い訳を数百行)。3はSPFの意義自体に疑問を抱かせるような…。

対策:
・ホストZをドメインY配下のホストとして逆引き可能とする。なおかつSPFではホスト単位ではなくドメイン全体を「シロ」として公開する

かなあ。うーん。しかし、固定IPアドレスを提供しているプロバイダによっては、逆引き時のドメインをプロバイダのもの固定にしてしまっているところもある。なんか難しい。

で、なんかこういうことを考えていたらめんどくさくなってきたのでカーズは考えるのをやめたよ。

[技術系]   mysqlccが見つからない

at 13:14JST
なんとなくWindowsにMySQLを入れて遊び始めた。

例によって片手しか使えないのでGUIツールで遊ぼうと思ったんだけど、なんか公式サイトから「MySQL Control Center」が消えてる?

かわりに「MySQL Administrator」が出てるんだけど、これ見るからにできることが違うような…データベースの作成ができない。

SQL打って作ればいいんだけど、片手じゃコマンドラインは面倒なのよ。

追記:
? なんかここにしこたま飛んできてる人がいる??

ちなみにデータベース作成は「カタログ」のスキーマリストで右クリックして「Create new schema」ですた…。

2007/04/14

[技術系]   NTT PCのVPSもけっこういいと思うんだけどな…

at 04:48JST
MySQLの導入検討をしていたら「ここギコ!」さんとこ迷い込んで、むかしの自分と同じようなことについて愚痴ってたのでメモ。

ここギコ!: Amazon EC2のランニングコストはそんなに安くなかった
http://kokogiko.net/m/archives/001956.html
今のここギコサーバ、金がないためにRAID構成とかになっておらず、今こう書いてる一瞬だって実はサーバが壊れてもおかしくないような状況(DBや一部静的ファイルのバックアップは取ってますが)であるにも関わらず、4-5万円のハードウェアアップグレード費用が払えないために騙し騙し使っているわけなんですが


ぼくもいろいろ専用サーバを渡り歩いて、さくらのこの専用サーバも使ったことあるけど、
「いつ壊れるかわからない」
というのはホントに精神衛生上よくない。で、実は本当にハードディスクがぶっ飛んだことがある…(さくら以外のとこ)。そのときは泣いた。

で、思うんだけど負荷が極端に高くないなら、EC2とかじゃなくても国内のベンダが提供してるVPSサービスを使った方が便利だと思う。ハードウェアの故障から解放されるうえに面倒がないもの。

VPS/仮想専用サーバーホスティング WebARENA SuitePRO
http://web.arena.ne.jp/suitepro/

VPSだとベンダによっては転送量制限があるんだけど、ここはなし。サーバOSの選択肢はFedoraのみと狭い(UMLベースらしいからFreeBSDとかはないわなあ)ながら、そのほかの自由度は高い。…古い人間なのでvipwが使えないのは面食らったけど。あとICMP周りに制限があったか。

ディスクについては毎日バックアップを取ってくれて、好きな日のものだけ保存しておいたりリカバリをしたりはすべてWeb経由で作業できる。回線・CPUパワーもけっこういいセン行ってる。うちのWindows 2000 Server上で動いてるcoLinuxよりコンパイルが速くてイヤになるくらい…。深夜2時ごろのcronが、共用しているインスタンスで一斉に動くらしくそのあいだのロードアベレージだけ異常に高くなるんだけどそれを除けば問題ないかなあ。

値段もバックアップの有料オプション込みでさくらより安い。

2007/04/11

[技術系]   複写防止模様

at 21:37JST
ITmedia エンタープライズ:日立GP、改ざん防止用紙と同等な印刷文書を作成できるソフトウェアを発表
http://www.itmedia.co.jp/enterprise/articles/0704/11/news088.html

紙の地紋に「複写禁止」という潜像が入ってて、コピーするとその字が浮き出てしまうというアレ。アレをPCのプリンターでできるという製品。

へー、PCでできるのか。専用の用紙じゃないとダメなレベルだと思っていたのに、と調べてみたら、

キヤノン ソフトウェア|imageWARE TrustStamp
http://cweb.canon.jp/Product/appli/truststamp/

既存の製品はけっこうあった。

おまけに、すごくちゃんとした論文まで見つけてしまった。

[論文]文書偽造防止における、二値電子透かし技術|シーフォーテクノロジー
http://capg.c4t.jp/technology/watermark/binary.html

すごい…こんな論文がタダで読めるなんて…。なんか自分でも作ってみようかな。

2007/04/09

[技術系]   HTMLリンク分割スパム

at 16:11JST
3月はスパム活動に新たな兆候、引用符によるHTMLリンク分割など
http://internet.watch.impress.co.jp/cda/news/2007/04/09/15358.html
新しいスパム手法として、引用符によってリンクのhttpを細かく区切ったスパムメールが発見された。例えば、「」と記述することで、URLフィルタリングを回避する仕組みだ


20070409immage1.png


嫁ねー世^^; そろそろもうちょっと高機能なCMS導入したほうがいいって>INTERNET Watch 大なり小なりくらいエスケープしてくれるような。

で、ソース見て確認したら
<Body onload='JsCriPt.enCODE: s="h"+"t"+"t"+"p"+":"+"//"+"spammywebsite.com/spammyfolder'>

ということだそうだ(こんなソースだからいいがもうちょっとヘンなのだったらWatchがワーム流出源になっていたかもしれないのな。ぞー…他人事ではないので責めない)。

無意味に大文字・小文字混ぜてるところがほほえましい。もうイタチごっこなのでどうしようもないね。

[技術系]   Seesaaの挙動不審

at 13:05JST
最近、エントリをポストした直後にそのエントリのURLにアクセスするとNot foundになることが多い。修正かけてもすぐに反映されないとかね。

今日はさらにおかしくて、
「エントリ自体はあるのだが本文がない」
という事象がおきた。-_-;

よくわかんないけど、いつかのメンテナンス以降、
「一度作成したエントリを削除して、
 そのアドレスにアクセスすると
 memcachedと名乗る人がエラーを返してくる」
という現象が起きるようになっていて(これ自体は無害)、どうもこのあたりと関係しているような気がする。早い話がキャッシュ周りがおかしい。

なんだかんだ言ってものすごくカスタマイズの自由度が高くてお世話になってるので、あんま悪口言いたくないが。ちょっとここらへんチェックしてくれるとありがたいなー。

エイプリルフールにネタで
「再構築ロボ」
というのをやっていたのは、たぶんこのあいだのメンテで異常に再構築が速くなったのを自負してるんだと思うが。…実際、はじめはなんか壊れてるのかと思ったくらいで。それはそれでほめてあげるからがんばってくれー。じゃないとMTに逃げます(そもそもSeesaaに一銭も貢献していない人間が逃げても痛くもかゆくもないか。つーか貢献できるような事業モデルに成長してくれよ)。

[技術系]   Weak references are not implemented in the version of perl

at 12:40JST
Windowsを再インストールしたので、CPANのmake環境を再構築してテストしてると、
install Storable
Weak references are not implemented in the version of perl…
で落ちる。ちなみにActivePerlのv5.8.6(わざと)。

ハァ? と思って適当にググって、最初に目に入った通りに
force install Scalar::Util
したら直った。なんでやねん。

2007/04/08

[技術系]   HeadlineDeskbar×MYCOM PC WEB=ハングアップ

at 11:59JST
ごくまれに、なんだけど、

HeadlineDeskbarにMYCOM PC WEBのRSSを登録しておくと、
更新のたびにMYCOMのエントリだけ延々と追記されていってしまい、
しまいにMYCOMの一覧をDeskbarで表示させようとするとハングアップするようになる

という現象が起きる気がする。

こういうことが起きるときには、HeadlineDeskbarのキャッシュ

C:\Documents and Settings\username\Application Data\InfoMaker\HeadlineDeskbar\HeadlineDeskbar.mnu

が数十MB単位の巨大サイズになっている。

以前にもそういうことがあったのだが、原因不明でそのうち忘れていた。今回再発したけど、やっぱり理由はわからない。MYCOM側のRSS自体は、べつに巨大ファイルを配信しているわけではない。どこかパース上不具合が起きるような構成になっているのか…それともDeskbar側の問題か…。

面倒なので、やがてカースは考えるのをやめた。

2007/04/07

[技術系]   おまえが犯人だったのかー!

at 10:44JST
サブディスプレイをメンテしてたら、ドライバがベンダーのものじゃないのに気づいた。画面をローテートしたいのでインストールしてみる。

…。

このあいだと同じ。いきなりマシンが不調になった(コンテキストメニュー→新規作成でハングアップする)。

おまえか!
おまえのしわざだったのかー!>ATI

おまけにアンインストーラの挙動もおかしい。
むりやりアンインストールしても復旧しない。

…またOS再インストールですか。
長い夜になりそうだな? あー?

_| ̄|O

2007/04/06

[技術系]   またメンテかあ

at 03:05JST
Seesaaからのお知らせ: サーバ増強にともなうメンテナンスのお知らせ
http://info.seesaa.net/article/37846540.html
作業期間
2007年 4月11日(水) 午前2:00 - 10:00


平日昼間に…。

でも、前回の非常訓練でいつでもミラーサーバに振り返られるようになったから、ウチは大丈夫だもんね。今回は4月11日になったら速攻で切り替えとくか。そうだ。前回は携帯からのアクセスが全滅になっちゃったけど、今回はUserAgent見て携帯からのアクセス時には告知文ページに振り分けるしかけも作っておくか。…うちのサイト、携帯で見てる人がどれほどいるのかという話もあるが。

こういうときは、やっぱ独自ドメイン取得して対策講じてよかったと思うが…。最近、どうも
「別にSeesaa使わなくても、うちのサーバでアクセスさばけるんじゃないか?」
と思い始めた。ああ、かわいそうなSeesaa…。

実際のとこどうなんだろ。静的ファイルへのアクセスだけだったら、うちのPVでもさばけると思うんだけど。いまJavaScript経由で呼び出しているいろんなしかけも静的ファイルに落とし込めるので、かえって負荷が減るかなあ。

とはいえ、以前、自家製簡易CMSがたかだか一万PV/日くらいのアクセスで破綻したときのことを考えると踏み切れない。まあ、あれはいくらなんでもコードがひどかった…。

2007/04/03

[技術系]   Jcode.pmが死ぬ

at 01:33JST
UTF-16BE:Malformed LO surrogate d897 at C:/aPerl/lib/Encode.pm line 166
っていきなりdieされた…。

いや、もちろん言いたいことはわかるんだけど、何も死ななくたって。

とりあえずググって見るとわりと有名な話みたい。

UTF-16LE:Malformed LO surrogate を避ける - 徒書
http://www.akatsukinishisu.net/itazuragaki/perl/malformed_lo_surrogate.html

ぼくはuse Jcodeしてるだけなんだけど、内部的にはEncodeだからなあ。とりあえず
$Encode::Guess::NoUTFAutoGuess = 1; 
Encode::Guess->set_suspects( qw(euc-jp shiftjis 7bit-jis utf8) );
したけど、やっぱ死ぬ。よほどバイナリっぽいテキストなんだろ。

しかたないのでevalで囲った。「いばる」。

んー。死ななくてもいいと思うんだけどなあ。なんで死ぬかなあ。ぼくがこれまでに書いたスクリプト、みんないばらないとダメなの?

2007/04/02

[技術系]   ほとんどの「論理マークアップ」はクローラにとってはクソの役にも立たない

at 23:10JST
追追記:このエントリ、いつのまにか元記事よりも多くSBMされてるみたいだけどそんなに読む価値あるのかしら…。

どっちにしろたくさんアクセスされているようなので、すかさずアフィリエイトを貼っておこう。さあ、キミたち買うんだ。


Japan.internet.com Webビジネス - SEO のキホン―なぜ論理構造が必要なのか
http://japan.internet.com/busnews/20070402/6.html

てなことをあやしげSEO系マーケターが書いてるわけだが。

こういう神話が一人歩きしている状態がイヤだ。いくぶん極論ではあるが、これが「間違っている」ということをネット辺境のきわみであるこのページに、せめてメモっておこう。

ほとんどの場合、クローラにとってHTMLごときの論理マークアップなんてクソの役にも立たない!

…だって作ってる本人が最初にタグを削除してるって言ってんだから、役に立つわけないじゃん。

フィードリーダや特殊なスパイダーでもない限り、細かい論理マークアップを見たりなんかしないよ。フィードリーダは埋め込まれているフィード情報をチェックするからしかたない。特殊なスパイダーというのは、特定ページを頻繁にチェックして更新差分をとるとか、そういうやつ。

※以下「クローラ」という単語は、Webページを取得するだけでなく、その内容を解析してなんらかの役に立てるプログラムとして使っている

だってね、ちょっと考えてほしいのよ。

論理マークアップが役に立つとするなら、たとえば
・hタグが後続パラグラフの意味ダイジェストになっている
というような状況だろう。

しかし、その状況が「100%」でない限り、クローラはそれを前提として動作することはできないんだよ。逆に、採用状況が50%以下なら、それを前提として動作することがノイズになってしまい、期待している成果を得られなくなってしまう。だとしたらはじめからタグを無視することを前提とした解析手法をとったほうが効率的だ。hタグ→後続タグ、のような構造を分析して、単語の重み付けをするシステムつくるのってけっこう大変だよ?

さらに、
「人間の生成する文章というのは論理的ではない」
というのも重要なポイントだ。一般論として、人間は大量の非文(文章になっていない文)を平気で量産する。文法的に成立していても「黒は白だ」というように、意味がない文章は日常的に生まれている。だが、それを「論理的でない」と言って捨てることはできない。自然言語処理のお父さんである言語学というのは「現象」としての言語を分析する科学であって、論理的でないからといって現象を排除したら科学ではなくなってしまう。

端的に言うと、直前にあるhタグがパラグラフの意味ダイジェストになっていない「非論理的」なケースが大量にあって、クローラはそれを正常に評価できなくてはいけないということだ。

手近な本を拾って目次をチェックしてほしいのだが、セクションタイトルが各セクションの内容を端的に表しているなどという事例は、実は世の中の文章のごく一部に過ぎない。多くは文学的に表徴しているだけで、非常に論理性を欠いたタイトルになっているはずだ。

じゃあさ、hタグに依存して文章を解析するのって、
「コストが高いわりに見合わない」
ということになりませんか? 実際見合わないんだよ。

HTML文書で、本当にクローラにとって役に立つものって、
・title情報
・metaタグの情報
ぐらいなんだよ。だから、多くの場合、クローラはこれらの情報を取得したあとはHTMLのタグをバッサリと切って捨ててしまう。「タグの意味を拾ってる」と主張するなら「ホワイトスペースにも意味がある」と主張されてもいいはずだが、ホワイトスペースもばっさり切り捨て。どうにかして「本文はどこらへんかなー」とタグを頼りに探索することもあるけど、それって間違えると本文が全部消し飛んじゃうのでやらないほうが無難。

タグベースでHTML文書を解析するのって、ほとんど生成文法論みたいなもんで、実用的には役に立たないって。いくら文章の構造をカッコよく解析しても、機械翻訳の精度は上がらないし、意味解析もできない。

代わりにどうするかというと、けっきょくヒューリスティクスと統計的手法に頼るしかない。日本語では形態素解析だけは不可欠なのでそれはやるとしても、あとはクラスタリングとかTF/IDFとかそういう方法を取る。
「うそー?」
と言われても、現実問題、実際に世の中で動いているWebサービスのほとんどがそれなんだからしょうがないじゃん!

そういう状況下で
「論理マークアップ!」
とか叫んでも無意味。CSSベースだろうが、TABLEベースだろうが、HTMLがどう書かれていてもクローラは差別せずに解析しているよ。逆に言うと、TABLEベースのページがたくさんあるのに、差別して解析してたら実用にならないじゃんよ。まあ、天才の作ってるクローラは別だろうけどね…多くの凡才が作っているものはそんなもんだって。

むしろ言わせてもらうなら、最近多い
「CSSとかJavaScriptはどんなブラウザも対応してて当然」
とか思いこんで書かれているページのほうがSEO上は有害だと思う。90年代くらいの常識にのっとって、
・スタイル、JavaScriptは、
 非対応ブラウザに配慮してコメントアウトする
ようにしててくれているサイトのほうが有利。だってねえ…タグ削除するとき、HTMLコメントアウト部分だけ削除してればオッケーかと思ってると、最近はちゃんとスクリプトをコメントアウトしてないところが多くてノイズが増えちゃって困るのよ。これって解析上はポイントダウンよ?

頼むから、論理構造がSEO上有利なんて科学的根拠のない風説を広めるのはもうやめてください。実際のクローラの動作を知らないで主張しているのがモロバレです。

そもそもね、
「HTMLは論理マークアップ言語だ」
って主張してる人は、ちょっとモノ考えなさすぎだよ。あれのどこが論理マークアップ可能な高等言語なんだよ。

いちばんバカげていると思うのは、ここで俎上にあがっているようなhタグだ。

h1
h2
h3


といくつもありますが…なぜ「タグ名にレベルの数が含まれている」の? この時点でHTMLは
「論理マークアップ言語としては致命的な欠陥を含有している言語」
と察知できて当然だと思うんだけどどうよ?

たとえば「h2タグが先行するパラグラフ」があったとするじゃない? そのパラグラフをそのまま別の位置にある「h3タグが先行するセクション」の配下に移したとする。そうするとなんと、内容を人間が判断してh2をh4に書き換えたりとかしないといけない(機械的には操作不可)。なんじゃそりゃ。childHeadingとかchildSectionとかいうタグがあって、それで階層構造を記述してるんだったら論理マークアップしてるって認めるけど、こんなの機能不足だろ。つーかそもそも、hタグがそれ以降のどこまでを配下セクションとして扱うのかを明示してないじゃん? わけわからん。名前が「heading」って時点で視覚的情報を反映した命名だしさ(digestOfThisSectionとかにしろ)。

個人的には、
・W3C原理主義者
・SEO業者
には、「HTMLは欠陥言語です」というあたりから現実を認識してほしいもんだ。

追記:
あとアレね。
この話はクローラだけじゃなくて、スクリーンリーダとかにも通用することだからね。「Web標準を守らないのは障害者差別」とか、実際にスクリーンリーダ常用してから言えっての。都合のいいときだけ障害者を錦の御旗として引っ張り出してこられるのは、障害当事者として非常に迷惑。

[技術系]   ギャー!

at 12:39JST
そうか…。
ドメイン移転したから、それ以前のものはヒットしないのか…。

作った自分がいちばん恩恵を受けられないってどういうこっちゃねん…。やっぱサイト全体を取得してやるASP型で作るしかないのか。

ほんとに死にたい。
川村ゆきえにカニばさみされて死にたい…。

[技術系]   クロール中…

at 08:51JST
んー。

1日ぶんのテキストをgzipした状態で、約6MB。

6×30日×12ヶ月×2年=4GB!

ありゃ。けっこうデカいな。
取得後にDVDに焼けばいいだろうと思っていたが、DLメディアレベルか。

…で、そのDVDドライブの調子がおかしいんだってば…_| ̄|O 死ぬ

[技術系]   Locationでリダイレクトされているかどうかをチェック

at 07:36JST
Perl。

LWP::UserAgentで、たとえば
#/bin/sh 
/bin/cat <<_EOF_
Location: http://www.yahoo.co.jp/

_EOF_
としたCGIスクリプトのページに
my $ua = LWP::UserAgent->new(); 
my $response = $ua->get( '上記CGIのURL' );
if ( $response->is_redirect ) {
print "Locationヘッダでリダイレクトされてますね\n";
}
としてアクセスしても、リダイレクトとして検知されないなあ。

if ( $response->previous->is_redirect )
としても同様。

・このCGI → レスポンスが302
・Yahoo! → レスポンスが302

だからなんだろうけど。つーか、もしかして世界の常識ではLocationヘッダで転送するのはリダイレクトと言わない?

こうしてみる。
my $ua = LWP::UserAgent->new(); 
my $response = $ua->get( '上記CGIのURL' );
if ( defined $response->previous ) {
if ( defined $response->previous->headers->{location} ) {
print "Locationヘッダでリダイレクトされてますね\n";
}
}
動く。なんか長いが、undefinedだとエラーになるので。ひろ式驚異の低技術力ではこれが限界。

2007/03/31

[技術系]   予約語っぽい名前は使わないほうがいいらしいぞぉ by ぷりぷりはかせ

at 06:51JST
お絵描きし終わって覗いてみたら、またDan氏が
「IEで動かないJavaScript」
を量産していた。…昨日もこの時間に発見したような気がする。もしかしてライフサイクルが同じなのかしらん。

どっちにしても乗りかかった船だし勉強になるので、なぜ動かないのかチェックしてみることにした。

404 Blog Not Found:perl - 任意のURIのStatusを確認するAPI
http://blog.livedoor.jp/dankogai/archives/50798572.html

もとのHTML+JavaScriptソースは下記のとおり。

<script> 
function $(id){ return document.getElementById(id) }
function Status(cb){
this.proxy = 'http://api.dan.co.jp/status/';
this.loader_img = 'http://blog.livedoor.jp/dankogai/img/ajax-loader.gif';
this.idle_img = 'http://blog.livedoor.jp/dankogai/img/1x1.gif';
this.cb = (cb || 'callback');
this.parse = function(uri, cb){
if ($('ajax-loader')) $('ajax-loader').src = this.loader_img;
if (! cb) cb = this.cb;
var script = document.createElement('script');
script.id = this.proxy + cb + '/' + uri;
script.charset = 'UTF-8';
script.src = script.id;
document.lastChild.appendChild(script);
};
return this;
}
var status = new Status();
function callback(json){
$('status.time').innerHTML = json.time;
$('status.uri').innerHTML = json.uri;
$('status.code').innerHTML = json.code;
$('status.chain').innerHTML = '';
if (json.chain){
var chain = document.createElement('table');
chain.width = '100%';
for (var i = 0,l = json.chain.length; i < l; i++){
var tr = document.createElement('tr');
for (var j = 0, m = json.chain[i].length; j < m; j++){
var td = document.createElement('td');
td.innerHTML = json.chain[i][j];
tr.appendChild(td);
}
chain.appendChild(tr);
}
$('status.chain').appendChild(chain);
}
$('status.header').innerHTML = '';
if (json.header){
var header = document.createElement('table');
header.width = '100%';
for (var h in json.header){
var tr = document.createElement('tr');
var th = document.createElement('th');
th.style.whiteSpace = 'nowrap';
th.innerHTML = h;
tr.appendChild(th);
var td = document.createElement('td');
td.innerHTML = json.header[h];
tr.appendChild(td);
header.appendChild(tr);
}
$('status.header').appendChild(header);
}
$('ajax-loader').src = status.idle_img;
}
</script>
<style>
.status td,th { text-align: left; border: dotted 1px }
.status td { font-family:sans-serif }
</style>
<div style="border:dotted 1px;padding: 0.5em">
<img id="ajax-loader" src="http://blog.livedoor.jp/dankogai/img/1x1.gif" alt="loader" border="0" align="right">
<input id="uri" type="text" size="64"
value="http://blog.livedoor.jp/dankogai"><br>
<select onchange="$('uri').value=this.value;status.parse($('uri').value)">
<option>http://blog.livedoor.jp/dankogai</option>
<option>http://item.rakuten.co.jp/wine/99xx99xx/</option>
<option>http://www.amazon.co.jp/gp/product/0123456789X</option>
<option>http://d.hatena.ne.jp/nonexistent</option>
<option>http://b.hatena.ne.jp/nonexistent</option>
</select>
<input type="submit" onclick="status.parse($('uri').value)">
<table class="status" width="100%">
<tr><th width="15%">Time</th><td id="status.time"></td><tr>
<tr><th>URI</th><td id="status.uri"></td><tr>
<tr><th>Code</th><td id="status.code"></td><tr>
<tr><th>Status Chain</th><td id="status.chain"></td><tr>
<tr><th>Header</th><td id="status.header"></td><tr>
</table>
</div>

submitボタンを押すと、Windows XP SP2 + IE7では
「status.parseがundefinedでエラー」
となる。…なんでだ?

はじめ、コンストラクタの書き方がおかしいのかと思ってチェックしてみたが違った。printfデバッグすると、script定義領域を抜けた時点ですでにstatusがundefinedになっている。

-_-; もしかして…なんか予約語とバッティングしてんの?

と思ってstatusを全部statに書き換えたら動作した。

<script> 
function $(id){ return document.getElementById(id) }
function Status(cb){
this.proxy = 'http://api.dan.co.jp/status/';
this.loader_img = 'http://blog.livedoor.jp/dankogai/img/ajax-loader.gif';
this.idle_img = 'http://blog.livedoor.jp/dankogai/img/1x1.gif';
this.cb = (cb || 'callback');
this.parse = function(uri, cb){
if ($('ajax-loader')) $('ajax-loader').src = this.loader_img;
if (! cb) cb = this.cb;
var script = document.createElement('script');
script.id = this.proxy + cb + '/' + uri;
script.charset = 'UTF-8';
script.src = script.id;
document.lastChild.appendChild(script);
};
return this;
}
var stat = new Status();
function callback(json){
$('stat.time').innerHTML = json.time;
$('stat.uri').innerHTML = json.uri;
$('stat.code').innerHTML = json.code;
$('stat.chain').innerHTML = '';
if (json.chain){
var chain = document.createElement('table');
chain.width = '100%';
for (var i = 0,l = json.chain.length; i < l; i++){
var tr = document.createElement('tr');
for (var j = 0, m = json.chain[i].length; j < m; j++){
var td = document.createElement('td');
td.innerHTML = json.chain[i][j];
tr.appendChild(td);
}
chain.appendChild(tr);
}
$('stat.chain').appendChild(chain);
}
$('stat.header').innerHTML = '';
if (json.header){
var header = document.createElement('table');
header.width = '100%';
for (var h in json.header){
var tr = document.createElement('tr');
var th = document.createElement('th');
th.style.whiteSpace = 'nowrap';
th.innerHTML = h;
tr.appendChild(th);
var td = document.createElement('td');
td.innerHTML = json.header[h];
tr.appendChild(td);
header.appendChild(tr);
}
$('stat.header').appendChild(header);
}
$('ajax-loader').src = stat.idle_img;
}
</script>
<style>
.stat td,th { text-align: left; border: dotted 1px }
.stat td { font-family:sans-serif }
</style>
<div style="border:dotted 1px;padding: 0.5em">
<img id="ajax-loader" src="http://blog.livedoor.jp/dankogai/img/1x1.gif" alt="loader" border="0" align="right">
<input id="uri" type="text" size="64"
value="http://blog.livedoor.jp/dankogai"><br>
<select onchange="$('uri').value=this.value;stat.parse($('uri').value)">
<option>http://blog.livedoor.jp/dankogai</option>
<option>http://item.rakuten.co.jp/wine/99xx99xx/</option>
<option>http://www.amazon.co.jp/gp/product/0123456789X</option>
<option>http://d.hatena.ne.jp/nonexistent</option>
<option>http://b.hatena.ne.jp/nonexistent</option>
</select>
<input type="submit" onclick="stat.parse($('uri').value)">
<table class="stat" width="100%">
<tr><th width="15%">Time</th><td id="stat.time"></td><tr>
<tr><th>URI</th><td id="stat.uri"></td><tr>
<tr><th>Code</th><td id="stat.code"></td><tr>
<tr><th>Status Chain</th><td id="stat.chain"></td><tr>
<tr><th>Header</th><td id="stat.header"></td><tr>
</table>
</div>

んー。ホントはどうなのかチェックしてないけど、やっぱ

教訓:
予約語っぽい名前は使わないほうがいい

ってことかな(注:「statだってperlじゃ予約語だろ」っつーつっこみはナシ)。

ついでにアサマシエイト。



2007/03/30

[技術系]   秀丸の入力補完機能が最強すぎる件について

at 18:15JST
↓のフリーソフトを見ていて、

窓の杜 - 【NEWS】好きなテキストエディターでHTMLタグ入力補完を利用できる「HTMLAssistant」
http://www.forest.impress.co.jp/article/2007/03/29/htmlassistant.html

そういえば秀丸エディタの最新版でも入力補完機能がついたんだよなー…と思い出した。いちおうオンにして使ってはいるのだけれど、HTMLAssistantのように辞書に対応していただろうか。対応していなかったよなー。

秀丸を立ち上げて確認してみた。

…対応してるよ!

しかも設定画面やヘルプを見てみると、恐ろしいほどの機能充実ぶりだ。

20070330mage1.png


秀丸に搭載された入力補完機能は、基本的には編集中ファイルの中の既存単語から候補を見つけて表示してくれるというものだ。しかし、その機能はいたれりつくせり。

まず単語認識は、通常の英数字のみから構成されるものだけでなく、HTMLAssistantと同じように<>といったHTMLタグ独特の文字からなるものも対象にできる。
「なんだー。HTMLはダメかー」
と思ってたけど、デフォルトでオンになっていないだけだった。もちろん、OOP向けにドットシンタックスも対象にできる。というか単語構成要素を
・先頭文字
・語中文字
・末尾文字
別に自由に指定できるのでなんでもありだ。とりあえずぼくは:を語中文字に入れた。

先ほどの辞書ファイルについては、
・フリーフォーマット
・行単位
の二種を指定することができる。で、この「フリーフォーマット」というのがふるっていて「自由形式」という意味ではなく

「フォーマットが要らない」

という意味だ。ヘルプのことばを借りると、
専用に辞書ファイルを作成しなくても、大胆に既存のテキストファイルを指定しまうといったことができます。

ということ。なんかでっかいテキストを拾って、それを辞書にできてしまう! まじか。大胆すぎる。

さらに単語抽出元をクリップボードの中身や
「カレントフォルダにあるファイル名」
まで対象にできるので、あらゆるコード書きにとって便利きわまりないと思う。中途半端なIDEよりずっと有用だ。

また、
「英単語だけでなく、
 日本語も補完対象にできる」
というのだから、もはやIMEの予測入力機能は不要!

秀丸は、いざというときにこういう変態的な機能をドカッと入れてくるから好きだ。秀まるお氏は衰えないねえ。これで左端にエクスプローラ表示とスニペットペインができたら、ほんとにIDE要らないよなー。

[技術系]   UACの理不尽

at 09:49JST
UAC無効時の警告を出さない : ひろ式めもちょう
http://memo.hirosiki.jp/article/32605493.html


「ああ、あれがでなくなるならVistaに移ってもいいか」
と思えていたところなのに。

ITmedia +D PC USER:サクッとおいしいVistaチップス 1枚め:ユーザーアカウント制御を使いこなす
http://plusd.itmedia.co.jp/pcuser/articles/0703/30/news023.html
UACを無効にした状態でログオンすると、Tempフォルダ(デフォルトはC:\Users\<ユーザー名>\AppData\Local\Temp)に対する書き込みと実行が拒否されてしまうからだ


なんで!?
ふつー逆だろ!
さらに過去の記事
2009/04 (1)   2008/12 (3)   2008/11 (9)   2008/10 (10)   2008/09 (20)   2008/08 (2)   2008/07 (23)   2008/06 (16)   2008/05 (22)   2008/04 (11)   2008/03 (21)   2008/02 (20)   2008/01 (21)   2007/12 (32)   2007/11 (37)   2007/10 (46)   2007/09 (63)   2007/08 (33)   2007/07 (41)   2007/06 (81)   2007/05 (173)   2007/04 (168)   2007/03 (113)   2007/02 (123)   2007/01 (92)   2006/12 (111)   2006/11 (185)   2006/10 (20)  

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。