Archive for 3月 2011

Android エミュレータの DNS 設定 — その2

前回の記事に書いた Android エミュレータにおける DNS 設定の件で、さらに理解できたことがあったのでメモ。プライマリの DNS サーバが落ちて名前解決が出来ていないときの状況では、net.dns1 の値が 10.0.2.3 になっているものの、net.dns2 には何も値が設定されていなかったことは前回にも書いた。

$ adb shell
# getprop net.dns1
getprop net.dns1
10.0.2.3
# getprop net.dns2
getprop net.dns2

#

たまたま入手した「ANDROID HACKS」(オライリー・ジャパン)によると、ここに出てくる 10.0.2.3 から 10.0.2.6 までの IP アドレスは、ホストマシンが参照している DNS サーバのエイリアスになっていることが分かった。したがって上記の状態ではホストマシンのプライマリに設定してある DNS しか参照しないことになり、該当する DNS サーバが落ちていたりすると名前解決が出来なくなってしまう。しかし net.dns2 に 10.0.2.4 を設定しておけば、ホストマシンのセカンダリ DNS 設定を参照するようになり、結果的に名前解決が可能になる。

#setprop net.dns2 10.0.2.4
setprop net.dns2 10.0.2.4
#

実際にこの手順で問題が解決したことを確認できた。ただしこのままだとプライマリの DNS が落ちているときは常に手動での設定操作が必要になり煩わしい。net.dns2 の値を恒常的に設定しておく方法を探す必要がある。

Android エミュレータの DNS 設定

突然にAndroid エミュレータがインターネットへ接続できなくなってしまった。調べたところまさに同じ状況についてのブログ記事があった。

Androidのエミュレータがネットワークに接続できない場合の対処方法

この記事によると、何らかの要因で DNS にアクセス出来なくなっているようで、手動で明示的に DNS を設定してやれば解決することが分かった。ちなみに自分のところでは net.dns1 だけ値(10.0.2.3)が設定されており、net.nds2 には何も設定されていなかった。上記のブログ記事のように Google の DNS を設定すると、確かにインターネット接続が可能になった。

ただ、これまではこんなことをしなくてもそのまま接続できていたのが、急に繋がらなくなったのが気になった。そこで本家ドキュメントを探してみると、Android エミュレータについての情報を見つけた。

Using the Android Emulator

このページの中盤あたりにある “Configuring the Emulator’s DNS Settings” によると、エミュレータはその実行環境で設定されている DNS を使うようになっている。問題のエミュレータは Windows7 上で動いているのだが、この Windows7 が名前解決に使っているプライマリの DNS サーバは、このところの計画停電に対応するため電源を落としていた。どうもこのことが名前解決できなくなった原因のようだ。

もちろん Windows7 環境では複数の DNS サーバを参照するように設定してあるので、プライマリの DNS サーバが無くてもまったく問題はない。当然 Android エミュレータも、親環境と同じセカンダリ以降の DNS を参照すればよいはず。しかしどうもこのあたりに問題があるようで、プライマリの DNS にアクセスできないと、Android エミュレータは名前解決できなくなってしまうようだ。前述のドキュメントによると Windows 環境では DNS 情報を GetNetworkParams() API によって獲得するとある。この API が複数 DNS に対応していないことは考えにくいので、恐らく Android エミュレータが複数 DNS 情報の扱いが出来ていないと思われる。

jQuery を使って checkbox の上限選択数を制御する

HTML フォームの checkbox を選択できる上限を任意に設定するための処理を jQuery で書いてみた。指定数以上を選択したとき alert() でダイアログボックスを出す例はたくさんあるようだが、ここではダイアログボックスを出さずに選択済みのものをひとつ減らすようにしている。ダイアログボックスが出ないので、上限値を越えたときの選択操作が楽だと思う。

HTML の記述は次のようになる。class や id 属性の値はこのサンプルと同じである必要はなくて自由に設定して構わない。また name 属性はこの処理では使っていない。

<input type=”checkbox” class=”chkbox_cls” id=”chkbox_0″ name=”chkbox” value=”foo” onclick=”ltd_chkbox(this)” />foo
<input type=”checkbox” class=”chkbox_cls” id=”chkbox_1″ name=”chkbox” value=”bar” onclick=”ltd_chkbox(this)” />bar
                :
<input type=”checkbox” class=”chkbox_cls” id=”chkbox_N” name=”chkbox” value=”baz” onclick=”ltd_chkbox(this)” />baz

それぞれの checkbox における onclick イベント発生時に呼び出すのが次の JavaScript 関数。変数 limit_len に選択可能な上限数を設定しておく。サンプルでは 3 としているので、仮に checkbox が 10 個あったとしても 3 個以上はチェックできない。4 個めをチェックするとすでにチェック済みのものから 1 個のチェックが自動的に外れる。コード中に jQuery() と記述している部分は、もちろん $() としても構わない。

function ltd_chkbox(obj) {
  var limit_len = 3;   # 選択可能な上限値
  var attr_name = ‘.’ + jQuery(obj).attr(‘class’) + ‘:checked’;
  var checked_len = jQuery(attr_name).length;

  var tail = false;
  for (var i = 0; i < checked_len; i++) {     if (jQuery(jQuery(attr_name)[i]).attr('id') == jQuery(obj).attr('id')         && i == checked_len - 1) {       tail = true;     }   }   if (checked_len > limit_len) {
    var idx = tail ? 0 : checked_len – 1;
    jQuery(jQuery(attr_name)[idx]).attr(‘checked’, false);
  }
}