ぜったいってなに

Software Engineerのブログです。

今週はおやすみ

今更ですが今週は業務が忙しすぎるのでブログおやすみします。

毎日書くって伝えた方々、すみません。

 

土日に色々考えます。

そもそも毎日書くかどうかとか。

忙しい時期は内容の質が下がってしまうがどうするかとか。

1週間の基本スケジュールを決めたりとか。

AWSのプロビジョニングツール

同環境のAWSサーバを複数構築したい、という状況が発生した。
調べたことをメモしておく。

イメージとしてはVagrantfileやDockerfileのように
設定ファイル書いてコマンド叩いたらはいできたー、っていうのが理想。


方法1

AWS CloudFormationを利用する。

そもそもAWSがプロビジョニングの機能を提供していた。
知らなかったけど言われてみればまああるだろうな、というかないといろんな会社が困るだろうな。


方法2

Terraformを利用する。

Vagrantを提供しているHashiCorp社のツール。
AWSに限らず、Herokuなど様々なクラウドサーバのプロビジョニングができるみたい。

下記の記事を読んでみると、CloudFormationより痒いところに手が届きそうな感じに見えるが、
コンポーネントによっては対応していないものもあるよう。

dev.classmethod.jp


まとめ

まだいろいろと決まっていないので何とも言えないが、
Terraformが利用できるコンポーネントにはTerraformを、
それ以外にはCloud Formationを使う。
できればどっちも使ってみて所感を書きたい。

Amazon関連の記事がなかなか「やってみました」まで進まない…
明日こそAmazonに連絡取るぞ。

Scalaのpimp my libraryを試す

参考文献

Implicit · Scala研修テキスト


pimp my libraryとは

  • ScalaのImplicit conversion (暗黙の型変換) の機能の中のひとつ
  • 既存のクラスにメソッドを追加して簡単に拡張できる
  • 例えばこんな具合
implicit class RichString(val src: String) {
  def smile: String = src + ":-)"
  def wink: String = src + ";)"
}

やってみる

sbtコンソール上でメソッドを定義して試す。

scala> implicit class RichString(val src: String) {
     |   def smile: String = src + ":-)"
     |   def wink: String = src + ";)"
     | }
defined class RichString

scala> "Hello! ".smile
res0: String = Hello! :-)

scala> "".wink
res1: String = ;)

所感

良さそうなところ
  • めんどくさいこと考えずに既存クラスに機能追加できる
良くなさそうなところ
  • 使い方によってはコードの保守性が低くなりそう
  • 例えばこんなこともできちゃう
implicit class Bug(val src: String) {
  def one: Int = 1
}

実行するとこんなかんじ。

scala> implicit class Bug(val src: String) {
     |   def one: Int = 1
     | }
defined class Bug

scala> "hogehoge".one
res2: Int = 1

scala> "two".one
res3: Int = 1

Stringのメソッドを叩いたらInt型が返ってきちゃう。


今後のこと

DwangoさんのScala研修テキストや本でScala学習をしてきたけど、そろそろなんか作ってみたい。ものを作っていて引っかかったところは調べるってやり方だと体系的に学びにくいので、「説明書を読んでからやる」っていうやり方は必要だと思いつつ、やっぱり退屈ではある。

Scalaのyield

今度はScalayieldについて調べてみる。

下記ページがわかりやすかった。

Scala forメモ(Hishidama's Scala for Memo)

引用すると、

基本的なfor式では戻り値は無い(戻り型がUnitなので常に「()」が返る)が、yieldを付けることによって、繰り返した本体の演算結果を返すことが出来る。

Scala yield」でぐぐってもfor式の説明しか出てこなかったので
Scalaではこれがyieldの全てなんでしょう、多分。

実際にsbt consoleで試してみる。

scala> for (i <- 1 to 5) yield i * 5
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(5, 10, 15, 20, 25)

scala> for (s <- Array(1, 2, 3)) yield s * 3
res1: Array[Int] = Array(3, 6, 9)

Rubyよりもっと使いみちがわからんけど
ひとまず定義っぽいものはわかったのでよしとする。

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