<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Liquid Electron]]></title><description><![CDATA[Technology, software development, and whatever else crosses my mind]]></description><link>https://www.liquidelectron.com/</link><image><url>https://www.liquidelectron.com/favicon.png</url><title>Liquid Electron</title><link>https://www.liquidelectron.com/</link></image><generator>Ghost 1.14</generator><lastBuildDate>Tue, 28 Apr 2026 14:11:59 GMT</lastBuildDate><atom:link href="https://www.liquidelectron.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Time to Go the Distance]]></title><description><![CDATA[<div class="kg-card-markdown"><p><em><strong>Bottom-Line-Up-Front</strong>: <a href="https://packt.link/Josh">Going the Distance with Babylon.js</a> is the name of the book I've been working on, available for pre-order now. The book is aimed at beginner to higher-level intermediate developers, is being reviewed by members of the BJS team, and will demonstrate how to build a simulation-game hosted within</em></p></div>]]></description><link>https://www.liquidelectron.com/going-the-distance-book/</link><guid isPermaLink="false">62cb1a2ca43dcf00e31f3025</guid><category><![CDATA[game-development]]></category><category><![CDATA[code]]></category><category><![CDATA[book]]></category><category><![CDATA[announcements]]></category><category><![CDATA[babylon.js]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Thu, 14 Jul 2022 02:51:48 GMT</pubDate><media:content url="https://www.liquidelectron.com/content/images/2022/07/cover-image.jpeg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://www.liquidelectron.com/content/images/2022/07/cover-image.jpeg" alt="Time to Go the Distance"><p><em><strong>Bottom-Line-Up-Front</strong>: <a href="https://packt.link/Josh">Going the Distance with Babylon.js</a> is the name of the book I've been working on, available for pre-order now. The book is aimed at beginner to higher-level intermediate developers, is being reviewed by members of the BJS team, and will demonstrate how to build a simulation-game hosted within a web application that can be installed and published to app stores.</em></p>
<h2 id="popquizdoyouconsideranyofthefollowingtoapplytoyourself">Pop Quiz: Do you consider any of the following to apply to yourself?</h2>
<ol>
<li>You are a designer of some variety or another interested in learning how to create your own 3D applications</li>
<li>Web Development and JavaScript have been your jam but you want to take your skills up to the next level and dabble with 3D</li>
<li>Being familiar with game engines like Unity, Unreal, Godot, etc., you are interested in taking your content to the web using JavaScript</li>
<li>3D stuff looks super cool - what's going on and how do I get in on that?</li>
<li>I'm a bit intimidated by how complex 3D programming seems to be but I'm willing to learn if I can get a helping hand</li>
</ol>
<h2 id="congratulationstheressomethingforeveryone">Congratulations, there's something for everyone!</h2>
<p><a href="https://babylonjs.com">Babylon.js</a> is an Free-and-Open-Source JavaScript library which provides an elegant, cross-browser (and cross-platform!) wrapper around the WebGL and newer WebGPU API's. In addition, BJS exposes cutting-edge browser capabilities such as WebXR, a standard used for writing web-based VR and AR applications. Just because it's cutting edge tech doesn't mean you have to bleed for it. The Babylon.js team is fanatically committed to maintaining backwards compatibility, meaning that code written for BJS 5.0 will still run (with perhaps minor tweaks) on BJS 7.0, whenever that may happen!</p>
<p>All of these are cool bits of info to know, but where this applies to me (and presumably yourself, since you're reading this) is that after using BJS for fun and games for a bit I started thinking about how I might be able to participate and contribute back to a community that is so incredibly supportive, passionate, and talented. While I am passionate about technology and things like BJS, I sure don't have the talent! Maybe there was something I could to in the way of helping to support others who actually do have the talent for these kinds of things...</p>
<p>A series of events related to this noodle about contributing to Babylon.js happened in the Summer of 2020 that have ultimately led to this post and everything contained herein. For the past year and a half or so, I've been working on this, and I've really been excited to share with the community. There's just so much work that needs/is still needed to be done, and it's never going to live up to my impossible standards, and that's just one reason why it's a good time to get this out into the open! Some folks [<em>Ed: really, anyone following me on Twitter</em>] are already aware of at least some of the machinations and rumblings going down with this project, and others may merely have suspected. Today however it's finally time to bring everything out into the open with a good old fashioned Book Announcement!</p>
<p><img src="https://www.liquidelectron.com/content/images/2022/07/cover-image-1.jpeg" alt="Time to Go the Distance"></p>
<h2 id="preordernow"><a href="https://www.amazon.com/dp/B09ZBB2Q1H/">Pre-Order Now</a></h2>
<p>Through 14 chapters in three separate sections, the book will take readers on an end-to-end journey of building an entire application - a video game - from start to finish. Starting with a BJS refresher and ramp-up and continuing on from how to set up WebPack to handling input, managing state, writing shaders, and packaging into a Progressive Web App (among other topics). Although the Amazon listing currently lists a publication date in October, I can assure folks that it will most certainly be done before that time - I'm expecting a July or August at the latest date for its' availability.</p>
<p><a href="https://dev.space-truckers.com">Space-Truckers: The Video Game!</a> is currently in a sort of final preview stage in preparation for this weeks' <em>hush hush</em> thing <em>hush</em> <em>hush</em>. The game itself is Open-Sourced with the repository being available <a href="https://github.com/jelster/space-truckers">here</a> with the intention of serving as a BabylonJS reference/full stack testing architecture - in addition to hopefully giving a smidge of enjoyable experiences.</p>
<p>That's where you all come in! There are a whole swathe of GitHub <a href="https://github.com/jelster/space-truckers/issues">issues</a> in the Space-Truckers repository that are both awaiting creation and/or awaiting someone to come along and fix/build them. If you've been wanting to contribute to the BJS v5.0 launch event here's your opportunity!</p>
<p><img src="https://www.liquidelectron.com/content/images/2022/07/ui-selection-icon.PNG" alt="Time to Go the Distance"></p>
</div>]]></content:encoded></item><item><title><![CDATA[A Tale of Two Timelines]]></title><description><![CDATA[In June of 2022 I was asked to give a talk at the New York Augmented Reality meetup. Here are my remarks as originally prepared, lightly edited]]></description><link>https://www.liquidelectron.com/a-tale-of-two-timelines/</link><guid isPermaLink="false">62c63a28a43dcf00e31f301e</guid><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Thu, 07 Jul 2022 02:31:09 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p><em>(Note: In June of 2022 I was asked to give a brief talk on my upcoming book and also about WebXR to the New York Augmented Reality (NYAR) meetup group. Here are my remarks as originally prepared, lightly edited. This post will be updated when a recording of the event is made available)</em></p>
<p><em>07-Jul-2022 Update: Video of the event has been posted! View the full talk <a href="https://www.youtube.com/watch?v=-myzdUZzNsc">here</a> (I start at the 37:00 mark or so) or via the below embed.</em></p>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/-myzdUZzNsc?start=2248" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<hr>
<p>Tech is a funny business to be in - you never really know when something will come around that upends everything. Most progress in tech is far more evolutionary than revolutionary but despite that I suppose it's part of human nature that we tend to focus on flashy large changes than we do for a gradual but steady ones.</p>
<p>This is a tale of two timelines. Like any good story involving a multiverse, our shared universe diverges from the other at a specific point in time. No, Steve Jobs doesn't survive in either timeline, but our tale does involve his legacy in a non-trivial way.</p>
<p>The year is 2017, and Apple is one of the most successful corporations in history. Their market share in the US smartphone market exceeds 60%, giving Apple a huge amount of influence when it comes to setting standards in the like. The AppStore is the only real way to distribute applications on iOS that make use of any native hardware functionality. At this time as well, There was growing demand in the market for augmented reality applications at a consumer level. Previous effort at marketing dedicated AR hardware devices largely had failed over the preceding half decade or so (anyone remember glass?) with the somewhat notable exception of Microsoft HoloLens that has made a name for itself in the commercial and industrial sectors. Rumors of Apple working on their own set of AR hardware have been abounding for only slightly less longer than the iPhone has been in existence. Indeed, <a href="https://arstechnica.com/gadgets/2022/06/apples-ar-vr-headset-will-arrive-in-january-2023-analyst-projects/">a recent Ars Technica article</a> puts their availability at sometime in 2023, allegedly. Hold on to that thought for a minute while we continue to explore that long lost pre COVID past era known as 2017.</p>
<h2 id="intheyear2017">In the Year 2017</h2>
<p>It was obvious to everyone in the tech industry that augmented reality was going to be big, And it wasn't unexpected. It's not like the sci-fi authors and video games and films of the previous decades hadn't been preparing the public for some form of augmented reality for a long time , it's more that the combination of hardware software and bandwidth hadn't yet been available at a consumer level. There are many different ways to define augmented realit and many different approaches. When I talk about augmented reality here I'm referring to the more colloquial generic catch-all term for it that encompasses everything from Garage Band's face-controlled Wah pedals all the way to turning a living room table into <em>The Cones of Dunshire</em>.</p>
<p>Now, love it or hate it , Apple's App Store is a walled off garden that is extremely effective at giving Apple control over what developers can publish on their platform. Smartphones were and still remain an obvious platform for targeting AR applications and it was also obvious that the best vendor agnostic way of putting the smartphone into that role would be via the web browser.</p>
<p>That’s on the entire opposite end of the spectrum from WebXR. WebXR is the resulting web standard that establishes browser API’s relevant to both VR and AR applications - open by nature, and despite this seeming contradictory interest (or perhaps, the cynic says, because of that contradictory interest), Apple and its Webkit engine joined the WebXR consortium as one of its founding members. They, along with Google, Microsoft, Mozilla, Samsung, (then) Facebook and others, have the goal of lowering the cost of entry and maintenance for developers as an end to the means of the primary goal of making it possible for web applications to access device hardware.</p>
<p>At the same time WebXR was launching, Apple launched its’ own proprietary closed-source ARKit that provides developers powerful API’s that can drive cutting-edge AR apps from the latest and greatest hardware – Apple’s of course.</p>
<h2 id="arealitydisjunction">A Reality Disjunction</h2>
<ul>
<li>What if ARKit released with WebXR support?</li>
<li>How much richer would the AR ecosystem be if it were?</li>
</ul>
<p>The launch of WebXR in 2018 is it – this is our disjunction of realities. In our timeline, WebXR has evolved and grown as a standard along with all of its’ members save Apple, who has yet to support WebXR in its’ iOS WebKit engine. It should be a refresher for most that WebKit is the underlying rendering engine that Apple’s walled ecosystem requires browser vendors to use on iOS, with all the implications that entails.</p>
<p>If Apple had been truly dedicated to implementing the WebXR standard, then WebKit today would have more than just do-nothing feature toggles. In our sibling reality though, Apple worked to release an ARKit-to-WebXR interface. In this other reality, AR applications have flourished in the intervening years, to the point where AR applications have become a standard “table stakes” feature for that any retailer selling physical goods offers as part of their online shopping experiences.</p>
<p>Customers are happy to browse, shop, and ultimately purchase from multiple outlets without having to download, install, and setup multiple different smartphone apps from their App Store – all they launch is a URL. Museums, Artistic installations, and memorials are able to provide high-quality AR-based experiences over the web that reach almost everyone with a smartphone capable of it, and which gracefully degrade when viewed by those which aren’t.</p>
<p>Theatrical performances and Operas provide live translation and captioning services for attendees who need assistance – or who just want a different view of the action – without needing to allocate large portions of already-tight budgets to a new technology with uneven adoption. Whatever else has gone on differently bad or good in our worlds, in that timeline there has been much greater progress with Augmented Reality than in ours.</p>
<p>Obviously, things didn’t quite turn out that way in our timeline. Apple’s ARKit, instead of being used to forge a bridge to the walled-off iOS hardware, has instead been a lever to keep applications and the users who use them on Apple hardware.</p>
<p>It’s completely understandable why Apple would see it as being in their best interests to slow-walk WebXR. Their rival, really their only real competitor in the smartphone and tablet market, is Google and their Android OS, and if their view is zero-sum, then a gain for the web (which de facto is controlled in this context by Chromium and thereby Google, to a large extent) is a loss for Apple.</p>
<h2 id="thedarkesttimeline">The Darkest Timeline?</h2>
<ul>
<li><a href="https://webkit.org/status/#specification-webxr">Many core pieces of functionality haven’t been started in WebKit to support WebXR on iOS</a></li>
<li><a href="https://bugs.webkit.org/show_bug.cgi?id=208988">iOS WebKit isn’t likely to support WebXR any time soon</a></li>
<li><a href="https://arstechnica.com/gadgets/2022/06/apples-ar-vr-headset-will-arrive-in-january-2023-analyst-projects/">Apple’s AR headset might be available to purchase in 2023</a></li>
</ul>
<p>I should take a moment to caveat my words a bit here, both for the sake of legal liability but also for full honesty. A lot of what you’re hearing has been logical speculation, inferred conclusions gleaned from existing facts. The alternate timeline projection of course, is an entirely made-up projection on my part, part aspirational and partly logical anticipation.</p>
<p>I cannot of course speak to Apple’s actual motives, only attempt to outline what can be observed from their actions. Here the evidence of Apple’s action – or rather, lack of it – comes from the WebKit project’s publicly searchable bug tracker. The meta-issue tracking WebXR work shows that only one actual work ticket remains, a ticket to enable cross-platform tests for WebXR on iOS. It’s unclear why or when this will change, but some further digging illuminates some potential explanations that aren’t directly documented.</p>
<p>A search for WebXR in the issue tracker turns up a few issues which weren’t linked to or included in the meta-issue tracking WebXR features. What caught my eye was this feature: <a href="https://bugs.webkit.org/show_bug.cgi?id=229752">Bug 229752 - [WebXR] Support Raw Camera Access in WebXR</a></p>
<p>This ticket is still in the NEW status despite being open for the better part of a year, indicating that work hasn’t yet commenced or begun planning on it. Pretty much any meaningful AR-related is impacted by this, which is why I predict that WebKit will not get WebXR support in 2022, and probably not even in 2023.</p>
<p>This is all a real bummer, and I’ll bet the organizers (Hi Andy!) are questioning their decision to invite me here to speak.</p>
<p>Hear me out though, please.</p>
<h2 id="thereslightattheendofthetunnel">There's Light at the End of the Tunnel</h2>
<p>Every journey has its’ dark hours and it has its’ light ones. This story, this tale of two timelines doesn’t end here, tonight, with this event. This isn’t even the middle of the story!</p>
<p>This is just the beginning of the story, because the darkness has to have somewhere to go when chased out by the light of dawn – or something suitably inspiring that you’d read on a poster somewhere. There are some amazing tools and frameworks being worked on by a lot of incredibly talented people all working towards the goal of making 3D a first-class citizen of the web, no matter how it’s used or experienced. Babylon.js and the Babylon Native (inc. Babylon React Native) toolset collection provide a rock-solid foundation amidst the roiling sea of constantly evolving standards that allow you to create a cross-platform, web first experience that can even target iOS, although of course publishing to the App Store is still a requirement.</p>
<p>My book, <em>Going the Distance with Babylon.js</em>, isn’t centered around how to build an AR application, it’s focus is on giving readers the knowledge and learning tools needed to build <em>any</em> type of 3D web application experience – and that can include AR with WebXR. Space-Truckers is the game you’ll learn about building in the book, but as an Open Source Project, it stands by itself as a reference repository of in vivo tools and techniques for building, maintaining, and extending quality 3D content.</p>
<p>Thank you to the NYAR organizers (Andy, and co) for inviting me here to speak, it’s an honor to have the chance to share my work with you all and I look forward to answering your questions!</p>
<h2 id="links">Links</h2>
<ul>
<li>Pre-Order my book on AMZN: <a href="https://www.amazon.com/dp/B09ZBB2Q1H">https://www.amazon.com/dp/B09ZBB2Q1H</a></li>
<li>Follow me on Twitter: <a href="https://twitter.com/liquid_electron">https://twitter.com/liquid_electron</a></li>
<li>(sorry, I don’t do FB or IG)</li>
<li>LinkedIn: <a href="https://www.linkedin.com/in/josh-elster/">https://www.linkedin.com/in/josh-elster/</a></li>
<li>Babylon.js: <a href="https://babylonjs.com">https://babylonjs.com</a></li>
<li>Space-Truckers: <a href="https://github.com/jelster/space-truckers">https://github.com/jelster/space-truckers</a></li>
<li>Sign up for NYAR's next meetup: <a href="https://www.meetup.com/new-york-augmented-reality">https://www.meetup.com/new-york-augmented-reality</a></li>
</ul>
</div>]]></content:encoded></item><item><title><![CDATA[Building a Paul Sellers style Workbench]]></title><description><![CDATA[<div class="kg-card-markdown"><h2 id="whydothis">Why Do This?</h2>
<p>A couple of years ago, I took up woodworking as a side hobby. There are a number of reasons that I decided to focus primarily on hand tools instead of power tools, but one reason is that hand tools require a two-way communication between the artificer and</p></div>]]></description><link>https://www.liquidelectron.com/my-paul-sellers-style-workbench/</link><guid isPermaLink="false">5fe8e05438b42c00454078f0</guid><category><![CDATA[woodworking]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Sun, 27 Dec 2020 21:47:03 GMT</pubDate><media:content url="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1779-1.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><h2 id="whydothis">Why Do This?</h2>
<img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1779-1.jpg" alt="Building a Paul Sellers style Workbench"><p>A couple of years ago, I took up woodworking as a side hobby. There are a number of reasons that I decided to focus primarily on hand tools instead of power tools, but one reason is that hand tools require a two-way communication between the artificer and artifact. There's no brute-forcing the wood to your whims, it'll either break on you or laugh in the face of your flailing efforts. Paying attention to the direction of the grain, feeling the scraping vibration of a plane's blade across a face, taking in the tones coming from the interface between metal tool and wood piece are all ways of listening to the material. It doesn't hurt either that it's a good excuse to be and stay physically active!</p>
<p><img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1719.jpg" alt="Building a Paul Sellers style Workbench"></p>
<p>Until I'd started down this path, it had been a long time since the last time I'd really done any serious wood or carpentry work. There's so much to explore and learn, but where to start?</p>
<h2 id="watchingandlearning">Watching and Learning</h2>
<p>It shouldn't surprise anyone reading this that YouTube was a great resource. In particular, YouTube was the gateway for me to discover the work of <a href="///paulsellers.com">Paul Sellers</a>. Mr. Sellers describes himself as a &quot;Lifestyle Woodworker&quot;, but that's not really an accurate nor complete description of the man. <img src="//paulsellers.com/wp-content/uploads/2019/04/Paul-Portrait-Feb-2019-1200x1500.jpg" alt="Building a Paul Sellers style Workbench"><br>
With a gentle voice and with a soft-spoken tendency, Sellers positively radiates passion and enthusiasm for not just his craft, but for sharing it with the world. His YouTube channel is an incredible fount of woodworking knowledge - much of which is increasingly difficult to discover anywhere else. To avoid making this entire post about Mr. Sellers, I'll complete the establishment of his <em>bona fides</em> by noting that his work has been includes a White House commission from President Obama for the Cabinet Room, so I think it's safe to say this guy knows his stuff.</p>
<p><img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1738.jpg" alt="Building a Paul Sellers style Workbench"></p>
<h2 id="garageworkshopwoes">Garage Workshop Woes</h2>
<p>Back home in my much more mundane tale, I was starting to build out my tiny little garage workspace when I realized that I was in dire need of a stable work surface - a workbench. I had picked up a cheap portable contractors' workbench from my local hardware store, but it wasn't built for the things I needed it to do and it was clear that if I wanted to get serious about using hand tools I would need a better work surface. I had been watching Sellers' <a href="https://www.youtube.com/playlist?list=PLqyeNiM0BJuWNDgY1FpyxjveO2Y90CvD9">How to Make a Workbench</a> video series and I felt inspired by him - I could do this!<br>
<img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1742.jpg" alt="Building a Paul Sellers style Workbench"><br>
Except... I couldn't, really. While I never really doubted that I could <em>eventually</em> build the workbench I wanted, one thing became apparent that first summer: I needed to do some serious levelling up before I would be ready to take on this project. Summer gave way to Fall and Winter, then back into another yearly cycle of seasons as I practiced and learned.<br>
<img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1744.jpg" alt="Building a Paul Sellers style Workbench"></p>
<h2 id="theprojectbeginsinearnest">The Project Begins in Earnest</h2>
<p>Coming up on this past Summer and Fall of 2020, I had had a very productive Spring, and was feeling confident enough that I wanted to try again to build this workbench. Why was I so confident? It wasn't because I felt my skills were superior to the task, it was because I was going to build it as part of a class taught by the great folks at the <a href="//www.rebuildingexchange.org/">Rebuilding Exchange</a>! The access to material, tools, and knowledgeable instructors offered by their their classes are perfectly justifiable reasons to be feeling optimistic. Fortunately though, my initial, pie-in-the-sky optimism was quickly given a well-needed dose of reality.<br>
<img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1747.jpg" alt="Building a Paul Sellers style Workbench"></p>
<h2 id="realitycheck">Reality Check</h2>
<p>As I started communicating my plans and ideas to the instructor, it became apparent that I hadn't thought through a great many aspects of the design and construction process. It was clear that there wouldn't be nearly enough class time to complete the work needed. I needed to split up the work - minding dependencies and priorities - to make best use of my class time in the shop. This was one of the areas I actually felt well equipped to handle - a lifetime of Civ games along with a professional career involving resource allocation and scheduling was finally of some practical use in the world! I came up with a work plan that fit the schedule and went to work. In addition to that, I found the choice of wood (Cedar) tended to splinter and crack very easily if care wasn't taken (guess how that was discovered?). Practical concerns like this weren't always avoidable since I had to work with what I had, but neither was that an excuse for recklessness.<br>
<img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1748.jpg" alt="Building a Paul Sellers style Workbench"><br>
This was one of the parts of the process where I learned some very key lessons, made possible by the excellent teaching staff in my class. There was technical learning on how to use tools, techniques, etc. I learned how to the understand - and accept - that you are going to make mistakes, and that it is okay - anything is fixable. Understanding that sometimes the best way to fix a mistake is to do nothing and accept that it happened. <em>[NB: This may sound familiar to any tech folks out there in the audience.]</em><br>
<img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1749.jpg" alt="Building a Paul Sellers style Workbench"></p>
<h2 id="learninghowtochange">Learning How to Change</h2>
<p>Ironically, the lesson that stands out the most to me from the experience has nothing to do really with woodworking. Being unfamiliar with the workbench plans, there was resistance to the design from the teaching staff. For example, one area of pushback was for wanting to form the benchtop by laminating the wide faces together. The reasoning behind the resistance was understandable, but I knew that this was something I couldn't change if I wanted to achieve my vision of a Paul Sellers-style workbench. Without the contrast of this with later compromises made in construction, I wouldn't have had the perspective to know <em>not</em> to push back at proposed changes.<br>
<img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1765.jpg" alt="Building a Paul Sellers style Workbench"></p>
<h2 id="someassemblyrequired">Some Assembly Required</h2>
<p>After weeks of labor, dozens of hours of reviewing YouTube videos, countless splinters, and at least a few cuts, the workbench was finally completed. In the final reckoning, I  constructed the workbench top, the wellboard, and the two side aprons in my class, building the legs and performing assembly and finishing in my garage workshop. Although it can be disassembled with a few bolts and screws, the castors I installed in the legs have so far precluded the need to do so. After installation of a 9&quot; Yost woodworking vise, I gave it a new set of extension panels and leather cover, turning it into an 11&quot; vise. A few coats of clear water-based polyacrylic finish for protection and that was that.<br>
<img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1773.jpg" alt="Building a Paul Sellers style Workbench"></p>
<h2 id="finalthoughts">Final Thoughts</h2>
<p>I'm incredibly happy with how the workbench turned out. It has its imperfections - like anything in this world - but as I run my fingers over the scarred but smooth surface of the benchtop, I recall (now with fondness) each individual struggle those marks represent. There are so many things that I look forward to doing better (or simply differently) the next time I build this bench or really anything involving similar techniques, it just illustrates how far I've come along the way to making it.<br>
<img src="https://www.liquidelectron.com/content/images/2020/12/jelster-workbench-construction-1779.jpg" alt="Building a Paul Sellers style Workbench"></p>
<p>I hope you've enjoyed reading this along with the pictures of the workbench's construction. It's taken a couple of years, but I can finally and at long last say it:</p>
<h1 id="ididit">I DID IT!</h1>
<p><img src="https://images.unsplash.com/photo-1436076863939-06870fe779c2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MXwxMTc3M3wwfDF8c2VhcmNofDd8fHlheXxlbnwwfHx8&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080" alt="Building a Paul Sellers style Workbench"><br>
<small>Photo by <a href="https://unsplash.com/@wilstewart3?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Wil Stewart</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a></small></p>
</div>]]></content:encoded></item><item><title><![CDATA[Gravitational Intuition]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Is <strong>not</strong> the name of my Stevie Wonder cover band! :)</p>
<p>In my last post, I introduced GravWell and talked through some of the concepts at a high level. In this post, I want to share a detailed background context of one of if not the biggest factors affecting GravWell's design</p></div>]]></description><link>https://www.liquidelectron.com/gravitational-intuition/</link><guid isPermaLink="false">5f9992c6d92c37004553e2b1</guid><category><![CDATA[gravwell]]></category><category><![CDATA[game design]]></category><category><![CDATA[cover bands]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Wed, 28 Oct 2020 15:48:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1562609952-9a082716e8be?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://images.unsplash.com/photo-1562609952-9a082716e8be?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Gravitational Intuition"><p>Is <strong>not</strong> the name of my Stevie Wonder cover band! :)</p>
<p>In my last post, I introduced GravWell and talked through some of the concepts at a high level. In this post, I want to share a detailed background context of one of if not the biggest factors affecting GravWell's design and implementation. This post won't get into any code or detailed design, but rest assured future ones will certainly dive into the gory details!</p>
<h2 id="intuitingthemaths">Intuiting the maths</h2>
<p>GravWell is a game that places an emphasis on exercising a player's inherent mental ability to work with structured, patterned system. Through navigating their craft around the star system, players perform incredible and complex mathematical feats of calculus right in our heads with nary a calculator or slide rule to be found! With the right information, a bit of guidance, and sprited persistence, players can make more-or-less accurate predictions regarding their ship's orbital mechanics. Predictions like these:</p>
<ul>
<li>Is the craft in a stable orbit?</li>
<li>Am I currently heading towards apoapse/periapse (highest or lowest altitude/slowest or fastest speed segment of an eccentric orbit</li>
<li>Roughly how eccentric is my orbit?</li>
<li>Where, when, and how much deltaV do I need to burn in order to change my orbit?</li>
</ul>
<h2 id="thehumangpu">The Human GPU</h2>
<p>The human brain devotes a lot of its' overall processing power to vision and image processing.<em>1</em> This makes sense if you think about the amount of sensory information that is visual compared to the data density of other senses: in computer terms, a 1 minute long video shot in 4K@60fps will have a far larger file size than the equivalent length audio sample; simply put, the video has a higher information density. This information is sort of aggregated with other sensory data and presented to more recently evolved (e.g., &quot;higher&quot;) areas of the brain that integrate that data with similar experiences and memories, which surfaces that data to the decision-making cognitive functions that calls itself &quot;me&quot;.</p>
<h2 id="dataintegration">Data integration</h2>
<p>One might say that this all sounds interesting, but why am I talking about neuroscience in a post about a video game? The digression is important in understanding how GravWell makes something &quot;hard&quot; (e.g. orbital mechanics, gravity) and turns it into something that is accessible, challenging, and most importantly FUN. The secret is in the presentation. Through interaction with our everyday world, we build a detailed internal model, a simulation, of the world. Often, when engaged in rational decision-making, we will query this internal simulated world to examine various potential outcomes of a scenario. For efficiency's sake, our brains are very good at creating shortcuts and abstractions that simplify the simulation - there are a lot of cognitive biases based on those simplifications, as are most optical illusions. This ability to use abstract concepts tied together with familiar experiences is the key to the Gravity Map.</p>
<p><img src="https://images.unsplash.com/photo-1566669437687-7040a6926753?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Gravitational Intuition"><br>
<small>Photo by <a href="https://unsplash.com/@natcon773?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Natasha Connell</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a></small></p>
<h2 id="spinningupavminyourhead">Spinning up a VM in your head</h2>
<p>Through interaction with the world, we learn and internalize the basic behaviors of physics - a ball tossed upwards will eventually fall back to the ground, water flows downhill, etc. Our further experiences extend that model - making a tight turn in a car pushes you outwards, trucks take longer to stop than small cars, and jumping from a swing at the top of the arc imparts greater leap, etc. Those basics are pretty common to folks' everyday life, but as a person pursues more specialized activities, their models are augmented by long hours of study, training, and practice. Airplane pilots work to gain an intimate knowledge of the relationships between lift, drag, and angles of attack, whereas a SCUBA diver might internalize a model of water pressure, depth, and O2 saturation. The common factor here is that people can train themselves and their brains to deal with situations and input completely different from any condition that might naturally be encountered.</p>
<h2 id="gravitytraining">Gravity Training</h2>
<p>The easiest way to connect someone with an unfamiliar concept is by relating the unfamiliar to the familiar. We use tools such as simile, metaphor, and comparative description to communicate these concept maps to other people, but similar techniques can be used to propagate information via other means than language. The Gravity Map visually represents the gravity field of a star system, aggregating and transforming experiential input data from a form unsuitable and unfamiliar into one readily consumable.</p>
<p>Let's pretend that we wanted to &quot;manually&quot; create a gravity map of the environment around low-Earth orbit (LEO). How do we do this? Well, we'd get into our spacesuit, climb into a rocket, and blast off into orbit. As our rocket falls around the earth in its' orbit, we periodically measure the gravitopotential-metric at our current position in space. To make this measurement, we must float very still at the center of our craft and measure the very small resulting tidal effects in the microgravity by <em>feeling</em> the acceleration with our bodies. We note the direction and magnitude of the force along with the coordinates identifying the location of the measurement, but it is only by taking a large number of these measurements and then comparing them in aggregate that we are able to assemble an actual map of the LEO gravwell. This is where our mental models break down; we simply can't hold enough information in our minds to create this map on the fly!</p>
<h2 id="chunkinggravity">Chunking Gravity</h2>
<p>No, that isn't the name of my cover band - although it would be a pretty rad name for one - who would that band cover? Rather, it's a reference to the process by which our mind organizes, references, and uses learned information. A person's primary cognitive process - their &quot;attention&quot; - can only hold a finite number of items in its' &quot;stack&quot;. A given item on this so-called &quot;stack&quot; can reference or represent almost anything, from a single detail to a broad abstraction. The way this is most typically described is that as a person's knowledge/experience grows, concepts, principles, practice, etc. are &quot;chunked&quot; and indexed with each other.<sup>*</sup></p>
<p>Our minds internally make use of these chunks and their properties in otherwise unfamiliar by iterating against a set of potentially relevant chunks, testing them against observations, and tweaking the model based on those results. This is the concept that I want to leverage with GravWell.</p>
<h2 id="neuroplasticchunkinghacks">Neuro-plastic Chunking Hacks</h2>
<p>Also not the name of my cover band (although again, I would want to hear a band with a name like that out of principle...). So what does all of this chunk stuff mean, and why are we spending so much time and pixels on it? And why are we trying to hack our chunks, anyway?</p>
<p>To bring this back full circle, people have lots of image processing juice and they already have chunks describing/modeling how objects tend to behave kinematically in the everyday world. Gravity is at once a familiar force at the everyday scale of apples falling from trees, but is insensible at larger scales - no one standing on Earth's surface could claim to feel the gravitational pull of Jupiter, no matter what the astrologers say. By mapping the insensible into the realm of the sensible, we can engage, enlighten, and entertain a players' mind by opening up to them a completely new world.</p>
<p><img src="https://images.unsplash.com/photo-1499591934245-40b55745b905?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Gravitational Intuition"><br>
<small>Photo by <a href="https://unsplash.com/@glenncarstenspeters?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Glenn Carstens-Peters</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a></small></p>
<p><small><sup>*</sup> - Here's an example: a beginner at chess might struggle to maintain knowledge of the board's current state at the same time she is attempting to run internal simulations of potential moves and opponent counter-moves because she must constantly juggle the positions and sequences of moves for each piece on the board. In contrast, a chess champion has internalized - &quot;chunked&quot; the same information - into entire groups of strategies, gambits, and the like which may span dozens or more turns into the future. This highly-experienced player isn't necessarily smarter than the beginner, but it is her ability to efficiently process the chess board information that allows her to actively use more complex thought processes - spinning up more VM's to run more detailed simulations of her opponent's predicted behavior. This can also be known as thinking for the long-term, grand strategy, &quot;getting into your opponent's head&quot;, etc. An important property (for our purposes) of these chunks is that they can be hacked (in a good way!).</small></p>
</div>]]></content:encoded></item><item><title><![CDATA[GravWell]]></title><description><![CDATA[In GravWell, players must navigate their ship around a stellar system, subject to the forces of gravity, while avoiding unplanned "lithobraking"]]></description><link>https://www.liquidelectron.com/gravwell/</link><guid isPermaLink="false">5f7de3b5be3835004534d985</guid><category><![CDATA[games]]></category><category><![CDATA[game-development]]></category><category><![CDATA[gravwell]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Wed, 07 Oct 2020 17:56:03 GMT</pubDate><media:content url="https://www.liquidelectron.com/content/images/2020/10/GravWell-Postcard.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://www.liquidelectron.com/content/images/2020/10/GravWell-Postcard.png" alt="GravWell"><p>Back in Februrary of 2019, I decided to embark on a little side-project. I wanted an excuse to learn how to use the fabulous <a href="https://www.babylonjs.com/">BabylonJS game engine</a> along with gaining proficiency in TypeScript, I had been avidly reading through Winchell Chung's amazing <a href="http://www.projectrho.com/public_html/rocket">Atomic Rockets</a> website (seriously, if you have <em>any</em> enthusiasm about space travel, science fiction, rockets, etc. you need to check this out!) when I came across the <a href="http://www.projectrho.com/public_html/rocket/spacemaps.php#id--30_AU_Radius--Gravity_Well_Maps">gravity maps section</a>. In a flash of inspiration, I came up with <a href="https://gravwell.liquidelectron.com">GravWell</a>.</p>
<p><img src="https://www.liquidelectron.com/content/images/2020/10/gravwell-title-hero.jpg" alt="GravWell"><br>
<em>Original post image by Josh Elster based on artwork by H.K. Wimmer</em></p>
<p>Picture a patch of space somewhere in our Solar system. According to Einstein, mass tells that piece of space how to move, and space tells mass where to move. Mass - i.e. the distribution of matter in space - gives objects their gravity, which in turn dictates the shape of space-time around that mass. The analogy most often used to describe this is as a rubber sheet, with marbles or balls of different weights causing the rubber to dimple in various ways. A star makes a deep dimple in the sheet that the far smaller and less massive planets endlessly circle, but it's important to remember that though they are less massive, those planets do have enough mass to affect the shape of space around them. The dimples are a 2-D representation of our 3-D space, but it's a good enough analogy for our purposes.</p>
<p><img src="https://www.liquidelectron.com/content/images/2020/10/2020-10-07.png" alt="GravWell"></p>
<p>In GravWell, players must navigate their ship around a stellar system while avoiding unplanned &quot;lithobraking&quot; - crashing - contact with any of the celestial bodies. At all times, the celestial spheres tug at the players' ship with the force of their gravity. The ship has powerful engines, and armed with a map of the <a href="https://en.wikipedia.org/wiki/Gravitational_potential">gravitational potential</a>, players are given the tools to escape from their gravitational prison. This map (a form of height map) is computed by dividing up a 2-dimensional world map up into &quot;chunks&quot; of what I call &quot;grav units&quot;, measured in meters. Due to some quirks of the underlying framework, this unit must be some power of 2 - 2, 4, 8, 16, 32, 64, 128 etc. The value this parameter takes dictates the resoution capability of the physics simulation - if the grav unit is set to 128m that means the world map is divided into chunks 128 meters in size. Each chunk is treated as a single point for purposes of computation, which when combined with the world size parameters figures the absolute minimum memory requirements for a given world size because the height map array storing this data must contain an entry for every single point on the map. This is represented as a 3-Vector (<em>x, y, z</em>) giving the point's location in world space. Because we are simulating a 2-D environment however, we can use the unneeded <em>y</em>- axis scalar to store the value for the magnitude of gravity at that point. The player's ship follows the contours of gravity as it is pulled around the system by the planetary bodies comprising that system - a central star along with 1 or more planets. When the simulation updates, planets orbit their star in pre-determined orbital paths controlled by the parameters of the primary and the planet. In other words, the planets are &quot;on rails&quot;, and unlike the player's ship they are not (at this time) affected by masses other than the star.</p>
<p><img src="https://www.liquidelectron.com/content/images/2020/10/gravwell-first-look.jpg" alt="GravWell"></p>
<p>As a game, GravWell isn't dissimilar from a half-pipe snowboarding type of game. Players will have points added or subtracted from their scores based on various factors such as:</p>
<ul>
<li>Total time to completion</li>
<li>Delta-V expended (i.e., how much fuel was used by propulsion by the player)</li>
<li>Number of times player corrected their course</li>
<li>Orbits completed around planetary bodies</li>
</ul>
<p>I want to be able to see the different <a href="https://solarsystem.nasa.gov/resources/754/what-is-a-lagrange-point/">Lagrange Points</a> - points where the gravitational forces between two bodies cancel out - as their ships are taken along by the flow of gravity. I want players to be able to enter orbits around planets or even those L- points by intuitively using the fabulous computational power of the human mind to read a real-time gravity map. Players complete scenarios by achieving and end goal, like achieving system-escape velocity. Each scenario can have a different set of starting conditions for its' stellar sytem, with different numbers of planets, theirs and the star's mass, radius orbital distances, etc..</p>
<p><img src="https://www.liquidelectron.com/content/images/2020/10/gravwell-lagrangians.jpg" alt="GravWell"></p>
<p>This is a good time to mention the performance characteristics of GravWell. Computing the gravitational field of any point in the world is a relatively light-weight operation in terms of CPU cycles. This is a good thing because as discussed above, this computation needs to be performed for every point in the height map. Every frame. There are some optimizations in place, such as skipping points inside of a planetary body or short-circuiting calculations for points extremely far from the camera, but that isn't near enough to get to a minimally desired frame rate on most hardware. JavaScript's inherently synchronous nature is naturally the reason why this is such a bottleneck to performance, and of course the easy answer to this is to perform the height map updates someplace else.</p>
<p>Eventually, I'd like to allow height map data to be streamed from sources external to the game - whether it's a browser worker process, a Blazor webasm, or a server-based API endpoint. This would allow for some potentially exciting simluations and scenarios that would go far beyond what GravWell is currently capable of today. For example, it's currently very difficult to balance performance above ~10fps with world sizes larger than about 9600m x 9600m. The inverse square behavior of gravity along with its  pathetically weak <a href="https://en.wikipedia.org/wiki/Gravitational_constant">Gravitational Constant</a> place some constraints on the minimum mass, orbital radii, which produces some indirect constraints on the overall world and thus the height map size which then leads to poor framerates and OOM problems, etc. I've got a whole swathe of features planned for GravWell, and eventually I'm thinking about open-sourcing the whole thing and making the repos public. What do you think? Is this something you're interested in contributing towards? I'm interested in feedback - please feel free to @ or DM me on Twitter with your thoughts!</p>
</div>]]></content:encoded></item><item><title><![CDATA[Tools for building a modern software platform in Azure]]></title><description><![CDATA[A list of high-level tools, products, and services that can help build high-quality, scalable, secure, and durable software products quickly and easily.]]></description><link>https://www.liquidelectron.com/tools-for-building-a-modern-software-platform/</link><guid isPermaLink="false">5b00658e271150004f732c6d</guid><category><![CDATA[azure]]></category><category><![CDATA[tools]]></category><category><![CDATA[architecture]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Tue, 17 Jul 2018 15:10:38 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1426927308491-6380b6a9936f?ixlib=rb-0.3.5&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ&amp;s=7800b8b0fac7c316cdc87ecd75381db6" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://images.unsplash.com/photo-1426927308491-6380b6a9936f?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ&s=7800b8b0fac7c316cdc87ecd75381db6" alt="Tools for building a modern software platform in Azure"><p>You know how some projects never seem to find their strides? A promising start shows quick progress, but work quickly gets mired down in building &quot;all the other things&quot; that a good piece of software needs but which aren't directly related to the problem which the software is intended to solve. Every little piece of this type of functionality that doesn't have to be built (either bespoke or integrated) is more time left for you to focus on your product. Here are some things that I've found can help take your software infrastructure to the next level.</p>
<h2 id="1azuredurablefunctionsserverlesscomputing">1. Azure Durable Functions (serverless computing)</h2>
<p>Serverless computing is so cool. Forget about the days of fiddling with IIS and various other OS and framework settings - just code and go! Durable functions take this to the next level by allowing long-running, stateful orchestrations to &quot;just work&quot; without additional management on your part. Part of the magic is how Durable Functions make use of <a href="https://docs.microsoft.com/azure/architecture/patterns/event-sourcing">Event Sourcing</a> to do their thing. Your costs are easier to keep under control with Consumption-based pricing, while traditional App Service Plans can still be leveraged to offer consistency in performance and pricing. You can pretty much use the programming language of your choice to work in, whether it's C#, JavaScript, or even Powershell! Iteration can be quite rapid when working with CSX (C# script) or other non-precompiled language options.<br>
<a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview">Azure Functions</a></p>
<h2 id="2azureactivedirectoryaad">2. Azure Active Directory (AAD)</h2>
<p>If you're developing a solution, service, or software that requires authentication and authorization functionality, what are you waiting for? Azure Active Directory has a whole host of features and capabilities that incorporate seamlessly with most Azure resources. Role-based access controls (RBAC) give a consistent and powerful way to control access levels at a very atomic level, whether the user is a human making use of 2FA or a service storing secrets in an Azure Key Vault. App Services, in particular, use something called <a href="https://docs.microsoft.com/en-us/azure/app-service/app-service-authentication-overview">easy auth</a> to make federated identity and claims across multiple identity providers (e.g., AAD, Google, Facebook, Twitter, etc.) well, easy. Tight integration with the Office 365 suite of products seals the deal for anyone looking to connect different sets of building blocks into a functional whole.<br>
<a href="https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-whatis">Azure Active Directory</a></p>
<h2 id="3office365withflow">3. Office 365 with Flow</h2>
<p>This entry could just as easily have been entirely about the O365 suite and that would have been enough. The Office 365 product suite is comprised of far, far more than just the traditional Word, Powerpoint, etc. applications. Flow is the real game-changer here, with hundreds of connectors to different apps and services, it's never been easier to &quot;automate all the things&quot;. Not confined to only integrating with other O365 apps, Flow is one of the best attempts at realizing true, generic consumer-level workflow software that is quite eminently usable by almost anyone with any degree of technical competence.<br>
<a href="https://www.office.com/">Office365</a><br>
<a href="https://flow.microsoft.com">Microsoft Flow</a></p>
<h2 id="4dockeranddockerforwindows">4. Docker and Docker for Windows</h2>
<p>For many developers, their knowledge regarding Docker and containerization technologies starts and ends with knowledge of their existence. Don't even have that base? Here's an <a href="https://www.docker.com/what-docker">overview</a>. If you're one of those developers, I would <em>highly</em> recommend putting some time into learning about Docker, containers, and related technologies - I can guarantee that it will not only you more valuable as an employee, you will find ways that it can ease your day-to-day aches and pains on the job. Feature support for Windows Containers increases on a regular basis, but there's still some work to be done (<a href="https://github.com/docker/for-win/issues">follow the team's progress</a>) when it comes to running Windows and Linux -based containers side-by-side.<br>
<a href="https://www.docker.com/docker-windows">Docker for Windows</a></p>
<h2 id="5containerorchestrationwithkubernetes">5.  Container orchestration with Kubernetes</h2>
<p>Kubernetes puts the <strong>Ops</strong> into <strong>Dev</strong>Ops. An easy way to think about it is that Kubernetes (or k8's for those in the know) is the macro- to the Docker container's micro-. As an <em>orchestrator</em>, Kubernetes manages the lifecycles of groups of containers and their dependent infrastructure. Groups of containers work together to comprise a multi-variate, highly available, scalable, and robust microservices application infrastructure for your code. The advantage of this is that you write more code relevant to the business domain (and less housekeeping types of logic). The disadvantage is that Kubernetes and microservices orchestration can be a fiendishly complex topic, giving it a bit of a high learning curve.<br>
<a href="https://kubernetes.io/">Kubernetes</a></p>
<h2 id="summary">Summary</h2>
<p>Right now is a very cool time to be in the business of making software. I don't think there's any other time in my professional career where I've felt more empowered by the available tools and services. So many of the tedious, fault-prone, and risky components involved but not directly related to the software's core goal used to have to be built, bespoke, every time a new software project was launched<sup class="footnote-ref"><a href="https://www.liquidelectron.com/tools-for-building-a-modern-software-platform/#fn1" id="fnref1">[1]</a></sup>. The latest set of tools are more powerful and accessible than ever, allowing more people than ever before the power to make their dreams a reality.</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>I used to call these types of things orthogonal concerns, but I stopped using that phrase once I realized that nobody I used it in front of seemed to know what it meant. <a href="https://www.liquidelectron.com/tools-for-building-a-modern-software-platform/#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
</div>]]></content:encoded></item><item><title><![CDATA[A Ghostly Site update]]></title><description><![CDATA[<div class="kg-card-markdown"><p>If you've been to the previous incarnation of this website, you'll notice that it suddenly looks a bit... different. That's because I'm in the process of moving over to the <a href="https://ghost.org">Ghost</a> publishing platform hosted up in my Azure subscription.</p>
<p>I didn't have a problem with Orchard CMS, I simply needed</p></div>]]></description><link>https://www.liquidelectron.com/a-ghostly-site-update/</link><guid isPermaLink="false">5aee06e9cc19d30076fa4798</guid><category><![CDATA[update]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Sat, 05 May 2018 19:40:33 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1476283721796-dd935b062838?ixlib=rb-0.3.5&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ&amp;s=b406f3c94813eb45668c452c061f6221" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://images.unsplash.com/photo-1476283721796-dd935b062838?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ&s=b406f3c94813eb45668c452c061f6221" alt="A Ghostly Site update"><p>If you've been to the previous incarnation of this website, you'll notice that it suddenly looks a bit... different. That's because I'm in the process of moving over to the <a href="https://ghost.org">Ghost</a> publishing platform hosted up in my Azure subscription.</p>
<p>I didn't have a problem with Orchard CMS, I simply needed to make a change in my website to save on hosting costs and the like, and at the same time I wanted to expand my horizons a bit - ghost fits the bill on both fronts.</p>
<p>Over the next few weeks I'm going to be moving old content (probably to a new archives section) as well as posting some curated and updated posts from my <a href="https://www.inrule.com/resources/blog/author/josh-elster/">blog over at InRule</a>.</p>
</div>]]></content:encoded></item><item><title><![CDATA[That Conference 2014 ]]></title><description><![CDATA[<div class="kg-card-markdown"><p>I've just arrived in Wisconsin at <a href="http://thatconference.com">That Conference</a> - looking at session lists and events sessions while waiting to check-in made me look forward to everything even more! There's so many different sessions that seem interesting, it's tough to choose just one for each time slot.</p>
<p>Hope to see you</p></div>]]></description><link>https://www.liquidelectron.com/blog-that-conference-2014/</link><guid isPermaLink="false">5aee02b5cc19d30076fa4734</guid><category><![CDATA[thatconference]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Sun, 10 Aug 2014 20:10:16 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>I've just arrived in Wisconsin at <a href="http://thatconference.com">That Conference</a> - looking at session lists and events sessions while waiting to check-in made me look forward to everything even more! There's so many different sessions that seem interesting, it's tough to choose just one for each time slot.</p>
<p>Hope to see you there!</p>
</div>]]></content:encoded></item><item><title><![CDATA[Fixed: emails bouncing due to dns fail]]></title><description><![CDATA[<div class="kg-card-markdown"><p>If anyone has had issues with emails addressed to the <at>liquidelectron.com domain, I've just put into place a change to my host's DNS records to get them aligned with my Exchange Online service. It was something I was supposed to do by Jan 1 which had clearly slipped my</at></p></div>]]></description><link>https://www.liquidelectron.com/blog-fixed-emails-bouncing-due-to-dns-fail/</link><guid isPermaLink="false">5aee02b5cc19d30076fa4732</guid><category><![CDATA[notice]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Thu, 10 Jan 2013 00:41:31 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>If anyone has had issues with emails addressed to the <at>liquidelectron.com domain, I've just put into place a change to my host's DNS records to get them aligned with my Exchange Online service. It was something I was supposed to do by Jan 1 which had clearly slipped my mind.</at></p>
<p>Thanks <a href="http://www.tfswhisperer.com/">Angela Dugan</a> for the heads-up!</p>
</div>]]></content:encoded></item><item><title><![CDATA[VS2012 Node.js Project Template]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Following up on an exchange <a href="https://twitter.com/liquid_electron/status/235040783672168448" target="_blank">Chris Powers</a> and I had earlier today at <a href="http://thatconference.com" target="_blank">That Conference</a>, I threw together a quick and dirty project template for VS 2012 (RC) to create a new node.js website project. The template will create a new website folder and sln with the express module</p></div>]]></description><link>https://www.liquidelectron.com/blog-vs2012-node-js-project-template/</link><guid isPermaLink="false">5aee02b5cc19d30076fa4731</guid><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Mon, 13 Aug 2012 21:12:07 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>Following up on an exchange <a href="https://twitter.com/liquid_electron/status/235040783672168448" target="_blank">Chris Powers</a> and I had earlier today at <a href="http://thatconference.com" target="_blank">That Conference</a>, I threw together a quick and dirty project template for VS 2012 (RC) to create a new node.js website project. The template will create a new website folder and sln with the express module installed and a simple “hello world” response mapped to the “/”. <a href="https://liquidelectron.blob.core.windows.net/media/Default/Windows-Live-Writer/VS2012-Node.js-Project-Template_9BF9/image_2.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://liquidelectron.blob.core.windows.net/media/Default/Windows-Live-Writer/VS2012-Node.js-Project-Template_9BF9/image_thumb.png" width="644" height="444"></a></p> <p>I’ve tested it to ensure that it Works on My Machine, but don’t hold me responsible if it doesn’t on yours! You’ll have to have already installed node.js components for this to work correctly. I would recommend using the <a href="http://www.microsoft.com/web/downloads/platform.aspx" target="_blank">Web Platform Installer</a> since it will install and configure everything for you, up to and including adding the proper ENVIRONMENT and PATH variables. </p> <p><a href="http://sdrv.ms/QXn5zj" target="_blank">Here’s</a> the compiled VSIX package – have fun!</p></div>]]></content:encoded></item><item><title><![CDATA[Slides and code from my CALMUG talk]]></title><description><![CDATA[<div class="kg-card-markdown"><p>As promised, here are the slides and demo code from my talk last night at the Chicago ALM UG.</p>
<p><a href="https://github.com/jelster/SpecALMed" target="_blank">Get the code</a> for the Conway Life SpecFlow demo</p>
<p>Download the slides <a href="http://sdrv.ms/MCUpph" target="_blank">here</a></p>
<p>Special thanks to folks at MS Chicago, for being gracious hosts, Angela Dugan for giving me the opportunity</p></div>]]></description><link>https://www.liquidelectron.com/slides-and-code-from-my-calmug-talk/</link><guid isPermaLink="false">5aee02b5cc19d30076fa4730</guid><category><![CDATA[code]]></category><category><![CDATA[speaking]]></category><category><![CDATA[demo]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Thu, 19 Jul 2012 15:27:44 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>As promised, here are the slides and demo code from my talk last night at the Chicago ALM UG.</p>
<p><a href="https://github.com/jelster/SpecALMed" target="_blank">Get the code</a> for the Conway Life SpecFlow demo</p>
<p>Download the slides <a href="http://sdrv.ms/MCUpph" target="_blank">here</a></p>
<p>Special thanks to folks at MS Chicago, for being gracious hosts, Angela Dugan for giving me the opportunity to present, and to all of the attendees for rolling so well with the food pyramid analogy!</p></div>]]></content:encoded></item><item><title><![CDATA[Mark your calendars]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Just so you all know, Your Humble Correspondent (that's me!) will be presenting on <a href="http://specflow.org">SpecFlow</a> at the June 13th meeting of the <a href="http://www.chicagoalmug.org/">Chicago Visual Studio ALM User Group</a>.</p> <p>Meeting details:</p> <ul> <li>Date: June 13th, evening (exact times TBA)  </li><li>Location: Chicago Microsoft office, Aon center  </li><li>RSVP for the event <a title="RSVP" href="http://www.chicagoalmug.org/Event/RegisterStep1/17">here</a></li></ul> <p>Special thanks</p></div>]]></description><link>https://www.liquidelectron.com/mark-your-calendars/</link><guid isPermaLink="false">5aee02b5cc19d30076fa472f</guid><category><![CDATA[speaking]]></category><category><![CDATA[user-group]]></category><category><![CDATA[specflow]]></category><category><![CDATA[alm]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Thu, 17 May 2012 16:26:55 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>Just so you all know, Your Humble Correspondent (that's me!) will be presenting on <a href="http://specflow.org">SpecFlow</a> at the June 13th meeting of the <a href="http://www.chicagoalmug.org/">Chicago Visual Studio ALM User Group</a>.</p> <p>Meeting details:</p> <ul> <li>Date: June 13th, evening (exact times TBA)  </li><li>Location: Chicago Microsoft office, Aon center  </li><li>RSVP for the event <a title="RSVP" href="http://www.chicagoalmug.org/Event/RegisterStep1/17">here</a></li></ul> <p>Special thanks goes out to the group's organizer, <a href="https://twitter.com/#!/OakParkGirl">Angela Dugan</a>, for allowing me to convince her into letting me give the talk. Angela, I can't guarantee that you won't regret this, but I will guarantee that it'll be memorable! :-) Below is the published description of the talk:</p> <blockquote> <p>In this talk, we’ll go over what acceptance testing is, when it should be used, and how to add acceptance testing into an existing application using SpecFlow. We’ll also talk a bit about DSLs (domain-specific languages), the pyramid of returns vs. effort when it comes to different types of testing, techniques for authoring and designing tests and bindings, and finally, because this *is* a group about ALM, how to integrate SpecFlow into a CI environment and why you or your organization should do so. If attendees wish to follow the demo on their laptops, they can save time by pre-installing the VS tooling for SpecFlow – http://specflow.org. The download there adds some tooling support within the VS IDE, and is not needed to run SpecFlow. </p></blockquote></div>]]></content:encoded></item><item><title><![CDATA[What I've been up to lately]]></title><description><![CDATA[<div class="kg-card-markdown"><p>I've been very preoccupied the last few weeks working on <a href="http://cqrsjourney.github.com/">a few things</a> these past few weeks. There's been so many different disparate things going on it's sometimes hard to keep track of everything! Here's a list of what I've been working on: </p> <ul> <li> <p>There's an interesting story that has come</p></li></ul></div>]]></description><link>https://www.liquidelectron.com/what-i-ve-been-up-to-lately/</link><guid isPermaLink="false">5aee02b5cc19d30076fa472e</guid><category><![CDATA[update]]></category><category><![CDATA[work]]></category><category><![CDATA[production]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Tue, 15 May 2012 16:48:16 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>I've been very preoccupied the last few weeks working on <a href="http://cqrsjourney.github.com/">a few things</a> these past few weeks. There's been so many different disparate things going on it's sometimes hard to keep track of everything! Here's a list of what I've been working on: </p> <ul> <li> <p>There's an interesting story that has come out of the CQRS journey project around discovery, comprehension, and visualization of messaging flows. Stemming from some pains encountered while working on the code, the MIL project and tools aim to help developers focus on relevant code interactions while shielding devs from information overload. You can find the site <a href="http://jelster.github.com/CqrsMessagingTools/">here</a>. More will be posted on this subject shortly, so stay tuned!</p> </li><li> <p>Roslyn <a href="https://www.liquidelectron.com/solving-problems-with-compiler-as-a-service">compiler-as-a-service is really neat and fun to use</a>, with a whole lot of potential. I've been using it extensively the last couple of weeks, and I'll be sharing some of the insights I've gained from it.</p> </li><li> <p>The <a href="https://www.liquidelectron.com/postcardapp">PostcardApp</a> hasn't disappeared - as a single-person team, production schedules are as simple as they are difficult to manage. They're simple because logistics are easy with one person. They're hard because prioritization becomes extremely important. </p> </li><li> <p>My <a href="https://www.liquidelectron.com/modeling-game-state-using-a-marble-diagram">work with the Reactive Extensions</a> in XNA isn't done yet either. PrincessCatcher isn't going to finish itself, and I have yet to find out how/whether Rx has a place in XNA games.</p> </li><li> <p>This website is in major need of some overhauls as well. Maybe you’ve noticed that posts don’t seem to be appearing in the correct order or with correct dates? I'm about a year behind the latest release of <a href="http://orchardproject.net/">Orchard CMS</a>, and there are a whole slew of features/elements I'd like to incorporate into the site as well as other upgrades to get the site experience where I think it needs to be.</p> </li><li> <p><a href="http://www.liquidelectron.com/games/infestation">Infestation</a> is currently on a production hold. It's a project that I am committed to finishing, but finishing in a way that I can be proud of. Until I have resources in place to do that, it's going to take a lower-priority in the production queue.</p> </li><li> <p>The various and sundry projects that I've been exploring, but that don't have a spot in the backlog. This includes 2 game concepts, 3 mobile apps as well as 2 Kinect-related concepts. </p></li></ul> <p>Now it's back to work before my brain's task master, which I call 'The Bos'un' (<a href="http://en.wikipedia.org/wiki/Bosun">definition</a>), has at me with the cat o' nine tails.</p></div>]]></content:encoded></item><item><title><![CDATA[The Fauna of Infestation]]></title><description><![CDATA[<div class="kg-card-markdown"><p><strong>Infestation </strong>is the first release for Liquid Electron.</p>
<address>The dimly-lit kitchen was silent, except for the scratching sounds of chitinous legs on the smooth linoleum. Flashes of lightning reveal a tasty muffin under siege by an approaching insectile horde. Grab your flyswatter, lay down your fly paper, and ready an</address></div>]]></description><link>https://www.liquidelectron.com/games-infestation/</link><guid isPermaLink="false">5aee02b5cc19d30076fa4715</guid><category><![CDATA[infestation]]></category><category><![CDATA[games]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Thu, 26 Apr 2012 20:17:03 GMT</pubDate><media:content url="https://www.liquidelectron.com/content/images/2018/05/Roach-idle.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://www.liquidelectron.com/content/images/2018/05/Roach-idle.png" alt="The Fauna of Infestation"><p><strong>Infestation </strong>is the first release for Liquid Electron.</p>
<address>The dimly-lit kitchen was silent, except for the scratching sounds of chitinous legs on the smooth linoleum. Flashes of lightning reveal a tasty muffin under siege by an approaching insectile horde. Grab your flyswatter, lay down your fly paper, and ready an array of defensive structures supplemented by a powerful set of gesture-based special moves as you drive off the creepy-crawlies assaulting your yummies! <br></address>
<h1><strong>Meet the crawling horrors of Infestation</strong></h1>
<p>(Click headers to view a description)</p>
<div class="bug-desc">
<h2 class="slide-header" style="cursor: pointer;">Cockroach</h2>
<img src="//liquidelectron.blob.core.windows.net/media/Roach-idle.png" alt="The Fauna of Infestation">
<div class="slide-desc" style="display: none;">The cockroach is a bottom feeder. Nothing is off limits to its' mandibles! Muffins, steak, and even the shattered corpses of other insects you've destroyed are all tasty treats for this disguting horror. The cockroaches' slow movement speed is offset by its' heavy carapace which can absorb a great deal of punishment. A consequence of this robust physique is that cockroaches won't grow very much from munching on your food.</div>
</div>
<div class="bug-desc">
<h2 class="slide-header" style="cursor: pointer;">Spider</h2>
<img src="//liquidelectron.blob.core.windows.net/media/spider-idle.png" alt="The Fauna of Infestation">
<div class="slide-desc" style="display: none;">Spiders are dangerous. They're fast, they're tough, and worst of all, they're merciless. Occassionally, a spider may decide that another insect makes for a tasty incubator for a smaller swarm of like-minded horrors. Make sure you take the spider out before it can make your troubles worse!</div>
</div>
<div class="bug-desc">
<h2 class="slide-header" style="cursor: pointer;">Fly</h2>
<img src="//liquidelectron.blob.core.windows.net/media/fly-idle.png" alt="The Fauna of Infestation">
<div class="slide-desc" style="display: none;">Annoying and seemingly harmless, the fly can buzz straight over any and all the painstakingly constructed barriers you've erected to keep unrulies away. Their low health is compensated by high speed, so watch out to make sure one - or more - don't slip through your defenses.</div>
</div>
<div class="bug-desc">
<h2 class="slide-header" style="cursor: pointer;">Ant</h2>
<img src="//liquidelectron.blob.core.windows.net/media/red-ant-idle.png" alt="The Fauna of Infestation">
<div class="slide-desc" style="display: none;">The shock-troopers of the insect world, ants make up for their slow speed and moderately weak armor by attacking in large packs. Ants have no sense of self-preservation, and will cheerfully crawl over the broken bodies of fallen comrades to reach their goal.</div>
</div>
<script type="text/javascript">// <![CDATA[
 $(document).ready(function()  {       $(".slide-header").on("click", function() {            $(this).parent("div").find("div.slide-desc").slideToggle();       }); });
