2011年11月26日土曜日

Widnows7の起動が時間がかかる(-_-メ)

昨年かったばかりのWidnows7(64bit)も当初は起動が速くて快適だったんですが、一年にしてなんかやたら起動に時間がかかるようになりました。HDDのデフラグとか、起動時のスタートアップで動くプログラム(スタートアップフォルダ内にショートカットが作られます)とかありますが一向に改善しません。

どうも最近のプログラムは昔のようにスタートアップのフォルダないにショートカットを作るんではなく、直接Widnowsの制御ファイルに修正加えちゃうようです。直接実行(スタートメニュー内に入力欄があります。WidnowsXPだと「ファイル名を指定して実行」になります。)で”msconfig”を実行します。すると以下のようなWindowがでてきて、起動時の設定を変更できます。


すると、あるわあるわ・・・ 何でこうも自分のプログラムをスタートアップに入れたがるアプリばっかなんだ。(これまでインストールしたプログラムが大抵なにかしらのプログラムを起動時にデーモンを動かすよう仕込んでました)アプリ系のは片っ端からオフにしてやったら、やっと以前のような速度で起動するようになりました。(大抵はまずければなんか言ってくるか、アプリ起動時に必要なものを起動してくれますが、たまにアプリ起動が失敗するものもでてくるかもしれないので、そのあたりは自己責任ということになります)

2011年11月23日水曜日

AndroidでOpenGL(ESですけど)

AndroidでOpenGLによるプログラムの書き方を調べています。正確には組み込み用のOpenGL ESですが、OpenGLとそんなに違いはありません。というか、そこまで詳しくOpenGLを理解しているわけではないですが、一通りOpenGL、およびOpen InventorをSGI上でc++によりプログラムしてみたことあるので、関数は知っています。ただAndroidだとどのclassのどのメソッド上にOpenGLの各関数を実装したらいいのかがわかりません。(Androidのアプリはステートマシンのようなもので、状態遷移のたびにCallされる関数が決まっているようですから、その順番にあわせて必要なOpenGL関数を実装していかないといけません。

ところで、基本としてAndroidのアプリ上で画像を描くには、まずアクティビティ(Activity:画面)を生成して、そこに描画領域を指定します。この指定方法に2つの方法があり、CanvasとSurfaceViewです。Canvasはアプリケーションスレッド上で動作するのに対し、そこと並行した別スレッド上で動かすSurfaceViewというような感じです。そして、OpenGL ESはSurfaceView上で動きます。

処理速度的にあSurfaceViewは別スレッドで動くので高速に動くように見えますが、アプリが動いているときは当該スレッドが当然動いているので、別スレッドとして動くSurfaceViewではどうしてもCanvasには勝てません。

追記:
ChromeのNative clientという技術があります。chroniumのベータ版という実用化までは先が長い技術なんですが、急展開して日本のスクエニがこれでゲームを作りchrome storeで販売を始める予定だと。技術の内容的にchrome上でc,c++のコードを動かすSDKだとか、、、セキュリティどうやって確保するんだ?何か色々注意点が書かれてましたが(早いコードを書くのに注意する点とか)そこのWebGLを使う上での注意点がかなりコード細かく記載されていました。読んで見ると、なるほどと思える事が多くてためになります。AndroidでOpenGL ES使う時も注意した方がいいような話です。


後で削除するか、大幅修正するけどとりあえずメモ

2011年11月21日月曜日

Androidの開発環境:MacBookAirではダメだった・・・??

作ったアプリがどうしてもエミュレータで実行できない(eclipseからエミュレータにインストールされない)ことを書きました。しかしいくらなんでもこのキャッシュの強さは異常に思い始めました。javaだから動作が「もっそり」するのは仕方ないにしても、ファイルの更新が全然システム(この場合はeclipseやエミュレータ)に伝わらないのはおかしすぎます。マシンを何度も再起動しました。

ふと考えたんですが、自分が持っているMacBookAirは初期型です。(マイナーはしてますが)HDDは持っておらず、初期のSSDを積んでいます。初期のSSDは書き換え回数が厳しく、いろんな技を使っていますが、その中でも強力なバッファを設定してキャッシュを構成していたはずです。もしかして、Mac OSの方で特殊なことをしていて、それとeclipseの相性が悪いんでないか?(要は、ファイル更新の情報がなかなか伝わらない)単にバッファを大きく積んでいるだけなら、MacBookAirの終了の速さ(2,3秒で電源が落ちます)はおかしいんですが、どうも何かやってるんじゃないかという気がしてきました。(新しいMacBookAirなど最近のSSDは性能が改善されていると聞いているので、また話が変わっているかもしれません)
試しに、Windows7をつんでいるノートPC(普通のHDDです)にAndroid開発環境をもう一揃いそろえてみました。そこにMacBookAirで入力したプログラムをUSBで持ってきて、動かしてみると・・・ファイルの更新が少し遅れますが、ちゃんと伝わります!やはり、初期型のSSDのためにファイルシステムが何か特別なチューンがしてあるようです。う~ん、MacBookAirではAndroidの開発はあきらめるしかないですね。

追記:
その後、Windows7のマシンでも、ちょっとファイルを修正した後、どうしても再ビルドをしてくれない事態にあいました。メニューのからクリーンを選択して、プロジェクトのbin以下が削除されても再ビルドしてくれません。わけがわからず実行してみたら、さすがに再ビルドしてくれました。(エミュレータが動いて、アプリの更新に30秒くらいかかりましたが、特に再起動しなくても更新してくれただけMacBookAirよりましです)時々、eclipseのファイルキャッシュと同期がとれていませんというワーニングをMacBookAirのときは見ましたし、どうにも動きの予想がつきません。慣れれば、これはこれでいいんだろうか?有名なツールだし・・・

結論:
このクリーン、MacBookAirで試してなかったんでやってみたら、どうやら確実に修正できそうな手順が見つかりました。

①ソースを修正する。
②一度、当該プロジェクトをクリーンする。(選択したプロジェクトのみで行い、クリーン後すぐ再ビルドのオプションを選択してもビルドはなぜかされず。)
③実行、或いはデバッグを行う。(これで再ビルドが確実に行われます)
④Androidのエミュレータを起動する。(Windows7では自動的に実行してくれましたが、Macでは手動で行う必要がありました。たまたまかもしれませんが。)
⑤Windowsの方は30秒くらい待ってると、更新したパッケージがエミュレータにアップロードされ動きます。但しMacの方はだめで、一度アンインストールしてからエミュレータを起動、eclipseから起動しても中々アップロードしてくれないので、手動でインストールする。

Macでは特にエミュレータでアプリが動いている状態で終了すると、その状態をずっと覚えているようで、アプリの更新が働きません。(何もワーニングらしきものが出てこないのでわからない)そのため、特にMac側ではエミュレータでアプリを停止するなり、削除することが必要なようです。Macの方がやはりキャッシュが強い気持ちがしますが、それでも処理速度は速いです。古いCore2の方が、コア単体のクロックが速いせいか、あるいは単にOSの軽さからくるのかわかりませんが。それでもMacで開発できるならこちらの方が快適なんでいいです。

2011年11月20日日曜日

Androidのアプリをエミュレータで実行できない

このところAndroidアプリの勉強をしています。プログラムはeclipseでつくり、エミュレータで動作を確認、その後実機テストを行うときはGalaxy S2へインストールしています。
ところで以前にも書きましたが、eclipse自体やエミュレータもjavaで作られているせいかやたらと強力なキャッシュが効いていて、なかなかソースの変更がバイナリに反映されなかったり、エミュレータで実行できない(DLされない?)ことがあります。最後はマシン自体の再起動なんですが、今回それでもだめな自体が起きました。どうしてもエミュレータで実行できません。(eclipseの実行構成からちょくにアプリを選択して、エミュレータを起動してもダメです)やむを得ないので、ネットでアプリのインストール方法を探してみました。そうしたら"adb"コマンドというのがあることがわかりました。

・インストール方法
エミュレータを動かしておいて、以下のコマンドを端末から実行します。

> adb install apkファイルのパス

なお、再インストールするさいアプリが作成したデータを残しておいてアプリだけ再インストールする場合は"-r"オプションをつけます。

> adb install -r apkファイルのパス

・アンインストール方法
ついでなので削除する方法も記しておきます。(エミュレータで直接削除してもいいんですが)

> adb uninstall パッケージ名

先ほどはapk自体を引数に与えましたが、今度はパッケージ名です。なお、アプリが作成したデータは残したい場合は"-k"オプションをつけます。

> adb uninstall -k パッケージ名

なお、以前開発環境を設定したときは環境変数でPATHに/Applications/android-sdk-macosx/toolsを設定しておきましたが、端末から動かせません。調べてみると、なんとadbコマンドは/Applications/android-sdk-macosx/platform-toolsの方に移動したとテキストファイルが残されていました。今回はちょくにフルパスいれて実行しましたが、環境変数に追加しておかないと。

2011年11月13日日曜日

Androidのサンプルがビルドできない

Androidのプログラミングの勉強で、とにかく今は多数のサンプルを動かしてみて動きを診ているところです。センサーの動きを見てみたくて、ちょっと長いサンプルをDLしてきてビルドしてみたところいくつかのメソッドが「スーパークラスのメソッドをオーバーライドする必要があります」と言ってきます!?いやいや何もそこは自分でさわってないぞ、しかも解決法おとしてリコメンドされるのが「@Override注釈を除去します」??? それっていいのか?
一晩悩みましたが、やっと理由がわかりました。JDK1.5と1.6でOverrideの仕様がかわり、1.5ではインターフェースのメソッドはOverrideアノテーションできなかったのが、1.6からはインターフェースのメソッドでもOverrideアノテーションが使えるようになったとのことです。まあアノテーションなんで、リコメンドどおり注釈を削除してしまってもいいんですが、これでは本末転倒です。
自分が作業に使っているPCにはJDK1.6が入っていますが、なぜ1.5として認識されてしまっているかというと、eclipseのプロジェクトの設定のところで指定できるところがあり、デフォルトが1.5になってしまっているんです。プロジェクトのところで右クリックして「プロパティ」を選択、JAVAコンパイラーのところでバージョンを選べます。
これを1.6にすれば無事ビルドもできて実行できました。

2011年11月12日土曜日

Androidのログ出力

Androidにもログ出力機能(クラス)があります。以下の様な感じです。


Log.i("HELOO", "called MyView constructor");

この場合、"i"なんでINFOになります。種類には以下があります。

ERROR  エラー
WARN  警告
INFO   情報
DEBUG  デバッグ
VERBOSE

見方はdmmsを直接起動するのと、eclipseから表示ウインドウを開くのと2通りありますが、eclipseの場合だと「ウインドウ」→「ビューの表示」→「その他」→「Android」「LogCat」(なぜかLogCatが2つあり、しかも一つは使用するなと書かれます??)で以下の様なウインドウがでます。(もちろんAndroidとはUSBで接続しておきます)
なんか、いっぱい表示されます。これでもINFOだけにフィルタかけてるんですが(画面の中央くらいに"HELOO"がでてます)、いろんなアプリがLogを出力しているようです。

2011年11月4日金曜日

Androidの開発:R.javaが生成されない!?

まだまだサンプルみながら、動作を確認している段階ですが、ある時から気づいたのがなんかlayout以下に自動生成されていたR.javaが生成されなくなっていました。そのため、ビルドしてもエラー、訳がわかりません。(最初の頃は勝手に生成されていた)
色々、調べてると結構悩んでいる人が多いらしくヒットはするんですが、どうも状況が違う。(res以下で、大文字まじっていると問題がでるとか色々ありました)ただどれも共通しているのが、ビルド時にwarningがでてるらしい。でも今悩んでいるのは、最初のプロジェクト生成時に、R.javaができないこと。(こんな感じで、gen以下に何も生成されません)


色々見ていると、そもそもR.javaはレイアウトの変更によっても自動的に更新が本来はかかるらしい。そこで思いついたのが、自分が自動ビルドのオプションはずして、手動にしたこと。そこで、プロジェクト生成して、R.javaはないけどかまわずそのままビルドしてみたら、勝手に生成してくれました。(ビルドしたところ、無事R.javaを生成してくれました)

ただ、この前悩んでたときは、プロジェクト生成後、ビルドするまえに色々ソースの修正してたら最初のビルドでR.javaを生成してくれませんでした。もしかしたらwarning出てたのかもしれません。よく注意していないと。

2011年11月3日木曜日

chromeブラウザの印刷機能(プレビュー含む)

Windows, Mac, Linuxでも愛用しているchromeですが、印刷機能がかなり貧弱でした。それが夏前くらいにいつの間にかプレビューがやっとついてました。(どうも、6、7月くらいについたらしいです)その後、8月くらいに「PDF出力」がついてるのに気づきました。
それまでは別のadd-onをつけないといけなかったのが、自前でPDF出力機能をもったようです。(おそらくそれを使ってプレビューを実現してたんでしょう)しばらく使ってみてたんですが、どうも出力PDFの品質が悪く、しかもファイルサイズが大きいです。(印刷設定がメニューにありません)おまけに、HPに日本語が混じってると、印刷がまともにできません。(出力は何事もなく終わりますが、その後出力ファイルをAcrobat Readerで見てみると、HPが真っ白です)しばらく待ってましたが、未だに日本語HPはだめだし、印刷設定もできません。しかたなく、今はshift+Ctrl+Pで、印刷機能を呼び出してそこでAcrobat Distillerを選択、印刷設定をしています。どうもデフォルトがイメージとしてしか出力できないようです。