Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
SCALA触ってみた
SCALA
http://www.scala-lang.org/
http://www.scala-lang.org/
http://zeroturnaround.com/rebellabs/java-tools-and-technologies-
landscape-for-2014/?utm_source=hootsuite&utm_campaign=hoo...
SCALA触ってみた感想
TOC
• 作ったもの
• 使ったもの
• 使いたかったもの
• まとめ
ARCHITECT
作ったもの
ARCHITECT
作ったもの
• SVN内のEclipseプロジェクト依存関係可視化
• 指定URL配下を再帰的に探索
• .classpathファイル内に書かれた依存関係を解析
• Graphvizが食べられるDotファイルを出力
ARCHITECT
作ったもの
ARCHITECT
作ったもの
• https://github.com/kaakaa/DotDispClasspath
UTILITY
使ったもの
LIST
使ったもの
• ScalaのListは基本的には不変
(scala.collection.immutableパッケージ)
var list = List.empty[Int]
list = 1 :: list
list = list ...
PATTERN MATCH
使ったもの
• 柔軟なswitch文
instanceList foreach {
_ match {
case ClassA => println(“This is ClassA”)
case ClassB if ...
SYNTAX SUGAR
使ったもの
• 外部コマンド実行
Process(“svn list —recursive” + url) !!
• Systemプロパティ取得
sys.props(“line.separator”)
• 複数戻り値 ...
SYNTAX SUGAR
使ったもの
• 文字列 -> XML
val nodes:NodeSeq = XML loadString str
• XMLタグ取得
xml  “tagName”
• XML要素取得
xml  “@attrName”...
CLASSES
使ったもの
OBJECT
使ったもの
• シングルトンなクラス (Scalaにstaticはない)
object ProjectModelCreator {
def apply(rootUrl: String) = {
var projects = Lis...
COMPANION OBJECT
使ったもの
• クラスに従属するobject
class SampleA private (name: String)
!
object SampleA {
def apply(name: String) = ...
PACKAGE OBJECT
使ったもの
• package内から参照できるobject
package org.kaakaa.classpath.ide
!
import scala.xml.Node
!
package object ent...
INTERESTING FEATURE
使いたかったもの
•Implicit Keyword
•Parallel Collection
•Currying
IMPLICIT KEYWORD
使いたかったもの
val str:String = 10 <= エラー
implicit def intToString(num: Int): String = { num.toString }
val str...
PARALLEL COLLECTION
使いたかったもの
scala> def exec(num: Int) = {
| Thread.sleep(1000)
| println("num = " + num)
| }
exec: (num: ...
PARALLEL COLLECTION
使いたかったもの
scala> def exec(num: Int) = {
| Thread.sleep(1000)
| println("num = " + num)
| }
exec: (num: ...
PARALLEL COLLECTION
使いたかったもの
scala> def exec2(num: Int) = {
| println("num = " + num + “ start”)
| Thread.sleep(num * 1000...
CURRYING
使いたかったもの
• カリー化とは、複数のパラメータをとる関数を、
1つのパラメータをとる関数のチェーンに変換する
f: x × y -> z
g: x -> y -> z
f をカリー化した関数 g
f(x,y) = x +...
CURRYING
使いたかったもの
• カリー化と似ている(?)部分適用
def sum(a: Int, b: Int, c: Int): Int = { a + b + c }
def sumPart = sum(_:Int, 2, 3)
引...
CURRYING
使いたかったもの
• カリー化(curried)
scala> def sum(a:Int, b:Int, c:Int):Int = { a + b + c }
sum: (a: Int, b: Int, c: Int)Int...
CONCLUSION
まとめ
CONCLUSION
まとめ
• Better Java
• とりあえずCollectionとclass周りを固めていきたい
• ScalaではPattern Matchが肝な気がした
• IDEはIntelliJ IDEA使いました
• Ec...
CONCLUSION
まとめ
• Scalaで面白そうなもの
• Gitbucket
• Webフレームワーク
• Play / Scalatra / Skinny / Lift …
• Scala.js
Scalaを触ってみた
Upcoming SlideShare
Loading in …5
×

Scalaを触ってみた

627 views

Published on

Scalaを使って簡単なアプリを作ってみての感想

Published in: Technology, News & Politics
  • Be the first to comment

  • Be the first to like this

Scalaを触ってみた

  1. 1. SCALA触ってみた SCALA
  2. 2. http://www.scala-lang.org/
  3. 3. http://www.scala-lang.org/
  4. 4. http://zeroturnaround.com/rebellabs/java-tools-and-technologies- landscape-for-2014/?utm_source=hootsuite&utm_campaign=hootsuite
  5. 5. SCALA触ってみた感想
  6. 6. TOC • 作ったもの • 使ったもの • 使いたかったもの • まとめ
  7. 7. ARCHITECT 作ったもの
  8. 8. ARCHITECT 作ったもの • SVN内のEclipseプロジェクト依存関係可視化 • 指定URL配下を再帰的に探索 • .classpathファイル内に書かれた依存関係を解析 • Graphvizが食べられるDotファイルを出力
  9. 9. ARCHITECT 作ったもの
  10. 10. ARCHITECT 作ったもの • https://github.com/kaakaa/DotDispClasspath
  11. 11. UTILITY 使ったもの
  12. 12. LIST 使ったもの • ScalaのListは基本的には不変 (scala.collection.immutableパッケージ) var list = List.empty[Int] list = 1 :: list list = list :+ 1 新しいリストを生成する (先頭追加) (末尾追加) (初期化) Javaのような参照渡しによる変更を気にしなくて良い
  13. 13. PATTERN MATCH 使ったもの • 柔軟なswitch文 instanceList foreach { _ match { case ClassA => println(“This is ClassA”) case ClassB if _.hasChild() => println(“This is ClassB having ching”) case _ => println(“other class”) } } (foreach要素を受ける) (クラスでマッチング) (さらに if で条件付き) (デフォルト)
  14. 14. SYNTAX SUGAR 使ったもの • 外部コマンド実行 Process(“svn list —recursive” + url) !! • Systemプロパティ取得 sys.props(“line.separator”) • 複数戻り値 (tuple) def method(): (String, Int) = { ~ } (val str, val i) = method()
  15. 15. SYNTAX SUGAR 使ったもの • 文字列 -> XML val nodes:NodeSeq = XML loadString str • XMLタグ取得 xml “tagName” • XML要素取得 xml “@attrName” nodes foreach { _ match { case ~ } }
  16. 16. CLASSES 使ったもの
  17. 17. OBJECT 使ったもの • シングルトンなクラス (Scalaにstaticはない) object ProjectModelCreator { def apply(rootUrl: String) = { var projects = List.empty[Project] for (url <- SvnCommander.recursiveList(rootUrl)) { projects = new Project(url) :: projects } projects } } ! ProjectModelCreator(“http://localhost/svn”) <= ( ~ ) はapplyメソッドの呼出し
  18. 18. COMPANION OBJECT 使ったもの • クラスに従属するobject class SampleA private (name: String) ! object SampleA { def apply(name: String) = { new SampleA(name) } } => staticメソッドをまとめる…?
  19. 19. PACKAGE OBJECT 使ったもの • package内から参照できるobject package org.kaakaa.classpath.ide ! import scala.xml.Node ! package object entry { def getPath(entry: Node): String = { entry "@path" text } } org.kaakaa.classpath.ide .entry.ClasspathEntry 参照可能
  20. 20. INTERESTING FEATURE 使いたかったもの •Implicit Keyword •Parallel Collection •Currying
  21. 21. IMPLICIT KEYWORD 使いたかったもの val str:String = 10 <= エラー implicit def intToString(num: Int): String = { num.toString } val str:String = 10 <= 成功 • 型チェックでエラーとなる式について、式の正当性を満たす型変換 を実施するimplicitメソッドが、スコープ内で唯一つのとき成功する
  22. 22. PARALLEL COLLECTION 使いたかったもの scala> def exec(num: Int) = { | Thread.sleep(1000) | println("num = " + num) | } exec: (num: Int)Unit ! scala> def measure = { | val start = System.currentTimeMillis() | for(i <- List(1,2,3,4,5)){ exec(i) } | println((System.currentTimeMillis() - start) + "[ms]") | } measure: Unit scala> measure num = 1 num = 2 num = 3 num = 4 num = 5 5008[ms] • 普通に実行
  23. 23. PARALLEL COLLECTION 使いたかったもの scala> def exec(num: Int) = { | Thread.sleep(1000) | println("num = " + num) | } exec: (num: Int)Unit ! scala> def parallelMeasure = { | val start = System.currentTimeMillis() | for(i <- List(1,2,3,4,5).par){ exec(i) } | println((System.currentTimeMillis() - start) + "[ms]") | } measure: Unit scala> parallelMeasure num = 1 num = 4 num = 2 num = 3 num = 5 2022[ms] • 並列実行 scala> scala.collection.parallel.availableProcessors res2: Int = 4
  24. 24. PARALLEL COLLECTION 使いたかったもの scala> def exec2(num: Int) = { | println("num = " + num + “ start”) | Thread.sleep(num * 1000) | println("num = " + num + “ end”) | } exec: (num: Int)Unit ! scala> def measure2 = { | val start = System.currentTimeMillis() | for(i <- List(1,2,3,4,5).par){ exec2(i) } | println((System.currentTimeMillis() - start) + "[ms]") | } measure: Unit scala> parallelMeasure3 num = 1 start num = 3 start num = 2 start num = 4 start num = 1 end num = 2 end num = 5 start num = 3 end num = 4 end num = 5 end 7005[ms] • ? 常にコアの数だけ並行処理できるわけではない
  25. 25. CURRYING 使いたかったもの • カリー化とは、複数のパラメータをとる関数を、 1つのパラメータをとる関数のチェーンに変換する f: x × y -> z g: x -> y -> z f をカリー化した関数 g f(x,y) = x + y = z g(x) = h(y) = x + y = z g(2) = h(y) = 2 + y = z 例)
  26. 26. CURRYING 使いたかったもの • カリー化と似ている(?)部分適用 def sum(a: Int, b: Int, c: Int): Int = { a + b + c } def sumPart = sum(_:Int, 2, 3) 引数の内2つを 事前に適用 sumPart(1) => 6 http://togetter.com/li/183700 =>カリー化と部分適用の違いと誤用
  27. 27. CURRYING 使いたかったもの • カリー化(curried) scala> def sum(a:Int, b:Int, c:Int):Int = { a + b + c } sum: (a: Int, b: Int, c: Int)Int ! scala> val g = sum _ g: (Int, Int, Int) => Int = <function3> ! scala> val c = g.curried c: Int => (Int => (Int => Int)) = <function1> ! scala> c(1)(2)(3) res0: Int = 6 関数オブジェクト取得 関数定義 カリー化 カリー化関数の使用
  28. 28. CONCLUSION まとめ
  29. 29. CONCLUSION まとめ • Better Java • とりあえずCollectionとclass周りを固めていきたい • ScalaではPattern Matchが肝な気がした • IDEはIntelliJ IDEA使いました • Eclipseショートカットに設定すればそこまでアレルギー無い • 英語UIが慣れないけど…
  30. 30. CONCLUSION まとめ • Scalaで面白そうなもの • Gitbucket • Webフレームワーク • Play / Scalatra / Skinny / Lift … • Scala.js

×