SlideShare a Scribd company logo
1 of 66
Eureka! The Padawan's Guide to
    the Dark Side of XPages
          #uklugEureka




                         Presenter: Paul Withers
                         Company: Intec Systems Ltd
                         Twitter: @paulswithers

                         Presenter: Tim Tripcony
                         Company: GBS
                         Twitter @timtripcony
Agenda

• Introduction
• XPages Server Processing
• JVM and the NSF
• Memory Management
• JSF Lifecycle: Event Model
• JSF Lifecycle: Performance Smackdown
• Summary
• Bonus Material (*B1)
Paul Withers

• Senior Domino Developer, Intec Systems Ltd
• XPages Developer since 8.5.0
• IBM Champion
• Co-Host of The XCast
• XPages Extension Library Book
Tim Tripcony
• XMage, GBS

• IBM Champion

• XPages Extension Library Book
Why This Session?

• Nothing in life is to be feared, it is only to be understood. Now
  is the time to understand more, so that we may fear less.
                                                   Marie Curie

• A matter that becomes clear ceases to concern us.
                                              Friedrich Nietzsche

• Furious activity is no substitute for understanding.
                                                    H.H. Williams

• No. I am your father.
                                                      Darth Vader
Ex pectations

• You should:
  • Know what XPages are
  • Know that XPages run on a Domino server
  • Know Computed Field, Edit Box and Repeat controls
• You don't need to:
  • Know Java
  • Have a thorough knowledge of JSF
  • Have knowledge of dataContexts, managed beans,
     PhaseListeners or VariableResolvers
Agenda

• Introduction
• XPages Server Processing
• JVM and the NSF
• Memory Management
• JSF Lifecycle: Event Model
• JSF Lifecycle: Performance Smackdown
• Summary
• Bonus Material
XPages and Domino Server




           Java Virtual Machine



          XSP Command Manager


           Domino HTTP Server
When An XPage Is Served...(*B3)

• Can HTTP Server resolve the URL to an NSF?
  • HTTP 404 Error

• Does user have access to NSF?
  • HTTP Authentication Page

• Can HTTP Server find resource in the NSF?
  • HTTP 404 Error

• Does the signer have access to run XPages? (*B3)
  • HTTP 403 Error

• Are there SSJS errors?
  • XSP Command Manager takes over (*B1-B2)
• Return XPage
Agenda

• Introduction
• XPages Server Processing
• JVM and the NSF
• Memory Management
• JSF Lifecycle: Event Model
• JSF Lifecycle: Performance Smackdown
• Summary
• Bonus Material
Java Virtual Machine Means...

• Each NSF is a separate Java application
• applicationScope, sessionScope etc. is per NSF (*B4)
  • Browser session, NOT user session
  • Setting sessionScope in Db1.nsf does NOT set
     sessionScope in Db2.nsf

• sessionScope is ONLY within JVM – not cleared by HTTP
  logout
JAVA Virtual Machine

• XPages → Java classes → Java bytecode (*B5-B7)
• Each control is a Java class
• Extensions are pre-packaged Java classes
  • Define properties (what can be customised)
  • Define renderers (what is printed)

• SSJS code is String passed to Java method
• Java code prints HTML to browser
XPages Languages

• Literal values
  • Strings, booleans etc.
• SSJS
  • #{javascript:document1.getItemValueString(“FirstName”)}
• Expression Language (*B8)
  • #{VARIABLE.PROPERTY}
  • #{document1.FirstName}
  • #{database.title} = #{javascript:database.getTitle()}
• Custom
  • Any of the above combined
  • “Database title is #{database.title}”
Language Hypotheses

• Fewer controls should perform better (*B9)
• Literal strings should perform best. Expression Language
  should perform better than Server-Side JavaScript

• Combining languages should allow:
  • Fewer controls to be used
  • Literal Strings and Expression Language to be used
      instead of SSJS
  •   So better performance
Agenda

• Introduction
• XPages Server Processing
• JVM and the NSF
• Memory Management
• JSF Lifecycle: Event Model
• JSF Lifecycle: Performance Smackdown
• Summary
• Bonus Material
JSF and Serialization

• HTTP is state-less
• JSF keeps state-full server representation of UI
  (component tree or view)

• Objects stored in component tree must be serializable
  (persist between requests)
  • Domino objects recycled after each request
  • Datasources are recycle-safe

• Objects stored in ViewScope etc must also be
  serializable
Server-Side Map
Persistence options

• Component tree (map of XPage on server)
  • either held in memory of JVM
  • or serialized to disk

• xsp.persistence.XXX properties
• See persistence tab of new xsp.properties editor
• Package Explorer → WebContentWEB-
  INFxsp.properties
Persistence Tab
Demo
Persistence Summary

• Keep Pages in Memory
  • Remembering, remembering, remembering
  • xsp.persistence.mode=basic
  • Best for...quick retrieval, few users

• Keep Pages on Disk
  • Writing...next? You want it again? Reading
  • xsp.persistence.mode=file
  • Best for...lots of users, but slower retrieval

• Keep Only The Current Page In Memory
  • Remembering, remembering, remembering
  • Oh, new page? Writing...and now
  • Remembering, remembering, remembering
  • xsp.persistence.mode=fileex
  • Best for...lots of users, quick retrieval of current page
Persistence Summary (*B11-13)

• Gzip Persisted Files
  • xsp.persistence.file.gzip (default=false)
  • default=false
  • Writing...next? You want it again? Reading

• Persist Files Asynchronously
  • xsp.persistence.file.async (default=true)
  • Server busy, remembering. Next? (Writing, writing)
• Maximum Pages...
  • xsp.persistence.tree.maxviews (*B10)
  • Remembering, remembering, remembering
  • xsp.persistence.file.maxviews
  • Writing, retrieving, writing, writing
Agenda

• Introduction

• XPages Server Processing

• JVM and the NSF

• Memory Management

• JSF Lifecycle: Event Model
• JSF Lifecycle: Performance Smackdown

• Summary

• Bonus Material
JSF LifeCycle
Six Phases

• Restore View
  • JSF component tree retrieved

• Apply Request Values
  • this.setSubmittedValue(passedValue) run
  • Any event logic run if immediate=“true”

• Process Validation
  • Any converters applied
  • Any validators applied
Six Phases

• Update Model Values
  • this.setValue(this.getSubmittedValue());
  • this.setSubmittedValue(null)

• Invoke Application
  • Any event logic run

• Render Response
  • HTML rendered and state saved
  • Only event that runs during page load
PhaseListener

• Must implement javax.faces.event.PhaseListener
  • Or extend a Java class that implements it
    • ExamplePhaseListener extends AbstractPhaseListener, which
       implements javax.faces.event.PhaseListener

• Allows us to track JSF lifecycle phases
• Java class plus reference in WebContentWEB-
  INFfaces-config.xml
Demo
Basic

• Validation fails
  •   beforeRestoreView
  •   afterRestoreView
  •   beforeApplyRequestValues
  •   afterApplyRequestValues
  •   beforeProcessValidations
  •   beforeRenderResponse
  •   afterRenderResponse

• Event logic not run
No Validation

• Conversion still honoured
  • If failed, skips from ProcessValidations to RenderResponse
  • Event Logic not run

• If no conversion errors, all phases run
• Values passed from submittedValue to value
• Component tree updated
im mediate="true"

• Validation fails
  •   beforeRestoreView
  •   afterRestoreView
  •   beforeApplyRequestValues
  •   afterApplyRequestValues
  •   beforeRenderResponse
  •   afterRenderResponse

• Event logic run in ApplyRequestValues phase
• Component value never goes past submittedValue
• Component tree not updated
Custom Validator (SSJS)

