Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

Javaで脳内メーカーみたいなサービスを作ってみた

先日、久しぶりに「脳内メーカー」を試したときに

「同じ名前を入れると結果が同じだけど、どういう仕組みなんだろう?」
「どうやって画像を作っているんだろう?」

と内部的なところに興味がでて、自分も似たようなWebアプリを作ってみたいなぁと考えるようになりました。Javaを使って自分だったらどう実装するか考えたり調べたりしながら、ここ1ヶ月コツコツとプログラミングしてました。

まだ細かいエラー処理などの実装が必要ですが、とりあえず乃木坂46 21枚目の選抜発表に合わせて7/1にリリースしました。

www.rpgparty.sakamichi46.com

トップページはこんな感じで、ゲーム感を出してみました。

f:id:kikutaro777:20180702233924g:plain

メッセージがピコピコ流れていますが、これは iTyped.js というJavaScriptライブラリを使って、タイプライター風に表示しています。

フォントは PixelMplus(ピクセル・エムプラス)を使いました。漢字まで含まれていて素晴らしすぎる…。ライセンスの自由度も素晴らしすぎる…。
itouhiro.hatenablog.com

アプリの内容は脳内メーカーと同じです。名前を入れたらランダムで乃木坂メンバーをピックアップしてRPGパーティを組むというもの。完全なランダムではなく、名前の文字が同じであれば同じパーティとなります。

f:id:kikutaro777:20180703005804p:plain

「キクタロー」の結果はこちらです。

f:id:kikutaro777:20180702233359j:plain

豪華すぎる結果になってますが、開発者が有利になるような仕組みは入っておりませんのであしからず(^^;

ちなみにドット絵も頑張って作りました(^^;dotpictというアプリが素晴らしくて、スマホで簡単にドット絵を作れるので、外にいるときでも空き時間とかに作っていました。

dotpicko.net

以下のサイトでベースを作って、あとは乃木坂の制服や衣装にあわせた感じです。

ちびキャラを描いてみよう編【現役ゲームクリエイターによるドット基礎講座 第2回】 - Creatures Garage

「Peing - 質問箱 -」なども大流行りですが、あれはツイートしたときに表示されるカード画像が目立つことが人気の一端になっていると思っています。なので、自分もああいう仕組みも入れたいなと思いました。画像はJavaのGraphicを使って生成しているのですが、最初はそれをbase64にしてhtml表示していました。ただ、これだとTwitter Cardで表示されないという…。どうやら静的なURLが必要なようです。(この辺? 詳しい方いたら教えて欲しい…)

AWSのS3とか使って画像を保存させるしかないのか…と思っていたのですが、調べてみたら Cloudinary という画像・ビデオのアップロード&加工が簡単にできるサービスがありました。試したら便利だったので今はこれを利用しています。

cloudinary.com

Freeプランでもかなり使えます。
f:id:kikutaro777:20180703004342p:plain

これで以下のような形でTwitter Cardがしっかり表示できるようになりました。この辺は実装してみないとわからないものですね。

Webのフロントhtmlは Netlify に置いて、パーティや画像の生成をするサーバサイドは Heroku を使っています。Webフレームワークは Spring Boot + Thymeleaf です。

乃木坂ファンをターゲットに作っていますが、乃木坂46をあまり知らない方も是非お試し欲しいなと思います。そして出て来たメンバーを是非知ってもらえると嬉しいです><;需要があれば、欅坂46、けやき坂46(ひらがなけやき)にも対応します!

LINE Messaging APIで「若様bot」を作ってみました

なんだか今日は乃木坂46関連で色々とニュースが流れていて(ひめたん17th活動停止、まなったん写真集、文春砲…)大変な日です。

そんなニュースを横目に、コツコツとbotを作ってました。まだ開発途中なのですが、紹介ページも作ってみたので公開してみます(^^;

wakasamabot.sakamichi46.com

上記ページにもLINEで友だち追加するQRコードなどありますが、ここにも


f:id:kikutaro777:20170128222526p:plain:w200

LINEの友だち追加

このbotは、私が大好きな乃木坂46の若月佑美さんのAIと会話できるbotです。主には

  • 「若様」と話しかけるとブログなどの情報リンクを返してくれる
  • 「こんばんは」と話しかけると「こんばんわかつき~」と若ちゃん挨拶を返してくれる
  • 「写真」「画像」など話かけると若ちゃんの写真をランダムに送ってくれる


f:id:kikutaro777:20170125001539p:plain:w350

と、非常に俺得なbotとなっております。とはいえ当初目的は、若ちゃんの素晴らしさをもっと広めたい!という所ですので、もう少し一般的に楽しめる機能も少ないですが入れています。

  • 普通にトークできる機能(現状、文脈は取れないです)
  • 若ちゃんがやってるラジオ「エバンジェリストスクール」の「略語コーナー」再演


f:id:kikutaro777:20170125001600p:plain:w350

このブログみてくれる方は情報系学生さんやエンジニアの方が多いと思いますが、例えば「IBM」って何の略語かわかりますか(^^)?私はわかりませんでしたw ラジオでそういうやりとりをするコーナーがあるんですが、普段IT業界にいてもハっとさせられることが多いです。エバンジェリストスクール、略してエバスクに興味もった方は以下読んでみてください~。

kikutaro777.hatenablog.com

技術スタック的には

Bot

  • Heroku
  • Spring Boot
  • Cognitive Services(現状はBing Image Search API,QnA Maker)
  • DoCoMo 雑談対話 API

Web Site

などを利用しています。今後まだ機能拡張する予定で、Cognitive ServicesはもういくつかAPIを利用するつもりです。


現状、アイコンに若月さんの写真を使ってしまっているので、この辺は肖像権の話などありますので、変更していく予定です。せっかくなので、もう少し拡張して「LINE BOT AWARDS」に登録したいなぁと思っており、規約にもちゃんと以下明記されていましたので。

f:id:kikutaro777:20170128223252p:plain

こういうBotってどうしてもアイドルとかアニメなど、身近なネタと絡めたくなるので、こういう所が難しいですね(^^;もし、若ちゃんの似顔絵画像とか描きますよ!という方などいらっしゃったら、お声かけいただけると嬉しいです(>_<)

Spring BootとLINE Messaging APIで作ったLINE BOTをHerokuで動かす

やっと触れましたLINE Messaging API。やばい、なにこれめっちゃ楽しい。

上のは完全に遊びですが、仕事でも真面目に検討してもいいのかもって今更ながら真面目に思い始めました。QRコードから簡単に友だち追加できるので、何かと初速が速いなぁと。とりあえずスマホだけあれば良いわけですし。と当たり前なことを今更言ってしまうぐらい楽しいです。

Javaな方々は公式からThe Messaging API SDK for Javaが出てるので、これで簡単に始められます。

github.com

ドキュメントは以下参照。

LINE API Reference

line-bot-spring-boot moduleもあるのでSpring Bootの勉強がてら始めるのもホントおすすめです(自分は完全にそんな感じ)

GitHubのページにサンプルコードありますが、単純に送ったメッセージをやまびこのようにブーメランするだけなら

package com.example.bot.spring.echo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.linecorp.bot.model.event.Event;
import com.linecorp.bot.model.event.MessageEvent;
import com.linecorp.bot.model.event.message.TextMessageContent;
import com.linecorp.bot.model.message.TextMessage;
import com.linecorp.bot.spring.boot.annotation.EventMapping;
import com.linecorp.bot.spring.boot.annotation.LineMessageHandler;

@SpringBootApplication
@LineMessageHandler
public class EchoApplication {
    public static void main(String[] args) {
        SpringApplication.run(EchoApplication.class, args);
    }

    @EventMapping
    public TextMessage handleTextMessageEvent(MessageEvent<TextMessageContent> event) {
        System.out.println("event: " + event);
        return new TextMessage(event.getMessage().getText());
    }

    @EventMapping
    public void handleDefaultMessageEvent(Event event) {
        System.out.println("event: " + event);
    }
}

で作れます。便利すぎる(^^;

誰でも簡単に、って感じなのだと思いますが、知ってると便利かなと思うことをまとめたいと思います。

クラウドとか使わずローカル環境で動作確認したいとき

当初、なんかサーバとかをクラウドに用意せんと動かせないよなーとか思ってたのですが、去年JJUG CCC 2016 FallでLINEの@tokuhiromさんがLINE BOT ライブコーディングをされていて、ngrokを使う方法を紹介されてました。

Java + spring-boot で書く! LINE BOT ライブコーディング。 · Issue #34 · jjug-ccc/call-for-paper-2016fall · GitHub

ngrokは知っていたので、これ聴いたとき、ぬおおー!その手があったのかって感じでした。(知ってたなら気づけっていう

ngrok.com

ngrok http 8080

と起動すればローカルPCの指定ポートを外部にトンネルしてくれます。

f:id:kikutaro777:20170116222625p:plain

Spring Bootでアプリを起動しておけば、上記ngrokでトンネルされたhttpとhttpsのURLをpublicに使うことできますので、httpsのアドレスをLINE Messaging APIに登録することができます。

f:id:kikutaro777:20170116222900p:plain

httpは以下のように登録できないので、ngrok使ったやり方は非常にお手軽だと思います。証明書もいらないし。

f:id:kikutaro777:20170116222942p:plain

設定まわり URLにcallback

Webhookを登録したとき、Verifyがうまくいかない、と最初ちょっとハマってました。Spring Boot利用したとき、デフォルトでは先ほどのキャプチャにあるように「https://hogehoge.ngrok.io/callback」のような形で「callback」と入れてあげる必要があります。GitHubのConfigurationに、デフォルトが「callback」になっていることが書いてあるのですが最初気づかなくて、ハマってました。

f:id:kikutaro777:20170116224349p:plain

あくまでデフォなので、変えてしまうのもありです。

設定まわり 自動応答メッセージ

ちゃんとドキュメント読めって感じなのですが、最初、WebhookのVerifyが成功してローカルPCにもデータ飛ぶのに、LINEから話かけると常に以下の「メッセージありがとうございます 申し訳ありませんが、このアカウントでは個別のご返信ができないのです 次回の配信をお楽しみに」と出てしまって、わからんーってなってました(^^;

f:id:kikutaro777:20170116223626j:plain

LINE@Managerで「アカウント設定」->「Bot設定」の「詳細設定」->「自動応答メッセージ」を「利用しない」にするだけです。

f:id:kikutaro777:20170116223907p:plain

herokuでhttps

ここまででローカル開発環境で色々遊べるのですが、最後はやっぱり公開してみたい、ということがあると思います。証明書は安いものを取るか、Let's Encryptなど使うか、など選択肢があるかと思いますが、それなりに手間だなぁと。で、探してたらHerokuのAdd-onでFixieを使うと簡単とのこと。

qiita.com

実際に試したらホント簡単でした(^^;

画像や動画、スタンプの認識

最後におまけですが、冒頭に出したサンプルコードはテキストメッセージをやまびこするものでしたが、画像とか動画、スタンプが送られてきた場合、どうフックするのかなーと思ったのですが、@EventMapping使って以下のように定義すれば、そのままフックされました。

@EventMapping
public Message handleStickerMessage(MessageEvent<StickerMessageContent> event) {
    return new TextMessage("スタンプ送信ありがとうございます!");
}
    
@EventMapping
public Message handleImageMessage(MessageEvent<ImageMessageContent> event) {
    return new TextMessage("画像送信ありがとうございます!");
}
    
@EventMapping
public Message handleVideoMessage(MessageEvent<VideoMessageContent> event) {
    return new TextMessage("動画送信ありがとうございます!");
}
    
@EventMapping
public Message handleAudioMessage(MessageEvent<AudioMessageContent> event) {
    return new TextMessage("音声送信ありがとうございます!");
}

@EventMapping
public Message handleFollowEvent(FollowEvent event) {
    return new TextMessage("友達追加ありがとうございます!");
}

Herokuの環境変数利用

LINEのChannelSecretやTokenはコードに埋め込んだり、設定ファイルでGitHubなどにアップするわけにはいかないので、Herokuなどでは環境変数を利用するのが良いかと思います。で、gradleを利用してる場合は

sample-spring-boot-echoのREADMEにあるように
github.com

../gradlew bootRun -Dline.bot.channelToken=YOUR_CHANNEL_TOKEN \
                   -Dline.bot.channelSecret=YOUR_CHANNEL_SECRET

みたいに指定するようです。自分はMaven使ってたのと、application.propertiesを上手く使えないかなぁと思って調べたら

line.bot.channelSecret = ${CHANNEL_SECRET}
line.bot.channelToken = ${CHANNEL_TOKEN}

というように定義することができました。ほえー便利。

ということで、Spring Bootの勉強を楽しみながらするのにもおススメなLINE Messaging APIでした!

すごい面白いのができたらAwardsに出して1000万狙うしかない!(無理

botawards.line.me

NetBeansでSpring Boot + Doma

最近、はじめてDomaを触りました。前々からあちこちで「Doma、いいよ!Doma!」と聞いていて存在は知っていたのですが。

私は長らくJava EEをやってたので、IDEはNetBeansが馴染んでいて、他のフレームワークを触るときでも、ついNetBeansを使いたくなります。で、Domaを調べていると、EclipseとIntelliJ IDEAの情報がほとんどでNetBeans関連が見当たりませんでした。

Spring Bootと組み合わせて使いたいなと思って、調べたところ@makingさんが作ったdoma-spring-boot-starterが出てきて、ここのGitHubのページがIntelliJ IDEAを使った丁寧なチュートリアルになっていました。

github.com

で、このチュートリアルを参考にNetBeansで少し試してみたら、SQLファイルを配置したとき以下のようなコンパイルエラーがでました。

-------------------------------------------------------------
COMPILATION ERROR : 
-------------------------------------------------------------
jp/co/kke/doma/dao/MagazineDao.java:[18,20] 
[DOMA4019] ファイル[META-INF/jp/co/kke/doma/dao/MagazineDao/
selectAll.sql]がクラスパスから見つかりませんでした。
ファイルの絶対パスは
"C:\Users\kikuta\Documents\NetBeansProjects
\SpringBootDomaSample\target\classes\META-INF\jp\co\kke
\doma\dao\MagazineDao\selectAll.sql"です。
1 error
-------------------------------------------------------------
-------------------------------------------------------------
BUILD FAILURE
-------------------------------------------------------------

Domaではapt(Annotation Processing Tool)によってソースを自動生成してくれるようなのですが、sqlファイルをみつけられないようです。コードも以下のようにエラーとなっています。

f:id:kikutaro777:20161228000545p:plain

そこで、maven-apt-pluginで以下を追加しました。

<plugin>
    <groupId>com.mysema.maven</groupId>
    <artifactId>maven-apt-plugin</artifactId>
    <version>1.0.4</version>
    <executions>
        <execution>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <outputDirectory>src/main/resources/META-INF/jp/co/kke/doma/dao/MagazineDao</outputDirectory>
                <processor>org.seasar.doma.boot.ConfigAutowireable</processor>
            </configuration>
        </execution>
    </executions>
</plugin>

これでビルドが通って、Domaが動かせました。

Java EEやってる人はNetBeansに慣れている人が多いと思いますが、自分みたいに「最近SpringBootが気になるので、Spring Boot + Domaやってみたいなぁ、できればNetBeansで」と思ってる人がいれば、以下試した手順が参考になれば幸いです。

環境

自分の試した環境は

  • Windows 10 Pro 64bit
  • JDK 8u112 64bit
  • NetBeans 8.2

です。

NB Spring Boot

Spring Bootにはプロジェクトのひな型を作ってくれるSpring Initializrがあります。Webで作ってもいいのですが、NetBeansから使えると楽です。そこで、NB Spring Bootというプラグインを利用します。

「ツール」の「プラグイン」メニューを選択します。
f:id:kikutaro777:20161228001639p:plain

NB Spring Bootにチェックを入れてインストールします。
f:id:kikutaro777:20161228001955p:plain

f:id:kikutaro777:20161228002038p:plain

f:id:kikutaro777:20161228002126p:plain

Spring Bootのプロジェクト作成

NB Spring Bootプラグインを入れた後、「ファイル」「新規プロジェクト」の「Maven」から「Spring Boot Initializr project」を選びます。
f:id:kikutaro777:20161228004421p:plain

プロジェクト情報を入れます。
f:id:kikutaro777:20161228004432p:plain

RESTを使ってDBの値を取得するため、Webにチェックを入れます(ここではLombokも選びました)。
f:id:kikutaro777:20161228004542p:plain

DBはPostgres(Heroku上の)を使うのでチェックし、JDBCもチェックしました。
f:id:kikutaro777:20161228004551p:plain

f:id:kikutaro777:20161228004558p:plain

ちなみに今回サンプルで作ったDBは以下簡単なcreate文で作ったテーブルです。

create table magazine
(
    id serial not null,
    mail text
)

Domaの利用

プロジェクトができたら、pom.xmlのdependenciesに以下追加します。

<dependency>
    <groupId>org.seasar.doma.boot</groupId>
    <artifactId>doma-spring-boot-starter</artifactId>
    <version>1.1.0</version>
</dependency>

application.propertiesファイルにDB接続情報を入れます。

doma.dialect = postgres
spring.datasource.initialize=true
spring.datasource.url=	jdbc:postgresql://hogehoge?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
spring.datasource.username=hogehoge
spring.datasource.password=hogehoge
spring.datasource.driverClassName=org.postgresql.Driver

コードは、Entityクラス、DAO、ServiceとControllerをそれぞれ追加しました。

Entityクラス「Magazine.java」

import org.seasar.doma.Entity;
import org.seasar.doma.GeneratedValue;
import org.seasar.doma.GenerationType;
import org.seasar.doma.Id;

@Entity
public class Magazine {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer id;
    public String mail;
}

DAO

import jp.co.kke.doma.entity.Magazine;
import java.util.List;
import org.seasar.doma.Dao;
import org.seasar.doma.Select;
import org.seasar.doma.boot.ConfigAutowireable;

@ConfigAutowireable
@Dao
public interface MagazineDao {
    @Select
    List<Magazine> selectAll();
}

DAOに合わせてDoma用のSQLファイル「selectAll.sql」を作成し

src/main/resources/META-INF/jp/co/kke/spring/dao/MagazineDao/

に配置しました。

sqlファイルの中は

SELECT id, mail FROM magazine

と単純に全取得するものです。

続けてServiceクラスを作ります。

import jp.co.kke.doma.entity.Magazine;
import java.util.List;
import jp.co.kke.doma.dao.MagazineDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MagazineService {
    @Autowired
    private MagazineDao magazineDao;
    
    public List<Magazine> getMagazines() {
        return magazineDao.selectAll();
    }
}

最後にRest用のコントローラを追加します。

import java.util.List;
import jp.co.kke.doma.entity.Magazine;
import jp.co.kke.doma.service.MagazineService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MagazineController {
    @Autowired
    private MagazineService magazineService;
    
    @GetMapping("/magazines")
    public List<Magazine> getMagazines() {
        return magazineService.getMagazines();
    }
}

NetBeansのキャプチャはこんな感じです。

f:id:kikutaro777:20161228005912p:plain

MagazineDaoは残念ながら赤いエラーが出てしまうのですが、実際にはコンパイルできます。

で、実行して「http://localhost:8080/magazines」へアクセスすると

f:id:kikutaro777:20161228011506p:plain

とDBの中身が表示されました!

ということで、NetBeansでしばらく触っていこうと思います。

Spring BootのAutoConfigureには実はSendGridが含まれている!

この記事は「SendGrid Advent Calendar 2016」の5日目の記事です。
昨日は @ayakomuro さんの「First time using SendGrid」でした。
明日は公式ブログさんですw

Spring Bootの勢い

私は仕事で長らくJava EEを使ってきたのですが、もちろん、常にSpring Frameworkの存在は気になっていました。特にSpring Bootが出て以降、周囲で良い評判を耳にする機会がさらに増え、浮気心が沸いてます。そういった中、先月「Spring Day 2016」に参加したのですが、人の多さやイベントの盛り上がり方、多くの有名企業が発表するセッションなどを目の当たりにして「うぉー」ってなりました(^^;

そんなわけで、最近、改めてコツコツとSpring Bootを触り始めています。ちなみに私みたいなSpring Boot初心者は、最初に以下の本を読むのが良いです。色々と手を動かしながら学べます。薄いけど内容濃くて、持ち運び便利なのも好きな所です。

ちなみに自分はこちらも買ってコツコツ読んでいる所です(^^;

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
株式会社NTTデータ
翔泳社
売り上げランキング: 12,616

Spring Boot with NetBeans

自分はJava EEやってたこともあって、IDEはNetBeans派なのですが、以下のプラグイン

plugins.netbeans.org

を使うと

f:id:kikutaro777:20161204231555j:plain

f:id:kikutaro777:20161204231649j:plain

こんな感じでNetBeansからもSpring Initializrでプロジェクトの雛形作成することができて便利です。普段Java EEでNetBeans触ってる方は是非一度お試しを(^^;

SendGridのAutoConfigure

では本題へ。

Spring BootにはAutoConfigureというものがあってSpringが提供してる機能やその他ライブラリなどを簡単に使えるようになっているとのことです。AutoConfigureについては以下の情報がかなり詳しく、実際アノテーションを追っていきながら読んでみると非常に面白かったです。

qiita.com

上記解説の中にAutoConfigureの一覧がありますが、よくみると…

……

おぉ、今日のAdvent CalendarのテーマであるSendGridが!(わざとらしい

f:id:kikutaro777:20161205173837j:plain

GutHubだとここで確認できます。

f:id:kikutaro777:20161205180733j:plain

それにしても、眺めてみると有名なものがたくさん並んでいますね(^^;

f:id:kikutaro777:20161204224834j:plain

couchbase,flyway,mongoなどのDB関連や、freemarker,mustache,thymeleafなどのテンプレートエンジン、hazelcastやkafka,solrなどなど…これらと一緒に並んでいるのをみて、個人的には胸熱です。

Mandrill(MailChimp)などはないですしw

ということで、Spring Bootから簡単にSendGridを利用したメール送信をすることができます。@Beanなどが不要で、application.propertiesかapplication.ymlにAPI Keyを記述するだけで@AutoWiredにてDIされます。

application.properties

spring.sendgrid.apiKey = #SendGridで取得したAPI Keyを指定

または

application.yml

spring:
    sendgrid:
        apiKey : #SendGridで取得したAPI Keyを指定

依存性にSendGridから提供されているJavaライブラリを追加します。

<dependency>
    <groupId>com.sendgrid</groupId>
    <artifactId>sendgrid-java</artifactId>
    <version>3.1.0</version>
</dependency>

あとは、サンプルと合わせて以下のような感じに。今回はRest APIで「/send」を指定したらメールが飛ぶようなサンプルです。

package com.example;

import com.sendgrid.Content;
import com.sendgrid.Email;
import com.sendgrid.Mail;
import com.sendgrid.Method;
import com.sendgrid.Request;
import com.sendgrid.Response;
import com.sendgrid.SendGrid;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SendGridController {
    
    @Autowired
    private SendGrid sendGrid;
    
    @GetMapping("send")
    public Response send() {
        Email from = new Email("test@example.com");
        String subject = "Hello World from the SendGrid Java Library!";
        Email to = new Email("test@example.com");
        Content content = new Content("text/plain", "Hello, Email!");
        Mail mail = new Mail(from, subject, to, content);

        Request request = new Request();
        Response ret = null;
        try {
            request.method = Method.POST;
            request.endpoint = "mail/send";
            request.body = mail.build();
            ret = sendGrid.api(request);
        } catch (IOException ex) {
            //TODO:例外処理
        }
        return ret;
    }
}

mainはテンプレのまま。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootSendGridApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootSendGridApplication.class, args);
	}
}

SendGridのアカウントを取得して、API Keyを発行していることを前提に書きましたが、Keyの発行自体は非常に簡単です。

APIキーの管理 - ドキュメント | SendGrid
APIキー認証でセキュリティを強化しよう | SendGridブログ

Spring Bootを使ったサービス開発で「メールサーバ構築めんどくさいなぁ」とか「気軽にメール送れるサービスないかなぁ」と考えている方は是非一度お試し頂きたいなーと思います(^^)

サービスを動かす環境としてCloud Foundryも手軽です!

SendGrid x Spring BootをPivotal Web Services(Cloud Foundry)で試す - BLOG.IK.AM
Pivotal Web ServicesからのSendGrid利用 | SendGridブログ

Happy Sending!

はじめてのSpring Bootの感想 #hajiboot

昨年、著者の@makingさんから「はじめてのSpring Boot」本を頂きました。
本を頂いてからだいぶ時間が経ってしまったのですが、ちゃんとした書評を書いていなかったので改めてまとめます(^^;

本の一番の感想は「うーん、実践的/実戦的な本だなぁ」です。

2つの意味の「じっせん」が共存してる(^^;

開発環境の準備や手順はもちろんなのですが、解説内容が

  • Web画面
  • REST Webサービス
  • DB操作
  • DBマイグレーション
  • セキュリティ
  • PaaSへデプロイ
  • テスト

となっており、一通りやれば、Spring Bootを利用したモダンかつ要所を抑えたWeb開発が見える感じです。

そして、この内容が170ページほどにコンパクトにまとまっている点が凄いですね(^^;

個人的には

  • 本の厚さが薄い
  • でも内容が凝縮されて濃い

この2点が、タイトルの通り「はじめて」の人に優しくて素晴らしいと思います。

Java EE系では、良い本が多いのですが、マスタリングJava EE5や金魚本、わかりやすいJava EEとどれもブ厚い(>_<;

もちろん本が厚い=解説が詳しい、なのですが、本当に初心者の頃だと辛いのも事実。

本書ではJPAとかの細かい説明はバサッと切られていますが、雰囲気はしっかりわかるし、上手くことまとめられているなぁと。

今年、新人さんの研修やOJTで使うのも面白いかなーと考えています。

その他

  • Twitterのハッシュタグ「#hajiboot」で著者QA
  • GitHubからサンプルコード取得

辺りも熱いですね(^^;

これからSpringをやる、という方は必読ではないでしょうか。

もちろん本当の「実戦」となると色々調べる必要があると思いますが、Springはドキュメントも豊富ですし、本当に困ったら#hajibootハッシュタグでアドバイスももらえるというのが強み…(^^;

NetBeansでやってみた「はじめてのSpring Boot」

JJUG CCCの懇親会で@makingさんと話したら、Spring Bootの書籍を頂きました(^^)
ありがとうございます!!

f:id:kikutaro777:20141120003221j:plain

火事であらゆる技術書が燃えたり水浸しになってしまい(金魚本すら…ウッ)、Javaの書籍としては「Javaエンジニア養成読本」の次が「はじめてのSpring Boot」となりました。

著者がうまいこと言ってました(私が「堀北真希さん」の大ファンだから(^^;;)

ということで、本を読みながら、普段使ってるNetBeansでSpring Bootやってみました。
NetBeans 8.0.1&JDK 1.8です。

「ファイル」->「新規プロジェクト」

f:id:kikutaro777:20141120004333j:plain

カテゴリ「Maven」でプロジェクト「Javaアプリケーション」を選択

f:id:kikutaro777:20141120004408j:plain

プロジェクト名など適当に入力

f:id:kikutaro777:20141120004552j:plain

pom.xmlを編集

NetBeansで生成されたpom.xmlは次の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>MyFirstSpringBoot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>

で、以下のように定義を追加します。各定義の意味は「はじめてのSpring Boot」書籍に詳しく解説があります(^^)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>MyFirstSpringBoot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
    <!-- ここから追加 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.8.RELEASE</version>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>        
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <!-- ここまで追加 -->
</project>

次にメインクラスを定義していきます。

パッケージを右クリック「新規」->「その他」

f:id:kikutaro777:20141120005042j:plain

カテゴリ「Java」ファイル・タイプ「Javaメイン・クラス」選択

f:id:kikutaro777:20141120005223j:plain

クラス名「App」などへ

f:id:kikutaro777:20141120005242j:plain

コード書く

デフォルトで生成されたApp.javaは次の通りです。

package com.mycompany.myfirstspringboot;

/**
 *
 * @author kikuta
 */
public class App {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    }
    
}

これを以下のようにします。各種アノテーションやコードの説明は「はじめてのSpring Boot」書籍に詳しく解説があります(^^)

package com.mycompany.myfirstspringboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *
 * @author kikuta
 */
@RestController
@EnableAutoConfiguration
public class App {

    @RequestMapping("/")
    public String home(){
        return "Hello, World !";
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
    
}

実行

こんな感じに実行すると
f:id:kikutaro777:20141120005745j:plain

Springの文字がみえて、待ち受け状態に
f:id:kikutaro777:20141120005756j:plain

ブラウザを立ち上げてlocalhostの8080にアクセスすると…あっさり成功!
f:id:kikutaro777:20141120005835j:plain

うーむ手軽だ。

(当たり前かもですが)NetBeansでも普通に進められそうなので読み進めていきます!

ということで、解説が気になる方は「はじめてのSpring Boot」買いましょう!
ページ数も170ページくらいで、とても読みやすいし、実践的な内容となってます↓



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