HeavyBommer@blog
時事ネタ、コンピュータ、家電、プログラミング等々、思ったこと/考えたこと/提案/使用レポ/Tipsなどを思いついたときに書いてゆきます
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
ProGuard後のPreverifyエラー

前にJ2ME環境での難読化/最適化の話を書きましたが、今回変なエラーに遭遇しました。
もちろん、元のソースはエラーにならずきちんとjarの作成まで出来ています。
エラーが起きるのは、ProGuradをで難読化/最適化した後のファイルをPreVerifyするときです。
エラーの内容は


Inconsistent stack height 1 != 0

こんな感じです。
一応クラス名やメソッド名は出ていますが、ProGuardがかかってしまっているので、マップファイルを見てクラス/メソッドを特定しましたが、一件とくに問題はなさそうでした。
で、部分的にコメントアウトしつつ検証してみると、最適化によって中途半端にコードが削られるのが原因のようでした。
例えば
int a = 0;
if((a > 0) && (str.length() > 0))
のような感じで、けして中に入らない条件分岐に論理積(&&)で別の条件をくっつけたりすると、このエラーが起きる可能性が出てくるようです。


 ただ、必ず起きるわけではなく、javacのバージョンによっても変わってくるようです。
私の場合、1.4.2では上記エラーが出ましたが、1.5.0では出ませんでした。
とりあえず、このようなエラーが出た時は、マップファイルを見るとか、ProGuardの-keepオプションで問題のクラスのメソッドを難読化しないようにするとかして原因となるメソッドを特定し、このようなけして通らない処理が無いかどうか調べてみるのが良いと思います。


 ちなみに、なぜこのような処理があったかと言うと、MIDP用のプログラムをDoJaにコンバートしているので、中途半端に処理を削ったための所為でした。

スポンサーサイト
プラスチック油化装置
ちょっと前に、TV番組の特集でプラスチック油化装置なるものが紹介されていました。
この番組では、かなり夢の技術のような扱いでしたが、大きな落とし穴があります。

1)この装置の消費電力が明言されていない
2)結局精製した油を燃やすならCO2は削減できていない
3)都合の悪い部分は隠すような姿勢に問題あり

1については、番組内はもちろんのこと、上にリンクを張ったメーカのWebページでも書かれていません。
なぜ、これが重要かというと、精製した油を燃料にするのなら、精製に投入するエネルギーと精製して得られた油から取り出せるエネルギーの収支が問題になるからです。
つまり、1kW時のエネルギーを投入して得られた油で発電機を回して1kW時未満のエネルギーしか得られないなら、やるだけ無駄だということになるわけです。

さらに、ここで多少収支がプラスになるとしても、発電などに使うならそのまま廃プラを燃やしてその熱で発電したほうが効率的であることはほぼ間違いありません。

2について、会社のwebページには87%ものCO2削減効果とありますが、精製した油を燃やすことを考えれば結局は削減などしていないことになります。
もちろん、その分原油起源の燃料を使わなくてすむのだから…という理屈は成り立ちますが、上で書いたように廃プラを直接燃やしたほうが効率は良いです。

3についてですが、1や2で挙げたような点は「意図的に」ごまかしているとしか思えません。
まるで夢の技術であるように、欠点はまるっきり書いていません。
こういったものは、欠点が皆無なんてことはまず有り得ないわけですし、実際上で指摘したようなことがあります。
こういう部分を隠して、利点ばかり強調するやり方は、利益のことしか考えていないという証拠です。
本当に環境のことを考えているのなら、欠点は欠点としてきちんと公言するべきでしょう。
その上で、どれくらい有効なのか、課題はどの辺にあるのかなど語るのが本来の姿です。

テーマ:気になったニュース - ジャンル:ニュース

J2ME(DoJa/MIDP)の開発環境
J2ME(携帯電話向けJAVA)では、アプリのサイズを小さくすることが求められます。
最近の海外端末や、DoCoMoでも903i以降の機種はかなり大きなアプリでも大丈夫ですが、それでも数MBなので、リッチコンテンツを搭載しようと思うと極力容量は削りたいところです。
また、JAVAのクラスファイルは容易にリバースエンジニアリング出来てしまいますが、DRMなどに対応させるのは結構面倒&対応機種も限られてきます。

そこで、登場するのが難読化&最適化ツールです。
これは、クラス名やメソッド名なんかを短い名前に付け替えたりして、(リバースエンジニアリングされても)読みにくく、かつクラスファイルの縮小もしてくれるという物です。

今回は、備忘録をかねて、有名どころのProGuardをDoJaやMIDP端末向けに利用する方法を紹介します。

あと、携帯向けだとJAVAの理念はすっかり鳴りを潜めてしまい、メーカや機種による差異がかなり大きいです。
そうなると欲しくなるのがプリプロセッサなのですが、Sunは頑なにプリプロセッサの導入を拒否してくれちゃっています。
なので、今回はCのプリプロセッサも使えるようにする工夫も入れてあります。(ただし、デバッグ文の削除とか機種による動作の違いを吸収するとかいった程度を想定しています)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。