Saturday, January 30, 2010

Nexus One に custom rom を install する

カスタムROMについては最悪端末を文鎮にしてしまう恐れがあるので自己責任で。

Nexus One用のカスタムROMがいくつか出ているので試すことにします。
ついでに、カーネルの入れ替えもします。

今回試すのは CyanogenMod 5.0 for Nexus One
現時点で beta3 + kernel update (2.6.32-59940)がでています。
http://forum.xda-developers.com/showthread.php?t=623496
* Can be used with or without Google applications
* Latest 2.6.29.6 kernel which supports tethering, vpn, and other modules (cifs, nfs, aufs, fuse)
* Clean shudown/startup system
* NO APPS2SD. I've implemented a hack that will store the dalvik-cache of system apps in /cache, which saves you ~40MB on /data
* Built in USB tether
* Minor graphical enhancements and an excellent wallpaper by Prash
* ARM NEON optimizations (mostly to the pixelflinger library) which have not been included in the stock build yet
* Includes BusyBox, htop, nano, powertop, openvpn, and all engineering commandline utilities
* Multitouch browser using native API and code from Luke Hutchison. More MT integration coming.
* FLAC audio support from Kenny Root
* Phone enhancements from Cytown
* Contacts enhancements from Wysie
* Perform zipalign-on-install of applications
* DeskClock tweaks- longer autosilence and "require unlock" option
* Compcache is available via Spare Parts, but I don't recommend it
* Massive APN list
* Huge collection of ringtones and audio
* All available locales are included thanks to PsychoBoy
* Many other bugfixes and tweaks from AOSP contributors

こんな感じでいろいろ変わります。
普通に使う範囲だと、マルチタッチブラウザとかUSBテザリングあたりが大きいですかね。JITを有効化することによる高速化も大きいかもしれません。

さて。導入には root化あるいはbootloaderのunlockが前提となります。

フォーラムから update-cm-5.0-N1-beta3-signed.zip をダウンロード、純正アプリが必要であれば、gapps-passion-ERD79-signed.zip もダウンロードしてSDカードにコピーしておきます。

まず fastboot でリカバリモードを起動します。
Wipe により設定情報の掃除を行います。あらゆる初期状態に戻ってしまうので注意。

次に Flash zip from sdcardupdate-cm-5.0-N1-beta3-signed.zip を導入、その後必要であれば gapps-passion-ERD79-signed.zip を。
これで reboot すれば導入は終りですが、フォーラムによるとそのままCM5.0b3のカーネルではバッテリーと充電関連に不具合があり、充電できなくなったり、バッテリーが死ぬとの報告がいくつかみられます。

そこでDwang氏がビルドしたカーネル2.6.32 に差し替えます。
カーネルを替えると、無線LANドライバのモジュールがloadができなくなるので、一緒においてある bcm4329.ko もダウンロードしておきます。

fastbootで起動する。
次のコマンドによりカーネルを入れ替える。
$ sudo ./fastboot-linux flash zimage zImage
$ sudo ./fastboot-linux reboot

zImage はダウンロードしたカーネル。
起動したら無線LANが使えなくなってるのを確認。
adbによりダウンロードしておいたbcm4329.koをぶち込みます。
$ ./adb remount
$ ./adb shell cp /system/lib/modules/bcm4329.ko /system/lib/modules/bcm4329.ko.29
$ ./adb push bcm4329.ko /system/lib/modules/
$ ./adb reboot

2行目はバックアップです。
これで無線LANが使えるようになっているはずです。



どうやらこのカーネルはhimemが有効になっているようで、合計メモリが395MB(395,152kB)になります


個人的にカスタムロムを導入する目的は前述のリストにはなく、アドホックネットワークへの参加が大きいです。
その詳細はまた別のエントリで。

ちなみにこのROMはまだベータなのでxdaのフォーラムは随時追っかけておいた方がよさそうです。

Sunday, January 24, 2010

Nexus One で SBM の MMS を送受信する

※追記(2010/04/13): このエントリはもはや古いので新しい情報を参照してください。

※追記(2010/01/26): 嘘記事書いてゴメンナサイ。結局Mms.apkのUser Agentも書きかえないとダメなようです。

下のほうでアプリいれればいいみたいなことを書いてましたが、全くダメでした。
理由はサードパーティのSMS/MMSアプリをいれても、受信自体は純正のcom.android.mms経由で行っているためです。
送信だけは自前でやってるらしく、ちゃんとできたように見えます。

そこで、純正の SMS/MMSアプリのUser Agent Stringを書き換えた物に入れ替えます。
androidのソースにあるpackages/apps/Mms/res/xml/mms_config.xmlを書き換えて、このxmlだけ差し替えたものです。

Download: Mms.apk
MD5: 4084a145043cc83c0a63043f3a990f09

Android SDKにあるtools/adbを使ってぶち込みます。 (要 root)
$ ./tools/adb remount
remount succeeded
$ ./tools/adb shell cp /system/app/Mms.apk /system/app/Mms.apk.orig
$ ./tools/adb push ~/Downloads/Mms.apk /system/app/
997 KB/s (272550 bytes in 0.266s)
$ ./tools/adb reboot

以上でMMSが使えるようになります。
ただ、純正のSMS/MMSアプリってグループメッセージを扱えないようなので、iPhoneのモノには劣ります。
(追記終わり)

Nexus OneでMMSを使うための設定などを。
iPhone用SBM黒SIMを使います。

まず APN の設定は適切にされていることを前提。


純正の「メッセージ」アプリは User Agent を変更できないので使わない。
自動受信とかOFFにしとくといいかも。

マーケットから Handcent SMS なるアプリケーションをダウンロード。


メニューのSettingsからわりと下のほうにあるCustom User-Agentを選び、iPhone (3.0)にしとく。


Sms Receive SettingsにあるRetrieve message settingを選びAuto-retrieveを有効にする。


以上。

通知ポップアップ時の件名は日本語だと化けちゃうみたい。
けどスレッドの表示では問題なさげ。画像の受信もできた。

Saturday, January 23, 2010

Nexus OneとiPhoneを1枚のSIMで運用する

SIM1枚でNexus OneとiPhoneを運用しようというエントリです。


まず、そのためにはどんな方法があるのか。まっとーな方法はおそらくどちらかを親にしたテザリング。

1. iPhoneを親にするケース
1-1. 純正テザリング
1-2. pdanet
1-3. MyWi

このうち純正はUSBかBTになり、AndroidでBTの子テザはできない。USBなんて仮にできたとしてもイヤだ。
pdanetは有料JBアプリで、しかも子の側でadhocな無線LANを作らなくてはならない。そしてそれはAndroidではできない。
となると残るはMyWiになるが、これもJB必須で有料。で、実はAndroidはadhocネットワークに参加すらできない。

2. Nexus Oneを親にするケース
2-1. USBやBTのテザリングはあるにはあるがiPhone側で利用できないので無理
2-2. pdanet for AndroidはUSBかBTのみ
2-3. Wireless Tether for Root Users.

つうわけで、2-3に絞られる。これはiPhoneのMyWiと同じで、adhocな無線LANでテザリングする。iPhoneでadhocネットワークに参加するのは問題なくできる。(adhocネットワークを作ることは出来ない)
とりあず無料で使える。
ただ、Android 2.1用はまだ安定していない。

ともかく試すことにします。
rootとってることが前提。

Nexus Oneのブラウザで http://code.google.com/p/android-wifi-tether/に行き、Nexus One用のリンクからwireless_tether_2_0_pre1-eclair.apkをダウンロード。
kernel updateはひとまず要らない。NETFILTERを有効にしたkernelらしいので、Access Controlで使うのかも。LinuxではNATするのにも必要なんだけど、入れなくても動いた。おかしい。まぁいい。


