SlideShare a Scribd company logo
1 of 28
Download to read offline
Scala DSL

                2010 5       18
                         (    Lab)




2010   5   18
Scala

       •


       •


       •


       •


       • JVM          Java


       • Scalable ≒ DSL


2010   5   18
DSL

       • Domain Specific Language


       •


       •


       •


       • OSMU (One Source Multi Use)




2010   5   18
Scala DSL




2010   5   18
Specs

   object CsvEntityTest extends Specification {                                        • BDD
    val TestReadDir = "/tmp/goldenport.d/read"
    val TestCreateDir = "/tmp/goldenport.d/create/CsvEntity"                             • Behavior Driven
    val readonlyCsvFileName = GoldenportTestUtility.readonlyCsvFileName                    Development
       "CsvEntity    Read" should {
        "CsvEntity DefaultEntitySpace         FileDataSource     open" in {              •
            val space = new DefaultEntitySpace
            space.addEntityClass(new CsvEntityClass())
            val datasource = new FileDataSource(readonlyCsvFileName, space.context)
            val mayCsv: Option[GEntity] = space.reconstitute(datasource)
            mayCsv must beSome[GEntity]
            val csv = mayCsv.get.asInstanceOf[CsvEntity]
            csv.open()
            csv.width must be(3)
            csv.height must be(2)
            csv.get(0, 0) must be_==("A")                                             • Specs
            csv.get(1, 0) must be_==("B")
            csv.get(2, 0) must be_==("C")
            csv.get(0, 1) must be_==("X")
            csv.get(1, 1) must be_==("Y")                                                • Scala
            csv.get(2, 1) must be_==("Z")
            csv.close()
        }


2010    5    18
SimpleModeler

           case class DER                 extends DomainResource {    •                 DSL
               term = "      "
               caption = "         "
               brief = <t></t>
               description = <text></text>
                                                                      • Scala DSL
               id("    Id", DVI           Id())
               attribute("       Name", DVN          Name())
           }                                                                    Google App
           case class DVI                Id extends DomainValueId {       Engine Java
               term = "      Id"
               caption = "         Id"
               brief = <t></t>
               description = <text></text>

               attribute("value", XString)
           }




2010   5       18
SimpleModeler




2010   5   18
g3

                                                           •
           class Join extends G3Application {
            agent('compute) {
              case x: Int => x + 100
                                                           • Scala DSL
            }


               start(List(1, 2, 3, 4, 5)) split() publish("compute") join() aggregate()
           }




2010   5       18
class MyTodo extends Todo {                          • TODO
        name = "         "                                   Scala DSL

           "                            " until 20100505
                                                            • Scala DSL   HTML
           "                            " until 20100606
           "                      " until 20100707

           task("                     ") {
               until = 20100808
               todo("PC                      ")
               "IDE                      " until 20100707
           }
       }




2010   5   18
DSL                 HTML

       <html>
       <head>
        <title>TODO   </title>
       </head>
       <body>

       <ul>
        <li>                           (20100505)</li>
           <li>                        (20100606)</li>
           <li>                  (20100707)</li>
           <li>PC                    (20100808) [        ]</li>
           <li>IDE                    (20100808) [       ]</li>
       </ul>

       </body>
       </html>



2010   5    18
DSL




2010   5   18
class MyTodo extends Todo {
             name = "         "
            }



           abstract class Todo {
             var name: String = _
           }



2010   5   18
class MyTodo extends Todo {
            name = "         "
                                               import scala.collection.mutable.ArrayBuffer
               todo("                     ")
               todo("                     ")   abstract class Todo {
                                                var name: String = _
               todo("                ")         val items = new ArrayBuffer[TodoItem]
           }
                                                   def todo(title: String) {
                                                     val item = new TodoItem(title)
                                                     items += item
                                                   }
                                               }

                                               class TodoItem(val title: String) {
                                               }




2010   5       18
import scala.collection.mutable.ArrayBuffer
  class MyTodo extends Todo {
   name = "         "                                 abstract class Todo {
                                                       var name: String = _
                                                       val items = new ArrayBuffer[TodoItem]
      todo("                      ") until 20100505
                                                          def todo(title: String): TodoItem = {
      todo("                      ") until 20100606         val item = new TodoItem(title)
      todo("                ") until 20100707               items += item
                                                            item
  }                                                       }
                                                      }

                                                      class TodoItem(val title: String) {
                                                       var untilDate: Int = _

                                                          def until(date: Int): TodoItem = {
                                                            untilDate = date
                                                            this
                                                          }
                                                      }




2010    5   18
                         (fluent interface)
import scala.collection.mutable.ArrayBuffer
   class MyTodo extends Todo {
    name = "         "                              abstract class Todo {
                                                     var name: String = _
                                                     val items = new ArrayBuffer[TodoItem]
       "                         " until 20100505
                                                        def todo(title: String): TodoItem = {
       "                         " until 20100606         val item = new TodoItem(title)
                                                          items += item
       "                " until 20100707                  item
                                                        }
   }
                                                      implicit def todoWrapper(title: String): TodoItem =
                                                    todo(title)
                                                    }

                                                    class TodoItem(val title: String) {
                                                     var untilDate: Int = _

                                                        def until(date: Int): TodoItem = {
                                                          untilDate = date
                                                          this
                                                        }
                                                    }



2010       5   18
class MyTodo extends Todo {
        name = "         "

           "                         " until 20100505
           "                         " until 20100606
           "                " until 20100707

           task("               ") {
               todo("PC                  ")
               "IDE                  " until 20100707
           }
       }




2010   5       18
import scala.collection.mutable.ArrayBuffer
                                                                             class TodoItem(var title: String) {
       abstract class Todo {                                                  var untilDate: Int = _
        var name: String = _
        val items = new ArrayBuffer[TodoItem]                                    def until(date: Int): TodoItem = {
        val tasks = new ArrayBuffer[Task]                                          untilDate = date
        private[this] var currentTask: Option[Task] = None                         this
                                                                                 }
           def todo(title: String): TodoItem = {                             }
             val item = new TodoItem(title)
             currentTask match {                                             class Task(var title: String) {
               case Some(tk) => tk.items += item                               val items = new ArrayBuffer[TodoItem]
               case None => items += item                                      var untilDate: Int = _
             }                                                               }
             item
           }

           def task(title: String)(p: => Unit): Task = {
             val tk = new Task(title)
             tasks += tk
             currentTask = Some(tk)
             p
             currentTask = None
             tk
           }

           implicit def todoWrapper(title: String): TodoItem = todo(title)
       }



2010   5     18
           Stack
class MyTodo extends Todo {
            name = "         "

               "                            " until 20100505
               "                            " until 20100606
               "                      " until 20100707

               task("                     ") {
                   until = 20100808
                   todo("PC                      ")
                   "IDE                      " until 20100707
               }
           }




2010   5       18
import scala.collection.mutable.ArrayBuffer
                                                                     def until: Int = {
           abstract class Todo {                                       currentTask.get.untilDate
            var name: String = _                                     }
            val items = new ArrayBuffer[TodoItem]
            val tasks = new ArrayBuffer[Task]                        def until_=(value: Int) {
            private[this] var currentTask: Option[Task] = None         currentTask.get.untilDate = value
                                                                     }
               def todo(title: String): TodoItem = {
                 val item = new TodoItem(title)                      implicit def todoWrapper(title: String): TodoItem = todo(title)
                 currentTask match {                             }
                   case Some(tk) => tk.items += item
                   case None => items += item                    class TodoItem(var title: String) {
                 }                                                var untilDate: Int = _
                 item
               }                                                     def until(date: Int): TodoItem = {
                                                                       untilDate = date
               def task(title: String)(p: => Unit): Task = {           this
                 val tk = new Task(title)                            }
                 tasks += tk                                     }
                 currentTask = Some(tk)
                 p                                               class Task(var title: String) {
                 currentTask = None                                val items = new ArrayBuffer[TodoItem]
                 tk                                                var untilDate: Int = _
               }                                                 }
                 this
               }
           }

2010   5       18
2010   5   18
MakeTodoDsl
       import scala.xml.{XML, Node}
                                                                     private def makeList(todo: Todo): List[Node] = {
       object MakeTodoDsl {                                            (for (item <- todo.items) yield <li>{
        def main(args: Array[String]) {                                   "%s(%s)".format(item.title, item.untilDate)
         val input = args(0)                                           }</li>).toList :::
         val output = args(1)                                          (for (task <- todo.tasks; item <- task.items) yield <li>{
                                                                          "%s(%s) [%s]".format(item.title, task.untilDate, task.title)
            val appClass = Class.forName(input)                        }</li>).toList
            val todo = appClass.newInstance.asInstanceOf[Todo]       }
                                                                 }
         val html = <html>
       <head>
        <title>TODO      </title>
       </head>
       <body>

       <ul>
        { makeList(todo) }
       </ul>

       </body>
       </html>

            XML.save(output, html, "utf-8")
        }


2010    5    18
def main(args: Array[String]) {
             val input = args(0)
             val output = args(1)

                val appClass = Class.forName(input)
                val todo = appClass.newInstance.asInstanceOf[Todo]




2010   5   18
XML
           val html = <html>
           <head>
            <title>TODO      </title>
           </head>
           <body>

           <ul>
            { makeList(todo) }
           </ul>

           </body>
           </html>

                XML.save(output, html, "utf-8")
           }
2010   5   18
private def makeList(todo: Todo): List[Node] = {
          (for (item <- todo.items) yield <li>{
              "%s(%s)".format(item.title, item.untilDate)
          }</li>).toList :::
          (for (task <- todo.tasks; item <- task.items) yield <li>{
              "%s(%s) [%s]".format(item.title, task.untilDate, task.title)}</li>
          ).toList
        }




2010   5   18
DSL                           HTML

       <html>                                            •
       <head>
        <title>TODO   </title>
       </head>
       <body>

       <ul>
        <li>                           (20100505)</li>
           <li>                        (20100606)</li>
           <li>                  (20100707)</li>
           <li>PC                    (20100808) [            ]</li>
           <li>IDE                    (20100808) [           ]</li>
       </ul>

       </body>
       </html>


2010   5   18
•          •


       •          •


           •      • XML


           •      •


       • apply    •       (2.8)


       • update   •         (2.8)



2010   5   18
• DSL              Scala


       • Scala     Java           …


           •


       • Scala DSL


           •


       •         Scala



2010   5   18
End




2010   5   18

More Related Content

What's hot

Reactive Microservices with Quarkus
Reactive Microservices with QuarkusReactive Microservices with Quarkus
Reactive Microservices with QuarkusNiklas Heidloff
 
Rootless Containers
Rootless ContainersRootless Containers
Rootless ContainersAkihiro Suda
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルMasahito Zembutsu
 
Azure AD DSドメインに仮想マシンを参加させる
Azure AD DSドメインに仮想マシンを参加させるAzure AD DSドメインに仮想マシンを参加させる
Azure AD DSドメインに仮想マシンを参加させるTetsuya Yokoyama
 
Introduction to Google Cloud Platform (GCP) | Google Cloud Tutorial for Begin...
Introduction to Google Cloud Platform (GCP) | Google Cloud Tutorial for Begin...Introduction to Google Cloud Platform (GCP) | Google Cloud Tutorial for Begin...
Introduction to Google Cloud Platform (GCP) | Google Cloud Tutorial for Begin...Edureka!
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
インフラ野郎AzureチームProX
インフラ野郎AzureチームProXインフラ野郎AzureチームProX
インフラ野郎AzureチームProXToru Makabe
 
Podman Overview and internals.pdf
Podman Overview and internals.pdfPodman Overview and internals.pdf
Podman Overview and internals.pdfSaim Safder
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル貴志 上坂
 
Secure Infrastructure Provisioning with Terraform Cloud, Vault + GitLab CI
Secure Infrastructure Provisioning with Terraform Cloud, Vault + GitLab CISecure Infrastructure Provisioning with Terraform Cloud, Vault + GitLab CI
Secure Infrastructure Provisioning with Terraform Cloud, Vault + GitLab CIMitchell Pronschinske
 
Harbor RegistryのReplication機能
Harbor RegistryのReplication機能Harbor RegistryのReplication機能
Harbor RegistryのReplication機能Masanori Nara
 
