<?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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Mystic’s Substack]]></title><description><![CDATA[We code fire.]]></description><link>https://www.wecodefire.com</link><image><url>https://substackcdn.com/image/fetch/$s_!RkUB!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad89ba-f6e4-4148-b75e-e76d4dfc26e6_593x593.png</url><title>Mystic’s Substack</title><link>https://www.wecodefire.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 28 Apr 2026 01:16:43 GMT</lastBuildDate><atom:link href="https://www.wecodefire.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Mystic Coders, LLC]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[gotmystic@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[gotmystic@substack.com]]></itunes:email><itunes:name><![CDATA[Mystic]]></itunes:name></itunes:owner><itunes:author><![CDATA[Mystic]]></itunes:author><googleplay:owner><![CDATA[gotmystic@substack.com]]></googleplay:owner><googleplay:email><![CDATA[gotmystic@substack.com]]></googleplay:email><googleplay:author><![CDATA[Mystic]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[ConFoo 2026 Overview]]></title><description><![CDATA[A return to the stage]]></description><link>https://www.wecodefire.com/p/confoo-2026-overview</link><guid isPermaLink="false">https://www.wecodefire.com/p/confoo-2026-overview</guid><dc:creator><![CDATA[Andrew Lombardi]]></dc:creator><pubDate>Sun, 01 Mar 2026 01:31:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qRmi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qRmi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qRmi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qRmi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qRmi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qRmi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qRmi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3010084,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.wecodefire.com/i/189507382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qRmi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qRmi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qRmi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qRmi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa46788-2b9c-42b7-9055-ccf7847e7d7b_4896x3672.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This is me after landing at midnight and 5 hours of sleep</figcaption></figure></div><p>This week I had the pleasure of giving two new talks at ConFoo 2026 in Montreal, Canada. For those who don&#8217;t know, I&#8217;ve spoken at ConFoo multiple times before &#8212; though it&#8217;s been six years since I last took the stage. The more astute among you will note that was just before everything shut down. Over the last six years I&#8217;ve been excited to see where our industry has evolved, and I hope to impart some knowledge every so often to those who attend my talks.</p><p>Here are the two talks I gave and amazingly enough neither one had even the hint of AI or LLMs. I&#8217;m therefore hugely grateful for those who chose to spend time with me and listen to the &#8220;war stories&#8221; on building aviation software.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.wecodefire.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mystic&#8217;s Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>1st Talk<br><br><a href="https://offlinefirst.wecodefire.com">Offline-First at 35,000 Feet: When Your App Can&#8217;t Call Home</a></h3><h4>Abstract</h4><blockquote><p>Most offline-first apps assume you&#8217;ll reconnect in minutes. What happens when your systems operate for hours without connectivity and no team to monitor them?</p><p>Real lessons from building systems that must work reliably in environments where network access is unreliable and remote debugging is impossible. We&#8217;ll explore data sync strategies, conflict resolution patterns, and building bulletproof systems when remote support isn&#8217;t an option.</p></blockquote><h3>2nd Talk</h3><h3><a href="https://graalvm.wecodefire.com">Spring Boot and GraalVM: Lessons from 35,000 Feet</a></h3><h4>Abstract</h4><blockquote><p>What do you do when your Spring Boot app suddenly needs 75% less memory? Here&#8217;s our real-world GraalVM retrofit story.</p><p>Actual production performance metrics, reflection gotchas that break compilation, brutal build times that killed productivity, and what we&#8217;d architect differently from day one to avoid the retrofit pain entirely.</p></blockquote><p>The slides are now available and can be seen at the linked URLs above and also at our new <a href="https://talks.wecodefire.com/">Talks landing page</a>.</p><div><hr></div><p>Throughout the 3-day event I was able to attend several talks and see where the industry is focusing. It&#8217;s no surprise to see that 75% or more of the talks are centered on large language models and the greater AI landscape. If you spend any time on Twitter <em>(I still refuse to call it anything else)</em>, you may be swayed by a belief that a 12-year old with a laptop and tokens in his piggy bank can replace you now. When you look at who&#8217;s pushing this belief, it&#8217;s usually someone selling an agentic solution, someone financially tied to a frontier model, or someone who hasn&#8217;t yet seen what software engineers actually do.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kGHl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kGHl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kGHl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kGHl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kGHl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kGHl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg" width="1023" height="681" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:681,&quot;width&quot;:1023,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:204907,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.wecodefire.com/i/189507382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kGHl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kGHl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kGHl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kGHl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941892bd-313d-4ac5-b186-0305499f62a1_1023x681.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I was on a panel in 2019 in Sofia and the topic centered around AI. One of the questions from the audience was a plea to the panelists to find out if AI would soon take their job. Most of the panelists gave well-meaning answers and were likely correct for the time. My response:</p><blockquote><p><em>&#8220;If an AI can do your job, is it enriching enough of a daily activity for you to continue?&#8221;</em></p></blockquote><p>I believe this even more today. What we&#8217;ve been experiencing is not an extinction-level event for software engineering but a democratization. This technology has released more ideas into the wild and enabled an entirely new cohort of builders. I&#8217;ve been coding professionally for three decades, so maybe I&#8217;m an old dog &#8212; but one-shotting a todo app, a CRM, or a replacement for that SaaS you&#8217;ve been paying $19/mo for doesn&#8217;t strike fear in me. The calculus is way off. These builds haven&#8217;t accounted for real architecture and design, feature development, data storage, security, privacy, and the ongoing cost of maintenance.</p><p>The tools we have access to when used well can not only bring in an entirely new pool of original ideas but also free up seasoned engineers to explore new areas and get curious about technology outside their usual domain. We would also be wise to level up our junior engineers and keep that learning and gaining experience continually. When I&#8217;m evaluating talent, I&#8217;m not counting features. I want to know that you understand what you built and how it solved a real problem for a real customer. We will see more layoffs as executives attempt to show increased revenue by decreasing labor before realizing that those who understood how DNS worked were worth every penny. Our elders are as important as our juniors in this industry and we&#8217;d be wise not to lobotomize nor hollow out the middle in our quest for &#8220;efficiency&#8221;.</p><p>Our industry has a cyclical way of proclaiming the end of the software engineer<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. The last year has only proven how much more we will depend on talent in this area. In many of the talks the question of who&#8217;s using agentic coding tools went up and the majority of the room had hands raised. The question I have for you is however much or little you&#8217;re using it, do you understand what you&#8217;re committing? Look at the commit log:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;164bbf41-0c9c-496d-8589-f79a81805f0f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">% git log
commit ea7e4fd3d4f7af8825818d822590fe78d60147a8 (HEAD -&gt; main, origin/main)
Author: Andrew Lombardi &lt;a*@***.com&gt;</code></pre></div><p>Look closely. My name is on this. That mantra should be the rally cry to ensure you aren&#8217;t adding slop. I wouldn&#8217;t accept an excuse of &#8220;Claude Code wrote this&#8221;, it&#8217;s yours.</p><ul><li><p>When the system gets hacked they won&#8217;t blame the agent, they&#8217;ll blame you.</p></li><li><p>When the edge case gets tripped and your vibed code has leaked customer data, they&#8217;ll blame you.</p></li><li><p>When the 3AM page happens and you&#8217;re on-call the team needs your brain.</p></li></ul><p>So stay curious and engaged. Read your commits and PRs before you ask for the review because nothing sucks worse than reviewing bloated and wrong code that the asking developer can&#8217;t explain.</p><p>Remember, your name is on this.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Anyone remember the 5GL craze from Peoplesoft back in the 90s? Oh right, old dog.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Quantum Entanglement and Database Engines]]></title><description><![CDATA[On a lark I started asking an LLM about quantum entanglement.]]></description><link>https://www.wecodefire.com/p/quantum-entanglement-and-database</link><guid isPermaLink="false">https://www.wecodefire.com/p/quantum-entanglement-and-database</guid><dc:creator><![CDATA[Andrew Lombardi]]></dc:creator><pubDate>Thu, 14 Aug 2025 03:30:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!L6J1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L6J1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L6J1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L6J1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L6J1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L6J1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L6J1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:540808,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.wecodefire.com/i/170945406?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L6J1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L6J1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L6J1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L6J1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a17a1c1-242f-4aed-8f23-a79f810eeaa0_1408x768.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Gemini&#8217;s idea of Quantum Entanglement of computers</figcaption></figure></div><p>On a lark I started asking an LLM about quantum entanglement. And when it spit out "an answer" it was a little tough to follow (of course). So I asked it to give me some analogies that might be more relatable. Here are some of what it came up with:</p><p><strong>The Internet/Network Analogy</strong></p><ul><li><p>Think of quantum entanglement like network packets with shared session IDs:</p></li><li><p>When you change something on one server, all servers with that session ID instantly "know" about it</p></li><li><p>The "threads" are like persistent TCP connections that maintain state across the network</p></li><li><p>Gravity emerges like how network topology creates the "shortest paths" between nodes</p></li></ul><p>There were others, and one of them talked about a Video Game Physics Engine which had invisible links and when one object moved, the other responded regardless of distance and gravity in the game world was just an emergent behavior. It then talked about force and information propagation which I "understand" is not possible given that information transmission is still gated by the speed of light.</p><p>A very odd relationship has emerged where YouTube will show me more and more videos about quantum mechanics, the Jinn particle, Schr&#246;dinger's poor dead/alive cat and at each time I pop over to an LLM to get a more thorough explanation. Each time now, because of my initial analogy request and the memory RAG, it gives me usually what amounts to an increasingly odd software engineering analogy. The most hilarious one so far is when I asked if you could send messages faster than the speed of light it gave me all the reasons why it couldn't, and then said "Think of the <strong>speed of light like a fundamental database constraint</strong>"</p><p><code>--- This is built into the universe's "database engine"<br><br>ALTER TABLE spacetime<br>ADD CONSTRAINT causality_limit<br>CHECK (information_speed &lt;= speed_of_light);<br><br>-- You can have correlations (like foreign keys)<br>-- But actual data transfer hits the constraint</code></p><p>Now if Einstein or Bohr had the analogy engine here, maybe we'd be boarding a different imagination train. Through some of these analogies though, as mixed up as sometimes they appear to be, I think I've got a bit of a better understanding of some of these concepts. These analogies help me map a familiar pattern with an unfamiliar concept.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.wecodefire.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mystic&#8217;s Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>When I am explaining concepts in client meetings or with colleagues I will try to reach for an analogy if I can cook one up. If I'm explaining load testing I may mention it like a restaurant during a lunch rush since it equates well in a business setting. How many customers can we serve with the building and staff that we have? When explaining architecture or difficult concepts about how an integration will work it reduces the cognitive load and brings everyone up to speed quicker than a dry technical description. One thing I think we can always work on is having a wider variety of analogies to choose from.</p><p>Sometimes in a meeting or an unfamiliar setting an analogy can fall flat. That is totally OK! We can often learn what works best in these settings and steer the discussion toward the highway to understanding we're all shooting for. I have tested this in person meetings with a dozen people and in conference halls of up to 500+ people in cities outside my country of origin giving lectures on technology. It is very rare that I don't reach for multiple analogies in any of these situations as it is relatable, and connects us all.</p><p>The last bits that I had been researching in my context window that originally started with "proper methods of validating Pydantic enums" involved the concept of superposition. My understanding is that it relates to the thought experiment that Schr&#246;dinger was attempting when discussing this poor cat. I've always understood that the act of opening the box and observing the cat is what collapses the superposition into a single state.</p><p>Now comes Hugh Everett in the 50s with the Many Worlds Interpretation. Instead of this "mystical" collapsing of a superposition once a thing is observed and ending the story there, he theorized that all possible outcomes may actually happen and there is countless other universes where it occurs in all states. My brain hurts. So tonight I attempted to take the analogies, and the feeble amount of understanding I had gained from research and pull my family into explanations about all I had learned. In each of the humans I hold very dear, as I kept explaining I saw their mind there and not there at the same time. The many worlds interpretation in action!</p><p>Now I have ventured back to the computer to get a little work done. Maybe in one of these many worlds this code review includes tests.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.wecodefire.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mystic&#8217;s Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Ideas Taste and Execution]]></title><description><![CDATA[Throughout my career as an architect and engineer of various systems over the last 30 years I've had a ton of ideas.]]></description><link>https://www.wecodefire.com/p/ideas-taste-and-execution</link><guid isPermaLink="false">https://www.wecodefire.com/p/ideas-taste-and-execution</guid><dc:creator><![CDATA[Andrew Lombardi]]></dc:creator><pubDate>Tue, 12 Aug 2025 05:11:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!A_Bt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A_Bt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A_Bt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!A_Bt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!A_Bt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!A_Bt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A_Bt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:428444,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.wecodefire.com/i/170753758?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A_Bt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!A_Bt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!A_Bt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!A_Bt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc87e145d-d671-44c2-80bf-13fc1dbf43b6_1408x768.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Created most obviously with an LLM</figcaption></figure></div><p>Throughout my career as an architect and engineer of various systems over the last 30 years I've had a ton of ideas. My consulting company Mystic which has been in full effect for 25 years now was the hatching of an idea to bring along the best people in various disciplines I've run into and deploy them with me to help bring solutions to companies around the world. We've been able to solve problems for a lot of companies over the years such as Twitter 1.0, Motorola and Airbus to name a few. In each of these instances we've found our ultimate success by taking the seed of an idea on how to solve it and taking it the steps required to execute successfully.</p><p>If you read enough books on entrepreneurship and business, or listen to interviews with successful founders it becomes evident that what sets apart a successful endeavor is great execution, and a bit of luck. At no time was the idea the most important factor of the success. </p><ul><li><p><strong>Instagram</strong> was a location-based check-in app like Foursquare -- remember that app?</p></li><li><p><strong>Slack</strong> was an internal comms tool for a gaming company (oddly enough Flickr was also an online game that pivoted to photo sharing)</p></li><li><p><strong>YouTube</strong> was a video dating site where people could upload videos describing their ideal date</p></li></ul><p>These 3 examples should be enough proof that what mattered here was execution.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.wecodefire.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mystic&#8217;s Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><strong>Enter AI and "agentic" coding.</strong></p><p>I have seen a big trend online where "founders" or perhaps "marketers" are trying to convince you of something.</p><ul><li><p>Ideas are now gold!</p></li><li><p>Taste is what matters in this new economy!</p></li></ul><p>Whether it's a VC talking about engineers who code with AI and write 10k lines of code a day, or a course seller on "how to effectively prompt engineer your way to a million dollar app!". When it sounds like someone is trying to sell you a scheme, or convince you of something to further their own agenda, it's probably just that.</p><p>Since the beginning of the internet boom in the 90s the cost of turning your ideas into a reality meant hiring at a minimum designers and engineers to get a prototype together. The friction turned many away whether due to not having capital or not being able to convince a VC to fund it. With AI the friction according to those that are peddling that "ideas and taste" are all you need is effectively gone! The truth is a bit more nuanced than that.</p><p>At various times throughout my career I've been hearing how no-code solutions were going to kill software development for good and enable business owners to turn their ideas into reality. Whether it was Visual Basic or HyperCard in the desktop era, Dreamweaver or Flash in Web 1.0 or something as low level as BizTalk which promised to connect disparate systems together with ease, the reality was often barely functional or underlying it all extremely complex.</p><p>It might seem to some like the solutions out there with AI means we may finally be there. I know for me, the first time I used Claude Code to create an admin dashboard for a project, I was awestruck. It looked amazing. It was akin to hiring a few junior frontend engineers and having them build something that looked great after a few minutes of conversation.</p><p>And then I looked at the code it wrote. </p><p>The code was being held together by duct tape and chicken wire. What followed was countless hours of prompts and tinkering with the context to approach something passable. It didn't require vibes but much more expressive requirements, more guard rails and a set of instructions on acceptable code quality and standards. It often feels like it's performing magic but ends up more like an apprentice who sometimes turns your code into a goat. One of the most beautiful things to emerge from this process was that I have tightened up how I explain things in requirements and I ask better questions.</p><p>Building an app with an LLM is like someone who can't even boil water watching a cooking show demonstration and thinking they can run a restaurant. The real work lies in the edge cases and the day to day: suppliers, staff and health inspectors. It's no different with software. For this dashboard, It took engineering effort and a lot of time to turn the prototype that was built and bring together the knowledge and execution necessary to build a great application. </p><p>Large language models in software development is another tool in a software engineers toolbox that can be used toward creating a great product. It can be a great way to leverage the giant body of knowledge that it has to your own ends. It doesn't write perfect code, and it sometimes doesn't even produce working code! It will sometimes delete your code when it encounters an error with a new feature (git commit is your friend). It will ask you for every new session if it's allowed to do something until you learn how to configure the guard rails. </p><p>It is the junior engineer who seemingly knows everything and is confident they do, and often times gets it apologetically very wrong. It took me thirty years of experience to tell the difference.</p><p>So how can you leverage AI in your organization today?</p><p>1. Work together with your team to set up initial context and memory for your individual project and your organization.</p><p>2. Code review is now where a lot of care is needed. Your engineers are going to use AI to write code, care should be taken to make sure they know what it did and if it is fulfilling the requirements and user stories effectively.</p><p>3. Nurture the junior developers on the team so they can level up their skills and recognize good clean code when they see it.</p><p>4. Enable your business folks and product managers to build out prototypes to their hearts desires, and then bring these to engineers to find out what feasibility actually looks like.</p><p>The future has always been so very fun and interesting. Those that are telling you that AI will democratize execution are stuck in a hype cycle that hasn't explored why good execution is the key differentiator between a neat looking tasteful app and a thriving business.</p><p>If you'd like to engage with the team and find out how we can help you with your next project. <a href="https://www.mysticcoders.com/ai">Reach out to us today</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.wecodefire.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mystic&#8217;s Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Beginning Spring AI Released]]></title><description><![CDATA[A powerful library for embracing the multi-modal and multi-model]]></description><link>https://www.wecodefire.com/p/beginning-spring-ai-released</link><guid isPermaLink="false">https://www.wecodefire.com/p/beginning-spring-ai-released</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Tue, 20 May 2025 05:17:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!s-ty!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s-ty!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s-ty!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg 424w, https://substackcdn.com/image/fetch/$s_!s-ty!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg 848w, https://substackcdn.com/image/fetch/$s_!s-ty!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!s-ty!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s-ty!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg" width="344" height="522" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:522,&quot;width&quot;:344,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:18442,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.andrewlombardi.com/i/163980415?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!s-ty!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg 424w, https://substackcdn.com/image/fetch/$s_!s-ty!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg 848w, https://substackcdn.com/image/fetch/$s_!s-ty!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!s-ty!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff51386b9-7c7d-4ddb-adfa-ddd44a1090ba_344x522.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We are excited to announce the belated release of <a href="https://www.amazon.com/Beginning-Spring-AI-Engineering-Apress-ebook/dp/B0F2DMVRNR?crid=WM5708QSWMON&amp;dib=eyJ2IjoiMSJ9.pWcvHVQHcgkY6UcVSeroZ3-wAe5U1-suT5vJG7vDFi-ILt4rAglyUnbWmNFVE5nWrPk460tfS5AKMnev6pbmGnR_9-qTegRr2ujhlQn9RDlJk5aXWH8iaVMKt9WLXBNjds7Og34qhLdFIplUxmtg6Q.eXh3lJehAatQm0HrRiHBu2FuHACBN2beW0yl7zrrBYQ&amp;dib_tag=se&amp;keywords=beginning+spring+ai&amp;qid=1747870835&amp;sprefix=beginning+spring+ai%2Caps%2C185&amp;sr=8-1">Beginning Spring AI</a>. The book is intended to be a first look at using the Spring AI library to leverage the world of AI that is upon us. It is fascinating how fast the technology and releases of new models and new features.</p><p><a href="https://www.amazon.com/Beginning-Spring-AI-Engineering-Apress-ebook/dp/B0F2DMVRNR?crid=WM5708QSWMON&amp;dib=eyJ2IjoiMSJ9.pWcvHVQHcgkY6UcVSeroZ3-wAe5U1-suT5vJG7vDFi-ILt4rAglyUnbWmNFVE5nWrPk460tfS5AKMnev6pbmGnR_9-qTegRr2ujhlQn9RDlJk5aXWH8iaVMKt9WLXBNjds7Og34qhLdFIplUxmtg6Q.eXh3lJehAatQm0HrRiHBu2FuHACBN2beW0yl7zrrBYQ&amp;dib_tag=se&amp;keywords=beginning+spring+ai&amp;qid=1747870835&amp;sprefix=beginning+spring+ai%2Caps%2C185&amp;sr=8-1">Buy the book on Amazon</a> on use coupon code <strong>DISCOVER20</strong> to get 20% off the book through October!</p><p>It looks like we unfortunately missed the impending 1.0.0.GA by a few months! The code and examples written in the book were based on 1.0.0.M2 which feels like a lifetime ago. Last week Mark Pollack announced the <a href="https://spring.io/blog/2025/05/13/spring-ai-1-0-0-RC1-released">Spring AI 1.0.0 RC1</a> release and that today will be the release of the GA! Super excited to see all the updates available and want to help with understanding how things have changed since the books release.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.wecodefire.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mystic&#8217;s Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The most visible change is the complete overhaul of artifact IDs and package structure.</p><h4><strong>Artifact ID</strong></h4><pre><code><code>&lt;!-- OLD --&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.springframework.ai&lt;/groupId&gt;
  &lt;artifactId&gt;spring-ai-openai-spring-boot-starter&lt;/artifactId&gt;
&lt;/dependency&gt;

&lt;!-- NEW --&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.springframework.ai&lt;/groupId&gt;
  &lt;artifactId&gt;spring-ai-starter-model-openai&lt;/artifactId&gt;
&lt;/dependency&gt;

</code></code></pre><p>The pattern has changed to:</p><ul><li><p>Model starters: <code>spring-ai-{model}-spring-boot-starter</code> &#8594; <code>spring-ai-starter-model-{model}</code></p></li><li><p>Vector Store starters: <code>spring-ai-{store}-store-spring-boot-starter</code> &#8594; <code>spring-ai-starter-vector-store-{store}</code></p></li></ul><h4><strong>Package Name</strong></h4><p>Key classes have moved to new packages:</p><ul><li><p><code>KeywordMetadataEnricher</code> and <code>SummaryMetadataEnricher</code> moved from <code>org.springframework.ai.transformer</code> to <code>org.springframework.ai.chat.transformer</code></p></li><li><p><code>Content</code>, <code>MediaContent</code>, and <code>Media</code> moved from <code>org.springframework.ai.model</code> to <code>org.springframework.ai.content</code></p></li></ul><h4><strong>Module Structure</strong></h4><p>Spring AI now uses a modular architecture instead of a monolithic design:</p><ul><li><p><code>spring-ai-commons</code>: Base module with no dependencies</p></li><li><p><code>spring-ai-model</code>: Core AI capability abstractions</p></li><li><p><code>spring-ai-vector-store</code>: Unified vector database abstraction</p></li><li><p><code>spring-ai-client-chat</code>: High-level conversational AI APIs</p></li><li><p><code>spring-ai-advisors-vector-store</code>: Bridges chat with vector stores for RAG</p></li></ul><h4><strong>Chat Memory and Advisor</strong></h4><pre><code><code>// OLD
// Using constants from AbstractChatMemoryAdvisor
myConfig.put(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, "conv123");

