aws chaliceを使ってslackの翻訳botを作ってみた #aws #chalice #slack #bot

AWS Developers Meetup

先日開催された AWS Developers Meet Up という開発者向けのイベントに参加してきました。

AWS Developers Meet Up(2017 年 12 月 7 日開催)
https://pages.awscloud.com/DeveloperMeetup20171207.html

第1回目ということもあって、AWS SDKの紹介を交えつつ実際にAWS Cloud9を動かしてライブコーディングがあったりして、2回目以降の開催にも楽しみになる感じのイベントでした。

aws.amazon.com

aws.amazon.com

また、AWS AmplifyAWS Mobile CLIを紹介するデモではちょっとしたトラブルもあったりしましたが、逆に参加者の皆さんがトラブル解消のためにすごい画面に集中して一体感が出るという一幕もw

aws.amazon.com

github.com

個人的に楽しみに見に行ったのは Chalice(Python Serverless Microframework for AWS) のお話

github.com

すごい手軽に使えて、IAM ポリシーを自動生成してくれるのが素敵なのが気に入っているので、これまでも↓

uchimanajet7.hatenablog.com

uchimanajet7.hatenablog.com

uchimanajet7.hatenablog.com

な感じで使ってみています。

Slack Developer Meetup Tokyo

少し前に開催された Slack Developer Meetup Tokyo という開発者向けのイベントに参加してきました。

slackdevtokyo.splashthat.com

その中で紹介されていた、emojiリアクションでメッセージを翻訳するbotをつくるというのがちょー楽しそうだったんです。

www.slideshare.net

JavaScriptで作られたbotのコードは公開されていて、Herokuへのデプロイならデプロイボタンもあってちょー楽そう。

github.com

しかし、JavaScriptはこの前のServerlessconf Tokyo 2017 Workshopのコードを触った時にだいぶ苦労したので避けたい気持ちがw

uchimanajet7.hatenablog.com

ということで

slack 翻訳botも楽しそうだし久しぶりに chalice も触りたいということで、chalice を使って公開されているslackapi/reacjilatorと同じように動くものを作ってみました。

github.com

基本的には公開されている slackapi/reacjilatorchalice利用して実装し直しただけになります。

変更点はGoogle翻訳は無料枠がないので、次の資料を参考にして無料の翻訳APIを利用するようにしてあります。

omohikane.com

王道は Microsoft Translator API なんですが利用したことがあるのと、無料アカウントでも取得するのに多少手間があるので、使ったことのないYandex APIを使ってみました。

マイクロソフトアカウントの登録方法なんかは以前書いたAzureの記事をご覧ください。

uchimanajet7.hatenablog.com

コードは量も多くないので他の翻訳APIに変更するのも大変ではないと思います。 また、当然ですが翻訳APIを利用するということはAPIに文字列を送信するということなので、十分理解した上で翻訳APIの利用先と利用を決めてください。

Yandex API

無料で使えて登録も簡単な翻訳APIを調べていて初めて知りました・・・ ロシアでGoogleみたいなことやってるんですねー

Yandex - Wikipedia
https://ja.wikipedia.org/wiki/Yandex

翻訳APIの利用登録は非常に簡単で、GoogleアカウントがあればログインしてAPIキーを取得するだけで利用開始できます。

tech.yandex.com

ドキュメントもAPIそのものも非常にシンプルなので、特に困るところはないかと思います。動作を確認するとかそういう用途では手軽で嬉しいですね。

実際に利用する際にはAPIに文字列が送信されるということを考えてお使いください。

準備

上記翻訳API(yandex)の準備とSlackの公開されているスライドを参考に準備を行ったら、実行に必要なAPIキーなどの情報を書き足してchalice deployを実行すれば、API GatewayのエンドポイントとLambdaを利用できるようになります。

翻訳APIを他のものに切り替える場合は、APIを呼び出す部分を個別に実装すれば切り替えできると思います。

国旗絵文字の文字列から翻訳APIに渡すための変換は↓を参考にしてください。

Language Support  |  Translation API  |  Google Cloud Platform
https://cloud.google.com/translate/docs/languages?hl=en

Translator Language Codes
https://msdn.microsoft.com/en-us/library/hh456380.aspx

tech.yandex.com

AWS Lambda はAPI Gatewayから呼び出されるものと、Amazon SNSから呼び出されるものがあります。

これはSlackのAPIがリクエストを受けてから、一定時間内にレスポンスを返さないとリクエストを再送する仕組みがあり、Lambdaのコールドスタート時に複数のリクエストが送信される可能性を低くするためです。

chaliceではAWS CloudFormationをサポートしているので、AWS CLIと組み合わせることでAmazon SNSなどの他リソースを同時に構築することができます。

AWS CloudFormation Support — Python Serverless Microframework for AWS 1.1.0 documentation
http://chalice.readthedocs.io/en/latest/topics/cfn.html

使ってみる

https://user-images.githubusercontent.com/6448792/34078201-01eec178-e359-11e7-8494-17d044371c5f.gif

国旗絵文字をリアクションすると、その国の言葉に翻訳されます。 翻訳API側が対応してないとbotからの返答がないようにしてあります。

f:id:uchimanajet7:20171217183210p:plain

The message is translated in :flag-ca: (ja-en)

のように、翻訳元の言語と翻訳先の言語がわかるようにはしてあります。 上記の例だとja(日本語)からen(英語)となります。 翻訳APIからの戻り値ですが、基本的にはISO 639-1のコードと同等のようです。

List of ISO 639-2 codes - Wikipedia
https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes

まとめ

  • 勉強会やイベントに行くと知らないことや、やってみたいことのきっかけになるのはやっぱりいいな
  • 入出力にSlackを使うのは手軽だし分かりやすい
  • 今回みたいなBotだと全チャンネルではなく、特定のチャンネルにデプロイしたい。
  • 外部APIに文字列を送るとなると予期せず動作するのは好ましくない気がする。
  • 今回はプログラム側で許可するチャンネル一覧を持って対処した。
  • slack側で設定できる場所があれば教えてほしい
  • チャンネルリストもディスプレイ文字列ではだめで、チャンネルIDが必要だった
  • チャンネルIDの取得の仕方については以下を参考にした

