|Latest 7 Posts
| Custom JSON Serialization With GSON|
Mon, Jan 23rd 2017 5
| Recapping 2016|
Mon, Jan 16th 2017 8
| Rebirth: An App of Ice and Fire|
Wed, Dec 14th 2016 9
| Scripting Server Upgrades|
Fri, Nov 11th 2016 6
| Everything Old is New Again|
Mon, Oct 24th 2016 9
| Git Squash|
Thu, Oct 20th 2016 6
| MWLUG Success|
Wed, Aug 24th 2016 7
| Building Java Objects From JSON|
Thu, Jan 22nd 2015 24
| IoT and Raspberry Pi|
Fri, May 20th 2016 11
| Enhanced Editors|
Fri, May 27th 2016 11
| Git History Searching|
Tue, Jul 12th 2016 10
| Notes in 9: Docker + SonarQube|
Wed, Feb 24th 2016 9
| Eric and the Quest for More Coffee, pt.2|
Fri, Jul 15th 2016 9
| Everything Old is New Again|
Mon, Oct 24th 2016 9
| Rebirth: An App of Ice and Fire|
Wed, Dec 14th 2016 9
| Redmine, CodeRay, and Domino, Oh My!|
Mon, Aug 11th 2014 8
| Source Control Thoughts|
Mon, Apr 4th 2016 8
||REST is Best
REST is Best
Recently I became a father. It’s pretty awesome. I’ve got a daughter who gives me some pretty good smiles and other funny faces, so I’ve always got some good motivation to go home at the end of the day. This also means I’ve gone through some birthing classes in recent history. So consider this post’s title to be a play on words, regarding the interpretation of infant feeding. You know, the old adage of “<piece of mammalian anatomy that rhymes with REST> is best” (unless contraindicated by medical or other conditions).
Why is AJAX Not Good Enough?
My last post, How to Bore Your Audience, spent a bit of time on the “big picture”, for the structure of modern and awesome XPage applications. It also outlined my general distaste for overly large AJAX calls (specifically dojo xhrPost) when a simpler method (at least an xhrGet) would suffice. AJAX can return JSON data, though it is, by default, Asynchronous JS and XML. So what AJAX really is, if we’re data format agnostic, is really just a programmatic network call to return a data payload of something.
XPages does this by that dojo xhrPost call to call out where (the partialRefresh id) to inject/replace the newly returned data. This happens to be (usually) HTML, a Dojo data store (in the event of an xp:restService control, depending on your properties), and more (like if you refresh an xp:scriptBlock). This works, but when you keep your application logic on the server (and I suggest you do), that means you’re often sending increasing amounts of information back and forth, in a partial(Refresh) capacity.
REST is Lean
Having recently read Paul Akers’ book, 2 Second Lean, and having seen him speak in-person, I can honestly say that when I look at a process, I think “I see waste” and I want to eliminate it. This is a part of what we do as developers, and I’m sure is intuitive to you, but we must always strive for the path of least resistance in our applications. It makes for better application structure and better user experiences.
Let’s compare a simple thing in XPages. Using the stock xp:viewPanel, xp:pager, with the partialRefresh option, this is a fairly normal way for an XPage developer to put a View into an XPage. This is also my hallmark argument against this variety of implementation, for such a simple task. Here’s what happens when I hit “Next” in the pager:
When we execute these AJAX calls, it takes time and processing effort (both for the server and the client/browser). Here’s what I mean:
The above doesn’t show a whole lot of time elapsing, only about 38ms. It also shows a hover state being fetched; I didn’t even plan on that (and is an argument against Dojo, IMO; I mean, lazy loading images for button styles?!?). I can also tell you that that server is having a good day and isn’t refreshing anything more than the xp:viewPanel for this page (so less intense computations). The application above has been re-developed, as a case study (with which I’ve been able to sell to my management and direct my development efforts accordingly), into a Bootstrap 3 with AngularJS application. Here’s what happens when I perform the same paging task in the Angular version of this app. Apologies for the reduction in quality with the gif and redaction of company-specific information.
No network requests during paging, it’s that cool. What’s happening? It’s behaving as a modern web application; a single page app, in fact, but I’ll get to some of those specifics in a moment. Here’s the same page again, with live full-text searching, across all fields (keys, as in JSON key: value pair, you can also filter by key) in the data array.
SPAs and Application Structure
You knew I was going to bring up application structure, didn’t you? The dichotomy of the server-side application logic and the client-side application logic must be apparent now. It’s precisely why, when Mark Roden gave his Write Once, Run Anywhere: Angular.js in XPages session at MWLUG, he admitted (begrudgingly, I might add) that to properly build a larger application, a developer would want to enforce application and work flow validation on the server; aka- “everybody needs a Toby”. This would be done by writing a custom servlet or REST implementation, which would validate before directly committing into a Domino document. If your application is simple and your field data is strictly textual and you trust your users to not put bogus data into their network POST or PUT operations, DDS is great.
Domino Data Services
This is the biggest downside of the Domino Data Service in my opinion. The Domino Data Service gives us the ability to perform the CRUD operations against Domino Documents and Views, but there’s no computeWithForm, which would give us as least a way of invoking an agent on save. But, it’s better than nothing. So, would a developer benefit from structuring their application with data models and controller classes? Absolutely! In fact, you might think there was a reason I wrote that long winded post last before this one ;-).
As you can see, M-V-C is a thing. It’s great idea for your server-side application logic and there are a great many awesome M-V-C client-side frameworks (like Angular) that can help you expedite your front-end logic. So please, let’s build better apps. REST can get us there with lighter weight network requests and in-browser processing of data and application logic. We can reduce our network calls, sizes of data transferred, and made our performance response time nearly negligible (limited only to the time it takes the client-side JS code to perform the rebuild of the HTML and the initial page load).
No silly Keanu, it just might keep us sane.
Sep 17, 2014
| Recent Blog Posts
Custom JSON Serialization With GSON|
Mon, Jan 23rd 2017 2:00p Eric McCormick
Mon, Jan 16th 2017 3:00p Eric McCormick
Per usual, I’ve had a little break between things and decided to catch up with a bit of a summary of some recent things that each didn’t necessitate their own post.
2017 IBM Champion
For starters, I’m honored to be named an IBM Champion in Collaboration Solutions (/ Social Business) for the third time. This would be a hat trick in (ice) hockey 🏒. I’m happy to be recognized with a group of people, developers and more, who are passionate about both their work and the plat
Rebirth: An App of Ice and Fire|
Wed, Dec 14th 2016 4:00p Eric McCormick
If you read my blog for any of the Saga of Servlets series, then I hope that you’re excited I’m returning to the application I put together for it. This time, it’s as a conversation piece in regards to some of the build process modernization I engaged in recently, in order to unify the code base in its git repository. In any case, it’s helping pave the way forward before I update some of the back-end elements, when it will again be a talking point for some additional rework and
Scripting Server Upgrades|
Fri, Nov 11th 2016 2:00p Eric McCormick
This one might be slight departure from my usual, but those that have followed my blogging this past year will have noticed a bit more of a leaning towards DevOps in some of my posts. This echoes a lot of what I’ve been concluding as increasingly a necessary part of development; that we need to consider a picture large enough to encompass the themes surrounding development functions and, like any good developer (DRY ~= “lazy”), automate the heck out of it.
I had p
Everything Old is New Again|
Mon, Oct 24th 2016 8:00p Eric McCormick
Every so often, it’s good to reassess one’s position. This is good from both a standpoint of being inquisitive and even interrogative, but when it comes to the ever changing landscape of the front-end development space, it’s not only inevitable, but must be embraced for what feels the need to “stay afloat”. I’m changing theme of my blog, hopefully for the better. The previous theme was good and did a great job of getting things started, but while I had forked a copy of a good
Thu, Oct 20th 2016 8:00a Eric McCormick
If you’re just here to learn a little about how to “squash” commits with git, skip down a ways. Otherwise, hold on, and I will catch you up on a couple of personal notes before we get there.
On the Blog
It’s been a little while since I blogged last. This has been due to a combination of reasons; specifically, I’ve been busy with:
my family, it was the end of summer with lots of things going on
a number of projects around the house (a deck removal and basement remodel
Wed, Aug 24th 2016 8:37a Eric McCormick
MWLUG was a great success as far as I’m concerned. Each time I’ve gone I’ve had the great enjoyment of being able to attend some high quality sessions, meet with lots of colleagues and friends from the community, and get a view into products and solutions many people are undertaking, over conversations and interactions outside of the sessions. This is always a great way of interacting with others who were able to make it. Unlike the IBM conference of Connect(EDsphere), this is purel
Manually Renewing HTTPS w/ Let's Encrypt|
Wed, Jul 27th 2016 10:40a Eric McCormick
A while back, I rolled a personal project, which is a Node app, to Bluemix for lightweight use. I managed to make use of Let’s Encrypt for the HTTPS certificate, but only after realizing that there was a bit of a manual aspect to it that is the antithesis of an automated script for such things. Ultimately, after finding some information in a blog post form Marky Roden (of all people), I was able to get moving. The only downside wound up being that time passed, and it came time to renew
Eric and the Quest for More Coffee, pt.2|
Fri, Jul 15th 2016 4:17p Eric McCormick
Posted in the “aside” category.
There were three submissions via the Google Form, and a couple more form messages via social media. Honestly, I had debated either a nondescript or far more overt mug w/ the likeness of one of the more iconic of H.P. Lovecraft’s imaginations, but this seemed a bit over the top.
a replacement for my alma matter
a Go Army, Beat Navy mug (which was never my thing)
this gem from shop.Scotch.io (again, pretty overt)
Git History Searching|
Tue, Jul 12th 2016 10:00a Eric McCormick
First, A Shout-Out
The recording of the session called “Normalizing XPages Web Development” that Shean P. McManus and I gave at the 2-day, virtual ICONUS (formerly IamLUG) event this year is now available from “Archive and Replays”. If you missed it, I recommend checking it out, it’s a great benefit of ICONUS and I hope that those who did get a chance to attend enjoyed the subject material. We covered a lot of ground and were able to demonstrate what is, in my opinion, one of the grea