// NEW
// Now use constants from ChatMemory interface
myConfig.put(ChatMemory.CONVERSATION_ID, "conv123");

</code></code></pre><ul><li><p><code>CHAT_MEMORY_RETRIEVE_SIZE_KEY</code> renamed to <code>TOP_K</code></p></li><li><p><code>DEFAULT_CHAT_MEMORY_RESPONSE_SIZE</code> (value: 100) renamed to <code>DEFAULT_TOP_K</code> with a new default value of 20</p></li><li><p><code>CHAT_MEMORY_CONVERSATION_ID_KEY</code> moved from <code>AbstractChatMemoryAdvisor</code> to the <code>ChatMemory</code> interface</p></li></ul><h4><strong>Tool Calling</strong></h4><pre><code><code>// OLD (deprecated)
ChatClient chatClient = new OpenAiChatClient(api)
    .tools(List.of(new Tool("get_weather", "Get weather", params)))
    .toolCallbacks(List.of(new ToolCallback("get_weather", handler)));

// NEW
ChatClient chatClient = new OpenAiChatClient(api)
    .toolSpecifications(List.of(new Tool("get_weather", "Get weather", params)))
    .toolCallbacks(List.of(new ToolCallback("get_weather", handler)));

</code></code></pre><ul><li><p>The <code>tools()</code> method is now <code>toolSpecifications()</code></p></li><li><p><code>ToolContext</code> is now final and cannot be extended</p></li><li><p><code>ToolContext</code> behavior changed to support both explicit and implicit tool resolution</p></li></ul><h4><strong>Observability</strong></h4><p>Spring AI now uses logging instead of tracing for observability:</p><pre><code><code># OLD
spring.ai.openai.include-prompt=true
spring.ai.openai.include-completion=true

# NEW
spring.ai.openai.log-prompt=true
spring.ai.openai.log-completion=true

</code></code></pre><ul><li><p>Configuration properties renamed: <code>include-prompt</code> &#8594; <code>log-prompt</code>, etc.</p></li><li><p>Added <code>TracingAwareLoggingObservationHandler</code> for trace-aware logging</p></li><li><p>Replaced <code>micrometer-tracing-bridge-otel</code> with <code>micrometer-tracing</code></p></li></ul><h4><strong>Vector Store</strong></h4><pre><code><code>// OLD
Optional&lt;Boolean&gt; result = vectorStore.delete(ids);
if (result.isPresent() &amp;&amp; result.get()) {
    // handle successful deletion
}

// NEW
vectorStore.delete(ids); // Now throws an exception if delete fails

</code></code></pre><ul><li><p>The <code>delete()</code> method in <code>VectorStore</code> is now void instead of returning <code>Optional&lt;Boolean&gt;</code></p></li><li><p>Default value of <code>initialize-schema</code> property is now <code>false</code></p></li></ul><h4><strong>Template</strong></h4><p>Self-contained templates in advisors:</p><ul><li><p><code>QuestionAnswerAdvisor</code> expects templates with <code>query</code> and <code>question_answer_context</code> placeholders</p></li><li><p><code>PromptChatMemoryAdvisor</code> expects templates with <code>instructions</code> and <code>memory</code> placeholders</p></li><li><p><code>VectorStoreChatMemoryAdvisor</code> expects templates with <code>instructions</code> and <code>long_term_memory</code> placeholders</p></li></ul><h4><strong>Model Autoconfiguration</strong></h4><pre><code><code># OLD
spring.ai.openai.chat.enabled=true

# NEW
spring.ai.model.chat=openai
# Or to disable: spring.ai.model.chat=none

</code></code></pre><ul><li><p>The old properties for enabling/disabling models have been removed</p></li><li><p>Use new properties instead: <code>spring.ai.model.chat</code>, <code>spring.ai.model.embedding</code>, etc.</p></li></ul><h4><strong>Usage Interface</strong></h4><pre><code><code>// OLD
Long generationTokens = usage.getGenerationTokens();

// NEW
Integer completionTokens = usage.getCompletionTokens();

</code></code></pre><ul><li><p><code>getGenerationTokens()</code> renamed to <code>getCompletionTokens()</code></p></li><li><p>Token count field types changed from <code>Long</code> to <code>Integer</code></p></li></ul><h4><strong>Removed Implementations</strong></h4><p>Several implementations have been removed:</p><ul><li><p>Watson AI model (based on outdated text generation)</p></li><li><p>MoonShot and QianFan (not accessible outside China)</p></li><li><p>HanaDB vector store</p></li><li><p>CassandraChatMemory implementation</p></li></ul><h4><strong>Summary</strong></h4><p>We hope you enjoy the book as much as we enjoyed writing it. The next 6 - 12 months are likely to see even more rapid shifts and changes and we hope to write more about some of that here. We&#8217;ll hopefully also be able to get the examples available on the Apress repository updated to reflect the new release of 1.0.0.GA today.</p><p>To our success!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.wecodefire.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mystic&#8217;s Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[We code fire.]]></title><link>https://www.wecodefire.com/p/coming-soon</link><guid isPermaLink="false">https://www.wecodefire.com/p/coming-soon</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Mon, 18 Dec 2023 03:39:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!s2TV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s2TV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s2TV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg 424w, https://substackcdn.com/image/fetch/$s_!s2TV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg 848w, https://substackcdn.com/image/fetch/$s_!s2TV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!s2TV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s2TV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg" width="458" height="305" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:305,&quot;width&quot;:458,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48369,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!s2TV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg 424w, https://substackcdn.com/image/fetch/$s_!s2TV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg 848w, https://substackcdn.com/image/fetch/$s_!s2TV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!s2TV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f5c2c94-b8fa-4930-aa54-0d27e92c2d32_458x305.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.wecodefire.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.wecodefire.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Build a React-based Personal Finance App in Electron with the Plaid Financial API]]></title><description><![CDATA[This is part 1 of a tutorial series in building a Personal Finance App.]]></description><link>https://www.wecodefire.com/p/build-a-react-based-personal-finance</link><guid isPermaLink="false">https://www.wecodefire.com/p/build-a-react-based-personal-finance</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Tue, 05 Dec 2017 08:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3J6_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3J6_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3J6_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png 424w, https://substackcdn.com/image/fetch/$s_!3J6_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png 848w, https://substackcdn.com/image/fetch/$s_!3J6_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png 1272w, https://substackcdn.com/image/fetch/$s_!3J6_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3J6_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png" width="1025" height="731" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:731,&quot;width&quot;:1025,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:310851,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3J6_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png 424w, https://substackcdn.com/image/fetch/$s_!3J6_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png 848w, https://substackcdn.com/image/fetch/$s_!3J6_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png 1272w, https://substackcdn.com/image/fetch/$s_!3J6_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa859d75b-d288-4e0e-893a-29c6099fcc32_1025x731.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This is part 1 of a tutorial series in building a Personal Finance App. In this series, we'll be building an Electron app that allows you to compute your total balance across multiple bank accounts, using real, live data from your actual accounts.</p><p>To complete this tutorial, you'll need to do the following:</p><ul><li><p>Have NodeJS installed and setup on your machine</p></li><li><p>Sign up for a developer account with Plaid: <a href="https://dashboard.plaid.com/signup">Get Started with Plaid</a></p></li></ul><p>The Plaid signup will be covered in more detail as we go.</p><h2><strong>What we're building</strong></h2><p>In this tutorial series, we'll be using Electron to build a small personal finance app by integrating with the Plaid Financial API. The main behavior of this app will be to aggregate expenses across your accounts so you can easily grep how much you've spent for the month.</p><p>Since this is the first post of this series, we'll simply be getting setup and linking one account to display the balance.</p><h3><strong>Just Give me the Source</strong></h3><p>Looking for the completed source for this post? You can clone it from Github: <a href="https://github.com/kinabalu/spend-tracker">Spend Tracker Electron App</a></p><h2><strong>The Basics</strong></h2><p>First, let's review some basics.</p><h3><strong>What is Electron?</strong></h3><p>For those unaware, Electron is a NodeJS framework that allows you to build web apps as desktop apps and integrate with OS-level APIs, just as you would in a native app.</p><p>To quote the <a href="http://electron.atom.io/">Electron website</a> itself:</p><blockquote><p><em>If you can build a website, you can build a desktop app. Electron is a framework for creating native applications with web technologies like JavaScript, HTML, and CSS. It takes care of the hard parts so you can focus on the core of your application.</em></p></blockquote><p>This provides the possibility of the elusive ability to "write once, run anywhere". Of course, it can be trickier in implementation, but multiple companies have successfully pulled this off, including Slack, GitKraken, and WhatsApp.</p><p>There's a lot more to say about the specifics of Electron. For the sake of this tutorial, here are some basics that are helpful to know:</p><ul><li><p>Electron is a fork of Chromium. At its core, an Electron app is using a manager process to spawn webpages in separate helper processes, just as Google Chrome does with tabs.</p></li><li><p>The manager process is referred to as the main process. Each webpage is referred to as a renderer process and manifests as an actual window in your app.</p></li><li><p>Your app will manifest on the user's machine as multiple processes, just as Chrome does. For example, if your app is called Spend Tracker, it will show up in a Process List as:</p><ul><li><p>Spend Tracker</p></li><li><p>Spend Tracker Helper</p></li></ul></li></ul><p>There are often multiple Helper processes running, especially if your app makes use of multiple windows.</p><h3><strong>What is Plaid?</strong></h3><p>Plaid is a FinTech company that provides a modern financial services API. Integrating with Plaid provides your users with the benefits of Plaid's phenomenal UX while handling all of the complexities of managing a user's financial data.</p><p>If you've linked a bank account to an app recently (such as on a platform like Coinbase), you may have encountered a nice widget that allows you to easily search for your bank and select an account. This is one of the core offerings of Plaid: the Plaid Link service, which is part of what we will be adding to our personal finance app.</p><h2><strong>Up and Running with Electron React Boilerplate</strong></h2><p>Now that we have the formalities out of the way. Let's dig in. If you've developed in React before, you're aware that there can be a lot of setup just to get and up and running with everything. This is why tools like Facebook's <a href="https://github.com/facebookincubator/create-react-app">create-react-app</a> are so useful - they handle all of the setup and allow you to quickly start developing the components that make your app unique.</p><p>Since we'll be developing our Electron app using React, it'd be great to have such tooling to handle all of the messy parts of setup.</p><p>However, from personal experience, I can tell you that create-react-app doesn't provide you the best development experience with Electron. create-react-app is rather opinionated about its implementation, resulting in situations like their <a href="https://github.com/facebookincubator/create-react-app/issues/214">deliberate lack of support for decorators</a>.</p><p>Essentially, create-react-app forces you to work off of a certain folder structure that doesn't work so elegantly with how you'll likely want to structure your Electron app.</p><p>Fortunately, there are plenty of Electron React boilerplate repositories out there that handle the majority of the setup for you. For the purposes of this article, we'll use the following starter app:</p><p><a href="https://github.com/chentsulin/electron-react-boilerplate">https://github.com/chentsulin/electron-react-boilerplate</a></p><p>The instructions are in the repository, but all you need to do is:</p><pre><code><code>git clone --depth=1 https://github.com/chentsulin/electron-react-boilerplate.git spend-tracker
cd $_
npm install
npm run dev
</code></code></pre><p>Within a few moments, you should see an Electron app pop up. It should have content which is very similar to the popular React demo counter app.</p><h2><strong>Minor Tweaks for a Basic UI</strong></h2><p>Now that we're up and running, let's just make a few quick adjustments for the purposes of our use case. To start, we simply want this app to display a number. So let's tweak the existing UI to make that happen.</p><p>To dig into the code, simply navigate into the app/ folder.</p><p>The main page of this boilerplate is stored in <code>containers/HomePage.js</code>. However, that page simply renders the <code>Home</code> component, stored in <code>components/Home.js</code>, which you should open to make the changes.</p><p>Navigating to the <code>render</code> method of the component we, see:</p><pre><code><code>&lt;div&gt;
  &lt;div className={styles.container}&gt;
    &lt;h2&gt;Home&lt;/h2&gt;
    &lt;Link to="/counter"&gt;to Counter&lt;/Link&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></code></pre><p>We can simply change this to:</p><pre><code><code>&lt;div&gt;
  &lt;div className={styles.container}&gt;
    &lt;h2&gt;Balance&lt;/h2&gt;
    &lt;h3&gt;$10,000.55&lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></code></pre><p>Great, now you should see the following in the app:</p><h2><strong>Integrating with Plaid Link</strong></h2><p>Now it's time to integrate with the Plaid service itself. If you haven't already, you'll need to sign up for a Plaid developer account.</p><h3><strong>Signup for a Plaid Developer Account</strong></h3><p>You can sign up for the Plaid developer account here:</p><p><a href="https://dashboard.plaid.com/signup">Get Started with Plaid</a></p><p>Once you've signed in, you have to request access for developer-level permissions. This level of permissions allows you to access live data, i.e. account balances from your real accounts, up to a certain limit. In this process, Plaid requires that you fill out a little bit of information about your project and your intentions for using their API.</p><p>Making this request will open a new ticket with the Plaid team via your account.</p><p>In the meantime, we can make use of their Sandbox environment to begin integrating.</p><p>By registering with Plaid, you should have been provided with three credentials:</p><ul><li><p>Client ID</p></li><li><p>Secret</p></li><li><p>Public Key</p></li></ul><p>You can view these keys by navigating to: <a href="https://dashboard.plaid.com/account/keys">Account: Keys</a></p><p>The intended use case for Plaid is for your client app to communicate with a server you've set up. Your server manages the client ID and secret to prevent exposure through your client app. Your clients then submit the public key in their requests to your server.</p><p>The basic Plaid Authentication Flow looks like this:</p><ul><li><p>A user opens your app and interacts with the Plaid Link widget</p></li><li><p>The user selects their institution through Plaid Link and logs in with their bank's credentials, sending the request directly to Plaid's servers.</p></li><li><p>Your app receives a callback containing a Public Token to associate with this particular set of credentials.</p></li><li><p>The Public Token cannot get the user's account data. In order to request account data, you must dispatch a request for an Access Token to Plaid with the Public Token, your client ID, and your app's secret.</p></li><li><p>Once the Access Token has been retrieved, your app can fetch account data for the selected institution directly from Plaid.</p></li></ul><h3><strong>Important Note: This App is Intended for Personal Use Only</strong></h3><p>In the above description of the authentication flow, you may have noticed that a server is involved. However, for the purposes of this tutorial, rather than deal with setting up a server, it's easier to just have everything embedded in the app.</p><p>This is not Plaid's intended usage for working with their API. If you were to distribute your app with your client ID and secret included, it would be easy for others to pull out your credentials and make free use of them.</p><p>What we're building here is a local, non-distributable app for demo purposes. Should you want to build this into something distributable, some options might be:</p><ul><li><p>The obvious: set up a server that integrates with Plaid in the intended way</p></li><li><p>Bring Your Own Credentials: Constrain your user base to technical users, and provide the ability to enter client ID and secret into the app, with the promise that you don't ship their credentials off anywhere. Naturally, your app had better be open-source if you want to pull off something like this.</p></li></ul><p>Having said that, as a reader of this post, you're most likely technically-minded; so you can simply build the app for yourself and use it as you see fit.</p><h3><strong>What is Plaid Link?</strong></h3><p>Plaid Link is a component of Plaid's service that provides a drop-in module with a secure, elegant authentication flow for each institution that Plaid supports. (<a href="https://plaid.com/docs/transition-guide/">Source</a>)</p><p>It's a pretty sleek interface, so let's get it into our app.</p><h3><strong>Plaid Setup and Handling Storage</strong></h3><p>In order to work with Plaid, we're going to need to install two dependencies: <code>plaid</code>, and <code>react-plaid-link</code>.</p><p>The first, <code>plaid</code>, is Plaid's official npm package for interacting with their API. The second, <code>react-plaid-link</code>, allows us to easily integrate Plaid Link into our app as a React component.</p><p>So, let's install them:</p><pre><code><code>npm install plaid react-plaid-link
</code></code></pre><p>With our dependencies installed, we can add our Plaid developer credentials into the app. As mentioned above, this is not how you would do it for a production-ready app.</p><p>First, we'll open up <code>components/Home.js</code>.</p><p>At the top of the file, let's import the two libraries we just installed:</p><pre><code><code>import plaid from 'plaid';
import PlaidLink from 'react-plaid-link';
</code></code></pre><p>Next, let's place our credentials into the app as constants:</p><pre><code><code>const CLIENT_ID = 'your-client-id';
const SECRET = 'your-secret';
const PUBLIC_KEY = 'your-public-key';
</code></code></pre><p>After that, we'll create a new constructor for the component to initialize the Plaid client and setup our initial state:</p><pre><code><code>export default class Home extends Component {
  constructor(props) {
    super(props);

    this.state = {
      items: getItems(),
      balance: 0,
      loading: false,
      error: null,
    };

    this.client = new plaid.Client(
      CLIENT_ID,
      CLIENT_SECRET,
      PUBLIC_KEY,
      plaid.environments.sandbox,
    );
  }
</code></code></pre><p>Before we continue, let's talk a little bit about how we're going to track information from Plaid.</p><p>In Plaid's terminology, an <strong>Item</strong> is a link to a user's institution. As mentioned above, a Public Token is returned when a user links an institution, and we send that Public Token to Plaid in order to get an Access Token to retrieve account data.</p><p>For this first post, we're only going to calculate the balance from one institution, but we should set things up in a way such that there's not too much friction to add support for multiple institutions later.</p><p>Since we're literally working in a webpage, we'll make use of <code>localStorage</code> for the purpose of tracking what institutions the user has linked.</p><p>Here's the structure we'll use to track institutions in <code>localStorage</code>:</p><pre><code><code>{
  items: {
    byId: {
      ins_9: {
        id: "ins_9",
        name: "Capital One",
        publicToken: "public-token",
        accessToken: "access-token"
      }
    },
    allIds: [
      "ins_9"
    ]
  }
}
</code></code></pre><p>In the above structure, we maintain an array of all IDs, and an object with the individual IDs as keys. This is a convenience that allows us to easily work with the data in either format.</p><p><code>localStorage</code> only stores strings, so we'll be serializing and deserializing our objects to work with them. As such, it makes sense to define a few helper methods.</p><p>First, in <code>localStorage</code>, we'll refer to our data through a key, <code>items</code>. As a good practice, let's create a <code>const</code> to represent that key.</p><pre><code><code>const KEY_ITEMS = 'items';
</code></code></pre><p>Next, let's define the method that will retrieve our items from <code>localStorage</code>. Additionally, the method initializes the object in <code>localStorage</code> if it's not already set.</p><pre><code><code>const getItems = () =&gt; {
  let items = JSON.parse(localStorage.getItem(KEY_ITEMS));
  if (!items) {
    items = {
      byId: {},
      allIds: [],
    };
    setItems(items);
  }

  return items;
};
</code></code></pre><p>Then, we'll make a method, <code>setItems</code>, which simply updates the object:</p><pre><code><code>const setItems = items =&gt; {
  localStorage.setItem(KEY_ITEMS, JSON.stringify(items));
};
</code></code></pre><p>Finally, we'll make a method <code>addItem</code> which makes use of both previous methods to add a new item to the object:</p><pre><code><code>const addItem = item =&gt; {
  const oldItems = getItems();
  if (oldItems.byId[item.id]) {
    return;
  }

  const items = {
    byId: {
      ...oldItems.byId,
      [item.id]: item,
    },
    allIds: [...oldItems.allIds, item.id],
  };

  setItems(items);
};
</code></code></pre><p>The above method ensures that we dont add duplicate keys by checking if the ID is already in the object, and returns immediately if it is.</p><p>With these methods in place, we can now get to work at configuring our component to work with Plaid Link.</p><h3><strong>Integrating Plaid Link</strong></h3><p>The <code>react-plaid-link</code> component renders in our app as a button that the user can click to login to their institution through Plaid.</p><p>Our first changes will take place in the <code>render</code> method. As a reminder, this is what the method currently looks like:</p><pre><code><code>render() {
  return (
    &lt;div&gt;
      &lt;div className={styles.container}&gt;
        &lt;h2&gt;Balance&lt;/h2&gt;
        &lt;h3&gt;$10,000.55&lt;/h3&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    )
  }
</code></code></pre><p>Now let's update it to reflect the component's state and any institutions stored in <code>localStorage</code>.</p><p>First, in the beginning of the <code>render</code> method, we'll retrieve any state relevant to the UI, and also retrieve the <code>items</code> from <code>localStorage</code>:</p><pre><code><code>const { balance, loading, error } = this.state;
const items = getItems();
</code></code></pre><p>Next, we know we want to display different messages in place of the balance depending on the state, so let's write those conditions:</p><pre><code><code>let value;
if (loading) {
  value = 'Loading...';
} else {
  value = `$${balance}`;
}
</code></code></pre><p>We create a variable, <code>value</code>, which has a value of <code>'Loading...'</code> if the component's state is loading, and otherwise displays the current balance. If the balance hasn't been computed, the component's initial state has the balance set to $0.</p><p>Now, let's make some tweaks to how elements actually get rendered, and include the <code>PlaidLink</code> component. We'll look at the whole chunk and then break it up:</p><pre><code><code>return (
  &lt;div&gt;
    &lt;div className={styles.container}&gt;
      {!error &amp;&amp; (
        &lt;div&gt;
          &lt;h1&gt;Balance&lt;/h1&gt;
          &lt;h2&gt;{value}&lt;/h2&gt;
        &lt;/div&gt;
      )}
      {error &amp;&amp; &lt;h3&gt;{error}&lt;/h3&gt;}
      {items.allIds.length &lt; 1 &amp;&amp; (
        &lt;div&gt;
          &lt;h3&gt;Link to your bank to view your account balance.&lt;/h3&gt;
          &lt;PlaidLink
            publicKey={PUBLIC_KEY}
            product="auth"
            env="sandbox"
            apiVersion={'v2'}
            clientName="Spend Tracker"
            onSuccess={this.onItemLinked.bind(this)}
          /&gt;
        &lt;/div&gt;
      )}
    &lt;/div&gt;
  &lt;/div&gt;
);

</code></code></pre><p>First, we only display the balance if there's no error (i.e. error is <em>falsy</em>). If there is an error, we display the error message instead.</p><pre><code><code>{!error &amp;&amp; (
  &lt;div&gt;
    &lt;h1&gt;Balance&lt;/h1&gt;
    &lt;h2&gt;{value}&lt;/h2&gt;
  &lt;/div&gt;
)}
{error &amp;&amp; &lt;h3&gt;{error}&lt;/h3&gt;}
</code></code></pre><p>And then, we only want to render the <code>PlaidLink</code> component if the user hasn't linked any accounts yet:</p><pre><code><code>{items.allIds.length &lt; 1 &amp;&amp; (
  &lt;div&gt;
    &lt;h3&gt;Link to your bank to view your account balance.&lt;/h3&gt;
    &lt;PlaidLink
      publicKey={PUBLIC_KEY}
      product="auth"
      env="sandbox"
      apiVersion={'v2'}
      clientName="Spend Tracker"
      onSuccess={this.onItemLinked.bind(this)}
    /&gt;
  &lt;/div&gt;
)}
</code></code></pre><p>The parameters to PlaidLink are documented on the repository. Here's what's important to note:</p><ul><li><p><code>product</code> is important - its values are essentially scopes of behavior for accessing Plaid. We're requesting <code>auth</code> because it allows us to view all accounts and overall balances. If we wanted to view individual transactions, we'd have to request <code>transactions</code> as well.</p></li><li><p><code>env</code> is set to <code>sandbox</code>. Once your developer account is approved, it needs to be changed to <code>development</code> to access your real financial data.</p></li><li><p><code>onSuccess</code> is the method that gets called once the user successfully logs into and links an institution. The callback, which we'll go into next, is the starting point for requesting account data.</p></li></ul><h3><strong>Handling Data From Plaid</strong></h3><p>Before we can successfully run the app, we have to define how our app responds once the user has linked an account.</p><p>As mentioned above, the first thing we need to do is define our <code>onSuccess</code> method, which will be named <code>onItemLinked</code>:</p><pre><code><code>onItemLinked(publicToken, metadata) {
  const { institution_id: id, name } = metadata.institution;

  this.client
    .exchangePublicToken(publicToken)
    .then(res =&gt; {
      const { access_token: accessToken } = res;
      addItem({
        id,
        name,
        publicToken,
        accessToken,
      });

      this.fetchBalance();
    })
    .catch(() =&gt; {
      this.setState({
        ...this.state,
        error: 'Unable to authenticate with service',
      });
    });
}
</code></code></pre><p>The method receives two parameters, <code>publicToken</code> and <code>metadata</code>. <code>publicToken</code> is all that we need to get an <code>accessToken</code>, but <code>metadata</code> contains information about the institution, such as name and ID, that we want to track.</p><p>Using the destructuring alias syntax, we access <code>institution_id</code> and store it as a variable, <code>id</code>, as well as <code>name</code>, from <code>metadata.institution</code>.</p><p>Now, we need to make another request. This is the request that allows us to exchange our <code>publicToken</code> for an <code>accessToken</code>. Using the Plaid client that we setup earlier, we invoke <code>exchangePublicToken</code>, which returns a Promise.</p><p>From the response, we can easily grab the <code>accessToken</code>.</p><p>It's at this point that we invoke our storage helper method, <code>addItem</code>. This synchronizes all the pertinent information about the user's linked financial institution, including the tokens. You might remember that Plaid refers to this as an <code>Item</code>.</p><p>Finally, we invoke another method, <code>fetchBalance</code>, which makes use of the <code>accessToken</code> to retrieve the total balance.</p><pre><code><code>fetchBalance() {
  const items = getItems();

  if (items.allIds.length &gt; 0) {
    const item = items.byId[items.allIds[0]];
    const { accessToken } = item;
    this.setState({ ...this.state, loading: true });
    this.client
      .getBalance(accessToken, {})
      .then(res =&gt; {
        const balance = res.accounts.reduce((val, acct) =&gt; val + acct.balances.available, 0);
        this.setState({ ...this.state, balance, loading: false });
      })
      .catch(() =&gt; {
        this.setState({
          ...this.state,
          loading: false,
          error: 'Unable to get balance.',
        });
      });
  }
}
</code></code></pre><p>This method also needs to be invoked from <code>componentWillMount</code>:</p><pre><code><code>componentWillMount() {
  this.fetchBalance();
}
</code></code></pre><p>This ensures that, if the user reopens the app after linking an account, it can simply proceed to fetching the user's balance.</p><p>Diving into the <code>fetchBalance</code> method, we first retrieve the <code>items</code> from <code>localStorage</code>. Since we invoke this method from <code>componentWillMount</code>, it's possible that the user has not linked any institutions, and so we don't want to proceed if there's nothing to request from yet.</p><p>Once we're sure that they've linked an institution, we simply get the first institution in the list. This is because, for the purposes of this post, we're only focused on working with one institution right now. Later in this series, we'll look into managing multiple institutions.</p><p>Now that we have the institution, we can simply retrieve the <code>accessToken</code> from the item and invoke the Plaid method <code>getBalance</code>.</p><p>Once we've received a response, we use <code>Array.prototype.reduce</code> on the <code>accounts</code> array to sum up the available balances across all accounts and update the component's state to reflect the final amount.</p><p>And of course, if there is any issue that raises an error, we update the state to indicate that something went wrong.</p><h2><strong>That's All</strong></h2><p>And that's it for Part 1. To recap, we covered quite a lot in this post:</p><ul><li><p>Getting setup with Electron React boilerplate</p></li><li><p>Understanding Plaid and how to integrate it into an app</p></li><li><p>How to manage data from Plaid using <code>localStorage</code>.</p></li><li><p>Integrating Plaid and Plaid Link into our component to successfully retrieve data from an institution</p></li><li><p>Calculating the sum of balances across all of the user's accounts</p></li></ul><p>In Part 2, we'll dig into:</p><ul><li><p>Linking and viewing multiple institutions</p></li><li><p>Removing institutions</p></li><li><p>Adding a refresh button</p></li><li><p>Adding a filter to toggle different institutions</p></li></ul><p>If you have any questions, don't hesitate to reach out in the comments.</p>]]></content:encoded></item><item><title><![CDATA[Panel Discussion on Cybersecurity, AI and Digitalization ]]></title><description><![CDATA[When I was at Java2Days this year, I was pulled into a panel discussion about Cybersecurity, AI and Digitalization.]]></description><link>https://www.wecodefire.com/p/panel-discussion-on-cybersecurity</link><guid isPermaLink="false">https://www.wecodefire.com/p/panel-discussion-on-cybersecurity</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Sun, 03 Dec 2017 18:32:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/LOqIJL5QSiY" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div id="youtube2-LOqIJL5QSiY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;LOqIJL5QSiY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/LOqIJL5QSiY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>When I was at Java2Days this year, I was pulled into a panel discussion about Cybersecurity, AI and Digitalization. The discussion ranged in talks about privacy, e-voting, and if artificial intelligence will take your job as a developer.</p><p>As a true lover of Star Wars, I was wearing my AT-AT shirt which you can <a href="https://www.target.com/p/men-s-star-wars-at-at-scene-t-shirt/-/A-82365938">find at Target</a>.</p><p>Here's a quick shot from the Target website, and it looks awesome:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Ioj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Ioj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png 424w, https://substackcdn.com/image/fetch/$s_!8Ioj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png 848w, https://substackcdn.com/image/fetch/$s_!8Ioj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png 1272w, https://substackcdn.com/image/fetch/$s_!8Ioj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Ioj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png" width="234" height="299.1645569620253" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1414,&quot;width&quot;:1106,&quot;resizeWidth&quot;:234,&quot;bytes&quot;:861675,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8Ioj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png 424w, https://substackcdn.com/image/fetch/$s_!8Ioj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png 848w, https://substackcdn.com/image/fetch/$s_!8Ioj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png 1272w, https://substackcdn.com/image/fetch/$s_!8Ioj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9c30e4-14b5-4c1a-9463-ebac085b861b_1106x1414.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The other participants on the panel were:</p><ul><li><p>Linda Naeun Lee from <a href="https://www.torproject.org/">Tor Project</a></p></li><li><p>Steve Kosten (<a href="https://twitter.com/skosten">@skosten</a>) from <a href="https://www.cypressdatadefense.com/">Cypress Data Defense</a></p></li><li><p>Aaron Cure (<a href="https://twitter.com/curea">@curea</a>) from <a href="https://www.pumascan.com/">Puma Security</a></p></li><li><p>Krasimir Kotsev</p></li></ul><p>What do you think about the challenges we're currently facing with cybersecurity and privacy? Or the constant drumbeat of machine learning and AI getting ever closer to replacing what once was human-only functions? Let us know in the comments.</p>]]></content:encoded></item><item><title><![CDATA[Simplifying Redux Saga Entry File Markdown]]></title><description><![CDATA[From georigami on flickr]]></description><link>https://www.wecodefire.com/p/simplifying-redux-saga-entry-file</link><guid isPermaLink="false">https://www.wecodefire.com/p/simplifying-redux-saga-entry-file</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Sun, 19 Nov 2017 18:59:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GnJu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GnJu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GnJu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GnJu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GnJu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GnJu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GnJu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg" width="640" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Blue Sunflower&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Blue Sunflower" title="Blue Sunflower" srcset="https://substackcdn.com/image/fetch/$s_!GnJu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GnJu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GnJu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GnJu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcffe30be-ffd1-44b5-b9bd-85cbc72909cc_640x480.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://www.flickr.com/photos/georigami/16396244361/in/photolist-qYT3di-WiwJz6-9CJa2N-koFtcM-SthJiZ-9pExHC-NHRHp-Wix3fX-WrzH8j-nKTsja-gYBjKA-ie3sc5-G9PFsp-8kFEyR-roM1Sn-21yurkP-aFW3wZ-dvbogZ-e8pzk1-8W7c3g-9ejuS3-9EHXgY-VUUiHq-aaBbBG-21yuq9R-n7wrUX-cigvj7-dxt8Tn-av8vUh-icWyTi-p2xRyG-iRFn1J-21yuqPt-nQcYbU-dFGEar-fdgHPx-XTfFfR-qn9LSP-ie2DUA-p2AFNT-BZDiAg-Zd7Pmi-Zd7NBH-6CfmoK-dd57Ps-8w2UCf-qVJKmb-rfwKnn-pJqnq3-rA2xMC">From georigami on flickr</a></p><p>My entry file with Redux Saga generally looks like this:</p><pre><code>import {all} from "redux-saga/effects";

import {
    watchLoginRequest,
    watchLogoutRequest,
    watchCurrentUserRequest,
    watchUpdateProfileRequest
} from "./authSaga";

import {
    watchGetUserList,
    watchGetUser,
    watchAddUser,
    watchUpdateUser,
    watchDeleteUser
} from "./adminSaga";

export default function* rootSaga() {
    yield all([
        watchLoginRequest(),
        watchLogoutRequest(),
        watchCurrentUserRequest(),
        watchUpdateProfileRequest(),
        watchGetUserList(),
        watchGetUser(),
        watchAddUser(),
        watchUpdateUser(),
        watchDeleteUser(),
    ]);
}</code></pre><p>As you can see a set of imports and then an array of functions added to the generator function used in my store module. This works fine, but I often find that swapping between a specific sagas file and the rootSagas file to be an unnecessary step prone to error.</p><p>In the individual saga, these list of functions that get called are pointing to non-blocking yields to handle the action types spawned from the action creators that in turn will call a generator function to handle that action type:</p><pre><code>export function* watchLoginRequest() {
    yield* takeEvery(types.LOGIN_REQUEST, loginRequest);
}</code></pre><p>These work fine, can be organized near the end of your individual sagas files, but the way I had it setup, contained too many places to edit and possibly miss.</p><p>I&#8217;ve taken the liberty of using some ES7 magic to fix my pain. Here&#8217;s the new <code>rootSaga.js</code>:</p><pre><code>import {all} from "redux-saga/effects";
import { sagas as authSagas } from "./authSaga";
import { sagas as adminSagas } from "./adminSaga";

