query: tag:Scala

sbtのバージョンを確認するには以下のコマンドを実行すればok

pre>>
% sbt sbt-version
<<--

posted by genki genki on Wed 5 Dec 2012 at 04:08 with 0 comments

 Scalaのplayframework2.0を使って開発することになったので、ローカルのWindows環境の構築手順をメモ。

sbtインストール

  • 下記URLから sbt-launch.jar をダウンロードします。

http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/0.11.2/sbt-launch.jar

  • 任意のディレクトリに sbt-launch.jar を置いて、同じディレクトリ内に下記の内容で sbt.bat を作成します。

sh>>
set SCRIPT_DIR=%~dp0
java -Xmx512M -jar "%SCRIPT_DIR%sbt-launch.jar" %*
<<--

  • 上記ディレクトリにパスを通し、sbt コマンドで起動します。

sh>>
C:\Users\akanuma>sbt

C:\Users\akanuma>set SCRIPT_DIR=C:\sbt\

C:\Users\akanuma>java -Xmx512M -jar "C:\sbt\sbt-launch.jar"
Getting net.java.dev.jna jna 3.2.3 ...
downloading http://repo1.maven.org/maven2/net/java/dev/jna/jna/3.2.3/jna-3.2.3.jar ...
[SUCCESSFUL ] net.java.dev.jna#jna;3.2.3!jna.jar (13985ms)
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
1 artifacts copied, 0 already retrieved (838kB/106ms)
Getting Scala 2.9.1 (for sbt)...
~~~ 中略 ~~~
[info] Resolving org.scala-tools.sbt#precompiled-2_8_1;0.11.2 ...
[info] Resolving org.scala-tools.sbt#precompiled-2_8_0;0.11.2 ...
[info] Resolving org.scala-tools.sbt#precompiled-2_9_0;0.11.2 ...
[info] Done updating.
[info] Set current project to default-83bb15 (in build file:/C:/Users/akanuma/)

<<--

Play2.0インストール

  • 下記サイトから play-2.0.zip をダウンロードします。

http://www.playframework.org/

  • 任意の場所で解凍してパスを通し、playコマンドでインストールします。

sh>>
C:\Users\akanuma>play
Getting net.java.dev.jna jna 3.2.3 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
1 artifacts copied, 0 already retrieved (838kB/510ms)
Getting Scala 2.9.1 (for console)...
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
4 artifacts copied, 0 already retrieved (19939kB/3195ms)
Getting play console_2.9.1 2.0 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
4 artifacts copied, 0 already retrieved (1472kB/566ms)
_ _
_ __ | | __ _ _ | |
| '
| |/ ' | || ||
| /||_|__ ()
|
| |__/

play! 2.0, http://www.playframework.org

This is not a play application!

Use play new to create a new Play application in the current directory,
or go to an existing application and launch the development console using play.

You can also browse the complete documentation at http://www.playframework.org.
<<--

  • アプリケーション用の任意のディレクトリで play new コマンドでアプリケーションを作成します。ここでは play_new_sample ディレクトリで sample という名前のアプリケーションを作成します。

sh>>
C:\play_new_sample>play new sample
_ _
_ __ | | __ _ _ | |
| '
| |/ ' | || ||
| /||_|__ ()
|
| |__/

play! 2.0, http://www.playframework.org

The new application will be created in C:\play_new_sample\sample

What is the application name?

sample

Which template do you want to use for this new application?

1 - Create a simple Scala application
2 - Create a simple Java application
3 - Create an empty project

1

OK, application sample is created.

Have fun!
<<--

  • コマンドを実行したディレクトリにアプリケーション名のディレクトリが作成されますので、その中に移動して play run コマンドでアプリケーションを起動します。

sh>>
C:\play_new_sample\sample>play run
Getting org.scala-tools.sbt sbt_2.9.1 0.11.2 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
37 artifacts copied, 0 already retrieved (7324kB/3942ms)
[info] Loading project definition from C:\play_new_sample\sample\project
[info] Set current project to sample (in build file:/C:/play_new_sample/sample/)

[info] Updating {file:/C:/play_new_sample/sample/}sample...
[info] Done updating.
--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on port 9000...

(Server started, use Ctrl+D to stop and go back to the console...)

<<--

  • ブラウザでlocalhostの9000番ポートにアクセスして起動を確認します。

play.jpg

  • local に scala を直接インストールしていないせいか、sbt の run コマンドだとアクセス時に 「scala.tools.nsc.MissingRequirementError: object scala not found.」 が発生しました。

  • アプリケーションをEclipseプロジェクトにするには play eclipsify コマンドを実行します。

