読者です 読者をやめる 読者になる 読者になる

AWS Lambda JavaでLambdaFunctionで発生した例外の処理について

qiita.com

SIM City

この記事は SORACOM Advent Calendar 2015 12/22 分のエントリーです。

IMSI 440903115977777

「15桁のIMSIなんて、聞いたことがないよ。そもそも15桁って少なくないか?」

秋晴れの骨董市で男が見つけたのは、表面が金色にコーティングされ、鈍く光る2センチ角ほどのプラスチックチップだった。

裏には製造番号らしき文字と、そしてうっすらと北斗七星のマークが書かれているのが見える。

"IMSI"というのはこのチップに書き込まれているIDで、同じIDのものは2つ存在しない。

「これは売り物じゃないんだけどね。珍しいでしょう。祖父からもらった物なの。祖父も、父親か誰かにもらったみたい。」

そう言いながら、店番の女は懐かしむようにチップを見つめる。男は、きれいな瞳をもったその女を、その少し興奮した面持ちで見つめる。

「これ、"SIMカード"っていう名前なのよ。昔はIMSIが15桁しかなかったの。IMSIの末尾が7で揃っているでしょ?だから幸運のお守り代わりに持っているの。それにこれ、IMSIの書き換えが出来ないのよ。一途な感じでいいでしょ。」

一途というよりも、融通が効かないってほうが合っているんじゃないかと、男は思った。

「カードという割には、チップと言ったほうがいい大きさに見えるけど。」

「このチップは元々、大きなカードについていたの。それでこのチップは、切り取ったあとのもの。昔はこれを電話機に入れて使っていたのよ。」

「電話機か。それなら、うちのじいさんが持ってたな。でもそんなチップを入れる所はなかったけど。」

「多分その電話機には"eSIM"っていうのが入っていたんじゃないかしら。SIMカードよりもだいぶ小さいチップよ。出てきたあとに、あっという間にvSIMやnSIMに取って変わられたけどね。それにね、今と違ってこのeSIMもSIMカードも、通信にしか使われてなかったのよ。」

女は、別のケースから小さな黒いチップを取り出した。2ミリ角ほどの小さな物体、eSIM。Embedded SIMと呼ばれていたものだ。

「昔はほとんどすべてのものが"SIMフリー"だったんだろ?僕はとてもじゃないけどそんな環境では生活できないな。」

「SIMフリー、ね。以前は"電話機がSIMを選ばない"という意味だったらしいけど。確かに今ではSIMのついていないモノを探すほうが難しいわね。」

通信を行うために使われ始めたSIM(Subscriber Identity Module:利用者認識モジュール)は、単に通信時の認証だけでなく、人や物、データを識別するためのモジュールとして、ここ数十年で大きく発展を遂げた。

SIMに割り振られた"IMSI"と呼ばれるユニークIDは元々15桁だったが、用途が増えるに連れ、より大きなアドレス体系へと移行し、現在は元々通信のために使われていた"IPv6"と呼ばれる広大なアドレス体系の一部が、SIM用として割り振られている。

IMSIはIDブロックごとに国などの政府機関や民間団体に割り振られ、SIMに埋め込まれて利用される。そしてIMSIの埋め込まれたSIMの認証と、IMSIと紐づく情報の保護を行うための認証プロバイダ(以前はクラウドやキャリアと呼ばれた企業)により、巨大な仮想空間の中で運用される。

過去に発行された社会保障番号マイナンバー、電話番号といった類のID体系はすべてこのSIMに収れんされ、強固な認証やブロックチェーンを用いて保護されて、様々なデータに紐つけられ、利用されている。

このSIMは大きく2つの形状もっている。一つは形がなく、電子情報に付与されるvSIM、そして物理的なものに付与されるnSIM。

古く使われた「SIMカード」や「eSIM」と呼ばれたものと比べても極小のnSIMは、カーボンナノチューブで作られており、仮想空間と物理空間の個別の物体を識別/認証するためのIDとして、世の中のありとあらゆるものに付与されている。

また至る所に張り巡らされた高周波網から出力される電波を使い、nSIMはそれ単体で駆動/通信することができ、nSIMの付与された対象物の様々な情報を常に仮想空間上のコピー(Thing Shadow)に反映させることができるようになっている。

