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