SlideShare a Scribd company logo
1 of 65
Life In The Fast Lane
 Full Speed XPages
March , 21. – 22. 2013
Faculty Club, Leuven, Belgium

Ulrich Krause, BCC Unternehmensberatung GmbH
Matthew Fyleman, We4IT
About: Matthew Fyleman
 Lotus Notes/Domino Developer since 1993
 Senior Developer at We4IT GmbH




 Recently focused entirely on XPages
  development
 Working on We4IT's XPages framework
 Also on Offline capabilities for We4IT’s mobile
  framework
About: Ulrich Krause
 Lotus Notes/Domino Developer since 1993
 Senior Software Architect at BCC




   OpenNTF Contributor
   OpenNTF Board of Directors
   IBM Champion 2011/2012/2013
   Blog http://www.eknori.de
   Notes Forum (http://www.atnotes.de)
Agenda
 Performance, what factors affect it?
 Java vs. JavaScript
 Looping through Documents, ViewNavigator vs.
  GetNextDocument
 Stringbuilder vs. Concat (+)
 JSF Lifecycle Listener
 Partial Update / Partial Execute
 Variable Resolver
 Tools
XPages Request
Hardware
 The hardware used has a significant influence on performance.
  There are 3 key elements:
   • CPU
   • Main Memory
   • Hard Disk
Hardware
 CPU
  • Cores / Clock / Cache
  •  Poor response time


 Main Memory
  • Limit defined by the operating system
  •  Scalability


 Weak CPU AND Low Memory
  • Poor overall performance
  • Poor response times
  • Server "hangs"
Network
 Latency
     • Time taken for data transmission between multiple computers on a
       network
 Bandwidth
     • Rate of transmission of data


     Greater Bandwidth
    + Lower Latency
    --------------------------------
    = Better Connection
Client & Browser
   Hardware
   How many data requests / responses are transmitted
   How much data is transferred (size)
   Caching of resources
   How much CSJS runs
   Size / complexity of the CSS
   Complexity of the site structure
Limiting factors on performance
 Browser / HTTP server
   • Network latency – distance/time to server. Bandwidth – size of files.
   • Browser limits on concurrent downloads; <= IE7 allows 2 downloads, IE8
     allows 6
 HTTP Server / App Server
   • HTTP Server JVM memory allocation (heap size) & garbage collector
   • CPU time, competition between threads, gives slower response times
   • Threads, limited to 40 by default, configurable in Domino Administrator
 App Server / Domino context
   • Read design elements from the NSF (XPage .class files, form structure, etc)
   • Backend API calls may be expensive, especially for large data sets.
   • Design elements may be network requests.
Limiting factors on performance
 Servlet / Lifecycle
   • Restore control tree – file system read. Control tree locking – no
     concurrent access.
   • Rendered re-evaluated for every control for most phases


 Browser/Client JavaScript/Dojo
   • Inline JavaScript blocks insertion of later HTML elements into the DOM
     tree
   • Dojo does AJAX requests for .js files for dojo modules that are not loaded
General Performance Options
 notes.ini
   • HTTPJVMMaxHeapSizeSet=1
   • HTTPJVMMaxHeapSize=256M
       • Should be set to ¼ of the available RAM
 Domino Administrator
   • HTTP server "Enable logging to" disabled
   • HTTP server thread count – defaults to 40
 Remember, enabling the debugger affects performance
   • JavaEnableDebug=1
   • JavaDebugOptions=transport=dt_socket,server=y,suspend=n,address=8000
   • JavascriptEnableDebug=1 ( Version 9 )
Reducing Memory Utilization
 xsp.persistence.mode=
 Defines the persistence mode for the JSF pages
   • file: All the pages are persisted on disk
   • fileex: All the pages are persisted on disk except the current one, which
     stays in memory
   • <else>: All the pages stay in memory (tree mode)
XPages Design Optimizations
 Simple actions vs links or button with window.location JS
 Reduce server phase processing
       • Use partial update where possible
       • Use partial execute where possible
       • Use disableValidators & immediate event


 Minimize work in rendered / visible computations
       • Use variable resolver


 Repeats & Views
       • Use viewEntry.getColumnValue instead of viewEntry.getDocument.getColumn
       • Use Domino View data source dataCache property where possible
XPages Design Optimizations
 Load-time vs Runtime
      • Using loaded vs rendered
      • ExtLib Dynamic Content
          – allows partial re-loading so more use of load-time optimizations


 Loading resources in the browser
      • CSS & browser JS
          – extract to separate files. Minify & compress files


      • Images
          – use correct size & format. Use CSS Image Sprites as possible
JavaScript/CSS Aggregation
 Groups many DOJO, CSS / JS files into a single file
   •   Less requests from the browser to the server
   •   Performance improvements on networks with high latency
   •   Enhanced performance parsing CSS / JS
   •   Fewer connections to the server
                                           On the Server: xsp.properties:
                                           xsp.resources.aggregate=true
JavaScript/CSS Aggregation
XPages Pre-Load
 XPagesPreload=1
 New Feature in Notes / Domino 8.5.3
 Server and Client

 Java classes from the XPages runtime plug-ins
   • loaded from a fixed list of runtime classes ( 435 in ND 8.5.3 )
   • com.ibm.xsp.core, common utility, JS wrapper, FSF runtime classes


 Java classes referenced in *-faces.config.xml
   • XPages control renderer, data sources, complex types
XPages Pre-Load
• XPagesPreloadDB=Server!!Db.nsf/XPage.xsp, myLocalDb.nsf
   • Works at the application level




   • The application is loaded on the client / server startup into memory. This
     happens even when the application is first opened in the browser
   • For each entry in the notes.ini variable, an XPage URL is generated and
     sent to the server
   • The application is loaded, and the HTML generated
   • The XPages runtime discards the HTML, but retains the application in
     memory
Scoped Variables
 applicationScope
      • Are visible for all users of one application. Expires some time after the last user
        used an applicationScope variable.
        That means applicationScope variables are NOT persistent forever.
 sessionScope
      • Is valid through the session of the current user. A user session expires after
        some time of inactivity. Uses don't have access to the sessionScope variables of
        other users.
 viewScope
      • Is visible for views on the current page only. Useful for transporting a search
        query to a view.
 requestScope
      • Is valid through one request of the current user. That includes refreshing of a
        page.
Caching with Application Scope
JSF Lifecycle
XPages Lifecycle Listener
 What happens in each phase of the JSF lifecycle?




 Ulrich Krause: http://openntf.org/XSnippets.nsf/snippet.xsp?id=a-simple-lifecyclelistener-
XPages Masterclass




http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=XPages%20Masterclass
When to Execute - # vs $
 #
  • Executed every time the page is rendered
  • Use for values that are likely to change
 $
  • Executed when the page is first loaded
  • Use for values that don't change
DataContext
 dataContexts can be thought of as global variables
 dataContext's value can be computed dynamically or on page
  load
   • So you can use ${javascript:@Today()} and run it once rather than running
     a function each time.
 dataContexts can be scoped to any level that datasources can
   • XPage, Custom Control or Panel
   • you can set a dataContext in a panel in a repeat control, to avoid multiple
     references to a NotesDocument's item
 dataContexts are referenced using EL
   • So at no point in the references do you run SSJS, so it's not having to go
     through the SSJS parser
DataContext - Pitfall
 Issue with data context variables if they are bound dynamically.
   • They will be recomputed again and again, even when in Partial Execution
     mode and if they are not in use (http://hasselba.ch/blog/?p=1112)
DataContext - Pitfall
Partial Refresh / Update (Pro)
 Reduced control processing in the render response phase
      • Means less work on the server
           – render response is the most intensive phase


 Smaller response from server.
      • means reduced network usage


 Better browser experience
      • rest of the page is still visible while waiting for a response
      • inserting small sections into the page is much faster than reloading a full page.
Partial Refresh / Update (Cons)
 Dependancy outside of the partial update area
       • Other areas of the control tree are not processed,so any SSJS scripts in those
         other controls will not be run.
       • Enabling Partial Update where it was previously full update may lead to
         functional problems
 Only one area may be partial updated by default
       • In CSJS you can schedule later partial updates of related areas, but any
         concurrent requests will wait for exclusive access to the server-side control
         tree before processing on the server




                                           http://www.timtripcony.com/blog.nsf/d6plinks/TTRY-
                                           84B6VP
Partial Execution
 Reduced control processing in the 3 data-processing phases
       • Means less work on the server, faster response times


 Dependancy on Edit Box values outside of the exec area
       • Submitted values from Edit Boxes and/or other input controls in other areas of
         the control tree are not processed, so any control values and document fields
         in those other areas will not be updated. Enabling Partial Exec where it was
         previously full execution may lead to functional problems where values are
         out-of date in the onclick script or in the redisplayed page.


 onclick Event Handler must be in the exec area
       • The applyRequestValues phase prepares for the invokeApplication phase.The
         onclick simple action or SSJS script won't occur if outside the partial exec area
Partial Execution
 execMode only added in 8.5.1 (not in 8.5.0)
 execId slightly difficult to select in Designer
       • Select your button, in the Outline view, toggle open the button, select the child
         Event Handler control, then set the execId property on the Event Handler.
       • [Better UI proposed in Notes/Domino Next – in the Events tab]
disableValidators / immediate
 disableValidators
   •   JSF life cycle through all phases (1-6)
   •   But requests will not validate the data
   •   Converters continue to work.
   •   Items in documents will be updated
   •   Sven Hasselbach - "Disable all validators at once" (
       http://hasselba.ch/blog/?p=1106)
• Immediate
   •   JSF Lifecycle processes only phases (1, 2, 6)
   •   No data processing
   •   Items in documents are not updated
   •   Onclick event handler scripts and render response calculations are
       performed
Minimize work in rendered / visible computation
 Most properties, like CSS “style” are only computed in the
  renderResponse
 Edit Box and input “value” properties are used in Data Processing
  phases & renderResponse
 Data Source properties are computed during renderResponse &
  results are cached for the next request's Data Processing &
  invokeApplication phases
Minimize work in rendered / visible computation
 The rendered property is computed in all 5 lifecycle phases
 Avoid re-computing values in every rendered property

   • @DbLookup, @DbColumn, getDocumentByKey
   • In the rendered property, save the computed boolean to a viewScope
     variable
Using loaded vs rendered
 Loaded
   • is only computed once in the createView phase
       • not re-computed in the 5 usual phases
   • false means the control is not created. So it can never be rendered.
   • true means the control is added to the control tree.
       • You can still compute rendered when loaded evaluates to true.


 Compute the loaded property on conditions
   • where you could compute the rendered property and save it to the view
     scope
   • it would never need to be recomputed for the rest of the interaction with
     this page
Images
 Use correct file type depending on content
   • JPEG for complexed detailed images

   • PNG/GIF for simple images, fonts, transparencies
       • Use the HTML <img> tag “width” and “height” attributes


   • For faster HTML layout in the browser
       • Size the image to size you intend to use
       • Resizing using html attributes height and width will delay the rendering of your
         page
       • Images larger than necessary will waste bandwidth
CSS Image Sprites
 Use CSS Image Sprites
   • If you have multiple small images, make a single larger image containing
     the smaller images
   • And use CSS to display just the relevant subset image at a location in the
     page
   • For semantically significant sprites, provide an accessibility “title” attribut
     (as sprites don't use the IMG “alt” attribute, but you still want to assist
     blind users)
   • There's no specific XPages support for sprites, but they're used in the
     XPages OneIU themes
CSS Image Sprite Sample




http://www.w3schools.com/css/tryit.asp?filename=trycss_sprites_img
XPages Toolbox
 XPages based Application
    • Runs on the Domino server or the Notes client
    • An NSF needs to be installed on the Domino server/Notes client
    • A profiler jar file should be added to the JVM launch options


 Measures the CPU performance and the memory allocation
 Available from OpenNTF.org
    • Free open source project
    • Search for “XPages Toolbox”
 Extended in 8.5.2 to support Backend classes profiling
 http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=XPages%20Toolbox
XPages Toolbox
XPages Toolbox
 Generate a heap dump of the JVM running in the HTTP task
   • A button in the XPages profiler generates the heap dump
   • From the Domino console

       • tell http xsp heapdump (triggers com.ibm.jvm.Dump.HeapDump())
       • tell http xsp javadump (triggers com.ibm.jvm.Dump.JavaDump())


 Analyze the heap dump using the Eclipse memory analyzer
   • http://www.eclipse.org/mat/
   • http://www.ibm.com/developerworks/java/jdk/tools/dtfj.html
Heapdump / Javadump Analyzer
More Tools
 Print statements
      • In rendered/visible computations to see how often executed
          – print("panel2 evaluating rendered property");
      • In the XPages root control events:
          – before/afterPageLoad, afterRestoreView, before/afterRenderResponse.
      • Custom control root events:
          – before/afterPageLoad.
      • In the document data source events:
          – queryNewDocument, postSaveDocument, etc.

 Task Manager and/or Process Explorer
      • Shows CPU usage & process memory usage as it happens
      • Heap memory usage will be a subset of process memory, but heap dumps are
        only a snapshot
More Tools
 Browser developer tools
   • for watching network transactions, partial updates, response times
   • BROWSER: Firebug, Developer Tools
   • XPiNC: FirebugLite from ExtLib


 Java / Javascript Debugging
   • Degrades performance but can inspect objects, step into code.
   • Use the Eclipse Java debugger.
   • In Dominonotes.ini add these 2 options:
       • JavaEnableDebug=1
       • JavaDebugOptions=transport=dt_socket,server=y,suspend=n,address=8000
Demo - Step-By-Step Optimization
XAgent – SSJS
   Get all „Contacts“ into a NotesDocumentCollection, loop the collection and build the
    JSON by reading the values from items in the document
XAgent – SSJS
XAgent – SSJS – UNID from Item
   Get all „Contacts“ into a NotesDocumentCollection, loop the collection and build the
    JSON by reading the values from items in the document. Also UNID is stored in
    document
XAgent – SSJS – UNID from Item
XAgent – SSJS - SingleItem
   Get all „Contacts“ into a NotesDocumentCollection, loop the collection and get the
    JSON from an item on the document. The JSON is calculated on document save
XAgent – SSJS - SingleItem
XAgent – SSJS – ViewNavigator
 loop thru a view and get the JSON from a view column.
XAgent – SSJS – ViewNavigator
StringBuilder vs String.concat
 Concatenation of Strings is very easy in Java - all you need is a '+‘
 Each time you append something via '+' (String.concat()) a new
  String is created, the old stuff is copied, the new stuff is
  appended, and the old String is thrown away.
  The bigger the String gets the longer it takes - there is more to
  copy and more garbage is produced.
 Accordingly to Arno Unkrig the optimal strategy is to use
  String.concat() for 2 or 3 operands, and StringBuilder for 4 or
  more operands
   String text=               System.out.println("x:"+x+" y:"+y);
       "line 1n"+
       "line 2n"+
       "line 3";
StringBuilder vs String.concat
 When to use StringBuilder over '+' (String.concat()) ?
   • use StringBuilder whenever you assemble a String in a loop
   • Just keep in mind that '+' isn't always a good idea




    http://kaioa.com/node/59
XAgent – SSJS – ViewNavigator + StringBuilder
   loop thru a view and get the JSON from a view column. Use a StringBuilder to concat
    the JSON
XAgent – SSJS – ViewNavigator + StringBuilder
XAgent – Java
   loop thru a view and get the JSON from a view column. Use a StringBuilder to concat
    the JSON + use Java instead of SSJS
XAgent – Java
Themes
 Single Document Containing References to all your CSS Resources
   • resource sections reference the CSS files used
   • control section define what CSS classes are applied to specific controls
 XML Based and Easy To Learn
   • creating a new theme document prefills sample content
 Can Extend Other Themes
   • <theme extends="webstandard">
   • will automatically include all the resource and control definitions from that
     theme built-in themes
       • webstandard, notes, oneUI
Themes
 Create your own themes from scratch.
 Creating a theme that extends from the webstandard or another
  supplied theme will include extra stylesheets and styles that you
  might not need.
 Be prepared to spend more time writing css though
Load Resources from Theme
 Global Application / Configuration properties
Life In The FastLane: Full Speed XPages
Life In The FastLane: Full Speed XPages

More Related Content

What's hot

Node.js Express
Node.js  ExpressNode.js  Express
Node.js ExpressEyal Vardi
 
DNUG HCL Domino 11 First Look
DNUG HCL Domino 11 First LookDNUG HCL Domino 11 First Look
DNUG HCL Domino 11 First Lookdaniel_nashed
 
MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)Uwe Printz
 
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
 
Enterprise java unit-2_chapter-1
Enterprise  java unit-2_chapter-1Enterprise  java unit-2_chapter-1
Enterprise java unit-2_chapter-1sandeep54552
 
Web Worker, Service Worker and Worklets
Web Worker, Service Worker and WorkletsWeb Worker, Service Worker and Worklets
Web Worker, Service Worker and WorkletsKeshav Gupta
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to RedisDvir Volk
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to RedisArnab Mitra
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance TuningMongoDB
 
Introduction to Node js
Introduction to Node jsIntroduction to Node js
Introduction to Node jsAkshay Mathur
 
Introduction to Backbone.js
Introduction to Backbone.jsIntroduction to Backbone.js
Introduction to Backbone.jsPragnesh Vaghela
 
Advanced Cassandra Operations via JMX (Nate McCall, The Last Pickle) | C* Sum...
Advanced Cassandra Operations via JMX (Nate McCall, The Last Pickle) | C* Sum...Advanced Cassandra Operations via JMX (Nate McCall, The Last Pickle) | C* Sum...
Advanced Cassandra Operations via JMX (Nate McCall, The Last Pickle) | C* Sum...DataStax
 
A Technical Introduction to WiredTiger
A Technical Introduction to WiredTigerA Technical Introduction to WiredTiger
A Technical Introduction to WiredTigerMongoDB
 

What's hot (20)

Node.js Express
Node.js  ExpressNode.js  Express
Node.js Express
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
DNUG HCL Domino 11 First Look
DNUG HCL Domino 11 First LookDNUG HCL Domino 11 First Look
DNUG HCL Domino 11 First Look
 
Express js
Express jsExpress js
Express js
 
Express JS
Express JSExpress JS
Express JS
 
MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)
 
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
 
Enterprise java unit-2_chapter-1
Enterprise  java unit-2_chapter-1Enterprise  java unit-2_chapter-1
Enterprise java unit-2_chapter-1
 
Web Worker, Service Worker and Worklets
Web Worker, Service Worker and WorkletsWeb Worker, Service Worker and Worklets
Web Worker, Service Worker and Worklets
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to Redis
 
Full Text Search In PostgreSQL
Full Text Search In PostgreSQLFull Text Search In PostgreSQL
Full Text Search In PostgreSQL
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to Redis
 
An introduction to MongoDB
An introduction to MongoDBAn introduction to MongoDB
An introduction to MongoDB
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance Tuning
 
La plateforme JEE
La plateforme JEELa plateforme JEE
La plateforme JEE
 
Introduction to Node js
Introduction to Node jsIntroduction to Node js
Introduction to Node js
 
Introduction to Backbone.js
Introduction to Backbone.jsIntroduction to Backbone.js
Introduction to Backbone.js
 
Laravel Eloquent ORM
Laravel Eloquent ORMLaravel Eloquent ORM
Laravel Eloquent ORM
 
Advanced Cassandra Operations via JMX (Nate McCall, The Last Pickle) | C* Sum...
Advanced Cassandra Operations via JMX (Nate McCall, The Last Pickle) | C* Sum...Advanced Cassandra Operations via JMX (Nate McCall, The Last Pickle) | C* Sum...
Advanced Cassandra Operations via JMX (Nate McCall, The Last Pickle) | C* Sum...
 
A Technical Introduction to WiredTiger
A Technical Introduction to WiredTigerA Technical Introduction to WiredTiger
A Technical Introduction to WiredTiger
 

Viewers also liked

Life in the fast lane. Full speed XPages
Life in the fast lane. Full speed XPagesLife in the fast lane. Full speed XPages
Life in the fast lane. Full speed XPagesUlrich Krause
 
An Introduction To Model  View  Controller In XPages
An Introduction To Model  View  Controller In XPagesAn Introduction To Model  View  Controller In XPages
An Introduction To Model  View  Controller In XPagesUlrich Krause
 
UKLUG 2012 - XPages, Beyond the basics
UKLUG 2012 - XPages, Beyond the basicsUKLUG 2012 - XPages, Beyond the basics
UKLUG 2012 - XPages, Beyond the basicsUlrich Krause
 
Dr. Strangelove, or how I learned to love plugin development
Dr. Strangelove, or how I learned to love plugin developmentDr. Strangelove, or how I learned to love plugin development
Dr. Strangelove, or how I learned to love plugin developmentUlrich Krause
 
La vita nella corsia di sorpasso; A tutta velocità, XPages!
La vita nella corsia di sorpasso; A tutta velocità, XPages!La vita nella corsia di sorpasso; A tutta velocità, XPages!
La vita nella corsia di sorpasso; A tutta velocità, XPages!Ulrich Krause
 
XPages -Beyond the Basics
XPages -Beyond the BasicsXPages -Beyond the Basics
XPages -Beyond the BasicsUlrich Krause
 
MWLUG 2015 - An Introduction to MVC
MWLUG 2015 - An Introduction to MVCMWLUG 2015 - An Introduction to MVC
MWLUG 2015 - An Introduction to MVCUlrich Krause
 
Dd13.2013.milano.open ntf
Dd13.2013.milano.open ntfDd13.2013.milano.open ntf
Dd13.2013.milano.open ntfUlrich Krause
 
IBM Lotus Notes - From PLATO to the Leading Groupware Platform
IBM Lotus Notes - From PLATO to the Leading Groupware PlatformIBM Lotus Notes - From PLATO to the Leading Groupware Platform
IBM Lotus Notes - From PLATO to the Leading Groupware PlatformUlrich Krause
 
Dnug35 ak-dev.071111-basic
Dnug35 ak-dev.071111-basicDnug35 ak-dev.071111-basic
Dnug35 ak-dev.071111-basicUlrich Krause
 
[DanNotes] XPages - Beyound the Basics
[DanNotes] XPages - Beyound the Basics[DanNotes] XPages - Beyound the Basics
[DanNotes] XPages - Beyound the BasicsUlrich Krause
 
Extension Library - Viagra for XPages
Extension Library - Viagra for XPagesExtension Library - Viagra for XPages
Extension Library - Viagra for XPagesUlrich Krause
 
Compact, Compress, De-Duplicate (DAOS)
Compact, Compress, De-Duplicate (DAOS)Compact, Compress, De-Duplicate (DAOS)
Compact, Compress, De-Duplicate (DAOS)Ulrich Krause
 
Dnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyondDnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyondUlrich Krause
 
AdminCamp 2011 Performance
AdminCamp 2011 PerformanceAdminCamp 2011 Performance
AdminCamp 2011 PerformanceUlrich Krause
 
Dnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookDnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookUlrich Krause
 
DNUG ak-anwendungsentwicklung.18042011
DNUG ak-anwendungsentwicklung.18042011DNUG ak-anwendungsentwicklung.18042011
DNUG ak-anwendungsentwicklung.18042011Ulrich Krause
 

Viewers also liked (20)

Life in the fast lane. Full speed XPages
Life in the fast lane. Full speed XPagesLife in the fast lane. Full speed XPages
Life in the fast lane. Full speed XPages
 
An Introduction To Model  View  Controller In XPages
An Introduction To Model  View  Controller In XPagesAn Introduction To Model  View  Controller In XPages
An Introduction To Model  View  Controller In XPages
 
UKLUG 2012 - XPages, Beyond the basics
UKLUG 2012 - XPages, Beyond the basicsUKLUG 2012 - XPages, Beyond the basics
UKLUG 2012 - XPages, Beyond the basics
 
Dr. Strangelove, or how I learned to love plugin development
Dr. Strangelove, or how I learned to love plugin developmentDr. Strangelove, or how I learned to love plugin development
Dr. Strangelove, or how I learned to love plugin development
 
Ec13 xpages-basic
Ec13 xpages-basicEc13 xpages-basic
Ec13 xpages-basic
 
La vita nella corsia di sorpasso; A tutta velocità, XPages!
La vita nella corsia di sorpasso; A tutta velocità, XPages!La vita nella corsia di sorpasso; A tutta velocità, XPages!
La vita nella corsia di sorpasso; A tutta velocità, XPages!
 
XPages -Beyond the Basics
XPages -Beyond the BasicsXPages -Beyond the Basics
XPages -Beyond the Basics
 
XPages - The Basics
XPages - The BasicsXPages - The Basics
XPages - The Basics
 
MWLUG 2015 - An Introduction to MVC
MWLUG 2015 - An Introduction to MVCMWLUG 2015 - An Introduction to MVC
MWLUG 2015 - An Introduction to MVC
 
Dd13.2013.milano.open ntf
Dd13.2013.milano.open ntfDd13.2013.milano.open ntf
Dd13.2013.milano.open ntf
 
IBM Lotus Notes - From PLATO to the Leading Groupware Platform
IBM Lotus Notes - From PLATO to the Leading Groupware PlatformIBM Lotus Notes - From PLATO to the Leading Groupware Platform
IBM Lotus Notes - From PLATO to the Leading Groupware Platform
 
Dnug35 ak-dev.071111-basic
Dnug35 ak-dev.071111-basicDnug35 ak-dev.071111-basic
Dnug35 ak-dev.071111-basic
 
[DanNotes] XPages - Beyound the Basics
[DanNotes] XPages - Beyound the Basics[DanNotes] XPages - Beyound the Basics
[DanNotes] XPages - Beyound the Basics
 
XPages Performance
XPages PerformanceXPages Performance
XPages Performance
 
Extension Library - Viagra for XPages
Extension Library - Viagra for XPagesExtension Library - Viagra for XPages
Extension Library - Viagra for XPages
 
Compact, Compress, De-Duplicate (DAOS)
Compact, Compress, De-Duplicate (DAOS)Compact, Compress, De-Duplicate (DAOS)
Compact, Compress, De-Duplicate (DAOS)
 
Dnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyondDnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyond
 
AdminCamp 2011 Performance
AdminCamp 2011 PerformanceAdminCamp 2011 Performance
AdminCamp 2011 Performance
 
Dnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookDnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbook
 
DNUG ak-anwendungsentwicklung.18042011
DNUG ak-anwendungsentwicklung.18042011DNUG ak-anwendungsentwicklung.18042011
DNUG ak-anwendungsentwicklung.18042011
 

Similar to Life In The FastLane: Full Speed XPages

The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!
The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!
The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!Teamstudio
 
(ATS6-PLAT06) Maximizing AEP Performance
(ATS6-PLAT06) Maximizing AEP Performance(ATS6-PLAT06) Maximizing AEP Performance
(ATS6-PLAT06) Maximizing AEP PerformanceBIOVIA
 
(ATS4-PLAT08) Server Pool Management
(ATS4-PLAT08) Server Pool Management(ATS4-PLAT08) Server Pool Management
(ATS4-PLAT08) Server Pool ManagementBIOVIA
 
Day 7 - Make it Fast
Day 7 - Make it FastDay 7 - Make it Fast
Day 7 - Make it FastBarry Jones
 
071410 sun a_1515_feldman_stephen
071410 sun a_1515_feldman_stephen071410 sun a_1515_feldman_stephen
071410 sun a_1515_feldman_stephenSteve Feldman
 
On-boarding with JanusGraph Performance
On-boarding with JanusGraph PerformanceOn-boarding with JanusGraph Performance
On-boarding with JanusGraph PerformanceChin Huang
 
SharePoint 2013 Performance Analysis - Robi Vončina
SharePoint 2013 Performance Analysis - Robi VončinaSharePoint 2013 Performance Analysis - Robi Vončina
SharePoint 2013 Performance Analysis - Robi VončinaSPC Adriatics
 
SharePoint Saturday San Antonio: SharePoint 2010 Performance
SharePoint Saturday San Antonio: SharePoint 2010 PerformanceSharePoint Saturday San Antonio: SharePoint 2010 Performance
SharePoint Saturday San Antonio: SharePoint 2010 PerformanceBrian Culver
 
What's new in JBoss ON 3.2
What's new in JBoss ON 3.2What's new in JBoss ON 3.2
What's new in JBoss ON 3.2Thomas Segismont
 
Intro to XPages for Administrators (DanNotes, November 28, 2012)
Intro to XPages for Administrators (DanNotes, November 28, 2012)Intro to XPages for Administrators (DanNotes, November 28, 2012)
Intro to XPages for Administrators (DanNotes, November 28, 2012)Per Henrik Lausten
 
Configuring Apache Servers for Better Web Perormance
Configuring Apache Servers for Better Web PerormanceConfiguring Apache Servers for Better Web Perormance
Configuring Apache Servers for Better Web PerormanceSpark::red
 
Learn from my Mistakes - Building Better Solutions in SPFx
Learn from my  Mistakes - Building Better Solutions in SPFxLearn from my  Mistakes - Building Better Solutions in SPFx
Learn from my Mistakes - Building Better Solutions in SPFxThomas Daly
 
(ATS4-PLAT01) Core Architecture Changes in AEP 9.0 and their Impact on Admini...
(ATS4-PLAT01) Core Architecture Changes in AEP 9.0 and their Impact on Admini...(ATS4-PLAT01) Core Architecture Changes in AEP 9.0 and their Impact on Admini...
(ATS4-PLAT01) Core Architecture Changes in AEP 9.0 and their Impact on Admini...BIOVIA
 
(ATS6-PLAT07) Managing AEP in an enterprise environment
(ATS6-PLAT07) Managing AEP in an enterprise environment(ATS6-PLAT07) Managing AEP in an enterprise environment
(ATS6-PLAT07) Managing AEP in an enterprise environmentBIOVIA
 
SQL Explore 2012: P&T Part 1
SQL Explore 2012: P&T Part 1SQL Explore 2012: P&T Part 1
SQL Explore 2012: P&T Part 1sqlserver.co.il
 

Similar to Life In The FastLane: Full Speed XPages (20)

Life in the Fast Lane: Full Speed XPages!, #dd13
Life in the Fast Lane: Full Speed XPages!, #dd13Life in the Fast Lane: Full Speed XPages!, #dd13
Life in the Fast Lane: Full Speed XPages!, #dd13
 
The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!
The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!
The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!
 
(ATS6-PLAT06) Maximizing AEP Performance
(ATS6-PLAT06) Maximizing AEP Performance(ATS6-PLAT06) Maximizing AEP Performance
(ATS6-PLAT06) Maximizing AEP Performance
 
(ATS4-PLAT08) Server Pool Management
(ATS4-PLAT08) Server Pool Management(ATS4-PLAT08) Server Pool Management
(ATS4-PLAT08) Server Pool Management
 
Day 7 - Make it Fast
Day 7 - Make it FastDay 7 - Make it Fast
Day 7 - Make it Fast
 
Salesforce Performance hacks - Client Side
Salesforce Performance hacks - Client SideSalesforce Performance hacks - Client Side
Salesforce Performance hacks - Client Side
 
XPages Performance Master Class - Survive in the fast lane on the Autobahn (E...
XPages Performance Master Class - Survive in the fast lane on the Autobahn (E...XPages Performance Master Class - Survive in the fast lane on the Autobahn (E...
XPages Performance Master Class - Survive in the fast lane on the Autobahn (E...
 
071410 sun a_1515_feldman_stephen
071410 sun a_1515_feldman_stephen071410 sun a_1515_feldman_stephen
071410 sun a_1515_feldman_stephen
 
Fastest Servlets in the West
Fastest Servlets in the WestFastest Servlets in the West
Fastest Servlets in the West
 
On-boarding with JanusGraph Performance
On-boarding with JanusGraph PerformanceOn-boarding with JanusGraph Performance
On-boarding with JanusGraph Performance
 
Drupal performance
Drupal performanceDrupal performance
Drupal performance
 
SharePoint 2013 Performance Analysis - Robi Vončina
SharePoint 2013 Performance Analysis - Robi VončinaSharePoint 2013 Performance Analysis - Robi Vončina
SharePoint 2013 Performance Analysis - Robi Vončina
 
SharePoint Saturday San Antonio: SharePoint 2010 Performance
SharePoint Saturday San Antonio: SharePoint 2010 PerformanceSharePoint Saturday San Antonio: SharePoint 2010 Performance
SharePoint Saturday San Antonio: SharePoint 2010 Performance
 
What's new in JBoss ON 3.2
What's new in JBoss ON 3.2What's new in JBoss ON 3.2
What's new in JBoss ON 3.2
 
Intro to XPages for Administrators (DanNotes, November 28, 2012)
Intro to XPages for Administrators (DanNotes, November 28, 2012)Intro to XPages for Administrators (DanNotes, November 28, 2012)
Intro to XPages for Administrators (DanNotes, November 28, 2012)
 
Configuring Apache Servers for Better Web Perormance
Configuring Apache Servers for Better Web PerormanceConfiguring Apache Servers for Better Web Perormance
Configuring Apache Servers for Better Web Perormance
 
Learn from my Mistakes - Building Better Solutions in SPFx
Learn from my  Mistakes - Building Better Solutions in SPFxLearn from my  Mistakes - Building Better Solutions in SPFx
Learn from my Mistakes - Building Better Solutions in SPFx
 
(ATS4-PLAT01) Core Architecture Changes in AEP 9.0 and their Impact on Admini...
(ATS4-PLAT01) Core Architecture Changes in AEP 9.0 and their Impact on Admini...(ATS4-PLAT01) Core Architecture Changes in AEP 9.0 and their Impact on Admini...
(ATS4-PLAT01) Core Architecture Changes in AEP 9.0 and their Impact on Admini...
 
(ATS6-PLAT07) Managing AEP in an enterprise environment
(ATS6-PLAT07) Managing AEP in an enterprise environment(ATS6-PLAT07) Managing AEP in an enterprise environment
(ATS6-PLAT07) Managing AEP in an enterprise environment
 
SQL Explore 2012: P&T Part 1
SQL Explore 2012: P&T Part 1SQL Explore 2012: P&T Part 1
SQL Explore 2012: P&T Part 1
 

More from Ulrich Krause

What is new in Notes & Domino Deleopment V10.x
What is new in Notes & Domino Deleopment V10.xWhat is new in Notes & Domino Deleopment V10.x
What is new in Notes & Domino Deleopment V10.xUlrich Krause
 
When Plato Left The Cave - A brief history of Lotus Notes
When Plato Left The Cave - A brief history of Lotus NotesWhen Plato Left The Cave - A brief history of Lotus Notes
When Plato Left The Cave - A brief history of Lotus NotesUlrich Krause
 
C API for Lotus Notes & Domino
C API for Lotus Notes & DominoC API for Lotus Notes & Domino
C API for Lotus Notes & DominoUlrich Krause
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code CookbookUlrich Krause
 
AdminCamp2010, Closing General Session
AdminCamp2010, Closing General SessionAdminCamp2010, Closing General Session
AdminCamp2010, Closing General SessionUlrich Krause
 
Keine Angst vor Sametime 8.5.1
Keine Angst vor Sametime 8.5.1Keine Angst vor Sametime 8.5.1
Keine Angst vor Sametime 8.5.1Ulrich Krause
 
Compact, Compress, De-DUplicate
Compact, Compress, De-DUplicateCompact, Compress, De-DUplicate
Compact, Compress, De-DUplicateUlrich Krause
 
C / C++ Api for Beginners
C / C++ Api for BeginnersC / C++ Api for Beginners
C / C++ Api for BeginnersUlrich Krause
 

More from Ulrich Krause (11)

What is new in Notes & Domino Deleopment V10.x
What is new in Notes & Domino Deleopment V10.xWhat is new in Notes & Domino Deleopment V10.x
What is new in Notes & Domino Deleopment V10.x
 
When Plato Left The Cave - A brief history of Lotus Notes
When Plato Left The Cave - A brief history of Lotus NotesWhen Plato Left The Cave - A brief history of Lotus Notes
When Plato Left The Cave - A brief history of Lotus Notes
 
EntwicklerCamp CGS
EntwicklerCamp CGSEntwicklerCamp CGS
EntwicklerCamp CGS
 
C API for Lotus Notes & Domino
C API for Lotus Notes & DominoC API for Lotus Notes & Domino
C API for Lotus Notes & Domino
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code Cookbook
 
Ccd
CcdCcd
Ccd
 
AdminCamp2010, Closing General Session
AdminCamp2010, Closing General SessionAdminCamp2010, Closing General Session
AdminCamp2010, Closing General Session
 
Keine Angst vor Sametime 8.5.1
Keine Angst vor Sametime 8.5.1Keine Angst vor Sametime 8.5.1
Keine Angst vor Sametime 8.5.1
 
Compact, Compress, De-DUplicate
Compact, Compress, De-DUplicateCompact, Compress, De-DUplicate
Compact, Compress, De-DUplicate
 
Daos
DaosDaos
Daos
 
C / C++ Api for Beginners
C / C++ Api for BeginnersC / C++ Api for Beginners
C / C++ Api for Beginners
 

Recently uploaded

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
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
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
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Neo4j
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDGMarianaLemus7
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
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
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
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
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
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
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Unlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsUnlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsPrecisely
 
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
 

Recently uploaded (20)

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
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
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
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDG
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
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
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
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...
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
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
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Unlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsUnlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power Systems
 
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
 

Life In The FastLane: Full Speed XPages

  • 1. Life In The Fast Lane Full Speed XPages March , 21. – 22. 2013 Faculty Club, Leuven, Belgium Ulrich Krause, BCC Unternehmensberatung GmbH Matthew Fyleman, We4IT
  • 2. About: Matthew Fyleman  Lotus Notes/Domino Developer since 1993  Senior Developer at We4IT GmbH  Recently focused entirely on XPages development  Working on We4IT's XPages framework  Also on Offline capabilities for We4IT’s mobile framework
  • 3. About: Ulrich Krause  Lotus Notes/Domino Developer since 1993  Senior Software Architect at BCC  OpenNTF Contributor  OpenNTF Board of Directors  IBM Champion 2011/2012/2013  Blog http://www.eknori.de  Notes Forum (http://www.atnotes.de)
  • 4. Agenda  Performance, what factors affect it?  Java vs. JavaScript  Looping through Documents, ViewNavigator vs. GetNextDocument  Stringbuilder vs. Concat (+)  JSF Lifecycle Listener  Partial Update / Partial Execute  Variable Resolver  Tools
  • 6. Hardware  The hardware used has a significant influence on performance. There are 3 key elements: • CPU • Main Memory • Hard Disk
  • 7. Hardware  CPU • Cores / Clock / Cache •  Poor response time  Main Memory • Limit defined by the operating system •  Scalability  Weak CPU AND Low Memory • Poor overall performance • Poor response times • Server "hangs"
  • 8. Network  Latency • Time taken for data transmission between multiple computers on a network  Bandwidth • Rate of transmission of data  Greater Bandwidth + Lower Latency -------------------------------- = Better Connection
  • 9. Client & Browser  Hardware  How many data requests / responses are transmitted  How much data is transferred (size)  Caching of resources  How much CSJS runs  Size / complexity of the CSS  Complexity of the site structure
  • 10. Limiting factors on performance  Browser / HTTP server • Network latency – distance/time to server. Bandwidth – size of files. • Browser limits on concurrent downloads; <= IE7 allows 2 downloads, IE8 allows 6  HTTP Server / App Server • HTTP Server JVM memory allocation (heap size) & garbage collector • CPU time, competition between threads, gives slower response times • Threads, limited to 40 by default, configurable in Domino Administrator  App Server / Domino context • Read design elements from the NSF (XPage .class files, form structure, etc) • Backend API calls may be expensive, especially for large data sets. • Design elements may be network requests.
  • 11. Limiting factors on performance  Servlet / Lifecycle • Restore control tree – file system read. Control tree locking – no concurrent access. • Rendered re-evaluated for every control for most phases  Browser/Client JavaScript/Dojo • Inline JavaScript blocks insertion of later HTML elements into the DOM tree • Dojo does AJAX requests for .js files for dojo modules that are not loaded
  • 12. General Performance Options  notes.ini • HTTPJVMMaxHeapSizeSet=1 • HTTPJVMMaxHeapSize=256M • Should be set to ¼ of the available RAM  Domino Administrator • HTTP server "Enable logging to" disabled • HTTP server thread count – defaults to 40  Remember, enabling the debugger affects performance • JavaEnableDebug=1 • JavaDebugOptions=transport=dt_socket,server=y,suspend=n,address=8000 • JavascriptEnableDebug=1 ( Version 9 )
  • 13. Reducing Memory Utilization  xsp.persistence.mode=  Defines the persistence mode for the JSF pages • file: All the pages are persisted on disk • fileex: All the pages are persisted on disk except the current one, which stays in memory • <else>: All the pages stay in memory (tree mode)
  • 14. XPages Design Optimizations  Simple actions vs links or button with window.location JS  Reduce server phase processing • Use partial update where possible • Use partial execute where possible • Use disableValidators & immediate event  Minimize work in rendered / visible computations • Use variable resolver  Repeats & Views • Use viewEntry.getColumnValue instead of viewEntry.getDocument.getColumn • Use Domino View data source dataCache property where possible
  • 15. XPages Design Optimizations  Load-time vs Runtime • Using loaded vs rendered • ExtLib Dynamic Content – allows partial re-loading so more use of load-time optimizations  Loading resources in the browser • CSS & browser JS – extract to separate files. Minify & compress files • Images – use correct size & format. Use CSS Image Sprites as possible
  • 16. JavaScript/CSS Aggregation  Groups many DOJO, CSS / JS files into a single file • Less requests from the browser to the server • Performance improvements on networks with high latency • Enhanced performance parsing CSS / JS • Fewer connections to the server On the Server: xsp.properties: xsp.resources.aggregate=true
  • 18. XPages Pre-Load  XPagesPreload=1  New Feature in Notes / Domino 8.5.3  Server and Client  Java classes from the XPages runtime plug-ins • loaded from a fixed list of runtime classes ( 435 in ND 8.5.3 ) • com.ibm.xsp.core, common utility, JS wrapper, FSF runtime classes  Java classes referenced in *-faces.config.xml • XPages control renderer, data sources, complex types
  • 19. XPages Pre-Load • XPagesPreloadDB=Server!!Db.nsf/XPage.xsp, myLocalDb.nsf • Works at the application level • The application is loaded on the client / server startup into memory. This happens even when the application is first opened in the browser • For each entry in the notes.ini variable, an XPage URL is generated and sent to the server • The application is loaded, and the HTML generated • The XPages runtime discards the HTML, but retains the application in memory
  • 20. Scoped Variables  applicationScope • Are visible for all users of one application. Expires some time after the last user used an applicationScope variable. That means applicationScope variables are NOT persistent forever.  sessionScope • Is valid through the session of the current user. A user session expires after some time of inactivity. Uses don't have access to the sessionScope variables of other users.  viewScope • Is visible for views on the current page only. Useful for transporting a search query to a view.  requestScope • Is valid through one request of the current user. That includes refreshing of a page.
  • 23. XPages Lifecycle Listener  What happens in each phase of the JSF lifecycle? Ulrich Krause: http://openntf.org/XSnippets.nsf/snippet.xsp?id=a-simple-lifecyclelistener-
  • 25. When to Execute - # vs $  # • Executed every time the page is rendered • Use for values that are likely to change  $ • Executed when the page is first loaded • Use for values that don't change
  • 26. DataContext  dataContexts can be thought of as global variables  dataContext's value can be computed dynamically or on page load • So you can use ${javascript:@Today()} and run it once rather than running a function each time.  dataContexts can be scoped to any level that datasources can • XPage, Custom Control or Panel • you can set a dataContext in a panel in a repeat control, to avoid multiple references to a NotesDocument's item  dataContexts are referenced using EL • So at no point in the references do you run SSJS, so it's not having to go through the SSJS parser
  • 27. DataContext - Pitfall  Issue with data context variables if they are bound dynamically. • They will be recomputed again and again, even when in Partial Execution mode and if they are not in use (http://hasselba.ch/blog/?p=1112)
  • 29. Partial Refresh / Update (Pro)  Reduced control processing in the render response phase • Means less work on the server – render response is the most intensive phase  Smaller response from server. • means reduced network usage  Better browser experience • rest of the page is still visible while waiting for a response • inserting small sections into the page is much faster than reloading a full page.
  • 30. Partial Refresh / Update (Cons)  Dependancy outside of the partial update area • Other areas of the control tree are not processed,so any SSJS scripts in those other controls will not be run. • Enabling Partial Update where it was previously full update may lead to functional problems  Only one area may be partial updated by default • In CSJS you can schedule later partial updates of related areas, but any concurrent requests will wait for exclusive access to the server-side control tree before processing on the server http://www.timtripcony.com/blog.nsf/d6plinks/TTRY- 84B6VP
  • 31. Partial Execution  Reduced control processing in the 3 data-processing phases • Means less work on the server, faster response times  Dependancy on Edit Box values outside of the exec area • Submitted values from Edit Boxes and/or other input controls in other areas of the control tree are not processed, so any control values and document fields in those other areas will not be updated. Enabling Partial Exec where it was previously full execution may lead to functional problems where values are out-of date in the onclick script or in the redisplayed page.  onclick Event Handler must be in the exec area • The applyRequestValues phase prepares for the invokeApplication phase.The onclick simple action or SSJS script won't occur if outside the partial exec area
  • 32. Partial Execution  execMode only added in 8.5.1 (not in 8.5.0)  execId slightly difficult to select in Designer • Select your button, in the Outline view, toggle open the button, select the child Event Handler control, then set the execId property on the Event Handler. • [Better UI proposed in Notes/Domino Next – in the Events tab]
  • 33. disableValidators / immediate  disableValidators • JSF life cycle through all phases (1-6) • But requests will not validate the data • Converters continue to work. • Items in documents will be updated • Sven Hasselbach - "Disable all validators at once" ( http://hasselba.ch/blog/?p=1106) • Immediate • JSF Lifecycle processes only phases (1, 2, 6) • No data processing • Items in documents are not updated • Onclick event handler scripts and render response calculations are performed
  • 34. Minimize work in rendered / visible computation  Most properties, like CSS “style” are only computed in the renderResponse  Edit Box and input “value” properties are used in Data Processing phases & renderResponse  Data Source properties are computed during renderResponse & results are cached for the next request's Data Processing & invokeApplication phases
  • 35. Minimize work in rendered / visible computation  The rendered property is computed in all 5 lifecycle phases  Avoid re-computing values in every rendered property • @DbLookup, @DbColumn, getDocumentByKey • In the rendered property, save the computed boolean to a viewScope variable
  • 36. Using loaded vs rendered  Loaded • is only computed once in the createView phase • not re-computed in the 5 usual phases • false means the control is not created. So it can never be rendered. • true means the control is added to the control tree. • You can still compute rendered when loaded evaluates to true.  Compute the loaded property on conditions • where you could compute the rendered property and save it to the view scope • it would never need to be recomputed for the rest of the interaction with this page
  • 37. Images  Use correct file type depending on content • JPEG for complexed detailed images • PNG/GIF for simple images, fonts, transparencies • Use the HTML <img> tag “width” and “height” attributes • For faster HTML layout in the browser • Size the image to size you intend to use • Resizing using html attributes height and width will delay the rendering of your page • Images larger than necessary will waste bandwidth
  • 38. CSS Image Sprites  Use CSS Image Sprites • If you have multiple small images, make a single larger image containing the smaller images • And use CSS to display just the relevant subset image at a location in the page • For semantically significant sprites, provide an accessibility “title” attribut (as sprites don't use the IMG “alt” attribute, but you still want to assist blind users) • There's no specific XPages support for sprites, but they're used in the XPages OneIU themes
  • 39. CSS Image Sprite Sample http://www.w3schools.com/css/tryit.asp?filename=trycss_sprites_img
  • 40. XPages Toolbox  XPages based Application • Runs on the Domino server or the Notes client • An NSF needs to be installed on the Domino server/Notes client • A profiler jar file should be added to the JVM launch options  Measures the CPU performance and the memory allocation  Available from OpenNTF.org • Free open source project • Search for “XPages Toolbox”  Extended in 8.5.2 to support Backend classes profiling http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=XPages%20Toolbox
  • 42. XPages Toolbox  Generate a heap dump of the JVM running in the HTTP task • A button in the XPages profiler generates the heap dump • From the Domino console • tell http xsp heapdump (triggers com.ibm.jvm.Dump.HeapDump()) • tell http xsp javadump (triggers com.ibm.jvm.Dump.JavaDump())  Analyze the heap dump using the Eclipse memory analyzer • http://www.eclipse.org/mat/ • http://www.ibm.com/developerworks/java/jdk/tools/dtfj.html
  • 44. More Tools  Print statements • In rendered/visible computations to see how often executed – print("panel2 evaluating rendered property"); • In the XPages root control events: – before/afterPageLoad, afterRestoreView, before/afterRenderResponse. • Custom control root events: – before/afterPageLoad. • In the document data source events: – queryNewDocument, postSaveDocument, etc.  Task Manager and/or Process Explorer • Shows CPU usage & process memory usage as it happens • Heap memory usage will be a subset of process memory, but heap dumps are only a snapshot
  • 45. More Tools  Browser developer tools • for watching network transactions, partial updates, response times • BROWSER: Firebug, Developer Tools • XPiNC: FirebugLite from ExtLib  Java / Javascript Debugging • Degrades performance but can inspect objects, step into code. • Use the Eclipse Java debugger. • In Dominonotes.ini add these 2 options: • JavaEnableDebug=1 • JavaDebugOptions=transport=dt_socket,server=y,suspend=n,address=8000
  • 46. Demo - Step-By-Step Optimization
  • 47. XAgent – SSJS  Get all „Contacts“ into a NotesDocumentCollection, loop the collection and build the JSON by reading the values from items in the document
  • 49. XAgent – SSJS – UNID from Item  Get all „Contacts“ into a NotesDocumentCollection, loop the collection and build the JSON by reading the values from items in the document. Also UNID is stored in document
  • 50. XAgent – SSJS – UNID from Item
  • 51. XAgent – SSJS - SingleItem  Get all „Contacts“ into a NotesDocumentCollection, loop the collection and get the JSON from an item on the document. The JSON is calculated on document save
  • 52. XAgent – SSJS - SingleItem
  • 53. XAgent – SSJS – ViewNavigator  loop thru a view and get the JSON from a view column.
  • 54. XAgent – SSJS – ViewNavigator
  • 55. StringBuilder vs String.concat  Concatenation of Strings is very easy in Java - all you need is a '+‘  Each time you append something via '+' (String.concat()) a new String is created, the old stuff is copied, the new stuff is appended, and the old String is thrown away. The bigger the String gets the longer it takes - there is more to copy and more garbage is produced.  Accordingly to Arno Unkrig the optimal strategy is to use String.concat() for 2 or 3 operands, and StringBuilder for 4 or more operands String text= System.out.println("x:"+x+" y:"+y); "line 1n"+ "line 2n"+ "line 3";
  • 56. StringBuilder vs String.concat  When to use StringBuilder over '+' (String.concat()) ? • use StringBuilder whenever you assemble a String in a loop • Just keep in mind that '+' isn't always a good idea http://kaioa.com/node/59
  • 57. XAgent – SSJS – ViewNavigator + StringBuilder  loop thru a view and get the JSON from a view column. Use a StringBuilder to concat the JSON
  • 58. XAgent – SSJS – ViewNavigator + StringBuilder
  • 59. XAgent – Java  loop thru a view and get the JSON from a view column. Use a StringBuilder to concat the JSON + use Java instead of SSJS
  • 61. Themes  Single Document Containing References to all your CSS Resources • resource sections reference the CSS files used • control section define what CSS classes are applied to specific controls  XML Based and Easy To Learn • creating a new theme document prefills sample content  Can Extend Other Themes • <theme extends="webstandard"> • will automatically include all the resource and control definitions from that theme built-in themes • webstandard, notes, oneUI
  • 62. Themes  Create your own themes from scratch.  Creating a theme that extends from the webstandard or another supplied theme will include extra stylesheets and styles that you might not need.  Be prepared to spend more time writing css though
  • 63. Load Resources from Theme  Global Application / Configuration properties

Editor's Notes

  1. Ulrich 4,5,14,15,20.21,22,23,24,37,38,39, 46 - 60
  2. Change the server page persistence setting to keep the current page in memory. Strictly speaking, keeping all pages in memory provides the best performance, but it tends to be downright wasteful of memory. When only the current page is kept in memory, as a user navigates from page to page (as opposed to firing events against the page they&apos;re already on... even if it&apos;s a full refresh event), it serializes the state of the previous page to disk. If a subsequent event is fired against that previous page, then that page&apos;s state is retrieved from disk and loaded back into memory.  But this scenario only occurs if the application loads a new page in a new window or tab, and the user later switches back to the original window and interacts with it again. In typical navigation scenarios, once the user has opened a new page, the previous page instance no longer exists... even if they navigate back to the same page again, it&apos;s a new instance   of that page. Hence, keeping all pages in memory essentially guarantees at least a temporary memory leak. All of that storage is eventually released, of course, but in the meantime the server is consuming memory it will never need again that would be better served storing whatever you&apos;re explicitly caching in scope variables.
  3. JavaScript/CSS Aggregation feature For performance reasons, the XPages runtime now features a new option that dynamically aggregates multiple Dojo modules, or multiple CSSs into a single file. This results in the following performance improvements:a decrease in requests sent from the browser to the server an increase in user performance, particularly in the context of networks with high latency an increase in the speed of JS/CSS parsing from the browser the freeing up of server connections to fulfill other requests As an extreme example of the saving, let&apos;s say the XPages Extension Library is using the page DWA_ListView.xsp. Without the aggregator enabled, 82 requests are made to the server. With the aggregator enabled, the count decreases to 6 requests, including the Ajax request that gets the data. Also, a test run on processing time might see changes from ~4 sec to ~800 ms. To allow you to actvate this option, XPages now feature a new runtime option, which can be set in xsp.properties (database or server level). This option is xsp.resources.aggregate=true It can also be set in Domino Designer from the Application Properties - XPages tab by checking the Use runtime optimized JavaScript and CCS resources option.
  4. XPages Preload options New options designed to improve the startup performance of XPages applications have been added to this release. A preference can be set that preloads the XPages runtime on the Domino server and Notes client. Additionally, specific XPages applications may also be preloaded. The preferences are set as entries in the NOTES.INI file and have the following form: XPagesPreload=1 XPagesPreloadDB=myServer!!myDb.nsf/myXPage.xsp,myLocalDb.nsf/test.xsp The XPagesPreload entry causes an extensive list of XPages runtime Java classes to be preloaded, so they are available in memory when an application is opened by a user. The XPagesPreloadDB preference lets a comma separated list of applications be specified, with or without a specific XPage extension. Again, any required classes are loaded when the server or client starts up and are thus available as soon as any declared application is accessed by a user. The benefit of this may be more evident when running in remote mode on the Notes client, i.e. the XPages is running on the client but the application itself resides on a remote server. In this instance, the Java classes in the application (XPages, custom controls) need to be loaded across the network in order to be executed in the local XPD web container. Preloading such applications produces more responsive initial user experience.
  5. First and foremost, become intimately familiar with the so-called &quot;scope variables&quot;. The nature and use of these are documented in detail elsewhere, so I won&apos;t belabor that here. But the better you understand what information is appropriate to store in each scope - and that you can store complex object structures, not just &quot;string-to-string&quot; mapping - and the more you take advantage of this, the faster the application&apos;s response will be. This is because you&apos;re limiting disk I/O as much as possible... the more frequently the application can just pull whatever data the user is requesting from RAM, instead of querying the database every time, the faster the application will be. This is why you want lots and lots of RAM. :) Of course, you don&apos;t want to be gratuitous with your memory storage, which is why it&apos;s crucial to understand which scope is appropriate for which type of data... when you get the hang of this, Domino will clean up these memory caches for you automatically.  If you find that you&apos;re running out of memory, but you&apos;re confident your scope storage is reasonably optimized, tweak the application properties to clear the application scope periodically. The higher the frequency you set, the more you can cache in all the scopes without bursting the heap... but if you find you&apos;re needing to set this to a frequency of less than an hour, revisit what you&apos;re actually storing, because it&apos;s probably out of control.
  6. Wherever possible, change your expressions from dynamic bindings to page load bindings. This is just a fancy way of saying that ${database.title} is always better than #{database.title}. The $ means that the expression is only calculated once per page instance... # means it&apos;s recalculated as often as needed - sometimes several times within the same request, depending upon what value is bound to the expression. So obviously you can&apos;t just change all your expressions to $... input controls bound to form items, for instance, should remain #. But if you have computed text displaying the application&apos;s title (as in the above example), that value is obviously unlikely to change during any given page instance, so change it to a $ expression, and then the server only has to evaluate it once. Combine this optimization with thorough scope caching, and it&apos;s easy to see how this can really speed up page load times and event execution response. This gets particularly noticeable when dealing with repeat controls: each time a user navigates to the next page of a repeat, if that repeat&apos;s value is a # binding, it has to recalculate that value... change it to a $, and it only loads the collection once. Even if the event the user triggered has nothing to do with the repeat, the server has to recalculate all # bindings, so if the repeat&apos;s value is a #, it still has to pull the collection again even though the user wasn&apos;t explicitly interacting with the repeat.
  7. will tend to see out-of-date values. To see up-to-date but not-converted values use: var editBox1 = getComponent(&apos;editBox1&apos;); var value = editBox1.getSubmittedValue(); if( null == value ) value = editBox1.getValue();
  8. Explain the difference between CPU and WallTime