2011年12月4日日曜日

AOSPのミラーをgitwebで見る

kernel.orgがクラックされて使えなくなったAOSPのリポジトリが10月に復活しましたが、gitwebは同時公開となりませんでした。なので、自分で用意してみました。自分専用に用意するのが「イラネ」「マンドクセ」って人は、http://www.r3pek.org/node/105 のgitwebを使わせてもらいましょう。

AOSPのミラーは、ここ↓の猿真似で完成。
「AOSPをローカルミラーしてみた」の資料を公開したよん。  http://d.hatena.ne.jp/kinneko/20111025/p29
因みに、プロジェクトリストファイルを用意せずにgitwebを使うと、ディレクトリownerのGECOSフィールドがownerとして表示されるらしいので、ミラー用にaospユーザーを作りました。
me@falcon:~$ useradd -d /home/aosp -s /bin/bash aosp
me@falcon:~$ usermod -c "Android Open Source Project" aosp
me@falcon:~$ sudo mkdir /home/aosp
me@falcon:~$ sudo chown aosp:ao /home/aosp
me@falcon:~$ sudo -i -u aosp
aosp@falcon:~$ mkdir bin
aosp@falcon:~$ echo 'PATH=$HOME/bin:$PATH'>.profile
aosp@falcon:~$ . .profile
aosp@falcon:~$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
aosp@falcon:~$ chmod +x ~/bin/repo
aosp@falcon:~$ mkdir AOSP
aosp@falcon:~$ cd AOSP
aosp@falcon:~$ repo init --mirror -u https://android.googlesource.com/mirror/manifest
aosp@falcon:~$ repo sync 
放って置いても日々更新されるように、スクリプトを用意してcrontabに追加。
aosp@falcon:~$ cat bin/mirrorAOSP.sh
#!/bin/sh
PATH=$HOME/bin:$PATH
cd $HOME/AOSP
repo sync
exit 0
aosp@falcon:~$ crontab -l
11 3 * * * /home/aosp/bin/mirrorAOSP.sh
ここから本題。
gitwebが無かったのでインストール。
me@falcon:~$ sudo apt-get install gitweb
/etc/gitweb.conf の中の $projectroot を書き換える。
# path to git projects (<project>.git)
$projectroot = "/home/aosp/AOSP";
 gitwebインストールと同時に/etc/apache2/conf.d/gitwebが用意されるので、http://example.com/gitweb/ を開けばAOSPのミラーが見えます。
下の例では、indextext.htmlでDROID logoとタイトル文字を追加してます。
さらに、descriptionをそれっぽく書き換えたかったので、
aosp@falcon:~$ for f in `locate .git/description|grep aosp/AOSP|fgrep -v '/.git'`; do dn=`dirname $f`; echo "Mirror of ${dn##*/}">$f; done
で一括書き換え。locateのdbはすぐには反映されないので、repo syncが終わって一晩待ってからやったほうがいいかも。
AOSPのgitweb(sort by date desc)
以上。

2011.Dec.10追記
http://www.r3pek.org/ が動いてないっぽい。困った人は http://android.git.linaro.org/gitweb 使うか、自分で鯖立てましょう。

2011年12月3日土曜日

IDEOS X5をGignerbreadにアップデート

U8800+/proよりやや遅れて、IDEOS X5(U8800)の公式Gingerbread(2.3.5)が公開されました。ただし、まだBeta 1.0という扱いです。このバージョンで見つかったバグを修正したリリース版が公開されるのだと思います。xda-developerの書き込みを見ると、"there is no Calendar and Calc apps."とか言ってる人がいましたが、GMSもちゃんと入ってます。早速root奪取して文鎮化してる人("it is in boot loop")も居て楽しそうです。
このGB祭に遅れまいと、私もFroyo(2.2.2)からメジャーアップデートしてみました。このアップデートでは、microSDを使った書き込みを2回行います。気のせいかもしれませんが、以前より動作が軽快になったような気がします。一時、GPS Statusでコンパスが動かなかったりしましたが、今は快調です。放置状態でリブートが一回ありました。稼働時間を見ると、他にも見ていない間にリブートがあったようです。

目立った大きな問題は、ddmsでログが取れない事。

Unable to open log device '/dev/log/main': No such file or directory
の一行でおしまい。ddmsを開いても、device-state, radio-state, logcatは何も情報を出してくれません。ログを参照しないせいか、process status, app-stateは取得できます。