• Runs AFTER Apply Request Values
• Runs BEFORE Update Model Values
  • submittedValue property set
  • value property still NULL (or last stored value)

• Use validator property of control
• Check getSubmittedValue()
• Post error with facesContext.addMessage()
• Abort with this.setValid(false)
Custom Validator (Java)

• Runs at same time as any other validator
• Use xp:validator, child of validators property of control



• validatorId property maps to validator-id in faces-config.xml



• validator-class maps to Java class
Custom Validator (Java Class)

• Use Java class implementing Validator
  • javax.faces.validator.Validator

• validate(FacesContext,UIComponent,Object) method
  performs validation, returns void

• Post error using throw ValidatorException
• Third argument is submittedValue – String
• ValidatorException takes FacesMessage
  • javax.faces.application.FacesMessage
JSF Lifecycle

• Now you understand validation and JSF lifecycle
• But validation prevents SSJS running
• So how can you show / hide buttons based on this
• *B14
Agenda

• Introduction

• XPages Server Processing

• JVM and the NSF

• Memory Management

• JSF Lifecycle: Event Model
• JSF Lifecycle: Performance Smackdown

• Summary

• Bonus Material
What Are We Testing?

• Computed Field control with value property computed
• Two Edit Box controls with rendered property
  computed

• For each scenario:
  • On Page Load – how many calls
  • On Partial Refresh – how many calls (*B15)
What Are The Scenarios?

• Compute on Page Load (Loaded)
• Compute Dynamically (Runtime)
• Theme
• dataContexts
  • “Global variables”
  • Scoped to XPage, Custom Control, Panel
  • Referenced via EL – #{var1}

• execMode=“partial”
  • Runs over only part of component tree
Demo
Smackdown Results

• Loaded makes fewer calls
• Theme cannot override loaded (*B16)
• Runtime and theme makes same calls
• dataContext makes fewer calls (*B17)
• execMode=“partial” improves performance
  • IMPORTANT: Define id to execute lifecycle on
      EventHandler – All Properties
  •   Know what you're processing and what you're refreshing
      (*B18)
Agenda

• Introduction

• XPages Server Processing

• JVM and the NSF

• Memory Management
• JSF Lifecycle: Event Model
• JSF Lifecycle: Performance Smackdown

• Summary

• Bonus Material
Summary

• Scoped variables not cleared by ?logout
• Combining controls improves performance – big takeaway
• Persistence options can optimise application
• JSF lifecycle affects event processing
• loaded and dataContexts (for rendered) offer benefits
• execMode improves performance – huge takeaway
• But things get REALLY interesting when you look at
  performance of different languages for a rendered property in
  our repeat... (*B19-B20) – massive takeaway
Statistics – Combining Controls
Statistics – Lifecycle Sm ackdown
Thank You



• Paul Withers, Intec Systems Ltd
• Email: pwithers@intec.co.uk
• Twitter: paulswithers
• Blog: http://www.intec.co.uk/blog

• Tim Tripcony, GBS
• Email:
• Twitter: timtripcony
• Blog: http://timtripcony.com
          Please complete your evaluations
          and check out the 20 bonus slides
Agenda

• Introduction

• XPages Server Processing

• JVM and the NSF

• Memory Management
• JSF Lifecycle: Event Model
• JSF Lifecycle: Performance Smackdown

• Summary

• Bonus Material
B1 - HTTP Error 500 Reasons

• No server / custom error page defined
  • Falls back to $$ReturnGeneralError page, if available

• Missing Extension Library or other library on server
• java.lang.NoClassDefFoundError
• java.lang.securityException
• Check <domino>dataIBM_TECHNICAL_
  SUPPORTxpages_exc_ServerName_yyyy_
  MM_dd@hh_mm_ss.log
B2 – Resolving HTTP 500 Errors

• XPages Log File Reader from OpenNTF allows you to view
   server-based log files

• If this points to a Java class you've added to the database,
   make sure it hasn't “fallen out” of the Build Path

• If it's in the Build Path, is it trying to write to the file system.
   Could be prevented by java.policy security settings
B3 – XPiNC Caveats

• Server-based NSFs need a local XSP Command
  Manager etc.

• Authentication is via Notes logon on local PC
• Signer access is managed via ECL on local PC
• XPages Extensions, Java packages must be deployed
  locally

• Logging accessible from Help → Support → View Log
  on local PC
B4 – “ServerScope”

• XSP Starter Kit contains an example of managed
  beans that can be scoped to the server

• Good for multi-NSF applications
• Instead of managed bean server-scoped variables
  could be a Map set / got from OSGi VariableResolver
  • Application-based / server-based VariableResolvers
    are processed for EVERY variable referenced in
    XPages applications
  • Includes e.g. context, sessionAsSigner, database
  • Also includes var attributes of data, dataContexts
    etc, e.g. document1
B5 – XPages               Java Bytecode

• Editing is done in XPage / Custom Control design elements
• Build process (B5) creates .java
  files, visible in Package Explorer
B6 XPages              Java Bytecode

• These are compiled down to
  .class files, which are only visible
  in Project Explorer view
  • Window → Show Eclipse Views → Other
  • Start typing “Proj” and select Project Explorer
  • Customize the view, clear all filters
     and click OK
  • Right-click the pane to load contents
• Java class files are visible under
  WebContent  WEB-INF  classes

• Includes custom Java classes,
  XPages, Custom Controls
B7 – Manual Build
• Build Automatically
  • Builds any NSF when opened in Designer
  • Builds any open NSF (even in “hidden” Working Sets)
      when any design element is saved
  •   Has “broken” live applications when developer opened an
      NSF in Designer just to look at design and did not have
      access to run XPages code on the server
                           Switch it off!!

• When opening an NSF in Designer
  • An initial build is required to create local Java files
  • If no initial build has been done and a design element is
       changed, the first build just does an incremental build
        If you open an NSF in Designer and make a change,
      you need to build TWICE to see changes in the browser
B8 – Language Caveat

• Expression Language (on its own or within Custom language)
  can only be used in component attributes
  • Value property
  • Rendered property
  • Loaded property
