日記:高速バスの予約してきた

来年の1月9日に東京でABCというアンドロイドのイベントがあるのでそれに行くための高速バスのチケットの予約してきました。チケットは金券ショップで購入。普通だと片道12,000円らしいんですが、10,600円で買えたので、10%以上お得です。やっぱり交通機関は金券ショップですな〜。

それにしてもやるべきことが蓄積していってて、でも周りはどんどんすごいことをやっている。twitterとかやってるとそれをリアルタイムで発信されていくので、自分の中での焦り具合がハンパないっす…。でも人は地道にやることしかできん。大したアイデアも出てこないし、今は目の前にあるやるべきことを着々とこなして、自分の気持ちを強く持つことを頑張ろうと思います。

焦ったところで仕方がない。それは分かっている。
ライバルは昨日の自分なのだから!
タスクを倒して、不安を取り除いていこう。


Slim3: JSPでテンプレートを使う

2010.12.29 追記

下記の方法では、エスケープされるべき文字列があるとそれ以降の処理が行われないというバグが発生します。JSPに詳しくないのでよくわかっていないのですが、テンプレート作成をjsp:includeを使って行うと、おかしくなるようです。c:importを使うと、バグが発生しなくなります。

この記事を参考にしてくださったmatsukazさんのサイトでやり方が紹介されていますので、そちらを参考にしてください。宜しくお願いします。

JSPでページをテンプレート化 matsukazの日記

以下、元の記事です。

ネタ的にはJSPなので、Slim3ネタではないといえばそうなのですが、自分みたいにGAE for Javaで初めてJSPを触る人もいるだろうから、自分のメモも兼ねて書いていこうと思います。

まずはこれが基本のテンプレートのlayout.jsp。
layout.jspの中で、さらにheader.jspとmenu.jspとfooter.jspをincludeしています。
header.jspに値を渡すために、layout.jspを読み込むファイルからparam.titleを再度代入しています。
param.contentが、各々のページで書かれる本文です。

<%@page contentType="text/html" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@taglib prefix="f" uri="http://www.slim3.org/functions"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>${param.title}</title>
</head>
<body>
<div id="container">
	<jsp:include page="/header.jsp">
		<jsp:param name="title" value="${param.title}"/>
	</jsp:include>
	<div id="main">
		<div id="content">
		${param.content}
		</div>
		<jsp:include page="/menu.jsp" />
	</div>
	<jsp:include page="/footer.jsp" />
</div>
</body>
</html>

次は、header.jsp。layout.jspで読み込まれてますね。
単純にヘッダーを定義してるだけです。

<%@page pageEncoding="UTF-8" isELIgnored="false"%>
<div id="header">
<h1>${param.title}</h1>
</div>

次はfooter.jsp。これもlayout.jspで読み込まれています。
単純にフッターを定義しているだけです。

<%@page pageEncoding="UTF-8" isELIgnored="false"%>
<div id="footer">
footer
</div>

次はmenu.jsp。これもlayout.jspで読み込まれています。
単純にサイドバー用のメニューを定義しているだけです。
(今回はcss当ててないのでずらーっと出るだけ)
ちなみにslim3のdemoプロジェクトから取ってきただけですw

<%@page pageEncoding="UTF-8" isELIgnored="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="f" uri="http://www.slim3.org/functions"%>
<div id="menu">
<ul>
<li><a href="${f:url('/performance/')}">Performance<br />Slim3 vs JDO</a></li>
<li><a href="${f:url('/gtx/')}">Global<br />Transaction</a></li>
<li><a href="${f:url('/blog/')}">CRUD</a></li>
<li><a href="${f:url('/checkbox/')}">Checkbox</a></li>
<li><a href="${f:url('/multibox/')}">Multibox</a></li>
<li><a href="${f:url('/radio/')}">Radio</a></li>
<li><a href="${f:url('/select/')}">Select</a></li>
<li><a href="${f:url('/multiselect/')}">Multiselect</a></li>
<li><a href="${f:url('/upload/')}">Upload</a></li>
<li><a href="${f:url('/blobstore/')}">Blobstore</a></li>
<li><a href="${f:url('/locale/')}">Locale</a></li>
<li><a href="${f:url('/timezone/')}">TimeZone</a></li>
<li><a href="${f:url('/ajax/')}">HTML with Ajax</a></li>
<li><a href="${f:url('/ktrwjr/index.html')}">Server side test</a></li>
</ul>
</div>

さて、ここからが本番です。
index.jspで、このlayout.jps群を使って簡単にページを作ろうと思います。

<%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%>

<jsp:include page="/layout.jsp">
	<jsp:param name="title" value="Index"/>
	<jsp:param name="content">
		<jsp:attribute name="value">
			<p>Hello Index !!!</p>
		</jsp:attribute>
	</jsp:param>