export default function* rootSaga() {
    yield all({
        ...authSagas,
        ...adminSagas,
    });
}</code></pre><p>I like this a lot more, and when you have more than one saga, you can see how we just use the spread operator to combine things nicely. As an example in one of our saga files, here&#8217;s how we can handle our watch generator functions:</p><pre><code>export const sagas = {
    watchCurrentUserRequest: takeEvery(types.CURRENT_USER_REQUEST, currentUserRequest),
    watchUpdateProfileRequest: takeEvery(types.UPDATE_PROFILE_REQUEST, updateProfileRequest),
    watchLoginRequest: takeEvery(types.LOGIN_REQUEST, loginRequest),
    watchLogoutRequest: takeEvery(types.LOGOUT_REQUEST, logoutRequest),
};</code></pre><p>Can you see any way to inject any further brevity into the above? This pattern is common in a lot of our teams redux-saga code, and I like the way this looks for refactoring.</p>]]></content:encoded></item><item><title><![CDATA[Fixing Regenerator Runtime Error Integrating Redux Saga]]></title><description><![CDATA[While integrating redux-saga an annoying little error may pop up in the console.]]></description><link>https://www.wecodefire.com/p/fixing-regenerator-runtime-error</link><guid isPermaLink="false">https://www.wecodefire.com/p/fixing-regenerator-runtime-error</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Tue, 06 Dec 2016 18:46:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7c80f55b-c75e-4b5d-98ac-508fd2785c0b_5184x3888.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!59O8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!59O8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg 424w, https://substackcdn.com/image/fetch/$s_!59O8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg 848w, https://substackcdn.com/image/fetch/$s_!59O8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!59O8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!59O8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg" width="678" height="508.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:678,&quot;bytes&quot;:2692224,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!59O8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg 424w, https://substackcdn.com/image/fetch/$s_!59O8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg 848w, https://substackcdn.com/image/fetch/$s_!59O8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!59O8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79caf8dc-abc0-42a8-9e84-65f7cc80bced_5184x3888.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>While integrating <a href="http://yelouafi.github.io/redux-saga/">redux-saga</a> an annoying little error may pop up in the console.</p><pre><code><code>Uncaught ReferenceError: regeneratorRuntime is not defined
</code></code></pre><p>It took a bit of research to figure out why, and it shouldn't have since the notice is listed in the README for <code>redux-saga</code>. Most browsers do not support ES2015 generators, so require using a polyfill.</p><p>I am going to assume usage of the <a href="https://github.com/coryhouse/react-slingshot">react-slingshot</a> bootstrap as mentioned in a previous post about <a href="https://github.com/mysticcoders/www/blob/master/blog/a-usable-bootstrap-with-react-slingshot">usable bootstrap with react-slingshot</a>.</p><p>Add the import for <code>babel-polyfill</code> prior to importing <code>redux-saga</code> to the <code>src/store/configureStore.js</code>.</p><pre><code>import 'babel-polyfill';
import createSagaMiddleware from 'redux-saga';</code></pre><p>Enjoy.</p>]]></content:encoded></item><item><title><![CDATA[A Usable Bootstrap With React Slingshot ]]></title><description><![CDATA[<svg version="1.1" id="Layer_2" width="300" x="0px" y="0px" viewBox="0 0 600 600">]]></description><link>https://www.wecodefire.com/p/a-usable-bootstrap-with-react-slingshot</link><guid isPermaLink="false">https://www.wecodefire.com/p/a-usable-bootstrap-with-react-slingshot</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Sat, 03 Dec 2016 19:11:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RkUB!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad89ba-f6e4-4148-b75e-e76d4dfc26e6_593x593.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&lt;svg version="1.1" id="Layer_2" width="300" x="0px" y="0px" viewBox="0 0 600 600"&gt;</p><p>&lt;circle fill="#00D8FF" cx="299.529" cy="299.628" r="50.167"/&gt;</p><p>&lt;path fill="none" stroke="#00D8FF" stroke-width="24" stroke-miterlimit="10" d="M299.529,197.628</p><p>&#9;c67.356,0,129.928,9.665,177.107,25.907c56.844,19.569,91.794,49.233,91.794,76.093c0,27.991-37.041,59.503-98.083,79.728</p><p>&#9;c-46.151,15.291-106.879,23.272-170.818,23.272c-65.554,0-127.63-7.492-174.29-23.441c-59.046-20.182-94.611-52.103-94.611-79.559</p><p>&#9;c0-26.642,33.37-56.076,89.415-75.616C167.398,207.503,231.515,197.628,299.529,197.628z"/&gt;</p><p>&lt;path fill="none" stroke="#00D8FF" stroke-width="24" stroke-miterlimit="10" d="M210.736,248.922</p><p>&#9;c33.649-58.348,73.281-107.724,110.92-140.48c45.35-39.466,88.507-54.923,111.775-41.505</p><p>&#9;c24.248,13.983,33.042,61.814,20.067,124.796c-9.81,47.618-33.234,104.212-65.176,159.601</p><p>&#9;c-32.749,56.788-70.25,106.819-107.377,139.272c-46.981,41.068-92.4,55.929-116.185,42.213</p><p>&#9;c-23.079-13.31-31.906-56.921-20.834-115.233C153.281,368.316,176.758,307.841,210.736,248.922z"/&gt;</p><p>&lt;path fill="none" stroke="#00D8FF" stroke-width="24" stroke-miterlimit="10" d="M210.821,351.482</p><p>&#9;c-33.746-58.292-56.731-117.287-66.312-166.255c-11.544-58.999-3.382-104.109,19.864-117.566</p><p>&#9;c24.224-14.024,70.055,2.244,118.14,44.94c36.356,32.28,73.688,80.837,105.723,136.173c32.844,56.733,57.461,114.209,67.036,162.582</p><p>&#9;c12.117,61.213,2.309,107.984-21.453,121.74c-23.057,13.348-65.249-0.784-110.239-39.499</p><p>&#9;C285.567,460.886,244.898,410.344,210.821,351.482z"/&gt;</p><p>&lt;/svg&gt;</p><p>Getting started with [React](https://facebook.github.io/react/) can be a bit daunting, and as with using things like AngularJS I've found that using a bootstrap is a great way to start. With that in mind, I've chosen the wonderful [react-slingshot](https://github.com/coryhouse/react-slingshot) from [@housecor](https://twitter.com/housecor). It contains a demo which can be removed with an `npm script` and from which we'll extract what I feel is most useful including: integration with redux, react-router, and redux-thunk.</p><p>Most [React](https://facebook.github.io/react/) repositories seem to dispense with build tools and instead use a mixture of npm scripts and webpack to achieve what it needs to achieve. Just recently a new package manager came out to unseat the stalwart in `npm`, we're using [yarn](https://yarnpkg.com), please follow the install instructions for your particular environment.</p><p>&lt;!--more--&gt;</p><p>Clone the `react-slingshot` repository using the following `git` command:</p><pre><code>% git clone git@github.com:coryhouse/react-slingshot.git</code></pre><p>First thing we'll do after cloning `react-slingshot` locally is remove the demo as it isn't useful any longer</p><pre><code>yarn remove-demo</code></pre><p>## Main entrypoint</p><p>Let's add the necessary items for using redux and integrating react-router. Open up the `src/index.js` and paste the following in:</p><pre><code>/* eslint-disable import/default */

import React from 'react';

import {render} from 'react-dom';

import { Provider } from 'react-redux';

import { Router, browserHistory } from 'react-router';

import { syncHistoryWithStore } from 'react-router-redux';

import routes from './routes';

import configureStore from './store/configureStore';

const store = configureStore();

const history = syncHistoryWithStore(browserHistory, store);

render(

  &lt;Provider store={store}&gt;

    &lt;Router history={history} routes={routes} /&gt;

  &lt;/Provider&gt;,

  document.getElementById('app')

);</code></pre><p>Let's take this in chunks, the eslint bit is because there's no default export in this file and we want eslint to ignore that. Then we have imports for bringing in react, redux, and the integration with react-router and redux.</p><pre><code>import React from 'react';

import {render} from 'react-dom';

import { Provider } from 'react-redux';

import { Router, browserHistory } from 'react-router';

import { syncHistoryWithStore } from 'react-router-redux';</code></pre><p>The bootstrap already contains a working version to configure the store, and has the integration with `redux&#8208;thunk` for the middleware. We call the exported function to configure the store, and then `syncHistoryWithStore(browserHistory, store)` will save our router state in the redux store.</p><pre><code>import routes from './routes';

import configureStore from './store/configureStore';

const store = configureStore();

const history = syncHistoryWithStore(browserHistory, store);</code></pre><p>This snippet is the entrypoint for our application. The `Provider` component is offered by `redux` and allows us to wrap all other components with access to our store, and inside that we add the `Router` component with access to our store-saved history, and the routes which we will define in the next section. That's it for our index module, let's move on to defining some simple routing.</p><pre><code>render(

  &lt;Provider store={store}&gt;

    &lt;Router history={history} routes={routes} /&gt;

  &lt;/Provider&gt;,

  document.getElementById('app')

);</code></pre><p>## Routes</p><p>Now we'll define our routes module which was referenced in the index file. Create a new file in `src/routes.js` and paste the following in.</p><p>```javascript</p><p>import React from 'react';</p><p>import { Route, IndexRoute } from 'react-router';</p><p>import HomePage from './pages/HomePage';</p><p>export default (</p><p>  &lt;Route path="/"&gt;</p><p>    &lt;IndexRoute component={HomePage}/&gt;</p><p>  &lt;/Route&gt;</p><p>);</p><p>```</p><p>This is a typical [react-router](https://github.com/ReactTraining/react-router) file, and you can browse the documentation to find more ways to customize things.</p><p>## Pages</p><p>You may have notice we've identified another missing file `src/pages/HomePage.js`, which we will create now.</p><p>```javascript</p><p>import React from 'react';</p><p>const HomePage = () =&gt; {</p><p>  return (</p><p>    &lt;h1&gt;Hello, World!&lt;/h1&gt;</p><p>  );</p><p>};</p><p>export default HomePage;</p><p>```</p><p>This is the simplest of components, a functional stateless component which merely outputs Hello, World! wrapped in an H1 tag. If you attempt to run things now you will still receive errors in the reducers directory. While out of the scope of this quick tutorial, reducers are how an application's state changes in response to something happening, you can [read more in the Redux docs](http://redux.js.org/docs/basics/Reducers.html).</p><p>Let's open `src/reducers/index.js` and modify with the following:</p><p>```javascript</p><p>import { combineReducers } from 'redux';</p><p>import {routerReducer} from 'react-router-redux';</p><p>const rootReducer = combineReducers({</p><p>  routing: routerReducer,</p><p>});</p><p>export default rootReducer;</p><p>```</p><p>Remember, we added `react-router-redux` to our index module, so as our first reducer we need to at the routerReducer to the list of reducers offered up in the `combineReducers` call. It's in this file that you can define more reducers to be included in your `redux` stack.</p><p>## Fin</p><p>With that, browse to http://localhost:3000 and see the familiar "Hello, World!". There is so much more to be done, we can dip into the `redux` portion and start defining actions, action creators, reducers, and use `redux-thunk` for the inevitable need for asyncronous calls in our action creators. This is a first step, stay tuned and we'll dig even deeper into the React / Redux stack.</p><p>And if you weren't in Sofia, Bulgaria for [CodeMonsters](http://codemonsters.pro/)/[Java2Days](http://2016.java2days.com) this year, my presentation on [React and Redux](http://www.slideshare.net/kinabalu/react-and-redux) is available on slideshare. Thanks to everyone who was in attendance,</p>]]></content:encoded></item><item><title><![CDATA[Speaking at Java2Days 2014]]></title><description><![CDATA[It's gotten to be a yearly event to visit Sofia in the early part of winter.]]></description><link>https://www.wecodefire.com/p/speaking-at-java2days-2014</link><guid isPermaLink="false">https://www.wecodefire.com/p/speaking-at-java2days-2014</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Thu, 06 Nov 2014 19:55:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3ae30a6d-0096-4322-ae6a-b47787f088b6_200x200.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0ntg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0ntg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png 424w, https://substackcdn.com/image/fetch/$s_!0ntg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png 848w, https://substackcdn.com/image/fetch/$s_!0ntg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png 1272w, https://substackcdn.com/image/fetch/$s_!0ntg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0ntg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png" width="200" height="200" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:200,&quot;width&quot;:200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Java2Days logo&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Java2Days logo" title="Java2Days logo" srcset="https://substackcdn.com/image/fetch/$s_!0ntg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png 424w, https://substackcdn.com/image/fetch/$s_!0ntg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png 848w, https://substackcdn.com/image/fetch/$s_!0ntg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png 1272w, https://substackcdn.com/image/fetch/$s_!0ntg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04ad4111-204b-47c9-b83c-a3edc4b2e1e8_200x200.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>It's gotten to be a yearly event to visit Sofia in the early part of winter. I'll be visiting again in a few weeks for the conference on the 18th and 19th of November. The <a href="http://www.java2days.com/">Java2Days</a> conference is a mix of Java, Cloud and Mobile development talks and has always been a great time. Between the wonderful hosts who organize the event, to the awesome attendees, it's definitely a conference to make time for every year.</p><p>Hope to see some of you there if you're anywhere near Bulgaria. And if you're in Portugal over the next week, I'm there too.</p><p>Ciao!</p>]]></content:encoded></item><item><title><![CDATA[WebSockets Book Pre-released ]]></title><description><![CDATA[We're nearing completion on writing a book for O'Reilly about WebSocket. The book will be released soon as currently available in Early Release on the publisher's site.]]></description><link>https://www.wecodefire.com/p/websockets-book-pre-released</link><guid isPermaLink="false">https://www.wecodefire.com/p/websockets-book-pre-released</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Tue, 04 Nov 2014 22:06:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!a7Uj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a7Uj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a7Uj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png 424w, https://substackcdn.com/image/fetch/$s_!a7Uj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png 848w, https://substackcdn.com/image/fetch/$s_!a7Uj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png 1272w, https://substackcdn.com/image/fetch/$s_!a7Uj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a7Uj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png" width="472" height="620" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:620,&quot;width&quot;:472,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;WebSocket book&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="WebSocket book" title="WebSocket book" srcset="https://substackcdn.com/image/fetch/$s_!a7Uj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png 424w, https://substackcdn.com/image/fetch/$s_!a7Uj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png 848w, https://substackcdn.com/image/fetch/$s_!a7Uj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png 1272w, https://substackcdn.com/image/fetch/$s_!a7Uj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e445ecd-0ace-4d17-9737-e63257d82ea0_472x620.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We're nearing completion on writing a book for <a href="http://www.oreilly.com/">O'Reilly</a> about <a href="http://shop.oreilly.com/product/0636920030485.do">WebSocket</a>. The book will be released soon as currently <a href="http://shop.oreilly.com/product/0636920030485.do">available in Early Release</a> on the publisher's site. It's been quite a ride taking the concept from a blank page, to over 150 pages of in-depth discussion about WebSocket and I'm totally excited to share it with you soon.</p><p>This is something we've never embarked on before. Our main focus has always been offering tech solutions for business problems, giving trainings, and evangelizing and teaching technology in conferences worldwide. Writing a book has been on the goal list for years now, and I'm grateful that I got the opportunity to do so with the team over at O'Reilly.</p><p>Special thanks go out to <a href="http://www.stephanspencer.com/">Stephan Spencer</a> who helped push me into getting this thing done, and many others who cheerleaded along the way.</p><p>Here's a look at the table of contents:</p><ul><li><p>Chapter 1 - Quickstart</p></li><li><p>Chapter 2 - WebSocket API</p></li><li><p>Chapter 3 - Bidirectional Chat</p></li><li><p>Chapter 4 - STOMP Over WebSocket</p></li><li><p>Chapter 5 - WebSocket Compatibility</p></li><li><p>Chapter 6 - WebSocket Security</p></li><li><p>Chapter 7 - TBA</p></li><li><p>Chapter 8 - WebSocket Protocol</p></li></ul><p>Thank you to everyone involved, and please <a href="http://shop.oreilly.com/product/0636920030485.do">buy the pre-release</a> if you're interested, and learn about WebSocket technology today.</p>]]></content:encoded></item><item><title><![CDATA[Apps Are Not Ending, Just Evolving]]></title><description><![CDATA[In a few years it may be possible to get a degree in writing headlines for websites looking to suck in readers.]]></description><link>https://www.wecodefire.com/p/apps-are-not-ending-just-evolving</link><guid isPermaLink="false">https://www.wecodefire.com/p/apps-are-not-ending-just-evolving</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Sun, 26 Oct 2014 16:04:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!j4j6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j4j6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j4j6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j4j6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j4j6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j4j6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j4j6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg" width="462" height="346.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:462,&quot;bytes&quot;:351563,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j4j6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j4j6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j4j6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j4j6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb3810c-a3ad-45b4-a3dd-0f2c7b668130_3200x2400.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In a few years it may be possible to get a degree in writing headlines for websites looking to suck in readers. BuzzFeed, Gawker and similar have mostly mastered the art of misdirection, pulling you in with a shocking or tantalizing headline only to be let down by the relative ho hum of the payoff. Videos that we've seen several times, the tear jerkers, the shocking, the unlikely hero who doesn't hold our idea of beauty but can really sing.</p><p>A colleague of mine sent an article about <a href="http://blog.intercom.io/the-end-of-apps-as-we-know-them/">"The End Of Apps As We Know Them"</a>. Given that here at Mystic we're in the app development space, this is of particular interest.</p><p>The basic premise, is that the new paradigm for designing and delivering apps to end users is:</p><ol><li><p>Designing systems and not destinations</p></li><li><p>Notification screens in iOS 8 and Android are going to be really huge</p></li></ol><p>I don't disagree with most of the article. I have found like countless others, that the expanded toolset available via a notification to be very handy. The expanded nature of the share button to include extensions and other share options are also serving a much needed hole in the mobile experience (looking at you <a href="http://getpocket.com/">Pocket</a> and <a href="https://agilebits.com/onepassword">1Password</a>).</p><p>It goes off the rails for me in the narrow approach to how apps are changing. When I read it, I agree with the obvious, that apps are expanding into other areas of the phone, offering us new ways to consume content. It treats the reader as if they are a mere consumer of content, and not the creator. Consumers of content are interesting for their value to an app, websites, etc. Creators haven't seen enough change in how content is crafted on mobile other than Siri not sucking that much anymore.</p><p>What are your thoughts? How has creating in the mobile space evolved for you?</p>]]></content:encoded></item><item><title><![CDATA[New Site Design, Mind the Dust]]></title><description><![CDATA[We've decided to take the plunge and do a quick redesign of the site.]]></description><link>https://www.wecodefire.com/p/new-site-design-mind-the-dust</link><guid isPermaLink="false">https://www.wecodefire.com/p/new-site-design-mind-the-dust</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Mon, 20 Oct 2014 19:39:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RWXP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RWXP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RWXP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RWXP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RWXP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RWXP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RWXP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg" width="288" height="453.3626373626374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2292,&quot;width&quot;:1456,&quot;resizeWidth&quot;:288,&quot;bytes&quot;:842854,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RWXP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RWXP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RWXP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RWXP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22d9bfb-5859-4bd1-8545-c7e6b8bd769c_2160x3400.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We've decided to take the plunge and do a quick redesign of the site. The old one was getting a bit long in the tooth, and we couldn't see subjecting anybody to that design any longer. As such, if you see any errors on the site, missing links, big foot, etc, please hit us up on social media and tell us. We're using <a href="http://jekyllrb.com/">Jekyll</a> to power the site, and hosted over at <a href="https://pages.github.com/">Github Pages</a> to keep things super simple.</p><p>Look for the old blog posts to be backfilled in here once we figure out how to work the <code>jekyll-import</code> tool</p>]]></content:encoded></item><item><title><![CDATA[Java2Days 2013 Presentations]]></title><description><![CDATA[Our Java2Days talks have been completed.]]></description><link>https://www.wecodefire.com/p/java2days-2013-presentations</link><guid isPermaLink="false">https://www.wecodefire.com/p/java2days-2013-presentations</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Tue, 03 Dec 2013 19:49:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/499264b1-18b9-49f0-98a8-9a4d24ec30e8_4032x3024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pNHn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pNHn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pNHn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pNHn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pNHn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pNHn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:858819,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pNHn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pNHn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pNHn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pNHn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8de68bec-bc25-4c1c-9b8d-b925ae5d7d3b_4032x3024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Our <a href="http://www.java2days.com/">Java2Days</a> talks have been completed. There is still another day left of amazing talks by amazing speakers. Can't wait to see more talks about WebSockets, <a href="http://ohmdb.com/">OhmDB</a>, and more Java technologies.</p><p>Our talks:</p><ul><li><p><a href="https://github.com/kinabalu/titaniumprez/tree/java2days_2013">Building iOS Applications with JavaScript</a></p></li><li><p><a href="https://github.com/kinabalu/real_time_with_websockets/">Real Time with Websockets</a></p></li></ul><p>Both talks are using<a href="http://lab.hakim.se/reveal-js/#/">reveal.js</a>for display purposes. Thank you again for everyone who attended and participated with questions in the talk.</p>]]></content:encoded></item><item><title><![CDATA[Achieving Focus and Curiosity with SelfControl for Mac]]></title><description><![CDATA[If we spend any time on the tubes, we know that the internet is a large and wonderful place.]]></description><link>https://www.wecodefire.com/p/achieving-focus-and-curiosity-with</link><guid isPermaLink="false">https://www.wecodefire.com/p/achieving-focus-and-curiosity-with</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Tue, 26 Nov 2013 20:25:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LECU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LECU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LECU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LECU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LECU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LECU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LECU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg" width="440" height="330.3021978021978" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1093,&quot;width&quot;:1456,&quot;resizeWidth&quot;:440,&quot;bytes&quot;:3126639,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LECU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LECU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LECU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LECU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa15b7246-9896-4612-9c91-7430caa0abf4_4592x3448.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If we spend any time on the tubes, we know that the internet is a large and wonderful place. It has allowed us to communicate and shrink the world, and learn whatever we wish to learn along the way. This could be how to fold a fitted sheet, learn the meaning behind string theory, or watch some stars spoof an already disturbingly odd music video (cheers Kanye). More and more the useful and useless stuff comes via known suspects: Facebook, Reddit, Twitter, etc.</p><p>So if you'd like to give yourself a timeout, because you have no self control (I don't, it's cool). Use <a href="http://selfcontrolapp.com/">SelfControl.app</a> and give yourself freedom from whatever sites are wasting your time while you're trying to get actual work done. Edit the blacklist, and add the half of the internet that is useless, which usually comes from the above sites first. After starting, those websites will now refuse to load.</p><p>Perfect.</p><p>Curiosity though, always gets the better of me. And while their <a href="https://github.com/slambert/selfcontrol/wiki/FAQ">FAQ</a> states that once SelfControl starts, it can't be stopped for the duration ... that's simply not true. Since we're on a Mac, and we've got a BSD backend, there had to be a firewall involved. So if you'd like to see a list of all the IP addresses (the blacklist sites) that SelfControl is blocking:</p><pre><code>% sudo ipfw list</code></pre><p>Take a look at the line that says <code>"count ip from any to any // BEGIN SELFCONTROL BLOCK"</code> and ends with <code>"count ip from any to any // END SELFCONTROL BLOCK"</code>. All of these IP addresses are what you have asked to block and with a flick of the wrist, this can all be undone. For each IP address within the block, there is a 5-digit identifier number, e.g. 01518. Armed with this simply type:</p><pre><code>% sudo ipfw delete /insert number here/</code></pre><p>Browse what you want yet again. Waste all the time in the world. I apologize in advance.</p>]]></content:encoded></item><item><title><![CDATA[Idea: Context-Sensitive Home Screen ]]></title><description><![CDATA[Have you ever looked at the home screen on your smartphone, and wished that there was a different set of icons on that initial screen? You're driving, so the Messages app, the Camera, Calculator, etc should all be relegated to another screen, hidden away from frisky fingers. Or you're at home, so the Maps application isn't going to be as important, but Spotify and Pandora might, and Safari, etc. Or you've decided to take a trip to a foreign land, and you need the translator, Yelp, Whatsapp, OffMaps, and any other number of apps that are more geared toward your out of country experience.]]></description><link>https://www.wecodefire.com/p/idea-context-sensitive-home-screen</link><guid isPermaLink="false">https://www.wecodefire.com/p/idea-context-sensitive-home-screen</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Thu, 20 Dec 2012 18:55:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d3cc99dd-e8d2-4d72-98da-60a5b4fa750f_170x259.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fbTJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fbTJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png 424w, https://substackcdn.com/image/fetch/$s_!fbTJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png 848w, https://substackcdn.com/image/fetch/$s_!fbTJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png 1272w, https://substackcdn.com/image/fetch/$s_!fbTJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fbTJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png" width="170" height="259" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:259,&quot;width&quot;:170,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fbTJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png 424w, https://substackcdn.com/image/fetch/$s_!fbTJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png 848w, https://substackcdn.com/image/fetch/$s_!fbTJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png 1272w, https://substackcdn.com/image/fetch/$s_!fbTJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b0b707-440c-468f-b1ac-1fb06f626bdc_170x259.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Have you ever looked at the home screen on your smartphone, and wished that there was a different set of icons on that initial screen? You're driving, so the Messages app, the Camera, Calculator, etc should all be relegated to another screen, hidden away from frisky fingers. Or you're at home, so the Maps application isn't going to be as important, but Spotify and Pandora might, and Safari, etc. Or you've decided to take a trip to a foreign land, and you need the translator, Yelp, Whatsapp, OffMaps, and any other number of apps that are more geared toward your out of country experience.</p><p>How would this be achieved?</p><p>One way could be, Bluetooth.</p><p><a href="http://www.indiegogo.com/sticknfind">StickNFind</a> is an indiegogo project with miniscule Bluetooth location stickers that you can place all over the joint. So when your phone / iPad senses you going into the kitchen, it could swap around the icons so that all the cooking apps show up. Or if you move into the living room, all streaming apps get moved to the home screen. One sticker goes in the car, and your phone understands that you're about to go for a drive, so the Messages app moves out, and safe driving apps move in.</p><p>Another way in addition to that, could be Siri.</p><blockquote><p>"Siri, I'm going for a drive".</p><p>"Okay batman, I'll change your homescreen for driving"</p></blockquote><p>And yes, Siri calls me Batman.</p><p>All of the technology we have now, I want a few more lifestyle adjustments. To make this work seamlessly of course, it would require being a part of the OS. I'm not sure if Apple would ever do something like this, but if any jailbreakers are listening, I'd be happy to jailbreak the phone to get this tech.</p>]]></content:encoded></item><item><title><![CDATA[Java2Days 2012 Presentations]]></title><description><![CDATA[Bulgaria.]]></description><link>https://www.wecodefire.com/p/java2days-2012-presentations</link><guid isPermaLink="false">https://www.wecodefire.com/p/java2days-2012-presentations</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Tue, 30 Oct 2012 17:41:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_FkR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_FkR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_FkR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_FkR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_FkR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_FkR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_FkR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg" width="303" height="454.2157598499062" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:799,&quot;width&quot;:533,&quot;resizeWidth&quot;:303,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_FkR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_FkR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_FkR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_FkR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efed380-901f-4889-b076-b64ac5b6fbfc_533x799.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Bulgaria.</p><p>This year, as with every year was an amazing experience filled with rich technical content, amazing speakers and attendees delivering an awesome conference. As promised, here are the presentations and information on the three presentations delivered this year.</p><h3><a href="https://s3.amazonaws.com/mysticweb-bucket/presentations/java2days_2012/The+HTML5+Landscape+-+java2days+2012.pdf">The HTML5 Landscape</a></h3><p>This year, we showed some new demo items, along with layout for the HTML5 landscape talk. From now forward, we'll add to the following repository "<a href="https://github.com/kinabalu/html5demo">HTML5 Demo</a>" and add cool new demos as we have them.</p><h3><a href="https://s3.amazonaws.com/mysticweb-bucket/presentations/java2days_2012/Using+Javascript+to+Build+Native+iOS+Applications+-+java2days+2012.pdf">Using Javascript to Build Native iOS Applications</a></h3><p>For the Javascript builds your iOS application talk, we built an example grabbing the current weather from <a href="http://openweathermap.org/">Open Weather Map</a>. Take a look at the repository "<a href="https://github.com/kinabalu/mobileweather">MobileWeather Titanium</a>" and if you'd like to help spruce it up, let us know.</p><h3><a href="https://s3.amazonaws.com/mysticweb-bucket/presentations/java2days_2012/Advanced+techniques+for+mobile+games+with+HTML5+-+java2days+2012.pdf">Advanced techniques for mobile games with HTML5</a></h3><p>This year, we were asked to co-present with one of the developers at</p><p>http://www.cayetanogaming.com</p><p>. We advised the team on some ideas for how to organize, and also took over a large portion of the presentation to spice it up, and make it more fun. On advisement Kristiyan from Cayetano built out a balloon shooting game available here: <a href="https://github.com/kinabalu/balloonshooter">Balloon Shooter</a>.</p><p>Thank you again for everyone who attended this year, and as always, feel free to contact me if you have questions about anything.</p>]]></content:encoded></item><item><title><![CDATA[Focus on Mobile - HTML5 and iOS Development]]></title><description><![CDATA[Recently I gave several talks in Europe at Scandev on Tour in Stockholm and Java2Days in Sofia.]]></description><link>https://www.wecodefire.com/p/focus-on-mobile-html5-and-ios-development</link><guid isPermaLink="false">https://www.wecodefire.com/p/focus-on-mobile-html5-and-ios-development</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Thu, 10 Nov 2011 17:41:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!t_rX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!t_rX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!t_rX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg 424w, https://substackcdn.com/image/fetch/$s_!t_rX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg 848w, https://substackcdn.com/image/fetch/$s_!t_rX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!t_rX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!t_rX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg" width="500" height="333.4478021978022" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:1159063,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!t_rX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg 424w, https://substackcdn.com/image/fetch/$s_!t_rX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg 848w, https://substackcdn.com/image/fetch/$s_!t_rX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!t_rX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b85090-7b88-4b5e-bfe3-e15413214277_5457x3638.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Recently I gave several talks in Europe at <a href="http://www.scandevtour.se/2011-tour/">Scandev on Tour</a> in Stockholm and <a href="http://java2days.com/">Java2Days</a> in Sofia. Each time I've given a talk, I'm not only teaching up there, but learning from the crowd. It's an immense and enjoyable experience, and a great passion to impart information and knowledge to those who attend my talks. So, thank you, I am deeply appreciative and immensely grateful for everyone who has attended my sessions.</p><p>It has just been released that Adobe is no longer going to be developing Flash for mobile devices. This further solidifies what I discussed in my HTML5 talk in Sofia. Mobile has decided that HTML5 shall be the next frontier for interactive development.</p><p>And here's some of the stuff we talked about:</p><ul><li><p><a href="http://mysticweb-bucket.s3.amazonaws.com/presentations/october_november_2011/The%20HTML5%20Landscape%20-%20java2days%202011.pdf">The HTML5 Landscape</a></p></li><li><p><a href="http://mysticweb-bucket.s3.amazonaws.com/presentations/october_november_2011/Using%20Javascript%20to%20Build%20Native%20iOS%20Applications%20-%20java2days%202011.pdf">Using Javascript to Build Native iOS Applications</a> - Given in Stockholm and Sofia</p></li><li><p><a href="http://mysticweb-bucket.s3.amazonaws.com/presentations/october_november_2011/An%20in%20depth%20look%20at%20Apache%20Wicket%20-%20sdcontour%202011.pdf">An in depth look at Apache Wicket</a> - One of my favorites as I have a deep abiding love for <a href="http://wicket.apache.org/">Apache Wicket</a></p></li></ul><p>And last but not least, I promised the source code to the iOS app written in Titanium. Here's one of the latest revisions which covers using it with the Scandev speaker data, but can be modified to support really any of the conference websites.</p><p><a href="https://github.com/kinabalu/SDCSpeakers">Speakers iPhone App</a></p>]]></content:encoded></item><item><title><![CDATA[The End of an Era]]></title><description><![CDATA[The first computer I spent any time on, was an Apple ][.]]></description><link>https://www.wecodefire.com/p/the-end-of-an-era</link><guid isPermaLink="false">https://www.wecodefire.com/p/the-end-of-an-era</guid><dc:creator><![CDATA[Mystic]]></dc:creator><pubDate>Thu, 06 Oct 2011 19:01:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ppdr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ppdr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ppdr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png 424w, https://substackcdn.com/image/fetch/$s_!Ppdr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png 848w, https://substackcdn.com/image/fetch/$s_!Ppdr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png 1272w, https://substackcdn.com/image/fetch/$s_!Ppdr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ppdr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png" width="560" height="349" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:349,&quot;width&quot;:560,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Ppdr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png 424w, https://substackcdn.com/image/fetch/$s_!Ppdr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png 848w, https://substackcdn.com/image/fetch/$s_!Ppdr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png 1272w, https://substackcdn.com/image/fetch/$s_!Ppdr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc1249a-4cab-4c3d-a065-85b1905adc93_560x349.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The first computer I spent any time on, was an Apple ][.</p><p>Three decades later, I'm writing this on an iMac. And many of you will read it on some Apple-designed device whether it be a Mac, iPhone, iPod Touch, or iPad. The company at the forefront of several revolutionary products, Apple, just lost their Wonka yesterday. We all feel a sense of loss at his passing, I consider him one of the fathers of modern computing. No other iconic figure represents the inventions and devices that many of us use every day like Steve Jobs did.</p><p>For the last 14 years, he rebuilt the company he created from the ground up to be one of the strongest in the world. And how did he resurrect a company that was near death? Passion and a love for the work.</p><blockquote><p><em>Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do.</em></p></blockquote><p>Love what you do, and follow your heart. It's the only true north you can count on, to take you forward in life.</p><p>So many things he brought into creation have dazzled us, and changed the face of industries thought to be immovable. The company he cultivated and taught to be insanely great, yet again, is his legacy. When his resignation came on August 24th, 2011, there was something prophetic in the letters words, and it lingered in the back of my mind:</p><blockquote><p><em>"I have always said if there ever came a day when I could no longer meet my duties and expectations as Apple's CEO, I would be the first to let you know. Unfortunately, that day has come,"</em></p></blockquote><p>A little over a month later, unfortunately, that day has come.</p><p>Our condolences to his family for their loss. Every one of us that he had an impact on, have a bit more illumination and color in our lives thanks to his passion.</p><p><em>"Stay Hungry, Stay Foolish"</em></p>]]></content:encoded></item></channel></rss>