2012年3月31日土曜日

Android Emulator の実行中に拡大縮小を行う

Android Emulatorは、起動時にパラメータを与えることで拡大縮小できる。

これを起動してから動的に変えられたら便利だ。

実はadbのemuオプションを使うことでエミューレータコマンドを即時実行できるので、これを利用すると実現できる。

↓半分に縮小する場合
adb emu window scale 0.5


EGitで Checkout Conflictsが出た時の対処法(Git初心者向け)


Eclipse でGitが利用できる EGitは便利。だけどGitそのものを理解していないと思わぬところでつまづく。例えば、コンフリクト。

↓はCheckout Confilictsの警告ダイアログ

対処法としては状況に応じて以下を実行すれば良い。

1.現在の変更を残したい
→ ブランチ切ってCommit
Team -> Switch To -> New Branchからブランチを作成して、Team- > Commit とすれば良い

2.現在の変更を他のコミットと統合したい
→Merge
下記が詳しい。
http://d.hatena.ne.jp/Hirohiro/20111122/1321964799

3.現在の変更を破棄したい
Team -> Replace With -> Commitから、置き換えたいコミットを選択する。


Git GUIが起動しない時の対処法

msysgitが立ち上がらなくなった。
立ち上げようとするとエラーが出る。
エラーの文字列中にはrecentrepo= ...という文字列の後ろに文字化けしている文字列が見える。
どうやら直近で使ったリポジトリに日本語が入っているとダメなようだ。

で、この問題、厄介なのことに再インストールしても現象が直らないのだ。
対処法として履歴は下記のファイルに格納されているので、これを消せば治る。
C:¥Users¥<ユーザー名>¥..gitconfig

アンインストールでこれも消して欲しかったなあ。

2012年3月22日木曜日

JSONIC EVO3Dで なんか重いよ

ATNDの検索APIで取得したデータのデコードにJSONICを使っていた。
ずっとGalaxy Nexusでデバッグしていて問題なかったのだが、
EVO3Dで動かしてみたら極端に重い。

GNならば1秒未満で終わる処理が、
EVO3Dでは約13秒もかかる。

一応明言しておくと、測定は
JSON.decode(str, EventsResult.class);
の前後に入れたLog.dのタイムスタンプの差分で計測。
決してhttp getの時間は入っていない。

うーんなんだろう。なんか気になる。
EVO3Dって ADW.Launcherのドロワーが重かったりするから、特定の処理に弱いとかあるのかな。不思議。(無料版の話、Exは問題なく動いている)

で、回避策としてgsonを使ってみた。
無事EVO3Dでも1秒未満(大体200ms未満)でデコードが完了できることが確認できた。

測定結果(ざっくり)
Galaxy Nexus × gson ・・・・   200ms以下
EVO3D × gson ・・・・・・・ 200ms以下
Galaxy Nexus ×  JSONIC ・・・ 200ms以下
EVO3D × JSONIC ・・・・  13000ms程度 ← なぜ?

2012年3月20日火曜日

Androidのデータベース周りでよくわからないエラーが出る

Androidのデータベース周りでよくわからないところでエラーが出ることがある。
例えばこんなの。

Caused by: java.lang.IllegalStateException: Don't have database lock! Caused by: android.database.sqlite.SQLiteDatabaseLockedException: database is locked 

こういうのが出た場合は以下をチェック
・複数のSQLiteOpenHelperクラスのインスタンスから同じデータベースへアクセスしている。(singletonモデルにするなどしよう。ちなみにSQLiteDatabaseインスタンスへのsetLockingEnableをtrueにしておけばスレッドセーフだ(デフォルトでtrue)。)
・bigenTransactionをしたままendTransactionをしてない。

2012年3月18日日曜日

fragment 版 findviewbyid


XMLで定義したFragmentを取得するには
FragmentManager#findFragmentById( id )を使う
FragmentManager fm = getFragmentManager();
MyFragment fragment = (MyFragment)fm.findFragmentById( R.id.fragment );

以上

2012年3月17日土曜日

setState( new int[]{ android.R.attr.state_selected} ); が効かない

以下のようなdrawableをbackgroundに指定したViewで 、stateを反映したい。

v.getBackground().setState( new int[]{ android.R.attr.state_selected} );
としても全然反映されないし、困ってた。


 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 非選択時 -->
<item
android:state_selected="false"
android:drawable="@drawable/tab_unselected"
/>
<!-- 選択時 -->
<item
android:state_selected="true"
android:drawable="@drawable/tab_selected"
/>
</selector>

解決手段は
v.setSelected();
とすること。

selected限定なのでオールマイティじゃないけど、ま良い。

エラー No view found for id 0xffffffff for fragment の原因

ViewPagerでフラグメントを使ってみようと、こんなコードを書いてみた

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ViewPager vp = new ViewPager(this);
  setContentView( vp );
  FragmentManager fm = getSupportFragmentManager();
  MyAdapter fpa = new MyAdapter( fm );
  vp.setAdapter( fpa );
}

そしたらこんなエラーが出た。

 java.lang.IllegalArgumentException: No view found for id 0xffffffff for fragment HogeFragment{41850420 #0 id=0xffffffff android:switcher:-1:0} 

調べてみるとViewPagerにはIDを指定してあげないといけないらしい。 vp.setId( )するなりxmlの場合はちゃんとIDを指定してあげること。


vp.setId( R.id.view_pager );  
みたいな感じ。


( In English...  ViewPager must be specified with unique ID . We should specify ID by vp.setID( ) or id attribute in XML . Like... vp.setId( R.id.view_pager );  )


IDは/values/ids.xmlに以下のように定義すると良い
( In English ... If you want to specify ID dynamically, define ID in /values/ids.xml with following. )

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <item type="id" name="view_pager" />
</resources>


2012年3月11日日曜日

MBAでdeleteとbackspaceを併用したい

MBAのDeleteキーはWindowsでのBackspaceと同じように手前の文字を消すもの。
後ろを消すための「Deleteキー」は存在しない。
でもそれは不便・・・。
webで解決策を探すと Fn+Deleteで後ろの文字を消せるとのこと。

・・・・fn+Deleteなんて不便すぎて常用できないよ ><

そこで、F12キーをDeleteキーに割り当てることにした。

弊害は以下の2点。自分には今のところ不便は無い。
1.ファンクションキーをFnキーを押さなくてもできるようにしたため、
2.F12を使うデフォルトのキーボードショートカットは使えなくなる

以下手順
- システム環境設定のキーボードを開く
  - 「F1、F2などのすべてのキーを標準のファンクションキーとして使用」のチェックを外す。
  - キーボードショートカット「キーボードと文字入力」の欄からDashboardを表示のチェックを外す
 (その他F12キーを単独で利用しているショートカットがあれば消しておく)

-  KeyRemap4MacBook をインストール
- システム環境からKeyRemap4MacBoookを開き
 Change F1…F19 Key & Functional Key ( Brightness, Control, Music Control, Volume Control )
 -- Change F1..F19 Key
 ----  Separately settings
 ------   MacBook Air( 2010, Late ) Style
 --------   F12 to Forward Delete ←これにチェック

以上。

KeyRemap4MacBook便利ですな。

EclipseでEGITを使ってBitbucektのGitリポジトリにpushする


EclipseプロジェクトをEGITを使って新規にbitbucketにpushする手順メモ

1.ローカルリポジトリを作る
  - package explorer等から該当プロジェクトを右クリック
  - Team -> share project を選択
  - 出てくるダイアログでローカルリポジトリの場所を設定
    現在のプロジェクトのフォルダを使う場合 use or create in parent folder of project.にチェックを入れる

2.ローカルリポジトリにコミット
  - 該当プロジェクトを右クリック Team -> Commit を選択
  - 必要なファイルをチェック -> Commit

3.リモートリポジトリの作成
- bitbucketで新たにリポジトリを作成(詳細手順は省略)

4.push to upstream の設定を行ってpushする。
  - Show ViewからGit Repositryを選択してビューを表示した後、下記のようにRemotesを右クリックしてCreate Remoteを選択
  - ダイアログの URIの項目でChangeを選択
  -  出てくるダイアログにbitbucketのリポジトリ情報を入力
   - URIに https://<ユーザー名>@bitbucket.org/<ユーザー名>/<リポジトリ名>.git と入力
このURLはbitbucketのwebsite上で各リポジトリのトップ画面に出てくる、クローンするためのURLと同じものです。
- 他の項目が自動で埋まることを確認するとともに、パスワードを入力
       - host :  bitbucket.org
       - repository path : /<ユーザー名>/<リポジトリ名>.git
       - protocol : https
       - port : 空白でOK
       - user :  bitbuekcetのユーザー名
       - password : bitbuekcetのパスワード
  - OKを押して一つ前のDialogに戻った後、 Save and Pushでpush完了  

2012年3月9日金曜日

Windows 8 のMetro UIのアプリを終了する(抜け出す)方法

Mac OSXからVirtualBoxでWindows 8のConsumer Previewをインストールしてみたが、Metro UIの終了方法がわからなかった。

例えばSkyDriveを起動すると下記のような画面になる(余白の黒は無視して下さい、本来は見えない部分です。)

なんとこの画面デフォルトでフルスクリーンで、✕ボタンが無いのである。
マウスでフリック風の操作をしてもダメ。
右クリックしてもコンテキストメニューらしきものが出るだけ。

しばらく色々触ってわかったことは、マウスカーソルを左下、右上に持っていけば解決できるということ。
結構判定がシビアなので気づきにくい。

↑カーソルを左下に持っていったところ。スタートメニューを表示するためのエリアがポップアップ。

↑カーソルを右上に持っていった所。メニュー(名称不明)が出る。ここからスタートボタンを押せば抜け出せる。

厳密にはアプリの終了では無いが、とりあえず抜け出せるのでOKとした。

2012年3月5日月曜日

BufferedInputStreamをStringに変換

やり方は色々あるけど、ここではCommons IOライブラリを使ったやり方を紹介。
Commons IOは以下からDL可能。
http://commons.apache.org/io/download_io.cgi 

実際のコードは以下。文字コードも指定できる。       
        StringWriter writer = new StringWriter();
        IOUtils.copy( bis, writer, "utf-8");
        String theString = writer.toString();

2012年3月2日金曜日

AndroidのButtonで、タッチされたあと領域外へ行ったことを検知する。


ボタンにタッチされたあと指が領域外に移動するとAction CancelのMotionEventが発行されます。

if( event.getAction() == MotionEvent.ACTION_CANCEL ){
    //ボタンの範囲外に行った
}