SlideShare a Scribd company logo
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=hootsuite
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 :+ 1
新しいリストを生成する
(先頭追加)
(末尾追加)
(初期化)
Javaのような参照渡しによる変更を気にしなくて良い
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 で条件付き)
(デフォルト)
SYNTAX SUGAR
使ったもの
• 外部コマンド実行
Process(“svn list —recursive” + url) !!
• Systemプロパティ取得
sys.props(“line.separator”)
• 複数戻り値 (tuple)
def method(): (String, Int) = { ~ }
(val str, val i) = method()
SYNTAX SUGAR
使ったもの
• 文字列 -> XML
val nodes:NodeSeq = XML loadString str
• XMLタグ取得
xml  “tagName”
• XML要素取得
xml  “@attrName”
nodes foreach { _ match { case ~ } }
CLASSES
使ったもの
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メソッドの呼出し
COMPANION OBJECT
使ったもの
• クラスに従属するobject
class SampleA private (name: String)
!
object SampleA {
def apply(name: String) = { new SampleA(name) }
}
=> staticメソッドをまとめる…?
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
参照可能
INTERESTING FEATURE
使いたかったもの
•Implicit Keyword
•Parallel Collection
•Currying
IMPLICIT KEYWORD
使いたかったもの
val str:String = 10 <= エラー
implicit def intToString(num: Int): String = { num.toString }
val str:String = 10 <= 成功
• 型チェックでエラーとなる式について、式の正当性を満たす型変換
を実施するimplicitメソッドが、スコープ内で唯一つのとき成功する
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]
• 普通に実行
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
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]
• ?
常にコアの数だけ並行処理できるわけではない
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
例)
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
=>カリー化と部分適用の違いと誤用
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
関数オブジェクト取得
関数定義
カリー化
カリー化関数の使用
CONCLUSION
まとめ
CONCLUSION
まとめ
• Better Java
• とりあえずCollectionとclass周りを固めていきたい
• ScalaではPattern Matchが肝な気がした
• IDEはIntelliJ IDEA使いました
• Eclipseショートカットに設定すればそこまでアレルギー無い
• 英語UIが慣れないけど…
CONCLUSION
まとめ
• Scalaで面白そうなもの
• Gitbucket
• Webフレームワーク
• Play / Scalatra / Skinny / Lift …
• Scala.js

More Related Content

Similar to Scalaを触ってみた

pi-6. 繰り返し
pi-6. 繰り返しpi-6. 繰り返し
pi-6. 繰り返し
kunihikokaneko1
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)
Ryuichi ITO
 
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
Insight Technology, Inc.
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
Naoki Aoyama
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
Tomoharu ASAMI
 
Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Scala勉強会_2014_11_18
Scala勉強会_2014_11_18
Shuya Tsukamoto
 
PostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解くPostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解く
Hiroya Kabata
 
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみたAlfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Tasuku Otani
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
youku
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
 
MySQL SQL tuning
MySQL SQL tuningMySQL SQL tuning
MySQL SQL tuning
Tetsuro Nagae
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
Hadoop / Spark Conference Japan
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101
Nobuaki Oshiro
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアル
K Yamaguchi
 
Apache Auroraの始めかた
Apache Auroraの始めかたApache Auroraの始めかた
Apache Auroraの始めかた
Masahito Zembutsu
 

Similar to Scalaを触ってみた (20)

pi-6. 繰り返し
pi-6. 繰り返しpi-6. 繰り返し
pi-6. 繰り返し
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)
 
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
scala-kaigi1-sbt
scala-kaigi1-sbtscala-kaigi1-sbt
scala-kaigi1-sbt
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Scala勉強会_2014_11_18
Scala勉強会_2014_11_18
 
PostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解くPostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解く
 
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみたAlfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
MySQL SQL tuning
MySQL SQL tuningMySQL SQL tuning
MySQL SQL tuning
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアル
 
Apache Auroraの始めかた
Apache Auroraの始めかたApache Auroraの始めかた
Apache Auroraの始めかた
 

More from Nemoto Yusuke

Mattermost Plugin Bounty Programについて
Mattermost Plugin Bounty ProgramについてMattermost Plugin Bounty Programについて
Mattermost Plugin Bounty Programについて
Nemoto Yusuke
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
Nemoto Yusuke
 
Gradle handson
Gradle handsonGradle handson
Gradle handson
Nemoto Yusuke
 
ブログる
ブログるブログる
ブログる
Nemoto Yusuke
 
社内勉強会 - 書籍管理Webシステム
社内勉強会 - 書籍管理Webシステム社内勉強会 - 書籍管理Webシステム
社内勉強会 - 書籍管理Webシステム
Nemoto Yusuke
 
社内勉強会 - chef
社内勉強会 - chef社内勉強会 - chef
社内勉強会 - chef
Nemoto Yusuke
 
Sinatra slideshare
Sinatra slideshareSinatra slideshare
Sinatra slideshare
Nemoto Yusuke
 

More from Nemoto Yusuke (7)

Mattermost Plugin Bounty Programについて
Mattermost Plugin Bounty ProgramについてMattermost Plugin Bounty Programについて
Mattermost Plugin Bounty Programについて
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
 
Gradle handson
Gradle handsonGradle handson
Gradle handson
 
ブログる
ブログるブログる
ブログる
 
社内勉強会 - 書籍管理Webシステム
社内勉強会 - 書籍管理Webシステム社内勉強会 - 書籍管理Webシステム
社内勉強会 - 書籍管理Webシステム
 
社内勉強会 - chef
社内勉強会 - chef社内勉強会 - chef
社内勉強会 - chef
 
Sinatra slideshare
Sinatra slideshareSinatra slideshare
Sinatra slideshare
 

Recently uploaded

生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 

Recently uploaded (7)

生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 

Scalaを触ってみた