GoogleMapApiの利用登録
まず、Googleのアカウントを取得します。
ログイン後、(一番大事)
http://code.google.com/intl/ja/apis/maps/
「登録して Google Maps API キーを取得します。」に移動。
チェックボックスにチェックを入れ、取得したいURLを入力し、「APIキーを作成」を押下します。
JavaScript用のサンプルなどが出てくるので、それを利用します。
http://google.co.jp/
とかの既存のURLでも、
http://192.168.1.1/
とかのIPでも可能です。
ローカルなIPでも取得できるので、別マシンをサーバとして実行することも可能です。
(ログインしなくちゃ取得できないことに気づくまでに、小一時間かかりました。)
ちなみに、http://localhost/として利用する場合は、
google maps api localhost
などで検索すると、keyを公開している人もいるようです。(google的にOKなのかは不明です)
google calendarに終日イベントを追加する
基本的に他の人のソースのパクリ。
package sample.calendar; import java.net.URL; import com.google.gdata.client.calendar.CalendarService; import com.google.gdata.data.DateTime; import com.google.gdata.data.PlainTextConstruct; import com.google.gdata.data.calendar.CalendarEventEntry; import com.google.gdata.data.extensions.When; public class AllDayEventCreator { // Google アカウント private static String GOOGLE_ACCOUNT = "xxxxxxxxxx@gmail.com"; // Google アカウントのパスワード private static String GOOGLE_PASSWORD = "xxxxxxxxxx"; // 送信URL private static String GOOGLE_CAL_URL = "http://www.google.com/calendar/feeds/default/private/full"; /** * 終日のイベントを追加します。 * * @throws Exception */ public void insertAlldayData() throws Exception { URL postURL = new URL(GOOGLE_CAL_URL); // イベント登録クラス CalendarEventEntry calEntry = new CalendarEventEntry(); // タイトルを設定 calEntry.setTitle(new PlainTextConstruct("終日のテスト")); // 詳細を設定 calEntry.setContent(new PlainTextConstruct("詳細のサンプル")); DateTime startTime = new DateTime(); startTime.setTzShift(9); startTime = DateTime.parseDate("2009-11-27"); // 開始終了日時をWhen型オブジェクトに代入し、イベントクラスに追加 When eventTimes = new When(); eventTimes.setStartTime(startTime); calEntry.addTime(eventTimes); // Google Calendarサービスに接続 CalendarService calService = new CalendarService( "chaos-alldaySample-0.1"); calService.setUserCredentials(GOOGLE_ACCOUNT, GOOGLE_PASSWORD); // スケジュールを追加する calService.insert(postURL, calEntry); System.out.println("終日の予定:「" + calEntry.getTitle().getPlainText() + "」を追加しました。"); } /** * @param args */ public static void main(String[] args) { try { // インスタンス生成 AllDayEventCreator main = new AllDayEventCreator(); // 終日イベントを追加 main.insertAlldayData(); } catch (Exception e) { e.printStackTrace(); } } }
終日イベントはsetStartTimeに渡すDateTimeを作成するときに、
DateTime.parseDate("2009-11-27");
のように、parseDateを使い、時分秒を指定しないとできる(みたい)。
google calendarでカレンダーを作成する
基本的にはsampleについてきたCalendarFeedDemo.javaから、
不要だと思われる箇所を削っただけ。
package sample.calendar; import java.net.URL; import com.google.gdata.client.calendar.CalendarService; import com.google.gdata.data.PlainTextConstruct; import com.google.gdata.data.calendar.CalendarEntry; import com.google.gdata.data.calendar.ColorProperty; import com.google.gdata.data.calendar.HiddenProperty; import com.google.gdata.data.calendar.TimeZoneProperty; import com.google.gdata.data.extensions.Where; public class CreateCalendar { /** google calendar 基準URL */ private static final String METAFEED_URL_BASE = "http://www.google.com/calendar/feeds/"; /** マイカレンダー用アドレス */ private static final String OWNCALENDARS_FEED_URL_SUFFIX = "/owncalendars/full"; /** マイカレンダーフィード用URL */ private static URL owncalendarsFeedUrl = null; private static final String BLUE = "#2952A3"; /** ユーザー名 */ static final String USER_NAME = "xxxxxxxx@gmail.com"; /** パスワード */ static final String USER_PASSWORD = "xxxxxxxx"; /** * カレンダーを作成します。 * * @param service * CalendarServiceオブジェクト * @return 作成されたCalendarEntryオブジェクト * @throws Exception */ private static CalendarEntry createCalendar(CalendarService service) throws Exception { System.out.println("カレンダーを作成します。"); // カレンダーオブジェクトを初期化 CalendarEntry calendar = new CalendarEntry(); calendar.setTitle(new PlainTextConstruct("マイカレンダー1")); calendar.setSummary(new PlainTextConstruct("サンプルの説明")); calendar.setTimeZone(new TimeZoneProperty("Asia/Tokyo")); calendar.setHidden(HiddenProperty.FALSE); calendar.setColor(new ColorProperty(BLUE)); calendar.addLocation(new Where("", "", "Toyama")); // カレンダーを追加します。 CalendarEntry newEntry = service.insert(owncalendarsFeedUrl, calendar); return newEntry; } public static void main(String[] args) { try { // URLオブジェクトを作成 owncalendarsFeedUrl = new URL(METAFEED_URL_BASE + USER_NAME + OWNCALENDARS_FEED_URL_SUFFIX); // カレンダーサービスに接続 CalendarService service = new CalendarService( "chaos-CreateCalendarSample-1"); service.setUserCredentials(USER_NAME, USER_PASSWORD); // カレンダーを作成 createCalendar(service); } catch (Exception e) { e.printStackTrace(); } } }
コンストラクタ:CalendarServiceの引数は文字列で
[company-id]-[app-name]-[app-version]
らしいので、テキトーに変更。
(例外処理とかはテキトーです。)
EJBのスレッドセーフについて
以下、いろいろ見て回って調べたこと。
間違っている可能性あり。
まず、ステートレスセッションBean。
1回のリクエストごとにプールされているインスタンスを割り当てられる。
そのため、インスタンス変数を利用する場合は、割り当てのたびに初期化するなどしないといけない。
普通はインスタンス変数を使わずに、ローカル変数のみを使うべき。
ローカル変数はスレッドごとに別々の領域を割り当てられる(はず)なので、スレッドセーフを考える必要はありません。
次に、ステートフルセッションBean。
クライアント毎に生成されるため、1クライアントが別スレッドなどでアクセスしない限り、スレッドセーフ。
インスタンス変数なども利用可能。
ただし、多数のアクセスがあった場合に大量のメモリが必要になるので、あまり使われない(らしい)。
次は、メッセージ駆動Bean。
ステートレスセッションBeanと同様。
非同期に処理が行えるだけの違い?
エンティティBeanはローカルでインスタンス化するはずなので、関係ないかな?
jsfのinputタグなどをJavaScriptで制御する。
<h:view> <h:form id="form1"> <h:inputText id="userId" /> </h:form> </h:view>
と、すると、inputタグは"form1:userId"というid(nameだったかも)になる。
ここで、
document.form1.form1:userId.value = "hoge";
としてもJavaScriptエラーとなる。
ので、
document.getElementById("form1:userId").value = "hoge";
や、
document.all['form1:userId'].value = 'hoge';
とする。
プロパティファイルを編集するeclipseプラグイン
忘れないようにメモ。
JSFのメッセージファイル(?)のようなプロパティファイルは、直接日本語を編集できないので、
PropertiesEditorプラグインを入れます。
http://sourceforge.jp/projects/propedit/files/
以上。