re:Growth 2016 TOKYOに行ってきました!

エントリー遅くました・・。
re:Growth 2016に行ってきました!
classmethod.connpass.com


ビュッフェの料理が唐揚げしかなかったクソワロタwww(画像なし)
f:id:yasay:20161223082028j:plain
そしてめそ子・・・クラスメソッド様はどこに向かうのでしょうか。いや、可愛いけどね。

書き殴っていきます!
まずは、AWS日本法人のエコシステムソリューション部の方による、
re:Inventで発表されたサービスの紹介。

20分でわかる re:Inventで発表された最新AWSサービスの全て!2016年版

  • 去年よりサービスの量が多かった。
  • プレミアムパートナーは日本は5社から7社に増えた。NRINTTデータが追加。

以下、トピック別に記述します。

インスタンスタイプの拡充

新サービスAmazon Lightsailを発表

  • 仮想専用サーバVPSのように使い始めることができるサービス
  • データ転送量を含めた定額

Amazon Athenaを発表

  • GCPのBig queryみたいなもの

→東京リージョンはまだ。海外ならすぐ試せる。

Amazon AIの発表

  • 画像認識、音声認識などを使えるようになる。

Amazon AuroraPostgreSQL対応

  • 9.6.1互換のAurora

Oracleからの移行にニーズがある。
→東京リージョンはまだ。

AWS Greegrassを発表

→IoTデバイスゲートウェイバイスAWS上のリソースとの連携を容易にする新サービス

AWS Snowball Edgeを発表

→100TBの容量を備えた新型Snowballアプライアンス

AWS Snowmobileを発表

→トラックで100PBのキャパシティを移行www
→半分ネタみたいな機能だけど、アメリカだとそういう要望があるらしい。

EC2 Systems Managerを発表

  • OSのパッチの自動適用だったり、自分でやっていたものを自動的に実行。

→結構便利じゃね?EPで需要ありそう。

AWS Code Build

  • ビルドとテストが実行可能なマネージドサービス

AWS X-Rayを発表

  • アプリケーションにSDKやAgentを入れるとトレースデータを補足できるサービス

BlackBoxだったのをより見やすくする運用監視ツール

AWS Personal Health Dashboardを発表

  • 突然リブートの連絡がきたりして、困ることがある。

ダッシュボードでそういった連絡を一見化することができるようになる。
→運用がしやすく。全てのリージョンで使用可能。

AWS Shieldを発表

  • マネージドDDoSプロテクションサービス
  • 無償版と有償版を用意。

AWS Pinpointを発表

  • モバイルアプリケーション向けターゲットプッシュ通知サービス

→使ってない人にだけ促したりとか、セグメンテーションをカスタマイズすることができる。
→Mobile Hubに連携して組み込んでいる。

AWS Glueを発表

  • データカタログの作成と、データの加工・ロード(ETL)が実現可能なマネージドサービス

→巨大なデータを管理しながらETLができる。

AWS Batchを発表

AWS Step Functionを発表

  • ワークフローの管理、ステップ管理ができるサービス

Lambda@Edgeの発表

  • Lambdaベースの処理をCloudFrontのエッジロケーションで実行し、リアルタイムにヘッダー、URLなどの編集が可能なサービス


「10年間、AWSは進化し続けてきた。だから、これからの10年も進化し続けるだろう。」





次にクラスメソッド社員の方によるセッション

Step Funcitonの紹介

ビジュアルなワークフローにて、アプリケーションのコンポーネント
一連のステップとして実行できる。
Lambda以外も動く。
→何ができるのか→ワークフローをステートマシンとして利用できる。
→Lambda連携が大きい。Lambda Function同士が疎結合でメンテナス性がよくなる。

バッチジョブのフロー定義
AWS Batchとの住み分けがまだ分かってない。

中身はAmazon Stets Languageという記述ルールがある。
→これを覚えるのが少し大変そう?
→エクスポネンシャルバックオフ!

VUIとAlexaによるちょっと未来の体験

→alexa最高じゃん。めっちゃ欲しい。なんだこの未来大好き。
→ハードウェアはAmazon Echo。ソフトウェアがalexa。
→IoT発展によるSmart Homeの可能性
→「alexa、おやすみ」の一言で複数の設定を行うことが理想
 →それがコンテキスト。文脈を読み取り、適切なプログラムを起動することがコンテキスト。
 →Alexa Skills Kit, Alexa Voice Service
  →お金高くつきそう・・・
→Raspbelly piでも使えるらしい。
→Polly, Lex

AWS Glue

→フルマネージドなデータカタログとETL処理を提供するサービス
→背景:DWH構築作業の70~80%がETL処理
→ETL処理の70%が手組みのプログラム
Brittle, Error-prone, Laborious

Data Catalog
→データ検索と型定義を自動化するサービス
・Hiveメタストア互換のメタデータリポジトリ
パーティション情報の自動検知と更新

Job Authoring
→データ連携のロジックを自動生成
→データ連携のためのPythonコードを自動生成(PySpark)
→任意のIDEで改造し、Gitで共有したりできる。

連携のスケジュールも組める。

Job Execution
→スケーラブルなジョブ実行
→lambdaのコードと連携させて、イベント単位で実行させることもできる。

スライドが共有されています。
www.slideshare.net

AWS Personal Health Dashboardの可能性

AWSの障害情報を見れるダッシュボード
 →今まではサービス情報を見てた。大量のサービスの内容から障害情報見るの大変。
 →「Open issues」タブで自アカウントで使用しているサービス、リソースの障害情報のみ一覧で見れる。
 →各Issueに対する詳細でどのように対処すればよいかまとめられている。
→問題発生したら自動で○○したい場合・・・
 →いままではRSなどの収集方法もあったが・・・
  →CloudWatch Eventsと連携してアクション可能。Lambdaも後ろで動かせる。
  →Health APIが提供されているので、CLIで操作できる。→リージョン指定はちゃんとしてください。
→Business/EnterpriseサポートのアカウントのみHealth APIを使用可能

VPSサービス Amazon Lightsailを使いこなす

→とにかくシンプルにサーバーをローンチできる。
→機能・柔軟性は削られている。
→分かりやすい価格設定。
→EC2起動に必要な操作は大変だった。(自分もやったことあるからわかる。)
 →それがシンプルに使い始めることができる。
→社内のシステムのLightSailにするのもありなんじゃないの?
→ブラウザからのSSHアクセスが可能。すぐその場で使える。22番ポートで出て行かないので、プロキシに邪魔されにくい!
→制約はいろいろあるので、EC2への移行をしたい場合は考慮する必要があり。
FirewallでソースIP制限不可能

AWS Lambda@Edgeについて

・どんな課題があったのか
→リクエストの内容によって動的な処理をしたい場合はある。
 →この処理はオリジン側でないと実装が難しい。

CloudFrontの各種イベントに基づきLambda関数をエッジロケーションで実行させ、
リクエスト・レスポンスオブジェクトを動的に処理できる機能
→エッジロケーションで実行されるので低レイテンシを実現

AWS Batchを使う想像してみた

以下のような内容の紹介など
1.コンピューティング環境の作成
2.ジョブキューの作成
3.ジョブ定義の作成
4.ジョブの作成

EC2 Systems Managerはいいぞ

→EC2との付き合い方を変えるサービス
・中心機能はRun Command
→対象のインスタンスを指定することで、Run CommandでOS上の操作をすることができる。
→大量のOSを運用する場合に効果を発揮するのでは。

・重要なコマンドドキュメント
AWS-RunShellScript
AWS-RunPowerShellScript
AWS-InstallSpecificWindowsUpdates

・SSMと何が違うの?
→大きな違いはなかったらしい・・

・新機能
→インベントリ
 →EC2の情報を定期取得(AWSコンポーネント、ネットワーク情報、Windowsアップデートとか)
 →Aws Configで追従可能(AWSリソースの変更履歴)
→ステートマネージャ
 →OSとアプリケーションの一貫した構成を維持
→オートメーション
 →自動化。デプロイメントの自動化など
→パラメータストア
 →ドキュメントで参照するパラメータを定義

無料、東京リージョン対応

新サービス:Athena

Athenaとは
→ビックデータのデータ分析は大量作業、大量な知識必要
 →ETL、データロードが不要
 →S3上データへ対話的SQLクエリ
 →複数フォーマット対応
→特徴
 →サーバーレス、早い、コスト効率がよい、ツール連携

Amazon AI兄弟の世界

Deep LearningのノウハウをAmazon以外の開発者も使えるようにした。
→Recognition
 →顔認識とか。
→Polly
 →同型異義語の前後の文脈を理解して発音を変える
→Lex
 →Alexaの設計が元になっている。

以上です。

「世の中を変えるような技術が簡単に使えるような時代。
この技術を使って、世の中を変えていくシステムを作っていきましょう!」

クラスメソッドの横田社長様から熱いメッセージを頂き、終了となりました。

早速LightSailでVPS始めたいと思います!

Spring BootでWebアプリケーションを作りたい! 環境構築 + Hello World編 STS3.8.2(Eclipse) + Gradle(Buildship) + JSP

巷では流行っているSpring Boot。
どうしてもSpring Bootを使いこなしたい私です。
仕事のプロジェクトも全部Spring Bootになってしまえばいいのに(ぉぃ)

今回は、下記の環境でSpring BootによるMVCJSPで作っていきます。
Thymeleafはまた今度。

IDE STS 3.8.2
Gradle Buildship Gradle Integration 1.0(Plugin)

Gradleプラグインのインストール

初っ端からはまった。Eclipse Market Placeからインストールってどのサイト見ても書いてるんだけど、
「Gradle (STS) Integration for Eclipse」なんてプラグイン見つかりません。
どれをインストールしてよいのか分からず。

とりあえず、Gradle IDE Packをインストールしてみた。
f:id:yasay:20161209151209p:plain

再起動したらなんか警告でた。
f:id:yasay:20161209151235p:plain

訳:
STS gradleプラグインは最小限のメンテナンスであり、今後中止される可能性があります。
STS GradleからBuildshipへの移行プロセスを説明する文書がここにあります。

・・・つまりもうメンテしないから違うプラグインに移行してってことかな。

どうやら、Buildshipに移行してくれとのことです。
Migration guide from STS Gradle to Buildship · eclipse/buildship Wiki · GitHub

このPluginか!
f:id:yasay:20161209152009p:plain

Eclipseがエラーを検知したらしいけど、Enableにしようとしたらポップアップが消えちゃった・・。まぁいいや。
f:id:yasay:20161209153121p:plain

これでやっとGradleプラグインのインストールが完了。

demoプロジェクトを作ってみる。

Typeに"Gradle (Buildship)"を選択。
f:id:yasay:20161209153247p:plain

とりあえずWebプリケーションを作ってみたいので、Webを選ぶ。
f:id:yasay:20161209153834p:plain

雛形が作成されました。
f:id:yasay:20161209154211p:plain

ControllerとJSPファイルを追加する。

詳しくは分からないのですが、JSPを利用すると
Spring Bootの恩恵を最大限に受けられないらしく、
Thymeleafを使うことを推奨されています。
ということは、Spring MVCからSpring Bootへの移行って
あまり需要ないのかもしれないですね?

Spring Legacy Projectで作られるコードを元にして、
HomeControllerとJSPファイルを作成していきます。

  • HomeController.java
// HomeController.java
/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		logger.info("Welcome home! The client locale is {}.", locale);
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		return "home";
	}
	
}


JSPは"src/main"ディレクトリ配下に下記のディレクトリ構成を作って配置します。
f:id:yasay:20161209184505p:plain

<!-- home.jsp -->
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>
application.propertiesを修正する

jspファイルを読み込めるよう、設定を記述します。

  • application.properties
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp
Gradleでtomcat-jasperライブラリを取得するよう変更する

Gradleをごにょごにょ記述するのはmavenより好きになれそう。

  • build.gradle
buildscript {
	ext {
		springBootVersion = '1.4.2.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

jar {
	baseName = 'demo'
	version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
	mavenCentral()
}

dependencies {
	compile('org.springframework.boot:spring-boot-starter-web')
	testCompile('org.springframework.boot:spring-boot-starter-test')
	compile('org.apache.tomcat.embed:tomcat-embed-jasper:8.5.6')
}

tomcat-embed-jasperのバージョン指定を変数に変更しようと思ったんですが、
うまくいきませんでした。これはGradle文法を学ぶ必要あり。もしよければプルリク下さい。

ライブラリを再インポートする

プロジェクトを右クリック「Gradle」→「Refresh Gradle Project」を実行
f:id:yasay:20161209191615p:plain

実行する

プロジェクトを右クリック「Run As」→「Spring Boot App」を実行
f:id:yasay:20161209191730p:plain

画面が表示されました!

f:id:yasay:20161209191818p:plain

GitHubソースコードを置きました。

備忘録がてらGitHubに置きました。
github.com


結論:Spring Boot使ってて楽しい!
次は下記のようなことにチャレンジしていきます。

  • Thymeleafを使う
  • ロギングの設定を行う
  • IntelliJ IDEAで同じことをやってみる
  • Jarファイルのデプロイ



おまけ:GradleのZipを直接ダウンロードして環境変数を通してみる。

Gradleのインストール

公式サイトからZipファイルをダウンロードしてきて、お好きな場所に保存
Gradle Build Tool

Gradleの環境変数の設定

GRADLE_HOMEにGradleのホームディレクトリを設定する
f:id:yasay:20161209144006p:plain

Pathに"GRALE_HOME\bin"を設定する
f:id:yasay:20161209144512p:plain

動作確認

無事にパスが通りました↓
f:id:yasay:20161209150041p:plain


JJUG CCC 2016 Fallに行ってきました!

JJUG CCC 2016 Fallにボランティアとして参加してきました!
幹事会の皆様、今回私は初参加でしたが、
暖かく迎えてくださりありがとうございました!
http://www.java-users.jp/ccc2016fall/www.java-users.jp
JJUG主催の大規模イベントです。
場所はベルサール新宿グランドコンファレンスセンターです。
セッションで使う部屋が大きく、トイレもたくさんあり収容力のある会場です。
これはSpring Day 2016よりよかった点だと思います。
f:id:yasay:20161206232543j:plain
今回は905人以上の方が参加し、記録更新したようです。
初めての参加者が多く、30代の参加が多くを占めますが、
20代の参加者も意外と多いみたいです。

www.slideshare.net

今回はボランティアとしてお手伝いに参加しました。
f:id:yasay:20161206232330j:plain
イベントのTシャツを着て参加です!
自分は後半からのお手伝いでしたので、前半はセッションを見ました!
見たセッションの感想を書いていきます。↓

10:00 ~ 10:50 : Prepare for Java 9 : Java 9 に備えよう

参考になりすぎて、社内でも情報共有したいレベルのセッションでした。
プロパティファイルがUTF-8に対応したことや、
JShell、Jigsawで何ができるかを学びました
JShellはPythonとかにあるターミナル形式のコーディングですね。
これは使ってみたい!教育用にいいらしい。
普段意識しづらいパッケージの依存関係ですが、
注視してみると結構闇の領域な気がします。
この依存関係の管理をしやすくなるのが、Jigsawらしい。

スライドが公開されています。↓

www.slideshare.net


11:00 ~ 11:50 : SIerもはじめる、わたしたちのDevOps

登壇者の方が二人いらっしゃいました。
最初は大手SIerによるDevOpsの取り組みが紹介されていました。
デプロイ1分で完了する仕組みとか真似したい。
次に主にDockerを活用したDevOpsについて紹介されていました。

スライドが公開されています。↓

www.slideshare.net

Githubで資料が公開されています。↓
GitHub - kawasima/rascal-scheme: ふつうの受託開発のやりかた
GitHub - kawasima/mentr: ソフトウェアエンジニアに対するメンタリングを考えるリポジトリ

Demoが公開されています。↓
www.asa.yokohama – このドメインはお名前.comで取得されています。


13:30 ~ 14:20 : Event Driven MicroServices with Spring Cloud Stream

かなり上級者向けの内容でした。イベントドリブンである
Spring Cloud Streamをマイクロサービスで活用することについて学びました。
スライドが公開されています↓

www.slideshare.net


14:30 ~ 15:20 : Spring CloudでDDD的なマイクロサービスを作ってみる

ドメイン駆動設計によるマイクロサービスの
デモおよびソースコードの解説がメインのセッションとなります。
↓のようなキーワードがありました。
・境界づけられたコンテキスト
ユビキタス言語
リポジトリ
上記DDDのキーワードを実現する上での実践的なヒントは参考になりました。
デモアプリが回転寿しの注文システムであったり、
スライドの内容が基本手書きなのがとても印象に残りました。
また、マイクロサービスで開発する時はチームを分けたほうがよいという話もありました。
登壇者は楽天の方でした。
f:id:yasay:20161206234605j:plain



この後、
16時からはボランティアで主にKブースと懇親会の準備などを担当しました。
KブースはAtlassian様、Samuraism様そして、elastic様がブースを設置していて、
LTのタイムキーパーを担当しました。
懇親会と飲み会に参加した後、終電ギリギリで帰宅です。
セッションの登壇者の方とお話する機会を頂けたりで、充実した1日でした!

↓ちなみに会場の近くに神社がありました。
どう見てもピンクw
f:id:yasay:20161206235708j:plain

お疲れ様でした!

WindowsでもBashを使う!Bash On Ubuntu On Windowsのrsyncを使って自動バックアップ!Slackとの連携も♫

以前、下記のエントリーで複数のPCをMac miniに集約しました。
xblood.hatenablog.com

この時に、自動バックアップをBunBackUpからrsyncスクリプト
移行したので、エントリーを残しておきます。

何故ツールを移行したのか。

BunBackUpはWindowsで使える便利で強力なバックアップツールです。
nagatsuki.la.coocan.jp
ですが、最近はMacで開発することが多く、
いつMacに乗り換えるか分からないような状況です。
なので、WindowsでもMacでもLinuxでも動くバックアップツールを作ることが
今回の目的です。

rsyncは古くからある強力なLinuxコマンド

ノウハウも多く検索すればたくさん情報が出てきます。
以前Macでバックアップしていた時もrsync使ってました。

役に立った「Bash On Ubuntu On Windows

Windows 10にはAnniversary Updateで「Bash On Ubuntu On Windows」が導入できます。
これは、Windows環境下でBash環境を実現するための公式ツールになります。
今回は、「Bash On Ubuntu On Windows」を使って、rsyncコマンドによる自動バックアップを構築します。
※なんかいい略し方ないですかね・・BOUOWだと分かりづらい気がする。


それでは、やっていきます。
そんな難しいことはしていないです。
要するにBash自動起動する仕組みを作るだけです。

バッチファイルでBashを起動する。

Bash.exeは下記ディレクトリにあります。

C:\Windows\System32\

Bash.exeの場所が特定できれば簡単です。Bashを起動するバッチファイルを作ります。
↓以下コマンド例

cmd /c ""C:\Windows\System32\bash.exe" --login -i -- /mnt/c/rsync_scripts/runRsyncBackup.sh"
バッチファイルをタスクスケジューラーから呼び出す。

Windowsにはタスクスケジューラーが用意されているので今回はこれを使います。
f:id:yasay:20161130223150p:plain
毎日1時間毎に処理を実行します。
スクリプトは成功ファイルを生成して、当日に一度でも処理が成功すれば
空振りするように仕組みます。


Slackと連携する。

成功メッセージをSlackに送信して通知するようにします。
方法はいろいろありますが、今回は「Incoming Webhooks」を使って実現します。
api.slack.com
Slack連携用スクリプトにメッセージを送ってあげるだけ。

echo "Successful backup process with rsync script.
Log File Name : ${fileName}
Success File Name(=Date) : ${successFileName}
Mount Status : e=${e}, g=${g}, h=${h}, z=${z}" | bash sendResultToSlack.sh

メッセージの送信に成功しました!↓↓
f:id:yasay:20161130223210p:plain

GitHubスクリプトファイルを置きました。

具体的な処理内容については、GitHubを参照してみてください。
github.com
いけてないコードのプルリク歓迎です。


これでバックアップの仕組みが構築できたので一安心です。
大事な家族の写真も自動的にバックアップされます。

もしこの記事を見て実践したいのでしたら、
rsyncコマンドの間違いにはくれぐれも注意してください。
大事なファイルを失う可能性があります。

"--dry-run"を実行してバックアッププレビューを行い、
何度も正しいか確認してから、rsyncコマンドを実行することを
おすすめします。


今後は下記のような改善をしていきたいです。

  • Successファイルの自動削除
  • 前回のバックアップから1週間以上経過している場合に、Slackにメッセージを送信


■参考情報とか
【シェル芸人への道】Bash on Windowsを探検する - Qiita
[10分で出来る]シェルスクリプトの結果をslackに投稿 - Qiita
dateコマンドでバックアップファイル作成時にファイル名に日付_時間を付ける (LinuxとWindows用) - Qiita
rsyncの使い方 | server-memo.net
windows環境の git で改行コードの自動変換に注意 - Qiita

「Spring3入門 Java フレームワーク・より良い設計とアーキテクチャ」を読了しました。

今から本書を手に取りたいと思ってらっしゃる方は、
改訂新版が出ているのでこっちがおすすめです↓↓
honto.jp


私が今回読了した本はこちら↓
honto.jp
今更Spring3と思うかもしれませんが、買った本は読了したいのが私。
所感を残しておきます。

- 本書のターゲット
本書は今までにJavaのWebアプリケーションのフレームワークに触れてきた人のほうが理解しやすい内容になっています。フレームワークに触れてこなかった人が読んだら当たり前のように出てくる用語につまづくかもしれません。

- 250ページまでは確実に理解しておくべき内容
250ページまではSpringおよびSpring MVCの入門編になっています。
ここまでの内容はSpringで開発をする上で最低限必要となるベースの知識のため
Springを使って開発をしている方は理解することをオススメします。

特にコントローラーとビジネスロジックを分離し依存しない凹型モデルを作りアプリケーションの修正の容易さを確保することや、
システムのライフサイクルを意識したクラス構成にするという考え方は理解しておくと確実に為になる内容だと思います。

- 251ページ以降はさらっと目を通すだけでもよい内容
251ページ目以降は、Spring Web Flowの入門やStrutsとSpringの連携、
そしてデータベースアクセスのための各種ミドルウェアとSpringの連携が主な内容です。
全部読みましたが、他のフレームワークと連携する機会ってそこまであるのかなぁと疑問に感じました。
それならSpringで作り直せばいいんじゃないかと。
Spring MVCは柔軟にできているので、Strutsからの乗り換えも
ハードルが高いわけではないと思えるので。

また、Spring Web Flowも便利っちゃ便利なのですが、
主要なSpring MVCを覚えておけば基本的には大丈夫なので、
認証回りのSpring Securityとか、バッチ処理のSpring Batchとかの解説が欲しかった。
→新改訂版には盛り込まれているようです。

データベースアクセス・ミドルウェアとSpringの連携はとても参考になりました。これはミドルウェアの選定時に、蓄えた知識が発揮できると思います。
251ページ目以降は目を通すだけでもよいと書きましたが、
親切なことに、本書は連携するフレームワークミドルウェアの概要まで
しっかり解説してくれています。なので、知らなかったフレームワーク
仕様を知る機会にはなります。(Struts2とか使ったことなかった。)

本書に書かれているフレームワークミドルウェアなどを使用する機会が出来た時に、内容をもう一度振り返ることができる良書だと言えます。


Spring Frameworkの学習を始めたいのでしたら、
こちらの書籍も評判が良いので、おすすめです。
honto.jp

読みたい本はたくさんあるので、次の本いくぞーw

Spring Day 2016 行ってきた!マイクロサービスの導入事例に触れた刺激的な一日。

行ってきました、Spring Day 2016・・・そう、それは座席とトイレ確保の戦い
springday2016.springframework.jp
Springの大規模なイベントは、日本では2回目らしい。
前回はSpring Summerというイベントだったようです。
運営は日本Springユーザ会が行っており、勉強会の発表者なども
募集しているようですので、気になる方は門戸を叩いてみてはいかがでしょうか。

今回のイベントは400人以上が参加しました。
そこまで大きな会場ではないので、人口密度がとても高く立ち見もあるほど!
セッションとセッションの間の休憩は座席確保を迫られ、
トイレには待ち行列ができるほど!さすがSpringの祭典!?
41階のセミナールームから見る眺望はとてもよかったです!
f:id:yasay:20161118205558j:plain

下記のセッションを見てきました。
10:00 ~ 11:00 Spring Framework 5.0
11:00 ~ 12:00 事例で知る!大規模エンタープライズ開発現場のリアル
13:00 ~ 14:00 Spring Securityで作るWeb APIアクセス制御の最適解
14:00 ~ 15:00 LINEにおけるSpring Frameworkの活用
15:00 ~ 16:00 楽天トラベルとSpring
16:00 ~ 17:00 40Tips & Tricks for Spring in IntelliJ IDEA
17:00 ~ 18:00 Springで実現するSmartNewsのニュース配信基盤

では、セッションの内容をメモ書き程度の内容ですが振り返ります。↓↓

- Spring Framework 5.0
f:id:yasay:20161118123136j:plain
本セッションでは、Spring Framework5.0の新機能の紹介と、
リアクティブプログラミングに関するライブラリの紹介などがありました。
ベルギーの著名なSpringのコミッター、ステファン・ニコルさんの講演

■Spring 4.3
リリースまでに9ヶ月の間隔があったが、
これからはもっとリリース間隔を短くしたいと思っている。

■Spring 5
5.0はJDK8+, Servlet 3.1+, JMS 2.0+, Junit5+をサポート
下記のような主要なフィーチャーがある。
Performance improvements,
JDK9,
Jigsaw modules,
HTTP/2 and Servlet 4.0,
Reactive architectures

■Spring 5 - パフォーマンスの改善
コンポーネントスキャンのパフォーマンス改善
→パフォーマンスメカニズムの改善。
 →クラスパススキャニングのためのアノテーションが新設された。
 →大規模アプリケーションの場合、インデックスを使えば迅速にコンポーネントスキャニングを完了させることができる。
メタデータのキャッシュ化
・AntPathMatcherの書き換え
・ゼロコピートランスファー
→ファイルの転送時にCPUを使わない転送方法。データの転送をクライアントに直接できる機能。

■Spring 5 - JDK9への対応について
JDKは来年の3月にリリース予定。Spring5のGAは来年7月を予定している。
・Jigsaw modulesの活用
・パッケージエクスポートとか
・HTTP/2への対応について
→JDK9によるHTTP2対応も。

■Spring 5 - リアクティブプログラミング
・なぜリアクティブプログラミングを使うべきなのか。
全てのアプリケーションはシンプルな構成となっていた。
マイクロサービスや分散システムのために生まれたリアクティブプログラミング。
リアクティブプログラミングはスピードのためではなく、拡張ができ、アプリケーションが複数のリクエストを受けている時に安定性を保つ為のもの。

スケールを拡張した場合、プロセスを増やす、スレッドを増やす、これでもっと大規模な処理ができる。
だが、それにも限界がある。メモリ量にも限界がある。
リアクティブはノンブロッキング、そしてCPUをできるだけ最大限に使うという考え方がある。

スライドが共有されています。↓
speakerdeck.com


ステファンさんによるYoutube動画紹介とか(過去のセッションとか)
Reactive Web Applications with Spring 5 by Rossen Stoyanchev - YouTube
Developing Reactive applications with Reactive Streams and Java 8 by Brian Clozel, Sébastien Deleuze - YouTube
http://start.spring.io/
などなど


- 事例で知る!大規模エンタープライズ開発現場のリアル
NRIの社員の方による、オフショアを活用した大規模システム開発の現場での
標準化活動のポイントです。

数百人での大規模開発での事例での標準化というのは難しいということが語られていました。
オフショア特有の文化については勉強になりました。育ったらやめていくから人を育てられないってのはキツいですね。
セッションの内容的には私が普段よく使っている機能の話でした。

■画面設計のOut of memory error
・画面設計はステークスホルダーが多い為、そういった人たちを巻き込んだ顧客調整による標準化が必要。
・セッション領域を気軽に利用出来ないルール・仕組みを策定することについてルール例の紹介
→ルールを定めても破られるため、セッションを扱う処理を自動検知し、検証できるような仕組みや覚悟が必要。
→セッション領域のデータを、必要の無くなったタイミングで削除する機能の実装。
→Springなら簡単に行う方法が用意されている。
@SessionAttributes, sessionStatus.setComplete();
自前で作ろうとすると結構大変なんだけど、用意されていて便利だよね。

■ヒストリーバック時の有効期限切れ画面問題
・no-cacheとPOSTリクエストによって、戻るボタンを押した時の有効期限切れ問題が発生。
→まず、戻るボタンによる操作を許可するのか、許可しないのかを決定する必要があり。(今時戻るボタン使えないとか・・)
→戻るボタンを使うのなら、RedirectおよびGETを用いて、有効期限問題を解消しよう。
→戻るボタンを許可しないのなら、ツールバーの非表示による抑止だったり、JavascriptのhistoryAPIを用いてブラウザにダミー履歴を入れるとか。
→Springなら、FlashAttributeとredirectを使えば、簡単に実装できる。
これも自作しようとすると面倒くさい。

■エラーハンドリング問題
・エラーハンドリングを塗りつぶしてしまう問題(なかなかありえないだが、大規模オフショア開発では起きることらしい)
→エラー・例外ハンドリングの標準化ルールの策定。ハンドリングの対応・レイヤーの明確化など。
→例外をエラーコードに変換するコードの実装も大事。
→Springでは、@ExceptionHandlerを使えば、簡単に実装できる。

■Controllerクラス分割問題
・修正処理を登録用コントローラークラスにメソッドが入っていて、画面との対応がわかりにくい。
→標準化として、クラス分割ルールの作成は大事。Springの@RequestMappingは非常に柔軟。だからこそルールの策定が必要。
→1jsp = 1Controllerクラス、1業務に対して1Controllerクラスなど

■グローバル開発
・オフショア開発の場合、同じ質問がなんども飛んでくる場合がある。(イライラする)
→ログやマニュアルのグローバル化とか。

早期の標準化ルールの作成・展開、
ステークスホルダーを巻き込んだ上でのルール策定
ルール遵守させる方法の確立。検知する仕組みや自動的にルールを守ってしまうような仕組みづくり。


- Spring Securityで作るWeb APIアクセス制御の最適解
最近は本当にどこを見てもWeb APIだらけで、私もWeb APIを開発したことがあります。
Spring Securityも使っているので、その最適解というはとても興味がありました。
クラスメソッドの社員の方が、最近使われている認証方式について解説してくれました。

スライドが共有されています。↓

www.slideshare.net





- LINEにおけるSpring Frameworkの活用
■LINEってアーキテクチャのうち、Javaが41%を占める
→正直意外でした。
リポジトリ数と言うと、spring framework, spring mvcで547件・・・
spring bootで285って、かなりの数ですね。

■Spring採用が多い理由
・開発のサイクルがJava EEに比べると速い。
Java EEはB2Cのスケールが必要なWebサービスでの事例をあまり聞かない。
・社内にJava EEの経験ある人が少ない

■時代はMicroservices
→小さなapplication serverの組み合わせでおおきなサービスを実現
→spring, guice, Vert.x, Dagger2, avans, etc
→groovy, scala, ...
golang, perl, python, ...

■なぜSpring-bootか
XML書かなくていい
・アプリケーションの開発がわりと簡単に開始できる
uber jarでお手軽にdeployできる
Javaのわりに起動が速い

■開発事例:LINE Notify
・Redis sentinelによる冗長構成(Cache, Rage limit)
→KVSは基本的にRedisが人気
 →柔軟性・パフォーマンス・安定性・楽しい
・nginx → jetty
ACL管理, rewrite, Access log

■jettyの特徴
・コード読みやすい
・起動速い
→開発時に便利
・undertowより開発者多い(undertowって?)

■Fluentd
アクセスログの集計
→http statusコードの統計監視
・イベントログ
→Fluencyが最近は優勢、社内のストレージに保存

ちなみに、LINEは全てオンプレミスらしい。AWSなどのIaasを使っていない。

■Spring Bootのバージョンは上げにくい。
→関連モジュールも一気にバージョン上がるので、上げていくならこまめに上げていったほうがいい。

■spring-boot-starter-web
・安定している
・@GetMapping, @PostMappingとか便利

■spring-boot-starter-freemarker
・社内ではthymeleafと人気を2分している。らしい。
・IDEAの補完がfreemarkerの方が便利という説もある?
Apache Incubator入り、自動エスケープも入った。

■spring-boot-starter-redis
■spring-boot-starter-mobile
・User-Agentで判定するのに便利

■mybatis-spring-boot-starter
・社内のO/R Mapperはmybatis優勢
JPAは少ない
→B2Cでトラフィック予測難しい
・パフォーマンス問題起きた時の、MyBatisの安心感
・MyBatisのXMLをアップするとDBAがクエリ評価してくれるサービスとかもあるらしい

■MyBatis + Kotlin
XML辛い
Javaアノテーションでも書けるけど辛い
→複数行文字列書けない→複雑なクエリがない。
・なおでKotlinを採用 → 学習コストが低くて導入しやすいのがいい。
・groovyでも良かった

■デプロイ手法
github → jenkins →デプロイ
(途中でjenkinsを通すことで、テストが通ったもののみ許可される仕組み)

■実行環境
java, nginx on supervisord(自動再起動)

■Prometheus
■Dropwizard metrics

スライドが共有されています。↓

www.slideshare.net





- 楽天トラベルとSpring
楽天トラベルのアーキテクチャの変化
APIの数が増えてきた
APIの生まれ変わりが激しくなってきた
→多くの問題が(より)顕在化しました。

■直面した課題と解決へのアプローチ
1. APIドキュメントを最新に維持するには
昔、他社のAPIの使い方を習得するのに時間がかかることがあった
 →Documentが嘘をついている・情報が足りない
 →Exampleの不足
 →開発中のプロダクトのドキュメントが無い
・ドキュメントの管理・維持は大変。
 →Spring REST Docsでいこう
  →APIドキュメンテーションがある程度簡単に出来ます。
・Swagger+Springfoxでもっと良いドキュメントを作るのもあり。

2. シンプルにセッションを管理するために
・Sticky Sessions
→サーバーが落ちたら再ログイン。バランサーの設定だけですむ。HAではない。
・Session replication
→サーバーが落ちてもセッションを維持。HAである。設定・実装はASに依存する。
・Session clustering(Spring Session)
→Session Data store clustorを使用する仕組み。HAであり、AS問わず利用可能。必要なdependenyが増える?
・Spring Session
Servlet Filterで標準のHttpSessionをwrapする
 Spring Boot 1.4からAuto Configがある。
 楽天トラベルでは、Hazelcastをデータストアとして使用。
 Spring SecurityでCSRFトークンチェックもしている。

3. Microservice化する中でログの追跡をするには
・問い合わせが来た時のログ調査は手間がかかりすぎる。
・MDCというログの機能を利用し、ユニークIDをログに追加
・Spring Cloud Sleuth
・Logstash, Kibana

4. 同じプロパティの値を複数のプロパティで管理したくない
・Spring Cloud Configが便利

5. メンバーに使って欲しいライブラリを使ってもらうには・もっと簡単にAPIを実装する為に
・Spring Initializrはカスタマイズできる。
→社内で共通で使っているライブラリなどを放り込んで、
Spring Bootで初期プロジェクト起動をすることが出来るんだよ。
→Webからだけでなく、IDEからでもカスタマイズしたInitializrを利用することが可能。

6. 新しくきた人にSpringを覚えてもらうには
・みんながSpringの経験があるわけではない。
チュートリアルドキュメントを使って、全員が共通した知識を持てるようにする!

スライドが共有されています↓

www.slideshare.net







- 40Tips & Tricks for Spring in IntelliJ IDEA
正直、eclipseばかり使用し続けて、IntelliJ IDEAに疎い私にとってはとても勉強になる内容だった。
ただ、ちょっとハードル高かったかな。


- Springで実現するSmartNewsのニュース配信基盤
f:id:yasay:20161118205646j:plain
スマートニュース配信基盤の紹介と、そこで利用されているSpringの技術について。
登壇者はニュース配信基盤や管理コンソールの担当している方。
■配信基盤の紹介
・毎日250万人以上のユーザーへニュースを配信している。
・5万件以上の記事を配信
・1日(朝、昼、夕、夜)の定時Push通知
SmartNewsのニュース配信基盤は全てAWSで構築している。
・記事の収集、分析、配信など、それぞれの基盤が連携している。
■配信基盤における、Springの活用
・前身はSeasar2による旧基盤だった。
・旧基盤は先進的な技術要素があったが、もちろん少々の問題もあった。
・スマートニュースの強みは機械学習機械学習のような非サーバーサイドエンジニアの開発を向上させたかった。
→これらの問題を改善するために、Spring Bootを導入。
 →サービスを分割することで、個々に集中出来る。
 →高い開発効率。SpringFox/SwaggerによるAPIの可視化。

スライドが共有されています。↓
speakerdeck.com



・その他セッションのスライド
アメブロの大規模システム刷新と それを支えるSpring
Spring bootで学ぶ初めてのwebアプリ開発
Let's visualize your Spring Cloud Applications! #jsug #springday - Speaker Deck
Spring Day 2016 springの現在過去未来
Springを何となく使ってる人が抑えるべきポイント


- 所感
マイクロサービスの導入事例に触れた、刺激的な一日でした。
システムのライフサイクルの関係上、既存システム保守・回収を担当している方にとっては、
マイクロサービスの流行がすぐそこに来ていることを実感できないかもしれません。
そんな時こそ、マイクロサービスの導入事例に触れ、
自分達が担当しているシステムにマイクロサービスを導入した場合、どうなるかを妄想して欲しいと思います。

ちなみに帰りに外国人に道を聞かれましたが、しっかり答えることができましたw
これも、普段英語の勉強を行っているから出た成果だと思います。(道を教えた程度ですがw)
ステファン・ニコルさんの英語も聞き取りやすくて分かりやすかったですね。

今回シェアしてもらった技術要素について、私は追い続けたいと思います。
特にSpring Bootをもっと使いこなせるようになりたいです。

昼飯はリクルートの社員食堂で500円!安くておいしいサイコー!白身魚お好み焼き風です!
f:id:yasay:20161118213726j:plain

おしまい

Windowsで「tail -f」コマンドを実現する方法4選

tailコマンドは重宝しますよねー。
なのに、何故かWindowsにはデフォルトで入ってなくて、
なんとかしてtailコマンドを使いたいと思う時は多いはずです。
開発してるとログをtailで垂れ流したいですよねー。
そこで、自分がよく使っているツールを紹介したいと思います。
(備忘も兼ねて。)

www.vector.co.jp
「tail -f」をWindowsで実現するためのフリーソフトです。
メリットとしては対象のファイルを開くだけで簡単にtailが実現できることです。
デメリットとしては、他に応用が効かないこと。tailコマンドを習得することはできないです。


tech.guitarrapc.com
Microsoft信者の方はこの方法でtailコマンドを再現できますが、
やはりデメリットとしてLinuxコマンドではないため、応用が効きにくいことが挙げられます。

  • git bashを使う オススメ!

git-for-windows.github.io

Git for Windowsをインストールすると、
MINGWによるbashを使うことができます。これがなかなかオススメです。
メリットとしては
・tailコマンドだけでなく、Linuxの基本コマンドを普段から使える。
・当然Git用のコンソールとしても使えるのでバリバリGitが使える。
などが挙げられます。後述するConEmuと併用することで、
快適なコンソール環境を実現することも可能です。


qiita.com

Windows10 Anniversary Updateから導入された
Bash on Ubuntu on Windowsを使うことで、
簡単にtailコマンドを導入することができます。
もちろんtailだけでなく、様々なLinux基本コマンドを使用することが可能です。
ただし、64bit edition限定ですので、古いPCを使っている場合に
導入できない場合があります。


  • 番外:Windowsのコンソールをもっと快適に使う「ConEmu」を導入する。

conemu.github.io
ConEmuはWindowsのコンソールをとても快適にするためのツールです。
インストールされているコンソールツールを自動で検索して、
ConEmuを通して起動できます。
左右分割、上下分割をはじめ、ウインドウの透過や配色の変更など、
様々なカスタマイズ項目があります。
個人的にはgit bashまたはBash on Ubuntu on Windowsと、ConEmuの併用を
オススメしたいですね。

もちろん、上記以外にもたくさんの方法があります。
自分好みの環境を整えるために、いろいろ探し回ってみてください♪