qiita.com

  • chalice はやっぱり手軽でこういうちょっとした用途だと便利
  • SNSを使って非同期にしてあるが単純にLambdaのinvokeでもよかったかもしれない
  • その場合chalice側でLambda関数名が付与されるので、そのあたりをもうちょっとスマートにしてもらえるといいなーと
  • 時間をみつけてchaliceのソースを見てみようと思った
  • Lambdaなので外部APIとのやりとりもX−Rayを使えば可視化もできて便利
  • 今回は利用してないが、他の翻訳APIも複数利用する場合とかあればX−Rayも使ってみたい

docs.aws.amazon.com

  • やっぱりわくわくしながら作るのは楽しくて良いです
  • やはり楽しいは正義ですね

以上になります。

SORACOM UG Tokyo #8 開催レポート #soracom #soracomug #iot

★この記事は「SORACOM Advent Calendar 2017」の 12/15 日分のエントリーになります

qiita.com

soracom.jp

何を書くか・・・

IoT通信プラットフォーム SORACOM のAdvent Calendar 2017 です。 SORACOM を使った技術ネタでしたらなんでもOKです!

とあるので、本当は技術ネタの方が良いのでしょうが・・・せっかくSORACOM UG Tokyo #8が開催された当日なので、それをネタにゆるーく書いていこうと思います。

soracomug-tokyo.connpass.com

技術ネタと話題のWio LTE話は、これまでのSORACOM Advent Calendar 2017で色々と書かれているのでそちらを見てくださいw

久しぶりの開催

前回の第7回目の開催が2017/07/05(水)SORACOM Conference 2017 “Discovery”のナイトイベントとして開催したので、半年近く経っての開催となりました。

soracomug-tokyo.connpass.com

discovery2017.soracom.jp

久しぶりの開催ということで、前回の開催からのニュースリリースを確認して個人的に気になるものを見てみると

soracom.jp

まず、みんなびっくりしたのはKDDIグループとなったことでしょうか?

soracom.jp

あとは、チップ型SIMやeSIMの提供が開始との話

soracom.jp

soracom.jp

Wio LTEの機器販売のとWio LTE自体が気になりました

soracom.jp

もちろんこの他にもいろいろとリリースされてますので、あくまでも個人的に気になったという話です。

当日レポート

では、本題のSORACOM UG Tokyo #8 / eSIMとre:InventとちょっとだけWio LTEの当日の様子を簡単ですがご紹介したいと思います。 当日の雰囲気は次のまとめをご覧ください。

togetter.com

会場

f:id:uchimanajet7:20171216110937j:plain

今回の会場はウイングアーク1st株式会社 さんのセミナールームをお借りしました。 素晴らしいセミナールムで開催できて大変助かりました。ありがとうございました。

帳票とBI | ウイングアーク1st
http://www.wingarc.com/

eSIM オーバービュー

f:id:uchimanajet7:20171216125258j:plain

1つ目のお話はSORACOM片山さんによるeSIMのお話。 SIM自体の基本的な話から、既存のSIMとeSIMがどう違うのか? これからのSIMはどうなっていくのか?といった内容のお話でした。

資料と話の内容が非常に丁寧で、ぜんぜん詳しくない私でも理解できるような非常に素敵な発表でした。

資料は公開されましたが、是非SORACOMさんが開催しているオンラインセミナーSORACOM Bootcampにて再演していただけるといいなーと。

www.slideshare.net

あ、あとで #ソラコムサンタ ハッシュタグつけてTwitterにつぶやいておこうw

twitter.com

今年も#ソラコムサンタ開催中みたいなので、クリスマスが楽しみですねー

twitter.com

Wio LTE の紹介

f:id:uchimanajet7:20171216140247j:plain

2つ目のお話はSORACOM松下さんによるWio LTEのお話。 WioとはWireless Input Output だそうなので、カタカナで表記するならワイオとなるそうな。

Wio LTE Cat.1 - Seeed Wiki
http://wiki.seeed.cc/Wio_LTE_Cat.1/

Wio Tracker (Wireless Input Output) is an open source gateway which enable faster IoT GPS solutions.

ラズパイやArduinoでGroveセンサーを使う場合に、ブレッドボードのさし間違えでセンサーを壊してしまったことがある人もいるかと思います。

Wio LTEでは直接コネクターにGroveセンサーをさせるので 上記のような悲しいことも起こらずw かつ手軽にセンサーを利用できるそうです。 また当然LTEモジュールも搭載しているので、SIMを刺せば通信も利用可能と。

SORACOMさんのサイトでは、Wio LTE単体からGroveセンサーをセットにしたものまで販売しているそうです。購入して年末年始にIoTを体験するのには手軽でいい感じかもですねー

soracom.jp

soracom.jp

最後に松下さんがWio LTEを使った実機デモを行い、クラウド側とデバイス側が双方向で通信している様子がわかる楽しいデモでした。

Wio LTEのハンズオンなんかは今後も予定されているようなので そのハンズオン会場で同じデモが見られるかもしれないですねー

ソラコムが見てきたAWS re:invent 2017 話

f:id:uchimanajet7:20171216140553j:plain

3つ目のお話は再び登場のSORACOM片山さんによるAWS re:Invent 2017のお話。 SORACOMさんか参加されたのは片山さん1人とのこと。なので、自分が見てきた範囲でセッションの内容紹介をするとのことでスタートしました。

今年のre:InventではIoT関連のサービスが多数発表され、AWSがIoTに積極的に取り組む姿勢が感じられて嬉しかったとのこと。 また、会場では色々なIoTサービスやプロダクトの展示もあったそうです。

会場のハンズオンでAWS DeepLensを触ったお話もありました。

aws.amazon.com

スライド中では画像認識している若干ドヤ顏気味の片山さんの写真も紹介されていましたw

f:id:uchimanajet7:20171216140719j:plain

SORACOMさんにはグローバル向けのSIMもあるので、早速現地でAWS DeepLensにUSBドングルをさして通信可能か試した話もされてました。

blog.soracom.io

この中で話してのは画像?映像データはクラウドまで上がらずにどうやら機器内で判定がされ、結果のJSONだけが送信されてるとのこと。 これであれば、大容量の回線でなくても利用できるしかつ、画像や映像という色々な情報が入っているものの取り扱いを気にしなくてよくなるので、大変ありがたい感じですねー

AWS DeepLens を開けてみたそうで

f:id:uchimanajet7:20171216140804j:plain

カメラはUSBで刺さってるだけだったそうですw

発表後に実物のAWS DeepLensを開けていただけたので見てみましたが、確かに刺さってるだけっぽかったですw

f:id:uchimanajet7:20171216140833j:plain

日本ではまだ発売されませんが、他のデバイスでも代用可能そうなのでソフトの方を他のデバイスにもデプロイできるようになると楽しそうですねー

www.slideshare.net

ソラコム ビンゴ

f:id:uchimanajet7:20171216140631j:plain

最後は再び登場のSORACOM松下さんによるソラコム ビンゴ 去年の同じ頃に使う予定で作ったビンゴアプリが1年越しでやっと活躍だそうですw しかし、1年はWebの世界では長かったようで使っているJSライブラリが大幅更新されていた&SORACOMのアイコンセットがだいぶ増えたので、結構修正しないと動かなかったとかw

コード自体はGitHubで公開されているとのことなので、この時期にビンゴをお考えの方いかがでしょうか?

github.com

ビンゴの方は順調に進んでいきましたが、アイコンセットの数が多いからなのか・・・なかなかビンゴになる人が出ないという展開にw

ビンゴの景品はSORACOMさん、seeedさん、ウィングアークさんから提供していただきましたーありがとうございました。

f:id:uchimanajet7:20171216140905j:plain

Groveセンサーってすごい便利で使ったこともあったのに、seeedさんの製品だとは全然知らなかったです・・・

Grove System - Seeed Wiki
http://wiki.seeed.cc/Grove_System/

Seeed Studio Bazaar, Boost ideas, Extend the Reach
https://www.seeedstudio.com/

最後は

f:id:uchimanajet7:20171216140933j:plain

SORACOM UG 恒例の集合写真で締めでした。 いつも写真撮影ありがとうございます!!

www.facebook.com

まとめ

  • 今回はSORACOMさんから色々話が聞けて勉強になった
  • 知らないことが知れるのは楽しい
  • たまにはこう言った感じで開催するのもいいなぁーと感じた
  • Javaはすごい(らしい)
  • 資料の公開は楽しみにしてますので、是非よろしくお願いします!
  • あと、#ソラコムサンタ 期待していますw
  • アドベントカレンダーは間に合わなくてゴメンナサイ。
  • 次回も楽しく開催したいのでよろしくお願いします!

明日も楽しみ「SORACOM Advent Calendar 2017」

12/25 の最終日までいろいろなネタが投稿される 「SORACOM Advent Calendar 2017」 明日以降の投稿も楽しみです!

qiita.com

ユーザーグループの開催レポートなのでゆるーく書いてしまいましたが、少しでもSORACOM UGに興味を持っていただければ嬉しいです。

今後のSORACOM UG開催についての情報は、募集サイトやSORACOMさんの公式サイト、SNS等で発信されていますので気になった方は是非参加してみてください。

soracom.jp

soracomug-tokyo.connpass.com

twitter.com

www.facebook.com

www.facebook.com

以上になります。

Cloud Automator について #cloudautomator #swx

★この記事は「Cloud Automator Advent Calendar 2017」の 12/1 日分のエントリーになります

qiita.com

cloudautomator.com

何を書くか・・・

AWSの運用を自動化する Cloud Automator の知見・情報など、Cloud Automatorに関することであれば何でもOKです🙆

とあるので、なんでもOKらしいので初日&AWSな方々はre:Invent 2017 でラスベガスだと思うので、ゆるーく書いていこうと思います。

技術的なこととか、深い話は今後のみなさんがきっと書いてくれるに違いないと信じておりますw

いつから

さて、Cloud Automatorはいつから提供が開始されたのか?調べてみると、次のニュースリリースが残っているのを発見しました。

www.serverworks.co.jp

これによると

Cloud Automator (クラウドオートメーター) の提供を2014年7月17日(木)より開始いたします。

となっており、今から約3年半ぐらい前からサービスとして提供されていたことがわかります。

200社を超えるAWS導入実績を持つ当社が、実環境で経験してきた様々な運用業務を「アクション」として実装しています。

となっていますが

www.serverworks.co.jp

を確認すると、現在は

600社4,000プロジェクト以上のAWS移行実績!

と記載があることをみても、時間の経過とAWSが利用されるスピードについて実感できるかと思います。

全然関係はないんですが、このニュースリリースなんでこんなにCloud Automator のロゴが大きいのかw Cloud Automatorのロゴを伝えたかったのか!?それとも何か秘密があるのか!?

f:id:uchimanajet7:20171129132943p:plain

今後の「Cloud Automator Advent Calendar 2017」で明らかになるのか楽しみですw

アップデート

次に大きな機能追加があったのは、「構成レビュー」自動化機能の追加でしょうか?サービス提供時と同じく調べてみると、次のニュースリリースが残っているのを発見しました。

www.serverworks.co.jp

これによると

「構成レビュー」自動化機能の提供を2016年6月1日(水)より開始いたします。

となっており、今から約1年半ぐらい前からサービスとして提供されていたことがわかります。意外と最近ですねw

どうしたら

Cloud Automator を使い始めるのはどうしたらいいのか?

cloudautomator.com

公式サイトからサインアップしてもらえれば、構成レビュー⾃動化機能は対象外となりますが1ヵ⽉の無料トライアルを行えます。

もしくは、pieCeというサービスに加入いただいている場合には、すぐにすべての機能をお使いいただけます。

www.serverworks.co.jp

今後は

Cloud Automator の今後はどうなるの?という方は次のロードマップページをご覧ください。

cloudautomator.com

こんな機能が欲しい!こんなことをしたい!との要望は

