GoogleAppEngine(Java)でデプロイ時のConflictを解除する

GAE/JでデプロイをキャンセルしてしまってConflictが出た時の対応方法メモ。

pythonクライアント(appcfg.py)を入れてもいいのですが、Java環境だけでもなんとかならないかと思ったところ、EclipseのGoogle App Engine プラグイン内に appcfgコマンドがあり、これを使えばデプロイの衝突を解決できました。

Linux/Mac OS Xの場合:

/Applications/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.7.5/appengine-java-sdk-1.7.5/bin/appcfg.sh rollback war

Windowsの場合

c:¥eclipse¥plugins¥com.google.appengine.eclipse.sdkbundle_1.7.5¥appengine-java-sdk-1.7.5¥bin¥appcfg.cmd rollback war

上記コマンドはコンフリクトしている対象のGAEのプロジェクトディレクトリで実行する場合の引数です。

その他の場所で実行する場合は適宜warのパス指定部分を変更する、アプリ名を明示するなど変更して下さい。

Google App Engine でアプリケーション名を取得するには?

GAEのアプリケーションの名前はJava、Pythonどちらでもプログラム内から参照できるようになっています。 続きを読む Google App Engine でアプリケーション名を取得するには?

Android入門 アプリ開発の基本、ビューのライフサイクル(図解)

Android アプリケーション開発では、いつどのイベントが発生するかを知っておくというのは大事な事です。

アクティビティを実装する場合はアクティビティのイベントがいつ発生するか(ライフサイクル)が大事ですし、自分でビューを作る時はビューのイベントを把握しておくとスムーズに実装ができるようになります。

Androidのアクティビティについてはいつどのイベント公式サイトのアクティビティライフサイクルの項目で分かりやすく図示されているのですが、ビューのライフサイクル、イベントの詳細を見つけられなかったため、今回は整理も兼ねてこの記事を公開することにしました。

Android の View は Activity#setContentView() を呼ぶだけでも onFinishInflate(), onAttachedToWindow(),onLayout(),onDraw(),onMeasure()といったイベントが発生するのをご存知でしょうか?

どのタイミングでどのイベントが呼ばれるのか?

カスタムビューを作る時に処理をどのイベントに実装すべきかを悩んでいる方の助けになれれば幸いです。 続きを読む Android入門 アプリ開発の基本、ビューのライフサイクル(図解)

【Android】 ndk-build clean でシンタックスエラー。原因はNDK r8eのバグか?

Android で NDKビルドを動かすとndk-build cleanでエラーになってしまった。

こういうの。

dk-build clean 
Clean: gnustl_shared [armeabi-v7e] 
/bin/sh: -c: line 0: syntax error near unexpected token `(' 
/bin/sh: -c: line 0: `rm -rf (TARGET_OBJS)' 
make: *** [clean-gnustl_shared-armeabi] Error 1

色々調べたところ、原因は Android NDK r8eの問題のようで
android-ndk/build/core/build-binary.mk

の49行目を次のように修正したらエラーが出なくなった。

変更前:

$(cleantarget): PRIVATE_CLEAN_FILES := ($(my)OBJS)

変更後:

$(cleantarget): PRIVATE_CLEAN_FILES := $($(my)OBJS)

変更後の実行結果:

/Library/android-ndk/ndk-build clean NDK_DEBUG=1 all 
Clean: cvjava [armeabi-v7a]
Clean: gnustl_shared [armeabi-v7a]
Clean: gnustl_static [armeabi-v7a]
Clean: scv [armeabi-v7a]

再現環境はインストールしたバージョンは NDK r8e の OS X 64ビット版(android-ndk-r8e-darwin-x86_64.tar.bz2)
でした。
他の環境で試したわけではないのですが、他の環境ではこれでエラーがでないのでしょうか。

追記

Linux 64bit r8e でも再現するという情報をいただきました。対策も同様でいいそうです。

GAE/Jでgsonを使うとVerifyErrorになる件(解決?)

あるときからGoogle App Engine(Java)でgsonライブラリを使うと、java.lang.VerifyErrorが発生するようになってしまった。

別の方(GAE/JでGson利用時にjava.lang.VerifyErrorが発生する)」もとりあげているのと同じ現象のようですが、一応対応がわかったのでメモしておく。 続きを読む GAE/Jでgsonを使うとVerifyErrorになる件(解決?)

【Android】9-patchが動かない?そんな時に確認する4つのポイント

Droid20130321
せっかくAndroidデザインのために頑張って画像にナインパッチ(9pach)を使ったのに、ちゃんと効かない。
画像の周りの黒い点が見えてしまってる。さぁどうしよう。

そんな時は騒がず慌てず4つのポイントをチェック。 続きを読む 【Android】9-patchが動かない?そんな時に確認する4つのポイント

【Mac OS X】スクリーンショットの保存場所を変える方法

デフォルトだと画面のスクリーンショット画像を撮るとデスクトップフォルダに保存されます。
裏ワザ、隠し機能的ですが、ターミナルから下のようなコマンドを入力すると画像の保存フォルダを変更することができます。

【ピクチャフォルダに保存する】

$ defaults write com.apple.screencapture location ~/Pictures
$ killall SystemUIServer

ピクチャ以外にも好きなディレクトリにすることもできます。

【ScreenShotsフォルダに保存する】

$ mkdir ~/ScreenShots
$ defaults write com.apple.screencapture location ~/ScreenShots
$ killall SystemUIServer

戻したくなったら下のコマンドで戻すこともできます。

【デフォルト(デスクトップ)に戻す】

$ defaults delete com.apple.screencapture location
$ killall SystemUIServer

以上、クリーンショット保存先を変える方法でした。
散らかってしまいがちなデスクトップもこれで綺麗に整理整頓されるかも。

【Android】背景画像のリピートが効かない問題

画像のコストを下げるために、背景画像に tileMode=”repeat” を指定してタイルとして使っていたのですが、
Android 2.3 系以下の端末で特定のアクティビティでだけリピートが聞かなくてハマりました。

どうやらハニカムで修正されたOSの不具合だそうで…以下対策がわかったのでメモ。 続きを読む 【Android】背景画像のリピートが効かない問題

【Sublime Text 2】Mac OS Xで日本語入力のタブ変換ができなくなった場合の対処方法

Sublime Text 2 をしばらく使っていて、Mac OS Xで日本語入力のタブ変換が出来ないことにふと気づきました。

ひらがなを入力したら変換候補が出てきますが、ここでタブを押して変換候補を切り替えようとしたら、タブキーを押した途端に変換候補の欄が閉じて、入力中の文字が消えてしまう。

カーソルで変換候補を切り替えればいつも通り入力はできます。
でも、つい癖でタブキーを押すたび、入力をやり直すハメになって、手が止まる…。

これじゃいけないとタブ関係のキーバインドを見なおしたら何とかなったので、
修正方法をメモしておきます。

解決方法

メニューからPreferences > Key Bindings – Default を開きます。
すると、下のような怪しい部分があるので…

	{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
	{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},
		"context":
		[
			{ "key": "setting.tab_completion", "operator": "equal", "operand": true }
		]
	},

これをコメントアウトしてしまいます。

/*
	{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
	{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},
		"context":
		[
			{ "key": "setting.tab_completion", "operator": "equal", "operand": true }
		]
	},
*/

あとは保存すればOK。

これで、ストレスなく快適にSublime Text 2を使えるようになりました。

それで原因は?

なんでしょうね…。
色々とプラグインを入れて使っているため、何が原因かは不明なんです。
情報求む。