このコピーにより、個人の所有物の管理を仮想空間上で容易に行えるだけでなく、Thing間の協調動作により、人と会話をしたり、事故を未然に防いだり、体調管理を行ったりすることができ、社会基盤として大きな役割を担っている。

「昔の人は、几帳面だったんだな。俺なんか部屋の物への最終アクセス履歴がないと、掃除も出来ないよ」

「それは私もそうね。冷蔵庫からレコメンドがないと、美味しい料理は作れないわね。」

そう言いながら、彼女はふと視線をそらす。おそらくどこかから連絡が入ったのだろう。

「ごめんなさい、上司から呼び出しがあったの。対面で話がしたいって。」

「仮想でなくて対面でなんて、よほど重要な用事なのかな。」

「おじいちゃんだから、仕方がないわ。」

そういうと彼女は荷物を一つにまとめはじめた。

「それじゃあね。またどこかで。」

上目遣いで笑いかける彼女に、心拍数が上がるのを僕のThing Shadowが見逃さなかった。頭のなかでアラートが鳴る。

「あのさ、その、よかったら君のIMSI、教えてくれないかな?」

驚いた彼女は一瞬考えたあと、いたずらな顔をして、彼女自身のIMSIと、先ほどのSIMカードを差し出した。

「このSIMカードからの連絡なら、出てあげる。年代モノだから、これが使える通信機器を探すのも大変だと思うけどね。」

そう言うと、彼女の体が光りに包まれ、少しづつ薄くなっていった。彼女を取り巻く無数のSIMが、物質情報をデジタルにプロトコル変換して転送する、「SORACOM Beam」と呼ばれる転送方式。

「早く電話してこないと、他の誰かにSIMロックされちゃうから。」

そう言い残した彼女は、電子の海へ消えた。

SIMを通じて融合する仮想空間と物理空間、その中で生きる人と人、人と物には、予測できない出会いがまだまだたくさんある。無数のSIMによりヒトとモノがつながり、そして共鳴する街、SIM City。この幸運のSIMカードが使える電話への出会い、そして彼女との再会を楽しみにして、僕は街に踏み出した。

 

PDFBoxとFXGraphics2Dを使って大きなPDFをレンダリングする

この記事は、JavaFX Advent Calendar 2015 - Qiita の 16 日目の記事です。

昨日は kimukou さんの 

basilisk-fw について試食した雑感 - exception think でした。

はじめに

先日お伺いしたJJUG CCC 2015 fall でセッションをさせて頂いた際に、SORACOMの業務システムにJavaFXを使っていますよ、という話をさせて頂きました。

セッションの中では、Swaggerの話やAWS Lambdaの話などをさせて頂きましたが、「javax.smartcardioでSIMカードを読む」というくだりが(さすがにJavaの人たちなので)一番反応が良かったので、このアドベントカレンダーでもJavaFXを使ったカードリーダーにしよう、と思ったわけなのですが、よく考えるとカード読み取りの説明ばっかりでほとんどJavaFX出てこないな、と思いまして、今回は別の内容にすることにしました。

PDFBoxとFXGraphics2Dを使って大きなPDFをレンダリングする

タイトルそのままですが、JavaFXを使ったPDFViewerの話です。

JavaオープンソースPDFと言えばiTextを連想される方も多いと思いますが、iTextはPDF生成ライブラリの色が強く、画面や画像レンダリングの機能はありません(少なくともAGPL以前のものにはない)

このため、作成したPDFをJava上で表示したり、PDFレンダリング非対応のプリンタで印刷しようとすると、レンダリング機能のあるライブラリが必要になりますが、以前は日本語が使えるのは、JPedalなどの商用ライブラリしかまともに動くものはなかったかと思います。

しかしながら、最近Apache PDFBoxがメキメキと実力をつけてきたようで、最新版の2.0はまだRC2ながらも既に日本語レンダリングが行えるようになり、弊社でも帳票出力などに活用しています。

よくあるPDFBoxを使った表示サンプルは、以下の様なものになります。PDFBoxが提供するPDFRendererを使って作ったImageを、JavaFXのImageViewで表示しています。

gist.github.com

これの結果は以下のとおりで、一旦BufferedImageにレンダリングされたPDFが、JavaFX上で表示できます。 

f:id:c9katayama:20151216221304p:plain

スケールを大きくする

上記のPDFは、スケールが1倍(等倍)で表示されています。PDFの拡大はよくあるシチュエーションだと思いますので、ためしに上記PDFを10倍に拡大してみます。

サンプルコードの「int pdfScale = 1;」を10にすれば、10倍サイズでレンダリングされます。

f:id:c9katayama:20151216221618p:plain

正しく拡大されていますね。では50倍ではどうでしょうか?

実は50倍にすると、renderer.renderImageの部分で、OutOfMemoryErrorが発生します。

PDFBoxの提供するPDFRenderer#renderImageは、描画のために引数のスケールに応じたBufferedImageを用意するため、倍率が高いと巨大なBufferedImageが作られてしまい、OutOfMemoryErrorが発生してしまいます。

FXGraphics2Dを使う

PDFRendererクラスには、renderImageメソッドの他に、renderPageToGraphicsというメソッドが用意されています。

これは引数にjava.awt.Graphics2Dを取るメソッドで、これを使うとSwingのコンポーネントなど、Graphics2Dをグラフィックコンテキストに使用するコンポーネントに対して直接描画を行うことが出来ます。

これを使って、JavaFXコンポーネントに直接描画を行うことで、無駄な画像描画を行わず、拡大したPDFを表示することが出来ます。

しかしながらGraphics2Dはjava.awt時代のもので、直接JavaFXでは扱うことができません(もしかしたらSwingとのインターオペラビリティクラスにそういうのがあるかもしれませんが)

ということで、FXGraphics2Dというクラスを使用します。これはjFreeチャートの人が作ったクラスのようで、Graphics2Dと、javafxCanvasに書き込めるGraphicsContextのアダプタとして使用することが出来ます。

これを使って、PDFをJavaFXCanvasに直接書き込んでみます。

gist.github.com

等倍での書き込み。これは先ほどのrenderImageのものと変わりません。

f:id:c9katayama:20151216223854p:plain

 50倍での書き込み。正しくレンダリングできているようですが、左上を起点にしているので、緑色しか出ません。

f:id:c9katayama:20151216224043p:plain

 FXGraphics2Dを使ったほうは、倍率を上げても、その分大きなBufferedImageが作られるわけではないので問題なく描画できます。

緑色だけでは面白く無いので、ドラッグできるものも作ってみました。

gist.github.com

 PDFをドラッグした分、描画の起点をずらす実装が入っています。

Graphics2DにAffineTransformを設定すると、PDFRendererの描画処理の座標を、GraphicsContextに伝える際に座標変換出来ます。GraphicsContextはCanvasのサイズでClipされていますが、その範囲外でPDFRendererが行った描画処理を、座標変換することでClip内に収め、見た目ドラッグして移動したようにしています。

出来たサンプルを動かしてドラッグすると、以下の様な感じになります。

 

f:id:c9katayama:20151216230241p:plain

「世界中の」の「世」の部分ですね。ちゃんと描画できているのが分かります。

まとめ

PDFBoxは日本語対応も進んでいるので、2.0のリリースが待ち遠しいですね。FXGraphics2Dがあれば、既存のチャートライブラリなんかはひと通り使えると思うので、安心ですね。

JavaFXはSceneBuilderとeclipseという環境で開発していますが、UIとロジックが綺麗に別れるので、個人的には非常に便利だと思っています。AdobeFlexはまさにこういうスタイルだったので、Flex亡き今、Javaで生産性の高い仕掛けがあるのは非常に嬉しいです。

 

JavaをやっておきながらJJUGは実は初参加で、しばらくJava実装もやっていなかったのでJavaコミュニティーに行くのも4年ぶりぐらいで若干ビビってましたが、そんなことはなくてJavaの話で盛り上がれて、本当に楽しかったです。@makingさんのリアクティブの話や@sugarlifeさんのGCの話は非常に勉強になりましたし、特にSpringMVCがリアクティブでも頑張ってくれるという話は個人的には大興奮のポイントでした。

またTwitterではよく見かけているうらがみさんや、相変わらずスベってるセロさんにも会えましたし、なによりきしださんがセッション前に資料作成が終わってたのには驚かされました。人は成長するものですね。

そんなわけでまた機会があればネタを作ってJavaイベントに参加したいと思います。

 

明日はskrbさんのブログです。

 

 

 

 

 

 

SORACOMの提供するCSVのご紹介

SORACOM