• It cannot be used in eventHandlers
  • In Client you need to use
     alert(“#{javascript:database.getTitle()}”) instead of
     alert(“#{database.title}”)
B9 – Controls Investigation

• Look at the following pages under Bonus
• HTML vs XSP
  • “Pass-thru HTML” on an XPage still creates a control in the
     Java code

• Dojo Slider
• Ext Lib Slider
  • Ext Lib controls exist to make it easier for developers
  • They do not exist to enhance server-performance per se
  • But some Ext Lib controls lazy-load functionality
B10 – Persistence: Save to Disk

• xsp.persistence.tree.maxviews only applies when
  xsp.persistence.mode=basic

• Save to disk defaults to server temp directory, e.g.
  C:WindowsTempnotes270C3Exspstate2D8YWSWLP34

• Ensure relevant drive has enough space for scalability
• Default folder can be overridden using
  xsp.persistence.dir.xspstate

• Similar options for file uploads and attachments
B11 – Page persistence m ode

• xsp.persistence.viewstate=fulltree
  • Default option, whole component tree persisted
• xsp.persistence.viewstate=nostate
  • No component tree is stored, similar to
     xsp.session.transient=true

• xsp.persistence.viewstate=delta
  • Valid if pages stored in memory
  • Only stores changes since page first loaded
• xsp.persistence.viewstate=deltaex
  • Valid if multiple pages stored in memory
  • Stores full component tree for current page, deltas for
     others
B12 – x sp.session.transient

• xsp.session.transient=“false”
  • XPage becomes stateless
    • Default VALUES overridden between requests
    • Default STATES not overridden
• State not persisted
  • NOT “Go to next page” from current
  • INSTEAD “Go to next page” from default
  • NOT “Toggle show detail” from previous state
  • INSTEAD “Toggle show detail” from default
• Values persisted
• Great for large, read-only pages – no storage
• Need to build your own “relative” functionality
B13 – x sp.session.transient

• To see it in action, use the Teamroom database
• Check out normal dataView functionality
  • Expand All / Collapse All, Sorting etc toggles
  • Filter functionality works
  • Categories can be expanded
  • Detail can be expanded
• Set xsp.session.transient=true and build the app
• Check out dataView functionality now
  • Sorting doesn't toggle, just switches relative to default
  • Filter functionality doesn't work
  • Categories cannot be expanded
  • Detail can still be expanded, but only because dataView
     has detailsOnClient=true
B14 – Manipulating JSF Lifecycle

• See Bonus – Check Values / Submit
• Scenario
  • You want to display a button that says “Check
      Values” until all values are completed
  •   Then you want to display a “Save” button
  •   But if the user then removes the value from a
      required field, you want to display “Check Values”
      button

• RenderResponse always runs, so do the checks
 in the rendered property
B15 – Computing Refresh ID

• refreshId property can be computed
• How is this calculated during the JSF lifecycle?
• Bonus – Computed refreshId tests this
• The refreshId gets calculated during the
  renderResponse phase
B16 – Themes and Loaded

• Bonus – Theme Failing page in sample database
  • Themes cannot override a property that is Computed on
    Page Load

• Bonus – Theme Failing Repeat
  • Themes can set most properties on a control
  • E.g. value property of a repeat control
  • Required at page load time to create component tree
B17 – dataContex ts for value

• dataContexts can offer benefits for rendered property
• How do they perform when used for value property?
• Bonus – dataContext for Value demonstrates this
• Even though dataContext is overridden by theme, it is
  calculated several times during the lifecycle
B18 – ex ecMode Goes Wrong

• execMode and execId are very powerful
• Be carefuly about execId and refreshId
• Bonus – execMode demonstrates this
• execId defines which control values get passed to
  component tree

• refreshId defines which area gets updated on browser
• If refreshId is larger than execId, controls outside
  execId will lose their values
B19 - Repeats Revisited

• See Bonus – Language Performance + Rendered
  • rendered property set for each of 50000 rows
  • rendered property set in different ways

• SSJS in Script Library performs worst
• SL much worse on partial refresh
• VariableResolver best for performance
  • Deprecated in JSF 2.0 for ELResolver
• VariableResolver in OSGi plugin best for performance
  and reusability (check out XSP Starter Kit)

• dataContext next best, but only reusable within page
B20 – Comparisons




    If you're separating business logic from
       presentation, Java is the way to go

More Related Content

What's hot

Java script nirvana in netbeans [con5679]
Java script nirvana in netbeans [con5679]Java script nirvana in netbeans [con5679]
Java script nirvana in netbeans [con5679]Ryan Cuprak
 
Silicon Valley JUG - How to generate customized java 8 code from your database
Silicon Valley JUG - How to generate customized java 8 code from your databaseSilicon Valley JUG - How to generate customized java 8 code from your database
Silicon Valley JUG - How to generate customized java 8 code from your databaseSpeedment, Inc.
 
Developing in the Cloud
Developing in the CloudDeveloping in the Cloud
Developing in the CloudRyan Cuprak
 
[DanNotes] XPages - Beyound the Basics
[DanNotes] XPages - Beyound the Basics[DanNotes] XPages - Beyound the Basics
[DanNotes] XPages - Beyound the BasicsUlrich Krause
 
BP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
BP204 It's Not Infernal: Dante's Nine Circles of XPages HeavenBP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
BP204 It's Not Infernal: Dante's Nine Circles of XPages HeavenMichael McGarel
 
Saving Time By Testing With Jest
Saving Time By Testing With JestSaving Time By Testing With Jest
Saving Time By Testing With JestBen McCormick
 
Play concurrency
Play concurrencyPlay concurrency
Play concurrencyJustin Long
 
Bccon use notes objects in memory and other useful
Bccon   use notes objects in memory and other usefulBccon   use notes objects in memory and other useful
Bccon use notes objects in memory and other usefulFrank van der Linden
 
What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...
What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...
What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...Heiko Voigt
 
CFWheels - Pragmatic, Beautiful Code
CFWheels - Pragmatic, Beautiful CodeCFWheels - Pragmatic, Beautiful Code
CFWheels - Pragmatic, Beautiful Codeindiver
 
Fun with EJB 3.1 and Open EJB
Fun with EJB 3.1 and Open EJBFun with EJB 3.1 and Open EJB
Fun with EJB 3.1 and Open EJBArun Gupta
 
Manage your environment with DSC
Manage your environment with DSCManage your environment with DSC
Manage your environment with DSCGian Maria Ricci
 
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...Sencha
 
Community day 2013 applied architectures
Community day 2013   applied architecturesCommunity day 2013   applied architectures
Community day 2013 applied architecturesPanagiotis Kefalidis
 
Hybrid Mobile Development with Apache Cordova and
Hybrid Mobile Development with Apache Cordova and Hybrid Mobile Development with Apache Cordova and
Hybrid Mobile Development with Apache Cordova and Ryan Cuprak
 
From Tomcat to Java EE, making the transition with TomEE
From Tomcat to Java EE, making the transition with TomEEFrom Tomcat to Java EE, making the transition with TomEE
From Tomcat to Java EE, making the transition with TomEEjaxconf
 
Tech io nodejs_20130531_v0.6
Tech io nodejs_20130531_v0.6Tech io nodejs_20130531_v0.6
Tech io nodejs_20130531_v0.6Ganesh Kondal
 
Michael North "Ember.js 2 - Future-friendly ambitious apps, that scale!"
Michael North "Ember.js 2 - Future-friendly ambitious apps, that scale!"Michael North "Ember.js 2 - Future-friendly ambitious apps, that scale!"
Michael North "Ember.js 2 - Future-friendly ambitious apps, that scale!"Fwdays
 
Java EE and Google App Engine
Java EE and Google App EngineJava EE and Google App Engine
Java EE and Google App EngineArun Gupta
 

What's hot (20)

Java script nirvana in netbeans [con5679]
Java script nirvana in netbeans [con5679]Java script nirvana in netbeans [con5679]
Java script nirvana in netbeans [con5679]
 
Silicon Valley JUG - How to generate customized java 8 code from your database
Silicon Valley JUG - How to generate customized java 8 code from your databaseSilicon Valley JUG - How to generate customized java 8 code from your database
Silicon Valley JUG - How to generate customized java 8 code from your database
 
Developing in the Cloud
Developing in the CloudDeveloping in the Cloud
Developing in the Cloud
 
[DanNotes] XPages - Beyound the Basics
[DanNotes] XPages - Beyound the Basics[DanNotes] XPages - Beyound the Basics
[DanNotes] XPages - Beyound the Basics
 
BP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
BP204 It's Not Infernal: Dante's Nine Circles of XPages HeavenBP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
BP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
 
Saving Time By Testing With Jest
Saving Time By Testing With JestSaving Time By Testing With Jest
Saving Time By Testing With Jest
 
Play concurrency
Play concurrencyPlay concurrency
Play concurrency
 
Bccon use notes objects in memory and other useful
Bccon   use notes objects in memory and other usefulBccon   use notes objects in memory and other useful
Bccon use notes objects in memory and other useful
 
What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...
What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...
What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...
 
CFWheels - Pragmatic, Beautiful Code
CFWheels - Pragmatic, Beautiful CodeCFWheels - Pragmatic, Beautiful Code
CFWheels - Pragmatic, Beautiful Code
 
Let's server your Data
Let's server your DataLet's server your Data
Let's server your Data
 
Fun with EJB 3.1 and Open EJB
Fun with EJB 3.1 and Open EJBFun with EJB 3.1 and Open EJB
Fun with EJB 3.1 and Open EJB
 
Manage your environment with DSC
Manage your environment with DSCManage your environment with DSC
Manage your environment with DSC
 
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
 
Community day 2013 applied architectures
Community day 2013   applied architecturesCommunity day 2013   applied architectures
Community day 2013 applied architectures
 
Hybrid Mobile Development with Apache Cordova and
Hybrid Mobile Development with Apache Cordova and Hybrid Mobile Development with Apache Cordova and
Hybrid Mobile Development with Apache Cordova and
 
From Tomcat to Java EE, making the transition with TomEE
From Tomcat to Java EE, making the transition with TomEEFrom Tomcat to Java EE, making the transition with TomEE
From Tomcat to Java EE, making the transition with TomEE
 
Tech io nodejs_20130531_v0.6
Tech io nodejs_20130531_v0.6Tech io nodejs_20130531_v0.6
Tech io nodejs_20130531_v0.6
 
Michael North "Ember.js 2 - Future-friendly ambitious apps, that scale!"
Michael North "Ember.js 2 - Future-friendly ambitious apps, that scale!"Michael North "Ember.js 2 - Future-friendly ambitious apps, that scale!"
Michael North "Ember.js 2 - Future-friendly ambitious apps, that scale!"
 
Java EE and Google App Engine
Java EE and Google App EngineJava EE and Google App Engine
Java EE and Google App Engine
 

Viewers also liked

IBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages Heaven
IBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages HeavenIBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages Heaven
IBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages HeavenPaul Withers
 
ICON UK 2015 - ODA and CrossWorlds
ICON UK 2015 - ODA and CrossWorldsICON UK 2015 - ODA and CrossWorlds
ICON UK 2015 - ODA and CrossWorldsPaul Withers
 
Demo Slides: Application Release Automation with Deployit
Demo Slides: Application Release Automation with DeployitDemo Slides: Application Release Automation with Deployit
Demo Slides: Application Release Automation with DeployitXebiaLabs
 
IBM ConnectED 2015 - BP106 From XPages Hero To OSGi Guru: Taking The Scary Ou...
IBM ConnectED 2015 - BP106 From XPages Hero To OSGi Guru: Taking The Scary Ou...IBM ConnectED 2015 - BP106 From XPages Hero To OSGi Guru: Taking The Scary Ou...
IBM ConnectED 2015 - BP106 From XPages Hero To OSGi Guru: Taking The Scary Ou...Paul Withers
 
Bootstrap4XPages webinar
Bootstrap4XPages webinarBootstrap4XPages webinar
Bootstrap4XPages webinarMark Leusink
 
AD1279 "Marty, You're Not Thinking Fourth Dimensionally" - Troubleshooting XP...
AD1279 "Marty, You're Not Thinking Fourth Dimensionally" - Troubleshooting XP...AD1279 "Marty, You're Not Thinking Fourth Dimensionally" - Troubleshooting XP...
AD1279 "Marty, You're Not Thinking Fourth Dimensionally" - Troubleshooting XP...Paul Withers
 
JMP401: Masterclass: XPages Scalability
JMP401: Masterclass: XPages ScalabilityJMP401: Masterclass: XPages Scalability
JMP401: Masterclass: XPages ScalabilityTony McGuckin
 

Viewers also liked (7)

IBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages Heaven
IBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages HeavenIBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages Heaven
IBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages Heaven
 
ICON UK 2015 - ODA and CrossWorlds
ICON UK 2015 - ODA and CrossWorldsICON UK 2015 - ODA and CrossWorlds
ICON UK 2015 - ODA and CrossWorlds
 
Demo Slides: Application Release Automation with Deployit
Demo Slides: Application Release Automation with DeployitDemo Slides: Application Release Automation with Deployit
Demo Slides: Application Release Automation with Deployit
 
IBM ConnectED 2015 - BP106 From XPages Hero To OSGi Guru: Taking The Scary Ou...
IBM ConnectED 2015 - BP106 From XPages Hero To OSGi Guru: Taking The Scary Ou...IBM ConnectED 2015 - BP106 From XPages Hero To OSGi Guru: Taking The Scary Ou...
IBM ConnectED 2015 - BP106 From XPages Hero To OSGi Guru: Taking The Scary Ou...
 
Bootstrap4XPages webinar
Bootstrap4XPages webinarBootstrap4XPages webinar
Bootstrap4XPages webinar
 
AD1279 "Marty, You're Not Thinking Fourth Dimensionally" - Troubleshooting XP...
AD1279 "Marty, You're Not Thinking Fourth Dimensionally" - Troubleshooting XP...AD1279 "Marty, You're Not Thinking Fourth Dimensionally" - Troubleshooting XP...
AD1279 "Marty, You're Not Thinking Fourth Dimensionally" - Troubleshooting XP...
 
JMP401: Masterclass: XPages Scalability
JMP401: Masterclass: XPages ScalabilityJMP401: Masterclass: XPages Scalability
JMP401: Masterclass: XPages Scalability
 

Similar to Eureka Moment UKLUG

A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?DATAVERSITY
 
DanNotes 2013: OpenNTF Domino API
DanNotes 2013: OpenNTF Domino APIDanNotes 2013: OpenNTF Domino API
DanNotes 2013: OpenNTF Domino APIPaul Withers
 
Caching your rails application
Caching your rails applicationCaching your rails application
Caching your rails applicationArrrrCamp
 
Introduction to memcached
Introduction to memcachedIntroduction to memcached
Introduction to memcachedJurriaan Persyn
 
BTV PHP - Building Fast Websites
BTV PHP - Building Fast WebsitesBTV PHP - Building Fast Websites
BTV PHP - Building Fast WebsitesJonathan Klein
 
On-boarding with JanusGraph Performance
On-boarding with JanusGraph PerformanceOn-boarding with JanusGraph Performance
On-boarding with JanusGraph PerformanceChin Huang
 
Oracle Fuson Middleware Diagnostics, Performance and Troubleshoot
Oracle Fuson Middleware Diagnostics, Performance and TroubleshootOracle Fuson Middleware Diagnostics, Performance and Troubleshoot
Oracle Fuson Middleware Diagnostics, Performance and TroubleshootMichel Schildmeijer
 
Performance and scalability with drupal
Performance and scalability with drupalPerformance and scalability with drupal
Performance and scalability with drupalRonan Berder
 
LatJUG. JSF2.0 - The JavaEE6 Standard
LatJUG. JSF2.0 - The JavaEE6 StandardLatJUG. JSF2.0 - The JavaEE6 Standard
LatJUG. JSF2.0 - The JavaEE6 Standarddenis Udod
 
SeaJUG May 2012 mybatis
SeaJUG May 2012 mybatisSeaJUG May 2012 mybatis
SeaJUG May 2012 mybatisWill Iverson
 
Ruby and Distributed Storage Systems
Ruby and Distributed Storage SystemsRuby and Distributed Storage Systems
Ruby and Distributed Storage SystemsSATOSHI TAGOMORI
 
Oracle WebLogic Diagnostics & Perfomance tuning
Oracle WebLogic Diagnostics & Perfomance tuningOracle WebLogic Diagnostics & Perfomance tuning
Oracle WebLogic Diagnostics & Perfomance tuningMichel Schildmeijer
 
Where Django Caching Bust at the Seams
Where Django Caching Bust at the SeamsWhere Django Caching Bust at the Seams
Where Django Caching Bust at the SeamsConcentric Sky
 
Intro JavaScript
Intro JavaScriptIntro JavaScript
Intro JavaScriptkoppenolski
 
Nashorn: JavaScript that doesn’t suck (ILJUG)
Nashorn: JavaScript that doesn’t suck (ILJUG)Nashorn: JavaScript that doesn’t suck (ILJUG)
Nashorn: JavaScript that doesn’t suck (ILJUG)Tomer Gabel
 
Masterin Large Scale Java Script Applications
Masterin Large Scale Java Script ApplicationsMasterin Large Scale Java Script Applications
Masterin Large Scale Java Script ApplicationsFabian Jakobs
 
Lots of facets, fast
Lots of facets, fastLots of facets, fast
Lots of facets, fastBeyondTrees
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.jsorkaplan
 
ApacheCon2010: Cache & Concurrency Considerations in Cassandra (& limits of JVM)
ApacheCon2010: Cache & Concurrency Considerations in Cassandra (& limits of JVM)ApacheCon2010: Cache & Concurrency Considerations in Cassandra (& limits of JVM)
ApacheCon2010: Cache & Concurrency Considerations in Cassandra (& limits of JVM)srisatish ambati
 

Similar to Eureka Moment UKLUG (20)

A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
 
DanNotes 2013: OpenNTF Domino API
DanNotes 2013: OpenNTF Domino APIDanNotes 2013: OpenNTF Domino API
DanNotes 2013: OpenNTF Domino API
 
Caching your rails application
Caching your rails applicationCaching your rails application
Caching your rails application
 
Top ten-list
Top ten-listTop ten-list
Top ten-list
 
Introduction to memcached
Introduction to memcachedIntroduction to memcached
Introduction to memcached
 
BTV PHP - Building Fast Websites
BTV PHP - Building Fast WebsitesBTV PHP - Building Fast Websites
BTV PHP - Building Fast Websites
 
On-boarding with JanusGraph Performance
On-boarding with JanusGraph PerformanceOn-boarding with JanusGraph Performance
On-boarding with JanusGraph Performance
 
Oracle Fuson Middleware Diagnostics, Performance and Troubleshoot
Oracle Fuson Middleware Diagnostics, Performance and TroubleshootOracle Fuson Middleware Diagnostics, Performance and Troubleshoot
Oracle Fuson Middleware Diagnostics, Performance and Troubleshoot
 
Performance and scalability with drupal
Performance and scalability with drupalPerformance and scalability with drupal
Performance and scalability with drupal
 
LatJUG. JSF2.0 - The JavaEE6 Standard
LatJUG. JSF2.0 - The JavaEE6 StandardLatJUG. JSF2.0 - The JavaEE6 Standard
LatJUG. JSF2.0 - The JavaEE6 Standard
 
SeaJUG May 2012 mybatis
SeaJUG May 2012 mybatisSeaJUG May 2012 mybatis
SeaJUG May 2012 mybatis
 
Ruby and Distributed Storage Systems
Ruby and Distributed Storage SystemsRuby and Distributed Storage Systems
Ruby and Distributed Storage Systems
 
Oracle WebLogic Diagnostics & Perfomance tuning
Oracle WebLogic Diagnostics & Perfomance tuningOracle WebLogic Diagnostics & Perfomance tuning
Oracle WebLogic Diagnostics & Perfomance tuning
 
Where Django Caching Bust at the Seams
Where Django Caching Bust at the SeamsWhere Django Caching Bust at the Seams
Where Django Caching Bust at the Seams
 
Intro JavaScript
Intro JavaScriptIntro JavaScript
Intro JavaScript
 
Nashorn: JavaScript that doesn’t suck (ILJUG)
Nashorn: JavaScript that doesn’t suck (ILJUG)Nashorn: JavaScript that doesn’t suck (ILJUG)
Nashorn: JavaScript that doesn’t suck (ILJUG)
 
Masterin Large Scale Java Script Applications
Masterin Large Scale Java Script ApplicationsMasterin Large Scale Java Script Applications
Masterin Large Scale Java Script Applications
 
Lots of facets, fast
Lots of facets, fastLots of facets, fast
Lots of facets, fast
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.js
 
ApacheCon2010: Cache & Concurrency Considerations in Cassandra (& limits of JVM)
ApacheCon2010: Cache & Concurrency Considerations in Cassandra (& limits of JVM)ApacheCon2010: Cache & Concurrency Considerations in Cassandra (& limits of JVM)
ApacheCon2010: Cache & Concurrency Considerations in Cassandra (& limits of JVM)
 

More from Paul Withers

Engage 2019: Introduction to Node-Red
Engage 2019: Introduction to Node-RedEngage 2019: Introduction to Node-Red
Engage 2019: Introduction to Node-RedPaul Withers
 
Engage 2019: Modernising Your Domino and XPages Applications
Engage 2019: Modernising Your Domino and XPages Applications Engage 2019: Modernising Your Domino and XPages Applications
Engage 2019: Modernising Your Domino and XPages Applications Paul Withers
 
Engage 2019: AI What Is It Good For
Engage 2019: AI What Is It Good ForEngage 2019: AI What Is It Good For
Engage 2019: AI What Is It Good ForPaul Withers
 
Social Connections 14 - ICS Integration with Node-RED and Open Source
Social Connections 14 - ICS Integration with Node-RED and Open SourceSocial Connections 14 - ICS Integration with Node-RED and Open Source
Social Connections 14 - ICS Integration with Node-RED and Open SourcePaul Withers
 
ICONUK 2018 - Do You Wanna Build a Chatbot
ICONUK 2018 - Do You Wanna Build a ChatbotICONUK 2018 - Do You Wanna Build a Chatbot
ICONUK 2018 - Do You Wanna Build a ChatbotPaul Withers
 
IBM Think Session 8598 Domino and JavaScript Development MasterClass
IBM Think Session 8598 Domino and JavaScript Development MasterClassIBM Think Session 8598 Domino and JavaScript Development MasterClass
IBM Think Session 8598 Domino and JavaScript Development MasterClassPaul Withers
 
IBM Think Session 3249 Watson Work Services Java SDK
IBM Think Session 3249 Watson Work Services Java SDKIBM Think Session 3249 Watson Work Services Java SDK
IBM Think Session 3249 Watson Work Services Java SDKPaul Withers
 
OpenNTF Domino API (ODA): Super-Charging Domino Development
OpenNTF Domino API (ODA): Super-Charging Domino DevelopmentOpenNTF Domino API (ODA): Super-Charging Domino Development
OpenNTF Domino API (ODA): Super-Charging Domino DevelopmentPaul Withers
 
IBM ConnectED 2015 - MAS103 XPages Performance and Scalability
IBM ConnectED 2015 - MAS103 XPages Performance and ScalabilityIBM ConnectED 2015 - MAS103 XPages Performance and Scalability
IBM ConnectED 2015 - MAS103 XPages Performance and ScalabilityPaul Withers
 
OpenNTF Domino API - Overview Introduction
OpenNTF Domino API - Overview IntroductionOpenNTF Domino API - Overview Introduction
OpenNTF Domino API - Overview IntroductionPaul Withers
 
What's New and Next in OpenNTF Domino API (ICON UK 2014)
What's New and Next in OpenNTF Domino API (ICON UK 2014)What's New and Next in OpenNTF Domino API (ICON UK 2014)
What's New and Next in OpenNTF Domino API (ICON UK 2014)Paul Withers
 
From XPages Hero to OSGi Guru: Taking the Scary out of Building Extension Lib...
From XPages Hero to OSGi Guru: Taking the Scary out of Building Extension Lib...From XPages Hero to OSGi Guru: Taking the Scary out of Building Extension Lib...
From XPages Hero to OSGi Guru: Taking the Scary out of Building Extension Lib...Paul Withers
 
Engage 2014 OpenNTF Domino API Slides
Engage 2014 OpenNTF Domino API SlidesEngage 2014 OpenNTF Domino API Slides
Engage 2014 OpenNTF Domino API SlidesPaul Withers
 
Embracing the power of the notes client
Embracing the power of the notes clientEmbracing the power of the notes client
Embracing the power of the notes clientPaul Withers
 
Beyond Domino Designer
Beyond Domino DesignerBeyond Domino Designer
Beyond Domino DesignerPaul Withers
 
BP206 It's Not Herculean: 12 Tasks Made Easier with IBM Domino XPages
BP206 It's Not Herculean: 12 Tasks Made Easier with IBM Domino XPagesBP206 It's Not Herculean: 12 Tasks Made Easier with IBM Domino XPages
BP206 It's Not Herculean: 12 Tasks Made Easier with IBM Domino XPagesPaul Withers
 
DanNotes XPages Mobile Controls
DanNotes XPages Mobile ControlsDanNotes XPages Mobile Controls
DanNotes XPages Mobile ControlsPaul Withers
 
BP210 XPages: Enter The Dojo
BP210 XPages: Enter The DojoBP210 XPages: Enter The Dojo
BP210 XPages: Enter The DojoPaul Withers
 

More from Paul Withers (20)

Engage 2019: Introduction to Node-Red
Engage 2019: Introduction to Node-RedEngage 2019: Introduction to Node-Red
Engage 2019: Introduction to Node-Red
 
Engage 2019: Modernising Your Domino and XPages Applications
Engage 2019: Modernising Your Domino and XPages Applications Engage 2019: Modernising Your Domino and XPages Applications
Engage 2019: Modernising Your Domino and XPages Applications
 
Engage 2019: AI What Is It Good For
Engage 2019: AI What Is It Good ForEngage 2019: AI What Is It Good For
Engage 2019: AI What Is It Good For
 
Social Connections 14 - ICS Integration with Node-RED and Open Source
Social Connections 14 - ICS Integration with Node-RED and Open SourceSocial Connections 14 - ICS Integration with Node-RED and Open Source
Social Connections 14 - ICS Integration with Node-RED and Open Source
 
ICONUK 2018 - Do You Wanna Build a Chatbot
ICONUK 2018 - Do You Wanna Build a ChatbotICONUK 2018 - Do You Wanna Build a Chatbot
ICONUK 2018 - Do You Wanna Build a Chatbot
 
IBM Think Session 8598 Domino and JavaScript Development MasterClass
IBM Think Session 8598 Domino and JavaScript Development MasterClassIBM Think Session 8598 Domino and JavaScript Development MasterClass
IBM Think Session 8598 Domino and JavaScript Development MasterClass
 
IBM Think Session 3249 Watson Work Services Java SDK
IBM Think Session 3249 Watson Work Services Java SDKIBM Think Session 3249 Watson Work Services Java SDK
IBM Think Session 3249 Watson Work Services Java SDK
 
GraphQL 101
GraphQL 101GraphQL 101
GraphQL 101
 
GraphQL 101
GraphQL 101GraphQL 101
GraphQL 101
 
OpenNTF Domino API (ODA): Super-Charging Domino Development
OpenNTF Domino API (ODA): Super-Charging Domino DevelopmentOpenNTF Domino API (ODA): Super-Charging Domino Development
OpenNTF Domino API (ODA): Super-Charging Domino Development
 
IBM ConnectED 2015 - MAS103 XPages Performance and Scalability
IBM ConnectED 2015 - MAS103 XPages Performance and ScalabilityIBM ConnectED 2015 - MAS103 XPages Performance and Scalability
IBM ConnectED 2015 - MAS103 XPages Performance and Scalability
 
OpenNTF Domino API - Overview Introduction
OpenNTF Domino API - Overview IntroductionOpenNTF Domino API - Overview Introduction
OpenNTF Domino API - Overview Introduction
 
What's New and Next in OpenNTF Domino API (ICON UK 2014)
What's New and Next in OpenNTF Domino API (ICON UK 2014)What's New and Next in OpenNTF Domino API (ICON UK 2014)
What's New and Next in OpenNTF Domino API (ICON UK 2014)
 
From XPages Hero to OSGi Guru: Taking the Scary out of Building Extension Lib...
From XPages Hero to OSGi Guru: Taking the Scary out of Building Extension Lib...From XPages Hero to OSGi Guru: Taking the Scary out of Building Extension Lib...
From XPages Hero to OSGi Guru: Taking the Scary out of Building Extension Lib...
 
Engage 2014 OpenNTF Domino API Slides
Engage 2014 OpenNTF Domino API SlidesEngage 2014 OpenNTF Domino API Slides
Engage 2014 OpenNTF Domino API Slides
 
Embracing the power of the notes client
Embracing the power of the notes clientEmbracing the power of the notes client
Embracing the power of the notes client
 
Beyond Domino Designer
Beyond Domino DesignerBeyond Domino Designer
Beyond Domino Designer
 
BP206 It's Not Herculean: 12 Tasks Made Easier with IBM Domino XPages
BP206 It's Not Herculean: 12 Tasks Made Easier with IBM Domino XPagesBP206 It's Not Herculean: 12 Tasks Made Easier with IBM Domino XPages
BP206 It's Not Herculean: 12 Tasks Made Easier with IBM Domino XPages
 
DanNotes XPages Mobile Controls
DanNotes XPages Mobile ControlsDanNotes XPages Mobile Controls
DanNotes XPages Mobile Controls
 
BP210 XPages: Enter The Dojo
BP210 XPages: Enter The DojoBP210 XPages: Enter The Dojo
BP210 XPages: Enter The Dojo
 

Recently uploaded

SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 

Recently uploaded (20)

SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 

Eureka Moment UKLUG

  • 1. Eureka! The Padawan's Guide to the Dark Side of XPages #uklugEureka Presenter: Paul Withers Company: Intec Systems Ltd Twitter: @paulswithers Presenter: Tim Tripcony Company: GBS Twitter @timtripcony
  • 2. Agenda • Introduction • XPages Server Processing • JVM and the NSF • Memory Management • JSF Lifecycle: Event Model • JSF Lifecycle: Performance Smackdown • Summary • Bonus Material (*B1)
  • 3. Paul Withers • Senior Domino Developer, Intec Systems Ltd • XPages Developer since 8.5.0 • IBM Champion • Co-Host of The XCast • XPages Extension Library Book
  • 4. Tim Tripcony • XMage, GBS • IBM Champion • XPages Extension Library Book
  • 5. Why This Session? • Nothing in life is to be feared, it is only to be understood. Now is the time to understand more, so that we may fear less. Marie Curie • A matter that becomes clear ceases to concern us. Friedrich Nietzsche • Furious activity is no substitute for understanding. H.H. Williams • No. I am your father. Darth Vader
  • 6. Ex pectations • You should: • Know what XPages are • Know that XPages run on a Domino server • Know Computed Field, Edit Box and Repeat controls • You don't need to: • Know Java • Have a thorough knowledge of JSF • Have knowledge of dataContexts, managed beans, PhaseListeners or VariableResolvers
  • 7. Agenda • Introduction • XPages Server Processing • JVM and the NSF • Memory Management • JSF Lifecycle: Event Model • JSF Lifecycle: Performance Smackdown • Summary • Bonus Material
  • 8. XPages and Domino Server Java Virtual Machine XSP Command Manager Domino HTTP Server
  • 9. When An XPage Is Served...(*B3) • Can HTTP Server resolve the URL to an NSF? • HTTP 404 Error • Does user have access to NSF? • HTTP Authentication Page • Can HTTP Server find resource in the NSF? • HTTP 404 Error • Does the signer have access to run XPages? (*B3) • HTTP 403 Error • Are there SSJS errors? • XSP Command Manager takes over (*B1-B2) • Return XPage
  • 10. Agenda • Introduction • XPages Server Processing • JVM and the NSF • Memory Management • JSF Lifecycle: Event Model • JSF Lifecycle: Performance Smackdown • Summary • Bonus Material
  • 11. Java Virtual Machine Means... • Each NSF is a separate Java application • applicationScope, sessionScope etc. is per NSF (*B4) • Browser session, NOT user session • Setting sessionScope in Db1.nsf does NOT set sessionScope in Db2.nsf • sessionScope is ONLY within JVM – not cleared by HTTP logout
  • 12. JAVA Virtual Machine • XPages → Java classes → Java bytecode (*B5-B7) • Each control is a Java class • Extensions are pre-packaged Java classes • Define properties (what can be customised) • Define renderers (what is printed) • SSJS code is String passed to Java method • Java code prints HTML to browser
  • 13. XPages Languages • Literal values • Strings, booleans etc. • SSJS • #{javascript:document1.getItemValueString(“FirstName”)} • Expression Language (*B8) • #{VARIABLE.PROPERTY} • #{document1.FirstName} • #{database.title} = #{javascript:database.getTitle()} • Custom • Any of the above combined • “Database title is #{database.title}”
  • 14. Language Hypotheses • Fewer controls should perform better (*B9) • Literal strings should perform best. Expression Language should perform better than Server-Side JavaScript • Combining languages should allow: • Fewer controls to be used • Literal Strings and Expression Language to be used instead of SSJS • So better performance
  • 15. Agenda • Introduction • XPages Server Processing • JVM and the NSF • Memory Management • JSF Lifecycle: Event Model • JSF Lifecycle: Performance Smackdown • Summary • Bonus Material
  • 16. JSF and Serialization • HTTP is state-less • JSF keeps state-full server representation of UI (component tree or view) • Objects stored in component tree must be serializable (persist between requests) • Domino objects recycled after each request • Datasources are recycle-safe • Objects stored in ViewScope etc must also be serializable
  • 18. Persistence options • Component tree (map of XPage on server) • either held in memory of JVM • or serialized to disk • xsp.persistence.XXX properties • See persistence tab of new xsp.properties editor • Package Explorer → WebContentWEB- INFxsp.properties
  • 20. Demo
  • 21. Persistence Summary • Keep Pages in Memory • Remembering, remembering, remembering • xsp.persistence.mode=basic • Best for...quick retrieval, few users • Keep Pages on Disk • Writing...next? You want it again? Reading • xsp.persistence.mode=file • Best for...lots of users, but slower retrieval • Keep Only The Current Page In Memory • Remembering, remembering, remembering • Oh, new page? Writing...and now • Remembering, remembering, remembering • xsp.persistence.mode=fileex • Best for...lots of users, quick retrieval of current page
  • 22. Persistence Summary (*B11-13) • Gzip Persisted Files • xsp.persistence.file.gzip (default=false) • default=false • Writing...next? You want it again? Reading • Persist Files Asynchronously • xsp.persistence.file.async (default=true) • Server busy, remembering. Next? (Writing, writing) • Maximum Pages... • xsp.persistence.tree.maxviews (*B10) • Remembering, remembering, remembering • xsp.persistence.file.maxviews • Writing, retrieving, writing, writing
  • 23. Agenda • Introduction • XPages Server Processing • JVM and the NSF • Memory Management • JSF Lifecycle: Event Model • JSF Lifecycle: Performance Smackdown • Summary • Bonus Material
  • 25. Six Phases • Restore View • JSF component tree retrieved • Apply Request Values • this.setSubmittedValue(passedValue) run • Any event logic run if immediate=“true” • Process Validation • Any converters applied • Any validators applied
  • 26. Six Phases • Update Model Values • this.setValue(this.getSubmittedValue()); • this.setSubmittedValue(null) • Invoke Application • Any event logic run • Render Response • HTML rendered and state saved • Only event that runs during page load
  • 27. PhaseListener • Must implement javax.faces.event.PhaseListener • Or extend a Java class that implements it • ExamplePhaseListener extends AbstractPhaseListener, which implements javax.faces.event.PhaseListener • Allows us to track JSF lifecycle phases • Java class plus reference in WebContentWEB- INFfaces-config.xml
  • 28. Demo
  • 29. Basic • Validation fails • beforeRestoreView • afterRestoreView • beforeApplyRequestValues • afterApplyRequestValues • beforeProcessValidations • beforeRenderResponse • afterRenderResponse • Event logic not run
  • 30. No Validation • Conversion still honoured • If failed, skips from ProcessValidations to RenderResponse • Event Logic not run • If no conversion errors, all phases run • Values passed from submittedValue to value • Component tree updated
  • 31. im mediate="true" • Validation fails • beforeRestoreView • afterRestoreView • beforeApplyRequestValues • afterApplyRequestValues • beforeRenderResponse • afterRenderResponse • Event logic run in ApplyRequestValues phase • Component value never goes past submittedValue • Component tree not updated
  • 32. Custom Validator (SSJS) • Runs AFTER Apply Request Values • Runs BEFORE Update Model Values • submittedValue property set • value property still NULL (or last stored value) • Use validator property of control • Check getSubmittedValue() • Post error with facesContext.addMessage() • Abort with this.setValid(false)
  • 33. Custom Validator (Java) • Runs at same time as any other validator • Use xp:validator, child of validators property of control • validatorId property maps to validator-id in faces-config.xml • validator-class maps to Java class
  • 34. Custom Validator (Java Class) • Use Java class implementing Validator • javax.faces.validator.Validator • validate(FacesContext,UIComponent,Object) method performs validation, returns void • Post error using throw ValidatorException • Third argument is submittedValue – String • ValidatorException takes FacesMessage • javax.faces.application.FacesMessage
  • 35. JSF Lifecycle • Now you understand validation and JSF lifecycle • But validation prevents SSJS running • So how can you show / hide buttons based on this • *B14
  • 36. Agenda • Introduction • XPages Server Processing • JVM and the NSF • Memory Management • JSF Lifecycle: Event Model • JSF Lifecycle: Performance Smackdown • Summary • Bonus Material
  • 37. What Are We Testing? • Computed Field control with value property computed • Two Edit Box controls with rendered property computed • For each scenario: • On Page Load – how many calls • On Partial Refresh – how many calls (*B15)
  • 38. What Are The Scenarios? • Compute on Page Load (Loaded) • Compute Dynamically (Runtime) • Theme • dataContexts • “Global variables” • Scoped to XPage, Custom Control, Panel • Referenced via EL – #{var1} • execMode=“partial” • Runs over only part of component tree
  • 39. Demo
  • 40. Smackdown Results • Loaded makes fewer calls • Theme cannot override loaded (*B16) • Runtime and theme makes same calls • dataContext makes fewer calls (*B17) • execMode=“partial” improves performance • IMPORTANT: Define id to execute lifecycle on EventHandler – All Properties • Know what you're processing and what you're refreshing (*B18)
  • 41. Agenda • Introduction • XPages Server Processing • JVM and the NSF • Memory Management • JSF Lifecycle: Event Model • JSF Lifecycle: Performance Smackdown • Summary • Bonus Material
  • 42. Summary • Scoped variables not cleared by ?logout • Combining controls improves performance – big takeaway • Persistence options can optimise application • JSF lifecycle affects event processing • loaded and dataContexts (for rendered) offer benefits • execMode improves performance – huge takeaway • But things get REALLY interesting when you look at performance of different languages for a rendered property in our repeat... (*B19-B20) – massive takeaway
  • 45. Thank You • Paul Withers, Intec Systems Ltd • Email: pwithers@intec.co.uk • Twitter: paulswithers • Blog: http://www.intec.co.uk/blog • Tim Tripcony, GBS • Email: • Twitter: timtripcony • Blog: http://timtripcony.com Please complete your evaluations and check out the 20 bonus slides
  • 46. Agenda • Introduction • XPages Server Processing • JVM and the NSF • Memory Management • JSF Lifecycle: Event Model • JSF Lifecycle: Performance Smackdown • Summary • Bonus Material
  • 47. B1 - HTTP Error 500 Reasons • No server / custom error page defined • Falls back to $$ReturnGeneralError page, if available • Missing Extension Library or other library on server • java.lang.NoClassDefFoundError • java.lang.securityException • Check <domino>dataIBM_TECHNICAL_ SUPPORTxpages_exc_ServerName_yyyy_ MM_dd@hh_mm_ss.log
  • 48. B2 – Resolving HTTP 500 Errors • XPages Log File Reader from OpenNTF allows you to view server-based log files • If this points to a Java class you've added to the database, make sure it hasn't “fallen out” of the Build Path • If it's in the Build Path, is it trying to write to the file system. Could be prevented by java.policy security settings
  • 49. B3 – XPiNC Caveats • Server-based NSFs need a local XSP Command Manager etc. • Authentication is via Notes logon on local PC • Signer access is managed via ECL on local PC • XPages Extensions, Java packages must be deployed locally • Logging accessible from Help → Support → View Log on local PC
  • 50. B4 – “ServerScope” • XSP Starter Kit contains an example of managed beans that can be scoped to the server • Good for multi-NSF applications • Instead of managed bean server-scoped variables could be a Map set / got from OSGi VariableResolver • Application-based / server-based VariableResolvers are processed for EVERY variable referenced in XPages applications • Includes e.g. context, sessionAsSigner, database • Also includes var attributes of data, dataContexts etc, e.g. document1
  • 51. B5 – XPages Java Bytecode • Editing is done in XPage / Custom Control design elements • Build process (B5) creates .java files, visible in Package Explorer
  • 52. B6 XPages Java Bytecode • These are compiled down to .class files, which are only visible in Project Explorer view • Window → Show Eclipse Views → Other • Start typing “Proj” and select Project Explorer • Customize the view, clear all filters and click OK • Right-click the pane to load contents • Java class files are visible under WebContent WEB-INF classes • Includes custom Java classes, XPages, Custom Controls
  • 53. B7 – Manual Build • Build Automatically • Builds any NSF when opened in Designer • Builds any open NSF (even in “hidden” Working Sets) when any design element is saved • Has “broken” live applications when developer opened an NSF in Designer just to look at design and did not have access to run XPages code on the server Switch it off!! • When opening an NSF in Designer • An initial build is required to create local Java files • If no initial build has been done and a design element is changed, the first build just does an incremental build If you open an NSF in Designer and make a change, you need to build TWICE to see changes in the browser
  • 54. B8 – Language Caveat • Expression Language (on its own or within Custom language) can only be used in component attributes • Value property • Rendered property • Loaded property • It cannot be used in eventHandlers • In Client you need to use alert(“#{javascript:database.getTitle()}”) instead of alert(“#{database.title}”)
  • 55. B9 – Controls Investigation • Look at the following pages under Bonus • HTML vs XSP • “Pass-thru HTML” on an XPage still creates a control in the Java code • Dojo Slider • Ext Lib Slider • Ext Lib controls exist to make it easier for developers • They do not exist to enhance server-performance per se • But some Ext Lib controls lazy-load functionality
  • 56. B10 – Persistence: Save to Disk • xsp.persistence.tree.maxviews only applies when xsp.persistence.mode=basic • Save to disk defaults to server temp directory, e.g. C:WindowsTempnotes270C3Exspstate2D8YWSWLP34 • Ensure relevant drive has enough space for scalability • Default folder can be overridden using xsp.persistence.dir.xspstate • Similar options for file uploads and attachments
  • 57. B11 – Page persistence m ode • xsp.persistence.viewstate=fulltree • Default option, whole component tree persisted • xsp.persistence.viewstate=nostate • No component tree is stored, similar to xsp.session.transient=true • xsp.persistence.viewstate=delta • Valid if pages stored in memory • Only stores changes since page first loaded • xsp.persistence.viewstate=deltaex • Valid if multiple pages stored in memory • Stores full component tree for current page, deltas for others
  • 58. B12 – x sp.session.transient • xsp.session.transient=“false” • XPage becomes stateless • Default VALUES overridden between requests • Default STATES not overridden • State not persisted • NOT “Go to next page” from current • INSTEAD “Go to next page” from default • NOT “Toggle show detail” from previous state • INSTEAD “Toggle show detail” from default • Values persisted • Great for large, read-only pages – no storage • Need to build your own “relative” functionality
  • 59. B13 – x sp.session.transient • To see it in action, use the Teamroom database • Check out normal dataView functionality • Expand All / Collapse All, Sorting etc toggles • Filter functionality works • Categories can be expanded • Detail can be expanded • Set xsp.session.transient=true and build the app • Check out dataView functionality now • Sorting doesn't toggle, just switches relative to default • Filter functionality doesn't work • Categories cannot be expanded • Detail can still be expanded, but only because dataView has detailsOnClient=true
  • 60. B14 – Manipulating JSF Lifecycle • See Bonus – Check Values / Submit • Scenario • You want to display a button that says “Check Values” until all values are completed • Then you want to display a “Save” button • But if the user then removes the value from a required field, you want to display “Check Values” button • RenderResponse always runs, so do the checks in the rendered property
  • 61. B15 – Computing Refresh ID • refreshId property can be computed • How is this calculated during the JSF lifecycle? • Bonus – Computed refreshId tests this • The refreshId gets calculated during the renderResponse phase
  • 62. B16 – Themes and Loaded • Bonus – Theme Failing page in sample database • Themes cannot override a property that is Computed on Page Load • Bonus – Theme Failing Repeat • Themes can set most properties on a control • E.g. value property of a repeat control • Required at page load time to create component tree
  • 63. B17 – dataContex ts for value • dataContexts can offer benefits for rendered property • How do they perform when used for value property? • Bonus – dataContext for Value demonstrates this • Even though dataContext is overridden by theme, it is calculated several times during the lifecycle
  • 64. B18 – ex ecMode Goes Wrong • execMode and execId are very powerful • Be carefuly about execId and refreshId • Bonus – execMode demonstrates this • execId defines which control values get passed to component tree • refreshId defines which area gets updated on browser • If refreshId is larger than execId, controls outside execId will lose their values
  • 65. B19 - Repeats Revisited • See Bonus – Language Performance + Rendered • rendered property set for each of 50000 rows • rendered property set in different ways • SSJS in Script Library performs worst • SL much worse on partial refresh • VariableResolver best for performance • Deprecated in JSF 2.0 for ELResolver • VariableResolver in OSGi plugin best for performance and reusability (check out XSP Starter Kit) • dataContext next best, but only reusable within page
  • 66. B20 – Comparisons If you're separating business logic from presentation, Java is the way to go