Hybrid Data Deliveryを活用してオンプレミスデータをQlik Cloudでリアルタイム活用!
Hybrid Data Deliveryを活用してオンプレミスデータをQlik Cloudでリアルタイム活用!Hybrid Data Deliveryを活用してオンプレミスデータをQlik Cloudでリアルタイム活用!
Hybrid Data Deliveryを活用してオンプレミスデータをQlik Cloudでリアルタイム活用!QlikPresalesJapan
 
Modernization patterns to refactor a legacy application into event driven mic...
Modernization patterns to refactor a legacy application into event driven mic...Modernization patterns to refactor a legacy application into event driven mic...
Modernization patterns to refactor a legacy application into event driven mic...Bilgin Ibryam
 
Introduction to Java EE (J2EE)
Introduction to Java EE (J2EE)Introduction to Java EE (J2EE)
Introduction to Java EE (J2EE)Atit Patumvan
 
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewayIván López Martín
 

What's hot (20)

Reactive Microservices with Quarkus
Reactive Microservices with QuarkusReactive Microservices with Quarkus
Reactive Microservices with Quarkus
 
Rootless Containers
Rootless ContainersRootless Containers
Rootless Containers
 
GraalVM
GraalVMGraalVM
GraalVM
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
Azure AD DSドメインに仮想マシンを参加させる
Azure AD DSドメインに仮想マシンを参加させるAzure AD DSドメインに仮想マシンを参加させる
Azure AD DSドメインに仮想マシンを参加させる
 
Java OCA teoria 1
Java OCA teoria 1Java OCA teoria 1
Java OCA teoria 1
 
Introduction to Google Cloud Platform (GCP) | Google Cloud Tutorial for Begin...
Introduction to Google Cloud Platform (GCP) | Google Cloud Tutorial for Begin...Introduction to Google Cloud Platform (GCP) | Google Cloud Tutorial for Begin...
Introduction to Google Cloud Platform (GCP) | Google Cloud Tutorial for Begin...
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
インフラ野郎AzureチームProX
インフラ野郎AzureチームProXインフラ野郎AzureチームProX
インフラ野郎AzureチームProX
 
Helidon 概要
Helidon 概要Helidon 概要
Helidon 概要
 
Podman Overview and internals.pdf
Podman Overview and internals.pdfPodman Overview and internals.pdf
Podman Overview and internals.pdf
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル
 
Secure Infrastructure Provisioning with Terraform Cloud, Vault + GitLab CI
Secure Infrastructure Provisioning with Terraform Cloud, Vault + GitLab CISecure Infrastructure Provisioning with Terraform Cloud, Vault + GitLab CI
Secure Infrastructure Provisioning with Terraform Cloud, Vault + GitLab CI
 
Harbor RegistryのReplication機能
Harbor RegistryのReplication機能Harbor RegistryのReplication機能
Harbor RegistryのReplication機能
 
Hybrid Data Deliveryを活用してオンプレミスデータをQlik Cloudでリアルタイム活用!
Hybrid Data Deliveryを活用してオンプレミスデータをQlik Cloudでリアルタイム活用!Hybrid Data Deliveryを活用してオンプレミスデータをQlik Cloudでリアルタイム活用!
Hybrid Data Deliveryを活用してオンプレミスデータをQlik Cloudでリアルタイム活用!
 
Modernization patterns to refactor a legacy application into event driven mic...
Modernization patterns to refactor a legacy application into event driven mic...Modernization patterns to refactor a legacy application into event driven mic...
Modernization patterns to refactor a legacy application into event driven mic...
 
Introduction to Java EE (J2EE)
Introduction to Java EE (J2EE)Introduction to Java EE (J2EE)
Introduction to Java EE (J2EE)
 
Kubernetes 101 Workshop
Kubernetes 101 WorkshopKubernetes 101 Workshop
Kubernetes 101 Workshop
 
NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話
 
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
 

Similar to Scala DSLの作り方

Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.
Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.
Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.Skills Matter
 
Short Lightening Talk
Short Lightening TalkShort Lightening Talk
Short Lightening TalkIkenna Okpala
 
Starting with Scala : Frontier Developer's Meetup December 2010
Starting with Scala : Frontier Developer's Meetup December 2010Starting with Scala : Frontier Developer's Meetup December 2010
Starting with Scala : Frontier Developer's Meetup December 2010Derek Chen-Becker
 
