Rapid Express

Rapid Express

中小企業を支援するLinuxベースのWebアプリケーション開発

Rapid Express RSS Feed
 
 
 
 

AndroidのカスタムROMに手を出してみた

実は、手持ちのAndroid端末はDoCoMoのHT-03Aではなく、直前にGoogle Developer Day 2009で配布された同等機種(GDDP)をオクで入手し、SoftbankのSIMを挿して運用しています。

高速SAで人大杉だったりと回線品質はネタものですが、HT-03Aと同じものをローコストで運用でき密かにほくそ笑んでいたものの、大きな落とし穴に気付きました。

ADP1やGDDPの開発機では、コピー禁止オプションで登録されたアプリがマーケットに表示されないのです。
フリーのアプリですら表示されないものがあるうえ、今後開始される有料アプリの大半は利用できないはずです。

まあ、開発機なんだから他人のアプリ使ってる暇には自分でアプリ作れよ・・・ということなんでしょうけど、すっかりRobo Defenceを購入する気でいた自分にとっては、耐えがたい制限でした(笑)

そんなわけで、カスタムROMを入れてみることにしました。

試したのは、Drizzy’s HeroとCyanogenMod 4.1.11.1です。

画面キャプチャ 画面キャプチャ
CM 4.1.11.1 ・・・一部画面合成(笑) Dwang-v1.11 + negroテーマ

結果としては、みごとコピー禁止のアプリもインストールできるようになり一安心です。

Drizzy’sはHero系ROMの中でも軽いほうらしいですが、普段使いとしては躊躇する点がいくつかあったので、ブラウザのFlushはなくてもいいし、軽く安定しているCyanogenModのROMで様子をみることにしました。

CyanogenMod 4.1.11.1は現在Googleからのクレームにより公開停止中ですが、“update-cm-4”で検索すれば、あちこちのダウンローダーに見つけることができます。
もしくは、マーケットアプリであるCyanogenMod Updaterを使ってもダウンロードできるようです。

(11/9追記)
CM 4.2.1まで付き合いましたが調子があまりよくないので、現在はDwang-v1.11を入れています。
Dwangは余計な機能を入れずに標準ROMを徹底してチューニングしており、サクサク感は定評です。
app2sdを使わないよう2ndパーティションも消しているので、記事も修正しました。

以下、備忘録をかねてroot化からのまとめ・・・

■ root化

  1. Recovery Flusherをapkからインストール
  2. setupsuをapkからインストールして実行
  3. PCと本体をつなぐ
    adb shell
  4. /data/data/org.zenthought.flashrec/cache/asroot /sdcard/droidsploidXXXXXX /system/bin/sh
  5. mount -o remount,rw /dev/block/mtdblock3 /system
  6. cd /system/bin
  7. cat sh > su
    chmod 4755 su
  8. ln -s /system/xbin/busybox mkswap
    ln -s /system/xbin/busybox swapon
    ln -s /system/xbin/busybox swapoff
    ln -s /system/xbin/busybox free
  9. mount -o remount,ro /dev/block/mtdblock3 /system

■ リカバリーユーティリティの差し替え

  1. Recovery Flusherを実行
  2. Buckup Recovery Image を選択
  3. Download Revovery Image 1.4を選択
  4. Flush Recovery-Imageを選択
  5. switchrom.shをダウンロードして/system/sdへコピー
    adb push d:\switchrom.sh /system/sd

■ nandroidのバックアップ

  1. HOME+電源でリカバリーモード起動
  2. nandroid v2.2 backupを選択
    go to console を選択
  3. 本体とPCをつなぐ
    adb shell
  4. mount /system/sd
    sh /system/sd/switchrom.sh -s [保存する名前]
    y

■ nandroidのリストア

  1. HOME+電源でリカバリーモード起動
  2. restore last backupを選択
    go to console を選択
  3. 本体とPCをつなぐ
    adb shell
  4. mount /system/sd
    sh /system/sd/switchrom.sh -r
    [番号]

■ フォントとmediaのバックアップ(念のため)

  1. adb pull /system/fonts/DroidSansJapanese.ttf d:\
  2. adb pull /system/media d:\

