SlideShare a Scribd company logo
1 of 27
Download to read offline
Scalaで
プログラムを作りました
2012年4⽉月29⽇日
匠Lab
浅海智晴
⾃自⼰己紹介
•  (株)匠Lab。⽇日本Javaユーザグループ副会⻑⾧長。 edge2.cc主宰。
•  代表作
  •  XML SmartDoc (XML⽂文書処理システム)
  •  Relaxer (XML/Javaスキーマコンパイラ)
•  開発中
  •  SimpleModeler (Scala DSLモデルコンパイラ)
  •  SmartDox (⽂文書処理システム)
  •  g3 (サービスマッシュアップフレームワーク)
  •  g4 (Androidアプリケーションフレームワーク)
•  近著
  •  「上流⼯工程UMLモデリング」(⽇日経BP)
  •  「マインドマップではじめるモデリング講座」(翔泳社)
  •  「ボクらのScala」(Softbank Creative)
アジェンダ
•  Scalaを使ってます
•  Scalaの使い所
•  Scalaプログラミングの魅⼒力力
Scalaを使ってます
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
SimpleModeler
 •  DSL駆動開発×クラウド・コンピューティング
 •  ⾃自動コーディング・⾃自動DDD
sample.org
* 登場⼈人物

#+caption: 登場⼈人物⼀一覧
| name |!
|------|!
| 商社 |!
!
** 顧客

#+caption: 属性⼀一覧
| name | type   |!
|------+--------|!
| 住所 | string |!
!
*** 種類
**** 個⼈人顧客
**** 法⼈人顧客
* 道具
** 商品
*** 属性
**** 商品名
**** 定価(long)!
*** 区分
**** 商品区分(第1類;第2類;第3類)!
* 出来事
** 購⼊入する
*** 部品
**** 顧客
**** 商品
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!
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!
Scala Tips
•  ブログ:Modegramming Style
  •  http://modegramming.blogspot.jp/
  •  Modeling + Programming = Modegramming
  •  DSL駆動開発
•  Scala Tips
  •  Scalaプログラミングのイディオムを整備するのが⽬目的。
  •  Option編、Either編が終わってValidation編が終わりつつあ
     るところ。
浅海の関数型体験
•  卒論でLispインタープリタを作成。
•  OS開発の仕事をしている時に、カーネルのパニックダンプを解析するツールを
   Lispで開発。実⾏行行環境のLispインタープリタは⾃自作。
•  ⼀一時期Emacs-Lispに凝っていた。

•  Lispを使った⼿手続き型プログラミング。
•  Lisp流のリスト処理は便利。
•  プログラムが⼤大きくなってくると静的型付けでないと⾟辛くなってくるのでだんだん
   疎遠に。
•  Javaが出てきてからLispを触ることはなくなった。
•  性能、メモリを意識していた時代。

•    1995年からはJava⼀一筋。関数型とは全く疎遠に。
•    20年近くの関数型の進化の情報が全く⽋欠落している状態。
•    2008年の夏にScalaを始める。DSLが主の⽬目的。
•    2011年の夏にあった『クラウド温泉2.0@⼩小樽』の関連企画『数学勉強会@札幌
     百回記念特別勉強会「プログラマのための圏論の基礎」圏論勉強会』をきっかけに
     関数型に⽬目覚める。
     •  今年もあると思います!
•  2011年秋にScalazを調べ始める。
•  只今修⾏行行中。道半ばです。
Scalaの使い所
プログラミング⾔言語の選択
•  プログラミング⾔言語に求める物
   •  静的型付け
   •  Java VM
   •  OOP
•  Scalaを選んだ理由
   •  DSL
   •  Better Java
   •  並列プログラミング
   •  関数型
•  Scalazを選んだ理由
   •  Promise
   •  並⾏行行プログラミング
 •  「Beyond Mere Actors」
   •  https://docs.google.com/present/view?
      id=ddmk3f43_63zpg3jcgz
アプリケーションの階層と役割

アプリケー   •  DSLの作法に従ってビジネスロ
           ジックを記述
 ション    •  OO、関数型のスキルは最低限


        •  フレームワークを簡単に使⽤用する
 DSL       ための専⽤用⾔言語
        •  OO、関数型の⾼高度なスキル


フレーム    •  ドメインの共通処理を記述
 ワーク    •  OO、関数型の⾼高度なスキル
DSL
(Domain Specific Language)
Scalaプログラミングの魅⼒力力
Scalaプログラミングの⾯面⽩白
いところ
•  Object-Functional Programming (OFP)
  •  オブジェクト脳だからOOPははずせない
  •  オブジェクトモデリングとの連続性はOOPで確保
  •  関数型プログラミング(FP)もやってみると、どうも⾯面⽩白い
     ようだ
  •  データ構造はOOP、アルゴリズムはFP
•  Monadicプログラミング
  •  ボイラープレートが少ない
  •  本質的なロジックに集中できる
•  DSL
  •  作るのも楽しい
  •  使うと楽チン
  •  フレームワークAPIの技術⾰革新の軸
OFP新三種の神器
 トレイト (trait)

•  mix-in
•  型安全のAOP的な運⽤用

 モナド (monad)

•  計算⽂文脈をカプセル化する新しい⾔言語概念
•  Monadicプログラミング

 型クラス (type class)

•  型安全のダブルディスパッチ(?)
•  Scalaでは、⽂文脈、主体、客体の組でメソッドを選択
コーディング⽐比較
 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) !
   } !
}!
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
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演算
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");
     }
};
代数的構造デザインパターン
結合律 (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
圏論デザインパターン

                         圏 (category)
          モナド            • Hask圏 (Scala圏?)
         (monad)         • クライスリ圏
                          (kleisli category)




   Applicative                     射 (arrow,
    functor                        morphism)




                      関⼿手
                   (functor)
Scalaへのアプローチ
最初はBetter Java。
•  便利なDSL利⽤用+Better Javaで⽌止めてしまってもよい。



    map系、fold系のList処理を導⼊入。
    •  関数型肩慣らし。



        Option, Eitherの導⼊入。
        •  関数型肩慣らし。mapやfoldを活⽤用。



            flatMap系の演算を導⼊入。
            •  Monadicプログラミング肩慣らし。



                Scalaz導⼊入。
                •  本格的関数型プログラミング。
                •  型クラス、代数的データ型、永続データ構造。
まとめ
•  DSLがキーテクノロジー。
•  並⾏行行プログラミングで、プログラミング・
   モデルが⼤大転換するかも。
•  Scalaいいよ。
END

More Related Content

What's hot

はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化Lintaro Ina
 
Yesodを支える技術
Yesodを支える技術Yesodを支える技術
Yesodを支える技術Hiromi Ishii
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in ScalaLintaro Ina
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介Yusuke Hirao
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallこれからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallなおき きしだ
 
JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめYuki Ishikawa
 
Sbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞYoshitaka Fujii
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
Java使いにとっての関数
Java使いにとっての関数Java使いにとっての関数
Java使いにとっての関数amkt922
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
Doma SQLテンプレートのしくみ
Doma SQLテンプレートのしくみDoma SQLテンプレートのしくみ
Doma SQLテンプレートのしくみToshihiro Nakamura
 

What's hot (20)

はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
 
Yesodを支える技術
Yesodを支える技術Yesodを支える技術
Yesodを支える技術
 
Scalaノススメ
ScalaノススメScalaノススメ
Scalaノススメ
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
 
Ppl
PplPpl
Ppl
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallこれからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
 
JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめ
 
Sbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
Sbtのマルチプロジェクトはいいぞ
 
Yesod勉強会
Yesod勉強会Yesod勉強会
Yesod勉強会
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
Java使いにとっての関数
Java使いにとっての関数Java使いにとっての関数
Java使いにとっての関数
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
Doma SQLテンプレートのしくみ
Doma SQLテンプレートのしくみDoma SQLテンプレートのしくみ
Doma SQLテンプレートのしくみ
 
Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
 

Similar to Scalaでプログラムを作りました

Rails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionRails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionSatomi Tsujita
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24Kazuhiro Sera
 
Express Web Application Framework
Express Web Application FrameworkExpress Web Application Framework
Express Web Application FrameworkLearningTech
 
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチMonadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチTomoharu ASAMI
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Nakazawa Yuichi
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼうyouku
 
Wakanda#1
Wakanda#1Wakanda#1
Wakanda#1kmiyako
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/AndroidセキュアコーディングMasaki Kubo
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフラインWebフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフラインShumpei Shiraishi
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころAyumi Goto
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tipsyoshikawa_t
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】Tomoharu ASAMI
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方Fumihiko Shiroyama
 
Ember.js the Second Step
Ember.js the Second StepEmber.js the Second Step
Ember.js the Second StepDopin Ninja
 
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkSpring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkToshiaki Maki
 

Similar to Scalaでプログラムを作りました (20)

Rails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionRails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3edition
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
 
Express Web Application Framework
Express Web Application FrameworkExpress Web Application Framework
Express Web Application Framework
 
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチMonadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
 
APIMeetup 20170329_ichimura
APIMeetup 20170329_ichimuraAPIMeetup 20170329_ichimura
APIMeetup 20170329_ichimura
 
Wakanda#1
Wakanda#1Wakanda#1
Wakanda#1
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフラインWebフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころ
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tips
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
Ember.js the Second Step
Ember.js the Second StepEmber.js the Second Step
Ember.js the Second Step
 
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkSpring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
 

More from Tomoharu ASAMI

アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】Tomoharu ASAMI
 
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】Tomoharu ASAMI
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】Tomoharu ASAMI
 
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】Tomoharu ASAMI
 
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】Tomoharu ASAMI
 
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】Tomoharu ASAMI
 
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】Tomoharu ASAMI
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】Tomoharu ASAMI
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】Tomoharu ASAMI
 
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】Tomoharu ASAMI
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】Tomoharu ASAMI
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】Tomoharu ASAMI
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】Tomoharu ASAMI
 
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】Tomoharu ASAMI
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】Tomoharu ASAMI
 
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】Tomoharu ASAMI
 
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】Tomoharu ASAMI
 
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】Tomoharu ASAMI
 
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】Tomoharu ASAMI
 
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】Tomoharu ASAMI
 

More from Tomoharu ASAMI (20)

アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
 
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
 
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
 
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
 
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
 
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
 
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
 
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
 
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
 
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
 
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
 
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】
要求/シナリオ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第14回】
 

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、関数型の⾼高度なスキル
  • 17. Scalaプログラミングの⾯面⽩白 いところ •  Object-Functional Programming (OFP) •  オブジェクト脳だからOOPははずせない •  オブジェクトモデリングとの連続性はOOPで確保 •  関数型プログラミング(FP)もやってみると、どうも⾯面⽩白い ようだ •  データ構造はOOP、アルゴリズムはFP •  Monadicプログラミング •  ボイラープレートが少ない •  本質的なロジックに集中できる •  DSL •  作るのも楽しい •  使うと楽チン •  フレームワークAPIの技術⾰革新の軸
  • 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導⼊入。 •  本格的関数型プログラミング。 •  型クラス、代数的データ型、永続データ構造。
  • 27. END