「テック系」カテゴリーアーカイブ

新・ギリシャ神話「ミダス王のシステム開発」

ビジネス界では有名?ミダスタッチ(マイダスタッチ)

つい先日、「ミダスタッチ(マイダスタッチ)」という言葉を初めて知った。

「ミダスタッチ」というのは有名なギリシャ神話の一つ。
「王様の耳はロバの耳」の中で出てくるロバの耳を持つ王様は「ミダス王」と呼ばれているが、この「ミダスタッチ(King Midas and Golden Touch)」という神話の主人公も「ミダス王」である。
つまり、ロバの耳の王様と同一人物である。

ミダスタッチは「ミダス王がタッチ(接触・触れる)する」ことに神話名は由来する。

そして、この「ミダスタッチ」という言葉は、海外でのビジネスの場や投資家などでは時折耳にする有名な言葉らしい。
錬金術」というような意味合いで。
(私は知らなかった。)

初めにこのミダスタッチ神話を読んだ感想は、
「ふーん、まぁよくある神話。昔話あるあるだよね。」くらいに思ったのだが、
もう一度読んでみると「システム開発」や「サービス開発」について重要な示唆があるのではないかと感じた。
特に、クライアント(もしくは社内の営業さん)など「非開発者」とやり取りする際に「考えてほしい逸話」もしくは「共有するとよい意識」として使えそうだと思った。

なので、是非共有したく。

ということで、このギリシャ神話がどういう神話なのかまずは原典をサラッと流してみる。
(端折ったり意訳もあり。)

ギリシャ神話「ミダスタッチ」

昔々、あるところに「ディオニュソス(バッカス)」という神様がいた。

ある日、ディオニュソスの「師匠」が困っていたところを、ミダス王が助ける。
ディオニュソスは、師匠を助けてくれたお礼にどんな願いも一つ叶えようと申し出る。

そこで、ミダス王は「触るものをすべて黄金に変える力が欲しい」と言う。

ディオニュソスは少し戸惑ったが、ミダス王の願いを叶えることにした。
そして、ミダス王は「ミダスタッチ」と呼ばれる「触れるものすべてを黄金に変える力」を手に入れる。

この素晴らしい力を手に入れたミダス王は早速この力を試してみたくなる。

まずは、目の前の木の枝を触ってみる。
すると、木の枝が黄金に変わった!
木にリンゴの実が成っていたので、リンゴをもぎ取ってみる。
すると、リンゴが黄金に変わった!
素晴らしい力を手に入れたミダス王。

強力な力を手に入れて大喜びな王様は、早速お城に帰り「今宵は大宴会だ!」と言い盛大な祝賀会を行う。

ミダス王は嬉々として、最高級の食事を用意させ、まずはパンを食べようとする。
しかし、パンに触れると・・・パンが黄金に変わった。
なるほど、手で触れてしまってはすべてが黄金に変わるので、今度はおいしそうなチキンを手を使わずに口だけで食べようとする。
すると、ミダス王の唇に触れたチキンは黄金に変わる。
ミダス王は、せめて喉を潤したいと思い、ワインを飲もうとする。
しかし、ワインも口に含んだとたんに黄金に変わる。

「触るものすべてを黄金に変える」という「すごい力」を手に入れたにもかかわらず、
文字通り「すべてのものが黄金に変わって」しまい、ミダス王は飲み食いすらできず衰弱していく。

飢餓に耐えかねたミダス王は、ディオニュソスにもう一度お願いをする。
「触るものすべてを黄金に変えるこの力を消してくれ」と。
ディオニュソスは、「分かった。ならば、ある川に行き身を清めよ。川の水が能力を洗い流してくれる。」と。

ミダス王はディオニュソスの指示通りの川に行き身を清め、ようやく黄金の力を取り去ることができた。

以上、ミダスタッチの物語。
その後、神話は「王様の耳はロバの耳」物語へとつながっていくのだけど、それは割愛。

ミダスタッチの意味するところ

この神話からどのような教訓を感じ取るか?

おそらく、一般的な教訓としては

人間の欲望には際限がなく、そして際限のない欲望は身を亡ぼす。

ということだろうと思う。(私の第一印象)

神話や昔話では、非常によくある教訓である。

ただ、よく読んでみると、IT技術者(エンジニア)の私はこの「ミダスタッチ」はシステム開発やサービス開発などにおいて非常に重要な示唆を含んでいるのではないかと思った。

そこで、ミダスタッチ神話をシステム開発あるあるにアレンジしてみた。

ミダスタッチ・システム開発あるあるver

ある日、クライアント(ミダス)が言った。
触るものすべてを黄金に変える機能(ミダスタッチ)が欲しい」と。

エンジニア「可能です。ですが、もっと時間をかけて丁寧に要件・仕様を詰める必要があります。」
クライアント「なんでそんなに細かいところまでいちいち詰めなきゃいけないんだ、私が欲しいのはミダスタッチだけ。」
エンジニア「できます。が、基本機能だけでは、きっと色々と困ること(例外など)も出てきます。」
クライアント「単にミダスタッチが欲しいだけ。例外のために丁寧に要件を詰めていくなんて煩わしい。一刻もはやくミダスタッチを。」

かくして、エンジニアはクライアントの意向に従い「触るものすべてを黄金に変える機能」を開発した。
エンジニアがシステムを納品すると、クライアントは大喜び。