■ その他のバックアップ

  1. AppManagerによるアプリのSD保存
  2. アプリ一覧のリスト控え
  3. SDカードをハードディスクへバックアップ

■ SD(16GB)のパーティショニング

  1. HOME+電源でリカバリーモード起動
  2. go to consoleを選択
  3. 本体とPCをつなぐ
    adb shell
  4. parted /dev/block/mmcblk0
  5. print
    rm 1
    mkpartfs primary fat32 0 15000
    mkpartfs primary ext2 15000 15900
    mkpartfs primary linux-swap 15000 15032
    quit
  6. upgrade_fs
    reboot
  7. SDの内容を書き戻す

■ ROM焼き!

  1. アップデート用zipファイルをSDカードに保存
  2. HOME+電源でリカバリーモード起動
  3. wipe data/factory reset
  4. apply any zip from sdでzipを選択

■ 再設定

  1. 日本語ロケール
    Settings→Locale & text->Select locale→Japanse
    または、Custom Locale→ja_JP
  2. APN設定
    設定→ワイヤレス設定→モバイルネットワーク→アクセスポイント名
    menu→新しいAPN

    名前 Softbank 3G
    APN simale.world
    ユーザー名 dna1trop
    パスワード so2t3k3m2a
  3. Wifi設定
  4. Googleアカウントを設定
    Gmailを起動
  5. ニコタッチWnnの再インストール
  6. Swapper for Root usersの設定と動作の確認
  7. 日本語フォントとmediaの移植(必要なら)

参照サイト: コムギドットネット HT-03A Archive

 