みなさまこんにちは。毎日SIMを焼いています。ソラコム片山です。

好きなSIMは標準サイズです(ちょっとカードが厚いので、焼き心地がいい)

はじめに

ソラコムリリース記念ブログも終盤戦に差し掛かり、素晴らしいエントリーが揃ってきました。ありがたい限りです。

私も自分な好きな機能について書こうと思い、先日のSORACOMデベロッパーカンファレンスでもLTでご紹介した「SORACOMイベントハンドラー」のエントリーを考えていましたが、実はイベントハンドラーの話はジャストインケースの松井さんにがっつり書かれてしまい、ネタがかぶってしまいました(ちなみに松井さんも、SORACOM Beamのネタをクラスメソッドの大瀧さんに書かれてイベントハンドラーネタにしたそうで、完全に玉突き事故状態です)

 

そんなわけで今朝、家で「何かいいネタないかな?」と相談したところ、「私の銀行口座の残高が減ったら通知されて、自動的にお金が振り込まれる仕組みとかいいんじゃない?」というとても嫌なイベントハンドラーのアイデアをもらいましたが、そもそもSORACOM関係ないということで、丁重にお断りしました。

 

ということで、SORACOMの機能でまだ紹介されていない部分のご紹介をしたいと思います。

やっぱりCSV

先日のLTでも、@manacatさんが「みんな大好きCSV」とおっしゃられていましたが、ご多分に洩れずSORACOMでもCSVを提供しています。

CSVは大きく分けて2つで、「データ使用量」と「利用料」の2つになります。

データ使用量

このCSVは、IMSI単位で使用したSORACOM AirおよびSORACOM Beamの使用量を取得するものです。コンソールでは、課金情報タブの下側に取得メニューがあります。

f:id:c9katayama:20151021183433p:plain画面からは、過去6ヶ月間(月ごと)もしくは過去90日間(日ごと)のいずれかを選べますが、APIを使用していただければ、unixtimeのfrom-toと月ごと/日ごと/詳細(分単位)の指定でデータを取得することができます。

以下はSORACOM AirCSV(日ごと)のサンプルです。項目は見ていただければ想像がつくと思いますが、各IMSIごと(SIMごと)に項目が分かれており、さらに日ごと、速度クラスごとに上り下りの通信バイト数とパケット数が取得できます。

f:id:c9katayama:20151021184627p:plain

 

SORACOM Beam(日ごと)の場合は、以下のようになります。

f:id:c9katayama:20151021185542p:plain

こちらもわかりやすいと思いますが、IMSIごと、日ごと、Beamのプロトコルのin/outごとに、通信カウントを取得することができます。

 

またいずれのCSVにも、CSV右側の方にいろいろな文字がひっついてきます。

これはタグとグループになっていて、すべてのタグおよびグループが項目名として列挙されており、タグ/グループがついたIMSIの行には、そのタグ/グループの値が入ります。

f:id:c9katayama:20151021192107p:plain

これを使っていただくと、所有者や部署単位での集計や、通信量の多いIMSIを見つけたりすることが簡単に行えます。

APIはこちらのリンクから確認できます( Air, Beam )

 

利用料

データ通信の利用料の明細を、月ごとにCSVを取得することができます。画面では同じく課金情報タブの「最新の請求予定額」および「過去の請求履歴」から取得できます。

f:id:c9katayama:20151021193327p:plain

f:id:c9katayama:20151021193417p:plain

 最新の請求予定額の部分は、当月の予定額が逐次計算されたものをCSVで取得することができます。また支払済の月については、確定したデータをCSVで取得することができます。

f:id:c9katayama:20151021193921p:plain

利用料についても、IMSIごと、日ごと、品目ごとに単価(unitPrice)、数量(quantity)、金額(amount)のデータが取得できます。

billItemNameというのが課金項目で、現在は以下のような項目があります。

basicCharge-{状態}

基本利用料。-ready(SIMを登録した状態)-active(通信可能状態) -inactive(休止状態)がそれぞれ 別で計算されます。

downloadDataCharge/uploadDataCharge-{速度クラス}-{時間}

上り下りのデータ通信料。速度クラス(s1.fastなど)ごとに分かれており、さらにdaytime(日中)とnighttime(夜間)ごとに分かれています。

quantityは通信バイト数、unitPriceは1byteごとの単価になっています。

