2011年7月23日土曜日

[scala]簡易的な実行速度測定

scala で書いたコードの実行速度を測定したい場合に使える、簡易的なメソッドを考えたので、そのメモ。 内容は次のような感じです。
def timeOf[A](f: => A): A = {
  val start = System.currentTimeMillis
  val result = f
  val end = System.currentTimeMillis
  println("[Time] %s ms".format(end - start))
  result
}
これを、たとえば適当な package.scala に書いて使えるようにしておけば
scala> timeOf((1 to 100000000).foreach(_ * 2))
[Time] 1067 ms
などというように使えます。
※package.scala は、簡単に説明しますと、あるパッケージで使い回したい変数やメソッドをまとめて定義しておける場所です。こちらのブログなどを参照してください:
Scala 2.8 で追加されたパッケージオブジェクト

上記のように定義すると
val result = timeOf {
  // なんだか長いコード
}
// 以下、result を使った処理
というふうにも書けるので便利かと思います。

scala が標準で用意している scala.testing.Benchmark という trait もありますが、 こちらは mixin したあとに、runメソッドをオーバーライドして、runBenchmark を呼び出す、という手順を挟むので、もう少し気軽に試したいなぁ、と思って書いてみた次第です。あと、Benchmark の場合は、処理実行結果を返してくれませんが、上記のメソッドだと処理結果も使うことができます。また、ソースをみたときに気づいた点として最後に Platform.collectGarbage(= System.gc()) を呼び出しているようです。

実際に scala.testing.Benchmark を使った場合のサンプルは以下のサイトで丁寧に説明されています。
参考:Scala Benchmark

2011年7月9日土曜日

play-scalaの導入

play-scala プロジェクトを新規に作成して,eclipse で開発できるように環境を構築していたのですが,途中,エラーが出て少し悩んだところがあったのでまとめておきます.
※簡略できる手順などありましたら,教えていただけると助かります.

環境

※バージョン管理ツールに svn を使用しますが,svn の環境についてはすでに準備されているものとします.

