Scala
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った (02 Feb 2017 | Tags:
OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
OpenWhiskのScala sbtプロジェクトのgiter8テンプレートと作った。
> sbt new modalsoul/openwhisk-sbt.g8
LinkLatest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- OpenWhisk+Scalaで作るServerless Architectureとっかかり (24 Jan 2017 | Tags:
OpenWhisk+Scalaで作るServerless Architectureとっかかり OpenWhisk+Scalaで作るServerless Architectureとっかかり
最近マイクロサービスやサーバーレスアーキテクチャが気になるので、手習いにOpenWhiskを使って、以前作ったモノリシックなサービスをマイクロサービスっぽく分割してみようと思う。
とりあえずOpenWhiskでHelloWorld。
準備
今回はBluemix上のOpenWhiskを対象に進める。
- Bluemixアカウント1
- Scala 2.11.6
- sbt 0.13.13
OpenWhisk CLIインストール
ggって出てくるブログだとインストールにはpipが必要と記載してあるものもあるけど、今はpipは不要になったようです。
Download OpenWhisk CLIから、実行可能なwskファイルを落とします。
あとは↑の記載の通りに進めればOK
echoアクションを実行して、
wsk action invoke /whisk.system/utils/echo -p message hello --blocking --result
↓のように帰ってくればインストールは完了
{ "message": "hello" }
アプリケーションの作成
GoogleのGsonを使うので、build.sbtに依存関係を追加。
基本的に、JsonObjectを受け取って、JsonObjectを返すエントリーポイントを作るだけです。
こんな感じ。
package com.github.modalsoul.sampleaction import com.google.gson.JsonObject object SampleAction { def main(args:JsonObject):JsonObject = { val obj = new JsonObject() val name = if(args.has("name")) { args.getAsJsonPrimitive("name").getAsString() } else "World" obj.addProperty("greeting", s"Hello ${name}!") obj } }
アプリケーションのビルド
デプロイするjarファイルを作成します。
sbt package
だと依存するライブラリ(今回だとgson)を取り込んでくれないので、sbt-assemblyを使う。addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")
sbt assembly
を実行すると、./target/scala-2.11/
配下にjarが生成されます。OpenWhiskアクションの登録
[ACTION_NAME] , [APPLICATION] , [MAIN_CLASS_FULLNAME] は適宜読み替え。
> wsk action update [ACTION_NAME] target/scala-2.11/[APPLICATION].jar --main [MAIN_CLASS_FULLNAME] ok: created action [ACTION_NAME]
動作確認
wsk action invoke --blocking --result [ACTION_NAME]
↓のように帰ってくれば成功です。
{ "greeting": "Hello World!" }
↓のようにするとパラメータを渡すことができます。
wsk action invoke --blocking --result [ACTION_NAME] --param name HOGE
{ "greeting": "Hello HOGE!" }
おわり
作ったサンプルのプロジェクトはこちら。
これでなんとなくOpenWhisk使えるようにはなったので、モノリシックをマイクロにするぞ。
-
現在、OpenWhiskは米国南部リージョンでしか使えないので注意。 ↩
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- BluemixにPlayframeworkアプリケーションをデプロイする (22 Jan 2017 | Tags:
BluemixにPlayframeworkアプリケーションをデプロイする BluemixにPlayframeworkアプリケーションをデプロイする
Bluemixを触りだしたので、HelloWorldとしてWebアプリケーションをデプロイしてみた。
準備
- Playframework 2.5.10
- Scala 2.11.7
- CloudFoundry CLI
上記に加え、Bluemixのアカウントの登録、適当なアプリケーションが実装済みの前提で進めます。
デプロイ対象を生成する
sbt dist
でzipファイルを生成する。 [APPLICATION_NAME] etc..はプロジェクト固有の値になっているので、適宜読み替え。> sbt dist ・・・ [info] Your package is ready in /~/[APPLICATION_NAME]/target/universal/[APPLICATION_NAME-VERSION-SNAPSHOT].zip
manifest.ymlファイルを作成する
プロジェクトルートにmanifest.ymlを作成。 [HOST_NAME]、 [NAME] は任意の値を設定。 path の設定は、↑のzipファイルのパスを指定。
applications: - host: [HOST_NAME] name: [NAME] buildpack: java_buildpack path: ./target/universal/[APPLICATION_NAME-VERSION-SNAPSHOT].zip instances: 1 memory: 512M
認証
Bluemix登録時のメールアドレスとパスワードを聞かれるので、入力する。
> cf login API エンドポイント: https://api.ng.bluemix.net > Email > Password
APIエンドポイントの設定
↑で認証したエンドポイント以外を使う場合、エンドポイントを指定しなおす必要がある。
今現在、使用できるエンドポイントは以下の3つ。
- 米国南部
- 英国
- シドニー
それぞれ設定が異なるので注意。
使用する組織、スペースが異なる場合も別途設定。
cf api https://api.[REGION].bluemix.net
エンドポイント REGION 米国南部 ng 英国 eu-gb シドニー au-syd
デプロイ
> cf push ・・・ 要求された状態: started インスタンス: 1/1 使用: 512M x 1 インスタンス URL: [HOST_NAME].au-syd.mybluemix.net 最終アップロード日時: Mon Jan 22 02:33:15 UTC 2017 スタック: cflinuxfs2 ビルドパック: java_buildpack 状態 開始日時 CPU メモリー ディスク 詳細 #0 実行 2017-01-22 11:34:21 AM 0.0% 512M の中の 964K 1G の中の 1.3M
こんなような出力がされて、完了。
URL を叩くと、アプリケーションの動作を確認できる。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- sbt、Giter8を統合するってよ (20 Jan 2017 | Tags:
sbt、Giter8を統合するってよ sbt、Giter8を統合するってよ
これまでScalaのsbtプロジェクトを作成するときは、Giter8を使っていたんですが、sbt 0.13.13から
sbt new
でg8テンプレートを使った雛形生成ができるようになったそうです。sbt 0.13.13 adds a new command called new, to create new build definitions from a template. The new command is extensible via a mechanism called the template resolver.
> g8 modalsoul/scala-sbt
としていたのが、
> sbt new modalsoul/scala-sbt
と変わるだけ。もちろんこれまで使ってたGiter8テンプレートもそのまま使える模様。
初学者に教えるときの”インストールしとけ系”のものは少ないほうが何かと楽だし、いいんじゃないでしょうか。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Scala 2.12.0でSAM型 (10 Nov 2016 | Tags:
Scala 2.12.0でSAM型 Scala 2.12.0でSAM型
Scala 2.12.0がリリースされましたね。
↑のページにこんな記述がありましたね。
Scala and Java 8 interop is also improved for functional code, as methods that take functions can easily be called in both directions using lambda syntax. The FunctionN classes in Scala’s standard library are now Single Abstract Method (SAM) types, and all SAM types are treated uniformly – from type checking through code generation. No class file is generated for a lambda; invokedynamic is used instead.
雑訳
ScalaとJavaの相互運用が関数的なコードのために改善されています。ラムダ構文を使うことで、関数を引数にとるメソッドを双方向で簡単に呼び出すことができます。Scalaの標準ライブラリのFuncionNクラスはSingle Abstract Method(SAM)タイプであり、型チェックからコードの生成まで、すべてのSAMタイプが一律に扱われます。ラムダのためにクラスファイルが生成されることはなく、代わりにinvokedynamicが使われます。
どゆこと?
Java8では、ラムダ式を使うことで
Runnable task = new Runnable(){ @Override public void run(){ System.out.println("Task is running"); } };
なコードを、
Runnable task = () -> { System.out.println("Task is running"); };
とスッキリ書ける訳で、Scalaも2.12でSAMの対応が改善されて、
val task:Runnable = () => println("Task is running")
とスッキリ書けるようになったんですね
やったね、という雑な理解
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Ammonite-REPLを使う (27 Oct 2016 | Tags:
Ammonite-REPLを使う Ammonite-REPLを使う
Ammonite projectなるものがあるらしい。 その中の、Ammonite-REPLはリッチなREPLが使える代物らしいので、試してみた。
Install
sudo curl -L -o /usr/local/bin/amm https://git.io/vP4Gw && chmod +x /usr/local/bin/amm && amm
Hello World!
早速
amm
を起動してみる。> amm Loading... Welcome to the Ammonite Repl 0.7.8 (Scala 2.11.8 Java 1.8.0_20) @ println("Hello World!") Hello World!
ファイルに記述して実行してみる。
> echo println\(\"Hello World\!\"\) > Hello.sc > amm Hello.sc Hello World!
便利っぽいあれこれ
シェルスクリプトっぽく使う
さっきの
Hello.sc
の先頭に、1行追加する。#!/usr/bin/env amm println("Hello World!")
これでファイルを直接実行できる。
> ./Hello.sc Compiling Hello.sc Hello World!
ファイルをインポートする
val message = "Hello World"
import $file.Bar println(Bar.message)
> amm Foo.sc Compiling Foo.sc Compiling Bar.sc Hello World
これで、
Foo
で、Bar
で定義されたフィールドやメソッドにアクセスできる。sugoi!
ただし、デフォルトではローカルのスコープに展開してくれないので、
Bar.message
みたいな感じになる。Foo
でもmessage
でアクセスしたい場合は、↓のように明示する必要がある。import $file.Bar impor Bar.message println(message)
import $file.Bar.message
のように1行ではいけないので注意。1行で書くなら、import $file.Bar, Bar.message
ワイルドカードでインポート
いちいち明示するのが面倒なら、ワイルドカードが使える。
import $file.Bar, Bar._ println(message)
ライブラリをインポートする
import $ivy.`com.typesafe.play::play-json:2.4.6`, play.api.libs.json.Json val json = Json.toJson(Map("hello" -> "world")) println(json)
> amm ToJson.sc Compiling ToJson.sc {"hello":"world"}
play-jsonが使えた sugoi!!
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- コップ本第3版と第2版の差分をメモっとく。第11~20章 (24 Oct 2016 | Tags:
コップ本第3版と第2版の差分をメモっとく。第11~20章 コップ本第3版と第2版の差分をメモっとく。第11~20章
9/20に出版されたScalaスケーラブルプログラミング第3版を手元の第2版と読み比べして、差分をメモってく。
第11章 Scalaの階層構造
11.1 Scalaのクラス階層
[Old] Scalaのクラスは、ScalaObjectという特別なマーカーとなるトレイトも継承しているという点でJavaのクラスと異なる。
[New] scala.ScalaObjectがなくなった。(2.10からなくなってた)
11.4 独自の値クラスの定義
節が追加された。
値クラスにできるクラスの条件
- パタメータがちょうど1つ
- 内容はdefだけ
- 他のクラスは値クラスを拡張できない
- 値クラスは、
equals
やhashCode
を再定義できない
class Dollars(val amount: Int) extends AnyVal { override def toString() = "$" + amount } > val money = new Dollars(1000) money: Dollars = $1000
第12章 トレイト
なし
第13章
なし
第14章 アサーションとテスト
14.1 アサーション
アサーションをコンパイル時に有効・無効化する方法が変わった。
- 第2版 : JVMの
-ea
と-da
オプション - 第3版 : scalacコマンドに
-Xdisable-assertions
オプションを指定して無効化
ScalaTestの使い方についての説明が更新された。
14.3 情報が豊富なエラーレポート
expect
がassertResult
に。intercept
がassertThrow
に。例外の内容をもっと詳しく知りたいときには、
assertThrows
ではなくintercept
を使う。(第2版)14.4 JUnitとTestNGの使い方
無くなった
14.4 仕様としてのテスト
ScalaTestの説明がバージョンアップに追随。 specsの説明がspecs2に。
14.5 プロパティベーステスト
ScalaCheckの説明がバージョンに追随。
第15章 ケースクラスとパターンマッチ
15.1.3 matchとswitchの違い
match式は、 式の評価時に例外が投じられなければ、 必ず値を返す。
15.2.7.1 型消去(type erasure)
scalaインタープリターの
-unchecked
オプションの説明が無くなった。15.2.8 変数の束縛
expr match { case UnOp("abs", e @ UnOp("abs", _)) => e }
変数束縛パターン(variable-binding pattern)で、値を束縛した場合、eとexprは同じ値を持つが、絶対値演算は1つ少なくなる。
という捕捉が追加された。
第16章 リストの操作
16.6.2 分割統治原則
???
についての注釈が追加された。第17章 コレクションの使い方
なし
第18章 ミュータブルオブジェクト
章名が、ステートフルオブジェクト => ミュータブルオブジェクトに変更。
第19章 型のパラメーター化
なし
第20章 抽象メンバー
20.8 リファインメント型
節名が、構造的サブ型 から リファインメント型 に変更された。
9.4節のローンパターンのサンプルを一般化する場合についての説明以降が省略された。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- コップ本第3版と第2版の差分をメモっとく。第1~10章 (24 Sep 2016 | Tags:
コップ本第3版と第2版の差分をメモっとく。第1~10章 コップ本第3版と第2版の差分をメモっとく。第1~10章
9/20にScalaスケーラブルプログラミングの第3版が出版されて、しかも第3版から電子書籍にも対応したので、早速入手した。
せっかくなんで、手元の第2版と読み比べして、差分をメモってく。
第01章 スケーラブルな言語
なし
第02章 Scalaプログラミングの第一歩
なし
第03章 Scalaプログラミングの次の一歩
なし
第04章 クラスとオブジェクト
4.2 クラス、フィールド、メソッド
結果型の省略に関して、クラス内で宣言されたpublicメソッドの結果型を明示的に提示することが適切な方法、と紹介されている。
4.5 Appトレイト
scala.Application
トレイトは、コマンドライン引数を使えなかったが、scala.App
トレイトはargs
という名前の文字列の配列を指定しておけば、コマンドライン引数にアクセスできる。こんな感じ
object Sample extends App { for(arg <- args) { println(s"arg: $arg") } }
scala Sample hoge fuga > arg: hoge > arg: fuga
第05章 基本型と演算子
5.1 基本型
Javaのプリミティブ型に対応するScalaのvalue typeで、小文字の別名についての言及がなくなった。
2.8では、↓と書いても自動的にScalaのvalue typeと同じように扱われていたらしい。
val i:int = 1 val f:float = 1f val d:double = 1d
2.11だとコンパイルエラーになる。
5.2 リテラル
Javaプログラマーのための近道で、読んでおいた方がよいScalaのリテラルに、文字列補間(5.3節)が追加された。 8進数の整数リテラルをサポートしていない記載が追加された。(コードサンプルも追随している)
5.3 文字列補間
5.3節 文字列補間 が追加された。
s文字列補間子
val name = "reader" println(s"Hello, $name!") > Hello, reader!
raw補間子
s補間子と同様に扱えるが、文字列リテラルのエスケープシーケンスを認識しない。
println(raw"No\\\\escape!") > No\\\\escape!
ちなみにs補間子だと、
println(s"No\\\\escape!") > No\\escape!
f補間子
対象の式に出力書式を指定することができる。指定する場合は、対象の式に続いてパーセント記号(%)と書式指定の構文(
java.util.Formatter
で定義されていりもの)を記述する。f"${math.Pi}%.5f" > res0: String = 3.14159
出力書式の構文が指定されていない場合、デフォルトでは%sと認識され
toString
値が代入される。5.6 関係演算子と論理演算子
def salt:Boolean = { println("salt"); false } def pepper:Boolean = { println("pepper"); true } salt&&pepper > salt > res0: Boolean = false
この場合、
salt
がtrue
なら、pepper
が呼び出されることはない。どうしても、式の右辺(この場合
pepper
)を評価したいのなら、代わりに&
や|
を使う。salt&&pepper > salt > pepper > res0: Boolean = false
第06章 関数型スタイルのオブジェクト
なし
第07章 組み込みの制御構造
なし
7.4.3 finally節
try-catch-finallyの括弧の有無について注意書きが追加された。
※ catch節では、case文を必ず括弧で囲まなければならない。しかし、try節とfinally節では、式を1つだけ含む場合は括弧で囲む必要はない。 例えば、次のようにも記述できる。
try t() catch { case e: Exception => ... } finally f()
第08章 関数とクロージャー
なし
第09章 制御の抽象化
なし
第10章 合成と継承
なし
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q25:オシャレな靴ひもの結び方|プログラマ脳を鍛える数学パズル (13 Jul 2016 | Tags:
Q25:オシャレな靴ひもの結び方|プログラマ脳を鍛える数学パズル Q25:オシャレな靴ひもの結び方|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q25:オシャレな靴ひもの結び方。
Q: スニーカーの合計12カ所の穴にひもを通すとき、交差する点が最も多くなるときの交点の数を求める。ただし、ひもを結ぶ位置は一番上とし、左右交互に使用する。
5行目のひもの通す順番を生成する部分がかなりカオスになってしまった。。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q24:完璧に撃ち抜くストラックアウト|プログラマ脳を鍛える数学パズル (10 Jul 2016 | Tags:
Q24:完璧に撃ち抜くストラックアウト|プログラマ脳を鍛える数学パズル Q24:完璧に撃ち抜くストラックアウト|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q24:完璧に撃ち抜くストラックアウト。
Q: 9枚の的を打ち抜く順番を考える。周囲にフレームのある5番の的以外は、隣り合う的を2枚抜きできる。この時、9枚の的を打ち抜く順番が何通りあるか求める。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q23:ブラックジャックで大もうけ!?|プログラマ脳を鍛える数学パズル (09 Jul 2016 | Tags:
Q23:ブラックジャックで大もうけ!?|プログラマ脳を鍛える数学パズル Q23:ブラックジャックで大もうけ!?|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q23:ブラックジャックで大もうけ!?。
Q: コインを1枚ずつ賭けていったとき、最初に10枚のコインを持ち、ゲームを24回行った時、手元にコインが残るよパターンが何通りか求める。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q22:絡まない糸電話|プログラマ脳を鍛える数学パズル (08 Jul 2016 | Tags:
Q22:絡まない糸電話|プログラマ脳を鍛える数学パズル Q22:絡まない糸電話|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q22:絡まない糸電話。
Q: 同一円周上に等間隔に並んだ子供が、ペアを組んで糸電話する。この時、意図が交差しないようペアを組む必要がある。16人の子供がいた場合、作ることができるペアが何通りあるかを求める。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q21:排他的論理和で作る三角形|プログラマ脳を鍛える数学パズル (04 Jul 2016 | Tags:
Q21:排他的論理和で作る三角形|プログラマ脳を鍛える数学パズル Q21:排他的論理和で作る三角形|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q21:排他的論理和で作る三角形。
Q: 「パスカルの三角形」を「右上の数と左上の数の和」ではなく「排他的論理和」で配置した時、2014番目の0が出力される段数を求める。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q20:受難のファサードの魔法陣|プログラマ脳を鍛える数学パズル (03 Jul 2016 | Tags:
Q20:受難のファサードの魔法陣|プログラマ脳を鍛える数学パズル Q20:受難のファサードの魔法陣|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q20:受難のファサードの魔法陣。
1 14 14 4 11 7 6 9 8 10 10 5 13 2 3 15 Q: 上の魔法陣を使い、以下の条件で足し算をした結果、その和が同じになる組み合わせが最もおおくなる値(和)を求める。
- 足し合わせるのは、縦・横・斜めに限らない
- 足し合わせる数字の個数は4つに限らない
Scalaの
combinations
は、Rubyのcombination
と異なり、同じ値を区別しないので、zipWithIndex
を使って区別するようにしている。すごい無駄感。 区別しなかったとしても、66になるしね。。Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q19:友達の友達は友達?|プログラマ脳を鍛える数学パズル (02 Jul 2016 | Tags:
Q19:友達の友達は友達?|プログラマ脳を鍛える数学パズル Q19:友達の友達は友達?|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q19:友達の友達は友達?。
Q: 2つの数の最大公約数が1でない場合、それを友達とする。ある数から他のすべての数にたどり着くには、何段階の友達をたどれば良いか数える。1~Nまでの合成から7個を選んだ時、最大で6段階たどることになる最小のNを求める。
横に長くなってしまった。。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q18:ショートケーキの日|プログラマ脳を鍛える数学パズル (01 Jul 2016 | Tags:
Q18:ショートケーキの日|プログラマ脳を鍛える数学パズル Q18:ショートケーキの日|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q18:ショートケーキの日。
Q: ホールケーキを切り分けるとき、ケーキに乗っているイチゴの数がすべて異なるような切り方を考える(N個に切り分けるとき、1~N個のイチゴがそれぞれ乗っている)。ただし、隣り合う2つのケーキに乗っているイチゴの数の和がいずれも平方数にならなければならない。これらの条件を満たす最小のNを求める。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q17:30人31脚に挑戦!|プログラマ脳を鍛える数学パズル (30 Jun 2016 | Tags:
Q17:30人31脚に挑戦!|プログラマ脳を鍛える数学パズル Q17:30人31脚に挑戦!|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q17:30人31脚に挑戦!。
Q: 30人31脚をするときの男女の並び方が何通りあるか求める。ただし、女子が隣り合わないようにする。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q16:3本のひもで作る四角形|プログラマ脳を鍛える数学パズル (29 Jun 2016 | Tags:
Q16:3本のひもで作る四角形|プログラマ脳を鍛える数学パズル Q16:3本のひもで作る四角形|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q16:3本のひもで作る四角形。
Q: 長さが1から500まで変化する同じ長さのひも3本で、正方形を1つ、長方形を2つ作った時、正方形の面積と2つの長方形の面積の和が等しくなる組をカウントする。ただし、同じ比で整数倍のものは1つとしてカウントする。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q15:階段で立ち話|プログラマ脳を鍛える数学パズル (28 Jun 2016 | Tags:
Q15:階段で立ち話|プログラマ脳を鍛える数学パズル Q15:階段で立ち話|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q15:階段で立ち話。
Q: 10段の階段の上下にそれぞれ人がいて、最大3段飛ばしで移動したとき、2人が同じ段に止まる移動方法は何通りか求める。
メモ化してるから結構早い
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q14:W杯出場国しりとり|プログラマ脳を鍛える数学パズル (27 Jun 2016 | Tags:
Q14:W杯出場国しりとり|プログラマ脳を鍛える数学パズル Q14:W杯出場国しりとり|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q14:W杯出場国しりとり。
Q: どの国名も1度しか使うことができないとき、最も長く続けられる順を求め、長さを応える。
foldLeft
はmap
してmax
で置き換えられるし、その方が見た目シュッとするけど、こっちの方が性能は良いはず。Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q13:覆面算を満たすのは何通り?|プログラマ脳を鍛える数学パズル (26 Jun 2016 | Tags:
Q13:覆面算を満たすのは何通り?|プログラマ脳を鍛える数学パズル Q13:覆面算を満たすのは何通り?|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q13:覆面算を満たすのは何通り?。
Q: “READ+WRITE+TALK=SKILL”という文字列が与えられた時、式を満たす文字と数の組み合わせは何通りあるか?ただし、項の最上位に0は入らず、同じ文字には同じ数、異なる文字には異なる数が入る。
性能は良くない。 けど、左辺が単項 or 複数項の足し算、右辺の単項であれば、他の文字列でも可。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q12:平方根の数字|プログラマ脳を鍛える数学パズル (25 Jun 2016 | Tags:
Q12:平方根の数字|プログラマ脳を鍛える数学パズル Q12:平方根の数字|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q12:平方根の数字。
Q: 平方根を少数で表したとき、0~9までの数字がすべて現れる最小の整数を求める。正の平方根のみを対象とし、整数部分を含む場合と、少数部分のみの場合を求める。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q11:フィボナッチ数列|プログラマ脳を鍛える数学パズル (24 Jun 2016 | Tags:
Q11:フィボナッチ数列|プログラマ脳を鍛える数学パズル Q11:フィボナッチ数列|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。前回で第1章が終わって、第2章に突入。今回は、Q11:フィボナッチ数列。
Q: フィボナッチ数列のうち、各桁の数字を足した数で割り切れ、144より大きなものを小さい順に5つ求める。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q10:ルーレットの最大値|プログラマ脳を鍛える数学パズル (23 Jun 2016 | Tags:
Q10:ルーレットの最大値|プログラマ脳を鍛える数学パズル Q10:ルーレットの最大値|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q10:ルーレットの最大値。
Q: ヨーロピアンスタイルとアメリカンスタイルのルーレットで、2<=n<=36のnについて、連続するn個の数の和が最大になる場合において、ヨーロピアンスタイルがアメリカンスタイルよりも小さくなるnの個数を求める。
この問題のなにがだるいって、ヨーロピアンとアメリカンの数の並びを入力しないといけないっていうのがだるい。kindleなのに、図の文字はコピーできないだなんて。。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q09:つりあわない男女|プログラマ脳を鍛える数学パズル (22 Jun 2016 | Tags:
Q09:つりあわない男女|プログラマ脳を鍛える数学パズル Q09:つりあわない男女|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q09:つりあわない男女。
タイトルが日経ほげほげの婚活イジリねたコラムっぽい。
Q: 男性20人、女性10人が到着順に並んだ場合、どこで区切っても2つのグループの男女の人数が同じにならないような到着順は何通りあるか。
基本的な考え方は本の解説と同じだけど、到着順の組み合わせの求め方が違う。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q08:優秀な掃除ロボット|プログラマ脳を鍛える数学パズル (21 Jun 2016 | Tags:
Q08:優秀な掃除ロボット|プログラマ脳を鍛える数学パズル Q08:優秀な掃除ロボット|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q08:優秀な掃除ロボット。
Q: 同じ場所を通らない前後左右にのみ移動できる掃除ロボットを考える。このロボットが12回移動するときに考えられる経路のパターンは何通りあるか。
畳み込みって和な響きするよね。 コンボリューションっていうとトランスフォーマーな響きだなぁ。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q07:日付の2進数変換|プログラマ脳を鍛える数学パズル (18 Jun 2016 | Tags:
Q07:日付の2進数変換|プログラマ脳を鍛える数学パズル Q07:日付の2進数変換|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q07:日付の2進数変換。
Q: 1964年10月10日から2020年7月24日の間で、YYYYMMDDの10進数を2進数に変換し、逆向きに並べ替えて10進数に戻した時、元の日付と同じになる日付を求める。
日付の操作が面倒なので、nscala-timeとJoda-Timeを使う。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q06:(改造版)コラッツの予想|プログラマ脳を鍛える数学パズル (17 Jun 2016 | Tags:
Q06:(改造版)コラッツの予想|プログラマ脳を鍛える数学パズル Q06:(改造版)コラッツの予想|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q06:(改造版)コラッツの予想。
コラッツの予測
自然数nについて、
- nが偶数の場合、nを2で割る
- nが奇数の場合、nに3をかけて1を足す
という操作を繰り返す時、初期値がどんな数値であっても必ず1に到達する。
Q: 初回のみnに3をかけて1を足すことから始めた場合、「最初の数に戻る数」が10000以下の偶数のうち何個か求める。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q05:いまだに現金払い?|プログラマ脳を鍛える数学パズル (15 Jun 2016 | Tags:
Q05:いまだに現金払い?|プログラマ脳を鍛える数学パズル Q05:いまだに現金払い?|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q05:いまだに現金払い?。しかし、無駄に煽りを効かせたタイトルだなぁ
Q: 1000札を両替したときにでてくる硬貨の組み合わせは何通りあるか?ただし、取り扱う硬貨は500円、100円、50円、10円のみとし、硬貨の枚数は最大で15枚とする。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q04:棒の切り分け|プログラマ脳を鍛える数学パズル (14 Jun 2016 | Tags:
Q04:棒の切り分け|プログラマ脳を鍛える数学パズル Q04:棒の切り分け|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q04:棒の切り分け。
Q: 長さ
n[cm]
の1本の棒を1[cm]
単位に切り分ける。ただし、1本の棒を一度に切ることが出来るのは1人だけ(ex. 棒が3本あれば同時に3人で切ることができる)。最大m
人いるとき、最短何回で切り分けられるか。20cmを3人の場合と、100cmを5人の場合と、それぞれ求めろ。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q03:カードを裏返せ|プログラマ脳を鍛える数学パズル (12 Jun 2016 | Tags:
Q03:カードを裏返せ|プログラマ脳を鍛える数学パズル Q03:カードを裏返せ|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q03:カードを裏返せ。 だいぶ間が空いてしまった。。
Q: 順番に並んだ1~100までの番号が書かれた100枚のカードが裏返しに置かれている。n番目のカードからn-1枚おきにカードを裏返すのを、2から100までやったとき、最後に裏向きになっているカードの番号を求めろ。
だいぶやっつけな感じになってしまった。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q02:数列の四則演算|プログラマ脳を鍛える数学パズル (23 Mar 2016 | Tags:
Q02:数列の四則演算|プログラマ脳を鍛える数学パズル Q02:数列の四則演算|プログラマ脳を鍛える数学パズル
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q02:数列の四則演算。
Q: 1000~9999で、数字の各桁の間に四則演算の演算子を最低1つは入れて計算し、元の数の桁を逆から並べた数字と同じになるものを求める。
#calc
は引数に数値もしくは演算子のリストを受け取り、計算結果を返す。ex.)
#gen
は引数に数値を受け取り、その数値の各桁と演算子のバリエーションの配列を返す。ex.)
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Q01:10進数で回文|プログラマ脳を鍛える数学パズル (22 Mar 2016 | Tags:
Q01:10進数で回文|プログラマ脳を鍛える数学パズル Q01:10進数で回文|プログラマ脳を鍛える数学パズル
Kindleのセールでプログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問を買ったから、ぼちぼちやってく。Q01:10進数で回文。
Q: 10進数、2進数、8進数のいずれで表現しても回文数となる数のうち、10進数の10以上で最小の値を求める。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- Scalaで素数判定【追記アリ】 (09 Oct 2013 | Tags:
Scalaで素数判定【追記アリ】 Scalaで素数判定【追記アリ】
概要
今回は、1<= X <=10^9 の範囲の自然数Xを渡されたとき、Xが素数か否かを判定します。
判定には、試し割り法を使いました。
コード
↓のようになりました
解説
処理のおおまかな流れは以下のような感じ
- 対象の数字Xを受け取る
- Xが1か偶数だったら、素数ではない
- 3からXの平方根までのリストを作る
- リストから偶数を除去
- リストの先頭から順に、Xがその数で割り切れるかどうかを調べる
- 割り切れたら、素数ではない
- 割り切れずに、リストの末尾まで到達したら、素数
- 結果を表示
(x to y).filter().foreach() の形式で書きたかったのでこんな設計になりました。 なんとなくScalaっぽくてこの書き方が好きなので
foreachの中の処理で割り切れた場合、明示的なreturnでループを抜けています
対象の数が大きくなると生成されるリストも大きくなり、ループが長くなるので filterの条件を増やして(ex. 3, 5, 7, 11,,,)リストが短くなるようにしてみたりもしたんですが、 早くなりませんでした、というか若干遅くなった。。。
filterを追加することでループの回数を減らすことの損益分岐点は、思ったより低かったようです。無念
追記
@gakuzzzzさんにコメントいただき、コードを改良しました。
@modal_soul (3L to sqrt(num).toLong by 2) とかすると filter が必要なくなって速くなりそうですね。
— がくぞ (@gakuzzzz) October 9, 2013コード・その2
(x to y by 2)とすることで、2刻みでリストを生成するので、最初に生成されるリストが短くできる&filterが省略できるわけですね。
Before:140ms, After:130ms だいたい10msほど速くなりました。
コード・その3
returnを使うと例外で遅くなるのでは?という話もあったので、forallを使うパターンも試してみました。 結果は↑とほぼ同じ結果になりました。 forallがbooleanを返すので、returnのためのtrue/falseがなくなったので、コードはだいぶ綺麗になった気がします。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- 【意訳】Heroku上でPlayFramework + Scalaアプリケーションを実行する (12 Aug 2012 | Tags:
【意訳】Heroku上でPlayFramework + Scalaアプリケーションを実行する 【意訳】Heroku上でPlayFramework + Scalaアプリケーションを実行する
誤訳・誤植等ありましたら、@modal_soulまでリプライいただけるとありがたいです。
ScalaでPlay Frameworkアプリを構築するのが最近流行っているようです。理由としては、これまでのJVMベースのWebアプリよりも簡単に構築、デプロイできることです。ScalaでPlayアプリの構築とHerokuへのデプロイをやってみましょう。
Step1) Play Frameworkをインストールします(バージョン1.2.3以上をインストールしてください)。
Step2) Play Scalaモジュールをインストールします。
Step3) ScalaサポートしたPlayアプリを作成します。
Step4) アプリケーションをスタートします。
Step5) ブラウザでアプリケーションを開きます。
とても簡単ですね。Heroku上にデプロイする前に、カスタムmodel, view, controllerを追加してもう少し味付けしてみましょう。
Step1) app/models/Widget.scalaを新規作成して、以下を記述します。
Step2) app/views/Widget/list.scala.htmlファイルを新規作成して、以下を記述します。
Step3) app/controllers/WidgetController.scalaを新規作成して、以下を記述します。
Step4) 以下のURLを表示して、動きを確認しましょう。
動きましたね。それにサーバーのリロードも不要でした。URLを少しきれいにしましょう。conf/routeファイルを修正して、”Application.index”を”WidgetController.list”へ変更します。
簡単にできましたが、ついでに友達にも見せたいですね。Herokuへデプロイしましょう。
Step1) Linux, MacもしくはWindowsに、Herokuコマンドクライアントをインストールします。
Step2) コマンドラインからHerokuへログインします。
Step3) Herokuは、アプリケーションのデプロイにgitを使うので、.gitignoreファイルを作成して、以下を記述します。
Step4) gitリポジトリを作成して、ファイルを追加し、コミットします。
Step5) Herokuにアプリケーションを新規作成します。
これで、Heroku上に新しいアプリケーションを規定し、アプリケーションへのランダムな名前/のURLを割り当てます。
Step6) アプリケーションをデプロイします。
アプリケーションがアセンブルされ、Heroku上にデプロイされます。
Step7) ブラウザでアプリケーションを開きます。
ジャジャーン!これでPlay + Scala アプリがクラウド上で実行されました。
JavaOneで、これをBill Venners(ScalaTestの作者)に見せたら、scalatest.orgのWebサイト(Play + Scalaのアプリ)をHerokuへ移行してくれました。クール!
何か質問あれば、教えてください。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- 【意訳】Scala on LiftでのFacebookサインイン (10 Aug 2012 | Tags:
【意訳】Scala on LiftでのFacebookサインイン 【意訳】Scala on LiftでのFacebookサインイン
この記事は、ayushmishra2005氏の記事の意訳です。参考にさせていただいたついでに訳してみました。参考程度にどうぞ。
誤訳・誤植等ありましたら、@modal_soulまでリプライいただけるとありがたいです。
ここ最近に、Lift2.4で構築したソーシャルプロジェクトで、Facebookへのサインイン機能を統合しました。この記事はその時の手順のサマリです。
1)Facebook APIを作る(※既に持っている場合不要です)
次のリンクを参考にアプリを作ってください。サイトURLを含む全ての詳細を記入してエンターします。サイトURLは以下のような感じになります。
http://www.com/api/facebook/auth
このサイトURL宛に、Facebookはレスポンスを送ります。このアプリケーションを保存すると、アプリキー/APIキー/秘密鍵が入手できます。
これらのキーは後ほど使うので注意してください。
2) Liftを使っている場合は、各キーをdefault.propsに追加設定します。
3) Facebookログイン画像fb.pngをダウンロードします
4) アプリキー/APIキー/秘密鍵とコールバックURLを設定するために、FacebookGraph.scalaを新規作成します。またFacebookからアクセストークンを要求するためにこのScalaファイルを使用します。
5) 次にログインページにFacebookログインリンクを表示するためにFacebook素にペットを作成します。
6) login.htmlにFacebookログインリンクを追加します。
7) SiteMap.scalaにFacebook接続メニューを作ります。
8) 最後に、Facebookからレスポンスを受け取るためのFacebook.apiを作成します。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- 【意訳】Scala on Play2 with Squerylではじめるデータベース駆動アプリ #scalajp #play_ja (31 Jul 2012 | Tags:
【意訳】Scala on Play2 with Squerylではじめるデータベース駆動アプリ #scalajp #play_ja 【意訳】Scala on Play2 with Squerylではじめるデータベース駆動アプリ #scalajp #play_ja
この記事は、HerokuのPrincipal Developer EvangelistのJames Ward氏とRyan Knight氏の記事Getting Started with Play 2, Scala, and Squerylの意訳です。参考程度にどうぞ。
誤訳・誤植等ありましたら、@modal_soulまでリプライいただけるとありがたいです。
サマリー
この記事では、Play2,Scala,Squeryl,JSON,CoffeScript,CoffeScript,jQueryとScalaTestを使ったWebアプリケーションの作り方を紹介します。また、同時にScalaTestを使ったテスト方法とHerokuを使ったクラウド環境へのアプリケーションデプロイについても学べます。 Play2,Scala,Squeryl,JSON,CoffeScript,jQueryとScalaTestの組み合わせによって、モダンなWebアプリケーションの構築とテストを効率的に行うことができ, シンプルなデータベース駆動Webアプリケーションの構築、テスト、クラウドへのデプロイを体験できます。
Play2の紹介
Play2は数あるWebフレームワークの中でも、ステートレスアーキテクチャで設計された、ユニークなWebフレームワークです。 Play2は、メモリやCPUなどのリソースの消費を抑えた、とても軽量なフレームワークです。 ステートレスであるため、昨今クラウドアーキテクチャにとって重要な、水平のスケーリングを容易に行うことができます。 他のアーキテクチャの特徴としては、完全に非同期なHTTPプログラミングモデルを使った、Websocketやcometのようなlong lived-connectionを利用するために設計されていることです。
また他の特徴としては、Herokuのようなクラウドアプリケーションプラットフォームへのデプロイに適するように、完璧に完結していることです。 Playアプリケーションのデプロイはシンプルで、コンテナベースのアプローチをしてきたJava開発者の多くが経験してきた環境齟齬を回避することができます。
Ruby on Rails, GrailsやDjangoなどの新しいWebフレームワークは、動的型付によってとても優れた生産性を発揮します。Playも動的言語フレームワークが持っているのと同じように、素早い繰り返しと高速な開発を行うことができ、しかしながらJavaやScalaのような静的型付言語による恩恵も留めています。これによりコンパイラは生産性を妨害することなく開発者を支援することができます。
Squerylの紹介
データベースとのインテグレーションに最適の技術は何か?これは今まで幾度と無く討論されてきました。幸いなことに、JavaやScalaのエコシステムでは、データの永続化の方法が複数用意され、選択することができます。 Play2のデフォルトのデータベースマッピングツールはAnormが使われています。(※AnormはORMではありません) 名前が指し示す通り、Anormはオブジェクトとリレーショナルモデルとの自動マッピングを行いません。 代わりに、開発者はネイティブなSQLを書き、手動でリレーショナルデータとオブジェクトのマッピングを行います。 この手法では、実行される生のクエリーをチューニングすることができるという利点があります。 Playの開発者は、SQLを使用することはリレーショナルデータベースとの対話とSQL層を抽象化することにおいての優れたDSLであり、パワフルで柔軟な方法だと主張してます。
Squerylは、Scalaにおけるデータ永続化のためのAnormの代替手段です。Anormと比較して、SquerylはHibernateに似ており、オブジェクトリレーショナルマッピングを提供します。Squerylはデータベースとの対話において、型安全なDSLを提供します。 またSquerylは、明示的に取得されるデータオブジェクトの粒度を制御することができます。 Hibernateのような従来のORMと共通のN+1問題に対するエレガントなソリューションを提供します。
SquerylはPlay2のデフォルトのデータ永続化ライブラリではありませんが、特別な追加設定やセットアップは必要としません。データベースエボリューションは手動で行う必要があり、データベース接続は初期起動時に生成する必要があります。トランザクションも同様に、コントローラーで呼ばれた際に、明示的に定義される必要があります。
Play2でのSquerylのセットアップ
Play2プロジェクトがまだない場合、Play2をインストール後、新規プロジェクトを作成しましょう。
プロジェクトの言語はScalaを選択しましょう。
SquerylライブラリをPlayプロジェクトに追加する必要があります。後ほどプロジェクトはHerokuにデプロイします。HerokuのデフォルトのデータベースはPostgreSQLで、PostgreJDBCドライバーも依存関係にあるためここで追加します。
project/Build.scalaファイルを編集し、依存関係を更新しましょう。
IDEにEclipseやIntellijを使っている場合、Playはプロジェクトを自動作成してくれます。
Intellijの場合
Eclipseの場合
ここでは注意ですが、プロジェクトファイルは依存関係を更新した後に作成しましょう。なぜならプロジェクトは必要なライブラリも含めて構成されるからです。もし後で依存関係を更新する場合は、プロジェクトを生成するコマンドを再度実行してください。
これでプロジェクトを実行することができます。プロジェクトルートに移動し、以下のコマンドを実行しましょう。
サーバは以下のURLで起動しています。確かめてみましょう。
ローカルでのテストではインメモリのh2データベースを使用します。Playでこのデータベースを使用するには、conf/application.confファイルを修正し、以下の行のコメントアウトの解除か、行の追加をします。
最後のセットアップ手順として、Squerylデータベースを接続します。データベースの接続情報を取得するために、Play標準の構成システムを使います。 Playアプリケーションのライフサイクルのスタートアップフェーズにフックするグローバルクラスを追加するだけで完了です。 app/Global.scalaファイルを新規に作成し、以下を記述します。
アプリケーションスタートアップのdb.default.driver設定パラメータは、データベース接続のセットアップのために使用するドライバを決定するために使われます。新しいコネクションが生成され、SquerylのSessionFactoryにストアされます。
ブラウザで、http://localhost:9000をリロードすると、アプリケーションが動作し、PlayのSTDOUTログで以下のメッセージが表示されるはずです。
Entityの作成
それでは、データベースでデータを保持するためのシンプルなEntityオブジェクトを作成しましょう。app/models/Bar.scalaファイルを新規に作成し、以下のを記述します。
これはBarオブジェクトのリストを保持するかなりシンプルなentityです。各々のBarはnameとプライマリキーとしてIDを持っています。Scalaのcase classは,不変で、基本的にクラスを文法上の便宜で満たすものです。また、クライアントから返却されたフォーム値のマッチングを行う際にとても便利なパターンマッチングとして使用することもできます。AppDBオブジェクトは、Squerylがデータベースへマッピングするスキーマのインスタンスです。今回の場合、データベースにbarというテーブルを1つ定義します。スキーマは単一のオブジェクトとして宣言されるため、シングルトンオブジェクトを生成します。
Squerylを使うと、AppDB.createメソッドを呼ぶだけでプラグラムチックにデータベーススキーマを生成することができます。ですが、手動でSQLスクリプトを作成する方法をお勧めします(PlayではこのSQLスクリプトをevolutions scriptと呼びます)。Playは、これらのSQLスクリプトに対応するデータベーススキーマをチェックして、データベーススキーマの変更を追跡します。Playは、スキーマが古くなっていることを検出すると、このSQLスクリプトの適用を提案してきます。これはDEVモードのときにのみ行われ、PRODモードでは、アプリケーションの起動前にスクリプトを適用されます。これにより、データベーススキーマの変更やバージョンのロールバックを行う必要がある場合に、スキーマの変更をコントロールすることができます。
conf/evolutions/default/1.sqlファイルを新規作成して、以下を記述します。
このSQLファイルは”Ups”と”Downs”の2つのセクションから成っています。”Ups”セクションは、データベーススキーマに変更を反映させ、”Downs”セクションは、データベースへの変更を取り消す際の記述です。Playは、データベーススキーマへの変更をこれらのファイルの名前順に適用します。もし、デプロイ後1.sqlの適用後にスキーマへ変更を行う必要がある場合は、2.sqlファイルに変更内容を記述します。 http://localhost:9000をリロードすると、Playがデータベースへの変更を適用するか尋ねてくるはずです。1.sqlの”Ups”セクションをローカルのインメモリデータベースに適用するために、Apply this script now!ボタンをクリックします。
モデルのテスト
Play2では、テスト駆動開発のスタイルに合った強力なテストサポートがなされています。ScalaでPlay2を使う場合、テストはデフォルトでspaes2が使われていますが、ScalaTestを使用します。Barモデルオブジェクトのシンプルなテストを作ります。プロジェクトにScalaTestの依存関係を追加し、testOptions設定を修正します。project/Build.scalaを以下を追記して更新します。
test/BarSpec.scalaを新規作成し以下を記述します。
このテストでは、実行するためにFakeApplicationとインメモリデータベースを使います。FakeApplicationを使用すると、Squerylデータベースコネクションは先に生成されたGlobalオブジェクトを使って構成されます。テスト本体は単純にBarのインスタンスを生成し、idが0ではないことをテストします。 これはSquerylトランザクションで行われます。 1系のPlayと異なり、テストはコマンドラインから実行されます。コマンドは以下
テストが終了したら、以下のメッセージがPlayのSTDOUTログに出力されていることを確認します。
ソースの変更の度にテストを実行するには、以下のコマンドで実行します
~runと~testコマンドはバックグラウンドで継続して実行することができます。これにより、ユニットテスト/機能テストやブラウザからの手動テストをすぐさま実行することができます。
WebフォームからBarを生成する
新しくBarオブジェクトを生成するための基本的なWeb UIを追加してみましょう。このセクションの手順を全て踏まないとコードのコンパイルができないので注意してください。
最初に、app/controllers/Application.scalaファイルを下記の記述を追加して更新します。
barFormは、リクエストパラメーターnameからcace class Barのプロパティnameへ(コンストラクタを通して)マッピングをします。indexメソッドは、index templateへbarFormのインスタンスを渡すように更新されました。次にtemplateを更新します。addBarメソッドは、リクエストパラメーターをオブジェクトbarにバインドし、トランザクション内でデータベースへインサートします。SquerylはPlay frameworkに統合されていないので、データベーストランザクションはSquerylのinTransactionを使って明示的に開始する必要があります。次にユーザはindexページにリダイレクトされます。リクエストパラメータがbarFormを使ってBarにマッピングされなかった場合、BadRequestエラーが返却されます。
次にapp/views/index.scala.htmlテンプレートに以下を追記して更新します。
この時点で、テンプレートはApplication Controllerのindexメソッドから渡されたForm[Bar]パラメータを取ります。テンプレート本体の新しいHTMLフォームはPlay2のform helperを使ってレンダリングされます。このフォームは、nameフィールドとsubmitボタンを持ちます。注意しなければいけないのは、フォームのアクションは、ルートからApplication controllerのaddBarメソッドへを指していることです。
この時点でコンソールウィンドウをみると”value addBar is not a member of controllers.ReverseApplication”エラーがみられると思います。 これは、routeファイルがコンパイルされ、routeがチェックされたからです。まだrouteが作られていないので、conf/routesファイルを編集し、以下の行を追加します。
これにより、/barsURLへのPOSTリクエストをaddBarメソッドへマッピングするHTTPルートを作成します。
ブラウザでhttp://localhost:9000 を更新すると、新しいBarオブジェクトを追加するための基本的なフォームが表示されているはずです。成功した場合、新しいBarを追加した後に、ブラウザはindexページにリダイレクトして戻ります。
これで一通りが動くようになったので、controllerのコードに戻り、これらの動作についてより理解しましょう。addBarメソッドについて理解することは、コンパイラが周囲のスコープから値を見つけるために、どのように暗黙的なキーワードを通知するかを理解するのに役立ちます。Scalaでは、implicitキーワードは、implicit関数のパラメータもしくは、inplicitオブジェクトへの変換としても使用することができます。二つは全く異なりますが、両方ともにScalaの定義を解決する方法に関連しています。この場合、implicitは一つもしくはそれ以上の関数を呼ぶ場合と全ての関数に同じあたいを渡す必要がある場合に使われます。この手順は、APIを構成する際に便利で、ユーザはいつも何のパラメータが使用されるかについて明示する必要がなくなりますが、変わりにデフォルト値に依存します。
addBarの場合、barForm.bindFromRequestメソッドがplay.api.mvc.Requestパラメータをとり、明示的に渡す必要がないため、リクエストをimplicitと明示します。
参考に、Form.bindToRequestメソッドのメソッド定義を記載します。
bindFromRequestはフォームオブジェクトを返します。addBarメソッドでは、この場合Option[Bar]を返却するFormインスタンスのvalueメソッドを呼び出します。そして、呼び出しもとのマップがBarを取得し、フォームマッピングから生成できれば生成し、そうでなければgetOrElseステートメントはBadRequestを返却します。Barオブジェクトが生成することができた場合、それはトランザクション内でデータベースに保存されます。
これで、Squerylでリクエストパラメータとオブジェクトをマップしオブジェクトを保存する方法について理解できたと思うので、新しいaddBar controllerメソッドのテストを書きましょう。
Barの追加のテスト
下記の記述を新規作成したtest/ApplicationSpec.scalaファイルを記述し、addBar controllerメソッドの新しいテストを作ります。
機能テストではインメモリーデータベースとFakeApplicationを使います。テストでは、Application controllerのaddBarメソッドへのリクエストとnameという名前でFooBarという値のフォームパラメータを生成します。このテストの成功は、シンプルにindexページへリダイレクトされることで、ステータスがSEE_OTHER(HTTP 303ステータスコード)であるかをチェックし、リダイレクトのロケーションはindexページのURLでチェックされます。play testでテストを実行するか、play ~testであればコードの変更のタイミングでテストが実行されています。
JSONとしてBarを取得する
JSONのシリアライズされたデータとして全てのBarオブジェクトをアプリケーションへ返却するRESTfulなサービスを追加しましょう。app/controllers/Application.scalaファイルに新しいメソッドを追加します。
getBarsメソッドは、Squerylを使用してデータベースからBarオブジェクトを取ってきて、BarオブジェクトのJSON形式のリストを生成し、JSONデータを返却します。
conf/routesファイルに新しいルートを追加します。
これにより、/barsへのGETリクエストがgetBarsメソッドへマッピングされます。
ブラウザでhttp://localhost:9000/barsを表示させ確認してみましょう。
JSONとしてシリアライズされたBarオブジェクトのリストが見られるはずです。
前述した通り、トランザクションはSquerylのinTransactionで明示的に開始される必要があり、データベースから値をselectする場合もです。そして、トランザクション内で、Barの全てののエンティティはデータベースから取得されます。
クエリーの構文は、Squerylのタイプ・セーフなクエリー言語の力とDSLを作るためのScalaの力を示しています。from関数は最初のパラメータとしてテーブルへのタイプ・セーフな参照を受け取ります。これはキーワードからのSQLに似ています。2番目のパラメータは、パラメータとしてクエリーにテーブルを取得し、そのテーブル上に何をするかを指定します。この場合はselectです。formは、barsを不変な定数にセットされている反復処理可能なオブジェクトを返却します。その後、Json.generateメソッドは、データベースから取得されたbarsを反復処理し、それらを返却します。jsonの定数は、application/json(JSONの値)にセットされたコンテントタイプと共に、OK(HTTP 200ステータスコードの応答)で返却されます。
JSONサービスをテストする
JSONサービスをテストする新しいテストのためにtest/ApplicationSpec.scalaを更新します。以下を追記します。
再びこの機能テストでは、FakeApplicationとインメモリデータベースを使用します。そしてデータベースに新しいBarを生成し、Application controllerのgetBarsメソッドへのリクエストを作ります。テストしたレスポンスはOK(HTTP 200)で、生成されたBarの名前を含んでいるはずです。前と同じように、play testでこのテストを実行するか、play ~testで実行します。これで3つのテストに通っているはずです。
CoffeScriptとjQueryでBarsを表示する
これで、Barオブジェクトのリストを取得するRESTfulなJSONサービスができたので、取得とindexページへの表示を行うようCoffeScriptとjQueryを使って書いてみましょう。Play2の新しい機能の一つに、CoffeeScriptからJavaScriptへコンパイルとJavaScriptの構文チェック、ミニファイ化、LESSのCSSへのコンパイルを行うassetコンパイラがあります。
app/assets/javascripts/index.coffeeファイルを新規作成し、下記を記述します。
このCoffeeScriptは、/barsへのgetリクエストを作るためにjQueryを使用し、各barに対して反復処理を行い、barsのidと共にbarをページのエレメントに追加します。では、このスクリプトをロードするためにapp/views/index.scala.htmlテンプレートを更新し、ページにbarsエレメントを入れてみましょう。以下の記述をテンプレートのmainセクションのトップに追加します。
スクリプトのsrcは、javascripts/index.min.jsファイルへのURLを取得するためにroutes.Assets.at関数を使うことに注意してください。まだこのファイルは存在していません。Playのassetコンパイラは、index.coffeeファイルをコンパイルしてミニファイ化されたこのファイルを生成する必要がることを検知します。再度http://localhost:9000 のWebページを読み込み、新しいBarを生成し、Webページに表示されることを確認しましょう。
Herokuへのデプロイ
Herokuはクラウド上でPlay2の実行環境を提供する複数言語対応したCloud Application Platformです。このアプリケーションをHerokuへデプロイするには以下の手順を実行します。
1. 下記の内容を記述したProcfileをルートディレクトリは以下に作成します。
これによりHerokuへPlayアプリケーションの実行方法を伝えます。
2. Herokuは、Heroku上へのファイル転送にGitを用います。まだGitがインストールされていないのであれば、Gitをインストールしましょう。プロジェクトのルートディレクトリから、このプロジェクト用のGitリポジトリを生成し、ファイルを追加し、コミットします。
3. HerokuのツールベルトはHerokuへのコマンドラインインターフェースです。Heroku ツールベルトをインストールしましょう。
4. Herokuアカウントへサインアップします。
5. コマンドラインからHerokuへログインします:
GitのSSHキーをセットアップし、それをHerokuアカウントへ紐付けます。
6. 新しいアプリケーションをHerokuにプロビジョニングします。
7. HerokuへアプリケーションをPushします。
Herokuが、SBTでアプリケーションをビルドし、dyno上で実行します。
8. ブラウザでクラウド上で実行されるアプリケーションを開きましょう。
おめでとうございます!これであなたのアプリケーションはクラウド上で実行されています。
Share Your Opinion
Play2について思うところはありませんか?Getting Started with Play2, Scala, and Squerylのフォーラムトピックで議論しましょう。
リソース
このプロジェクトの全てのソースコードは、Github上から入手することができます。
https://github.com/jamesward/play2bars/blob/scala-squeryl
ローカルでPlayが実行されている場合、Playのローカルドキュメントにアクセスできます。
http://localhost:9000/@documentation
下記のサイトでもPlayのドキュメントを閲覧できます。
http://www.playframework.org/documentation
Herokuについては、Heroku Dev Centerを見てください。
この記事が一助となればと思いますが、もし質問や問題があれば我々に知らせてください。
著者について
James Ward (www.jamesward.com) is a Principal Developer Evangelist at Heroku. Today he focuses on teaching developers how to deploy Java, Play! and Scala apps to the cloud. James frequently presents at conferences around the world such as JavaOne, Devoxx, and many other Java get-togethers. Along with Bruce Eckel, James co-authored First Steps in Flex. He has also published numerous screencasts, blogs, and technical articles. Starting with Pascal and Assembly in the 80’s, James found his passion for writing code. Beginning in the 90’s he began doing web development with HTML, Perl/CGI, then Java. After building a Flex and Java based customer service portal in 2004 for Pillar Data Systems he became a Technical Evangelist for Flex at Adobe. You can find him tweeting as @JamesWard, answering questions on StackOverflow.com, and posting code at github.com/jamesward.
Ryan Knight is a senior software architect and consultant with over fifteen years of experience in all aspects of cloud computing and software development. He first started Java Consulting for Sun Microsystems Java Center and now runs his own consulting company. Some of his recent projects include being a software Consultant for Deloitte at the State of Louisiana, expert services for Adobe at T-Mobile, creatng a web application at Team Marketing Report, development of a text and voice chat system for Sony Online Entertainment, contributing to the Development of a Gift Card Creation Tool, and being a software architect for Williams Pipeline.
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- みなとRuby会議01に参加しました。#minatork01 (02 Jun 2012 | Tags:
みなとRuby会議01に参加しました。#minatork01 みなとRuby会議01に参加しました。#minatork01
当日のTwitterのまとめはこちら↓
・みなとRuby会議01 前半まとめ #minatork01
・みなとRuby会議01 後半まとめ #minatork01
初Rubyイベント参加
ずっとRubyは勉強したいと思っていたのですが、なかなか進まず放置状態でした。、(^^;)
そんな私は普段Rubyを書いているわけもなく、 たまたま勉強会でよくお会いする@joker1007 さん経由でこのみなとRuby会議が開催されることを知り、一念発起し参加と相成りました。
Rubyのコミュニティ力
言語やプラットフォームなどなど、新しい技術を学ぶとき、 その技術そのものの利点と同じようにその技術の「コミュニティ」が選ぶ理由になると思うのですが、 今回はじめてRuby界隈のイベントに参加させていただき、、 他のイベント・勉強会と比べても、Rubyコミュニティのレベルが高いなぁと関心するところが、随所に見られました。
なぜRubyはコミュ力が高いのか?は、わかりませんが、 スタートアップのプログラミング言語と言われるに納得できるAgilityの高さを感じました。
English Numeralsリベンジ
今回はじめてペアプロでのソーシャルコーディングをしました。
普段仕事ではペアプロをするのですが、こういった機会にするペアプロも新鮮で大変面白かったです!
ただ、、Ruby自体のインストールも当日の朝やってくるような準備の足りなさだったため、 ペアプロでは完全にナビ役になってしまいました。。
リベンジのため、ソーシャルコーディングの課題をScalaで書いてみました。
まだ冗長な部分もあって、いけてないですが、今のScala力ではこんなもんです。
#この記事を見たもっと強力なScala使いの方が、もっとスマートに書いてくれるでしょう、だぶん。。
まとめ
今回この様な有意義なイベントに参加させていただき、運営スタッフ、参加者の皆様、ありがとうございました。
懇親会にも是非参加したかったのですが、諸事情により今回は断念となってしまいました。。orz
今回のはじめの一歩に続く次のイベントも開催されること期待しています。そのときにはもう少しRuby力を上げて参加できるようがんばります!
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- 【意訳】Tutorial:Play Framework 2 with Scala, Anorm, JSON, CoffeeScript, jQuery&Heroku[Herokuデプロイ編] (04 Mar 2012 | Tags:
【意訳】Tutorial:Play Framework 2 with Scala, Anorm, JSON, CoffeeScript, jQuery&Heroku[Herokuデプロイ編] 【意訳】Tutorial:Play Framework 2 with Scala, Anorm, JSON, CoffeeScript, jQuery&Heroku[Herokuデプロイ編]
元記事はこちら
少々長い記事なので、Play2アプリのビルド編とHerokuへのデプロイ編に分けます。
今回は、Herokuへのデプロイ編です。
Play2アプリのビルド編は、こちら
Step 1) Herokuのアカウントを取得して、Heroku Toolbeltとgitをインストールして、コマンドラインからHerokuへログインします
もしこれがはじめてのHerokuへのログインだったら、git用のSSHキーの作成と、Herokuアカウントへの紐付けをする必要があります。
Step 2) Heroku上の各アプリケーションは、テスト用にPostgres DBを持っています。 Heroku上でアプリケーションを実行してこのDBを使うには、別途設定が必要です。 これにはいくつか方法がありますが、最も簡単な方法はスタートアップコマンドラインからDBの設定をオーバーライドする方法です。 これはStep3で紹介します。 その前に、Psotgres JDBCドライバーをプロジェクトの依存関係として指定する必要があります。 “project/Build.scala”ファイルに、以下のような”appDependencies”を設定します。
Step 3) Herokuにどのプロセスを実行するのかを教えるために、プロジェクトルートディレクトリ配下にファイル名”Procfile”を作成し(※大文字と小文字が区別されます)、以下のように記述します
Play2では、プロジェクトのビルドにScala Build Tool(SBT)を使います。プロジェクトがHerokuへデプロイされると、プロジェクトをコンパイルするため”sbt stage!コマンドが実行されます。 そして、プロセスがJavaのクラスパスの設定とPlayサーバーの起動をする”taget/start”スクリプトを生成します。 Herokuはアプリケーションに、Javaプロパティ”http.port”が適宜設定されるように、環境変数”PORT”を使用してリッスンすべきHTTPポートを通知します。 また、Heroku上のアプリケーションへDB(とその他のリソース)への接続文字列は、デフォルトでは環境変数介して渡されます。 環境変数のDATABASE_URLは、DBホスト、名前、ユーザ名、パスワードを含みます。 所謂”db.default.url”プロパティがその値で設定されます。 またドライバは、Postgres JDBCドライバクラスに設定されます。
Step 4) Herokuはアプリケーションのアップロード方法としてgitを使っています。 SCMツールにgitを使っていようと無かろうとHerokuへアプリケーションをアップロードするにはgitを使います。 プロジェクトのルートディレクトリでgit repoを作り、ファイルを追加してコミットします。
※ 選択しての”git add”の代わりに、”.gitignore”ファイルを更新することもできます。
Step 5) Heroku CLIを使用して、Heroku上に新しいアプリケーションをプロビジョニングします。 あなたが作った各アプリケーションは1月辺り、750“dyno”時間無料です。 開発者として無料でHerokuを使用でき、スケールした分だけ支払うことになります。 コマンドライン上で、”cedar”スタックを使って新しいアプリケーションを作ります。
これでアプリケーションのHTTPとgitのエンドポイントを作ります。 アプリケーションで変更した名前を使うことも、自身のドメイン名を使うことも可能です。
Step 6) アプリケーションはクラウドへデプロイする準備が整いました。コマンドラインからHerokuのマスターブランチへ”git push”します。
Herokuがファイル受け取ると、Play Frameworkのプレコンパイラが実行され、Herokuが”slug file”をアセンブルし、”slug”がdynoへデプロイされます。
Step 7) これで”heroku create”に続いて出力のドメインに移動する、もしくは単純に実行することで、ブラウザでアプリケーションを表示できます。
Scala, Anorm, JSON, CoffeeScript, jQueryを使ったPlay2アプリケーションをHeroku上にデプロイできたはずです。 これよりも詳細にHerokuの使い方を知りたいときは、Heroku Dev Centerを確認してください。 もし質問があったら、私に知らせてください。
このエントリーは、CoffeeScript, jQuery, Play Framework, Scalaを使ってポストされました。パーマリンクをブックマークしてください。コメントかトラックバックをよろしく。トラックバックURLは、こちら
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- 【意訳】Tutorial:Play Framework 2 with Scala, Anorm, JSON, CoffeeScript, jQuery&Heroku [Play2アプリのビルド編] (29 Feb 2012 | Tags:
【意訳】Tutorial:Play Framework 2 with Scala, Anorm, JSON, CoffeeScript, jQuery&Heroku [Play2アプリのビルド編] 【意訳】Tutorial:Play Framework 2 with Scala, Anorm, JSON, CoffeeScript, jQuery&Heroku [Play2アプリのビルド編]
元記事はこちら
少々長い記事なので、Play2アプリのビルド編とHerokuへのデプロイ編に分けます。
今回は、Play2アプリのビルド編です。
Herokuへのデプロイ編は、こちら
※ 2012/03/06:アドバイスいただいた箇所について修正しました。
Play Framework2 RC2がリリースされ、モダンなWebアプリケーションを構築する手法として成熟した生産的な方法になっています。
Play2とScala,Anorm,JSON,CoffeeScript,jQueryを使って迅速なアプリケーション構築を体験してみましょう。
一度ローカルでアプリケーションが動いてしまえば、あとはHerokuにデプロイするだけです。
(注意:これはmy Play1+Java turtorialの、Play2+Scala版です。)Githubからソースを入手してください。
Step 1) Play2 RC2版をダウンロード・インストールしてください。
Step 2) 新しいアプリケーションを作ります:
プロンプトの言語選択画面がでたら、Scalaを選択してください。
Step 3) 新しく作成した”foobar”ディレクトリ配下にIDEの設定ファイルを生成します。
IntelliJでは、このように実行します。
注意:ここで生成されたIMLファイルは、プロジェクトとして直接インポート可能ではありません。代わりに、モジュールなしでプロジェクトを新たに生成して、このステップで生成したIMLファイルからそのプロジェクトへモジュールをインポートする必要があります。もしわからなければ、Play1+Scala IntelliJ articleが参考になります。
Eclipseプロジェクト化するために、下記のコマンドを実行
Step 4) Playサーバの起動
正常に起動していることをテストするために、ここにアクセスhttp://localhost:9000
Step 5) Play2 with ScalaではデフォルトでORマッパーを提供していません。代わりにデフォルトのRDBMS永続性プロバイダとなっているのがAnormです(Anormは Object Relational Mapperではありません)。このシンプルなアプリケーションでは、1つの永続的オブジェクト:Bar(ひとつのプライマリキーと名前を持っている)を持っています。Anormは、自動でのスキーマ作成を行わないので、SQLスキーマの作成/廃棄のためのスクリプトが必要です。新しいファイル”conf/evolutions/default/1.sql”を作成し、以下の内容を記述します。
Anormでは、Scalaの”case class”を永続的/CRUDインターフェースとして、値オブジェクトとシングルトンオブジェクトとして扱うことができます。”app/models/Bar.scla”というファイルにBar case classとオブジェクトを作成して、以下の内容を記述します。
変数の”simple”は、データベースの行値をBar case classにマップする、基本的なパーサを提供します。
静的関数、”findAll”と”create”は、一般的なデータアクセスを行います。
注意点としては、”findAll”はBarへ各行を返すために、”simple” row parserを使っている点です。
Step 6) インメモリーのh2データベースを使うために、”conf/application.conf”ファイルに以下の値を設定する。
Step 7) “app/controllers/Application.scala”を下記のように更新し、BarをHTTP POSTへ変換してデータベースに反映するアプリケーションコントローラー関数を作成します。
“barForm”マップは、フォームオブジェクトへパラメータを要求し、入力データのバリデーションを行います。 静的関数の”addBar”は、リクエストと”barForm”へのリクエストパラメータのマッピングを行います。 失敗した場合は、コントローラはBadRequestを返します。 成功した場合は、Barの名前は新しい”Bar”を構築するために使われます。そしてその”Bar”はデータベースに保存され、indexページへのリダイレクトが送られます。 index関数は、Step 9で更新されるテンプレートへ”barForm”を渡すように変更されました。
Step 8) “conf/routes”ファイルに以下の行を追加して、”/addBar” URLへのPOSTリクエストを”Application.addBar”へマップする新しいルートを作成します。
Step 9) フォームパラメータを受け取るために、”main”テンプレートを拡張した”app/views/index.scala.html”テンプレートを更新し、Webページ上のフォームをレンダリングするためにPlay2 form helperを使います。
ブラウザでhttp://localhost:9000を開き、データベース変更の適用と、フォームのテストをします。うまくできていれば、フォームを送信するとindexページへリダイレクトされるはずです。
Step 10) JSONサービスを作成し、barの全てを取得するための関数を、”app/controllers/Application.scala”ファイルに追加します。
新しく作成した関数は、シリアル化されたJSONとして、”Bar.findAll()”から”Bar”オブジェクトのリストを返します。
“/listBars”へのリクエストのために、下記のように新しいGET request handlerを”conf/routes”に追加します。
ブラウザでhttp://localhost:9000/listBarsを開いてみてください。Step 9で作成したbarが表示されているはずです。
Step 11) jQueryを使いJSONシリアル化されたbarの取得と、それぞれのページ追加のために、新しいCoffeeScriptファイル”app/assets/javascripts/index.coffee”を作成します。内容は以下
CoffeScriptは、”/listBars”へのGETリクエストの作成と返却値の反復、ページ(Step 12で追加します)の”bars”エレメントへの各アイテムの追加のために、jQueryを使います。
Step 12) CoffeeScriptのソースから自動コンパイルされたindex.jsスクリプトを使うために、”app/views/index.scala.html”を以下の行を”main”ブロックへ追加し、更新します。
ブラウザで、http://localhost:9000/を表示し、barがページ上部に表示され、新しいbarが期待通りに追加されていることを確認してください。
これで、Scala, Anorm, JSON, CoffeeScript, jQueryを使ったPlay2アプリのビルド完了です。ここで紹介したすべてのソースコードはGitHub上にあります。あとはHerokuへデプロイするだけです。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- ScalaでFizzBuzzしてみた (24 Jan 2012 | Tags:
ScalaでFizzBuzzしてみた ScalaでFizzBuzzしてみた
社内でFizzBuzz大会をやりました。
##はじめに 社内のチームでFizzBuzz大会をやろう、という話自体は去年の秋ごろからあって 年が明けて、今日開催しました。
##FizzBuzz大会要綱
Fizz buzz publishView more presentations from modalsoul###大会参加者
- 15名
###ルール ####ルールその1 引数n(正の整数)が渡されたときに 1~nまでのFizzBuzzを表示する関数を書きなさい。表示形式はFizzBuzzであるとわかれば何でも可 ####ルールその2 実装言語は何でもOK ####ルールその3 何度(何種類)回答してもOK
※ただし、評価対象は1つだけ ####ルールその4 テストコードもあるとイイネ! ####ルールその5 他人のコードを盗まない
※”FizzBuzz”をググってコピペするのも、もちろんNG
※言語のリファレンスを見る、技術書を見るのはOK ####ルールその5 制限時間は、30分 ###大会タイムスケジュール
- 10:00 概要説明
- 10:10 環境準備・コーディング開始
- 10:40 コーディング終了
- 10:45 LT(コードのロジック説明等)
- 11:35 集計
- 11:40 表彰
###評価方法
- 1人持ち時間3分でロジックを解説。LT形式
- これはスゴイと思った順に、3点、2点、1点を投票。
- 合計点数で”Most IKETERU Programer”:MIPを決定
##やって、どうなった? 実装言語は縛らなかったので、いろいろなFizzBuzzが出てきました。
- PHP
- Java
- JavaScript
- C言語
- シェルスクリプト
- CSS
- バッチ
制限時間は、結局10分延長。 それでも何人かは書きあがらなくて、ロジックの説明のみ参戦。 いつもはブラウザで動作させているものを、 コマンドラインから動かすときに「あれ引数どうやってとるんだっけ?」 みたいなところが嵌りポイントっぽかったです。
###面白かったFizzBuzz 個人的に、おぉっと思ったものがいくつか、、
####CSSでFizzBuzz
↑で、3の倍数の色が#f9cになるっていう。 これと同じパターンで、5の倍数・3と5の倍数の時に色が変わるって。
CSS使って、FizzとBuzzを色の違いで表現するとはっ!! 完全に盲点でした。
これ文字列でFizzもBuzzも出力してなくて、見た感じわかりづらいんですけどね。。すごかったですw
###Chrome上でFizzBuzz
まず1行でFizzBuzzしてるところが、Cool!! そして何より、LTで ChromeのJavaScriptコンソール上で実行して見せるところがすげぇっ!!って感じw
##自分のFizzBuzz解答 もちろん私はScalaで書きました。
自分なりのポイントとしては、
- 剰余算の結果を”== 0”と比較するのは、なんかイケてない
- 折角Scalaなので、Mapとパターンマッチを使ってみる
もっと短く書けるだろうけど、今はこれが精一杯。
##最後に 実際にFizzBuzzを書くようなシーンは仕事では出会わないだろうけど、 「ここをこうしたらもっとカッコいい!」ってワクワクできるのはいいですよね
もっとカッコいいコードが書けるようになりたいなぁと思いました
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books: