DataSpider でやり残したこと(不真面目)

はじめに

「退職まであと数日か」と考えると会社を辞めることより DataSpider を気軽に触れなくなることにとても寂しさを感じました。そこで最後に DataSpider で何か作って遊ぼうかなと思っていたところ、二郎 AI のニュースが流れてきて「これだ!」と思い二番煎じで遊んでみました。 withnews.jp

作りたいもの

テレビでもリアルでも良いのですが、初めての人を見たときに「あっ、あの人 AKB にいそうだな」とか「ジャニーズ っぽいな」とか思うことありませんか?ありますよね?もしそれが共感できない人でも、女優やタレントでも所属事務所ごとに系統(〇〇っぽさ)があることはなんとなく理解できるかと思います。

ヲタ界隈でも「○○っぽい顔」みたいな考え方があって、自分自身でも「あ~、この子は典型的なハロプロ顔だな~」とか思うことがあります。 この○○っぽいというのは中々言語化が難しいもので、それだったら AI に学習させて AI に判断してもらおうと思いまして、DataSpider + 画像認識 AI を使って遊ぶことにしました。

下準備

正直これが一番大変でした。 今回はとりあえず「ハロプロ顔」「AKB 顔」「乃木坂顔」の判別ができれば良しとしてそれぞれのスコアリングをしたいと思います。そのためにはそれぞれのグループごとに画像を集めて AI に学習させる必要があります。 当然まずはハロプロから。オフィシャルページに行って総勢 58 名分の画像を取得してとりあえずローカルに保存します。(豆知識:funaki(2).jpg,morito(2).jpg というように同じ名前が2つありますが、この子達はハロプロ内で複数のグループを掛け持ちしているので両方の写真を使いました)

f:id:dsstsukky:20190325140215j:plain

続いて、乃木坂 46。ここで問題発生!ハロプロのページは右クリックで保存できたのに、乃木坂 46 と AKB48 のページは右クリックが禁止されていて画像が保存できませんでした。早くも暗礁に乗り上げたか?と思いましたが、調べてみたら Chrome 拡張で右クリックを有効化するものがありました。

chrome.google.com

これを使ってなんとか乃木坂 46 の画像を取得。続いて、AKB 48 のページも右クリック保存ができなかったけど「Enable right click」のおかげで解決!どうしても画像保存したかったらスクショ撮れば良いですし、正直右クリック禁止して意味あるのかな?とか思いました。制限かけてないハロプロ最高!

ハロプロのファイル名は全部その子の名字にしていたのですが、AKB48 は名前を変更するモチベーションが無かったので、ファイル名そのままです(ごめんなさい)。しかも何故か 1 人だけ png の子がいました。

f:id:dsstsukky:20190325141323j:plain

とりあえずそんなこんなで画像を集めました。精度を高めるためにはもっとたくさん集めた方が良いでしょうが、とりあえずは ハロプロ:58名、乃木坂46:47名、AKB48:115名の画像を使って学習させていこうと思います。

IBM Watson Visual Recognitionでやってみる

画像認識 AI は Microsoft(Face API)も IBM Watson (Visual Recognition)も両方使ったことはあるのだけれど、今回やりたい「グループ化してそのグループ化に属するか判断する」というのは Watson でやったことがあって比較的すぐできそうな感覚があったのでまずは Watson でやってみました。

やること

  1. Create a classifier でカスタム分類器を作成する

  2. 判別したい画像を分類器に渡して結果を取得する

これだけですね。 API リファレンスを見ながらまずは カスタム分類器を作ります。カスタム分類器というのはチュートリアルでの直訳(英語では classifier )なのですが、「判定エンジン」みたいに置き換えたほうが理解しやすいかもしれません。デフォルトで用意されている判定エンジンにアイドルの画像を渡すと「women」や「person」などと判定されてしまうので、カスタム分類器を作成しましょう。

Visual Recognition - IBM Cloud API Docs

カスタム分類器の作成は非常に簡単で、Curl コマンドにするとこんな感じです。

curl -X POST -u "apikey:{apikey}" -F "helloproject_positive_examples=@helloproject.zip" -F "akb48_positive_examples=@akb48.zip" -F "nogizaka46_positive_examples=@nogizaka46.zip" -F "name=idol" "https://gateway.watsonplatform.net/visual-recognition/api/v3/classifiers?version=2018-03-19"

