Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2019年12月6日

kakuda.takumi

JJUG CCC 2019 Fallに参加&登壇してきました!!

こんにちは。ピクトリンク事業部の角田です。
2019年11月23日(土)に開催されましたJavaのカンファレンスであるJJUG CCC 2019 Fallに参加&登壇してきましたので報告させていただきます。
弊社はこちらのカンファレンスのゴールドスポンサーをさせていただき、スポンサーセッションという枠で登壇もさせていただいておりました。

JJUG CCCとは?

公式サイトより引用

JJUG CCCは毎年2回、春と秋に開催する日本最大のJavaコミュニティイベントです。
Java関連の技術や事例に関する良質なセッションが行われ、また異なる分野で活躍するJava技術者が一堂に会する場ともなっています。

Javaのリリースサイクルの変更に伴い、JJUG CCCの開催も半年に1回となりました。
日本の方々だけではなく、海外の著名な方々も多数参加されているということもあり、日本のJavaのイベントでは最大級のものとなっております。

 

会場の様子

iOS の画像 (3)

IMG_20191123_142305213

私にとって4度目の参加となるJJUG CCC。毎回セッションにテーマがあるように感じており、今回はサーバレス時代におけるJavaについて語られているセッションが多かった印象でした。以下が私が聴講してきたセッションのまとめとなります。

 

Coding That Sparks Joy with Quarkus (Edson Yanaga)

JavaチャンピオンであるEdson Yanagaさんの発表でした。Javaの有名なフレームワークというとSpring Frameworkが思いつく方が多いかもしれませんが、最近は様々な他の選択肢が出てきました。今回はその内の1つであるQuarkusについての話でした。
今までJavaは起動速度やメモリ使用量に対してそこまで意識しなくてもよい世界にいました。しかしながら、サーバレス時代になってきた今、そうもいかなくなってきました。
オートスケーリングさせるために出来るだけ起動速度を早くしなければならなく、現状Spring Bootなどの全部入りのフレームワークでは厳しいところもあります。
そういった時代にJavaもついていくためにもQuarkusのようなフレームワークが誕生しました。
Quarkusはアプリケーションの起動速度を削減しただけではなく、メモリ使用量の削減、また小さなサイズのコンテナイメージを作成することができます。
Edsonさんの発表ではQuarkusの凄さをライブコーディングで伝えてました。
私自身Quarkusに関する知識不足でQuarkusの凄さの全容を知ることができませんでしたが、とても使ってみたいという気持ちになりました!

 

Javaで学ぶオブジェクト指向プログラミングの基礎知識 (増田 亨)

「現場で役立つシステム設計の原則」の著者である増田亨さんによる発表でした。聴講の対象者としては、オブジェクト指向プログラミング初心者とのことでしたが、
増田さんの発表は毎回得るものが多く、改めてオブジェクト指向プログラミングというものを考えてみようということで聴講させていただきました。
今回のキーワードは「型」、「カプセル化」でした。それぞれのキーワードについてとても丁寧に説明されており、
自身が普段心がけていたことが間違っていなかったと再確認することができました。
オブジェクト指向プログラミングには2つのモード(モード1とモード2)があります。モード1はJava標準の型だけ使い、モード2は独自の型を自身で定義するものとのことです。
増田さんは本当のオブジェクト指向プログラミングの旨味はモード2にあり、型の消費者ではなく型の生産者になることが重要とおっしゃってました。
この言葉を忘れず日々努力していきたいと感じました。

 

開け!ドメイン駆動設計の扉(成瀬 允宣)

GMOインターネットの成瀬允宣さんの発表でした。私自身、今年の春のCCCの時に成瀬さんのドメイン駆動設計のお話を聴かせていただいてとてもわかりやすかったため、今回はドメイン駆動設計を周りの人に知ってもらうためにこちらの発表を聴かせていただきました。
今回の内容は、ドメイン駆動設計に興味はあるけど、Eric Evans氏の書籍に手を出すのは、、、という方向けの発表でした。
私自身も同じような感じで興味があったけど、なかなかあの厚さの書籍に手を出せなかった時期もあったので、こういった発表は初学者にとっては後押しとなり嬉しいと感じました。
最近になってドメイン駆動設計が流行りだした理由としては、10年ほど前にドメイン駆動設計にトライしたプロジェクトが今になって変更に耐えうるものになってきて、それが注目されだしたかららしいです。
話の内容としてはこの前に聞いた増田さんの「Javaで学ぶオブジェクト指向プログラミングの基礎知識」と結構かぶるところもあり、オブジェクト指向プログラングをしっかりしていれば対応できるようなところもあるように感じました。
ドメイン駆動設計において一番大事なことはドメインエキスパートとの会話がとても大切で、当たり前のことを当たり前にやることであるらしいです。確かに当たり前のことを当たり前にやること自体が1番難しいことなのだとこの発表を聴いて知らされました。

 

長く続くサービスがモダンであり続けるためには(角田 拓己)

こちらは私が発表させていただいたものになります。初めての発表でありながら200名近くの方々に聴いていただきとても楽しかったです。
発表内容としては、長く続くサービスのモダンさを維持するためのメソッドを紹介していきました。
普段私が感じていることなど色々こちらのスライドに込めていますので、皆さんも何か感じるところがあればうれしいかぎりです!!

 

Javaの起動速度といかに戦うか(きしだ なおき)

 LINE Fukuokaのきしださんによる発表でした。最初の方にも少し述べていますが、Javaの起動速度をいかにして短縮させるかについての話でした。
新規で作成するようなアプリケーションや、マイクロサービスのような単機能のものでよければQuarkusやMicronautのようなフレームワークを利用することで解決できるかもしれませんが、
既存のアプリケーションに対して起動速度をあげようとした場合、このようなフレームワークの置き換えは気軽にできるものではないと思います。そのような場合、今回はなされた内容が適用できるかもしれません。
スライドにも記載されてますが、そもそもJDKを8から13に単純に置き換えるだけでも約100msほど早くなっているようです。これはJava12からDefault CDS(Class Data Sharing)でCDSが効いていることが要因らしいです。また他に起動速度を早くする手段として今回のCCCで私が聴いたセッションの半分以上で出てきたGraalVMによるNative Imageの作成です。Native Imageにすることで起動速度は大幅に短縮できるそうですが、スループットは逆に悪くなるそうなので、この辺はどのような環境で使うかによって考えた方が良さそうです。
きしださんの発表は過去のCCCや勉強会で聴かせていただいたこともあり、今回も僕のような初心者でもわかりやすく解説してくださってました。

Serverless時代のJavaについて(下川 賢介)

Amazon Web Servicesの下川さんによる発表でした。こちらもサーバレス環境におけるJavaの最適化についての話で、特にAWS Lambdaに着目したお話でした。
今までと同じようにAWS LambdaでもSpring Bootのjarを載せようとするとコールドスタート問題が発生してしまうとのこと。出来るだけフレームワークを利用せず、
プレーンJavaでLambdaの関数を定義するのがベストらしいです。とはいえ、フレームワークの恩恵を受けて実装したいときは、最初から全部入りのフレームワークを利用するのではなく、
最小構成に単機能のライブラリを追加していくことで多少コールドスタート問題は解決するらしいです。とはいえやはりSpring Bootに慣れてるためSpring Bootを使いたいという時に
aws-serverless-java-containerというものが用意されているそうです。このようにサーバレス時代になり、今まで考えてこなかった部分(Javaの起動速度など)も考えていかないといけなくなったため、このようなベストプラクティス的な発表はとてもありがたかったです。

 

JVMs in Containers: Best Practices(David Delabassee)

OracleのDavid Delabasseeさんによる発表でした。こちらはコンテナ環境におけるJVMのベストプラクティスのお話でした。
様々な視点からベストプラクティスを話されていました。
例えば、コンテナイメージのサイズを下げるためにJDKをそのまま利用するのではなく、JDK9から入っているjlinkを使ってカスタムランタイムイメージを作成することでサイズを小さくできるそうです。アプリケーションの起動速度に関しては他の方の発表でもありましたが、JDK13を利用するだけでdefaultでCDS(Class Data Sharing)が利用されているため、JDK8に比べて早くなります。このようにコンテナの最適化するにはDockerイメージを出来るだけ小さくすることと、アプリケーション自体の起動速度を早くすることが求められるとのこと。
またDavidさん曰くJDK8はコンテナに最適化されていないため、新しいものを使うことをオススメするとのことでした。
私自身コンテナ周りの知識があまりなかったですが、これから勉強しようとしていたのでとても勉強になりました。

 

懇親会の様子

iOS の画像 (4)

CCCの懇親会といえば毎回恒例となっているLINE寿司です!!
とても美味しかったです!!いつもありがとうございます!!!
今回は登壇したこともあり、ありがたいことにたくさんの方々とお話しさせていただきました。

 

まとめ

最初にも述べていますが、今回はサーバレス時代におけるJavaについて語られていたセッションがとても多いイメージでした。
そのほかにもたくさん面白いセッションがありましたので、こちらからご覧になってみてください!!


2019年06月27日

kakuda.takumi

JJUG CCC 2019 Spring 参加報告会(非公式)を開催しました!

こんにちは。ピクトリンク事業部の角田です。

前回に引き続き、フリュー主催の勉強会を開催しましたのでご報告します。

前回のレポートはこちらから

京都Devかふぇ#6 〜JJUG CCC 2019 Spring 参加報告会(非公式)〜

今回は合計で約10名の方々にご参加頂きました!

今回は5/18(土)に開催されたJJUG CCC 2019 Springの参加報告会と題しまして勉強会を開催いたしました。

勉強会の様子

トップバッターは弊社の@masaozi3が「1400万ユーザーのWebサービスを 15年運用して考える、
Javaである理由」という題で発表しました。

今回のJJUG CCCにて弊社のサービスであるピクトリンクがJavaである理由について発表したものの再演を行いました。

IMG_0812

 

2番手は@mdstoy 様による「もう参照渡しとは言わせない」です。
こちらは2018年冬のJJUG CCCにて発表された内容の再演でした。
Javaが参照渡しではないということを主張しつつ、Javaの評価戦略について詳しくお話しいただきました。

自分自身、この辺りの話はわかっていない部分が多かったので、とても勉強になりました。

IMG_20190607_193237162

3番手はお恥ずかしながら私@chan_kakuzが「JJGU CCC 2019 Springまとめ~Java歴1年なりの意見を添えて~」という題で発表いたしました。

私自身は、今回のJJUG CCCは登壇はしておらず、聴講のみでの参加でした。

今回の勉強会では、聴講者としての目線で今回のJJUG CCCはどんな感じであったかなどをお話しさせていただきました。

IMG_0814

 

4番手は@kis 様による「最近のJava Webフレームワーク / Java Web Framework ccc 2019 spr」です。
こちらの内容は今回のJJUG CCC内で行われたアンカンファレンスの再演となりました。
最近のJavaのWebフレームワークについて最近の事情を踏まえつつ紹介されていました。

個人的には、紹介されていてたフレームワークの中では一番Springに似ていたMicronautがとても使いやすそうで気になりました!!

IMG_0815

まとめ

今回は京都Devかふぇ史上初となるJavaをテーマにした勉強会を開催してみました。

Java界隈で著名な方々をご招待させていただいて、発表の時ももちろんですが、懇親会でも非常に盛り上がりました。

今後もサーバサイドについての勉強会を開催しますので、参加お待ちしております!!


2019年02月15日

furusin

GDG京都様と共催でミートアップを開催しました!

こんにちは。ピクトリンク事業部の古川です。

先日のブログで、GDG京都(Google Developers Groups)様との共催でGDG ミートアップ in 京都を開催することを宣言しておりましたが、ついに実現しましたのでご報告致します!

 

GDG ミートアップ in 京都

今回も合計で30名以上の方にご参加頂きました!

特色としては、海外からGDE(Google Developer Experts)が2名参加されることもあり、セッションのほとんどが英語となりました!

GDEの2名以外にもGDG NZ(ニュージーランド)の方も来られており、とても国色豊かなイベントとなりました。

GDG NZの方とGDEのうちの1名は、直前に東京で開催されていた日本最大級のAndroidイベント「DroidKaigi」にも参加されていたそうです。

(ちなみに私も参加していました。弊社はDroidKaigiのスポンサーでもあります!)

 

GDEであるEnrique Lopez Mañas さんの発表「 Kotlin/Native for Multiplatform development」

IMG_20190210_135625

 

GDEであるiñaki Villar さんの発表「 Diving in the WorkManager API」

IMG_20190210_142212991

英語のセッションということもあり、皆さんいつも以上に真剣に(必死に?)話を聞かれているなぁ、というのが印象的でした!

また、GDG京都のメンバーの兼高さんも英語で発表してくださりました!

IMG_20190210_153921186

Pin-point rebuildable and non-rebuild custom widget from cch-robo

僭越ながら、私も発表させて頂きました!

IMG_20190210_160011292

Build your first wear app from furusin

 

本来は私の発表が最後の予定だったのですが、懇親会のケータリングが届くまで時間が余ってしまいましたので、GDG四国、GDG京都のメンバーより発表を頂きました!

IMG_20190210_163719

 

MVIMG_20190210_164002

 

懇親会の様子

hoge

今回はたくさんの方が懇親会に関するツイートをあげてくださりました!嬉しい!

 

最後に

私たち京都Devかふぇとしては、イベントの共催は初の試みとなりました。

初の共催だし、英語ばっかりだしどうなることやら……と不安はありましたが、参加者の皆様にはとても楽しんで頂けたようで、

運営一同嬉しく思っております!

 

今後は色々なコミュニティと共催等を進め、技術コミュニティの活性化や発展により一層貢献したいと考えています。

ご参加頂いた皆様、ありがとうございました!


2017年07月24日

Spring Securityを使ったAjax通信について

こんにちは。フリューのジョンです。

最近はVue.jsがあればテンプレートエンジンなんていらないと思いながらThymeleafを触っています。

さて、今回はSpring Securityを使ったAjax通信についてハマったのでそれの解消方法について書かせていただきます。

具体的には、Spring Securityの機能の一つである、クロスサイトスクリプティング防止機能でハマりました。

クロスサイトスクリプティングの説明については、今回省きます。他サイトを参照してください。

概要

環境は以下のとおりです。

spring-boot 1.5.3.RELEASE
spring-boot-starter-security 1.5.3.RELEASE
Thymeleaf 3.0.6.RELEASE

結論から言えば、Spring Securityを導入すると、単純なPOSTアクセスをすることができなくなります。
理由としては、認可した場所からのリクエストであることを検証するためにトークンが必要になるためです。その為、これを解消するには以下の方法があります。

  • Formにトークンを付ける。
  • Cookieにトークンをつけて、リクエストヘッダにトークンをつけて送信する。
  • GETで対処する  ← ダメゼッタイ、ユルサナイ

上手くいかない例

まずうまくいかない、例を見てみましょう。

この状態でボタンを叩くと以下のような画面になります。

spring-security-postが上手くいかない例

Formにトークンを付ける

これはSpring Security+Thymeleafを導入すると簡単に対応できます。

具体的にはFormのaction属性をThymeleafのものにします。

Formタグを見てみると自動でinput[type=’hidden’]が追加されているのがわかると思います。

spring-security-form送信(上手くいく例

Ajaxにする場合、このinput[name=’_csrf’]の値をJavaScriptで取得すれば良いのです。しかし、この方法はFormタグがなければ成り立ちません。

FormがないAjaxのpost通信をするためには、以下の方法があります。

Cookieにトークンをつけて、リクエストヘッダにトークンをつけて送信する

Spring Securityでは、Cookieにトークンをつけることができます。そのためには、CookieCsrfTokenRepositoryを使用します。

withHttpOnlyFalseとしているのは、HTTPでもCookieにトークンをつけてもらうためです(デフォルトはHTTPSだけにしかCookieは付いてきません)。リクエストを見てみると、以下のようにXSRF-TOKENという名前のCookieがついているのがわかります。

spring-security-cookieが付いている

このCookieの値をJavaScriptで読み込み、リクエストヘッダにX-XSRF-TOKENをつけます。

これによりAjax通信が可能になります。しかし、いちいちCookieをとってリクエストヘッダに渡すのは面倒ですね。

Axiosというライブラリではそれを解消してくれます。内部でcookie()を見て、リクエストヘッダに追加してくれているのです。

非常に便利ですね。

Cookieの名前、ヘッダの名前は、デフォルトの値ですので、変更可能です。もちろんAxiosの方も変更が可能です。

AxiosのFormData通信

ちょっと話が変わりますが、Spring SecurityでのAjaxのlogin機能を実装しようとした時、すこし、ハマりましたので追記します。

Axiosで通信するとデフォルトはJsonでの通信になります。しかし、loginには、FormDataでパラメータを渡さなければいけません。

実装方法としては、以下のようにAxiosのpostメソッドの第3パラメータに変換メソッドを追加してあげます。

まとめ

Spring Securityを使ったajax通信は少しだけ工夫が必要です。
しかし、その設定は本当に少しだけです。
ここではSpring Securityの機能自体について触れませんでしたが、Spring Securityは本当に素晴らしいので、ぜひ使ってみてください。

そして、Ajax通信だけのために、jQueryを使うのは止めましょう。Axiosを使ってみましょう。(個人の感想です)

最後に

弊社は、Springを実践利用してバリバリコード書きたいエンジニア募集中です!

詳しくはこちら


2017年07月24日

Doma2を使った複数データベースアクセス

こんにちは。フリューのジョンです。

個人的意見ではありますがSpring Data JPAのほうが好きですが、今回はDoma2を使った複数データベースアクセスを実装して躓いたので書かせていただきたいと思います。

概要

環境としましては以下のようになります。

spring-boot 1.5.3.RELEASE
doma-spring-boot-starter 1.1.0
spring-boot-starter-aop 1.5.4.RELEASE

複数のデータベースアクセスの具体的な要件は以下になります。

  • データベースアクセスをするメソッドに対して、アノテーションを付けてアクセス先を切り替える
  • アノテーションを付けていない場合はデフォルトのデータベースにアクセスする
  • 接続先はDomaの基本に合わせて、DataSourceの切り替えをしたい

以上の要件を満たすために、AbstractRoutingDataSourceとAnnotation、ThreadLocalを利用しました。

実装については、Qiitaの「Spring Bootで複数データベースを扱うウェブアプリケーションのサンプル」の記事を参考にさせていただきました。

実装

Daoには実装は加えません。

肝になるのは、AbstractRoutingDataSourceです。AbstractRoutingDataSourceはSpringのJDBCパッケージの中にあります。
このクラスを実装したモノを、Domaのconfigを継承したConfigrationクラスが返却することで対応が可能です。

ここで、AppConfigはルートである必要があります。(もしかすると、そうでなくてもいける方法があるのかもしれませんが、私が調べた限り出来ませんでした……)

接続先を保存するためにstaticでデータを作っておきます。ThreadLocalですので取扱には注意です。

メソッドに必要なアノテーションは以下のように設定します

アノテーションの実装は以下になります。
アノテーションがあるメソッドが動く前に接続先をHolderにセットして、動作した後に開放しています。

接続先はenumで持つようにします。

ここまでで実装終わりです。

使い方

以下のようになります。

まとめ

今回はアノテーションを使った振り分け方を行いましたが、リクエストパラメータやCookieを使って振り分けるというのも良いかと思います。

Doma2がConfigを勝手に参照してくれるのは、とても楽ですね。設定だけでうまくいきました。

最後に

弊社は、Springを実践利用してバリバリコード書きたいエンジニア募集中です!

詳しくはこちら