Settingsのバージョン情報
ページ切り替え中のホーム画面


2011年11月5日土曜日

IDEOS X5をアップデート(Android 2.2.1→2.2.2)

IDEOS X5(U8800)の新しいファームウェアが2ヶ月前に公開されているのを、今日になって知りました。残念ながらGingerbreadではありませんでした。数日前にU8800+用のGBファームウェアが公開されたので、ワクテカしながら待つことにします。
Gingerbreadでは無いものの、Androidバージョンが2.2.1から2.2.2に上がるようなので、U8800をアップデートしました。このアップデートではユーザーデータが消去されるため、以前の環境をそのまま引き継げないようです。書き換え後の再起動時に /data がフォーマットされる旨のメッセージが表示されました。
CWM Recoveryで前のデータを戻せないか試してみましたが、androidアニメーションまで行って再起動を繰り返すばかり。面倒ですが、地道に環境を復旧します。

アップデート前
アップデート後

2011年5月29日日曜日

無線LANが使えなくなった、の巻

画面キャプチャためにHong Kong PCCW版を入れて、直後にClockwork Recoveryを使ってOverseas General versionに戻したところ、IDEOS X5の無線LANが使えなくなりました。WiFiをオンにしようとすると、「エラー」と表示されてチェックが有効になりません。ユーザーデータに問題があるかと思って、Clockwork Recoveryの「wipe data/factory reset」で初期化したところ、現れたのはOverseas General版でなく香港版の工場出荷状態の画面でした。「ついに、やってしまったか」と思いましたが、良く考えれば当たり前。Clockwork Recoveryもfactory resetも、全てを置き換えるわけではなく、read only部分を除いたユーザーデータのみがbackup & recoveryされただけの事でした。香港版とOverseas General版では無線LANのON/OFFに変更があるらしく、ちぐはぐな組み合わせだと機能しないようです。
Overseas General versionのファームウェアに書き換えた後で、同じOverseas General版のバックアップからリカバリーを行ったところ、無線LANは無事に復活しました。

2011年5月28日土曜日

IDEOS X5の残念なファームウェア

ファームウェア更新中の画面。数分で完了します。


試しに香港版B153入れてみました。香港のSIMフリー端末を買った人は、こんな感じのショートカットが並んでいると思います。実に残念なデスクトップ。このペンギンがなかなか消せませんでした。

プログラムのアイコン。am730とかBubble Bash2とかIron Man2とか、見慣れないものは大概不要なアプリ。Overseas General vesionやMalaysia版、中国版には、こんなの入ってません。root取ってこいつらをコツコツ消していくことも出来ますが、さくっとファームウェアを書き換えたほうが、早く楽に幸せになれます。


香港版を書く前に使っていたOverseas General versionに戻すべく、Clockwork Recoveryを入れます。下は、recovery.imgを置き換えるためにbootloaderモードで起動中の画面。全体が紫一色。


recovery.imgを入れ替えて、リカバリーモードで起動したところ。反転していてわかりにくいですが、カーソルは backup&recovery の位置にあります。


無事にOverseas General versionがリカバリーできました。
めでたし、めでたし。

2011年5月27日金曜日

IDEOS X5(U8800)のバックアップとリカバリー

 メジャーな機種は、Android marketからROM ManagerをインストールしてClockwork Recoveryを導入することが出来ますが、IDEOS X5用はROM Managerでダウンロード可能なリストに載っていません。xda developersにあるので、コレを使います。
導入方法は、Detailed Installationに書いてある通りです。

  1. 電源を切る。microSDカードのdloadフォルダにアップデート用のファームウェアが無い状態にする。SDカードを抜いておいてもOK。PCとのUSB接続は抜いておく
  2. [volume up]+[volume down]+[power]を3つ同時に押しながら電源を入れる。画面全体が紫色になったら(ブートローダーモード)次のステップへ。microSDのdloadフォルダにファームウェアがあると、ここで書き換えが走ってしまいます。microSDは外しておいたほうが安心です。
  3. USBで母艦PCと接続する。U8800がマスストレージデバイスとして認識され、/cust_backup が書き込み可の状態でマウントされる。
  4. オリジナルのリカバリーイメージである recovery.img の名前を変えておく(recovery.bak等)。Clockwork Recoveryのrecovery.imgをコピーして代わりに置く。
  5. タスクトレイのアイコンを使ってマスストレージをアンマウントし、USBケーブルを外す。バッテリーを一旦外してブートローダーモードを抜ける。以上。
