Ubuntu 11.10 32bit で kernel 3.0.0-16 に更新したら、ひどく不安定になったり kernel panic を起こして終了するようになったので 3.0.0-14 で動かすようにした。
apt のデータベースを壊したくないのでパッケージのアンインストールやダウングレード等はせず、grubにおいてマニュアルで Previous Linux versions から選択していたのだが面倒。
デフォルトで古いバージョンのカーネルを動作させる方法を調べるとここにあった。
/etc/default/grub の GRUB_DEFAULT でサブメニューまでのデフォルト値まで指定できる。
2012/03/01
2011/12/15
Ubuntu 11.10 autofs5/synax error in nsswitch の対処
autofs5 をインストールしたら次のエラーが出た。
syntax error in nsswitch config near [ synax error ]
ここにバグとして挙がっていた。
/etc/nsswitch に次のエントリーを追加すると直った。
automount: files
syntax error in nsswitch config near [ synax error ]
ここにバグとして挙がっていた。
/etc/nsswitch に次のエントリーを追加すると直った。
automount: files
2011/10/17
LinuxでLoadable Moduleをデバッグする
Linux のloadable moduleをデバッグしたときのメモ。
元ネタはO'Reillyの"Linuxデバイスドライバ"。
static linkしたモジュールはgdbでvmlinuxを読み込めばシンボル情報が読み込まれるが、loadable moduleは一手間かけないとシンボルが見えない。
ここでは uvcvideo モジュールをデバッグ対象とする。
まず、ターゲットとなるモジュールの.text, .bss, .dataのアドレスを得る。
続いてデバッガでシンボルを追加する。カレントディレクトリはLinuxカーネルソースのディレクトリ。
これで関数名を指定してブレークポイントを置いたり、ソースを追いながらステップ実行できるようになる。
もう少し楽にやる方法はないかと思う。
なお、.ko にデバッグ情報を残すにはモジュールのソースディレクトリにある Makefile に、
などと記述しておけば良い。
ついでにモジュールのみのビルド方法は、カーネルソースのトップディレクトリにおいて、"make M=[モジュールのディレクトリ]"。
元ネタはO'Reillyの"Linuxデバイスドライバ"。
static linkしたモジュールはgdbでvmlinuxを読み込めばシンボル情報が読み込まれるが、loadable moduleは一手間かけないとシンボルが見えない。
ここでは uvcvideo モジュールをデバッグ対象とする。
まず、ターゲットとなるモジュールの.text, .bss, .dataのアドレスを得る。
# cat /sys/module/uvcvideo/sections/.{text,bss,data}
0xf86c6000
0xf86d4560
0xf86d3000
続いてデバッガでシンボルを追加する。カレントディレクトリはLinuxカーネルソースのディレクトリ。
(gdb) add-symbol-file drivers/media/video/uvc/uvcvideo.ko 0xf86c6000 -s .bss 0xf86d4560 -s .data 0xf86d3000
これで関数名を指定してブレークポイントを置いたり、ソースを追いながらステップ実行できるようになる。
もう少し楽にやる方法はないかと思う。
なお、.ko にデバッグ情報を残すにはモジュールのソースディレクトリにある Makefile に、
EXTRA_CFLAGS += -O0 -g
などと記述しておけば良い。
ついでにモジュールのみのビルド方法は、カーネルソースのトップディレクトリにおいて、"make M=[モジュールのディレクトリ]"。
2011/10/15
カーネルをデバッグするためのGRUB2設定
Ubuntu 11.04でカーネルデバッグをしたときの設定です。
VMWare同士でシリアルポートを接続する方法で、baudrate 115200で接続。
* デバッグ対象のOS
- /boot/grub/grub.cfg のデバッグしたいカーネルの menuentry をコピーして、新しい menuentry を追加する。
- 追加した menuentry の "linux" のパラメータに "kgdboc=ttyS0,115200 kgdbwait" を追加する。以下は一例。
- 再起動時にSHIFTキーを押し続けてブートメニューを表示し、追加した menuentry に対応する項目を選ぶ。
* デバッガを起動するOS
GRUBとは関係ないが、ついでにデバッガ側の作業も記述しておく。
カーネルをビルドしたディレクトリに移動して、gdbを起動。以下のコマンドを入力。.gdbinit に記述しておいても良い。
# GRUB2とはバージョン1.9以降を指すそうだ。ややこしい...。
VMWare同士でシリアルポートを接続する方法で、baudrate 115200で接続。
* デバッグ対象のOS
- /boot/grub/grub.cfg のデバッグしたいカーネルの menuentry をコピーして、新しい menuentry を追加する。
- 追加した menuentry の "linux" のパラメータに "kgdboc=ttyS0,115200 kgdbwait" を追加する。以下は一例。
menuentry 'Ubuntu, with Linux 2.6.38.8 (debug)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
set gfxpayload=$linux_gfx_mode
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root ba000129-5c3a-403c-9107-3d7649a4d051
linux /boot/vmlinuz-2.6.38.8 root=UUID=ba000129-5c3a-403c-9107-3d7649a4d051 ro kgdboc=ttyS0,115200 kgdbwait
initrd /boot/initrd.img-2.6.38.8
}
- 再起動時にSHIFTキーを押し続けてブートメニューを表示し、追加した menuentry に対応する項目を選ぶ。
* デバッガを起動するOS
GRUBとは関係ないが、ついでにデバッガ側の作業も記述しておく。
カーネルをビルドしたディレクトリに移動して、gdbを起動。以下のコマンドを入力。.gdbinit に記述しておいても良い。
(gdb) file ./vmlinux
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
# GRUB2とはバージョン1.9以降を指すそうだ。ややこしい...。
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:
こちらのブログを参考にさせてもらった。
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を定義している。
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/07
逆USBテザリングでメール待ち受けができるCyanogenModパッチ(2)
環境: Ubuntu 10.10 Desktop, HTC Desire, CyanogenMod 6.1.1
前回のパッチの欠点を改善したものを作った。一応patchと、jarを固めたzipをここに置いてある。
このパッチにできることは、次のとおり。
- 一度だけAndroidとPCに設定をしておけば、USBケーブルを刺したときに通信できるようになる。
- 逆USBテザリングと通常の正方向のUSBテザリングを切り替えられる。
これで晴れて快適な逆USBテザリング生活?ができるようになった。
必要な設定は
- PC
USB RNDIS (Ubuntuだとusb0)のPC側IPアドレスを固定アドレスにする。
- Android
システムプロパティを設定する。
- usb.reverse.dns1 ... DNSアドレス
- usb.reverse.gw ... PC側のusb0のアドレス
これらのプロパティのいずれかが空のとき、通常のUSBテザリングになる。
RNDISドライバさえあれば他のOSでも動くはずだが、試していない。
以下、設定方法。
ここに記述してあることは当然上記パッチをAndroidに焼かないと動作しないので、あしからず。
AndroidをUSBで接続したときに現れるusb0インターフェースのIPアドレスを固定する。
Ubuntu Desktopに標準インストールされるNetwork Managerとethtoolではこれができなかった。なぜなら、usb0のMACアドレスは接続するたびに変化する。Network Managerが前回接続したことのあるインターフェースであると認識せず、usb0に施したはずの設定が反映されない。
ということで、Network Managerは消して、/etc/network/interfaces での運用に変更する。
# Network Managerと共存する方法があるかもしれないが、私は上手く行っていない。
これは私の環境のinterfaces。usb0 以外の設定は、環境に合わせて変更する必要がある。
usb0 のPC側アドレスは 192.168.42.100 とする。192.168.42.0/24 のうち、192.168.42.129 以外なら他のアドレスでも良い。
PC: /etc/network/interfaces
Androidで次のファイルを作成する。system partitionなのでadb remountや、recovery modeで変更する。
android: /data/local.prop:
Androidを再起動する。
PCからadbでシステムプロパティの値を設定する。
192.168.3.254 はDNSのアドレスなので、環境に合わせて変更する。
以上で設定完了。
この状態でAndroidをUSBケーブルでPCに接続し、USBテザリングを有効にしてWebブラウザ等が使用できるかを確認する。
なお、Android Marketでダウンロードできないときは、Google Talkに一度ログインするとダウンロードが開始するかもしれない。
通常の正方向のUSBテザリングに戻したいときは、usb.reverse.dns1かusb.reverse.gwを空にすれば良い。
このパッチでも不便な点がある。
それは複数の異なるLAN上のPCに接続するとき、DNSとゲートウェイの設定を変更しなければならないことだ。
前回のパッチの欠点を改善したものを作った。一応patchと、jarを固めたzipをここに置いてある。
このパッチにできることは、次のとおり。
- 一度だけAndroidとPCに設定をしておけば、USBケーブルを刺したときに通信できるようになる。
- 逆USBテザリングと通常の正方向のUSBテザリングを切り替えられる。
これで晴れて快適な逆USBテザリング生活?ができるようになった。
必要な設定は
- PC
USB RNDIS (Ubuntuだとusb0)のPC側IPアドレスを固定アドレスにする。
- Android
システムプロパティを設定する。
- usb.reverse.dns1 ... DNSアドレス
- usb.reverse.gw ... PC側のusb0のアドレス
これらのプロパティのいずれかが空のとき、通常のUSBテザリングになる。
RNDISドライバさえあれば他のOSでも動くはずだが、試していない。
以下、設定方法。
ここに記述してあることは当然上記パッチをAndroidに焼かないと動作しないので、あしからず。
AndroidをUSBで接続したときに現れるusb0インターフェースのIPアドレスを固定する。
Ubuntu Desktopに標準インストールされるNetwork Managerとethtoolではこれができなかった。なぜなら、usb0のMACアドレスは接続するたびに変化する。Network Managerが前回接続したことのあるインターフェースであると認識せず、usb0に施したはずの設定が反映されない。
ということで、Network Managerは消して、/etc/network/interfaces での運用に変更する。
# Network Managerと共存する方法があるかもしれないが、私は上手く行っていない。
# apt-get remove network-manager
これは私の環境のinterfaces。usb0 以外の設定は、環境に合わせて変更する必要がある。
usb0 のPC側アドレスは 192.168.42.100 とする。192.168.42.0/24 のうち、192.168.42.129 以外なら他のアドレスでも良い。
PC: /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
auto usb0
iface usb0 inet static
address 192.168.42.100
netmask 255.255.255.0
Androidで次のファイルを作成する。system partitionなのでadb remountや、recovery modeで変更する。
android: /data/local.prop:
net.dns1=
usb.reverse.dns1=
usb.reverse.gw=
Androidを再起動する。
PCからadbでシステムプロパティの値を設定する。
192.168.3.254 はDNSのアドレスなので、環境に合わせて変更する。
adb shell setprop usb.reverse.dns1 192.168.3.254
adb shell setprop usb.reverse.gw 192.168.42.100
以上で設定完了。
この状態でAndroidをUSBケーブルでPCに接続し、USBテザリングを有効にしてWebブラウザ等が使用できるかを確認する。
なお、Android Marketでダウンロードできないときは、Google Talkに一度ログインするとダウンロードが開始するかもしれない。
通常の正方向のUSBテザリングに戻したいときは、usb.reverse.dns1かusb.reverse.gwを空にすれば良い。
adb shell setprop usb.reverse.gw ""
このパッチでも不便な点がある。
それは複数の異なるLAN上のPCに接続するとき、DNSとゲートウェイの設定を変更しなければならないことだ。
2011/05/05
git tag のコミット日時を一覧表示する
git tagのタグ一覧をコミット日時と共に見たいと思うことがある。
gitだけで見る方法がわからなかったので、スクリプトを書いた。
こんな感じ。
日付順にソートしたいときは git-tagdate | sort で。
git-tagdate:
gitだけで見る方法がわからなかったので、スクリプトを書いた。
こんな感じ。
$ git-tagdate
2011-02-08 11:00:00 -0800 tag1
2011-02-09 12:00:00 -0800 tag2
2011-02-10 13:00:00 -0800 tag3
日付順にソートしたいときは git-tagdate | sort で。
git-tagdate:
#!/usr/bin/perl
open(TAG, "git tag|") || die "$!";
while ($t = <TAG>) {
chomp $t;
open(LOG, "git log --format=\%ci $t^..$t|") || next;
$d = <LOG>;
close LOG;
chomp $d;
print "$d $t\n";
}
close TAG;
2011/05/04
CyanogenMod 6 froyo-stable をソースコードからビルドする
環境: Ubuntu 10.10 Desktop x86_64
CyanogenMod 6.1.1の/system/framework/framework.jar, services.jar を入れ替えるために、ソースコードからビルドした。
/syste/framework/配下のファイルの入れ替え以外は試していない。
CyanogenMod Wikiにプラットフォームごとのビルド方法が説明されている。有難い。
UbuntuとOS Xでの方法が書いてあるが、両方見た方がいいかも。
を実行すると
というエラーが発生した。
.repo/manifest.xml からandroid_device_advent_vegaをコメントアウトして、再び repo sync。
これが完了したらビルドの設定。
WikiでのUbuntu上でのビルド方法には brunch bravo を実行するように書いてあったものの、このバージョンのenvsetup.shにはbrunchがないようだ。
OS X上でのビルド方法にはlaunchを実行するように書いてある。
続いてmake。frameworks/base と frameworks/base/services/java だけ部分的にmakeしたいが、モジュール間の依存関係を調べるのも面倒なのでフルビルド。
次のエラーが発生した。
このスレッドを見ると、CyanogenMode 6.1.1リリースのすぐ後に修正された問題のようだ。
の 100-continue を 100-Continue に変更。
続いて次のエラーが発生した。
WikiにROM Managerをダウンロードするように書いてあったが、やらなかったので出た。
ビルド中にcurlで外から取得するようになっていて、取得先のURLが見つかっていない。
CyanogenModの.zipから取り出して配置して、再びmake。
以上でmakeが完了した。
フルビルドした後はビルドしたいモジュールのディレクトリに移動して、mmコマンドを実行。
実はCyanogenModのビルドに先立って、手元にandroid git repositoryから取得したソースがあったので、それを使おうとした。
CyanogenModのframework.jarのclasses.dexをsmaliで逆コンパイルし、一部のクラスだけ置き換えたのだが、問題があった。
gitのタグandroid-2.2.1_r1とCyanogenMod 6.1.1では、android.internal.RのリソースIDが変わっていて、適切なリソースを取得できなかった。
CyanogenMod 6.1.1の/system/framework/framework.jar, services.jar を入れ替えるために、ソースコードからビルドした。
/syste/framework/配下のファイルの入れ替え以外は試していない。
CyanogenMod Wikiにプラットフォームごとのビルド方法が説明されている。有難い。
UbuntuとOS Xでの方法が書いてあるが、両方見た方がいいかも。
$ repo init -u repo init -u git://github.com/CyanogenMod/android.git -b froyo-stable
$ repo sync
を実行すると
error: revision master in CyanogenMod/android_device_advent_vega not found
というエラーが発生した。
.repo/manifest.xml からandroid_device_advent_vegaをコメントアウトして、再び repo sync。
これが完了したらビルドの設定。
WikiでのUbuntu上でのビルド方法には brunch bravo を実行するように書いてあったものの、このバージョンのenvsetup.shにはbrunchがないようだ。
OS X上でのビルド方法にはlaunchを実行するように書いてある。
続いてmake。frameworks/base と frameworks/base/services/java だけ部分的にmakeしたいが、モジュール間の依存関係を調べるのも面倒なのでフルビルド。
次のエラーが発生した。
(unknown): error 17: Field org.apache.http.protocol.HTTP.EXPECT_CONTINUE has changed value from "100-Continue" to "100-continue"
このスレッドを見ると、CyanogenMode 6.1.1リリースのすぐ後に修正された問題のようだ。
external/apache-http/src/org/apache/http/protocol/HTTP.java: public static final String EXPECT_CONTINUE = "100-continue";
の 100-continue を 100-Continue に変更。
続いて次のエラーが発生した。
make: *** No rule to make target `vendor/cyanogen/proprietary/RomManager.apk', needed by `out/target/product/bravo/system/app/RomManager.apk'. Stop.
WikiにROM Managerをダウンロードするように書いてあったが、やらなかったので出た。
ビルド中にcurlで外から取得するようになっていて、取得先のURLが見つかっていない。
CyanogenModの.zipから取り出して配置して、再びmake。
以上でmakeが完了した。
フルビルドした後はビルドしたいモジュールのディレクトリに移動して、mmコマンドを実行。
実はCyanogenModのビルドに先立って、手元にandroid git repositoryから取得したソースがあったので、それを使おうとした。
CyanogenModのframework.jarのclasses.dexをsmaliで逆コンパイルし、一部のクラスだけ置き換えたのだが、問題があった。
gitのタグandroid-2.2.1_r1とCyanogenMod 6.1.1では、android.internal.RのリソースIDが変わっていて、適切なリソースを取得できなかった。
Android Platformでの一部のプロジェクトのみmakeする
例えば frameworks/base をmakeしたいとき。
mmmをAndroid.mk のあるディレクトリを渡して実行する。
mmmは再帰的にディレクトリを見るわけではないので、
frameworks/base 配下のプロジェクトに対しても個別にmmmを実行する。
mmmをAndroid.mk のあるディレクトリを渡して実行する。
$ . build/envsetup.sh
$ mmm frameworks/basemmmは再帰的にディレクトリを見るわけではないので、
frameworks/base 配下のプロジェクトに対しても個別にmmmを実行する。
Ubuntu 10.10 x86_64 でAndroidをビルドする
環境: Ubuntu 10.10 Desktop x86_64
libstdc++.so がないと言われる
embeddedさんのブログを参考にして、
$ sudo apt-get install gcc-multilib g++-multilib ia32-libs lib32z1-dev lib32ncurses5-dev
を実行したらビルドできた。
たぶん
g++-4.4-multilib: /usr/lib/gcc/x86_64-linux-gnu/4.4/32/libstdc++.so
が必要だったのだと思う。
libstdc++.so がないと言われる
embeddedさんのブログを参考にして、
$ sudo apt-get install gcc-multilib g++-multilib ia32-libs lib32z1-dev lib32ncurses5-dev
を実行したらビルドできた。
たぶん
g++-4.4-multilib: /usr/lib/gcc/x86_64-linux-gnu/4.4/32/libstdc++.so
が必要だったのだと思う。
2011/05/02
Android Reverse USB Tethering with NAT
Environment: Android:CyanogenMod 6.1.1, PC:Ubuntu 10.10
It might be inconvenient when using reverse usb tethering with bridged network.
I must be execute the script that deletes a bridge interface when I stop tethering.
Without doing that, the network transfer in PC stops.
So I tried tethering with NAT that doesn't stop the network transfer in PC.
I came to be able to disconnect USB cable anytime without iconvenient effect in PC.
Firstly, enable IP forwarding in my PC.
/etc/sysctl.conf:
To apply, execute 'sysctl -p'.
If you want to change the perameter temporarlily without editing sysctl.conf,
execute 'sysctl -w net.ipv4.ip_forward=1'.
Next, configure iptables.
To enable auto setting of iptables in Ubuntu, you must write a script to apply your settings.
I use following script in /etc/rc.local.
/etc/rc.local:
iptables-rusbnat.rules are created by 'iptables-save > iptables-rusbnat.rules'.
You have to do the work above only once.
You have to do following works whenever enabling reverse tethering.
Enable 'USB Tethering' in android. Execute rusbtether-nat in PC.
rusbtether-nat:
To stop reverse tethering, just disconnect USB cable or disable 'USB Tethering' in android.
You have nothing to do in PC.
You should not to enable WiFi/3G while using reverse tethering.
Because dns settings in android are changed when enabling WiFi/3G and dns client will be not able to resolve names.
If you enable WiFi/3G while reverse tethering, execute rusbtether-nat again to fix dns settings.
It might be inconvenient when using reverse usb tethering with bridged network.
I must be execute the script that deletes a bridge interface when I stop tethering.
Without doing that, the network transfer in PC stops.
So I tried tethering with NAT that doesn't stop the network transfer in PC.
I came to be able to disconnect USB cable anytime without iconvenient effect in PC.
Firstly, enable IP forwarding in my PC.
/etc/sysctl.conf:
net.ipv4.ip_forward=1To apply, execute 'sysctl -p'.
If you want to change the perameter temporarlily without editing sysctl.conf,
execute 'sysctl -w net.ipv4.ip_forward=1'.
Next, configure iptables.
iptables -A INPUT -j ACCEPT
iptables -A OUTPUT -j ACCEPT
iptables -A FORWARD -i usb0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADETo enable auto setting of iptables in Ubuntu, you must write a script to apply your settings.
I use following script in /etc/rc.local.
/etc/rc.local:
#!/bin/sh -e
/sbin/iptables-restore < /etc/iptables-rusbnat.rules
iptables-rusbnat.rules are created by 'iptables-save > iptables-rusbnat.rules'.
You have to do the work above only once.
You have to do following works whenever enabling reverse tethering.
Enable 'USB Tethering' in android. Execute rusbtether-nat in PC.
rusbtether-nat:
#!/bin/sh
set -e
export LANG=C
ROUTE=/system/bin/route
GWA=`LANG=C ifconfig usb0 | grep "inet addr:" | \
sed 's/ *inet addr:\([0-9\.]\+\).*$/\1/'`
ping -I usb0 -c 1 $GWA > /dev/null
# add route
adb shell su -c "$ROUTE add default gw $GWA dev usb0"
DNS=`grep nameserver /etc/resolv.conf | head -n1 | awk '{print$2}'`
# clear dns
for p in net.dns1 net.dns2 net.dns3 net.rmnet0.dns1 \
net.rmnet0.dns2 dhcp.eth0.dns1 dhcp.eth0.dns2 \
dhcp.eth0.dns3 dhcp.eth0.dns4 net.eth0.dns1 \
net.eth0.dns2 net.usb0.dns1 net.usb0.dns2; do
adb shell su -c "setprop $p ''"
done
# set dns
adb shell su -c "setprop net.dns1 $DNS"
echo Completed
To stop reverse tethering, just disconnect USB cable or disable 'USB Tethering' in android.
You have nothing to do in PC.
You should not to enable WiFi/3G while using reverse tethering.
Because dns settings in android are changed when enabling WiFi/3G and dns client will be not able to resolve names.
If you enable WiFi/3G while reverse tethering, execute rusbtether-nat again to fix dns settings.
Proxy越えをするDNS Server
Proxy越えをするDNS Serverを作った。Perlの Net::DNS::Nameserver を利用した。
これとsquidの多段Proxyを組み合わせれば、AndroidのProxy対応していないHTTPアクセスするアプリを全てProxy越えさせることが可能なはず。
ダウンロードはここのwebnamed-*.tgz。
webnamed + 逆USBテザリング + squid透過Proxyを組み合わせて、DMZのProxy越えができるかを検証しようと思う。
* 仕組み
既存のLAN内のDNS Server ... Default DNS Server
作ったDNS Server ... Slave DNS Server (webnamed)
外部CGI Server上のCGI ... Resolver CGI (resolver.cgi)
1) Slave DNS ServerがDNS queryを受信する。
2) アドレス解決のDNS query の場合、Resolver CGI にDomain Nameを送信して、アドレスを取得する。
3) アドレス解決以外の DNS queryまたは 2) でアドレスが未解決の場合は、Default DNS ServerへDNS queryをforwardする。
4) Slave DNS Serverが 2) または 3) の結果を返信する。
* なぜwebnamedが必要か
まずAndroidにProxy設定をせずにProxy越えするには、DMZのHTTP ProxyへProxy用のHTTP Headerを含むHTTP Requestを投げる必要がある。これにはAndroidのWebブラウザからのHTTP Requestを、一旦squidのTransparent Proxyに投げる。次にsquidからDMZのHTTP Proxyへ投げれば解決する。
だが、WebブラウザはHTTP Proxyを通すことを認識していないため、WebブラウザのDNS Resolverが動いてしまう。Firewall内のDNS Serverは、外部DNS Serverへアドレス解決を参照しない運用になっていることが多いため、大抵DNS queryが失敗するだろう。
そこで、このDNS queryに対して適切に返答するために、今回作ったDNS Serverが必要になる。
* resolver.cgi について
resolver.cgi は私のレンタルサーバに配置した。
webnamed のデフォルトの設定だとそのレンタルサーバに接続する。別のサーバに配置することも簡単にできる。
Google App Engineの利用を最初に考えたものの、InetAddress.getHostAddress() が禁止されていたので断念した。
広告入りの無料サーバでも動作するが、CGIへの直接アクセスは(できるけど)規約違反になることがあるので確認が必要。
* 他に方法はないのか
Google先生への質問スキルが低いのか、似たような物が見つからなかった。
あるいは、もっと別の解決方法が存在するのか、単に需要がないのか。
ご存知の方がいたら教えてください。
これとsquidの多段Proxyを組み合わせれば、AndroidのProxy対応していないHTTPアクセスするアプリを全てProxy越えさせることが可能なはず。
ダウンロードはここのwebnamed-*.tgz。
webnamed + 逆USBテザリング + squid透過Proxyを組み合わせて、DMZのProxy越えができるかを検証しようと思う。
* 仕組み
既存のLAN内のDNS Server ... Default DNS Server
作ったDNS Server ... Slave DNS Server (webnamed)
外部CGI Server上のCGI ... Resolver CGI (resolver.cgi)
1) Slave DNS ServerがDNS queryを受信する。
2) アドレス解決のDNS query の場合、Resolver CGI にDomain Nameを送信して、アドレスを取得する。
3) アドレス解決以外の DNS queryまたは 2) でアドレスが未解決の場合は、Default DNS ServerへDNS queryをforwardする。
4) Slave DNS Serverが 2) または 3) の結果を返信する。
* なぜwebnamedが必要か
まずAndroidにProxy設定をせずにProxy越えするには、DMZのHTTP ProxyへProxy用のHTTP Headerを含むHTTP Requestを投げる必要がある。これにはAndroidのWebブラウザからのHTTP Requestを、一旦squidのTransparent Proxyに投げる。次にsquidからDMZのHTTP Proxyへ投げれば解決する。
だが、WebブラウザはHTTP Proxyを通すことを認識していないため、WebブラウザのDNS Resolverが動いてしまう。Firewall内のDNS Serverは、外部DNS Serverへアドレス解決を参照しない運用になっていることが多いため、大抵DNS queryが失敗するだろう。
そこで、このDNS queryに対して適切に返答するために、今回作ったDNS Serverが必要になる。
* resolver.cgi について
resolver.cgi は私のレンタルサーバに配置した。
webnamed のデフォルトの設定だとそのレンタルサーバに接続する。別のサーバに配置することも簡単にできる。
Google App Engineの利用を最初に考えたものの、InetAddress.getHostAddress() が禁止されていたので断念した。
広告入りの無料サーバでも動作するが、CGIへの直接アクセスは(できるけど)規約違反になることがあるので確認が必要。
* 他に方法はないのか
Google先生への質問スキルが低いのか、似たような物が見つからなかった。
あるいは、もっと別の解決方法が存在するのか、単に需要がないのか。
ご存知の方がいたら教えてください。
2011/04/30
Androidで逆USBテザリングを使う(NAT)
環境: Android:CyanogenMod 6.1.1, PC:Ubuntu 10.10
逆USBテザリングをブリッジ接続で行うと、不便が生じた。
- テザリングを止めるとき、PC側でブリッジ削除スクリプトを実行する必要がある。
- ブリッジ削除スクリプトを実行しないとPC側の通信ができなくなる。
それに、Androidにsshで入りたいわけでもないので、AndroidのIPアドレスがLAN内で見える必要もないし。
ということで、NATを利用する方法を考えた。この方法ならば、いつUSBを抜いてもPC側の通信には影響がない。
ブリッジ接続を紹介していたMathieuさんのコメント欄のところで、原理的に同じことを書いている人がいた。
なお、メーラーが自動受信しないとか、Android Marketのダウンロードが動作しないなどのAndroidの逆USBテザリング時に通信しないアプリが存在する理由で述べた問題があるが、私はAndroidのモジュールを変更して無理やりできるようにした。興味のある方はリンク先を参照してください。
まずPC側のIP Forwardを有効にする。
/etc/sysctl.conf:
sysctl -p で反映。sysctl.confを変更せずに一時的に試すなら、
sysctl -w net.ipv4.ip_forward=1 で。
次にiptablesの設定。
# 一部修正 5/6
Ubuntuでiptablesの設定をOS起動時に有効にするには、自分でスクリプトを書く必要がある。私は /etc/rc.local に次のように書いている。
/etc/rc.local:
iptables-rusbnat.rules は上記の設定を行った後に iptables-save > iptables-rusbnat.rules で作った。
ここまで一度設定すれば良い。
以下はテザリングを有効にする度にPC側で実行するもの。
Android側ではやることはテザリングの設定を有効にするだけ。
停止するときはAndroidでテザリングの設定を無効にする。PC側は何もする必要がない。
rusbtether-nat:
なお、AndroidのDNSを再設定するところはブリッジ接続の方法と変わらないので、テザリング中にWiFi/3GをONしない方が良い。
ONにした場合DNSの設定が変わって名前解決できなくなるが、再度 rusbtether-nat を実行すれば解決できるようになる。
#追記 5/3
Android側に付くアドレス 192.168.42.129 は固定のようだ。com.android.server.connectivity.Tethering にハードコーディングされていた。
逆USBテザリングをブリッジ接続で行うと、不便が生じた。
- テザリングを止めるとき、PC側でブリッジ削除スクリプトを実行する必要がある。
- ブリッジ削除スクリプトを実行しないとPC側の通信ができなくなる。
それに、Androidにsshで入りたいわけでもないので、AndroidのIPアドレスがLAN内で見える必要もないし。
ということで、NATを利用する方法を考えた。この方法ならば、いつUSBを抜いてもPC側の通信には影響がない。
ブリッジ接続を紹介していたMathieuさんのコメント欄のところで、原理的に同じことを書いている人がいた。
なお、メーラーが自動受信しないとか、Android Marketのダウンロードが動作しないなどのAndroidの逆USBテザリング時に通信しないアプリが存在する理由で述べた問題があるが、私はAndroidのモジュールを変更して無理やりできるようにした。興味のある方はリンク先を参照してください。
まずPC側のIP Forwardを有効にする。
/etc/sysctl.conf:
net.ipv4.ip_forward=1sysctl -p で反映。sysctl.confを変更せずに一時的に試すなら、
sysctl -w net.ipv4.ip_forward=1 で。
次にiptablesの設定。
iptables -A INPUT -j ACCEPT
iptables -A OUTPUT -j ACCEPT
iptables -A FORWARD -i usb0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE# 一部修正 5/6
Ubuntuでiptablesの設定をOS起動時に有効にするには、自分でスクリプトを書く必要がある。私は /etc/rc.local に次のように書いている。
/etc/rc.local:
#!/bin/sh -e
/sbin/iptables-restore < /etc/iptables-rusbnat.rules
iptables-rusbnat.rules は上記の設定を行った後に iptables-save > iptables-rusbnat.rules で作った。
ここまで一度設定すれば良い。
以下はテザリングを有効にする度にPC側で実行するもの。
Android側ではやることはテザリングの設定を有効にするだけ。
停止するときはAndroidでテザリングの設定を無効にする。PC側は何もする必要がない。
rusbtether-nat:
#!/bin/sh
set -e
export LANG=C
ROUTE=/system/bin/route
GWA=`LANG=C ifconfig usb0 | grep "inet addr:" | \
sed 's/ *inet addr:\([0-9\.]\+\).*$/\1/'`
if [ "$GWA" = "" ]; then
echo exit
exit 1
fi
ping -I usb0 -c 1 $GWA > /dev/null
# add route
adb shell su -c "$ROUTE add default gw $GWA dev usb0"
DNS=`grep nameserver /etc/resolv.conf | head -n1 | awk '{print$2}'`
# clear dns
for p in net.dns1 net.dns2 net.dns3 net.rmnet0.dns1 \
net.rmnet0.dns2 dhcp.eth0.dns1 dhcp.eth0.dns2 \
dhcp.eth0.dns3 dhcp.eth0.dns4 net.eth0.dns1 \
net.eth0.dns2 net.usb0.dns1 net.usb0.dns2; do
adb shell su -c "setprop $p ''"
done
# set dns
adb shell su -c "setprop net.dns1 $DNS"
echo Completed
なお、AndroidのDNSを再設定するところはブリッジ接続の方法と変わらないので、テザリング中にWiFi/3GをONしない方が良い。
ONにした場合DNSの設定が変わって名前解決できなくなるが、再度 rusbtether-nat を実行すれば解決できるようになる。
#追記 5/3
Android側に付くアドレス 192.168.42.129 は固定のようだ。com.android.server.connectivity.Tethering にハードコーディングされていた。
2011/04/29
Androidの通信量の節約方法を考える
近いうちに Softbank を解約して b-mobile Fair に移行すべく、通信量を節約する方法を模索している。
今までは自宅でもWiFiを使わずに3Gで通信していたこともあり、月300-400MB程度使っていた。
目標は 平日8MB/日、休日4MB/日。これで120日使うと900MB。1GBまでの残り100MBはたまに使うGoogle Mapやメール添付イメージなどのバッファとして考えている。
b-mobile U300で通信料制限なしという選択肢もあるが、通信速度は私にとってとても重要なことだ。遅いとイラッと来るので。
現在通信量のうち多くの割合を占めるものは以下の3つ。
1) 通勤中のRSSリーダ、Webブラウザ使用。たぶん通信量の8割を占める。
2) Android Marketでのアプリのアップデート、新しいアプリのダウンロード。
3) Gmailの待ち受け、取得、写真送受信。メイン携帯へのメールもGmail(auone)で取得。
- RSSリーダ対策
自動更新はOFFにする。RSSリーダ(NewsRob)は、出勤前にキャッシュしておく。
手動で更新するのは割りと苦にならない性格なので。
会社では技術調査の名目で社内LANに接続したPCにスマフォを接続している。Firewallを越えるにはProxyに対応したアプリが必要。そこで、プロキシに対応した Sparse rss というのがあったが、Google Readerの同期機能がない。残念。
Google Reader にフィードを集約しているので、個人的に対応は必須要件。
結局探したところで、Proxy対応したアプリが使いやすいとは限らないので、Proxy越えをする要rootedな別の方法を選択した。後日検証する予定。
- Webブラウザ対策
Webブラウザを使うときは Opera Mini を使う。Opera Mini はOpera用のサーバが仲介して、参照先のWebページを圧縮してからブラウザに送るため、普通のダイレクトに接続するタイプのブラウザよりも通信量が結構少ない。
画質の設定を最低・携帯表示ONにすると、広告等の画像の多いページの通信量がかなり軽減される。私の場合、ほとんどが文字情報を見たいだけだったりするのでこれで十分。
ただ、Opera Miniは仲介サーバにつながらないことがある。そんなときは仕方なくOpera MobileまたはDolphin Browser Miniを使っている。
#追記 5/8
Opera MobileでOpera TurboをONにすると、Opera Miniと同様に圧縮される。
- Android Market対策
自動更新をOFFにして、自宅でアップデート&インストールする。
アプリのバージョンアップでデグレードすることもあるため、自動更新はリスクが高いと思っている。
なので元々自動更新はしていない。この作業も苦にならない。
- Gmail対策
メーラはK9-MailでIMAP Idleを使用。待ち受けだけだと、それほど通信量は多くなさそうだが、今度念のため計測しておきたい(計測した)。
たまに取った写真を送ったり、送られたりするのが通信量が大きい。
送信するときは SmallPic で小さくしてから。
受信した添付ファイルは、すぐに見る必要のないものは自宅でWiFiやPCで確認する。
K9-Mailは受信するメッセージのサイズを指定できるので、8kにしている。
#追記 5/3
- 広告/情報収集対策
無料アプリの中にはAdMobなどの広告を取得するものがあるので、通信系のアプリではなくても起動する度に広告をダウンロードすることがある。よく起動するアプリならば、広告なしの有料版に変更したほうが通信量を節約できる。
また、アプリ使用状況の情報収集のためにデータを送信するアプリもある。データ送信することをユーザに許可を求めるアプリが送信するのは構わないが、WiFiのときだけという設定がほしい。
パケットを眺めていたら、ToggleSettings無料版はwww.togglesettings.comと通信するのでアンインストールした。CyanogenModのウィジットボタンで事足りてしまったので。有料版は使ったことがないが、どうなのだろうか。
今までは自宅でもWiFiを使わずに3Gで通信していたこともあり、月300-400MB程度使っていた。
目標は 平日8MB/日、休日4MB/日。これで120日使うと900MB。1GBまでの残り100MBはたまに使うGoogle Mapやメール添付イメージなどのバッファとして考えている。
b-mobile U300で通信料制限なしという選択肢もあるが、通信速度は私にとってとても重要なことだ。遅いとイラッと来るので。
現在通信量のうち多くの割合を占めるものは以下の3つ。
1) 通勤中のRSSリーダ、Webブラウザ使用。たぶん通信量の8割を占める。
2) Android Marketでのアプリのアップデート、新しいアプリのダウンロード。
3) Gmailの待ち受け、取得、写真送受信。メイン携帯へのメールもGmail(auone)で取得。
- RSSリーダ対策
自動更新はOFFにする。RSSリーダ(NewsRob)は、出勤前にキャッシュしておく。
手動で更新するのは割りと苦にならない性格なので。
会社では技術調査の名目で社内LANに接続したPCにスマフォを接続している。Firewallを越えるにはProxyに対応したアプリが必要。そこで、プロキシに対応した Sparse rss というのがあったが、Google Readerの同期機能がない。残念。
Google Reader にフィードを集約しているので、個人的に対応は必須要件。
結局探したところで、Proxy対応したアプリが使いやすいとは限らないので、Proxy越えをする要rootedな別の方法を選択した。後日検証する予定。
- Webブラウザ対策
Webブラウザを使うときは Opera Mini を使う。Opera Mini はOpera用のサーバが仲介して、参照先のWebページを圧縮してからブラウザに送るため、普通のダイレクトに接続するタイプのブラウザよりも通信量が結構少ない。
画質の設定を最低・携帯表示ONにすると、広告等の画像の多いページの通信量がかなり軽減される。私の場合、ほとんどが文字情報を見たいだけだったりするのでこれで十分。
ただ、Opera Miniは仲介サーバにつながらないことがある。そんなときは仕方なくOpera MobileまたはDolphin Browser Miniを使っている。
#追記 5/8
Opera MobileでOpera TurboをONにすると、Opera Miniと同様に圧縮される。
- Android Market対策
自動更新をOFFにして、自宅でアップデート&インストールする。
アプリのバージョンアップでデグレードすることもあるため、自動更新はリスクが高いと思っている。
なので元々自動更新はしていない。この作業も苦にならない。
- Gmail対策
メーラはK9-MailでIMAP Idleを使用。待ち受けだけだと、それほど通信量は多くなさそうだが、今度念のため計測しておきたい(計測した)。
たまに取った写真を送ったり、送られたりするのが通信量が大きい。
送信するときは SmallPic で小さくしてから。
受信した添付ファイルは、すぐに見る必要のないものは自宅でWiFiやPCで確認する。
K9-Mailは受信するメッセージのサイズを指定できるので、8kにしている。
#追記 5/3
- 広告/情報収集対策
無料アプリの中にはAdMobなどの広告を取得するものがあるので、通信系のアプリではなくても起動する度に広告をダウンロードすることがある。よく起動するアプリならば、広告なしの有料版に変更したほうが通信量を節約できる。
また、アプリ使用状況の情報収集のためにデータを送信するアプリもある。データ送信することをユーザに許可を求めるアプリが送信するのは構わないが、WiFiのときだけという設定がほしい。
パケットを眺めていたら、ToggleSettings無料版はwww.togglesettings.comと通信するのでアンインストールした。CyanogenModのウィジットボタンで事足りてしまったので。有料版は使ったことがないが、どうなのだろうか。
chkconfig対応のsquid init script
Ubuntuでapt-getでインストールしたらinitスクリプトがなかったので。
起動時にDNSテストをスキップする"-D"が指定されていることに注意。
/etc/init.d/squid:
起動時にDNSテストをスキップする"-D"が指定されていることに注意。
/etc/init.d/squid:
#!/bin/sh
# chkconfig: 345 98 20
# description: squid server
# processname: squid
# description for chkconfig: 345 98 20
# 345: run levels
# 98: priority to start
# 20: priority to stop
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/squid
NAME=squid
DESC="squid server"
PIDFILE=/var/run/$NAME.pid
test -x $DAEMON || exit 0
if [ -f /etc/default/$NAME ]; then
. /etc/default/$NAME
fi
DAEMON_OPTS="-D"
start_proc() {
$DAEMON $DAEMON_OPTS
if [ "$?" -eq 0 ]
then
pidof $DAEMON > $PIDFILE
return 0
fi
return 1
}
stop_proc() {
kill -9 `cat $PIDFILE 2>/dev/null`
[ "$?" -ne 0 ] && return 1
rm -f $PIDFILE
return 0
}
status_proc() {
killall -0 $DAEMON 2>/dev/null
return "$?"
}
case "$1" in
start)
echo "Starting ${DESC}"
start_proc
[ "$?" -eq 0 ] || echo "failed"
;;
stop)
echo "Shutting down ${DESC}"
stop_proc
[ "$?" -eq 0 ] || echo "failed"
;;
restart|force-reload)
echo "Restarting ${DESC}"
stop_proc
if [ $? -ne 0 ]; then
failure ; echo ; exit 0
fi
sleep 1
start_proc
[ "$?" -eq 0 ] || echo "failed"
;;
status)
status_proc
[ $? -eq 0 ] && echo "$DESC is alive" || echo "$DESC is dead"
echo
;;
*)
echo "Usage: $0 {start|stop|restart|force-reload|status}" >&2
exit 1
;;
esac
exit 0
2011/04/23
付箋紙アップレットのデータを抽出する
Ubuntu Desktopに標準でインストールされるアップレット"付箋紙"(Sticky Notes)のデータは、~/.gnome2/stickynotes_applet にXML形式で保存されている。
これを抽出して一覧で出力するスクリプトを作った。
こんな感じ。
$ list-stickynotes
1つの付箋が"タイトル<タブ文字>内容"の1行で出力される。
付箋の内容に改行がある場合はスペースに変換。エンコーディングはUTF8。
"付箋紙"は内容を記述してから10秒ぐらいしないと、ファイルに保存されないことに注意。
list-stickynotes:
これを抽出して一覧で出力するスクリプトを作った。
こんな感じ。
$ list-stickynotes
2011年04月20日 猫の餌を買う
2011年04月21日 4/23 食事会 大宮 12:00
1つの付箋が"タイトル<タブ文字>内容"の1行で出力される。
付箋の内容に改行がある場合はスペースに変換。エンコーディングはUTF8。
"付箋紙"は内容を記述してから10秒ぐらいしないと、ファイルに保存されないことに注意。
list-stickynotes:
#!/usr/bin/perl
package StickyNotesHandler;
use base qw(XML::SAX::Base);
my $elm;
sub start_element {
my ($self, $data) = @_;
$elm = $data->{Name};
return if ($elm ne 'note');
my $na = $data->{Attributes};
my $t = $na->{'{}title'}->{Value};
print "${t}\t";
}
sub end_element {
return if ($elm ne 'note');
print "\n";
$elm = undef;
}
sub characters {
my ($self, $data) = @_;
return if ($elm ne 'note');
my $c = $data->{Data};
if ($c eq "\n") { $c = ' '; }
print "$c";
}
#-----------------------------------
package main;
use HTML::Entities;
use XML::SAX;
use Env qw(HOME);
binmode STDOUT => "utf8";
my $fi = "${HOME}/.gnome2/stickynotes_applet";
my $p = XML::SAX::ParserFactory->parser(
Handler => StickyNotesHandler->new);
$p->parse_uri($fi);
Linuxで固定IPアドレスを設定する
固定IPアドレスの設定の仕方をいつも忘れるのでメモ。
CentOS系: /etc/sysconfig/network-scripts/ifcfg-eth#
resolv.conf:
Debian系: /etc/network/interfaces
(dns-nameservers, dns-search は resolvconf 使用時)
CentOS系: /etc/sysconfig/network-scripts/ifcfg-eth#
DEVICE=eth0
IPADDR=192.168.3.10
NETMASK=255.255.255.0
HWADDR=00:11:22:33:44:55
ONBOOT=yes
resolv.conf:
nameserver 192.168.3.253
nameserver 192.168.3.254
search localdomain
Debian系: /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.3.10
network 192.168.3.0
netmask 255.255.255.0
gateway 192.168.3.254
dns-nameservers 192.168.3.253 192.168.3.254
dns-search localdomain
(dns-nameservers, dns-search は resolvconf 使用時)
2011/04/19
update-alternativesコマンドを使う
Ubuntu 10.10 Server x86_64 にaptitudeでgcc-4.4をインストールした。
/usr/bin/gcc-4.4, cpp-4.4 はあるが、/usr/bin/gcc, cpp はないので、update-alternatives で追加。
"gcc" "cpp" がないとconfigure時に面倒なので。
ld は
/usr/bin/ld -> /usr/bin/ld.bfd
という symlink になっていた。
goldの方が速いので、/usr/bin/ld.gold を使うように変更することにした。
ld もデフォルトでは /etc/alternative に入っていない。
今担当しているプロジェクトのフルビルドにかかる時間が、52秒から50秒に短縮。もともとリンクにそれほど時間のかかるプロジェクトではないから、こんなものだろう。
/usr/bin/gcc-4.4, cpp-4.4 はあるが、/usr/bin/gcc, cpp はないので、update-alternatives で追加。
"gcc" "cpp" がないとconfigure時に面倒なので。
# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 90
# update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-4.4 90
ld は
/usr/bin/ld -> /usr/bin/ld.bfd
という symlink になっていた。
goldの方が速いので、/usr/bin/ld.gold を使うように変更することにした。
ld もデフォルトでは /etc/alternative に入っていない。
# update-alternatives --install /usr/bin/ld ld /usr/bin/ld.bfd 1
# update-alternatives --install /usr/bin/ld ld /usr/bin/ld.gold 2
# update-alternatives --list ld
/usr/bin/ld.bfd
/usr/bin/ld.gold
今担当しているプロジェクトのフルビルドにかかる時間が、52秒から50秒に短縮。もともとリンクにそれほど時間のかかるプロジェクトではないから、こんなものだろう。
2011/04/18
GoogleCLでDeprecationWarningが発生したときの対処
環境: Ubuntu 10.04, Python 2.6.5, GoogleCL 0.9.13
GoogleCLでgoogle blogger listすると次のエラーが出た。
これはGoogle Data APIs Python Client Libraryを最新にすることで解決した。Ubuntu 10.04のaptで入るpython-gdataは1.2.4。元サイトの最新版は2.0.14。ちなみにUbuntu 10.10のaptでは2.0.8だったので問題は発生しなかった。
1.2.4のままでも /usr/lib/pymodules/python2.6/atom/http.py を以下のように修正したら動いた。
GoogleCLでgoogle blogger listすると次のエラーが出た。
/usr/lib/pymodules/python2.6/atom/http.py:225: DeprecationWarning: socket.ssl() is deprecated. Use ssl.wrap_socket() instead.
ssl = socket.ssl(p_sock, None, None)
/usr/lib/pymodules/python2.6/atom/http.py:226: DeprecationWarning: FakeSocket is deprecated, and won't be in 3.x. Use the result of ssl.wrap_socket() directly instead.
fake_sock = httplib.FakeSocket(p_sock, ssl)
Traceback (most recent call last):
File "/usr/bin/google", line 849, in
main()
File "/usr/bin/google", line 835, in main
run_once(options, args)
...
...
File "/usr/lib/python2.6/httplib.py", line 755, in send
self.sock.sendall(str)
AttributeError: sendall
これはGoogle Data APIs Python Client Libraryを最新にすることで解決した。Ubuntu 10.04のaptで入るpython-gdataは1.2.4。元サイトの最新版は2.0.14。ちなみにUbuntu 10.10のaptでは2.0.8だったので問題は発生しなかった。
1.2.4のままでも /usr/lib/pymodules/python2.6/atom/http.py を以下のように修正したら動いた。
@@ -42,6 +42,7 @@
import atom.http_interface
import socket
import base64
+import ssl
@@ -222,12 +223,10 @@
raise ProxyError('Error status=%s' % str(p_status))
# Trivial setup for ssl socket.
- ssl = socket.ssl(p_sock, None, None)
- fake_sock = httplib.FakeSocket(p_sock, ssl)
# Initalize httplib and replace with the proxy socket.
connection = httplib.HTTPConnection(proxy_url.host)
- connection.sock=fake_sock
+ connection.sock=ssl.wrap_socket(p_sock, None, None)
return connection
登録:
投稿 (Atom)