友人が作成していた https://github.com/skirino/croma に、 Mix.env の値によってコンパイル時に def として解釈するか、 defp として解釈するマクロがあります。 その使われ方が面白かったのでメモ。 その箇所だけ切り出して、参照値を環境変数のMIX_ENVにしたものが以下の Functions モジュールです。それをimportする Defpt モジュール、利用する Alexa と Alexaを呼び出す Me 。この Alexa で定義している defpt が今回の対象です。 これを見ると、 Me の中の Alexa.hello が、MIX_ENV == “test” の時はアクセス可能だけれど、それ以外ではundefined function errorになることがわかります。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review,…More
Category Archives: development
[Elixir]withとelseとguardsと。
Elixir 1.3では、 with に対して else や guards を使えるということで、少し試してみました。1.3の時と、1.2.4の時で無理やり書いた時。 http://tuvistavie.com/tokyo.ex 簡単な、 %{width: 10, height: 20} から値を取得して、それに対して幾つかのエラーケースを実践するという内容です。 1.3 さっとまとまる。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters…More
Documents for Bots
完全にメモ。ちょとだけ使ってみた。 Facebook botは以下 https://developers.facebook.com/docs/messenger-platform/quickstart Line Botは以下 https://developers.line.me/quick-start-guide いずれもCallback URLを設定できれば軽く使えるかんじ。More
[Erlang][Elixir]erlyberlyでErlang/Elixirのdebugをサポート
Erlang/Elixirのdebugを楽にするツールを知ったのでメモ。 https://github.com/andytill/erlyberly http://blog.plataformatec.com.br/2016/04/how-to-trace-elixir-nodes-with-erlyberly/ 実行のワンライナーは以下。 これが全て終わって、JavaのGUIが表示されたら、例えば以下のようにnodeを指定してアプリを起動します。 起動後、Javaで表示されているtarget nodeに “foo@127.0.0.1” を指定。 すると、メモリ使用量とか、諸々を確認することができる以下のような画面を確認できるようになります。 以下は、この簡単なPhoenixアプリケーションに対して実行した時。 対象 https://github.com/KazuCocoa/web_qa_vote 以下は、http_proxyに対して。 対象 https://github.com/KazuCocoa/http_proxy いずれも、BEAM VMのprocessやatomなどのメモリ使用量が計測できてとても良いですね。atomがGCされないので、これが過度に大きいとメモリ圧迫している、とか簡単にわかりますし。あとはfunctionsの名前空間の形もパッと見ることができますね。 https://github.com/andytill/erlyberly#get-the-process-state にあるように、processの状態を抜くこともできるようです。 ある程度はObserverでも見ることができますが、メモリ使用量をこんな感じでグラフにしてくれるのは解りやすい。Java製。More
[Elixir]Structs, String-keyed Maps, Atom-keyed Maps
Elixirの実装を書いている時、データを保持したりする時にStructs、String-keyed Maps、Atom-keyed Mapsのどれを使えばいいかよく悩んでいました。今日も悩んでいて、何かベストプラクティスないかな、と考えていたところ、ちょうど私の考えと同じものがあったのでメモ。 それぞれは以下な感じで書くことができます。 BEAM VMにおいて、atomはCGされません。そのため、どうてきにatomを生成することは良くない、と知っていました。その上で、何が一番妥当なのかなーと思ってたら、以下ページが見つかりました。 https://engineering.appcues.com/2016/02/02/too-many-dicts.html ルールは以下。 1. Always Use String-Keyed Maps for External Data 2. Convert External Data to Structs ASAP 3. Use Structs in All Other Code 4. Use Structs for Output Data 5. Avoid Using Atom-keyed Maps That Aren’t Structs 6. Use Keyword Lists Only for Function Arguments Structsで定義していたら、 defprot や…More
[Alexa]learn skill kit more
Alexaは、単にテキストを話すほかに、意図した感じでテキストを話させることが可能です。 そのために、SSML(Speech Synthesis Markup Language)形式でテキストを書きます。 Speech Synthesis Markup Language (SSML) Reference https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/speech-synthesis-markup-language-ssml-reference 例 以下のように type と speech を与えると、Alexaは “Hoge (0.5秒間を開けて..) Hoge” と話します。 また、以下のようにすることで、音楽も流すことができるみたいです。実際、流れました。 2016年4月9日現在、サポートされているタグは以下のようです audio break p phoneme s say-as speak https://github.com/KazuCocoa/alexa-wise-guy また、Alexaは外部に向けてHTTP通信で取得した値を使うこともできるみたいです。 参考に、以下では取得した情報を話していました。 https://github.com/KazuCocoa/alexa-tide-pooler/blob/master/src/index.js#L341 参考 https://github.com/KazuCocoa/alexa-tide-pooler https://github.com/KazuCocoa/alexa-wise-guy ここまで調べて、やりたいことはできそう、までわかった。More
[Elixir]PubSub機構をサクッとつくる
Elixirは receive があらかじめ用意されている。そのため、 send で特定のプロセスに送ったメッセージを受け取って、何らかの処理をするというコードが容易にかける。それを使い、PubSubをするコード。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters defmodule PubSubServer do def start(subscriber_callback \\ nil) do spawn…More
[Lambda]Hello World via Alexa
Amazon EchoのSkill Kitが面白い。 Amazon Lambdaを使って簡単なSkill Kitを使ったアプリケーションを作ることが可能なのだが、本当に対話的なやり取りを実現できる。 https://github.com/amzn/alexa-skills-kit-js/tree/master/samples/helloWorld このサンプルを使うと、 私 > Alexa, ask greeter Alexa > Welcome to the Alexa Skills Kit, you can say hello 私 > Hello Alexa > Hello World と言う感じで応答ができる。この時、私がHelloというまで You can say hello と言いながらある程度待ってくれる。 体験が変わる。 さぁ、こういう体験が出てきた時、 Quality はどうなるだろう。 ちなみに、まだ日本語は発してくれない。 https://github.com/KazuCocoa/alexa-helloworldMore
[Elixir]Keywordの中身はTupleのList
Elixirに置いて、Keyword listはTupleで表現される。 なので、 のようなパイプを書いた時、取得されるのは [“hello”] になる。 ここで、Elixir v1.2.3 の Keyword.valuesの中身を覗いてみると、以下のようにmapを適用した中でTupleからちょうどvalueを取得してListを作って返している。 当初、 しか Keyword 系は使えないと思っていたけれど、Erlangレベルでは なので、Keyword listとみなしてKeyword操作ができるのですね。学びだ。 蛇足だけれど、 Enum.any?/2 と言う、処理の途中で要素が見つかったらtrueを返す用途で使うfunctionも教えてもらった。なるほど。More
[Erlang][Elixir]Efficiency Guide User’s GuideでErlang/Elixirを知る
ErlangのEfficiency Guideが役立ったので、メモ。 Erlang/Elixirをやるなら知っておくべきことが多数ありました。 私が読んだのは、version 7.3 http://erlang.org/doc/efficiency_guide/introduction.html また、 http://erlang.org/doc/efficiency_guide/advanced.html にはAtomと言った型に対する制限であったり、メモリの制限などのまとまった情報を得ることができます。他、List操作に対する注意ごとや、tail recuesiveにすることの良さなど。More