SlideShare a Scribd company logo
1 of 89
Download to read offline
Mark
     Proctor
    Project Lead




●
  The SkyNet funding bill is passed.
●
  The system goes online on August 4th, 1997.
●
  Human decisions are removed from strategic defense.
●
  SkyNet begins to learn at a geometric rate.
●
  It becomes self-aware at 2:14am Eastern time, August
29th
●
  In a panic, they try to pull the plug.
●
  And, Skynet fights back
Introduction




Drools     Drools     Drools     Drools
Expert      Flow      Fusion     Guvnor


    Business Logic integration Platform



                                          2
Drools Expert
Learn by Example
Classes

                                                       C a s h f lo w
     A cco u n t
                                                  D a te d a te
lo n g a c c o u n t N o
                                                  d o u b le a m o u n t
d o u b le b a la n c e
                                                  in t t y p e
                                                  lo n g a c c o u n t N o




                           A c c o u n t in g P e r io d

                           D a te s ta r t
                           D a te e n d




                                                                             5
Creating Views with
                           Triggers
        date          amount            type       accountNo     AccountingPeriod
 12-Jan-07                      100 CREDIT     1                       start               end
 2-Feb-07                       200 DEBIT      1                     01-Jan-07          31-Mar-07
 18-May-07                       50 CREDIT     1
 9-Mar-07                        75 CREDIT     1                 Account
                                                                    accountNo             balance
                                                                 1                  0
increase balance for AccountPeriod Credits                 decrease balance for AccountPeriod Debits

select * from Account acc,                                     select * from Account acc,
     Cashflow cf, AccountPeriod ap                                  Cashflow cf, AccountPeriod ap
where acc.accountNo == cf.accountNo and                        where acc.accountNo == cf.accountNo and
      cf.type == CREDIT                                              cf.type == DEBIT
      cf.date >= ap.start and                                        cf.date >= ap.start and
      cf.date <= ap.end                                              cf.date <= ap.end

  trigger : acc.balance += cf.amount                            trigger : acc.balance -= cf.amount

 CashFlow                                                      CashFlow
        date           amount          type
                                                                      date          amount            type
 12-Jan-07                      100 CREDIT
                                                               2-Feb-07                       200 DEBIT
 9-Mar-07                        75 CREDIT


 Account
    accountNo              balance
 1                   -25
                                                                                                             6
What is a Rule

                                     salience     <int>
Quotes on Rule names are
                                     agenda-group <string>
optional if the rule name has
                                     no-loop      <boolean>
no spaces.
                                     auto-focus  <boolean>
                                     duration     <long>
                                     ....
   • rule “<name>”
         <attribute> <value>
         when
             <LHS>
         then
             <RHS>         RHS can be any valid java.
                           Or MVEL. Other languages
     end                   could be added.




                                                              7