そして、クライアントは早速機能を試す。

クライアント「すばらしい!木の枝が黄金に変わった。これだこれが欲しかったんだ!」
クライアントは、大喜びで次々とミダスタッチを試す。

しかし・・・。

クライアント「ちょっと待て、なんでパンが食べたいだけなのに、パンが黄金になるんだ!『食べ物』が黄金に変化するのは大問題だからすぐに修正して!」
エンジニア「いや、触るもの『すべて』を黄金に変える機能なので当然ですが・・・」
クライアント「ちょっと待て、なんでチキンが唇に触れただけで黄金になるんだ!?私が求めているのは『手で触れた場合だけ』。手以外に触れた場合は黄金にならないようにすぐに直して!」
エンジニア「いや、『触れる』という要件定義しかしていないので・・・。」
クライアント「ちょっと待て、なんでワインという『液体』まで黄金になるんだ!液体まで黄金にして欲しいとは頼んでいない!
エンジニア「いや、『触れるものすべて』という要件に沿って開発したので当然なのですが・・・。要望通りのものです。もし、細かい例外を設けたいのであれば、しっかりと仕様を詰める必要がありまして。」
クライアント「ええーい、煩わしい。そんなのはお前が自分で考えて『いい感じ』に決めて。」
エンジニア「その『いい感じ』にするために、丁寧に仕様を詰める必要がありまして。そのためには私の考えだけでなくクライアントさんの考えが必要で・・・」

クライアント「ミダスタッチ全然使えねー。せっかくコストかけて作ったのに!」

ミダスタッチが共有されたら

私個人的には、昔このような状況になることも多少経験しているが、今は幸いにして当たることがなくなって久しい。
(自分の身の回りの理解あるクライアントさんには感謝しかない。)
もしかすると、エンジニア側にもクライアント側にも「きちんと対話していくことの大切さ」「システム開発は一方的なオーダーではなく、一緒に作るもの」という感覚が徐々に広がってきているおかげかもしれない。
(個人的にも強く対話を求めるが・・・)

が、自分自身は経験しなくなったとはいえ、おそらく世の中にこういったやり取りはまだまだたくさん存在しているのではないかと思う。
(ですよね?)

そういった場合、このミダスタッチのギリシャ神話についてクライアントさん(もしくは自社の営業さん)に話してみてはどうだろうか。

パンは黄金に変えますか?
唇に触れたら黄金にしますか?
ワインも黄金にしますか?
「触るものすべてを黄金に変える」というだけの要件では、満足いくモノは得られないかもです。

またクライアントサイドも、この逸話を思い出すことで

「本当に自分が欲しいモノ」を作るためには、しっかりとエンジニアサイドと対話し協力していく必要がある

と思えるのではないだろうか。
パンはどうしよう?ワインはどうしよう?と考えることで、きっと経営のコアバリューやサービスのUXについて深く考える良い機会やきっかけにもなるんじゃないかなと思います。
(UXデザインってそういうことですよね。)

※他にもデザイナーさんなど対話が重要なクライアントワークでは活躍する逸話かも。
(自分もミダスタッチでオーダーしているかもしれない。自戒。)

どちらサイドにしろ、

あ、それはミダスタッチかもですねー。もう少し丁寧に考えましょうか!

とお互いに言えて理解し合えると、システム開発はもっと幸せなものになり、価値あるものを生み出せるようになるのではないかなと思ったり。

少なくとも、ミダスタッチが少し共有されることで、クライアントワークが少し幸せなものになったのなら不遇なミダス王もきっと喜ぶに違いない。

このエントリーをはてなブックマークに追加

RaspberryPiでAmazonEcho(Alexa)を自作しながら筋トレ

Alexaの最新ライブラリが発表されたのに便乗して

今や音声入力インターフェースが花盛り。
アメリカさんでは一家に一台AmazonEchoなんて言われるくらい浸透してて、GoogleもGoogleHomeで追随中。
もちろん、iOSにはSiriさんがいるし、Windowsにはcortanaくんが。
そして、日本でもLINEが「WAVE(Clova)」という音声インターフェースを発表したことが話題になった。
(先行申し込みした人にはそろそろ届き始めている頃かな。)

そんなこんなで、音声入力インターフェースが「ポスト・スマホの最有力」なんて言われたりするものだから、世界中で巨人達が熾烈な争いを繰り広げている。

そんなさなか、amazonが二週間ほど前に最新のAlexa用公式ライブラリ(SDK)を発表

以前からずっとAlexaを使ってみたいと思っていたので、ちょうど良い機会だし「Amazon Echoもどき」を作ってみようかな、動かしてみたいし・・・という軽い動機にて。
「声」「音」のユーザーインターフェースの雄(英語圏で)となっているAmazon Echo(Alexa)をラズパイで自作(DIY)してみます。
(あと今後のAlexa SDKの勉強も兼ねて!)

ちなみに。
説明する必要も無いと思うけど、Amazon Echoってこれね。

でもって、最新Alexa SDKのGithubリポジトリはこちら。
https://github.com/alexa/avs-device-sdk

AVS(Alexa Voice Service)SDKリポジトリのwikiには、Amazonが最新SDK用の丁寧な”Quick Start Guide”を用意してくれているので、これをなぞるだけで、Alexaが動くよ!(らしいよ。)
なので、コマンドラインを少しでも扱える人なら誰でも簡単にラズパイでAlexaが作れちゃう。(らしいよ。)
いや、コピペするだけなので、最悪コマンドラインが分からなくても作れちゃう!(らしいよ。)