Cloud Automatorサポートページ
http://feedback.cloudautomator.com/

のサポートページで受け付けておりますので、フィードバックをお願いいたします。

また、単純にどんなことができるかドキュメントを確認したい場合は

Cloud Automator – 株式会社サーバーワークス サポートページ
https://support.serverworks.co.jp/hc/ja/categories/115001305127-Cloud-Automator

のマニュアルページをご確認ください。

明日も楽しみ「Cloud Automator Advent Calendar 2017」

12/25 の最終日まで今日からスタートの 「Cloud Automator Advent Calendar 2017」 明日以降の投稿も楽しみです!

qiita.com

初日なのでゆるーく書いてますが、これからはもっと中の詳しい話や便利な使い方なんかが出てくるのを期待ですね!

あと、埋まってないところがあるようなので我こそは!という方の参戦もお待ちしております!

宣伝

サーバーワークスでは積極採用中です。もちろんCloud Automatorの開発チームも採用中ですので、Cloud Automatorに興味がある方是非お声がけください!

www.serverworks.co.jp

以上になります。

#Serverlessconf Tokyo 2017 でやった Workshop に機能を追加してみた #serverless #ACG

今年の

今年も大盛況の開催だった Serverlessconf Tokyo 2017 の1日目に開催された pre-conference Workshop に参加しました。

tokyo.serverlessconf.io

幾つかの Workshop から選択できたのですが、私が選択したのは

Build your own serverless video sharing website with Lambda, API Gateway and Firebase

という、Youtubeクローンのようなものを作ってみるというWorkshopでした。

github.com

内容は上記githubの内容を見てもらえればわかるのですが、ドキュメントが非常によくできているので指示通りに進めて行くとサクサク進んでいきます。

http://bit.ly/acg-jpbit.ly

さらに日本のServerlessconf Tokyo 2017のスタッフの方が、日本語訳したものまで用意してくれる素敵な対応。

実際に

当日は @sbarski の丁寧な説明を受けつつ、Workshopを進めて行く感じでした。

twitter.com

また、サポート役として @ijin@toricls@horike37 というクラウド界隈で有名な方々がなぜか参加しているという素敵な状況でした。

twitter.com

twitter.com

twitter.com

Workshop自体のできがよく、さらにサポートも充実しているので予想よりも全体的な進捗がよく終わってしまう人がかなりいました。

そこで、終わった人はWorkshopで完成したものに新規で機能を追加してPull Requestを送ってみてはどうか?という無茶ぶりがw

公開されているWorkshopが需実していくのはいいことなので、私も何かしよう!と思ったのですが、LambdaがNode.jsで書かれているというね・・・

結局

f:id:uchimanajet7:20171129172234p:plain

当日は不慣れなJavaScriptに苦戦して何も追加できずでしたので、せっかくだから空いた時間を使ってチマチマと機能を作ってみました。

github.com

Lesson 6として追加したのは、Webブラウザ上から動画ファイルを削除できる機能の追加です。

f:id:uchimanajet7:20171129172318g:plain

普通すぎる機能なんですが、アップロードがWebブラザ上からできるところでWorkshopが終了になっているので、まーあってもいいかなぁーと。

ただ、このWorkshop自体が @sbarski の著書 Serverless Architectures on AWS With examples using AWS Lambda をもとにしているらしいので、著書の中には既にある可能性が・・・

Manning | Serverless Architectures on AWS
https://www.manning.com/books/serverless-architectures-on-aws

こちらの著書も日本語版が出れば読みながら進めるのは良さそうですよねー日本語版に期待。

Pull Request

著書の中で既存の可能性が高いですが、せっかく作ったのでPull Requestを送ってみました。

github.com

他にも心配な点がいくつか・・・

  • 手順書の英語がわからん。
    • 日本語版を書いてそれをGoogle翻訳しただけw
  • フロントエンド側のJavaScriptがわからん。
    • 動くようには書いたけどスマートじゃない気がするけど力尽きたw
  • Pull Request の英語がわからん。
  • 空き時間でのんびり作ってたらすごい時間かかった
    • 絶賛開催中のAWS re:Invent 2017 でWorkshopに使えそうなサービスが出そう。というか出てるきがするw

reinvent.awsevents.com

classmethod.jp

ちなみに @sbarskiAWS re:Invent 2017 で登壇したみたいですよ! that's awesome!

AWS re:Invent 2017
https://www.portal.reinvent.awsevents.com/connect/search.ww

私自身は今年も残念ながら参加できなかったので・・・・ 上記のセッション検索サイトで @sbarski の名前を検索すると

DVC301 - Evolution of Serverless Architectures through the Lens of Community
https://www.portal.reinvent.awsevents.com/connect/sessionDetail.ww?SESSION_ID=17198

SRV401 - Become a Serverless Black Belt: Optimizing Your Serverless Applications
https://www.portal.reinvent.awsevents.com/connect/sessionDetail.ww?SESSION_ID=14199

の2つのセッションがヒットしますねー

DVC301 の方は残念ながら動画が非公開っぽいですねー

www.youtube.com

SRV401 の方は動画が公開されていて見ることができるようです!

www.youtube.com

この他のAWS re:Invent 2017 動画は順次公開されているようなので、私と同じく現地参加できなかった人にはありがたいですよねー

www.youtube.com

来年は参加したいなぁー去年もそんなこと言ってましたがw

まとめ

  • 時間はかかったけどのんびり進められてなかなか楽しかった
  • やっぱりJavaScriptはよくわからなくて難しい
  • Workshopがシンプルなのでコード類もシンプルで素敵
  • AWSを知っている人なら、本当にサクサク進められるのでオススメ
  • サクサク進むけど出来上がるものは動きもあって達成感もある
  • 良い機会を得られたのが良かった
  • 他の参加者のかたも是非!新機能を!
  • Serverlessconf Tokyo 2017 スタッフの皆さんありがとうございましたー

以上になります。

textlintを使ってAWS用語をチェックしてみる #aws #textlint #golang

最近のアップデート

Cloud Automator のアップデートでログイン中の操作画面にマニュアルのリンクが表示されるようになりました。

