一つ前の記事、クリックの自動化だけど…間違い発見! というのもHTTPヘッダのRefererが送信されてない! 確かにIEからXHRを立ち上げたらばこのRefererの偽装は問題になるけど…WSHから作ってるわけだし、、、もぅ〜このMSの頑固じじぃ!!…と取り敢えず人のせいにしておく…。
で、解決策なんだけど…IEのOLEオートメーションで処理する。これで前の方法と同じく、Windowsなら結構古くても何もインストールや設定をしなくても、取り敢えず動く。ただ、この方法…ちょっとHTTPでGETしたいだけなのに…IEを立ち上げるはめになる。…処理がやや重く、エンジニアとしては気持ち的にも重い…。
<?xml version="1.0" encoidng="utf-8"?>
<job>
<script language="JScript">
<![CDATA[
/* ブログランキング、クリック用自動化スクリプト */
// 各種プロパティ
var URL = "http://nossie.blog71.fc2.com/";
var CLICK_URL = "http://blog.with2.net/link.php?608044";
var MOVETO_URL = "http://blog.with2.net/rank";
var ECHO_TROUBLE = true;
// 自動化部分
var ie = null;
try {
// IEの起動
ie = WScript.createObject("InternetExplorer.application","ie_");
ie.visible = false;
ie.navigate(CLICK_URL, null, null, null, "Referer: " + URL);
/* WSH機能解説 *
* スリープしている間に名前で暗黙的にバインドされた
* イベントが呼び出されます。スリープしなかった場合、
* 勝手に終了してしまうようです。*/
WScript.sleep(10000);
// 指定時間内に終わらなければエラー
throw new Error(0, "Time Out!!");
} catch(e) {
atError(e);
}
function ie_NavigateComplete2(pDisp, url) {
if(url.indexOf(MOVETO_URL) == 0) {
pDisp.quit()
WScript.quit();
}
}
function atError(e) {
if(ie != null)
ie.quit();
if(ECHO_TROUBLE)
WScript.echo("blog click fail!!:" + e.description);
WScript.quit(1);
}
]]>
</script>
</job>
パソコンを起動した時とか、日付の変わった直後にどっかのサイトにアクセスしてデータをどーのこーの…というテーマは結構ある。…例えば、どっかの株価欄をチェックして警告を出したり、ちょっとダサいけど自分のブログランキングのボタンを自分でぽちっとしたい時、(IPアドレスでカウントされるので一票だけならこうした自作自演も出来ちゃう…)。
で…まぁ、Firefox等の高機能なブラウザとちょっとした自動化スクリプトがあれば朝飯前だけど、そもそもブラウザ立ち上げるのも面倒…という怠け者に何かいい方法はないのか…という話。
最初に考えたのはバッチとtelnetの組み合わせ。だけど、Vistaではtelnetが初期状態で有効になってない。しかも、telnetは入力から応答までのタイムラグやら何やらに気を配る必要があるから、単純にパイプでサーバへの接続からGETメソッドの発行を入力しても、sleep等しないとうまくいかない。そこで、WSHを使ってみたらす〜んなり簡単プログラムである事が判明。そっかWebプログラミングと同じでXHRを使えば良かったんだ…って何故こんな事に気づかなかったんだろう…。
(PowerShellでなく古いWSHを使う理由は外出先で常に.Netが使えるとも限らないから)
以下のコードは当ブログの人気ランキングボタンのクリックをエミュレートしたサンプルコード…。
ちなみに、相手サーバとのやり取りの過程で、途中 Refresh HTTPヘッダによる折り返しがあるんだけど…これがランキングに影響するかは…謎。
<?xml version="1.0" encoidng="utf-8"?>
<job>
<script language="JScript">
<![CDATA[
/* ブログランキング、クリック用自動化スクリプト */
// 各種プロパティ
var SERVER_URL = "http://blog.with2.net"
var URL = SERVER_URL + "/link.php?608044";
var REFERER = "http://nossie.blog71.fc2.com/";
var REFRESH_CONTENT_REG = /<META\s+HTTP-EQUIV="Refresh"\s+CONTENT="([^"]*)"/i;
var REFRESH_DETAIL_REG = /\d+;URL=(.*)/
// 自動化部分
try {
// クリックによるリクエストの再現
var xhr = WScript.createObject("Msxml2.XMLHTTP");
xhr.open("GET",URL,false);
xhr.setRequestHeader("Referer",REFERER);
xhr.send();
if(xhr.status != 200)
throw new Error;
// 結果の取得
var result;
var rText = xhr.responseText;
result = REFRESH_CONTENT_REG.exec(rText);
if(result == null)
throw new Error;
var refreshContent = result[1];
result = REFRESH_DETAIL_REG.exec(refreshContent);
if(result == null)
throw new Error;
var refreshLocale = result[1];
// リフレッシュ要求先へ転送
var refreshUrl = SERVER_URL + refreshLocale;
xhr.open("GET",refreshUrl,false);
xhr.setRequestHeader("Referer",REFERER);
xhr.send();
if(xhr.status != 200)
throw new Error;
WScript.Quit();
} catch(e) {
// エラーがある場合はエラーコードを出力し終了
WScript.Echo("blog click fail!!:" + e.description);
WScript.Quit(1);
}
]]>
</script>
</job>
XPの時はあまりOS付属の検索機能は使った事がなかったが、Vistaで速くなったと聞いたので使ってみる事にした。結論から先に書くと、確かに相当速いけど落とし穴が多い。(もしかするとおいらが知らないだけで、XPの時から同様の落とし穴はあったのかも…)。今日はその落とし穴について。
さて一般に検索を早くする仕組みにはインデックスがよく使われる。これは本に例えると毎回全ページを調べるのは面倒なので、目次(インデックス)を作っておいてそれを利用しよう!って仕組み。目次はユーザ側からここはよく検索するので作っといてねって感じで指定できる。また、一度目次が作られると、書き直しのタイミングや、定期的なメンテナンスのタイミングで、目次と本体との整合性がなるべく取れるように保たれる。Vistaの場合、書き直しのタイミングで目次も書き換えている。そして目次の作り方の設定を変えた場合も、整合性が取れなくなるので「時間かかるけど一度作り直す?」と聞いてくる。
で、その目次やらその全然関係ないはずの所に今回の落とし穴があった。
- .propertiesや.xhtml等、結構一般的な拡張子は目次対象になっていません。[コントロールパネル]→[インデックスオプション]→[詳細設定]で含めるよう設定します。(この際、ファイルの内容も含めるかはオプション)…MSにとって不要なファイルは目次にする必要もないとか…。
- 検索遅くても構わないちっちゃな目次無しのフォルダで検索を掛けると一部のファイルが見つかりません。どうも"インデックス"オプションと設定を共有しているようです。…さすがMSのネーミングは素晴らしい…。
- 上記の対策をしても、.xhtmlファイルがやっぱり検索されません。.xhtmlファイルのエンコードがUTF-8だからです。XMLもしくはHTMLとして読ませメタ情報から文字コードを伝えてやる必要があります。…でもそんな設定項目どこにもっ…てなるほどレジストリですか…。
- いえいえ、私が検索するのは英語部分ですから!…駄目です!問答無用です!全てShiftJISとして読めないファイルはMSの名の元異端者として排除されます…。
- あれ?でもまだ検索されないんですけど。…う〜ん、さすがMS…HTMLとして永続化した場合、タグやscriptの内部は気を利かせて排除してくれる。
思うに、最近の一般的なユーザはコンピュータが気を利かせてくれる環境を求めてる気がする。けど、おいら等はコンピュータは頼んだ事だけを素直にやってくれた方がいい。その方が問題が起きた時の切り分けが簡単だから。……確かに…MSはユーザの期待に応えてるだけなのかもしれない…けど、それはもしかすると、問題を自分で切り分けようとするアクティブなユーザから嫌われている原因の一つかも…と思う。この検索機能の落とし穴はなんかそれを象徴してる気がする。
パソコンを分解したり何やらかんやらで、ひさびさのブログです…そんなわけでやたら高スペックの新PCでブログを書きますが、人間のスペックは前と同じなので内容は変わらずしょぼしょぼです。
で、おNewのパソコンですが、今回のコンセプトは質より量です。つまり、メモリCPUともクロックは抑えお安くしつつ、コア数や容量を増やしました。なこんなでWindowsは32bit版だとメモリの大部分が無駄になるので64bit版を使っています。VistaBussinessやUltimateの場合CPUは二個までなので、コアも8個までが限界になりますが、サーバ機じゃないのでそこまではしません。64bit版Vistaだとソフトの互換性の問題がありますが、開発がメインのおいらには、ほぼ無関係な話です。(注:追記を参照)
こうしたコンセプトで組んだ理由なんですが、最近のソフトウェアは、複数コアや複数CPU向けに最適化されてきています。また、メモリの低価格化に伴い、なんでもかんでもメモリ上にキャッシュしておいて損は無いという考え方になってきています。で、最悪メモリが足りなくなってページフォルトを頻発して激しく遅くなります。ページフォルトが増えだしたらキャッシュ戦略を中止するとか、そういう事は不可能ではないんですが、まだそうした気を利かしてくれるソフトは少ないようです。
そんなこんなのコンセプトですが当たったようです。以前のXPパソに比べ、glassfishにデプロイしての最終テストがスムーズでいい感じになりました。