Why Scala is the better Java
Why Scala is the better JavaWhy Scala is the better Java
Why Scala is the better JavaThomas Kaiser
 
Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?Jesper Kamstrup Linnet
 
NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020Thodoris Bais
 
Scala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghScala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghStuart Roebuck
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotationjavatwo2011
 
Scala in practice
Scala in practiceScala in practice
Scala in practicepatforna
 
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin WayTDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Waytdc-globalcode
 
Oop2010 Scala Presentation Stal
Oop2010 Scala Presentation StalOop2010 Scala Presentation Stal
Oop2010 Scala Presentation StalMichael Stal
 
JavaScript - Chapter 12 - Document Object Model
  JavaScript - Chapter 12 - Document Object Model  JavaScript - Chapter 12 - Document Object Model
JavaScript - Chapter 12 - Document Object ModelWebStackAcademy
 
Rich Internet Applications con JavaFX e NetBeans
Rich Internet Applications  con JavaFX e NetBeans Rich Internet Applications  con JavaFX e NetBeans
Rich Internet Applications con JavaFX e NetBeans Fabrizio Giudici
 

Similar to Scala DSLの作り方 (20)

Kotlin talk
Kotlin talkKotlin talk
Kotlin talk
 
Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.
Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.
Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.
 
Short Lightening Talk
Short Lightening TalkShort Lightening Talk
Short Lightening Talk
 
Starting with Scala : Frontier Developer's Meetup December 2010
Starting with Scala : Frontier Developer's Meetup December 2010Starting with Scala : Frontier Developer's Meetup December 2010
Starting with Scala : Frontier Developer's Meetup December 2010
 
Why Scala is the better Java
Why Scala is the better JavaWhy Scala is the better Java
Why Scala is the better Java
 
mobl
moblmobl
mobl
 
Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?
 
Developing a new Epsilon EMC driver
Developing a new Epsilon EMC driverDeveloping a new Epsilon EMC driver
Developing a new Epsilon EMC driver
 
An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scala
 
NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020
 
Scala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghScala @ TechMeetup Edinburgh
Scala @ TechMeetup Edinburgh
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotation
 
Object calisthenics
Object calisthenicsObject calisthenics
Object calisthenics
 
Scala in practice
Scala in practiceScala in practice
Scala in practice
 
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin WayTDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
 
Oop2010 Scala Presentation Stal
Oop2010 Scala Presentation StalOop2010 Scala Presentation Stal
Oop2010 Scala Presentation Stal
 
WebDSL
WebDSLWebDSL
WebDSL
 
Scala - en bedre Java?
Scala - en bedre Java?Scala - en bedre Java?
Scala - en bedre Java?
 
JavaScript - Chapter 12 - Document Object Model
  JavaScript - Chapter 12 - Document Object Model  JavaScript - Chapter 12 - Document Object Model
JavaScript - Chapter 12 - Document Object Model
 
Rich Internet Applications con JavaFX e NetBeans
Rich Internet Applications  con JavaFX e NetBeans Rich Internet Applications  con JavaFX e NetBeans
Rich Internet Applications con JavaFX e NetBeans
 

More from Tomoharu ASAMI

テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】Tomoharu ASAMI
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】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)

テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
 
実装(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回】
 

Recently uploaded

Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxGDSC PJATK
 
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxBuilding AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxUdaiappa Ramachandran
 
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Will Schroeder
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?IES VE
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
NIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopNIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopBachir Benyammi
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarPrecisely
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
OpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureOpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureEric D. Schabell
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7DianaGray10
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URLRuncy Oommen
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAshyamraj55
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxMatsuo Lab
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...Aggregage
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfinfogdgmi
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-pyJamie (Taka) Wang
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 

Recently uploaded (20)

Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptx
 
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxBuilding AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptx
 
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
NIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopNIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 Workshop
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity Webinar
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
OpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureOpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability Adventure
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URL
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
 
20150722 - AGV
20150722 - AGV20150722 - AGV
20150722 - AGV
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptx
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdf
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 

Scala DSLの作り方

  • 1. Scala DSL 2010 5 18 ( Lab) 2010 5 18
  • 2. Scala • • • • • JVM Java • Scalable ≒ DSL 2010 5 18
  • 3. DSL • Domain Specific Language • • • • OSMU (One Source Multi Use) 2010 5 18
  • 5. Specs object CsvEntityTest extends Specification { • BDD val TestReadDir = "/tmp/goldenport.d/read" val TestCreateDir = "/tmp/goldenport.d/create/CsvEntity" • Behavior Driven val readonlyCsvFileName = GoldenportTestUtility.readonlyCsvFileName Development "CsvEntity Read" should { "CsvEntity DefaultEntitySpace FileDataSource open" in { • val space = new DefaultEntitySpace space.addEntityClass(new CsvEntityClass()) val datasource = new FileDataSource(readonlyCsvFileName, space.context) val mayCsv: Option[GEntity] = space.reconstitute(datasource) mayCsv must beSome[GEntity] val csv = mayCsv.get.asInstanceOf[CsvEntity] csv.open() csv.width must be(3) csv.height must be(2) csv.get(0, 0) must be_==("A") • Specs csv.get(1, 0) must be_==("B") csv.get(2, 0) must be_==("C") csv.get(0, 1) must be_==("X") csv.get(1, 1) must be_==("Y") • Scala csv.get(2, 1) must be_==("Z") csv.close() } 2010 5 18
  • 6. SimpleModeler case class DER extends DomainResource { • DSL term = " " caption = " " brief = <t></t> description = <text></text> • Scala DSL id(" Id", DVI Id()) attribute(" Name", DVN Name()) } Google App case class DVI Id extends DomainValueId { Engine Java term = " Id" caption = " Id" brief = <t></t> description = <text></text> attribute("value", XString) } 2010 5 18
  • 8. g3 • class Join extends G3Application { agent('compute) { case x: Int => x + 100 • Scala DSL } start(List(1, 2, 3, 4, 5)) split() publish("compute") join() aggregate() } 2010 5 18
  • 9. class MyTodo extends Todo { • TODO name = " " Scala DSL " " until 20100505 • Scala DSL HTML " " until 20100606 " " until 20100707 task(" ") { until = 20100808 todo("PC ") "IDE " until 20100707 } } 2010 5 18
  • 10. DSL HTML <html> <head> <title>TODO </title> </head> <body> <ul> <li> (20100505)</li> <li> (20100606)</li> <li> (20100707)</li> <li>PC (20100808) [ ]</li> <li>IDE (20100808) [ ]</li> </ul> </body> </html> 2010 5 18
  • 11. DSL 2010 5 18
  • 12. class MyTodo extends Todo { name = " " } abstract class Todo { var name: String = _ } 2010 5 18
  • 13. class MyTodo extends Todo { name = " " import scala.collection.mutable.ArrayBuffer todo(" ") todo(" ") abstract class Todo { var name: String = _ todo(" ") val items = new ArrayBuffer[TodoItem] } def todo(title: String) { val item = new TodoItem(title) items += item } } class TodoItem(val title: String) { } 2010 5 18
  • 14. import scala.collection.mutable.ArrayBuffer class MyTodo extends Todo { name = " " abstract class Todo { var name: String = _ val items = new ArrayBuffer[TodoItem] todo(" ") until 20100505 def todo(title: String): TodoItem = { todo(" ") until 20100606 val item = new TodoItem(title) todo(" ") until 20100707 items += item item } } } class TodoItem(val title: String) { var untilDate: Int = _ def until(date: Int): TodoItem = { untilDate = date this } } 2010 5 18 (fluent interface)
  • 15. import scala.collection.mutable.ArrayBuffer class MyTodo extends Todo { name = " " abstract class Todo { var name: String = _ val items = new ArrayBuffer[TodoItem] " " until 20100505 def todo(title: String): TodoItem = { " " until 20100606 val item = new TodoItem(title) items += item " " until 20100707 item } } implicit def todoWrapper(title: String): TodoItem = todo(title) } class TodoItem(val title: String) { var untilDate: Int = _ def until(date: Int): TodoItem = { untilDate = date this } } 2010 5 18
  • 16. class MyTodo extends Todo { name = " " " " until 20100505 " " until 20100606 " " until 20100707 task(" ") { todo("PC ") "IDE " until 20100707 } } 2010 5 18
  • 17. import scala.collection.mutable.ArrayBuffer class TodoItem(var title: String) { abstract class Todo { var untilDate: Int = _ var name: String = _ val items = new ArrayBuffer[TodoItem] def until(date: Int): TodoItem = { val tasks = new ArrayBuffer[Task] untilDate = date private[this] var currentTask: Option[Task] = None this } def todo(title: String): TodoItem = { } val item = new TodoItem(title) currentTask match { class Task(var title: String) { case Some(tk) => tk.items += item val items = new ArrayBuffer[TodoItem] case None => items += item var untilDate: Int = _ } } item } def task(title: String)(p: => Unit): Task = { val tk = new Task(title) tasks += tk currentTask = Some(tk) p currentTask = None tk } implicit def todoWrapper(title: String): TodoItem = todo(title) } 2010 5 18 Stack
  • 18. class MyTodo extends Todo { name = " " " " until 20100505 " " until 20100606 " " until 20100707 task(" ") { until = 20100808 todo("PC ") "IDE " until 20100707 } } 2010 5 18
  • 19. import scala.collection.mutable.ArrayBuffer def until: Int = { abstract class Todo { currentTask.get.untilDate var name: String = _ } val items = new ArrayBuffer[TodoItem] val tasks = new ArrayBuffer[Task] def until_=(value: Int) { private[this] var currentTask: Option[Task] = None currentTask.get.untilDate = value } def todo(title: String): TodoItem = { val item = new TodoItem(title) implicit def todoWrapper(title: String): TodoItem = todo(title) currentTask match { } case Some(tk) => tk.items += item case None => items += item class TodoItem(var title: String) { } var untilDate: Int = _ item } def until(date: Int): TodoItem = { untilDate = date def task(title: String)(p: => Unit): Task = { this val tk = new Task(title) } tasks += tk } currentTask = Some(tk) p class Task(var title: String) { currentTask = None val items = new ArrayBuffer[TodoItem] tk var untilDate: Int = _ } } this } } 2010 5 18
  • 20. 2010 5 18
  • 21. MakeTodoDsl import scala.xml.{XML, Node} private def makeList(todo: Todo): List[Node] = { object MakeTodoDsl { (for (item <- todo.items) yield <li>{ def main(args: Array[String]) { "%s(%s)".format(item.title, item.untilDate) val input = args(0) }</li>).toList ::: val output = args(1) (for (task <- todo.tasks; item <- task.items) yield <li>{ "%s(%s) [%s]".format(item.title, task.untilDate, task.title) val appClass = Class.forName(input) }</li>).toList val todo = appClass.newInstance.asInstanceOf[Todo] } } val html = <html> <head> <title>TODO </title> </head> <body> <ul> { makeList(todo) } </ul> </body> </html> XML.save(output, html, "utf-8") } 2010 5 18
  • 22. def main(args: Array[String]) { val input = args(0) val output = args(1) val appClass = Class.forName(input) val todo = appClass.newInstance.asInstanceOf[Todo] 2010 5 18
  • 23. XML val html = <html> <head> <title>TODO </title> </head> <body> <ul> { makeList(todo) } </ul> </body> </html> XML.save(output, html, "utf-8") } 2010 5 18
  • 24. private def makeList(todo: Todo): List[Node] = { (for (item <- todo.items) yield <li>{ "%s(%s)".format(item.title, item.untilDate) }</li>).toList ::: (for (task <- todo.tasks; item <- task.items) yield <li>{ "%s(%s) [%s]".format(item.title, task.untilDate, task.title)}</li> ).toList } 2010 5 18
  • 25. DSL HTML <html> • <head> <title>TODO </title> </head> <body> <ul> <li> (20100505)</li> <li> (20100606)</li> <li> (20100707)</li> <li>PC (20100808) [ ]</li> <li>IDE (20100808) [ ]</li> </ul> </body> </html> 2010 5 18
  • 26. • • • • • XML • • • apply • (2.8) • update • (2.8) 2010 5 18
  • 27. • DSL Scala • Scala Java … • • Scala DSL • • Scala 2010 5 18
  • 28. End 2010 5 18