Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

どこでもKotlin #3でKotlin x SendGridのLTしました~ #m3kt

前回初参加した「どこでもKotlin #2」が楽しかったので#3も参加させていただきました!しかもLT発表枠で参加!

m3-engineer.connpass.com

#2の様子は主催のM3さんが書かれてるTech Blogレポートをどうぞ。

www.m3tech.blog

LT申し込みの動機

少し前にちょうどSendGridをKotlinから使うネタを会社ブログで書きまして

sendgrid.kke.co.jp

せっかくなので話をしたいなーと。Kotlin盛り上がってますし、サーバサイドKotlinだとAPIによるメール送信の需要もあるかなーと。

LTスライドはこちらです。

一番ウケたのが自己紹介の堀北真希さんファンクラブ(元)会員番号11という部分でした(^^;;;後半で笑いどころを設けるべきだった…とちょっと反省。

メール送信ってわりと地味なのでLT発表は中々難しい(^^;もっと技術面でインパクト出したいところですが、今回は真面目にKotlinからの使い方について話しました。

Kotlin Webアプリケーション

前回の「どこでもKotlin #2」はアンケート回答による(だったかな確か…)書籍プレゼントの抽選がありました。

Kotlin Webアプリケーションこと、通称「黒ベコ本」!

で、こちらの抽選になんと!当たってしまいました(>_<)!ちょうど自分で買おうとしてた所だったのでメッチャ嬉しい!

f:id:kikutaro777:20171023233019j:plain

著者のたろーさんにサインいただきました!わーい!

f:id:kikutaro777:20171023233041j:plain

他の方のLT

LT、どれも面白くて、幅も広かったです。

最初のLTネタだったDeeplearning4jは今回LTを聞いて初めて知りました。

deeplearning4j.org

Skymind社さんが提供してるとのことですが、なんと!イベントにSkymind社CTOの方がいらっしゃってました。
オライリーから出した書籍プレゼントのじゃんけん大会が急遽開かれましたw

skymind.ai

私の前に発表された方は自己紹介をKotlinで書かれててシビれた!!Speaker.ktってw

Android Things知らなったです。あとGCPのCloud Functionsがあることも知らなかったなぁ。。。

あとQuery DSLの話もあって、まさかKotlin勉強会で聞くとは!

サイバーエージェントさんのJavaからKotlin導入話も面白かったです。Scala、Go、Kotlinの選択肢から実際に勉強会で皆で簡単なWebシステム作って比較ってのいいですね。以下表は後付けらしいですがw

以下のブログとも関連あり。

developers.cyberagent.co.jp

LTで最後に「導入がゴールではない」とおっしゃられてて刺さりました。

次回もLT大会らしいので楽しみです(^^)

Java SE 9/EE 8リリースイベント 兼 JavaOne 2017 報告会 @ 東京へ参加しました! #jjug #j1jp

今日は毎年のお楽しみ「JavaOne報告会」に参加してきました(^^)

jjug.doorkeeper.jp

今回はJava SE 9とJava EE 8のリリース記念も兼ねたイベント名ですね。

会場は青山の日本オラクルさん…ではなくYahoo!Japanさんでした!私は丸ノ内線で赤坂見附から行ったのですが、事前に教えていただいた以下動画のおかげでサクサクと迷わず到着できましたw ありがたや。

JavaOneに関しては毎年、「ITProの最新Java情報局」でレポートが出てますが、今年も1本目が既に出ています。私は事前にしっかり読んで参加しました!(最後の「黒歴史」が気になってCommunity Keynoteの動画もw

itpro.nikkeibp.co.jp

なお、報告会のツイートは@yamadamnさんがまとめてくださってます。いつもありがとうございます!

togetter.com

追記:はやくも動画が公開されてます!
youtu.be

JavaOne 2017 Overview & Announcements 伊藤 敬さん (日本オラクル)

今年のJavaOne Keynoteの概要やJDKのリリースに関するお話でした。Javaが目指す所としてOpen, Evolving, Nimble, Scalableというキーワードが紹介されました。Nimbleって知らない単語でしたが、素早く・迅速にという意味なんですね。で、JDKのリリースサイクルもはやくするという方向に。Java EEも同様で、EE4Jへの移管もそういう流れの1つなんですね。

今後はOpenJDKとOracle JDKの技術的な差がなくなる方向へ進み、6カ月ごとにリリース、無償サポートは後継リリースまでなど中々アグレッシブな感じです。最後のまとめのスライドがわかりやすかったです。

ちなみにKeynoteの内容は以下からもみれるので要チェック。

On Demand | JavaOne 2017

このサイクルやサポートについて会社で報告したら色々騒ぐ人もいそう(^^;とか思ったり。

JDK9, Release Cadence & Future by 久保田 祐史さん (inc. JShell Demo by @bitter_fox) (@sugarlife)

続けて久保田さんからJDK 9のお話。スライド既にあがってます。

www.slideshare.net

モジュール化に関してデモされたコードも。

github.com

Jigsawによるモジュール化、個人的には仕事で設計しだすと大変そうだなぁ…とちょっと思ったり。

Project Amberによる改善は色々楽しみ!

昨日以下ツイート自分でしましたが

買ってしっかり勉強しましょう!

WEB+DB PRESS Vol.101
WEB+DB PRESS Vol.101
posted with amazlet at 17.10.21
森本 利博 武井 優己 SPY 久保田 祐史 大倉 香織 石川 雅之 袴田 類 山下 和彦 牧 大輔 穴井 宏幸 加藤 隆一郎 加藤 佑典 金 昌熙 佐藤 健太 のざき ひろふみ うらがみ 久田 真寛 ひげぽん 池田 拓司 はまちや2 竹原 牟田 裕太郎 粕谷 大輔 陶山 嶺 長谷川 智希 石田 和太郎 小林 純一
技術評論社
売り上げランキング: 819

JShellに関しては吉田さん(@bitter_foxさん)から簡単な紹介とデモがありました。

WebでJShell試せるtryjshellなんてあったんですね!これは便利。

tryjshell.org

きつねさんが良い感じにデモするから、というのもありますが、やっぱりJShellはデモ映えしますねー。きつねさんはこのあとIntelのPersistent Memoryについてお話されました。全然知らなかった(^^;

Java EE 8 by 西川 彰広さん (日本オラクル)

最近色んな勉強会でお会いする@OraBlogs_jpさんからJava EE 8に関するお話でした。個人的には一番聞きたかったセッション。聞きたかったのはJava EE 8の新機能とかの話というよりEE4Jのことでした。

西川さんが強調されてましたが、Java EEというブランド名は(現時点では)変わってなくて、Eclipse Foundationへ移管するプロジェクトの名前がEE4Jなので注意が必要です。一部メディアでもJava EEがなくなってEE4Jになった、というのが出てたりしてましたので間違えやすいです(以下publickeyなどは素早く修正されてましたが

www.publickey1.jp

話を聞いて、Java EEがもっと素早いサイクルで進化することというのはいいなと思いつつ、やはりまだまだEE4Jはこれから、というか、具体的にどうなっていくのか見えない不安もあるなぁと個人的には思いました。というかSpringがあるので、進化の速さとかを競いだすと厳しい気が…。しばらく注目です。

西川さんのあと、Yahoo!Japanの森下さんからマイクロサービスに関するセッションなどのお話がありました。

Fn Project by 伊藤 智博さん(@chiroito)

こちらも楽しみにしていたサーバレスのお話。会場でAWS LambdaやAzure Functions使ってる人が思った以上に少なくてびっくり。コミュニティとかによって差があるのかな。。来月Serverlessconf Tokyo 2017とかありますし、かなり盛り上がってる感じがします。

サーバレスでは個人的にApache OpenWhiskが気になってたのですが、Fn Project触ってみたくなりました。

openwhisk.incubator.apache.org

github.com

時間ちょっと短めでしたが、伊藤さんがブログ書かれてるので興味ある方は要チェック。

chiroito.hatenablog.jp

chiroito.hatenablog.jp

Community&総括 by 横田 紋奈さん(株式会社FOLIO) (@ihcomega)

最後はよこなさんからJavaOne初参加で初登壇もされたお話でした。

すごいなぁと感動。何事も挑戦してみることの大切さを改めて強く感じました。ホントすごい。

JavaOne参加しない理由なくない?っていうのも、ぐうの音もでないですね(^^;

じゃんけん大会

セッション後はJavaOneグッズをもらえる恒例のじゃんけん大会!例年懇親会でやってた気がしますが、確かにこのタイミングがベストですね。

運よく勝って以下のエコバッグみたいなのもらいました(^^)わーい!

f:id:kikutaro777:20171021233825j:plain

懇親会

懇親会はLTから。

どれも良かったのですが、Project Coinsが秀逸すぎました。自分もアメリカ行くといつも小銭余らせてしまうので、のっけからツボりましたw

そして最後の締めは大山さん、櫻庭さんによるフォトセッション!!!

このフォトセッション個人的にホント好きで、緩い感じなんですが、現地でのイベントの様子が(視覚的な意味でセッション以上に)一番よく知れるし、世界のJavaコミュニティの有名人を写真付きで知れたり、サンフランシスコの情報を知れたり、おいしいご飯やスイーツを知れたり、とにかく楽しいw 最初に参加したときから、JavaOne報告会の醍醐味だと思ってます。

そして写真をみてると行きたくなる(^^;;

自分がJavaOne報告会に初参加したのは2012年

kikutaro777.hatenablog.com

で、翌年2013年にJavaOneに参加したのですが、よこなさんと同じ感想で良かったことしかなかったです。

kikutaro777.hatenablog.com

このときは全日参加できなかったので、いつかフル参加したい>_<;

楽しいイベント、ありがとうございました!セッション発表された皆さんや会場スタッフの方々に感謝です。

参加された方のブログ

d.hatena.ne.jp

suzaku-tec.hatenadiary.jp

Simple Java Mailの主な機能について

昨日書いたSimple Java Mailライブラリの続きです。

kikutaro777.hatenablog.com
f:id:kikutaro777:20170829233253p:plain

昨日のサンプルではビルダーパターンを使いました。

Email email = new EmailBuilder()
    .from("kikutaro_from", "kikutaro_from@example.com")
    .to("kikutaro_to", "kikutaro_to@example.com")
    .subject("サブジェクトだよ")
    .text("マルチパートのテキストだよ")
    .textHTML("<b>マルチパートのHTMLだよ</b>")
    .build();
new Mailer("smtp.sendgrid.net", 587, "****id****", "****pass****").sendMail(email);

もちろん普通に書くこともできます。

Email email = new Email();
email.setFromAddress("kikutaro_from", "kikutaro_from@example.com");
email.addToRecipients("kikutaro_to", "kikutaro_to@example.com");
email.setSubject("サブジェクトだよ");
email.setText("マルチパートのテキストだよ");
email.setTextHTML("<b>マルチパートのHTMLだよ</b>");
new Mailer("smtp.sendgrid.net", 587, "****id****", "****pass****").sendMail(email);

その他、色々紹介していきます。

Recipient

上記のコード例では、宛先を表示名とメールアドレスで表現していますが、これをまとめてRecipientクラスで定義することが可能です。
RecipientTypeは(当たり前ですが)TOとCCとBCCの3つです。

Recipient maiyan = new Recipient("白石麻衣", "kikutaro526@yahoo.co.jp", Message.RecipientType.TO);
Recipient nachan = new Recipient("西野七瀬", "kikutaro526@yahoo.co.jp", Message.RecipientType.CC);
Recipient waka = new Recipient("若月佑美", "kikutaro526@yahoo.co.jp", Message.RecipientType.BCC);

引数は可変長のものがあるので、Recipientを一気に渡せます。

Email email = new Email();
email.addRecipients(maiyan,nachan,waka);

宛先をまとめて指定

宛先のメールアドレスをカンマ区切り並べた文字列をそのまま渡せます。
ccやbccでも同じように指定可能です。

String recipientNogizaka = "shiraishi_mai@example.com,nishino_nanase@example.com,wakatsuki_yumi@example.com";
Email email = new EmailBuilder()
                .from("kikutaro", "kikutaro@example.com")
                .to(recipientNogizaka)
//以下略

Message-IDの指定

メールヘッダに含まれるMessage-IDを簡単に指定できます。
Message-IDの詳細(RFC 2822)はこちら→RFC 2822(対訳)インターネットメッセージの形式 - RFCの部屋
通常ユニークな値であるべきものなので、以下の例は良くないものですが、idメソッドで指定できます。

Email email = new EmailBuilder()
        .id("thisismyownmessageid")
        .from("kikutaro_from", "kikutaro_from@example.com")
        //以下略

実際に送ったメールで確認してみました。まずはMessage-IDを指定しなかった場合は次のとおり。
f:id:kikutaro777:20170829233023p:plain

そして次にMessage-IDを上記コード例のように指定した場合です。
f:id:kikutaro777:20170829232909p:plain
ちゃんと変わってます。

非同期送信

通常のメール送信は同期なのでSMTPの応答を待ちますが、非同期に送信するもできます。
送信するメールの数が多いとき、これは結構便利そうですね。エラーのハンドリングはどうやるのか、気になる所ですが。

Mailer mailer = new Mailer("smtp.sendgrid.net", 587, "xxxxidxxxx", "xxxxpassxxxx");
mailer.sendMail(email, true); //第二引数でasyncをtrueに設定

スレッドプール

スレッドプールの値はデフォルトが10とのことですが、変更できます。

Mailer mailer = new Mailer("smtp.sendgrid.net", 587, "xxxxidxxxx", "xxxxpassxxxx");
mailer.setThreadPoolSize(3);
mailer.sendMail(email, true);

ログだけ残して送信しないモード

デバッグログだけ出して実際のメール送信はしない、みたいなことができます。
誤送信しないようにしたり、テストコードとかで使えるのかな。

Mailer mailer = new Mailer("smtp.sendgrid.net", 587, "xxxxidxxxx", "xxxxpassxxxx");
mailer.setDebug(true);
mailer.setTransportModeLoggingOnly(true);

ログについては、Simple Java MailではSLF4jを利用しているのでlog4j2やlogbackなどが利用できるようです。

Spring対応

Springから簡単に利用できるようになっています。
以下はSpring Bootで書いた例ですが@Importを指定するだけです。

@Component
@Import(SimpleJavaMailSpringSupport.class)
public class MyMailService {
    @Autowired
    private Mailer mailer;

    public void sendmail() {
        Email email = new EmailBuilder()
            .from("kikutaro_from", "kikutaro_from@example.com")
            .to("kikutaro_to", "kikutaro_to@example.com")
            .subject("Spring bootから")
            .text("マルチパートのテキストだよ")
            .textHTML("<b>マルチパートのHTMLだよ</b>")
            .build();
        mailer.sendMail(email);
    }
}

application.propetiesでSMTPの設定を定義できます。

simplejavamail.smtp.host = smtp.sendgrid.net
simplejavamail.smtp.port = 587
simplejavamail.smtp.username = ********
simplejavamail.smtp.password = ********

その他

設定(Configure)はファイルでもConfigクラスでも可能です。プロキシなんかへの対応もあるようです。
カスタムヘッダ、添付ファイル、DKIM対応、Return-Receipt-To/Disposition-Notification-To、メールアドレスのバリデーション、MimeやEML,Outlook.msgなどなどあるので、別途書きたい。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村