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 Amplify
とAWS Mobile CLI
を紹介するデモではちょっとしたトラブルもあったりしましたが、逆に参加者の皆さんがトラブル解消のためにすごい画面に集中して一体感が出るという一幕もw
個人的に楽しみに見に行ったのは Chalice
(Python Serverless Microframework for AWS) のお話
すごい手軽に使えて、IAM ポリシーを自動生成してくれるのが素敵なのが気に入っているので、これまでも↓
な感じで使ってみています。
Slack Developer Meetup Tokyo
少し前に開催された Slack Developer Meetup Tokyo
という開発者向けのイベントに参加してきました。
その中で紹介されていた、emojiリアクションでメッセージを翻訳するbotをつくるというのがちょー楽しそうだったんです。
www.slideshare.net
JavaScriptで作られたbotのコードは公開されていて、Herokuへのデプロイならデプロイボタンもあってちょー楽そう。
しかし、JavaScriptはこの前のServerlessconf Tokyo 2017 Workshopのコードを触った時にだいぶ苦労したので避けたい気持ちがw
ということで
slack 翻訳botも楽しそうだし久しぶりに chalice も触りたいということで、chalice を使って公開されているslackapi/reacjilator
と同じように動くものを作ってみました。
基本的には公開されている slackapi/reacjilator
をchalice
利用して実装し直しただけになります。
変更点はGoogle翻訳は無料枠がないので、次の資料を参考にして無料の翻訳APIを利用するようにしてあります。
王道は Microsoft Translator API
なんですが利用したことがあるのと、無料アカウントでも取得するのに多少手間があるので、使ったことのないYandex API
を使ってみました。
マイクロソフトアカウントの登録方法なんかは以前書いたAzureの記事をご覧ください。
コードは量も多くないので他の翻訳APIに変更するのも大変ではないと思います。 また、当然ですが翻訳APIを利用するということはAPIに文字列を送信するということなので、十分理解した上で翻訳APIの利用先と利用を決めてください。
Yandex API
無料で使えて登録も簡単な翻訳APIを調べていて初めて知りました・・・ ロシアでGoogleみたいなことやってるんですねー
翻訳APIの利用登録は非常に簡単で、GoogleアカウントがあればログインしてAPIキーを取得するだけで利用開始できます。
ドキュメントも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
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
使ってみる
国旗絵文字をリアクションすると、その国の言葉に翻訳されます。 翻訳API側が対応してないとbotからの返答がないようにしてあります。
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の取得の仕方については以下を参考にした
- chalice はやっぱり手軽でこういうちょっとした用途だと便利
- SNSを使って非同期にしてあるが単純にLambdaのinvokeでもよかったかもしれない
- その場合chalice側でLambda関数名が付与されるので、そのあたりをもうちょっとスマートにしてもらえるといいなーと
- 時間をみつけてchaliceのソースを見てみようと思った
- Lambdaなので外部APIとのやりとりもX−Rayを使えば可視化もできて便利
- 今回は利用してないが、他の翻訳APIも複数利用する場合とかあればX−Rayも使ってみたい
- やっぱりわくわくしながら作るのは楽しくて良いです
- やはり楽しいは正義ですね
以上になります。
SORACOM UG Tokyo #8 開催レポート #soracom #soracomug #iot
★この記事は「SORACOM Advent Calendar 2017」の 12/15 日分のエントリーになります
何を書くか・・・
IoT通信プラットフォーム SORACOM のAdvent Calendar 2017 です。 SORACOM を使った技術ネタでしたらなんでもOKです!
とあるので、本当は技術ネタの方が良いのでしょうが・・・せっかくSORACOM UG Tokyo #8
が開催された当日なので、それをネタにゆるーく書いていこうと思います。
技術ネタと話題のWio LTE
話は、これまでのSORACOM Advent Calendar 2017
で色々と書かれているのでそちらを見てくださいw
久しぶりの開催
前回の第7回目の開催が2017/07/05(水)
でSORACOM Conference 2017 “Discovery”
のナイトイベントとして開催したので、半年近く経っての開催となりました。
久しぶりの開催ということで、前回の開催からのニュースリリースを確認して個人的に気になるものを見てみると
まず、みんなびっくりしたのはKDDIグループとなったことでしょうか?
あとは、チップ型SIMやeSIMの提供が開始との話
Wio LTE
の機器販売のとWio LTE
自体が気になりました
もちろんこの他にもいろいろとリリースされてますので、あくまでも個人的に気になったという話です。
当日レポート
では、本題のSORACOM UG Tokyo #8 / eSIMとre:InventとちょっとだけWio LTE
の当日の様子を簡単ですがご紹介したいと思います。
当日の雰囲気は次のまとめをご覧ください。
会場
今回の会場はウイングアーク1st株式会社
さんのセミナールームをお借りしました。
素晴らしいセミナールムで開催できて大変助かりました。ありがとうございました。
帳票とBI | ウイングアーク1st
http://www.wingarc.com/
eSIM オーバービュー
1つ目のお話はSORACOM片山さんによるeSIM
のお話。
SIM自体の基本的な話から、既存のSIMとeSIM
がどう違うのか?
これからのSIMはどうなっていくのか?といった内容のお話でした。
資料と話の内容が非常に丁寧で、ぜんぜん詳しくない私でも理解できるような非常に素敵な発表でした。
資料は公開されましたが、是非SORACOMさんが開催しているオンラインセミナーSORACOM Bootcamp
にて再演していただけるといいなーと。
www.slideshare.net
あ、あとで #ソラコムサンタ
ハッシュタグつけてTwitterにつぶやいておこうw
今年も#ソラコムサンタ
開催中みたいなので、クリスマスが楽しみですねー
twitter.com今年もやります、 #ソラコムサンタ ! #soracom に期待したいこんなサービスやこんな機能、商品やイベントなんでもご要望がある方は #ソラコムサンタ ハッシュタグでつぶやいてください😄2016年のサンタはこんな様子でした^^https://t.co/EiCVPgd6NG pic.twitter.com/az0eiN8osY
— ソラコム公式 (@SORACOM_PR) 2017年11月22日
Wio LTE の紹介
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を体験するのには手軽でいい感じかもですねー
最後に松下さんがWio LTE
を使った実機デモを行い、クラウド側とデバイス側が双方向で通信している様子がわかる楽しいデモでした。
Wio LTE
のハンズオンなんかは今後も予定されているようなので
そのハンズオン会場で同じデモが見られるかもしれないですねー
ソラコムが見てきたAWS re:invent 2017 話
3つ目のお話は再び登場のSORACOM片山さんによるAWS re:Invent 2017
のお話。
SORACOMさんか参加されたのは片山さん1人とのこと。なので、自分が見てきた範囲でセッションの内容紹介をするとのことでスタートしました。
今年のre:InventではIoT関連のサービスが多数発表され、AWSがIoTに積極的に取り組む姿勢が感じられて嬉しかったとのこと。 また、会場では色々なIoTサービスやプロダクトの展示もあったそうです。
会場のハンズオンでAWS DeepLens
を触ったお話もありました。
スライド中では画像認識している若干ドヤ顏気味の片山さんの写真も紹介されていましたw
SORACOMさんにはグローバル向けのSIMもあるので、早速現地でAWS DeepLens
にUSBドングルをさして通信可能か試した話もされてました。
この中で話してのは画像?映像データはクラウドまで上がらずにどうやら機器内で判定がされ、結果のJSONだけが送信されてるとのこと。 これであれば、大容量の回線でなくても利用できるしかつ、画像や映像という色々な情報が入っているものの取り扱いを気にしなくてよくなるので、大変ありがたい感じですねー
AWS DeepLens
を開けてみたそうで
カメラはUSBで刺さってるだけだったそうですw
発表後に実物のAWS DeepLens
を開けていただけたので見てみましたが、確かに刺さってるだけっぽかったですw
日本ではまだ発売されませんが、他のデバイスでも代用可能そうなのでソフトの方を他のデバイスにもデプロイできるようになると楽しそうですねー
www.slideshare.net
ソラコム ビンゴ
最後は再び登場のSORACOM松下さんによるソラコム ビンゴ
去年の同じ頃に使う予定で作ったビンゴアプリが1年越しでやっと活躍だそうですw
しかし、1年はWebの世界では長かったようで使っているJSライブラリが大幅更新されていた&SORACOMのアイコンセットがだいぶ増えたので、結構修正しないと動かなかったとかw
コード自体はGitHubで公開されているとのことなので、この時期にビンゴをお考えの方いかがでしょうか?
ビンゴの方は順調に進んでいきましたが、アイコンセットの数が多いからなのか・・・なかなかビンゴになる人が出ないという展開にw
ビンゴの景品はSORACOMさん、seeedさん、ウィングアークさんから提供していただきましたーありがとうございました。
Groveセンサーってすごい便利で使ったこともあったのに、seeedさんの製品だとは全然知らなかったです・・・
Grove System - Seeed Wiki
http://wiki.seeed.cc/Grove_System/
Seeed Studio Bazaar, Boost ideas, Extend the Reach
https://www.seeedstudio.com/
最後は
SORACOM UG 恒例の集合写真で締めでした。 いつも写真撮影ありがとうございます!!
まとめ
- 今回はSORACOMさんから色々話が聞けて勉強になった
- 知らないことが知れるのは楽しい
- たまにはこう言った感じで開催するのもいいなぁーと感じた
- Javaはすごい(らしい)
- 資料の公開は楽しみにしてますので、是非よろしくお願いします!
- あと、#ソラコムサンタ 期待していますw
- アドベントカレンダーは間に合わなくてゴメンナサイ。
- 次回も楽しく開催したいのでよろしくお願いします!
明日も楽しみ「SORACOM Advent Calendar 2017」
12/25 の最終日までいろいろなネタが投稿される 「SORACOM Advent Calendar 2017」 明日以降の投稿も楽しみです!
ユーザーグループの開催レポートなのでゆるーく書いてしまいましたが、少しでもSORACOM UG
に興味を持っていただければ嬉しいです。
今後のSORACOM UG
開催についての情報は、募集サイトやSORACOMさんの公式サイト、SNS等で発信されていますので気になった方は是非参加してみてください。
以上になります。
Cloud Automator について #cloudautomator #swx
★この記事は「Cloud Automator Advent Calendar 2017」の 12/1 日分のエントリーになります
何を書くか・・・
AWSの運用を自動化する Cloud Automator の知見・情報など、Cloud Automatorに関することであれば何でもOKです🙆
とあるので、なんでもOKらしいので初日&AWSな方々はre:Invent 2017 でラスベガスだと思うので、ゆるーく書いていこうと思います。
技術的なこととか、深い話は今後のみなさんがきっと書いてくれるに違いないと信じておりますw
いつから
さて、Cloud Automatorはいつから提供が開始されたのか?調べてみると、次のニュースリリースが残っているのを発見しました。
これによると
となっており、今から約3年半ぐらい前からサービスとして提供されていたことがわかります。
200社を超えるAWS導入実績を持つ当社が、実環境で経験してきた様々な運用業務を「アクション」として実装しています。
となっていますが
を確認すると、現在は
600社4,000プロジェクト以上のAWS移行実績!
と記載があることをみても、時間の経過とAWSが利用されるスピードについて実感できるかと思います。
全然関係はないんですが、このニュースリリースなんでこんなにCloud Automator のロゴが大きいのかw Cloud Automatorのロゴを伝えたかったのか!?それとも何か秘密があるのか!?
今後の「Cloud Automator Advent Calendar 2017」で明らかになるのか楽しみですw
アップデート
次に大きな機能追加があったのは、「構成レビュー」自動化機能の追加でしょうか?サービス提供時と同じく調べてみると、次のニュースリリースが残っているのを発見しました。
これによると
「構成レビュー」自動化機能の提供を2016年6月1日(水)より開始いたします。
となっており、今から約1年半ぐらい前からサービスとして提供されていたことがわかります。意外と最近ですねw
どうしたら
Cloud Automator を使い始めるのはどうしたらいいのか?
公式サイトからサインアップしてもらえれば、構成レビュー⾃動化機能は対象外となりますが1ヵ⽉の無料トライアルを行えます。
もしくは、pieCeというサービスに加入いただいている場合には、すぐにすべての機能をお使いいただけます。
今後は
Cloud Automator の今後はどうなるの?という方は次のロードマップページをご覧ください。
こんな機能が欲しい!こんなことをしたい!との要望は
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」 明日以降の投稿も楽しみです!
初日なのでゆるーく書いてますが、これからはもっと中の詳しい話や便利な使い方なんかが出てくるのを期待ですね!
あと、埋まってないところがあるようなので我こそは!という方の参戦もお待ちしております!
宣伝
サーバーワークスでは積極採用中です。もちろんCloud Automatorの開発チームも採用中ですので、Cloud Automatorに興味がある方是非お声がけください!
以上になります。
#Serverlessconf Tokyo 2017 でやった Workshop に機能を追加してみた #serverless #ACG
今年の
今年も大盛況の開催だった Serverlessconf Tokyo 2017
の1日目に開催された pre-conference Workshop
に参加しました。
幾つかの Workshop から選択できたのですが、私が選択したのは
Build your own serverless video sharing website with Lambda, API Gateway and Firebase
という、Youtubeクローンのようなものを作ってみるというWorkshopでした。
内容は上記のgithubの内容を見てもらえればわかるのですが、ドキュメントが非常によくできているので指示通りに進めて行くとサクサク進んでいきます。
さらに日本のServerlessconf Tokyo 2017
のスタッフの方が、日本語訳したものまで用意してくれる素敵な対応。
実際に
当日は @sbarski
の丁寧な説明を受けつつ、Workshopを進めて行く感じでした。
また、サポート役として @ijin
と @toricls
と @horike37
というクラウド界隈で有名な方々がなぜか参加しているという素敵な状況でした。
Workshop自体のできがよく、さらにサポートも充実しているので予想よりも全体的な進捗がよく終わってしまう人がかなりいました。
そこで、終わった人はWorkshopで完成したものに新規で機能を追加してPull Requestを送ってみてはどうか?という無茶ぶりがw
公開されているWorkshopが需実していくのはいいことなので、私も何かしよう!と思ったのですが、LambdaがNode.jsで書かれているというね・・・
結局
当日は不慣れなJavaScriptに苦戦して何も追加できずでしたので、せっかくだから空いた時間を使ってチマチマと機能を作ってみました。
Lesson 6
として追加したのは、Webブラウザ上から動画ファイルを削除できる機能の追加です。
普通すぎる機能なんですが、アップロードが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を送ってみました。
他にも心配な点がいくつか・・・
- 手順書の英語がわからん。
- 日本語版を書いてそれをGoogle翻訳しただけw
- フロントエンド側のJavaScriptがわからん。
- 動くようには書いたけどスマートじゃない気がするけど力尽きたw
- Pull Request の英語がわからん。
- 空き時間でのんびり作ってたらすごい時間かかった
- 絶賛開催中の
AWS re:Invent 2017
でWorkshopに使えそうなサービスが出そう。というか出てるきがするw
- 絶賛開催中の
ちなみに @sbarski
はAWS 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
の方は残念ながら動画が非公開っぽいですねー
SRV401
の方は動画が公開されていて見ることができるようです!
この他のAWS re:Invent 2017
動画は順次公開されているようなので、私と同じく現地参加できなかった人にはありがたいですよねー
来年は参加したいなぁー去年もそんなこと言ってましたがw
まとめ
- 時間はかかったけどのんびり進められてなかなか楽しかった
- やっぱりJavaScriptはよくわからなくて難しい
- Workshopがシンプルなのでコード類もシンプルで素敵
- AWSを知っている人なら、本当にサクサク進められるのでオススメ
- サクサク進むけど出来上がるものは動きもあって達成感もある
- 良い機会を得られたのが良かった
- 他の参加者のかたも是非!新機能を!
Serverlessconf Tokyo 2017
スタッフの皆さんありがとうございましたー
以上になります。
textlintを使ってAWS用語をチェックしてみる #aws #textlint #golang
最近のアップデート
Cloud Automator のアップデートでログイン中の操作画面にマニュアルのリンクが表示されるようになりました。
もちろんマニュアルだけでも閲覧できますので、気になった方は無料トライアルでCloud Automator を試してみてください。
Cloud Automator – 株式会社サーバーワークス サポートページ
https://support.serverworks.co.jp/hc/ja/categories/115001305127
ドキュメントを充実させるには
ドキュメントを充実させていくには、地道に書いていくしかないわけで・・・Cloud Automator についても開発メンバーで分担しながら作っています。
その際ちょっと気になってくるのが表記のゆれ
です。
これは多人数でなくても1人で書いていても、書いている時期が異なると表現が異なるとかありますしね。
細かい言い回しならそこまで気にする必要もなさそうなのですが、Cloud Automator の使い方や機能を説明していくと当然ながらAWSについても言及する必要が出てきます。
AWS用語
で表記のゆれ
が出てしまうとユーザーは気になりますし、検索する場合にヒットせず困ることも出てきそうです。
そこでAWSの公式ドキュメント
に載っている日本語のAWS用語
を利用して、表記のゆれ
をチェック行ってみます。
アマゾン ウェブ サービス : AWS の用語集
https://docs.aws.amazon.com/ja_jp/general/latest/gr/glos-chap.html
ツールを探してみる
表記のゆれ
をチェックできるツールとして知っているのは以下2つ。
今回は対象のファイルがMarkdown
ファイルであるのと、手元で手軽に動かしたたいので、npmでインストールできるtextlint
を利用してみます。
また、prh形式のYAMLでルールを指定できるように次のツールも利用してみます。
ルールを作ってみる
チェックを行うためにはルールを作る必要があります。
AWS用語
については公式にドキュメントとしてまとまっているので、これを利用するために次のような簡単なコマンドラインツールをgolangで作ってみました。
できることは単純で、日本語のAWS用語
ページをスクレイピングしてprhで使える形式のYAMLファイルを出力します。
詳細はGitHub上のREADME.md
ファイルを参照してください。
スクレイピングにはgoquery
というgolangの便利なライブラリを利用しています。
実際のYAMLファイルを見てもらえば分かりますが、単純に用語をそのまま抜き出しているものと、半角スペースで分解して単語単位で抜き出してものがあります。
たとえば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
を利用してチェックできるようになりました。
しかし、実際にドキュメントを書く作業をしてみるともうちょっと便利にできそうな感じがするので試してみることにします。
私の場合ドキュメントを公開するまでに、
Markdown
形式でドキュメントを書く。textlint
でチェックし、修正があればなくなるまで繰り返す。Zendesk Guide
にドキュメントを反映するためにMarkdown
形式からHTML
形式に変換する。Zendesk Guide
にHTML
形式でドキュメントを反映し、画像の追加や装飾などを行う。- チームメンバーにレビューをしてもらい、指摘があればなくなるまで修正を繰り返す。
の定型作業を行っているので、この作業を効率化したいわけです。
最終的にはZendesk Guide
にHTML
形式で記載することになります。
ですので、最初からHTML
形式で書く方が効率的なの気もしますが・・・
個人的にはMarkdown
形式の方が書きやすいので、Zendesk Guide
がMarkdown
に対応してくれるとうれしいなぁー
と言っても、そこはどーにもならないので次のような簡単なコマンドラインツールをgolangで作ってみました。
できることは単純で、Markdown
形式からHTML
形式に変換できます。加えて、この変換作業の前後で任意のコマンドを実行できるので、今回はtextlint
を実行する形にしています。
ただし、textlint
は別のプログラムなので事前にtextlint
のインストールや設定は必要となります。
詳細はGitHub上のREADME.md
ファイルを参照してください。
Markdown
形式からHTML
形式への変換にはblackfriday
というgolangのライブラリを利用しています。v2への移行が進んでいますが、今回利用したのはv1になります。
出力するHTML
ファイルにclassを動的に追加したいなら、v2に追加されたParseを利用して実現できそうな気がします。時間ができたら要確認かなぁ。
また、何度もチェックして変換する工程を繰り返すことが予想されるので、fsnotify
というgolangのライブラリを利用して、ファイルの変更検知をできるようにしてあります。ファイルの変更を検知してチェックと変換を繰り返し実行します。
CLI化するのには有名なので説明不要だと思われるcobra
というgolangのライブラリを利用しています。
作ったものを使ってみる
せっかく作ったので使ってみるわけですが、前述したとおり変換前と変換後に外部コマンドを実行できます。
今回は変換前に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へ積極的にフィードバックしておきましょう!そのうちきっと修正してもらえるハズ
アマゾン ウェブ サービス : AWS の用語集 - EBSbacked
https://docs.aws.amazon.com/ja_jp/general/latest/gr/glos-chap.html#EBSbacked
Zendesk Guide
にMarkdown
形式が追加されてほしい- そー考えるとHatena Blogすごい書きやすいんだなーとあらためて思った
- golangは相変わらず便利、そしてちょー楽しい
blackfriday
はv2を使っていないので今後使ってみたいfsnotify
は便利だったので今後も使っていきたい- 当然このblogも
Markdown
で書いているのでtextlint
を使ってチェックした
以上になります。
Visual Studio Codeに拡張機能がインストールできない場合の対処方法 #vscode #docker
アップデートエラー
Visual Studio Code(以下VS Code
)の拡張機能でDocker
がありますが、この拡張機能の0.0.19
へのアップデートで
end of central directory record signature not found
というエラーが出てアップデートができなくなりました。
拡張機能のDocker
をアンイストールして、再インストールしようとしても同じ結果に・・・
調べてみると
GitHubにissueが上がっていて
次のissueと同様の対応をすると解決するとのことなので
解決方法が載っているというissueを読んでみると
と書かれており、つまりは拡張機能をブラウザを使ってダウンロードして、ダウンロードしたローカルファイルからインストールすれば解決すると。
さっそく試してみる
拡張機能インストールファイルのダウンロード
issueには拡張機能のPythonをダウンロードできるURLが記載されていて、Google先生で調べるとこのダウンロード用のURLを自分で編集してインストールパッケージをダウンロードすると書かれたBlogが多数ヒットします。
しかし、上記のリンクを確認すればわかりますが、拡張機能の個別ページにはパッケージをダウンロードできるリンクが存在します。
Download Extension
をクリックすれば、インストール用のパッケージがダウンロードされます。今回のDocker
であればPeterJausovec.vscode-docker-0.0.19.vsix
というファイルになります。
ローカルファイルからの拡張機能インストール
ダウンロードしたPeterJausovec.vscode-docker-0.0.19.vsix
を利用して、拡張機能インストールします。
[表示] → [コマンドパレット]でコマンドパレット
を表示します。コマンドパレット
のメニューから拡張機能: VSIX からのインストール
を選択します。
するとファイル選択のダイアログが表示されるので、先ほどのファイルPeterJausovec.vscode-docker-0.0.19.vsix
を選択するとインストールが開始されます。
インストールが正常に完了すると、再読み込みをうながすメッセージが表示されますので今すぐ再度読み込む
ボタンをクリックして再読み込みを行います。
インストール済みの拡張機能一覧にDocker
の表示があればインストールが正常に完了したことになります。
まとめ
- 特に何もしていないのに急にアップデートできずエラーになった
- 調べてみたら同じような人がいた
- 対処はインストールパッケージをローカルにダウンロードして、ローカルファイルからインストールを実行するだけ
- いろいろ複雑に書いてあるBlogもあるが、たぶん情報が古い
- もし同じような症状の人がいるなら参考にしてほしい
- 原因がわからないので再発しないといいなぁー
以上になります。
Raspberry Pi 3+Gmail APIでメールを受信して音声合成してみた #raspberrypi #gmail #golang
メールで
仕事では殆どメールを見る機会はないのですが、通知系のメールに気が付かなかったという経験をしたことがある人は多いはず。
今回はGmail のAPI を使ってメールを定期的に受信して、条件に合うメールの場合は音声で通知できる仕組みを Raspberry Pi 3
とGamil API
を利用して作ってみたいと思います。
Gamil API
利用を開始するまでにはいくつかステップがあって、いろいろなBlogで書かれていますが上記の公式サイトにあるQuickstart
で、利用する言語毎に書かれているドキュメントの通りに進めるのをおすすめします。公式ドキュメントが充実しているのと最新の情報が記載されているため、手戻りすることなく進めることができます。
今回は当然大好きなgolang
を利用するので以下に沿って進めていきます
Go Quickstart | Gmail API | Google Developers
https://developers.google.com/gmail/api/quickstart/go
準備
Google Developers Console
まずはGoogle Developers Console
にアクセスして
Google API Console
に移動します。
表示されたAPIの一覧からGmail API
を選択します。
プロジェクトが存在しないとAPIを有効化できないので、先にプロジェクトを作成します。
既存のプロジェクトでAPIを有効かする場合には、当然ですが新規にプロジェクトを作成する必要はありません。
APIを有効化しただけでは利用ができません。認証情報を作成する必要があります。
OAuth クライアントIDを取得するのですが、先に同意画面の設定が必要になります。
クライアントIDのアプリケーションの種類はその他を選択します。
設定が完了すると認証に必要な情報をJSONファイルとしてダウンロードすることができるので、ダウンロードして保存します。
詳細は以下の公式ドキュメントに書かれています
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/...
実際に取得されるのは以下のパッケージになります。
パッケージの利用方法は、それぞれのパッケージに用意されているドキュメントを確認してください。 サンプルについてもパッケージのリポジトリにあるので参考になるかと思います。
動作確認
続けて動作と認可の確認を行います。
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になるのでブラウザにコピペしてページを表示します。
ブラウザに表示したら認可を与えるアカウントを選択します
認可の内容を確認します。今回は読み取りのみを指定しています。
問題がなければ許可をして、その後の画面に表示されるコードをターミナルに貼り付けます
これで次回の動作からはクライアント側に保存されたtokenを利用してアクセスすることができるようになります。
作ったもの
実際に作ってみたものは以下の写真のような感じに
使ったのは
- Raspberry Pi 3 MODEL B
- USB電源スピーカー(MS-UP201BK)
- USB電源LEDライト(100円ショップ)
ぐらいで、ラズパイはAmazon Echoもどきで遊んだ時のやつを再設定して利用しましたし、LEDライトは100円ショップで適当に買ったやつですし、唯一スピーカーが手元になかったので700円ぐらいのものを買った感じですね。
ラズパイだと情報も多いですし、選択肢もいろいろとあるんですが手間もかけずに適当に作れるのはいいですねー
Raspberry Pi 3 MODEL B
特別なことは何もしておらず、普通に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 をインストールしてあります。
ラズパイ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
今回はなるべく手軽に実現したかったのでAquesTalk Piを選択しましたが、他にも
Open JTalk
http://open-jtalk.sourceforge.net/
なんかを利用している人が多いようです。
また、クラウドサービスを使って音声合成をすることももちろん可能なのですが、今後家のネットワーク以外の例えばSORACOM Air
なんかを利用したい場合を考えると、ラズパイ側で処理できるなら処理した方が良いかなーと。
クラウド側で処理する場合は
あたりが定番でしょうか?
意外だったのはGoogleにはTTSのAPIがなさそということでしょうか・・・音声認識はあるので、内部的には当然あるんでしょうけど。
あとは、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
やっていることはGmailをAPI直接ではなく、golangのSDKを利用して受信しているだけです。
特に変わったこともしていないので、何の参考にもならないかもしれませんが・・・
動作の設定で記述が必要なのは.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音声合成できたー楽しい pic.twitter.com/ZRDM7dXPoG
— Manabu Uchida (@uchimanajet7) 2017年9月6日
な、感じになりました。思ったよりちゃんと音声合成できていて個人的には十分かなぁーと思いました。
まとめ
- 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 みたいなのを導入するのもありかもしれない
- 雑に扱っても大丈夫というのが1つの目的だったので自作はなるべくなし
- golangはいろいろできて楽しい
- 急に喋り出すので若干びっくりする
- 特に夜中とか怖いw
- 要望は叶えられたので便利にはなった
- また機会があればぜひなんかやってみたい
以上になります。