SlideShare a Scribd company logo
1 of 62
Download to read offline
GContracts
             の
            基礎
              Groovy基礎勉強会
               2013/03/09
13年3月11日月曜日
いいわけ
13年3月11日月曜日
只今、仕事が絶賛
  デスマーチ中なので、
  内容はグダグダです。

13年3月11日月曜日
13年3月11日月曜日
詳細は「gdgd妖精s」
    でググって。


13年3月11日月曜日
お前誰よ
              • 名前:杉浦孝博
              • twitter:@touchez_du_bois
              • 自称アニメエヴァンジェリスト
              • 最近はVB6とVB.NETがお友達

13年3月11日月曜日
閑話休題
13年3月11日月曜日
今回の内容
              •契約による設計

              • GContractsとは

              • GContractsの実際


13年3月11日月曜日
1.契約による設計
  Design by Contracts

13年3月11日月曜日
契約による設計
   •    プログラムコードの中にプ
       ログラムが満たすべき仕様に
       ついての記述を盛り込む事で
       設計の安全性を高める技法
       (Wikipediaより)。
13年3月11日月曜日
契約による設計
   •     Bertrand Meyer氏の提唱

   • 詳細はこんな本で




13年3月11日月曜日
契約による設計
   •   コードの利用者と実装者の
       間の契約

      •       利用者側が守るべきこと

      • 実装者が約束すること
13年3月11日月曜日
契約による設計
   •   主ロジックとは別に、コー
       ドとして契約内容を定義

   •   コード利用の責任範囲を明
       確化

13年3月11日月曜日
契約による設計
   •     契約の条件

    • 事前条件(Precondtion)

    • 事後条件(Postcondition)

    • 不変条件(Invariant)
13年3月11日月曜日
契約による設計
   •     事前条件

    • サブルーチンの開始時に満
              たされるべき条件

      •       呼び出し側が守ること
13年3月11日月曜日
契約による設計
   •     事後条件

    • サブルーチンの終了時に保
              証されるべき条件

      •       実装側が守ること

13年3月11日月曜日
契約による設計
   •     不変条件

    • 公開している操作の実行後
              に常に保証されるべき条件

      •       実装側が守ること

13年3月11日月曜日
詳しくは
   •     原本で




13年3月11日月曜日
詳しくは
   ••
         @t_wadaさんの
              http://www.slideshare.net/t_wada/exception-
              design-by-contract#btnPrevious




13年3月11日月曜日
2.GContractsとは
     What s GContracts

13年3月11日月曜日
言語標準な言語
   •     Eiffel

    • Bertrand Meyer氏考案

   • D言語


13年3月11日月曜日
Java
   •     標準

    • assert文

   • ライブラリ

    • Contract4J, cofoja
13年3月11日月曜日
Groovy
   •     標準

    • assert文(PowerAssert)

   • ライブラリ

    • GContracts
13年3月11日月曜日
GContracts
   •   Andre Steingress氏による
       契約プログラミング用のラ
       イブラリ

   •   https://github.com/
       andresteingress/
13年3月11日月曜日
GContracts
   •   アノテーションにより満た
       すべき条件をコード中に記述

   •   条件のコード内容は
       GroovyDocに出力可能

13年3月11日月曜日
GContracts
   •     事前条件 -> @Requires
    •    メソッドに指定
   •     事後条件 -> @Ensures
    •    メソッドに指定
   •     不変条件 -> @Invariants
    •    クラスに指定
13年3月11日月曜日
GContracts
   •     各条件をクロージャで記述

   • 契約に違反した場合、
       PowerAssertでエラー出力


13年3月11日月曜日
GContracts
   •   @Ensuresのクロージャ内
       では、次の値を参照できる

      •       old : メソッド実行前の状
              態。Map

      •
13年3月11日月曜日
              result : 実行結果
GContracts
   •     各条件を継承

   • 各条件をクラスだけでなく
       インタフェースにも指定可


13年3月11日月曜日
GContracts
 import org.gcontracts.annotations.*

 @Invariant({ speed() >= 0 })
 class Rocket {
     int speed = 0

          @Requires({ isStarted() })
          @Ensures({ old.speed < speed })
          void accelerate() { ++speed }

          boolean isStarted() { true }
          int speed() { speed }
 }
13年3月11日月曜日
3.GContractsの実際
              Actuals of GContracts



13年3月11日月曜日
やってること
   •     3行で言うと...




13年3月11日月曜日
やってること
   •     3行で言うと...
    •    AST変換で




13年3月11日月曜日
やってること
   •     3行で言うと...
    •    AST変換で
    •    条件用のコードを



13年3月11日月曜日
やってること
   •     3行で言うと...
    •    AST変換で、
    •    条件用のコードを、
    •    コンストラクタとメソッド
         に埋め込み
13年3月11日月曜日
やってること
   •     3行で言うと...
    •    AST変換で、
    •    条件用のコードを生成、
    •    コンストラクタとメソッド
         に埋め込み、
    •    実行する。
13年3月11日月曜日
AST変換
   •     Abstract Syntax Tree変換

   • 抽象構文木をこねくりまわ
       す


13年3月11日月曜日
AST変換
   • サービスプロバイダ機能を使って、次の
       ASTTransformationの実装クラスを指
       定。

   • org.gcontracts.ast.ClosureExpressionE
       valuationASTTransformation

   • org.gcontracts.ast.GContractsASTTran
       sformation
13年3月11日月曜日
ClosureExpressionEvaluationASTTransformation



   •   Semantic Analysisフェーズ
       で実行

   •   条件のクロージャ用のクラ
       スコードを生成

13年3月11日月曜日
import org.gcontracts.annotations.*

 @org.gcontracts.annotations.Invariant(value = Rocket$_gc_closure1)
 @org.gcontracts.annotations.Contracted
 public class Rocket extends java.lang.Object {

       private int speed
       final static boolean $GCONTRACTS_ENABLED

     @org.gcontracts.annotations.Requires(value = Rocket
 $_gc_closure2)
     @org.gcontracts.annotations.Ensures(value = Rocket
 $_gc_closure3)
     public void accelerate() {
         ++( speed )
     }

       public boolean isStarted() {
           true
       }

       public int speed() {
           speed
       }
 }
13年3月11日月曜日
final public class Rocket$_gc_closure1 extends
 groovy.lang.Closure<V extends java.lang.Object> {
     // (省略)
     public java.lang.Boolean doCall() {
         java.lang.Boolean $_gc_closure_result = false
         try {
             assert this.speed() >= 0 : null
             $_gc_closure_result = true
         }
         catch
 (org.codehaus.groovy.runtime.powerassert.PowerAssertionError error)
 {
             org.gcontracts.ClassInvariantViolation newError = new
 org.gcontracts.ClassInvariantViolation('<org.gcontracts.annotations
 .Invariant> Rocket nn' + error.getMessage())
             newError.setStackTrace(error.getStackTrace())
         }
         finally {
         }
         return $_gc_closure_result
     }
     // (省略)
 }

13年3月11日月曜日
final public class Rocket$_gc_closure2 extends
groovy.lang.Closure<V extends java.lang.Object> {
    // (省略)

    public java.lang.Boolean doCall() {
        java.lang.Boolean $_gc_closure_result = false
        try {
            assert this.isStarted() : null
            $_gc_closure_result = true
        }
        catch
(org.codehaus.groovy.runtime.powerassert.PowerAssertionError error) {
            org.gcontracts.PreconditionViolation newError = new
org.gcontracts.PreconditionViolation('<org.gcontracts.annotations.Req
uires> Rocket.void accelerate() nn' + error.getMessage())
            newError.setStackTrace(error.getStackTrace())
        }
        finally {
        }
        return $_gc_closure_result
    }

      // (省略)
}
13年3月11日月曜日
final public class Rocket$_gc_closure3
extends groovy.lang.Closure<V extends java.lang.Object> {
    // (省略)

    public java.lang.Boolean doCall(java.util.Map old) {
        java.lang.Boolean $_gc_closure_result = false
        try {
            assert old .speed < speed : null
            $_gc_closure_result = true
        }
        catch
(org.codehaus.groovy.runtime.powerassert.PowerAssertionError error) {
            org.gcontracts.PostconditionViolation newError = new
org.gcontracts.PostconditionViolation('<org.gcontracts.annotations.En
sures> Rocket.void accelerate() nn' + error.getMessage())
            newError.setStackTrace(error.getStackTrace())
        }
        finally {
        }
        return $_gc_closure_result
    }

      // (省略)
}
13年3月11日月曜日
GContractsASTTransformation

   •   Instruction Selectionフェ
       ーズで実行

   •   条件の実行コード生成し、
       コンストラクタやメソッド
       に追加する
13年3月11日月曜日
@org.gcontracts.annotations.Invariant(value = Rocket$_gc_closure1)
@org.gcontracts.annotations.Contracted
public class Rocket extends java.lang.Object {

      private int speed
      final static boolean $GCONTRACTS_ENABLED

      public Rocket() {
          this.invariant_Rocket()
      }




13年3月11日月曜日
@org.gcontracts.annotations.Requires(value = Rocket$_gc_closure2)
      @org.gcontracts.annotations.Ensures(value = Rocket$_gc_closure3)
      public void accelerate() {
          // 準備:実行前の状態を保持
              java.util.Map old = null
              if ( $GCONTRACTS_ENABLED ) {
                  old = this.$_gc_computeOldVariables()
              } else {
              }




13年3月11日月曜日
if ( $GCONTRACTS_ENABLED ) {
            try {
                if
(org.gcontracts.generation.ContractExecutionTracker.track('Rocket', 'void
accelerate()', 'precondition', false)) {
                    java.lang.Boolean $_gc_result = false
                    org.gcontracts.ViolationTracker.init()
                    $_gc_result = new Rocket$_gc_closure2(this,
this).doCall()
                    if (!( $_gc_result ) &&
org.gcontracts.ViolationTracker.violationsOccured()) {
                        try {
                            org.gcontracts.ViolationTracker.rethrowFirst()
                        }
                        finally {
                            org.gcontracts.ViolationTracker.deinit()
                        }
                    }
                }
            }
            finally {

org.gcontracts.generation.ContractExecutionTracker.clear('Rocket', 'void
accelerate()', 'precondition', false)
            }
        }
        ++( speed )

13年3月11日月曜日
// 事後条件
       if ( $GCONTRACTS_ENABLED ) {
            if (!( old .speed < speed )) {
                try {
                    assert old .speed < speed : null
                }
                catch
(org.codehaus.groovy.runtime.powerassert.PowerAssertionError error) {
                    org.gcontracts.PostconditionViolation newError =
new
org.gcontracts.PostconditionViolation('<org.gcontracts.annotations.En
sures> Rocket.void accelerate() nn' + error.getMessage())
                    newError.setStackTrace(error.getStackTrace())
                    throw newError
                }
                finally {
                }
            }
        }
        // 不変条件
              this.invariant_Rocket()
      }


13年3月11日月曜日
public boolean isStarted() {
          java.lang.Object $_gc_result = true
          this.invariant_Rocket()
          return $_gc_result
      }

      public int speed() {
          java.lang.Object $_gc_result = speed
          this.invariant_Rocket()
          return $_gc_result
      }




13年3月11日月曜日
protected java.util.Map $_gc_computeOldVariables() {
          java.lang.Integer $old$speed = speed
          java.util.Map old = ['speed': $old$speed ]
          return old
      }




13年3月11日月曜日
protected void invariant_Rocket() {
        if ( $GCONTRACTS_ENABLED ) {
            try {
                if
(org.gcontracts.generation.ContractExecutionTracker.track('Rocket',
'void invariant_Rocket()', 'invariant', false)) {
                    java.lang.Boolean $_gc_result = false
                    org.gcontracts.ViolationTracker.init()
                    $_gc_result = new Rocket$_gc_closure1(this,
this).doCall()
                    if (!( $_gc_result ) &&
org.gcontracts.ViolationTracker.violationsOccured()) {
                        try {

org.gcontracts.ViolationTracker.rethrowFirst()
                        }
                        finally {
                            org.gcontracts.ViolationTracker.deinit()
                        }
                    }
                }
            }
            finally {

org.gcontracts.generation.ContractExecutionTracker.clear('Rocket',
13年3月11日月曜日
$GCONTRACTS_ENABLED

   •   メソッドの呼び出しごとに条
       件が評価されるのは遅い
   •   $GCONTRACTS_ENABLED
       で実行を制御する
   •    -ea,-daVMパラメータで指定
13年3月11日月曜日
3 09, 2013 4:56:21 午後 org.codehaus.groovy.runtime.StackTraceUtils
sanitize
WARNING: Sanitizing stacktrace:
Assertion failed:

assert 1 == 2
         |
         false

! at
org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.
java:399)
! at
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(Script
BytecodeAdapter.java:655)
! at A.process(ConsoleScript30:22)




13年3月11日月曜日
Exception thrown
3 09, 2013 4:50:36 午後 org.codehaus.groovy.runtime.StackTraceUtils
sanitize
WARNING: Sanitizing stacktrace:
org.gcontracts.PostconditionViolation:
<org.gcontracts.annotations.Ensures> Rocket.void accelerate()

old.speed < speed
|   |      | |
|   10     | 9
|          false
[speed:10]
! at
org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.
java:399)
! at
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(Script
BytecodeAdapter.java:655)
! at Rocket.accelerate(ConsoleScript29:8)




13年3月11日月曜日
4.まとめ
              Add-up



13年3月11日月曜日
まとめ
   •     原本を読んでね。

   • 使ってみてね。




13年3月11日月曜日
エヴァンジェリスト
     活動

13年3月11日月曜日
私大好き


13年3月11日月曜日
13年3月11日月曜日
@bleisさん大好き


13年3月11日月曜日
13年3月11日月曜日
ご清聴ありがとうござ
     いました。


13年3月11日月曜日

More Related Content

What's hot

C#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + ClooC#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + Clooaokomoriuta
 
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ckIndy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ckUehara Junji
 
GroovyServ concept, how to use and outline.
GroovyServ concept, how to use and outline.GroovyServ concept, how to use and outline.
GroovyServ concept, how to use and outline.Uehara Junji
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309Nobuhiro Sue
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGParsfumokmm
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1Uehara Junji
 
Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Uehara Junji
 
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118Uehara Junji
 
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersAbout GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersShota TAMURA
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programmingtakesako
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Yuichi Sakuraba
 
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」Tsuyoshi Yamamoto
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にYoshifumi Kawai
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~JustSystems Corporation
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?ogawatti
 

What's hot (20)

C#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + ClooC#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + Cloo
 
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ckIndy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
 
GroovyServ concept, how to use and outline.
GroovyServ concept, how to use and outline.GroovyServ concept, how to use and outline.
GroovyServ concept, how to use and outline.
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1
 
Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)
 
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118
 
About Jobs
About JobsAbout Jobs
About Jobs
 
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersAbout GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginners
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
Openresty
OpenrestyOpenresty
Openresty
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
 
Iocage
IocageIocage
Iocage
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?
 

Viewers also liked

Groovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したりGroovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したりTakahiro Sugiura
 
ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GParsTakahiro Sugiura
 
Closures and methodMissing are real
Closures and methodMissing are realClosures and methodMissing are real
Closures and methodMissing are realTakahiro Sugiura
 

Viewers also liked (7)

Goos 001
Goos 001Goos 001
Goos 001
 
Groovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したりGroovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したり
 
ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GPars
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
Vert.x.tari.tari
Vert.x.tari.tariVert.x.tari.tari
Vert.x.tari.tari
 
Closures and methodMissing are real
Closures and methodMissing are realClosures and methodMissing are real
Closures and methodMissing are real
 
GroovyからAnime
GroovyからAnimeGroovyからAnime
GroovyからAnime
 

Similar to GContractsの基礎

大(中)規模Java script開発について
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発についてYuki Tanaka
 
three.js はじめましょ
three.js はじめましょthree.js はじめましょ
three.js はじめましょHiroaki Okubo
 
Power Assert and perl.js
Power Assert and perl.jsPower Assert and perl.js
Power Assert and perl.jsGoro Fuji
 
Webサイト・フロントエンドの高速化とgrunt.jsについて
Webサイト・フロントエンドの高速化とgrunt.jsについてWebサイト・フロントエンドの高速化とgrunt.jsについて
Webサイト・フロントエンドの高速化とgrunt.jsについてTomo Fujita
 
GameKitを使ったBluetoothプログラミング
GameKitを使ったBluetoothプログラミングGameKitを使ったBluetoothプログラミング
GameKitを使ったBluetoothプログラミングtaiko19xx
 
cloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfcloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfKosuke Saigusa
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
Scala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in AndroidScala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in AndroidTaisuke Oe
 
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてLayout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてkimukou_26 Kimukou
 
JDK8で変わるJavaプログラミング
JDK8で変わるJavaプログラミングJDK8で変わるJavaプログラミング
JDK8で変わるJavaプログラミングGo Hayakawa
 
Bitter Sweet Javascript
Bitter Sweet JavascriptBitter Sweet Javascript
Bitter Sweet JavascriptDaichi Hiroki
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...NTT DATA Technology & Innovation
 
Cocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_enCocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_enRicardo Quesada
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
memcached proxy server development and operation
memcached proxy server development and operationmemcached proxy server development and operation
memcached proxy server development and operationTatsuhiko Kubo
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)JPCERT Coordination Center
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfaceKohei KaiGai
 

Similar to GContractsの基礎 (20)

大(中)規模Java script開発について
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発について
 
three.js はじめましょ
three.js はじめましょthree.js はじめましょ
three.js はじめましょ
 
Power Assert and perl.js
Power Assert and perl.jsPower Assert and perl.js
Power Assert and perl.js
 
Webサイト・フロントエンドの高速化とgrunt.jsについて
Webサイト・フロントエンドの高速化とgrunt.jsについてWebサイト・フロントエンドの高速化とgrunt.jsについて
Webサイト・フロントエンドの高速化とgrunt.jsについて
 
GameKitを使ったBluetoothプログラミング
GameKitを使ったBluetoothプログラミングGameKitを使ったBluetoothプログラミング
GameKitを使ったBluetoothプログラミング
 
cloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfcloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdf
 
#crazy-js Quiz
#crazy-js Quiz#crazy-js Quiz
#crazy-js Quiz
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
Scala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in AndroidScala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in Android
 
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてLayout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用について
 
JDK8で変わるJavaプログラミング
JDK8で変わるJavaプログラミングJDK8で変わるJavaプログラミング
JDK8で変わるJavaプログラミング
 
Bitter Sweet Javascript
Bitter Sweet JavascriptBitter Sweet Javascript
Bitter Sweet Javascript
 
Inside Movable Type
Inside Movable TypeInside Movable Type
Inside Movable Type
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
Cocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_enCocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_en
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
memcached proxy server development and operation
memcached proxy server development and operationmemcached proxy server development and operation
memcached proxy server development and operation
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join Interface
 

Recently uploaded

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 

Recently uploaded (10)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

GContractsの基礎

  • 1. GContracts の 基礎 Groovy基礎勉強会 2013/03/09 13年3月11日月曜日
  • 3. 只今、仕事が絶賛 デスマーチ中なので、 内容はグダグダです。 13年3月11日月曜日
  • 5. 詳細は「gdgd妖精s」 でググって。 13年3月11日月曜日
  • 6. お前誰よ • 名前:杉浦孝博 • twitter:@touchez_du_bois • 自称アニメエヴァンジェリスト • 最近はVB6とVB.NETがお友達 13年3月11日月曜日
  • 8. 今回の内容 •契約による設計 • GContractsとは • GContractsの実際 13年3月11日月曜日
  • 9. 1.契約による設計 Design by Contracts 13年3月11日月曜日
  • 10. 契約による設計 • プログラムコードの中にプ ログラムが満たすべき仕様に ついての記述を盛り込む事で 設計の安全性を高める技法 (Wikipediaより)。 13年3月11日月曜日
  • 11. 契約による設計 • Bertrand Meyer氏の提唱 • 詳細はこんな本で 13年3月11日月曜日
  • 12. 契約による設計 • コードの利用者と実装者の 間の契約 • 利用者側が守るべきこと • 実装者が約束すること 13年3月11日月曜日
  • 13. 契約による設計 • 主ロジックとは別に、コー ドとして契約内容を定義 • コード利用の責任範囲を明 確化 13年3月11日月曜日
  • 14. 契約による設計 • 契約の条件 • 事前条件(Precondtion) • 事後条件(Postcondition) • 不変条件(Invariant) 13年3月11日月曜日
  • 15. 契約による設計 • 事前条件 • サブルーチンの開始時に満 たされるべき条件 • 呼び出し側が守ること 13年3月11日月曜日
  • 16. 契約による設計 • 事後条件 • サブルーチンの終了時に保 証されるべき条件 • 実装側が守ること 13年3月11日月曜日
  • 17. 契約による設計 • 不変条件 • 公開している操作の実行後 に常に保証されるべき条件 • 実装側が守ること 13年3月11日月曜日
  • 18. 詳しくは • 原本で 13年3月11日月曜日
  • 19. 詳しくは •• @t_wadaさんの http://www.slideshare.net/t_wada/exception- design-by-contract#btnPrevious 13年3月11日月曜日
  • 20. 2.GContractsとは What s GContracts 13年3月11日月曜日
  • 21. 言語標準な言語 • Eiffel • Bertrand Meyer氏考案 • D言語 13年3月11日月曜日
  • 22. Java • 標準 • assert文 • ライブラリ • Contract4J, cofoja 13年3月11日月曜日
  • 23. Groovy • 標準 • assert文(PowerAssert) • ライブラリ • GContracts 13年3月11日月曜日
  • 24. GContracts • Andre Steingress氏による 契約プログラミング用のラ イブラリ • https://github.com/ andresteingress/ 13年3月11日月曜日
  • 25. GContracts • アノテーションにより満た すべき条件をコード中に記述 • 条件のコード内容は GroovyDocに出力可能 13年3月11日月曜日
  • 26. GContracts • 事前条件 -> @Requires • メソッドに指定 • 事後条件 -> @Ensures • メソッドに指定 • 不変条件 -> @Invariants • クラスに指定 13年3月11日月曜日
  • 27. GContracts • 各条件をクロージャで記述 • 契約に違反した場合、 PowerAssertでエラー出力 13年3月11日月曜日
  • 28. GContracts • @Ensuresのクロージャ内 では、次の値を参照できる • old : メソッド実行前の状 態。Map • 13年3月11日月曜日 result : 実行結果
  • 29. GContracts • 各条件を継承 • 各条件をクラスだけでなく インタフェースにも指定可 13年3月11日月曜日
  • 30. GContracts import org.gcontracts.annotations.* @Invariant({ speed() >= 0 }) class Rocket { int speed = 0 @Requires({ isStarted() }) @Ensures({ old.speed < speed }) void accelerate() { ++speed } boolean isStarted() { true } int speed() { speed } } 13年3月11日月曜日
  • 31. 3.GContractsの実際 Actuals of GContracts 13年3月11日月曜日
  • 32. やってること • 3行で言うと... 13年3月11日月曜日
  • 33. やってること • 3行で言うと... • AST変換で 13年3月11日月曜日
  • 34. やってること • 3行で言うと... • AST変換で • 条件用のコードを 13年3月11日月曜日
  • 35. やってること • 3行で言うと... • AST変換で、 • 条件用のコードを、 • コンストラクタとメソッド に埋め込み 13年3月11日月曜日
  • 36. やってること • 3行で言うと... • AST変換で、 • 条件用のコードを生成、 • コンストラクタとメソッド に埋め込み、 • 実行する。 13年3月11日月曜日
  • 37. AST変換 • Abstract Syntax Tree変換 • 抽象構文木をこねくりまわ す 13年3月11日月曜日
  • 38. AST変換 • サービスプロバイダ機能を使って、次の ASTTransformationの実装クラスを指 定。 • org.gcontracts.ast.ClosureExpressionE valuationASTTransformation • org.gcontracts.ast.GContractsASTTran sformation 13年3月11日月曜日
  • 39. ClosureExpressionEvaluationASTTransformation • Semantic Analysisフェーズ で実行 • 条件のクロージャ用のクラ スコードを生成 13年3月11日月曜日
  • 40. import org.gcontracts.annotations.* @org.gcontracts.annotations.Invariant(value = Rocket$_gc_closure1) @org.gcontracts.annotations.Contracted public class Rocket extends java.lang.Object { private int speed final static boolean $GCONTRACTS_ENABLED @org.gcontracts.annotations.Requires(value = Rocket $_gc_closure2) @org.gcontracts.annotations.Ensures(value = Rocket $_gc_closure3) public void accelerate() { ++( speed ) } public boolean isStarted() { true } public int speed() { speed } } 13年3月11日月曜日
  • 41. final public class Rocket$_gc_closure1 extends groovy.lang.Closure<V extends java.lang.Object> { // (省略) public java.lang.Boolean doCall() { java.lang.Boolean $_gc_closure_result = false try { assert this.speed() >= 0 : null $_gc_closure_result = true } catch (org.codehaus.groovy.runtime.powerassert.PowerAssertionError error) { org.gcontracts.ClassInvariantViolation newError = new org.gcontracts.ClassInvariantViolation('<org.gcontracts.annotations .Invariant> Rocket nn' + error.getMessage()) newError.setStackTrace(error.getStackTrace()) } finally { } return $_gc_closure_result } // (省略) } 13年3月11日月曜日
  • 42. final public class Rocket$_gc_closure2 extends groovy.lang.Closure<V extends java.lang.Object> { // (省略) public java.lang.Boolean doCall() { java.lang.Boolean $_gc_closure_result = false try { assert this.isStarted() : null $_gc_closure_result = true } catch (org.codehaus.groovy.runtime.powerassert.PowerAssertionError error) { org.gcontracts.PreconditionViolation newError = new org.gcontracts.PreconditionViolation('<org.gcontracts.annotations.Req uires> Rocket.void accelerate() nn' + error.getMessage()) newError.setStackTrace(error.getStackTrace()) } finally { } return $_gc_closure_result } // (省略) } 13年3月11日月曜日
  • 43. final public class Rocket$_gc_closure3 extends groovy.lang.Closure<V extends java.lang.Object> { // (省略) public java.lang.Boolean doCall(java.util.Map old) { java.lang.Boolean $_gc_closure_result = false try { assert old .speed < speed : null $_gc_closure_result = true } catch (org.codehaus.groovy.runtime.powerassert.PowerAssertionError error) { org.gcontracts.PostconditionViolation newError = new org.gcontracts.PostconditionViolation('<org.gcontracts.annotations.En sures> Rocket.void accelerate() nn' + error.getMessage()) newError.setStackTrace(error.getStackTrace()) } finally { } return $_gc_closure_result } // (省略) } 13年3月11日月曜日
  • 44. GContractsASTTransformation • Instruction Selectionフェ ーズで実行 • 条件の実行コード生成し、 コンストラクタやメソッド に追加する 13年3月11日月曜日
  • 45. @org.gcontracts.annotations.Invariant(value = Rocket$_gc_closure1) @org.gcontracts.annotations.Contracted public class Rocket extends java.lang.Object { private int speed final static boolean $GCONTRACTS_ENABLED public Rocket() { this.invariant_Rocket() } 13年3月11日月曜日
  • 46. @org.gcontracts.annotations.Requires(value = Rocket$_gc_closure2) @org.gcontracts.annotations.Ensures(value = Rocket$_gc_closure3) public void accelerate() { // 準備:実行前の状態を保持 java.util.Map old = null if ( $GCONTRACTS_ENABLED ) { old = this.$_gc_computeOldVariables() } else { } 13年3月11日月曜日
  • 47. if ( $GCONTRACTS_ENABLED ) { try { if (org.gcontracts.generation.ContractExecutionTracker.track('Rocket', 'void accelerate()', 'precondition', false)) { java.lang.Boolean $_gc_result = false org.gcontracts.ViolationTracker.init() $_gc_result = new Rocket$_gc_closure2(this, this).doCall() if (!( $_gc_result ) && org.gcontracts.ViolationTracker.violationsOccured()) { try { org.gcontracts.ViolationTracker.rethrowFirst() } finally { org.gcontracts.ViolationTracker.deinit() } } } } finally { org.gcontracts.generation.ContractExecutionTracker.clear('Rocket', 'void accelerate()', 'precondition', false) } } ++( speed ) 13年3月11日月曜日
  • 48. // 事後条件 if ( $GCONTRACTS_ENABLED ) { if (!( old .speed < speed )) { try { assert old .speed < speed : null } catch (org.codehaus.groovy.runtime.powerassert.PowerAssertionError error) { org.gcontracts.PostconditionViolation newError = new org.gcontracts.PostconditionViolation('<org.gcontracts.annotations.En sures> Rocket.void accelerate() nn' + error.getMessage()) newError.setStackTrace(error.getStackTrace()) throw newError } finally { } } } // 不変条件 this.invariant_Rocket() } 13年3月11日月曜日
  • 49. public boolean isStarted() { java.lang.Object $_gc_result = true this.invariant_Rocket() return $_gc_result } public int speed() { java.lang.Object $_gc_result = speed this.invariant_Rocket() return $_gc_result } 13年3月11日月曜日
  • 50. protected java.util.Map $_gc_computeOldVariables() { java.lang.Integer $old$speed = speed java.util.Map old = ['speed': $old$speed ] return old } 13年3月11日月曜日
  • 51. protected void invariant_Rocket() { if ( $GCONTRACTS_ENABLED ) { try { if (org.gcontracts.generation.ContractExecutionTracker.track('Rocket', 'void invariant_Rocket()', 'invariant', false)) { java.lang.Boolean $_gc_result = false org.gcontracts.ViolationTracker.init() $_gc_result = new Rocket$_gc_closure1(this, this).doCall() if (!( $_gc_result ) && org.gcontracts.ViolationTracker.violationsOccured()) { try { org.gcontracts.ViolationTracker.rethrowFirst() } finally { org.gcontracts.ViolationTracker.deinit() } } } } finally { org.gcontracts.generation.ContractExecutionTracker.clear('Rocket', 13年3月11日月曜日
  • 52. $GCONTRACTS_ENABLED • メソッドの呼び出しごとに条 件が評価されるのは遅い • $GCONTRACTS_ENABLED で実行を制御する • -ea,-daVMパラメータで指定 13年3月11日月曜日
  • 53. 3 09, 2013 4:56:21 午後 org.codehaus.groovy.runtime.StackTraceUtils sanitize WARNING: Sanitizing stacktrace: Assertion failed: assert 1 == 2 | false ! at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper. java:399) ! at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(Script BytecodeAdapter.java:655) ! at A.process(ConsoleScript30:22) 13年3月11日月曜日
  • 54. Exception thrown 3 09, 2013 4:50:36 午後 org.codehaus.groovy.runtime.StackTraceUtils sanitize WARNING: Sanitizing stacktrace: org.gcontracts.PostconditionViolation: <org.gcontracts.annotations.Ensures> Rocket.void accelerate() old.speed < speed | | | | | 10 | 9 | false [speed:10] ! at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper. java:399) ! at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(Script BytecodeAdapter.java:655) ! at Rocket.accelerate(ConsoleScript29:8) 13年3月11日月曜日
  • 55. 4.まとめ Add-up 13年3月11日月曜日
  • 56. まとめ • 原本を読んでね。 • 使ってみてね。 13年3月11日月曜日
  • 57. エヴァンジェリスト 活動 13年3月11日月曜日
  • 62. ご清聴ありがとうござ いました。 13年3月11日月曜日