blog.serverworks.co.jp

もちろんマニュアルだけでも閲覧できますので、気になった方は無料トライアルでCloud Automator を試してみてください。

Cloud Automator – 株式会社サーバーワークス サポートページ
https://support.serverworks.co.jp/hc/ja/categories/115001305127

cloudautomator.com

ドキュメントを充実させるには

ドキュメントを充実させていくには、地道に書いていくしかないわけで・・・Cloud Automator についても開発メンバーで分担しながら作っています。

その際ちょっと気になってくるのが表記のゆれです。 これは多人数でなくても1人で書いていても、書いている時期が異なると表現が異なるとかありますしね。

細かい言い回しならそこまで気にする必要もなさそうなのですが、Cloud Automator の使い方や機能を説明していくと当然ながらAWSについても言及する必要が出てきます。

AWS用語表記のゆれが出てしまうとユーザーは気になりますし、検索する場合にヒットせず困ることも出てきそうです。

そこでAWSの公式ドキュメントに載っている日本語のAWS用語を利用して、表記のゆれをチェック行ってみます。

アマゾン ウェブ サービス : AWS の用語集
https://docs.aws.amazon.com/ja_jp/general/latest/gr/glos-chap.html

ツールを探してみる

表記のゆれをチェックできるツールとして知っているのは以下2つ。

github.com

github.com

今回は対象のファイルがMarkdownファイルであるのと、手元で手軽に動かしたたいので、npmでインストールできるtextlintを利用してみます。

また、prh形式のYAMLでルールを指定できるように次のツールも利用してみます。

github.com

ルールを作ってみる

チェックを行うためにはルールを作る必要があります。

AWS用語については公式にドキュメントとしてまとまっているので、これを利用するために次のような簡単なコマンドラインツールをgolangで作ってみました。

github.com

できることは単純で、日本語のAWS用語ページをスクレイピングしてprhで使える形式のYAMLファイルを出力します。

詳細はGitHub上のREADME.mdファイルを参照してください。

github.com

スクレイピングにはgoqueryというgolangの便利なライブラリを利用しています。

github.com

実際のYAMLファイルを見てもらえば分かりますが、単純に用語をそのまま抜き出しているものと、半角スペースで分解して単語単位で抜き出してものがあります。

github.com

たとえばAmazon Simple Workflow Serviceを登録する場合、

 - expected: 'Amazon Simple Workflow Service'
 - expected: 'Amazon'
 - expected: 'Simple'
 - expected: 'Workflow'
 - expected: 'Service'

の5種類を登録しています。

これは実際にチェックする際により多くのパターンにマッチさせたかったためで、利用してみてマッチしすぎる場合は必要のない部分を削除して使う形にしました。

作ったルールを利用してみる

作ったルールを実際に利用するには.textlintrc というtextlintの設定ファイルに、作成したaws_words.ymlファイルのパスを記載するだけです。

{
  "rules": {
    "prh": {
      "rulePaths": [
        "./aws_words.yml"
      ]
    }
  }
}

試しに次のようなMarkdownファイルに、上記の設定でtextlintを実行すると、

# AWS用語のチェック

- awsはダメ。
  - Amazon Web Serviceも間違い。
  - 日本語なので正解はアマゾン ウェブ サービス。

- 同じくAWS Management Consoleは英語なのでダメ。

のような結果になり、ルールにしたがってチェックされていることが確認できます。

$ textlint test.md

/Users/uchimanajet7/self-work/github/awr/test.md
  3:3   ✓ error  aws => AWS                                            prh
  4:5   ✓ error  Amazon Web Service => アマゾン ウェブ サービス        prh
  4:5   ✓ error   => Amazon                                            prh
  4:7   ✓ error  違い => AZ                                            prh
  4:16  ✓ error  ェブ サービス => service                              prh
  4:16  ✓ error  service => Service                                    prh
  7:6   ✓ error  AWS Management Console => AWS マネジメントコンソール  prh
  7:6   ✓ error  でダメ => AWS                                         prh
  7:10  ✓ error  同じくAWS マネジ => Management                        prh
  7:21  ✓ error  ントコンソール => console                             prh

✖ 10 problems (10 errors, 0 warnings)10 fixable problems.
Try to run: $ textlint --fix [file]

いくつか余計と思われる部分が指摘されていますが、これはルールを機械的に作り出しているために起こっているので、取り除きたい場合にはルールのaws_words.ymlファイルを編集します。

もうちょっと便利に

これでMarkdownファイルに書かれている内容について、なんとなくですがtextlintを利用してチェックできるようになりました。

しかし、実際にドキュメントを書く作業をしてみるともうちょっと便利にできそうな感じがするので試してみることにします。

私の場合ドキュメントを公開するまでに、

  1. Markdown形式でドキュメントを書く。
  2. textlintでチェックし、修正があればなくなるまで繰り返す。
  3. Zendesk Guideにドキュメントを反映するためにMarkdown形式からHTML形式に変換する。
  4. Zendesk GuideHTML形式でドキュメントを反映し、画像の追加や装飾などを行う。
  5. チームメンバーにレビューをしてもらい、指摘があればなくなるまで修正を繰り返す。

の定型作業を行っているので、この作業を効率化したいわけです。

最終的にはZendesk GuideHTML形式で記載することになります。 ですので、最初からHTML形式で書く方が効率的なの気もしますが・・・ 個人的にはMarkdown形式の方が書きやすいので、Zendesk GuideMarkdownに対応してくれるとうれしいなぁー

www.zendesk.co.jp

と言っても、そこはどーにもならないので次のような簡単なコマンドラインツールをgolangで作ってみました。

github.com

できることは単純で、Markdown形式からHTML形式に変換できます。加えて、この変換作業の前後で任意のコマンドを実行できるので、今回はtextlintを実行する形にしています。

ただし、textlintは別のプログラムなので事前にtextlintのインストールや設定は必要となります。

詳細はGitHub上のREADME.mdファイルを参照してください。

github.com

Markdown形式からHTML形式への変換にはblackfridayというgolangのライブラリを利用しています。v2への移行が進んでいますが、今回利用したのはv1になります。

