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
にアクセスする。
ださ。
90年代のホームページってかんじ。
でもまあとりあえずできた。
- TODO
- DB接続 (postgresql)
- model定義
- seedsでレコードサンプルを定義して適当に一覧表示する
転職ドラフト
登録しました。
明日ドラフトだって聞いたのでレジュメ頑張って書いたんですけど
審査通らなくて、修正して再申請したけど駄目だったんで今回は諦めます。
これで自分のおおよその市場価値をはかろうと思ったんですがそもそも土俵にすら立ててないですね。
「技術に関するアピールをもっと書いてください」ていうフィードバックをいただいたんですが、
技術に関して「俺こんなんやったぜ!」みたいに言えること特にないなーと思って。
まずいな。
Play ScalaでWebアプリケーションを作る
標題の通り。
ブログっぽいものを作る予定。
「Play ScalaをRailsみたく触れるようにする」が目的。
ゆくゆくはGraphQLでAPI実装とかやる。
アプリのテーブル設計はこんな感じ。
超シンプル。(sqldesignerで書きました)
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#new
にlogin
機能を割り当てたりしたほうがいいのだろうか。
「名前は実体に即するように」 VS 「Railに乗る」
で、気になって調べたけど、Railsではこんなかんじに書いてある。
んー基本的には
「resourceに対する操作でリソースルーティングに含まれるactionに
適切なものがあるならばそれを選んで、ないならば別でactionを定義する」が正しいか。
じゃあ今回はUser
をindex
しないしshow
しないしnew
しないしcreate
しないし、、、で
User#login
が正しいことになるか。
何かご意見ありましたらください。
まま、とりあえず設計はおいといて手を動かすということで、
IntelliJ IDEA上のSBT Shell
上でrun
して
localhost:9000
で動かしてみました。
Initしたぞ。
以上。
AWSのプロビジョニングツール
同環境のAWSサーバを複数構築したい、という状況が発生した。
調べたことをメモしておく。
イメージとしてはVagrantfileやDockerfileのように
設定ファイル書いてコマンド叩いたらはいできたー、っていうのが理想。
方法1
AWS CloudFormationを利用する。
そもそもAWSがプロビジョニングの機能を提供していた。
知らなかったけど言われてみればまああるだろうな、というかないといろんな会社が困るだろうな。
方法2
Terraformを利用する。
Vagrantを提供しているHashiCorp社のツール。
AWSに限らず、Herokuなど様々なクラウドサーバのプロビジョニングができるみたい。
下記の記事を読んでみると、CloudFormationより痒いところに手が届きそうな感じに見えるが、
コンポーネントによっては対応していないものもあるよう。
まとめ
まだいろいろと決まっていないので何とも言えないが、
Terraformが利用できるコンポーネントにはTerraformを、
それ以外にはCloud Formationを使う。
できればどっちも使ってみて所感を書きたい。
Scalaのpimp my libraryを試す
参考文献
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
今度はScalaのyield
について調べてみる。
下記ページがわかりやすかった。
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よりもっと使いみちがわからんけど
ひとまず定義っぽいものはわかったのでよしとする。