More Related Content
Similar to Scalaでプログラムを作りました (20)
More from Tomoharu ASAMI (20)
Scalaでプログラムを作りました
- 2. ⾃自⼰己紹介
• (株)匠Lab。⽇日本Javaユーザグループ副会⻑⾧長。 edge2.cc主宰。
• 代表作
• XML SmartDoc (XML⽂文書処理システム)
• Relaxer (XML/Javaスキーマコンパイラ)
• 開発中
• SimpleModeler (Scala DSLモデルコンパイラ)
• SmartDox (⽂文書処理システム)
• g3 (サービスマッシュアップフレームワーク)
• g4 (Androidアプリケーションフレームワーク)
• 近著
• 「上流⼯工程UMLモデリング」(⽇日経BP)
• 「マインドマップではじめるモデリング講座」(翔泳社)
• 「ボクらのScala」(Softbank Creative)
- 5. Scalaで作ったプログラム
SimpleModeler https://github.com/asami/simplemodeler
モデルコンパイラ
Scalaファイル数: 789個、Scalaステップ数: 95K
SmartDox https://github.com/asami/smartdox
DSL指向⽂文書処理プロセッサ
Scalaファイル数: 31個、Scalaステップ数: 3.6K
g3 http://code.google.com/p/goldenport3/
クラウドアプリケーションフレームワーク(試作品)
Scalaファイル数: 162個、Scalaステップ数: 22K
goldenport https://github.com/asami/goldenport
内部的に使っているアプリケーションフレームワーク
Scalaファイル数: 289個、Scalaステップ数: 17K
- 7. sample.org
* 登場⼈人物
#+caption: 登場⼈人物⼀一覧
| name |!
|------|!
| 商社 |!
!
** 顧客
#+caption: 属性⼀一覧
| name | type |!
|------+--------|!
| 住所 | string |!
!
*** 種類
**** 個⼈人顧客
**** 法⼈人顧客
* 道具
** 商品
*** 属性
**** 商品名
**** 定価(long)!
*** 区分
**** 商品区分(第1類;第2類;第3類)!
* 出来事
** 購⼊入する
*** 部品
**** 顧客
**** 商品
- 8. Java
$ sm -java sample.org!
/src/main/java/model/ModelContext.java!
/src/main/java/model/ModelRepository.java!
/src/main/java/model/ModelController.java!
/src/main/java/model/ModelModel.java!
/src/main/java/model/ModelErrorModel.java!
/src/main/java/model/ModelModule.java!
/src/main/java/model/ModelFactory.java!
/src/main/java/model/ModelApplication.java!
/src/main/java/model/商社.java!
/src/main/java/model/DD商社.java!
/src/main/java/model/DVI商社Id.java!
/src/main/java/model/商品.java!
/src/main/java/model/DD商品.java!
/src/main/java/model/DP商品区分.java!
/src/main/java/model/DVI商品Id.java!
/src/main/java/model/法⼈人顧客.java!
/src/main/java/model/DD法⼈人顧客.java!
/src/main/java/model/顧客.java!
/src/main/java/model/DD顧客.java!
/src/main/java/model/DVI顧客Id.java!
/src/main/java/model/購⼊入する.java!
/src/main/java/model/DD購⼊入する.java!
/src/main/java/model/DVI購⼊入するId.java!
/src/main/java/model/個⼈人顧客.java!
/src/main/java/model/DD個⼈人顧客.java!
- 9. Ext-JS & Play
$ sm -extjs sample.org! /public/app/model!
/public/app/model/商社.js!
/public/app/controller!
/public/app/model/商品.js!
/public/app/controller/AppController.js!
/public/app/model/法⼈人顧客.js!
/public/app/controller/商社Controller.js!
/public/app/model/顧客.js!
/public/app/controller/商品Controller.js!
/public/app/model/購⼊入する.js!
/public/app/controller/法⼈人顧客
/public/app/model/個⼈人顧客.js!
Controller.js!
/public/app/store!
/public/app/controller/顧客Controller.js!
/public/app/store/商社Store.js!
/public/app/controller/購⼊入する
/public/app/store/商品Store.js!
Controller.js!
/public/app/store/法⼈人顧客Store.js!
/public/app/controller/個⼈人顧客
/public/app/store/顧客Store.js!
Controller.js!
/public/app/store/購⼊入するStore.js!
/public/app/view!
/public/app/store/個⼈人顧客Store.js!
/public/app/view/AppView.js!
/conf!
/public/app/view/Viewport.js!
/conf/evolutions!
/public/app/view/商社Grid.js!
/conf/evolutions/default!
/public/app/view/商社ViewForm.js!
/conf/evolutions/default/1.sql.sm!
/public/app/view/商社EditForm.js!
/public/app/view/商品Grid.js!
/public/app/view/商品ViewForm.js!
/public/app/view/商品EditForm.js!
/public/app/view/法⼈人顧客Grid.js!
/public/app/view/法⼈人顧客ViewForm.js!
/public/app/view/法⼈人顧客EditForm.js!
/public/app/view/顧客Grid.js!
/public/app/view/顧客ViewForm.js!
/public/app/view/顧客EditForm.js!
/public/app/view/購⼊入するGrid.js!
/public/app/view/購⼊入するViewForm.js!
/public/app/view/購⼊入するEditForm.js!
/public/app/view/個⼈人顧客Grid.js!
/public/app/view/個⼈人顧客ViewForm.js!
/public/app/view/個⼈人顧客EditForm.js!
- 10. Scala Tips
• ブログ:Modegramming Style
• http://modegramming.blogspot.jp/
• Modeling + Programming = Modegramming
• DSL駆動開発
• Scala Tips
• Scalaプログラミングのイディオムを整備するのが⽬目的。
• Option編、Either編が終わってValidation編が終わりつつあ
るところ。
- 11. 浅海の関数型体験
• 卒論でLispインタープリタを作成。
• OS開発の仕事をしている時に、カーネルのパニックダンプを解析するツールを
Lispで開発。実⾏行行環境のLispインタープリタは⾃自作。
• ⼀一時期Emacs-Lispに凝っていた。
• Lispを使った⼿手続き型プログラミング。
• Lisp流のリスト処理は便利。
• プログラムが⼤大きくなってくると静的型付けでないと⾟辛くなってくるのでだんだん
疎遠に。
• Javaが出てきてからLispを触ることはなくなった。
• 性能、メモリを意識していた時代。
• 1995年からはJava⼀一筋。関数型とは全く疎遠に。
• 20年近くの関数型の進化の情報が全く⽋欠落している状態。
• 2008年の夏にScalaを始める。DSLが主の⽬目的。
• 2011年の夏にあった『クラウド温泉2.0@⼩小樽』の関連企画『数学勉強会@札幌
百回記念特別勉強会「プログラマのための圏論の基礎」圏論勉強会』をきっかけに
関数型に⽬目覚める。
• 今年もあると思います!
• 2011年秋にScalazを調べ始める。
• 只今修⾏行行中。道半ばです。
- 13. プログラミング⾔言語の選択
• プログラミング⾔言語に求める物
• 静的型付け
• Java VM
• OOP
• Scalaを選んだ理由
• DSL
• Better Java
• 並列プログラミング
• 関数型
• Scalazを選んだ理由
• Promise
• 並⾏行行プログラミング
• 「Beyond Mere Actors」
• https://docs.google.com/present/view?
id=ddmk3f43_63zpg3jcgz
- 14. アプリケーションの階層と役割
アプリケー • DSLの作法に従ってビジネスロ
ジックを記述
ション • OO、関数型のスキルは最低限
• フレームワークを簡単に使⽤用する
DSL ための専⽤用⾔言語
• OO、関数型の⾼高度なスキル
フレーム • ドメインの共通処理を記述
ワーク • OO、関数型の⾼高度なスキル
- 18. OFP新三種の神器
トレイト (trait)
• mix-in
• 型安全のAOP的な運⽤用
モナド (monad)
• 計算⽂文脈をカプセル化する新しい⾔言語概念
• Monadicプログラミング
型クラス (type class)
• 型安全のダブルディスパッチ(?)
• Scalaでは、⽂文脈、主体、客体の組でメソッドを選択
- 19. コーディング⽐比較
Java⾵風
def validate(name: String, age: Int): ValidationNEL[Throwable, (String,
Int)] = {!
val a = validateName(name) !
val b = validateAge(age) !
if (a.isSuccess && b.isSuccess) { !
val a1 = a.asInstanceOf[Success[NonEmptyList[Throwable], String]].a !
val b1 = b.asInstanceOf[Success[NonEmptyList[Throwable], Int]].a !
Success((a1, b1)) !
} else if (a.isSuccess) { !
b.asInstanceOf[Failure[NonEmptyList[Throwable], (String, Int)]] !
} else if (b.isSuccess) { !
a.asInstanceOf[Failure[NonEmptyList[Throwable], (String, Int)]] !
} else { !
val a1 = a.asInstanceOf[Failure[NonEmptyList[Throwable], String]].e !
val b1 = b.asInstanceOf[Failure[NonEmptyList[Throwable], Int]].e !
Failure(a1 |+| b1) !
} !
}!
- 20. Scala (関数型プログラミング)
def validate(name: String, age: Int):
ValidationNEL[Throwable, (String, Int)] = { !
validateName(name) match { !
case Success(a) => validateAge(age) match { !
case Success(b) => Success((a, b)) !
case Failure(e) => Failure(e) !
} !
case Failure(e1) => validateAge(age) match { !
case Success(b) => Failure(e1) !
case Failure(e2) => Failure(e1 |+| e2) !
} !
} !
} !
Scalaz (Monadicプログラミング)
def validate(name: String, age: Int):
ValidationNEL[Throwable, (String, Int)] = { !
(validateName(name) ⊛ validateAge(age))((_, _)) !
}!
URL: http://modegramming.blogspot.jp/2012/04/
scala-tips-validation-10-applicative.html
- 21. SparkとScalding
val file = spark.textFile("hdfs://...")
file.flatMap(line => line.split(" ")) Spark
.map(word => (word, 1)) • http://www.spark-project.org/
.reduceByKey(_ + _) • Lightning-Fast Cluster Computing
• Apache Mesos
class WordCountJob(args : Args) extends Job(args) {
TextLine( args("input") ).read.
flatMap('line -> 'word) { line : String => line.split("s+") }.
groupBy('word) { _.size }.
write( Tsv( args("output") ) )
}
Scalding
• https://github.com/twitter/scalding
• CascadingのScala DSL
• Collection APIでHadoop演算
- 22. Enterprise Integration
Patterns (EIP)
Apache Camel Enterprise Integration Patterns
• http://camel.apache.org/enterprise-integration-
patterns.html
RouteBuilder builder = new RouteBuilder() {
public void configure() {
errorHandler(deadLetterChannel("mock:error"));
from("seda:a")
.choice()
.when(header("foo").isEqualTo("bar"))
.to("seda:b")
.when(header("foo").isEqualTo("cheese"))
.to("seda:c")
.otherwise()
.to("seda:d");
}
};
- 23. 代数的構造デザインパターン
結合律 (associative law)
• 半群 (semigroup)
• モノイド (monoid) (a + b) + c = a + (b + c)
• 群 (group)
可換律 (commutative law)
• 可換半群
• 可換モノイド a+b=b+a
• 可換群(アーベル群)
分配律 (distributive law)
• 環 (ring)
• 体 (field) a * (b + c) = a * b + a * c
- 24. 圏論デザインパターン
圏 (category)
モナド • Hask圏 (Scala圏?)
(monad) • クライスリ圏
(kleisli category)
Applicative 射 (arrow,
functor morphism)
関⼿手
(functor)
- 25. Scalaへのアプローチ
最初はBetter Java。
• 便利なDSL利⽤用+Better Javaで⽌止めてしまってもよい。
map系、fold系のList処理を導⼊入。
• 関数型肩慣らし。
Option, Eitherの導⼊入。
• 関数型肩慣らし。mapやfoldを活⽤用。
flatMap系の演算を導⼊入。
• Monadicプログラミング肩慣らし。
Scalaz導⼊入。
• 本格的関数型プログラミング。
• 型クラス、代数的データ型、永続データ構造。