フォームパラメータで classname を指定して、その class の positive_examples (つまり、今回だとハロプロの画像の塊 zip)を渡します。同様に、akb48,nogizaka46 というクラスを作成して、一緒にそのクラスのサンプル画像を渡しています。{apikey}は実際の APIKEY に置き換える必要があります。あと、思ったんですが他のクラウドサービスはヘッダーで認証が多いと思うんですが、Watson は Basic 認証なんですね。 これを DataSpider で実装するとこんな感じで、アイコン 2 つだけで実装できてしまいます。

f:id:dsstsukky:20190325143649j:plain

f:id:dsstsukky:20190325143701j:plain

f:id:dsstsukky:20190325145829j:plain

f:id:dsstsukky:20190325150215j:plain

これで「idol」という名前のカスタム分類器が作成できたので、ここに画像を送り込んでみましょう。上手く行けばその画像がどのグループっぽい画像か判断してくれるはずです。使う画像はアイドルが憧れるアイドル鈴木愛理ちゃんの画像を使います。

www.airisuzuki-officialweb.com

使う APIClassify an imageです。これを使ってカスタム分類器に対して画像を送信し結果を取得します(とても簡単なので説明は省きます)。

戻ってきた結果を確認すると

                "classifier_id": "idol_1176938397",
                "name": "idol",
                "classes": [
                    {
                        "class": "helloproject",
                        "score": 0.892
                    }
                ]

としっかりと鈴木愛理ちゃんの顔がハロプロ認定されたようです。

続いて、AKB の元エース前田あっちゃんの画像を送ってみたのですが・・・結果がこれまたハロプロ顔。

ここで気づいたのですが、元々の画像写真がアーティスト写真(通称:アー写)を使っているためグループごとに衣装が偏ってしまい、私服っぽいとハロプロで学生服っぽいと AKB48、OL っぽい服装だと乃木坂と判定されてしまうようです。

・・・ということでここで方針転換。 とはいってもこれ以上画像を集めるのは大変なので、「同一人物だと判断する」という機能に特化した Microsoft の Cognitive Services (Face API) を使うことにしました。

(その 2 へ続く)

DataSpider でやり残したこと(不真面目)-その2

ここまでのおさらい

これをやりきらないと退職できないと意気込んで作り始めた「アイドル顔判定器(仮)」。IBM Watson で作り始めたものの、服装によって分類が分けられてしまう結果となったため、Microsoft Cognitive Services Face API を使って再チャレンジ(いまここ)。

API を調べてみる

Face API は以前使ったことがあったものの、かなり機能が多くそれがゆえにどの API を使ったら良いのかがなかなかわからない(難しい)。API リファレンスと格闘した結果、恐らく以下の流れでできそうだと思い作り始めてみる。1 つ 1 つ が 1 つの API に該当しているので、IBM Watson に比べると使う API の種類が多い印象です。

  1. PersonGroup の作成(Create)

  2. PersonGorup に所属する Person の作成(Create)

  3. Person に対して画像を追加(Add)

  4. PersonGroup の学習(Create)

PersonGroup /Person の作成(Create)

先述の通り「どの API を使ったら良いか?」は悩みましたが、API 自体はドキュメントもわかりやすく殆ど躓く箇所がありませんでした。

まず使うのは PersonGroup - Create です。Curl コマンドだとこんな感じ。

curl -v -X PUT "https://westus.api.cognitive.microsoft.com/face/v1.0/persongroups/{personGroupId}" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}"

使う JSON もシンプルです。userData は任意項目なので、実質は name だけ渡せば良いですね。

{ "name": "idol", "userData": "Japanese Idol Group" }

DataSpider でもアイコン 2 つです。 f:id:dsstsukky:20190325160345j:plain

続いて、ほぼ同様の手順で PersonGroup Person - Create で新しい Person を作成します。本来は同じ人物を判別するための機能ですが、今回は「helloproject」「akb48」「nogizaka46」という人物を作成して、それぞれのグループの画像をその Person に学習させてみます。

Person の作成に成功すると以下のレスポンスがあります。この personId は次で使います。

{"personId":"52f8b199-812c-457f-8976-c2e84969da8a"}

Person に対して画像を追加(Add)

ここまでの手順で、idol という Group とその Group に所属する「helloproject」「akb48」「nogizaka46」という Person の作成が終わりました。あとはそれぞれの Person に対して画像を与えて学習してきます。

