2011-12-15

Google Calendar APIが更新された

ものすごい勢いで書くのをサボっていた弊blogだが、サボっている間に調査中だったCalendar APIが更新されていた[1]。かなり大胆に変更されたようなので、新しいAPIを使って色々試したいと思う。

[1] http://code.google.com/p/google-api-java-client/wiki/APIs

2011-10-31

b−mobileSIM(プランA)を解約した理由

元々、EVO 3Dを買うまでは、

  • データ通信はWiMAXルータ(WM3300R)
  • ガラケーは基本的にダブル定額上限(au)
という状況にあり、特に屋内でのWiMAXの電波の弱さについては契約前から知ってはいたものの(Try WiMAXもしたし)、やっぱり渋々使うのもどうかなと思い、せめてエリアを広げるために、白ロムのスマホとb-MobileSIM(プランA)を契約しようと考えた。
白ロムスマホは安売りが始まっていたGalaxy Sを購入、なぜ既に持っているUK DesireではなくGalaxy Sを買ったかの理由は以下。

  • Galaxy Sが出たときにホットモックを触ってみたら、Desireよりも動作が軽かったので、少し使いたいなーと思った(Galaxy S2を触った時はもっとびっくりしたけど)
  • 元がドコモ売りの端末なので、いわゆる「FOMAプラスエリア」が使えて、使用エリアがより広い
そして、それほど遠くない場所に取り扱えるイオンがあったため、申し込み。
3ヶ月くらい経って、EVO 3Dがどうやら秋に発売されるというのがわかってきて、WiMAXルータ+ドコモエリア通信(ただし低速)で良いのか考えてみた。

地下鉄のホームなどもドコモエリアになるため、通信できるようになったのは確かに良かったのだが、【『050 plus』というアプリが使えなかった】ことが、b-mobileSIMを解約することの一因である。(もちろん、EVO 3Dに通信を一本化したほうが契約とか色々すっきりするというのもある)

050 plusというアプリは、050番号を付与してIP電話を使えるサービスである。かつて仕事でSIP周りを触っていたため、通信の仕組みについてはそこいらの人よりは詳しいつもりでもあり、対応プラットフォームがiPhoneからAndroidとWindowsにも広がったことで、より多くのユーザを集めてくれるといいなぁという個人的な思いもあり、ぜひとも月額1000円弱のSIM+白ロムで単純にIP電話端末として運用したかった。

しかし、どうもドコモ(のMVNO)のデータプランでは、高負荷の原因になるデータ通信を制限しているようで、たしかに050 plusを入れてみてテスト通話をしてみると、IVRからの音声は聞こえるが、自分で吹き込んだ声はバリバリに割れているし、10秒間吹き込んだはずなのに3秒程度しか再生されない。家Wi-FiおよびWiMAXルータのWi-Fiではテスト通話で10秒間吹き込めていたため、どう考えてもSIMのみで不調である。

という事で、1つのアプリが使えないだけで解約する人もいるんだよというしょうもない話でした。


ここからは更に与太話ですが、単純にスループット(128kbpsベストエフォート)が足りないのではないかという懸念については、OCNのIP電話は8kbpsのRTPセッションを1本sendrecvで通せばいいだけ(確か)なので、裏で通信とかしなければ十分使えていたと考えている。

ちなみに、通話は今もガラケーが良いので、050 plusはEVO3Dの実質の電話番号として使用している。(あまり頻度は高くないが)

2011-10-23

HTC EVO 3D(ISW12HT)を買った 約一週間使ってみて

EVO 3Dを一週間程度使ってみて、今まで使ってみたAndroid機(特にUK DesireとGalaxy S)との長所・短所をまとめたいと思う。何かの参考になれば幸いである。

裏蓋
最近のスマホは、多くの機種で「1箇所空間があって、そこから全体に引っかかっている爪を外していくタイプ」だと思うが、UK Desire・Galaxy S・EVO 3Dともにこの方式である。
ただし、EVO3Dが一番爪を折りそう。
正面から見たときに右下にある、3D/2D切り替えボタンの奥側の爪がどうしても中々開けられない。もうそろそろ折ってしまいそうである。

