2015年8月24日月曜日

GMail APIを使ってJavaからGMail検索

















GMail APIというのが最近できたらしい。

Java Quickstart
https://developers.google.com/gmail/api/quickstart/java

上記の説明では、gradleを使うようになっている。
gradleプラグインが標準で入っているEclipse 4.5をインストールしておく。もちろんPleiadesを使う。

Eclipseで、新規→その他→Gradle プロジェクト で、プロジェクトを作成する。

Library.javaとLibraryTest.javaが自動で作成されるが削除する。

「Gradle タスク」ビューでbuildを右クリックして「Gradle タスクの実行」をクリックすると、以下のエラーが出た。

--------------------------------------------------------
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Could not find tools.jar

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
--------------------------------------------------------

プロジェクトルートフォルダに、gradle.propertiesを作成し、以下のようにJDKのパスを設定した。
org.gradle.java.home=C:/Program Files/Java/jdk1.8.0_40


これで上記エラーは出なくなったが、違うエラーになった。
--------------------------------------------------------
C:\eclipse4.5\workspace\GMailAPI\src\main\java\GmailQuickstart.java:16: エラー: シンボルを見つけられません
private static FileDataStoreFactory DATA_STORE_FACTORY;
--------------------------------------------------------

依存性の解決がされていない。
自分でjarダウンロードのタスクを書いて実行しないといけない。


build.gradleに以下を追加する。libsフォルダはルートに作成しておく。
-------------------------------------------------
task copyDependencies(type:Copy) {
    from (configurations.compile)
    into 'libs' //ダウンロード先ディレクトリ
}
-------------------------------------------------

「実行の構成」から、Gradleの実行構成を作り、タスクに「copyDependencies」を入力して実行すると、
libsにjarがダウンロードされる。

その後、Eclipse上で「Javaのビルド・パス」から、libsにダウンロードしたjarをビルド・パスに入れる。

GmailQuickstart.javaのコンパイルエラーがなくなるので、Eclipseから普通に実行する。
以下のメッセージが表示される。

-------------------------------------------------
Please open the following address in your browser:
  https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=xxxxxxxxx-xxxxxxxxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http://localhost:23189/Callback&response_type=code&scope=https://www.googleapis.com/auth/gmail.labels
Attempting to open that address in the default browser now...
-------------------------------------------------

ブラウザで上記URLが自動的に開き、Googleの承認画面が表示されるので、「承認」をクリック。
以下のメッセージが表示された。
Received verification code. You may now close this window...


再度、GmailQuickstartを実行すると、めでたくGMailのラベル一覧が表示された。
※出力結果は割愛

###########################################################

次に、以下のコードでメール(メッセージ)の検索を試みる。
---------------------------------------------------------
Gmail service = getGmailService();
String user = "me";
ListMessagesResponse listResponse = service.users().messages().list(user).setQ("検索ワード").execute();
List<Message> messages = listResponse.getMessages();
if (messages.size() == 0) {
System.out.println("No messages found.");
} else {
System.out.println("messages:");
for (Message message : messages) {
System.out.printf("- %s\n", message);
}
}
---------------------------------------------------------


実行すると、権限がないとのエラーになる。
---------------------------------------------------------
Credentials saved to C:\Users\nob\.credentials\gmail-api-quickstart
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Insufficient Permission",
    "reason" : "insufficientPermissions"
  } ],
  "message" : "Insufficient Permission"
}
---------------------------------------------------------


↓に着目する。このフォルダを一旦削除して、再実行すると再度ブラウザで承認画面が開く。
Credentials saved to C:\Users\nob\.credentials\gmail-api-quickstart

しかし、相変わらず「メールボックス ラベルの管理」しか表示されない。


GmailQuickstart.javaのここに着目する。
private static final List<String> SCOPES = Arrays.asList(GmailScopes.GMAIL_LABELS);

以下のように、GMAIL_READONLYを追加する。

private static final List<String> SCOPES = Arrays.asList(GmailScopes.GMAIL_LABELS, GmailScopes.GMAIL_READONLY);


再度実行すると、リクエストの許可画面で、「メール メッセージと設定の表示」も表示された。
承認後、再実行すると、検索が実行できた。


しかし、出力結果を見ると、以下のようにidとthreadIdしかゲットできていない。
-------------------------------------------------------
- {"id":"14f5f0xxxxxxxxxx","threadId":"14f5eefxxxxxxxxxx"}
- {"id":"14f5eexxxxxxxxxx","threadId":"14f5eefxxxxxxxxxx"}
-------------------------------------------------------


メールの内容(送信者、受信者、サブジェクト、本文、etc...)をゲットしたい場合は、
idを元に再度getする必要がある。



以下は、検索して日付とサブジェクトと本文の一部(snippetと言う)をゲットする例。
---------------------------------------------------------
Gmail service = getGmailService();
String user = "me";
Long max = 5L; //最大件数
ListMessagesResponse listResponse = service.users().messages().list(user).setQ("検索ワード").setMaxResults(max).execute();
List<Message> messages = listResponse.getMessages();
System.out.println("ヒットした件数: " + messages.size());
for (Message message : messages) {
Message detailMessage = service.users().messages().get(user, message.getId()).execute();
List<MessagePartHeader> headers = detailMessage.getPayload().getHeaders(); //ヘッダー一覧
String date = "";
String subject = "";
for(MessagePartHeader header : headers) {
if ("Date".equals(header.getName())) { //日付
date = header.getValue();
}
else if ("Subject".equals(header.getName())) { //サブジェクト
subject = header.getValue();
}
}
System.out.println(date + "  " + subject);
System.out.println(detailMessage.getSnippet());
System.out.println();
}
---------------------------------------------------------


setQ("検索ワード")の部分は、GMailブラウザ版と同様の検索機能が色々使える。

 送信者を指定する例:   from:送信者の名前またはアドレス
 期間を指定する例:      after:2015/08/15 before:2015/08/25



しかし、、自分でタスク書いてlibsにダウンロードするなら、gradleである必要があったのかな・・・。

ちなみにlibsにダウンロードされたjarの一覧はこちら。

commons-codec-1.3.jar
commons-logging-1.1.1.jar
google-api-client-1.20.0.jar
google-api-services-gmail-v1-rev29-1.20.0.jar
google-http-client-1.20.0.jar
google-http-client-jackson2-1.20.0.jar
google-oauth-client-1.20.0.jar
google-oauth-client-java6-1.20.0.jar
google-oauth-client-jetty-1.20.0.jar
guava-jdk5-13.0.jar
httpclient-4.0.1.jar
httpcore-4.0.1.jar
jackson-core-2.1.3.jar
jetty-6.1.26.jar
jetty-util-6.1.26.jar
jsr305-1.3.9.jar
servlet-api-2.5-20081211.jar


2015年8月21日金曜日

Amazon S3にawscliのs3 syncを使ってファイルバックアップ

【S3事前準備】
1.AWSアカウントを作成する。
2.AWSコンソールにログインし、S3の管理画面を開く。              
3.バケットを作成する。名称は"xxxx-bucket"等任意。
4.右上のユーザー名をクリックし、「認証情報」をクリック。
5.「アクセスキー」を開き、「新しいアクセスキーの作成」から作成し、アクセスキーIDと、シークレットアクセスキーをエディタ等に控える。(後で再確認できない!)

【s3 sync インストール・設定】
1.pythonインストール
     yum install python
2.pipインストール(awscliをインストールするためのもの)
     cd /usr/local/src
     wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
     python get-pip.py
3.awscliインストール・設定(AWS公式ツール)
     pip install awscli
     aws configure 
         →アクセスキーIDとシークレットアクセスキーを入力する。Default region nameとDefault output formatは未入力でEnter。

【S3へのバックアップ】
1.バックアップコマンド実行
     aws s3 sync バックアップファイルがあるディレクトリ s3://xxxx-bucket/
     →バケットにファイルが送信される。コピー元にフォルダがある場合はそれも同期される。
         既にS3側に同一ファイルが存在する場合は送信されない。
2.ファイル削除コマンド実行
     aws s3 rm  s3://xxxx-bucket/ファイル名
     →S3のファイルを削除する。

http://docs.aws.amazon.com/cli/latest/reference/s3/index.html

s3fsという、S3をファイルシステムにマウントしてくれるサードパーティツールもあるが、安定していないのでおすすめできない

2015年8月19日水曜日

DaiGo語録メモ

2015年6月29日月曜日

Androidで写真と動画を複数選択するUI

Androidで写真と動画を複数選択するUIの作り方を書いてみます。

MediaChooserというライブラリを使用します。

https://github.com/learnNcode/MediaChooser

こんな感じで、ビデオのタブと写真のタブがあり、
選択して右上の「Done」を押すと決定するというUIです。



1.SDK Managerで、以下をインストール。すでにInstalledであれば不要。
 Android Support Repository
 Android 4.4.2 (API 19)の中の以下2つ。
  SDK Platform
  Google APIs (x86 System Image)

2.Android Studioを再起動。

3.https://github.com/learnNcode/MediaChooser に行き、右側の Download ZIP を
 押してダウンロードし、解凍しておく。

4.Android Studioのメニューの File → Import Project から、
 解凍した中の mediaChooser-sample フォルダを選択してインポート。
 comlearnNcodemediachoosersampleとmediaChooserlibの2つのプロジェクトができる。

5.mediaChooserlib/manifests/AndroidManifest.xml のandroid:name="@string/app_name" の所でエラーになるので、
 android:label="@string/app_name" に修正。

6.さらに、同ファイルの
 com.learnncode.mediachooser.fragment.ImageFragment の所でエラーになるので、
 <activity を <fragment に修正。その下のVideoFragmentの所も同様。

7.android:theme="@style/AppBaseTheme"  が重複しているとのエラーが出るので、
 android:theme="@style/AppBaseTheme" を削除。

8.メニューの Build → Clean Project を実行すると、ビルドが成功。
 (BUILD SUCCESSFUL)

9.アプリを実行 (Run 'app')すると、サンプルアプリが起動する。
 少し動かしてみて感触を掴んだら、今度は自分のアプリに組み込む。

10.自分のアプリをAndroid Studioで開いて、File → Project Structure を開く。
 左上の + をクリックし、下の枠の Improt Existing Project を選択して Next を押す。

11.先ほど解凍した MediaChooser-lib フォルダを選択して Next を押して、さらにNext、Finish を押す。
 ビルドが行われるので、しばらく待つと、mediaChooserlib というライブラリが自分のアプリと同じ階層に現れる。

12.上記の5~8を実行する。

13.続く・・・

2015年3月20日金曜日

メンタリストDaigoが最近気になる

2015年2月5日木曜日

iOS8のSystemButtonのスクリーンショット一覧

Titaniumで使える、iOSのSystemButtonのスクリーンショットをメモとして残します。

iPhone5S、iOS8のものです。



ACTION
ACTIVITY
ADD
BOOKMARKS
CAMERA
CANCEL
COMPOSE
CONTACT_ADD
DISCLOSURE
DONE
EDIT
FAST_FORWARD
FIXED_SPACE
FLEXIBLE_SPACE
INFO_DARK
INFO_LIGHT
ORGANIZE
PAUSE
PLAY
REFRESH
REPLY
REWIND
SAVE
SPINNER
STOP
TRASH


2014年9月20日土曜日

Jリーグ各チーム用スマホアプリ

レッズマイライフ(iPhone版Android版)をベースとして、
Jリーグの各クラブ用のアプリを作ってます。

今の所、以下3つのアプリをリリースしてます。
全チーム分、iPhone版とAndroid版を作る予定。

スマートJ for 川崎フロンターレ iPhone版

スマートJ for 川崎フロンターレ Android版

スマートJ for 横浜F・マリノス Android版

スマートJ for アルビレックス新潟 Android版

★ ★ ★ ★ ★ ★ ★ ★ ★

マリノス版のスクリーンショット。
マリノスに関連するニュース、ブログのみ表示します。


試合日程。ハイライト動画も見れます。


順位表。