github.com

出力するHTMLファイルにclassを動的に追加したいなら、v2に追加されたParseを利用して実現できそうな気がします。時間ができたら要確認かなぁ。

また、何度もチェックして変換する工程を繰り返すことが予想されるので、fsnotifyというgolangのライブラリを利用して、ファイルの変更検知をできるようにしてあります。ファイルの変更を検知してチェックと変換を繰り返し実行します。

github.com

CLI化するのには有名なので説明不要だと思われるcobraというgolangのライブラリを利用しています。

github.com

作ったものを使ってみる

せっかく作ったので使ってみるわけですが、前述したとおり変換前と変換後に外部コマンドを実行できます。

今回は変換前にtextlintを実行してAWS用語のチェックを行い、変換後にはHTMLを実行環境のデフォルトブラウザで表示してレイアウトの確認を行います。

設定ファイルには次のように実行するコマンドと置換する文字列を記載してあります。

{
    "Page": true,
    "CSS": "style.css",
    "PreCommands": [["textlint", "%INPUT_PATH%"]],
    "PostCommands": [["open", "%OUTPUT_PAGE_PATH%"]],
    "ReplaceTexts": [
        "<blockquote",
        "<blockquote class=\"is-colored\"",
        "<ol",
        "<ol class=\"list-colored\"",
        "<img",
        "<img class=\"image-with-border\"",
        "<table",
        "<table class=\"table table--bordered table--color-header\""
    ]
}

これで変更検知をする次のコマンドを実行して、ドキュメントを更新するとtextlintを実行して変換後のファイルを実行環境のデフォルトブラウザで表示できているはずです。

現状は変化前、変換後のコマンド実行でエラーがあってもそのまま実行を続ける仕様ですので、textlintで指摘があってエラーが表示されていても実行は継続します。

また、openコマンドでデフォルトブラザを開いているだけですので、ブラウザが複数立ち上がるってしまう可能性があります。

まとめ

  • textlintを使って表記のゆれをチェックできる
  • 人のレビューを受ける前に機械的にチェックできるのはありがたい
  • 頑張ってprh形式のYAMLファイルを用意すれば、任意のルールでチェック可能
  • AWS用語は公式サイトにまとめられているので利用できる
  • ただし、日本語へのローカライズで問題ありそうな文言もあるので注意が必要
  • あと、誤表記やTypoを発見したらAWSへ積極的にフィードバックしておきましょう!そのうちきっと修正してもらえるハズ

f:id:uchimanajet7:20171016000127p:plain

アマゾン ウェブ サービス : AWS の用語集 - EBSbacked
https://docs.aws.amazon.com/ja_jp/general/latest/gr/glos-chap.html#EBSbacked

  • Zendesk GuideMarkdown形式が追加されてほしい
  • そー考えるとHatena Blogすごい書きやすいんだなーとあらためて思った
  • golangは相変わらず便利、そしてちょー楽しい
  • blackfridayはv2を使っていないので今後使ってみたい
  • fsnotifyは便利だったので今後も使っていきたい
  • 当然このblogもMarkdownで書いているのでtextlintを使ってチェックした

以上になります。

Visual Studio Codeに拡張機能がインストールできない場合の対処方法 #vscode #docker

アップデートエラー

f:id:uchimanajet7:20171018011922p:plain

Visual Studio Code(以下VS Code)の拡張機能Dockerがありますが、この拡張機能0.0.19へのアップデートで

end of central directory record signature not found

というエラーが出てアップデートができなくなりました。

code.visualstudio.com

marketplace.visualstudio.com

拡張機能Dockerをアンイストールして、再インストールしようとしても同じ結果に・・・

調べてみると

GitHubにissueが上がっていて

github.com

次のissueと同様の対応をすると解決するとのことなので

github.com

解決方法が載っているというissueを読んでみると

github.com

と書かれており、つまりは拡張機能をブラウザを使ってダウンロードして、ダウンロードしたローカルファイルからインストールすれば解決すると。

さっそく試してみる

拡張機能インストールファイルのダウンロード

issueには拡張機能PythonをダウンロードできるURLが記載されていて、Google先生で調べるとこのダウンロード用のURLを自分で編集してインストールパッケージをダウンロードすると書かれたBlogが多数ヒットします。

marketplace.visualstudio.com

しかし、上記のリンクを確認すればわかりますが、拡張機能の個別ページにはパッケージをダウンロードできるリンクが存在します。

f:id:uchimanajet7:20171018013628p:plain

Download Extensionをクリックすれば、インストール用のパッケージがダウンロードされます。今回のDockerであればPeterJausovec.vscode-docker-0.0.19.vsixというファイルになります。

ローカルファイルからの拡張機能インストール

ダウンロードしたPeterJausovec.vscode-docker-0.0.19.vsixを利用して、拡張機能インストールします。

[表示] → [コマンドパレット]でコマンドパレットを表示します。コマンドパレットのメニューから拡張機能: VSIX からのインストールを選択します。

f:id:uchimanajet7:20171018015111p:plain

するとファイル選択のダイアログが表示されるので、先ほどのファイルPeterJausovec.vscode-docker-0.0.19.vsixを選択するとインストールが開始されます。

f:id:uchimanajet7:20171018015929p:plain

インストールが正常に完了すると、再読み込みをうながすメッセージが表示されますので今すぐ再度読み込むボタンをクリックして再読み込みを行います。

f:id:uchimanajet7:20171018020940p:plain

インストール済みの拡張機能一覧にDockerの表示があればインストールが正常に完了したことになります。

まとめ

  • 特に何もしていないのに急にアップデートできずエラーになった
  • 調べてみたら同じような人がいた
  • 対処はインストールパッケージをローカルにダウンロードして、ローカルファイルからインストールを実行するだけ
  • いろいろ複雑に書いてあるBlogもあるが、たぶん情報が古い
  • もし同じような症状の人がいるなら参考にしてほしい
  • 原因がわからないので再発しないといいなぁー

以上になります。

Raspberry Pi 3+Gmail APIでメールを受信して音声合成してみた #raspberrypi #gmail #golang

