素人がSalesforce AI アプリコンテスト 2018に参加して、予選落ちして、悲しみの中で得たもの

## とにかく僕は実績がほしかったんだ

素人ながらも、なんとなく勉強し、ちょっとしたアプリを作ってると自信がでてくる。
なので世でも力になれるかと思ったら、そうじゃない。
私には**実績**がなかった。
とにかく**実績**がほしかった。

## そんなときに見つけたアプリコンテスト

そんなときに**[Salesforce AI アプリコンテスト 2018](https://sfhack2018.devpost.com/)**なるものを見つけた。
ちょうど機械学習を勉強していたし、Salesforceはなかなかのネームバリューだし、**賞金100万円**だし、
アイデアはなかったが、応募してみた。

## 開発の日々

- アイデアを提出して、Salesforceの方がGoogleHangoutsでいろいろ相談してくれたり、
- 仕事くそ忙しくて睡眠時間削ってコード書いたり、
- 提出期限直前、本番デプロイして、バグ見つけて、仕事中まじ焦ったり、、

ほんとこのときは、本気で**100万＋優勝の肩書**めざして頑張って、楽しい時間だった。。。

最終的に下記のような機能のアプリを提出した。

- Gmailから上司のメールを取得
- 取得したメールを「danger」と「safe」にラベリングし学習
- 学習後はそのモデルを用いて、いつでも上司からのdangerと予測されるメールをslackに通知できる

というアプリだ。

この時は、本当に1位取れるんじゃないかとおもっていた。。

## 結果

ファイナリスト発表は2018/5/25(金)だけど何時ころに通知されるかは不明。
仕事中、メールばっかみてた。
そしてメールが来た。

[ファイナリスト 5チームが決定しました!!](https://sfhack2018.devpost.com/updates/8787-5)

**この中に自分の作品はなかった。**

たしかにファイナリストの作品は、自分のより楽しそうで、使ってみたくて、夢がある。
私は負けたのだ。
ぎりぎりじゃなく、圧倒的に負けた。

賞金でMacbookProとiphoneとダイソンコードレス掃除機を買おうと決めていたが、
とりあえず、この日の夜は同僚と立ち飲み居酒屋に行って、現実逃避し、眠りについた。。。

## 予選落ち確定の翌朝（つまり執筆している今日）思ったこと

落ちたけど、無理やり有意義なものにしないといけない。
今後もコンテストに参加したいからだ。
そのため、このコンテストの過程で得たものを公開する。

## 得たものその１　WEBサービスは見せ方が異常に大事

おそらく、私のアプリは技術的にはファイナリストたちと大差はない。（と信じたい）
大きな差があるのは見せ方。

[ファイナリストたちの作品](https://sfhack2018.devpost.com/updates/8787-5)は、

- タイトルで引き付けられる
- タイトルでなんとなくアプリのイメージが沸く
- そもそもアプリの操作が簡単

一方、私の作品は、

- タイトルからどんなアプリか想像しにくい
- 初期設定が若干面倒（slackのwebhookURLを入力とかは特に面倒）
- AIのパーソナライズ機能を実装したが、学習に1時間かかったりする

私のアプリを改善するとしたら、

- 多少精度は犠牲にし、AIモデルはこちらで準備
- 「メールで職場のストレスチェック！」みたいな感じで、一般的な指標（こちらで準備したモデル）でストレス度を測れる

みたいな感じにすれば、上位に食い込めたかもしれない。。
（てか、これやってやろうかなとちっと今思った）

## 得たものその２　AIサービスって使うの結構カンタン

今回のコンテストは[Einstein](https://www.salesforce.com/jp/blog/2016/09/einstein-vol1-introducing.html)という「SalesForceが開発したAI」を利用してアプリを作るというものだった。

なんかAIというと頭いいひとが使うイメージだったが、

- 学習データをcsvにして、curlでpostする
- するとレスポンスで数字が帰ってくる。データを学習したモデルを識別する番号だ。
- このモデル番号と判別したいデータを、curlでpostする
- 結果が返ってくる

ほんとこれだけなのである。
curlの先にあるAPIサーバを作るのは激しく難しいだろうが、使うだけであればカンタンだ。
コンテストの過程でIBMのAIであるWatsonも検証したが、これも簡単だった。

つまり、AIサービスは思っていた以上に簡単に使える、
つまり、AIサービスを提供できる側になると、かっこいい。


## 得たものその３　コンテストは最高級にテンションがあがる

アプリコンテストは初参加だった。
そして、期間中、モチベーションの高さが異常であった。

いままではなんか勉強とか、会社で使えそうなツールつくるとか、
大したドキドキもなかった。

でもコンテストはやばい。

- 高額の賞金、お金を使うときの妄想
- 迫りくる締め切り期限
- グランプリを取ったときのインタビューの妄想
- 仕事との両立で、睡眠効率の最大化、目ギンギン
- 提出ボタンを押すときの1クリックにかかる重み

最高だった。また参加する。ぜったい。

## 得たものその４　Herokuのタイムアウトを非同期処理で解決

AIサービスの利用窓口となるEinsteinへのリクエスト機能の実装はカンタンだった。
ちなみにこのサイトを多用した。
[curl-to-ruby](https://jhawthorn.github.io/curl-to-ruby/)

しかしAIはが学習したりするので処理に時間がかかる。
基盤としてHerokuを使うことにしていたが、本番デプロイ時、Herokuがタイムアウト。

コントローラにこんな感じの処理がかいてあったため、routingに時間がかかりすぎたためである。

```learn_controller.rb
def new
  sleep(300) # ←これは時間のかかる処理をsleepメソッドで表現しています
  redirect_to root_path
end
```

解決策は時間がかかる処理を非同期で実装すること。
railsで制作していたので*delayed_job_active_record*というGEMを使って実装した。
チュートリアルに沿っていけば難なく実装できるが、以下のポイントは注意が必要。

- Windows環境で作成していると、'bin/delayed_job'に実行権限が付与されないケースがある。
- 非同期JOBの中にredirect処理は組み込めない
- JOB失敗時のエラー検知

これらに注意すれば、時間のかかるAI処理でもUXを損なわずに実装できる。

## さいごに

まだ悲しさが残っているし、
まだ脱力感はぬぐえない。
素人なりにも、久々に頑張ったからだ。

いろいろと思ったことを書いたが、やっぱり技術的成長よりマインド的成長の方が大きかった。（はず）
悲しみの最中、この記事をかいたが、すっきりしてきた。（と思いたい）

やるべきことは、またなんか考えて作っていくことだと思う！

## 補足

技術的にはGmailAPI実装が激むずだったので、それも追って分かりやすく記事書きます。