日々の出来事やメモを残してみようと思い始めてみました。
さくらのVPS上のサーバーへの導入は非常に簡単でした。
あとはチューニングをちょこちょこやっていこうと思ってます
日々の出来事やメモを残してみようと思い始めてみました。
さくらのVPS上のサーバーへの導入は非常に簡単でした。
あとはチューニングをちょこちょこやっていこうと思ってます
[追記 11/11]
日本では先月公開されたInternet Explorer9(以下、IE9)では、JavaScriptエンジンの高速化が一つの目玉になっています。
64bit版Windowsでは、IEには32bit版と64bit版の2バージョンがインストールされているので、IE9でJavaScriptの実行速度に違いがあるのか気になったので調べてみました。
評価には以下の3つのJavaScriptベンチマークを使用しました
ブラウザはIE9 64bit、IE9 32bit、参考としてFirefox4の3つで
各ベンチマークを三回測定した平均をとりました。
64bit版IE9は32bit版と比較すると非常に遅いことが判明しました。Krakenでは応答が無くなる状態になるなど非常に時間がかかりました。どうやら64bit版のIE9ではJavaScriptエンジンの高速化が施されていないようです。
IE8での比較をしたかったのですが環境の都合により今回は出来ませんでした。
今回の結果から64bit版ではJavaScriptは遅く、さらにFlashが使えない、PDFのプラグインが使えないなどのプラグインの問題もあるため、64bit版は理由がない限りは利用には向かないと思います。
Rails Hub情報局: 禅の公案(Koan)がプログラミング学習でプチブーム
を読んでおもしろそうだったのでやってみました
このRuby koansはRubyのテストケースを通してRubyの仕様が学べるものです
http://rubykoans.com/からダウンロードして実行するだけです。
実行するとエラーが表示されるのでそれを修正していく形になります
正解していれば次のエラーが表示されるのであとはひたすら解いていくだけです
Rubyをほとんどやったことがない私ですが
nilの扱いやオブジェクトについての知識が少なからず身につきました
実行画面
修正するコード
JPドメインがDNSSECに対応したということでDNSSEC対応のDNSキャッシュサーバーの構築方法をまとめました
JPドメイン名がDNSSECに完全対応、大手レジストラ3社が1月中の対応を表明 – ニュース:ITpro
DNSSECとはゾーン情報に署名を付加することで正しいゾーン情報であるかを保証することが出来るため
DNSキャッシュポイズニングを防ぐことが出来ます。
既にBINDでDNSキャッシュサーバーを構築しているという前提で設定します
またBIND9.6.0以降が必要ですので最新版をインストールしておく必要があります
DNSキャッシュサーバーのみの場合以下の二つを行うだけです
BIND9.5以降であればデフォルトで有効になっていますが、
明示的にnamed.confのoptions内へ以下の設定を追加します
options { // 省略 dnssec-enable yes; dnssec-validation yes; };
ここの設定が一番重要です
トラストアンカーとは署名が正しいかどうかを検証するための公開鍵暗号です
トラストアンカーを登録することでゾーン情報の検証を行うことが出来ます
ルートサーバーのトラストアンカーを設定することで「信頼の連鎖」によって下位のDNS情報が保証されます
よって、各ドメインのトラストアンカーを登録する必要はなくルートサーバーのトラストアンカーを設定するだけでOKです
詳しい説明はDNSSECチュートリアル[pdf]の71ページにあります
トラストアンカーの登録方法
ルートサーバーのトラストアンカーが正しいかどうかを確認する必要があります
流れとしては
1.IANAのWebサイトからルートサーバーのトラストアンカーのハッシュ値を入手、OpenPGPで検証
2.DNSでルートサーバーのトラストアンカーを入手しハッシュ値を出力させて比較する
こうしてトラストアンカーが正しいものかを確認したうえでBINDに登録させます
以下のどちらかの方法でdnssec@iana.orgのOpenPGP公開鍵を入手します
$ 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
$ wget http://data.iana.org/root-anchors/root-anchors.xml $ wget http://data.iana.org/root-anchors/root-anchors.asc
$ 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
$ dig . dnskey | grep 257 > rootzone-dnskey
$ dnssec-dsfromkey -2 -f rootzone-dnskey . . IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A<省略> $ cat root-anchors.xml <中略> <Digest>49AAC11D7B6F6446702E54A1607371607A<省略></Digest> </KeyDigest> </TrustAnchor>
ハッシュ値が同一であることが確認できたらトラストアンカーを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を利用するリゾルバーのための トラストアンカーの設定方法について[pdf]
DNSSECチュートリアル[pdf]
[追記]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デビュー
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; } }
追記
iPhoneやiPod、一昨日発売されたiPadには無線LANが内蔵されています
自宅のアクセスポイント(以下AP)などに接続する方も多いでしょう
接続する際にパスワードを入力する場合、仮想キーボードでの入力は非常に面倒です
さらにAPのパスワードが長くユニークだったり、複数のAPを設定したい場合、
さらに複数の端末に設定する場合になると入力するのは骨が折れる作業・・・
そこで「iPhone構成ユーティリティ」を利用すると簡単に設定することが出来ます
iPhone、iPod touch、iPadの表記はiPhoneで統一してます
以下のリンクからiPhone構成ユーティリティのリンクを選び
ダウンロードしてインストールします
http://www.apple.com/jp/support/iphone/enterprise/
iPhone構成ユーティリティを起動して、
ファイルから新規構成プロファイルを選択します。
一般タブで名前を識別子を入力します
識別子は「jp.[自分の名前].wifi」などにしておきます
Wi-Fiタブを選択して構成ボタンを押します
SSIDとセキュリティの種類、パスワードを入力します
複数のAP接続を設定する場合はプラスマークのボタンをクリックすると設定を追加できます
iPhone構成ユーティリティを起動した状態でiPhoneを接続します
パスコードを設定している場合、接続した状態でロックを解除して
ホーム画面を表示した状態にします
iPhone構成ユーティリティに接続したiPhoneが表示されるので選択して
構成プロファイルタブを開きます
先程作成したプロファイルをインストールします
iPhoneに以下のような画面が表示されるので、インストールをタップすれば
(パスコードを設定している場合パスコードを入力する)
プロファイルがインストールされて設定完了です
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があるかというと、部屋が狭くて置き場がないから
常に動かすので省電力と低予算を
意識してパーツをチョイス
HDDやらドライブやらは流用した結果
2万円で済みました
| スペック | 旧 | 新 |
|---|---|---|
| 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 Vista以降からWindowsにもシンボリックリンク機能が搭載されました
シンボリックリンクとはとある場所にあるフォルダやファイルと
同じものを作成することが出来る機能です。
ショートカットと同じようなものですが、リンクを作成した場所に
実際に存在するように見せることが出来ます。
mklinkコマンドで作成します
1.コマンドプロントを管理者権限で起動します
2.mklink [リンク] [ターゲット]を実行します
リンク:リンク名を指定します
ターゲット:リンクが参照するパスを指定します
フォルダのシンボリックリンクを作成する場合は
「/D」オプションを追加します
注意点としてはパスにスペースが入っている場合などは
パスを「”」で囲んでおく必要があります。
なお、パス名の入力が面倒な場合はエクスプローラでShiftキーを押しながら
ファイルを右クリックして「パスとしてコピー」を選択した上でコマンドプロントで
貼り付ければ、簡単に入力できます。