64bit版Internet Explorer9ではJavaScriptの実行速度が遅い?

[追記 11/11]

  • Krakenのベンチマークにおいてグラフの表記に間違いがありましたので修正しました
  • FlashPlayer11で64bit版がリリースされたため最後の文章を修正しました

日本では先月公開されたInternet Explorer9(以下、IE9)では

JavaScriptエンジンの高速化が一つの目玉になっています。

64bit版Windowsでは、IEには32bit版と64bit版の2バージョンがインストールされているので

IE9でJavaScriptの実行速度に違いがあるのか気になったので調べてみました。

テスト方法

評価には以下の3つのJavaScriptベンチマークを使用しました

ブラウザはIE9 64bit、IE9 32bit、参考としてFirefox4の3つで

各ベンチマークを三回測定した平均をとりました。

結果

SunSpider0.9.1

f:id:carme-264pp:20111111194624p:image

V8 Benchmark Suite

f:id:carme-264pp:20111111194625p:image

Kraken

f:id:carme-264pp:20111111194626p:image

まとめ

64bit版IE9は32bit版と比較すると非常に遅いことが判明しました。

Krakenでは応答が無くなる状態になるなど非常に時間がかかりました。

どうやら64bit版のIE9ではJavaScriptエンジンの高速化が施されていないようです。

IE8での比較をしたかったのですが環境の都合により今回は出来ませんでした。

今回の結果から64bit版ではJavaScriptは遅く、

さらにFlashが使えない、PDFのプラグインが使えないなどのプラグインの問題もあるため、

64bit版は理由がない限りは利用には向かないと思います

Ruby koansでRubyを学ぶ

Rails Hub情報局: 禅の公案(Koan)がプログラミング学習でプチブーム

を読んでおもしろそうだったのでやってみました

このRuby koansはRubyのテストケースを通してRubyの仕様が学べるものです

http://rubykoans.com/からダウンロードして実行するだけです。

実行するとエラーが表示されるのでそれを修正していく形になります

正解していれば次のエラーが表示されるのであとはひたすら解いていくだけです

Rubyをほとんどやったことがない私ですが

nilの扱いやオブジェクトについての知識が少なからず身につきました

f:id:carme-264pp:20110201224338p:image

実行画面

f:id:carme-264pp:20110201224339p:image

修正するコード

DNSSEC対応キャッシュサーバー構築

JPドメインがDNSSECに対応したということでDNSSEC対応のDNSキャッシュサーバーの構築方法をまとめました

JPドメイン名がいよいよDNSSECに対応 - @IT

JPドメイン名がDNSSECに完全対応、大手レジストラ3社が1月中の対応を表明 – ニュース:ITpro

DNSSECとはゾーン情報に署名を付加することで正しいゾーン情報であるかを保証することが出来るため

DNSキャッシュポイズニングを防ぐことが出来ます。

既にBINDでDNSキャッシュサーバーを構築しているという前提で設定します

またBIND9.6.0以降が必要ですので最新版をインストールしておく必要があります

DNSSECに対応させるには?

DNSキャッシュサーバーのみの場合以下の二つを行うだけです

  • DNSSECの有効化
  • トラストアンカーの登録

DNSSECの有効化

BIND9.5以降であればデフォルトで有効になっていますが、

明示的にnamed.confのoptions内へ以下の設定を追加します

options {
// 省略
dnssec-enable yes;
dnssec-validation yes;
};

トラストアンカーの登録

ここの設定が一番重要です

トラストアンカーとは署名が正しいかどうかを検証するための公開鍵暗号です

トラストアンカーを登録することでゾーン情報の検証を行うことが出来ます

ルートサーバーのトラストアンカーを設定することで「信頼の連鎖」によって下位のDNS情報が保証されます

よって、各ドメインのトラストアンカーを登録する必要はなくルートサーバーのトラストアンカーを設定するだけでOKです

詳しい説明はDNSSECチュートリアル[pdf]の71ページにあります

トラストアンカーの登録方法

ルートサーバーのトラストアンカーが正しいかどうかを確認する必要があります

流れとしては

1.IANAのWebサイトからルートサーバーのトラストアンカーのハッシュ値を入手、OpenPGPで検証

