« 2012年9月 | トップページ | 2013年2月 »

2012年10月

2012/10/12

Androidアプリのソースをリビルドする

夏にスマホを ARROWS X F-10D に買い換えて、以前使っていた レグホン(REGZA Phone T-01C) を子供にあげました。
まだ5歳なんですが、ちゃっかり音声検索で仮面ライダーの動画とか探したりして使いこなしています。

で、Androidで仮面ライダーのベルトのアプリを作っている方を発見し、いくつかインストールさせていただいたところ、むっちゃウチの子供のツボにハマりました。
ずーーーっとそれで遊んでいます。

で、もちろん ディケイドライバー もインストールしているのですが、子供から Youtube で見つけた K-Touch を入れて欲しいと要望が。
K-Touch は他の方が作ったものが Google Play にあがっているので、そこからインストールしようとした所、OSのバージョンが低くてインストールできませんでした。
2.3.3 以上なんだけど、レグホンは2.2だからなあ。

もう少し調べた所、なんとこのアプリのソースが sourceforge にあがっているではないか。
そもそも、音を鳴らすだけのアプリに Android2.3 も必要なわけない。
ソース解析してリビルドしてやろう、と思いました。

でも、ソースってどうやってダウンロードするのだ?
Webから見ればソースファイルを1つ1つ見ることはできますが、全部のファイルをそうやって落とすのは手間過ぎる。
svn で管理してるっぽいので、svn 入れて落とすか。と思いましたが、まてよ、ということは、WebDAVが使えるんじゃないか、と思って、普段使っている CarotDAV でアクセスすると、やはりダウンロード可能でした。

さっそく、Android の開発環境が入っている Eclipse で開いてビルドしたところ、エラーが。
何か不足しているのか?と思いましたが、過去に作ったソースをビルドしてもエラーが。
「Your project contains error(s),please fix them begore running your application」 と出ます。
そんなはずは無い、と思って調べたら、blog lesson 01 【Android】EclipseのAndroidプロジェクトの謎エラー
に情報がありました。
デバッグ用証明書の有効期限切れらしい。そういえば、開発環境作ってからだいぶ経つもんなあ。

ここに書かれている通り、「ウィンドウ」→「設定」→「Android」→「ビルド」 から デフォルト・デバッグ・キーストア のパスを探し、このファイルを削除してから 「プロジェクト」→「クリーン」を行えば、過去に作ったものはビルドできるようになりました。
Android開発者にとっては常識なことなんだろうか・・・。知らなかった。

しかし・・・。K-Touch の方は相変わらずエラーが解消せず。
そこで、「gen」フォルダと「bin」フォルダを削除し、「クリーン」してビルドしたらうまく通りました。

で、案の定OSのバージョンを落とし、AndroidManifest.xml の compatible-screens でエラーが出るのでここを削除してビルドしたら、レグホンでも動くようになりました。
ソースの修正は簡単だったのに、そこに行くまでが大変だった・・・。

| | コメント (0) | トラックバック (0)

2012/10/04

WindowsのバッチファイルのFOR内で 遅延環境変数の展開 をしつつ、FORの外でその値を参照する方法

タイトルがむっちゃ長くてしかも何を言っているのかさっぱりなんですが、Windowsのコマンドが解る人には解ると思います。たぶん。

最近、Windowsのバッチファイルを作る機会が多くあり、すっかり忘れていたコマンドの使い方を覚えなおしています。
ちなみに、ネットで調べるとき、「コマンド」で調べるとLinuxにヒットしてしまうので、コマンドプロンプト と付けると割りと探しているものが見つかります。

で、バッチファイルを作っている際に困った状態になりました。

settei.ini という 設定ファイルに
A
B
C

と書かれていて、この値を1個ずつ引数にして別のバッチを動かし、
その別のバッチで設定したメッセージを取得したい場合、

SUBBAT.bat に

~いろんな処理
SET SUBMESSAGE=メッセージ

と書かれていて、


MAINBAT.bat で

SET MESSAGE=
FOR /F %%VAL in (settei.ini) do (
  CALL SUBBAT.bat %%VAL
  SET MESSAGE=%MESSAGE%%SUBMESSAGE%
)

と SUBBAT.bat にある %SUBMESSAGE% を MAINBAT.bat のループ内の %MESSAGE% に追記しようとしても
うまくいきません。

というのも、 FOR のカッコ内は、FORが実行される時に変数が展開されてしまうから、
この時点で %MESSAGE% にも %SUBMESSAGE% にも値が無いので
FOR /F %%VAL in (settei.ini) do (
  CALL SUBBAT.bat %%VAL
  SET MESSAGE=
)
と同じことになってしまいます。

そんなわけで、SET MESSAGE= の時に変数を展開させるため、

SET MESSAGE=
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F %%VAL in (settei.ini) do (
  CALL SUBBAT.bat %%VAL
  SET MESSAGE=%MESSAGE%,%SUBMESSAGE%
)
ENDLOCAL
ECHO %MESSAGE%

とすると、途中まで想定通りに動きます。
しかし、ECHO %MESSAGE% では何も表示されません。

というのも、ENDLOCAL を通り過ぎると %MESSAGE% が SETLOCAL を通る前の値に戻るので、
設定した値を参照できないからです。


どうすればいいのだ?と思って調べたら、
IIJIMASの日記って所に
バッチファイルで、setlocal~endlocal内での変数の値を外部に引き継ぎたい!
というズバリな記事がありました。

ENDLOCAL && SET MESSAGE=%MESSAGE%

とすれば、ENDLOCAL を通り過ぎても %MESSAGE% の値を参照できました。


できたのはいいが、
なんで Windows のバッチファイルは毎度毎度、こんなに裏技っぽいんだろう???

| | コメント (0) | トラックバック (0)

« 2012年9月 | トップページ | 2013年2月 »