sh>>
C:\play_new_sample\sample>play eclipsify
[info] Loading project definition from C:\play_new_sample\sample\project
[info] Set current project to sample (in build file:/C:/play_new_sample/sample/)
[info] About to create Eclipse project files for your project(s).
[info] Successfully created Eclipse project files for project(s): sample
<<--

  • EclipseでScalaの開発をするためのプラグインとして、Scala IDE for Eclipse があります。Eclipse3.6(Helios)が正式サポート対象で、3.7(Indigo)では一部動作しない機能があります。

  • Eclipse の Helpメニュー > Install New Software から下記URL(Scala 2.9.x用)を指定してプラグインをインストールします。

http://download.scala-ide.org/releases-29/stable/site

  • Scala2.8.xの場合は下記URLになります。

http://download.scala-ide.org/releases-28/stable/site

  • これでひとまずアプリケーションの作成はできましたので、必要なロジックを作りこんでいくことになります。
posted by akanuma akanuma on Sun 18 Mar 2012 at 18:21 with 0 comments

 今更ですがScalaをちゃんと勉強するために、まずは環境の準備ということでCloudCore環境にScalaをインストールしました。

JDK Install

  • まずはJavaの環境が必要なので、JDKのrpmパッケージをダウンロード。

sh>>

wget http://download.oracle.com/otn-pub/java/jdk/7u2-b13/jdk-7u2-linux-x64.rpm

--2012-01-22 22:41:18-- http://download.oracle.com/otn-pub/java/jdk/7u2-b13/jdk-7u2-linux-x64.rpm
download.oracle.com をDNSに問いあわせています... 118.155.230.51, 118.155.230.26
download.oracle.com|118.155.230.51|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 67641623 (65M) [application/x-redhat-package-manager]
`jdk-7u2-linux-x64.rpm' に保存中

100%[======================================================================================================================>] 67,641,623 1.78M/s 時間 28s

2012-01-22 22:41:47 (2.30 MB/s) - `jdk-7u2-linux-x64.rpm' へ保存完了 [67641623/67641623]
<<--

  • rpmコマンドでインストール

sh>>

rpm -ivh jdk-7u2-linux-x64.rpm

準備中... ########################################### [100%]
1:jdk ########################################### [100%]
Unpacking JAR files...
rt.jar...
jsse.jar...
charsets.jar...
tools.jar...
localedata.jar...

which java

/usr/bin/java

java -version

java version "1.7.0_02"
Java(TM) SE Runtime Environment (build 1.7.0_02-b13)
Java HotSpot(TM) 64-Bit Server VM (build 22.0-b10, mixed mode)
<<--

Scala Runtime インストール

  • まずはRuntimeをダウンロード

sh>>
$ wget http://www.scala-lang.org/downloads/distrib/files/scala-2.9.1.final.tgz
--2012-01-22 22:47:37-- http://www.scala-lang.org/downloads/distrib/files/scala-2.9.1.final.tgz
www.scala-lang.org をDNSに問いあわせています... 128.178.154.159
www.scala-lang.org|128.178.154.159|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 24993458 (24M) [application/x-gzip]
`scala-2.9.1.final.tgz' に保存中

100%[======================================================================================================================>] 24,993,458 4.10M/s 時間 10s

2012-01-22 22:47:49 (2.33 MB/s) - `scala-2.9.1.final.tgz' へ保存完了 [24993458/24993458]
<<--

  • ダウンロードしたRuntimeを解凍して移動

sh>>
$ tar zxvf scala-2.9.1.final.tgz
scala-2.9.1.final/
~~~中略~~~
scala-2.9.1.final/meta/available
$
$ mv scala-2.9.1.final ../
$
<<--

  • 環境変数SCALA_HOMEを設定してPATHを通します。

sh>>
$ cat .bashrc

.bashrc

Source global definitions

if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

User specific aliases and functions

export SCALA_HOME=/home/akanuma/scala-2.9.1.final
export PATH=$PATH:$SCALA_HOME/bin
<<--

  • Runtimeの動作を確認します。

sh>>
$ scala
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_02).
Type in expressions to have them evaluated.
Type :help for more information.

scala>
<<--

posted by akanuma akanuma on Sun 22 Jan 2012 at 23:10 with 0 comments

ScalaのWebフレームワークである Lift frameworkのオンラインbook

後半はまだ書きかけな感じ。

ドイツ語の書籍もあるっぽい。

posted by genki genki on Thu 31 Mar 2011 at 10:12 with 0 comments

通常AkkaのActorインスタンスは

scala>>
akka.actor.Actor.actorOf[Foo]
<<--

という感じにActorRef経由で生成しますが、
Actorクラスのコンストラクタ引数を使って初期化したい場合には、以下のように、直接newで生成したインスタンスを渡せばok。

scala>>
akka.actor.Actor.actorOf(new Foo(arg))
<<--

posted by genki genki on Mon 21 Mar 2011 at 06:15 with 0 comments

Scalaで配列から多重代入する方法のメモ

scala>>
val Array(host, port) = "localhost:1234".split(":")
println(host) //=> localhost
println(port) //=> 1234
<<--

List, Tuppleからも同様にできるっぽい。

Tuppleのケースに付いては、

See Also

posted by genki genki on Thu 10 Mar 2011 at 16:13 with 0 comments

軽量言語(LL) と呼ばれる言語は増えてきていますが、
言語の軽量性を担保しているものは、コンパイルするかしないかや、
ましてや静的型付けかどうか等は関係なくて、
RubygemsやCPANなどのパブリックな(誰でもpublishできる)パッケージリポジトリの存在なのではないかと思う次第です。

ということで、Scalaについてその辺を考えてみると、
sbazというパッケージマネージャがあるのですが、
sbazの公式リポジトリはクローズドなので、
だれでもパッケージを共有することはできない感じです。
今日現在、sbaz available が返すパッケージの種類は58しかありません。
なんて小さな世界!

posted by genki genki on Thu 10 Mar 2011 at 11:09 with 0 comments

ScalaのCLIな開発環境 sbt を使ってjava -jarでstandalone実行可能な
jarファイルを作る方法をメモしておきます。

sbtにはプラグイン機構が備わっていて、今回は
sbtプラグインのproguardというのを利用します。
sbtプラグインは、以下のファイルを記述することで導入可能です。

project/plugins/Plugins.scala

scala>>
import sbt._
class Plugins(info: ProjectInfo)
extends PluginDefinition(info)
{
val proguard = "org.scala-tools.sbt" % "sbt-proguard-plugin" % "0.0.5"
}
<<--

ついでにProjectファイルでProguardを使うように設定します。

project/build/FooBar.scala

scala>>
import sbt._

class FooBar(info: ProjectInfo)
extends DefaultProject(info)
with ProguardProject
{
override def mainClass = Some("main.scala.FooBar")
override def proguardOptions = List(
"-keepclasseswithmembers public class * " +
"{ public static void main(java.lang.String[]); }",
proguardKeepLimitedSerializability,
proguardKeepAllScala,
"-keep interface scala.ScalaObject")
override def proguardInJars =
Path.fromFile(scalaLibraryJar) +++ super.proguardInJars
}

<<--

あとは、sbtから

pre>>
sbt> reload
sbt> update
sbt> proguard
<<--

target/scala_x.x.x/foobar_x.x.x-x.min.jar
が生成されるので、これを java -jarすれば起動できます。

posted by genki genki on Wed 9 Mar 2011 at 22:11 with 0 comments

ScalaでプロセスのIDを取得する方法をメモしておきます。

scala>>
def getPid:Int = {
val pb = new ProcessBuilder("/bin/sh", "-c", "echo $PPID")
val p = pb.start
val rd = new BufferedReader(new InputStreamReader(p.getInputStream))
return rd.readLine.toInt
}
<<--

もうちょっと簡単な方法がありそうな気がするんですけどね。

posted by genki genki on Wed 9 Mar 2011 at 17:59 with 0 comments

ext3の1ディレクトリに大量のファイルを配置すると、
ファイルアクセスが遅くなります。
一般的な回避策は、何らかのハッシュ値でディレクトリを階層的にする方法ですが、実際にやるとなると数行でできるとは言えちょっと面倒です。
そこで、これを手軽に実現できるようにライブラリに追加しました。

Pathnameと同じAPIですので、
最初はPathnameで使っておいて、
数が増えたらHashnameに変えるという使い方ができるので便利だと思います。
(マイグレーションも両者で一緒にloopするだけでOK)

ruby>>
import com.s21g.rubyist.{Pathname,Hashname}

val path = Pathname("data/users/910.xml")
val hash = Hashname("data/users/910.xml")

path.path // => "data/users/910.xml"
hash.path // => "data/users/e/2/0/e205ee2a5de471a70c1fd1b46033a75f/910.xml"

hash.write("Love Scala!")
hash.read // => "Love Scala!"
<<--