大きさ・重量
EVO3Dは、qHD(960x540)液晶を持つ4.3インチのスマホである。結構でかい。すぐ使ってすぐしまう分にはそれほど問題にはならないが、例えば未知の場所でGoogleマップの徒歩ナビを使うような、ずっと手に持つような場合、結構疲れるというのが正直なところ。重量はそういった意味で軽くはない。
今まで使ってきた端末と比較して、UK Desireは「密度は高いけど、筐体はコンパクトで片手操作でもラクラク」Galaxy Sは「筐体はちょっと大きいけど、軽いし持ちやすいので、長時間持っても疲れにくい」、EVO 3Dはそれに比して「密度が高く、筐体も大きいので、片手操作は困難。長時間持つと疲れる」となる。そうすると、筐体裏面にスリットが入っていて滑りにくいとはいえ、結構落としやすい(既に表面(ガラス周りの金属)に傷がついている)。表面はゴリラガラスなので傷はつきにくいとは思うが、外観を気にする場合は、同時にケースも買っておいたほうが良いと思う。ただし、ただでさえ大きい筐体がより大きくなるというデメリットもある。

圧倒的なメリット
EVO3Dを契約する人は、au網+WiMAX網のテザリングを魅力とする人も多いと思う。
これについては文句なし。WiMAX網はau網と比べて十分に高速なスピードを持つし、WiMAX圏外になったときにau網が使えるというのは、かつてWiMAXルータを使っていた身としてはこの差はやはり大きい。(au網切り替えへのタイムラグは多少ある)
また、WiMAX圏外があまりに多い場合は最初からWiMAXをオフにすることで、より接続性の高いau網を使うことができる。
これらの調整をWi-Fiクライアント側でケアする必要がないのはかなりメリットとして大きい。
単体で使う場合、日本ではあまり流通していないqHD液晶端末ということもあり、表示できる情報量がこれまで使ってきた端末よりもかなり多くなる(特にGoogle ReaderやGmailなどで顕著)。両手使いなら大画面を活かした効率的な操作が可能である。
Snapdragon S3であるMSM8660を使用し、デュアルコアパワーを存分に享受できる。現状ではQualcommで最新のチップであり、Gingerbreadでは端末側のパフォーマンス不足を感じたことはない。また、発売時OSがGingerbreadだったため、Icecream Sandwichへの更新サポートも期待したい。

今のところこんな感じである。あとはバッテリー持ちとSense UIが4x4しかホーム画面に配置できなくなるくらいが大きな不満か。

2011-10-18

HTC EVO 3D(ISW12HT)を買った ファーストインプレッション編

という訳でEVO 3Dを買った。持って帰るときに店員さんに「ACアダプターは一緒に購入なさいますか?」と聞かれたので、「マイクロUSBで繋ぐと充電できますよね?」と確認したところ、マイクロUSBのケーブルの先端を見せて「こちらのケーブルなら大丈夫です」と言われたので、予想通りだと思って、「じゃあ大丈夫です」と言って帰宅。これが意味不明な地獄の始まりだった。

とりあえず、帰ってアップデートを適用。バッテリーは50%くらいあった。問題なし。
さていつもの様にモバブーでマイクロUSBに接続、充電開始。なんかおかしい。
「この携帯電話について」→「バッテリー」で見てみると、バッテリーの状態が「不明」になっている。いや、そっちが不明ならこっちは余計にわからねーよというツッコミを入れつつ、その後いろいろやってみて、どうしても充電中にならない。(充電のみ/マウントする等の選択肢は出るが「充電のみ」を選んでも充電されない)

問題の切り分けとして、モバブーからちゃんとした電圧が出ないのかと思い、もうひとつのモバブーに繋ぐも変化なし。マイクロUSBケーブルを変えるも変化なし。とにかくネットで探しまくる。
結果、XPERIAのように、給電用にショートさせてあるマイクロUSBケーブルで繋がらないと充電できないという結論に至るも、既に夜中であり店は開いてないわ今まで給電用のマイクロUSBケーブル使ったことないから持ってないわで、実家中探しまわったら、DIMEの付録になってたマイクロUSB/iPhoneケーブルが見つかったので、これにかけてようやく充電中(今朝)

