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

8.093 Aufrufe

Veröffentlicht am

ニコニコ超会議2012の超エンジニアミーティングで使用したスライドです。JavaなどのOOPをやっていて、Scalaをこれから始めたい人向けの情報提供を目的としています。

0 Kommentare
6 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

Keine Downloads
Aufrufe
Aufrufe insgesamt
8.093
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
3.565
Aktionen
Geteilt
0
Downloads
36
Kommentare
0
Gefällt mir
6
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

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

  1. 1. Scalaでプログラムを作りました2012年4⽉月29⽇日匠Lab浅海智晴
  2. 2. ⾃自⼰己紹介•  (株)匠Lab。⽇日本Javaユーザグループ副会⻑⾧長。 edge2.cc主宰。•  代表作 •  XML SmartDoc (XML⽂文書処理システム) •  Relaxer (XML/Javaスキーマコンパイラ)•  開発中 •  SimpleModeler (Scala DSLモデルコンパイラ) •  SmartDox (⽂文書処理システム) •  g3 (サービスマッシュアップフレームワーク) •  g4 (Androidアプリケーションフレームワーク)•  近著 •  「上流⼯工程UMLモデリング」(⽇日経BP) •  「マインドマップではじめるモデリング講座」(翔泳社) •  「ボクらのScala」(Softbank Creative)
  3. 3. アジェンダ•  Scalaを使ってます•  Scalaの使い所•  Scalaプログラミングの魅⼒力力
  4. 4. Scalaを使ってます
  5. 5. Scalaで作ったプログラムSimpleModeler https://github.com/asami/simplemodeler モデルコンパイラ Scalaファイル数: 789個、Scalaステップ数: 95KSmartDox https://github.com/asami/smartdox DSL指向⽂文書処理プロセッサ Scalaファイル数: 31個、Scalaステップ数: 3.6Kg3 http://code.google.com/p/goldenport3/ クラウドアプリケーションフレームワーク(試作品) Scalaファイル数: 162個、Scalaステップ数: 22Kgoldenport https://github.com/asami/goldenport 内部的に使っているアプリケーションフレームワーク Scalaファイル数: 289個、Scalaステップ数: 17K
  6. 6. SimpleModeler •  DSL駆動開発×クラウド・コンピューティング •  ⾃自動コーディング・⾃自動DDD
  7. 7. sample.org* 登場⼈人物#+caption: 登場⼈人物⼀一覧| name |!|------|!| 商社 |!!** 顧客#+caption: 属性⼀一覧| name | type |!|------+--------|!| 住所 | string |!!*** 種類**** 個⼈人顧客**** 法⼈人顧客* 道具** 商品*** 属性**** 商品名**** 定価(long)!*** 区分**** 商品区分(第1類;第2類;第3類)!* 出来事** 購⼊入する*** 部品**** 顧客**** 商品
  8. 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. 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. 10. Scala Tips•  ブログ:Modegramming Style •  http://modegramming.blogspot.jp/ •  Modeling + Programming = Modegramming •  DSL駆動開発•  Scala Tips •  Scalaプログラミングのイディオムを整備するのが⽬目的。 •  Option編、Either編が終わってValidation編が終わりつつあ るところ。
  11. 11. 浅海の関数型体験•  卒論でLispインタープリタを作成。•  OS開発の仕事をしている時に、カーネルのパニックダンプを解析するツールを Lispで開発。実⾏行行環境のLispインタープリタは⾃自作。•  ⼀一時期Emacs-Lispに凝っていた。•  Lispを使った⼿手続き型プログラミング。•  Lisp流のリスト処理は便利。•  プログラムが⼤大きくなってくると静的型付けでないと⾟辛くなってくるのでだんだん 疎遠に。•  Javaが出てきてからLispを触ることはなくなった。•  性能、メモリを意識していた時代。•  1995年からはJava⼀一筋。関数型とは全く疎遠に。•  20年近くの関数型の進化の情報が全く⽋欠落している状態。•  2008年の夏にScalaを始める。DSLが主の⽬目的。•  2011年の夏にあった『クラウド温泉2.0@⼩小樽』の関連企画『数学勉強会@札幌 百回記念特別勉強会「プログラマのための圏論の基礎」圏論勉強会』をきっかけに 関数型に⽬目覚める。 •  今年もあると思います!•  2011年秋にScalazを調べ始める。•  只今修⾏行行中。道半ばです。
  12. 12. Scalaの使い所
  13. 13. プログラミング⾔言語の選択•  プログラミング⾔言語に求める物 •  静的型付け •  Java VM •  OOP•  Scalaを選んだ理由 •  DSL •  Better Java •  並列プログラミング •  関数型•  Scalazを選んだ理由 •  Promise •  並⾏行行プログラミング •  「Beyond Mere Actors」 •  https://docs.google.com/present/view? id=ddmk3f43_63zpg3jcgz
  14. 14. アプリケーションの階層と役割アプリケー •  DSLの作法に従ってビジネスロ ジックを記述 ション •  OO、関数型のスキルは最低限 •  フレームワークを簡単に使⽤用する DSL ための専⽤用⾔言語 •  OO、関数型の⾼高度なスキルフレーム •  ドメインの共通処理を記述 ワーク •  OO、関数型の⾼高度なスキル
  15. 15. DSL(Domain Specific Language)
  16. 16. Scalaプログラミングの魅⼒力力
  17. 17. Scalaプログラミングの⾯面⽩白いところ•  Object-Functional Programming (OFP) •  オブジェクト脳だからOOPははずせない •  オブジェクトモデリングとの連続性はOOPで確保 •  関数型プログラミング(FP)もやってみると、どうも⾯面⽩白い ようだ •  データ構造はOOP、アルゴリズムはFP•  Monadicプログラミング •  ボイラープレートが少ない •  本質的なロジックに集中できる•  DSL •  作るのも楽しい •  使うと楽チン •  フレームワークAPIの技術⾰革新の軸
  18. 18. OFP新三種の神器 トレイト (trait)•  mix-in•  型安全のAOP的な運⽤用 モナド (monad)•  計算⽂文脈をカプセル化する新しい⾔言語概念•  Monadicプログラミング 型クラス (type class)•  型安全のダブルディスパッチ(?)•  Scalaでは、⽂文脈、主体、客体の組でメソッドを選択
  19. 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. 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. 21. SparkとScaldingval 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 Mesosclass 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. 22. Enterprise Integration Patterns (EIP) Apache Camel Enterprise Integration Patterns •  http://camel.apache.org/enterprise-integration- patterns.htmlRouteBuilder 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. 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. 24. 圏論デザインパターン 圏 (category) モナド • Hask圏 (Scala圏?) (monad) • クライスリ圏 (kleisli category) Applicative 射 (arrow, functor morphism) 関⼿手 (functor)
  25. 25. Scalaへのアプローチ最初はBetter Java。•  便利なDSL利⽤用+Better Javaで⽌止めてしまってもよい。 map系、fold系のList処理を導⼊入。 •  関数型肩慣らし。 Option, Eitherの導⼊入。 •  関数型肩慣らし。mapやfoldを活⽤用。 flatMap系の演算を導⼊入。 •  Monadicプログラミング肩慣らし。 Scalaz導⼊入。 •  本格的関数型プログラミング。 •  型クラス、代数的データ型、永続データ構造。
  26. 26. まとめ•  DSLがキーテクノロジー。•  並⾏行行プログラミングで、プログラミング・ モデルが⼤大転換するかも。•  Scalaいいよ。
  27. 27. END

×