2011/05/21

Bloggerでエクスポート/インポートするとURLが変わる

ちょっとブログの記事をまとめて変更したいことがあったので、エクスポート->記事を全て削除->エクスポートしたXMLを編集->インポート をしたら記事のURLが変更されてしまった....。
記事の中の記事へのリンクも手動で変更するハメに。
しばらくGoogleのインデックスも更新されないし、やらなきゃ良かった。

2011/05/17

Android DNSの設定を変更する

bionic libcのソースコードとドキュメントを見て以下のことがわかった。

net.dns[n].[pid] => net.dns[n] => /etc/resolv.conf
の順番でDNSを見る。

[n] : 1-8
[pid] : プロセスID


* プロセス毎の設定

system propertyのnet.dns[n].[pid]で、プロセス毎にDNSの設定ができるようになっている。
この設定が対象のプロセスにおいて見つかった場合、nが一致するnet.dns[n] は使われない。
Androidの開発においてはよほど特殊なことをしない限り、プロセス毎の設定を利用することはないだろう。


* グローバルな設定

1. net.dns[n]にDNSのIPアドレスを設定する。
2. net.dnschange の値を現在値とは別の整数値に設定する。通常この値はインクリメントされている。

net.dnschange (ここではカウンターと呼ぶことにする)はnet.dns#が変更されたことを検知するための整数値。
前回DNS Queryを発行しようとしたときと異なる値のとき、net.dns#が再読み込みされる。
libcが覚えるカウンター値はstatic変数なので、プロセスごとにカウンターによるDNS更新の判断を行っている。
javaでの実装方法は、ConnectivityServiceが参考になる。


* 補足

WiFiや3GをONにすると、net.[interface name].dns[n] が変更されて、その値の1つが net.dns[n] に設定される。

/etc/resolv.conf も見る実装がソースには残っていたが、#ifdef ANDROID_CHANGES によって除外されていた。

以下、覚書として"dns"を含むsystem propertyを挙げる。


$ adb shell getprop | grep dns
[net.change]: [net.dnschange]
[net.dns1]: [192.168.3.254]
[net.rmnet0.dns1]: [202.32.159.24]
[net.rmnet0.dns2]: [210.128.58.10]
[net.dns2]: []
[net.dnschange]: [118]
[dhcp.eth0.dns1]: [192.168.3.254]
[dhcp.eth0.dns2]: []
[dhcp.eth0.dns3]: []
[dhcp.eth0.dns4]: []
[net.eth0.dns1]: [192.168.3.254]
[net.eth0.dns2]: []
[net.dns3]: []

2011/05/16

Androidでb-mobile Fair 15日間の通信量

5/1-5/15の使用量: 28MB

連休中に出かけることが少なかったとはいえ、少なすぎる...。
目標値の3分の1以下。日中に節約しすぎた。
仕事中にメールは見ないので、休憩時間以外は3Gを切っていた。

主な用途はメール・ブラウザ・RSSリーダー。
RSSリーダーでのフィードの取得はWiFiで行っていた。
なので、通勤中のメールとブラウザの使用が主な内訳。

しかしまあ、あと105日使えるのだから、気分は良い。
4ヶ月/500MB/¥5000 という少しだけ割高なライトプランを出しても売れるのではなかろうか。

2011/05/14

AndroidのProxy設定のないアプリにProxyを越えさせる(HTTP+少しHTTPS)

DeleGateとwebnamedを使い、Proxy設定のないアプリでファイアウォールを越えてHTTP/HTTPS通信することに成功した。

こちらのブログを参考にさせてもらった。
DeleGateとwebnamedのネットワーク構成は"AndroidのProxy設定のないアプリにProxyを越えさせる(HTTPのみ)"に書いた図の、squidがDeleGateに置き換わったもの。

文末にDeleGateのinit scriptを示す。
参考元のスクリプトと主に違うところは、

- chkconfigに対応している
- DeleGateが参照するDNSサーバをwebnamedノードにしている
(192.168.3.10 がwebnamed、192.168.3.20:80 がProxy)

さて、題名に"少しHTTPS"とある理由だが、DeleGateのSSL透過プロキシ機能はman-in-the-middleな仕組みなので、サーバ証明書の検証をスキップする機能があるアプリでないと、HTTPSを使えない。

Dolphin Browserを試したところ、HTTPSでアクセスすると"アクセスしようとしているサーバ名が証明書と違うがどうするか?"という意味の警告が表示され、そのままページを開くかどうか選択できる。Gmailを開くことができた。
NewsRobはGoogle Readerから同期する際にExceptionが発生して、同期することができなかった。後日他のRSS Readerを試してみようと思う。