また、com.s21g.rubyistには先日の rescue の実装も入っていますので、
よかったら使ってみてください。
jar ファイルは Downloads から入手可能です。

参考

posted by maiha maiha on Wed 19 May 2010 at 03:23 with 0 comments

中置記法と暗黙変換のコンビネーションでRubyの後置rescue的なものをScalaで実装してみました。

ruby>>
class Rescueable[A](a: => A) {
def rescue[B](b: => B) = try{a}catch{case _ => b}
}

implicit def anyToRescueable[A](a: => A) = new Rescueable(a)

println("12341234".toLong rescue 0) // => 12341234
println("1234x1234".toLong rescue 0) // => 0
<<--

call-by-nameがポイントです。

Update

bがcall-by-nameになっていなかったので修正しました。

posted by genki genki on Tue 11 May 2010 at 11:03 with 0 comments

RubyistがScalaを簡単に把握できるように、
Google Spreadsheet で対応表をつくってみようかと思いました。

気が向いたら項目を追加していきます。

だれでも編集できる状態なので、加筆修正welcomeです :)

See Also

posted by genki genki on Fri 7 May 2010 at 21:09 with 0 comments

ざっと調べてみた感じでは

posted by genki genki on Mon 3 May 2010 at 09:58 with 4 comments

Scalaを使って関数のASTにアクセスするには、以下のようにすればいいらしい。

pre>>
scala> def f = print("hello")
f: Unit

scala> scala.reflect.Code.lift(f).tree
res3: scala.reflect.Tree = Select(Select(Select(Ident(Field(line4$object,PrefixedType(ThisType(RootSymbol),Class(line4$object)))),Field($iw,PrefixedType(ThisType(Class(line4$object)),Class($iw)))),Field($iw,PrefixedType(ThisType(Class($iw)),Class($iw)))),Method(f,PolyType(List(),List(),PrefixedType(ThisType(Class(scala)),Class(scala.Unit)))))
<<--

posted by genki genki on Wed 28 Apr 2010 at 06:54 with 0 comments

最近、こういう理由で(?)Scalaがアツイと僕の周りの人が騒いでいたので僕もその流れに乗ってみました。

周りがMacばっかりなので、Gentooにインストールしてみたいと思います。

Scalaをインストール

まず、このような操作をしてみました。
textile>>

emerge scala -pv

These are the packages that would be merged, in order:

Calculating dependencies... done!

!!! All ebuilds that could satisfy "dev-lang/scala" have been masked.
!!! One of the following masked packages is required to complete your request:

  • dev-lang/scala-2.7.5 (masked by: ~x86 keyword)
  • dev-lang/scala-2.7.4-r1 (masked by: ~x86 keyword)
  • dev-lang/scala-2.7.4 (masked by: ~x86 keyword)
  • dev-lang/scala-2.7.3-r1 (masked by: ~x86 keyword)
  • dev-lang/scala-2.7.3 (masked by: ~x86 keyword)
  • dev-lang/scala-2.7.2 (masked by: ~x86 keyword)
    <<--

maskedパッケージでした。

なので、**ACCEPT_KEYWORDS="~x86"**とします。

textile>>

ACCEPT_KEYWORDS="~x86" emerge scala

<<--

これでOKかと思いきや、scalaのコンパイルでエラーという悲しい状況になりました。

Gentooではソースからコンパイルする以外にバイナリをインストールすることが可能なので、そちらで試してみます。

textile>>

USE="binary" ACCEPT_KEYWORDS="~x86" emerge scala

<<--

これでscalaのバイナリがインストールされます。

ScalaでHello, World!

インストールが済んだら、早速使ってみましょう。まず、インタラクティブシェルを立ち上げます。

textile>>
$ scala
Welcome to Scala version 2.7.5.r0-b20090605191508 (Java HotSpot(TM) Client VM, Java 1.6.0_13).
Type in expressions to have them evaluated.
Type :help for more information.

scala>
<<--

よくわからず、書いてみました
textile>>
scala> object HelloWorld {
| def main( arg : Array[String] ) = {
| println("Hello, World!")
| }
| }
defined module HelloWorld

scala> HelloWorld.main(null)
Hello, World!
<<--

真面目に勉強するなら、Scala By Example(英語/PDF)とかを読むと良いのかも知れません。

とりあえず、今回はこれだけで。

面白そうなのは、ScalaのコードをAndroidで動かすとかですかね。

Android携帯ほしい><

posted by y_tsuda y_tsuda on Mon 6 Jul 2009 at 07:22 with 0 comments