Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://www.mindoo.com/web/blog.nsf/feed.rss

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <rss version="2.0"
  3. xmlns:dc="http://purl.org/dc/elements/1.1/"
  4. xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  5. xmlns:admin="http://webns.net/mvcb/"
  6. xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  7. xmlns:content="http://purl.org/rss/1.0/modules/content/"
  8. xmlns:wfw="http://wellformedweb.org/CommentAPI/">
  9. <channel>
  10. <title>Mindoo Blog</title>
  11. <description>Cutting edge technologies - About Java, Lotus Notes and iPhone</description>
  12. <link>https://www.mindoo.de/web/blog.nsf/</link>
  13. <language>en-us</language>
  14. <lastBuildDate>Fri, 18 Nov 2022 22:29:22 +0200</lastBuildDate>
  15. <item>
  16. <title>Configure Eclipse 4.6.x with HCL Notes 12.0.1 FP1</title>
  17. <pubDate>Fri, 18 Nov 2022 22:29:22 +0200</pubDate>
  18. <description>
  19. <![CDATA[
  20. Once again I had to ask HCL development for setup instructions how to launch the HCL Notes Standard Client from an Eclipse IDE, this time for Notes 12.0.1 FP1. The instructions I had gotten earlier f ...
  21. ]]>
  22. </description>
  23. <link>https://www.mindoo.com/web/blog.nsf/dx/18.11.2022222922KLET7X.htm</link>
  24. <category>Eclipse</category>
  25. <dc:creator>Karsten Lehmann</dc:creator>
  26. <comments>https://www.mindoo.com/web/blog.nsf/dx/18.11.2022222922KLET7X.htm?opendocument&amp;comments</comments>
  27. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/18.11.2022222922KLET7X.htm</guid>
  28. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">Once again I had to ask HCL development for setup instructions how to launch the HCL Notes Standard Client from an Eclipse IDE, this time for Notes 12.0.1 FP1.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The instructions I had gotten earlier for Notes 10 have not changed much (I think there's one additional VM argument at the end of the list), but enough so that they did not work anymore.</span> <br /><span style=" font-size:10pt;font-family:sans-serif"><br /> The document links to Eclipse Neon 4.6.3, but it's still working for me in later versions, I tried it with Eclipse 2020-09 (4.17.0, 64 bit).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">I used my local installation directory in the text below (C:\Program Files (x86)\HCL\Notes) and the plugin version for com.ibm.rcp.base in Notes 12.0.1 FP1.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Of course these need to match your local environment.<br /> <br /> <strong><span style="text-decoration:underline"><br /> 1. Download Eclipse Neon (4.6.3) or later from link below:</span></strong></span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;color:blue"><span style="text-decoration:underline"><br /> </span></span><a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-committers-neon-3-win32-x86_64.zip" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-committers-neon-3-win32-x86_64.zip</span></a><span style=" font-size:10pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline"><br /> 2. Get HCL Notes 12.0.1 FP1</span></strong></span><span style=" font-size:10pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif">I used the instructions with the 32 bit Notes Client so far.</span> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline"><br /> 3. Go to Windows => Preferences => Java => Installed JREs</span></strong></span><span style=" font-size:10pt"> </span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">Add => Standard VM =></span><span style=" font-size:10pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">JRE home: <code>C:\Program Files (x86)\HCL\Notes\jvm</code></span><span style=" font-size:10pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">JRE name: â\x80\x9cNotes JREâ\x80\x9d</span><span style=" font-size:10pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Select the JRE to point to this and Apply</span></li></ul><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline"><br /> 4. Go to Windows => Preferences => Plug-in Development => Target Platform</span></strong></span><span style=" font-size:10pt"> </span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">Add => default => Target Content</span><span style=" font-size:10pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Name: â\x80\x9cNotes Targetâ\x80\x9d</span></li></ul><span style=" font-size:10pt;font-family:sans-serif"><br /> 4a. In Locations Tab:</span><span style=" font-size:10pt"> </span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">Add => Directory => Location => <code>C:\Program Files (x86)\HCL\Notes\framework\rcp\eclipse\plugins</code></span><span style=" font-size:10pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Add => Directory => Location => <code>C:\Program Files (x86)\HCL\Notes\framework\shared\eclipse\plugins</code></span><span style=" font-size:10pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Finish</span><span style=" font-size:10pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Select the Target platform to point to â\x80\x9cNotes Targetâ\x80\x9d and Apply</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif">4 b. In Content Tab:</span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">go through the plugin list</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">for duplicate plugins, deactivate the older one</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">only relevant if you have installed a fixpack</span></li></ul><span style=" font-size:10pt;font-family:sans-serif"><br /> 4 c. In Environment Tab:</span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Please select following settings:</span><span style=" font-size:10pt"> </span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">Operating System: win32</span><span style=" font-size:10pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Windowing System: win32</span><span style=" font-size:10pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Architecture: x86</span><span style=" font-size:10pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Locale: en_US - English (United States)</span></li></ul><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline"><br /> 5. Go to Windows => Preferences => Run/Debug => String Substitution</span></strong></span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> New => Add 2 strings (change plugin version and path based on your setup)</span><span style=" font-size:10pt"><br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> 5a. Name: rcp_home</span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Value: <code>C:\Program Files (x86)\HCL\Notes\framework</code><br /> <br /> 5b. Name: rcp_base</span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Value: <code>C:\Program Files (x86)\HCL\Notes\framework\rcp\eclipse\plugins\com.ibm.rcp.base_10.0.0.20211117-0921</code></span><span style=" font-size:10pt"><br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> OK</span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Close this Preferences Window</span><span style=" font-size:10pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline"><br /> 6. Put the following file inside the below plugin:</span></strong></span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <code>C:\Program Files (x86)\HCL\Notes\framework\rcp\eclipse\plugins\com.ibm.rcp.base_10.0.0.20211117-0921</code></span><span style=" font-size:10pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <a href="https://www.mindoo.com/web/blog.nsf/dx/rcp.security.properties/$file/rcp.security.properties" target="_blank" title="rcp.security.properties">rcp.security.properties</a></span><span style=" font-size:10pt"> <br /> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline"><br /> 7. Open Debug Configurations in the â\x80\x98Debug Perspectiveâ\x80\x99 => Eclipse Configuration => New</span></strong></span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> 7a. In the Main tab:</span><span style=" font-size:10pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Name: NotesDebug</span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Program to Run => &nbsp;Run a product => <code>com.ibm.notes.branding.notes</code><br /> Java Runtime Environment => Runtime JRE => Select â\x80\x9cNotes JREâ\x80\x9d i.e. the one we added in step 3</span><span style=" font-size:10pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> 7b. In the Arguments tab: </span><span style=" font-size:10pt"><br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Program Arguments:</span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <code>-clean -console -debug -log -personality com.ibm.rcp.platform.personality -config notes</code></span><span style=" font-size:10pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> VM Arguments:</span><span style=" font-size:10pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <code>-Xquickstart<br>-Xss384k<br>-Xshareclasses<br>-Drcp_home="${rcp_home}"<br>-Drcp.install.config=user<br>-Dosgi.install.area="${rcp_home}\eclipse"<br>-Disa.ignoreESR=true<br>-Dcom.ibm.pvc.osgiagent.core.logfileloc="${rcp_home}\rcp"<br>-Dcom.ibm.pvc.webcontainer.port=0<br>-Declipse.pluginCustomization="${rcp_home}\rcp\plugin_customization.ini"<br>-Djava.security.properties="${rcp_base}\rcp.security.properties"<br>-Declipse.registry.nulltoken=true<br>-Djava.protocol.handler.pkgs=com.ibm.net.ssl.www.protocol<br>-Djava.util.logging.config.class=com.ibm.rcp.core.internal.logger.boot.LoggerConfig<br>-Dosgi.hook.configurators.exclude=org.eclipse.core.runtime.internal.adaptor.EclipseLogHook<br>-Dosgi.framework.extensions=com.ibm.rcp.core.logger.frameworkhook,com.ibm.rds,com.ibm.cds<br>"-Xbootclasspath/a:${rcp_base}\rcpbootcp.jar"<br>-Xdump:system:events=user</code></span><span style=" font-size:10pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline"><br /> 8. Apply => Debug â\x80\x93 This will launch your Notes in Debug mode. </span></strong><br /> Ensure that whenever you launch the Notes from Eclipse, there should be no other instance of Notes already running. If so, please close Notes and then launch from Eclipse to debug.</span>  ]]></content:encoded>
  29. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/18.11.2022222922KLET7X.htm</wfw:commentRss>
  30. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/18.11.2022222922KLET7X.htm?opendocument&amp;comments</wfw:comment>
  31. </item>
  32. <item>
  33. <title>New release of Open Eclipse Update Site to fix issues with Win/64 Notes Client 12.0.2</title>
  34. <pubDate>Thu, 17 Nov 2022 23:24:41 +0200</pubDate>
  35. <description>
  36. <![CDATA[
  37. As Jesse blogged there are some issues in the new Windows 64 Bit Notes Client 12.0.2 that break the "Import Local Update Site" functionality of the standard Update Site template of Domino. To fix thi ...
  38. ]]>
  39. </description>
  40. <link>https://www.mindoo.com/web/blog.nsf/dx/17.11.2022232441KLEUAH.htm</link>
  41. <category>DDE</category>
  42. <dc:creator>Karsten Lehmann</dc:creator>
  43. <comments>https://www.mindoo.com/web/blog.nsf/dx/17.11.2022232441KLEUAH.htm?opendocument&amp;comments</comments>
  44. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/17.11.2022232441KLEUAH.htm</guid>
  45. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">As </span><a href="https://frostillic.us/blog/posts/2022/11/17/notes-domino-12-0-2-fallout" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Jesse blogged</span></a><span style=" font-size:10pt;font-family:sans-serif"> there are some issues in the new Windows 64 Bit Notes Client 12.0.2 that break the "Import Local Update Site" functionality of the standard Update Site template of Domino.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">To fix this and other issues, I just uploaded a new release of the </span><a href="https://www.openntf.org/main.nsf/project.xsp?r=project/Open%20Eclipse%20Update%20Site/releases/8AC6CDB1EC752629862588FD007AA5F0" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Open Eclipse Update Site</span></a><span style=" font-size:10pt;font-family:sans-serif"> on OpenNTF.</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Here is the fixlist:</span> <br /><span style=" font-size:12pt">&nbsp;</span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">This release fixes LS errors in the new Windows 12.0.2 64 Bit client that occur because LS tries to load SWT Java classes, but they do not seem to be available in the Windows 64 Bit client (same for Mac/64 which had already been fixed in earlier releases).</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">In addition we fixed feature deletion. You can now delete disabled features, not just enabled features like in 1.1.</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">"IBM" has been replaced with "HCL" in several areas to match the current R11 standard Update Site template of Domino.</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">broken links in the about/using this database pages have been fixed</span></li></ul>  ]]></content:encoded>
  46. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/17.11.2022232441KLEUAH.htm</wfw:commentRss>
  47. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/17.11.2022232441KLEUAH.htm?opendocument&amp;comments</wfw:comment>
  48. </item>
  49. <item>
  50. <title>Java class line numbers for plugin developers</title>
  51. <pubDate>Tue, 25 Oct 2022 10:32:42 +0200</pubDate>
  52. <description>
  53. <![CDATA[
  54. This is a shameless copy of Mikkel Heisterberg's blog article (https://lekkimworld.com/2010/04/14/java-class-line-numbers-for-plugin-developers/) to have this helpful information twice in the Google i ...
  55. ]]>
  56. </description>
  57. <link>https://www.mindoo.com/web/blog.nsf/dx/25.10.2022103242KLEC2H.htm</link>
  58. <category></category>
  59. <dc:creator>Karsten Lehmann</dc:creator>
  60. <comments>https://www.mindoo.com/web/blog.nsf/dx/25.10.2022103242KLEC2H.htm?opendocument&amp;comments</comments>
  61. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/25.10.2022103242KLEC2H.htm</guid>
  62. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">This is a shameless copy of Mikkel Heisterberg's blog article (</span><a href="https://lekkimworld.com/2010/04/14/java-class-line-numbers-for-plugin-developers/"><span style=" font-size:10pt;color:blue;font-family:sans-serif"><span style="text-decoration:underline">https://lekkimworld.com/2010/04/14/java-class-line-numbers-for-plugin-developers/</span></span></a><span style=" font-size:10pt;font-family:sans-serif">) to have this helpful information twice in the Google index and save me time when I need it in the future. :-)</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Hiding line numbers in stacktraces for performance reasons is pretty high on my top list of the most stupid ideas in Notes/Domino history.</span><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <hr></span><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> If youâ\x80\x99ve been tasked with developing and/or debugging Java extensions for the Notes 8 client you know that line numbers has been missing from the stacktraces produced by Notes. This can be a real problem when trying to debug stuff in a production client. There has been some discussion among the ones of us developing these extensions on how to enable these line numbers. The other day this information was provided by Srinivas Rao of IBM and I wanted to publish it here for all to read.</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Line numbers are removed from the classes added to the shared class cache to reduce the memory needed for the memory mapped classes. To re-enable the line numbers, one needs to edit the <notes>frameworkrcpdeployjvm.properties file and add comment out the ignorelinenumbers vm argument. However, if the classes have already been added to the JVM shared class cache, then they will have been added without line numbers. Either comment out the shared class cache (which will dramatically affect performance at startup) for temporary work, or shutdown notes and remove the shared class cache so that it can be repopulated with classes with line numbers. Of course, this will also affect the startup performance, but not so much as not having a cache</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> These are two of the key lines â\x80¦ to comment them out, add a # to the front of the line</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <code>vmarg.Xnolinenumbers=-Xnolinenumbers</code></span><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <code>vmarg.Dshare=-Xshareclasses:name=xpdplat_.jvm, **line cont**</code><br /> <code> &nbsp; controlDir=${prop.jvm.shareclasses.loc}, **line cont**</code><br /> <code> &nbsp; groupAccess,keep,singleJVM,nonfatal</code></span><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <code>jvm.shareclasses.loc=${rcp.data}/.config/org.eclipse.osgi</code></span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> The shared class cache is typically located in the data/workspace/.config/org.eclipse.osgi</span><span style=" font-size:12pt"> </span>  ]]></content:encoded>
  63. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/25.10.2022103242KLEC2H.htm</wfw:commentRss>
  64. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/25.10.2022103242KLEC2H.htm?opendocument&amp;comments</wfw:comment>
  65. </item>
  66. <item>
  67. <title>Domino crashes with &quot;CheckTheProcesses&quot; message - explanation and workaround for dev environments</title>
  68. <pubDate>Wed, 13 Jul 2022 10:10:42 +0200</pubDate>
  69. <description>
  70. <![CDATA[
  71. Since Domino 8.5.3, there is a built-in facility that checks if all server processes are running. When the server detects that one has disappeared/crashed, the server triggers an NSD to document this ...
  72. ]]>
  73. </description>
  74. <link>https://www.mindoo.com/web/blog.nsf/dx/13.07.2022101042KLEBLS.htm</link>
  75. <category>Notesdev</category>
  76. <dc:creator>Karsten Lehmann</dc:creator>
  77. <comments>https://www.mindoo.com/web/blog.nsf/dx/13.07.2022101042KLEBLS.htm?opendocument&amp;comments</comments>
  78. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/13.07.2022101042KLEBLS.htm</guid>
  79. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">Since Domino 8.5.3, there is a built-in facility that checks if all server processes are running. When the server detects that one has disappeared/crashed, the server triggers an NSD to document this event and crashes/restarts.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">In general, this is a clean approach to keep the server in a consistent state.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">But when you develop Java applications against the Domino Server's Java API, those Java processes are treated as child processes and monitored as well</span> <br /><span style=" font-size:10pt;font-family:sans-serif">It's important to develop the applications in a clean way, so every Thread accessing Domino objects should be initialized with </span><tt><span style=" font-size:10pt">NotesThread.sinitThread()</span></tt><span style=" font-size:10pt;font-family:sans-serif"> and properly uninitialized with </span><tt><span style=" font-size:10pt">NotesThread.stermThread()</span></tt><span style=" font-size:10pt;font-family:sans-serif">.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">To ensure that this is also the case when errors occur in code, use try/finally:</span> <br /> <br /><tt><span style=" font-size:10pt">NotesThread.sinitThread();</span></tt> <br /><tt><span style=" font-size:10pt">Session session = null;</span></tt> <br /><tt><span style=" font-size:10pt">try {</span></tt> <br /><tt><span style=" font-size:10pt">&nbsp; &nbsp;session = NotesFactory.createSession();</span></tt> <br /><tt><span style=" font-size:10pt">&nbsp; &nbsp;// do something with the session object</span></tt> <br /><tt><span style=" font-size:10pt">}</span></tt> <br /><tt><span style=" font-size:10pt">catch (NotesException e) {</span></tt> <br /><tt><span style=" font-size:10pt">&nbsp; &nbsp;e.printStackTrace();</span></tt> <br /><tt><span style=" font-size:10pt">}</span></tt> <br /><tt><span style=" font-size:10pt">finally {</span></tt> <br /><tt><span style=" font-size:10pt">&nbsp; &nbsp;if (session!=null) {</span></tt> <br /><tt><span style=" font-size:10pt">&nbsp; &nbsp; &nbsp; try { session.recycle(); } catch (NotesException e) {e.printStackTrace();}</span></tt> <br /><tt><span style=" font-size:10pt">&nbsp; &nbsp;}</span></tt> <br /><tt><span style=" font-size:10pt">&nbsp; &nbsp;NotesThread.stermThread();</span></tt> <br /><tt><span style=" font-size:10pt">}</span></tt> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">This works in general, but often during development, you step through the code in debugger and just stop its execution, which produces this annoying result:</span> <br /> <br /><img  alt="Image:Domino crashes with &quot;CheckTheProcesses&quot; message - explanation and workaround for dev environments" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/13.07.2022101042KLEBLS.htm/content/M2?OpenElement" /> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Fortunately it is possible disable the automatic Domino crash/restart with this Notes.ini variable:</span> <br /> <br /><tt><span style=" font-size:10pt">NO_TERM_EXIT_NO_PANIC=1</span></tt> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The server still complains about the missing child process, but keeps on running.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Of course, it would be even better if there was a way to exclude specific processes/process names from the monitoring.</span> <br />  ]]></content:encoded>
  80. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/13.07.2022101042KLEBLS.htm</wfw:commentRss>
  81. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/13.07.2022101042KLEBLS.htm?opendocument&amp;comments</wfw:comment>
  82. </item>
  83. <item>
  84. <title>Domino JNA version 0.9.48: API to read/write Notes workspace, some formula magic and QueryResultsProcessor API</title>
  85. <pubDate>Wed, 1 Jun 2022 00:43:40 +0200</pubDate>
  86. <description>
  87. <![CDATA[
  88. Today we released version 0.9.48 of Domino JNA as OSGi plugin for XPages developers and on Maven Central. Here is a list of new features: API to read and write the Notes workspace (read, create an ...
  89. ]]>
  90. </description>
  91. <link>https://www.mindoo.com/web/blog.nsf/dx/01.06.2022004339KLEUND.htm</link>
  92. <category>Domino C API</category>
  93. <dc:creator>Karsten Lehmann</dc:creator>
  94. <comments>https://www.mindoo.com/web/blog.nsf/dx/01.06.2022004339KLEUND.htm?opendocument&amp;comments</comments>
  95. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/01.06.2022004339KLEUND.htm</guid>
  96. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">Today we released version 0.9.48 of </span><a href="https://github.com/klehmann/domino-jna" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Domino JNA</span></a><span style=" font-size:10pt;font-family:sans-serif"> as OSGi plugin for XPages developers and on Maven Central.</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Here is a list of new features:</span><span style=" font-size:12pt"> </span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">API to read and write the Notes workspace (read, create and modify pages and icons, change page order, move replicas on top etc.)</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Formula execution now supports more than 64k of return data</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">API to apply security to formula execution (e.g. prevent Notes.ini changes)</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">API for QueryResultsProcessor (produces JSON and views)</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Java 8 date/time support for NotesNote.replaceItemValue(...)</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">New utility class to format view data as markdown table</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Added method to get agent design doc UNID</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Added hierarchical recycling (parent/child auto recycle)</span></li></ul><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline"><br /> Notes Workspace API</span></strong></span><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> The new Notes workspace API is pretty feature complete. It let's you read and modify the workspace content and contains functionality that I have long been waiting for in the Notes Client user interface like a method to change the order of tabs.</span><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Actually I built this for my own purpose because I needed a tool to remove icons that no longer exist.</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> To play with the API and as a sample for a standalone application using Domino JNA, I created a small Maven project that you can find here:</span><span style=" font-size:12pt"> </span><span style=" font-size:12pt;color:blue"><span style="text-decoration:underline"><br /> </span></span><a href="https://github.com/klehmann/domino-jna/tree/develop/workspace-demo"><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://github.com/klehmann/domino-jna/tree/develop/workspace-demo</span></a><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> The application creates a new workspace page:</span><span style=" font-size:12pt"> <br /> <br /> </span><img  alt="Image:Domino JNA version 0.9.48: API to read/write Notes workspace, some formula magic and QueryResultsProcessor API" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/01.06.2022004339KLEUND.htm/content/M2?OpenElement" /><span style=" font-size:12pt"><br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> and a database icon with a red rectangle:</span><span style=" font-size:12pt"><br /> <br /> </span><img  alt="Image:Domino JNA version 0.9.48: API to read/write Notes workspace, some formula magic and QueryResultsProcessor API" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/01.06.2022004339KLEUND.htm/content/M3?OpenElement" /><span style=" font-size:12pt"><br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> We support both the classic 32x32 pixel icons and the new 64x64 true color ones. By passing a NotesDatabase object to NotesWorkspace.addIcon(...), the current DB icon gets extracted from the NSF design and copied into the workspace.</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Please make sure that the Notes Client is not running or in its early startup phase when you modify the workspace. Otherwise the changes will not be visible in the Notes UI and might later be overwritten.</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline"><br /> Formula magic</span></strong></span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Classic formula execution is limited to 64K of return data. We found a way to remove this limit (e.g. to use @DbColumn to read the whole column of a view) and you can even run formulas in a restricted environment, e.g. to prevent them from changing the Notes.ini or setting document items.</span><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> Methods have been added to analyze a formula in order to see if it's time variant, just contains a field name or uses special functions like @DocSiblings or @DocDescendants.</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline"><br /> QueryResultsProcessor API</span></strong></span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> The </span><a href="https://jdcurtis.blog/2021/11/29/the-query-results-processor-part-one/" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">QueryResultsProcessor</span></a><span style=" font-size:10pt;font-family:sans-serif"> lets you build views across NSF boundaries, have them displayed in the Notes Client or exported in JSON format as string.</span><span style=" font-size:12pt"> <br /> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> In contrast to the implementation in the legacy Notes.jar and LotusScript API, we provide methods to get the JSON result back in a streaming way so that it can be parsed without storing the whole content in the Java heap.</span><span style=" font-size:12pt"> <br /> </span>  ]]></content:encoded>
  97. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/01.06.2022004339KLEUND.htm</wfw:commentRss>
  98. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/01.06.2022004339KLEUND.htm?opendocument&amp;comments</wfw:comment>
  99. </item>
  100. <item>
  101. <title>Chad Schelfhout&#8217;s toolbar code to change document properties</title>
  102. <pubDate>Tue, 26 Apr 2022 11:10:22 +0200</pubDate>
  103. <description>
  104. <![CDATA[
  105. I just noticed that Chad Schelfhout's website is no longer available, that contained formula code for a toolbar icon to read/edit document properties. So here it is to not get lost - the latest versio ...
  106. ]]>
  107. </description>
  108. <link>https://www.mindoo.com/web/blog.nsf/dx/26.04.2022111021KLECS3.htm</link>
  109. <category></category>
  110. <dc:creator>Karsten Lehmann</dc:creator>
  111. <comments>https://www.mindoo.com/web/blog.nsf/dx/26.04.2022111021KLECS3.htm?opendocument&amp;comments</comments>
  112. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/26.04.2022111021KLECS3.htm</guid>
  113. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">I just noticed that Chad Schelfhout's website is no longer available, that contained formula code for a toolbar icon to read/edit document properties.</span> <br /><span style=" font-size:10pt;font-family:sans-serif">So here it is to not get lost - the latest version I have.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Please note that the Notes Client 12 contains Panagenda's Advanced Properties Box plugin to read and compare document properties.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">And Daniel Nashed describes how to get an extended version of the plugin that supports editing as well:</span> <br /><a href="https://blog.nashcom.de/nashcomblog.nsf/dx/advanced-document-properties-including-edit.htm" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://blog.nashcom.de/nashcomblog.nsf/dx/advanced-document-properties-including-edit.htm</span></a> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">So the code below is probably only relevant anymore for older Notes Client installs or the Basic Client.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Edit Document Fields 6.0.0 by Chad Schelfhout.};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Visit </span><a href=http://www.chadsmiley.com/EditDocumentFields><span style=" font-size:10pt;color:blue;font-family:sans-serif">http://www.chadsmiley.com/EditDocumentFields</span></a><span style=" font-size:10pt;font-family:sans-serif"> for the latest updates};</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Changable constants};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cEnableConfirmation := @True;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cFieldHistoryValues := 10;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cStandardSeparators := ":" : ";" : " ";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cPromptTitle :@DbTitle + " - " + @ViewTitle;</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Unchangable constants};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cProfileName :"ChadSmiley Tools";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cEditLastField := "edfLastField";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cEditLastFieldDataType := "edfLastFieldDataType";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cEditLastFieldDataTypeValue := "edfLastFieldDataTypeValue";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cEditLastSeparator := "%~%";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cValueListSeparator := "^";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cFromRawValueSeparator := "%@%";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cSemicolonReplace := "#SC#";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cMaxSearchForSelectedDocs := 5520;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cMaxUpdatedDocuments := 1000;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cArraySeparator := ";";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cNoteEntryLength := 11;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cPromptNewLineOne := @Char(13);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cPromptNewLineTwo := cPromptNewLineOne + cPromptNewLineOne;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cPromptTab :@Char(9);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cCategoryNoteID := "NT00000000";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cTextExtractList := "Text Left":"Text Left Back":"Text Right":"Text Right Back";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cNoPromptList := cTextExtractList:"Remove Field":"Unique":"Sort Ascending":"Sort Descending":"Implode":"Explode":"Proper Case Text":"Proper Case Text Multi Value":"Lower Case Text":"Lower Case Text Multi Value":"Upper Case Text":"Upper Case Text Multi Value":"Password Convert":"Trim":"Trim then Unique";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cErrorCheckCode := "@Implode( @Unique( @Explode( NoteIDList : ErrorNoteID ; cArraySeparator ; @False ) ) )";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">cErrorInformation := "\"Error documents: \" + @Implode( @Unique( @Explode( ErrorNoteIDList ; cArraySeparator ; @False ) ) ; \", \" ) + cPromptNewLineOne + \"Not updated documents: \" + @Implode( @Unique( @Explode( ErrorNoteIDList ; cArraySeparator ; @False ) ) ; \", \" )";</span> <br /> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Data types|@Function execution};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">DataTypesCombo := @Explode(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Integer|@TextToNumber( RawValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Integer Multi Value|@TextToNumber( @Explode( RawValue ; Separator; @True) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Date|@ToTime( RawValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Date Multi Value|@ToTime( @Explode( RawValue ; Separator; @True) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Text|@Text( RawValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Text Multi Value|@Text( @Explode( RawValue ; Separator; @True) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Text Left|@Left( @Text( @GetField( EditField&#91;ef&#93; ) ) ; ExtractValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Text Left Back|@LeftBack( @Text( @GetField( EditField&#91;ef&#93; ) ) ; ExtractValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Text Right|@Right( @Text( @GetField( EditField&#91;ef&#93; ) ) ; ExtractValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Text Right Back|@RightBack( @Text( @GetField( EditField&#91;ef&#93; ) ) ; ExtractValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Trim|@Trim( @Text( @GetField( EditField&#91;ef&#93; ) ) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Trim then Unique|@Unique(@Trim( @Text( @GetField( EditField&#91;ef&#93; ) ) ) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Name|RawValue$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Name Multi Value|RawValue$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Common Name|@Name( &#91;CN&#93;; RawValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Common Name Multi Value|@Name( &#91;CN&#93;; @Explode( RawValue ; \":\"; @True ) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Upper Case Text|@UpperCase( @Implode( @Text( @GetField( EditField&#91;ef&#93; ) ) ) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Lower Case Text|@LowerCase( @Implode( @Text( @GetField( EditField&#91;ef&#93; ) ) ) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Proper Case Text|@ProperCase( @Implode( @Text( @GetField( EditField&#91;ef&#93; ) ) ) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Upper Case Text Multi Value|@UpperCase( @Explode( @Text( @GetField( EditField&#91;ef&#93; ) ) ; Separator; @True ))$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Lower Case Text Multi Value|@LowerCase( @Explode( @Text( @GetField( EditField&#91;ef&#93; ) ) ; Separator; @True) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Proper Case Text Multi Value|@ProperCase( @Explode( @Text( @GetField( EditField&#91;ef&#93; ) ) ; Separator; @True) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Replace Substring|@ReplaceSubstring( @GetField( EditField&#91;ef&#93; ); FromRawValue ; RawValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Replace|@Explode( @Replace( @GetField( EditField&#91;ef&#93; ) ; FromRawValue ; RawValue ) ; Separator ; @True )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Implode|@Implode( @Text( @GetField( EditField&#91;ef&#93; ) ) ; Separator )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Explode|@Explode( @Text( @GetField( EditField&#91;ef&#93; ) ) ; Separator; @True )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Formula|@Eval( RawValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Abbreviate Name|@Name(&#91;Abbreviate&#93;; RawValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Abbreviate Name Multi Value|@Name( &#91;Abbreviate&#93;; @Explode( RawValue ; Separator; @True ) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Password Set|@Password( RawValue )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Password Convert|@Password( @GetField( EditField&#91;ef&#93; ) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Remove Field|@DeleteField$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Unique|@Unique(@GetField( EditField&#91;ef&#93;))$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"+ Append Values|@If(" +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">" &nbsp; &nbsp; @GetField(EditField&#91;ef&#93;) = \"\"; RawValue;" +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">" &nbsp; &nbsp; @Contains(DefaultDataType; \"Date\");" +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">" &nbsp; &nbsp; &nbsp;@If( @IsError( @ToTime( RawValue ) ) ;" +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">" &nbsp; &nbsp; &nbsp; \"\" ;" +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">" &nbsp; &nbsp; &nbsp; @SetField( EditField&#91;ef&#93; ; @GetField(EditField&#91;ef&#93;) : @TextToTime( @Explode( RawValue ; Separator ) ) ) ) ;" +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">" &nbsp; &nbsp; @Contains(DefaultDataType; \"Integer\" );" +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">" &nbsp; &nbsp; &nbsp;@If( @IsError( @TextToNumber( @Explode( RawValue ; Separator ) ) ) ;" +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">" &nbsp; &nbsp; &nbsp; \"\" ;" +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">" &nbsp; &nbsp; &nbsp; @SetField( EditField&#91;ef&#93; ; @GetField(EditField&#91;ef&#93;) : @TextToNumber( @Explode( RawValue ; Separator ) ) ) ) ;" +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">" &nbsp; &nbsp; @SetField( EditField&#91;ef&#93; ; @GetField(EditField&#91;ef&#93;) : @Explode( RawValue ; Separator ) ) )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Sort Ascending|@Sort(@GetField(EditField&#91;ef&#93;) ; &#91;Ascending&#93; )$"+</span> <br /><span style=" font-size:10pt;font-family:sans-serif">"Sort Descending|@Sort(@GetField(EditField&#91;ef&#93;); &#91;Descending&#93;)" ; "$" );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">DataTypes := @Word( DataTypesCombo ; "|" ; 1 );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">DataTypesAction := @Word( DataTypesCombo ; "|" ; 2 );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Get a listing of all the fields on the current document};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">List := @Sort( @DocFields );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Look for last field modified in Profile Doc};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FieldList := @Explode( @GetProfileField( cProfileName ; cEditLastField ; @UserName ) ; cArraySeparator ; @True ) ;</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Get the list of forms and field that was updated using Edit Document Fields};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FieldListForms := @Word( FieldList ; cEditLastSeparator ; 1 );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FieldListField := @Word( FieldList ; cEditLastSeparator ; 2 );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FieldListLastIndex := @Member( Form; FieldListForms );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {If the FieldListLastIndex is greater than zero then set the last field to the what was in the profile document};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@If( FieldListLastIndex > 0;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Do( LastField := FieldListField&#91; FieldListLastIndex &#93;;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; FieldList := @ReplaceSubstring( FieldList ; FieldList&#91; FieldListLastIndex &#93; ; "" ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;LastField :="" );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Prompt for which field needs to be updated. Loop until a field is selected or 'Cancel' is selected};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@DoWhile(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;EditField := @Prompt( &#91;OkCancelEditCombo&#93; ; cPromptTitle ; "Select the field you wish to alter or enter a new field to add:" ; LastField ; @Trim( @Unique( List : LastField ) ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;EditField = "" );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">EditFieldPromptTitle := "Change '" + EditField + "' in " + cPromptTitle;</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {This will allow the retrieval of the data type of the field that was last selected. Data is stored like Form+Field%~%DataType.};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FormFieldList := @Explode( @GetProfileField( cProfileName ; cEditLastFieldDataType ; @UserName ) ; cArraySeparator ; @True ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FormFieldListFormField := @Word( FormFieldList ; cEditLastSeparator ; 1 );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FormFieldListDataType := @Word( FormFieldList ; cEditLastSeparator ; 2 );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FormFieldListFormulaCode := @ReplaceSubstring( @Word( FormFieldList ; cEditLastSeparator ; 3 ) ; cSemicolonReplace ; ";" );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FormFieldListIndex := @Member( Form + EditField; FormFieldListFormField );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@If( FormFieldListIndex > 0;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Do( DefaultDataType := FormFieldListDataType&#91; FormFieldListIndex &#93;;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; FormFieldListFormulaCode := FormFieldListFormulaCode&#91; FormFieldListIndex &#93;;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; FormFieldList := @ReplaceSubstring( FormFieldList ; FormFieldList&#91; FormFieldListIndex &#93; ; "" ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;DefaultDataType :="" );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {If there was no data type used for the field on the form the try to determine the data type};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">DefaultDataType :=</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@If( DefaultDataType != "" ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; DefaultDataType ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; @If(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;@IsNumber( @GetField( EditField ) ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; @If( @Count( @GetField( EditField ) ) > 1 ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;"Integer Multi Value" ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;"Integer" ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;@IsTime( @GetField( EditField ) ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; @If( @Count( @GetField( EditField ) ) > 1 ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;"Date Mult iValue" ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;"Date" ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;@If( @Count( @GetField( EditField ) ) > 1 ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;"Text Multi Value" ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;"Text" )</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;)</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;);</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {If the data type is a type of error then select the data type of text};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">DefaultDataType := @IfError( DefaultDataType ; "Text" );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Prompt for which data type you would like the data to be. This needs to be done before value prompt to determine if the Picklist or any prompting needs to be used.};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">DataType := @Prompt( &#91;OkCancelList&#93; ; EditFieldPromptTitle; "Please select the correct data type or action for field: " + EditField + "."; DefaultDataType ; DataTypes );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {The DataTypeAction will contain the formula that will be executed to retrieve the new value};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">DataTypeAction := DataTypesAction&#91; @Member( DataType ; DataTypes ) &#93;;</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {If formula was used on this field then use that instead of the fields value. Format the original value as text because the @Prompt command requires text.};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">OriginalValue := @If( DataType = "Formula" &amp; DefaultDataType = "Formula" &amp; FormFieldListFormulaCode != "" ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;FormFieldListFormulaCode ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@If( @Contains( DefaultDataType ; MultiValue ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; @Implode( @Text( @GetField( EditField ) ) ; cArraySeparator );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; @Text( @GetField( EditField ) ) )</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;);</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {This will allow the retrieval of history of values of the field. Data is stored like Form+Field+DataType%~%ValueList.};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FormFieldListDataTypeValues := @Explode( @GetProfileField( cProfileName ; cEditLastFieldDataTypeValue ; @UserName ) ; cArraySeparator ; @True ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FormFieldListFormFieldDataType := @Word( FormFieldListDataTypeValues ; cEditLastSeparator ; 1 ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FormFieldListValuesLists := @Word( FormFieldListDataTypeValues ; cEditLastSeparator ; 2 ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">FormFieldListDTIndex := @Member( Form + EditField + DataType; FormFieldListFormFieldDataType );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@If( FormFieldListDTIndex > 0;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Do( FormFieldListValuesList := FormFieldListDataTypeValues&#91; FormFieldListDTIndex &#93;;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; FormFieldListValuesList := @ReplaceSubstring( @Trim( @Explode( FormFieldListValuesLists&#91; FormFieldListDTIndex &#93; ; cValueListSeparator ; @False ) ) ; cSemicolonReplace; ";" );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; FormFieldListDataTypeValues := @ReplaceSubstring( FormFieldListDataTypeValues ; FormFieldListDataTypeValues&#91; FormFieldListDTIndex &#93; ; "" ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;FormFieldListValuesList :="" );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Prompt for additional fields and determine the string that they are searching for.};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@If( DataType = ("Replace Substring":"Replace" ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Do( EditField := @Unique( EditField : @Prompt( &#91;OkCancelListMult&#93; ; cPromptTitle ; "Select any addtional fields you wish to alter:" ; EditField ; List ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; FromRawValue := @Prompt( &#91;OkCancelEditCombo&#93; ; EditFieldPromptTitle ; "Enter or select the text (case sensitive) to search for in: " + @Implode( EditField ; ", " ) + "." ; "" ; @Unique( @Word( FormFieldListValuesList ; cFromRawValueSeparator ; 2 ) ) ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Do( EditField := EditField;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; FromRawValue := "" )</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;);</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM { With the Edit combo there will be a list of standard seperators to choose from.};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">Separator := @If( DataType = ("Implode":"Explode" ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Prompt( &#91;OkCancelEditCombo&#93; ; cPromptTitle ; "Enter or select the " + @If( DataType = "Implode" ; "separator" ; "separators" ) + ":" &nbsp;; "" ; @Unique( @If( FormFieldListValuesList = "" ; cStandardSeparators &nbsp;; &nbsp;FormFieldListValuesList : cStandardSeparators ) ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;cArraySeparator );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Determine the string to search for};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">ExtractValue :@If( DataType = cTextExtractList ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Prompt( &#91;OkCancelEditCombo&#93; ; cPromptTitle ; "Enter or select the search string or string length:" ; @Subset( FormFieldListValuesList ; 1 ) ; @Unique( FormFieldListValuesList ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;"" );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Based on what type of data is being entered different prompts will happen if any at all.};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">RawValue := @If(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Contains( DataType ; "Name Multi Value" ) ; @PickList( &#91;Name&#93; );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Contains( DataType ; "Name" ) ; @PickList( &#91;Name&#93; : &#91;Single&#93; );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;DataType = ( cNoPromptList ) ; "" ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Contains( DataType ; "Multi Value" ) ; @Prompt( &#91;OkCancelEditCombo&#93; ; EditFieldPromptTitle; "Enter or select the new desired value for: " + @Implode( EditField ; ", " ) + "." + cPromptNewLineTwo + "Seperated with ; for each value." ; OriginalValue ; @Unique( OriginalValue : FormFieldListValuesList ) ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Contains( DataType ; "+ Append Values" ) ; @Prompt( &#91;OkCancelEditCombo&#93; ; EditFieldPromptTitle; "Enter or select values to append: " + @Implode( EditField ; ", " ) + "." + cPromptNewLineTwo + "Seperated with ; for each value." ; "" ; @Unique( FormFieldListValuesList ) ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;DataType = ("Replace Substring":"Replace" ) ; @Prompt( &#91;OkCancelEditCombo&#93; ; EditFieldPromptTitle ; "Enter or select the text to repalce with in: " + EditField + "." ; "" ; @Unique( @Word( FormFieldListValuesList ; cFromRawValueSeparator ; 1 ) ) ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;DataType = "Formula" ; @Do( @DoWhile(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; OriginalValue := @Prompt( &#91;OkCancelEditCombo&#93; ; EditFieldPromptTitle ; "Enter or select the new desired formula for: " + EditField + "." ; OriginalValue ; @Unique( OriginalValue : FormFieldListValuesList ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; tempReturnCheck := @CheckFormulaSyntax( OriginalValue );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; @If( tempReturnCheck != "1"; @Prompt( &#91;Ok&#93; ; "Invalid Formula - " + EditFieldPromptTitle ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;"Invalid Formula entered: " +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;cPromptNewLineTwo + cPromptTab + "Error: " + cPromptTab + cPromptTab + @Text( tempReturnCheck ) +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;cPromptNewLineOne + cPromptTab + "Formula: " + cPromptTab + &nbsp;cPromptTab + OriginalValue ) ; "" );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;tempReturnCheck != "1" );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;OriginalValue );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Prompt( &#91;OkCancelEditCombo&#93; ; EditFieldPromptTitle ; "Enter or select the new desired value for: " + EditField + "." ; OriginalValue &nbsp;; @Unique( OriginalValue : FormFieldListValuesList ) )</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;);</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Store Field in Profile doc};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@SetProfileField( cProfileName ; cEditLastField ; @Unique( @Trim( FieldList : ( Form + cEditLastSeparator + EditField&#91;1&#93; ) ) ); @UserName );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Store Data Type of Field in Profile doc};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@SetProfileField( cProfileName ; cEditLastFieldDataType ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Unique( @Trim( FormFieldList : ( Form + EditField&#91;1&#93; + cEditLastSeparator + DataType + cEditLastSeparator +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; @ReplaceSubstring(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;@If( DataType = "Formula" ; RawValue ; FormFieldListFormulaCode ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;";" ; cSemicolonReplace ) ) ) ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@UserName );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Store Data Value of Field in Profile doc};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@SetProfileField( cProfileName ; cEditLastFieldDataTypeValue ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Unique( @Trim( FormFieldListDataTypeValues : ( Form + EditField&#91;1&#93; + DataType + cEditLastSeparator +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; @Implode(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;@Subset(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; @Unique(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; @ReplaceSubstring(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;@If( DataType = ("Implode":"Explode" ) ; Separator ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; DataType = cTextExtractList ; ExtractValue ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; DataType = ( "Replace Substring":"Replace" ) ; RawValue + cFromRawValueSeparator + FromRawValue ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; RawValue ) : FormFieldListValuesList &nbsp;;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;";" ; cSemicolonReplace ) ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; cFieldHistoryValues );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;cValueListSeparator ) ) ) ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@UserName );REM {If multi docs selected, only process those checked ... an unchecked doc cannot be NavNextSelected};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@Command(&#91;NavNextSelected&#93;);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@UpdateFormulaContext;</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Store all Note IDs before manipulation in case field modifications cause categorized views or sorted columns to reorganize};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">NoteIDList :@Text( @NoteID );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">ErrorNoteIDList := "";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@Command(&#91;NavNextSelected&#93;);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@UpdateFormulaContext;</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Start Looping Selected documents to gather all the documents that need to be updated.};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@While( ( @Left( NoteIDList ; cNoteEntryLength ) != ( @Text( @NoteID + cArraySeparator ) ) ) &amp; ( @Length( NoteIDList ) < cMaxSearchForSelectedDocs ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;NoteIDList := NoteIDList + cArraySeparator + @Text( @NoteID );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;NoteIDList := @ReplaceSubstring( NoteIDList ; cCategoryNoteID + cArraySeparator ; "" );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Command(&#91;NavNextSelected&#93;);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@UpdateFormulaContext</span> <br /><span style=" font-size:10pt;font-family:sans-serif">);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Remove all category Note IDs};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">NoteIDList :@ReplaceSubstring( NoteIDList ; cCategoryNoteID ; "" );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Remove all duplicate Note IDs};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">NoteIDList :@Unique( @Explode( NoteIDList ; cArraySeparator ; @False ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@StatusBar( "Found " + @Text( @Elements( NoteIDList ) ) + " documents." );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">NotNoteIDList := "";</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Determine if the document should be updated.};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">tmpPrompt := @Implode( "The following information will be used to update the " + @Text( @Elements( NoteIDList ) ) + " document" + @If( @Elements( NoteIDList ) > 1 ; "s" ; "" ) + "." + cPromptTab + cPromptTab +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;cPromptNewLineTwo + cPromptTab + "Field:" + cPromptTab + cPromptTab + EditField +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;cPromptNewLineOne + cPromptTab + "Data type/action: " + cPromptTab + DataType +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;cPromptNewLineOne + cPromptTab +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; @If( &nbsp;DataType = ("Implode":"Explode" ) ; "Separator: &nbsp;" + cPromptTab + Separator ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; DataType = ("Text Left":"Text Left Back":"Text Right":"Text Right Back" ) ; "Search string: &nbsp;" + cPromptTab + ExtractValue ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; DataType = ("Replace Substring":"Replace" ) ; "Search string: &nbsp;" + cPromptTab + FromRawValue + cPromptNewLineOne + cPromptTab + "Replace string: &nbsp;" + cPromptTab + RawValue ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; DataType = cNoPromptList;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; "" ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; "Value: &nbsp;" + cPromptTab + cPromptTab + @Text( RawValue ) ) +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;cPromptNewLineTwo + "Would you like to continue?" );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@If( cEnableConfirmation ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Do(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;@StatusBar( @Explode( tmpPrompt ; cPromptNewLineOne ; @True ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; @If( @Prompt( &#91;YesNo&#93;; EditFieldPromptTitle ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;tmpPrompt );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;"" ; @Return ( "" ) ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;"" );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">REM {Loop through selected docs taking each NoteIDList out of the list as it is processed};</span> <br /><span style=" font-size:10pt;font-family:sans-serif">DocUpdateCount := 0;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">DocNavigationCount := 0;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@While( DocUpdateCount < @Elements( NoteIDList ) ;</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@If( @TextToNumber( @Text( @DocumentUniqueID ) ) != 0 ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; @Do(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;NoteIDList := @Replace( NoteIDList ; @NoteID ; "" ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;NotNoteIDList := NotNoteIDList : @NoteID;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;@For( ef := 1; ef <= @Elements( EditField ); ef := ef + 1;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; formulaResult := @Eval( DataTypeAction );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">REMark := " **REM** The values entered above will be applied to all selected doc. If data conversion doesn't work then don't set field.";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; @If( @IsError( formulaResult );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;@Do(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; tmpPrompt := "Error with NoteID of " + @NoteID + ". Continue?" + cPromptTab +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; cPromptNewLineOne + cPromptTab + "Error: " + cPromptTab + cPromptTab + @Text( FormulaResult ) +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; cPromptNewLineOne + cPromptTab + "Formula: " + cPromptTab + &nbsp;cPromptTab + DataTypeAction +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; cPromptNewLineOne + cPromptTab + @If( @Contains( DataTypeAction ; "EditField&#91;ef&#93;" ) ; "EditField&#91;ef&#93;:" ; "Field:" + cPromptTab ) + cPromptTab + EditField&#91;ef&#93; +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; cPromptNewLineOne + cPromptTab + "Data type/action: " + cPromptTab + DataType +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; cPromptNewLineOne + cPromptTab +</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; @If( &nbsp;DataType = ("Replace Substring":"Replace" ) ; "FromRawValue: &nbsp;" + cPromptTab + @Text( FromRawValue )+ cPromptNewLineOne + cPromptTab + "RawValue: &nbsp;" + cPromptTab + @Text( RawValue ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; DataType = cNoPromptList;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; "" ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; "RawValue: &nbsp;" + cPromptTab + @Text( RawValue ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;@StatusBar( @Explode( tmpPrompt ; cPromptNewLineOne ; @True ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;@If( @Prompt( &#91;YesNo&#93; ;"Error - " + EditFieldPromptTitle ; tmpPrompt ) ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; &nbsp;ErrorNoteIDList := ErrorNoteIDList+ cArraySeparator + @Text( @NoteID );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; @Return( @If( @Eval( cErrorCheckCode ) != "" ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; &nbsp;@StatusBar( @Explode( @Eval( cErrorInformation ) ; cPromptNewLineOne ; @True ) ):</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; &nbsp;@Prompt( &#91;Ok&#93; ; "Unable to Update - " + EditFieldPromptTitle ; @Eval( cErrorInformation ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; "" ) ) ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; @SetField( EditField&#91;ef&#93; ; formulaResult )</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; )</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;@If( DocNavigationCount > cMaxUpdatedDocuments ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;NoteIDList := "";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; @Do(</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;DocUpdateCount := DocUpdateCount + 1;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;@Command(&#91;NavNextSelected&#93;);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;@UpdateFormulaContext;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">REMark := " **REM** If we haven't processed all docs yet but the current doc is not in the NoteIDList list, keep looping ... if cnt exceeds MaxUpdatedDocuments assume infinite loop and stop ";</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;@If( DocUpdateCount < @Elements( NoteIDList ) &amp; ( !@Member( @NoteID ; NoteIDList ) ) &amp; ( !@Member( @NoteID ; NotNoteIDList) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; @While( (! @Member( @NoteID ; NoteIDList ) &amp; DocNavigationCount < cMaxUpdatedDocuments );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; &nbsp;@Command(&#91;NavNextSelected&#93;);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; &nbsp;@UpdateFormulaContext;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp; &nbsp;DocNavigationCount := DocNavigationCount + 1);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; &nbsp;"")</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp; )</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; &nbsp;)</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Do( @Command(&#91;NavNextSelected&#93;);</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp; @UpdateFormulaContext )</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;)</span> <br /><span style=" font-size:10pt;font-family:sans-serif">);</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">@If( @Implode( @Unique( @Explode( NoteIDList : ErrorNoteIDList ; cArraySeparator ; @False ) ) ) != "" ;</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@StatusBar( @Explode( @Eval( cErrorInformation ) ; cPromptNewLineOne ; @True ) ):</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;@Prompt( &#91;Ok&#93; ; "Unable to Update - " + EditFieldPromptTitle ; @Eval( cErrorInformation ) );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">&nbsp;"" );</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">@StatusBar( "Navigated through " + @Text( DocUpdateCount + DocNavigationCount ) + " documents." );</span> <br /><span style=" font-size:10pt;font-family:sans-serif">@StatusBar( "Performed '" + DataType + "' for '" + @Implode( EditField ; ", " ) + "' field" + @If( @Elements( EditField ) > 1; "s " ; " " ) + "on " + @Text( DocUpdateCount ) + " document" + @If( DocUpdateCount > 1 ; "s" ; "" ) + "." )</span> <br /> <br />  ]]></content:encoded>
  114. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/26.04.2022111021KLECS3.htm</wfw:commentRss>
  115. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/26.04.2022111021KLECS3.htm?opendocument&amp;comments</wfw:comment>
  116. </item>
  117. <item>
  118. <title>Ralf Petter&#8217;s blog about Notes, Eclipse and Expeditor back online</title>
  119. <pubDate>Mon, 20 Dec 2021 14:06:16 +0200</pubDate>
  120. <description>
  121. <![CDATA[
  122. Yesterday I noticed that Ralf Petter's blog "Everything about IT" is not online anymore. Ralf died years ago from cancer and his blog contains invaluable tips around Notes, Eclipse and Expeditor devel ...
  123. ]]>
  124. </description>
  125. <link>https://www.mindoo.com/web/blog.nsf/dx/20.12.2021140602KLEHDH.htm</link>
  126. <category></category>
  127. <dc:creator>Karsten Lehmann</dc:creator>
  128. <comments>https://www.mindoo.com/web/blog.nsf/dx/20.12.2021140602KLEHDH.htm?opendocument&amp;comments</comments>
  129. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/20.12.2021140602KLEHDH.htm</guid>
  130. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">Yesterday I noticed that Ralf Petter's blog "Everything about IT" is not online anymore. Ralf died years ago from cancer and his blog contains invaluable tips around Notes, Eclipse and Expeditor development.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">In June 2017 when I heard about his death, I downloaded all blog articles and kept them on my local disk.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Now that the official blog is gone, I uploaded them to our server, added them to the Google index and made them available here:</span> <br /> <br /><a href="https://ralfpetter-blog-mirror.mindoo.de/" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://ralfpetter-blog-mirror.mindoo.de</span></a> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Unfortunately I did not create copies of his free tools and they are not on OpenNTF or Github.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">I could find the ZIP archive with the latest DocumentSpy plugin in the Wayback machine and fixed the download link in this article:</span> <br /> <br /><a href="https://ralfpetter-blog-mirror.mindoo.de/www.everythingaboutit.eu/p/install-document-spy.html" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://ralfpetter-blog-mirror.mindoo.de/www.everythingaboutit.eu/p/install-document-spy.html</span></a> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">If anybody has a copy of these three tools, please send them to me:</span> <br /> <br /><a href="https://ralfpetter-blog-mirror.mindoo.de/www.everythingaboutit.eu/p/install-extension-spy.html" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://ralfpetter-blog-mirror.mindoo.de/www.everythingaboutit.eu/p/install-extension-spy.html</span></a> <br /> <br /><a href="https://ralfpetter-blog-mirror.mindoo.de/www.everythingaboutit.eu/p/install-todoactivator.html" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://ralfpetter-blog-mirror.mindoo.de/www.everythingaboutit.eu/p/install-todoactivator.html</span></a> <br /> <br /><a href="https://ralfpetter-blog-mirror.mindoo.de/www.everythingaboutit.eu/p/install-shortcutbuttonbar-enabler.html" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://ralfpetter-blog-mirror.mindoo.de/www.everythingaboutit.eu/p/install-shortcutbuttonbar-enabler.html</span></a> <br />  ]]></content:encoded>
  131. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/20.12.2021140602KLEHDH.htm</wfw:commentRss>
  132. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/20.12.2021140602KLEHDH.htm?opendocument&amp;comments</wfw:comment>
  133. </item>
  134. <item>
  135. <title>Mindoo CMS on Domino: Some examples</title>
  136. <pubDate>Tue, 27 Jul 2021 07:42:43 +0200</pubDate>
  137. <description>
  138. <![CDATA[
  139. Mindoo CMS is a Domino powered web content management system that we developed as part of a large project for a local print shop to build a web authoring system for the articles of their local newspap ...
  140. ]]>
  141. </description>
  142. <link>https://www.mindoo.com/web/blog.nsf/dx/27.07.2021074242KLE8QA.htm</link>
  143. <category></category>
  144. <dc:creator>Karsten Lehmann</dc:creator>
  145. <comments>https://www.mindoo.com/web/blog.nsf/dx/27.07.2021074242KLE8QA.htm?opendocument&amp;comments</comments>
  146. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/27.07.2021074242KLE8QA.htm</guid>
  147. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">Mindoo CMS is a Domino powered web content management system that we developed as part of a large project for a local print shop to build a web authoring system for the articles of their local newspapers with approval workflow, custom spellchecker with dictionary stored in Domino (based on </span><a href=http://hunspell.github.io/><span style=" font-size:10pt;color:blue;font-family:sans-serif">http://hunspell.github.io/</span></a><span style=" font-size:10pt;font-family:sans-serif">) and various data exports (e.g. responsive UI and EPUB for subscribers, QuarkXPress and Adobe InDesign for printing machines).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The CMS does not just display the final articles, it's driving the whole web application to compose and approve articles as well.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Here is a list of the main features:</span> <br /> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">responsive user interface for desktop and mobile browsers</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">live editing of websites: as logged in user, just shift-click on any test in the live website and edit it or add content</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">full support of the Domino access model, e.g. to built corporate intranets with different layout/content for target groups</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">very flexible templating system based on custom </span><a href=https://handlebarsjs.com/ target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Handlebars</span></a><span style=" font-size:10pt;font-family:sans-serif"> tags</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">no developer skills needed for authors</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">compose web site pages out of building blocks predefined by the template editor with unrestricted complexity<br /> (e.g. add base page layout, sections for text/images, gallery block and gallery images with meta data; data model is 100% defined within the CMS)</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">automatic history of all CMS pages, files and templates: compare current state with any previous versions and revert back changed as needed</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">implemented/deployed as OSGi plugins on Domino</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">extensible to add custom CMS tags via OSGi extension points</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif">Here are some references of web sites that we developed and that are powered by Mindoo CMS:</span> <br /> <ul> <li><a href=https://www.duerrschnabel.com/web/index.html><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://www.duerrschnabel.com/web/index.html</span></a> </li><li><a href=https://www.bietigheim.de/web/index.html><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://www.bietigheim.de/web/index.html</span></a> </li><li><a href="https://www.gms-bietigheim.de/web/index.html"><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://www.gms-bietigheim.de/web/index.html</span></a> </li><li><a href=https://www.durmersheim.de/web/index.html><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://www.durmersheim.de/web/index.html</span></a> </li><li><a href=https://www.auamrhein.de/web/index.html><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://www.auamrhein.de/web/index.html</span></a> </li><li><a href="https://www.elchesheim-illingen.de/web/index.html"><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://www.elchesheim-illingen.de/web/index.html</span></a> </li><li><a href=https://www.weilgut.de/web/index><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://www.weilgut.de/web/index</span></a></li></ul> <br />  ]]></content:encoded>
  148. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/27.07.2021074242KLE8QA.htm</wfw:commentRss>
  149. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/27.07.2021074242KLE8QA.htm?opendocument&amp;comments</wfw:comment>
  150. </item>
  151. <item>
  152. <title>News Update from Mindoo Land:  Domino JNA / JNX</title>
  153. <pubDate>Mon, 26 Jul 2021 13:15:43 +0200</pubDate>
  154. <description>
  155. <![CDATA[
  156. In a pandemic (in particular with two young kids of 5 and 7 years), times flies by even faster than in regular times, so it's no surprise that this blog has not seen many updates for a very long time. ...
  157. ]]>
  158. </description>
  159. <link>https://www.mindoo.com/web/blog.nsf/dx/26.07.2021131539KLEF8D.htm</link>
  160. <category></category>
  161. <dc:creator>Karsten Lehmann</dc:creator>
  162. <comments>https://www.mindoo.com/web/blog.nsf/dx/26.07.2021131539KLEF8D.htm?opendocument&amp;comments</comments>
  163. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/26.07.2021131539KLEF8D.htm</guid>
  164. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">In a pandemic (in particular with two young kids of 5 and 7 years), times flies by even faster than in regular times, so it's no surprise that this blog has not seen many updates for a very long time.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Just wanted to let you know that we are still very busy, leveraging and improving the Domino AppDev platform.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The biggest project I have been working on in 2020 and so far in 2021 has to do with our </span><a href="https://github.com/klehmann/domino-jna" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Domino JNA</span></a><span style=" font-size:10pt;font-family:sans-serif"> codebase. For the project itself, we released 11 new versions since the beginning of 2020.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">We added functionality that we needed for our own development projects and the project got additional traction because it was used by the <strong>HCL Innovation Labs</strong> initially for </span><a href="https://opensource.hcltechsw.com/domino-keep-docs/" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Project Keep</span></a><span style=" font-size:10pt;font-family:sans-serif">, now called <strong>HCL Domino REST API</strong> and in </span><a href="https://blog.hcltechsw.com/domino/announcing-the-domino-rest-api-beta-program%E2%80%AF%E2%80%AF/" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">public beta</span></a><span style=" font-size:10pt;font-family:sans-serif"> for a few week.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">After the first few internal Keep versions, the HCL Innovation Labs team decided that having a modern Java API for Domino would not just be relevant for their own projects but for every developer out there and that this should (hopefully) become the new standard for Java development on Domino.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">That's why we teamed up with </span><a href=https://frostillic.us/blog target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Jesse Gallagher</span></a><span style=" font-size:10pt;font-family:sans-serif"> to build something even better than Domino JNA - called </span><a href="https://opensource.hcltechsw.com/domino-keep-docs/howkeepworks/dominojnx/" target=_blank><span style=" font-size:10pt;color:red;font-family:sans-serif"><strong><span style="text-decoration:underline">Domino JNX</span></strong></span></a><span style=" font-size:10pt;font-family:sans-serif">.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Let's call it <strong>Domino JNA on steroids</strong>. We took the codebase of Domino JNA and built a powerful API that is both easy to use and has <strong>even more features than Domino JNA</strong>.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Some examples:</span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">automatic garbage collection for Domino C handles (based on Java's </span><a href="https://www.baeldung.com/java-phantom-reference" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">PhantomReference</span></a><span style=" font-size:10pt;font-family:sans-serif">)</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">leverages modern Java language features like </span><a href="https://www.baeldung.com/java-generics" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Generics</span></a><span style=" font-size:10pt;font-family:sans-serif">, </span><a href=https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">lambda expressions</span></a><span style=" font-size:10pt;font-family:sans-serif">, the </span><a href="https://www.baeldung.com/java-8-streams" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Stream API</span></a><span style=" font-size:10pt;font-family:sans-serif"> and </span><a href="https://www.baeldung.com/java-optional" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Optional's</span></a> </li><li><span style=" font-size:10pt;font-family:sans-serif">more APIs, e.g. to read the database design and current efforts to provide write access as well</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">JSON serialization support</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">extensible, e.g. to store your own objects in Domino documents</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif">JNX is the foundation for the HCL Domino REST API which itself is the foundation for other cool projects like the <strong>OpenClient initiative that will provide a native EWS/JMAP API for Domino</strong> and therefore native access for Microsoft Outlook, the Apple Mail client and others.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">There are ongoing efforts to give you, the Domino developer community, access to the JNX API (not just as part of the existing public beta release of the Domino REST API).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">So stay stuned for upcoming announcements! :-)</span>  ]]></content:encoded>
  165. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/26.07.2021131539KLEF8D.htm</wfw:commentRss>
  166. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/26.07.2021131539KLEF8D.htm?opendocument&amp;comments</wfw:comment>
  167. </item>
  168. <item>
  169. <title>OpenNTF May 2021 Webinar: recent Mindoo ToDoManager changes for Notes 12</title>
  170. <pubDate>Thu, 20 May 2021 21:10:19 +0200</pubDate>
  171. <description>
  172. <![CDATA[
  173. Today I took part in OpenNTF's May webinar on recent project updates. I presented the results of my efforts to leverage new functionality of the upcoming Notes 12 client to make our Mindoo ToDoManager ...
  174. ]]>
  175. </description>
  176. <link>https://www.mindoo.com/web/blog.nsf/dx/20.05.2021211015KLEQGZ.htm</link>
  177. <category></category>
  178. <dc:creator>Karsten Lehmann</dc:creator>
  179. <comments>https://www.mindoo.com/web/blog.nsf/dx/20.05.2021211015KLEQGZ.htm?opendocument&amp;comments</comments>
  180. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/20.05.2021211015KLEQGZ.htm</guid>
  181. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">Today I took part in OpenNTF's </span><a href="https://openntf.org/main.nsf/blog.xsp?permaLink=JGAR-C2ZLMR" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">May webinar on recent project updates</span></a><span style=" font-size:10pt;font-family:sans-serif">. I presented the results of my efforts to leverage new functionality of the upcoming Notes 12 client to make our </span><a href="https://openntf.org/main.nsf/project.xsp?r=project/Mindoo%20TodoManager" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Mindoo ToDoManager application</span></a><span style=" font-size:10pt;font-family:sans-serif"> more responsive and adaptable to the available screen real estate.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The application now autodetects the size of the Notes/Nomad client window on startup and picks the best application layout: you either see all four quadrants</span> <br /> <br /> <div align=center><img  alt="Image:OpenNTF May 2021 Webinar: recent Mindoo ToDoManager changes for Notes 12" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/20.05.2021211015KLEQGZ.htm/content/M2?OpenElement" /></div> <br /><span style=" font-size:10pt;font-family:sans-serif">or the mobile optimized narrow layout with a single quadrant at a time:</span> <br /> <br /> <div align=center><img  alt="Image:OpenNTF May 2021 Webinar: recent Mindoo ToDoManager changes for Notes 12" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/20.05.2021211015KLEQGZ.htm/content/M3?OpenElement" /></div> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Notes 12 provides two new @formulas </span><tt><span style=" font-size:10pt">@ResolutionWidth</span></tt><span style=" font-size:10pt;font-family:sans-serif"> / </span><tt><span style=" font-size:10pt">@ResolutionHeight</span></tt><span style=" font-size:10pt;font-family:sans-serif"> to read the dimension of the current UI form or UI view.</span> <br /><span style=" font-size:10pt;font-family:sans-serif">And you get a new form/view event "onsize" that gets triggered on window resize. Enter the formula </span><tt><span style=" font-size:10pt">@Command(&#91;RelayoutWindow&#93;)</span></tt><span style=" font-size:10pt;font-family:sans-serif"> here and your layout gets recomputed when the window is resized by the user, e.g. hide/when or subform formulas that depend on the form dimension might produce a different output.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">To be honest I was fighting a bit to get this new functionality to work reliable in the latest R12 beta 3 client. The TodoManager proves that responsive layouts for Notes applications <span style="text-decoration:underline">are indeed possible</span>. </span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">But I reported a bunch of issues in the beta program that hopefully get fixed until the final R12 release to make this easier to use.</span> <br /><span style=" font-size:10pt;font-family:sans-serif">E.g. my Designer installation does not save the code that I enter in the "onsize" event. And the resolution formulas often seem to be computed too early, e.g. you still get UI view dimensions back <span style="text-decoration:underline">after</span> you have opened a doc in a view.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">While I was updating the OpenNTF project download with the latest version, I also added some documentation and references on the project summary page. I highly recommend watching the two videos that are linked in the text if you haven't done already. They were recorded in 2007, but are still very inspiring.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Anyway, I hope you like the new version. Here is the updated project description:</span> <br /> <br /> <br /><span style=" font-size:12pt;color:#2f2f2f;font-family:sans-serif"><strong>Four Quadrant Theory</strong></span> <br /> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">The TodoManager is based on Covey's Four Quadrant theory that is described in this article: </span> <br /><a href="https://appfluence.com/productivity/time-management-strategies-for-busy-people-using-the-4-quadrant-method/" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Time management strategies for busy people using the 4-quadrant method</span></a> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">It provides a graphical concept of todo management where you place your todos in a 2x2matrix of four quadrants. By doing that you decide whether your topic is important/ not important and due soon/ not due soon.</span> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif"><strong>Following the order of the quadrants is key to organizing your life:</strong> </span> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">Start with quadrant 1 (important/ due soon), continue with 2 (important/ not due soon), 3 (not important/ due soon) and end with todos in quadrant 4 (not important/ not due soon). In each quadrant, pick the ugliest task first.</span> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">I got to know Covey's theory when I was watching </span><a href="https://www.youtube.com/watch?v=ji5_MqicxSo" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Randy Pausch's Last Lecture</span></a><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif"> and his </span><a href="https://www.youtube.com/watch?v=oTugjssqOT0" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Lecture about Time Management</span></a><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">. Both recordings are <strong>highly recommended</strong> to put your daily struggles and project deadlines into perspective: </span> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">Carnegie Mellon Professor Randy Pausch (Oct. 23, 1960 - July 25, 2008) gave his last lecture at the university Sept. 18, 2007, before a packed McConomy Auditorium, months before he died from pancreatic cancer and reflects on how much he achieved his childhood dreams.</span> <br /> <br /><span style=" font-size:12pt;color:#2f2f2f;font-family:sans-serif"><strong>Usage</strong></span> <br /> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">Use the â\x80\x9c\x80\x9d icon to create new todos and decide in which quadrant (=Notes folder) it should be moved on first save. </span> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">Use drag and drop or context menu actions to move your tasks between quadrants (numbers â\x80\x9c\x80\x9d, â\x80\x9c\x80\x9d, â\x80\x9c\x80\x9d, â\x80\x9c\x80\x9d are drop targets) or into the recycle bin.</span> <br /> <br /><span style=" font-size:12pt;color:#2f2f2f;font-family:sans-serif"><strong>Responsive UI</strong></span> <br /> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">The TodoManager application has a responsive user interface that works on desktop Notes Client, HCL Nomad clients on tablets/phones and even the new Nomad web client. By providing two different application layouts it adapts to the available screen real estate: one layout that displays all 4 quadrants at once and a second one where you only see a single quadrant and have hotspots to change quadrants in the top navigation.</span> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">On Notes 12 we leverage new @formulas to query the current window dimension while still being backward compatible with older Notes Client versions. That means that even in the desktop Notes Client you get a different user experience when the client window width is not very wide. The window size is detected on application startup.</span> <br /> <br /><span style=" font-size:12pt;color:#2f2f2f;font-family:sans-serif"><strong>Installation</strong></span> <br /> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">Just copy the provided application template to your server, sign it and create a new database instance. Then give yourself editor access in the ACL and all others no access. </span> <br /><span style=" font-size:10pt;color:#2f2f2f;font-family:sans-serif">There are currently no background agents to enable.</span> <br />  ]]></content:encoded>
  182. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/20.05.2021211015KLEQGZ.htm</wfw:commentRss>
  183. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/20.05.2021211015KLEQGZ.htm?opendocument&amp;comments</wfw:comment>
  184. </item>
  185. <item>
  186. <title>Mindoo TodoManager on OpenNTF</title>
  187. <pubDate>Sat, 14 Dec 2019 09:30:14 +0200</pubDate>
  188. <description>
  189. <![CDATA[
  190. I created a small sample application for the HCL Nomad Client on the iPad and iPhone. It's a TodoManager that uses the 4 Quadrant time management method to structure the Todos. The application is now ...
  191. ]]>
  192. </description>
  193. <link>https://www.mindoo.com/web/blog.nsf/dx/14.12.2019093007KLEBYY.htm</link>
  194. <category>Free Tools</category>
  195. <dc:creator>Karsten Lehmann</dc:creator>
  196. <comments>https://www.mindoo.com/web/blog.nsf/dx/14.12.2019093007KLEBYY.htm?opendocument&amp;comments</comments>
  197. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/14.12.2019093007KLEBYY.htm</guid>
  198. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">I created a small sample application for the HCL Nomad Client on the iPad and iPhone. It's a TodoManager that uses the 4 Quadrant time management method to structure the Todos.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The application is now available for free on OpenNTF: </span><a href="https://openntf.org/main.nsf/project.xsp?r=project/Mindoo%20TodoManager" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Mindoo TodoManager</span></a> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">In the desktop Notes Client, to dos can be moved between the quadrants and to the recycle bin via drag and drop ("1" - "4" and the recycle bin icon are drop targets).</span> <br /><span style=" font-size:10pt;font-family:sans-serif">In HCL Nomad, just do a long click on a document to see the available options.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The UI is responsive and should fit on all devices.</span> <br /> <br /><img  alt="Image:Mindoo TodoManager on OpenNTF" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/14.12.2019093007KLEBYY.htm/content/M2?OpenElement" /> <br /> <br /><img  alt="Image:Mindoo TodoManager on OpenNTF" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/14.12.2019093007KLEBYY.htm/content/M3?OpenElement" /> <br /> <br /><img  alt="Image:Mindoo TodoManager on OpenNTF" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/14.12.2019093007KLEBYY.htm/content/M4?OpenElement" /> <br /> <br /><img  alt="Image:Mindoo TodoManager on OpenNTF" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/14.12.2019093007KLEBYY.htm/content/M5?OpenElement" /> <br /> <br /><img  alt="Image:Mindoo TodoManager on OpenNTF" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/14.12.2019093007KLEBYY.htm/content/M6?OpenElement" /> <br /> <br />  ]]></content:encoded>
  199. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/14.12.2019093007KLEBYY.htm</wfw:commentRss>
  200. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/14.12.2019093007KLEBYY.htm?opendocument&amp;comments</wfw:comment>
  201. </item>
  202. <item>
  203. <title>Documentation for &#64;GetMachineInfo</title>
  204. <pubDate>Wed, 4 Dec 2019 14:47:07 +0200</pubDate>
  205. <description>
  206. <![CDATA[
  207. Since there currently is no place to find this information on HCL websites in Google, I am adding it here: @GetMachineInfo new in 8.5.3 New @Function to support Machine Specific Policy Settings Sy ...
  208. ]]>
  209. </description>
  210. <link>https://www.mindoo.com/web/blog.nsf/dx/04.12.2019144707KLEJ72.htm</link>
  211. <category></category>
  212. <dc:creator>Karsten Lehmann</dc:creator>
  213. <comments>https://www.mindoo.com/web/blog.nsf/dx/04.12.2019144707KLEJ72.htm?opendocument&amp;comments</comments>
  214. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/04.12.2019144707KLEJ72.htm</guid>
  215. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">Since there currently is no place to find this information on HCL websites in Google, I am adding it here:</span> <br /> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong>@GetMachineInfo new in 8.5.3</strong></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">New @Function to support Machine Specific Policy Settings</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><span style="text-decoration:underline">Syntax:</span></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><code>@GetMachineInfo( &#91;Keyword&#93;; "Needed for some Keywords string" )</code></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><span style="text-decoration:underline">Keywords:</span></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">IsLaptop - boolean return - True if machine is a laptop, otherwise false</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">IsDesktop - boolean return - True if machine is NOT a laptop, otherwise false</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">IsSingleLogOn - boolean return - True if machine has Notes client installed with "single sign on", otherwise false</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">IsMultiUser - boolean return - True if machine has Notes client installed as Multi-User, otherwise false</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">HasDesigner - boolean return - True if machine has Designer client installed, otherwise false</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">HasAdmin - boolean return - True if machine has Admin client installed, otherwise false</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">IsStandard - boolean return - True if machine is running Standard Notes client, otherwise false</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">MachineName - string return - Name of the machine</span> <br /><span style=" font-size:10pt;font-family:sans-serif">boolean return &nbsp; &nbsp; &nbsp; &nbsp;True if MachineName string after keyword matches this machine's MachineName, otherwise false</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Memory - number return - Total amount of memory (RAM)</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">DiskSpace - number return - Amount of free disk space</span> <br /><span style=" font-size:10pt;font-family:sans-serif">Note: With this keyword, you can add a second parameter for the drive to scan for free space. If this parameter is not passed</span> <br /><span style=" font-size:10pt;font-family:sans-serif">to the function, free space for the first (logical) drive - for example, drive C on Windows system - is displayed.</span> <br /><span style=" font-size:10pt;font-family:sans-serif">Example: <code>@GetMachineInfo(&#91;DiskSpace&#93;;"d:")</code></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">EnvVariable - string return - Requires string of the variable name in Notes.ini to read, and returns the value of that ini variable or "" (null string) if not found</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">SysEnvVariable - string return - Requires string of the variable name in system environment to read, and returns the value of that variable or "" (null string) if not</span> <br /><span style=" font-size:10pt;font-family:sans-serif">found</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">IP - string/list return - String representation of the IP address(es) in the form XXX.XXX.XXX.XXX , otherwise "" (null string) if not available</span> <br /><span style=" font-size:10pt;font-family:sans-serif">boolean return &nbsp; &nbsp; &nbsp; &nbsp;True if pattern IP string after keyword matches this machine's IP address, otherwise false</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">MAC - string/list return - String representation of the MAC address(es) in the form XX:XX:XX:XX:XX:XX , otherwise "" (null string) if not available</span> <br /><span style=" font-size:10pt;font-family:sans-serif">boolean return &nbsp; &nbsp; &nbsp; &nbsp;True if MAC string after keyword matches this machine's MAC address, otherwise false</span> <br />  ]]></content:encoded>
  216. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/04.12.2019144707KLEJ72.htm</wfw:commentRss>
  217. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/04.12.2019144707KLEJ72.htm?opendocument&amp;comments</wfw:comment>
  218. </item>
  219. <item>
  220. <title>Configure Eclipse 4.6.x with HCL Notes 10</title>
  221. <pubDate>Mon, 4 Nov 2019 16:06:07 +0200</pubDate>
  222. <description>
  223. <![CDATA[
  224. For years, whenever I needed to configure an Eclipse IDE for IBM Notes plugin development, I used Mikkel Heisterberg's instructions on his blog. Since I currently have a customer requirement to updat ...
  225. ]]>
  226. </description>
  227. <link>https://www.mindoo.com/web/blog.nsf/dx/04.11.2019160604KLEKQD.htm</link>
  228. <category>Eclipse</category>
  229. <dc:creator>Karsten Lehmann</dc:creator>
  230. <comments>https://www.mindoo.com/web/blog.nsf/dx/04.11.2019160604KLEKQD.htm?opendocument&amp;comments</comments>
  231. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/04.11.2019160604KLEKQD.htm</guid>
  232. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">For years, whenever I needed to configure an Eclipse IDE for IBM Notes plugin development, I used Mikkel Heisterberg's instructions on his </span><a href="https://lekkimworld.com/configure-eclipse-4-2-for-notes-9/" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">blog</span></a><span style=" font-size:10pt;font-family:sans-serif">.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Since I currently have a customer requirement to update an existing plugin that we built for them years ago to a newer Java version (1.8), I tried to set up Eclipse 2019-09 with HCL Notes 10.0.1FP2, but failed.</span> <br /><span style=" font-size:10pt;font-family:sans-serif">The launching Client did not show any file/edit/view menus, probably caused by a ClassCastException I could see in the launch console.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">I guess the reason is that 9.0.1 FP10 brought a major update for the underlying Eclipse and OSGi platform.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">So I contacted HCL development and asked for the updated parameters to make this work again and quickly got a response that I would like to share with you.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The document links to Eclipse Neon 4.6.3, but it's still working for me in Eclipse 2019-09 (4.13.0).</span> <br /> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">1. Download Eclipse Neon (4.6.3) or later from link below:</span></strong></span> <br /><a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-committers-neon-3-win32-x86_64.zip" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-committers-neon-3-win32-x86_64.zip</span></a> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">2. Get the latest V10 build</span></strong></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">3. Go to Windows => Preferences => Java => Installed JREs</span></strong></span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">Add => Standard VM =></span> </li><li><span style=" font-size:10pt;font-family:sans-serif">JRE home: <code><em>&#91;Notes Install path&#93;</em>\jvm</code>, e.g. <code>C:\Program Files (x86)\IBM\Notes\jvm</code></span> </li><li><span style=" font-size:10pt;font-family:sans-serif">JRE name: â\x80\x9cNotes JREâ\x80\x9d</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Select the JRE to point to this and Apply</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">4. Go to Windows => Preferences => Plug-in Development => Target Platform</span></strong></span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">Add => default => Target Content</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Name: â\x80\x9cNotes Targetâ\x80\x9d</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif">4a. In Locations Tab:</span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">Add => Directory => Location => <code><em>&#91;Notes Install path&#93;</em>\framework\rcp\eclipse\plugins</code></span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Add => Directory => Location => <code><em>&#91;Notes Install path&#93;</em>\framework\shared\eclipse\plugins</code></span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Finish</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Select the Target platform to point to â\x80\x9cNotes Targetâ\x80\x9d and Apply</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif">4 b. In Environment Tab:</span> <br /><span style=" font-size:10pt;font-family:sans-serif">Please select following settings:</span> <br /> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">Operating System: win32</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Windowing System: win32</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Architecture: x86</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Locale: en_US - English (United States)</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">5. Go to Windows => Preferences => Run/Debug => String Substitution</span></strong></span> <br /><span style=" font-size:10pt;font-family:sans-serif">New => Add 2 strings (replace "xxxx" with the right plugin version!)</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">5a. Name: rcp_home</span> <br /><span style=" font-size:10pt;font-family:sans-serif">Value: <code><em>&#91;Notes Install path&#93;</em>\framework</code></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">5b. Name: rcp_base</span> <br /><span style=" font-size:10pt;font-family:sans-serif">Value: <code><em>&#91;Notes Install path&#93;</em>\framework\rcp\eclipse\plugins\com.ibm.rcp.base_10.0.0.xxxx</code></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">OK</span> <br /><span style=" font-size:10pt;font-family:sans-serif">Close this Preferences Window</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">6. Put the following file inside the below plugin:</span></strong></span> <br /><span style=" font-size:10pt;font-family:sans-serif"><code><em>&#91;Notes Install path&#93;</em>\framework\rcp\eclipse\plugins\com.ibm.rcp.base_10.0.0.xxxx</code></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><a href="https://www.mindoo.com/web/blog.nsf/dx/rcp.security.properties/$file/rcp.security.properties" target="_blank" title="rcp.security.properties">rcp.security.properties</a></span> <br /> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">7. Open Debug Configurations in the â\x80\x98Debug Perspectiveâ\x80\x99 => Eclipse Configuration => New</span></strong></span> <br /><span style=" font-size:10pt;font-family:sans-serif">7a. In the Main tab:</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Name: NotesDebug</span> <br /><span style=" font-size:10pt;font-family:sans-serif">Program to Run => &nbsp;Run a product => com.ibm.notes.branding.notes</span> <br /><span style=" font-size:10pt;font-family:sans-serif">Java Runtime Environment => Runtime JRE => Select â\x80\x9cNotes JREâ\x80\x9d i.e. the one we added in step 3</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">7b. In the Arguments tab: </span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Program Arguments:</span> <br /><span style=" font-size:10pt;font-family:sans-serif"><code>-clean -console -debug -log -personality com.ibm.rcp.platform.personality -config notes</code></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">VM Arguments:</span> <br /><span style=" font-size:10pt;font-family:sans-serif"><code>-Xquickstart<br>-Xss384k<br>-Xshareclasses<br>-Drcp_home="${rcp_home}"<br>-Drcp.install.config=user<br>-Dosgi.install.area="${rcp_home}\eclipse"<br>-Disa.ignoreESR=true<br>-Dcom.ibm.pvc.osgiagent.core.logfileloc="${rcp_home}\rcp"<br>-Dcom.ibm.pvc.webcontainer.port=0<br>-Declipse.pluginCustomization="${rcp_home}\rcp\plugin_customization.ini"<br>-Djava.security.properties="${rcp_base}\rcp.security.properties"<br>-Declipse.registry.nulltoken=true<br>-Djava.protocol.handler.pkgs=com.ibm.net.ssl.www.protocol<br>-Djava.util.logging.config.class=com.ibm.rcp.core.internal.logger.boot.LoggerConfig<br>-Dosgi.hook.configurators.exclude=org.eclipse.core.runtime.internal.adaptor.EclipseLogHook<br>-Dosgi.framework.extensions=com.ibm.rcp.core.logger.frameworkhook,com.ibm.rds,com.ibm.cds<br>-Xbootclasspath/a:${rcp_base}\rcpbootcp.jar;<br-Xdump:system:events=user</code></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">8. Apply => Debug â\x80\x93 This will launch your Notes in Debug mode. </span></strong></span> <br /><span style=" font-size:10pt;font-family:sans-serif">Ensure that whenever you launch the Notes from Eclipse, there should be no other instance of Notes already running. If so, please close Notes and then launch from Eclipse to debug.</span> <br />  ]]></content:encoded>
  233. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/04.11.2019160604KLEKQD.htm</wfw:commentRss>
  234. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/04.11.2019160604KLEKQD.htm?opendocument&amp;comments</wfw:comment>
  235. </item>
  236. <item>
  237. <title>New Domino JNA version available with LOTS of new features</title>
  238. <pubDate>Thu, 19 Sep 2019 17:23:43 +0200</pubDate>
  239. <description>
  240. <![CDATA[
  241. It's been a long time since the last release of our Domino JNA project. Version 0.9.21 is now available for download as XPages Extensibility Plugin and on its way to Maven Central (takes a few hours t ...
  242. ]]>
  243. </description>
  244. <link>https://www.mindoo.com/web/blog.nsf/dx/19092019172343KLEL3E.htm</link>
  245. <category>Domino C API</category>
  246. <dc:creator>Karsten Lehmann</dc:creator>
  247. <comments>https://www.mindoo.com/web/blog.nsf/dx/19092019172343KLEL3E.htm?opendocument&amp;comments</comments>
  248. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/19092019172343KLEL3E.htm</guid>
  249. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">It's been a long time since the last release of our Domino JNA project. Version 0.9.21 is now available for </span><a href="https://github.com/klehmann/domino-jna/releases/tag/0.9.21" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">download as XPages Extensibility Plugin</span></a><span style=" font-size:10pt;font-family:sans-serif"> and on its way to </span><a href="https://mvnrepository.com/artifact/com.mindoo.domino/domino-jna" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Maven Central</span></a><span style=" font-size:10pt;font-family:sans-serif"> (takes a few hours to appear).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><span style="text-decoration:underline">Here are a some highlights of the new version:</span></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><ul><li>New method to read item definition table of a database</li><li>Added function to get the template db path by the template name</li><li>Support for profile note reading and writing</li><li>Added API to export mails as EML files on client and server</li><li>Added API to read client and server statistics</li><li>Tested in Notes/Domino 11 beta 1</li><li>Added method to harvest DB design for DQL speedup</li><li>DQL query builder updated for new Domino 11 "contains" terms (FT search)</li><li>New method to send server console commands</li><li>Improved richtext to HTML conversion sample to extract files as well</li><li>Added convenience functions NotesDatabase.toUnid / toNoteId</li><li>Added NotesDatabase.getAllCollections() to read infos about all views</li><li>NotesTimeDate.toString method with date/time/timezone formatting options</li><li>Added NotesIntlFormat argument to NotesTimeDate.fromString</li><li>Added setter to change timezone of NotesTimeDate</li><li>New methods to read ACL entries and all ACL roles</li><li>New methods in NotesCollection to read view design properties, e.g. .isConflict(), .isCollapsed(), isGotoTopOnOpen() etc.</li><li>Added method to check if $file item belongs to a TYPE_MIME_PART item</li><li>Added method NotesItem.copyToNote() with parameter to rename the item</li><li>Added check method to large summary buffer support on DB</li><li>Added checks for ERR 1028 when openings docs to return null if not found</li><li>Improved reading of data below view categories</li><li>Added method to convert RFC822 items to native Domino format</li><li>NotesDatabase.openMailDatabase(), hasFullAccess() and runWithDbLock()</li><li>Changed flag to find view in design, did not find all available views</li><li>Flags to update note without triggering replication (used by replicator)</li><li>Added experimental code to set sequence number and time</li><li>Added more HTML conversion options</li><li>More FTSearch options for NotesDatabase searches (e.g. get result sorted by created/modified/score)</li><li>Additional methods to write Notes.ini variables (e.g. OSGI_HTTP_DYNAMIC_BUNDLES)</li><li>Added getter to read TIMEDATE value from Notes.ini with testcase</li><li>NotesCollection column title/name no longer converted to lowercase</li><li>Removed ICU4J dependency, now using undocumented method OSTranslate32 to translate between LMBCS and Java strings with support for long texts (length > WORD size that OSTranslate supports)</li><li>Performance optimizations, fixed memory handle leaks</li></ul></span> <ul> <li></li></ul>  ]]></content:encoded>
  250. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/19092019172343KLEL3E.htm</wfw:commentRss>
  251. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/19092019172343KLEL3E.htm?opendocument&amp;comments</wfw:comment>
  252. </item>
  253. <item>
  254. <title>Advanced view lookup strategies with Domino JNA for small view index sizes and dynamic filtering and sorting</title>
  255. <pubDate>Wed, 13 Mar 2019 00:09:50 +0200</pubDate>
  256. <description>
  257. <![CDATA[
  258. This might be interesting for some of you, a pattern how I am using Domino JNA in a recent customer project to speed up view lookups and reduce overall view index size. I am using at least three view ...
  259. ]]>
  260. </description>
  261. <link>https://www.mindoo.com/web/blog.nsf/dx/13.03.2019000950KLEV6Q.htm</link>
  262. <category>Domino C API</category>
  263. <dc:creator>Karsten Lehmann</dc:creator>
  264. <comments>https://www.mindoo.com/web/blog.nsf/dx/13.03.2019000950KLEV6Q.htm?opendocument&amp;comments</comments>
  265. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/13.03.2019000950KLEV6Q.htm</guid>
  266. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">This might be interesting for some of you, a pattern how I am using </span><a href="https://github.com/klehmann/domino-jna" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Domino JNA</span></a><span style=" font-size:10pt;font-family:sans-serif"> in a recent customer project to speed up view lookups and reduce overall view index size.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">I am using at least three views to produce the content for a data table in the web application:</span> <br /> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">one or more key lookup views</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">one view for the sorting</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">and the final one to read all required view columns.</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">1. Key lookup views</span></strong></span> <br /><span style=" font-size:10pt;font-family:sans-serif">The key lookup views has the minimum required columns for the lookup, e.g. just the sorted columns containing the lookup key(s) and I use <code>NotesCollection.getAllIdsByKey(EnumSet<Find> findFlags, Object... keys)</code> to collect the note ids of all documents matching my lookup criteria(s) and the <code>com.mindoo.domino.jna.utils.SetUtil</code> class to AND/OR multiple note id sets.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The first view might even contain less lookup columns (e.g. just the default index position column) if I am just interested in all documents that match the view selection formula. In that case I am using the view as a stored database search result.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">You can read the note ids of all documents in the view with <code>NotesCollection.getAllIds(Navigate navigator, boolean filterTable, NotesIDTable idTable)</code>, which is<em> EXTREMELY</em> fast with parameters <code>navigator=Navigate.NEXT</code> and <code>filterTable=false</code>, as long as the flag "show response hierarchy" is NOT set in the view design. Then NIF just copies an internal index into the IDTable and is done (=>no b-tree traversion and reader list check for the current user).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Unfortunately, AFAIK, "show response hierarchy" is set by default when you create new views. This lets NIF use a secondary index to search for responses for all view rows, which is slow.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">I first thought that this response hierarchy flag would be required to find conflict documents in the view (as they are response documents), but this is not the case. My tests have shown that this information is still there, although there was a "bug" in Domino JNA which declared each row as conflict because I was reading the conflict flag <span style="text-decoration:underline">as it is documented in the C API toolkit</span>.</span> <br /><span style=" font-size:10pt;font-family:sans-serif">I fixed that recently with a special case for "show response hierarchy"==false (details: </span><a href="https://github.com/klehmann/domino-jna/commit/cdfbc6f8e3087eed1eb8328341451f4f0ffbc7dd" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://github.com/klehmann/domino-jna/commit/cdfbc6f8e3087eed1eb8328341451f4f0ffbc7dd</span></a><span style=" font-size:10pt;font-family:sans-serif">).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Additional note id sets could be retrieved from fulltext searches (<code>NotesDatabase.ftSearch(String query, short limit, NotesIDTable filterIDTable)</code>).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">With Domino 10, a DQL search could be used to collect the relevant note ids as well, in Domino JNA: <code>NotesDatabase.query(DQLTerm query, EnumSet<DBQuery> flags, int maxDocsScanned, int maxEntriesScanned, int maxMsecs)</code>.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">2. Sort view</span></strong></span> <br /><span style=" font-size:10pt;font-family:sans-serif">The sort view may be identical to one of the key lookup views. I am using this view to find all note ids of my key lookups that are visible in the requested page in the web datatable (=> offset / count received from the browser) and get them returned in view sorting.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">I call <code>NotesCollection.select(Collection<Integer> noteIds, boolean clearPrevSelection)</code> with <code>clearPrevSelection=true</code> to select all relevant note ids in the view and then call</span> <br /><span style=" font-size:10pt;font-family:sans-serif"><code>NotesCollection.getAllEntries(final String startPosStr, int skipCount, EnumSet<Navigate> returnNav,int preloadEntryCount, EnumSet<ReadMask> returnMask, ViewLookupCallback<T> callback)</code> with the following parameters:</span> <br /> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">startPosStr "0" => start at the beginning of the view</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">skipCount = offset+1 =>skip rows based on paging parameters received from browser, "+1" to go from row "0" (which is one row above the first row) to the first</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">returnNav = EnumSet.of(Navigate.NEXT_SELECTED) &nbsp; &nbsp; &nbsp; &nbsp;=> only return previously selected rows</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">preloadEntryCount &nbsp; &nbsp; &nbsp; &nbsp;=> count parameter from browser</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">returnMask = EnumSet.of(ReadMask.NOTEID) &nbsp; &nbsp; &nbsp; &nbsp;=> just read the note ids (in view sorting)</span> </li><li><span style=" font-size:10pt;font-family:sans-serif">callback = a <code>ViewLookupCallback</code> implementation similar to the one I am using for the getAllIds methods internally (</span><a href="https://github.com/klehmann/domino-jna/blob/master/domino-jna/src/main/java/com/mindoo/domino/jna/NotesCollection.java#L996" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://github.com/klehmann/domino-jna/blob/master/domino-jna/src/main/java/com/mindoo/domino/jna/NotesCollection.java#L996</span></a><span style=" font-size:10pt;font-family:sans-serif">) which returns a LinkedHashSet<Integer> with the note ids in view sorting, but stops after "count" entries.</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">3. Data lookup view</span></strong></span> <br /><span style=" font-size:10pt;font-family:sans-serif">This "masterdata" view contains all the view columns required to fill the web datatable columns. It only has one fixed sorting (here: by creation date) and no resortable columns.</span> <br /><span style=" font-size:10pt;font-family:sans-serif">As discussed before, "show response hierarchy" is not set here as well.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Once again I call <code>NotesCollection.select(Collection<Integer> noteIds, boolean clearPrevSelection)</code> with <code>clearPrevSelection=true</code> to set the view selection, but in this case I select just the note ids read from the sort view in step 2.</span> <br /><span style=" font-size:10pt;font-family:sans-serif">So I read the data columns for all rows in the visible web datatable page, but as they are returned in the wrong sorting (creation date), I need to hash them by note id and reorder them based on the sort view sorting (not a problem, because my page size of 400 entries is quite small).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">To read the view rows, I use <code>NotesCollection.getAllEntries(final String startPosStr, int skipCount, EnumSet<Navigate> returnNav,int preloadEntryCount, EnumSet<ReadMask> returnMask, ViewLookupCallback<T> callback)</code> as in step 2, but this time I want to read the UNID and column values for the rows as well:</span> <br /> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">returnMask = EnumSet.of(ReadMask.NOTEID, ReadMask.SUMMARYVALUES, ReadMask.NOTEUNID)</span></li></ul><span style=" font-size:10pt;font-family:sans-serif">and get a List<NotesViewEntryData> returned by the callback:</span> <br /> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">callback = new NotesCollection.EntriesAsListCallback(count)</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><span style="text-decoration:underline">Benefits</span></strong></span> <br /><span style=" font-size:10pt;font-family:sans-serif">Sounds difficult? Yes, I agree, this still needs some convenience methods to make the code more readable.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The benefit is that I only have one stable view with all the data, resulting in a large view index size and slow initial index time (here 800 MB for 300.000 documents).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The key lookup and sort views are very small and fast to build (e.g. 60 MB each). So adding another lookup criteria or result sorting later is cheap, which would not be the case if I had to touch my data lookup view and add another resortable view column.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">And even though I collect data from three views, the <strong>lookup performance is very fast, almost instant</strong>.</span> <br /> <br /> <br /> <br /> <br /> <br /> <br />  ]]></content:encoded>
  267. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/13.03.2019000950KLEV6Q.htm</wfw:commentRss>
  268. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/13.03.2019000950KLEV6Q.htm?opendocument&amp;comments</wfw:comment>
  269. </item>
  270. <item>
  271. <title>New Domino JNA version with support for Domino Query Language (DQL) in Domino V10</title>
  272. <pubDate>Fri, 12 Oct 2018 00:07:25 +0200</pubDate>
  273. <description>
  274. <![CDATA[
  275. Today I released version 0.9.20 of our Domino JNA project. This version contains the following new features: Added support for Domino Query Language (DQL) on Domino V10 Added basic support to read ...
  276. ]]>
  277. </description>
  278. <link>https://www.mindoo.com/web/blog.nsf/dx/12.10.2018000722KLETXP.htm</link>
  279. <category>Domino C API</category>
  280. <dc:creator>Karsten Lehmann</dc:creator>
  281. <comments>https://www.mindoo.com/web/blog.nsf/dx/12.10.2018000722KLETXP.htm?opendocument&amp;comments</comments>
  282. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/12.10.2018000722KLETXP.htm</guid>
  283. <content:encoded><![CDATA[ <span style=" font-size:10pt;font-family:sans-serif">Today I released version 0.9.20 of our Domino JNA project. This version contains the following new features:</span> <br /><span style=" font-size:12pt"><br></span> <ul> <li><span style=" font-size:10pt;font-family:sans-serif">Added support for Domino Query Language (DQL) on Domino V10</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Added basic support to read MIME items (NotesMIMEPart) via getItemValue</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Added NotesNote.attachFile with in-memory file generation</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Added NotesDatabase.isDesignHidden()</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Added utility class to read and write Out-out-office information</span><span style=" font-size:12pt"> </span> </li><li><span style=" font-size:10pt;font-family:sans-serif">Bugfixing</span></li></ul> <br /><span style=" font-size:10pt;font-family:sans-serif">The version is available on </span><a href="https://search.maven.org/artifact/com.mindoo.domino/domino-jna/0.9.20/jar" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Maven Central</span></a><span style=" font-size:10pt;font-family:sans-serif"> and as an XPages extensibility API in the </span><a href="https://github.com/klehmann/domino-jna/releases/tag/0.9.20" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">releases area of the project on Github</span></a><span style=" font-size:10pt;font-family:sans-serif">.</span><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <br /> Now that Domino V10 is out, we can leverage new functionality, e.g. DQL, but the new functionality has been added in a way that the remaining project still runs on Domino R9.0.1 servers. </span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong><br /> Domino Query Language (DQL)</strong></span><span style=" font-size:12pt"> </span> <br /><span style=" font-size:10pt;font-family:sans-serif"><br /> Domino V10 provides a new facility to run adhoc searches against Notes databases, using the new Domino Query Language, with a much better performance compared to a classic database search via formula language.</span><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <br /> At CollabSphere 2018, John Curtis, software architect and lead on the DQL project at HCL, gave an introduction to the available search options, how queries are planned and executed and how search performance can be improved by creating lookup views that the facility then uses for efficient data lookups.</span><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> <br /> You can find a session recording here</span><span style=" font-size:12pt">:</span><span style=" font-size:12pt;color:blue"><span style="text-decoration:underline"><br /> </span></span><a href="https://www.youtube.com/watch?v=KoQvqPAjAtc" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Demo and Deep Dive: Domino General Query Facility and DominoDB NPM</span></a><span style=" font-size:12pt"> </span><span style=" font-size:10pt;font-family:sans-serif"><br /> </span> <br /><span style=" font-size:10pt;font-family:sans-serif">and here are links to the </span><a href="https://www-01.ibm.com/support/docview.wss?uid=ibm10729047&amp;myns=swglotus&amp;mynp=OCSSVRGU&amp;mync=E&amp;cm_sp=swglotus-_-OCSSVRGU-_-E" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Domino Query Language documentation</span></a><span style=" font-size:10pt;font-family:sans-serif"> and a technote describing the</span> <br /><a href="https://www-01.ibm.com/support/docview.wss?uid=ibm10733917&amp;myns=swglotus&amp;mynp=OCSSKTMJ&amp;mync=R&amp;cm_sp=swglotus-_-OCSSKTMJ-_-R" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">DQL Restrictions for Domino 10.0.0</span></a><span style=" font-size:10pt;font-family:sans-serif">.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">One of the main restrictions in Domino 10.0.0 is that DQL searches can only be run via the new AppDev Pack for Node.js (beta).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">There is no support yet to use DQL in LotusScript and the Notes.jar Java API. This will be added in 10.0.1, planned for the end of the year.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong>Domino JNA to the rescue! :-)</strong></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">For our Domino JNA project, there is no such restriction, as we are calling the DQL C API method directly.</span> <br /><span style=" font-size:10pt;font-family:sans-serif">So this gives you a chance to play with DQL a bit ealier.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">To prevent malformed queries and malicous code injection, we provide some tooling to build queries in code instead of composing the query string manually.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">There is a </span><a href="https://github.com/klehmann/domino-jna/blob/master/domino-jna/src/test/java/com/mindoo/domino/jna/test/TestDQL.java" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">test case on Github</span></a><span style=" font-size:10pt;font-family:sans-serif"> that demonstrates all the available search options.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">A DQL search returns a set of note ids for matching documents, in the Domino C API called an <code>IDTable</code> (in Domino JNA: <code>NotesIDTable</code>).</span> <br /><span style=" font-size:10pt;font-family:sans-serif">By nature, note ids in an IDTable are sorted in ascending note id order, because that is the way they are written in memory (compressed to reduce memory consumption, see this </span><a href="https://www-01.ibm.com/support/docview.wss?uid=swg21413921" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">technote for details</span></a><span style=" font-size:10pt;font-family:sans-serif">).</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">To display DQL search results in a web application, a note id sort order is not really useful, that's why the test case demonstrates a technique to cast the IDTable onto a Domino view.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">In short, this means that you can efficiently filter a view down to only return view rows with note ids from that IDTable.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif"><strong>Blog series about Domino JNA</strong></span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">Another topic that I would like to draw your attention to is a great blog series about Domino JNA, written by Mark Leusink.</span> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">The first two articles are already available and demonstrate how to implement faceted searches:</span> <br /> <br /><a href="http://linqed.eu/2018/10/02/query-domino-data-and-faceted-search-with-domino-jna-part-1/" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Query Domino data and faceted search with Domino JNA (part 1): setup, sorting and pagination</span></a> <br /> <br /><a href="http://linqed.eu/2018/10/08/query-domino-data-and-faceted-search-with-domino-jna-part-2/" target=_blank><span style=" font-size:10pt;color:blue;font-family:sans-serif">Query Domino data and faceted search with Domino JNA (part 2): filtering</span></a> <br /> <br /><span style=" font-size:10pt;font-family:sans-serif">I am really glad and thankful that he is working on this since my free time is still very limited.</span> <br /> <br />  ]]></content:encoded>
  284. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/12.10.2018000722KLETXP.htm</wfw:commentRss>
  285. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/12.10.2018000722KLETXP.htm?opendocument&amp;comments</wfw:comment>
  286. </item>
  287. <item>
  288. <title>Display all allowed readers of documents in a view column</title>
  289. <pubDate>Tue, 6 Mar 2018 16:19:03 +0200</pubDate>
  290. <description>
  291. <![CDATA[
  292. By setting the programmatic column name and formula value of a view column to "$C1$", the column automatically displays the content of all reader items in the document. If there are any readers, the ...
  293. ]]>
  294. </description>
  295. <link>https://www.mindoo.com/web/blog.nsf/dx/06.03.2018161900KLEKYG.htm</link>
  296. <category>Notesdev</category>
  297. <dc:creator>Karsten Lehmann</dc:creator>
  298. <comments>https://www.mindoo.com/web/blog.nsf/dx/06.03.2018161900KLEKYG.htm?opendocument&amp;comments</comments>
  299. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/06.03.2018161900KLEKYG.htm</guid>
  300. <content:encoded><![CDATA[ By setting the programmatic column name and formula value of a view column to "$C1$", the column automatically displays the content of all reader items in the document. <br /> <br /> If there are any readers, the column also container the author item values, since these are also allowed to see read-restricted documents. <br /> <br /> <img  alt="Image:Display all allowed readers of documents in a view column" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/06.03.2018161900KLEKYG.htm/content/M2?OpenElement" /> <br /> <br /><img  alt="Image:Display all allowed readers of documents in a view column" border="0" src="https://www.mindoo.com/web/blog.nsf/dx/06.03.2018161900KLEKYG.htm/content/M3?OpenElement" /><br /> <br /> "$C1$" is a special column value that the NIF indexer sends to the NSF Search command in the C API to let it compute read access. This information is stored in the view index and compared to the current user's NAMES_LIST (list of name wildcards, groups and roles) on view access (case-insensitive). <br /> To use this in your own C code, some more work is required. You don't pass a compiled selection formula to NSFSearch, but a view formula, which is the selection formula merged with all view column formulas (NSFFormulaSummaryItem). <br /> <br /> Of course this is not documented anywhere in the C API, that such a view formula can be passed to NSFSearch, same for the special value "$C1$". ;-) <br /> <br /> In addition, you need to pass the constant <br /> <br /> <code>SEARCH_NOITEMNAMES 0x0020</code><br /> <br /> to the NSF Search, which tells it to not return the whole note summary buffer for each search match (ITEM_TABLE structure), but just the values specified as columns in the view formula in their order, which makes the search a lot faster.<br /> <br /> <br /> Too difficult? No problem. <a href="https://github.com/klehmann/domino-jna" target=_blank>Domino JNA</a> to the rescue. This NSF search is the base of our incremental Domino data sync. <br /> <br />So effectively, we do (almost) index Domino data like NIF, but with different target system. If not all information is available via summary items, the sync code can provide access to the document as well.<br /> <br /> There's code to sync Domino data with the <a href="https://github.com/klehmann/domino-jna/tree/master/domino-jna-indexer-cqengine" target=_blank>CQEngine indexer</a> and an <a href="https://github.com/klehmann/domino-jna/tree/master/domino-jna-indexer-sqlite" target=_blank>SQLite database</a>. The two projects contain testcases to demonstrate the syntax.   ]]></content:encoded>
  301. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/06.03.2018161900KLEKYG.htm</wfw:commentRss>
  302. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/06.03.2018161900KLEKYG.htm?opendocument&amp;comments</wfw:comment>
  303. </item>
  304. <item>
  305. <title>Major rewrite of Domino JNA for improved performance, now with incremental indexing of Domino data</title>
  306. <pubDate>Mon, 8 Jan 2018 11:14:30 +0200</pubDate>
  307. <description>
  308. <![CDATA[
  309. I spend a few days during the Christmas holidays and first week of January to work on our Domino JNA project. The result is version 0.9.11, which is now on its way to Maven Central and available for d ...
  310. ]]>
  311. </description>
  312. <link>https://www.mindoo.com/web/blog.nsf/dx/08.01.2018111425KLEE24.htm</link>
  313. <category>Domino C API</category>
  314. <dc:creator>Karsten Lehmann</dc:creator>
  315. <comments>https://www.mindoo.com/web/blog.nsf/dx/08.01.2018111425KLEE24.htm?opendocument&amp;comments</comments>
  316. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/08.01.2018111425KLEE24.htm</guid>
  317. <content:encoded><![CDATA[ I spend a few days during the Christmas holidays and first week of January to work on our <a href="https://github.com/klehmann/domino-jna" target=_blank>Domino JNA</a> project. The result is version 0.9.11, which is now on its way to <a href="https://mvnrepository.com/artifact/com.mindoo.domino/domino-jna" target=_blank>Maven Central</a> and available for <a href="https://github.com/klehmann/domino-jna/releases" target=_blank>download as an OSGi plugin</a> for XPages developers. <br /> <br />Here are the three main features that I have been working on: <br /> <br /><strong><span style="text-decoration:underline">Improved performance</span></strong> <br />The project source code has been completely rewritten to use <a href="https://github.com/java-native-access/jna/blob/master/www/DirectMapping.md" target=_blank>JNA direct mapping</a>. This significantly improves performance in areas with lots of native method invocations like document item access or when adding note ids to ID tables. <br />Other performance work has been done to speed up LMBCS-Java-String conversion and to lazily convert summary buffer values when doing a database search (the old version always converted the whole buffer). <br /> <br /><strong><span style="text-decoration:underline">Incremental data indexing</span></strong> <br />As I recently wrote on <a href=https://twitter.com/klehmann79 target=_blank>Twitter</a>, I do not know how many code I have written in the past to sync Domino data to external databases or indexers, because they are more powerful doing adhoc-queries than Domino. The good news is that IBM is actively looking into this topic for Domino 10. <br /> <br />So here is another approach, this time using C API calls, incrementally searching for database changes filtered by an @-formula and not requiring any lookup views. <br /> <br />The key to getting it implemented this way was the discovery that <tt>NSFSearchExtended3</tt>, which I am using to search for formula matches, can not only run incrementally by passing a "since" value and returns all changed notes matching the formula, but also calls the callback for all changed and deleted notes <strong>not matching</strong> the formula. <br /> <br />This way my code knows what to <strong>add/update</strong> in the external db or index and also knows what to <strong>remove</strong> if it existed in the index before. <br /> <br />To make the algorithm easily reusable, I haven't hard coded a specific sync target. The whole sync process is running against a simple <a href="https://github.com/klehmann/domino-jna/blob/master/domino-jna/src/main/java/com/mindoo/domino/jna/sync/ISyncTarget.java" target=_blank>Java interface</a>. <br /> <br />A <a href="https://github.com/klehmann/domino-jna/tree/master/domino-jna-indexer-cqengine" target=_blank>sample project</a> is already available with code that synchronized Domino data with the Java based <a href=https://github.com/npgall/cqengine target=_blank>CQEngine indexer</a>. The project contains a testcase that indexes the fakenames database and makes sure everything is working as expected. <br />My plan is to create more implementations, e.g. for SQLite or Lucene, but no promises :-). <br /> <br />The generic sync process handles replication against multiple replicas of the same database (e.g. when replicating with a Domino cluster) and changing the selection formula between syncs, where we do a performance improved comparison what needs to be added to the target and what does not match the new selection formula anymore and gets purged. <br /> <br /><strong><span style="text-decoration:underline">Better testcases</span></strong> <br />This is far from being finished, but I started reworking the available testcases so that they do not any longer only "work on my machine", because the sample database that is available for download does not contain some newly added lookup views or documents. <br /> <br />The plan is to automatically create the sample database with the required structure the first time the test cases are executed, based on a Domino address book template, creating lookup views in code and <a href="https://github.com/klehmann/domino-jna/tree/master/sampledata" target=_blank>50.000 fake person documents</a>. <br /> <br /> <br /><span style="text-decoration:underline">For other changes, here are the release notes posted &nbsp;on Github:</span> <br /> <ul> <li>Complete project rewrite, now using JNA direct mapping to improve native method invocation performance </li><li>other performance improvement: faster LMBCS->Java String conversion, lazy conversion of summary value items in NotesSearch.search(...) </li><li>Improved database search (NotesSearch.search) that now also optionally returns non-matches and deletions when searching incrementally with a "since" date (see callback class com.mindoo.domino.jna.NotesSearch.SearchCallback) </li><li>New generic class com.mindoo.domino.jna.sync.SyncUtil to incrementally read Domino data for indexing and migration purpose </li><li>Sample implementation for SyncUtil that indexes data using CQEngine to index Domino data is available as separate project (to reduce the Domino JNA dependencies to a minimum) </li><li>New methods NotesNote.hasReadersField() and NotesNote.getReadersFields() to get reader fields of a note using an optimized C call </li><li>New methods for NotesDatabase: <ul> </li><li>getTitle() / setTitle(String title) </li><li>getCategories() / setCategories(String cat) </li><li>getTemplateName() / setTemplateName(String name) </li><li>getDesignTemplateName() / setDesignTemplateName(String name) </li><li>refreshDesign(String server)</li></ul> <li>added method DirectoryScanner.scan(String formula) to filter directory entries using Domino formula language </li><li>Bugfixing and package refactoring to hide internal code (struct package moved to com.mindoo.domino.jna.internal) </li><li>Removed the unfinished com.mindoo.domino.jna.queries package;<br /> will probably not continue this path, incremental indexing is the way to go</li></ul> <br />  ]]></content:encoded>
  318. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/08.01.2018111425KLEE24.htm</wfw:commentRss>
  319. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/08.01.2018111425KLEE24.htm?opendocument&amp;comments</wfw:comment>
  320. </item>
  321. <item>
  322. <title>Bleedyellow.com has a new home</title>
  323. <pubDate>Sat, 11 Nov 2017 12:16:44 +0200</pubDate>
  324. <description>
  325. <![CDATA[
  326. It took some time and the domain transfer is not 100% complete, but bleedyellow.com is on it's way from René Winkelmeyer to Mindoo. Our blog is currently configured to be the default website on ww ...
  327. ]]>
  328. </description>
  329. <link>https://www.mindoo.com/web/blog.nsf/dx/11.11.2017121642KLEF92.htm</link>
  330. <category>Mindoo</category>
  331. <dc:creator>Karsten Lehmann</dc:creator>
  332. <comments>https://www.mindoo.com/web/blog.nsf/dx/11.11.2017121642KLEF92.htm?opendocument&amp;comments</comments>
  333. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/11.11.2017121642KLEF92.htm</guid>
  334. <content:encoded><![CDATA[ It took some time and the domain transfer is not 100% complete, but bleedyellow.com is on it's way from René Winkelmeyer to Mindoo. <br /> <br /> Our blog is currently configured to be the default website on <br />&nbsp; <div align=center><a href=https://www.bleedyellow.com/ target=_blank>www.bleedyellow.com</a></div> <br /><br /> We do not have any plans yet for the domain, but did not want to let it expire. If you have any suggestions, feel free to comment. <br />   ]]></content:encoded>
  335. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/11.11.2017121642KLEF92.htm</wfw:commentRss>
  336. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/11.11.2017121642KLEF92.htm?opendocument&amp;comments</wfw:comment>
  337. </item>
  338. <item>
  339. <title>Life sign / Major update for Domino JNA on Github</title>
  340. <pubDate>Fri, 10 Nov 2017 17:25:35 +0200</pubDate>
  341. <description>
  342. <![CDATA[
  343. Wow - I haven't written a blog post in the last 9 months! It's just so much easier to write a Tweet than to produce long articles, when I split the week between three customers and my family with two ...
  344. ]]>
  345. </description>
  346. <link>https://www.mindoo.com/web/blog.nsf/dx/10.11.2017172532KLEM9Z.htm</link>
  347. <category>Domino C API</category>
  348. <dc:creator>Karsten Lehmann</dc:creator>
  349. <comments>https://www.mindoo.com/web/blog.nsf/dx/10.11.2017172532KLEM9Z.htm?opendocument&amp;comments</comments>
  350. <guid isPermaLink="true">https://www.mindoo.com/web/blog.nsf/dx/10.11.2017172532KLEM9Z.htm</guid>
  351. <content:encoded><![CDATA[ Wow - I haven't written a blog post in the last 9 months! It's just so much easier to write a <a href=https://twitter.com/klehmann79 target=_blank>Tweet</a> than to produce long articles, when I split the week between three customers and my family with two children. <br /> <br />Just wanted to let you know that we are alive and kicking and still doing very much Domino related work! :-) <br /> <br />Technologies have as always shifted a bit. Most of the time we create pure JavaEE projects now for our customer web apps, developed in Eclipse and not Domino Designer (ok, using it to create lookup views, still working on that part ;-) ). <br />A Maven build then collects all moving parts and generates an OSGi update site that can be deployed on the Domino server. So our NSFs contain no code and no further design elements except those lookup views. <br /> <br />For the frontend, we are mostly using a mix of Bootstrap, React, jQuery and a lot of open source widgets and libraries that we find on the Internet. Some other areas of interest include using ES5/ES6 JavaScript features like async/await and as always exploring what other database systems have to offer. <br /> <br />The backend of our apps is more and more powered by our <a href="https://github.com/klehmann/domino-jna" target=_blank>Domino JNA</a> project to get the most out of Domino. The project is now used in 7 of our customer web apps and services, of course running on production servers for months. <br /> <br />Since my last post in January, a lot of work has been done to make the project more powerful and more robust. <br /> <br />I am happy to announce that version 0.9.9 is now available on <a href="https://mvnrepository.com/artifact/com.mindoo.domino/domino-jna/0.9.9" target=_blank>Maven Central</a> and as an <a href="https://github.com/klehmann/domino-jna/releases/tag/0.9.9" target=_blank>XPages Extension Library</a>. <br /> <br /><span style="text-decoration:underline">Here are some of the new features:</span> <br /> <ul> <li>APIs to convert a single richtext item or a whole document to HTML with access to embedded images - NotesNote.convertItemToHtml / NotesNote.convertNoteToHtml() </li><li>APIs to stop long running code, get progress information and replication progress/results - SignalHandlerUtil  </li><li>APIs to read/write Notes.ini values - NotesIniUtils </li><li>Utility function to compare Notes names with wildcards (*/Company) - NotesNamingUtils.nameMatchesWildcard() </li><li>Support to pass open flags when opening a database, e.g. for cluster failover - OpenDatabase enum </li><li>Method to replicate a database with options and detailed replication stats - NotesDatabase.replicateWithServer() </li><li>Method NotesNote.setUNID() to change the UNID of a document </li><li>Utility class to get names of cluster members of a Domino server - ServerUtils</li></ul> <br /><span style="text-decoration:underline">Performance improvements:</span> <ul> <li>Now reading view column names/sortings/formulas using C API in NotesCollection, not having to reopen the DB/View with legacy API (Notes.jar) anymore </li><li>Improved LMBCS string conversion performance (less copy operations for pure ASCII strings)</li></ul> <br /><span style="text-decoration:underline">Breaking changes:</span> <ul> <li>Removed lotus.domino.Session argument from some of the NotesDatabase constructors (not needed anymore) </li><li>Using NoteClass enum instead of noteclass bitmask, e.g. for database searches</li></ul> <br />I'd love to write more about all the features or product some slides and (re-)appear at conferences, but unfortunately time is very limited. So I see what I can do to at least produce more test cases or make the existing ones work. <br /> <br />I should have a bit more time now, since there are not many prio 1 topics left on my list that I need to add to the project. :-) <br /> <br /> <br />  ]]></content:encoded>
  352. <wfw:commentRss> https://www.mindoo.com/web/blog.nsf/dxcomments/10.11.2017172532KLEM9Z.htm</wfw:commentRss>
  353. <wfw:comment> https://www.mindoo.com/web/blog.nsf/dx/10.11.2017172532KLEM9Z.htm?opendocument&amp;comments</wfw:comment>
  354. </item>
  355. </channel></rss>
  356.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//www.mindoo.com/web/blog.nsf/feed.rss

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda