2011年11月23日水曜日

Androidでランチャーから起動可能なActivityの一覧を取得する方法の要点だけ

PackageManagerというクラスを指定して、特定のIntentに対応するActivityの一覧をListで取得できる。ResolveInfoからは該当Activityに関する様々な情報が参照できる。
public List<ResolveInfo> getLauncheableActivityList(PackageManager packageManager) {
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent, 0);
return resolveInfoList;
}
view raw gistfile1.java hosted with ❤ by GitHub

2011年11月19日土曜日

AndEngine Wallpaper Extension Exampleが動かないので直した。

Google CodeでホストされているAndEngine Wallpaper Extension Exampleのコードには古いライブラリjarが同梱されていて、最新のライブラリだと動かないというのを発見した。
パッケージ階層が変わっていたり、deprecatedなメソッドが出来ていたりするみたい。
http://code.google.com/p/andenginelivewallpaperextensionexample/

なので、諸々直したのを以下に置きました。
http://code.google.com/r/kh99mail-andenginelivewallpaperextensionexample/

GoogleCodeもMercurialもあまり使ってないのでどうやって作者さんに知らせたら良いか分からず、直したよってメールしてみた。これで合ってるのかな。正しいやり方があったら誰か教えてください。

AndEngine LiveWallpaper Extensionのサンプルプロジェクト

AndEngine LiveWallpaper Extensionを使ったライブ壁紙のサンプルプロジェクトをgithubに上げました。 https://github.com/hkurosawa/imhoandenginelivewallpaperexample

2011年11月17日木曜日

AndEngine TimerHandlerの使い方の要点だけ

AndEngineはチュートリアルが充実してないので、逆引き的にsnippetを溜め込むしかなさそう。一定時間間隔でメソッドを呼び出すTimerHandlerの使い方。org.anddev.andengine.engine.handler.timer.*にあります。
public Scene onLoadScene() {
final Scene scene = new Scene();
scene.setBackground(new ColorBackground(0.09804f, 0.6274f, 0.8784f));
//TimerHandler(sec, autoReset, callback)
TimerHandler timerHandler = new TimerHandler(0.1f, true, this);
scene.registerUpdateHandler(timerHandler);
return scene;
}
//--- cut ---
@Override
public void onTimePassed(TimerHandler pTimerHandler) {
Log.d("onTimePassed", ""+pTimerHandler.getTimerSeconds());
}
view raw gistfile1.java hosted with ❤ by GitHub

AndEngine ExamplesをソースコードからビルドするHowtoの要点だけ

AndEngineのデモはAndroidMarketからも落とせるけど、やっぱりソースコードからビルドしたい、、ときのための手順をまとめました。

2011年11月15日火曜日

AndEngineのライブラリJARの入手方法の要点だけ

【2011/11/16追記】以下の記事は古いソースコードに基づく。以下のchangelogによると、examplesからライブラリは削除したみたい。詳しくは調べて後でかく。
http://code.google.com/p/andengineexamples/source/detail?r=07a5aabdd0ce738a624863ca8d18895350a23356
【2011/11/16追記2】以下のブログは参考になりそうだ。
http://andenginefromscratch.blogspot.com/2011/06/off-topic-article-how-to-stay-up-to.html
【2011/11/17追記】新しいエントリをまとめました。 http://blog.imho.jp/2011/11/andengine-exampleshowto.html

以前のエントリで書いたAndEngineのエントリでは、AndEngine Exampleをインポートするとこまで書いたけど、これだけだといざ自分でプロジェクトを始めようとしたときに、ライブラリ群をどこからインストールすれば良いのか分からなかった。

AndEngineのプロジェクトサイトでも、バイナリ形式での配布は行ってないみたい。

このときもAndEngine Exampleが役にたつ。AndEngineExampleをインポートしたフォルダで、libという名前のディレクトリを見つけて、開く。そうするとandengine*.jarというファイル群が見つかるので、自分で新規作成したプロジェクトに必要なものをコピー&ペーストする。その上で、プロジェクトのProperties>Java Build path>Libraries>Add Jars...して、コピーしたjarファイル(群)をプロジェクトに追加すれば良い。

andengine.jarがベースのライブラリとして、その他は拡張ライブラリ。ファイル名と、AndEngineExamplesのデモを見て、必要なライブラリに見当をつけると良い。


2011年11月3日木曜日

HTML5 AppCache 細かい挙動の要点だけ

Google Developer Day 2011のオフラインコンテンツのセッションでAppCacheの話が出たんだけど、細かい挙動がよくわからなかったので調べてみた。

基本的な所は色んなブログとかがあるので、ググると良いと思う。



調べたのはもうちょっと微妙な所です。ちなみにOSX版のGoogle Chrome15.0.874.106で調べた。 間違ってたらコメントください。

  • CACHEにあるものは一度キャッシュされたらオンラインの状態でも更新されない(リロードボタンを押しても同じ) 
  • manifestを更新すれば、2回目の再読み込みでAppCacheが更新される  manifest更新後、一回目の再読み込みでは変更されないことに注意。 
  • manifestの変更は、コメント行でもOK。なので#VERSION 1みたいな行を付けるのが定石 
  • CACHEとNETWORK両方にエントリがあると、CACHEの方が勝つ=オンラインでも更新されない 
  • manifest設定をしているhtmlファイルそのものは暗黙でキャッシュされることに注意。(なので明示的に書いたほうが良いマナー。) 
  • NETWORKとFALLBACKの両方にエントリがある場合、NETWORKの方が優先されて、FALLBACKしないっぽい。FALLBACKさせるリソースはNETWORKに書かない
  • つまり、設定が強いのはCACHE>NETWORK>FALLBACKの順。常にネットワーク参照させたいリソースはCACHEに書かないし、FALLBACKさせたいコンテンツはNETWORKに書かない。
WebKitベースのスマートフォンブラウザは基本的に対応してると考えて良いので、スタティックなコンテンツは積極的にAppCacheに入れてくのが良さそうだ。

「オンラインな場合はキャッシュを更新する。オフラインならキャッシュをそのまま出す。」みたいのはJavaScriptで書く必要があるのかな。
<追記>思ったんだけど更新が必要なリソースにおいてそれがキャッシュなのか古いデータなのか分からない設計はそもそも良くないので適切なデータにFALLBACKさせるべきと思った。

OSXのPastorのexportをKeePassX XML形式に変換するスクリプト

以前のエントリで書いたけど、KeePassならWin/Mac以外にもiPhoneとかからも使えるのでパスワード忘れて困った!ということが基本的に無くなって便利なので乗りかえました。移行のときに、OSXのパスワード管理ソフトPastorの書き出したtsvをKeePassXで読み込めるXML形式にコンバートするPythonスクリプトを書きました。 この手のやつどこに上げたもんかと思ってたんだけど、さっきgistというものの存在を知ったので使って公開してみます。これ便利だな。
"""
converts pastor export tsv to KeePassX xml import
"""
import sys, time
from xml.sax.saxutils import *
header = """<!DOCTYPE KEEPASSX_DATABASE>
<database>
<group>
<title>Pastor Imports</title>
<icon>48</icon>
"""
footer = """</group>
</database>
"""
now = time.strftime('%Y-%m-%dT%H:%M:%S')
def convert(src, dst):
f = open(src, 'r')
str = f.readlines()[0]
f.close()
entries = str.split('\r')
outf = open(dst, 'w')
outf.write(header)
for e in entries:
if len(e)<=:0:
continue
try:
(pastor_name, pastor_url, pastor_id, pastor_pass, pastor_note) = e.split('\t')
outf.write('<entry>\n')
outf.write('<title>'+escape(pastor_name)+'</title>\n')
outf.write('<username>'+escape(pastor_id)+'</username>\n')
outf.write('<password>'+escape(pastor_pass)+'</password>\n')
outf.write('<url>'+escape(pastor_url)+'</url>\n')
outf.write('<comment>'+escape(pastor_note)+'</comment>\n')
outf.write('<icon>0</icon>\n')
outf.write('<creation>'+now+'</creation>\n')
outf.write('<lastaccess>'+now+'</lastaccess>\n')
outf.write('<lastmod>'+now+'</lastmod>\n')
outf.write('<expire>Never</expire>\n')
outf.write('</entry>\n')
except ValueError:
print '[WARN]parse error -- ignore:', e
pass
outf.write(footer)
outf.close()
if __name__ == '__main__':
if len(sys.argv) != 3:
print 'usage: pastor2keepass srcfile destfile'
exit()
else:
src = sys.argv[1]
dst = sys.argv[2]
convert(src, dst)

Google Developer Day 2011の要点だけ<HTML 5のオフライン機能>

正確でもないし網羅的でもないGoogle Developer Day 2011のメモを置いときます。大事そうなところは掘り下げてそのうちブログにするかも。HTML 5のオフライン機能というセッション。

Google Developer Day 2011の要点だけ<Google+ ウェブ アプリの構築>

正確でもないし網羅的でもないGoogle Developer Day 2011のメモを置いておきます。大事そうなところは掘り下げてそのうちブログにします(多分)。「Google+ ウェブ アプリの構築」というセッション。

Google Developer Day 2011の要点だけ<Android の優れたユーザーエクスペリエンス>

正確でもないし網羅的でもないGoogle Developer Day 2011のメモを置いときます。大事そうなところは掘り下げてそのうちブログにするかも。「Androidの優れたユーザエクスペリエンス」と題されたセッション。

Google Developer Day 2011 の要点だけ<基調講演>

正確でもないし網羅的でもないGoogle Developer Day 2011のメモを置いておきます。ほぼキーワードのみ羅列です。
大事そうなところは掘り下げてそのうちブログにするかも。まずは基調講演。

2011年11月1日火曜日

Aptana Studioをアップデートしたら起動しなくなったときの対応の要点だけ

OSXで、Aptana Studioをアップデート後に起動しなくなるときがある。
こんな具合のエラーが出る時:


"The AptanaStudio3 executable launcher was unable to locate its companion launcher jar."

このときは以下のような手順を取れば起動するようになる。

  1. AptanaStudio3.appを右クリック
  2. 「パッケージの内容を表示」する
  3. 以下のファイルをテキストエディタで開く:
    Contents/MacOS/AptanaStudio3.ini
  4. 以下の行を探す(たぶん最初の2行)
    -startup
    ../../../plugins/org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
  5. org.eclipse.(中略).jarが見つかってないことが起動しない(unable to locate)な原因。これを、plugins/org.eclipse.equinox.launcher(略).jarの存在するファイル名に書き換える。
  6. ファイル保存してAptanaStudio3.appを再起動。


以上で起動するようになります。
(ちなみに僕のケースでは、Aptana Studio 3を3.0.6にアップデートしたときに発生しました)