そのままリストからタップするとインストールできるのでインストールする。


終わったら開く。
ここで、suがどうのでAllow Denyの選択を迫られることがあるのでとにかくAllowする。
うまく起動出来ずに強制終了か待機を迫られたら、強制終了して、再び開く。何度か繰り返してると起動できる。

メニューボタンを押して設定をする。設定しないでも動きそうではあるが、無防備になってしまうのでやめましょう。
WEPはすでに脆弱で意味がなくなってきてはいるのだが、ないよりはマシ。

変更するのは Wireless Encryptionを有効にする、Change Passphrase でパスフレーズを適当に決める。
あとはSSIDを確認、あるいは変更しておく。

これで-Press to start tethering-をタップすればサービスが開始される。


iPhone側では、Wi-Fiネットワークの設定で先程設定したSSIDのネットワークが出てくるはずなので、パスフレーズを入れて接続すればOK。

結果としてどうなるかといえば、Nexus Oneが無線LANルータのように振舞ってくれる。(が、adhocなので厳密には違う)
テザリング中でもNexus Oneでネットを使えるし、あるいは電話していてもiPhone側でネットが使えなくなるようなことはなかった。

難点は、たまにクライアント側でIPの更新が出来ないことがあるということ。これは既知の問題で、クライアント側でWi-FiをOFFってONにすればいいらしい。
もうひとつはたまに起動出来ずに待機か強制終了の選択になってしまうこと。なんどか繰り返してると起動するのだけど。
あとはわりと電池を喰らう。WiFiと3Gを同時に使うのだから仕方がない。

とにかく表面的には問題なさげに使えているという状況。

蛇足だが PSP の場合、インターネット接続はインフラストラクチャの無線LANでなくてはならないので繋げられないようだ。

Friday, January 22, 2010

Nexus Oneのroot奪取とフォント入れ替え

標準の日本語フォントキモいんで。
Nexus Oneでroot取りからフォント入れ替えまでのメモ。

Android SDKを手に入れる
http://developer.android.com/sdk/index.html
まだつかわない。

bootloaderをunlockする。
注意することはunlockしたら戻せない、サポートを受けるときに影響あるかも。そんなことは知った事ではない。
How to unlock the bootloader on your Nexus One
この辺を読んで、fastboot.zip をダウンロード。

まずNexus OneをUSBで接続。
1.電源長押しででるメニューから電源を切る。
2.ボリュームダウンボタン+電源で電源を入れる
3.メニューがでてくるので、ボリュームキーで FASTBOOT を選択し、電源ボタンで決定する。
(写真はUNLOCK済なんだけどまぁ一緒)
4. LinuxやMacはターミナルから fastboot-linux なりfastboot-mac なりを実行。Windowsはコマンドライン。
$ cd fastboot/
$ sudo ./fastboot-linux oem unlock
sudoしないとダメだった。(Windowsでは管理者権限?)
5. Nexus Oneの画面が変わるので "YES. unlock bootloader" をボリュームキーで選んで電源ボタンを押し決定。
6. rebootする.

次にリカバリイメージの書き換えを行う。
[Recovery] [30-May-2010] RA-nexus-v1.7.0.1
この辺を読んで、recovery-RA-nexus-v1.7.0.1.imgをダウンロード。(MD5sum: b5dbd17b153530247e7b90dfe501b9dd)
さっきと同様に1から3までやって、fastbootでリカバリイメージを書き換える。
$ sudo ./fastboot-linux flash recovery ~/Downloads/recovery-RA-nexus-v1.7.0.1.img
(~/Downloadsは適宜読み替え)

次にrooted.
[N1 Addon] Nexus One Addon 0.1 - Makin' Bacon [01/08/2010]
この辺を読んで、nexus-addon-0.1-signed.zipをダウンロード。 (MD5sum: 7b37d4313ea4a6dc2107352d837380df)
どういう手段でもいいのでSDカードにコピーしとく。
前項同様に、1から2までやって、今度はRECOVERYを選択。
(映り込みすげえな)
リカバリーモードはトラックボールで操作することになる。項目を戻るにはボリュームダウンキー。
まず Backup/Restore を選んで、Nand backup を選択。バックアップをする。
次に Flash zip from sdcard を選択すると SDCARD:nexus-addon-0.1-signed.zip とでてくるのでそのまま選択。

以上でroot化と呼ばれる作業は終わり。PowerOffして再起動。

いよいよフォントを入れ替える。
ちなみに普通のTTFが使えるようだ。
M+IPAとか好きなのを持ってきてくださいよ。
MS GothicとかメイリオもつかえるけどMSのライセンス的にどうなのか。

Nexus OneをUSBデバッグモードにしておく。
設定 → アプリケーション → 開発 → USBデバッグ。
で、最初にもってきていたSDKに含まれるコマンドadbを使う。
$ cd android-sdk-linux/tools
$ ./adb remount
remount succeeded
$ ./adb push ~/Downloads/custom-font.ttf /system/fonts/DroidSansJapanese.ttf
$ ./adb reboot

何をやっているのかの説明は割愛。

以上。

まぁいいんじゃなかろうか。

redsn0w 0.9beta3を試してみた

最初に言っとく。人柱的なことはやってない。

redsn0w 0.9beta3が出たので試してみた。
今回やったのは
・jailbreak 済 iPhone3GS (旧bootrom)
・verbose booting
ようするにboot中に何が起こっているか知りたかったので試してみたというわけです。

説明によると、
If you're already jailbroken (by whatever means), redsn0w can still be used to change your boot logos, revert back to the stock logos, or switch verbose booting on and off. By selecting “Already Pwned” you can bypass the steps normally needed to enter the jailbroken state.

すでにjailbreak済のiPhoneにはboot logoの変更などに使えるとあります。
つまり、jailbreak環境には影響を与えることはない、と読み取れます。
んで、それには“Already Pwned”をえらんどけばOKってことのようです。

では試してみます。
必要なものはredsn0wと3.1.2のipsw。already pwnedでもipswは必要。

途中で出てくる選択肢でチョイスするもの。

あとはそのまま進めばOK。

reboot するとこんな感じに。

何が起こっているのかわかります。
起動にえらく時間かかってるときに役立ちそう。

データが消えたり設定がリセットされるような事象も起きず、なんの問題もなさそうです。

いまのところ。

Thursday, January 21, 2010

Got a NexusOne google phone


というわけで私もNexusOneを購入しました。

購入手段はコムギドットネットさんの記事を参考にVPN経由で。
転送業者はUS Microsoftのtechnet購入のときにつかったスピアネットを。

今さらレビューすることもないだろうけど、とりあえず1日つかってみた雑感を箇条で。
・騒ぎたてるほど動作が軽快ではない (3GSと大して変らないような)
・日本語入力は若干難がある (SimejiもOpenWnnも)
・画面外のスクリーン部分もタッチセンサーの範囲になってて、片手持ちだと意図せず指の腹が触れて誤動作する。(なんとかしてよ)
・液晶綺麗
・日本語フォントがキモイ
・解像度が高いのはいいことだ
・液晶保護フィルム欲しい
・付属のケースにいれてても、スルっと中から落ちそうなので注意

まぁiPhoneではできそうもないことをやれるのがいいですね。(legal的な意味で)

フォントがキモいのは漢字のグリフが簡体字と共通だからだそうです。
ようするに中国語風な漢字です。
まぁ追い追いカスタマイズしていきたい。

Saturday, January 16, 2010

VMware server やめました

仮想環境テクノロジの話題でもなく、Linux KVMのなんたるかを語るでもなく、ただのメモ記事なのであしからず。

これまでVMware Server 2でサーバを運用してきたけどやめました。
理由
・最新カーネルに正式対応しない(moduleのビルドがパッチなしでできない)
・パフォーマンスがよくない
・たまにHost側のカーネルがcall traceだしてて不安
・Javaで書かれた管理UIがあまりよくない

で、代替環境としてはXenとかOpenVZとLinux KVMなどがあるわけですが、XenとOpenVZはカスタムカーネルが必要だし、最新カーネルで使えるかといえば否になります。そこで、標準カーネルで使える(=最新カーネルに変更無しで使える)KVMを試すことにしました。
KVMは単なる仮想化支援機能でそれだけでは環境を構築できないので、KVMを利用した仮想環境ソフトウェアが必要になります。
とりあえず、PCエミュレータのqemuがKVM対応してるのでこれを使うことになります。
また、qemuはlibvirtといわれる仮想環境マネージャの上で動かすことで、管理が可能になります。

まぁ標準カーネルで使えて、ブリッジネットワークでIPv6が使えて、リモート管理ができれば何でも良いのですがKVMくらいしかなさそうです。

で、本題。
いかにしてVMwareから移行したかのメモ。

元環境
・VMware Server 2.0.x
・VMは2つ
・ストレージは raw block device, 単一ファイルのvmdk, 分割されたvmdkの三つ
・ネットワークはブリッジ

ぶっちゃけストレージの変換さえできればそれで終わったようなものです。

ともかく、関連するパッケージをいれる。
 # apt-get install qemu-kvm libvirt-bin

仮想マシンを定義するXMLは virt-manager とか virtinst とかで作ればよい。

まず raw block デバイスは変換の必要はない。そのままつかえる。
    <disk type='block' defice='disk'>                                      
<source dev='/dev/sdb' />
<target dev='vda' bus='virtio' />
</disk>

次に vmdk。これはまぁqcow2形式にするのがいいらしいということなので
 # qemu-img convert -f vmdk source.vmdk -O qcow2 dest.vmdk 

単一だろうが分割だろうかこれでOK
XMLは
    <disk type='file' device='disk'>                                       
<driver name='qemu' type='qcow2'/>
<source file='/storage/1/kvm/vm1.img'/>
<target dev='vda' bus='virtio'/>
</disk>

こんな感じで。
Guest側では /dev/vda? でマウント

次にネットワーク。ブリッジを使ってHostを含めて外部と通信するので、Hostの/etc/network/interfaces に
auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
broadcast 192.168.1.255
bridge_ports eth0

こんな感じでbr0を作成。
VMのXMLでは
    <interface type='bridge'>                                              
<mac address='fe:ff:ff:7a:a7:4d'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>

こんなんで。

まとめ /etc/libvirt/qemu/vm1.xml

<domain type='kvm'>
<name>vm2</name>
<uuid>b7a82db2-d205-ae5c-021e-a43d21755a42</uuid>
<memory>2097152</memory>
<currentMemory>2097152</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='i686' machine='pc-0.11'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/storage/1/kvm/vm1.img'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<mac address='fe:ff:ff:7a:a7:5d'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
<console type='pty'>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
<video>
<model type='cirrus' vram='9216' heads='1'/>
</video>
</devices>
</domain>

virsh create /etc/libvirt/qemu/vm1.xml  などとして起動。
コンソールは VNC でremoteからopenできる。

結局のところ、VMwareに比べてネットワークのパフォーマンスがかなり上がった。
block I/Oはそれほどでもない気がする。若干VMwareよりいいかなというくらい。
すこぶる安定して動いてくれてるのでそれが一番。

あと 2.6.32 から Kernel Samepage Mergingという機能が追加されたのでこれを使うと消費メモリを抑えられる。(らしい)
複数プロセスでの共通ページをマージして重複を排除するという機能。
VMなんかでは比較的共通のメモリ領域が発生しやすいので有効だとか。
# echo 1 > /sys/kernel/mm/ksm/run

それほど効いているような気はしない。

あとはlibvirt, virt-managerの出来次第か。まだ発展途上なのでこれからに期待。