使うのは PersonGroup Person - Add メソッドです。

curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/persongroups/{personGroupId}/persons/{personId}/persistedFaces?userData={string}&targetFace={string}" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}"

指定した personGroupId(今回は idol) に所属する person (helloproject/akb48/nogizaka46)に対して、json もしくは octet-stream で画像を渡します。ここで先程取得した personId を使用します。

IBM Watson では画像を一括で zip 形式で渡せたのですが、それができないようです。手作業でやると大変ですが DataSpider では指定したフォルダ以下にあるファイルをリスト化し、順に処理する仕組みがあるので(左から 2 番めの list というアイコンです)、苦労せずに実現できました。

f:id:dsstsukky:20190325163812j:plain

途中、wait アイコンがあります。これは最初置いていなかったのですがない状態で実行したところ途中で「429 too many requests」が返されました。調べてみたところ、1 時間 1,200 件を超えると制限がかかるようです。ただ、今回は 1,200 件はどう考えても送っていないので、短時間にアクセスしすぎて怒られたと思い 10 秒のウエイトを置いたら上手くいきました。

こんなウエイトの処理もアイコン 1 つでできるとか DataSpider とハロプロ最高ですね(コード書いても一行でしょうけど)。

上記を 3 つの person それぞれで行い、その後 PersonGroup - Train を実行して与えた画像を元に AI にトレーニングをしてもらう必要があります。

curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/persongroups/{personGroupId}/train" -H "Ocp-Apim-Subscription-Key: {subscription key}"

この PersonGroup Train は非同期のようなので、大量の画像を学習させた後は念の為 PersonGroup - Get Training Status を実行してステータスが「succeeded」になっているのを確認してから次に進むのが良いでしょう。

curl -v -X GET "https://westus.api.cognitive.microsoft.com/face/v1.0/persongroups/{personGroupId}/training" -H "Ocp-Apim-Subscription-Key: {subscription key}"

↓ こんな感じに出力されたら準備完了です。あとは画像を渡してみて確認に移りましょう。

{"status":"succeeded","createdDateTime":"2019-03-26T03:29:08.8868775Z","lastActionDateTime":"2019-03-26T03:29:09.1433051Z","message":null}

(その 3 へ続く)

DataSpider でやり残したこと(不真面目)-その3

ここまでのおさらい

「アイドル顔判定器(仮)」の作成も大詰め。Microsoft Face API を使って学習させるところまでできたので、あとは実際に画像を送信して AI にどのアイドルグループに属するか判断してもらいましょう。

愛理ちゃんでやってみる

改めて、愛理ちゃんの画像を送ってみます。 Face API では Face - Identify という API でどの登録済み Person に類似度が高いか判断してくれるのですが、Identify に送るためには FaceId というものが必要となります。そのため、まず Face - Detect で FaceId を取得して、その後に Face - Identify を使って結果を取得します。

まずはこちらが Face - Detect。json で URL を渡すか octet-stream で直接ファイルを渡すこともできます。

curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/detect?returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes={string}" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}"

結果がこちら。この ca6d25e2-e68d-4c6b-a273-6bf416b27f0b というのがいま送った画像の FaceId になります。

[{"faceId":"ca6d25e2-e68d-4c6b-a273-6bf416b27f0b","faceRectangle":{"top":109,"left":243,"width":141,"height":141}}]

この Face Id を使って Face - Identify に送るといよいよやりたかったことが実現できます。

curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/identify" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}"

Detect - Identify の流れを DataSpider のスクリプトで組むとこんな感じですね。

どれどれ、結果を見てみましょう。

[{"faceId":"e9f1ae5f-cef7-4e82-ad7d-33f3c2350d44","candidates":[{"personId":"16e0a696-ffcc-4b9f-a51f-f96571231a59","confidence":0.55153}]}]

この personId(16e0a696-ffcc-4b9f-a51f-f96571231a59)は その 2 で person を作成したときに生成されたものでしてその時のログを確認してみます。

  • ハロプロ:52f8b199-812c-457f-8976-c2e84969da8a

  • AKB 48 :6ea1ef83-0940-4fc3-a9b1-a9294d4b26dc

  • 乃木坂46:16e0a696-ffcc-4b9f-a51f-f96571231a59

愛理が乃木坂46 と判定されている・・・。

confidence(信頼度)が 0.55153 と低いですし、やはり学習が足りなかったかもしれませんね。 画像集めるのはめんどくさいのでやりたくないのですが、仕方ないので学習させましょう。

学習方法 - 1

すでに「指定したフォルダ内の画像を Person に Add する」という機能は作っているので、あとは DataSpider のファイルトリガーという機能を使って、そのフォルダにファイルが置かれたら自動的にそのスクリプトを実行するように仕掛けておきます。

DataSpider の歴史の中でハロプロというディレクトリが作られたのは史上初かもしれませんね。ハロプロ最高!

f:id:dsstsukky:20190326235937j:plain

学習方法 - 2

しかし、ここで気づきました。DataSpider は私の業務用 PC にインストールされており、上記の方法だと業務用 PC でアイドルの画像を集めることとなり、あと数日で会社を辞めるとはいえこれは非常によろしくない!

ということで私物のスマホで画像を集めて学習させる方法を考えました。仕組みとしては kintone で画像と一緒に所属グループを登録すると Webhook で通知を受け取った DataSpider がその画像を取得して PersonGroup Person - Add の API を叩いて学習させてくれます。また、画像をファイルとして渡すモードとで画像の URL を渡すモードを作って切り替えるようにしました。(フィールドの表示・非表示の切替は gusuku Customine でやりました)

使用イメージ

f:id:dsstsukky:20190326193805g:plain

DataSpider のスクリプト

f:id:dsstsukky:20190326234910j:plain

f:id:dsstsukky:20190326234922j:plain

ここまで来たらあとは頑張って画像を集めて学習あるのみですね!

最後に

そんなこんなでハロプロ画像を中心に学習させていたところ、ついにその時が来ました!

f:id:dsstsukky:20190326203941j:plain

まだ confidence は 0.55686 と低めですが、愛理ちゃんが無事ハロプロ顔と認定されました。

最後の最後に本当に頭のおかしいものを作りましたが、大好きなものを組み合わせて楽しめたので大満足でです。

これからも DataSpider と 鈴木愛理ちゃんと築山をよろしくお願いします。

kintone Café JAPAN 登壇で得たもの

この記事は kintone Advent Calendar 8 日目の記事です。担当させていただきます「つっきー」と申します。 qiita.com

すでにアスキーさんより素敵な記事「kintone Café Japan 2018に親子で参戦してきた」が上がっていて、しかも開催から 1 ヶ月も経ってしまいましたが、kintone Café JAPAN で登壇させていただいた私が得たものについて書かせていただきたいと思います。

kintone Café JAPAN とは

kintoneを学ぶための勉強会コミュニティkintone Café。kintone Caféの年に1度の全国イベントそれが「kintone Café JAPAN」です。当日はいくつかのセッションが用意され、この週に開催されいた Cybozu Days Tokyo と合わせて全国からたくさんの kintone ファンが集まりました。

f:id:dsstsukky:20181207194534j:plain

私が登壇させていただいた背景

その中で、私は「ノンコーディングで簡単実現 gusuku Customine ではじめての画面カスタマイズ(ハンズオン)」というセッションを担当させていただきました。

f:id:dsstsukky:20181207191401p:plain

私自身、仕事として gusuku Cutomine の販売や導入に携わっているわけではないのですが、gusuku Cutomine が 3月にプレビューリリースされて以来、その魅力に取り憑かれて日々触ってあちこちで魅力を人に伝えていたところ、「非プログラマーであるつっきーに講師をして欲しい」ということで登壇の依頼をいただきました。

「はじめての~」と銘打ったことで私のセッションに参加された方はバリバリの開発者やシステム担当者というより、普段業務で kintone を使っていてより便利な使い方を求めている実務担当者という方が多かったと思います。

元々、私が講師を担当をさせていただいたのも「開発者目線」ではなく「プログラムがかけない私でも実現できる」ことを伝えたかったからなので、参加していただきたいと思っていた方々にご参加いただけたと思っています。

お伝えした内容

当日の発表資料は Slideshare にて公開させていただいています。

gusuku Cutomine は「継続的業務改善をみんなのものに」という壮大なテーマのもとにアールスリーインスティテュートさんから提供されているサービスであり、従来 JavaScript を書いて実現していた「画面の色を変える」「計算をする」「入力できるフィールドに制限をかける」などの画面カスタマイズをノンコーディングで実現するものです。