</jsp:include>

param.contentの値が、jsp:attribute name=”value”内の文字列になるので、layout.jspの${param.content}にHello Index!!!が入ります。タイトルはページ毎に変えたいので、各ページ側からjsp:param name=”title” value=”タイトル”で変えていきます。

ここまで分かれば、あとはlayout.jsp側や、そこから読み込んでいるheader, footer, menuを修正するのみ。コンテンツ制作者というかプログラマーはparam.contentに入れる値だけに注力すればいいはず!!

これでようやくやりたいことのスタート地点に立てたかなーという感じですね…。
今まで散々CakePHPとかのお世話になっているから、jspのやり方は全く分からなくて大変ですが、GAE使えるようになりたいんで頑張ってSlim3の流儀も覚えていきたいと思います。


Android: 特定のintent-filter actionのアプリ一覧を取得する

特定のintent-filterが設定されているアプリ一覧が欲しいなぁと思った際に、
どうやって取得するのかわからなかったので、調べました。

具体的にはIntentを作成し、PackageManagerに、そのIntentに該当するActivityを取得するメソッドqueryIntentActivitiesを実行するという方法です。

PackageManager pm = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
List<ResolveInfo> apps = pm.queryIntentActivities(intent, 0);
HashMap<String, String> maps = new HashMap<String, String>();
for (ResolveInfo app : apps) {
	ApplicationInfo info = app.activityInfo.applicationInfo;
	maps.put(info.loadLabel(pm).toString(), info.packageName);
}

以上でーす。


Android: 日本Androidの会 中国支部 勉強会でLTしてきました。

12/11の土曜日に、広島で日本アンドロイドの会 中国支部の勉強会と忘年会があったので参加してきました!Twitterでご存知の方もいらっしゃるかと思いますが、この数日前に「ABC(Android Bazaar and Conference)のLTに応募したよー。初のLTがABCになるかもでドキドキ!」と呟いたら、瀬戸デ部部長に「飛び込みでcjag(中国支部)の勉強会でLTしてきたら?」と言われ、あれよあれよとLTすることになり、中国支部でLTしてきました!

さっきからLTと言っていますが、ご存じない方に説明しますと、LTとはライトニングトークの略で、5分程度の発表をすることです。さらっと言いたい事だけ言って退散するという感じ。長いセッションではないので、告知とか、思ってる事をぶちまけるとか、お笑いネタをやるとか、そういうときにやるんじゃないでしょうか?

とりあえず、SlideShareにアップしてみた。(これも初めて!)

タイトルは、瀬戸デ部部長からリクエストのあった「初めてのC2DM」というものにしました。C2DMってやってみたいけどちょっとねー、という人が結構多いみたいだったので(まぁ確かにクライアントのみならずサーバ側も準備せなあかんので、面倒と言えば面倒…)、ネタにはいいんじゃない?ということで。

ほぼ徹夜で作りました。(Keynoteを使ったのも初めて!)

■追記
SlideShareの前に載せておいた方がいいかなと思って前方へ移動!
LTのUStreamがあったので載せておきます。
しょっぱなが私で、2番目がおくとばさんです。

以降、SlideShare。

そんな初めてづくしのLTでしたが、なんとか無事に終わり、よかったです!と言っていただけたのでとても嬉しかったです!ただ、その後のおくとばさんのLTでかなりかき消されたような気が…。おくとばさんのLT、場の空気を掴むのがうますぎる…。超えられない壁を感じました。自分も場数を踏んで人前で喋っても緊張しないようにならないとなーと思いました。機会があれば、人前での発表を狙っていきたいなと思いました。

まずはABCのLT枠に受かればいいな!!


Android: 自分のアプリに暗黙的Intentを投げる際の注意点

自分のアプリに暗黙的Intent呼び出しを実装したいと思い独自のActionを定義して、それをフィルタにして呼ぼうとしたのですが、ハマりました。別アプリからintent.setAction(“com.hogehoge.test1”);というふうにActionを設定してからstartActivity(intent);を行ったのですが…。

ActivityNotFoundExceptionが発生!!

いろいろと確認したのですが、わからんかったので、twitterに呟いたら、mstsskさんがリプライをくれて、解決しました!twitterのAndroidクラスタはいい人が多くて本当に感謝です!自分一人ではなかなか気付けませんでした。

intent-filterは、条件がactionだけで、categoryを使わなかったとしてもcategory.DEFAULTを指定しておく必要があります!

呼ばれる側のアプリのマニフェストの、activityのintent-filterに、category.DEFAULTを付けておきましょう。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.hogehoge.test1"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Main"
                  android:label="@string/app_name"
                  android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="com.hogehoge.test1" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="4" />
</manifest>