Robo Defence Free 攻略! (笑

最高難度レベル10がクリアできるようになったので、攻略法なぞ残してみる。

画面キャプチャ

まずは初期配置の定石。

入り口がセンターから下(左翼)にずれてるので、行く手をふさぐと上(右翼)に流れるのを利用し、だんだん増える手駒で迂回路を延ばしていく。

ルート作成を優先し、ポイントを節約するため5pt砲台のみを使用し、ここまでの完成で取りこぼしは許されない。

画面キャプチャ

ここでようやく20ptミサイルを解禁。

航空路の通り道にスロータワーを配置し、左右に2基ずつミサイルを配置し。両翼の辺境地帯は節約のため5pt砲台でまかない、攻防のバランスをみながら攻撃力のあるミサイルに転換していく。

ただし、左翼前列は、初期打撃を与えるため最初からミサイルをおごる。

画面キャプチャ

ここでアパッチヘリの襲撃を2回受けるが、防ぎようがないのであきらめる。

なお、レベル10は航空機の通り道がこれまでと変わり、上(右翼)にずれている。

画面キャプチャ

陣地をここまで完成させた頃、集中的な地上攻撃を受けるので、これを利用して地対空ミサイル購入ポイント(90pt)を貯える。

すくない消費ポイントで防御するためには、様子を見ながらスロータワーをレベルアップが効果的。

画面キャプチャ

ようやく設置できた1基目の地対空ミサイル。
猛攻のドサクサに180pt費やしてレベルアップ済みなれど、すでに13ハート(´・ω・`)

レベル10は、最後に大航空部隊の攻撃があるため、最終的にはスロータワーの両脇1列ずつを地上防御力が落ちるのを覚悟で、地対空ミサイルに転換していく。

地上攻撃をぎりぎりかわして、対空戦力に膨大な予算投入が必要なのだ。

画面キャプチャ

足の速い地上装甲車を打ちもらしたときに備えた、地雷にによる最終防衛ライン。

しかし、地対空ミサイルの配置が遅れぎみで残り9ハートにまで消耗してしまった。このペースだとクリアできないかも・・・

画面キャプチャ

キター! わずか6基の地対空ミサイルで防げるか?

画面キャプチャ

ショボーン、防げなかったお (´・ω・`)

地対空ミサイルの配備をもう少し前倒しにしないと駄目だね。

そもそも、最終防衛ラインの地雷原を一度も使ってないってのは、地上防御力に予算を回し過ぎた証拠。
クリアできたときは、何度も地雷で助けられたから・・・

ふう、しかしプライベート時間を食いつぶすゲームだなこれ(笑)

そういえば、テレポートタワー使ってないな?


ということで、追記

レベル10のステージ100。
最後のギガントに最後の一発があたる瞬間をポーズで止めてみた。
5ハート残してクリア!

画面キャプチャ

コツとしては、次の攻撃開始前に必ず90ptを確保し続けること。

航空機がきたらすぐに地対空ミサイルを増強する・・・のみならず、積極的に180pt貯めることを優先して、航空機が来てなくても(90pt残して)地対空ミサイルを配備。
それでちょうどバランスが保てる感じ。

また、縦深陣地の構築を急ぐより、最前列のミサイルからレベルアップしていくほうが効率的。
しかし、装甲車の大群をさばくには縦深陣地が必要なので、これも攻防見ながらバランスを取る。


追記の追記

どうもクリアの確実性に劣るので、方針を転換。
地雷を有効に使うことと、地上戦と最終滞空防御を分けることに。

画面キャプチャ

中盤。

画面キャプチャ

そしてクリア。

この配置が一番安定してクリアできるかも。

 

着信音の選択にTone PickerとRingdroid

Androidは標準では使いにくいと言われます。

その代表的なのが着信音の指定でしょう。
標準の電子音以外の、SDカードにコピーした音楽ファイルを自由に選択する方法が用意されていません。

マーケットでアプリケーションを入手すれば簡単に指定できるようになるわけですが、なぜ標準でそれが出来ないんだろうと、普通は思うところです。

設計思想としては、アプリケーションで拡張できるからこそ、基本機能はシンプルに抑えてあるのでしょう。
その意味を実感するのもまた、この着信音の選択が典型なのかもしれません。

まずは、アプリケーションを使わずに、標準機能で任意の音源を選択する方法から・・・

SDカード上に次のようなサブフォルダを作成すれば、自分のすきな音源を標準の選択肢に加えることが出来るようになっていました。

/sdcard
    media
        alarms
        notifications
        ringtones

例えば、“You got a mail!” の音源をネットで捜し(必要ならmp3変換して)notificationsに入れれば、それをメール着信音(通知音)とすることができます。

しかし通知音はこの方式で良いとしても、アラーム音や通知音のために音源を一々フォルダにに振り分けるのは現実的ではありませんよね。
メディアプレーヤ用に取り込んだ楽曲を、あちこちのフォルダで重複管理することなり、複雑になります。

そこで、マーケットからダウンロードしてくるのはTone Pickerです。

画面キャプチャ

Tone Pickerをインストール後に、アラーム音の選択をタップしたところです。

アラーム音に限らず、着信音や通知音などで音を選択する場面ではAndroid標準の選択画面を使うか、インストールしたTone Pickerを使うかを尋ねてくるようになります。

画面キャプチャ

Tone Pickerの選択画面です。ここからでもAndroid標準の選択画面が選べるので、安心して「常にこの操作を使用する」ことができます。

「音楽トラックを選択」を選択すれば、SDカード内に収めたmp3音源を選択できるようになります。

画面キャプチャ

また、Tone Pickerを単体のアプリケーションとして起動すると、各種音源のボリューム設定になります。

画面キャプチャ

メディアプレーヤ用の音源をそのまま使用するのではなく、着信音専用に切り取って使用したいなら、Ringdroidがお奨めです。

画面キャプチャ

併用すると、Tone Pickerの中からRingdroidを選択できます。

画面キャプチャ

こんな感じで必要な範囲を切り出して使用することができます。

残念ながら、フェードインには対応していないようです。

 

ウィジットに頼らない設定切り替えツール

GPS等の設定切りツールが欲しいのですが、そのためにウィジットを使うのは電力の無駄です。

そこで、Androidあぷぷで紹介されていたUseful Switchersが以前から気になってたのですが、マーケットをいくら検索しても出てきませんでした。

今日になってふと、言語を英語にすればマーケットに出るかなあと試したのですが、無駄でした。
この上は、さらにSIMを抜いてwifiで試すか・・・いやまてよ、PCのマーケットに表示されてるQRコードを試してみよう。おっ、出た!

ということで、無事ダウンロードして利用することができました。

画面キャプチャ

で、ここまでの流れで変更していた言語を、日本語を戻してみるとUseful Switchesはアプリケーションエラーで起動しません(汗

もしやと思い、マーケットのコメント欄を日本にしてみると、「Crashed on HT-03A」のレポートの山、とほほ。
正確なレポートを入れないと対応してくれないでしょうから、「Crashed in Japanese」としておきました。

より正確には、最初の起動が英語という条件が前提にあり、その後も英語で起動すれば動くようです。
いずれにせよ、日本語では動きません。

それで第2候補で試してみたのが、Toggle Settings (Cupcake)です。
こちらは日本語でも動作しました。

画面キャプチャ

画面デザインはUseful Switchersが趣味なんですけどねえ・・・

 

メモリスワップでさくさくホーム復帰

AndrodがWM(Windows Mobile)と根本的に異なる点に、アプリケーションのメモリ管理があります。

いくつもアプリを起動するとメモリから追い出されたアプリが自動終了する点は同じなのですが、WMではその仕組みがうまくいってるとは言えません。WMユーザーが最初に覚えることは、タスクマネージャを導入して小まめにアプリを終了することでした。

逆に、Androidに詳しい――少なくともアプリ作成入門記事に目を通したユーザは、「タスクマネージャ? いらないんじゃね?」と口をそろえて言います。
画面遷移による状態変化が体系化され、それこそがアプリ作成入門者のABCとなっているからです。ならば、アプリ使用者側で気にする問題じゃないなあ・・・と。

しかし、前々エントリーで紹介したようにWebショートカットを多用してると、メモリ不足を痛感します。

Webブラウザはメモリを圧迫するので、ちょっと前に使ってたアプリも(ホーム画面でさえ!)すぐに終了してしまい、復帰に時間がかかるからです。・・・ホーム復帰に時間がかかると、モッサリ感を強く抱かざるを得ません。

そんわけで、巷で流行のrootの奪取とメモリスワップを導入してみました。

Swapper for Root usersは、画面遷移で退くアプリをSDカード上にスワップさせることで、アプリが自動終了するのを防ぐものです。名前の通り、rootユーザになれる端末でないと動作せず、HTC-Magic (HT-03A)では使えないハズだったアプリです。

画面キャプチャ

以下、そのメモです。

■ root権限の奪取

  1. setupsu.apkをダウンロードしてインストールし、一度実行する。
    これにより/system/xbin/su が作成される。
    以下の作業で、/system/bin/suにシンボリックリンクを作成する。
  2. デバッグモードをONにして、PCにUSBで接続(SDカードはマウントしない)
  3. PCのコマンドプロンプトからshellを起動する。
    adb shell
  4. 1で作成されたコマンドでsuになる。
    /system/xbin/su
  5. /systemを書き込み可で再マウントする。
    mount -o rw,remount /dev/block/mtdblock3 /system
  6. binに移動。
    cd /system/bin
  7. シンボリックリンクを作成。
    ln -s /system/xbin/su su
    ln -s /system/xbin/busybox mkswap
    ln -s /system/xbin/busybox swapon
    ln -s /system/xbin/busybox swapoff
    ln -s /system/xbin/busybox free
  8. リードオンリーで再マウントする。
    mount -o ro,remount /dev/block/mtdblock3 /system

これにより、いつでもsuでrootになれ、root権限を必要とするアプリも動作するようになります。

とういうことは、セキュリティ的にはとても惰弱な状態だということです。意味の分かる人以外、お奨めしないことを今さら忠告しておきます(笑

■ Swapper for Root users

マーケットでダウンロードしてインストールしスワップをONにするだけ。
※ USBケーブルでSDカードにアクセスするときは、事前にスワップOFFにしなければならない。

使用しているSDカードは、最初から付いていた2GBのものです。
スワップサイズはあまり大きくしても、かえってスワップでもたつきます。標準で32MBでしたが、現在は48MBで運用しています。

Webブラウザで大きなページを読み込んでいても、ホーム画面が裏で終了しなくなりました。

■ おまけ

rootを奪取したついでにカメラのシャッター音を無音のものに変更しました。

使用したデータnosound.oggは、こちらのサイトから。

  1. nosound.oggにSDカードのルートに保存。
  2. 書き込み可で再マウント。
    mount -o rw,remount /dev/block/mtdblock3 /system
  3. camera_click.oggをバックアップして、nosound.oggで上書き。
    cd /system/media/audio/ui
    dd if=./camera_click.ogg of=/sdcard/camera_click.ogg
    dd if=/sdcard/nosound.ogg of=./camera_click.ogg
  4. リードオンリーで再マウント。
    mount -o ro,remount /dev/block/mtdblock3 /system
 

Androidマーケットに登録してみた

AndroidマーケットはiPhoneにくらべて40分の1の市場規模だとか。

だからかえって気安く登録できるのかもしれませんが、手習いで作った簡単なプログラムを、アイコンを整え、そして英文の説明をひねり出して登録してみました。

●Stopgap Brightness

This simple program quickly makes brightness that you wish.
In the daytime probably in the outdoor it is lightened, and in the night well in the bed it is darkened until the device suspends.

誰でも思いつきそうで、それでいて、同じ趣旨のものはなかったように思います。

アクティビティの背景を透明にできなかったのが残念です。

 

Googleケータイのある生活

スマートフォンでGmailを運用する点は以前からそうだったわけで、今さら新鮮なことは何もないはずでした。
javaによるアプリ開発の興味から乗り換えただけだったのですが・・・

それがいざ使ってみると、WM(Windows Mobile)のGmail運用とは、全然違うのでした!(嬉

WMやiPhoneでもGoogleのサービスは利用できます。

SMSを利用したプッシュメールをトリガーに、アプリがGmailの未読を取得する仕組です。
この仕組みだと、携帯に着信したメールは携帯で読まない限り、携帯の未読ランプは消えません。
そんなこと当たり前だと、今までは思っていたわけです。

ただ、携帯で読んだメールをPCでも読む(既読にする)必要に面倒を感じていました。

ところがGoogleケータイたるAndroidでは、届いた未読メールを、付属のGmailアプリを使わずにブラウザのGmailモバイルで読んでも未読ランプは消えます。

それどころか、パソコンのブラウザでGmailを開いてメールを読んでも、携帯の未読ランプが消えるワケです。

むろん、どこまで読んだかの情報も、携帯とPCで完全に共有しています。

おかげで、パソコンが傍にあるならわざわざ携帯でメールを読まなくなりました。
それで逆説的に気付くのです。

あれ、今まではわざわざ携帯で読んでたの?? なんか本末転倒してね?

と。

ということで、現在のホーム画面です。

PCとモバイルでデータを共有してどちらでも操作できる環境は、このAndroidではじめて実現したものです。
WMやiPhoneのPCとのデータリンクとは、全く次元が違います。

画面キャプチャ

面白いのは、ここまでPCとシームレスであるのに、PCがなくても携帯だけでも完結することです。

ただし・・・

サービス アプリ名 備考
Gmail Webショートカット 標準アプリは使い物にならない
マップ 標準アプリ 唯一まともな標準アプリ
カレンダー 標準アプリ 今一の出来。Web版に変えようか・・・
タスク Webショートカット
ドキュメント Webショートカット アプリではExcel編集ができない
リーダー NewsRob Web版よりだんぜん使いやすい
ニュース Webショートカット
2ちゃん Webショートカット 自宅サーバーにrep2を設置

こうして一覧にすると分かるように、今のところ大半をブラウザ経由のWebサービスに頼っています。
WebならOSに依存しないので、iPhoneでも真似できるかもしれません(笑

肝心のメールアプリが使い物にならず(HTMLメール固定で、返信引用が削除できない等)、Web版をブラウザで使わざるをえないのが最大の難点ですね。

まともなアプリはGoogleリーダー用のNewsRobだけといって良いでしょう。
はやく何とかしてもらいたいものです。

 

OfficeオートメーションのセットアップをClickOnce

OfficeオートメーションのアプリケーションのセットアップをClickOnceで作るときに躓いたのでメモ。

今回、PowerPointのオートメーション機能に新たに加えたのですが、開発環境上での動作確認で問題なくても、他のクライアントからClickOnceセットアップを実行すると次のエラーが・・・

このアプリケーションをインストールまたは実行できません。このアプリケーションでは、まずグローバル アセンブリキャッシュ (GAC) にアセンブリ Microsoft.Office.Interop.PowerPoint バージョン 11.0.0.0 をインストールする必要があります。

システム管理者に問い合わせてください。

そういや、もともとWordとExcelのオートメーションプログラムとして作成して、まったく同じエラーでネットを検索して対策したのでした。ちゃんと覚えてられないこの鳥頭め・・・

ということで、ClickOnceの「アプリケーション ファイル」にて、OfficeのCOMコンポーネントをデフォルトのままの「必須コンポートネント」から「追加」に変更して、無事、回避しました。

画面キャプチャ

 

PowerPointを非表示でオートメーションする

Visual C# .NETでPowerPointをオートメーションする必要が出ました。

ところがアプリケーションウィンドウを非表示にできず困ったので、その顛末です。

まあ、概ね以下のようなコードでプレゼンテーションファイルを開くんですが、

PowerPoint.Application objApp;
PowerPoint.Presentations objPresSet;
PowerPoint._Presentation objPres;

objApp = new PowerPoint.Application();
objApp.Visible = MsoTriState.msoTrue;
objPresSet = objApp.Presentations;

objPres = objPresSet.Open(path, MsoTriState.msoTrue,
  ? MsoTriState.msoTrue, MsoTriState.msoTrue);

objApp.Visible を Falseにすると、次のエラーが出てしまいます。

System.Runtime.InteropServices.COMException (0×80048240): Application (不明なメンバー):無効な要求です。アプリケーションウィンドウを非表示することはできません。

それで、ネットを検索してみたのですが、PowerPointのオートメーションなんてあまり流行ってなくて、Excelに比べて情報量が圧倒的に少なく困りました。

ようやく見つけたがVB.NETのFAQで、Openの引数WithWindowsをFalseにすればOKとありました。

しかし、C#でそれをやっても依然と同じエラーとなります。さて、困った。

条件を変えてさらにググってみたところ、NamazuのFAQにたどり着きました。

Application.Visible : 無効な要求です。アプリケーションウィンドウを非表示に設定することはできません。

の例外が起きます。ところが、この例外メッセージが出てもインデックスは正常に作成されるようです。ということで、この例外メッセージを nul に送って無視してやれば、うまくインデックスできるようになります

なるほど?ってことで・・・

PowerPoint.Application objApp;
PowerPoint.Presentations objPresSet;
PowerPoint._Presentation objPres;

objApp = new PowerPoint.Application();
try {
    objApp.Visible = MsoTriState.msoFalse;
}
catch (Exception e) {
    //エラーを無視
}
objPresSet = objApp.Presentations;

objPres = objPresSet.Open(path, MsoTriState.msoTrue,
?   MsoTriState.msoTrue, MsoTriState.msoFalse);

こんなんで、いいんでしょうか(汗

 

Androidのお天気ウィジット

Windows Mobileではお天気表示のスクリプトを自分で書いたりしましたが、Androidだとフリーで十分実用的なウィジットがあって、私のような者の出る幕はありません。

使用しているのは、Weather forecast widget v2 です。

画面キャプチャ 画面キャプチャ

私は2マスのウィジットを使用してますが、情報量によっていろんなサイズを選択できます。

画面キャプチャ

天気データはGoogleから取得していて、東京だと23区レベルで場所を指定できます(表示は“東京”になるように設定で書き換えてます)。

ご覧のように日本語で天気情報を表示するようにできるのですが、残念ながら選択肢には含まれないので、多くの人が気付いてないように思います。

言語はohterを選択して“ja”を入力、エンコードもotherを選択して“sjis”を入力する必要があります。

画面キャプチャ

ついでに気温単位は“Celsius”ですね。

設定を変更したら最下段の「Save and exit」で抜けますが、そのときホームのウィジットにはすぐに反映せず、文字化けのままだったするので、混乱するかもしれません。
もう一度設定を開いて保存すれば、ウィジットにも設定が反映されます。