[Valid RSS] This is a valid RSS feed.


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


  1. <?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="" xmlns:openSearch="" xmlns:blogger="" xmlns:georss="" xmlns:gd="" xmlns:thr="" version="2.0"><channel><atom:id>,1999:blog-7557605395826374162</atom:id><lastBuildDate>Sun, 18 Mar 2018 17:13:41 +0000</lastBuildDate><title>Elementary, My Dear Watson!</title><description></description><link></link><managingEditor>[email protected] (Philippe Riand)</managingEditor><generator>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">,</guid><pubDate>Wed, 17 Jan 2018 16:10:00 +0000</pubDate><atom:updated>2018-01-17T08:10:34.143-08:00</atom:updated><title>Darwino makes OpenNTF mobile!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;464&quot; data-original-width=&quot;456&quot; height=&quot;320&quot; src=&quot;; width=&quot;314&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;50&quot; data-original-width=&quot;150&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;a href=&quot;; style=&quot;display: none;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;50&quot; data-original-width=&quot;150&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;i&gt;&lt;b&gt;[Latest News] The iOS app works perfectly, but we are struggling with the great fruity company to get it accepted to the store, because they claim there is not enough mobile content on OpenNTF... We&#39;ll do our best with the OpenNTF team to get more content leveraging mobile capabilities.&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Darwino 2.0&lt;/b&gt; features a mobile micro application architecture well integrated with the IBM Domino server. It can render any existing Domino web application (classic &amp;amp; XPages) on a mobile device while taking care of the painful details:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Real mobile applications available from both Google Play and Apple Store&lt;/li&gt;&lt;li&gt;Authentication management, to avoid prompting the user when the server requires credentials&lt;/li&gt;&lt;li&gt;Opening external pages in a separate browser window to provide the best user experience&lt;/li&gt;&lt;li&gt;Mobile notifications, to alert users when something new arrived and let him/her act appropriately&lt;/li&gt;&lt;li&gt;Plus many implementation details, like error management and recovery&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;To quickly experiment with the capability, we are providing a generic mobile client that one can use to connect to any Darwino enabled Domino server. This client is available on both application stores and is fully configurable to point to any server. As a default configuration, we make it point to OpenNTF!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;As most of you know, the main OpenNTF applications, like &lt;a href=&quot;; target=&quot;_blank&quot;&gt;Collaboration Today&lt;/a&gt;, are XPages based with a responsive design. This make them very easy to integrate with the micro application architecture. Moreover, Darwino extends Domino Designer with a new design element to detect database changes and send mobile notifications. With that in place on the OpenNTF servers, we are able to send new notifications when a new entry is available in Collaboration Today. By the way, these notifications use the mobile first IBM Cloud service (a.k.a. Bluemix).&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The implementation on the OpenNTF server was straight forward:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Get the Darwino OSGi runtime installed&lt;/li&gt;&lt;li&gt;Set some configuration properties&lt;/li&gt;&lt;li&gt;Create a new design element for mobile notifications. To leave the existing databases untouched, we did that in brand new, separate database&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Voila, in less than an hour it can be all setup. The same can happen to your own applications!&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What are the next steps then? Well, a few things:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;We need to work with the OpenNTF team to mobile enable other parts of the site. Ideally, the whole site should be mobile enabled!&lt;/li&gt;&lt;li&gt;Why not white labeling the generic client with a pure OpenNTF branding (icon, title, ...)? Darwino offers this options.&lt;/li&gt;&lt;li&gt;Move forward and create Darwino single page applications, using web or mobile native technologies, to get the data offline and provide the best user experience without connectivity!&lt;/li&gt;&lt;/ul&gt;Stay tuned, OpenNTF becomes mobile!&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Tue, 09 Jan 2018 18:46:00 +0000</pubDate><atom:updated>2018-01-09T10:46:10.526-08:00</atom:updated><title>Dynamic document based security</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Domino provides document based security through the use of readers and authors fields. This is a great capability that is fairly unique in the NoSQL industry heavily used by Domino developer. One caveat though: you have to explicitly manage the list of users/group/roles in each document, generally based on the document state or content. How many times did you write an agent (background task) to update these fields nightly?&lt;br /&gt;&lt;br /&gt;Since the beginning, Darwino supports readers and authors (as well as excluded readers and authors to remove specific users from the authorized list). It is implemented by a hook in the SQL generator that systematically adds a condition to the queries. Here is how it looks like&amp;nbsp;in pseudo SQL:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;SELECT D.JSON FROM DOC D WHERE (....) AND (D.READERS IN (:userid, :userroles, :usergroups...)&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;userid&lt;/span&gt;, &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;userroles&lt;/span&gt; and &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;usergroups&lt;/span&gt; are values related to the user making the request.&lt;br /&gt;All of this is implemented (and by the way optimized) at the core Darwino level. So it applies regardless of API you use: Java, JavaScript, REST services, GraphQL...&lt;br /&gt;&lt;br /&gt;But in 2.1, it goes beyond this simple capability: it allows an application to insert its own SQL filter:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;SELECT D.JSON FROM DOC D WHERE (....) AND (&amp;lt;custom condition&amp;gt;)&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;For example, the custom condition can be based on fields within the document. Let&#39;s suppose that the current user object has an attribute &#39;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;country&lt;/span&gt;&#39; set in LDAP. Let&#39;s also suppose that the documents in a JSON store also have a field name &#39;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;country&lt;/span&gt;&#39;. From a security standpoint, we only want to allow the users to see the documents tagged with their country. With classic readers fields, you&#39;ll need an agent that periodically updates the document readers, or use groups and assign users to groups. In both cases, there is some maintenance to do.&lt;br /&gt;&lt;br /&gt;With Darwino, it becomes as easy as implementing a runtime extension that returns a condition for the current user (again, simplified pseudo code):&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;String getDynamicSecurity() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; User u = getCurrentUser();&lt;br /&gt;&amp;nbsp; &amp;nbsp; return &quot;{country: &#39;&quot;+u.getCountryAttribute()+&quot;&#39;}&quot;;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is no need to maintain a list of readers here. If a user is moved to a different country, then the query will use the latest user country (or any other needed value), immediately!&lt;br /&gt;&lt;br /&gt;The dynamic security condition can be expressed using the built-in, MongoDB like, query language as above. This platform independent query is transpiled to SQL by the core Darwino code.&lt;br /&gt;But it can also be expressed as raw SQL, allowing the filter to be as complex as desired. For example, it can lookup in another SQL table, view or stored procedure for a list of authorized ids for the current user:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;... AND (D.DOCID IN SELECT ID FROM SECURITY SEC WHERE SEC.USERID=&#39;currentuserid&#39;)&lt;/span&gt;&lt;/blockquote&gt;This is limitless. Let&#39;s suppose that you have a users database where each user document has the name of its manager. Now suppose that user documents can only be accessed by the user and his managers. Well, just get the list of authorized IDs from a recursive SELECT statement&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;... AND (D.USERID IN WITH RECURSIVE SELECT ...)&lt;/span&gt;&lt;/blockquote&gt;If the subquery becomes too complex and leads to performance issues, you can create materialized views that will be managed by the database server.&lt;br /&gt;&lt;br /&gt;Come on MongoDB, you cannot compete against the power of relational databases :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;256&quot; data-original-width=&quot;256&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Thu, 04 Jan 2018 17:24:00 +0000</pubDate><atom:updated>2018-01-04T09:24:31.360-08:00</atom:updated><title>Offline your data with React-Native applications</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;369&quot; data-original-width=&quot;404&quot; height=&quot;182&quot; src=&quot;; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In a previous post, I mentioned how we are leveraging ReactJS to create state-of-the-art web applications. We are now moving a step forward by also leveraging its sister technology, React-Native, to create portable, yet native, mobile applications. With all the benefits of Darwino, which includes a local JSON store that replicates for the best offline experience, and all the other services provided by Darwino!&lt;br /&gt;&lt;br /&gt;To make this as easy as possible, we are providing a simple service based API, that can be called from any native language (Java, Objective-C, Swift).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1- Darwino service API&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;The API is basically made of one class, exposed bellow in pseudo code:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;class DarwinoApis {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; ...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; Object fetch(url, params, headers, content)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; ...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;fetch&lt;/span&gt; method calls the service identified by the URL and associated parameters, and returns the result. Behind the hood, such the API call will be either translated to a remote HTTP service call (online mode), or to a local API call (offline mode). This is done transparently by a dispatcher, so the developer does not have to worry about the current mode. It just works! This API can be called from *any* native application, regardless of the library/framework it uses.&lt;br /&gt;&lt;br /&gt;This shows the beauty of the Darwino architecture: the services are all written independently from the HTTP stack, and thus can be executed locally without the need of HTTP calls. It makes them truly available offline, while providing the best possible performance as it also avoids the data serialization/deserialization needed by the HTTP transport.&lt;br /&gt;&lt;br /&gt;Here is a basic architecture picture:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;480&quot; data-original-width=&quot;449&quot; height=&quot;320&quot; src=&quot;; width=&quot;299&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2- ReactNative integration&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As the API is exposed using the platform native languages, it is easy to bridge it with ReactNative. Moreover, the bridge enforces the use of &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;promises&lt;/span&gt;, thus enabling the new &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;aync&lt;/span&gt;&amp;nbsp;&amp;amp; &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;await&lt;/span&gt;&amp;nbsp;capability for the best developer experience.&lt;br /&gt;&lt;br /&gt;Here is, for example, how to retrieve the number of documents from a database, regardless if it is local or remote:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;async&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;databaseCount&lt;/span&gt;() { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;url&lt;/span&gt; = [&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;$darwino-jstore&quot;&lt;/span&gt;,&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;databases&quot;&lt;/span&gt;,&lt;span style=&quot;color: #569cd6;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;getDatabase&lt;/span&gt;(),&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;documentscount&quot;&lt;/span&gt;] &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;count&lt;/span&gt; = &lt;span style=&quot;color: #c586c0;&quot;&gt;await&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;darwinoApis&lt;/span&gt;.&lt;span style=&quot;color: #dcdcaa;&quot;&gt;fetch&lt;/span&gt;(&lt;span style=&quot;color: #9cdcfe;&quot;&gt;url&lt;/span&gt;); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #569cd6; font-family: &amp;quot;menlo&amp;quot; , &amp;quot;monaco&amp;quot; , &amp;quot;courier new&amp;quot; , monospace;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4; font-family: &amp;quot;menlo&amp;quot; , &amp;quot;monaco&amp;quot; , &amp;quot;courier new&amp;quot; , monospace;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa; font-family: &amp;quot;menlo&amp;quot; , &amp;quot;monaco&amp;quot; , &amp;quot;courier new&amp;quot; , monospace;&quot;&gt;println&lt;/span&gt;(&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;This database contains {0}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; documents&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4; font-family: &amp;quot;menlo&amp;quot; , &amp;quot;monaco&amp;quot; , &amp;quot;courier new&amp;quot; , monospace;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe; font-family: &amp;quot;menlo&amp;quot; , &amp;quot;monaco&amp;quot; , &amp;quot;courier new&amp;quot; , monospace;&quot;&gt;count&lt;/span&gt;);&lt;br /&gt;}&lt;/div&gt;Easy, isn&#39;t it?&lt;br /&gt;&lt;br /&gt;Triggering the database replication isn&#39;t more difficult, see:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background-color: #1e1e1e; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;apis&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;replicate&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;getDatabase&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;{0}&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;3- Darwino API distribution&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The APIs is provided as a library to be added to any existing application. On Android, it is a maven artifact that you can reference from your gradle build file. On iOS, it is a Cocoa framework that you can add to your XCode project. Just add these dependencies and you&#39;re ready to go!&lt;br /&gt;&lt;br /&gt;Android:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;148&quot; data-original-width=&quot;626&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;iOS:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;146&quot; data-original-width=&quot;563&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;&lt;/b&gt;&lt;b&gt;4- Under the hood&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Wait, Darwino is Java based, so how can we provide a native Objective-C or Swift API? How can we get all the Darwino services, built-in and customs, run natively on any device? As the goal is to have one single Java source code to ensure the consistency between all the platforms, so how is is exposed as an Objective-C API?&lt;br /&gt;&lt;br /&gt;The magic comes from &lt;a href=&quot;; target=&quot;_blank&quot;&gt;J2OBJC&lt;/a&gt;. Right from the beginning, we have been very careful to write &quot;portable&quot; Java, meaning Java that can be compiled or transpiled to many different environments (JRE, Dalvik/Art, RoboVM, Multi-OS Engine...). As J2OBJC made a lot of progress these past years, it became easy to get our code transpiled to J2OBJC. The result is a tiny, efficient, native Objective-C library while sharing the same Java source code.&lt;br /&gt;With the potential to target other platforms in the future, like .NET: what about having your Domino data replicated natively to .NET? :-)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Tue, 02 Jan 2018 21:07:00 +0000</pubDate><atom:updated>2018-01-04T14:13:26.642-08:00</atom:updated><title>Darwino 2.0 is out!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div style=&quot;text-align: center;&quot;&gt;I&#39;m very exited to announce that the official&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #3d85c6;&quot;&gt;&lt;a href=&quot;; target=&quot;_blank&quot;&gt;Darwino 2.0&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; has just been released!&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;90&quot; data-original-width=&quot;197&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It had been a long journey since the previous release but most of our customers are already using the pre 2.0 release, aka 2.0.0-SNAPSHOT in maven terms. This means that this release has already been tested in many contexts and is thus very stable.&lt;br /&gt;&lt;br /&gt;The main topics for this major release are:&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Creation of new web and mobile applications&lt;/b&gt;&lt;br /&gt;- Provide the best user experience even when the device is offline&lt;br /&gt;- Leverage of the latest technologies, including ReactJS&lt;/li&gt;&lt;li&gt;&lt;b&gt;Modernization of existing applications, in particular Notes &amp;amp; Domino&lt;/b&gt;&lt;br /&gt;- Liberate the Domino data and take advantage of any data reporting/analytics tool&lt;br /&gt;- Get your existing Notes/Domino apps on mobile device with notifications&lt;br /&gt;- Create modern mobile applications connected to your IBM Domino data&lt;/li&gt;&lt;li&gt;&lt;b&gt;Migration of IBM Notes/Domino applications&lt;/b&gt;&lt;br /&gt;- Incremental migration to minimize the risk&lt;br /&gt;- Use of modern technologies and development tools&lt;br /&gt;- Integrate with MS Sharepoint, Office 365 or other platforms, like Oracle Cloud&lt;/li&gt;&lt;li&gt;&lt;b&gt;Many additions and enhancements to the existing APIs&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I bet that the mobile client is going to be popular in our community because... Well, read my next post :-)&lt;br /&gt;&lt;br /&gt;Bellow is a list of the most noticeable features in 2.0:&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Darwino for mobile devices&lt;/h3&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Darwino mobile client&lt;/b&gt;&lt;br /&gt;Darwino provides a generic client that renders server side web applications and handles IBM Cloud notifications. This client is available for both iOS and Android, in their respective application stores.&lt;br /&gt;This client can also be fully customized as the full source code is available. For example, one can white label the application with a custom icon, look&amp;amp;feel, options...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Multi-OS-Engine instead of RoboVM&lt;/b&gt;&lt;br /&gt;Darwino switched to &lt;a href=&quot;; target=&quot;_blank&quot;&gt;MOE &lt;/a&gt;as RoboVM is no longer available since it has been acquired by Microsoft. Darwino 2.0 supports the latest version of MOE. Thanks &lt;a href=&quot;; target=&quot;_blank&quot;&gt;Migeran &lt;/a&gt;for doing this great product!&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Integration&lt;/h3&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Notification framework&lt;/b&gt;&lt;br /&gt;Darwino provides a notification framework that executes actions based on events. The framework can detect data changes in a database, including domino databases, and run actions like a mobile push notifications, notifying IBM Workspace, sending an email or whatever a piece of code can do...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Microsoft Azure active directory support&lt;/b&gt;&lt;br /&gt;Darwino features a driver to consume Microsoft Azure active directory services&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Microsoft Sharepoint integration&lt;/b&gt;&lt;br /&gt;Darwino integration with Sharepoint, including directory access and single sign-on.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;More database support&lt;/b&gt;&lt;br /&gt;The MS SQL server support is complete, as well as MySQL (the full JSQL requires MySQL 8+).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Darwino DB&lt;/h3&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;JSQL&lt;/b&gt;&lt;br /&gt;JSQL is an SQL dialect dedicated to JSON databases. It allows the full power of SQL queries on top of JSON documents: joins, unions, groups, recursive queries, ... while honoring the document level security. It eventually translates to the native database SQL for maximum performance.&lt;br /&gt;&lt;a href=&quot;;&gt;;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Registered queries&lt;/b&gt;&lt;br /&gt;Database queries can be defined on the server side and consumed by name from the client. This is also true for JSQL queries.&lt;br /&gt;&lt;a href=&quot;;&gt;;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Domino @formula&lt;/b&gt;&lt;br /&gt;An extension to the query language uses the new keyword $atFormula and allows the use of a subset of the Notes/Domino @formula language in Darwino queries. That makes the migration of Notes/Domino views a lot easier!&lt;br /&gt;&lt;a href=&quot;[email protected]_Simple&quot;&gt;[email protected]_Simple&lt;/a&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;REST services&lt;/h3&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;JSON store services&lt;/b&gt;&lt;br /&gt;Added some new services to retrieve document content without the meta-data.&lt;br /&gt;&lt;a href=&quot;;&gt;;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GraphQL&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;Darwino comes with a innovative implementation of FaceBook&#39;s GraphQL, allowing both schema based and schema less queries. Moreover, GraphQL queries can be pre-defined on the server side to make them easier to consume&lt;br /&gt;&lt;a href=&quot;;&gt;;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Microservices&lt;/b&gt;&lt;br /&gt;Darwino provides a easy to use JSON microservice infrastructure. The services can be written in Java, Groovy, JavaScript, Darwino Script or any language supported by the JVM.&lt;br /&gt;&lt;a href=&quot;;&gt;;/a&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Darwino Studio&lt;/h3&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Application Wizard&lt;/b&gt;&lt;br /&gt;The application creation wizard can now use templates, also known as boilerplate, to get the developer started quickly. A new template using ReactJS and Bootstrap is provided as part of the studio. The architecture is open and any developer can contribute new templates.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Android studio&lt;/b&gt;&lt;br /&gt;The wizard can also leverage Android studio for the mobile applications, instead of Eclipse. This allows the developers to benefit from the latest features provided by Google and Multi-OS-Engine.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UI Builder&lt;/b&gt;&lt;br /&gt;Darwino studio features an easy form builder that targets mobile devices. This builder is fully extensible to support more targets in the future.&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Darwino for IBM Notes/Domino&lt;/h3&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Domino Designer&lt;/b&gt;&lt;br /&gt;Darwino provides a new Domino Designer plugin that adds a new design element dealing with the notifications. It uses a groovy based DSL (Domain Specific Language) .&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Darwino client&lt;/b&gt;&lt;br /&gt;The Darwino mobile client detects if the server is an IBM Domino server and adapts some behaviors accordingly, like error handling.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Darwino application&lt;/b&gt;&lt;br /&gt;Darwino provides new runtime capabilities to supplement IBM Domino missing features, like JEE filters. Moreover, Darwino applications can be auto-started, for example to monitor events.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;IBM Domino import&lt;/b&gt;&lt;br /&gt;The Darwino studio can generate a basic UI based on existing IBM Domino NSFs. This feature is a preview, but this is something we&#39;d like to enhance moving forward, to get the mobilization or migration of Notes/Domino import easier.&lt;br /&gt;It also generates JSON Schemas based on the Form definition in an NSF.&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Developer tools&lt;/h3&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Commands framework&lt;/b&gt;&lt;br /&gt;Darwino features a command line framework that developer can add to any application to execute administration commands or debug an application.&lt;br /&gt;It also includes a built-in application profiler.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Playground&lt;/b&gt;&lt;/div&gt;The Playground now show cases the new features like JSQL or GraphQL, but also exposes the REST apis using OpenAPI/Swagger: &lt;a href=&quot;;&gt;;/a&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Fri, 15 Dec 2017 23:26:00 +0000</pubDate><atom:updated>2017-12-15T15:26:52.092-08:00</atom:updated><title>Ubiquity of Java and relational databases</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I&#39;m sometimes being asked about our platform choices of Java and RDBMS for Darwino. More precisely, I&#39;m getting questions about Node.js or existing JSON document databases, like MongoDB or CouchDB.&lt;br /&gt;Well, I can certainly expand on the technical value of our choices, and I&#39;ll probably will. But, if the technical aspect is important, this is not the only driver. &amp;nbsp;It is not even the main one: what made us choose these technologies can be summarized in 3 words: &lt;b&gt;ubiquity&lt;/b&gt;, &lt;b&gt;diversity&lt;/b&gt; and &lt;b&gt;skill and assets&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Ubiquity&lt;/h2&gt;&lt;div&gt;Most of our customers have a Java application server and a relational database already in place. Both are almost everywhere. If small companies can be flexible with technology, bigger companies tend to be more conservative. And not to talk about administrations. With Java and RDBMS you can get in right away without going through technology validation processes.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The cloud is not different: whenever you want to use MS Azure, IBM Bluemix, Oracle Cloud, Amazon AWS, they all offer you PAAS services with a Java application server and an RDBMS. As a result, your not locked with a vendor. For example, and despite its value, if you choose IBM Cloudant, you&#39;re locked with IBM Cloud. For the good and the bad... Did I say the bad?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It similarly expands to mobile devices. There is no MongoDB implementation running on these devices, providing offline capabilities with the same set of features. Ok, Cloudant/CouchDB has TouchDB or PouchDB for offline, but these are totally different implementations with different APIs and capabilities. On the other hand, SQLite can be run on any mobile devices from Java.&lt;br /&gt;&lt;br /&gt;With Darwino encapsulating the platform differences, like SQL dialects, you write the application once and you can run everywhere, including on mobile devices.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Diversity&lt;/h2&gt;&lt;div&gt;There is not a single implementation of Java and RDBMS. Rather, you can find several vendors providing their own JVM, web application servers or RDBMS, with different characteristics. You pick and choose the one that better fits your need, based on both technical or business decisions.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Diversity fosters innovation because of the competition: the vendors have to innovate to keep the leadership. Moreover, when a great innovation is brought by one vendor, the other vendors will follow shortly. This is exactly what happened recently with the support of JSON data type, or the in-memory RDBMS. Same with Java processing optimization, like async/actor programming (Akka, Vert.x), or distributed VMs, ... In both spaces, the innovation has been rocking these past years, for our own benefit!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the other hand, if you choose Node.js, well you&#39;re locked to one vendor, and even one JS engine (v8). I&#39;m not saying that these are bad, just that you&#39; don&#39;t have any choice. Same, and even worse, with MongoDB: do you want to put your business critical data into the hand of a single database vendor? If something goes wrong with these guys, what are your options beyond re-coding your applications to another API/vendor? This is about risk management, a point that every CIO office has in mind.&lt;br /&gt;&lt;br /&gt;Of course, diversity implies differences. But it is pretty easy to overcome them or, better, to leverage the strength of a particular implementation when it makes sense.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Skills and assets&lt;/h2&gt;&lt;div&gt;Because of their ubiquity, both RDBMS and Java are already well known. This is not only about development skills, but administration, management, backups, and even procurement. The processes are in place. The IT teams are trained: they have to figure day to day issues like performance, network congestion, server availability, quick backup/restore... And they know how to deal with that.&lt;br /&gt;&lt;br /&gt;Finally, the Java ecosystem is far more mature than the Node.js one. Yes, Node is vibrant but go to npm: how do you &quot;separate the wheat from the chaff&quot;? You can find many libraries made by individuals, staled at version 0.x and asking for a new owner. There are some open source organizations around this technology but nothing yet that matches Apache, Eclipse or even OpenNTF. You might find licenses coming with the code but this is not enough: what about the certificates of originality? What guarantees you that the code you&#39;re using has not been stolen?&lt;br /&gt;As bigger companies are chiming in, this will certainly evolve to a more controlled world. IBM, for example, has it own internal npm server. But I bet that many smaller companies, or companies not in the IT business cannot afford doing the same.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In short, choosing the technologies that power a framework goes way beyond comparing their technical characteristics. There are other factors that can be even more important, and that&#39;s the reason why we chose Java and RDBMS. Now, on the pure technical side, both also have very competitive advantage, but I&#39;ll expand on that later!&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;263&quot; data-original-width=&quot;331&quot; height=&quot;254&quot; src=&quot;; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Sun, 12 Nov 2017 21:00:00 +0000</pubDate><atom:updated>2017-11-12T14:40:51.822-08:00</atom:updated><title>Develop a Domino application using any modern tools</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;In my previous &lt;a href=&quot;;&gt;post&lt;/a&gt;, I talked about a ReactJS library of components that can be used to create Notes like UI. It allows developers to create modern web and mobile UIs in a flash. Fine but, if Domino Designer is a great tool for rapidly developing applications, it is unfortunately not designed to create such modern applications, mostly because:&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;It does not integrate with the modern tool chain required by these libraries, like maven, npm,&amp;nbsp; babel, webpack...&lt;/li&gt;&lt;li&gt;It has a very limited JavaScript editor that cannot compete against Atom or MS Visual Code. Not talking about the latest standards support, like ES6.&lt;/li&gt;&lt;li&gt;Source control and continuous build/integration are very limited&lt;/li&gt;&lt;li&gt;Well, it is Windows only&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;We&#39;ve been thinking about these problems for a while and we worked to provide a solution. Part of the problem comes from the fact that the NSF is both the development and the deployment container, with no third party development tool in the market being able deal with the NSF content. The on-disk projects were an attempt to fix that issue, but this is for source control only.&lt;br /&gt;&lt;br /&gt;With Darwino, we go a step further: we allow developers to create projects using the tools they love (Eclipse, IDEAJ, Ms Visual Studio Code, Atom, ...), then use any of these tools during development and deploy the final result into an NSF.&lt;br /&gt;&lt;br /&gt;Ok, better to first see it in action:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;; frameborder=&quot;0&quot; height=&quot;266&quot; src=&quot;; width=&quot;320&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In this example, I used the Darwino studio to create a new ReactJS application within Eclipse and I&#39;m using MS Visual Studio Code to develop the client side JavaScript. I can use source control, maven, npm, without any limitation, as I&#39;m outside of Domino Designer. Moreover, the Darwino ReactJS library allows me to seamlessly call the Domino REST services, even though I&#39;m running the Webpack dev server. Ah, you might have noticed, I did all the development on a Mac...&lt;br /&gt;&lt;br /&gt;When I build the project by running maven, the relevant built files (JavaScript files, Jar files for the business logic...) are seamlessly deployed to the NSF, making the application instantly available from the Domino server. The source files are by default *not* deployed to the NSF, making it smaller and not triggering a build process when opened within Designer. Finally, your IP is also protected.&lt;br /&gt;&lt;br /&gt;The magic behind that is a design element server installed right into Domino Designer, as part of the Darwino extension for Darwino Designer. This server exposes some REST services on port 8800: list of projects, access to design elements, ... These services are called by a client, like the Darwino studio in Eclipse, to deploy the runtime files when desired. Because it is all based on standard REST services, other clients, like pure JavaScript ones, can be developed as well. Seems easy right? Well, the evil is as always in the implementation details, but hopefully this is all written using the Darwino runtime, which drastically simplified the development.&lt;br /&gt;&lt;br /&gt;The cherry on the cake: the code for these services is isolated from Domino Designer itself, so it could be installed directly within a Domino server. This would remove the requirement of using Domino Designer for development, at least when not developing&quot;classic&quot; notes applications -&amp;gt; it can enable a pure Web based Designer for citizen developers.&lt;br /&gt;&lt;br /&gt;Let me know what you&amp;nbsp; think about it!&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Darwino Studio Screenshots&lt;/h3&gt;Configuring the Design Server&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;246&quot; data-original-width=&quot;658&quot; height=&quot;236&quot; src=&quot;; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Configuring the project files to synchronize:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;416&quot; data-original-width=&quot;527&quot; height=&quot;502&quot; src=&quot;; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Thu, 09 Nov 2017 18:21:00 +0000</pubDate><atom:updated>2017-11-09T10:21:06.459-08:00</atom:updated><title>Modern Notes like UI using ReactJS</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;The world is evolving fast, and so technologies are. Today, for now a little while, when we talk about building a new web UI or a mobile hybrid one, we think about using pure client technologies without markup generation on the server side. JSF, JSP, ASP.NET are being replaced by Angular, ReactJS, VueJS and services...&amp;nbsp; I personally think this is a great evolution. But, are these technologies easy enough to use? Can a developer be as productive as he/she is with XPages, for example? Well, the quick answer is no, at least without any addition to these core libraries, in term of components and tooling.&lt;br /&gt;&lt;br /&gt;This is the problem we are currently tackling with Darwino: let&#39;s make it easy to consume these new JavaScript technologies without compromising their power. For these, Darwino 2.0 is featuring a brand new ReactJS component libraries as well as some new templates (or boilerplates, or pods, ...) that make the creation of a project easy.&lt;br /&gt;&lt;br /&gt;The components should give you all the necessary UI constructs to create a form based application. Of course, all of this is responsive to adapt to mobile devices. In short, everything you need to build Notes/Domino like applications in minutes, but with pure standard ReactJS.&lt;br /&gt;Curious? Have a look a running instance here&amp;nbsp;&lt;a href=&quot;;&gt;;/a&gt;&amp;nbsp;(use demo/demo to log in)&lt;br /&gt;&lt;br /&gt;The applications should also be data source agnostic, in a sense that the same application should,&amp;nbsp; almost seamlessly, connect the Darwino JSON store, or to Notes/Domino backend, or even other DB like LiveGrid data store. With this architecture in mind, these applications can work online, connecting to any server data, but also offline, connecting to the locally Darwino replicated data in your mobile device.&lt;br /&gt;&lt;br /&gt;There are different steps in this journey. Let&#39;s go through them.&lt;br /&gt;&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Choosing the JS library/framework&lt;/h2&gt;&lt;div&gt;There is nothing wrong picking up one of the major library currently available. In a &lt;a href=&quot;;&gt;previous post&lt;/a&gt;, I explained why we choose VueJS for ProjExec and how our developers quickly became productive using this library. It was great with this goal in mind.&lt;/div&gt;&lt;div&gt;Darwino has different goals. As a development tool, it should target the broader set of use cases. This implies using a library with a bigger eco-systems, a large set of third party additions, several rendering libraries (bootstrap, material design...). For these reasons, we choose ReactJS, as it is adopted by the many vendors like IBM or Microsoft. The later is interesting, as we can quickly create apps with the Office look &amp;amp; feel, thanks to the &lt;a href=&quot;;&gt;Office UI Fabric&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ReactJS it is.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Choosing the right ReactJS components&lt;/h2&gt;ReactJS by itself is low-level: let&#39;s consider it as a powerful, core engine that can be extended through components. For example, ReactJS has *no* built-in data binding capabilities like the one you&#39;ll find in Angular or VueJS. You should either implement them yourself, or use a third party library.&lt;br /&gt;To get a decent set of capabilities without reinventing the wheel, you have to pick-up libraries from one of the large JavaScript repositories. Nowadays, I would advise you to use npm (or eventually yarn) and leave tools like Bower to the historian.&lt;br /&gt;Gasp, this is where the troubles come in: the npm repository features a plethora of libraries designed for the same job. How would you pickup one over the others? Number of downloads? Stars on Github? Recent activity? Return on experience from other developers? Making the right choices takes time as there is no obvious ones.&lt;br /&gt;&lt;br /&gt;For Darwino, we choose the following:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;react-redux&lt;/li&gt;&lt;li&gt;react-router&lt;/li&gt;&lt;li&gt;redux-form&lt;/li&gt;&lt;li&gt;react-intl&lt;/li&gt;&lt;li&gt;react-data-grid&lt;/li&gt;&lt;li&gt;react-bootstrap (or eqv for other UI targets)&lt;/li&gt;&lt;li&gt;... and a few others&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Project boilerplates&lt;/h2&gt;If, for you, building an app if about saving a design element in an NSF, then your life is good. The JavaScript world is way more complex! Even if JavaScript is an interpreted language, you&#39;ll quickly feel the need of running build tools to use the latest JS specifications, consume libraries, produce an optimized/compressed version of the code... Again, you &#39;ll have to make some choices between Grunt, Gulp, Webpack, Browserify, ... and many other tools. This is another time consuming research.&lt;br /&gt;Once your choice is made, you have to configure the tools, generally using a JavaScript based DSL (e.g. a JavaScript piece of code driving the tool). This is fairly complex as the DSLs feature many options. To get started, developers created templates, also called boilerplates. They contains the configuration files with default behaviors that you then have to customize. But again you have many available, with some clearly developed by people without a deep knowledge of the technology. Furthermore, they are generally tailored for a particular version of the tool and will not function properly with yours...&lt;br /&gt;Ok, we spent many days of try/fail/redo and we are coming with our own template. Well, it is even easier: go to the Darwino studio, create a new project, select the target technology and voila, you&#39;re ready to go. Pfuuuu...&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Component library&lt;/h2&gt;As we&#39;d like to make the developer experience as smooth as possible, we are providing a series of ready to use components covering most of the developer needs. What started as a demo library became a very useful set of components, covering:&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Forms with document access (load, save, validation)&lt;/li&gt;&lt;li&gt;Data binding controls, including read-only mode, multiple values, pickers, rich text, attachments upload &amp;amp; download&lt;/li&gt;&lt;li&gt;Computed fields (yes, not that obvious with ReactJS!)&lt;/li&gt;&lt;li&gt;Data grid with Notes view like behaviors: categorization, totals, response doc&lt;/li&gt;&lt;li&gt;Navigators, action bars, sub-forms&lt;/li&gt;&lt;li&gt;Dialogs, messages&lt;/li&gt;&lt;li&gt;Easy access to server side business logic using micro services&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;And more... But again, these components are just regular ReactJS components, that any ReactJS developer would consume without fear. They do not carry any idiosyncrasies from the original Notes ones. They exist to create Notes like UI for Web and Mobile, not to replicate 1-1 what the Notes UI does.&lt;br /&gt;&lt;br /&gt;Ah, I foresee a question: can you automatically convert an existing Notes UI to this technology? The answer is... yes! Feel interested?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Wed, 18 Oct 2017 19:21:00 +0000</pubDate><atom:updated>2017-10-18T12:21:18.081-07:00</atom:updated><title>Universal Data Replication</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;One of the Darwino piece of code that I&#39;m the most proud of is the replication engine. If a majority of our customers see it as a Domino to JSON replication engine, it goes far beyond that. In reality, it can replicate between virtually any data sources.&lt;br /&gt;It is a true, two ways, multi-point replication engine, borrowing some ideas from IBM Domino but going beyond its venerable ancestor in multiple places.&lt;br /&gt;&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;The architecture&lt;/h2&gt;&lt;div&gt;The main idea is that any data set can be represented as a set decorated JSON objects. Decorations include meta-data (ex: data security, replication attributes...) and binary attachments. The latest are stored apart from the JSON itself for performance reasons.&lt;/div&gt;&lt;div&gt;As an example, a Domino document can be transformed to a JSON object where every Domino document item is converted to a JSON attribute in the object, along with the attachments.&lt;/div&gt;&lt;div&gt;A relational table can also be transformed to a set of JSON objects or arrays, one per row. Even more interesting, a set of rows coming from multiple tables can be grouped to create a consistent, atomic&amp;nbsp; JSON object. This way, the replication granularity is not limited to a row, but can be a whole business object even if the physical storage split it into multiple records&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dawino&#39;s engine is mostly made of two components:&lt;br /&gt;&lt;br /&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;A universal replication engine&lt;br /&gt;This engine does *not* know about the data sources. It contains all the replication logic while it accesses the data through a generic connector API&lt;/li&gt;&lt;li&gt;Connectors&lt;br /&gt;A connector encapsulates the physical access to the data, via an API. Its API provides a &quot;JSON&quot; vision of the data that we&#39;ll be consumed by the engine&lt;/li&gt;&lt;/ol&gt;As of today, the Darwino replication engine comes with ready to use connector implementations:&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Darwino JSON store, running atop RDBMS&lt;/li&gt;&lt;li&gt;IBM Domino&lt;/li&gt;&lt;li&gt;FlowBuilder XML store, used by ProjExec&lt;/li&gt;&lt;li&gt;HTTP to wrap a local connector and use HTTP/HTTPS as the transport&lt;/li&gt;&lt;/ul&gt;Some other connectors have been started:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Pure RDBMS used, for example, to replicate to DashDB&lt;/li&gt;&lt;li&gt;MongoDB&lt;/li&gt;&lt;li&gt;MS Sharepoint List&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;We are also waiting for a first beta release of IBM LiveGrid to replicate these data to your mobile devices and get a true offline expereince.&lt;br /&gt;&lt;br /&gt;Writing a basic connector is a pretty easy operation. Then, the connector can be enhanced incrementally to provide fine tuned capabilities (better conflict detection....)&lt;br /&gt;&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Darwino replication strengths&lt;/h2&gt;&lt;br /&gt;If the concept of replication feels easy to understand, there are many details that make Darwino unique so far:&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Data transformation&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;The data can be transformed two ways during the replication process. These transformations can happen at the basic field level (ex: transforming a Domino name to its LDAP counterpart) or at a more global level, like grouping a set of Domino multiple fields into a JSON array. This way, the replicated JSON is clean, and it does not carry any legacy tricks from the source platform.&lt;/div&gt;&lt;div&gt;The transformation can obviously be coded, in Java or Groovy, but Darwino already comes with a pretty large set of standard transformations you can apply to any data. Thus, setting up the transformation is mostly about scripting the pre-defined transformers, unless you have more advanced need.&lt;/div&gt;&lt;div&gt;One of the benefit of data transformation is data normalization: you can ensure that the fields in a JSON document are converted to the expected data type. Domino is well know have inconsistent fields across the whole database, as they evolved over time. Darwino can normalized them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Selective replication&lt;/h3&gt;&lt;div&gt;Sometimes you want to limit the data replicated to a target system. It can be because of storage requirements (ex: your mobile device can only handle a subset of the data), or security (ex: you only want some data to be available on the cloud).&lt;/div&gt;&lt;div&gt;Darwino handles the selective replication by either providing selection formulas based on data. It also provides a unique feature called &quot;Business Replication&quot; where related documents can be grouped and replicated as a whole.&lt;/div&gt;&lt;div&gt;Selective replication poses a problem: how to propagate deletions as the data used to select the documents no longer exists, or how to remove a document from the target when the formula no longer selects that document? Well, we solved this problem with an efficient and reliable method that I&#39;ll be happy to talk about around a beer :-) This is a pretty complex problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Transaction and error recovery&lt;/h3&gt;&lt;div&gt;If the target database supports transactions, then the engine can take advantage of them. If the replication fails for any reason, then it can rollback to the initial state, and eventually attempts another time. But this is not enough: when you have a large data set to replicate, you might not want to restart from scratch while you already replicated 98% of the data. For that purpose, the engine features commit points. If it fails at any time, it only restarts from the latest successful commit point.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Conflict detection&lt;/h3&gt;&lt;div&gt;This is one of the area were Darwino excels. It has multiple conflict detection systems, going way beyond Domino.&amp;nbsp;A particular connector might only implement a subset of them, depending on the data source capabilities. In this happens, then the engine will degrade gracefully and deal with what is available.&lt;/div&gt;&lt;div&gt;The existing mechanisms include: the last modification date, a sequence id (similar to Domino or some RDBMS), a change string carrying the update history, an update id...&lt;/div&gt;&lt;div&gt;Once a conflict is detected, an API is called and the developer can choose to execute a predefined behavior (ignore, last wins, create a copy data set...) or do a custom resolution like a data merge.&lt;/div&gt;&lt;div&gt;Finally, Darwino has an interesting mechanism to deal with records deletion. If the source database has deletion stubs, it will effectively use them. Else, it provides some helpers to find the deleted records, in particular within relational tables.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Performance&lt;/h3&gt;&lt;div&gt;The whole Darwino replication engine is designed to handle very large datasets. The Domino connector is mostly written in &quot;C&quot;, thus calling the native &quot;C&quot; API. Not only this allows critical features that are not available with the regular back-end classes, but it also provide high performance data replication. On my laptop, it replicates ~400 complex documents/second, including attachments and rich text conversion. For simpler documents, with only basic data, it goes to the range of 1000-2000 a second! In many cases, you can get your existing NSF replicated in minutes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Domino data accuracy&lt;/h3&gt;&lt;div&gt;A replication engine only makes sense if it is high fidelity. From a Domino perspective, the Darwino replication should act like a regular Domino replication, maintaining the same data (sequence id, creation and modification dates, list of authors...). We can do that thanks to the &quot;C&quot; API.&lt;/div&gt;&lt;div&gt;Darwino can replicate most of the Domino field types: string, number, name, rich text, mime, date/time... with maximum precision. For example, it deals particularly well with the date/time and the time zones.&lt;/div&gt;&lt;div&gt;Any domino document can be replicated, including design elements or profile documents. If you choose to replicate the database ACL document, then it will then be used by the Darwino runtime to apply the same security. Talking about security, we also handle the reader/author fields.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Aggregation&lt;/h3&gt;&lt;div&gt;Data can be aggregated during replication: multiple sources of data can be replicated in one single target database, thus allowing a more global view of the whole data set. Think about it: you can replicate many NSF into a single set of relational tables and then run global queries on top of these tables. Isn&#39;t that a dream?&amp;nbsp;&lt;b&gt;Darwino liberates you Domino data!&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you see, the Darwino replication engine is a very complete engine that is flexible to handle many data sources. Out of the box, it can replicate your databases as is. But it also give you a lot of options to select and transform your data.&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Thu, 15 Jun 2017 23:03:00 +0000</pubDate><atom:updated>2017-06-15T16:03:47.878-07:00</atom:updated><title>The power of Domain Specific Languages</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;We are all used to configuration files, whenever they are XML, JSON or simply text based. If this is ok for simple configurations, but it falls short when the complexity increases. The biggest issue is that they cannot provide more than what they are designed for, basically static values.&lt;br /&gt;&lt;br /&gt;Let&#39;s suppose, for example, that we have an XML configuration file exposing a property like:&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;lt;visible&amp;gt;true&amp;lt;/visible&lt;/span&gt;&amp;gt;&lt;/div&gt;Ok, simple enough. This property can be &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;true &lt;/span&gt;or &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;false&lt;/span&gt;. But now what if I want a more dynamic value, like &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;true &lt;/span&gt;if I&#39;m in development mode, or &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;false &lt;/span&gt;if I&#39;m in production? I&#39;m stuck!&lt;br /&gt;&lt;br /&gt;Some configuration systems allows expressions to be evaluated within the configuration text, like:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;lt;visible&amp;gt;${runtime.development}&amp;lt;/visible&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;div&gt;But this is very specific to every configuration system, when it exists. Moreover, this is limited to value replacement. What if I want to define a set of properties based on a condition? Well, some rare systems provide an advanced syntax, like&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;lt;sys:if cond=&#39;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;runtime.development&#39;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;prop1&amp;gt;val1&amp;lt;/prop1&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;prop2&amp;gt;val2&amp;lt;/prop2&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;sys:if&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Looks like the venerable XSL :-) This is about inventing a new ugly programming language that nobody knows about. And it is still have limitations, basically what the programmer provided.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The use of the programming constructs I know would be more appealing to me. What about:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; if(&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;runtime.development) {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;prop1&amp;gt;val1&amp;lt;/prop1&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;prop2&amp;gt;val2&amp;lt;/prop2&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;or even better:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; if(&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;runtime.development) {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; prop1 val1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; prop2 val2&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;This is mixing and matching configuration statements with regular programming ones. This allows a total flexibility on what is possible! We just need a programming language that supports this kind of construction, including the use of a dedicated grammar to provide&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;prop1 &lt;/span&gt;and &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;prop2&lt;/span&gt;. The programming language, along &amp;nbsp;with this specific, dedicated grammar, is what is called a Domain Specific Language, aka DSL.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the Java world, &lt;a href=&quot;;&gt;Groovy &lt;/a&gt;is currently the clear leader. It is being used in many systems, with even &lt;a href=&quot;;&gt;books &lt;/a&gt;written on this very topic. Its parenthesis less syntax when calling a method, the use of closures (similar to java 8 lambdas) make it particularly suited for the job.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They are several places where we are using a Groovy based DSL in &lt;a href=&quot;;&gt;Darwino&lt;/a&gt;. This is what allows, for example, a very flexible data replication configuration between IBM Domino and the Darwino JSON store. Not only we are providing many predefined data transformations but we let the developer insert custom code almost everywhere.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Recently, we introduced another DSL in our new micro application architecture. In particular, we added triggers and actions, for example to send a notification to mobile devices when a new document has been inserted in a particular database. Or any other action, on any other trigger...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is a mock example bellow. If it seems trivial, it shows that some code can be inserted to lookup a user in the LDAP directory to find its mobile id, or calculate the URL of the page to display. This would have been hard to define these custom processing with a simple static configuration file.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;DatabaseTrigger {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; database &quot;MyDatabase&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; view &quot;Workflows&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; handler { doc -&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; def approver = LookupUser doc[&quot;Approver&quot;]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; def url = calculateDisplayUrl(doc)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; pushNotification {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;ids approver.mobileid&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;page url&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;text &quot;Purchase Approval Pending&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Neat, concise and simple, isn&#39;t it?&amp;nbsp;&lt;/div&gt;&lt;div&gt;In this example, &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;pushNotification&lt;/span&gt; is a predefined action but other actions types &amp;nbsp;are available (&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;sendEmail&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;watsonWorkNotification&lt;/span&gt;...). Moreover, if Darwino does not provide a trigger or a notification you need, then it is very easy for a developer to inject a custom one into the DSL. Just develop it in Groovy or Java and register it. A DSL is very dynamic and extensible.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Sat, 11 Mar 2017 20:31:00 +0000</pubDate><atom:updated>2017-03-12T09:19:02.717-07:00</atom:updated><title>Darwino as the IBM Domino reporting Graal(*) </title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Reports, dashboards, data analytics... have been the&amp;nbsp;conundrum of IBM Notes/Domino since the beginning. Its proprietary data structure, the absence of standard APIs and its deficient query capability make it very difficult. This has been ranked as one of the top need for any for business applications. I know several business partners who created great Domino solutions but struggling with poor reporting capabilities.&lt;br /&gt;&lt;br /&gt;Of course some attempts were made to fix it: &lt;a href=&quot;;&gt;LEI&lt;/a&gt;, &lt;a href=&quot;;&gt;DB2NSF&lt;/a&gt;,.. all incomplete and anyway defunct. I personally tried a new approach with &lt;a href=&quot;;&gt;DomSQL&lt;/a&gt;, which, to be frank, I was proud of :-) But this was a first shot, more a POC than a product, although I know several customers using it in production. Unfortunately, despite the community interest, IBM didn&#39;t want to move it forward, so it is barely in the state where I left it. On the positive side, it gave me a great low level SQLite experience which is now leveraged in Darwino&#39;s mobile database! Learn, learn, learn, you&#39;ll always reuse it.&lt;br /&gt;&lt;br /&gt;So we are back 2 decades ago, with no solution to this common business problem. Well, you anticipated, Darwino can help! It is actually the first and immediate benefit than our customers are getting when they start with Darwino.&lt;br /&gt;&lt;br /&gt;One of the Darwino capability is data replication. It can replicate, two ways and real real time, any Domino data into its own document store. From a Domino standpoint, Darwino is behaving as another Domino server, with high fidelity replication. But Darwino document store is a JSON based store, sitting on top of an RDBMS. As modern RDBMS now understand JSON natively, this is a great fit. The whole replicated data set is then query-able by any tool that understands RDBMS. With no limitation but the relational database itself. Yes, you can join, aggregate, union, calculate, select, sub select... And, contrary to LEI, this is a real incremental replication that can be triggered when a data event occur on the domino server, keeping your data up-to-date at any time. No more nightly/weekly batch data copy, if you know what I mean.&lt;br /&gt;&lt;br /&gt;From a technical standpoint, Darwino stores a JSON version of the domino document within a column in a relational table. It is very flexible as it does not require a custom table schema per fdata set, and there is no data loss (e.g. a field you forgot to define a column for...). Moreover, if the default field conversion between the two database is 1-1, this is actually fully customizable. The Darwino replication process can transform the data during the replication phase. This is achieved using a Groovy based &lt;a href=&quot;;amp;v=&amp;amp;b=&amp;amp;from_search=18&quot;&gt;DSL&lt;/a&gt;, which allows the following:&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;The fields type can be normalized (e.g. make sure that the field in the JSON document is of the expected data type). Common issue with Notes inconsistent data type across documents, right?&lt;/li&gt;&lt;li&gt;Domino patterns/workaround can also be normalized. For example, a set a multi value fields describing a table can be transform a true JSON array&lt;/li&gt;&lt;li&gt;Computation can be done ahead of time to make the reporting easier (queries, calculated columns...)&lt;/li&gt;&lt;li&gt;... well, your imagination&lt;/li&gt;&lt;/ul&gt;If you feel that directly reporting on the JSON column within the RDBMS is uneasy, then you can create RDBMS views (standard or materialized), to then act on a table like structure. This is what our partner, CMS, chose to do. Going even further, they are creating these relational views out of the Domino view design elements. Introduction to their product is available&amp;nbsp;&lt;a href=&quot;;amp;v=&amp;amp;b=&amp;amp;from_search=20&quot;&gt;here&lt;/a&gt;. This is a great use of Darwino.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In a previous post, I spoke about &lt;a href=&quot;;&gt;JSQL&lt;/a&gt;, which is a easy way for querying JSON data using SQL. Thinking forward, we can provide a JDBC driver to expose JSQL and allow any JDBC compliant client to access the data. From a technical standpoint, we know how to do it: the above mentioned DomSQL features one we can adapt and reuse. This is not in our current plan, but I&#39;ll be interested to know if you have any interest in this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a summary, using Darwino as a Domino report tool enabler is a fast way to fulfill some crucial, missing Domino capability. It almost instantly makes the existing Domino applications more interesting to the business users. Of course, this is just a subset of what Darwino can bring to the table, but this is a quick, high value one. Please, give it a shot or contact us so we can help you.&lt;br /&gt;&lt;br /&gt;BTW, &quot;Graal&quot; is the French spelling for Holy Grail&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;; width=&quot;282&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Fri, 03 Mar 2017 22:56:00 +0000</pubDate><atom:updated>2017-03-03T14:56:38.966-08:00</atom:updated><title>Schemaless GraphQL</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;FaceBook officially introduced a few months ago a new technology called&amp;nbsp;&lt;a href=&quot;;&gt;GraphQL&lt;/a&gt;. Well, rather than really being new, FaceBook made public and open source their internal graph query engine. &lt;span lang=&quot;EN&quot;&gt;It starts to be widely used for exposing APIs. For example, IBM Watson Worskpace makes use of it. I also heard that IBM Connections will also use it.&lt;/span&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang=&quot;EN&quot;&gt;In a nutshell, it allows powerful, tailored queries including navigation between the data sources, in a single query. As a result, it minimizes the number of requests sent by the client to the server, which is a performance boost. Moreover, it proposes a single query format regardless of the data source&lt;/span&gt;. Basically, it means that you can query data from an RDBMS or an LDAP directory almost identically, while getting a consistent response format. All good!&lt;br /&gt;&lt;div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;To make the queries discoverable, it uses&amp;nbsp;a schema to define the query parameters, the JSON result as well as the graph traversal links.&amp;nbsp; If this is&amp;nbsp;appealing, it forces the server to implement these schemas before the queries can be emitted by the client. The whole data and navigation models have to be known and implemented up front. Hum, not only this slows down application prototyping, but it makes it hard to link micro-services that don&#39;t know about each other. &amp;nbsp;&lt;/span&gt;It also does not work with truly dynamic services, like a JSON document store, where the document schema can be unknown.&amp;nbsp; Crap, this is exactly what Darwino offers. So the question is: can we still use GraphQL for dynamic services, where data&amp;nbsp; schema can be static, dynamic or a mix of both? I saw a few posts on the subject but no solution so far.&lt;br /&gt;&lt;span lang=&quot;EN&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;Fortunately, GraphQL has the notion of an optional field alias. An alias renames a field, so it can appear multiple times in the same root. As&amp;nbsp;a field can also have parameters, we can &quot;tweak&quot; the engine to implement dynamic field accessors. How? Simply by inverting the roles: the alias becomes the field name while the field is a dynamic, typed, JSON path evaluation on the source document. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;Ok, let me give you an example. Suppose that we have the following document as a source:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;{&lt;br /&gt;&amp;nbsp; name: &quot;MyProject&quot;,&lt;br /&gt;&amp;nbsp; budget: {&lt;br /&gt;&amp;nbsp; &amp;nbsp; amount: 10000,&lt;br /&gt;&amp;nbsp; &amp;nbsp; currency: &quot;USD&quot;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt; }&lt;/span&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;The dynamic query to extract the project name and the budget will be like:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;{&lt;br /&gt;&amp;nbsp; doc: Document(unid:&quot;projectid&quot;, database:&quot;project&quot;) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; _unid,&lt;br /&gt;&amp;nbsp; &amp;nbsp; name: string(path:&quot;$.name&quot;),&lt;br /&gt;&amp;nbsp; &amp;nbsp; budget: number(path:&quot;$.budget.amount&quot;)&lt;br /&gt;&amp;nbsp; }&lt;br /&gt; }&lt;/span&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;&#39;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;string&lt;/span&gt;&#39; and &#39;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;number&lt;/span&gt;&#39; (as well as others, like &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;boolean&lt;/span&gt;...) are typed, pseudo field names that are actually evaluating JSON path queries on the source document. And because the path is passed as an argument, it can be fully dynamic! We are using JSON path here, but any interpreted language could be used, including JavaScript or others. Also note that the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Document&lt;/span&gt; accessor is also implemented as a field with parameters. This triggers the actual load of the JSON document from the database.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;How does that sound? You can find a real example dealing with the JSON store in the Darwino playground:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;&lt;a href=&quot;;&gt;&lt;span style=&quot;color: blue;&quot;&gt;;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang=&quot;EN&quot;&gt;But this is not enough, as we also need to implement the links to navigate the graph. For example, we need to navigate to a JSON document by id, that id being a field in the current object. To make this possible, we introduce here the notion of computed parameter, using the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;${....}&lt;/span&gt; syntax (remember JSF?).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;The pseudo query bellow assumes that you have tasks documents that can be accessed using the parent project id:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;{&lt;br /&gt;&amp;nbsp; doc: Document(unid:&quot;projectid&quot;, database:&quot;project&quot;) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; _unid,&lt;br /&gt;&amp;nbsp; &amp;nbsp; name: string(path:&quot;$.name&quot;),&lt;br /&gt;&amp;nbsp; &amp;nbsp; budget: number(path:&quot;$.budget.amount&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; tasks: Documents(parent:&quot;${_unid}&quot;, database:&quot;tasks&quot;) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;taskname: string(path:&quot;$.name&quot;),&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt; }&lt;/span&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;The drawback of this solution is that every property becomes a string, to accept a formula. Another solution would duplicate all the fields and have, for example, &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;parent$&lt;/span&gt;&amp;nbsp;as a computed version of &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;parent&lt;/span&gt;. As the whole library is under development, I&#39;m not sure yet what&#39;s best, so any feedback is welcome!&lt;/span&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot;&gt;Note that &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Documents&lt;/span&gt; returns a collection of documents, as opposed to &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Document&lt;/span&gt; that only returns one.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;Of course, this is a simple introduction to a schemaless implementation of GraphQL. There are more details, but it expands the GraphQL technology by making it more dynamic, while the retaining the static parts. Look, for example, at this snippets mixing static and dynamic attributes:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;a href=&quot;;&gt;;/a&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN&quot;&gt;The early &lt;a href=&quot;;&gt;Darwino&lt;/a&gt; 2.0 code includes this capability in its Java based implementation, released as open source on &lt;a href=&quot;;&gt;;/a&gt;. Any GraphQL object can implement a specific interface that will give it the dynamic capability (json path...) on top of its static fields. If you go back to the previous example, you&#39;ll see that the document UNID is a static field specific to the Darwino JSON document.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;There are more to discover, but hold on: if our session is accepted at &lt;a href=&quot;;&gt;Engage 2017&lt;/a&gt;, &lt;a href=&quot;;&gt;Paul Withers&lt;/a&gt; and I will give more details on the implementation, along with an IBM Notes/Domino implementation!&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Fri, 17 Feb 2017 03:51:00 +0000</pubDate><atom:updated>2017-02-16T19:51:53.327-08:00</atom:updated><title>Get your apps integrated with IBM Connections, cloud and on-premises!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I&#39;ve been using this blog to share some of the techniques we use in ProjExec to get tightly integrated with the Connections platform. I got a lot of feedback from developers who wanted to know more, so I&#39;m moving a step further: &lt;a href=&quot;;&gt;Jesse Gallagher&lt;/a&gt; and I will describe these techniques in a breakout session&amp;nbsp;@Connect 2017!&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;DEV-1430 : IBM Connections Integration: Exploring the Long List of Options&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Program : Development, Design and Tools&lt;br /&gt;Topic : Enterprise collaboration&lt;br /&gt;Session Type : Breakout Session&lt;br /&gt;Date/Time : Wed, 22-Feb, 10:00 AM-10:45 AM&lt;br /&gt;Location : Moscone West, Level 2 - Room 2006&lt;br /&gt;Presenter(s) : Philippe Riand, Triloggroup; Jesse Gallagher, I Know Some Guys, LLC&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;Basically, we&#39;ll show for both on the cloud and on premises Connections:&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;how to get your user authenticated by Connections, using OAuth or SSO&lt;/li&gt;&lt;li&gt;how to call services in the behalf of that current user&lt;/li&gt;&lt;li&gt;how to get your apps in the IBM Connection menu&lt;/li&gt;&lt;li&gt;how to integrate the navbar, including on premises!&lt;/li&gt;&lt;li&gt;how to share code common to community apps (cloud) and iWidget (on premises)&lt;/li&gt;&lt;/ul&gt;Beyond live code and demos, we will release a reusable library as open source, with all the necessary code to get your own Java based application integrated effortless. It will be available on &lt;a href=&quot;;&gt;;/a&gt;, a branch of &lt;a href=&quot;;&gt;OpenNTF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To make that possible, &lt;strike&gt;IBM helped by providing a long awaited ask&lt;/strike&gt;, &amp;nbsp;Wait wait wait, I&#39;m not going to reveal that here, but an &lt;strike&gt;IBMer will be on stage to explain&lt;/strike&gt;. Wait again, should not talk about this neither, people have to come to the session!&lt;br /&gt;&lt;br /&gt;See you&amp;nbsp;@Connect, and don&#39;t miss this session if you want to be an IBM Connections developer hero!&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;345&quot; src=&quot;; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Thu, 26 Jan 2017 23:46:00 +0000</pubDate><atom:updated>2017-01-26T15:47:04.162-08:00</atom:updated><title>When SQL meets NoSQL, you get the best of both worlds!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;At the heart of Darwino is an advanced, portable JSON document store, implemented on top of any relational database. I&#39;m often being asked the following question &quot;why did you implement that on top of an RDBMS?&quot;. Behind the scene, the real question is: &quot;why are you not using MongoDB or another nosql database?&quot;&lt;br /&gt;&lt;div&gt;Well, I&#39;m generally answering it with multiple arguments:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;It leverages all the RDBMS well known capabilities: transactions, data integrity, security, backups, performance, reporting, analytics...&lt;/li&gt;&lt;li&gt;Nowadays, RDBMS handle JSON natively, thus providing high performance access to any data in this format.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Portability: it deploys on existing infrastructure, whenever it is cloud or on premises. Run your app on IBM Bluemix on top of DB2, or MS Azure on top of SQL Server... And on-premises, I don&#39;t know any organization that does not already have an RDBMS validated by the IT department.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;But there is now another big reason: queries! This is another step in leveraging the native JSON support available in all major RDBMS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From the beginning, Darwino comes with a JSON based, MongoDB like, query language. It fully abstracts the relational database details, by converting the JSON query into SQL for the target database. It hides the relational model and behaves exactly the same on every single relational database. Plus it adds IBM Domino like capabilities, including category records, response documents, full text search... Of course, it honors the document based security. So it is very powerful. You can see it in action &lt;a href=&quot;$and&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But it also has its own set of limitations. In particular, because it hides the relational model, it cannot take advantage of it. I&#39;m thinking about joins, subqueries, unions... Remember, it is modeled over MongoDB and IBM Domino, which do not support these capabilities.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That&#39;s the reason why are introducing JSQL, which stands for JSON SQL. It complements the existing query language. In a nutshell, this is SQL targeting JSON document collections. Think a document collection as relational table, where each document is a row. The columns become &lt;a href=&quot;;&gt;JSON paths&lt;/a&gt;&amp;nbsp;on the documents.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The beauty of implementing a NoSQL store on top of a RDBMS, is that you don&#39;t have to implement the SQL query engine yourself, but you can rely on the well proven underlying database. I don&#39;t know any NoSQL database that is just approaching what a mature SQL database can do in term of query. With behind it, decades of research and query optimization techniques that will be hard to re-implement! And finally, if a vendor does not give you entire satisfaction, then you can move to the next one. Frankly, isn&#39;t that more trustable than any proprietary NoSQL database, even open source?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Ok, back to JSQL. Let&#39;s start with a simple example. Suppose that you have a collection of JSON documents named &#39;Pinball&#39;. Each pinball document has a few fields, like these:&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; { name: &#39;Revenge of Mars&#39;, manufacturer: &#39;Bally&#39;, ....}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A JSQL query to list all the pinball machines in the database would be:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp;SELECT $.manufacturer as manufacturer, $.name as name&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;FROM pinball&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;ORDER BY $.manufacturer, $.name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;;&gt;Live example&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Easy, isn&#39;t it? The syntax &#39;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;$.a&lt;/span&gt;&#39; is actually a JSON path that extracts the field &#39;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;a&lt;/span&gt;&#39; from the JSON document. It can obviously be more complex, like &#39;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;$.x.y.z&lt;/span&gt;&#39;, to extract hierarchical data.&lt;br /&gt;Note that you can also get the whole JSON document with the simple &#39;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;$&lt;/span&gt;&#39; JSON Path:&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; SELECT $ as doc from pinball&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;;&gt;Live example&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Under the hood, Darwino parses the original JSQL query and generates the final query for the target RDBMS. For example, here is how the query above is converted to Postgresql:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; WITH TB1 AS&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; (SELECT *&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; FROM playground_DOC&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; WHERE STOREID=&#39;pinball&#39;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AND INSTID=&#39;&#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; SELECT&lt;br /&gt;&amp;nbsp; &amp;nbsp; jsonb_extract_path_text(JSON,&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&#39;manufacturer&#39;)::text AS manufacturer,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; jsonb_extract_path_text(JSON,&#39;name&#39;)::text AS name&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; FROM TB1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; ORDER BY&lt;br /&gt;&amp;nbsp; &amp;nbsp; jsonb_extract_path_text(JSON,&#39;manufacturer&#39;)::text,&lt;br /&gt;&amp;nbsp; &amp;nbsp; jsonb_extract_path_text(JSON,&#39;name&#39;)::text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The JSQL queries can be as complex as the database supports: it includes clauses like WHERE, ORDER BY, GROUP BY/HAVING, any JOIN, subqueries, functions, aggregation, UNION... Again, anything supported by the underlying database can be used. Also, during the conversion step, Darwino hides as much as possible the SQL differences between the database vendors. It even works on mobile devices on top of SQLite!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is, another example: a query joining 3 document collections: pinballs, owners and a relation (owns) between the pinballs and the owners:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; white-space: pre;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;SELECT O.$.firstName firstname,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; O.$.lastName lastname,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; P.$.brand brand,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; P.$.name name&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;FROM owners O&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;LEFT OUTER JOIN owns R ON R.$.owner=O._unid&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;LEFT OUTER JOIN pinball P ON R.$.ipdb=P._unid&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;ORDER BY firstname, lastname&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;;&gt;Live example&lt;/a&gt;&lt;/div&gt;&lt;div&gt;(The field syntax &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;_xyz&lt;/span&gt; allows access to the document meta-data, stored outside of the JSON document. It includes the document unid, the creation date...)&lt;br /&gt;&lt;br /&gt;Another one? What about a subquery to find the most expensive pinball:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp; SELECT P.$.name name, P.$.manufacturer manufacturer,&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;P.&quot;$.value&quot;::number &quot;value&quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;FROM pinball P,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;(SELECT MAX(&quot;$.value&quot;::number) val FROM pinball) MT&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;WHERE P.&quot;$.value&quot;::number=MT.val&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;;&gt;Live Example&lt;/a&gt;&lt;br /&gt;(Because there is no JSON schema, any JSON path is assumed to be a string by default. Darwino supports the &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;::&lt;/span&gt; cast operator to specify other data types, like &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;::number&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;It, of course, preserves the document based security (a.k.a. readers/editors). Look at this&amp;nbsp;&lt;a href=&quot;;&gt;example&lt;/a&gt;, and you&#39;ll see that the generated SQL is decorated with the proper security condition on the reader fields.&lt;br /&gt;&lt;br /&gt;Thinking even further, we can provide a JDBC driver that will allow any JDBC client, like report engines, to connect to the database, while preserving the whole security model! For the record, I already created such a remote JDBC driver for &lt;a href=&quot;;amp;name=JDBC%20Access%20for%20IBM%20Lotus%20Domino&quot;&gt;DomSQL&lt;/a&gt;, so it would be easy reuse this piece of code.&lt;br /&gt;&lt;br /&gt;This feature is still under development but can be previewed in the Darwino 2.0 code stream, and live from the Playground. Hope you guys like it, and see the value of having an RDBMS behind the scene! Any feedback is more than welcome.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;BTW, I&#39;m a fan of Pinball machines, and so are my friends at &lt;a href=&quot;;&gt;WebGate&lt;/a&gt;. :-) I can show you my pinball database, augmented with AI, at &lt;a href=&quot;;&gt;Connect 2017&lt;/a&gt;. See you at booth #630 in the showcase.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Wed, 25 Jan 2017 21:25:00 +0000</pubDate><atom:updated>2017-01-25T13:25:04.752-08:00</atom:updated><title>ReactJS or AngularJS? What about something else?</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;So far, ProjExec has been a really good citizen in the IBM/ICS world as we tried to reuse the core Connections stack as much as can (Dojo, OneUI, ...). But these technologies start to age while the browser technologies evolved a lot in the past years: what required a whole bunch of JavaScript using Dojo/JQuery can now be squeezed in a few lines using new libraries! It is time to change gears.&lt;br /&gt;&lt;br /&gt;We started to look at what technology would better fit our needs. The main requirements are:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Make the developers productive - easy to integrate new developers&lt;/li&gt;&lt;li&gt;Have a decent performance when the application grows - ProjExec is large!&lt;/li&gt;&lt;li&gt;Can integrate with the existing code, and be used incrementally within ProjExec&lt;/li&gt;&lt;li&gt;The tool chain should integrate well with what we currently use (Maven, Eclipse...)&lt;/li&gt;&lt;li&gt;Can be debugged easily, with mean full logs&lt;/li&gt;&lt;li&gt;Have a eco-system with ready to use libraries (bootstrap, mobile, ...)&lt;/li&gt;&lt;/ul&gt;We already started to use AngularJS 1.x 2 yrs ago for some new modules. The initial steps were pretty easy, although it started to be more difficult when the complexity increased. And anyway, we know that AngularJS 1 is behind us. We cannot decently bet our future on it.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The natural next move was to use Angular 2, as it fixes most of the issues found in 1.x. I would say this is true, but the learning curve grew significantly. That includes some technology choices (ex: Observable vs Promises), Typescript, the tool chain required to get an application properly packaged, and the heaviness of the resulting code... I spent time playing with it for Darwino (we&#39;ll release some examples), but I do not see the ProjExec developers being quickly productive with it. This has been further confirmed by one of my friend, a GDE (Google Developer Expert, the equivalent of IBM Champion): his one week training class is barely sufficient to get the developers comfortable. Also, getting it integrated in a venerable existing application raises some challenges.&lt;br /&gt;Ok, we&#39;ll might use it later with Ionic 2 for a dedicated mobile UI, but for now, let&#39;s look if something easier can be used on the existing web application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next candidate on the list is Facebook&#39;s ReactJS. Clearly, there is a buzz around this technology. It has very interesting concepts, it creates high performance applications. But the initial learning curve is even bigger than Angular&#39;s, particularly for Java developers. Moreover, it is pretty low level, which provides great flexibility but you then have to choose the proper companion libraries.&lt;br /&gt;We&#39;ll keep this in the back burner, let&#39;s look is something else better suits our needs.&lt;br /&gt;&lt;br /&gt;Finally, we discovered that another library got a lot of traction last year: it is called Vue.js (&lt;a href=&quot;;&gt;;/a&gt;). After a first look at it, it feels like what I hoped Angular 2 would be! Ok, I bought 2 books from &lt;a href=&quot;;&gt;Packt ($5 each)&lt;/a&gt;, got the source code from Github and started my deep learning. It features exactly what we need:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Easy learning curve, particularly when you have some Angular 1 background. Anyway easier than Angular or React&lt;/li&gt;&lt;li&gt;You don&#39;t need a whole set of tools/CLI to be in place up front. Just include the single JS file and you can get started. It happens that we&#39;ll finally use Webpack, but this was not a requirement from the beginning.&lt;/li&gt;&lt;li&gt;It fixes many of the problems/inconsistencies found in Angular JS 1.x (bind vs values, separation of concerns, single file components...)&lt;/li&gt;&lt;li&gt;It easily integrates within existing applications, regardless of what they already use (Dojo, JQuery, ...), even if they are not designed as SPAs&lt;/li&gt;&lt;li&gt;It performs as good as ReactJS. Moreover, if you&#39;re a JSX fan, it is available as well&lt;/li&gt;&lt;li&gt;It is very lightweight and non intrusive&lt;/li&gt;&lt;li&gt;Developer&#39;s productivity feels superior to ReactJS&lt;/li&gt;&lt;li&gt;A good set of tools/libraries/docs is available&amp;nbsp;&lt;a href=&quot;;&gt;;/a&gt;&lt;/li&gt;&lt;li&gt;See how it compares to the other libraries:&amp;nbsp;&lt;a href=&quot;;&gt;;/a&gt;&lt;/li&gt;&lt;/ul&gt;We decided to go with it. The early feedback I got from the development team is very positive. We&#39;ll see in the longer run if it keeps its promises, but so far so good.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I&#39;ll be interested to hear anybody else experience. Please feel free to comment.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>11</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Tue, 03 Jan 2017 16:53:00 +0000</pubDate><atom:updated>2017-01-03T08:53:35.942-08:00</atom:updated><title>Why AngularJS sounds familiar to XPages developers...</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;When I started to look at AngularJS a few years ago, I surprisingly found myself quickly comfortable with this technology. One of the reason is that many of its concepts are shared with XPages. &amp;nbsp;Of course, there are fundamental differences, the most obvious being AngularJS a pure client technology while XPages, based on JSF, is a server side one. But still, they share a lot! If you know XPages, your experience understanding AngularJS should be similar to mine. I&#39;m basing my experience on &amp;nbsp;AngularJS 1.x, although it is also applies to 2.0. 2.0 is even closer to Java programmers with the use of TypeScript and new concepts familiar to Java developers (classes, ...). But this is a different topic.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Let me dive into the similarities between the 2 frameworks:&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1- The Document Object Model (DOM) as the page content&lt;/div&gt;&lt;div&gt;If it is obvious that Angular works on top of a DOM, but XPages is also working on a DOM. If AngularJS leverages the browser HTML DOM, XPages manages an hierarchy of JSF components. Both are hierarchical, with a parent-children relationship, and represent the content of the page.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2- Contextual data&lt;/div&gt;&lt;div&gt;Angular calls that a scope, which is data assigned to a DOM element and its children. If this concept does not exist in the JSF spec, XPages provides it through &quot;complex properties&quot; like data sources, or even the &quot;context&quot; object that lets developers add data to a component and its children.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3- Scripts and formulas&lt;/div&gt;&lt;div&gt;Obviously Angular uses JavaScript as its scripting language, similarly to XPages, plus a JavaScript based formula language for expression evaluation. XPages also uses the JSF EL for basic expression&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4- Data binding&lt;/div&gt;&lt;div&gt;Angular does data binding either through attributes to the DOM elements, or expressions within curly braces &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;{{...}}&lt;/span&gt;. Well, XPages does kind of the same thing with value binding expressions, &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;${...}&lt;/span&gt;or &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;#{...}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5- Directives or components&lt;/div&gt;&lt;div&gt;Angular does great job extending your browser HTML with directives. In short, you can create your own tags (or even attributes one can use on existing tags). XPages does the same with custom controls, adding new tags to the XML describing the page.&lt;br /&gt;&lt;br /&gt;6- Managed beans&lt;br /&gt;Angular uses services, JSF has managed beans to externalize the business logic outside of the page. In both cases, you access the object by its name, using dependency injection for Angular, or faces-config.xml for XPages.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, there are real differences. One of them is the processing model, as XPages is running well known phases while Angular uses an event based model, with a queue of events. But still, as an XPages developer, you&#39;ll feel at home pretty quickly when writing an application.&lt;br /&gt;&lt;br /&gt;How about Angular 2.0? Well we are currently experimenting with it and I&#39;ll share my findings in a little while.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>no[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>4</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Thu, 22 Dec 2016 23:08:00 +0000</pubDate><atom:updated>2016-12-22T15:08:31.280-08:00</atom:updated><title>The king is dead, long live to the new iOS Java king!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;When presenting &lt;a href=&quot;;&gt;Darwino&lt;/a&gt;, I&#39;m often asked the question how do we run Java natively on iOS, or other platforms that are not known to be Java friendly? Well, we started this journey a few years ago, but the landscape of cross platform Java evolved a lot since that. Let me go through the history and explain where we stand now, as a new king has just been proclaimed. If you thing the story is too long, then just go to&amp;nbsp;&lt;a href=&quot;;&gt;Multi OS Engine&lt;/a&gt;&amp;nbsp;for the answer.&lt;br /&gt;&lt;br /&gt;Back to the dark age, the most promising solution was provided by Google, through a &lt;a href=&quot;;&gt;transpiler &lt;/a&gt;called &lt;a href=&quot;;&gt;J2OBJC&lt;/a&gt;. Basically, j2objc converts the Java source code to Objective-C source code, that can later be compiled using Apple XCode as any native Objective-C application. Google is successfully using this technology internally for a set of projects, including popular ones like Inbox. With this, along with &lt;a href=&quot;;&gt;GWT&lt;/a&gt;, they claim that 70% of the code is shared between Android, iOS and the web. This is more than decent, but it has some issues:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;It works at the source code level, while most of the libraries are currently provided as compiled binaries, through a maven reposioty&lt;/li&gt;&lt;li&gt;The runtime libraries (e.g. the set of classes available at runtime, like*,*...) is a small subset of the standard JRE libraries. That limits what you can use in your application. Even if you pay attention to only use the less common denominator, it prevents you from using libraries depending of the missing pieces&lt;/li&gt;&lt;li&gt;Objective-C (and Swift) memory management. While Java uses a garbage collector, Objective-C uses references count. I can write a whole article on the pros and cons on each of them, but the fact is that Java memory management does not translate properly to Objective-C, leading to hard-to-debug issues&lt;/li&gt;&lt;li&gt;Finally, it does not provide an easy access to the native APIs like Cocoa, or even JNI (which we use for to access SQLite, for example)&lt;/li&gt;&lt;/ul&gt;Ok, despite the all the great things it carries, j2objc didn&#39;t fit with our objective of &quot;write once, run everywhere&quot;.&lt;br /&gt;&lt;br /&gt;Fortunately, a beta from a new product called &lt;a href=&quot;;&gt;RoboVM &lt;/a&gt;appeared soon after. It was not a transpiler but a real compiler that generates true native code from the Java classes. It removed most the limitations of j2objc, by bundling the Android runtime class libraries (minus the specific UI classes), giving access to the whole iOS API through a Java-to-native bridge, full support of JNI... With RoboVM, we migrated our existing Android applications to iOS in a few hours.&lt;br /&gt;Another tool, called&amp;nbsp;&lt;a href=&quot;;&gt;Migeran&lt;/a&gt;, was also emerging&amp;nbsp;with a very similar value proposition. We also moved our apps to Migeran. But, after talking to both teams, we decided to go with RoboVM, mostly because RoboVM was &lt;a href=&quot;;&gt;open source&lt;/a&gt; (well, partly). By the meantime, Migeran was acquired by Intel to extend their &lt;a href=&quot;;&gt;INDE &lt;/a&gt;offerings. They called it Multi OS Engine, aka MOE . That reinforced the validity of our choice.&lt;br /&gt;&lt;br /&gt;But we knew that RoboVM was also a potential target for an acquisition. And what had to happen happened. Xamarin, the .NET based competitor, acquired it and changed the rules: raised the price up, stopped to deliver to the open source project... Without any inside knowledge of the acquisition terms, I believe that the Xamarin move to Java was not to make the Java community happier, but to awake and fear its main supporter: Microsoft. Which quickly reacted by acquiring Xamarin a couple of months later, and just killed RoboVM. Man, we are orphan!&lt;br /&gt;&lt;br /&gt;One of the solution was to restart from the open source version of RoboVM, and contribute enhancements. Actually, there is a team of knowledgeable&amp;nbsp;&lt;a href=&quot;;&gt;LibGDX &lt;/a&gt;developers that cleaned-up the code (see: &lt;a href=&quot;;&gt;;/a&gt;) and maintains it. That was the best place to start from. We even contributed the maven plug-in, thanks to Jesse. But the effort to make this project an enterprise grade tool is still big. It misses a decent debugger, support of LLVM and a few other things. Despite the value of the people behind it, it lacks the support of a real organization dedicating resources to its development.&lt;br /&gt;&lt;br /&gt;But events are often chained. Another long awaited event happened: Intel decided to release MOE as an open source project. More than that, they gave the leadership back to the original creator, Migeran! That&#39;s the difference between Intel and Microsoft: instead of just killing and erasing the project, they decided to give it for free to the community. Many thanks to you Intel, you deserve it!&lt;br /&gt;&lt;br /&gt;This changed the game for us. Instead of investing in the opensource RoboVM, we decided to move to MOE. The switch was actually easy, as the two tools are close enough. We made sure with Migeran that what we need is part of the platform, for example Eclipse and Maven support. Clearly, this team is great and they got the features in very quickly. As a result, since Darwino 1.5.0, we moved to the latest MOE 1.2.x and it appears to be very stable. We now have the same experience we had with the commercial version of RoboVM, including a full debugger! Yes, you can debug the Java code you deployed to your device.&lt;br /&gt;Moving forward, we&#39;ll support whatever comes from Migeran: 1.3 is currently in a beta state, while 2.0 with come with a bunch of great new features. In particular the support of LLVM, latest ART runtime, maybe native windows support... Well the dream comes true.&lt;br /&gt;&lt;br /&gt;Last but not the least, we have great relationship with Migeran and in particular its CTO, the mighty Gergely Kis. Man, this guy is really skilled and he knows what he talks about. We had another opportunity to talk face to face last month, as he came to the first Darwino workshop in Germany. It came out that we are very aligned on the vision, so the future looks very promising. We also exchanged on future projects, like bringing a Java based, fully portable ReactNative to mobile devices.&lt;br /&gt;&lt;br /&gt;For more information about MOE now and future, Gergely gave us a presentation during the darwino workhop. The slides are now available on slideshare:&amp;nbsp;&lt;a href=&quot;;amp;v=&amp;amp;b=&amp;amp;from_search=2&quot;&gt;Slides&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you are a Java developer who&#39;d like to develop for iOS, then MOE is definitively what you&#39;re looking for. Start from&amp;nbsp;&lt;a href=&quot;;&gt;Multi Os Engine&lt;/a&gt;&amp;nbsp;web site, install the studio and enjoy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Tue, 06 Dec 2016 17:12:00 +0000</pubDate><atom:updated>2016-12-06T09:12:19.998-08:00</atom:updated><title>The very first Darwino workshop in Germany was a success!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;It happened in Cologne, Germany, where 8 different companies joined us to better understand Darwino and get their hands dirty with the code. It reminded me the first XPages workshop we did in Westford in 2008, before we launched the technology at Lotusphere. Same spirit, with highly motivated people, ready to enhance their existing Domino applications!We had several IBM champions, OpenNTF board members, and even the CTO of the great &lt;a href=&quot;;&gt;Multi-OS-Engine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If the crowd learnt about the technology, we learnt a lot about the use cases and how the platform could be used. Moreover, as Darwino is leveraging a lot of technologies, we figured out that we should make the tool installation more seamless, in particular regarding the required mobile SDKs. We are working hardly on this and we will provide a 1.6 release with even easier instructions.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;For this event, we produce 250+ slides that we made available today on SlideShare. If you missed the workshop and want to know more about Darwino, or if you were there and want to go back to the slides, here is the link:&lt;br /&gt;&lt;a href=&quot;;amp;q=darwino-workshop&quot;&gt;darwino-workshop&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We introduced a Slack channel ( where we can all collaborate together. Please, ask us to if you want to join.We also introduced a new tag, F4Domino, that I used in SlideShare and Twitter: it means &quot;Future For Domino&quot;, as this is exactly what Darwino provides to this platform and the community behind it. The life line for Domino customers and developers...&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Last but not least, I would like to thank you all the participants who made this event a success. We had a terrific time, during the workshop, but also afterwards when we shared some great German meals and beers. Thanks you also to IBM who hosted us these 3 days, and in particular Christian Holsing who made it possible.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;151&quot; src=&quot;; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Fri, 23 Sep 2016 00:40:00 +0000</pubDate><atom:updated>2016-09-22T17:50:24.317-07:00</atom:updated><title>When your Domino app meet the cloud, IBM Connections or Microsoft Azure!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I&#39;m proud to announce that we leveled off our support of cloud integration. In previous posts, I showed how you deploy an application to IBM BlueMix or Microsoft Azure. Now, not only you can deploy to these environments, but you can use their core services. In particular, you can seamlessly leverage their authentication capability and use their directory service.&lt;br /&gt;Before I go further into the technical details, let&#39;s watch the nice, short video recorded by our propaganda minister, Mr John Tripp:&amp;nbsp;&lt;a href=&quot;;amp;;&gt;Darwino Pluggable, Pervasive Authentication&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;;amp;;&gt;&lt;img border=&quot;0&quot; height=&quot;148&quot; src=&quot;; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;;amp;;&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Neat, right? With no coding, just a configuration change, one can switch from a local LDAP, form based authentication to cloud OAuth against IBM Connections cloud or Microsoft Azure Active Directory! Again, with no code change.&lt;br /&gt;&lt;br /&gt;To enable this magic, Darwino uses 2 main components&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;A user directory service.&lt;br /&gt;This service gives a generic access to all the directory functions: authentication, user data (profiles...), queries (user search, typeahead...) in a platform agnostic way. It can connect to virtually any directory, ranging from LDAP (Domino, Active Directory, Tivoli...) to IBM Connections or Microsoft Azure Active Directory (including the Azure Graph API). Plus it allows the extension of the user information through the use of data providers. For example, the user information can come from the Microsoft Graph API, extended with information coming from LinkedIn!&lt;br /&gt;All of this from a single, comprehensive &lt;a href=&quot; Service&quot;&gt;API&lt;/a&gt;. But even if the API is generic, you can still access some platform specific information like, for example, the &lt;a href=&quot;;&gt;IBM Connections profile payload as XML&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;A JEE filter that provides the authentication service to the application.&lt;br /&gt;This filter uses the current directory configuration to authenticate the user using the best method for a particular directory described above: Basic, Form, OAuth, SAML... Or just use what coming from the web application server (SPNEGO, WebSphere VMM...). Finally, the filter makes available a User object representing the current user, with all its attributes. As metioned earlier, the attributes can be an aggregation from multiple directories. Plus, it allows dynamic roles based on the current application and/or the current tenant.&lt;br /&gt;This object is user all over the platform for security purposes: access to service, database access control, workflow...&lt;/li&gt;&lt;/ul&gt;In conclusion, Darwino isolates you from the actual directories you want to use, by providing a consistent, generic API connecting to virtually any existing service, on the cloud or on-premises.&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;/ul&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Tue, 02 Aug 2016 18:02:00 +0000</pubDate><atom:updated>2016-08-02T11:02:04.010-07:00</atom:updated><title>Speaking Java at MWLUG this year!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I&#39;m honored that the &lt;a href=&quot;;&gt;MWLUG &lt;/a&gt;crew selected my session this year. Actually, when I look at all my talks in the past decade, they have been mostly product oriented, whenever it was for IBM or more recently for Triloggroup.&lt;br /&gt;&lt;br /&gt;But this one will be different. It is around using Java to write portable, high performance enterprise applications. I&#39;ll be first digging into the Java platform (languages, runtimes, compilers...) to understand what is the Java platform. Then I&#39;ll illustrate portable Java applications from real use cases using state of the art tools. I&#39;ll be targeting web, mobile and more generally IOT devices. If time permits, I might escape from the enterprise software and invade a little bit the consumer market.&lt;br /&gt;&lt;br /&gt;Java has been around for more than 20 years. During these years, it evolved a lot to match the new requirements, which makes it the #1 development platform.&lt;br /&gt;&lt;br /&gt;Let&#39;s have fun altogether @MWLUG!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;210&quot; src=&quot;; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>6</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Wed, 20 Jul 2016 22:05:00 +0000</pubDate><atom:updated>2016-07-20T15:05:18.561-07:00</atom:updated><title>Darwino, and Java applications, on Microsoft Azure!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In a prior blog post, I showed how we deployed a Java based application to IBM BlueMix. But as you may know, the&amp;nbsp;&lt;a href=&quot;;&gt;Darwino&lt;/a&gt;&amp;nbsp;platform is pervasive and can run applications on many different applications servers, while connecting to many different relational databases.&lt;br /&gt;So let&#39;s deploy a Darwino app to Azure, using TOMCAT and MS SQL Server.&lt;br /&gt;&lt;br /&gt;Similarly to IBM Bluemix, Microsoft offers an Eclipse plugins but, unfortunately, I cannot get it to work with large Eclipse Workspaces (see issue: &lt;a href=&quot;;&gt;;/a&gt;). Let&#39;s deploy the application manually, until this is fixed.&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;1- Create an account&lt;/h3&gt;My experience if you plan to keep your application running more than 30 days, then forget about the trial subscription. I initially used it but was not able to convert it to a pay-as-you-go subscription when the trial expired without involving Microsoft support. I gave up, deleted all the already deployed assets and redeployed them with the proper subscription...&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;2- Create your Java application&lt;/h3&gt;&lt;div&gt;For a basic WAR deployment, then simply create an app and use the application settings, as explained &lt;a href=&quot;;&gt;here&lt;/a&gt;. Once done, you have an empty web site at, that you can already try:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;232&quot; src=&quot;; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;3- Create a SQL Server database&lt;/h3&gt;&lt;div&gt;Microsoft Azure features the latest SQL Server 2016, including the new JSON capabilities.&lt;/div&gt;&lt;div&gt;A database in Azure requires 2 resources:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;A database server&lt;/li&gt;&lt;li&gt;A database instance, created within a server&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;The 2 resources can be created in a single step: when you create the database, it asks for a server or let you create one dynamically.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can test your new database from a remote machine using tools like &lt;a href=&quot;;&gt;DbVisualizer&lt;/a&gt;. To do so, you first need to enable access to your client IP address in the firewall. This is again an easy operation: from the database, click on the server URL then on Settings for the server and you have the firewall options. Finally, use the JDBC URL revealed by clicking &#39;Show database connection strings&#39;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;225&quot; src=&quot;; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;4- Accessing TOMCAT using FTP&lt;/h3&gt;&lt;div&gt;Contrary to IBM Bluemix, Azure let you access your VM through FTP, which is very convenient. The connection URL and the user are available in your application information panel.&lt;/div&gt;&lt;div&gt;Now, this deployment model only exposes by default the TOMCAT HOME directory via FTP. But this is enough for deploying a WAR, or consult the log files.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tip:a Darwino app is using some configuration files located outside of the WAR file. On Azure, we copy them to this home directory, and find the directory location in the code using:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;String tomcat8 = System.getenv(&quot;AZURE_TOMCAT8_HOME&quot;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;184&quot; src=&quot;; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;5- Deploy your WAR file&lt;/h3&gt;&lt;div&gt;Simply copy your WAR file to &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;/site/wwwroot/webapps&lt;/span&gt; and TOMCAT will automatically deploy it in a handful of seconds&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;146&quot; src=&quot;; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now it is ready!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you saw, deploying a Darwino application on Azure was easy. The whole steps took less than 15 mins. The Eclipse tools should make it even easier and faster, which will try when the bug mentioned earlier will be fixed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Similarly to IBM Bluemix, I would advise developers to develop using a local TOMCAT environment and then deploy the app to Azure when ready: the developer experience is far better this way.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>17</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Thu, 23 Jun 2016 13:53:00 +0000</pubDate><atom:updated>2016-06-23T06:53:31.819-07:00</atom:updated><title>M2e log while debugging Eclipse plug-ins</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;This post is targeting Eclipse plug-in developers..If you are creating Eclipse plug-ins and debugging them using the PDE, you might have seen that recently the console is full of garbage coming from m2e (Maven/Eclipse integration), like:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;2015-03-09 21:38:43,210 [Worker-17] INFO  o.e.m.c.i.l.LifecycleMappingFactory - Using org.eclipse.m2e.jdt.JarLifecycleMapping lifecycle mapping for MavenProject: com.darwino:dwo-jre-jdbc-pool-dbcp:0.0.1-SNAPSHOT @ C:\phildev\Workspace-luna\darwino-platform\darwino\parent-dwo-core\parent-dwo-jre\dwo-jre-jdbc-pool-dbcp\pom.xml.&lt;/span&gt;&lt;/blockquote&gt;That&#39;s makes the console unpractical, particularly because m2e is now bundled with Eclipse. You get your own log completely diluted within this debug information.&lt;br /&gt;I reported it to the m2e team a while ago, see:&amp;nbsp;&lt;a href=&quot;;&gt;;/a&gt;, where the issue was identified as an SLF4J configuration in Eclipse. But as of Mars 4.5.2, the problem still exists. So I took Igor&#39;s suggestion and added the following snippet to one of my plug-in Activator:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;public void start(BundleContext bundleContext) throws Exception {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;super.start(bundleContext);&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;// Activate m2e configuration to load the logging options&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small; white-space: pre;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;try {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;Bundle m2eLog = Platform.getBundle(&quot;org.eclipse.m2e.logback.configuration&quot;);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;if(m2eLog.getState()!=Bundle.ACTIVE) {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;m2eLog.start();&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;} catch(BundleException ex) {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;// Ok, might take too much time to start&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;That did the trick and I&#39;m no longer seeing the m2e log. So add that to your own plug-in, at least during debug, and your experience will be back to normal.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Tue, 17 May 2016 03:09:00 +0000</pubDate><atom:updated>2016-05-16T20:10:21.150-07:00</atom:updated><title>IBM Bluemix - Eclipse Developer Exprience</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I&#39;m an IDE guy, which means that I like to fill a dialog with some information and then some magic, that I understand, is done to achieve the desired results.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Recently, I wanted to deploy a demo app to IBM Bluemix. Of course, I quickly equipped my latest Eclipse environment with the Bluemix plugin and I have been able to get my app run on the cloud in a matter of minutes (&lt;a href=&quot;;&gt;;/a&gt;). I like the clean Eclipse Server integration. It basically works like your local Tomcat, but with a remote cloud server. Pretty cool!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But wait, this first attempt was really basic. Now I need to add features, connect to a directory, configure a set of things, add shared libraries that are not in the WARs.. Unfortunately, the Eclipse plugin does not let me act on the files that are not directly part of my web application. In particular, I cannot edit the server.xml file (the one carrying the configuration), nor I can add my own config files/libraries in the server directory. From the web UI, I can look at these deployed files, but cannot create/update/delete them. Gasp, not even an open FTP port for this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Does that mean that I should fall back to the command line tools and leave my beloved Eclipse environment? Well, no. There is actually a good IDE experience once you discover it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;1- The deployment options&lt;/h2&gt;&lt;div&gt;There are basically 3 options to deploy your code, see:&amp;nbsp;&lt;a href=&quot;;&gt;;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;The one that I initially used from Eclipse is the one picking up a set of default configuration properties, that you can barely change. Good for a first try, but not sufficient going forward.&lt;/li&gt;&lt;li&gt;The second one is about publishing a server directory to Bluemix. In Liberty&#39;s vocabulary, a server directory contains both your applications and the related config files (server.xml), but not the core Liberty&#39;s code. Moreover the same Liberty&#39;s installtion can have multiple server directories, thus launching multiple environments at the same time. Deploying such a directory to Bluemix is pretty easy, as you have to create a dir on your local file system, add your application(s), config files, and push id. Well, several manual steps to do, with potential error s (ex: server.xml content). See:&amp;nbsp;&lt;a href=&quot;;&gt;;/a&gt;.&lt;/li&gt;&lt;li&gt;The last option pushes the whole server to Bluemix, meaning the server code, the applications, and tutti quanti. This is called a packaged server, explained here:&amp;nbsp;&lt;a href=&quot;;&gt;;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Options 2. and 3. will certainly achieve what I&#39;m looking for, but the doc implies using the command line tools.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;2- Doing the job from Eclipse&lt;/h2&gt;&lt;div&gt;The Liberty runtime on Bluemix is actually just a regular WebSphere Liberty server. So the first thing to do is to install the WebSphere Developer Tools (&lt;a href=&quot;;&gt;;/a&gt;). Once done, create a server in the &quot;Servers&quot; view. Some of the steps are explained here:&amp;nbsp;&lt;a href=&quot;;&gt;;/a&gt;. It will seamlessly download the runtime and get your server ready to go. Finally, add your j2ee application to the server and it is ready to run, locally.&lt;/div&gt;&lt;div&gt;Because it is a local server, you can access and modify the server.xml file, add your own config files... In my case, I named my Liberty server &#39;dwodemo&#39; and I can access the local files in the following directory:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;134&quot; src=&quot;; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;BTW, I get &amp;nbsp;this directory location at runtime by calling&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;System.getProperty(&quot;server.config.dir&quot;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now comes the magic part. Once you have your application(s) deployed to that server, you can right click the server and package it for Bluemix (assuming you already created a Bluemix server entry):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;91&quot; src=&quot;; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After answering a few basic questions, a server package will be created for you and deployed to Bluemix. I got my app running pretty quickly without having to deal with the command line. Yes! Moreover, I can now change any of these files, and run this action again to update Bluemix.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Such a configuration, with a local Liberty server makes actually a lot of sense. First, because deploying an app to Bluemix (even just an update) takes time, while it is almost done instantly with a local server. The code/test developer experience is definitively a lot better with a local server. Then, if remote debugging works with Bluemix, this can also be a area of performance frustration... Keep it for when you have a problem on Bluemix that you cannot reproduce locally.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With this configuration in place, I&#39;m getting a good developer experience, with quick code/deploy/test cycles. IBM did a good job with the tools. I simply wish they made this information more prominent in the documentation. I had to read many articles and stack overflow Q&amp;amp;A to understand what I actually need to do. I would have loved a Bluemix tutorial &quot;Bluemix and Liberty for Tomcat developers&quot;, that goes beyond a simple WAR deployment, but talks about configuration, users, security, ...&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>5</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Fri, 13 May 2016 12:13:00 +0000</pubDate><atom:updated>2016-05-13T11:37:03.203-07:00</atom:updated><title>WebSphere servlet resources in your Connections 5.5 extension</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;If you&#39;re deploying an application that executes in the Connections 5.5 WebSphere server, then you may face this issue. Starting from version 3.0, a servlet container allows you to package resources (html, js, jsp...) within the application classpath, under META-INF/resources. Per the servlet spec, these resources can be located in jar files, deployed in WEB-INF/lib. We now heavily use this capability as our components are packaged as self-contained jar files, including both the java code and the web resources.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If this worked well in C4.5+, it stopped working with C5.5. Actually, the java classes from the custom jar files are properly loaded, but none of the embedded resources are served by the web server. After some investigation, we found out that the way the jar file is created makes it work or not. Precisely, if you create the jar from Eclipse (export...) then it does *not* work. Same if you package it using the Windows internal zip capability. If you recreate it using 7-zip, then it starts work... There must be some subtle internal differences between these compressors, and the new WebSphere seems to be very sensitive. If you have the issue, you now have a workaround :-).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem has been reported to IBM, with all the pieces to easily reproduce it. A PMR was created several weeks ago. But so far, no solution/fix has been provided. This is one of these cross organization problems where ICS argues that it is a WebSphere problem, while the WebSphere team doesn&#39;t show a lot of interests.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Mon, 11 Jan 2016 18:35:00 +0000</pubDate><atom:updated>2016-01-26T07:52:29.518-08:00</atom:updated><title>If your widgets no longer show up properly in Connections 5.5...</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;This happened to us as we are validating ProjExec with Connections 5.5. As a project is related to a community, we have community based widgets that render ProjExec data within the community. But, as of 5.5, our widgets did not display anymore in the middle column:&lt;br /&gt;&lt;div&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;But it works when being added to the right column. Damned, we didn&#39;t change anything, so it must be something introduced in C5.5. We looked at the existing IBM widgets definition and saw that they had a an attribute called &quot;themes&quot; that might be related:&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;lt;widgetDef defId=&quot;ImportantBookmarks&quot; description=&quot;importantBookmarksDescription&quot; modes=&quot;view&quot; &lt;span style=&quot;color: blue;&quot;&gt;themes=&quot;wpthemeNarrow wpthemeWide wpthemeThin wpthemeBanner&quot; &lt;/span&gt;uniqueInstance=&quot;true&quot; primaryWidget=&quot;false&quot;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We tried that on our own widgets and they now work as expected! This seems to be a new &quot;feature&quot; as it is not (yet) documented (&lt;a href=&quot;;&gt;;/a&gt;). On the other hand, the IBM portal documentation describes it (&lt;a href=&quot;;&gt;;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I submitted a PMR to at least get the documentation updated and, best scenario, maintain the backward compatibility when this attribute is not present. I&#39;m sure that our customers migrating to 5.5 will come to our support team with this issue.&lt;br /&gt;&lt;br /&gt;Update: Mikkel provided a detailled post on the subject:&amp;nbsp;&lt;a href=&quot;;&gt;;/a&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">,</guid><pubDate>Tue, 01 Dec 2015 23:49:00 +0000</pubDate><atom:updated>2016-01-11T12:32:10.482-08:00</atom:updated><title>The other side of the fence</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Here we are. I&#39;ve been recognized as an &lt;a href=&quot;;&gt;IBM Champion&lt;/a&gt; this year, which made me proud and honored! After spending almost 10 years as an IBM employee, now I&#39;m really on the other side :-)&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, I want to thank you everyone who nominated me. This is a true recognition for both myself and our company. Amazing that Triloggroup never had a champion so far, after 18+ years in business with so many IBM awards won!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second, this is an incentive for me to publish more going forward. As many of you already know, we are working on innovative pieces of software, that will definitively deserve a lot of sharing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px;&quot;&gt;&lt;div style=&quot;margin: 0px;&quot;&gt;Thanks again to all of you. 2015 is ending greatly, and 2016 is going to be an even better year!&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;119&quot; src=&quot;; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin: 0px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><link></link><author>[email protected] (Philippe Riand)</author><media:thumbnail xmlns:media="" url="" height="72" width="72"/><thr:total>1</thr:total></item></channel></rss>

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:

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