docomoSMSCharge

SMS付きのSIMでSMSを利用した場合の料金。quantityがSMS送信数となっています。

soracomBeamRequestCharge-{in/out}{プロトコル}

SORACOM Beamの利用料。-inHttpなど、各プロトコルのin/outごとに明細になっています。quantityがBeamのリクエスト回数になります。

dataTrafficFreeTier

データ通信料の無料利用枠(30円まで)。金額がマイナスで表示されます。

soracomBeamRequestFreeTier

SORACOM Beamの無料利用枠(10万リクエストまで)。こちらも金額がマイナスで表示されます。

すべての項目には消費税がかかっていないため、請求額としては合算後に消費税を適用した金額となります。

 

なお、利用料のCSVについても、データ使用量と同じくIMSIごとにタグおよびグループが付与されていますので、部署や地域ごとに費用を算出したり、たとえば夜間だけやたらと利用の多いIMSIを見つけたりすることができます。

 

まとめ

結局「CSVのご紹介」という地味な内容となってしまいましたが、ぜひ上手くCSVをご活用頂ければと思います。

 

CSS Niteみたいな感じで「CSV Nite」とかやったら人来ますかね?私は行かないですが。

 

転職について

少し前の話ですが、アマゾンデータサービスジャパン(ADSJ)を退社しました。

 ADSJ

見返すと、入社したのが2011年7月だったので、丸4年働いたことになります。元々はJavaデベロッパーをしていましたが、入社時のブログにも書いたのですが「みんなこれ(AWS)を使ったら楽になるのにな」という思いがありました。自分自身がデベロッパーだったので、AWSが当たり前に使えるような環境があれば、開発をする時に楽になるし、そんな環境がいいよな、と思っていました。

私は以前は金融系のフロントエンドシステムを開発していましたが、LinuxJavaは分かりやすい例で、以前はプロジェクトを始める際に、それ自体を導入するかどうかを詳細に調査する所から始まっていましたが、メリットが理解されたり採用事例が増えるとその過程は無くなって、当たり前のように使われるようになりました。AWSを触っていると、これはLinuxJavaのようなところまで行けるんじゃないか、という感覚はありました。

そんなわけで、AWSを当たり前にするには、もちろんAWSのメリットが開発者に認知されることが必要ですが、それ以上に採用事例があるということや、法制度的に問題がないということようなことも、特にAWSを採用する側の企業にとっては重要になるケースが多くあります。採用事例を増やすためにははじめの一歩を踏み出して頂く企業を支援する必要があるのですが、それにはやはりAWSを提供する所にいないと難しいと思い、ADSJに行こうと考えました。

その時一緒にOSSをやっていた大谷さんが先に入社していて、会社の仕事内容や雰囲気などを聞かせてもらったり、後押ししてもらえたこともあり、3番目のソリューションアーキテクトとして入社することができました。在職中はAWS導入を考えている企業の方々と一緒に活動を行い、AWSの公開事例のいくつかには携わることができました。

日通さんの案件は、採用頂くまでにかなり長い道のりでしたが、最終的に採用頂くことができ、大企業の基盤でもAWSが採用頂けるという確信が持てる、自分の中でも一つの大きなターニングポイントでした。また金融系のお客様も担当させて頂き、特にFISCのガイドライン対応や事例公開を通じて、クラウド利用の有識者会議に参加でき、多少なりとも金融機関のAWS利用に向けて布石が打てたのは良かったですし、そのプロセスを通じて、物事の動かし方、というか枠組みを変える仕組みを体験できたのは大きな経験となりました。

そのほか書籍も数冊(CDP本紫本)出すことが出来ましたし、AWSクラウドデザインパターン(CDP)をまとめることができ、その作成を通じて、社内やコミュニティの様々な技術者の方からたくさんの知識を得ることが出来ました。集大成(?)として、CDP麻雀を作り上げることもできました。re:Inventでのプレゼンもいい経験でした。

AWSのお客様、パートナーの皆様、JAWSに関わっている皆様、社内のチームの皆様には、大変感謝しております。全ての方に個別にご挨拶にお伺いできなかったのですが、改めてお礼を申し上げます。

AWSソリューションアーキテクト