メールで

仕事では殆どメールを見る機会はないのですが、通知系のメールに気が付かなかったという経験をしたことがある人は多いはず。

今回はGmailAPI を使ってメールを定期的に受信して、条件に合うメールの場合は音声で通知できる仕組みを Raspberry Pi 3Gamil APIを利用して作ってみたいと思います。

Gamil API

developers.google.com

利用を開始するまでにはいくつかステップがあって、いろいろなBlogで書かれていますが上記の公式サイトにあるQuickstart で、利用する言語毎に書かれているドキュメントの通りに進めるのをおすすめします。公式ドキュメントが充実しているのと最新の情報が記載されているため、手戻りすることなく進めることができます。

今回は当然大好きなgolangを利用するので以下に沿って進めていきます

Go Quickstart  |  Gmail API  |  Google Developers
https://developers.google.com/gmail/api/quickstart/go

準備

Google Developers Console

developers.google.com

まずはGoogle Developers Consoleにアクセスして

f:id:uchimanajet7:20170904151423p:plain

Google API Consoleに移動します。

console.developers.google.com

表示されたAPIの一覧からGmail APIを選択します。

f:id:uchimanajet7:20170904152527p:plain

プロジェクトが存在しないとAPIを有効化できないので、先にプロジェクトを作成します。

f:id:uchimanajet7:20170904153616p:plain

既存のプロジェクトでAPIを有効かする場合には、当然ですが新規にプロジェクトを作成する必要はありません。

f:id:uchimanajet7:20170904163117p:plain

APIを有効化しただけでは利用ができません。認証情報を作成する必要があります。

f:id:uchimanajet7:20170904163950p:plain

OAuth クライアントIDを取得するのですが、先に同意画面の設定が必要になります。

f:id:uchimanajet7:20170904170220p:plain

クライアントIDのアプリケーションの種類はその他を選択します。

f:id:uchimanajet7:20170904174533p:plain

設定が完了すると認証に必要な情報をJSONファイルとしてダウンロードすることができるので、ダウンロードして保存します。

f:id:uchimanajet7:20170904175531p:plain

詳細は以下の公式ドキュメントに書かれています

Authorizing Your App with Gmail  |  Gmail API  |  Google Developers
https://developers.google.com/gmail/api/auth/about-auth

Implementing Server-Side Authorization  |  Gmail API  |  Google Developers
https://developers.google.com/gmail/api/auth/web-server

Choose Auth Scopes  |  Gmail API  |  Google Developers
https://developers.google.com/gmail/api/auth/scopes

golang packages

次にgolangで必要になるパッケージを以下のコマンドを実行して取得します

$ go get -u google.golang.org/api/gmail/v1
$ go get -u golang.org/x/oauth2/...

実際に取得されるのは以下のパッケージになります。

github.com

github.com

パッケージの利用方法は、それぞれのパッケージに用意されているドキュメントを確認してください。 サンプルについてもパッケージのリポジトリにあるので参考になるかと思います。

動作確認

続けて動作と認可の確認を行います。

Go Quickstart  |  Gmail API  |  Google Developers
https://developers.google.com/gmail/api/quickstart/go#step_3_set_up_the_sample

上記のサンプルコードをそのまま利用するのですが、最初の工程でダウンロードしたGmail APIのクライアントIDのJSONファイルが必要になります。

サンプルコードをビルドして実行すると、コンソールに

Go to the following link in your browser then type the authorization code:

のメッセージと一緒にURLが表示されます。このURLが認可ページのURLになるのでブラウザにコピペしてページを表示します。

godoc.org

ブラウザに表示したら認可を与えるアカウントを選択します

f:id:uchimanajet7:20170904195633p:plain

認可の内容を確認します。今回は読み取りのみを指定しています。

f:id:uchimanajet7:20170904201054p:plain

godoc.org

問題がなければ許可をして、その後の画面に表示されるコードをターミナルに貼り付けます

f:id:uchimanajet7:20170904201716p:plain

これで次回の動作からはクライアント側に保存されたtokenを利用してアクセスすることができるようになります。

作ったもの

実際に作ってみたものは以下の写真のような感じに

f:id:uchimanajet7:20170902103822j:plain

使ったのは

  • Raspberry Pi 3 MODEL B
  • USB電源スピーカー(MS-UP201BK)
  • USB電源LEDライト(100円ショップ)

ぐらいで、ラズパイはAmazon Echoもどきで遊んだ時のやつを再設定して利用しましたし、LEDライトは100円ショップで適当に買ったやつですし、唯一スピーカーが手元になかったので700円ぐらいのものを買った感じですね。

ラズパイだと情報も多いですし、選択肢もいろいろとあるんですが手間もかけずに適当に作れるのはいいですねー

Raspberry Pi 3 MODEL B

www.raspberrypi.org

特別なことは何もしておらず、普通にRaspbianのLITEをインストールしてsshで接続できるように設定しました。

hub-ctrl

USBの電源をON/OFFするために、以下を参考して

Raspberry Pi B+ turn usb power off - Raspberry Pi Forums
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=93463

hub-ctrl をインストールしてあります。

github.com

ラズパイ3だとUSBの個別ポートで電源のON/OFFができると記載されている 記事も目にしましたが、手元のラズパイだと

pi@raspberrypi:~ $ hub-ctrl
Hub #0 at 001:000
 INFO: ganged switching.
 WARN: Port indicators are NOT supported.
Hub #1 at 001:000
 INFO: ganged switching.
 WARN: Port indicators are NOT supported.

