ぜったいってなに

Software Engineerのブログです。

Play Scala Controller, Viewの追加

やること

  • Controllerを定義する。
  • Viewを定義してブラウザ上で表示させる。

設計はこちらを参考に。




やったこと

/app/controllers下にArticleController.scalaを作成する。
書き方は既存のサンプルのControllerに倣う。

package controllers

import javax.inject._
import play.api._
import play.api.mvc._

@Singleton
class ArticleController @Inject() extends Controller {
  def index = Action {
     Ok(views.html.article.index("Articleだぞ"))
   }
 }



次に、/app/views/下にarticleディレクトリを作成して、
その中にindex.scala.htmlを定義する。

@(message: String)
<h1>Articleです</h1>
<p>ぜったいってなに</p>


詳しくはわかってないけど、現状viewに渡したmessageは呼び出さないと
「controllerで引数渡してるのに参照してねえぞ」みたいなエラーが出るので、
しょうがなく@(message: String)を書いておく。



次。
/conf/routesでroutesを設定する。 書き方は既存に倣う。

GET     /article                    controllers.ArticleController.index



画面を作るのに必要そうなことはやった。

projectのhomeディレクトリでactivator runして
localhost:9000/articleにアクセスする。

f:id:zettaittenani:20170906224428p:plain

ださ。
90年代のホームページってかんじ。

でもまあとりあえずできた。



  • TODO
    • DB接続 (postgresql)
    • model定義
    • seedsでレコードサンプルを定義して適当に一覧表示する

転職ドラフト

登録しました。

job-draft.jp

明日ドラフトだって聞いたのでレジュメ頑張って書いたんですけど
審査通らなくて、修正して再申請したけど駄目だったんで今回は諦めます。

これで自分のおおよその市場価値をはかろうと思ったんですがそもそも土俵にすら立ててないですね。
「技術に関するアピールをもっと書いてください」ていうフィードバックをいただいたんですが、
技術に関して「俺こんなんやったぜ!」みたいに言えること特にないなーと思って。
まずいな。

Play ScalaでWebアプリケーションを作る

標題の通り。

ブログっぽいものを作る予定。

「Play ScalaRailsみたく触れるようにする」が目的。
ゆくゆくはGraphQLでAPI実装とかやる。

アプリのテーブル設計はこんな感じ。
超シンプル。(sqldesignerで書きました) f:id:zettaittenani:20170904070457p:plain

user: ログインユーザ
article: 記事
comment: 記事に対するコメント

記事はひとまず画像とか無しで、文字のみ。

画面設計は以下をイメージしている。

画面 Controller action
Home Home index
ログイン画面 User login
記事一覧 Article index
記事詳細 Article show
記事新規作成 Article new
記事編集 Article edit


記事一覧に「記事を新規作成する」ボタンがあって
記事詳細に「記事を削除する」ボタンがある。
記事詳細ではcommentも投稿できて、
投稿したらComment#createしてArticle#showに戻る、かな。

Rails書いてていつも思うけど、User#loginてリソースルーティングに乗ってないけど
無理矢理にでも、たとえばUser#newlogin機能を割り当てたりしたほうがいいのだろうか。

「名前は実体に即するように」 VS 「Railに乗る」

で、気になって調べたけど、Railsではこんなかんじに書いてある。

んー基本的には
「resourceに対する操作でリソースルーティングに含まれるactionに
適切なものがあるならばそれを選んで、ないならば別でactionを定義する」が正しいか。

じゃあ今回はUserindexしないしshowしないしnewしないしcreateしないし、、、で
User#loginが正しいことになるか。

何かご意見ありましたらください。

まま、とりあえず設計はおいといて手を動かすということで、
IntelliJ IDEA上のSBT Shell上でrunして localhost:9000で動かしてみました。

f:id:zettaittenani:20170904231718p:plain

Initしたぞ。

以上。

今週はおやすみ

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

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

 

土日に色々考えます。

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

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

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よりもっと使いみちがわからんけど
ひとまず定義っぽいものはわかったのでよしとする。