と思っていたら、結果的に「かなりの忍耐力」を要求されたことだけは先に言っておきます。
(エンジニアなら知っているはず、「道を知ることと道を行くことは全く違う(モーフィアス)」。そういうもんだよね。)

もう一度言っておきます。
「コピペ」するだけでラズパイを使ってAlexaを構築可能であることに間違いはない。
が、コンパイルの待ち時間などが超長かったりドキュメントに不備があったりで、「忍耐」が必要という覚悟を持って臨むべし。

前置きが長くなった・・・・。

さぁ、帆を上げろ!
Let’s go!!

何よりもまず、ラズパイを用意する

今回、私は手元に2年前くらいに買った「Raspberry Pi2」があったのでそれを使用します。
ただし、最新ラズパイはRaspberry Pi3で、2よりも随分と処理能力が上がっています。
なので、ラズパイ3を使うと、もしかしたら「私が苦しんだAlexa構築時間」がラズパイ2の半分くらいの時間で済むかも。
ラズパイ3 5500円前後

ラズパイ自体のセットアップ等については、過去記事参照。
Raspberry Pi 2(or 3)で楽しく格安ディスクトップPC構築

ちなみに、Alexaはマイクから音声を拾って、スピーカーを通して返事を返すので、上記説明とは別にラズパイに繋げる①マイクと②スピーカーは必須です。
私は、マイクとスピーカーをamaoznで激安で購入。(ちゃんと動いたよ)
あとインターネットにも繋がる必要があるので、有線LANケーブルかUSBのWifiを用意。
(ラズパイ3だと、WiFiが標準装備なのでWiFi子機は不要だね。)

Alexa(AVS)動作までのステップを確認しておこう

Alexaを構築作業に着手する前に、構築のステップを大まかに把握ね。

  1. 手持ちのラズパイをAmazon Developerに登録する(オンライン)
  2. Alexa SDKを動かすために必要なライブラリをインストールする。(これが時間かかる)
  3. Alexaの実行環境が整ったら、公式サンプルをダウンロードしてきてビルドする。
  4. ビルドしたアプリを立ち上げて、マイクに向かって”Alexa!”と呼びかける。(すると、奇跡が・・・)

ラズパイをAmazon Developerに登録する

(以下の登録は、ラズパイでやってもいいし、PCで作業してもOK。私は普段使っているMacでやりました。)

まずは、Amazon Developerにアクセスし、ログインする(アカウントが無い人はアカウントを作ってログイン)。
https://developer.amazon.com/

Amazon Developerにログインしたら”Alexa”タブを選択して、”Alexa Voice Service”で”Get Started“!!

次に、画面右上の”CREATE PRODUCT“を選択。

これ、全部スクショとってたらアップしてたら記事がめっちゃ読みづらくなりそう・・・。
あと、スクショ撮っても画面やUIって頻繁に更新されてすぐに参考にならなくなるしね、できるだけ文字で解説します。

上記”CREATE PRODUCT”をクリックすると入力フォームが出てくるので、各項目を解説しておきます。

  1. “Product Name”- 任意のプロダクト名を入力
  2. “Product ID”- 任意のプロダクトIDを入力
  3. “Is your product an app or a device?”- “Device”を選択
  4. “Product category”- “Other”を選択。”Rapsberry Pi Project on GitHub”と入力。(って公式ドキュメントに書いている)
  5. “Brief product description”- プロダクトの簡単な説明。(”My first Pi project.”とか入力。)
  6. “How will end users interact with your product?”- “Touch-initiated”と”Hands-free”を選択。
  7. “Upload an image”- プロダクトのアイコンね。私はスルーしました。(公式もスキップしてもOKって書いている)
  8. “Do you intend to distribute this product commercially?”- “No”選択。
  9. “Is this a children’s product or is it otherwise directed to children younger than 13 years old?”- “No”選択。

フォームを埋めたら”NEXT“ボタンを押して次へ。

セキュリティー設定を行う。
CREATE NEW PROFILE“をクリック。

セキュリティー設定のフォーム入力項目はこれだけ。

  1. “Security Profile Name”- プロファイルの名前を入力。(ex.Alexa Voice Service Sample App Security Profile)
  2. “Security Profile Description”- プロファイルの説明。(ex.Alexa Voice Service Sample App Security Profile)

“NEXT”を押すと”Client ID“と”Client Secret“の二つが生成されてます。

で、”Client ID”と”Client Secret”の下に
“Allowed Origins”と”Allowed Return URLs”の入力項目が現れるので、それぞれに
“http://localhost:3000″、”http://localhost:3000/authresponse”と入力して”UPDATE”。

ちなみに、最後に入力したURL二つは、ラズパイでAlexaSDKをインストールした後に、認証するために必要になります。

これで、プロダクト登録完了!!
この後、”Client ID“、”Client Secret“、”Product ID“などはラズパイの設定ファイルに書き込むことになります。

ほい!ではAVS-SDKの必須ライブラリインストール

もうすでにぐったりしている人もいるかもしれないが、ぐったりするのはこれからだから。
とはいえ、この先、コピペで行けるから気は楽に。
Take It Easy.