2.DNSでルートサーバーのトラストアンカーを入手しハッシュ値を出力させて比較する

こうしてトラストアンカーが正しいものかを確認したうえでBINDに登録させます

1.OpenPGPの公開鍵を入手する

以下のどちらかの方法でdnssec@iana.orgのOpenPGP公開鍵を入手します

  • Webサーバーから直接入手する場合
$ wget http://data.iana.org/root-anchors/icann.pgp
$ gpg --import icann.pgp
  • 鍵サーバーから入手する場合
$ gpg --search-keys --keyserver pgp.mit.edu dnssec@iana.org
gpg: “dnssec@iana.org”をhkpサーバーpgp.mit.eduから検索
(1)     DNSSEC Manager <dnssec@iana.org>
1024 bit DSA key 0F6C91D2, 作成: 2007-12-01
Keys 1-1 of 1 for "dnssec@iana.org".  番号(s)、N)次、またはQ)中止を入力してください >1
gpg: 鍵0F6C91D2をhkpからサーバーpgp.mit.eduに要求
gpg: /home/carme/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵0F6C91D2: 公開鍵“DNSSEC Manager <dnssec@iana.org>”を読み込みました
gpg: 絶対的に信用する鍵が見つかりません
gpg: 処理数の合計: 1
gpg:               読込み: 1

2.IANAからハッシュデータと署名データを入手する
$ wget http://data.iana.org/root-anchors/root-anchors.xml
$ wget http://data.iana.org/root-anchors/root-anchors.asc

3.署名を検証する
$ gpg --verify root-anchors.asc root-anchors.xml
gpg: 2010年07月07日 07時49分10秒 JSTにDSA鍵ID 0F6C91D2で施された署名
gpg: “DNSSEC Manager <dnssec@iana.org>”からの正しい署名
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg:          この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: 2FBB 91BC AAEE 0ABE 1F80  31C7 D1AF BCE0 0F6C 91D2

4.DNSでルートサーバーのDNSKEYを入手する
$ dig . dnskey | grep 257 > rootzone-dnskey

5.ハッシュ値を出力してroot-anchors.xmlのハッシュ値と比較する
$ dnssec-dsfromkey -2 -f rootzone-dnskey .
. IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A<省略>
$ cat root-anchors.xml
<中略>
<Digest>49AAC11D7B6F6446702E54A1607371607A<省略></Digest>
</KeyDigest>
</TrustAnchor>

6.named.confにトラストアンカーを登録する

ハッシュ値が同一であることが確認できたらトラストアンカーをnamed.confに記述します

rootzone-dnskeyからキー部分(下線部分)を抜き出しキー部分を””で囲みます

.        63810   IN      DNSKEY  257 3 8 AwEAAagAIKlVZrpC6I<省略>

抜き出した部分をnamed.confに以下のように記述します(太字が抜き出し部分)

trusted-keys {
"."    257 3 8
"AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29e
<中略>nNnulq QxA+Uk1ihz0=";
};

named-checkconfで設定に問題がないか確認したらnamedを再起動させます

動作確認

digコマンドを使ってDNSSECの検証が出来ているかを確認します

$ dig @127.0.0.1 +dnssec .
; <<>> DiG 9.7.0-P1 <<>> @127.0.0.1 +dnssec .
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 953
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1

adフラグは署名が検証できたデータであることを示すもので

これが表示されていれば正しく動作しています

jpドメインもちゃんと対応していることが確認できます

$ dig @127.0.0.1 +dnssec jp
; <<>> DiG 9.7.0-P1 <<>> @127.0.0.1 +dnssec jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28396
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1

参考文献

DNSSEC関連情報 / JPRS

DNSSECを利用するリゾルバーのための トラストアンカーの設定方法について[pdf]

DNSSECチュートリアル[pdf]

NumberMagicEasyリベンジ編

[追記]10/24 1:39 タイトル修正、表の修正

前回書いたコードがあまりにもひどいのでやり直してみました。

入力される文字列に対しての数値に注目すると、以下のようなことが分かります。

入力 出力 入力 出力
YYYY 1 NYYY 9
YYYN 2 NYYN 10
YYNY 3 NYNY 11
YYNN 4 NYNN 12
YNYY 5 NNYY 13
YNYN 6 NNYN 14
YNNY 7 NNNY 15
YNNN 8 NNNN 16

よく見てみると入力をY=0、N=1として見ると2進数を10進数で返していることが分かります。

上の表を”0″,”1″で置換してみるとこうなります。

入力 出力 入力 出力
0000 1 1000 9
0001 2 1001 10
0010 3 1010 11
0011 4 1011 12
0100 5 1100 13
0101 6 1101 14
0110 7 1110 15
0111 8 1111 16

ということで、プログラムの流れとしては、

入力された文字列を1と0に置き換え
↓
10進数に変換
↓
1増やして返す

となります。

で、実装するとこうなります。

public class NumberMagicEasy {
public int theNumber(String answer) {
answer = answer.replace('Y', '0');
answer = answer.replace('N', '1');
return Integer.parseInt(answer, 2) + 1;
}
}

前回のものと比べるとかなりシンプルになりました。

これは翌朝の通学中に気付いたわけですが、

TopCoderでは回答時間内にこういったことを考えコードを書いているので

わたしはまだまだですね。

前回のコードを書いた奴を殴りたい。

Topcoderをやってみた

Topcoderデビュー

NumberMagicEasyという問題に挑戦。

言語はJavaでやってみました。

Eclipse + JUnitでデバッグしながら何とか完成。

我ながら酷いコードだと思います

public class NumberMagicEasy {
private final static int[][] cards = { { 1, 2, 3, 4, 5, 6, 7, 8 },
{ 1, 2, 3, 4, 9, 10, 11, 12 },
{ 1, 2, 5, 6, 9, 10, 13, 14 },
{ 1, 3, 5, 7, 9, 11, 13, 15 } };
private int[] hit = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
private int[] no = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
public int theNumber(String answer) {
int n = 0;
while (n < answer.length()) {
if (answer.startsWith("Y", n)) {
for (int i = 0; i < 8; ++i) {
hit[cards[n][i] - 1]++;
}
} else if (answer.startsWith("N", n)) {
for (int i = 0; i < 8; ++i) {
no[cards[n][i] - 1]++;
}
}
n++;
}
for (int i = 0; i < hit.length; ++i) {
if (hit[i] > 0 && no[i] == 0) {
return i + 1;
}
}
return 16;
}
}

追記

NumberMagicEasyリベンジ編へ続く

iPhoneやiPod touchの無線LANのパスワードを簡単に入力する方法

iPhoneやiPod、一昨日発売されたiPadには無線LANが内蔵されています

自宅のアクセスポイント(以下AP)などに接続する方も多いでしょう

接続する際にパスワードを入力する場合、仮想キーボードでの入力は非常に面倒です

さらにAPのパスワードが長くユニークだったり、複数のAPを設定したい場合、

さらに複数の端末に設定する場合になると入力するのは骨が折れる作業・・・

そこで「iPhone構成ユーティリティ」を利用すると簡単に設定することが出来ます

やり方

iPhone、iPod touch、iPadの表記はiPhoneで統一してます

  • iPhone構成ユーティリティをダウンロードとインストール

以下のリンクからiPhone構成ユーティリティのリンクを選び

ダウンロードしてインストールします

http://www.apple.com/jp/support/iphone/enterprise/

f:id:carme-264pp:20100530155437p:image

  • iPhone構成ユーティリティに無線LANの設定を書き込む

iPhone構成ユーティリティを起動して、

ファイルから新規構成プロファイルを選択します。

一般タブで名前を識別子を入力します

識別子は「jp.[自分の名前].wifi」などにしておきます

f:id:carme-264pp:20100530160959p:image

Wi-Fiタブを選択して構成ボタンを押します

SSIDとセキュリティの種類、パスワードを入力します

複数のAP接続を設定する場合はプラスマークのボタンをクリックすると設定を追加できます

f:id:carme-264pp:20100530162252p:image

  • iPhoneを構成ユーティリティをインストールしたマシンに接続する

iPhone構成ユーティリティを起動した状態でiPhoneを接続します

パスコードを設定している場合、接続した状態でロックを解除して

ホーム画面を表示した状態にします

iPhone構成ユーティリティに接続したiPhoneが表示されるので選択して

構成プロファイルタブを開きます

先程作成したプロファイルをインストールします

f:id:carme-264pp:20100530163745p:image

iPhoneに以下のような画面が表示されるので、インストールをタップすれば

(パスコードを設定している場合パスコードを入力する)

プロファイルがインストールされて設定完了です

f:id:carme-264pp:20100530163746j:image

JAXBでのXMLファイル入出力クラス

JAXBContextを使用したXMLの読み書きクラスと、

XMLSchemaのサンプルです。

XMLSchemaファイルをXJCでコンパイルしておくこと

XmlReader.java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.hoge.xml.MemberList;
public class XmlReader {
private String filename;
private JAXBContext jaxbc;
XmlReader(String xmlFileName) throws JAXBException {
this.filename = xmlFileName;
jaxbc = JAXBContext.newInstance(MemberList.class);
}
public MemberList readListXml() throws JAXBException, IOException {
InputStream listIs = new FileInputStream(filename);
Unmarshaller um = jaxbc.createUnmarshaller();
MemberList list = (MemberList) um.unmarshal(listIs);
listIs.close();
return list;
}
public void writeListXml(MemberList getList) throws JAXBException, IOException {
OutputStream os = new FileOutputStream(filename);
Marshaller mu = jaxbc.createMarshaller();
mu.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
mu.marshal(getList, os);
os.close();
}
}

memberList.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="memberList">
<xsd:complexType>
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="member" type="memberType" />
</xsd:sequence>
<xsd:attribute ref="listName" />
</xsd:complexType>
</xsd:element>
<xsd:complexType name="memberType">
<xsd:sequence>
<xsd:element ref="name" />
<xsd:element ref="joinDate" />
<xsd:element ref="url" />
<xsd:element ref="comment" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="name" type="xsd:string" />
<xsd:element name="joinDate" type="xsd:date" />
<xsd:element name="url" type="xsd:anyURI" />
<xsd:element name="comment" type="xsd:string" />
<xsd:attribute name="listName" type="xsd:string" />
</xsd:schema>

やっつけです。はい

ゴールデンウィークにPCを組んだ

衝動でベット下のPCを組み替えました

なんでベットの下にPCがあるかというと、部屋が狭くて置き場がないから

常に動かすので省電力と低予算を

意識してパーツをチョイス

HDDやらドライブやらは流用した結果

2万円で済みました

f:id:carme-264pp:20100502183423j:image

スペック
CPU Athlon64 3200+ AthlonII x2 240e
Mem DDR-3200 512MB×2 DDR3-1066 1GB
VGA GeforceFX 5200 Radeon 4200(785G)

CPUはTDP67Wから45Wのものに

VGAもオンボードに

Web鯖やら立てたりしないのでメモリーは1GBで

まだDDR3は高いので(; ̄ー ̄A

OSはUbuntu9.10のまま

組み替え後

以前のPCに比べて排熱が減りました!

いままで8cmのケースファンがうるさかったのですが

マザーボードが速度をコントロールしてくれるので

回転数が落ちてとても静かになりました。

めでたし、めでたし

Windowsでシンボリックリンクを作成する

Windows Vista以降からWindowsにもシンボリックリンク機能が搭載されました

シンボリックリンクとはとある場所にあるフォルダやファイルと

同じものを作成することが出来る機能です。

ショートカットと同じようなものですが、リンクを作成した場所に

実際に存在するように見せることが出来ます。

作成方法

mklinkコマンドで作成します

1.コマンドプロントを管理者権限で起動します

2.mklink [リンク] [ターゲット]を実行します

リンク:リンク名を指定します

ターゲット:リンクが参照するパスを指定します

フォルダのシンボリックリンクを作成する場合は

「/D」オプションを追加します

注意点としてはパスにスペースが入っている場合などは

パスを「”」で囲んでおく必要があります。

なお、パス名の入力が面倒な場合はエクスプローラでShiftキーを押しながら

ファイルを右クリックして「パスとしてコピー」を選択した上でコマンドプロントで

貼り付ければ、簡単に入力できます。