Scala IDEが便利になった
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 IDEについて 自分が便利だと思 ...
ScalaのListのデータをランダムにソートする
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 frameworkのpidファイル「RUNNING_PID」ファイルの場所を変える(v2.0.4以降)
Play frameworkを本番環境にデプロイする場合に、PIDファイルを別の場所に置きたいなと思ったりします。 デフォルトだとプロジェクトディレクトリの直下にRUNNING_PIDというファイルが作成されます。 このRUNNING_PIDファイルを作る所のコードを確認すると play.core.server.NettyServer の中にあるようです。 def createServer(applicationPath: File): Option = { // Manage RUNNING_ ...
Apacheのログから、各IPからのアクセス数を集計する
Apacheのログから、各IPからのアクセス数を集計して、多い順にソートして表示するスクリプト val apacheLog = new File("access.log") /* * IPアドレスのカウント */ StringFileInput(apacheLog) { reader => var count = 0 // ランダム文字生成器 val it3 = new Iterator] { def hasNext = reader.r ...
Play Framework 2.0でログファイルローテートしてみる
Play Framework 2.0系のプロジェクトで、リクエスト毎にログを出力するような設定をした場合、ログファイルをローテートしたくなったりします。 場合によってはlogrotateの設定でやったりもします。 が、今回は、Play Frameworkのログの設定でローテートしてみます。 Play Frameworkは、LogBackというミドルウェアを使用してログを出力します。 で、必要な設定などはすでにPlay Framework自体が設定してくれているので ログを出力するのは Logge ...
Scalaでちょっとスマートにファイルを読み込んでみる(その2)
前回、Scalaでちょっとスマートにファイルを読み込んでみるで、defで定義した物を、case classに変えてみました。 case class StringFileInput(file: File)(f: BufferedReader => Unit) { val in = new FileInputStream(file) try { f(new BufferedReader(new InputStreamReader(in))) } finally { println( ...
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書かないと行けないのがスマートじゃ無いなと思ったりします。 なので、ちょっとこの辺をいじってみましょう。 参考として、Rubyの場合は、このよう ...
Play Framework で、リクエストログを出力したい
リクエストを受けた直後のアクションについては /app/Global.scala というオブジェクトのファイルを作り GlobalSettingsを継承します。 このGlobalSettingsというトレイトには beforeStart onStart onStop onRouteRequest onError onHandlerNotFound onBadRequest というメソッドが定義されていて、それぞれオーバーライドする事でアクションを設定する事が出来ます。 今回は、リクエストが来た時 ...
Play Framework で、SQLの実行ログもログに出力させたい場合
Play Frameworkはなんか、デフォルトで正常に動いていると、ログが少ないなと思ったりします。 正常に動いたように見えても、データがおかしいのを拾っている場合もあります。 そんな時は、どんなSQLが叩かれているのかと言うのを見たくなります。 Ruby on Railsでは、developmentモードで起動していると常にSQLの実行ログが出たりしますが Play Frameworkでは設定を追加しないと駄目なようです。 設定は application.conf に db関係の設定があると ...
Play Framework 2.0.2 で負荷をかけるとエラーが出まくる
これは、Play Framework で使用しているAkkaのデフォルト設定による物で、ボディパーサのタイムアウトが1秒に設定されています。 retrieveBodyParserTimeout = 1 second なので、負荷をかけていって、一つのリクエストが1秒を超えたあたりでタイムアウトのエラーが発生してしまいます。 そこで、Akkaの設定を追加してあげれば良いのですが、どこに追加したら良いかというと 決まりは無い感じですが confの中にあるapplication.confとか akka ...
ScalaのArrayなどで、Rubyのeach_with_indexのようなインデックス付きイテレーションを使う
Rubyでは .each_with_index |value, index| p "#{index}番目は#{value}です" end というような書き方が出来ます。 これをScalaで書くにはどうするか。 val list = List("one", "two", "three") list.zipWithIndex.foreach{ case(value, index) => println(" ...
Scalaの複数バージョンを切り替えられるsvm
Rubyにはrvmがある。 Scalaにはsvmがある。 ということで、svmを入れてみたいと思います。 ここから、cloneかzipファイルをダウンロードします。 展開した所にsvmがあると思うので、ここにパスを通します。 Ubuntuだと~/.profileの最後に export PATH=$PATH:~/svm もう一つ、 export SCALA_HOME=~/.svm/current/rt とかやればOKです。 で、svmと叩いて、ヘルプが出力されれば完了です。 続いて、Scalaのイ ...
Play Frameworkでapplication.confではなく、別の設定ファイルを読み込んで起動する設定
application.confには前環境で共通の内容を設定 prod.confには、本番環境用のみのものを設定 という感じで、本番と開発で設定を分けたいなと思います。 これを実現するには 起動時のパラメータに以下のような設定を追加することで実現出来ます。 config.resource=prod.conf このconfig.resourceというのは、Play プロジェクト内のリソースとしてのprod.confを読み込みます、という設定なので、 confディレクトリに格納しておく必要があります ...
[Scala]BigDecimalで四捨五入
今回のお題は プログラムをやってて、ある程度数値をいじる方にはもう一般的な事かもしれませんが 四捨五入です。 Scalaで。 わかりやすいように例を挙げますと 画像サイズを比率を保ったまま縮小する処理を書いてみます。 // もとの画像のサイズ val heightBefore = BigDecimal(2048) val widthBefore = BigDecimal(1506) // 縮小後のサイズ val widthAfter = BigDecimal(250) // widthを2 ...
[Scala]Play framework 2.0 のwithSessionを使うと今まで入れてたセッションが消える
APIDOCとか、Documentをみたら、分かる事ではあるが、はまりやすいので書いておく def action1 = Action { Ok.wi5hSession("test1" -> "value1") } def action2 = Action { Ok.wi5hSession("test2" -> "value2") } とした場合に action1を叩いてからaction2を叩くと セッションの情報がtest2 -> value2だけになる ...
[Scala]Play framework で使用するJVMのヒープサイズを環境変数で指定する
Scalaの開発をVMで行っているわけでありますが 素のPlay frameworkだと、色々やってるうちにメモリを浪費してしまうようです。 メモリリークでは無いけど、必要なメモリをどんどん確保してしまうみたい。 なので、ヒープの上限という意味で割り当てを指定してみます。 毎回Play起動時に指定するのは面倒なので、環境変数で。 #~/.bashrc を開いて、一番下あたりに export _JAVA_OPTIONS="-Xms256M -Xmx256M" と書き込んでターミナルを再起動します。 ...
[Scala]javaのIteratorなデータをScalaで簡単にforeachする
import org.apache.commons.io.FileUtils val it = FileUtils.lineIterator( currentFile ) it.foreach(println) とかやりたい時に、そのままやってもエラーになってしまうが import scala.collection.JavaConversions._ を書いておくと、上記の書き方が出来るようになる ※補足 sbtでプロジェクトを管理している時にApache Commons IOを使う場合 bui ...
[jMagick]jMagickでIPICとかEXIFの情報を削除する(Scalaで)
ソースはScala val info = new ImageInfo(FilePath) val image = new MagickImage(info) // イメージの情報を削除 image.profileImage("*", null)
[Scala]Play framework 2.0で、playのコンソールに入らずにアプリを実行する
Play frameworkは便利ですが、そのまま稼働させたい時などにわざわざ $> play $ start なんて打ちたくありません。 でも、playコマンドにそのままstartと引数を付けて叩くと、コマンド一発で起動する事が出来ます。 $> play start ところが、 $> play start 80 なんてやった場合に、ポートが80番にならない。 よくよく調べてみると、playコマンドに対してstartと80の引数が渡された状態のようで playはstartだけを ...