当日は、実際私自身がプロジェクトで kintone を導入する際に(kintone の基本機能だと少し物足りないなぁ・・・)と思っていた部分を次々と gusuku Cutomine で解決できたのでそれを実際に皆さんに触っていただきながら学んでいただくためのセッションとさせていただきました。

アスキーさんの記事にあるように中学生のお子さんも参加されていたのですが、参加されたほとんどの方が用意していたコンテンツを全て消化してくださり、少しでも身になったと感じていただけると幸いです。

講師として得たもの

さて、少し話は飛んでタイトルに戻りたいと思います。少し個人的な話になってしまいますが、お伝えしたいことに関連するので触れさせてください。

私自身は新卒からずっと IT 業界に身をおいているのですが、元々 IT に限定して仕事をしたかったわけではありません。情報系の学部を出たわけでもない私が就職のときに考えていたのは「教育関連の仕事に就きたい」ということでした。

その中で、新卒の時に入社した会社は Windows に特化したビジネスを行っている企業で Windows の教育(MCP / MOT)を事業の 1 つとして持っていて、その事業に関心があったため、志望し採用いただきました。しかし!入社直前にその会社が当該事業から撤退していたため、私が配属されたのはソフトウェアのサポート部門でした。その後、様々な経験をさせていただき「教育」を専門に仕事をしたことは未だに無いのですが、今回の kintone Café JAPAN のように講師をやらせていただく機会は数多くあり、その機会は常に楽しめた気がします。

それはわかりやすい言葉でいうと「人に教える」ということですが、その先にあるのは「ツール、サービスを活用することで自身の課題解決を自身で実現できるようになる」ということだと思っていて、その手助けをできることが自分自身の喜びなんだということに改めて気づかされました。

私自身は kintone エバンジェリストの皆さんのように開発力があるわけでもなければ新しいサービスを考える企画力はありませんが、kintone Café のようなコミュニティを通じて皆さんが自分自身で課題解決をできるようになる手助けができれば良いと思います。

kintone Café の魅力

kintone Cafe のようなコミュニティはそんな考えをしている人が多い(というかそんな人しかいない)ので、「自分自身で課題解決したい」と思う人はどんどん kintone Café に遊びにきていただきたいと思います。

f:id:dsstsukky:20181207195029j:plain

※私は体調を崩して早く帰ったのでこの写真にはいません。

では、またどこかの kintone Café でお会いしましょう!

(全ての写真提供:R3 金春さん)

ノンコーディングでも草を生やしたい

3 日目の危機

Low-Code/No-Code Advent Calendar 3日目。早くも自分自身で 2 回めの記事を書かなければいけない事態になりました。 かわいそうに思う方は参加お願いします。

qiita.com

ネタに困っていたところ、週末に参加してきた Mashup Awards 2nd STAGE ならびに FESTA で発表、受賞されていた作品で「Pixala」というサービスがとても面白かったので、これを使ってみたいと思います。

pixe.la

Pixala の紹介

GitHub における過去一年間の活動量を示す「Contribution Graph(通称:草 or 芝生)」というものがあり、これを GitHub での Commit 以外のときにも使いたいということで作られたサービスです。

Web API として公開されており、誰でも「過去一年間の活動量を示すグラフ」の作成が簡単にできるサービスとなります。これであればコードを書くことのない(書くことのできない)私であっても、開発者のみなさんと同じように草を生やすことができそうです。

何を作るか?

「1 年間の活動を示すものって何があるかな?」と考えるまでもありませんでした。

f:id:dsstsukky:20181203002626j:plain

これです。過去 1 年間に行った鈴木愛理ちゃんのコンサートチケットですね。

これを可視化してみたいと思います。

作り方

公式の手順がとてもわかりやすくて簡単でした。

1.ユーザーの作成

curl -X POST https://pixe.la/v1/users -d '{"token":"thisissecret", "username":"harukit", "agreeTermsOfService":"yes", "notMinor":"yes"}

token はこのあとの認証で使うために任意で設定

username は名前の通りユーザー名ですね。以降の URL にこの username が使われます。

2.グラフの作成

curl -X POST https://pixe.la/v1/users/harukit/graphs -H 'X-USER-TOKEN:thisissecret' -d {"id":"airi-graph","name":"airi-counter","unit":"airimania","type":"int","color":"momiji"}

X-USER-TOKEN ヘッダに 1 で作成した token を指定

id は このグラフに設定する一意の ID

name はこのグラフの名前。ここでは airi-counter としました

unit は単位ですね。ここでは airimania(あいりまにあ)としました

color はいくつかの中から選べるのですが、愛理ちゃんのメンバーカラーであるピンクに近くなるように momiji を選択しました

3.グラフの確認

ちゃんとグラフができているか確認しましょう。

URL は

https://pixe.la/v1/users/harukit/graphs/airi-graph

です。

f:id:dsstsukky:20181203003700p:plain

どうやらちゃんと作成されているようです。

4.データの登録

あとはひたすらデータを登録していきます。

curl -X POST https://pixe.la/v1/users/harukit/graphs/airi-graph -H 'X-USER-TOKEN:thisissecret' -d '{"date":"20180327","quantity":"8"}

quantity は直訳すると「量」です。開発された方に聞いたところ、GitHub と同様の仕組みとなっていてこの値に応じて色が変わるそうです。私の場合にはそのコンサートの満足度を 10 点満点で評価して値を入れることにしました。コンサートごとに座席が良かったりセトリが良かったりで満足度が違うので、あとでグラフを見た時にわかりやすいように独自のアルゴリズムでコンサートごとに満足度の点数を決めてそれを quantity として入れました。

5.完成

以上で完成です。こちらがわたしの「あいりまにあ度」を示すグラフです。

f:id:dsstsukky:20181203011432p:plain

一番赤く染まっているところは最前列が取れた日やバースデーイベントでセトリが特別だった日です。

終わりに

このように Pixela を使うとこんなくだらないことでも草を生やすことができました。

あとは公式でも紹介されているように、私が 1 日目で紹介した iPhone の「ショートカット」機能を使うと簡単に API を叩けるので、毎回 Curl コマンドを呼ぶ必要もありません。

qiita.com

コンサートだけだとあまり活動していないように見えてしまうので、あとは自宅で Blu-ray や DVD 鑑賞した日、カラオケに行った日などをカウントして来年は真っ赤なグラフを作りたいと思います。

AWS IoT エンタープライズボタン トリガーを作ってみた(Low - Code)

ついに発売されました AWS IoT エンタープライズボタン

ワンプッシュでお気に入りの商品を簡単に注文できるということで話題になった Amazon Dash を汎用的に使えるようにしたものです。 仕組みとしては、ボタンを押したら Lambda 関数が呼ばれるという非常にシンプルなものですが様々な用途が想定できると思います。

f:id:dsstsukky:20180518090512j:plain:w350

やりたいこと

私がこのボタンを使って実現したいのは「ボタンを押したら、DataSpider のスクリプト(連携処理)が呼び出される」という仕組みです。

DataSpider にはトリガーという「スクリプトを自動起動する」ための機構があり、代表的なものに

  • スケジュールトリガー (定時実行、インターバル実行)
  • HTTP トリガー    (HTTP アクセスがあった際に実行)
  • ScriptRunner     (exe ファイルを叩いて実行)

などがあります。

ただし、これらの機能は「Web 画面を作る必要がある(HTTP トリガー)」「バッチファイルなどで起動する必要がある(Scriptrunner)」などお手軽では無く(とは言っても、それほど手間でもありませんが)、「スクリプトを簡単に実行する仕組みが欲しい」と思うこともあります。

そこで今回 AWS IoT エンタープライズボタン の発売を見てひと目で「おっ、これは DataSpider のスクリプト起動に使えそうだ!」と思い、早速試してみました。

実現イメージ

ボタンが押されたら Lambda 関数が呼ばれ、Lambda から DataSpider の HTTP トリガーを呼び出します。 DataSpider のスクリプトはなんでも良いのですが、動いた結果をわかりやすくするために kintone に現在日時とメッセージを書き込む処理にしました。

f:id:dsstsukky:20180519083823j:plain

手順

大枠の流れは以下の通りです。

  1. AWS IoT エンタープライズ ボタンの購入
  2. kintone アプリの作成
  3. DataSpider スクリプトの作成
  4. AWS Lambda の設定
  5. AWS IoT エンタープライズ ボタンの設定(スマホアプリ)

では順を追って説明します。

AWS IoT エンタープライズ ボタンの購入

こちらから 2,500円で購入できます。Prime 会員であっても届くまで 半日~1 日はかかるので、その間に他の作業をしましょう。

kintone アプリの作成

あまりにシンプルすぎて説明も要らないぐらいですが、kintone アプリは「文字列(1行)」を 1 つ置くだけです。

f:id:dsstsukky:20180519084009j:plain:w500

DataSpider スクリプトの作成

作成する処理は、現在日時 + "特定のメッセージ" を kintone に追加するというシンプルなもので、設定内容は以下の通りです。

f:id:dsstsukky:20180519094017j:plain

f:id:dsstsukky:20180519093913j:plain

また、作った処理は Lambda から HTTP で呼び出すので、HTTP トリガーの設定をしておきます。 ここで表示されている(黒塗りされている)URL を Lambda で呼び出します。

f:id:dsstsukky:20180519094106j:plain

AWS Lambda の設定

ノンコーディング芸人を志す私にとって、一番の壁がここです。 Lambda は Node.js や Phython でコードを書く必要がありますが、私はコードは一切書けません(キリッ)。

ただ、やりたいのは特定の URL (HTTPトリガー)を呼び出すだけの簡単な処理なので、Qiita を漁ったらサクッと見つかりました。 ↓ありがとうございます。 qiita.com

こちらを参考に以下のようにしました。 コードの意味はサッパリわかりませんが、HTTP を Get している雰囲気が感じられますし、動いたので問題ないのでしょう。

exports.handler = function(event, context) {
    console.log('value1 = ' + event.key1);
    http.get("https://xxx.xxx.xxx/", function(res) {
        console.log("Got response: " + res.statusCode);
        res.on("data", function(chunk) {
            context.done(null, chunk);
        });
    }).on('error', function(e) {
        context.done('error', e);
    });
};

ということで、コピペとは言えほんの少しだけコードを書いてしまったので、今回はローコード(Low - Code) での実現となります。

AWS IoT エンタープライズ ボタンの設定(スマホアプリ)

そうこうしているうちに、AWS IoT エンタープライズボタンが家に届きました。App Store で「AWS IOT」と検索すると専用アプリが見つかりますので、そちらをダウンロードして設定をしていきます。

f:id:dsstsukky:20180519095248j:plain

設定自体は簡単で、端末のバーコードを読み取って Wi-Fi の設定を行うと端末(ボタン)とアプリの紐付けができます。

f:id:dsstsukky:20180519092545p:plain

あとは、アプリ上で端末にプロジェクトというものを割り当てて行くとあっという間にボタンを押すと指定した Lambda 関数を呼べるようになります。1 プロジェクト = 1 Lambda 関数 になっているので、使い方としては複数のプロジェクトを作成しておいて、適宜プロジェクトを切り替えてボタンを押す、という理解をしました(違ったらごめんなさい)。

アプリの設定は数分で終わりました。最後にデバイスを「有効」にするのをお忘れなく。

f:id:dsstsukky:20180519093038p:plain

では、実際に動かしてみましょう。(ポチッ)

f:id:dsstsukky:20180519094324j:plain

このように kintone にしっかりレコードが保存されましたね。

また、今回は Lambda 関数を呼ぶ設定にしましたが、設定で「Send EMail」と「Send SMS」も用意されているので、メールや SMS を送るだけなら Lambda を使用しなくても良いのでより簡単です。

最後に

この内容を情シスの人に話したら「ぜひ使ってみたい!」ということだったので、うちの社内の実業務で使われる日も遠くないかもしれません。 また、AWS IoT エンタープライズボタン は 複数タップや長押しで処理を変えることができないため、アプリでプロジェクトを変更しない限り、1 つの処理しかできません。

この解決策を考えてみたのでまた次回(やろうと思ってることが実現できたら)。

追記(2018/5/20)

詳しい方がコメントくださり、Lambda 側の記載を変えることで複数タップや長押しを検出して処理を変えることができるそうです。誤った情報失礼しました。

新しいサービスを試したつもりが、新しくなくなってしまった・・・

※この記事は 3 月末に書きかけてそのまま放置していたため、とても鮮度が薄れていることをご了承ください。

先日、自分の身の回りで大きな発表が 2 つありました。 1 つは DataSpider の Tegaki アダプタ(Labs版)、もう 1 つは gusuku Customine (プレビューリリース) です。

