2016年11月22日火曜日

Spring Day 2016 参加メモ

先日11/18、Spring Day 2016 に行ってきました。

そろそろと思い、最近 Spring Framework、Spring Boot の情報収集・勉強を始めてた所でした。

このイベントは大規模で、開発元や国内の大手・有力な会社が講演を行うということで、期待大でした。

という事で参加メモ。


1.Application Re-Architecture Technology
 ~ StrutsからSpring MVCへ ~
倉元 貴一/池谷 智行(NTTデータ)

メモ:
 Springの薄くラップしたTERASOLUNAの説明。ガイドラインが目玉。
 二重送信防止機能がある。
 TERASOLUNAはSpring Boot未対応?みたいだが、ガイドラインは読む価値あり。



2.Spring Bootで学ぶ初めてのWEBアプリ開発
てらひで

http://www.slideshare.net/terahide/spring-bootweb-69236132

メモ:
 Bootのチュートリアルを少しデモ。関係ない話が多くて面白くなかった。



3.LINE における Spring Framework の活用
松野 徳大(LINE)



メモ:
 LINEではかなりJava率が高い。Springを多く使っている。
 フレームワーク決めつけない。一つにコミットすると変化に弱い。
 LINE Notifyで使用。
 Redisは良い
 Jetty使ってる。起動速い
 LINEは全部オンプレ
 freemarker使用。タイムリーフと人気を二分
 mybatis優勢。JPA少ない。
 技術的にかなり濃い内容。松野氏は若そうだがすごい技術者だと思う。しゃべりも上手い。
 


3.楽天トラベルとSpring
藤井貴浩/Thomas Ludwig(楽天トラベル)



メモ:
 マイクロサービス推進
 SpringRESTDocsでAPIドキュメント作成
 マイクロだとログ追跡が面倒。MDCを利用。
 Spring Cloud Sleuthを使用
 楽天は堅そうなイメージだったけど結構攻めてる。



4.アメブロの大規模システム刷新とそれを支える Spring
向井 政貴/服部 拓也(サイバーエージェント)


メモ:
 OS、言語、フレームワークの陳腐化が深刻化
 レガシーコードも多く課題山積
 DC移設の際にシステム刷新した。Springを採用。
 SpringFox+SwaggerでAPIドキュメント作成
 とても分かりやすい内容で、面白かった。大規模になってくるとみんなAPI化。
 +Swagger等でAPIドキュメント作るのが常識になっているのが分かった。



5.Spring で実現する SmartNews のニュース配信基盤
井口 貝(SmartNews)


メモ:
 Seasar2からSpring Bootへ移行した。
 マイクロサービス化で個々のコンポーネントに集中。
 SpringFox+SwaggerでAPIドキュメント作成
 高度な周辺エコシステム
 spring boot adminでUIで設定確認、変更ができる
 actuatorでのメトリクス収集
 こちらもマイクロサービス化。今回Springのイベントなんだがマイクロサービスも存在感大だった。



その他、参加してないが以下のセッションも非常に興味深い。


Let's Visualize Your Spring Cloud Applications!
~ElasticsearchとSleuthを使った可視化の実際〜
谷本 心(Acroquest Technology)




Spring Security で作る Web API アクセス制御の最適解
~ Basic認証? APIキー? OAuth 2.0? OpenID Connect? ~
都元ダイスケ(クラスメソッド)





2016年10月4日火曜日

Rails勉強中

Ruby on Rails勉強中。

とりあえずドットインストールにて。
http://dotinstall.com/lessons/basic_rails_v2

Javaと相当文化が違う。

Migrationて、メリットが分からないな。

カラム追加する時とか、普通にALTERすればいいんじゃない。って思う。

でも、色々面白い。

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が最近気になる