ということで、ここからは、ラズパイのコマンドラインを立ち上げてひたすらコピペ。
本当にコピペだけでAlexaのサンプルアプリ動作まで行けてしまうんだけど、先に述べたように「忍耐力」は必要だからね。
(あと、公式ドキュメントだけだとハマった部分もあったんだけど、ハマらないようにガイドします。)

では、行きましょう!

1.まずはラズパイに作業フォルダと環境変数を設定

定番ですが。
Linuxのパッケージ管理システムも使うので、まずはapt-get update!


$ sudo apt-get update

環境変数等設定。


$ echo "export SOURCE_FOLDER=$HOME/sources" >> $HOME/.bash_aliases
$ echo "export LOCAL_BUILD=$HOME/local-builds" >> $HOME/.bash_aliases
$ echo "export LD_LIBRARY_PATH=$HOME/local-builds/lib:$LD_LIBRARY_PATH" >> $HOME/.bash_aliases
$ echo "export PATH=$HOME/local-builds/bin:$PATH" >> $HOME/.bash_aliases
$ echo "export PKG_CONFIG_PATH=$HOME/local-builds/lib/pkgconfig:$PKG_CONFIG_PATH" >> $HOME/.bash_aliases
$ source $HOME/.bashrc
$ mkdir $SOURCE_FOLDER

2.Buildツール類をインストール

apt-getだけでなく、ソースからmake(コンパイル)しないといけないライブラリ類もあるので。


$ sudo apt-get install git gcc cmake build-essential

3.ネットワーク系ライブラリ

OpenSSL/HTTP2/libcurlをインストール

・http2 ダウンロード&インストール


$ cd $SOURCE_FOLDER
$ wget https://github.com/nghttp2/nghttp2/releases/download/v1.0.0/nghttp2-1.0.0.tar.gz
$ tar xzf nghttp2-1.0.0.tar.gz
$ cd $SOURCE_FOLDER/*nghttp2*/
$ ./configure --prefix=$LOCAL_BUILD --disable-app
$ make -j3
$ sudo make install


この辺りはまあまあ余裕。

・openssl ダウンロード&インストール


$ cd $SOURCE_FOLDER
$ wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2a.tar.gz
$ tar xzf openssl-1.0.2a.tar.gz
$ cd *openssl*/
$ ./config --prefix=$LOCAL_BUILD --openssldir=$LOCAL_BUILD shared
$ make -j3
$ sudo make install


このあたりからいきなりコンパイル時間が長い!
ぶっちゃけ、腹筋30回(インターバル30秒)×3セットやっても、全然時間が余ったので、25kgのハンドグリップをニギニギしつつ待つ。
長すぎて握力死んだ。

・libcurl ダウンロード&インストール


$ cd $SOURCE_FOLDER
$ wget https://curl.haxx.se/download/curl-7.50.2.tar.gz
$ tar xzf curl-7.50.2.tar.gz
$ cd *curl*/
$ ./configure --with-ssl=$LOCAL_BUILD --with-nghttp2=$LOCAL_BUILD --prefix=$LOCAL_BUILD
$ make -j3
$ sudo make install


プッシュアップバーを使った腕立て深めで10回×3セットでは時間が余りまくったので、水曜日のダウンタウンみてた。

4.データベース系

・sqlite インストール


$ sudo apt-get install sqlite3 libsqlite3-dev


apt-getが癒し。
やっぱりサクッとインストールできるね。

5.マルチメディア系

マルチメディア系ライブラリのgstreamerをインストールする前に、依存関係のライブラリをインストール


$ sudo apt-get install bison flex libglib2.0-dev libasound2-dev pulseaudio libpulse-dev
$ sudo apt-get install libfaad-dev libsoup2.4-dev libgcrypt20-dev

・gstreamer-1.10.4 ダウンロード&インストール


$ cd $SOURCE_FOLDER
$ wget https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.10.4.tar.xz
$ tar xf gstreamer-1.10.4.tar.xz
$ cd *gstreamer*/
$ ./configure --prefix=$LOCAL_BUILD
$ make -j3
$ sudo make install


まだまだ続くよ。
ぶっちゃけ、夜から構築作業し始めたから、make放置して寝ようかと思った。

・gst-plugins-base-1.10.4 ダウンロード&インストール


$ cd $SOURCE_FOLDER
$ wget https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-1.10.4.tar.xz
$ tar xf gst-plugins-base-1.10.4.tar.xz
$ cd *gst-plugins-base*/
$ ./configure --prefix=$LOCAL_BUILD
$ make -j3
$ sudo make install


ここらあたりになってくると、なんのライブラリを入れているのかよくわからない。

・gst-libav-1.10.4 ダウンロード&インストール


$ cd $SOURCE_FOLDER
$ wget https://gstreamer.freedesktop.org/src/gst-libav/gst-libav-1.10.4.tar.xz
$ tar xf gst-libav-1.10.4.tar.xz
$ cd *gst-libav*/
$ ./configure --prefix=$LOCAL_BUILD
$ make -j3
$ sudo make install


記憶が定かではないが、確かこの辺りでお風呂に入ったけど、出てきてもまだmake終わってなかった。

・gst-plugins-good-1.10.4 ダウンロード&インストール


$ cd $SOURCE_FOLDER
$ wget https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.10.4.tar.xz
$ tar xf gst-plugins-good-1.10.4.tar.xz
$ cd *gst-plugins-good*/
$ ./configure --prefix=$LOCAL_BUILD
$ make -j3
$ sudo make install


