SlideShare ist ein Scribd-Unternehmen logo
1 von 39
UKLUG 2012 – Cardiff, Wales
Stop (de)bugging me!
UKLUG 2012 – Cardiff, Wales
Disclaimer
This session is only for people that
make errors. All others can leave.
Suggestions:
• Re-inventing your ideas (room 3)
• The DevAdmin Chimera (room 2)
UKLUG 2012 – Cardiff, Wales
Agenda
• Debuggers in Designer
• Java debugger
• SSJS debugger
• XPage Debug Toolbar
™
UKLUG 2012 – Cardiff, Wales
Who’s that guy anyway?
• Freelance consultant/ developer
• IBM Notes/ Domino
• XPages, web, client, mobile, Unplugged
• OpenNTF Contributor
• Auto Logins
• XPage Multiple File Uploader
• XPage Debug Toolbar
• IBM Champion
• XPages4Bootstrap.com
UKLUG 2012 – Cardiff, Wales
Debugging in Designer
• For Java & SSJS (as of Designer 9)
• Based on standards
• Java Platform Debugger Architecture (JPDA)
• ‘Remote’ debugging
• Enable on server
• IDE (Designer/ Eclipse) connects to Server on
specified port
UKLUG 2012 – Cardiff, Wales
Debugging in Designer
• Not recommended for productions servers
• Impacts performance & security
• Only 1 developer can connect at a time
• … but that’s not a problem
• … since we don’t debug applications on
production servers
Right?
UKLUG 2012 – Cardiff, Wales
Java debugger
• In Designer since 8.5
• Debug:
• Java classes
• Managed beans
• OSGi plugins
• Compiled XPages Java (Local/xsp folder)
UKLUG 2012 – Cardiff, Wales
Server Side JavaScript debugger
• New in Domino 9
• Configured and works (almost) the same as
the Java debugger
• Debug SSJS in
• XPages
• Custom controls
• SSJS libraries
UKLUG 2012 – Cardiff, Wales
Activating the debuggers - server
• Add configuration to notes.ini:
JavaEnableDebug=1
JavascriptEnableDebug=1
JavaDebugOptions=transport=dt_socket,server=y,suspend=n,address=8000
• Tip: if you click on the “Debug” icon in the
toolbar, you can copy-paste these settings
from there
Add this row only if you want to
debug SSJS (too)
UKLUG 2012 – Cardiff, Wales
Activating the debuggers - server
• Restart the server
• Watch for this:
• Port needs to be open(ed) in the firewall
• Works with local HTTP preview too
• Tip: If the local preview won’t start, try starting
the local HTTP task from a command prompt
• Run “nhttp preview” from your Notes folder
UKLUG 2012 – Cardiff, Wales
Activating the debugger - code
• Set breakpoints
• Right-click in gutter
• Add ‘debugger’ statement (SSJS)
• Don’t use this in Designer < 9 !
• Stop at first line of JavaScript
code
UKLUG 2012 – Cardiff, Wales
Starting a debug session
• Click the triangle next to the “bug” icon
(this is Designer 9, icon looks slightly different in 8.5)
• Select an existing configuration or click
“Manage…”
UKLUG 2012 – Cardiff, Wales
Starting a debug session - Java
IP Address of your server
Port that the Debugger listens on
Name for this configuration (can be any)
UKLUG 2012 – Cardiff, Wales
Starting a debug session - SSJS
UKLUG 2012 – Cardiff, Wales
• Demo
UKLUG 2012 – Cardiff, Wales
Debug perspective
• Designer automatically asks to open Debug perspective when it
suspends
• Breakpoint or ‘debugger’ statement in SSJS
• Change behaviour in Preferences > Run/Debug > Perspectives
• Tip: switch perspectives using Ctrl-F8 in Designer
UKLUG 2012 – Cardiff, Wales
Source not found?
UKLUG 2012 – Cardiff, Wales
Keyboard shortcuts
• F5 Step into
• F6 Step over
• F7 Step exit
• F8 Continue
• Strange issue with the F6 key
• With the default Designer/ Eclipse binding it doesn’t work
• If you create your own binding to F6 it does
• Do this in File > Preferences > Type “keys” in filter
F5 F6 F7F8
UKLUG 2012 – Cardiff, Wales
Conditional breakpoints
• Set breakpoint
• Right-click on breakpoint
• Click “Breakpoint properties”
UKLUG 2012 – Cardiff, Wales
Display view
• Window > Show Eclipse View > Display
• Run an expression in the context of a
breakpoint and view the result
• Only works with Java debugger
• With code completion
UKLUG 2012 – Cardiff, Wales
Expressions view
• Window > Show Eclipse View > Expressions
• Inspect the current state of objects
• 2 ways to add:
• Right-click on expression in ‘Display’ view
• Type in manually
UKLUG 2012 – Cardiff, Wales
From SSJS to Java
• You can debug Java code when you’re
debugging SSJS code
• But NOT using “Step into” (F5):
• It will only stop on breakpoints in the Java class
UKLUG 2012 – Cardiff, Wales
Disconnect
• When you’re done: disconnect your debugging
session
• Java debugger
• SSJS debugger
UKLUG 2012 – Cardiff, Wales
XPage Debug Toolbar
UKLUG 2012 – Cardiff, Wales
Background/ features
• Tool for XPage developers
• Free download from OpenNTF
• Or directly from GitHub
• Features:
• Log debug messages
• View contents of scopes
• Log file reader
• API Inspector
UKLUG 2012 – Cardiff, Wales
Installation
• 2 ways to install:
• Download from OpenNTF and copy to your
application
• Use the OpenNTF Import/ export tool
UKLUG 2012 – Cardiff, Wales
Installation
• Add the ccDebugToolbar custom control to
your XPage
• Add the (dBar) managed bean
• (optionally) Change the default settings using
custom control properties
• collapseTo
• defaultCollapsed
• color
UKLUG 2012 – Cardiff, Wales
Components
ccDebugToolbar Custom control
xpDebugToolbar SSJS library
eu.linqed.debugtoolbar.DebugToolbar Java class
eu.linqed.debugtoolbar.Message Java class
debugToolbarConsole XPage optional
debugToolbarErrorPage XPage optional
dBar Managed bean
Events View OpenLog integration
Event Form OpenLog integration
UKLUG 2012 – Cardiff, Wales
Scope contents
• Shows contents of
• applicationScope
• sessionScope
• viewScope
• requestScope
• Remove a variable
• Or clean an entire scope
• Modify values through the Inspector
UKLUG 2012 – Cardiff, Wales
Environment variables
• Information about the current:
• User
• Browser
• Server
• Database
• Request
• Java heap size
• Maximum heap size
• Allocated
• Used
• Free
UKLUG 2012 – Cardiff, Wales
Inspector
• View classes for controls on the current page
• And change them
• View any variable:
• Scoped variables
• Managed beans
• Any XPage runtime object
• Drill-down to see what value/ object is
returned
UKLUG 2012 – Cardiff, Wales
Messages
• Alternative to print() or _dump() functions
• No server console access needed
• Your messages only
• Makes your admin happy 
• Add messages using:
dBar.debug( “message” );
dBar.info( “message”);
dBar.warn( “message” );
dBar.error( “message” );
dBar.dump( <object> );
UKLUG 2012 – Cardiff, Wales
Messages
• Specify a context: dBar.info( “message”, “context” );
• dBar.error() function accepts ‘error’ objects:
try {
var doc:NotesDocument = null;
var id = doc.getUniversalID();
} catch (e) {
dBar.error(e);
}
• Add a divider to the messages list: dBar.addDivider();
UKLUG 2012 – Cardiff, Wales
Messages
• Add debug messages from Java:
DebugToolbar.get().info( “message” );
DebugToolbar.get().warn( “message” );
• Or catch an Exception
• DebugToolbar.get().error( e );
UKLUG 2012 – Cardiff, Wales
Log messages to documents
• Create documents for all dBar calls
• All required code already built-in
• Uses the OpenLog (form/fields) format
• Use the OpenLog database to view them
• Log level can be set: log only messages with a
certain log level (or ‘higher’)
• warn = warn + error
• debug = debug + info + warn + error
UKLUG 2012 – Cardiff, Wales
Log messages to documents
• Configure using managed properties
• logDbPath current, logdb.nsf
• logEnabled true, false
• logLevel debug, info, warn, error
• Logging will continue even if the toolbar isn’t
displayed
UKLUG 2012 – Cardiff, Wales
Best practices
• Add [debug] role to the ACL
• Set loaded property of the ccDebugToolbar only for
[debug] role:
loaded=“#,javascript:context.getUser().getRoles().contains(‘*debug’+-”
• Enable logging to documents (errors/ warnings only)
logLevel = “warn”
• No design changes needed when moving to production
UKLUG 2012 – Cardiff, Wales
Resources
• XPage Debug Toolbar on OpenNTF & GitHub
http://www.openntf.org/internal/home.nsf/project.xsp?action=ope
nDocument&name=XPage%20Debug%20Toolbar
https://github.com/markleusink/XpageDebugToolbar
• OpenNTF Import/ export tool
http://www.openntf.org/internal/home.nsf/project.xsp?action=ope
nDocument&name=Import%20and%20Export%20for%20Designer
• Xpages OpenLog Logger
http://www.openntf.org/internal/home.nsf/project.xsp?action=ope
nDocument&name=XPages%20OpenLog%20Logger
• OpenLog
http://www.openntf.org/internal/home.nsf/project.xsp?action=ope
nDocument&name=OpenLog
UKLUG 2012 – Cardiff, Wales
Thank you !
• Twitter: markleusink
• Skype: mark_leusink
• Blog: http://linqed.eu
• Email: m.leusink@linqed.eu
• http://www.bootstrap4xpages.com

Weitere ähnliche Inhalte

Was ist angesagt?

JavaFX JumpStart @JavaOne 2016
JavaFX JumpStart @JavaOne 2016JavaFX JumpStart @JavaOne 2016
JavaFX JumpStart @JavaOne 2016Hendrik Ebbers
 
Stopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestStopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestSeb Rose
 
vJUG - The JavaFX Ecosystem
vJUG - The JavaFX EcosystemvJUG - The JavaFX Ecosystem
vJUG - The JavaFX EcosystemAndres Almiray
 
Java script Examples by Som
Java script Examples by Som  Java script Examples by Som
Java script Examples by Som Som Prakash Rai
 
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF SummitOrtus Solutions, Corp
 
Java Intro: Unit1. Hello World
Java Intro: Unit1. Hello WorldJava Intro: Unit1. Hello World
Java Intro: Unit1. Hello WorldYakov Fain
 
Code quality par Simone Civetta
Code quality par Simone CivettaCode quality par Simone Civetta
Code quality par Simone CivettaCocoaHeads France
 
Stop (de)bugging me!
Stop (de)bugging me!Stop (de)bugging me!
Stop (de)bugging me!Mark Leusink
 
JavaOne - The JavaFX Community and Ecosystem
JavaOne - The JavaFX Community and EcosystemJavaOne - The JavaFX Community and Ecosystem
JavaOne - The JavaFX Community and EcosystemAlexander Casall
 
KraQA #29 - Component level testing of react app, using enzyme
KraQA #29 - Component level testing of react app, using enzymeKraQA #29 - Component level testing of react app, using enzyme
KraQA #29 - Component level testing of react app, using enzymekraqa
 
DataFX 8 (JavaOne 2014)
DataFX 8 (JavaOne 2014)DataFX 8 (JavaOne 2014)
DataFX 8 (JavaOne 2014)Hendrik Ebbers
 
JavaFX in Action (devoxx'16)
JavaFX in Action (devoxx'16)JavaFX in Action (devoxx'16)
JavaFX in Action (devoxx'16)Alexander Casall
 
Java11 New Features
Java11 New FeaturesJava11 New Features
Java11 New FeaturesHaim Michael
 
ServiceNow Knowledge11 Advanced Scripting & Debugging Lab
ServiceNow Knowledge11 Advanced Scripting & Debugging LabServiceNow Knowledge11 Advanced Scripting & Debugging Lab
ServiceNow Knowledge11 Advanced Scripting & Debugging LabJohn Roberts
 
Dynamic Groovy Edges
Dynamic Groovy EdgesDynamic Groovy Edges
Dynamic Groovy EdgesJimmy Ray
 
A Taste of Pharo 7.0
A Taste of Pharo 7.0A Taste of Pharo 7.0
A Taste of Pharo 7.0ESUG
 

Was ist angesagt? (20)

JavaFX JumpStart @JavaOne 2016
JavaFX JumpStart @JavaOne 2016JavaFX JumpStart @JavaOne 2016
JavaFX JumpStart @JavaOne 2016
 
JavaFX Pitfalls
JavaFX PitfallsJavaFX Pitfalls
JavaFX Pitfalls
 
Stopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestStopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under Test
 
vJUG - The JavaFX Ecosystem
vJUG - The JavaFX EcosystemvJUG - The JavaFX Ecosystem
vJUG - The JavaFX Ecosystem
 
Java script Examples by Som
Java script Examples by Som  Java script Examples by Som
Java script Examples by Som
 
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
 
Java Intro: Unit1. Hello World
Java Intro: Unit1. Hello WorldJava Intro: Unit1. Hello World
Java Intro: Unit1. Hello World
 
Code quality par Simone Civetta
Code quality par Simone CivettaCode quality par Simone Civetta
Code quality par Simone Civetta
 
Stop (de)bugging me!
Stop (de)bugging me!Stop (de)bugging me!
Stop (de)bugging me!
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
JavaOne - The JavaFX Community and Ecosystem
JavaOne - The JavaFX Community and EcosystemJavaOne - The JavaFX Community and Ecosystem
JavaOne - The JavaFX Community and Ecosystem
 
KraQA #29 - Component level testing of react app, using enzyme
KraQA #29 - Component level testing of react app, using enzymeKraQA #29 - Component level testing of react app, using enzyme
KraQA #29 - Component level testing of react app, using enzyme
 
DataFX 8 (JavaOne 2014)
DataFX 8 (JavaOne 2014)DataFX 8 (JavaOne 2014)
DataFX 8 (JavaOne 2014)
 
JavaFX in Action (devoxx'16)
JavaFX in Action (devoxx'16)JavaFX in Action (devoxx'16)
JavaFX in Action (devoxx'16)
 
Apache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolboxApache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolbox
 
Java11 New Features
Java11 New FeaturesJava11 New Features
Java11 New Features
 
ServiceNow Knowledge11 Advanced Scripting & Debugging Lab
ServiceNow Knowledge11 Advanced Scripting & Debugging LabServiceNow Knowledge11 Advanced Scripting & Debugging Lab
ServiceNow Knowledge11 Advanced Scripting & Debugging Lab
 
Dynamic Groovy Edges
Dynamic Groovy EdgesDynamic Groovy Edges
Dynamic Groovy Edges
 
A Taste of Pharo 7.0
A Taste of Pharo 7.0A Taste of Pharo 7.0
A Taste of Pharo 7.0
 
EJB Part-1
EJB Part-1EJB Part-1
EJB Part-1
 

Ähnlich wie Stop (de)bugging me - ICON UK 2013

Ar*@!+$es to this. getting IBM connections to do what you want
Ar*@!+$es to this. getting IBM connections to do what you want Ar*@!+$es to this. getting IBM connections to do what you want
Ar*@!+$es to this. getting IBM connections to do what you want Mark Myers
 
How to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slatherHow to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slatherallanh0526
 
Improve Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Improve Code Quality and Time to Market: 100% Cloud-Based Development WorkflowImprove Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Improve Code Quality and Time to Market: 100% Cloud-Based Development WorkflowAcquia
 
Golang @ Tokopedia
Golang @ TokopediaGolang @ Tokopedia
Golang @ TokopediaQasim Zaidi
 
2.3 (Architecture) Moving to Managed Code
2.3   (Architecture) Moving to Managed Code2.3   (Architecture) Moving to Managed Code
2.3 (Architecture) Moving to Managed CodeMicro Focus
 
An XPager's Guide to Process Server-Side Jobs on Domino
An XPager's Guide to Process Server-Side Jobs on DominoAn XPager's Guide to Process Server-Side Jobs on Domino
An XPager's Guide to Process Server-Side Jobs on DominoFrank van der Linden
 
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®Serdar Basegmez
 
OpenDaylight Developers Experience 1.5: Eclipse Setup, HOT reload, future plans
OpenDaylight Developers Experience 1.5: Eclipse Setup, HOT reload, future plansOpenDaylight Developers Experience 1.5: Eclipse Setup, HOT reload, future plans
OpenDaylight Developers Experience 1.5: Eclipse Setup, HOT reload, future plansMichael Vorburger
 
Enterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptEnterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptTroy Miles
 
Next Step, Android Studio!
Next Step, Android Studio!Next Step, Android Studio!
Next Step, Android Studio!Édipo Souza
 
Gradle,the new build system for android
Gradle,the new build system for androidGradle,the new build system for android
Gradle,the new build system for androidzhang ghui
 
JavaFX - Sketch Board to Production
JavaFX - Sketch Board to ProductionJavaFX - Sketch Board to Production
JavaFX - Sketch Board to ProductionYoav Aharoni
 
Schneider Electric Scada Global Support Provides Troubleshooting and Technica...
Schneider Electric Scada Global Support Provides Troubleshooting and Technica...Schneider Electric Scada Global Support Provides Troubleshooting and Technica...
Schneider Electric Scada Global Support Provides Troubleshooting and Technica...Preeya Selvarajah
 
Magento Imagine 2011 - Magento Debugging - Erik Hansen, Classy Llama Studios
Magento Imagine 2011 - Magento Debugging - Erik Hansen, Classy Llama StudiosMagento Imagine 2011 - Magento Debugging - Erik Hansen, Classy Llama Studios
Magento Imagine 2011 - Magento Debugging - Erik Hansen, Classy Llama StudiosErik Hansen
 
Angular 2 overview
Angular 2 overviewAngular 2 overview
Angular 2 overviewJesse Warden
 
OpenDaylight Developer Experience 2.0
 OpenDaylight Developer Experience 2.0 OpenDaylight Developer Experience 2.0
OpenDaylight Developer Experience 2.0Michael Vorburger
 
NA Developer Day - Taking your COBOL apps to Net & JVM
NA Developer Day - Taking your COBOL apps to Net & JVM NA Developer Day - Taking your COBOL apps to Net & JVM
NA Developer Day - Taking your COBOL apps to Net & JVM Micro Focus
 

Ähnlich wie Stop (de)bugging me - ICON UK 2013 (20)

Ar*@!+$es to this. getting IBM connections to do what you want
Ar*@!+$es to this. getting IBM connections to do what you want Ar*@!+$es to this. getting IBM connections to do what you want
Ar*@!+$es to this. getting IBM connections to do what you want
 
How to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slatherHow to generate code coverage reports in xcode with slather
How to generate code coverage reports in xcode with slather
 
Improve Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Improve Code Quality and Time to Market: 100% Cloud-Based Development WorkflowImprove Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Improve Code Quality and Time to Market: 100% Cloud-Based Development Workflow
 
Golang @ Tokopedia
Golang @ TokopediaGolang @ Tokopedia
Golang @ Tokopedia
 
2.3 (Architecture) Moving to Managed Code
2.3   (Architecture) Moving to Managed Code2.3   (Architecture) Moving to Managed Code
2.3 (Architecture) Moving to Managed Code
 
An XPager's Guide to Process Server-Side Jobs on Domino
An XPager's Guide to Process Server-Side Jobs on DominoAn XPager's Guide to Process Server-Side Jobs on Domino
An XPager's Guide to Process Server-Side Jobs on Domino
 
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®
 
OpenDaylight Developers Experience 1.5: Eclipse Setup, HOT reload, future plans
OpenDaylight Developers Experience 1.5: Eclipse Setup, HOT reload, future plansOpenDaylight Developers Experience 1.5: Eclipse Setup, HOT reload, future plans
OpenDaylight Developers Experience 1.5: Eclipse Setup, HOT reload, future plans
 
Enterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptEnterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScript
 
Next Step, Android Studio!
Next Step, Android Studio!Next Step, Android Studio!
Next Step, Android Studio!
 
Gradle,the new build system for android
Gradle,the new build system for androidGradle,the new build system for android
Gradle,the new build system for android
 
JavaFX - Sketch Board to Production
JavaFX - Sketch Board to ProductionJavaFX - Sketch Board to Production
JavaFX - Sketch Board to Production
 
Schneider Electric Scada Global Support Provides Troubleshooting and Technica...
Schneider Electric Scada Global Support Provides Troubleshooting and Technica...Schneider Electric Scada Global Support Provides Troubleshooting and Technica...
Schneider Electric Scada Global Support Provides Troubleshooting and Technica...
 
Magento Imagine 2011 - Magento Debugging - Erik Hansen, Classy Llama Studios
Magento Imagine 2011 - Magento Debugging - Erik Hansen, Classy Llama StudiosMagento Imagine 2011 - Magento Debugging - Erik Hansen, Classy Llama Studios
Magento Imagine 2011 - Magento Debugging - Erik Hansen, Classy Llama Studios
 
tut0000021-hevery
tut0000021-heverytut0000021-hevery
tut0000021-hevery
 
tut0000021-hevery
tut0000021-heverytut0000021-hevery
tut0000021-hevery
 
Angular 2 overview
Angular 2 overviewAngular 2 overview
Angular 2 overview
 
OpenDaylight Developer Experience 2.0
 OpenDaylight Developer Experience 2.0 OpenDaylight Developer Experience 2.0
OpenDaylight Developer Experience 2.0
 
Plantilla oracle
Plantilla oraclePlantilla oracle
Plantilla oracle
 
NA Developer Day - Taking your COBOL apps to Net & JVM
NA Developer Day - Taking your COBOL apps to Net & JVM NA Developer Day - Taking your COBOL apps to Net & JVM
NA Developer Day - Taking your COBOL apps to Net & JVM
 

Mehr von Mark Leusink

Now what can you really build with DQL and web components?
Now what can you really build with DQL and web components?Now what can you really build with DQL and web components?
Now what can you really build with DQL and web components?Mark Leusink
 
ICON UK 2016: Modernizing an IBM Notes applicaton using with AngularJS
ICON UK 2016: Modernizing an IBM Notes applicaton using with AngularJSICON UK 2016: Modernizing an IBM Notes applicaton using with AngularJS
ICON UK 2016: Modernizing an IBM Notes applicaton using with AngularJSMark Leusink
 
Creating mobile apps - an introduction to Ionic (Engage 2016)
Creating mobile apps - an introduction to Ionic (Engage 2016)Creating mobile apps - an introduction to Ionic (Engage 2016)
Creating mobile apps - an introduction to Ionic (Engage 2016)Mark Leusink
 
The future of web development write once, run everywhere with angular js an...
The future of web development   write once, run everywhere with angular js an...The future of web development   write once, run everywhere with angular js an...
The future of web development write once, run everywhere with angular js an...Mark Leusink
 
Escaping the yellow bubble - rewriting Domino using MongoDb and Angular
Escaping the yellow bubble - rewriting Domino using MongoDb and AngularEscaping the yellow bubble - rewriting Domino using MongoDb and Angular
Escaping the yellow bubble - rewriting Domino using MongoDb and AngularMark Leusink
 
A 20 minute introduction to AngularJS for XPage developers
A 20 minute introduction to AngularJS for XPage developersA 20 minute introduction to AngularJS for XPage developers
A 20 minute introduction to AngularJS for XPage developersMark Leusink
 
Bootstrap4XPages webinar
Bootstrap4XPages webinarBootstrap4XPages webinar
Bootstrap4XPages webinarMark Leusink
 
Get the best out of Bootstrap with Bootstrap4XPages - Engage 2014
Get the best out of Bootstrap with Bootstrap4XPages - Engage 2014Get the best out of Bootstrap with Bootstrap4XPages - Engage 2014
Get the best out of Bootstrap with Bootstrap4XPages - Engage 2014Mark Leusink
 
Get the best out of Bootstrap with Bootstrap4XPages (AD202)
Get the best out of Bootstrap with Bootstrap4XPages (AD202)Get the best out of Bootstrap with Bootstrap4XPages (AD202)
Get the best out of Bootstrap with Bootstrap4XPages (AD202)Mark Leusink
 
Bootstrap and XPages (DanNotes 2013)
Bootstrap and XPages (DanNotes 2013)Bootstrap and XPages (DanNotes 2013)
Bootstrap and XPages (DanNotes 2013)Mark Leusink
 
Introduction to Bootstrap (with XPages)
Introduction to Bootstrap (with XPages)Introduction to Bootstrap (with XPages)
Introduction to Bootstrap (with XPages)Mark Leusink
 

Mehr von Mark Leusink (11)

Now what can you really build with DQL and web components?
Now what can you really build with DQL and web components?Now what can you really build with DQL and web components?
Now what can you really build with DQL and web components?
 
ICON UK 2016: Modernizing an IBM Notes applicaton using with AngularJS
ICON UK 2016: Modernizing an IBM Notes applicaton using with AngularJSICON UK 2016: Modernizing an IBM Notes applicaton using with AngularJS
ICON UK 2016: Modernizing an IBM Notes applicaton using with AngularJS
 
Creating mobile apps - an introduction to Ionic (Engage 2016)
Creating mobile apps - an introduction to Ionic (Engage 2016)Creating mobile apps - an introduction to Ionic (Engage 2016)
Creating mobile apps - an introduction to Ionic (Engage 2016)
 
The future of web development write once, run everywhere with angular js an...
The future of web development   write once, run everywhere with angular js an...The future of web development   write once, run everywhere with angular js an...
The future of web development write once, run everywhere with angular js an...
 
Escaping the yellow bubble - rewriting Domino using MongoDb and Angular
Escaping the yellow bubble - rewriting Domino using MongoDb and AngularEscaping the yellow bubble - rewriting Domino using MongoDb and Angular
Escaping the yellow bubble - rewriting Domino using MongoDb and Angular
 
A 20 minute introduction to AngularJS for XPage developers
A 20 minute introduction to AngularJS for XPage developersA 20 minute introduction to AngularJS for XPage developers
A 20 minute introduction to AngularJS for XPage developers
 
Bootstrap4XPages webinar
Bootstrap4XPages webinarBootstrap4XPages webinar
Bootstrap4XPages webinar
 
Get the best out of Bootstrap with Bootstrap4XPages - Engage 2014
Get the best out of Bootstrap with Bootstrap4XPages - Engage 2014Get the best out of Bootstrap with Bootstrap4XPages - Engage 2014
Get the best out of Bootstrap with Bootstrap4XPages - Engage 2014
 
Get the best out of Bootstrap with Bootstrap4XPages (AD202)
Get the best out of Bootstrap with Bootstrap4XPages (AD202)Get the best out of Bootstrap with Bootstrap4XPages (AD202)
Get the best out of Bootstrap with Bootstrap4XPages (AD202)
 
Bootstrap and XPages (DanNotes 2013)
Bootstrap and XPages (DanNotes 2013)Bootstrap and XPages (DanNotes 2013)
Bootstrap and XPages (DanNotes 2013)
 
Introduction to Bootstrap (with XPages)
Introduction to Bootstrap (with XPages)Introduction to Bootstrap (with XPages)
Introduction to Bootstrap (with XPages)
 

Kürzlich hochgeladen

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
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
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
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 

Kürzlich hochgeladen (20)

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
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
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
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 

Stop (de)bugging me - ICON UK 2013

  • 1. UKLUG 2012 – Cardiff, Wales Stop (de)bugging me!
  • 2. UKLUG 2012 – Cardiff, Wales Disclaimer This session is only for people that make errors. All others can leave. Suggestions: • Re-inventing your ideas (room 3) • The DevAdmin Chimera (room 2)
  • 3. UKLUG 2012 – Cardiff, Wales Agenda • Debuggers in Designer • Java debugger • SSJS debugger • XPage Debug Toolbar ™
  • 4. UKLUG 2012 – Cardiff, Wales Who’s that guy anyway? • Freelance consultant/ developer • IBM Notes/ Domino • XPages, web, client, mobile, Unplugged • OpenNTF Contributor • Auto Logins • XPage Multiple File Uploader • XPage Debug Toolbar • IBM Champion • XPages4Bootstrap.com
  • 5. UKLUG 2012 – Cardiff, Wales Debugging in Designer • For Java & SSJS (as of Designer 9) • Based on standards • Java Platform Debugger Architecture (JPDA) • ‘Remote’ debugging • Enable on server • IDE (Designer/ Eclipse) connects to Server on specified port
  • 6. UKLUG 2012 – Cardiff, Wales Debugging in Designer • Not recommended for productions servers • Impacts performance & security • Only 1 developer can connect at a time • … but that’s not a problem • … since we don’t debug applications on production servers Right?
  • 7. UKLUG 2012 – Cardiff, Wales Java debugger • In Designer since 8.5 • Debug: • Java classes • Managed beans • OSGi plugins • Compiled XPages Java (Local/xsp folder)
  • 8. UKLUG 2012 – Cardiff, Wales Server Side JavaScript debugger • New in Domino 9 • Configured and works (almost) the same as the Java debugger • Debug SSJS in • XPages • Custom controls • SSJS libraries
  • 9. UKLUG 2012 – Cardiff, Wales Activating the debuggers - server • Add configuration to notes.ini: JavaEnableDebug=1 JavascriptEnableDebug=1 JavaDebugOptions=transport=dt_socket,server=y,suspend=n,address=8000 • Tip: if you click on the “Debug” icon in the toolbar, you can copy-paste these settings from there Add this row only if you want to debug SSJS (too)
  • 10. UKLUG 2012 – Cardiff, Wales Activating the debuggers - server • Restart the server • Watch for this: • Port needs to be open(ed) in the firewall • Works with local HTTP preview too • Tip: If the local preview won’t start, try starting the local HTTP task from a command prompt • Run “nhttp preview” from your Notes folder
  • 11. UKLUG 2012 – Cardiff, Wales Activating the debugger - code • Set breakpoints • Right-click in gutter • Add ‘debugger’ statement (SSJS) • Don’t use this in Designer < 9 ! • Stop at first line of JavaScript code
  • 12. UKLUG 2012 – Cardiff, Wales Starting a debug session • Click the triangle next to the “bug” icon (this is Designer 9, icon looks slightly different in 8.5) • Select an existing configuration or click “Manage…”
  • 13. UKLUG 2012 – Cardiff, Wales Starting a debug session - Java IP Address of your server Port that the Debugger listens on Name for this configuration (can be any)
  • 14. UKLUG 2012 – Cardiff, Wales Starting a debug session - SSJS
  • 15. UKLUG 2012 – Cardiff, Wales • Demo
  • 16. UKLUG 2012 – Cardiff, Wales Debug perspective • Designer automatically asks to open Debug perspective when it suspends • Breakpoint or ‘debugger’ statement in SSJS • Change behaviour in Preferences > Run/Debug > Perspectives • Tip: switch perspectives using Ctrl-F8 in Designer
  • 17. UKLUG 2012 – Cardiff, Wales Source not found?
  • 18. UKLUG 2012 – Cardiff, Wales Keyboard shortcuts • F5 Step into • F6 Step over • F7 Step exit • F8 Continue • Strange issue with the F6 key • With the default Designer/ Eclipse binding it doesn’t work • If you create your own binding to F6 it does • Do this in File > Preferences > Type “keys” in filter F5 F6 F7F8
  • 19. UKLUG 2012 – Cardiff, Wales Conditional breakpoints • Set breakpoint • Right-click on breakpoint • Click “Breakpoint properties”
  • 20. UKLUG 2012 – Cardiff, Wales Display view • Window > Show Eclipse View > Display • Run an expression in the context of a breakpoint and view the result • Only works with Java debugger • With code completion
  • 21. UKLUG 2012 – Cardiff, Wales Expressions view • Window > Show Eclipse View > Expressions • Inspect the current state of objects • 2 ways to add: • Right-click on expression in ‘Display’ view • Type in manually
  • 22. UKLUG 2012 – Cardiff, Wales From SSJS to Java • You can debug Java code when you’re debugging SSJS code • But NOT using “Step into” (F5): • It will only stop on breakpoints in the Java class
  • 23. UKLUG 2012 – Cardiff, Wales Disconnect • When you’re done: disconnect your debugging session • Java debugger • SSJS debugger
  • 24. UKLUG 2012 – Cardiff, Wales XPage Debug Toolbar
  • 25. UKLUG 2012 – Cardiff, Wales Background/ features • Tool for XPage developers • Free download from OpenNTF • Or directly from GitHub • Features: • Log debug messages • View contents of scopes • Log file reader • API Inspector
  • 26. UKLUG 2012 – Cardiff, Wales Installation • 2 ways to install: • Download from OpenNTF and copy to your application • Use the OpenNTF Import/ export tool
  • 27. UKLUG 2012 – Cardiff, Wales Installation • Add the ccDebugToolbar custom control to your XPage • Add the (dBar) managed bean • (optionally) Change the default settings using custom control properties • collapseTo • defaultCollapsed • color
  • 28. UKLUG 2012 – Cardiff, Wales Components ccDebugToolbar Custom control xpDebugToolbar SSJS library eu.linqed.debugtoolbar.DebugToolbar Java class eu.linqed.debugtoolbar.Message Java class debugToolbarConsole XPage optional debugToolbarErrorPage XPage optional dBar Managed bean Events View OpenLog integration Event Form OpenLog integration
  • 29. UKLUG 2012 – Cardiff, Wales Scope contents • Shows contents of • applicationScope • sessionScope • viewScope • requestScope • Remove a variable • Or clean an entire scope • Modify values through the Inspector
  • 30. UKLUG 2012 – Cardiff, Wales Environment variables • Information about the current: • User • Browser • Server • Database • Request • Java heap size • Maximum heap size • Allocated • Used • Free
  • 31. UKLUG 2012 – Cardiff, Wales Inspector • View classes for controls on the current page • And change them • View any variable: • Scoped variables • Managed beans • Any XPage runtime object • Drill-down to see what value/ object is returned
  • 32. UKLUG 2012 – Cardiff, Wales Messages • Alternative to print() or _dump() functions • No server console access needed • Your messages only • Makes your admin happy  • Add messages using: dBar.debug( “message” ); dBar.info( “message”); dBar.warn( “message” ); dBar.error( “message” ); dBar.dump( <object> );
  • 33. UKLUG 2012 – Cardiff, Wales Messages • Specify a context: dBar.info( “message”, “context” ); • dBar.error() function accepts ‘error’ objects: try { var doc:NotesDocument = null; var id = doc.getUniversalID(); } catch (e) { dBar.error(e); } • Add a divider to the messages list: dBar.addDivider();
  • 34. UKLUG 2012 – Cardiff, Wales Messages • Add debug messages from Java: DebugToolbar.get().info( “message” ); DebugToolbar.get().warn( “message” ); • Or catch an Exception • DebugToolbar.get().error( e );
  • 35. UKLUG 2012 – Cardiff, Wales Log messages to documents • Create documents for all dBar calls • All required code already built-in • Uses the OpenLog (form/fields) format • Use the OpenLog database to view them • Log level can be set: log only messages with a certain log level (or ‘higher’) • warn = warn + error • debug = debug + info + warn + error
  • 36. UKLUG 2012 – Cardiff, Wales Log messages to documents • Configure using managed properties • logDbPath current, logdb.nsf • logEnabled true, false • logLevel debug, info, warn, error • Logging will continue even if the toolbar isn’t displayed
  • 37. UKLUG 2012 – Cardiff, Wales Best practices • Add [debug] role to the ACL • Set loaded property of the ccDebugToolbar only for [debug] role: loaded=“#,javascript:context.getUser().getRoles().contains(‘*debug’+-” • Enable logging to documents (errors/ warnings only) logLevel = “warn” • No design changes needed when moving to production
  • 38. UKLUG 2012 – Cardiff, Wales Resources • XPage Debug Toolbar on OpenNTF & GitHub http://www.openntf.org/internal/home.nsf/project.xsp?action=ope nDocument&name=XPage%20Debug%20Toolbar https://github.com/markleusink/XpageDebugToolbar • OpenNTF Import/ export tool http://www.openntf.org/internal/home.nsf/project.xsp?action=ope nDocument&name=Import%20and%20Export%20for%20Designer • Xpages OpenLog Logger http://www.openntf.org/internal/home.nsf/project.xsp?action=ope nDocument&name=XPages%20OpenLog%20Logger • OpenLog http://www.openntf.org/internal/home.nsf/project.xsp?action=ope nDocument&name=OpenLog
  • 39. UKLUG 2012 – Cardiff, Wales Thank you ! • Twitter: markleusink • Skype: mark_leusink • Blog: http://linqed.eu • Email: m.leusink@linqed.eu • http://www.bootstrap4xpages.com