Scala

Scala IDEが便利になった。

というより、Eclipse同梱版が出来て、楽になった。

Scala IDEは、Scala2.10.x用の環境で、Scala 2.9.x以下を使っている場合は使えないようです。

※Scala IDE上ではScala 2.10.xが動くけど、コマンドラインでは2.9.xという感じでは使えるかと思います。

Scala IDEは、ベースがEclipseなので、Windowsの他、Mac OSとLinux上で使えるよ ...

Scala

import scala.utl.Random

val a = List(1,2,3)
val b = List(4,5,6)

val c = a ::: b

val rand = new Random

c.sortBy{_ => rand.nextInt(c.size)}.map(println)

Play framework2

Play frameworkを本番環境にデプロイする場合に、PIDファイルを別の場所に置きたいなと思ったりします。

デフォルトだとプロジェクトディレクトリの直下にRUNNING_PIDというファイルが作成されます。

このRUNNING_PIDファイルを作る所のコードを確認すると

play.core.server.NettyServer

の中にあるようです。

def createServer(applicationPath

Scala

Apacheのログから、各IPからのアクセス数を集計して、多い順にソートして表示するスクリプト
val apacheLog = new File("access.log")

/*
 * IPアドレスのカウント
 */
StringFileInput(apacheLog) { reader =>
  var count = 0

 //ランダム文字生成器
  val it3 = new I ...

Play framework2

Play Framework 2.0系のプロジェクトで、リクエスト毎にログを出力するような設定をした場合、ログファイルをローテートしたくなったりします。

場合によってはlogrotateの設定でやったりもします。

が、今回は、Play Frameworkのログの設定でローテートしてみます。

Play Frameworkは、LogBackというミドルウェアを使用してログを出力します。

で、必要な設定などはすでにPlay Framework自体が ...

Scala

前回、Scalaでちょっとスマートにファイルを読み込んでみるで、defで定義した物を、case classに変えてみました。
case class StringFileInput(file: File)(f: BufferedReader => Unit) {
val in = new FileInputStream(file)
try {
f(new BufferedReader(new InputStreamReader(in))) ...

Scala

val keyChars = ((‘a’ to ‘z’) ++ (‘A’ to ‘Z’) ++ (‘0’ to ‘9’)).toArray

Scala

Scalaだと、テキストファイルなどを開く時は
//ファイルを開いてインスタンスを得る
val src = Source.fromFile(currentFile)

//ファイルの行をforeach
src.getLines().foreach(println)

//ファイルを閉じる
src.close
と書いたりしますが

なんか、最後にclose書かないと行けないのがスマートじゃ無いなと思ったりします。 ...

Play framework2

リクエストを受けた直後のアクションについては

/app/Global.scala

というオブジェクトのファイルを作り

GlobalSettingsを継承します。

このGlobalSettingsというトレイトには

beforeStart
onStart
onStop
onRouteRequest
onError
onHandlerNotFound
onBadRequest ...

Play framework2

Play Frameworkはなんか、デフォルトで正常に動いていると、ログが少ないなと思ったりします。

正常に動いたように見えても、データがおかしいのを拾っている場合もあります。

そんな時は、どんなSQLが叩かれているのかと言うのを見たくなります。

Ruby on Railsでは、developmentモードで起動していると常にSQLの実行ログが出たりしますが

Play Frameworkでは設定を追加しないと駄目なようです。

設 ...

Play framework2, Scala

これは、Play Framework で使用しているAkkaのデフォルト設定による物で、ボディパーサのタイムアウトが1秒に設定されています。

retrieveBodyParserTimeout = 1 second

なので、負荷をかけていって、一つのリクエストが1秒を超えたあたりでタイムアウトのエラーが発生してしまいます。

そこで、Akkaの設定を追加してあげれば良いのですが、どこに追加したら良いかというと

決まりは無い感じですが

Ruby, Scala

Rubyでは

.each_with_index |value, index|
p "#{index}番目は#{value}です"
end

というような書き方が出来ます。

これをScalaで書くにはどうするか。

val list = List("one", "two", "three")
list.zipWithIndex.fore

Scala

Rubyにはrvmがある。

Scalaにはsvmがある。

ということで、svmを入れてみたいと思います。

ここから、cloneかzipファイルをダウンロードします。

展開した所にsvmがあると思うので、ここにパスを通します。

Ubuntuだと~/.profileの最後に

export PATH=$PATH:~/svm

もう一つ、

export SCALA_HOME=~/.svm/current/ ...

Play framework2

application.confには前環境で共通の内容を設定
prod.confには、本番環境用のみのものを設定

という感じで、本番と開発で設定を分けたいなと思います。

これを実現するには

起動時のパラメータに以下のような設定を追加することで実現出来ます。
config.resource=prod.conf
このconfig.resourceというのは、Play プロジェクト内のリソースとしてのprod.confを読み込みます、と ...

Scala

今回のお題は
プログラムをやってて、ある程度数値をいじる方にはもう一般的な事かもしれませんが

四捨五入です。

Scalaで。

わかりやすいように例を挙げますと

画像サイズを比率を保ったまま縮小する処理を書いてみます。

 

このような感じで「widthAfter/widthBefore」で比率を求め、heightBeforeに掛け合わせて算出します。

これをそのまま実行するとheigh ...

Play framework2, Scala

APIDOCとか、Documentをみたら、分かる事ではあるが、はまりやすいので書いておく


とした場合に

action1を叩いてからaction2を叩くと
セッションの情報がtest2 -> value2だけになる。

test1とtest2のセッションを保持したいなら

とする

たぶん

Play framework2, Scala

Scalaの開発をVMで行っているわけでありますが

素のPlay frameworkだと、色々やってるうちにメモリを浪費してしまうようです。

メモリリークでは無いけど、必要なメモリをどんどん確保してしまうみたい。

なので、ヒープの上限という意味で割り当てを指定してみます。

毎回Play起動時に指定するのは面倒なので、環境変数で。

#~/.bashrc を開いて、一番下あたりに

と書き込んでターミナルを再起動します ...

Scala

とかやりたい時に、そのままやってもエラーになってしまうが

を書いておくと、上記の書き方が出来るようになる

※補足
sbtでプロジェクトを管理している時にApache Commons IOを使う場合

build.sbtに

を追加しておくと依存関係が解決

Play framework2, Scala

Play frameworkは便利ですが、そのまま稼働させたい時などにわざわざ

なんて打ちたくありません。

でも、playコマンドにそのままstartと引数を付けて叩くと、コマンド一発で起動する事が出来ます。

ところが、

なんてやった場合に、ポートが80番にならない。

よくよく調べてみると、playコマンドに対してstartと80の引数が渡された状態のようで

playはstartだけを有効な引数として ...