2011-12-27

メモリ増設後のテストは Memtest86+ のみでは不十分

先日メモリを増設したら、Memtest86+ は一晩中回してもパスするものの、実用するとランダムなプロセス (主な用途はネット閲覧用なので、Chrome のプロセスが多い) がクラッシュし、30分ほどで STOP エラー(ブルースクリーン) PAGE_FAULT_IN_NONPAGED_AREA, IRQL_­NOT_­LESS_­OR_­EQUAL などが出る不安定なマシンになりました。

状況から推測するにメモリの欠陥の可能性が大なのですが、Memtest86+ によるメモリのテストにパスすることで大いに困惑しました。Memtest86+ がよくテストしてくれるのは落ち着いたメモリアクセスでも発覚するメモリの物理構造上の欠陥であって、負荷がかかったときのアクセスタイミングの誤差のような微妙なところはカバーしないテストのようです(?)

結局のところオーバークロッカー御用達のメルセンヌ素数を素数判定することでメモリと CPU 全コアにストレスをかける Prime95 を走らせたところ、1秒で不合格になるので、Transcend の不良受付係に新しいのと交換してもらい、正常動作しました。

Prime95 にはメルセンヌ素数を探し続ける壮大な計画があるようですが負荷テスト用途にはユーザー登録しなくても使えます。

リンク
Memtest86+
Free Software - GIMPS - Prime95 の公式サイト
Prime95 Download - ComputerBase - 二次配布サイト

2011-12-25

[google] Spreadsheets API のカラム名正規化について

ドキュメントにはいまいち書かれていないようですが、1行を1レコードとして、それぞれの列の第1行のカラム名が付いた名前付きのレコードとして扱う list-based-feeds において、カラム名は以下のように正規化されます。hoge-foo-bar のようなハイフン区切りのカラム名もしくは camelCase にすると良さそうです。

foo123 -> foo123
123bar -> bar
foo_bar -> foobar
foo bar(間にスペース) -> foobar
foo-bar -> foo-bar (変化なし)
fooBar -> fooBar (変化なし)
foobar(2回目) -> foobar_2

参照
Google Spreadsheets API
- Developer's Guide (v3.0) - Working with list-based feeds

OAuth 2.0 Playground

[apache] mod_rewrite を使って拡張子を省略する

mod_rewriteを使って World Wide Web Consortium (W3C) のサイトのように .html を省略できるようにする方法についての記事です。

w3.org では、たとえば、
http://www.w3.org/TR/html5/introduction
http://www.w3.org/TR/html5/introduction.html
のように.htmlを省略できます。

これを mod_rewrite で実現するためには、以下のように RewriteCond で拡張子なしのリクエストを見極めて、RewriteRuleで /foo/bar -> /foo/bar.html に rewrite すればよいようです。
詳しくは公式ドキュメント mod_rewrite - Apache HTTP Server をご覧ください。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} /[^./]+$
RewriteRule (.*) $1.html

補足
w3.org では mod_rewrite 方式ではなく、Content Negotiation が有効になっていることにより拡張子が省略できるようです。この機能はデフォルトでは有効になっておらず、以下のように有効化します。

Options +Multiviews

共有レンタルサーバーではほとんど使えるところはないかもしれません。デフォルトで有効となっていない理由はおそらくパフォーマンス劣化と非直観的動作なので、よく理解して利用すると良いと思います。

2011-12-23

Windows Installer に関する問題の修復ツールについて

Windows Installer はインストールに失敗した場合などシステムを壊さない方にロールバックしてくれますが、ごくまれに不完全なインストール状態に遷移する場合があり、いったんそうなるとインストールもアンインストールもできない困った状況に陥り大変困ります。

Microsoft もこの問題をよく認識しているらしく、強制的に問題のエントリを削除するツール Windows Installer Cleanup Utility (msicuu2.exe) をこのページで配布していたこともありました。
KB290301: How to uninstall or remove Microsoft Office 2010 suites