Imperative vs Declarative
             Methods that must                  specific passing of
             be called directly                 instances


        •         public void helloMark(Person person) {
Rules can never     if ( person.getName().equals( “mark” ) {
be called directly        System.out.println( “Hello Mark” );
                      }               Specific instances
                  }                   cannot be passed.

        •   rule “Hello Mark”                     LHS
                when
                    Person( name == “mark” )
                then
                    System.out.println( “Hello Mark” );
            end
                                     RHS




                                                                      8
What is a Pattern
                            P a tte rn

   O b je c t T y p e               F ie ld C o n s t r a in t

                        F ie ld N a m e                      R e s t r ic t io n


                                                      E v a lu a t o r      V a lu e



S h o w e r( te m p e r a tu re = = “ h o t” )

                                                                                       9
Bringing it Together
select * from Account acc,
       Cashflow cf, AccountPeriod ap
where acc.accountNo == cf.accountNo and
        cf.type == CREDIT
        cf.date >= ap.start and
        cf.date <= ap.end            Pattern
  trigger : acc.balance += cf.amount
 Pattern Binding

                                               field Binding

rule “increase balance for AccountPeriod Credits”
       when                                     Variable Restriction
            ap : AccountPeriod()
            acc : Account( $accountNo : accountNo )
            CashFlow( type == CREDIT,
                              accountNo == $accountNo,
Literal Restriction           date >= ap.start && <= ap.end,
                              $ammount : ammount )
       then
            acc.balance += $amount;             Multri Restriction - Variable
end                                             Restriction


                                                  field Binding
        Consequence (RHS)
                                                                                10
Rules as a “view”
         date       amount           type       accountNo   AccountingPeriod
  12-Jan-07                  100 CREDIT     1                     start               end
  2-Feb-07                   200 DEBIT      1                   01-Jan-07          31-Mar-07
  18-May-07                   50 CREDIT     1
  9-Mar-07                    75 CREDIT     1               Account
                                                               accountNo             balance
                                                            1                  0
rule “increase balance for AccountPeriod    rule “decrease balance for AccountPeriod
       Credits”                                    Debits”
  when                                        when
    ap : AccountPeriod()                        ap : AccountPeriod()
    acc : Account( $accountNo : accountNo )     acc : Account( $accountNo : accountNo )

    CashFlow( type == CREDIT,                     CashFlow( type == DEBIT,
                accountNo == $accountNo,                      accountNo == $accountNo,
                date >= ap.start && <= ap.end,                date >= ap.start && <= ap.end,
                $ammount : ammount )                          $ammount : ammount )
  then                                          then
    acc.balance += $amount;                       acc.balance -= $amount;
end CashFlow                                  end   CashFlow
           date         amount        type                 date         amount         type
    12-Jan-07                  100 CREDIT           2-Feb-07                   200 DEBIT
    9-Mar-07                    75 CREDIT

    Account
       accountNo           balance
    1                -25
                                                                                               11
Patterns in more details

CashFlow( type == “credit” )

$ap : AccountPeriod()
CashFlow( date >= $ap.start )


$ap : AccountPeriod()
CashFlow( date >= $ap.start && <= $ap.end )


$ap : AccountPeriod()
CashFlow( type == “credit”,
           date >= $ap.start && <= $ap.end )


                                               12
More Pattern Examples

Person( $age : age )
Person( age == ( $age + 1 ) )



Person( $age : age )
Person( eval( age == $age + 1 ) )



Person( $age1 : age )
Person( $age2 : age )
eval( $age2 == $age1 + 1 )




                                    13
More Pattern
           Examples
Person(age > 30 && < 40 || hair == “black”)

Person(age > 30 && < 40 || hair in (“black”, “brown”) )


Person( (age > 30 && < 40 && hair == “black”)
         ||
        (age > 50 && hair == “grey”) )


Person(pets contain $rover )


Person(pets[’rover’].type == “dog”)


Person(pets[0].type == “dog”)
                                                          14
What is a Production Rule
                  System
Codification of
the business                        Repository of
knowledge                           inserted Java
                                    instances

                        Inference
                         Engine

     Production         Pattern              Working
      Memory            Matcher              Memory


        (rules)                                (facts)
                        Agenda
                                         insert
  Rules can change                      update
      on the fly                        retract


                                                         15
Production Rule System
                               Approximated by SQL and
                               Views
T a b le s   A cco unt              A c c o u n t in g P e r io d              C a s h f lo w




                                                                                           O b je c t T y p e s   A cco unt              A c c o u n t in g P e r io d              C a s h f lo w
V ie w s                 v ie w 1                                   v ie w 2




V ie w
                                      m a in v ie w                                        R u le s                           r u le 1                                   r u le 2




                                                                                           agenda
                                                                                                                                              agenda




                                                                                                                                                                                                     16
Conflict Resolution with
             Salience
                      Salience

rule “Print blance for AccountPeriod”
      salience -50
   when
      ap : AccountPeriod()
      acc : Account( )
   then
      System.out.println( acc.accountNo + “ : “ acc.balance );
end




Agenda
     1            increase balance
     2            decrease balance               arbitrary
     3            increase balance
     4            print balance




                                                                 17
RuleFlow
           rule “increase balance for AccountPeriod Credits”
                ruleflow-group “calculation”
              when
                 ap : AccountPeriod()
                 acc : Account( $accountNo : accountNo )
                 CashFlow( type == CREDIT,
                            accountNo == $accountNo,
                            date >= ap.start && <= ap.end,
                            $ammount : ammount )
              then
                 acc.balance += $amount;
           end

                             ruleflow-group

           rule “Print blance for AccountPeriod”
                ruleflow-group “report”
              when
                 ap : AccountPeriod()
                 acc : Account( )
              then
                 System.out.println( acc.accountNo + “ : “ acc.balance );
           end




                                                                            18
Two Phase System
                                       Determine
                                     possible rules to
                                           fire
                                                               Agenda Evaluation




Working Memory Action




                                                              Rule
      insert                modify
                                                             Found             Select
                                                 Fire Rule
                                                                             Rule to Fire


                  retract




                                                                               No Rule
                                                                                Found




                                                                                   exit



                                                                                            19
Conditional
 Elements
From CE for Expressions

not Bus( color = “red” )


exists Bus( color = “red” )


forall ( $bus : Bus( color == “red” ) )


forall ( $bus : Bus( floors == 2 )
               Bus( this == $bus, color == “red” ) )




                                                       21
From CE
for Expressions
From CE for Expressions

Using 'from' to reason over the nested list


rule “Find all the pets for a given owner”
when
   $owner : Person( name == “mark” )
             Pet( name == “rover” ) from $owner.pets




                                                       23
From CE for Expressions

'from' can work on any expression, not just a nested
field on a bound variable.


rule “Find People for given zip code”
when
   $zipCode : ZipCode()
   Person( ) from $hbn.getNamedQuery(“Find People”)
                        .setParameters( [ “zipCode” : $zipCode ] )
                        .list()

      Hibernate session




                                                                     24
Collect CE
Collect CE
rule "accumulate"
when
   $list : List( intValue > 100 )
             from collect( Bus( color == "red" ) )
then
   print "red buses “ + $list;
end




                                                     26
Accumulate CE
Accumulate CE
rule "accumulate"
when
   $sum : Number( intValue > 100 )
           from accumulate( Bus( color == "red", $t :
takings )
                            init( sum = 0 ),
                            action( sum += $t ),
                            result( sum ) )
then
   print "sum is “ + $sum;
end




                                                        28
Accumulate CE
rule "accumulate"
when
   $sum : Number( intValue > 100 )
           from accumulate( Bus( color == "red", $t :
takings )                                sum( $t ) )
then
   print "sum is “ + $sum;
end




                                                        29
Accumulate CE
Patterns and CE's can be chained with 'from'

rule "collect"
when
   $zipCode : ZipCode()
   $sum : Number( intValue > 100 )
          from accumulate( Bus( color == "red", $t : takings )
                             from $hbn.getNamedQuery(“Find
Buses”)

.setParameters( [ “zipCode” :
                          $zipCode ] )
                                         .list(),
                           sum( $t ) )
then                                                         30
Timers
Calendars
Timers
 rule “name”
    timer 1m30s
 when
    $l : Light( status == “on” )
 then
   SendEmail( “turn the light off” )



rule “name”
   timer (int: 0 1m30)
when
   $l : Light( status == “on” )
then
  SendEmail( “turn the light off” )


                                       32
Timers
Field Name Mandatory?   Allowed Values     Allowed Special Characters
Seconds      YES        0-59               ,-*/
Minutes      YES        0-59               ,-*/
Hours        YES        0-23               ,-*/
Day of month YES        1-31               ,-*?/LW
Month        YES        1-12 or JAN-DEC     ,-*/
Day of week YES         1-7 or SUN-SAT          ,-*?/L#
Year         NO         empty, 1970-2099    ,-*/



rule “name”
  timer ( cron: 0 0/15 * * * * )
when
   $l : Light( status == “on” )
then
  sendEmail( “turn the light off” )




                                                                        33
Calendars
rule "weekdays are high priority"
  calendars "weekday"
  timer (int:0 1h)
when
   Alarm()
then
   send( "priority high - we have an alarm” );
end

rule "weekend are low priority"
  calendars "weekend"
  timer (int:0 4h)
when
   Alarm()
then
   send( "priority low - we have an alarm” );
end

                                                 34
Truth Maintenance
Inference
TMS and Inference
rule "Issue Child Bus Pass"             Couples the logic
when
 $p : Person( age < 16 )
then
 insert(new ChildBusPass( $p ) );
end
rule "Issue Adult Bus Pass"
                                    What happens when the Child
when                                      stops being 16?
 $p : Person( age >= 16 )
then
 insert(new AdultBusPass( $p ) );
end


                                                                  36
TMS and Inference
   Bad
    ●   Monolithic
    ●   Leaky
    ●   Brittle integrity - manual maintenance




                                                 37
TMS and Inference
 A rule “logically” inserts an object
 When the rule is no longer true, the object is
  retracted.
when                                  de-couples the logic

 $p : Person( age < 16 )
then
  logicalInsert( new IsChild( $p ) )
end
                                 Maintains the truth by
when                             automatically retracting
 $p : Person( age >= 16 )
then
  logicalInsert( new IsAdult( $p ) )
end

                                                             38
TMS and Inference
rule "Issue Child Bus Pass"
when
 $p : Person( )
       IsChild( person =$p )
then
 logicalInsert(new ChildBusPass( $p ) );
end
rule "Issue Adult Bus Pass"   The truth maintenance cascades
when
 $p : Person( age >= 16 )
       IsAdult( person =$p )
then
 logicalInsert(new AdultBusPass( $p ) );
end
                                                               39
TMS and Inference
rule "Issue Child Bus Pass"
when
 $p : Person( )
       not( ChildBusPass( person == $p ) )
then
   requestChildBusPass( $p );
                                  The truth maintenance cascades
End




                                                                   40
TMS and Inference
   Good
    ●   De-couple knowledge responsibilities
    ●   Encapsulate knowledge
    ●   Provide semantic abstractions for those encapsulation
    ●   Integrity robustness – truth maintenance




                                                                41
Tooling
Guided Editor




                43
Interactive Debugging




                        44
Decision Tables




                  45
DSLs




       46
DSLs




       47
Rule Flow




            48
Drools Fusion
Scalability

Rule engines do not scale for CEP. They have a single point of insertion
and are single threaded, CEP has concurrent streams of events.



       session.insert( event ) ;   $c : Custumer( type == “VIP” )
                                   BuyOrderEvent( customer == $c )

          Single Point of
              entry
                                         Patterns, evaluate
                                       facts sequentially in a
                                           single thread.




                                                                       50
Scalability
                                        So lets allow multiple
                                       named entry points for
                                           those streams


EntryPoint entryPoint = session.getEntryPoint( “Home Broker Stream” );
entryPoint.insert( event ) ;


   So now we can insert                    When not specified uses
     different streams                     the “default” entry-point
        concurrently

   $c : Custumer( type == “VIP )
   BuyOrderEvent( customer == $c ) from entry-point “Home Broker Stream”




                                        Patterns can now optional
                                        specify their entry-point.


                                                                           51
Automatic Life-Cycle
                Management
All Fact life-cycles must be managed by the user, so
retractions are manual.

 declare StockTick              Just use the declare statement to
  @role( event )                declare a type as an event and it
 end                           will be retracted when it is no longer
                                              needed


declare StockTick
 @role( event )
 @timestamp( timestampAttr )

 companySymbol : String
 stockPrice : double                 The declare statement can also
 timestampAttr : long                 specify an internal model, that
end                                external objects/xml/csv map on to.
                                     We support Smooks and JAXB



                                                                         52
Operators
Rule engines do not have rich enough set of temporal comparison
operators                                     BackAckEvent must occur
                                                                between 1s and 10s 'after'
  $c : Custumer( type == “VIP )                                      BuyOrderEvent
  $oe : BuyOrderEvent( customer == $c )
             from entry-point “Home Broker Stream”
        BuyAckEvent( relatedEvent == $oe.id, this after[1s, 10s] $oe )
             from entry-point “Stock Trader Stream”



 The Full set of Operators are supported
          ●   coincides         ●   overlaps             ●   starts
          ●   before            ●   overlappedby         ●   startedby
          ●   after             ●   during               ●   finishes
          ●   meets             ●   includes             ●   finishedby
          ●   metby



                                                                                             53
Operators




            54
Operators

$c : Custumer( type == “VIP )
$oe : BuyOrderEvent( customer == $c )
            from entry-point “Home Broker Stream”
      not BuyAckEvent( relatedEvent == $oe.id, this after[1s, 10s] $oe )
            from entry-point “Stock Trader Stream”



             Existing Drools 'not'
          Conditional Elements can
           be used to detect non-
            occurrence of events




                                                                           55
Sliding time windows
Rule engines react to events happening now, there is no
temporal understanding of changes over time.

 StockTicker( symbol == “RHAT” ) over window:time( 5s )                     5s
 StockTicker( symbol == “RHAT” ) over window:length( 1000 )
                                                                         1000 tickers




  That isn't much without the ability to deal with aggregations, rules
  engines suck.




                                                                                        56
Aggregations
Rule Engines do not deal with aggregations
                                                                    Over 5 seconds

$n : Number( intValue > 100 )
       from accumulate( $s : StockTicker( symbol == “RHAT” ) over window:time( 5s ),
                         average( $s.price ) )


                                Aggregate ticker price
 The pattern 'Number'            for RHAT over last 5
  reasons 'from' the                   seconds
  accumulate result




$n : accumulate( $s : StockTicker( symbol == “RHAT” ) over window:time( 5s ),
                 average( $s.price ) > 100 )


  We can use some sugar to reduce
             verbosity
                                                                                       57
Drools Flow
Drools Flow

 A workflow engine combining processes and
 Integration       rules
    ●   From loose coupling (decision services)
    ●   To advance integration (process rules)
   Unification
    ●   Rules and processes are different types of business
        knowledge assets
    ●   Infrastructure
         ●   Timers/Schedulers
         ●   Testing
         ●   Communication/Services
    ●   Tooling
         ●   IDE
         ●   repository, management
         ●   Auditing
         ●                                                    59
Truth Maintenance
Inference
Rules and
                        processes
generic




                              ?
                                           Decision
                                           Services
SCOPE




                Process
specific




                 Rules




           tightly coupled    COUPLING   loosely coupled
                                                           61
Business Logic Lifecycle




                           62
Example




          63
RuleFlowGroup
Workflow can control my rules?




                                 64
RuleFlowGroup



    Rule Flow Group




                      65
RuleFlowGroup




                66
Constraints




              Java code constraint




                                     67
Constraints
Rules can control my workflow?


                         LHS “when”
                        Rule Constraint




                                          68
Example


   Business decisions are externalized using a decision
    service




                      rule
               rule Decision1
                 when Decision1
                 rule Decision1
                   // conditions
                   when when
                 then // conditions
                           //
                   // actions
                   then
               end    conditions
                      // actions
                 end     then
                         //
                     actions
                     end                                   69
Example


   What if there is a lot of business logic like this?




                    rule Decision1       rule Decision1
           rule       when Decision1
                      rule                 when Decision1
                                           rule                  rule             rule
    rule Decision1      // conditions        // conditionsrule Decision1    rule Decision1
                        when Decision1
      when Decision1 rule  rule              when Decision1
                                                rule
      rule Decision1 then // conditions rule rule conditions Decision1 when Decision1
                    rule Decision1            Decision1
                                           then //          when Decision1
                                                            rule              rule Decision1
        // conditionswhen when
                      rule Decision1
                                                when          // conditions     // conditions
        when when       then // conditionswhen Decision1 when when
                            Decision1
                        // actions         rule actions
                                             // Decision1
                                             then // conditions                 when when
      then // conditions// conditions end // conditionsthen // conditionsthen // conditions
                // end when when
        // actions
        then
                           // actions
                           then              when when
                                                // actions
                                                then
                      then // conditions then // conditions// actions
                                                              then
                                                                      //                //
                                                                                // actions
                                                                                then
    end               end
           conditions// actions  //
                              // actions   end        //
                                                   // actions    conditions       conditions
           // actions   then                 // actions end
                                             then                // actions end   // actions
      end     then end end actions end end actions end
                           conditions
                           //                   conditions
                                                //                  then      end    then
                // end         then        end      then              //                //
          actions             //                  //         actions           actions
          end             actions             actions        end               end
                          end                 end

                                                                                                70
Flow of Control




       Process
       Engine




       Rules
       Engine



                  71
Inversion of Control




              Process
              Engine

     Agenda




              Rules
              Engine




                        72
Self monitoring and
              adaptive
declare ProcessStartedEvent
  @role( event )
end


rule "Number of process instances above threshold" when
  Number( nbProcesses : intValue > 1000 )
       from accumulate(
            e: ProcessStartedEvent(
  processInstance.processId ==
"com.sample.order.OrderProcess" )
                   over window:size(1h),
             count(e) )
then
  System.err.println( "WARNING: Nb of order processes in
the last                      hour > 1000: " +
nbProcesses );
                                                           73
Domain Specific Processes




                            74
Domain Specific Processes




                            75
Integrated debug and audit




                             76
Unified API
Definitions
    Runtime
          Language
Definitions
jBPM
File file = new File (“.....”); // file to XML process definition

ProcessDefinition processDefinition =
   ProcessDefinition.parseXmlString( IoUtils.FileToString( file ) );

ProcessInstance processInstance =
   new ProcessInstance(processDefinition);
Jess
Rete engine = new Rete();

FileReader file = new FileReader("myfile.clp");

Jesp parser = new Jesp(file, engine);

parser.parse(false);


Esper

EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();

EPStatement countStmt = admin.createEPL( "...." );

countStmt.start();
                                                                               78
Definitions
Drools Flow

KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider();

kbuilder.addResource(
   ResourceFactory.newClassPathResource( “myflow.drf”,
   ResourceType.DRF );

If ( kbuilder.hasErrors() ) {
    log.error( kbuilder.hasErrors().toString() );
}

KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbase.getKnowledgePackages() );




                                                                             79
Definitions

Drools Expert

KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider();

kbuilder.addResource(
   ResourceFactory.newClassPathResource( “myrules.drl”,
   ResourceType.DRL );

If ( kbuilder.hasErrors() ) {
    log.error( kbuilder.hasErrors().toString() );
}

KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbase.getKnowledgePackages() );




                                                                             80
Drools Integration Deployment Descriptors

<change-set>
   <add>
     <resource source='classpath:myapp/data/myflow.drf' type='DRF' />
     <resource source='http:myapp/data/myrules.drl' type='DRL' />
     <resource source='classpath:data/IntegrationExampleTest.xls'
                 type="DTABLE">
          <decisiontable-conf input-type="XLS"
                                worksheet-name="Tables_2" />
     </resource>
   <add>
</change-set>


KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider();
kbuilder.addResource(
   ResourceFactory.newFileResource( “changeset.xml”,
                                     ResourceType.ChangeSet );




                                                                             81
Unified Event Model
Mixins
Interface Markers
Stateful Knowledge
Session




                     85
Knowledge Runtime




                    86
Coming in 5.1
   BPMN2 (80% of Workflow)
   Integration
    ●   OSGi ready
    ●   Spring
    ●   Camel
   Seamless Remoting
   Simulation/Testing
   New Rete Algorithm “true modify”




                                       87
Spring + camel




from("direct:test-with-session").
to("drools:sm/ksession1?dataFormat=drools-xstream");


                                                       88
Questions?
                        • Dave Bowman: All right, HAL; I'll
                          go in through the emergency
                          airlock.
                        • HAL: Without your space helmet,
                          Dave, you're going to find that
                          rather difficult.
                        • Dave Bowman: HAL, I won't argue
                          with you anymore! Open the
                          doors!
                        • HAL: Dave, this conversation can
                          serve no purpose anymore.
                          Goodbye.
Joshua: Greetings, Professor Falken.
Stephen Falken: Hello, Joshua.
Joshua: A strange game. The only
winning move is not to play. How
about a nice game of chess?


                                                              89

More Related Content

What's hot

Introduction To Django
Introduction To DjangoIntroduction To Django
Introduction To DjangoJay Graves
 
Kotlin coroutine - behind the scenes
Kotlin coroutine - behind the scenesKotlin coroutine - behind the scenes
Kotlin coroutine - behind the scenesAnh Vu
 
exception handling in cpp
exception handling in cppexception handling in cpp
exception handling in cppgourav kottawar
 
Jetpack Compose - Android’s modern toolkit for building native UI
Jetpack Compose - Android’s modern toolkit for building native UIJetpack Compose - Android’s modern toolkit for building native UI
Jetpack Compose - Android’s modern toolkit for building native UIGilang Ramadhan
 
Golang basics for Java developers - Part 1
Golang basics for Java developers - Part 1Golang basics for Java developers - Part 1
Golang basics for Java developers - Part 1Robert Stern
 
Asynchronous programming
Asynchronous programmingAsynchronous programming
Asynchronous programmingFilip Ekberg
 
Angular 8
Angular 8 Angular 8
Angular 8 Sunil OS
 
SwiftUI For Production | try! Swift 2019
SwiftUI For Production | try! Swift 2019SwiftUI For Production | try! Swift 2019
SwiftUI For Production | try! Swift 2019Lea Marolt Sonnenschein
 
Multithreading on iOS
Multithreading on iOSMultithreading on iOS
Multithreading on iOSMake School
 
Web development with django - Basics Presentation
Web development with django - Basics PresentationWeb development with django - Basics Presentation
Web development with django - Basics PresentationShrinath Shenoy
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projectsIgnacio Martín
 
Exception handling
Exception handlingException handling
Exception handlingIblesoft
 
Adding powerful ext js components to react apps
Adding powerful ext js components to react appsAdding powerful ext js components to react apps
Adding powerful ext js components to react appsSandeep Adwankar
 
Use Node.js to create a REST API
Use Node.js to create a REST APIUse Node.js to create a REST API
Use Node.js to create a REST APIFabien Vauchelles
 

What's hot (20)

Flask – Python
Flask – PythonFlask – Python
Flask – Python
 
Introduction To Django
Introduction To DjangoIntroduction To Django
Introduction To Django
 
Introducing Kogito
Introducing KogitoIntroducing Kogito
Introducing Kogito
 
Kotlin coroutine - behind the scenes
Kotlin coroutine - behind the scenesKotlin coroutine - behind the scenes
Kotlin coroutine - behind the scenes
 
exception handling in cpp
exception handling in cppexception handling in cpp
exception handling in cpp
 
Jetpack Compose - Android’s modern toolkit for building native UI
Jetpack Compose - Android’s modern toolkit for building native UIJetpack Compose - Android’s modern toolkit for building native UI
Jetpack Compose - Android’s modern toolkit for building native UI
 
Flask
FlaskFlask
Flask
 
Golang basics for Java developers - Part 1
Golang basics for Java developers - Part 1Golang basics for Java developers - Part 1
Golang basics for Java developers - Part 1
 
Asynchronous programming
Asynchronous programmingAsynchronous programming
Asynchronous programming
 
Introduction to JavaFX
Introduction to JavaFXIntroduction to JavaFX
Introduction to JavaFX
 
Angular 8
Angular 8 Angular 8
Angular 8
 
SwiftUI For Production | try! Swift 2019
SwiftUI For Production | try! Swift 2019SwiftUI For Production | try! Swift 2019
SwiftUI For Production | try! Swift 2019
 
Multithreading on iOS
Multithreading on iOSMultithreading on iOS
Multithreading on iOS
 
Web development with django - Basics Presentation
Web development with django - Basics PresentationWeb development with django - Basics Presentation
Web development with django - Basics Presentation
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
 
JavaScript Event Loop
JavaScript Event LoopJavaScript Event Loop
JavaScript Event Loop
 
Exception handling
Exception handlingException handling
Exception handling
 
Adding powerful ext js components to react apps
Adding powerful ext js components to react appsAdding powerful ext js components to react apps
Adding powerful ext js components to react apps
 
Use Node.js to create a REST API
Use Node.js to create a REST APIUse Node.js to create a REST API
Use Node.js to create a REST API
 
Introduction to Java
Introduction to JavaIntroduction to Java
Introduction to Java
 

Similar to Lille2010markp

Drools Expert and Fusion Intro : London 2012
Drools Expert and Fusion Intro  : London 2012Drools Expert and Fusion Intro  : London 2012
Drools Expert and Fusion Intro : London 2012Mark Proctor
 
JUDCon India 2012 Drools Expert
JUDCon  India 2012 Drools ExpertJUDCon  India 2012 Drools Expert
JUDCon India 2012 Drools ExpertMark Proctor
 
Improving application design with a rich domain model (springone 2007)
Improving application design with a rich domain model (springone 2007)Improving application design with a rich domain model (springone 2007)
Improving application design with a rich domain model (springone 2007)Chris Richardson
 
What's new in Drools 6 - London JBUG 2013
What's new in Drools 6 - London JBUG 2013What's new in Drools 6 - London JBUG 2013
What's new in Drools 6 - London JBUG 2013Mark Proctor
 
Hybrid rule engines (rulesfest 2010)
Hybrid rule engines (rulesfest 2010)Hybrid rule engines (rulesfest 2010)
Hybrid rule engines (rulesfest 2010)Geoffrey De Smet
 
Proses Pencatatan Transaksi
Proses Pencatatan TransaksiProses Pencatatan Transaksi
Proses Pencatatan TransaksiFair Nurfachrizi
 
Aslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec BddAslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec Bdddeimos
 
Drools and BRMS 6.0 (Dublin Aug 2013)
Drools and BRMS 6.0 (Dublin Aug 2013)Drools and BRMS 6.0 (Dublin Aug 2013)
Drools and BRMS 6.0 (Dublin Aug 2013)Mark Proctor
 
The Actuary and FAS 163
The Actuary and FAS 163The Actuary and FAS 163
The Actuary and FAS 163kylemrotek
 
Dr Strangler and Mr Hype - Strangler pattern w praktyce
Dr Strangler and Mr Hype - Strangler pattern w praktyceDr Strangler and Mr Hype - Strangler pattern w praktyce
Dr Strangler and Mr Hype - Strangler pattern w praktyceMichał Kurzeja
 
Accounting_Accruals_and_Deferrals_ppt.pdf
Accounting_Accruals_and_Deferrals_ppt.pdfAccounting_Accruals_and_Deferrals_ppt.pdf
Accounting_Accruals_and_Deferrals_ppt.pdfMaiSaleh20
 
Drools 6.0 (CamelOne 2013)
Drools 6.0 (CamelOne 2013)Drools 6.0 (CamelOne 2013)
Drools 6.0 (CamelOne 2013)Mark Proctor
 
Lecture5 mba
Lecture5 mbaLecture5 mba
Lecture5 mbagldazo
 
Serverless Functions and Vue.js
Serverless Functions and Vue.jsServerless Functions and Vue.js
Serverless Functions and Vue.jsSarah Drasner
 
Tsi Green Flag Notebook Web Presentation Version 29 Apr09
Tsi Green Flag Notebook Web Presentation Version 29 Apr09Tsi Green Flag Notebook Web Presentation Version 29 Apr09
Tsi Green Flag Notebook Web Presentation Version 29 Apr09Peter_Glassman
 

Similar to Lille2010markp (20)

Drools Expert and Fusion Intro : London 2012
Drools Expert and Fusion Intro  : London 2012Drools Expert and Fusion Intro  : London 2012
Drools Expert and Fusion Intro : London 2012
 
JUDCon India 2012 Drools Expert
JUDCon  India 2012 Drools ExpertJUDCon  India 2012 Drools Expert
JUDCon India 2012 Drools Expert
 
Improving application design with a rich domain model (springone 2007)
Improving application design with a rich domain model (springone 2007)Improving application design with a rich domain model (springone 2007)
Improving application design with a rich domain model (springone 2007)
 
What's new in Drools 6 - London JBUG 2013
What's new in Drools 6 - London JBUG 2013What's new in Drools 6 - London JBUG 2013
What's new in Drools 6 - London JBUG 2013
 
Hybrid rule engines (rulesfest 2010)
Hybrid rule engines (rulesfest 2010)Hybrid rule engines (rulesfest 2010)
Hybrid rule engines (rulesfest 2010)
 
Accounting Mechanics Processing Accounting Information
Accounting Mechanics Processing Accounting InformationAccounting Mechanics Processing Accounting Information
Accounting Mechanics Processing Accounting Information
 
Proses Pencatatan Transaksi
Proses Pencatatan TransaksiProses Pencatatan Transaksi
Proses Pencatatan Transaksi
 
Chapter 4
Chapter 4Chapter 4
Chapter 4
 
Aslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec BddAslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec Bdd
 
Drools and BRMS 6.0 (Dublin Aug 2013)
Drools and BRMS 6.0 (Dublin Aug 2013)Drools and BRMS 6.0 (Dublin Aug 2013)
Drools and BRMS 6.0 (Dublin Aug 2013)
 
The Actuary and FAS 163
The Actuary and FAS 163The Actuary and FAS 163
The Actuary and FAS 163
 
SQL Server 2008 Portfolio
SQL Server 2008 PortfolioSQL Server 2008 Portfolio
SQL Server 2008 Portfolio
 
Dr Strangler and Mr Hype - Strangler pattern w praktyce
Dr Strangler and Mr Hype - Strangler pattern w praktyceDr Strangler and Mr Hype - Strangler pattern w praktyce
Dr Strangler and Mr Hype - Strangler pattern w praktyce
 
Actor Model
Actor ModelActor Model
Actor Model
 
Accounting_Accruals_and_Deferrals_ppt.pdf
Accounting_Accruals_and_Deferrals_ppt.pdfAccounting_Accruals_and_Deferrals_ppt.pdf
Accounting_Accruals_and_Deferrals_ppt.pdf
 
Drools 6.0 (CamelOne 2013)
Drools 6.0 (CamelOne 2013)Drools 6.0 (CamelOne 2013)
Drools 6.0 (CamelOne 2013)
 
Lecture5 mba
Lecture5 mbaLecture5 mba
Lecture5 mba
 
Serverless Functions and Vue.js
Serverless Functions and Vue.jsServerless Functions and Vue.js
Serverless Functions and Vue.js
 
Tsi Green Flag Notebook Web Presentation Version 29 Apr09
Tsi Green Flag Notebook Web Presentation Version 29 Apr09Tsi Green Flag Notebook Web Presentation Version 29 Apr09
Tsi Green Flag Notebook Web Presentation Version 29 Apr09
 
Financial ratio
Financial ratioFinancial ratio
Financial ratio
 

More from Ch'ti JUG

Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaCh'ti JUG
 
Bonita Open Solution
Bonita Open SolutionBonita Open Solution
Bonita Open SolutionCh'ti JUG
 
Adobe flash platform java
Adobe flash platform javaAdobe flash platform java
Adobe flash platform javaCh'ti JUG
 
MC3SI Chti Jug Soiree Agilite
MC3SI Chti Jug Soiree AgiliteMC3SI Chti Jug Soiree Agilite
MC3SI Chti Jug Soiree AgiliteCh'ti JUG
 
Chti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projets
Chti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projetsChti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projets
Chti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projetsCh'ti JUG
 
GlassFish ESB Ch'ti JUG
GlassFish ESB Ch'ti JUGGlassFish ESB Ch'ti JUG
GlassFish ESB Ch'ti JUGCh'ti JUG
 
Drools Planner Chtijug 2010
Drools Planner Chtijug 2010Drools Planner Chtijug 2010
Drools Planner Chtijug 2010Ch'ti JUG
 
Terracotta Ch'ti Jug
Terracotta Ch'ti JugTerracotta Ch'ti Jug
Terracotta Ch'ti JugCh'ti JUG
 

More from Ch'ti JUG (10)

Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambda
 
Spring 3.1
Spring 3.1Spring 3.1
Spring 3.1
 
Bonita Open Solution
Bonita Open SolutionBonita Open Solution
Bonita Open Solution
 
Adobe flash platform java
Adobe flash platform javaAdobe flash platform java
Adobe flash platform java
 
MC3SI Chti Jug Soiree Agilite
MC3SI Chti Jug Soiree AgiliteMC3SI Chti Jug Soiree Agilite
MC3SI Chti Jug Soiree Agilite
 
Chti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projets
Chti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projetsChti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projets
Chti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projets
 
GlassFish ESB Ch'ti JUG
GlassFish ESB Ch'ti JUGGlassFish ESB Ch'ti JUG
GlassFish ESB Ch'ti JUG
 
Drools Planner Chtijug 2010
Drools Planner Chtijug 2010Drools Planner Chtijug 2010
Drools Planner Chtijug 2010
 
HTML5 ADEO
HTML5 ADEOHTML5 ADEO
HTML5 ADEO
 
Terracotta Ch'ti Jug
Terracotta Ch'ti JugTerracotta Ch'ti Jug
Terracotta Ch'ti Jug
 

Recently uploaded

Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 

Recently uploaded (20)

Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 

Lille2010markp

  • 1. Mark Proctor Project Lead ● The SkyNet funding bill is passed. ● The system goes online on August 4th, 1997. ● Human decisions are removed from strategic defense. ● SkyNet begins to learn at a geometric rate. ● It becomes self-aware at 2:14am Eastern time, August 29th ● In a panic, they try to pull the plug. ● And, Skynet fights back
  • 2. Introduction Drools Drools Drools Drools Expert Flow Fusion Guvnor Business Logic integration Platform 2
  • 5. Classes C a s h f lo w A cco u n t D a te d a te lo n g a c c o u n t N o d o u b le a m o u n t d o u b le b a la n c e in t t y p e lo n g a c c o u n t N o A c c o u n t in g P e r io d D a te s ta r t D a te e n d 5
  • 6. Creating Views with Triggers date amount type accountNo AccountingPeriod 12-Jan-07 100 CREDIT 1 start end 2-Feb-07 200 DEBIT 1 01-Jan-07 31-Mar-07 18-May-07 50 CREDIT 1 9-Mar-07 75 CREDIT 1 Account accountNo balance 1 0 increase balance for AccountPeriod Credits decrease balance for AccountPeriod Debits select * from Account acc, select * from Account acc, Cashflow cf, AccountPeriod ap Cashflow cf, AccountPeriod ap where acc.accountNo == cf.accountNo and where acc.accountNo == cf.accountNo and cf.type == CREDIT cf.type == DEBIT cf.date >= ap.start and cf.date >= ap.start and cf.date <= ap.end cf.date <= ap.end trigger : acc.balance += cf.amount trigger : acc.balance -= cf.amount CashFlow CashFlow date amount type date amount type 12-Jan-07 100 CREDIT 2-Feb-07 200 DEBIT 9-Mar-07 75 CREDIT Account accountNo balance 1 -25 6
  • 7. What is a Rule salience <int> Quotes on Rule names are agenda-group <string> optional if the rule name has no-loop <boolean> no spaces. auto-focus <boolean> duration <long> .... • rule “<name>”     <attribute> <value>     when         <LHS>     then         <RHS> RHS can be any valid java. Or MVEL. Other languages end could be added. 7
  • 8. Imperative vs Declarative Methods that must specific passing of be called directly instances • public void helloMark(Person person) { Rules can never     if ( person.getName().equals( “mark” ) { be called directly        System.out.println( “Hello Mark” );     } Specific instances } cannot be passed. • rule “Hello Mark” LHS     when         Person( name == “mark” )     then         System.out.println( “Hello Mark” ); end RHS 8
  • 9. What is a Pattern P a tte rn O b je c t T y p e F ie ld C o n s t r a in t F ie ld N a m e R e s t r ic t io n E v a lu a t o r V a lu e S h o w e r( te m p e r a tu re = = “ h o t” ) 9
  • 10. Bringing it Together select * from Account acc, Cashflow cf, AccountPeriod ap where acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end Pattern trigger : acc.balance += cf.amount Pattern Binding field Binding rule “increase balance for AccountPeriod Credits” when Variable Restriction ap : AccountPeriod() acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, accountNo == $accountNo, Literal Restriction date >= ap.start && <= ap.end, $ammount : ammount ) then acc.balance += $amount; Multri Restriction - Variable end Restriction field Binding Consequence (RHS) 10
  • 11. Rules as a “view” date amount type accountNo AccountingPeriod 12-Jan-07 100 CREDIT 1 start end 2-Feb-07 200 DEBIT 1 01-Jan-07 31-Mar-07 18-May-07 50 CREDIT 1 9-Mar-07 75 CREDIT 1 Account accountNo balance 1 0 rule “increase balance for AccountPeriod rule “decrease balance for AccountPeriod Credits” Debits” when when ap : AccountPeriod() ap : AccountPeriod() acc : Account( $accountNo : accountNo ) acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, CashFlow( type == DEBIT, accountNo == $accountNo, accountNo == $accountNo, date >= ap.start && <= ap.end, date >= ap.start && <= ap.end, $ammount : ammount ) $ammount : ammount ) then then acc.balance += $amount; acc.balance -= $amount; end CashFlow end CashFlow date amount type date amount type 12-Jan-07 100 CREDIT 2-Feb-07 200 DEBIT 9-Mar-07 75 CREDIT Account accountNo balance 1 -25 11
  • 12. Patterns in more details CashFlow( type == “credit” ) $ap : AccountPeriod() CashFlow( date >= $ap.start ) $ap : AccountPeriod() CashFlow( date >= $ap.start && <= $ap.end ) $ap : AccountPeriod() CashFlow( type == “credit”, date >= $ap.start && <= $ap.end ) 12
  • 13. More Pattern Examples Person( $age : age ) Person( age == ( $age + 1 ) ) Person( $age : age ) Person( eval( age == $age + 1 ) ) Person( $age1 : age ) Person( $age2 : age ) eval( $age2 == $age1 + 1 ) 13
  • 14. More Pattern Examples Person(age > 30 && < 40 || hair == “black”) Person(age > 30 && < 40 || hair in (“black”, “brown”) ) Person( (age > 30 && < 40 && hair == “black”) || (age > 50 && hair == “grey”) ) Person(pets contain $rover ) Person(pets[’rover’].type == “dog”) Person(pets[0].type == “dog”) 14
  • 15. What is a Production Rule System Codification of the business Repository of knowledge inserted Java instances Inference Engine Production Pattern Working Memory Matcher Memory (rules) (facts) Agenda insert Rules can change update on the fly retract 15
  • 16. Production Rule System Approximated by SQL and Views T a b le s A cco unt A c c o u n t in g P e r io d C a s h f lo w O b je c t T y p e s A cco unt A c c o u n t in g P e r io d C a s h f lo w V ie w s v ie w 1 v ie w 2 V ie w m a in v ie w R u le s r u le 1 r u le 2 agenda agenda 16
  • 17. Conflict Resolution with Salience Salience rule “Print blance for AccountPeriod” salience -50 when ap : AccountPeriod() acc : Account( ) then System.out.println( acc.accountNo + “ : “ acc.balance ); end Agenda 1 increase balance 2 decrease balance arbitrary 3 increase balance 4 print balance 17
  • 18. RuleFlow rule “increase balance for AccountPeriod Credits” ruleflow-group “calculation” when ap : AccountPeriod() acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, accountNo == $accountNo, date >= ap.start && <= ap.end, $ammount : ammount ) then acc.balance += $amount; end ruleflow-group rule “Print blance for AccountPeriod” ruleflow-group “report” when ap : AccountPeriod() acc : Account( ) then System.out.println( acc.accountNo + “ : “ acc.balance ); end 18
  • 19. Two Phase System Determine possible rules to fire Agenda Evaluation Working Memory Action Rule insert modify Found Select Fire Rule Rule to Fire retract No Rule Found exit 19
  • 21. From CE for Expressions not Bus( color = “red” ) exists Bus( color = “red” ) forall ( $bus : Bus( color == “red” ) ) forall ( $bus : Bus( floors == 2 ) Bus( this == $bus, color == “red” ) ) 21
  • 23. From CE for Expressions Using 'from' to reason over the nested list rule “Find all the pets for a given owner” when $owner : Person( name == “mark” ) Pet( name == “rover” ) from $owner.pets 23
  • 24. From CE for Expressions 'from' can work on any expression, not just a nested field on a bound variable. rule “Find People for given zip code” when $zipCode : ZipCode() Person( ) from $hbn.getNamedQuery(“Find People”) .setParameters( [ “zipCode” : $zipCode ] ) .list() Hibernate session 24
  • 26. Collect CE rule "accumulate" when $list : List( intValue > 100 ) from collect( Bus( color == "red" ) ) then print "red buses “ + $list; end 26
  • 28. Accumulate CE rule "accumulate" when $sum : Number( intValue > 100 ) from accumulate( Bus( color == "red", $t : takings ) init( sum = 0 ), action( sum += $t ), result( sum ) ) then print "sum is “ + $sum; end 28
  • 29. Accumulate CE rule "accumulate" when $sum : Number( intValue > 100 ) from accumulate( Bus( color == "red", $t : takings ) sum( $t ) ) then print "sum is “ + $sum; end 29
  • 30. Accumulate CE Patterns and CE's can be chained with 'from' rule "collect" when $zipCode : ZipCode() $sum : Number( intValue > 100 ) from accumulate( Bus( color == "red", $t : takings ) from $hbn.getNamedQuery(“Find Buses”) .setParameters( [ “zipCode” : $zipCode ] ) .list(), sum( $t ) ) then 30
  • 32. Timers rule “name” timer 1m30s when $l : Light( status == “on” ) then SendEmail( “turn the light off” ) rule “name” timer (int: 0 1m30) when $l : Light( status == “on” ) then SendEmail( “turn the light off” ) 32
  • 33. Timers Field Name Mandatory? Allowed Values Allowed Special Characters Seconds YES 0-59 ,-*/ Minutes YES 0-59 ,-*/ Hours YES 0-23 ,-*/ Day of month YES 1-31 ,-*?/LW Month YES 1-12 or JAN-DEC ,-*/ Day of week YES 1-7 or SUN-SAT ,-*?/L# Year NO empty, 1970-2099 ,-*/ rule “name” timer ( cron: 0 0/15 * * * * ) when $l : Light( status == “on” ) then sendEmail( “turn the light off” ) 33
  • 34. Calendars rule "weekdays are high priority" calendars "weekday" timer (int:0 1h) when Alarm() then send( "priority high - we have an alarm” ); end rule "weekend are low priority" calendars "weekend" timer (int:0 4h) when Alarm() then send( "priority low - we have an alarm” ); end 34
  • 36. TMS and Inference rule "Issue Child Bus Pass" Couples the logic when $p : Person( age < 16 ) then insert(new ChildBusPass( $p ) ); end rule "Issue Adult Bus Pass" What happens when the Child when stops being 16? $p : Person( age >= 16 ) then insert(new AdultBusPass( $p ) ); end 36
  • 37. TMS and Inference  Bad ● Monolithic ● Leaky ● Brittle integrity - manual maintenance 37
  • 38. TMS and Inference  A rule “logically” inserts an object  When the rule is no longer true, the object is retracted. when de-couples the logic $p : Person( age < 16 ) then logicalInsert( new IsChild( $p ) ) end Maintains the truth by when automatically retracting $p : Person( age >= 16 ) then logicalInsert( new IsAdult( $p ) ) end 38
  • 39. TMS and Inference rule "Issue Child Bus Pass" when $p : Person( ) IsChild( person =$p ) then logicalInsert(new ChildBusPass( $p ) ); end rule "Issue Adult Bus Pass" The truth maintenance cascades when $p : Person( age >= 16 ) IsAdult( person =$p ) then logicalInsert(new AdultBusPass( $p ) ); end 39
  • 40. TMS and Inference rule "Issue Child Bus Pass" when $p : Person( ) not( ChildBusPass( person == $p ) ) then requestChildBusPass( $p ); The truth maintenance cascades End 40
  • 41. TMS and Inference  Good ● De-couple knowledge responsibilities ● Encapsulate knowledge ● Provide semantic abstractions for those encapsulation ● Integrity robustness – truth maintenance 41
  • 46. DSLs 46
  • 47. DSLs 47
  • 48. Rule Flow 48
  • 50. Scalability Rule engines do not scale for CEP. They have a single point of insertion and are single threaded, CEP has concurrent streams of events. session.insert( event ) ; $c : Custumer( type == “VIP” ) BuyOrderEvent( customer == $c ) Single Point of entry Patterns, evaluate facts sequentially in a single thread. 50
  • 51. Scalability So lets allow multiple named entry points for those streams EntryPoint entryPoint = session.getEntryPoint( “Home Broker Stream” ); entryPoint.insert( event ) ; So now we can insert When not specified uses different streams the “default” entry-point concurrently $c : Custumer( type == “VIP ) BuyOrderEvent( customer == $c ) from entry-point “Home Broker Stream” Patterns can now optional specify their entry-point. 51
  • 52. Automatic Life-Cycle Management All Fact life-cycles must be managed by the user, so retractions are manual. declare StockTick Just use the declare statement to @role( event ) declare a type as an event and it end will be retracted when it is no longer needed declare StockTick @role( event ) @timestamp( timestampAttr ) companySymbol : String stockPrice : double The declare statement can also timestampAttr : long specify an internal model, that end external objects/xml/csv map on to. We support Smooks and JAXB 52
  • 53. Operators Rule engines do not have rich enough set of temporal comparison operators BackAckEvent must occur between 1s and 10s 'after' $c : Custumer( type == “VIP ) BuyOrderEvent $oe : BuyOrderEvent( customer == $c ) from entry-point “Home Broker Stream” BuyAckEvent( relatedEvent == $oe.id, this after[1s, 10s] $oe ) from entry-point “Stock Trader Stream” The Full set of Operators are supported ● coincides ● overlaps ● starts ● before ● overlappedby ● startedby ● after ● during ● finishes ● meets ● includes ● finishedby ● metby 53
  • 54. Operators 54
  • 55. Operators $c : Custumer( type == “VIP ) $oe : BuyOrderEvent( customer == $c ) from entry-point “Home Broker Stream” not BuyAckEvent( relatedEvent == $oe.id, this after[1s, 10s] $oe ) from entry-point “Stock Trader Stream” Existing Drools 'not' Conditional Elements can be used to detect non- occurrence of events 55
  • 56. Sliding time windows Rule engines react to events happening now, there is no temporal understanding of changes over time. StockTicker( symbol == “RHAT” ) over window:time( 5s ) 5s StockTicker( symbol == “RHAT” ) over window:length( 1000 ) 1000 tickers That isn't much without the ability to deal with aggregations, rules engines suck. 56
  • 57. Aggregations Rule Engines do not deal with aggregations Over 5 seconds $n : Number( intValue > 100 ) from accumulate( $s : StockTicker( symbol == “RHAT” ) over window:time( 5s ), average( $s.price ) ) Aggregate ticker price The pattern 'Number' for RHAT over last 5 reasons 'from' the seconds accumulate result $n : accumulate( $s : StockTicker( symbol == “RHAT” ) over window:time( 5s ), average( $s.price ) > 100 ) We can use some sugar to reduce verbosity 57
  • 59. Drools Flow A workflow engine combining processes and  Integration rules ● From loose coupling (decision services) ● To advance integration (process rules)  Unification ● Rules and processes are different types of business knowledge assets ● Infrastructure ● Timers/Schedulers ● Testing ● Communication/Services ● Tooling ● IDE ● repository, management ● Auditing ● 59
  • 61. Rules and processes generic ? Decision Services SCOPE Process specific Rules tightly coupled COUPLING loosely coupled 61
  • 63. Example 63
  • 65. RuleFlowGroup Rule Flow Group 65
  • 67. Constraints Java code constraint 67
  • 68. Constraints Rules can control my workflow? LHS “when” Rule Constraint 68
  • 69. Example  Business decisions are externalized using a decision service rule rule Decision1 when Decision1 rule Decision1 // conditions when when then // conditions // // actions then end conditions // actions end then // actions end 69
  • 70. Example  What if there is a lot of business logic like this? rule Decision1 rule Decision1 rule when Decision1 rule when Decision1 rule rule rule rule Decision1 // conditions // conditionsrule Decision1 rule Decision1 when Decision1 when Decision1 rule rule when Decision1 rule rule Decision1 then // conditions rule rule conditions Decision1 when Decision1 rule Decision1 Decision1 then // when Decision1 rule rule Decision1 // conditionswhen when rule Decision1 when // conditions // conditions when when then // conditionswhen Decision1 when when Decision1 // actions rule actions // Decision1 then // conditions when when then // conditions// conditions end // conditionsthen // conditionsthen // conditions // end when when // actions then // actions then when when // actions then then // conditions then // conditions// actions then // // // actions then end end conditions// actions // // actions end // // actions conditions conditions // actions then // actions end then // actions end // actions end then end end actions end end actions end conditions // conditions // then end then // end then end then // // actions // // actions actions end actions actions end end end end 70
  • 71. Flow of Control Process Engine Rules Engine 71
  • 72. Inversion of Control Process Engine Agenda Rules Engine 72
  • 73. Self monitoring and adaptive declare ProcessStartedEvent @role( event ) end rule "Number of process instances above threshold" when Number( nbProcesses : intValue > 1000 ) from accumulate( e: ProcessStartedEvent( processInstance.processId == "com.sample.order.OrderProcess" ) over window:size(1h), count(e) ) then System.err.println( "WARNING: Nb of order processes in the last hour > 1000: " + nbProcesses ); 73
  • 77. Unified API Definitions Runtime Language
  • 78. Definitions jBPM File file = new File (“.....”); // file to XML process definition ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( IoUtils.FileToString( file ) ); ProcessInstance processInstance = new ProcessInstance(processDefinition); Jess Rete engine = new Rete(); FileReader file = new FileReader("myfile.clp"); Jesp parser = new Jesp(file, engine); parser.parse(false); Esper EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(); EPStatement countStmt = admin.createEPL( "...." ); countStmt.start(); 78
  • 79. Definitions Drools Flow KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider(); kbuilder.addResource( ResourceFactory.newClassPathResource( “myflow.drf”, ResourceType.DRF ); If ( kbuilder.hasErrors() ) { log.error( kbuilder.hasErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kbase.getKnowledgePackages() ); 79
  • 80. Definitions Drools Expert KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider(); kbuilder.addResource( ResourceFactory.newClassPathResource( “myrules.drl”, ResourceType.DRL ); If ( kbuilder.hasErrors() ) { log.error( kbuilder.hasErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kbase.getKnowledgePackages() ); 80
  • 81. Drools Integration Deployment Descriptors <change-set> <add> <resource source='classpath:myapp/data/myflow.drf' type='DRF' /> <resource source='http:myapp/data/myrules.drl' type='DRL' /> <resource source='classpath:data/IntegrationExampleTest.xls' type="DTABLE"> <decisiontable-conf input-type="XLS" worksheet-name="Tables_2" /> </resource> <add> </change-set> KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider(); kbuilder.addResource( ResourceFactory.newFileResource( “changeset.xml”, ResourceType.ChangeSet ); 81
  • 83.
  • 87. Coming in 5.1  BPMN2 (80% of Workflow)  Integration ● OSGi ready ● Spring ● Camel  Seamless Remoting  Simulation/Testing  New Rete Algorithm “true modify” 87
  • 89. Questions? • Dave Bowman: All right, HAL; I'll go in through the emergency airlock. • HAL: Without your space helmet, Dave, you're going to find that rather difficult. • Dave Bowman: HAL, I won't argue with you anymore! Open the doors! • HAL: Dave, this conversation can serve no purpose anymore. Goodbye. Joshua: Greetings, Professor Falken. Stephen Falken: Hello, Joshua. Joshua: A strange game. The only winning move is not to play. How about a nice game of chess? 89