SlideShare a Scribd company logo
1 of 35
Download to read offline
とても
腹立たしいことが
あったのです。
プロローグ
Prologue
ある日。
とても腹立たしい
事件が起きた。
誰かに話して
共有したい。
SNS
でも誰かを巻き込んで
負の感情を連鎖
させるのはよくない。
LINE Bot 相手だったら
いいんじゃね?
よけいムカついた
まてまて。
前回のこの勉強会で、
LINE Bot 作るスキル
習得したじゃん!
いくらBotとはいえ、
こんな娘に乱暴な言葉
ぶつけるのは忍びない…
キャラ変えました。
○TAR ○ARS の DR○ID
ならいいだろw
メイキング
Making
TypeScript v.2.1+
async / await
function foo() {
fizz()
.then(res1 => {
buzz(res1);
})
.then(res2 => {
fizzBuzz(res2);
})
}
function async foo() {
fizz()
.then(res1 => {
buzz(res1);
})
.then(res2 => {
fizzBuzz(res2);
})
}
function async foo() {
let res1 = await fizz();
.then(res1 => {
buzz(res1);
})
.then(res2 => {
fizzBuzz(res2);
})
}
function async foo() {
let res1 = await fizz();
buzz(res1)
.then(res2 => {
fizzBuzz(res2);
})
}
function async foo() {
let res1 = await fizz();
let res2 = await buzz(res1);
.then(res2 => {
fizzBuzz(res2);
})
}
function async foo() {
let res1 = await fizz();
let res2 = await buzz(res1);
fizzBuzz(res2);
}
app.post('/webhook', (req, res) => {
...
let gotIntent = new Promise((resolve, reject) => {
aiRequest.on('response', response => resolve(response));
aiRequest.end();
}) as any;
let main = gotIntent
.then(aiResponse => {
// 意図は「お薦めの食事」だと特定。お薦めの食事を回答します。
if (aiResponse.result.action == 'recommendation') {
dietitian.dietitian.replyRecommendation(event.replyToken);
main.Cancel();// ここで処理は終了
}
else {
// 意図が特定されなかった場合は
// 食事の報告だと仮定して形態素解析処理へ移る。
return mecab.parse(event.message.text);
}
})
.then(res => {
let gotAllNutrition = res
.filter(r => r[1] == '名詞')
.map(r => foodsDb.getNutrition(r[0]));
return Promise.all(gotAllNutrition);
})
.then(responseList => {
// ...ここに巨大なアロー関数の本体...
})
app.post('/webhook', (req, res) => {
...
let gotIntent = new Promise((resolve, reject) => {
aiRequest.on('response', response => resolve(response));
aiRequest.end();
}) as any;
let main = gotIntent
.then(aiResponse => {
// 意図は「お薦めの食事」だと特定。お薦めの食事を回答します。
if (aiResponse.result.action == 'recommendation') {
dietitian.dietitian.replyRecommendation(event.replyToken);
main.Cancel();// ここで処理は終了
}
else {
// 意図が特定されなかった場合は
// 食事の報告だと仮定して形態素解析処理へ移る。
return mecab.parse(event.message.text);
}
})
.then(res => {
let gotAllNutrition = res
.filter(r => r[1] == '名詞')
.map(r => foodsDb.getNutrition(r[0]));
return Promise.all(gotAllNutrition);
})
.then(responseList => {
// ...ここに巨大なアロー関数の本体...
})
app.post('/webhook', async (req, res) => {
...
let aiResponse: any = await new Promise((resolve, reje
aiRequest.on('response', response => resolve(respo
aiRequest.end();
});
// 意図は「お薦めの食事」だと特定。お薦めの食事を回答します。
if (aiResponse.result.action == 'recommendation') {
dietitian.dietitian.replyRecommendation(event.repl
return; // ここで処理は終了
}
// 意図が特定されなかった場合は
// 食事の報告だと仮定して形態素解析処理へ移る。
let res = await mecab.parse(event.message.text);
let gotAllNutrition = res
.filter(r => r[1] == '名詞')
.map(r => foodsDb.getNutrition(r[0]));
let responseList = await Promise.all(gotAllNutrition);
...
 非同期呼び出しの連鎖中でも
returnで処理打ち切れる
 Bluebird 要らんかったんやw
まとめ
Conclusion
TypeScript マジお薦め
•async/await ※1
神機能。
• さらに Visual Studio Code なら、Out-of-Box でコーディ
ング支援からデバッグ実行までできて超快適。
※1 ... 実際には async/await は TypeScript の専売特許などではなく、次期 JavaScript(ECMAScript) で
採用予定の機能・構文となっており、Babel などの他のトランスパイラでも利用できます。
※2 ... もちろん Visual Studio Code に限らず、Atom や Sublime Text 等々、主だったテキストエディ
タや IDE 上でTypeScriptのコーディング支援を得られます。
Happy Coding :)
Learn, Practice, Share.
追補
• AIが入ったBotの作り方を学ぼう
• Part1 概要と開発環境のセットアップ
http://qiita.com/nkjm/items/0e9d24b2f3429bd33c8d
• Part2 LINEでビジネスアカウントを作成する
http://qiita.com/nkjm/items/daa4e34b26ef937446c6
• Part3 Bot本体のプログラムを開発する
http://qiita.com/nkjm/items/27d0131003a4b7ef02b9
• Part4 形態素解析と食品データベースで食品とその栄養価を特定する
http://qiita.com/nkjm/items/d46bd91e1784adf1434b
• Part5 自然言語解析でメッセージの意図を解釈しBotのスキルを高める
http://qiita.com/nkjm/items/fe2db6b8c4ee2980e2b4
• 「Oracle Cloud Developers Meetup@北海道 - AIが入ったBotの作り方を学
ぼう」に VSCode と TypeScript で取り組んだ話
http://qiita.com/jsakamoto/items/3f19cac806dc44c3dd50

More Related Content

Viewers also liked

Viewers also liked (10)

St Michael Presentation
St Michael PresentationSt Michael Presentation
St Michael Presentation
 
2017 customer intelligence signs which brands should never ignore
2017 customer intelligence signs which brands should never ignore2017 customer intelligence signs which brands should never ignore
2017 customer intelligence signs which brands should never ignore
 
15 ideas para la Transformación Digital de tu Negocio
15 ideas para la Transformación Digital de tu Negocio15 ideas para la Transformación Digital de tu Negocio
15 ideas para la Transformación Digital de tu Negocio
 
El relleno fluido no fue el único culpable - Foro Técnico sobre la Troncal Ca...
El relleno fluido no fue el único culpable - Foro Técnico sobre la Troncal Ca...El relleno fluido no fue el único culpable - Foro Técnico sobre la Troncal Ca...
El relleno fluido no fue el único culpable - Foro Técnico sobre la Troncal Ca...
 
Fanny Leberquier
Fanny LeberquierFanny Leberquier
Fanny Leberquier
 
The Power of Beneficiary-Directed Data (CMS BlueButton on FHIR API Update)
The Power of Beneficiary-Directed Data (CMS BlueButton on FHIR API Update)The Power of Beneficiary-Directed Data (CMS BlueButton on FHIR API Update)
The Power of Beneficiary-Directed Data (CMS BlueButton on FHIR API Update)
 
Ouellette elixir 2017
Ouellette elixir 2017Ouellette elixir 2017
Ouellette elixir 2017
 
openEHR: aspectos de interoperabilidad y mantenibilidad
openEHR: aspectos de interoperabilidad y mantenibilidadopenEHR: aspectos de interoperabilidad y mantenibilidad
openEHR: aspectos de interoperabilidad y mantenibilidad
 
臨床心理学における例数設計
臨床心理学における例数設計臨床心理学における例数設計
臨床心理学における例数設計
 
Deeplinkから考えるWebとAppの今後とは
Deeplinkから考えるWebとAppの今後とはDeeplinkから考えるWebとAppの今後とは
Deeplinkから考えるWebとAppの今後とは
 

More from Jun-ichi Sakamoto

How to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail featureHow to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail feature
Jun-ichi Sakamoto
 
Ohotech特盛#5予告 - タートルグラフィックでいろんな模様を描いてみよう!
Ohotech特盛#5予告 - タートルグラフィックでいろんな模様を描いてみよう!Ohotech特盛#5予告 - タートルグラフィックでいろんな模様を描いてみよう!
Ohotech特盛#5予告 - タートルグラフィックでいろんな模様を描いてみよう!
Jun-ichi Sakamoto
 
ASP.NET SignalR によるクイズWebアプリ 「みんなで同時プレイするWebアプリでCodeQuizに挑戦!」
ASP.NET SignalR によるクイズWebアプリ 「みんなで同時プレイするWebアプリでCodeQuizに挑戦!」ASP.NET SignalR によるクイズWebアプリ 「みんなで同時プレイするWebアプリでCodeQuizに挑戦!」
ASP.NET SignalR によるクイズWebアプリ 「みんなで同時プレイするWebアプリでCodeQuizに挑戦!」
Jun-ichi Sakamoto
 
CLR/H#74 LT IT勉強会発表用イチオシツール
CLR/H#74 LT IT勉強会発表用イチオシツールCLR/H#74 LT IT勉強会発表用イチオシツール
CLR/H#74 LT IT勉強会発表用イチオシツール
Jun-ichi Sakamoto
 

More from Jun-ichi Sakamoto (20)

C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へC# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
 
Pre-render Blazor WebAssembly on static web hosting at publishing time
Pre-render Blazor WebAssembly on static web hosting at publishing timePre-render Blazor WebAssembly on static web hosting at publishing time
Pre-render Blazor WebAssembly on static web hosting at publishing time
 
WebAssemblyが切り拓くフロントエンドWeb開発の未来
WebAssemblyが切り拓くフロントエンドWeb開発の未来WebAssemblyが切り拓くフロントエンドWeb開発の未来
WebAssemblyが切り拓くフロントエンドWeb開発の未来
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LTAzure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
 
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
 
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
C# で Single Page Web アプリを開発できる Blazor ― その魅力C# で Single Page Web アプリを開発できる Blazor ― その魅力
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
 
Azure App Service Authentication
Azure App Service AuthenticationAzure App Service Authentication
Azure App Service Authentication
 
Ohotech特盛#14 セッション4 予告編
Ohotech特盛#14 セッション4 予告編Ohotech特盛#14 セッション4 予告編
Ohotech特盛#14 セッション4 予告編
 
Ohotech特盛#13 スマホで操作する カメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
Ohotech特盛#13 スマホで操作するカメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―Ohotech特盛#13 スマホで操作するカメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
Ohotech特盛#13 スマホで操作する カメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
 
息子たちがローマ字勉強するための <s>HTML5</s> Web標準 アプリ作ってみた
息子たちがローマ字勉強するための <s>HTML5</s> Web標準 アプリ作ってみた息子たちがローマ字勉強するための <s>HTML5</s> Web標準 アプリ作ってみた
息子たちがローマ字勉強するための <s>HTML5</s> Web標準 アプリ作ってみた
 
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトークMore Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
 
How to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail featureHow to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail feature
 
Introduction of "MarkdownPresenter"
Introduction of "MarkdownPresenter"Introduction of "MarkdownPresenter"
Introduction of "MarkdownPresenter"
 
セッション中に Twitter につぶやく!
セッション中に Twitter につぶやく!セッション中に Twitter につぶやく!
セッション中に Twitter につぶやく!
 
Ohotech特盛#5予告 - タートルグラフィックでいろんな模様を描いてみよう!
Ohotech特盛#5予告 - タートルグラフィックでいろんな模様を描いてみよう!Ohotech特盛#5予告 - タートルグラフィックでいろんな模様を描いてみよう!
Ohotech特盛#5予告 - タートルグラフィックでいろんな模様を描いてみよう!
 
ASP.NET SignalR によるクイズWebアプリ 「みんなで同時プレイするWebアプリでCodeQuizに挑戦!」
ASP.NET SignalR によるクイズWebアプリ 「みんなで同時プレイするWebアプリでCodeQuizに挑戦!」ASP.NET SignalR によるクイズWebアプリ 「みんなで同時プレイするWebアプリでCodeQuizに挑戦!」
ASP.NET SignalR によるクイズWebアプリ 「みんなで同時プレイするWebアプリでCodeQuizに挑戦!」
 
[予告篇] みんなで同時プレイするクイズWebアプリでCodeQuizに挑戦!
[予告篇] みんなで同時プレイするクイズWebアプリでCodeQuizに挑戦![予告篇] みんなで同時プレイするクイズWebアプリでCodeQuizに挑戦!
[予告篇] みんなで同時プレイするクイズWebアプリでCodeQuizに挑戦!
 
ASP.NET で作るとあるTwitter Bot -開発環境からネット公開までぜんぶ無料だよ!-
ASP.NET で作るとあるTwitter Bot -開発環境からネット公開までぜんぶ無料だよ!-ASP.NET で作るとあるTwitter Bot -開発環境からネット公開までぜんぶ無料だよ!-
ASP.NET で作るとあるTwitter Bot -開発環境からネット公開までぜんぶ無料だよ!-
 
CLR/H#74 LT IT勉強会発表用イチオシツール
CLR/H#74 LT IT勉強会発表用イチオシツールCLR/H#74 LT IT勉強会発表用イチオシツール
CLR/H#74 LT IT勉強会発表用イチオシツール
 

Recently uploaded

Recently uploaded (7)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」

  • 5. SNS
  • 8.
  • 9.
  • 10.
  • 14.
  • 15.
  • 18. ○TAR ○ARS の DR○ID ならいいだろw
  • 19.
  • 23. function foo() { fizz() .then(res1 => { buzz(res1); }) .then(res2 => { fizzBuzz(res2); }) }
  • 24. function async foo() { fizz() .then(res1 => { buzz(res1); }) .then(res2 => { fizzBuzz(res2); }) }
  • 25. function async foo() { let res1 = await fizz(); .then(res1 => { buzz(res1); }) .then(res2 => { fizzBuzz(res2); }) }
  • 26. function async foo() { let res1 = await fizz(); buzz(res1) .then(res2 => { fizzBuzz(res2); }) }
  • 27. function async foo() { let res1 = await fizz(); let res2 = await buzz(res1); .then(res2 => { fizzBuzz(res2); }) }
  • 28. function async foo() { let res1 = await fizz(); let res2 = await buzz(res1); fizzBuzz(res2); }
  • 29. app.post('/webhook', (req, res) => { ... let gotIntent = new Promise((resolve, reject) => { aiRequest.on('response', response => resolve(response)); aiRequest.end(); }) as any; let main = gotIntent .then(aiResponse => { // 意図は「お薦めの食事」だと特定。お薦めの食事を回答します。 if (aiResponse.result.action == 'recommendation') { dietitian.dietitian.replyRecommendation(event.replyToken); main.Cancel();// ここで処理は終了 } else { // 意図が特定されなかった場合は // 食事の報告だと仮定して形態素解析処理へ移る。 return mecab.parse(event.message.text); } }) .then(res => { let gotAllNutrition = res .filter(r => r[1] == '名詞') .map(r => foodsDb.getNutrition(r[0])); return Promise.all(gotAllNutrition); }) .then(responseList => { // ...ここに巨大なアロー関数の本体... })
  • 30. app.post('/webhook', (req, res) => { ... let gotIntent = new Promise((resolve, reject) => { aiRequest.on('response', response => resolve(response)); aiRequest.end(); }) as any; let main = gotIntent .then(aiResponse => { // 意図は「お薦めの食事」だと特定。お薦めの食事を回答します。 if (aiResponse.result.action == 'recommendation') { dietitian.dietitian.replyRecommendation(event.replyToken); main.Cancel();// ここで処理は終了 } else { // 意図が特定されなかった場合は // 食事の報告だと仮定して形態素解析処理へ移る。 return mecab.parse(event.message.text); } }) .then(res => { let gotAllNutrition = res .filter(r => r[1] == '名詞') .map(r => foodsDb.getNutrition(r[0])); return Promise.all(gotAllNutrition); }) .then(responseList => { // ...ここに巨大なアロー関数の本体... }) app.post('/webhook', async (req, res) => { ... let aiResponse: any = await new Promise((resolve, reje aiRequest.on('response', response => resolve(respo aiRequest.end(); }); // 意図は「お薦めの食事」だと特定。お薦めの食事を回答します。 if (aiResponse.result.action == 'recommendation') { dietitian.dietitian.replyRecommendation(event.repl return; // ここで処理は終了 } // 意図が特定されなかった場合は // 食事の報告だと仮定して形態素解析処理へ移る。 let res = await mecab.parse(event.message.text); let gotAllNutrition = res .filter(r => r[1] == '名詞') .map(r => foodsDb.getNutrition(r[0])); let responseList = await Promise.all(gotAllNutrition); ...
  • 33. TypeScript マジお薦め •async/await ※1 神機能。 • さらに Visual Studio Code なら、Out-of-Box でコーディ ング支援からデバッグ実行までできて超快適。 ※1 ... 実際には async/await は TypeScript の専売特許などではなく、次期 JavaScript(ECMAScript) で 採用予定の機能・構文となっており、Babel などの他のトランスパイラでも利用できます。 ※2 ... もちろん Visual Studio Code に限らず、Atom や Sublime Text 等々、主だったテキストエディ タや IDE 上でTypeScriptのコーディング支援を得られます。
  • 34. Happy Coding :) Learn, Practice, Share.
  • 35. 追補 • AIが入ったBotの作り方を学ぼう • Part1 概要と開発環境のセットアップ http://qiita.com/nkjm/items/0e9d24b2f3429bd33c8d • Part2 LINEでビジネスアカウントを作成する http://qiita.com/nkjm/items/daa4e34b26ef937446c6 • Part3 Bot本体のプログラムを開発する http://qiita.com/nkjm/items/27d0131003a4b7ef02b9 • Part4 形態素解析と食品データベースで食品とその栄養価を特定する http://qiita.com/nkjm/items/d46bd91e1784adf1434b • Part5 自然言語解析でメッセージの意図を解釈しBotのスキルを高める http://qiita.com/nkjm/items/fe2db6b8c4ee2980e2b4 • 「Oracle Cloud Developers Meetup@北海道 - AIが入ったBotの作り方を学 ぼう」に VSCode と TypeScript で取り組んだ話 http://qiita.com/jsakamoto/items/3f19cac806dc44c3dd50