/etc/init.d/delegate:

#!/bin/sh
# chkconfig: 345 98 20
# description: delegate server
# processname: delegated

DAEMON=/usr/local/bin/delegated
DGROOT=/var/spool/delegate
DELEGATE_PORT=8080
PROXY_HOST=192.168.3.20
PROXY_PORT=80
DNS_SERV=192.168.3.10

test -x $DAEMON || exit 0

start_proc() {
$DAEMON DGROOT=$DGROOT -P$DELEGATE_PORT \
PROXY="$PROXY_HOST:$PROXY_PORT:*" \
PERMIT="http,https:*:*" \
REMITTABLE=http,https \
STLS=mitm \
RELAY=vhost RES_NS="$DNS_SERV,END"
}

stop_proc() {
$DAEMON DGROOT=$DGROOT -P$SRC_PORT -Fkill
}

case "$1" in
start)
start_proc
;;
stop)
stop_proc
;;
restart)
stop_proc
if [ "$?" != "0" ]; then
exit 1
fi
start_proc
;;
*)
echo "Usage: $0 start|stop|restart"
exit 1
;;
esac

2011/05/12

rgrepでソースコードを検索する

私はC/Javaのソースコードを検索するときvim/eclipse/ctags/globalを使うが、ソースコードを解析するときに比較的rgrepを使うことが多い。

git/svnレポジトリから取得したソースコードを検索するときのために、以下のaliasを定義している。


alias rgrep='rgrep --exclude="*\.o" --exclude="*\.class" --exclude="*\.dex" --exclude="*\.swp" --exclude="tags" --exclude="GTAGS" --exclude="GSYMS" --exclude="GRTAGS" --exclude="GPATH" --exclude-dir="*\.git" --exclude-dir="*\.svn"'

2011/05/10

HTC Desire - CyanogenMod 6.1.1のバッテリー消費量(WiFi)

以下の状態において、8時間で100%=>%94 だった。
意外と減り幅が少ない印象。

- Wifi ON, 3G OFF
- K9-Mail : IMAP Idle 2アカウント, メール1件取得して6時間LED点滅
- NewsRob : 1時間毎の同期、100件くらい自動取得
- なまず速報β (速報なし)


#追記 5/11

以下の使い方で、100%=>70%

- 7.5時間WiFi、NewsRobで220件くらい自動取得、ほとんどスリープ状態
- 3時間3G、1.5時間ほどNewsRobやブラウザを使う。
- 通信量: WiFi 3.9MB、3G 4.0MB

2011/05/09

AndroidのProxy設定のないアプリにProxyを越えさせる(HTTPのみ)

ここで紹介する方法は動作はするが役立つ場面が少ない。

squid透過プロキシとProxy越えをするDNS Serverを使って、プロキシ設定のできないアプリにファイアウォールを越えさせることに成功した。

ただし、squid透過プロキシの仕組み上、HTTPSは通すことができない。squid 3.1のssl-bumpというman-in-the-middleな機能を使うとできそうだが、制約が大きそうなのでやらない。
HTTPSを通せないので、大抵HTTPSが必要なアカウント認証するWebアプリが使えないのが痛い。

これだけやってもHTTPのみ...。
はっきり言って、プロキシ設定ができるOpera Mobileだけの方が役に立つ。

以下、検証した構成。
Androidからsquidへは、iptables で80 portをsquidのホストの3128 portへリダイレクトした。

#追記 5/14
その後、squidの代わりにDeleGateを使ってHTTPSを通すことに成功した。


                       +-----------------------+
                       |  android smart phone  |
                       +-----------------------+
                          |                |
                          | DNS query      | http
                          v                v 
                    +----------+     +-------------+
                    | webnamed |     |   squid     |
                    +----------+     |(transparent)|
                          |  |       +-------------+
                DNS query |  |  http        |
                          v  +---------+    | http
                    +------------+     |    |
                    | DNS Server |     |    |
                    +------------+     v    v 
                                     +-------------+
                                     | http proxy  |
                                     |  firewall   |
                                     +-------------+
                    +--------------+   |    |
                    | resolver.cgi |<--+    | http
                    +--------------+        v
                           |         |-------------+
                 DNS query |         |   web site  |
                           v         +-------------+
                    +------------+
                    | DNS Server |
                    +------------+