充電編終了。

これまで、HT-03A(HTC Magic)、UK Desire、Galaxy S、Dynabook AZと割とAndroid端末は使ってきているし、HT-03AとUK DesireはCyanogenModを入れて使っているくらいなので、Sense UIも使ったことあるし、いろんなUIもアプリも使ったことのある人間の意見として参考にしていただけると良いかと。

EVO 3Dのホーム画面は7面あるけど、初期状態で全部のスクリーンが埋まっている。ここでデフォルトのまましばらく使ってみるかどうか考え中であるが、最終的にはTrainTimerで使う駅の時刻をウィジェットで配置することになるし、天気は降水確率ステータスバーで十分だし、時計はRetro Clockで十分だし、Catch Noteのウィジェットが最初のホーム画面にないと使いづらくてしょうがないので、画面メモとかは速攻で消す。標準のブラウザのアイコンもDolphin Browser HDに変える。

WiMAXを兼ねたau圏内で使える端末なので、050plusがまっとうに使えることを期待したが、今のところWimax接続中に050plusを起動していると、コネクションとして取れないようで、何もできない。これは非常に残念。
もちろんDolphin BrowserならWimaxコネクションを使って通信できるので、アプリ側の問題だとは思うので、なんとかして解決策がないか検索中。

アプリの実行速度については、デュアルコアの第3世代Snapdragonだけあって、もたつくことが全くないとは言えないものの必要十分。

ゴリラガラスなので、指紋だらけで使おうかと。裏側はラインが入ってるゴムだと思うので、落とすことはないかなと思っているけど、いかんせん重いので、ケースはつけるかもしれない。

また、Photon 4Gに比べるとアプリ格納領域が遥かにせまいので、Class10のMicroSD(16GB以上)を買う予定。8GB(Class4)のMicroSDは試供品として付いている。

HTC EVO 3D(ISW12HT)を買った 契約編

元々、今までの回線契約は

  • HT-03Aを買ったときに契約したドコモSIM
  • ほぼ通話・プライベートオンリーのGzOne TYPE-XのSIM
  • アプリ・ネット専用のGalaxyS(白ロム)に刺すためのイオンSIM(プランA)
  • WiMAXルータ
という結構複雑な回線契約があった(ドコモSIMは毎月980円で運用)のだけど、auのグローバルモデルでWiMAX対応というのはなかなか惹かれるものがあり(テザリングOKだし)、店にふらっと立ち寄ってPHOTONとEVO 3Dを割と触ってみた。

で、すんごい重そうなSense UIをクルクルっと回したのでEVO 3Dでスペックは問題なさそう。PHOTONはPentileがペンタイルペンタイルしてたので解像度が高い(EVO 3Dと同じ)とはいえちょっと厳しいなと。動作自体はどっちもサクサクですが。
Galaxy SもPentile配列で使ってて気にならなかったので、見る前はPHOTONのほうが軽いし今回はモトローラかなとも思っていたのだけど、よく見れは見るほどギザギザが気になって、最終的にEVO 3Dに。

HT-03Aの時のドコモSIMがあったので、MNP。バッチリ年契約プランの途中で9975円?とMNP転出料2100円を(次回請求で)取られながら、MNP一括21800円で購入(毎月割で1750円引きで24ヶ月あるので実質0円)。まぁまぁの買い物だったと思う。なぜかEzWebのコンテンツ3150円を付けられてしまったので、電話で解約しないといけない。スマホで使えないのでGzOne TYPE-Xを差し出して紐付けられたらしい。

これで、ドコモSIMはMNPで利用不可、イオンSIM(WiMAXルータでカバーし切れない場所用)は今月中に解約、WiMAXルータも今月中に解約。EVO3Dに一本化。わりと月額料金は変わらない。

2011-10-03

プログラムからGoogleカレンダーを操作する


Googleカレンダーを初めとしたGoogleサービスは、「Google Data Protocol」として外部から利用できるようになっており、同じく公開されている「Google Data API」[1]をプログラムから呼び出すことで、操作する事が可能である。

Googleカレンダーをプログラムから操作する場合、「Google Calendar Data API」を呼び出すのがよさそうである。プログラム言語はJava/.NET/PHP/Python/JavaScript/Objective-C、他のAPIとしてはCalDAVからアクセスする方法もあるようだ[2]。ここでは、JavaのAPIを使って操作することとする。


実行に当たっての準備は、ライブラリとして以下のファイルを依存ライブラリとして設定し、実行を確認している。
  • gdata-calendar-1.0.jar
  • gdata-client-1.0.jar
  • mail.jar
なぜかJavaMailのjarであるmail.jarが必要である。これらが公式な説明として必要とされているが、mavenのセントラルリポジトリから取得できたため、以下にPOMのdependencyを記載する。「java mail」「google calendar」で検索した結果から得られたものである。

  <dependencies>
  	<dependency>
  		<groupId>org.codemonkey.simplejavamail</groupId>
  		<artifactId>simple-java-mail</artifactId>
  		<version>2.0</version>
  	</dependency>
  	<dependency>
  		<groupId>com.google.api.client</groupId>
  		<artifactId>google-api-data-calendar-v2</artifactId>
  		<version>1.0.10-alpha</version>
  	</dependency>
  	<dependency>
  		<groupId>org.openengsb.wrapped</groupId>
  		<artifactId>com.google.gdata</artifactId>
  		<version>1.41.5.w1</version>
  		<type>bundle</type>
  	</dependency>
  </dependencies>


まずは、自分のカレンダーの全エントリを取得するプログラム。このプログラムでは、以下のmainクラスの他に、Constantsというクラスを定義しており、以下のデータを定数として定義している。

  • String loginAddr(gmailのアカウント@gmail.com)
  • String loginPassword(アカウントのパスワード)
  • URL url("http://www.google.com/calendar/feeds/default/private/full")

import java.io.IOException;
import java.util.List;

import com.google.gdata.client.calendar.CalendarQuery;
import com.google.gdata.client.calendar.CalendarService;
import com.google.gdata.data.calendar.CalendarEventEntry;
import com.google.gdata.data.calendar.CalendarEventFeed;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;

public class SampleMain {

	public static void main(String[] args) throws IOException, ServiceException {
		Constants.setUrl();
		
		CalendarService service = getMyCalendar();
		
		List<CalendarEventEntry> eventList = getEverySchedules(service);
		
		displaySchedule(eventList);
	}
	
	public static CalendarService getMyCalendar() throws AuthenticationException
	{
		CalendarService service = new CalendarService("gmail-sample-1.0");
		service.setUserCredentials(Constants.loginAddr, Constants.loginPassword);
		System.out.println("CalendarService Created.");
		return service;
	}
	
	public static List<CalendarEventEntry> getEverySchedules(CalendarService service) throws IOException, ServiceException
	{
		CalendarQuery query = new CalendarQuery(Constants.url);
		CalendarEventFeed results = service.query(query, CalendarEventFeed.class);
		List<CalendarEventEntry> result = results.getEntries();
		System.out.println("Result get success.");
		return result;
	}
	
	public static void displaySchedule(List<CalendarEventEntry> entries)
	{
		System.out.println("=== BEGIN All schedules ===");
		for (CalendarEventEntry entry : entries)
		{
			System.out.println("== schedule begin ==");
			System.out.println("Title:[" + entry.getTitle().getPlainText() + "]");
			System.out.println("Start Date:[" + entry.getTimes().get(0).getStartTime() + "]");
			System.out.println("End Date:[" + entry.getTimes().get(0).getEndTime() + "]");
			System.out.println("Summary:[" + entry.getSummary() + "]");
			System.out.println("Place:[" + entry.getLocations().get(0).getValueString() + "]");
			System.out.println("== schedule end ==");
		}
		System.out.println("=== END All schedules ===");
	}
}

