LotusScript SurvivalTips for Large Systems        Bill Buchan        hadsl.com
Agenda• Introduction• What do we need?• Logging• Performance• Code Reuse• Weirdness
Introduction• I am: • Bill Buchan, CEO, hadsl • LotusScript expert since 1997, Large    systems experience
Direction?• Lets consider the following slide...
Whats New In       LotusScript?This page is left intentionally blank
Whats new in        LotusScript?• The Class libraries have generally grown  with each release  • Leveraging feature-specifi...
What does this mean?• LotusScript is still an invaluable tool in your  armoury for creating Business Logic  • Its easy, it...
What do we need?• Large environments need: • Stability • Scalability• If you cant measure it, you cant manage it• You want...
What do we need?• Stable performance • We cant keep adding new servers every    time we add a new application/database    ...
What do we need?• Code Reuse. Of course. • We have less resources doing more work • We need to test more effectively
Logging• Why do logging? • As a rule of thumb, if its scheduled,    critical, or running in someplace you cant    immediat...
Logging• If something happens, and you find out from  the users • You have failed
Logging• Lots of solutions available • For instance, use ‘msgbox’ to log to the    console.    • Admins hate this    • It’...
Logging Solutions• Check out OpenLog at OpenNTF • Add two lines of code, and you have a    comprehensive log • Free and Ea...
SuperLogging• Consider Performance • Opening a notes database - even from    Script - opens the default view • Log databas...
SuperLogging• Why not • Create a new document and populate as    normal • Stamp it with start and stop times -    handy fo...
SuperLogging• Sending log documents by email means: • The process is not waiting for you to    save the log document (and ...
SuperLogging• Once you start emailing in Log  Documents, you can do more: • Spot when agents DONT trigger a log    documen...
SuperLogging• Remember, ALL code has to log accurately • LotusScript, Java, xPages • Javascript?
Performance• We application developers can create  fantastic applications• And we can create horrible ones • Ones that rea...
Performance:Views• Your application needs views. Of course it  does. But does it need them all?• ‘Click-sort’ columns are ...
Performance:Views• How can I tell the size of a view? • Admin client, select database, Tools,    Manage Views
Performance:Views
Performance:Views
Performance:Views• Create as few views as possible• Don’t use Click-sort on columns unless  absolutely necessary. Each cli...
Performance:Agents• Scheduled Agents have to be well-behaved • Agent Manager doesnt really do a great    job in killing ru...
Performance:Agents• So how to we minimise our Agent  Footprint? • Write them to fit the potential size of    your applicati...
Performance:Agents• Use Agent Profiling to find out how long  your agents take against a representative  quantity of documen...
Performance:Agents• To enable Agent Profiling, check the ‘Profile  This agent’ in Agent Properties.• Once its ran, you can v...
Performance:Agents
Performance:Agents• You can see • When the agent ran • Where it ran • Where it spent time• Invaluable for performance tuning
Performance:Agents• Now. Lets take it one step further • How about collecting ALL agent profiles    from ALL databases and ...
Performance:Agents• Recipe: • Take ‘TriggerHappy’ from OpenNTF • Have it listen to ALL document saves on    the server • I...
Performance:Agents• For more information on this, visit: • http://www.billbuchan.com/    imported-20091119232548/2010/2/2/...
Performance:Agents• A common scenario • We build an agent to examine a lot of    documents, and update a few of them,    e...
Performance:Agents• Remember: • Agent Manager is like a crumbly old    relative - Everyone loves him • But he’s quite shak...
Performance:Agents• Changing the maximum agent run-time on  the server document is CHEATING
Performance:Agents• Re-architect the agent • It starts up, figures out how long it has to    run, and works out its termina...
Performance:Agents• So: • Own & Understand your agent   performance • Don’t abuse agent manager • Don’t let it kill your s...
Code Re-use• Dont reinvent the wheel every time • That leaves far too little time for the pub • Oh - and it means re-testi...
Code Re-use• So • If your an old-fashioned script guy, create    a standard script library that    encapsulates:    • Stan...
Code Re-Use• If your a little bored with this (and who  isnt?)  • Create a LotusScript class which    encapsulates all bor...
Code Re-use• For example:class baseClass  Public Sub logMsg(msg as String)   ‘ do stuff  end sub public sub raiseError()  ...
Code Re-useclass myLogicClass as baseclass  Private Function myStuff(waffle as String)   on error goto errorhandler      ca...
Code Re-use• Remove the responsibility for • Logging • Error handling • Other boring stuff• From your business logic
Weirdness• Sometimes, we have to walk on the wild  side • Just sometimes, we like to stroke our    misshapen little ego • ...
Weirdness: Lists   • Use lists - they’re not hard.Dim Pres list as StringPres(“George”) = “Bush”Pres(“Bill”) = “Clinton”Pr...
Weirdness:C-API• LotusScript never does everything.  Sometimes you have to call out to C-API • What is C-API?  • Over 700 ...
Weirdness: C-API  • So how can the lazy programmer call C-API    functions from LotusScript?Declare Function W32_NSFGetSer...
Weirdness: C-API  • Now lets exploit this declarationPublic Function getServerLatency _ (strServer                        ...
Weirdness: C-API• Now do this for every function, and every  platform you wish to support. • Euch
Weirdness: Execute • You all know how to do ‘Evaluate’ right?Dim V as variantV = evaluate( “ @Name( [CN]; @UserName ) “ )p...
Weirdness: Execute• Boring. Lets write some code to write  some code  Dim S as String  S = “ msgbox | Hello World | “  V =...
Weirdness: Execute• What is this doing? • We can populate a string with valid    Lotusscript Code • And then execute it.• ...
Weirdness: C-API• Check out the ls2capi.com web site• And check out my ls2capi database on • http://hadsl.com/hadsl.nsf/Do...
Conclusion• Use these techniques to deal with large  systems  • Minimise, Simplify and Productionalise    your code• Learn...
Upcoming SlideShare
Loading in …5
×

Lotuscript for large systems

774 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
774
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lotuscript for large systems

  1. 1. LotusScript SurvivalTips for Large Systems Bill Buchan hadsl.com
  2. 2. Agenda• Introduction• What do we need?• Logging• Performance• Code Reuse• Weirdness
  3. 3. Introduction• I am: • Bill Buchan, CEO, hadsl • LotusScript expert since 1997, Large systems experience
  4. 4. Direction?• Lets consider the following slide...
  5. 5. Whats New In LotusScript?This page is left intentionally blank
  6. 6. Whats new in LotusScript?• The Class libraries have generally grown with each release • Leveraging feature-specific stuff such as ID Vault in 8.5.0
  7. 7. What does this mean?• LotusScript is still an invaluable tool in your armoury for creating Business Logic • Its easy, its multi-platform• Its NOT the future in terms of Client or Web • Check out all the xPages sessions here • No excuses
  8. 8. What do we need?• Large environments need: • Stability • Scalability• If you cant measure it, you cant manage it• You want to do more, with less time and less people
  9. 9. What do we need?• Stable performance • We cant keep adding new servers every time we add a new application/database instance • We cant let a single application wreak havoc on our systems
  10. 10. What do we need?• Code Reuse. Of course. • We have less resources doing more work • We need to test more effectively
  11. 11. Logging• Why do logging? • As a rule of thumb, if its scheduled, critical, or running in someplace you cant immediately check, you need logging• You need to know: • When and where did it start, stop • Was it successful
  12. 12. Logging• If something happens, and you find out from the users • You have failed
  13. 13. Logging• Lots of solutions available • For instance, use ‘msgbox’ to log to the console. • Admins hate this • It’ll never be acted upon
  14. 14. Logging Solutions• Check out OpenLog at OpenNTF • Add two lines of code, and you have a comprehensive log • Free and Easy• No excuses
  15. 15. SuperLogging• Consider Performance • Opening a notes database - even from Script - opens the default view • Log database views can get large • It can be slow
  16. 16. SuperLogging• Why not • Create a new document and populate as normal • Stamp it with start and stop times - handy for measuring load • Add Server, Database, Agent and User • But then use notesdocument.send()
  17. 17. SuperLogging• Sending log documents by email means: • The process is not waiting for you to save the log document (and update the views) - huge performance increase • The log database need not be local • The user processes do NOT need access to the log database
  18. 18. SuperLogging• Once you start emailing in Log Documents, you can do more: • Spot when agents DONT trigger a log document - and do something about it • Spot when NEW agents start creating logs
  19. 19. SuperLogging• Remember, ALL code has to log accurately • LotusScript, Java, xPages • Javascript?
  20. 20. Performance• We application developers can create fantastic applications• And we can create horrible ones • Ones that really kill servers.• Lets talk about...
  21. 21. Performance:Views• Your application needs views. Of course it does. But does it need them all?• ‘Click-sort’ columns are evil• Use more ‘Categorised’ views
  22. 22. Performance:Views• How can I tell the size of a view? • Admin client, select database, Tools, Manage Views
  23. 23. Performance:Views
  24. 24. Performance:Views
  25. 25. Performance:Views• Create as few views as possible• Don’t use Click-sort on columns unless absolutely necessary. Each click-sort column creates another copy of the view
  26. 26. Performance:Agents• Scheduled Agents have to be well-behaved • Agent Manager doesnt really do a great job in killing runaway agents • It certainly doesnt throttle agents which consume lots of CPU • And it only runs one or two agents at a time
  27. 27. Performance:Agents• So how to we minimise our Agent Footprint? • Write them to fit the potential size of your application • If there are lots of documents to process, let the agent run multiple times
  28. 28. Performance:Agents• Use Agent Profiling to find out how long your agents take against a representative quantity of documents • ‘It worked in testing’ is not an excuse. • Its an admission your testing wasn’t rigorous enough
  29. 29. Performance:Agents• To enable Agent Profiling, check the ‘Profile This agent’ in Agent Properties.• Once its ran, you can view which calls its made, and how much time it took
  30. 30. Performance:Agents
  31. 31. Performance:Agents• You can see • When the agent ran • Where it ran • Where it spent time• Invaluable for performance tuning
  32. 32. Performance:Agents• Now. Lets take it one step further • How about collecting ALL agent profiles from ALL databases and storing them in a database? • NOT recommended for production environments
  33. 33. Performance:Agents• Recipe: • Take ‘TriggerHappy’ from OpenNTF • Have it listen to ALL document saves on the server • If the form is called "$BEProfileR7" • Forward the document to another database
  34. 34. Performance:Agents• For more information on this, visit: • http://www.billbuchan.com/ imported-20091119232548/2010/2/2/ universal-agent-profiling-in-domino.html • URL is in IBM Standard Download Notation.
  35. 35. Performance:Agents• A common scenario • We build an agent to examine a lot of documents, and update a few of them, every night. • The database grows • Your admin kills you.
  36. 36. Performance:Agents• Remember: • Agent Manager is like a crumbly old relative - Everyone loves him • But he’s quite shaky on his feet • And smells• Don’t abuse him
  37. 37. Performance:Agents• Changing the maximum agent run-time on the server document is CHEATING
  38. 38. Performance:Agents• Re-architect the agent • It starts up, figures out how long it has to run, and works out its termination time. • Maximum time minus 2 mins • Keep working till expiry time • Have the agent run a few times - say every 10 mins for 3 hours overnight
  39. 39. Performance:Agents• So: • Own & Understand your agent performance • Don’t abuse agent manager • Don’t let it kill your system
  40. 40. Code Re-use• Dont reinvent the wheel every time • That leaves far too little time for the pub • Oh - and it means re-testing from scratch every time• Be Lazy
  41. 41. Code Re-use• So • If your an old-fashioned script guy, create a standard script library that encapsulates: • Standard Logging • Configuration lookup
  42. 42. Code Re-Use• If your a little bored with this (and who isnt?) • Create a LotusScript class which encapsulates all boring logic • Extend this class in your own code for the business logic • Simplify the target code
  43. 43. Code Re-use• For example:class baseClass Public Sub logMsg(msg as String) ‘ do stuff end sub public sub raiseError() ‘ do stuff end subend class
  44. 44. Code Re-useclass myLogicClass as baseclass Private Function myStuff(waffle as String) on error goto errorhandler call logMsg(“hello world”) ‘ Do stuff exitFunction: exit function errorhandler: call me.raiseError() resume exitFunction end functionend class
  45. 45. Code Re-use• Remove the responsibility for • Logging • Error handling • Other boring stuff• From your business logic
  46. 46. Weirdness• Sometimes, we have to walk on the wild side • Just sometimes, we like to stroke our misshapen little ego • Or we actually have a business reason • Whatever
  47. 47. Weirdness: Lists • Use lists - they’re not hard.Dim Pres list as StringPres(“George”) = “Bush”Pres(“Bill”) = “Clinton”Print “Georges’s last name is: “ + Pres(“George” )if not isElement(Pres(“Chad”)) then _ print “Chad wasn’t found”forall thisPres in Pres Print listtag(thisPres) + “ “ + thisPresend forall
  48. 48. Weirdness:C-API• LotusScript never does everything. Sometimes you have to call out to C-API • What is C-API? • Over 700 functions that you can get to using C code • Downside: Creating & Supporting code on every platform you support. Eugh.
  49. 49. Weirdness: C-API • So how can the lazy programmer call C-API functions from LotusScript?Declare Function W32_NSFGetServerLatency LibLIB_W32 Alias {NSFGetServerLatency} (_ Byval ServerName As Lmbcs String, _ Byval Timeout As Long, _ retClientToServerMS As Long, _ retServerToClientMS As Long, _ ServerVersion As Integer) As Integer
  50. 50. Weirdness: C-API • Now lets exploit this declarationPublic Function getServerLatency _ (strServer As String) AsLong Dim nnServer As New NotesName(strServer) Dim ToServer As Long, fromServer As Long Dim ver As Integer Dim timeout As Long timeout = 1000 1000ms == 1 second Call W32_NSFGetServerLatency(nnServer.Can onical,_ timeout, _ toServer, fromServer, ver) Return both directional latencies added togeth er getServerLatency = fromServer + ToServerEnd Function
  51. 51. Weirdness: C-API• Now do this for every function, and every platform you wish to support. • Euch
  52. 52. Weirdness: Execute • You all know how to do ‘Evaluate’ right?Dim V as variantV = evaluate( “ @Name( [CN]; @UserName ) “ )print V(0) ‘ Result is ‘Bill Buchan’
  53. 53. Weirdness: Execute• Boring. Lets write some code to write some code Dim S as String S = “ msgbox | Hello World | “ V = execute ( S )
  54. 54. Weirdness: Execute• What is this doing? • We can populate a string with valid Lotusscript Code • And then execute it.• Why on earth would this be useful? • We could, for instance, generate our platform specific C-API calls
  55. 55. Weirdness: C-API• Check out the ls2capi.com web site• And check out my ls2capi database on • http://hadsl.com/hadsl.nsf/Documents/ LS2CAPI+-+Calling+Notes+C-API+from +LotusScript!OpenDocument• Step through it in the debugger.. ;-)
  56. 56. Conclusion• Use these techniques to deal with large systems • Minimise, Simplify and Productionalise your code• Learn xPages

×