手順

  1. play-scala プロジェクトの新規作成

    詳細な play のインストールについては,本家サイトを参照ください.
    ここでは,scala module を使用したプロジェクトの新規作成についてのみ記述します.新規作成を行うには play new コマンドに with オプションにて,scala を指定します.
    $ play new hoge --with scala
    
    次のように表示されればOKです.
    ~        _            _ 
    ~  _ __ | | __ _ _  _| |
    ~ | '_ \| |/ _' | || |_|
    ~ |  __/|_|\____|\__ (_)
    ~ |_|            |__/   
    ~
    ~ play! 1.2.2, http://www.playframework.org
    ~
    ~ The new application will be created in /some/workspace/hoge
    ~ What is the application name? [hoge] 
    ~
    ~ Resolving dependencies using /some/workspace/hoge/conf/dependencies.yml,
    ~
    ~       play->scala 0.9.1 (from playLocalModules)
    ~
    ~ Installing resolved dependencies,
    ~
    ~       modules/scala-0.9.1 -> /opt/play-1.2.2/modules/scala-0.9.1
    ~
    ~ Done!
    ~
    ~ OK, the application is created.
    ~ Start it with : play run hoge
    ~ Have fun!
    ~
    
    プロジェクトが作成できたので,svn リポジトリに登録しておきます.
    $ svn import ./hoge http://somewhere/svn/hoge/trunk/hoge -m "new project"
    
  2. play-scala プロジェクトを eclipse プロジェクトに変換する.

    play-scala プロジェクトを eclipse で扱えるようにするためには,コマンドで eclipse プロジェクト化する必要があります.
    まず eclipse に取り込む前に,一度チェックアウトしておきます.
    $ svn co http://somewhere/svn/hoge/trunk/hoge /some/hoge
    $ cd /some/hoge
    $ play eclipsify
    
    これで..classpath, .projectなどのファイルや eclipse からの起動に必要な launcher が納められた eclipse ディレクトリが作成されたものと思います.
  3. eclipse へ import

    あとは,取り込むだけといきたいのですが,ここでそのままパッケージ・エクスプローラにて,[右クリック]→[インポート]→[既存プロジェクトをワークスペースへ]から eclipse に import すると,次のようなエラーが発生します.
    value Application is not a member of package views
    
    これを回避するためには,プロジェクトを起動させ,scala ファイル(および class ファイル)を自動生成させる必要があります.
    エラーは無視して,eclipse 上からプロジェクトを起動させます.起動させるためには,hoge/eclipse/hoge.launch を右クリックから実行させればOKです.コンソールに
    Listening for transport dt_socket at address: 8000
    08:24:00,422 INFO  ~ Starting /some/workspace/hoge
    08:24:00,446 INFO  ~ Module scala is available (/opt/play-1.2.2/modules/scala-0.9.1)
    08:24:01,431 INFO  ~ Scala support is active
    08:24:01,432 WARN  ~ You're running Play! in DEV mode
    08:24:01,471 INFO  ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...
    
    のように表示されたら,ブラウザから http://localhost:9000 にアクセスします.そこで再度コンソールを見ると
    Compiling:
     /some/workspace/hoge/app/controllers.scala
     /opt/play-1.2.2/modules/docviewer/app/helpers/CheatSheetHelper.java
     /opt/play-1.2.2/modules/docviewer/app/DocViewerPlugin.java
     /some/workspace/hoge/tmp/generated/views.defaults.html.welcome.scala
     /some/workspace/hoge/tmp/generated/views.html.main.scala
     /opt/play-1.2.2/modules/docviewer/app/controllers/PlayDocumentation.java
     /some/workspace/hoge/tmp/generated/views.Application.html.index.scala
    Traversing /some/workspace/hoge/app/controllers.scala
    Traversing /some/workspace/hoge/tmp/generated/views.Application.html.index.scala
    Traversing /some/workspace/hoge/tmp/generated/views.defaults.html.welcome.scala
    Traversing /some/workspace/hoge/tmp/generated/views.html.main.scala
    API phase took : 0.114 s
    08:24:21,920 INFO  ~ Application 'hoge' is now started !
    
    のように自動でコンパイルが行われていることがわかります.あとは,hoge プロジェクトを右クリックして,[プロパティー]→[Java のビルド・パス]→[ライブラリー]→[クラス・フォルダーの追加]から,hoge/tmp/classes を選択して,[OK]を選べばエラーが発生しなくなります.
  4. eclipse 設定ファイルを管理対象外にする

    最後に,play eclipsify にて生成されたファイルやプロジェクト起動時に自動生成されたファイルを svn へコミットしないようにしておきます.管理対象外とするのは,以下のファイルおよびディレクトリです.
    • hoge/.settings/
    • hoge/eclipse/
    • hoge/tmp/
    • hoge/.classpath
    • hoge/.project
    • hoge/.scala_dependencies
    上記のファイルおよびディレクトリを選択し,右クリック→[チーム]→[svn:ignore に追加]とすればOKです.

2011年7月3日日曜日

RPMコマンドの使い方

RPMパッケージをインストールする


オプションにiを指定する.
# rpm -ivh hoge.rpm
vは詳細情報,hはインストールの進行状況を表示するオプション.
# rpm -ivh hoge.rpm fuga.rpm
などとすれば,複数同時も可能.

RPMパッケージを更新する


Uオプションを指定する.
# rpm -U hoge.rpm

RPMパッケージをダウングレードする


# rpm -i --oldpackage hoge.rpm

RPMパッケージをインストールせず,テストのみ行う


# rpm -i --test hoge.rpm

RPMパッケージを確認する


# rpm -q hoge
hoge-1.0.1

インストールされているすべてのRPMパッケージを確認する


# rpm -qa
hoge-1.0.1
fuga-2.1.0
……
数が多いと思うので,grepで絞り込むなどするとよい.

参考サイト:
RPM コマンドの使い方
自宅サーバでやってみよう > RPMパッケージの確認方法