どちらも正式な製品化、サービス化の前段階ですがとても面白いものだと思います。

Tegaki アダプタリリースに合わせて Tegaki + kintone の環境を作っていて、 ちょうど「あったら便利だな!」と思う機能を gusuku Customine でカバーできそうだったので紹介させていただきます。

データ連携プラットフォーム「DataSpider」、AI による手書き帳票の読み取りクラウドサービス「Tegaki」をGUI のみで活用できる接続アダプタを開発

アールスリー、サイボウズkintoneのカスタマイズをブラウザだけで実現する「gusuku Customine」のプレビューを開始 | アールスリーインスティテュート

Tegaki とは

Cogent Labs 様が提供するサービスで、手書き帳票に書かれた文字を AI(人工知能)により高精度にテキストデータ化することが可能です。 Tegaki は REST API として提供されており、予め定義したフォーマットと画像ファイルを HTTP で送信すると、結果として読み取った文字列と信頼度を返してくれます。

www.tegaki.ai

gusuku Customine とは

kintone の画面周りのカスタマイズを、ロジックの組み立てだけでプログラミングを行わずに実現することが出来ます。 このサービスによって kintone 界隈での SI ビジネスに変革をもたらすと言われ、世の中を震撼させています。

gusuku Customine(カスタマイン) - kintone のカスタマイズをプログラミング無しで簡単に

Tegaki + kintone で実現したいこと

Tegaki を使って、画像内に含まれる手書き文字を読み取ります。Tegaki はかなり高精度の OCR 処理が可能ですが、100% の認識率ではありません。 そのため、読み取った内容はそのままシステムに投入するのではなく、一旦読み取った文字の確認を行って問題が無いデータをシステムに投入したいと思います。 この「読み取った文字の確認・修正」(ベリファイってやつですね)を行うためのインタフェースとして簡単にアプリ作成ができる kintone を使います。

作業の流れ

i . 読み取りたい画像の元データ(空っぽのデータ)を Tegaki Editor で編集し、フォーマット定義を保存します(json形式)。

f:id:dsstsukky:20180405124551j:plain

ii.Tegaki アダプタを使って、1で作成した json フォーマットと読み取りたい画像を Tegaki の API に送信します。

f:id:dsstsukky:20180405124941j:plain

iii.Tegaki API から戻ってきた文字列、信頼度を kintone アプリに格納します。

f:id:dsstsukky:20180405130646j:plain

以上の設定により

f:id:dsstsukky:20180405135803j:plain

このように kintone アプリに読み取った文字列と信頼度が格納されてます。

あとは、元画像と格納されたデータを見比べて読み取った文字列の修正を行います。 これだけでも大量の紙文書を電子化するためにとても役に立つと思いますがもう少しラクをしたいと思います。

gusuku Customine で補完

上記のように読み取った文字列、信頼度が kintone のレコードして格納されました。 このうち、信頼度が 95% を越えるものは「修正の必要なし」と判断したいと思います。 一方で、信頼度が 95% を下回るものは目視でのチェックを行った上で、問題がないデータのみをシステムに投入する流れにしたいと思います。

そのため、gusuku Customine ではこんな設定をしたいと思います。

f:id:dsstsukky:20180405132804j:plain

これによって Tegaki で OCR 処理を行った結果で信頼度が 0.9 未満のレコード・フィールドが赤で表示されるため、 色のついたフィールド(読み取り誤りの可能性が高いフィールド)を特に気をつけて修正作業を行うことができます。

kintone の画面イメージ

f:id:dsstsukky:20180405141809j:plain

あとは、最後に修正が終わったことを示すようなチェックボックス(ラジオボタン)を作っておいてWebhook で通知すれば、修正が完了したものを他システム(基幹システムとか CRM とか)に投入することができると思います。

全体の流れ

こんな形になりました。

f:id:dsstsukky:20180512173308j:plain

皆さんに伝えたいこと

手書き文書を電子化したい業務ってたくさんあると思います。 それをコーディングゼロで実現できる DataSpider + Tegaki + kintone + gusuku Customine って素晴らしくないですか???

リリースから 1 ヶ月以上経って鮮度が薄れてしまったので公開を止めようと思いましたが、IT Week でかなり反響が大きかったので公開することにしました。 少しでも皆さんのお役に立てれば幸いです。