このソフトはインストール情報を Remove ボタン一つで壊すこともできる玄人仕様だったので、もう少し安全に配慮したアップデート版を、
診断ツール Fix it : 自動的にプログラムのインストールおよびアンインストールの問題を診断および修復する
こちらで配布しているので、これを使用すると良いようです。

この修復ツールの使い方は、基本的にはアンインストールの問題を選び、問題のソフトを選択します。ソフト名が出ていない不審なエントリ(数字とA-Fの長い文字列)も多くの場合はまずい動作を引き起こすようなので全てアンインストールの問題から選択して消せばよいです。このツールは通常のアンインストール動作に失敗すると、自動的に Windows Installer Cleanup Utility のような強制削除動作が行われるようです。

このツールが必要となるWindows Installerのエラーメッセージは、
  • 選択した機能は現在使用できないネットワークリソースにあります
  • 内部エラー 2711
  • 内部エラー 2753
などです。

2011-12-17

徳丸本プレゼント企画に当選しました

大変興味深いこちらの企画、徳丸本をブロガーに差し上げちゃうキャンペーンのお知らせ に応募させていただいたところ、本日当選のメールをいただきました!ありがとうございます。

当選したのはこちらの本です: 体系的に学ぶ 安全なWebアプリケーションの作り方
また感想も書く予定なのでよろしくお願いします。

リンク
徳丸浩の日記
ockeghem(徳丸浩)の日記
徳丸 浩 (ockeghem) は Twitter を利用しています
HASHコンサルティング株式会社

2011-12-09

[appengine] DeadlineExceededError には二種類ある

レスポンスが帰ってこないサイトに対して urlfetch.fetch をした場合などに発生する例外 DeadlineExceededError は、自分のレスポンスハンドラが制限時間を超過したときに発生させられる DeadlineExceededError と名前が同じように見えますが別のものになっています。

具体的には、urlfetchなど、API内で発生するのは、google.appengine.runtime.apiproxy_errors.DeadlineExceededError

自分のレスポンスハンドラが殺されたとき発生するのは、google.appengine.runtime.DeadlineExceededError

参考
python - Unable to handle DeadlineExceededError while using UrlFetch - Stack Overflow
svn/trunk/python/ google/appengine/runtime/__init__.py

2011-12-06

Google Libraries API はバージョンを指定して使う

jQuery など便利なライブラリを自分でサーバーを用意しなくても Google の CDN から利用可能なサービス Google Libraries API について、バージョンを厳密に指定せず自動的に最新版が降ってくるようにする指定方法には注意が必要です。

お勧めする方法
https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js

この時、Cache-Control の max-age は 1年間 になる。

お勧めしない方法1
https://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js
https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js など

この時、Cache-Control の max-age は 1時間 になる。

max-age が短縮される理由は、1.7.x で自動的に最新バージョンが選択される仕組みにより、URL に対応する内容が変化しうるからです。

もしこの URL のキャッシュをブラウザはすでに持っていたとしても、取得から 1時間後以降はサーバーへのキャッシュバリデーションリクエストの返答を確認する必要があるので、即座にキャッシュを使う動作にならず、スクリプトが利用可能となるタイミングが少し遅れてしまいます。

@norahiko によると、自動的に最新バージョンを配信する仕組みがたまに上手く動いていないようなので。

お勧めしない方法2
http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js

http:// で取得されるファイルは安全であることが保障されない (通信経路で改ざんされる恐れがある) ので使わない方が良いです。もし仮に攻撃者のスクリプトが注入されれば Web サイト内の秘密は全て無くなります。

リンク
Google Libraries API

2011-12-03

[windows] 圧縮フォルダの関連付けを修復する

zipをフォルダのようにエクスプローラで見れなくなるなど、関連付けが壊れてしまったときは、こちらのサイトに置いてあるzip用のregファイルを取り込むと大抵元に戻るようです。

導入されるレジストリ断片は見たところ問題ないようですが、各自の責任の下で内容(テキスト形式なので読めます)をチェックしてください。

File association fixes for Windows Vista
File Association Fixes for Windows 7

Windows XPの場合は以下の手順で修復できるとのことです。
Q: CAB と ZIP を Windows 標準の関連付けに戻すには?