プラグインのGoodってなんやねん。

・gst-plugins-bad-1.10.4 ダウンロード&インストール


$ cd $SOURCE_FOLDER
$ wget https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.10.4.tar.xz
$ tar xf gst-plugins-bad-1.10.4.tar.xz
$ cd *gst-plugins-bad*/
$ ./configure --prefix=$LOCAL_BUILD
$ make -j3
$ sudo make install


プラグインのBadってなんやねん。
待ち疲れて、make放置して寝た。
また明日〜。

6.サンプルアプリ用音声録音・再生

・portaudio ダウンロード&インストール


$ cd $SOURCE_FOLDER
$ wget http://www.portaudio.com/archives/pa_stable_v190600_20161030.tgz
$ tar xf pa_stable_v190600_20161030.tgz
$ cd *portaudio*/
$ ./configure --prefix=$LOCAL_BUILD
$ make -j3
$ sudo make install


インプットされた音声を録音したり再生したりするライブラリらしい。
なるほど、SDKでは、話しかけた音声をストリーミングで解析するのではなく、一度音声ファイルに保存して、保存したファイルを音声解析するのかな。

7.Sensory wake word engine

音声検出エンジン "Sensory"
これ結構重要なんだよね。
たとえば、Siriって、ホームボタンを押して音声入力モードにしてから話かけるわけじゃん。
音声入力インターフェースって、なんらかのトリガーで音声入力モードにすることで音声認識をスタートさせるわけだけど、Siriはホームボタン長押しがトリガー。
Alexaはその起動に物理的なボタンではなくてAlexaと呼びかける「音声」をトリガーにしている。
実はこれって結構大変で、それを担ってくれるのがSensory。
(間違ってたらごめん。)

・Sensoryの依存ライブラリインストール


$ sudo apt-get -y install libasound2-dev
$ sudo apt-get -y install libatlas-base-dev
$ sudo ldconfig


apt-getは癒し。

・Sensory ダウンロード&インストール


$ cd $SOURCE_FOLDER
$ git clone git://github.com/Sensory/alexa-rpi.git

$ bash alexa-rpi/bin/license.sh

$ cp alexa-rpi/lib/libsnsr.a $LOCAL_BUILD/lib
$ cp alexa-rpi/include/snsr.h $LOCAL_BUILD/include
$ mkdir $LOCAL_BUILD/models
$ cp alexa-rpi/models/spot-alexa-rpi-31000.snsr $LOCAL_BUILD/models


また、魔のconfigure & make。

やーっと、AVS本体のビルドー!

1.AVS Device SDK ダウンロード


$ cd $HOME
$ mkdir AVS_SDK
$ cd AVS_SDK
$ git clone git://github.com/alexa/avs-device-sdk.git
$ echo "export SDK_SRC=$HOME/AVS_SDK/avs-device-sdk" >> $HOME/.bash_aliases
$ source $HOME/.bashrc

2.Sensory, GStreamer, PortAudioとともにSDKをビルド


$ cd $HOME
$ mkdir BUILD
$ cd BUILD
$ cmake $SDK_SRC -DSENSORY_KEY_WORD_DETECTOR=ON -DSENSORY_KEY_WORD_DETECTOR_LIB_PATH=$LOCAL_BUILD/lib/libsnsr.a -DSENSORY_KEY_WORD_DETECTOR_INCLUDE_DIR=$LOCAL_BUILD/include -DGSTREAMER_MEDIA_PLAYER=ON -DPORTAUDIO=ON
-DPORTAUDIO_LIB_PATH=$LOCAL_BUILD/lib/libportaudio.a -DPORTAUDIO_INCLUDE_DIR=$LOCAL_BUILD/include -DCMAKE_PREFIX_PATH=$LOCAL_BUILD -DCMAKE_INSTALL_PREFIX=$LOCAL_BUILD

3.設定ファイルに設定を書き込む

(ここどハマりポイント)

viでもvimでもnanoでもなんでもいいですが、設定ファイルを編集します。
設定ファイルは以下のパスに。
~/BUILD/Integration/AlexaClientSDKConfig.json

ちなみに、ここは私がどハマりしたポイントです。
設定ファイルの項目に何を書き込めばいいかわからない部分がいくつかあって悩んだ。
(公式ドキュメントに書いていない。)


 {
    "authDelegate":{
        "clientSecret":"${SDK_CONFIG_CLIENT_SECRET}",
        "deviceSerialNumber":"${SDK_CONFIG_DEVICE_SERIAL_NUMBER}",
        "refreshToken":"${SDK_CONFIG_REFRESH_TOKEN}",
        "clientId":"${SDK_CONFIG_CLIENT_ID}",
        "deviceTypeId":"${SDK_CONFIG_DEVICE_TYPE_ID}"
     },

   "alertsCapabilityAgent":{
     "databaseFilePath":"${SDK_SQLITE_DATABASE_FILE_PATH}",
     "alarmSoundFilePath":"${SDK_ALARM_DEFAULT_SOUND_FILE_PATH}",
     "alarmShortSoundFilePath":"${SDK_ALARM_SHORT_SOUND_FILE_PATH}",
     "timerSoundFilePath":"${SDK_TIMER_DEFAULT_SOUND_FILE_PATH}",
     "timerShortSoundFilePath":"${SDK_TIMER_SHORT_SOUND_FILE_PATH}"
   }
 }

