Showing posts from July, 2019

The Golden Jam of Web Stacks

Over the course of time my preferred tech stack for web development has changed. At one time it was Ruby on Rails with Heroku, then Firebase and React, then Polymer and lit-html. While all of these had their place and still work brilliantly, I have been able to fine tune my go-to technologies; simplifying development while also broadening capabilities. As I see it these are the major problems to solve in web development:
RenderingHostingSource controlContent managementBusiness logicData storageDelivery mechanism Every tech stack will need to have an answer for these problems. The set of technologies that I use falls under the JAMstack paradigm. Here they are listed in same order as the problems they solve: OrisonNetlifyGitHubContentfulNetlify functionsFirebase FirestoreSPA + PWA The beauty of JAMstack is that any one of these seven parts could be replaced by another technology which solves the same problem. On any given project I might use Gatsby instead of Orison, Firebase Hosting ins…

Redeeming the Time

I recently found myself giving time management advice. During this discussion the phrase, "reducing wasted time, redeeming necessary time" came up. I think this encapsulates the two main methods for increasing productivity. Some time syncs are simply wasteful while others are necessary and yet unproductive. In order to increase productivity wasted time needs to be reduced while necessary time syncs need to be redeemed.

However what is wasted time, or for that matter unredeemed time? Firstly, it assumes a goal. If time is wasted then there is an implicit assumption that it failed to do something. So in order for the concept of wasted time to be meaningful we need to have a plan, process, or goal that we are striving towards. When unplanned and unaccounted for interruptions break into those efforts, we can count that time as being wasted. However let's come down out of the theoretical clouds and talk about it with concrete examples.

The easiest example of wasted time are …

The Sales Pitch of Static Site Generation

I have recently developed a static site generator tool called Orison and for this reason among others I have been trying to "sell" people on static site generators; developers, architects, and non technical folks included. For many people the term "Static Site Generation" is synonymous with "small blog", "personal site", and "trivial use case" instead of phrases like "enterprise scale" and "unbeatable performance".

I am very thankful for everything that Netlify has done to popularize static site generation. However I wander if the naming of the term turns people away. In technical articles, presentations, blog posts, and in person discussion I often use the term "build tool", "build process" or something of that sort to describe the role that the static site generator plays in the JAMstack architecture.

I am curious as to what you have found. Is there a better term that I am missing? Should we in…

Using Async / Await with Callbacks

I recently ran into the problem of getting a promise interface working alongside a callback interface. Specifically I had an array of promises and wanted to iterate over the values with JavaScript's "forEach" method. As we will see this is problematic, however a solution is readily available. It took me a while to understand what was going on, but hopefully you can skip the pain that I had as I will explain it all here.
Disclaimer: The code in this blog post was reduced to highlight the source of the problem. This is not the best way to implement this functionality in JavaScript. It is instead meant to make the problem and resolution clear. A promise-less starting point I started with an array of values. I performed some logic on this array combining the values into one and then returned the result.

function getMovieNames(){let displayToUser ='';let movieNames =["Lord of the Rings","Band of Brothers","Interstellar"]; movieNames.for…

The Call in the Wind

At long last I have come to the end of the journey: writing my first novel. It was hard work. It never seemed to end even when the finish line appeared to be on the horizon. I am proud of it. I enjoyed reading it (at least the first five times...). Now it is ready for everyone else to read. You can buy it on Amazon. Here's the summary:

Scar, a young dwarf of the kingdom of Torvailon, rouses his friends to adventure. Traveling into the unknown lands of the east they find many dangers. Loken and Lestat are all too quick to take advantage of the dire straits of others in order to make a profit. However, when faced with their greatest challenge, will they stick to their course or heed the call to heroism?

AEM Content Fragments as an API

I just published "AEM Content Fragments as an API" to the ICF Next Engineering blog. In this blog post I create an API in Adobe Experience Manager that serves content fragment data which can be authored and managed by AEM users.

Google Calendar API Integration Made Easy

I recently struggled to integrate the Google Calendar API while trying to create an event listing for a website. In retrospect most of it should have been easy but there were a few tricky configurations that were required. I wanted to explain the ambiguities of what it can mean to integrate the Google Calendar API, share the steps I took, and provide a simple example use case.

The Google APIs have three methods of authentication: OAuth2, JWT, and a basic API key. OAuth2 is used for retrieving user data. In this setup the user logs in with their Google account and allows your app certain levels of access to their data.

However our goal is to connect to a Google calendar that is administered by the owner of the website so that they can display upcoming events on their site. For this we need one of the other options. The API Key option is simple but also less secure, and so Google limits which API's can use this authentication method.

This brings us to JWT, otherwise known as "

AEM Content Fragments in the Wild

I just published "AEM Content Fragments in the Wild" to the ICF Next Engineering blog. In this blog post I look into various ways of utilizing the Content Fragments feature of Adobe Experience Manager feature. Check it out!