4年間続けたAWSソリューションアーキテクト(SA)というロールですが、本当に多種多様な仕事ができるロールです。AWSを利用いただくために出来ることはなんでもやる、というイメージで、AWSの技術的な側面を抑えつつ、利用者にとってのメリットを訴求していく仕事でした。

技術支援ということで、設計をお手伝いしたり技術調査をしたり、問題解決をしたりするのはもちろんですが、プレゼンテーションも、技術者だけでなく経営層に対してすることもありますし、イベントなどで外向けにも話をします。営業のために提案書を作ったり、公開用のホワイトペーパーや技術マテリアルの作成をしたり、トレーニングやWebセミナーも行いますし、AWSのサービス開発に関わってローンチのヘルプやβテストをしたり、顧客フィードバックを集めたりもします。かなり多種多様な仕事がありました。

実のところ、入社前ではやったことがないことがほとんどだったのですが、社内の同僚SAや他のロールの人たち、またパートナーさんや、AWSをうまく使いたいという強い意志を持ったお客様に支えて頂いて、なんとか続けることができました。強みを持つ方々が周りにいるので足りないところがどんどん埋まっていくし、新しいことでも形になっていくんだなというのを身を以て実感しました。

SAは、もちろんAWSの最新技術に触れていられるという点だけでも非常に魅力的なロールなのですが、振り返るとそれ以上に、SAが置かれるこういった多くのロールの方と関わって何かを作り上げていく環境というのは、大きな魅力だったと感じます。技術者として色々な仕事がしたいという方や、幅を広げたいという方は是非一度AWSソリューションアーキテクトを経験されると良いと思います。

特に今、AWSにどんどん企業やデータが乗ってきて、企業連携やサービス連携なんかが実ビジネスになってくるフェーズなので、SAになってこれに直接携わるのも面白いと思います。つなごうと思えばVPCピアリングなどで一瞬で接続が終わる均一なインフラ環境に、多くの企業やデータが集まっていることは、おそらく今までなかった状況だと思います。また技術面だけではなく、JAWSやE-JAWSなどのコミュニティもあるため、いわゆるAPIエコノミー的なものも、AWSであればビジネスになるのではないかと思います。SAはこういう所に直接関われますので、新しいビジネスやアーキテクチャを体験できるのではないかと思います。

退社にともない、エンタチームの皆様、SAマネージャー、関連チームの方には多くご迷惑をお掛けしましたが、今後はAWSエコシステム側として貢献して行きたいと思っていますので、是非引き続きよろしくお願いいたします。

開発者にもどる

2014年は多くの企業事例が出てきたためか、顧客訪問をしても、AWSの採用に前向き、もしくはすでに採用が決まっているというお客様が多くなってきました。自分の中では旭硝子さんの事例はさらなるターニングポイントで、AWSの利用方法をお客様がこれだけしっかりと話していただけるのであれば、認知も一定まで行ったのではないかという感触を得ました。そんな折、自分自身も開発に戻るのもいいなと考え始めていたタイミングでソラコムの話を聞き、AWSを使ってチャレンジをする絶好の機会だと思い、玉川さんと話した結果、開発者として転職することを決めました。

現在は毎日追われながら開発をしています。フルスタックエンジニア云々という話がありますが、むしろ今はスタックオーバーフローエンジニアです。しかしながら、利用者になると改めてAWSのメリットを感じます。DynamoDBやKMSも、一から作ると考えるとゾッとしますが、AWSであれば月数ドル払えばいいだけなので、本当にありがたいです。今はAWSのメリットを享受しつつ、システムを実装する毎日です。

今後について

ソラコムの製品発表が明日行われますので、詳細は是非ITPro Expoのソラコムブースで聞いていただきたいと思います。私も15分枠をいただいて、ブースで製品紹介をさせていただきます。シールなどのプレゼントも用意していますので、皆様是非お立ち寄りください。

また10/3には八子クラウド座談会にも参加させていただきます。また開発者イベントも企画中ですので、興味を持たれた方は是非ご参加ください。

今後は自社製品を開発しながら、エコシステムの皆様と新しいユースケースやビジネスを作っていきたいと思っています。またもちろんAWSとは関わりが深いので、AWSの利用者の方々とも一緒にチャレンジしていきたいと思っていますので、今後ともよろしくお願いいたします。

 

 

 

 

 

 

Spring MVC integration for Swaggerのバージョン2をSpringBootで実行する

qiita.com