あらかじめ予定が入れてある場合、以下のような実行結果が得られる。

=== BEGIN All schedules ===
== schedule begin ==
Title:[適当な未来の予定]
Start Date:[2011-08-20T10:30:00.000+09:00]
End Date:[2011-08-20T11:30:00.000+09:00]
Summary:[null]
Place:[日本武道館]
== schedule end ==
== schedule begin ==
Title:[適当な過去の予定]
Start Date:[2011-08-18T09:00:00.000+09:00]
End Date:[2011-08-18T10:00:00.000+09:00]
Summary:[null]
Place:[埼玉スーパーアリーナ]
== schedule end ==
=== END All schedules ===

次に、単一ユーザで複数のカレンダーを持っている場合に、カレンダーの一覧を取得するサンプル。このサンプルでも、以下の値をConstantsクラスに別途定義している。


  • String loginAddr(gmailのアカウント@gmail.com)
  • String loginPassword(アカウントのパスワード)
  • URL url("http://www.google.com/calendar/feeds/default/allcalendars/full")
このとき、urlに"http://www.google.com/calendar/feeds/default/owncalendars/full"を指定すると、ユーザが所有するもののみ取得になる(allcalendarsでは、自分が所有していないカレンダーでも取得対象となる)

import com.google.gdata.client.calendar.CalendarService;
import com.google.gdata.data.calendar.CalendarEntry;
import com.google.gdata.data.calendar.CalendarFeed;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;


public class TestMain {

	/**
	 * @param args
	 * @throws ServiceException 
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException, ServiceException {
		// TODO Auto-generated method stub

		CalendarService service = getMyCalendar();
		
		CalendarFeed feeds = service.getFeed(Constants.allCalendarUrl, CalendarFeed.class);
		
		List<CalendarEntry> entries = feeds.getEntries();
		
		for (CalendarEntry entry : entries)
		{
			System.out.println(entry.getTitle().getPlainText());
		}
		
	}

	private static CalendarService getMyCalendar() throws AuthenticationException {
		CalendarService ret = new CalendarService("example");
		ret.setUserCredentials(Constants.loginAddr, Constants.loginPassword);
		
		return ret;
	}

}

同じく、複数のカレンダーを保持するようにしている場合、実行結果は以下のようになる。

1つめのカレンダー(デバッグ用)
2番目のカレンダー(デバッグ用)
最初のカレンダー(デバッグ用)
4つ目のカレンダー(デバッグ用)
日本の祝日
連絡先の誕生日と予定

そして、上記2つの事ができるならば、「自分が保持しているカレンダーの下にぶら下がっている全ての予定を取得」することも可能ではないかと考えがち(というか、自分も考えた)だが、一筋縄ではいかない。方法はあるにはあるのだが、オフィシャルに公開されている方法でないし、いつまでも同じ方法でできるとも限らない。ともかく長くなってしまったので、このエントリはここまでとする。

2011-10-02

PCを買った。

自宅で作業する分には、それなりのスペックのPCがあるので特に問題はないのだけど、実家に行くと自宅に持ってきた分のPCがすっぽりなくなっているので、(特に開発が)できなくなってしまう。
この状況を改善すべく、家にいてもそれなりに開発や諸処の作業ができるように、PCを買った。トリガーは安売りしていたPCがあったので、それを実家用にしようというのが先。
ベースになるのはこれ。今はオンラインでは買えないので、恐らく一般の流通が終わって格安で在庫処分したものだと思われる。
http://h50146.www5.hp.com/products/desktops/6005pro_usct/

HP 6005 Pro USの主なスペック
CPUAMD Sempron™ 150 プロセッサ (2.9 GHz、1MB L2キャッシュ)
チップセットAMD 785G チップセット
メモリ容量(最大容量)PC3-10600 (1333MHz) : 1GB (1GBx1)
メモリスロット2 SODIMMソケット (1ソケット占有済み) / DDR3 SDRAM (204ピンDIMM)
ハードドライブSerial ATA/300 : 160GB (7,200rpm)S.M.A.R.T.対応
オプティカルドライブ最大8倍速 DVD-ROMドライブ (スリムライン)
サウンドハイデフィニション・オーディオ Realtek ALC261 codec、内蔵スピーカー
グラフィックスコントローラーATI Radeon™ HD 4200 グラフィックス (チップセット内蔵)
ビデオメモリDDR3 128MB (サイドポートメモリとして実装)
標準解像度640×480~2,048×1,536(アナログ)・2,560×1,600 (デジタル) / 1,677万色
ドライブベイ外部スリムラインベイ×1 (空0)、内部 2.5インチ×1 (空0)
ネットワークコントローラーBrodacom NetXtreme ギガビット・イーサネット BCM 5761(RJ45) WOL、ASF2.0 対応
USBポートUSB2.0×10 (前面4、背面6)
PS/2Mini DIN 6ピン×2
モニターアナログRGBミニD-SUB 15ピン (メス)×1、DisplayPort×1 (チップセット内蔵グラフィックス使用時)
その他 I/O(前面)ヘッドフォン (ステレオミニ) / マイク (ステレオミニ)×各1
その他 I/O(背面)ラインイン (ステレオミニ) / ラインアウト (ステレオミニ)×各1
キーボードUSB スタンダードキーボード (OADG準拠 日本語版109Aキーボード)
マウスUSB光学マウス
サイズ(W×D×H) / 質量66(123)×254×251(270)mm (カッコ内はタワースタンド装着時)(ACアダプター外付け) / 約 3.1kg
電源ユニット135W 80PLUS認証 外付けACアダプター(電源変換効率87%以上)
消費電力 (通常/最大)AMD Sempron™ 150プロセッサ (24W / 67W)

上記の表は自分の備忘目的の側面が大きい(実家に置いてきたので)。ここから以下の点を諦め/強化ポイントとした。
  • CPUは購入時にSempron固定だったので、悪あがきはせずSempronとして使う
  • RAM1GBだとコンパイルやJavaアプリ実行時に恐らくスラッシングが大量に発生するので追加する
  • 有線でなく無線LANを使いたいが、拡張ポートは0なので、USBで追加
  • HDDは領域不足になる可能性がなくはないのと、いつか売却する時があるかもしれないため、別に買ったもので換装する
以前はデスクトップPCを自作していたが、以下のデメリットがあると考え今回は自作をしていない。

  • エアフローと騒音を考えると、検討する手間と値段(今回は19800円)からメーカー製のほうが楽
  • 配線が面倒、ケーブル類の取り回しが面倒
  • 電源がACアダプターからの給電
  • ストレージの取り外しが楽
OSはVista SP2が付いていたが、特に使わないのでLMDE(Linux Mint Debian Edition)64bitをインストールしている。
今回、買ったPCとは別にRAMとHDDを買っていたが、デスクトップPCでありながらRAMはSODIMMで、HDDは上記スペックに記載がないが2.5インチ(9.5mm厚)である。HDDについては完全に見落としていたため、最初2TB HDDを買ってしまったため、後から2.5インチの750GBを買いなおしている。

USB接続の無線LANについては、GW-USEco300JC[1]を購入した。こちらは事前にLMDEで使うことを想定し、できるだけ使うための作業が必要ないものを確認した。
GW-USEco300JCはパッケージ以外はおそらくGW-USEco300が使用されており、チップはRealtek RTL8192CUSが使用されていると思われる。また、VID:PIDは2019:AB2Bであり、Debianにおける使用が可能かどうか調べたところ、RTL8192CUSはfirmware-realtekパッケージにおいて0.30にてサポートが追加されているようであり[2]、VID:PIDの記載がソース中にない場合は再コンパイルが必要かとも思ったが、2019:AB2Bは記載されているであろう[3]事から、今年5月以降のDebian派生ディストリビューションでは特に作業は必要ない事を期待した。
実際に、USBポートにGW-USEco300JCを接続しただけで、SSIDを選べるようになった。

シングルコアではあるが、大変快適である。

[1] http://www.planex.co.jp/product/wireless/gw-useco300jc/
[2] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=625614
[3] http://wiki.debian.org/rtl819x#rtl8192cu

2011-09-24

画一化されたカレンダーの提供方法


生活に関連する一般的な要素として、カレンダーがある。
連絡に用いる電子メールや情報を発信するWeb等がユーザレベルでも広く広まっているが、それらと比べるとカレンダーの標準化という点ではあらゆるユーザが統一した方法でアクセスするようにはなっていないと感じる。
標準化されるための方式自体は標準化されている(iCalendar、CalDAV等)が、よくある施設のイベントの一覧は大抵はHTMLでブラウザからアクセスする事だけを目的としており、ユーザは複数の施設の予定を確認するには施設ごとのサイトにアクセスする必要があり、予定が競合するかどうかの確認は
  • 並べて表示する
  • メモしておく
等の操作を行ったうえで自分のスケジュールを突き合わせる必要があり、二次加工の容易さをもっと求めた方がユーザのためになるのは明白だと考えている。
そのための提供方法の統一化を考えた場合、とりあえずGoogleカレンダーは以下の点から便利に使えるのではいかと考えている。
  • ひとつのアカウントで複数のカレンダーを保持できる
  • カレンダー毎に第三者に公開でき、権限(閲覧・参照など)を設定できる
  • HTML、iCalendarなど、さまざまなアクセス方式が用意されている
なお、Googleカレンダーの操作をするためのAPIが公開されており、プログラムから操作する事が可能なため、調査結果を報告したい。

ログの設計(考え方)

あらゆるシステムを作成する際に重要な役割を果たすのがログであり、概ね開発段階・運用段階において以下の目的で使用される。

開発段階(テスト段階)でログ出力を行う目的

  • 処理呼び出しの契機の確認(システム外部からの呼び出し確認)
  • 処理結果(正常終了・異常終了)確認
  • 処理通過ルートの確認
  • 性能計測(ログ出力時刻を基準にして計算)
運用段階でログ出力を行う目的

  • 障害発生の検出
  • 障害発生箇所の局所化
  • 障害発生原因の推定
目的の違いや、むやみに出力を行うとログ出力量が膨大になり、またログ出力自体もひとつの処理なので、出力を増やしすぎると性能に影響する事も避けられず、たいていの場合はシステム内でログレベルが決められている(決めないと後工程に推移するにつれて大変なことになる)。
大抵の場合、ログレベルは重要度に応じて定義される。最低でも以下のログレベルは用意すべきである。
  • エラー(重要・復旧不可能)
  • エラー(軽微・復旧可能)
  • システム外との入出力ログ
  • システム内部(機能単位)の入出力ログ
  • デバッグログ(結合試験の結果確認で必要な情報)
  • トレースログ(単体試験の結果確認で必要な情報)
運用レベルではエラーログとシステム間の入出力があれば、そこから何が起こっているのかは類推できるはずなので、試験終了まではそれ以外も出力してよいと個人的に考えている。また、入出力ログのタイムスタンプからどの程度の処理性能なのかは確認できるので、運用試験の工程にて確認する目的でも使用可能であると考える。

2011-09-06

テスト投稿(日付フォーマット)

W3CDTFというフォーマットがあり、以下の6タイプが規定されている。

  1. 年のみ YYYY(例:2001)
  2. 年月 YYYY-MM(例:2001-08)
  3. 年月日 YYYY-MM-DD(例:2001-08-02)
  4. 年月日および時分 YYYY-MM-DDThh:mmTZD(例:2001-08-02T10:45+09:00)
  5. 年月日および時分秒 YYYY-MM-DDThh:mm:ss.sTZD(例:2001-08-02T10:45:23.5+09:00)
  6. 年月日および時分秒および小数部分 YYYY-MM-DDThh:mm:ss.sTZD(例:2001-08-02T10:45:23.5+09:00)
TZDにはUTCからの時差を示すか、UTCの場合はZの一文字を記述する。
XML SchemaのXSDTYPEは、上記のうちの5と6が使用可能である。(ただし、TZD部分は省略可能)


参考:http://www.kanzaki.com/docs/html/dtf.html