// ]]]]><![CDATA[></script></div>]]></content:encoded></item><item><title><![CDATA[The PostcardApp origin story]]></title><description><![CDATA[<div class="kg-card-markdown"><p>When I go on vacation to different places, I snap a lot of photos of scenery &ndash; mountains, rock formations, etc. When I got into playing <a target="_blank" href="//en.wikipedia.org/wiki/The_Elder_Scrolls_V:_Skyrim">Skyrim</a>, I so enjoyed the landscape that the first few hours of the game saw more screenshots captured than monsters defeated!</p>
<p>A few weeks</p></div>]]></description><link>https://www.liquidelectron.com/the-postcardapp-origin-story/</link><guid isPermaLink="false">5aee02b5cc19d30076fa4726</guid><category><![CDATA[azure]]></category><category><![CDATA[asp.net mvc]]></category><category><![CDATA[web api]]></category><category><![CDATA[postcards]]></category><dc:creator><![CDATA[Josh Elster]]></dc:creator><pubDate>Thu, 26 Apr 2012 20:16:36 GMT</pubDate><media:content url="https://www.liquidelectron.com/content/images/2018/05/postccards-from-skyrim-creek_2-1-.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://www.liquidelectron.com/content/images/2018/05/postccards-from-skyrim-creek_2-1-.png" alt="The PostcardApp origin story"><p>When I go on vacation to different places, I snap a lot of photos of scenery &ndash; mountains, rock formations, etc. When I got into playing <a target="_blank" href="//en.wikipedia.org/wiki/The_Elder_Scrolls_V:_Skyrim">Skyrim</a>, I so enjoyed the landscape that the first few hours of the game saw more screenshots captured than monsters defeated!</p>
<p>A few weeks before my virtual hiking excursions began, the ASP.NET Web API was released in beta form along with a whole bunch of other beta-bits goodness. These different bits enable developers in ways that would otherwise require a lot of effort to create bespoke. These two otherwise unrelated events enjoyed a confluence when they met in my brain, forming what would eventually lead to the conception (perhaps an Inception?) of this project.</p>
<h2>A Combination of Ideas</h2>
<p>One evening of play, I was positioning my &lsquo;camera&rsquo; for a particularly stunning sunset shot when I had a sudden image of that picture on a postcard along with a pithy catch-phrase in bold coloring extolling the virtues of some vacation spot. My concentration slipped, causing my unfortunate hero to plunge to his death from the top of a mountain, but good thing for him that&rsquo;s he&rsquo;s a plucky fellow. His long fall gave me time to ponder: the name PostcardApp flowed naturally, as did &lsquo;Postcards From Skyrim&rsquo;. Great, but what about it? I ended up purchasing the domain just in case while I pondered the <em>what, how, and why </em>of my idea. It didn&rsquo;t take long to merge the idea of making a postcards web application with my desire to share and learn how to make use of all the shiny toys available to a modern developer.</p>
<h2>Story First</h2>
<p>Thinking about what I wanted the app to be able to do, I brainstormed some goals and stories to help sharpen my focus.</p>
<h3>Overall Goals</h3>
<ul>
<li>Simplicity. Only use what&rsquo;s needed to satisfy the stories, and keep it simple. Did I mention that I wanted this to be simple? Yeah, more an ideal than a likelihood, but a worthy aspiration nonetheless! </li>
<li>Useful. It has to be able to accomplish some actual task, regardless how contrived that task might be. </li>
<li>Explore how to leverage different technology pieces together, including Windows Azure, MVC, and Javascript </li>
<li>Serve as a reference guide for myself and for other developers looking to Get Things Done </li>
</ul>
<p>&nbsp;</p>
<h3>User Stories</h3>
<p>Though the concept is relatively simple, I could always use practice in identification and authoring of user stories. Here are a few I came up with:</p>
<ol>
<li>[As a user,] I want to be able to choose a background and salutation for the front of my postcard so that I can create a custom postcard. </li>
<li>[As a user,] I want to be able to write on the back of the postcard so that I can taunt my envious friends with how awesome my virtual vacation is going. </li>
<li>[As a user,] I want to be able to save and share the postcards I create so that other people can be bedazzled by my creativity and wit.</li>
</ol>
<p>&nbsp;</p>
<h2></h2>
<h3><span style="font-weight: bold;">Coming up next, we dive into the site&rsquo;s layout and how iterating the design in short increments yielded superior results. </span></h3>
<h3><a href="https://www.liquidelectron.com/to-the-drawing-board">Click here to go to the next part</a></h3></div>]]></content:encoded></item></channel></rss>