unboundをインストールしてみる

ローカルにキャッシュサーバを立ててみるとブラウジングの速度も結構変わるのかな、と思い、unboundを入れてみた。OSは Mac OS X 10.7.4。インストール自体は MacPortsから簡単に実行できる。

MacBookAir:work fumi$ sudo port install unbound
---> Computing dependencies for unbound
---> Dependencies to be installed: ldns openssl zlib
---> Fetching archive for zlib
---> Attempting to fetch zlib-1.2.7_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/zlib
---> Attempting to fetch zlib-1.2.7_0.darwin_11.x86_64.tbz2.rmd160 from http://packages.macports.org/zlib
---> Installing zlib @1.2.7_0
---> Activating zlib @1.2.7_0
---> Cleaning zlib
---> Fetching archive for openssl
---> Attempting to fetch openssl-1.0.1c_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/openssl
---> Attempting to fetch openssl-1.0.1c_0.darwin_11.x86_64.tbz2.rmd160 from http://packages.macports.org/openssl
---> Installing openssl @1.0.1c_0
---> Activating openssl @1.0.1c_0
---> Cleaning openssl
---> Fetching archive for ldns
---> Attempting to fetch ldns-1.6.13_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/ldns
---> Attempting to fetch ldns-1.6.13_0.darwin_11.x86_64.tbz2.rmd160 from http://packages.macports.org/ldns
---> Installing ldns @1.6.13_0
---> Activating ldns @1.6.13_0
---> Cleaning ldns
---> Fetching archive for unbound
---> Attempting to fetch unbound-1.4.17_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/unbound
---> Attempting to fetch unbound-1.4.17_0.darwin_11.x86_64.tbz2.rmd160 from http://packages.macports.org/unbound
---> Installing unbound @1.4.17_0
---> Activating unbound @1.4.17_0
---> Cleaning unbound
---> Updating database of binaries: 100.0%
---> Scanning binaries for linking errors: 100.0%
---> No broken files found.

続いて自動起動の設定。

$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.unbound.plist

最後に起動。

$ sudo launchctl start org.macports.unbound

後は、Mac側のシステム環境設定で DNSサーバの設定に 127.0.0.1を追加してやれば完了。

で、しばらく digで様子を見てみたけど、意外に世の中の TTLって短いことに気づく。86400がデフォかと勝手に思っていたけど、ほとんどそれ以下。なので、頻繁にアクセスしていればキャッシュの意味もあるけど、TTLより長い間隔でアクセスするような場合はキャッシュの意味がない。

そんなに頻繁にブラウズする訳でもないので、キャッシュサーバをローカルで持つ意味ってあんまりないかなあと思ったけど、せっかくなのでこのまま続けることにして、TTLをunbound側で制御できないかと思い調べてみると、cache-ttl-minでキャッシュの最低時間を指定できるようなのでとりあえず 3600秒に設定してみた。まあこれだと本当にアドレスが変わった場合は最低1時間は追随できないけど、その辺は目をつぶってキャッシュによる高速化を優先することにしたい。

$ cd /opt/local/etc/unbound/
$ sudo cp unbound.conf-dist unbound.conf
$ sudo vi unbound.conf

で、

[crayon]
# the time to live (TTL) value lower bound, in seconds. Default 0.
# If more than an hour could easily give trouble due to stale data.
# cache-min-ttl: 0
cache-min-ttl: 3600
[/crayon]

こんな感じ。編集後は

$ sudo launchctl stop org.macports.unbound

でプロセス再起動。stopとあるのは打ち間違いじゃないです。

Google Developer Day 2011 Quiz(5) 落選のお知らせ

落選のお知らせが来た。100点ジャストはだめということね。つーかそれならはじめからスライドパズル一問にしてくれればいいのに。

Google Developer Day 2011 Quiz(4) 一人ゲーム

次は一人ゲーム。これは最初、論理的に最小値を求めるロジックがあるのかと思ってさんざん考えたけど、思いつかなかったのであきらめて総当りで計算することにした。

ロジックは、すべての要素が0になるまで2で割り続ける→そのうち5で割り切れるものが 1つでもあればそのセットを覚える→そのセットのコンビネーションを計算→そのうち、結果的にすべての要素が5で割り切れていれば、その手数を覚える。→覚えた手数のうち最小のものが答え、という感じにした。

言語はrubyで書いた。コンビネーションのメソッドはググッてヒットしたものを使わせて頂きました。

#!/usr/bin/env ruby

class Array
 def combination(num)
   return [] if num < 1 || num > size
   return map{|e| [e] } if num == 1
   tmp = self.dup
   self[0, size - (num - 1)].inject([]) do |ret, e|
     tmp.shift
     ret += tmp.combination(num - 1).map{|a| a.unshift(e) }
   end
 end
end

def devide(depth, master, ary)

 ary4 = ary.collect{|k| if (k % 5 == 0) then 1 else 0 end}
 master << ( [depth ] << ("0b" + ary4.join).oct )

 ary2 = ary.collect{|i| i / 2 }
 ary3 = ary2.select{|j| j == 0}

 if ary3.size != ary2.size
   depth = depth + 1
   devide(depth, master, ary2)
 end
 return master
end

def solver(num, ary)

  master=[]
  depth=0

  master = devide(depth, master, ary)
  min = master.size + 1

  master.reject! {|x| x[1] == 0}

  1.upto(master.size){|i|
    combi = master.combination(i)
    combi.each{|j|
      mask = 0
      maxc = 0
      j.each{|k|
        mask = mask | k[1]
        if( k[0] > maxc )
          maxc = k[0]
        end
      }
      if ( ((2 ** ary.size) - 1) == mask )
        if ( min > maxc + j.size)
          min = maxc + j.size
        end
      end
    }
  }
  puts min
end

body=File.open(ARGV[0]).readlines

1.upto(body[0].to_i){|i|
  solver(body[i * 2 - 1 ].chop, body[i * 2].split("\s").collect{|j| j.to_i})
}

ary2とか3とか 4とかいうのが非常に汚い。

Google Developer Day 2011 Quiz(2)

一人ゲームクリア。枝刈りはせずに基本的に総当りチェック。これでようやく 100点達成。しかしながらスコア分布を見ると見事に100点台に集中。これではまったくふるい分けにはならないだろうなあ。せめて分野別クイズを傾斜配点にすれば少しはましになったと思うのだけど。ここまできてスライドパズルの得点者も急激に増えるとも思えないし、どう参加者を決めるのか、Googleの人も大変そう。

Google Developer Day 2011 Quiz

もはや恒例となりつつある DevQuiz。ウォームアップクイズと分野別クイズ 1問(Web Game)しかやってないのだけど、ついにこの週末でボーダラインに抜かれてしまった。もう一問解かないとだめか。というか分野別クイズは難易度関係なく、同じ配点というのがなあ。

自分の感覚だと難しい順に

一人ゲーム>Web Game=Go!>>>Google Apps Script>>>Android

な感じ。