まず"authDelegate"内の値。

"refreshToken"は、後の認証作業で自動的に書き込まれるので今は空欄にしておいてOK。
(これは公式にそう書いていたので安心。)

"clientSecret"、"clientId"の二つは、上記ラズパイのデバイス登録したときに表示された値を書き込みます。

で、"deviceTypeId"ですが、こんな値はデバイス登録したときに与えられおらず、Amazon Developersで登録したデータをあちこち探してもそんな値はない。
"deviceTypeId"とは何なのか、さっぱりわからなかったが、登録データに載っていて考えられそうな値としては"Product ID"あたり。
ということで、"deviceTypeId"には"Product ID"の値を書き込んでおく。
(結果、これで正解。)

次に、"deviceSerialNumber"。
これが一体何なのかさっぱりわからない、Amazon Developersのデータを見ていても「それらしい」雰囲気のものすらない。
一体どんな値を設定すればいいのかさっぱりわからないので、適当に”12345678”といれたら通った
(のちに、何処かのサイトでIDはなんでもいいと書いていた。とりあえずサンプルなので。)

次に、"alertsCapabilityAgent"内の値。

"databaseFilePath"は、データベースのファイルパスなんだけど、とりあえず任意の場所でOK。
ex./home/pi/alexa/database.db
データベースがなければ、そのパス上にDBが作成されるので、ご安心を。

で、問題はその下。
"alarmSoundFilePath","alarmShortSoundFilePath","timerSoundFilePath","timerShortSoundFilePath"
これらの値の意味がわからない。

意味がわからないので、空でいいや、と全部の値を空文字に設定してコンパイルしたら以下のようなエラーがでるし。


Failed to create default SDK client!

(SampleApp:12043): GStreamer-CRITICAL **: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed
2017-08-25 06:15:24.808 [  2] E MediaPlayer:doStopFailed:reason=gstElementGetStateFailed

つまり、上記4つの値は空にはできないと思い、公式githubのissueを手当たり次第に当たっていたら、アラームとタイマー用の音声ファイルを設定しないといけないってことが判明。

https://developer.amazon.com/public/solutions/alexa/alexa-voice-service/content/alexa-voice-service-ux-design-guidelines

ここからタイマーとアラームの4つの音声をラズパイ上の任意の場所にダウンロード。
でもって、4つのファイルパスを上記の設定ファイルに書き込む。

これで、設定ファイルの編集は完了!

4.いよいよAVS-SDKのインストール


$ cd $HOME/BUILD
$ make -j3
$ make install


またこのmakeが長い。

5.SDKの認証


python AuthServer/AuthServer.py

上記コマンドで、ラズパイ内にWEBサーバーが立ち上がる。
その後、ラズパイのWEBブラウザを立ち上げて、http://localhost:3000 にアクセスする。

すると、ページがリダイレクトされて、Amazonの認証ページに進むので

認証ボタンを押す。

認証に成功すると以下のような画面が現れて、先ほどの設定ファイルに"refreshToken"が自動的に書き込まれる。

祝!Alexaインストール完了!

ということで、こんな感じでDIY Alexa誕生。
(ちょっとブサイクなAlexaだけど)

いよいよAlexa on RaspberryPiとお話

よし!Alexa起動!


TZ=UTC ./SampleApp ~/BUILD/Integration/AlexaClientSDKConfig.json $LOCAL_BUILD/models

Alexaのコマンドが表示されAlexaがスタートした!

早速、Alexaに話しかけてみる。

私:"Alexa!"
A:"Yes"
私:"How are you?"
A:"Great! Ready to help."

私:(よし!やったー!うまくいったどー!)

いやー、ラズパイちゃんにAlexaさんが載って、ちゃんとお返事してくれています!

難しいことはしていないけど非常に時間がかかっただけに、Alexaさんの反応を聞けて嬉しい限り。

ま、ここまではね。

・・・・・・。

ええ、ここまではね。

この先、話しかけるとなぜかアプリが落ちる。

"hello!"と、挨拶のやりとりまではいいんだけど、その後"What's the weather in Kyoto now?"とか、Alexaさんと別の会話をしようとすると一気に機嫌を損ねてしまうようで。
急にブチ切れて、落ちちゃう。

う〜ん・・・。

公式のGithubにもissueが結構溜まってきてるし、Sampleアプリの不具合なのか、私の設定がどこかでミスっているのか・・・。

とりあえず、今回は一旦この辺りにしておいて、近いうちに修正していきます。

おまけ(費用のお話)

昔買ったラズパイを使いまわしているので、現在の価格と相違があるかもしれませんが、予算的なことを。
ちなみに、ラズパイ本体以外は、全部格安のもので揃えました。

  • RaspberryPi 2 Model B 5140円 (2年以上前の2015年に購入)
  • SDカード 360円
  • USBマイク 790円
  • USBスピーカー 1290円
  • WiFi 1000円

合計 8580円

※今回はリモートディスクトップ(VNC)を使ってラズパイを操作したので、モニター等は使っていません。
ということで、9000円以内であなたもAlexaをDIYできちゃいます!(^^)

すっげー!!

ただし、ebayとかだと、本体4000円+送料3000円くらいで正規のAmazon Echo(Dot)が買えるんだけどね(^^)
orz

このエントリーをはてなブックマークに追加

Raspberry Pi 2(or 3)で楽しく格安ディスクトップPC構築

image

大人気マイコンボード「ラズベリー・パイ」の新型モデル「Raspberry Pi 2 Model B」で格安でディスクトップPCを構築してみる。
(100円均一などをフル活用しつつ可能な限り格安で、笑)

※2017年7月追記
最新版はRaspberryPi 3ですが、やり方は同じです。

最近は、”IoT”(Internet Of Things)がIT業界だけでなく様々なビジネス業界では大流行り。
90年代、インターネットが単なる趣味の世界から、いつの間にかビジネスや日常生活に欠かせないインフラになったのと同じくらいか、それ以上のインパクトをビジネスや日常生活に与え、IoT技術は社会のインフラになるのも時間の問題と言われている。
なので、いろんな企業や個人がこぞって市場の研究を開始しているって感じかな。

IoT自体の話の続きは、IoT Kyotoというイベントを京都市内で毎月1回(最終週金曜日@コワーキングスペース小脇にて)、私の方で主催しています。
是非足をお運びいただければと。
→ IoT Kyoto

そんな中で、Raspberry Pi は、IoT界隈から注目を浴びているLinuxが動作するマイコンボード(windows10も乗るそうです)、このボードに色々なセンサーを取り付けて、プログミング制御したり、あれやこれやとできるわけですが。
今回は、ラズパイを初めて触るので、まず手始めに”Hello PC”を、やってみたいと思う。
(ソフトウェア開発でいうところの”Hello World”、Aurdinoなどの電子工作でいうところの”Lチカ(LEDチカチカ)“みたいなもんですな。)

ということで、早速ラズベリーパイ2(通称ラズパイ2)で、ハロー!ディスクトップPCをやってみたのでまとめ。(初心者・入門者向け)

必要なもの一覧

  1. Raspberry Pi 2 Model B(ラズパイの本体)
  2. モニター(液晶ディスプレイなど)
  3. キーボード
  4. マウス
  5. microSDカード8G以上
  6. HDMIケーブル
  7. ラズパイへの給電ケーブル
  8. LANケーブル(インターネット接続したい場合のみ)

必要なもの解説

Raspberry Pi 2 Model B 本体

image

Amazonの通販で5140円にて購入しました。(価格はマチマチですが、5000円〜6000円の間が多いですね。)
→ Raspberry Pi 2 Model B

モニター(ディスプレイ)

image

これが、本当に一番悩んだ。

液晶ディスプレイって、なんだかんだで高い。
京都の寺町(京都で唯一の電気屋街)でも、7インチ〜10インチくらいで、ラズパイにちょうどよさそうな小さなディスプレイは全然売ってなかった。(どこで聞いても、小さくてもディスプレイは15インチ以上だし、高いし・・・)

そこで、ラズパイ界隈でディスプレイとしてよく利用されているのが、HDMI入力がついている自動車用の「車載モニター」らしいことを突き止める。

ということで、オートバックスなどを幾つか回ってみたが、格安モニターは見つからず、7インチでも3万円以上はザラ。2万円を切るものすら見つからなかった。

しかし、Amazonにはあった・・・。6000円ちょいで・・・。
こういう超格安モノは、相当なギャンブルになるのは分かっている・・・。
が、価格の誘惑には勝てず、どこのメーカーかもわからない謎の液晶ディスプレイをゲット。

Amazonにて6380円で購入。(やすい!)
しかし、7インチは、後悔した。。。
字が小さすぎて、さすがに見にくい(^^;

もし買うなら9インチ以上にしたほうが良いかと・・・。
ちなみに、私が買ったモニターの9インチ版は、こちら。(Amazon)

(私の買った7インチ版は在庫切れでしょうか、見つかりませんでした。)

ちなみに、オンダッシュモニター(車載モニター)は、Amazonで格安で買えるんだけど、車載モニターなだけに電源に「シガーソケット」は付いているけど、家庭用の電源アダプターは付いていない。

なので、私は、12V2AのACアダプターをマルツパーツ(京都寺町)にて購入。(1140円)

百均で買ったUSBアダプターだと、電圧と電力が足りず、モニターの電源が入りませんでした。
ですので、ちゃんとしたモニター規格にあったACアダプターを買わないと、モニターが映りません。
上記モニターだと、12V2AのACアダプタで、ジャックがEIAJ No.2で正常に動きました。
(ここ重要)

ネットの情報を見る限りでは、全く同じモニターを使っている人は、PSPのACアダプタで全く問題ないとの情報が結構あります。
→ PSP用のACアダプター

※2017年7月追記
いまだとGPIOに差し込めるラズパイ2・ラズパイ3用のディスプレイが最安2500円〜8000円くらいまでで買えます!
しかもタッチスクリーン付きの。
記事を書いた当時は、タッチスクリーンディスプレイは軽く1万円以上してだけに、ずいぶんやすくなりました!
amazonに結構いっぱいあるので、ぜひご確認を!
→ラスパイ用ディスプレイ一覧

キーボード

image

寺町(京都の電気屋街)のエディオンで、シリコンキーボードを見つけたので、買った。
どこのメーカーか全くわからない、謎すぎるUSB有線キーボード。
1068円(税込)

ラズパイを初めて使う場合は、有線キーボードがオススメ。
基本的には、どんなキーボードでも大丈夫と思うけど、Bluetooth系の無線キーボードは、はじめのうちはやめたほうがいい。
認識しない可能性も高いので。
まずは、USBの有線キーボードからいこう。

マウス&LANケーブル

image

マウスもLANケーブルもダイソーにて購入。
LANケーブル 108円
USB有線マウス 324円(さすがに100円ではなかったが、300円はやすい!)

こちらもマウスは、有線がオススメ。
無線マウスだと、認識しない可能性もある。

ちなみに、インターネットにつなぐ予定がない場合は、LANケーブルは不要。

HDMIケーブル&SDカード

image

まず、HDMIケーブルは、ラズパイ本体とディスプレイの接続用ね。
じゃんばら(京都寺町)で290円(税込)で買った(笑)

HDMIケーブルが290円は、いくらなんでも安すぎ(たぶん、在庫処分か何かじゃないかな)。
普通の街の電気屋で買ったら1500円くらいだと思う。
Amazonだと、480円くらいが最安かな。
→ HDMIケーブル(Amazon)

で、SDカード。
こちらは、ラズパイ2で使う場合は、上記のようにmicroSDとSD変換アダプターがセットになったものがいいと思う。
(ラズパイ2にはmicroSDの挿入口しかないよ。)
これも、じゃんばらで在庫処分で買ったから激安。360円(税込)。
容量は8G以上を推奨。

ラズパイへの給電ケーブル

image

すべて、ダイソーで購入。

ラズパイの電源は、マイクロUSBの口があるんだけど。
だからといって、写真一番右のUSB←→microUSBケーブルで、PCのUSBとラズパイを繋いでPCから給電しても、電力不足で動作が不安定な時があるそうな。

なので、電源安定供給のためコンセントから電源を取りたいところ。

ということで、USBの延長ケーブル(写真左)とUSBのACアダプター(これは、ダイソーでも200円した、写真真ん中)を購入。

これらを直列につなげてラズパイのACアダプターとする。

OSインストールの下準備

まず、下準備として。

SDカードにラズパイのOSをコピーしておく。

・ラズパイの公式サイトからOSインストール用のファイルをダウンロード
http://www.raspberrypi.org/downloads/
上記から”NOOBS”のzipファイルをPCにダウンロード。

zipファイルを展開。

展開されたZIPファイルの中身を全部、microSDカードへコピーする。

※2017年7月追記
現在Raspberry Piの公式OSはRASPBIAN(ラズビアン)なので、NOOBSよりもラズビアンをオススメします。

Raspbian(ラズビアン)の場合

SD CARDにEtcherというソフトを使ってOSイメージを焼きこみます。

・Etcherのダウンロード&インストール(Windows・Mac・Linux対応)
Etcherダウンロード

・Etcherからダウンロードしたrasbianのzipファイルを開く。
(zipファイルの展開などは不要。そのままEtcherから開けばOK)

あとは、Flashボタンを押すだけで自動的に書き込みスタート、後は待つだけで完了。

機器接続

image
  1. モニターをHDMIポートへ
  2. キーボード・マウスをUSBポートへ
  3. microSDカードをポートへ
  4. 給電ケーブルをmicroUSBポートへ

ポイントは、4番(電源ケーブル)は一番最後ね。
電源ケーブルを指すと、自動的にラズパイの電源ONになるので、先にすべての機器を接続してから、電源ケーブルを差そう。

 

OS(Raspbian)インストール

モニターに映し出されたウィザードに従って、「Raspbian」を選択し、左上のインストールボタンを押す。
インストール開始。数分かかる。

image

インストール完了アラートがでたら、OKボタンを押すと。

再起動されて、「Raspi-config」という画面が表示される。
初期設定画面なんだけど、今回は飛ばした。
キーボードのTABキーをトントンと押して、Finishボタンの上でEnterと。

インフラ・サーバーエンジニアではおなじみのLinuxのCUI環境が立ち上がる。
設定はデフォルトのままなので、
login: pi
password: raspberry
と入力すると、ログインできる。

これで、CUI上での利用可能。

しかし、RaspbianにはGoodなGUIが用意されているので、以下を入力。

# sudo startx

image

ハロー!ラズパイ!
こんにちは!

あっちゅーまに、ラズパイPC完成。
早い、簡単。

ついでに、LANケーブルも繋いで、ネットも確認しておく。

image

以上。

Raspberry Pi 2 Model B での Hello PC! は成功。

総額は?

ハローPC!の総額・・・。

  • ラズパイ本体 : 5140円
  • モニター : 6380円 + ACアダプタ 1140円
  • キーボード : 1068円
  • マウス : 324円
  • LANケーブル : 108円
  • HDMIケーブル : 290円
  • SDカード : 360円
  • 給電ケーブル : 432円

合計 : 15,242円

ということで、約15000円で簡易PCが完成したのだが、ラズパイは、「ここからが勝負」ですな。
ここからがラズパイの見せ所、様々なセンサーを接続したり、WiFiやBluetooth通信を実装したりして、PCやスマホの画面の世界を超えてリアルな世界とインターネットを直接繋げられる。

WEBとリアルの融合する社会の第一歩をラズパイで楽しんでみましょう!

おまけ

2014年からモーニングで連載ている電子工作マンガが、非常に人気があるということで、「ハルロック」も買っておいた。

image

ハルロック(モーニングKC)

このエントリーをはてなブックマークに追加