リカバリーモードに入るには、[volume up]+[power]を同時に押しながら起動します。あとは、メニューを見ればわかるでしょう。バックアップはmicroSDカードに保存され、一回に付き500MB以上のスペースが必要になります。
 リカバリーの手段が確保されれば、ファームウェアの入れ替えは気軽に出来ると思います。

2011年5月26日木曜日

IDEOS X5(U8800H)のファームウェアを更新

私が購入したIDEOS X5は、香港向けに出荷された物です。

  • USBテザリングは出来るが、ポータブルWiFi AP機能は無効化されている
  • ゲームやコミュニケーションサービス等のプリインストールアプリが山盛り
  • プレインストールアプリは香港でしか使えない物が多く、Android標準の物以外は、ほぼ全てが邪魔

という、そのままではかなり使いにくいものでした。WiFiテザリングは、待っていればそのうちサポートされるかなと思っていましたが、プリインストールアプリの邪魔臭さには辟易しました。これらは、roマウントされたファイルシステムにあるため、通常の方法ではアンインストールも出来ません。
最初は、/data/system/packages.xml を覗いて消したいアプリの当たりをつけ、root化&rw remountをした後にapkを消して無理やり削除していきました。しかし、.apk以外のファイルが一緒にインストールされているアプリもあったりして、アンインストールが不完全なのは明らかでした。

間もなく、新しい中国向けファームウェアでWiFiテザリングが可能なったという人が巨大掲示板に現れました。
IDEOS X5には、各国の事業者別にアップデート用ファームウェアが用意されていて、
いくつかは、http://wiki.modaco.com/index.php/Huawei_Firmware_U8800 にリストアップされています。U8800H用としてはマレーシア向けのファームウェアが比較的新しそうだったので、Malaysia MAXIS用に入れ替えてみたところ、見事にWiFiテザリングが有効になりました。

しかし、Malaysia版にした後、唯一の購入済みアプリであるToriSatと、青空文庫を読むための縦書きビューワがサポート対象外になってダウンロードできない事に気づきました。それではと言うことで中国版にしてみたのですが、こちらも駄目。さらにHuaweiの中文サイトを探した結果、Overseas General versionのファームウェアがありました。これを入れると、ToriSatのダウンロードが可能かつWiFiテザリング有効という、申し分の無い状態になることがわかりました。日本でIDEOS X5を使う人には、とってもオススメです。

2011年5月23日月曜日

IDEOS X5を買った

約3週間前になりますが、ゴールデンウィークにIDEOS X5(U8800H)を買いました。
X5じゃないIDEOS(U8150-B)とどちらにするか悩みましたが、サクサク動くほうがいいと思ってX5を選びました。
800MHz帯に対応していないので、FOMAプラスエリアでは使えません。自宅と首都近郊、奥多摩、帰省先、関越自動車道、伊豆諸島と、自分の行動範囲は2.1GHz帯でカバーされているので、プラスエリア非対応でも問題ありません。




表は黒、裏は白。普通は表裏とも黒ですが、他機種が黒一色ばかりなので、自分の物だと見分けがつきやすいように、白を選びました。

2011年4月24日日曜日

Androidの抱えるバージョン格差問題

 先月から、毎日のようにAndroidのソースをさまよい歩く日々が続いています。何かアプリを作ろうという訳ではなくて、目的は専らトラブルシューティング。

 何件か問題を解決していく過程でわかったのは、Androidは既にリリースしたバージョンに対するバグフィックスが殆どなされないという事でした。開発の先端バージョンでは、解決可能なバグは修正されているのですが、旧バージョンのブランチにマージされないのです。Froyoで修正された問題はEclairにはマージされませんし、Gingerbreadで修正された問題はEclair,Froyoにマージされません。最新バージョン以外では、修正の恩恵を受けられないのです。Androidのリリースエンジニアリングについて完全に把握しているわけでは無いので、もしかすると私が誤解しているのかもしれません。リリースブランチなど存在せず、masterブランチにタグが打たれているだけのようにも思えます。そう思えるほど、旧バージョンのサポートは手薄です。まさに「放置」と呼ぶにふさわしい状況。具体的な例は挙げられないのですが、リセットに至るようなレベルのバグでも放置です。

 問題の原因を発見して解決方法を考え、それが最近のバージョンで修正されている事実を初めて知った時の脱力感は忘れられません。それ以来、問題解決の手法は、リポジトリの履歴を辿って、既に修正がcommitされていないか探すところから始めるようになりました。そして、このやり方で複数の問題が解決されつつあります。

 未だにEclair,Froyoなどという旧バージョンを相手に開発している体制に問題があると言われればそれまでかも知れません。対象の開発スピードが速いのだから、もっとスピーディーに追従すべきというのは正論でしょう。ですが、Androidの公開リポジトリを見ると、「そっちもバージョン上げないの?」と言いたくなる問題が存在します。
 実はAndroidには、バグ修正のリリース間格差だけでなく、同じリリースの中でもexternalの下は数年前の旧バージョンのまま放置という、モジュール間格差が存在します。お陰で、カーネルの更新にexternalが追いつかず、externalの下のコマンドが使っている旧APIがカーネルから削除されるという問題まで生じています。これは、Androidのバージョンを上げても解決されません。むしろ、Androidのバージョンを上げるとカーネルのバージョンが進むので、静かに進行していた問題が顕在化します。Googleがカーネル以外を含んだ全体をきちんとサポートしていればいいのですが、それが期待できれば苦労はしません。

 旧バージョンに居残っても、新バージョンに進んでも問題にぶち当たるのがAndroidです。とは言っても、新バージョンへの移行は当然の流れですし、全体的に見れば新しい方が解決すべき問題は減る傾向にあるので、前へ進んでいく以外の選択はありません。

2011年3月27日日曜日

AlertDialogで二重クリック

androidのAlertDialogは、ボタンが一回押されたら閉じてしまう。だから、ボタンは一回しか押されない。そう思っている時期が私にもありました。
でも、違いました。AlertDialogは、二度押しを防ぐ仕様にはなっていません。

最近、AlertDialogのボタンが二度押しされていると思わせるような事があったので、簡単なサンプルを書いてエミュレーターで試してみました。
new AlertDialog.Builder(DialogTestActivity.this)
.setTitle("Dialog Test")
.setMessage("Are you OK?")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
 @Override
 public void onClick(DialogInterface dialog, int which) {
  Log.d(TAG, "Clicked OK.");
 }
})
.setNegativeButton("Cancel", null).show();
こんなコードを書いて、表示されたダイアログのOKボタンをダブルクリックすると、二重押しを示すログが残ります。
03-27 10:02:27.576: DEBUG/DialogTest(317): Clicked OK.
03-27 10:02:27.629: DEBUG/DialogTest(317): Clicked OK.
OnClickListener()の中に多重実行を想定していない処理が書いてあると、問題が起きるかも知れません。

2011年3月22日火曜日

今日の停電は何時から?

停電前に家鯖をshutdownするのを忘れないように、停電時刻を表示するシェルスクリプトを書いてみました。使い方は、usageを見ればだいたいわかるでしょう。第一引数がグループ、第2引数が日のオフセットです。引数は省略可で、省略時には私の家の属する第4グループの予定を表示します。オフセットを与えることで、翌日以降のスケジュールもわかります。

しかし、ここで問題が。3月26日以降は各グループがさらに5分割されるので、正確さを期すためには、より細かい判定が必要になります。今のスクリプトでも使るでしょうが、停電対象から外れる空振りが多いはずです。

#!/bin/sh

# arg1 or default(4) as blackout group
grp=${1:-4}
# args or default(0) as day of year offset
offset=${2:-0}
if [ $grp -lt 1 -o $grp -gt 5 -o $offset -lt 0 ]
then
  echo usage $0 [1-5] [offset]
  exit 1
fi
echo Group $grp

doy=`date +%_j`
doy=`expr $doy + $offset`
pattern=`expr $doy - $grp`
pattern=`expr $pattern % 5`

case $pattern in
0) echo 9:20-13:00, 16:50-20:30 ;;
1) echo 6:20-10:00, 13:50-17:30 ;;
2) echo 18:20-22:00 ;;
3) echo 15:20-19:00 ;;
4) echo 12:20-16:00 ;;
esac
exit 0

実際にUbuntu Linuxの上で動かしているのは、こんなスクリプトです。

#!/bin/sh

# arg1 or default(4) as blackout group
grp=${1:-4}
if [ $grp -lt 1 -o $grp -gt 5 ]
then
  echo usage $0 [1-5]
  exit 1
