これまでのscala これからのscala (20100904 scala座#01 )
Post on 11-Jul-2015
4.053 Views
Preview:
TRANSCRIPT
これまでのScala
これからのScala
12010/09/04Scala座 #01
2010年9月4日土曜日
ID:yuroyoroゆろよろ
2
自己紹介
2010年9月4日土曜日
Scalaの普及活動してまう
•CodeZineで記事書いたり
•Scala発火村やったり
•本も書いてるとこで。
3
2010年9月4日土曜日
今日のおはなし
•これまで編✓ Scalaって?
✓ Scala Way✓ 事例的なアレ
•これから編✓ 2.8についてkwsk
✓ Beyond 2.8
4
2010年9月4日土曜日
これまで編
5
2010年9月4日土曜日
Scalaって?
2010年9月4日土曜日
JVM上で動作する、
オブジェクト指向 + 関数型の
静的型付けである、
ハイブリッド言語
by Maartin Odersky
2010年9月4日土曜日
オブジェクト指向
+
関数型
な
ハイブリッド言語
8
2010年9月4日土曜日
「大事なことなので
2回言いました」
9
2010年9月4日土曜日
クラスファイルを生成して
JVMで動作する
JVMscalaのソースをコンパイルするとclassファイルが生成される
コンパイル
.scala.scala
.scala.class
war
.scala.class
scalaLibrary.jar
2010年9月4日土曜日
「Javaとどう違うのん?」
2010年9月4日土曜日
Less typingを目指した言語仕様
2010年9月4日土曜日
型推論
scala> val list = List("foo","bar","baz")list: List[java.lang.String] = List(foo, bar, baz)
2010年9月4日土曜日
ファーストクラス関数と
クロージャ
scala> list map{ s => s * 2 }
res6: List[String] = List(foofoo, barbar, bazbaz)
2010年9月4日土曜日
パターンマッチ
scala> list.headOption match{ ¦ case Some( s ) => s * 2 ¦ case None => "" ¦ }res9: String = foofoo
2010年9月4日土曜日
traitによるMix-in
scala> case class Person(name:String,age:Int) extends ¦ Ordered[Person]{ ¦ def compare(that:Person) = ¦ if(name.compare(that.name) == 0) ¦ age.compare(that.age) ¦ else name.compare(that.name)defined class Person
scala> Person("ozaki",18) > Person("ozaki",20)res4: Boolean = false
2010年9月4日土曜日
Read-Eval-Print Loop
対話型評価環境
17
2010年9月4日土曜日
すぐに動作確認できる
18
2010年9月4日土曜日
REPL
2010年9月4日土曜日
すぐに動作確認できる
20
2010年9月4日土曜日
「大事なことなので(ry」
21
2010年9月4日土曜日
テスト書く → REPLで確認
↓
コード書く
↑
テストする ←
↓
「サイクルがLL」
2010年9月4日土曜日
Specs
"A full stack"->-(fullStack) should {
behave like "A non-empty stack below full capacity"
"throw an exception when sent #push" in {
stack.push(11) must throwAn[Error]
}
}
2010年9月4日土曜日
TDDと黄金の回転
24by @t_wada2010年9月4日土曜日
「ScalaはLLですからっ!!(キリッ」
2010年9月4日土曜日
Scalaのコードはこんな感じ
2010年9月4日土曜日
27
Hashtag検索import scala.xml._
import scala.io.Source
object HashTagSearch {
def main( args:Array[String] ){ val url =
"http://search.twitter.com/search.atom?q=%s".format( args.head )
XML.load( new java.net.URL( url ) ) \\ "entry" map{ e =>
"%s:%s" format( e \\ "author" \\ "name" text , e \\ "content" text)
} foreach{ println }
}
}2010年9月4日土曜日
28
OneLinerにしてみた
scala.xml.XML.load(new java.net.URL
("http://search.twitter.com/
search.atom?q=scalaza01")) \\ "entry"
map{e => "%s:%s" format(e \\ "author"
\\ "name" text,e \\ "content" text)}
foreach{ println }
2010年9月4日土曜日
Scala Way
2010年9月4日土曜日
関数型的にも
手続き的にも
30
2010年9月4日土曜日
valとvar
31
2010年9月4日土曜日
immutableとmutable
32
2010年9月4日土曜日
高階関数とfor/while
33
2010年9月4日土曜日
パターンマッチとif/else
34
2010年9月4日土曜日
Optionとnull
35
2010年9月4日土曜日
手続き型から
関数型へ
36
2010年9月4日土曜日
ケーススタディ01
Charの出現回数の
カウント
37
2010年9月4日土曜日
手続き型的に書いてみると
def countChar(s:String,c:Char) = { var cnt = 0 for( x <- s ){ if( x == c ) cnt = cnt + 1 } cnt}
2010年9月4日土曜日
「すごく…ダサいです…。」
39
2010年9月4日土曜日
関数型では…
40
2010年9月4日土曜日
入出力をリストで
考える
41
2010年9月4日土曜日
コレクションのfor
と
ローカル変数のvar
42
2010年9月4日土曜日
高階関数に
変換可能
43
2010年9月4日土曜日
関数型的に書いてみると
def countChar(s:String,c:Char) = s filter{ c == } size
2010年9月4日土曜日
45
•入力 = Charのリスト
•出力 = リストのうち、charに該当するものを抽出したリストのサイズ
2010年9月4日土曜日
「すごく…短いです…。」
46
2010年9月4日土曜日
ケーススタディ02
簡易cat
47
2010年9月4日土曜日
手続き型的に書いてみると
def cat(name:String) = {
val f = new JFile(name)
if(f.exists && f.isFile)
Source.fromFile(f).mkString
else
"No such file : %s" format(name)
}
2010年9月4日土曜日
関数型とオブジェクト指向の
エッセンスを
49
2010年9月4日土曜日
ケースクラス
Option
パターンマッチ
50
2010年9月4日土曜日
ケースクラスの導入
abstract class Path
case class File(name:String,file:JFile) extends Path
case class Dir(name:String,file:JFile) extends Path
2010年9月4日土曜日
Optionの導入
def file(name:String) = new JFile(name) match {
case f if f.exists && f.isFile => Some(File(name,f))
case f if f.exists && f.isDirectory => Some(Dir(name,f))
case _ => None
}
2010年9月4日土曜日
パターンマッチにしてみる
def cat(name:String) = path(name) collect {
case File(name,f) => Source.fromFile(f).mkString
case Dir(name,f) => "%s is directory" format(name)
} getOrElse("No such file : %s" format(name))
2010年9月4日土曜日
「長くなってね?」
54
2010年9月4日土曜日
WARNING:
仕様変更発生
55
2010年9月4日土曜日
「行番号つけて♥」
56
2010年9月4日土曜日
「grepも作って♥」
57
2010年9月4日土曜日
ケーススタディ03
簡易grep
58
2010年9月4日土曜日
手続き型的に書いてみると
def grep(name:String,pattern:String) =
“もうマンドクセ”
2010年9月4日土曜日
traitを導入
60
2010年9月4日土曜日
テキストを持つtraittrait Text {
val content:String
val name:String
def formatLine( n:Int,s:String) =
"%s:%3d:%s" format (name, n+1, s)
def withLineNumber = content.lines.zipWithIndex
def formatWithLineNumber =
withLineNumber.map{ case (s,n) => formatLine(n,s)}
}
2010年9月4日土曜日
行番号付きでcatするtrait
trait Cat extends Text{
def cat = formatWithLineNumber foreach{ println }
}
2010年9月4日土曜日
grepするtrait
trait Grep extends Text {
def grep(pattern:String) = {
val r = pattern.r
withLineNumber collect{
case (s,n) if r.findAllIn(s).nonEmpty =>
formatLine(n,s)
} foreach{ println }
}
}
2010年9月4日土曜日
traitをケースクラスにabstract class Path {
def cat:Unit
def grep(pattern:String):Unit
}
case class File(name:String,file:JFile) extends Path with Cat with Grep{
val content = Source.fromFile(file).mkString
}
case class Dir(name:String,file:JFile) extends Path {
def cat = file.list.foreach{ println } def grep(pattern:String) = file.list.map{ s => path(name+“/”+s) }.
toSeq.flatten.foreach{ f => f.grep(pattern) }
}
2010年9月4日土曜日
WARNING:
仕様変更発生
65
2010年9月4日土曜日
「URLからcat/grepしたい♥」
66
2010年9月4日土曜日
ケースクラスを追加でおk
case class URL(name:String) extends
Path with Cat with Grep{
val content =
Source.fromURL(new java.net.URL(name)).mkString
}
2010年9月4日土曜日
ケーススタディ04
untilを作ってみる
68
2010年9月4日土曜日
def until( p: => Boolean)(f: => Unit) = while( !p ) f
p : 条件
f : 繰り返す処理
2010年9月4日土曜日
制御構文のように見えるscala> var cnt = 0
cnt: Int = 0
scala> until(cnt > 5 ){ println(cnt);cnt = cnt + 1 }
0
1
2
3
4
5
2010年9月4日土曜日
ケーススタディ05
#librahack
71
2010年9月4日土曜日
import com.yuroyoro.util.net._
object LibraHack {
def crawl( keyword:Sting) = {
val qs = "hidKensakuF=1&Page=1&lang=jpn&sel1=1&key1=%s&sel2=2&key2=&sel3=3&key3=&sel4=4&key4=&andor=0&SortKubun=1&isbn=&bookz=1&taiz=1&year-from=&year-to=&GengoKubun=no" format( encodeURL(keyword) )
val res = new HttpConnection( "http://www.library.okazaki.aichi.jp/tosho/asp/Book_Kensaku_g.asp").
method(HttpPost).
param( "Accept" -> "application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, image/png, */*;q=0.5").
param( "User-Agent" -> "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; ja-jp) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8").
param( "Content-Length" -> qs.length.toString ).
body( qs ).
asSource
}
}
2010年9月4日土曜日
タイーホされるので
ここまでです
73
2010年9月4日土曜日
事例的なアレ
2010年9月4日土曜日
「どこかつかってんの?」
2010年9月4日土曜日
‣Twitter‣FourSquare‣LinkedIn‣Novel Pulse‣Électricité de France Trading
‣Xebia‣XMPie(Xerox)‣Sony Pictures Imageworks
‣Siemens‣GridGain‣AppJet‣Reaktor‣Triental‣Sygneca‣HD Holdings‣SAIC Mimesis Republic
‣WattsOn
2010年9月4日土曜日
2010年9月4日土曜日
みんな大好きついったーもScalaで動いてます
2010年9月4日土曜日
ついったーのバックエンドはScalaがいっぱい
2010年9月4日土曜日
Kestrel memcacheを話す分散メッセージキュー
Gizzard 分散DBのためのsharding framework
2010年9月4日土曜日
Twitter Streaming API Architecture http://www.slideshare.net/jkalucki/chirp-2010streamingapiarchpost
Streaming APIのbackend
2010年9月4日土曜日
2010年9月4日土曜日
2010年9月4日土曜日
84
2010年9月4日土曜日
Lift Web Framework
2010年9月4日土曜日
‣ フルスタック
‣ ajax/cometサポート
‣ view firstなアプローチ
2010年9月4日土曜日
PHPからScala/Liftへ3ヶ月で移行
2010年9月4日土曜日
CodeZineに記事書いたのでそちらを
2010年9月4日土曜日
これから編
89
2010年9月4日土曜日
2.8についてkwsk
2010年9月4日土曜日
2010/07/15Scala 2.8.0 final正式リリース
2010年9月4日土曜日
‣package object
‣名前付き/デフォルトパラメータ
‣コレクションライブラリ再設計
‣@specializeによる最適化
2010年9月4日土曜日
‣限定継続サポート
‣末尾再帰最適化
‣break/continue‣ScalaSwingをblushup
‣REPLが便利に
‣implicitの解決を最適化
‣XML,Actorに機能追加
…etc
2010年9月4日土曜日
名前付き/デフォルトパラメータ
scala> def foo( s:String = "hoge" , n:Int = 1 ) =
¦ println("%s:%2d" format(s,n))
foo: (s: String,n: Int)Unit
scala> foo()
hoge: 1
scala> foo("aaa")
aaa: 1
scala> foo(n = 3 )
hoge: 3
scala> foo(n = 5 , s = "bar")
bar: 5
引数省略
第2引数省略
名前付きで呼び出し
2010年9月4日土曜日
scala> case class 彼女(firstName:String,lastName:String,age:Int)
defined class 彼女
scala> val nene = 彼女(" 姉ヶ崎","寧々",18)
nene: 彼女 = 彼女(姉ヶ崎,寧々,18)
scala> val 俺の嫁 = nene.copy( firstName = "尾崎")
俺の嫁: 彼女 = 彼女(尾崎,寧々,18)
ケースクラスのcopy (2.8で追加)
2010年9月4日土曜日
コレクションライブラリ再設計
✓ほとんどのAPIがtraitに✓Traversable,Iterable
✓mapなどが元の型を保持するようになった
✓collect/scanLeftなど便利なAPIが追加された
2010年9月4日土曜日
scala> Map("a" -> 1, "b" -> 2 ,"c" -> 3).map{ case (k,v) => (k*2,v*2) }
res1: Iterable[(String, Int)] = ArrayBuffer((aa,2), (bb,4), (cc,6))
2.7まで
scala> Map("a" -> 1, "b" -> 2 ,"c" -> 3).map{ case (k,v) => (k*2,v*2) }
res12: scala.collection.immutable.Map[String,Int] = Map((aa,2), (bb,4), (cc,6))
2.8
2010年9月4日土曜日
scala> val l = Seq("foo","bar","baz")
l: Seq[java.lang.String] = List(foo, bar, baz)
scala> l collect{ case s if s.startsWith("b") => s * 2 }
res14: Seq[String] = List(barbar, bazbaz)
TraversableLike#collect[B](pf: PartialFunction[A, B]): Seq[B]
PartialFunctionを利用してfilterとmapをまとめて行うようなもの
2010年9月4日土曜日
scala> l.scanLeft("hoge"){ (b,a) => "%s:%s" format (a,b) }
res31: Seq[java.lang.String] = List(hoge, foo:hoge, bar:foo:hoge, baz:bar:foo:hoge)
scala> (1 to 10).scanLeft(0){ (b,a) => b + a }
res36: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55)
TraversableLike#scanLeft[B, That](z: B)(op: (B, A) => B)(implicit bf: CanBuildFrom[Seq[A], B, That]): That
foldLeftのようにそれまでの計算結果をもとにリストを生成する
イメージ的にfoldLeft + map
2010年9月4日土曜日
Package object
✓packageにメソッドや変数を定義できる
✓package毎にPreDefを定義できる
✓package objectの定義はpackage内部のどこからでも参照できる
✓Pythonの__init__.pyに近い?
2010年9月4日土曜日
package com.yuroyoro.util
package object net {
type URL = java.net.URL
type HttpConnection =
java.net.HttpURLConnection
def queryStrings[A,B]( params:(A,B) *) =
params.map{ case ( k, v ) =>
"%s=%s" format(k,v) }.toList.mkString("&")
}
2010年9月4日土曜日
scala> import com.yuroyoro.util.net._
import com.yuroyoro.util.net._
scala> queryStrings( "foo" -> "hoge","bar" -> "fuga")
res0: String = foo=hoge&bar=fuga
2010年9月4日土曜日
@specializeによる最適化
✓プリミティブ型に対するboxing/unboxingを回避
✓@specializeが付与されたパラメータは、プリミティブ型をとるメソッド等がオーバーライドされて生成される
2010年9月4日土曜日
class Cell[@specialized(Int) A](var v:A ){
def apply:A = v
def update(x:A) = v = x
}
2010年9月4日土曜日
public class Cell extends java.lang.Object implements scala.ScalaObject{
public java.lang.Object v;
public java.lang.Object v();
public void v_$eq(java.lang.Object);
public java.lang.Object apply();
public void update(java.lang.Object);
public int v$mcI$sp();
public void v$mcI$sp_$eq(int);
public int apply$mcI$sp();
public void update$mcI$sp(int);
public boolean specInstance$();
public Cell(java.lang.Object);
}
int専用の定義が生成されてる
2010年9月4日土曜日
Beyond 2.8
2010年9月4日土曜日
2010/9 - 2010/10Scala 2.8.1
小規模なBugfix
2010年9月4日土曜日
GitHub
mirrorができましたhttp://github.com/scala/
scala
2010年9月4日土曜日
2010/12 - 2011/1Scala 2.9
2010年9月4日土曜日
Parallel collection
2010年9月4日土曜日
‣並列処理可能なcollection
‣2.8のcollection APIと互換
‣従来のcollectionは1コアしか
使わない
‣Parallel collectionはコア数で
スケール
‣nightly buildには入ってる
2010年9月4日土曜日
http://www.scala-lang.org/node/7285
2010年9月4日土曜日
Scala 3.0
2010年9月4日土曜日
mdd support
2010年9月4日土曜日
すいません
2010年9月4日土曜日
Scala 3.0 could include: unification of tuples + function args, better
type inference, union types
Virtual classes still on the "research" roadmap, but has no owner
Multimethods: definitely a research project. Unlikely to happen, unless someone implements it and nothing breaks.
@jorgescala
2010年9月4日土曜日
Virtual Class ?MultiMethods ?
2010年9月4日土曜日
よくわかんないので誰か教えてください
2010年9月4日土曜日
- A.D 2010
時代はマルチコアコア数を使い切らないアプリケーションは
パフォーマンスが頭打ちになる
2010年9月4日土曜日
そこで並行プログラミング
Message Passing = Actor
そしてParallel collection
2010年9月4日土曜日
Scalaは
マルチコア時代を見据えて進化していく…
2010年9月4日土曜日
まとめ
2010年9月4日土曜日
型安全で
2010年9月4日土曜日
LLのようにさくさくと
2010年9月4日土曜日
オブジェクト指向で
2010年9月4日土曜日
関数型で
2010年9月4日土曜日
マルチコア時代に適応した
2010年9月4日土曜日
簡潔に書ける言語
2010年9月4日土曜日
それがScala
2010年9月4日土曜日
ご清聴ありがとうございました!
2010年9月4日土曜日
top related