ぜったいってなに

Software Engineerのブログです。

yieldを使ったメソッドを書けるようにする

Amazonに電話する時間がなかったのでASK開発はおやすみ。


Scalaの勉強をしていてyieldという単語が出てきた。

こいつ、業務で書いているRubyでもよく見かけるけど、なんなのかよくわかっていない。

そこで今日は、Scalaは一旦置いといて、「Rubyでいうyieldってなに」を解消することにする。

ググって出てきた記事を読んでみる。

d.hatena.ne.jp

読んだ内容をまとめると、

  1. Rubyではすべてのメソッドにおいて、ブロックを引数として渡すことができる。
  2. ブロックには手続きを書くことができる。例えば{p "hoge"}て感じで。
  3. メソッドの引数にブロックを渡した場合は、ブロックは
    Procクラスのオブジェクトとしてメソッドに渡される。
  4. 渡されたProcオブジェクトはyieldで呼び出せる。

つまりyieldは、

yieldが宣言されているメソッドに渡されたProcオブジェクト(手続き)を呼び出すメソッド」

で、あってるはず。

適当に検証してみる。

$ irb
irb(main):001:0> def hoge
irb(main):002:1>   yield
irb(main):003:1> end
=> :hoge
irb(main):004:0> hoge{p "fuga"}
"fuga"
=> "fuga"

確かに、特にブロック引数を定義していないけど呼び出せました。

次はProcオブジェクトとして手続きを定義してメソッドに渡してみる。
ブロック引数であることを明示するには、引数の頭に&をつければいいらしい。

irb(main):005:0> block = Proc.new{p "hoge"}
irb(main):006:0> hoge &block
"hoge"
=> "hoge"

おお、ちゃんと動いた。

使い方はわかった気がするけど、用途がよくわからないので、
もう少し調べる必要があると思う。

ASK(Alexa Skills Kit)を触ってみる その2

ASKを触ってみるという記事を書きました。

その後も触ってみてはいるのですが、前段階で色々と調べる必要があることが多く進捗がよろしくないため、
ある程度形になってからまとめて投稿しようか迷っていました。
が、毎日投稿しないと続かなさそうなので、まとめるのは後にして、
その日やったこと、思ったことを書いていくことにします。

以下画面で「Alexa Skills Kit」を選択。

f:id:zettaittenani:20170821232104p:plain

するとこんな画面に移動して、作るSkillのことを色々訊かれる。
「何のために作るんだ」「これでお金儲けるつもりあるか」「Skillの対象年齢は?」など。

f:id:zettaittenani:20170823202849p:plain

適当に選択して進めていってみると、AWS LambdaのService Endpointを指定するように言われる。

f:id:zettaittenani:20170823204607p:plain

こんな感じで。

EndpointというとURIか。

調べてみるとどうやらSkill作成においてはAWS Lambdaを使う、ていうのがスタンダードっぽい。
(むしろ他のやり方ができるのかわからない)

qiita.com

個人のAWSアカウントを持っていないので登録してみたが、
クレカ認証がうまくいかず、今日は断念。

TODO: Amazonに問い合わせてAWSが使えるようにする

ASK(Alexa Skills Kit)を触ってみる

標題の通りです。

音声アシスタントはスマートフォンの次のプラットフォームとして期待されていて、
海外では既にかなり普及しているようです。
Amazon EchoGoogle HomeLINE Clova
NTT docomopetocoなど、いろんな企業が市場に参入されてますね。


ASKについて

Amazon EchoにはAlexaという音声認識サービスが乗っかっていて、
AlexaはインストールされているSkillを使って音声を解釈してくれます。
Skillはdeveloperが自作して公開することができます。

自分なりの解釈ですが、
Amazon Echo, Alexa, Skill それぞれの関連については、
スマホと並べて考えるとわかりやすいと思います。

詳細に関してはこちらの記事がわかりやすかったです。

dev.classmethod.jp

記事にも説明がありますが、Amazon Echo以外にもFire TV, Echo Dotなど
他のAmazon製のハードウェアにもAlexaが搭載されている、らしい。

読み漁った感じ、音声認識などのハードのめんどくさい部分はサポートされていて、
テキスト情報として受け取った情報を処理して、形を整えて、
テキストとして返却したらOK、みたいにみえる。


触ってみる

こちらStart a Skillボタンをクリック。 開発者情報などを入力したらWeb UIに到達。

f:id:zettaittenani:20170821232104p:plain こんな感じ。

全然触れてないですが、今日はここまで…。


その他読んだ記事。

kisha-poppou.com

本家説明はこちら。 developer.amazon.com

GraphQLに対する私見

先日催されたRejectKaigi2017にて、gfxさんがGraphQLをRailsで使う、というお話をされていました。

blog.bitjourney.com

本家を見てみてると、Rubyではこんな感じで使えるみたいです。

ありがたいことに閉会後gfxさんとお話する機会があり、
RESTful APIに対する利点として下記を挙げられていました。

  • クエリと返却値の形が似るように設計されており、制約があるためAPI設計がしやすい。
  • API consoleであるGraphiQLが使いやすい。


API設計がしやすいことは大きな利点だと思いました。

私は作ったことないのでわからないんですけど、
Web APIの設計って難しそうですよね。
もしRESTful APIで外部公開のAPIを作るならば、
他のWebアプリのAPI設計を見て、
あーなるほどこんな感じがわかりやすいんだろうなーじゃあこうするか。
くらいの曖昧な感じで仕様を決めると思います。
GraphQLはそういった「なんとなくよさそう」を制約で縛ってくれているように見えます。

ScalaのServer Libraryもあるみたいなので、
PlayでWebアプリケーションを作るときに使ってみようと思います。

自己紹介

はじめまして。
zettaittenani と申します。 Webエンジニアです。

業務ではRubyを、プライベートではScalaを触っています。
開発に限らず詰まったこと、わかったことなどを書き記していこうと思います。

よろしくお願いいたします。