LinkDataを使って常に情報が新しいAlexa向けゴミ収集日アプリを作る

この記事は、[Ateam Brides Inc. Advent Calendar 2019](https://qiita.com/advent-calendar/2019/a-t-brides)の15日目の記事です。
##はじめに
はじめまして、エイチーム内定者の@Shuniです！
エイチームには非エンジニアとして就職をしますが、文系出身の私がこれまで趣味として取り組んできた内容についてシェアさせていただきます。

**入社前の内定者（しかも非エンジニア）なのに、快くAdvent Calendarに参加する機会をくださった[エイチームブライズ](https://brides.a-tm.co.jp/)の皆様に感謝致します。**:gift:
どうぞ宜しくお願いします！！！

###オープンデータとは？
今回のアプリ開発の際、コンテンツ用のデータとして愛知県一宮市のゴミ分別に関するオープンデータを活用しました。
オープンデータ とは、自治体が公表するデータで以下の条件を満たしたものとされています。

>- 営利目的、非営利目的を問わず二次利用可能なルールが適用されたもの
- csvやJSON形式など、機械判読に適したもの
- 無償で利用できるもの

個人・企業問わず誰でも商用できるデータ（しかも信頼性高い）は非常に重宝しますよね:thumbsup:

###LinkDataとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319121/abba51a2-dd0d-e03c-1779-4a0765395771.png)
今回使う[LinkData](http://linkdata.org/home)はオープンデータのための共有プラットフォームです。

普通オープンデータってそれぞれの自治体の公式サイトで公開されていますが、そこに直リンクしてデータを取得することって諸々問題ありますので、とっても有用なサイトだと思います。
LinkDataのAPIを用いれば、お目当てのデータをCSVやJSONといった形式で取得することができます。

##従来のオープンデータを活用したアプリの問題点
###データが陳腐化する
アプリ開発の際に使用した中身のデータが古くなってしまい、ユーザに不便をおかけするということは往々にして発生します。（オープンデータじゃなくても）


**Alexaに聞いて、今日がアルミ缶回収の日だと思っていたら
そのデータが古く、実際は燃えるゴミの日でした！**:frowning2:

オープンデータって信頼性が高いデータなんですけど、そういった問題をはらんでいます。
現状のオープンデータを活用したアプリの殆どがそうした問題点を抱えていると思います。

###LinkDataなら情報が常に新しい

その点、LinkDataなら常に新しい情報が自治体からアップロードされていますので、APIを用いるだけで最新のデータが手に入れられます。

##アプリの概要
![alexa01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319121/7029b2ab-5d0c-1f9e-f169-63e631c053d0.png)


Alexaのアプリ開発に関する詳しい解説は他のQiita記事に譲って、LinkDataからのデータの取得方法と注意点だけ解説します。

###LinkDataのデータ取得用のAPIを使う
LinkDataのデータセット一覧ページより、お目当てのデータをCSVやJSON、xmlといった形式で取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319121/15dbedd0-ce61-0ea0-617a-120e5d406767.png)

今回は、Alexaアプリに紐づいたLambdaからAPIを直接呼び出すのではなく、データを一旦S3に保存して用います。
S3への保存は、cronのようなLambdaの定期実行機能を用いて、バックアップすることとします。

理由としては、LinkDataのAPIの応答時間が非常に長く、不安定なためです。
Alexaは対話型端末のため、スピード命です。
Lambdaからの応答が7秒を超えると自動でタイムアウトしてしまいます。。


以下のQiita記事で詳しく解説されています。
▼[AWS lambdaファンクションを定期的に実行する](https://qiita.com/Toshinori_Hayashi/items/5b0a72dc64ced91717c0)
▼[AWS lambdaを使ってS3にファイルを簡単にアップロード・ダウンロード](https://qiita.com/tmrekk121/items/faf4bbe05af9a8199503)


###取得したゴミ分別データの例
今回は、RDFと呼ばれるデータ形式のJSONデータを取得しました。

Alexaで活用しやすいよう、ご丁寧に「ふりがな」「類語」「分別時の注意点」などが格納されています:relaxed:
ちなみに```%E3%82%A2%E3%83%AB%E3%83%9F%E7%BC%B6```は「アルミ缶」という文字列をURIとしてエンコードした文字列です。

```json:RDF/JSON
"http://linkdata.org/resource/rdf1s7805i#%E3%82%A2%E3%83%AB%E3%83%9F%E7%BC%B6" : { 
		"http://www.w3.org/2000/01/rdf-schema#label" : [ 
			{ "value" : "アルミ缶",
			  "type" : "literal",
			  "lang" : "ja" 
			}
		] , 
		"http://linkdata.org/property/rdf1s7805i#kana" : [ 
			{ "value" : "あるみかん",
			  "type" : "literal",
			  "lang" : "ja" 
			}
		] , 
		"http://linkdata.org/property/rdf1s7805i#related_word" : [ 
			{ "value" : "あきかん",
			  "type" : "literal",
			  "lang" : "ja" 
			}
		] , 
		"http://linkdata.org/property/rdf1s7805i#category" : [ 
			{ "value" : "空き缶・金属類",
			  "type" : "literal",
			  "lang" : "ja" 
			}
		] , 
		"http://linkdata.org/property/rdf1s7805i#description" : [ 
			{ "value" : "中を軽く水洗いしてください。",
			  "type" : "literal",
			  "lang" : "ja" 
			}
		]
```

###Alexaスキル内で使用する
Alexaスキル内で、以下のようにしてデータ（アルミ缶の分別方法データ）を取得します。
データはS3に格納されていますので、LinkDataから直接呼び出すよりはスムーズですね。

その他のコードは、GitHubに置いておきます。


```javascript:index.js
function getDescription(item_name){  //item_nameには"アルミ缶"が入ります。
    var static_url = "http://linkdata.org/resource/rdf1s7805i#";
    var orgstr = encodeURI(item_name);//アルミ缶をURIとしてエンコードされた文字列を受け取る
    var url = static_url + orgstr; 
    var url_setsumei = "http://linkdata.org/property/rdf1s7805i#description";

    if(json_obj[url][url_setsumei] != null || json_obj[url][url_setsumei] != undefined){
        //json_objの中には前項のJSONデータが格納されています
        return json_obj[url][url_setsumei][0]["value"]; //"中を軽く水洗いしてください。
    }else{
        return `${item_name}の詳細な捨て方に関するデータは見つかりませんでした`;
    }
}
```


###テスト
サクサク動作しているのが**gifから伝わる雰囲気で**お分かりいただけると思います（肝心の音が無いです:frowning2:）
みなさんもぜひ[LinkData](http://linkdata.org/home)を活用してみてください。

![S__1458212.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319121/7590d03a-c983-b6d1-08e6-c72f0ad9799f.gif)

#エイチームで働きませんか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319121/58523922-cbff-117e-4c4f-061dd4a037a8.png)
エイチームは、インターネットを使った多様な事業を展開する名古屋の総合IT企業です。
そのグループ会社である**株式会社エイチームブライズ**:wedding:では、一緒に働く仲間を募集しています！
非エンジニアでも内定者でもアドベントカレンダーに快く受け入れてくれる、**暖かいメンバーが揃っています！**

- [ハナユメ サイト開発チーム](https://jobs.qiita.com/employers/brides-a-tm/development_teams/138)
- [技術開発部](https://jobs.qiita.com/employers/brides-a-tm/development_teams/148)

上記求人をご覧いただき、少しでも興味を持っていただけた方は、まずはチャットでざっくばらんに話をしましょう。
技術的な話だけでなく、私たちが大切にしていることや、お任せしたいお仕事についてなどを詳しくお伝えいたします！

**Qiita Jobsよりメッセージお待ちしております〜〜〜！**:open_hands: