SlideShare una empresa de Scribd logo
1 de 31
Descargar para leer sin conexión
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

Más contenido relacionado

Similar a Scalaを触ってみた

Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
Miki Shimogai
 

Similar a 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の始めかた
 

Más de 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
 

Último

Último (7)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

Scalaを触ってみた