pi@raspberrypi:~ $ lsusb -v
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass         0
  bDeviceProtocol         1
  bMaxPacketSize0        64
  idVendor           0x0424 Standard Microsystems Corp.
  idProduct          0xec00 SMSC9512/9514 Fast Ethernet Adapter
  bcdDevice            2.00
  iManufacturer           0
  iProduct                0
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           39
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xe0
      Self Powered
      Remote Wakeup
    MaxPower                2mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      0
      bInterfaceProtocol    255
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0010  1x 16 bytes
        bInterval               4

Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            9 Hub
  bDeviceSubClass         0 Unused
  bDeviceProtocol         2 TT per port
  bMaxPacketSize0        64
  idVendor           0x0424 Standard Microsystems Corp.
  idProduct          0x9514
  bcdDevice            2.00
  iManufacturer           0
  iProduct                0
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           41
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xe0
      Self Powered
      Remote Wakeup
    MaxPower                2mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      1 Single TT
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0001  1x 1 bytes
        bInterval              12
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      2 TT per port
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0001  1x 1 bytes
        bInterval              12

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            9 Hub
  bDeviceSubClass         0 Unused
  bDeviceProtocol         1 Single TT
  bMaxPacketSize0        64
  idVendor           0x1d6b Linux Foundation
  idProduct          0x0002 2.0 root hub
  bcdDevice            4.09
  iManufacturer           3
  iProduct                2
  iSerial                 1
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           25
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xe0
      Self Powered
      Remote Wakeup
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0 Full speed (or root) hub
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval              12

な感じなんですが、個別のON/OFFは残念ながらできませんでした。 USBの規格としてPer-port power switchingというのに対応していると個別のON/OFFが可能みたいです。調べた限りだと

スゴイハブ USB2-HUB4Xシリーズ 製品情報
http://www.system-talks.co.jp/product/sgc-4x.htm

が動作実績がありそうな感じでした。

AquesTalk Pi

日本語を音声合成するためのTTSとして、以下のAquesTalk Piをインストールしてあります

AquesTalk Pi - Raspberry Pi用の音声合成
https://www.a-quest.com/products/aquestalkpi.html

blog-yama.a-quest.com

今回はなるべく手軽に実現したかったのでAquesTalk Piを選択しましたが、他にも

Open JTalk
http://open-jtalk.sourceforge.net/

なんかを利用している人が多いようです。

また、クラウドサービスを使って音声合成をすることももちろん可能なのですが、今後家のネットワーク以外の例えばSORACOM Airなんかを利用したい場合を考えると、ラズパイ側で処理できるなら処理した方が良いかなーと。

クラウド側で処理する場合は

aws.amazon.com

azure.microsoft.com

www.ibm.com

あたりが定番でしょうか?

意外だったのはGoogleにはTTSのAPIがなさそということでしょうか・・・音声認識はあるので、内部的には当然あるんでしょうけど。

cloud.google.com

あとは、crontabで作ったプログラムの定期実行と起動時のUSBのコントロールを行っているぐらいです

pi@raspberrypi:~ $ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

# ggm
*/3 * * * * /home/pi/ggm/ggm

#set init
@reboot amixer set PCM 100%
@reboot sudo hub-ctrl -h 0 -P 2 -p 0

golang program

やっていることはGmailAPI直接ではなく、golangSDKを利用して受信しているだけです。

github.com

特に変わったこともしていないので、何の参考にもならないかもしれませんが・・・

動作の設定で記述が必要なのは.ggm/user_config.json ファイルだけです。

{
    "LastDate": 1504243346130,
    "LastTotal": 749,
    "UserEmail": "test@example.com",
    "SpeakCommands": [["/home/pi/aquestalkpi/AquesTalkPi", "-s", "120", "%s"],["aplay"]],
    "UsbCommands": [["sudo", "hub-ctrl", "-h", "0", "-P", "2", "-p", "%d"]],
    "Filters": [
        {
            "From": "user1@example.com",
            "Subjects": ["test","user1"]
        },
        {
            "From": "user2@example.com",
            "Subjects": null
        }
    ]
}

SpeakCommandsには音声合成するためのコマンドを記載しますが、配列で1つのコマンドを表して、配列を配列に入れることでパイプでつないで実行します。なので、上記の例だと

$ /home/pi/aquestalkpi/AquesTalkPi -s 120 %s | aplay

のコマンドを実行していることになります。コマンド中の%sにはGmailの受信した内容が入ります。

UsbCommandsにはUSB電源管理するためのコマンドを記載します。形式は前述の通りです。コマンド中の%dはON/OFFの数値が入ります。

Filtersには音声合成対象のメール条件を記載します。Fromには送信元のメールアドレスを、Subjectsには配列で件名を記載します。特に指定がされていない場合にはすべてのメールが対象となります。

cross compile

Raspberry Pi 3 用にgolangコンパイルする際には

Installing Go from source - The Go Programming Language
https://golang.org/doc/install/source#environment

を参考にして環境変数を指定するわけですが、$GOARMに指定する値はラズパイ上で以下のコマンドを実行すると確認できます。

pi@raspberrypi:~ $ uname -m
armv7l

どうやらv7らしいので

$ GOOS=linux GOARCH=arm GOARM=7 go build -v

とすれば、今回の利用するライズパイ上で動作するバイナリがビルドできることになります。

動作デモ

で、実際に動作するとどうなるのか?というと・・・

twitter.com

な、感じになりました。思ったよりちゃんと音声合成できていて個人的には十分かなぁーと思いました。

まとめ

  • Raspberry Pi 3 は結構サクサク動く
  • これだけ動けばgolangでちょっとしたことは余裕そう
  • 今回は簡単にやってみたかったので複雑なのは却下した
  • Gmailだとpush通知を利用した方が良いかもしれない

Push Notifications  |  Gmail API  |  Google Developers
https://developers.google.com/gmail/api/guides/push

  • SORACOM Airを利用したい場合、USBドングルを使うことになるのでUSB電源をOFFにする動作が微妙
  • 前述したPer-port power switchingに対応したUSBハブを導入して回避する
  • USBをON/OFFしている理由は、雑音が聞こえることがあるのとUSBライトを受信時にだけに光らせたいから
  • 予算や手間を気にしないならCrystal Signal Pi みたいなのを導入するのもありかもしれない

crystal-signal.com

  • 雑に扱っても大丈夫というのが1つの目的だったので自作はなるべくなし
  • golangはいろいろできて楽しい
  • 急に喋り出すので若干びっくりする
  • 特に夜中とか怖いw
  • 要望は叶えられたので便利にはなった
  • また機会があればぜひなんかやってみたい

以上になります。