fi

doy=`date +%_j`
hour=`date +%k`
pattern=`expr $doy - $grp`
pattern=`expr $pattern % 5`

if [ $pattern -eq 0 -a $hour -eq 9 ]
then
  # 9:20
  shutdown -P now
elif [ $pattern -eq 1 -a $hour -eq 6 ]
then
  # 6:20
  shutdown -P now
elif [ $pattern -eq 2 -a $hour -eq 18 ]
then
  # 18:20
  shutdown -P now
elif [ $pattern -eq 3 -a $hour -eq 15 ]
then
  # 15:20
  shutdown -P now
elif [ $pattern -eq 4 -a $hour -eq 12 ]
then
  # 12:20
  shutdown -P now
fi
exit 0


これを、cronを使って毎日6,9,12,15,18時台の早い時刻に実行して、停電前であればshutdownを実行するようにしています。

13  6,9,12,15,18        * * *   root    /usr/local/bin/scheduledshutdown.sh

追記
実は我が家のあるエリアは計画停電の実施対象外である事が判明。道理で、今日まで一度も停電してません。

2011年3月10日木曜日

Shuttle XS35

 先週末にLOOX T70HからShuttle XS35へおうちサーバーを引っ越しました。
http://www.shuttle-japan.jp/barebone/XS35/
なかなかいい感じです。冷却ファンが爆音なくせにメモリ付近に熱がこもるT70Hと比べると、XS35は静かです。内蔵した5400rpmのHDDも思いのほか静かで、これならリビングに置いても問題になりません。
性能的には、PentiumM 1.1GHzのクロックを落として使っていたT70Hより向上していると思います。MRTGの負荷グラフは以前より低くなりました。

XS35はなかなかいいのですが、、惜しい所が2点かあります。

  • 2台目のHDDを固定する金具が1台分しか無い。接続キットはオプションとして販売されていないので、HDD2台内蔵は無理。
  • 無線LANカードが内蔵されているが、。現在公開されているファームウェアでは使えない。初期状態では使えず、Windowsで起動して有効化する必要がある

どちらも、我が家の用途では問題になっていませんが、あてにしている人は要注意です。Linuxでも無線LANは使えますが、Linuxだけで完結できないのが残念。

2011年3月6日日曜日

おうちサーバが昇天間近

おうちサーバとしてUbuntu Linuxを動かしているLOOX T70Hがいよいよ駄目らしい。

カーネルアップデートのために再起動しようとしたら、冷却ファンエラーが発生するようになった。掃除で復帰するかと思ってやってみたら、かえって異音が増す始末。

引越しを決意して、AmazonでファンレスのCPU付きベアボーンとHDD、メモリ、キーボードを注文した。ちょうどプライム無料お試しの勧誘があったので、登録してお急ぎ便していした。1ヶ月経つ前に、プライム解約するのを忘れないようにしなくては。

引越しはMondoRescueを使うことになると思う、ATAからSATAへの引越し。ヒントになりそうなキーワードで検索したら、結局自分のblogにたどり着いた。またVMware Playerのお世話になりそうだ。

2011年2月3日木曜日

AndroidのonPreviewFrame()に渡されるformatが仕様と違う件

 Camera.PreviewCallback#onPreviewFrame(byte[] data, Camera camera)に渡されるデータは、デフォルトでYCbCr_420_SP (NV21)であるとReferenceに書いてある。検索してみると、この前提で書かれているサンプルもたくさんある。
  http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html

 しかし、SDKをここ数日使ってみたところ、どうも違うっぽい。実際にはYUV422SP(NV16)が来ている。Camera.Parameters#getPreviewFormat()は0x10(NV16)を返すし、data.lengthはY planeの2倍のサイズだし、NV16である前提でRGBに変換してみると、一応まともな画になる。逆に、NV21のつもりで変換すると、色がズレズレになってしまう。Issue 823のコメント22↓がまさにソレ。
  http://code.google.com/p/android/issues/detail?id=823#c22

 実機のカメラがLSIの都合でYUV422SPになるのはあり得るけど、エミュレータがこれではイカンですね。仕様が間違いなのか、実装が間違いなのか。RGB_565を指定してもまともに動かない、getSupportedPreviewFormats()を呼ぶとアプリが死ぬ等、PreviewFormatまわりは相当にひどい出来。まともにテストしてないね。