<?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[Sean is Building]]></title><description><![CDATA[A builder’s log of side projects, lessons learned, and the tools helping me move faster and think deeper.]]></description><link>https://newsletter.seanoliver.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!8FOg!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c96770c-2b36-406e-a38d-738b9ef7fe07_256x256.png</url><title>Sean is Building</title><link>https://newsletter.seanoliver.dev</link></image><generator>Substack</generator><lastBuildDate>Sun, 12 Apr 2026 08:20:30 GMT</lastBuildDate><atom:link href="https://newsletter.seanoliver.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Sean Oliver]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[theseanoliver@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[theseanoliver@substack.com]]></itunes:email><itunes:name><![CDATA[Sean Oliver]]></itunes:name></itunes:owner><itunes:author><![CDATA[Sean Oliver]]></itunes:author><googleplay:owner><![CDATA[theseanoliver@substack.com]]></googleplay:owner><googleplay:email><![CDATA[theseanoliver@substack.com]]></googleplay:email><googleplay:author><![CDATA[Sean Oliver]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Sean is Coding #15: Code, Coffee, and Career]]></title><description><![CDATA[It's been a minute, but I'm back.]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-15-code-coffee-and</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-15-code-coffee-and</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Fri, 21 Jul 2023 21:42:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!iTnH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.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_!iTnH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iTnH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.png 424w, https://substackcdn.com/image/fetch/$s_!iTnH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.png 848w, https://substackcdn.com/image/fetch/$s_!iTnH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.png 1272w, https://substackcdn.com/image/fetch/$s_!iTnH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iTnH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.png" width="1456" height="489" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:489,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1744992,&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_!iTnH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.png 424w, https://substackcdn.com/image/fetch/$s_!iTnH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.png 848w, https://substackcdn.com/image/fetch/$s_!iTnH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.png 1272w, https://substackcdn.com/image/fetch/$s_!iTnH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69289ecc-c3d9-46cb-9d23-04d8d1dad666_1904x640.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>Aaaand, I&#8217;m back!</p><p>Time's certainly flown in the past few months. Now that things have calmed down a bit, I'm thrilled to reconnect and share more about my ongoing coding journey. I last left you on May 15th, so let's get you caught up. Here's a quick rundown/TL;DR:</p><ol><li><p>I graduated from Rithm School</p></li><li><p>Took a trip to Spain</p></li><li><p>Began part-time work as an engineer at Smol AI</p></li><li><p>Currently scouting for full-time engineering opportunities</p></li><li><p>Now, free to catch up over coffee! <a href="https://cal.com/seanoliver/chat">Let's chat</a>.</p></li></ol><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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://newsletter.seanoliver.dev/subscribe?"><span>Subscribe now</span></a></p><h2><strong>Rithm Recap</strong></h2><p>Mid-June marked the end of my time at <a href="https://www.rithmschool.com/">Rithm School</a>. And while I still keep in touch with many of my classmates, and it's been a unique shift transitioning from student life to a more independent routine.&nbsp;</p><p>Graduating from Rithm wasn't just a milestone, it was a massive leap in my coding journey. The extensive learning packed into those 16 weeks was intense, and I'm proud of the progress I made.</p><p>In a recent <a href="https://www.linkedin.com/posts/theseanoliver_careerchange-grateful-engineering-activity-7075228023775510528-wbZS/">LinkedIn post</a> after graduation, I shared my Rithm by-the-numbers:</p><ul><li><p>&#8594; 251,495 lines of JS and Python code in class-related work</p></li><li><p>&#8594; 696,925 lines of JS and Python code in personal projects</p></li><li><p>&#8594; 1,806 commits in 83 repositories</p></li><li><p>&#8594; 231h 48m in my programming notes app</p></li><li><p>&#8594; 173h 31m in VS Code</p></li><li><p>&#8594; 56h 42m in ChatGPT</p></li><li><p>&#8594; 29h 38m in the terminal</p></li><li><p>&#8594; 3 frontend + backend web apps built and deployed</p></li><li><p>&#8594; <s>14</s> 15 email newsletters sent (and counting!)</p></li></ul><h2><strong>Starting Small at Smol AI</strong></h2><p>As you may know, I've started working with <a href="https://twitter.com/swyx">Swyx</a> at <a href="https://github.com/smol-ai">Smol AI</a> as a part-time contractor. The hands-on experience with production code and a fantastic team of engineers has been phenomenal.&nbsp;</p><p>Smol AI is part of Vercel&#8217;s first AI Accelerator cohort, which connects us with an exceptional community of <a href="https://www.latent.space/p/ai-engineer">AI Engineers</a> shaping the future with cutting-edge models and tools.</p><p>Keep tabs on my <a href="https://www.linkedin.com/in/theseanoliver/">LinkedIn</a> or <a href="https://twitter.com/SeanOliver">Twitter</a> for updates on the <a href="https://github.com/smol-ai/menubar">Smol Menubar</a>, an LLM aggregator project I've been refining:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://twitter.com/swyx/status/1681826925181026304" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O7o6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd67fa01d-7df3-42d3-b727-2ff7277f3889_759x1010.png 424w, https://substackcdn.com/image/fetch/$s_!O7o6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd67fa01d-7df3-42d3-b727-2ff7277f3889_759x1010.png 848w, https://substackcdn.com/image/fetch/$s_!O7o6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd67fa01d-7df3-42d3-b727-2ff7277f3889_759x1010.png 1272w, https://substackcdn.com/image/fetch/$s_!O7o6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd67fa01d-7df3-42d3-b727-2ff7277f3889_759x1010.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O7o6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd67fa01d-7df3-42d3-b727-2ff7277f3889_759x1010.png" width="759" height="1010" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d67fa01d-7df3-42d3-b727-2ff7277f3889_759x1010.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1010,&quot;width&quot;:759,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:340488,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://twitter.com/swyx/status/1681826925181026304&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!O7o6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd67fa01d-7df3-42d3-b727-2ff7277f3889_759x1010.png 424w, https://substackcdn.com/image/fetch/$s_!O7o6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd67fa01d-7df3-42d3-b727-2ff7277f3889_759x1010.png 848w, https://substackcdn.com/image/fetch/$s_!O7o6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd67fa01d-7df3-42d3-b727-2ff7277f3889_759x1010.png 1272w, https://substackcdn.com/image/fetch/$s_!O7o6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd67fa01d-7df3-42d3-b727-2ff7277f3889_759x1010.png 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'm planning a detailed post about refactoring Menubar. It's been a real-life lesson on how coding principles like encapsulation and polymorphism improve scalability, extensibility, and maintenance.</p><h2><strong>Job Hunt</strong></h2><p>Outside my work at Smol AI, I'm also actively seeking full-time software engineering roles. The job market in the Bay Area is showing promising signs after a challenging start to the year.&nbsp;</p><p>I'm taking my time, ensuring I bring my A-game to each application, while also building a <a href="https://www.seanoliver.dev/">portfolio</a> showcasing my work across a diverse set of technologies.</p><p>If you come across any roles in the Bay Area that might align with my skills and aspirations, please feel free to share. I'm always eager for opportunities to grow within a team.</p><p>Well, that's all for now! You can expect more frequent updates, and please <a href="https://cal.com/seanoliver/chat">don't be a stranger</a> if you fancy a tech chat.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #14: AI vs. Algorithms]]></title><description><![CDATA[Fun with AI quickly turned into fun with algorithms!]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-14-ai-vs-algorithms</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-14-ai-vs-algorithms</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Tue, 16 May 2023 03:13:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been spending a lot of time recently playing around with different AI APIs to better understand what they can and can&#8217;t do. (<strong><a href="https://theragpt.ai/">TheraGPT</a></strong> being one recent example that used OpenAI&#8217;s Chat Completions API with a Flask/Python backend.)&nbsp;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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://newsletter.seanoliver.dev/subscribe?"><span>Subscribe now</span></a></p><p>One that&#8217;s getting a particularly high degree of attention is&nbsp;<strong><a href="https://github.com/hwchase17/langchain">LangChain</a></strong>, a library that makes it easy to connect with other LLM providers&#8217; (e.g. Anthropic, Cohere, GPT4All, etc.) APIs and even chain them together in a standardized way with integrations into vector-based DBs like Pinecone.</p><p>For this first test, I built a simple Tic-Tac-Toe game to see if the LLM would be smart enough to beat me in this strategically very simple game.</p><p>Sadly after a few dozen tests with both Open AI&#8217;s GPT 3.5-Turbo and Anthropic&#8217;s chat completions API, both models were failing miserably:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wVKq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wVKq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif 424w, https://substackcdn.com/image/fetch/$s_!wVKq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif 848w, https://substackcdn.com/image/fetch/$s_!wVKq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif 1272w, https://substackcdn.com/image/fetch/$s_!wVKq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wVKq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif" width="588" height="536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:536,&quot;width&quot;:588,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:625886,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&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_!wVKq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif 424w, https://substackcdn.com/image/fetch/$s_!wVKq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif 848w, https://substackcdn.com/image/fetch/$s_!wVKq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif 1272w, https://substackcdn.com/image/fetch/$s_!wVKq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185ffb22-f416-4b82-a7eb-1b5ce21cad8a_588x536.gif 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>I did a bit of sleuthing and found&nbsp;<strong><a href="https://www.reddit.com/r/OpenAI/comments/zhszex/chatgpt_cheats_at_tictactoe/">a</a></strong>&nbsp;<strong><a href="https://www.reddit.com/r/ChatGPT/comments/119gir3/chatgpt_cant_play_tictactoe/">number</a></strong>&nbsp;<strong><a href="https://www.reddit.com/r/ChatGPT/comments/12oe37p/chatgpt_is_really_bad_at_tic_tac_toe_shouldnt_an/">of</a></strong>&nbsp;<strong><a href="https://www.reddit.com/r/ChatGPT/comments/zje1qs/this_was_fascinating_a_game_of_tictactoe_with/">online</a></strong>&nbsp;<strong><a href="https://www.techradar.com/news/i-played-tic-tac-toe-with-the-mobile-chatgpt-bing-and-it-cheated">discussions</a> </strong>about ChatGPT&#8217;s deficiency when it comes to playing this simple game. Without going too deep, the reason why appears to have a lot to do with the activity LLMs are specifically trained to do: predict the next most logical word to follow a given set of words. Playing a game, even one as simple as Tic-Tac-Toe, is a fundamentally different activity.</p><p>While it was disappointing GPT wasn&#8217;t going to be suited to solve this particular problem, I was pretty excited to find that tic-tac-toe is a simple enough game that every possible move can actually fit nicely into a tree data structure.</p><p>Working with a tree like this is something that comes up often in technical interviews for engineering roles, but comparatively comes up far less often in the role itself (depending on your focus). As such, I like many aspiring professional engineers, have spent many evenings studying these data structures and strategies for traversing them efficiently. But I&#8217;ve always struggled with figuring out what a realistic, real-world application of this knowledge would look like.</p><p>It turned out that my struggle ended in one of the least likely places: a game of tic-tac-toe.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wK6O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wK6O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png 424w, https://substackcdn.com/image/fetch/$s_!wK6O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png 848w, https://substackcdn.com/image/fetch/$s_!wK6O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png 1272w, https://substackcdn.com/image/fetch/$s_!wK6O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wK6O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png" width="1456" height="1164" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1164,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Draw game tree for a Tic-Tac-Toe Problem&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Draw game tree for a Tic-Tac-Toe Problem" title="Draw game tree for a Tic-Tac-Toe Problem" srcset="https://substackcdn.com/image/fetch/$s_!wK6O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png 424w, https://substackcdn.com/image/fetch/$s_!wK6O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png 848w, https://substackcdn.com/image/fetch/$s_!wK6O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png 1272w, https://substackcdn.com/image/fetch/$s_!wK6O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0778738d-9bf7-427d-85af-4c331a7f5e05_2232x1784.png 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>In the tree above, you have 9 possible board positions for the first move, eight for the second move, seven, and so on. So the overall number of combinations could be represented as 9! or 362,880 total possible nodes in a fully expanded tree. But this ignores the fact that the game is often over before all 9 squares are filled. So if you end each branch at the &#8220;terminal&#8221; move, you&#8217;re left with 26,830 total nodes, a completely manageable number for a computer to process.</p><p>So, what&#8217;s the best way to navigate this tree of possible Tic-Tac-Toe game states? Enter: the Minimax algorithm.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n_mB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n_mB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png 424w, https://substackcdn.com/image/fetch/$s_!n_mB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png 848w, https://substackcdn.com/image/fetch/$s_!n_mB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png 1272w, https://substackcdn.com/image/fetch/$s_!n_mB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n_mB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png" width="1456" height="663" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:663,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;undefined&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="undefined" title="undefined" srcset="https://substackcdn.com/image/fetch/$s_!n_mB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png 424w, https://substackcdn.com/image/fetch/$s_!n_mB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png 848w, https://substackcdn.com/image/fetch/$s_!n_mB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png 1272w, https://substackcdn.com/image/fetch/$s_!n_mB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F378c162f-1326-4ea3-a98a-7bcee57c65a4_2560x1166.png 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>The&nbsp;<strong><a href="https://en.wikipedia.org/wiki/Minimax">Minimax algorithm</a></strong>&nbsp;is a recursive method used for decision making in game theory and artificial intelligence. The principle is simple: it's all about minimizing the worst-case scenario. In the context of Tic-Tac-Toe, this means that we assume that the opponent will always make their best possible move.</p><p>For every possible move, we play it out to the end (the "terminal" move), scoring the outcome. We give a high score if our AI wins, a low score if it loses, and a middling score if it's a draw. We then work our way back up the tree, choosing the highest (max) score if it's the AI's turn, and the lowest (min) if it's the opponent's. This is the "minimax" part of the algorithm.</p><p>Let's illustrate this with some Python code:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fYT9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fYT9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png 424w, https://substackcdn.com/image/fetch/$s_!fYT9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png 848w, https://substackcdn.com/image/fetch/$s_!fYT9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png 1272w, https://substackcdn.com/image/fetch/$s_!fYT9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fYT9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png" width="1456" height="1277" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1277,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1081563,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!fYT9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png 424w, https://substackcdn.com/image/fetch/$s_!fYT9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png 848w, https://substackcdn.com/image/fetch/$s_!fYT9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png 1272w, https://substackcdn.com/image/fetch/$s_!fYT9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff604c056-5d47-4074-ba3a-d899b8e7988c_1840x1614.png 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></p><blockquote><p><em>Note:&nbsp;The&nbsp;</em><code>evaluate(board)</code><em>&nbsp;function in this snippet a separate part of the implementation that evaluates the current state of the board and returns a score.</em></p></blockquote><p>Here, we're using a 3x3 matrix (list of lists in Python) to represent our Tic-Tac-Toe board. We assign a score of 10 to a winning move for the AI, -10 for a winning move for the opponent, and 0 for a draw or non-terminal move.</p><p>The&nbsp;<code>isMaximizingPlayer</code>&nbsp;parameter is a boolean that we flip at each depth level to represent whose turn it is. When it's the AI's turn, we want to maximize the score, and when it's the opponent's turn, we want to minimize the score.</p><p>The&nbsp;<code>depth</code>&nbsp;parameter is initially the number of empty cells and decreases as we make more moves. It's used as a simple way to stop the recursion when all cells are filled.&nbsp;</p><p>This function recursively calls itself, playing out every possible game until it hits a terminal state or reaches maximum depth. It then evaluates the board, choosing the path that maximizes the AI's minimum gain.</p><p>To decide the AI's move, we'd simply call the&nbsp;<code>minimax</code>&nbsp;function for each possible move and choose the one that returns the highest score.</p><p>Originally, I was aiming to create an AI-enabled Tic-Tac-Toe champion. But as it turns out, programming and problem solving often leads you down paths you didn&#8217;t expect.</p><p>Instead of using AI, I found myself applying the Minimax algorithm, a concept I'd studied but hadn't yet gotten the chance to use in a real-world situation. Suddenly, those evenings spent studying trees and decision-making algorithms were paying off, and I actually started seeing &#8220;trees&#8221; of decisions and data in lots of places in my life (org charts, file systems, DOM trees, decision trees, etc. etc.).</p><p>So, even though I didn't end up where I initially thought I would, this one actually turned out to be a pretty great learning experience.</p><p>In conclusion, my friends, remember: Coding isn't always a straightforward path, but sometimes, those unexpected turns lead you to some pretty "tree-mendous" places. And even if you can't "branch" out with AI, don't worry, you can always "leaf" it to good old algorithms to save the day. After all, they're pretty unbe-leaf-able!</p><p>Until next time, keep exploring, keep learning, and remember to take the "root" less traveled - it might just lead you to a game of unbeatable Tic-Tac-Toe! Happy coding and keep "tree-ting" yourself to new coding adventures!</p><p><strong>PS: Try your hand at the algo-enabled game <a href="https://langchain-tic-tac-toe.vercel.app/">here</a>, and let me know if you win!</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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></p>]]></content:encoded></item><item><title><![CDATA[Sean is Coding #13: Next.JS + LangChain! 🐛]]></title><description><![CDATA[Things are about to get real!]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-13-nextjs-langchain</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-13-nextjs-langchain</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Tue, 09 May 2023 00:25:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DG7_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.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_!DG7_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DG7_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!DG7_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!DG7_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!DG7_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DG7_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&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_!DG7_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!DG7_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!DG7_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!DG7_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8b962a-1ca3-4ca7-8adb-9d33654dfe77_1456x816.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>Hey everyone,</p><p>Welcome to the latest edition of the Sean is Coding newsletter! At my coding bootcamp, Rithm School, this week marked the end of the formal instruction portion, and we're all collectively moving forward into the "professional projects" phase of the program.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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>Numbers API</strong></p><p>During "project season," as they call it, the goal is to provide us with experience working in a larger, production-level codebase that contains a substantial amount of pre-existing code. My team has been tasked with picking up the Numbers API project, modernizing it, and extending the codebase.</p><p>Numbers API is an open-source project that Rithm School acquired a few years ago and now maintains. Our mission is to bring this app up to speed with modern web technologies and practice working comfortably in a large, pre-existing codebase.</p><p><strong>Recruiting</strong></p><p>In addition to projects, we're also starting to think about recruiting for software engineering jobs as the program draws to a close. I'm excited to get a bit of a break from all-day instruction and, quite frankly, to start talking to people again. I haven't had a chance to put much thought into my resume and portfolio yet, so I'm really looking forward to having a bit more time to dedicate to that effort.</p><p><strong>Next.JS + LangChain</strong></p><p>Since we didn't have an assessment this past weekend, I seized the opportunity to get acquainted with <a href="https://twitter.com/SeanOliver/status/1655678979700068356">Next.JS and LangChain</a>, two technologies I've been eager to gain more experience with. So far, I've deployed a basic <a href="https://langchain-tic-tac-toe.vercel.app/">Tic Tac Toe app</a> using Vercel that mostly works, but it needs a lot more refinement before it's ready for prime time.</p><p>Next.JS is an amazing framework overall. Its approach to handling routing is incredibly straightforward and clever. I'm also loving the idea of using serverless functions for handling tasks like backend API calls without the need to build and deploy an entire server instance.</p><p>LangChain has streamlined the process of working with the OpenAI LLM, making it much easier to incorporate into projects. Over the coming weeks, I plan to flesh out my portfolio by expanding on some of the more backend-intensive projects we started in Rithm, and by extending some of the side project ideas I began experimenting with during my downtime in the program.</p><p>It's hard to believe that the program will be wrapping up in just six short weeks. The time seems to have flown by, but I'm genuinely excited to use this period to focus on applying what I've learned to build out my portfolio and establish a solid foundation for entering the job market.</p><p>As always, thanks for following along!</p><p>Sean</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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></p>]]></content:encoded></item><item><title><![CDATA[Sean is Coding #12: Jobly Adventures, AI Geek-Out & More!]]></title><description><![CDATA[React is fun but unit testing in React is not fun.]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-12-jobly-adventures</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-12-jobly-adventures</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Mon, 01 May 2023 04:50:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!o8wH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey everyone!</p><p>Welcome back to another issue of Sean is Coding! I've got a shorter update for you this week, but still packed with exciting news. Let's dive in!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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://newsletter.seanoliver.dev/subscribe?"><span>Subscribe now</span></a></p><p>&#127919; Jobly Front-End: A Busy Sprint</p><p>This week we had a multi-day sprint implementing the front-end for Jobly, an Indeed.com-like job search tool. You might remember that we built the backend in Express two weeks ago. We created the frontend as a mostly single-page app using React, and I've got to say, I absolutely despise unit testing the frontend. However, I do enjoy working with React despite its faults&#8212;it feels more like backend engineering but on the frontend, thanks to modular components and hierarchy.</p><p>&#128161; Full-Stack Exposure &amp; Learning</p><p>Working end-to-end has been super fun, and I'm loving the exposure to both sides of development. The variety of programming challenges is helping me approach engineering problems more logically and stay organized.</p><p>&#129302; AI Corner: Geek Out Time!</p><p>I've been geeking out over some of the latest AI innovations this week. It's incredible how fast things are happening:</p><ul><li><p>I got access to Pinecone's free plan for vector DB storage (congrats on the huge funding round, Pinecone!). I'm excited to play around with AutoGPT and Langchain&#8212;stay tuned for more on that.</p></li><li><p>Tana, one of my favorite note-taking apps, launched a game-changing AI feature that lets you build custom prompts and auto-populate fields. I've started using it for a JavaScript reference data type methods table, but that's just the beginning!</p></li><li><p>OpenAI extended my access to ChatGPT plugins, including GPT-4 with browsing. It's still a bit finicky, but having an AI agent research on your behalf is mind-blowing. I've been asking it to research and write interesting prompts for Midjourney.</p></li><li><p>Speaking of, here are some different &#8220;unexpected double exposures&#8221; I&#8217;ve been playing around with. I&#8217;m finding that MJ v5 can really generate some stunning shots if you give it just a few powerful descriptors:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o8wH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o8wH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!o8wH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!o8wH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!o8wH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o8wH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1992087,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!o8wH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!o8wH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!o8wH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!o8wH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abf6ff7-1964-496c-b89d-49d43a532b60_1456x816.png 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><figcaption class="image-caption">Astronaut, forest, double exposure --ar 16:9 --q 2 --s 750 --v 5</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hf2O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hf2O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!Hf2O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!Hf2O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!Hf2O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hf2O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2004691,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!Hf2O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!Hf2O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!Hf2O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!Hf2O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d266e8f-70f1-4f87-bacf-867d271673ee_1456x816.png 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><figcaption class="image-caption">Vintage car, desert landscape, double exposure --ar 16:9 --q 2 --s 750 --v 5</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EmMN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EmMN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!EmMN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!EmMN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!EmMN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EmMN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1440738,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!EmMN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!EmMN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!EmMN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!EmMN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5bc2b2-e9db-4920-964d-20d12ba556de_1456x816.png 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><figcaption class="image-caption">Fire, ice cubes, double exposure --ar 16:9 --q 2 --s 750 --v 5</figcaption></figure></div></li></ul><p>&#128284; Next Week: More Progress</p><p>Can't wait to share more about my progress next week! Until then, onward and upward!</p><p>Sean</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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></p>]]></content:encoded></item><item><title><![CDATA[Sean is Coding #11: ChatGPT Prompts for Learning to Code]]></title><description><![CDATA[I've gone all-in on ChatGPT and other AI-assisted learning tools. Here are 15 of the most educational prompts I've created so far.]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-11-chatgpt-prompts</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-11-chatgpt-prompts</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Mon, 24 Apr 2023 04:42:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AjAz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.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_!AjAz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AjAz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.png 424w, https://substackcdn.com/image/fetch/$s_!AjAz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.png 848w, https://substackcdn.com/image/fetch/$s_!AjAz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.png 1272w, https://substackcdn.com/image/fetch/$s_!AjAz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AjAz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.png" width="1456" height="624" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:624,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2503911,&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_!AjAz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.png 424w, https://substackcdn.com/image/fetch/$s_!AjAz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.png 848w, https://substackcdn.com/image/fetch/$s_!AjAz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.png 1272w, https://substackcdn.com/image/fetch/$s_!AjAz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35e342a-b6a4-4946-bd74-f2d253c93dc5_1680x720.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>Welcome to the 11th edition of Sean is Coding!</p><p>This week, I want to share a bit about how I've been using ChatGPT to level up my learning process and share some of the prompts that have helped me the most.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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>Since ChatGPT's launch last November, there has been a lot of doom and gloom around how it will put programmers&#8212;and knowledge workers in general&#8212;permanently out of jobs. The truth is we'll be lucky if it lets us live at all, let alone have jobs.</p><p>But there's no putting this cat back in the bag. LLMs are here to stay and those who don't embrace them are going to be the first to be left behind.</p><p>Not only that, ChatGPT really is a tremendously valuable tool for learning and knowledge-related tasks. I've fully embraced it at this point. I pay for the pro plan. I have it pinned to my iPhone home screen. I have plugins to access it with a keyboard shortcut. It reads and summarizes my notes for me. I'm all-in.</p><h2>ChatGPT as a Learning Buddy</h2><p>But the area where ChatGPT has made the most difference has been in my journey to change careers and become a software engineer. It's like having a chat thread open with an infinitely patient and always available private tutor who knows everything.</p><p>ChatGPT helps me in a bunch of ways:</p><ol><li><p>It personalizes and contextualizes concepts by answering my questions and having a conversation until I get it.</p></li><li><p>It finds answers quickly by pulling together info from different sources into a clear, tailored response.</p></li><li><p>It expands my thinking by being a creative study partner, helping me create study tools and building on them with new info.</p></li></ol><h2>Contextual Prompting</h2><p>To get the most out of ChatGPT as a learning tool, I try to be very clear with it about my goals, use progressive prompting, and ask it direct follow-up questions to address my own knowledge gaps.</p><p>I'll usually start by telling ChatGPT what I already know about a topic. That way, it can fill in the gaps in my knowledge and present the info in a way that makes sense to me.</p><p>Here are some examples of starter prompts that I've recently used and which have yielded awesome learning chats with ChatGPT. Feel free to use these as a starting point for your own programming adventure:</p><ol><li><p>What are the key principles of clean code and why are they important?</p></li><li><p>How do design patterns help in building scalable and maintainable software? Can you provide some examples of commonly used design patterns?</p></li><li><p>What is the difference between imperative and declarative programming? Can you provide examples of languages that primarily use each approach?</p></li><li><p>How do I choose the right data structure for a specific problem? Can you provide examples of different data structures and their use cases?</p></li><li><p>What are the main differences between object-oriented, functional, and procedural programming paradigms? Can you give examples of languages that represent each paradigm?</p></li><li><p>How can I write efficient algorithms? Can you explain the concept of time complexity and Big O notation?</p></li><li><p>What are some best practices for managing dependencies and version control in a software project?</p></li><li><p>What is the purpose of unit testing, integration testing, and end-to-end testing? How can I implement these in my projects?</p></li><li><p>How can I identify and avoid common programming mistakes, such as memory leaks, race conditions, and deadlocks?</p></li><li><p>What is refactoring, and how can it improve the quality of my code? Can you provide examples of common refactoring techniques?</p></li><li><p>How do I improve the readability and maintainability of my code? What are some best practices for documentation and commenting?</p></li><li><p>What are some key principles and techniques for writing secure code? Can you explain concepts like input validation and output encoding?</p></li><li><p>Can you explain the concept of Continuous Integration and Continuous Deployment (CI/CD)? How does it help in improving software development processes?</p></li><li><p>What are some strategies for effectively debugging and troubleshooting code issues?</p></li><li><p>How can I optimize the performance of my code? What tools and techniques are available for profiling and analyzing performance bottlenecks?</p></li></ol><p>In sum, ChatGPT has been a game-changer in my programming learning process. It gives me instant access to personalized and contextual information that's helped me learn faster and tackle more complex programming ideas, than I'd otherwise have been able to at this point in my journey.</p><p>Even if you're not learning to code specifically, I'd encourage you if you're not already to take a hard look at LLMs like ChatGPT and see if there's something that it can help you learn or do more efficiently or creatively.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #10 - Tackling APIs, Jobly, and a TheraGPT Update 🚀]]></title><description><![CDATA[Hey everyone!]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-10-tackling-apis-jobly</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-10-tackling-apis-jobly</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Mon, 17 Apr 2023 05:24:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8MtW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.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_!8MtW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8MtW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!8MtW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!8MtW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!8MtW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8MtW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2274943,&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_!8MtW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!8MtW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!8MtW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!8MtW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bb18d69-3eb6-4395-938d-8688556d5340_1456x816.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>Hey everyone!</p><p>Welcome to the 10th edition of Sean is Coding. Time flies when you're having fun &#8212; I seriously can't believe we're already at double digits in this newsletter. With that said, let's dive right into what's been going on this week.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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>This week was primarily spent tackling a large backend project: developing the API for a fake job board service called "<a href="https://github.com/seanoliver/express-jobly">Jobly</a>." We spent three of our five days with our pair programming partners and dove deep on the area with a heavy emphasis on test-driven development, security, authentication, and authorization, and simply keeping code clean and well organized.</p><p>With a codebase as sizable as this one, keeping everything straight quickly became a challenge and really highlighted for me why it&#8217;s so important to maintain good naming conventions and predictable file structure.</p><p>Jobly was also our first chance to work with the concept of maintaining &#8220;test coverage,&#8221; in an app. We were given an existing but incomplete codebase that already had close to 100% testing coverage, and our challenge was not to let that percentage drop. So we were encouraged to lean on test-driven development (TDD). TDD is a process where you write tests for the code before writing the code itself. It helps you ensure that your code is meeting the requirements and is less likely to have bugs. It's been a bit of a mental shift, but it did not take long to see the immense benefits of leading with testing. Obviously, TDD isn&#8217;t always possible, but when you have the time to work this way, it is surely the best process for writing near bulletproof code.</p><p>We also flexed a lot in the way of security this week, building out authentication and authorization routes and their corresponding middleware. And we employed some different techniques to protect our service and its users from attacks.</p><p>Separately, I'm excited to announce that TheraGPT has finally grown up and graduated to living at its very own URL: <strong><a href="https://theragpt.ai">theragpt.ai</a></strong>! I've given the site a fresh coat of paint to provide a little more personality, and we now have uptime monitoring to eliminate cold start latency and keep each request fast. So go ahead and check it out! I&#8217;ve already heard some really inspiring stories from people who it&#8217;s helped out!</p><p>As always, thank you for joining me on this adventure, and I hope you find these insights as interesting / exciting as I do. Stay tuned for more coding stories and updates on my journey to software engineering!</p><p>Until next time,</p><p>Sean</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #9 - Hopping Back to JavaScript and Introducing TheraGPT 🐰]]></title><description><![CDATA[Hey there, coding enthusiasts!]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-9-hopping-back-to</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-9-hopping-back-to</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Mon, 10 Apr 2023 01:47:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lRDJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey there, coding enthusiasts!</p><p>Happy Easter to those of you who celebrate! I hope you're enjoying the holiday with family, friends, or just a relaxing day to yourself. We just got back from a fun Easter Egg hunt with the kids. It was a blast watching them excitedly gather up eggs, and it was super fun getting to know some of the other parents in our daughter&#8217;s kindergarten class a little better.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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>Now, let's dive into the latest updates from my software engineering bootcamp at Rithm School.</p><h3>&#128260; Switching Gears: JavaScript, Node.js, and Express.js</h3><p>This week, we returned to JavaScript after three weeks of immersing ourselves in Python. It felt like a small whiplash getting reacquainted with semicolons, curly braces, and let/const, but our instructors assured us that switching back and forth will become easier over time.</p><p>The transition was made smoother thanks to our foundation in Python and Flask, as we began exploring Node.js and Express.js for running JavaScript on the backend. Node.js comes with most of the modules, like file system access, to make JavaScript work more like a proper server-side programming language. Express.js is a lightweight web app framework, much like Flask but for JavaScript.</p><p>To build web apps entirely in JavaScript, we had to get really tight with Promises and async/await. Async and await take care of most of the awkwardness that comes with JavaScript being single-threaded, but because of the promise object, it&#8217;s still noticeably more mental work to write asynchronous code in JS than in Python. I find this kind of ironic since JS was built to be a web language, but it is what it is, and honestly, it&#8217;s kind of fun to untangle.</p><h3>&#129302; Introducing TheraGPT: Your AI Therapist</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lRDJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lRDJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png 424w, https://substackcdn.com/image/fetch/$s_!lRDJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png 848w, https://substackcdn.com/image/fetch/$s_!lRDJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png 1272w, https://substackcdn.com/image/fetch/$s_!lRDJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lRDJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png" width="1456" height="1258" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1258,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:675607,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!lRDJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png 424w, https://substackcdn.com/image/fetch/$s_!lRDJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png 848w, https://substackcdn.com/image/fetch/$s_!lRDJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png 1272w, https://substackcdn.com/image/fetch/$s_!lRDJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe949cb57-cdfb-4800-9977-97e56c72881d_2454x2120.png 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><figcaption class="image-caption">TheraGPT lives!</figcaption></figure></div><p>Last week, I mentioned I&#8217;m working on a side-project called <a href="https://theragpt.onrender.com/">TheraGPT</a>. With the AI craze sweeping the tech world, I've been eager to align my programming efforts more with AI/ML. </p><p>TheraGPT is built on the Open AI&#8217;s chat completions API, and the idea is simple: you provide a negative thought that's been troubling you, and TheraGPT identifies the cognitive distortions, suggests strategies for overcoming them, and offers a reframed thought to help you think more productively and objectively about the situation.</p><p>I'm thrilled to announce that an early (very early) MVP of TheraGPT is now live at <a href="https://theragpt.onrender.com/">https://theragpt.onrender.com/</a>! Please give it a try and let me know what you think. The initial page load might take a minute or two since I'm using a free server.</p><p>It's a super-simple 2-route Flask app (a single GET and POST route) that uses JavaScript to handle the POST request asynchronously. It uses a single-field WTForm to accept and authenticate the request, and there's no database, so if you like the output you see, I recommend taking a screenshot or copying and pasting.</p><p>Source code is available here, along with a list of some of my planned new features: <a href="https://github.com/seanoliver/thera-gpt">https://github.com/seanoliver/thera-gpt</a></p><p>This was a ton of fun to build, and even though it's very rudimentary, I'm kind of proud of it because it's the first time since starting this journey I've been able to go from "Oh, that's a cool idea" to "This idea is now a thing I made!"</p><p>That's all for this week! I appreciate you following along on this journey. Your support means the world to me. Until next time, keep exploring and learning!</p><p>Sean</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #8: Life, Learning, and TheraGPT]]></title><description><![CDATA[Spring Break Edition: Developing with AI and literally getting the house in order.]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-8-life-learning-and</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-8-life-learning-and</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Mon, 03 Apr 2023 01:22:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pt1G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.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_!pt1G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pt1G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!pt1G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!pt1G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!pt1G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pt1G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:350807,&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_!pt1G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!pt1G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!pt1G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!pt1G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89a3c01a-36b3-47a1-87d1-88fdc3ea5d08_1456x816.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><figcaption class="image-caption">Potential logo design for <a href="https://github.com/seanoliver/thera-gpt">TheraGPT</a> (via my design intern Midjourney).</figcaption></figure></div><p>Hey everyone,</p><p>Welcome to the eighth edition of "Sean is Coding" - the Spring Break edition. This week was a nice breather from the day-to-day intensity of Rithm, and I got to catch up on some life stuff while also diving deeper into the world of AI and programming. So, let's get right into it!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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><h2>Spring Break Shenanigans</h2><p>First off, I have to say that it was fantastic to have a week off from the bootcamp. It gave me the opportunity to focus on important things like cleaning the house, conquering the laundry mountain, and spending quality time with friends and family. I even managed to squeeze in a quick trip back home to Pennsylvania to visit my mom. It was great to recharge and reconnect!</p><h2>Exploratory Learning</h2><p>With a bit more time on my hands, I had the chance to dive into some interesting coding projects and brush up on my skills. I paired up with a few of my favorite bootcamp buddies to work on some independent study projects that we had been itching to tackle. I also took the opportunity to work through the "<a href="https://adventofcode.com/">Advent of Code</a>" 2022 challenge set and revisited some data structures and algorithms courses on Udemy that I'd been meaning to get back to.</p><h2>Pre-Introducing TheraGPT</h2><p>Most excitingly, this week allowed me to embark on a new side project that I'm calling <a href="https://github.com/seanoliver/thera-gpt">TheraGPT</a>. As many of you know, I've been swept up in the AI wave that's been taking over San Francisco and the tech world. With TheraGPT, I'm aiming to combine some of what I&#8217;ve been learning on the programming side with my fascination for AI/ML.</p><p>TheraGPT is an app I'm building using <a href="https://platform.openai.com/docs/guides/chat">Open AI&#8217;s chat completions API</a>. It was inspired by the realization that ChatGPT actually performs pretty well as a thoughtful and empathic CBT (Cognitive Behavioral Therapy) psychologist. The idea is simple: you input a negative thought that's been troubling you, and TheraGPT will </p><ul><li><p>identify the cognitive distortions present, </p></li><li><p>provide strategies for overcoming those distortions, and </p></li><li><p>offer a reframed thought as an example to help you think more productively and objectively about the situation.</p></li></ul><p>I tested TheraGPT with my mom, who struggles with anxiety and negative thought spirals, and she absolutely loved it. It was a proud moment for me, and I can't wait for more of you to check it out once it's ready. </p><p>In the meantime, here&#8217;s a clip of what it looks like to give you a sense (and the full source code is on <a href="https://github.com/seanoliver/thera-gpt">Github</a>). It's close to launch, but I still need to add some finishing touches and deploy it to a server.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i-Cv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i-Cv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png 424w, https://substackcdn.com/image/fetch/$s_!i-Cv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png 848w, https://substackcdn.com/image/fetch/$s_!i-Cv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png 1272w, https://substackcdn.com/image/fetch/$s_!i-Cv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i-Cv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png" width="795" height="1360" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1360,&quot;width&quot;:795,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:260606,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!i-Cv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png 424w, https://substackcdn.com/image/fetch/$s_!i-Cv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png 848w, https://substackcdn.com/image/fetch/$s_!i-Cv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png 1272w, https://substackcdn.com/image/fetch/$s_!i-Cv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c97430-8b2e-4026-843a-9dc131c82ed1_795x1360.png 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>That's it for this week's Spring Break edition of "Sean is Coding." As always, thank you for joining me on this journey, and I look forward to sharing more updates and exciting developments in the coming weeks!</p><p>Until next time,</p><p>Sean</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #7: Is English the new Python?]]></title><description><![CDATA[Deploying my first Flask app and building with Open AI's API.]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-7-is-english-the-new</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-7-is-english-the-new</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Sun, 26 Mar 2023 00:27:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aCtc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#8220;Coding&#8221; in English</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aCtc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aCtc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aCtc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aCtc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aCtc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aCtc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:117152,&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_!aCtc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aCtc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aCtc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aCtc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b2333f-d28e-4b1f-974c-1e30981f87db_1920x1080.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">I apologize if you&#8217;re trying to view this on mobile.</figcaption></figure></div><p>This week, I had the chance to revisit a <a href="https://github.com/seanoliver/flask-madlibs">web-based version of Mad Libs</a> we&#8217;d made in my bootcamp using Flask a few weeks ago. </p><p>The original version came with just two static, pre-written story templates. Users could select a template, fill in the required words, and read the completed story.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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>I revisited the project with the intent of making this experience a little more dynamic using Open AI&#8217;s ChatGPT API to replace the pre-existing stories with an AI-generated story that would be different every time. The process of doing so was extremely exciting and really demonstrates the seismic changes AI is bringing to software development right now.</p><p>Here&#8217;s the main function that retrieves a new Mad Lib story template from ChatGPT:</p><pre><code><strong>def</strong> <strong>fetch_gpt_story</strong>():
&nbsp; &nbsp; response <strong>=</strong> openai.ChatCompletion.create(
&nbsp; &nbsp; &nbsp; &nbsp; <strong>model="gpt-3.5-turbo"</strong>,
&nbsp; &nbsp; &nbsp; &nbsp; <strong>messages=</strong>[
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<strong>"role"</strong>: <strong>"system"</strong>,
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>"content"</strong>: os.getenv(<strong>'MADLIBS_SYSTEM_INSTRUCTIONS'</strong>)},
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<strong>"role"</strong>: <strong>"user"</strong>,
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>"content"</strong>: os.getenv(<strong>'MADLIBS_USER_INSTRUCTIONS'</strong>)}
&nbsp; &nbsp; &nbsp; &nbsp; ]
&nbsp; &nbsp; )
&nbsp; &nbsp; <strong>return</strong> response[<strong>'choices'</strong>][<strong>0</strong>][<strong>'message'</strong>][<strong>'content'</strong>]</code></pre><p>Most of this function is boilerplate, the real magic of "programming" this came from writing the system and user-level prompts. For instance, here is the system prompt:</p><pre><code>You are a helpful assistant that generates funny stories with blanked-out words indicated by curly braces. The blanked words should be mad-libs style descriptors of the type of word, such as noun, adjective, adverb, person name, place, country, action verb, etc.

This prompt contains essential instructions for users to follow when filling in the blanks. For example, descriptors inside the curly braces must be entirely lowercase, and every term in curly braces must end with two underscores and a number. The descriptor should also include a numerical indicator to designate words that are intended to be re-used as part of the story.

The descriptor must be descriptive enough to signal the user to provide an input word that will make sense when placed in the sentence. For example, if the sentence is "She {verb__1} to see him but she was too late," consider saying {past_tense_verb__1} instead of {verb__1} because a past-tense verb would sound more natural in that sentence. Additionally, users must respond with the Mad Libs story only, without any chat-style conversation before or after the story content.</code></pre><p>The exciting thing about this method of programming is that, instead of importing a dataset and processing it using an algorithm, we can simply ask the API to provide the data in a format that is immediately usable.&nbsp;</p><p>This approach is going to have a enormous impact on application development, making developers more productive while reducing the cost of building custom software. It&#8217;s such an exciting time to be entering this field.</p><p>I&#8217;m working on getting a deployable version of this ready to share in the next couple of days.</p><h2>Deploying a Twitter Clone</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XRcT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XRcT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png 424w, https://substackcdn.com/image/fetch/$s_!XRcT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png 848w, https://substackcdn.com/image/fetch/$s_!XRcT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png 1272w, https://substackcdn.com/image/fetch/$s_!XRcT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XRcT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png" width="1252" height="1079" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1079,&quot;width&quot;:1252,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1380457,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!XRcT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png 424w, https://substackcdn.com/image/fetch/$s_!XRcT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png 848w, https://substackcdn.com/image/fetch/$s_!XRcT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png 1272w, https://substackcdn.com/image/fetch/$s_!XRcT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59420e5e-84e1-4466-ba04-70c49d9eca3f_1252x1079.png 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>Most of the class time this week was spent building and deploying an end-to-end Twitter clone called <a href="https://github.com/seanoliver/warbler">Warbler</a>. Unlike Mad Libs, Warbler is actually <a href="https://sean-warbler.onrender.com/">live for you to check out right now</a>.</p><p>One of the most surprisingly fascinating aspects of building Warbler was implementing user authentication, data protection, and privacy. We explored how to use cryptography and hashing to store user passwords securely, making it almost impossible for any malicious users to access user data.</p><p>Hashing, in particular, is a really fascinating area of mathematics computer science. A hashing algorithm takes an input (e.g. a user&#8217;s password) and maps it to a fixed-size output (a hashed string) that represents the original data. Importantly, a good hashing algorithm is both stable and one-way:</p><ol><li><p><strong>Stable</strong>, meaning it always provides the same hashed output string for a given input (this is ignoring any salting certain algorithms might do to vary the hashed strings superficially &#8212; the underlying hash value remains the same).</p></li><li><p><strong>One-way</strong>, meaning that even though this input always produces the same output, there is no mathematical way to reverse the hash and turn it back into the input. &#129327;</p></li></ol><p>Authentication happens when a new user input (i.e. a password, correctly typed by the user) is hashed and compared to the stored hashed value in the database. The actual password itself is never stored anywhere.</p><div><hr></div><p>Overall, I&#8217;ve gotta say, it&#8217;s been another thrilling (and admittedly exhausting) week. And I can&#8217;t get over how exciting it is to be entering software engineering at this moment with the ground beneath us shifting toward an AI-powered future.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #6: Database Alchemy]]></title><description><![CDATA[Moar backend! Moar data! And lots more fun with AI tools.]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-6-database-alchemy</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-6-database-alchemy</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Sat, 18 Mar 2023 22:38:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_b1z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.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_!_b1z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_b1z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.png 424w, https://substackcdn.com/image/fetch/$s_!_b1z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.png 848w, https://substackcdn.com/image/fetch/$s_!_b1z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.png 1272w, https://substackcdn.com/image/fetch/$s_!_b1z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_b1z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1930557,&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_!_b1z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.png 424w, https://substackcdn.com/image/fetch/$s_!_b1z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.png 848w, https://substackcdn.com/image/fetch/$s_!_b1z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.png 1272w, https://substackcdn.com/image/fetch/$s_!_b1z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f273d04-3eb0-46a2-a3b9-fcd8f31ddb8a_1456x832.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><figcaption class="image-caption">What my life has felt like the last few weeks. (Made with Midjourney.)</figcaption></figure></div><p><strong>Contents:</strong></p><ol><li><p>Progress Report</p></li><li><p>Bug Report</p></li><li><p>Surf Report</p></li><li><p>Tweet Report</p></li></ol><div><hr></div><h1>Progress Report</h1><p>And just like that, week 4 at Rithm is in the can&#8212;it's been another great week of learning. We continued to focus on the backend, but this week, our primary focus was on databases and how to interact with them using SQLAlchemy in our Flask applications.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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><h2>Databases and SQL</h2><p>We started the week by learning the basics of SQL (Structured Query Language) and how to interact with relational databases using SQL queries. We practiced creating tables, inserting data, updating records, and querying the data using various conditions.</p><h2>SQLAlchemy</h2><p>Once we had a firm grasp of SQL, we moved on to learn <a href="https://www.sqlalchemy.org/">SQLAlchemy</a>, a powerful Python ORM (Object Relational Mapper) that makes it easier to interact with databases in a more Pythonic way. We learned how to create models, define relationships between tables, and perform CRUD operations without having to write raw SQL queries.</p><p>Using SQLAlchemy in our Flask applications made it much easier to manage the data and keep our code clean and organized. It also helped us maintain a consistent structure across our projects.</p><p>Next week is our final week in Python, and we&#8217;re diving into security, authorization, and cryptography! Onward!</p><h1>Bug Report</h1><p>This week's bug was related to the relationships between tables in our database. We were working on a <a href="https://github.com/seanoliver/flask-blogly">blog application</a> where users can create posts and leave comments on them.</p><p>We defined two models, <code>User</code> and <code>Post</code>, and created a one-to-many relationship between them, where a user can have many posts but each post belongs to one user.</p><p>We also defined another model, <code>Comment</code>, and created a one-to-many relationship between <code>Post</code> and <code>Comment</code>.</p><p>The bug occurred when we tried to retrieve all the comments associated with a specific post. We were expecting the comments to be sorted by their creation time, but they were returned in a seemingly random order.</p><p>After a bit of debugging, we realized that we forgot to define an order_by attribute for the relationship between <code>Post</code> and <code>Comment</code>. By default, SQLAlchemy doesn't order the related records unless explicitly specified.</p><p>To fix the issue, we modified the relationship definition in the <code>Post</code> model as follows:</p><pre><code><strong>class</strong> <strong>Post</strong>(<strong>db.Model</strong>):
&nbsp; &nbsp; <strong># ...
</strong>&nbsp; &nbsp; comments <strong>=</strong> db.relationship(<strong>'Comment'</strong>, <strong>backref='post'</strong>, <strong>order_by='Comment.created_at'</strong>)
&nbsp; &nbsp; <strong># ...</strong></code></pre><p>With this change, SQLAlchemy now orders the related comments by their creation time, as we originally intended.</p><h1>Surf Report</h1><ol><li><p><a href="https://www.theinformation.com/articles/seeking-cerebral-valley-a-photographic-tour-of-san-franciscos-ai-underground">Seeking Cerebral Valley: A Photographic Tour of San Francisco&#8217;s AI Underground</a> (The Information)</p></li><li><p><a href="https://www.sfchronicle.com/sf/article/central-subway-ridership-muni-17839818.php">SF&#8217;s Central Subway saw declines in ridership during its first two months of service, data show</a> (SF Chronicle)</p></li><li><p><a href="https://openai.com/research/gpt-4">GPT-4 was released</a> (Open AI)</p></li><li><p><a href="https://twitter.com/midjourney/status/1636130389365497857?s=20">Midjourney v5 was released</a> (Midjourney via Twitter)</p></li></ol><h1>Tweet Report</h1><p>Dan Shipper highlights four ways to leverage GPT-4 to be an excellent writing partner.</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/danshipper/status/1636765324052709377&quot;,&quot;full_text&quot;:&quot;How to use GPT-4 to create incredible writing:&quot;,&quot;username&quot;:&quot;danshipper&quot;,&quot;name&quot;:&quot;Dan Shipper &#128231;&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Fri Mar 17 16:23:57 +0000 2023&quot;,&quot;photos&quot;:[],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:17,&quot;like_count&quot;:199,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Nick St. Pierre knocks it out of the park with another stunning piece of AI-generated content. This time, a fully blown 30-second video written, directed, and shot (almost) entirely using various AI tools. The future is now!</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/nickfloats/status/1635749064091267098?s=12&amp;t=c0zm9zMa5rGVx4afMXMoNA&quot;,&quot;full_text&quot;:&quot;This video was made almost entirely by AI. \n\nI used ChatGPT to write a script, Midjourney to create reference images, Runway Gen-1 to apply the style of the images to my source video, and Boomy AI for the music.\n\nWorkflow breakdown w/ comparisons in thread.\n\n&#129525; &quot;,&quot;username&quot;:&quot;nickfloats&quot;,&quot;name&quot;:&quot;Nick St. Pierre&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Tue Mar 14 21:05:42 +0000 2023&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://substackcdn.com/image/upload/w_1028,c_limit,q_auto:best/l_twitter_play_button_rvaygk,w_88/ehsvzgzekzzedjzycjny&quot;,&quot;link_url&quot;:&quot;https://t.co/IUGyBKvqmg&quot;,&quot;alt_text&quot;:null}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:1819,&quot;like_count&quot;:9607,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:&quot;https://video.twimg.com/ext_tw_video/1635738549168341005/pu/vid/480x270/9MpRUY0VE5v80cOL.mp4?tag=12&quot;,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #5: Into the Backend with Python]]></title><description><![CDATA[This week we switched to Python and started building servers and APIs using Flask.]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-5-into-the-backend</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-5-into-the-backend</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Sat, 11 Mar 2023 20:18:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dp_A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.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_!dp_A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dp_A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.png 424w, https://substackcdn.com/image/fetch/$s_!dp_A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.png 848w, https://substackcdn.com/image/fetch/$s_!dp_A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.png 1272w, https://substackcdn.com/image/fetch/$s_!dp_A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dp_A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.png" width="1024" height="935" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:935,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1646403,&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_!dp_A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.png 424w, https://substackcdn.com/image/fetch/$s_!dp_A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.png 848w, https://substackcdn.com/image/fetch/$s_!dp_A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.png 1272w, https://substackcdn.com/image/fetch/$s_!dp_A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3789fe07-0a16-468a-b7fa-8e9124420e8e_1024x935.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><figcaption class="image-caption">A little scary that this is what Midjourney thinks of for the prompt: &#8220;A web server request.&#8221;</figcaption></figure></div><p><strong>Contents:</strong></p><ol><li><p>Progress Report</p></li><li><p>Bug Report</p></li><li><p>Surf Report</p></li><li><p>Tweet Report</p></li></ol><div><hr></div><h2>Progress Report</h2><p>And just like that, our third week of bootcamp at Rithm School has come and gone and this was a big one.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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><ul><li><p>We switched from JS to Python and from frontend to backend</p></li><li><p>We started building servers and APIs using Flask, a backend web framework for Python</p></li><li><p>We spent a lot of time thinking about type safety and ways to be really diligent about ensuring we&#8217;re passing and working with the right kinds of data before we get to deep in implementation.</p></li></ul><h3>Python</h3><p>We waded into the wild world of backend this week, exchanging JavaScript for Python and the browser console for the Terminal.</p><p>One major takeaway I have from this week is that it is a <em>lot</em> easier to learn a programming language when you&#8217;re not also learning programming at the same time.</p><p>Python is similar enough to JavaScript that it didn&#8217;t really feel like we needed to slow down in terms of learning new concepts just because we were looking at it through the lens of a different language.</p><p>So far, coding in Python is a bunch of fun. That it was designed from the ground up to be a fully-fledged programming language really makes it feel a lot richer out of the box. I&#8217;m particularly liking:</p><ul><li><p><strong>Doctests</strong> &#8212; The idea that you can just build self-documenting unit tests directly into your functions is insanely satisfying.</p></li><li><p><strong>Errors</strong> &#8212; There is no undefined in Python! When you request something that isn&#8217;t there, or is an incorrect type, you just get an error. I feel like I can get things done so much more quickly now.</p></li><li><p><strong>Methods</strong> &#8212; There are so many more methods available in the standard Python API that you need to build from scratch or by importing other libraries in JavaScript. Some of my faves are zip(), title(), and sorted().</p></li></ul><h3>Flask</h3><p>We also dove into the Flask framework and started building server-side APIs for the first time. This is one area where I&#8217;m relieved to be coming in with some background from Ruby on Rails. The concept of constructing endpoints as routes was thankfully already familiar to me, so I could focus my attention on teasing out the details of how Flask works.</p><h2>Bug Report</h2><p>It&#8217;s hard to put my finger on one bug in particular since this week was also the week we started to dive more deeply into testing frameworks and test-driven development.</p><p>With all the API work we&#8217;re doing, I&#8217;ve been doing most of my debugging work by dropping breakpoints into my app and exploring the variable environment at different places in the thread of execution.</p><p>Just yesterday, my partner and I were building an <a href="https://github.com/seanoliver/flask-boggle">online Boggle game</a>, and we wrote a view function that would generate a UUID for a new Boggle game and assign it to a new game instance with a freshly shuffled board.</p><pre><code><strong>@app.post</strong>(<strong>"/api/new-game"</strong>)
<strong>def</strong> <strong>new_game</strong>():
<strong>&nbsp; &nbsp; """Start a new game and return JSON: {game_id, board}."""

</strong>&nbsp; &nbsp; game_id <strong>=</strong> <strong>str</strong>(uuid4())
&nbsp; &nbsp; game <strong>=</strong> BoggleGame()
&nbsp; &nbsp; games[game_id] <strong>=</strong> game

&nbsp; &nbsp; <strong>return</strong> jsonify({<strong>"game_id"</strong>: game_id, <strong>"board"</strong>: game.board})</code></pre><p>What looks like 4 lines of code was actually about 50 lines of debugging requests via iPython and pdb to play around with the data available at the time of request. I&#8217;m finding that I actually really love the exploratory / investigative nature of this aspect of the work! Maybe I&#8217;ve got a future in backend yet!</p><h2>Surf Report</h2><p><em>Some of my favorite links from this week.</em></p><ol><li><p><a href="https://open.substack.com/pub/noahpinion/p/why-was-there-a-run-on-silicon-valley?r=37qic&amp;utm_campaign=post&amp;utm_medium=web">Why was there a run on Silicon Valley Bank</a>. A solid explainer for the uninitiated like me on how something so big could go so bad so quickly.</p></li><li><p><a href="https://github.com/microsoft/cascadia-code">Cascadia Code Font</a>. I discovered this font for my VS Code editor earlier in the week and it&#8217;s quickly taking over as the default font on most of my notes / writing apps. I never thought I&#8217;d turn my back on iA Writer, but this font really slaps! Check out the cursive stylistic set for italics, too. Chef&#8217;s kiss.</p></li><li><p><a href="https://noahpinion.substack.com/p/llms-are-not-going-to-destroy-the?utm_medium=ios">LLMs are not going to destroy the human race</a>. I&#8217;m about 90% through Nick Bostrom&#8217;s <em>Superintelligence</em>, a book that is not making me feel good about our ability to handle an AI future. This article makes me feel a bit better about the near term.</p></li><li><p><a href="https://beebom.com/how-build-own-ai-chatbot-with-chatgpt-api/">Build Your Own AI Chatbot with ChatGPT API</a>. Guide for building a chatbot with the ChatGPT API in Python. The transition to AI will be on par with the transition to mobile: It&#8217;s going to swallow everything, and I honestly think it&#8217;s never been a better time to learn to code.&nbsp;</p></li></ol><h2>Tweet Report</h2><p><em>Some of my favorite tweets from this week. My timeline filters out any tweets that mention Elon Musk.</em></p><p>Speaking of AI, here&#8217;s a great chart showing the landscape of VC investment in AI at the moment.</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/nonmayorpete/status/1633900428294512640&quot;,&quot;full_text&quot;:&quot;Great visual on investor activity in generative AI!\n\nCredit: <span class=\&quot;tweet-fake-link\&quot;>@chiefaioffice</span> &quot;,&quot;username&quot;:&quot;nonmayorpete&quot;,&quot;name&quot;:&quot;Pete&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Thu Mar 09 18:39:53 +0000 2023&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/FqzHrMWaIAAfEqa.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/lzyByYjvwS&quot;,&quot;alt_text&quot;:null}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:57,&quot;like_count&quot;:319,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Best take I&#8217;ve heard yet on Peter Thiel&#8217;s role in the run on SVB:</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/chrismohney/status/1634572163863683075?s=20&quot;,&quot;full_text&quot;:&quot;people thinking Peter Thiel should be ashamed by insitgating a bank run and consequent financial carnage need to understand he&#8217;s the kind of guy who would somehow find a way to make the trolley problem train kill everyone on both tracks&quot;,&quot;username&quot;:&quot;chrismohney&quot;,&quot;name&quot;:&quot;Chris Mohney&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Sat Mar 11 15:09:07 +0000 2023&quot;,&quot;photos&quot;:[],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:423,&quot;like_count&quot;:1809,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>I really hate it when I agree with David Sacks, but he&#8217;s right. There were many ways SVB could have avoided this outcome, but one lesson we should all take away is that we need guardrails for banks to ensure banks are managing our liquid assets responsibly.</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/DavidSacks/status/1634364699461693440?s=20&quot;,&quot;full_text&quot;:&quot;The solution is for FDIC to offer a category of insurance where (1) deposits are fully protected but (2) banks are restricted to investing that money in fully liquid securities that are marked-to-market daily. That is the product everyone wants.&quot;,&quot;username&quot;:&quot;DavidSacks&quot;,&quot;name&quot;:&quot;David Sacks&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Sat Mar 11 01:24:44 +0000 2023&quot;,&quot;photos&quot;:[],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:208,&quot;like_count&quot;:3471,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #4: Hack or Snooze]]></title><description><![CDATA[Adventures in AI, algorithms, and HTTP requests!]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-4-hack-or-snooze</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-4-hack-or-snooze</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Sat, 04 Mar 2023 20:06:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Contents</em></p><ol><li><p>Progress Report</p></li><li><p>Bug Report</p></li><li><p>Surf Report</p></li><li><p>BONUS: Midjourney Report (with Prompts!)</p></li></ol><div><hr></div><h2>Progress Report</h2><ul><li><p>Wrapped up week 2 of Rithm, where we spent time getting familiar with HTTP requests passing data back and forth between the front-end and the backend.</p></li><li><p>The week concluded with a fun two-day sprint where we paired off and built the front-end for <a href="https://github.com/seanoliver/hack-or-snooze-ajax-api">a Hacker News clone called &#8220;Hack or Snooze.&#8221;</a></p></li><li><p>I think the most valuable part of it all for me was learning how to work with someone else on such a relatively large codebase, where it matters where functions are implemented and how they&#8217;re scoped.</p></li><li><p>In the evening hours, I also started working through Colt Steele&#8217;s excellent <a href="https://www.udemy.com/course/js-algorithms-and-data-structures-masterclass/">Algorithms and Data Structures Masterclass</a> I&#8217;d purchased back in December. I feel like Rithm is doing a great job getting me used to how programming works in the real world. This course is more of a deep dive into designing and working with some of the more complex data structures you tend to encounter in interview questions.</p></li><li><p><strong>This weekend:</strong> Our weekend assessment this week is building a Jeopardy clone that gets questions from a generic trivia API and organizes them into categories.</p></li><li><p><strong>Next week:</strong> Starting Monday we switch to Python and start building servers in Flask. Super excited as I&#8217;ve got a lot to learn in this area.</p></li></ul><h2>Bug Report</h2><blockquote><p><em>If debugging is the process of removing bugs, then programming must be the process of putting them in.</em></p><p><em>&#8212; Edsger W. Dijkstra</em></p></blockquote><p><em>... and this week, we put in (and subsequently took out!) a lot of bugs.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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 Hack or Snooze project followed an object-oriented pattern, where data and functionality were managed together in classes that represented different entities relevant to the app (e.g. users, stories, etc.). We had a lot of functions that passed the data in these objects back and forth between the server resulting in a variety of tricky TypeErrors that ultimately had to do with the format of data as it passes between servers and clients.</p><p>One tricky fact of working with server requests is properly manipulating and acting on the data that they send back. Servers <em>can only send strings</em> back to the client. It&#8217;s usually JSON-formatted and it&#8217;s often nested in a larger data structure containing response headers and other information about the server response.</p><p>Here&#8217;s what one of our server responses might look like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_q22!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_q22!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png 424w, https://substackcdn.com/image/fetch/$s_!_q22!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png 848w, https://substackcdn.com/image/fetch/$s_!_q22!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png 1272w, https://substackcdn.com/image/fetch/$s_!_q22!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_q22!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png" width="1300" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1300,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:247381,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!_q22!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png 424w, https://substackcdn.com/image/fetch/$s_!_q22!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png 848w, https://substackcdn.com/image/fetch/$s_!_q22!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png 1272w, https://substackcdn.com/image/fetch/$s_!_q22!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24891220-51e3-42a6-a0aa-74c1d467ba9b_1300x630.png 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>If you look inside that data field, you see the data we&#8217;re looking for, but it&#8217;s still not an instance&nbsp; so we can&#8217;t run any of our instance methods on it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Sulj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sulj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png 424w, https://substackcdn.com/image/fetch/$s_!Sulj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png 848w, https://substackcdn.com/image/fetch/$s_!Sulj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png 1272w, https://substackcdn.com/image/fetch/$s_!Sulj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sulj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png" width="1210" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:249945,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!Sulj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png 424w, https://substackcdn.com/image/fetch/$s_!Sulj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png 848w, https://substackcdn.com/image/fetch/$s_!Sulj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png 1272w, https://substackcdn.com/image/fetch/$s_!Sulj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb083c5c7-d256-4934-a04d-d91b176eadda_1210x630.png 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>So we ultimately needed to instantiate instances of each story object as they were recalled from the server. We used a JS library called Axios for the request, but the same can be done using the fetch() API:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XCZb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XCZb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png 424w, https://substackcdn.com/image/fetch/$s_!XCZb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png 848w, https://substackcdn.com/image/fetch/$s_!XCZb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!XCZb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XCZb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png" width="1456" height="1035" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1035,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:423825,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!XCZb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png 424w, https://substackcdn.com/image/fetch/$s_!XCZb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png 848w, https://substackcdn.com/image/fetch/$s_!XCZb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!XCZb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a80fce7-4f8a-4a7b-a7e6-72a383672106_1520x1080.png 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><h2>Surf Report</h2><ol><li><p><a href="https://noahpinion.substack.com/p/honestly-its-probably-the-phones">Honestly, it&#8217;s probably the phones</a>.</p></li><li><p><a href="https://open.substack.com/pub/bigtechnology/p/social-media-is-changing-and-paid?r=37qic&amp;utm_medium=ios&amp;utm_campaign=post">Social media becoming pay-to-play</a>.</p></li><li><p><a href="https://pmarca.substack.com/p/on-pausing-alcohol?utm_source=post-email-title&amp;publication_id=1434963&amp;post_id=105748371&amp;isFreemail=true&amp;utm_medium=email">Marc Andreessen stopped drinking</a>.</p></li><li><p><a href="https://www.jailbreakchat.com">Jailbreak ChatGPT Prompts</a>.</p></li></ol><h2>BONUS: Midjourney Report</h2><p>I&#8217;ve been playing around with Midjourney in my spare time and have started experimenting with some of the &#8220;pro-level&#8221; prompts you might be seeing more and more of from prompt engineering influencers. Here&#8217;s a hilarious meme from one of those influencers that I think effectively captures the sea change we&#8217;re seeing in AI-generated art:</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/nickfloats/status/1630855281876819969?s=12&amp;t=c0zm9zMa5rGVx4afMXMoNA&quot;,&quot;full_text&quot;:&quot;Me on the 4 train https://t.co/LUVnuH4ixj &quot;,&quot;username&quot;:&quot;nickfloats&quot;,&quot;name&quot;:&quot;Nick St. Pierre&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Wed Mar 01 08:59:33 +0000 2023&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/FqH15tYX0AM44jT.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/AUV6FPpZv5&quot;,&quot;alt_text&quot;:null}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:508,&quot;like_count&quot;:4519,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Here are some of my favorite creations from this week:</p><p><strong>Cyborg Baby</strong></p><blockquote><p><code>cyborg baby| with a visible detailed brain| muscles cable wires| detailed cyberpunk background with neon lights| biopunk| cybernetic| unreal engine| CGI | ultra detailed| 4k</code></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gxc6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gxc6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Gxc6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Gxc6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Gxc6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gxc6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1390359,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!Gxc6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Gxc6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Gxc6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Gxc6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c19c681-7b37-4522-9b96-bba3751abe41_1024x1024.png 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><strong>Meditations</strong></p><blockquote><p><code>anime style wizard floating over pond in Meditation peaceful silence --niji --q 2</code></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r5tj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r5tj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!r5tj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!r5tj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!r5tj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r5tj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&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;:true,&quot;topImage&quot;:false,&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_!r5tj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!r5tj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!r5tj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!r5tj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdda61d-eb2d-4502-862a-ace7411988a9_1024x1024.png 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><strong>Wormhole</strong></p><blockquote><p><code>wormhole into a parallel universe ultra detailed celestial high resolution 16:9 cinematic photorealistic --chaos 100 --q 2</code></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_feM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_feM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!_feM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!_feM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!_feM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_feM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&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;:true,&quot;topImage&quot;:false,&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_!_feM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!_feM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!_feM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!_feM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b8941d6-f16b-4086-b14d-ba3d3da753a1_1024x1024.png 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><strong>Post-Apocalyptic SF Future</strong></p><blockquote><p><code>san francisco skyline in the high tech future::3 photorealistic::5 realistic::3 sunlight::3 DSLR::2 panorama::2.5 wide angle lens::2 satellite imagery::1.5 --ar 2:1 --v 4 --quality 2 --stylize 1000 --chaos 100</code></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!afji!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!afji!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png 424w, https://substackcdn.com/image/fetch/$s_!afji!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png 848w, https://substackcdn.com/image/fetch/$s_!afji!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png 1272w, https://substackcdn.com/image/fetch/$s_!afji!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!afji!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&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;:true,&quot;topImage&quot;:false,&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_!afji!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png 424w, https://substackcdn.com/image/fetch/$s_!afji!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png 848w, https://substackcdn.com/image/fetch/$s_!afji!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png 1272w, https://substackcdn.com/image/fetch/$s_!afji!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15f7af8e-4239-411a-8345-652bb38d0a33_1728x864.png 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><strong>Asian Battle Queen</strong></p><blockquote><p><code>ancient chinese queen::2 ultra modern::1 natural lighting::2 glowing::3 fluorescent::2 DSLR::1 wide angle lens::1 defocus::-0.5 --ar 2:1 --v 4 --quality 2</code></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MnQx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MnQx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png 424w, https://substackcdn.com/image/fetch/$s_!MnQx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png 848w, https://substackcdn.com/image/fetch/$s_!MnQx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png 1272w, https://substackcdn.com/image/fetch/$s_!MnQx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MnQx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&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;:true,&quot;topImage&quot;:false,&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_!MnQx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png 424w, https://substackcdn.com/image/fetch/$s_!MnQx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png 848w, https://substackcdn.com/image/fetch/$s_!MnQx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png 1272w, https://substackcdn.com/image/fetch/$s_!MnQx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af1b82b-991f-493c-9bd6-6346c3dd2415_1728x864.png 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><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #3: Connect Four]]></title><description><![CDATA[Bootcamp begins with algorithms, OOP, pair programming, and games]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-3-connect-four</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-3-connect-four</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Sat, 25 Feb 2023 17:02:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PYHC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>In this Issue:</em></p><ol><li><p>Progress Report (Part 1): Week 1</p></li><li><p>Progress Report (Part 2): Connect Four</p></li><li><p>Bug Report: The Trouble with&nbsp;<code>this</code></p></li><li><p>Surf Report: Tech Layoffs Feeding Startup Surge?</p></li></ol><div><hr></div><h2><strong>Progress Report (Part 1): Week 1</strong></h2><p>We are off to the races! Today marks the end of my first week at Rithm School. The schedule is necessarily intense, but sustainable. Our days start at 9:30 am and end at around 6 pm. Days are split between a mix of lectures and hands-on labs where we work in pairs building apps and solving algorithmic challenges.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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>I am really enjoying the teaching staff and my classmates. It's a serious program and it feels serious, but we&#8217;re also having fun with it. It very much feels like we're all in this together, supporting each other as we learn and grow as developers.</p><p>One thing I'm still trying to figure out is how to make progress on "life stuff" outside class. With such limited &#8220;free&#8221; daytime hours, I'm still figuring out the best way to stay on top of laundry, exercise, and food consumption.</p><p>Overall, though, I&#8217;m grateful to have the opportunity to immerse myself in programming to this extent with a cohort of other like-minded people.</p><h2><strong>Progress Report (Part 2): Connect Four</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PYHC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PYHC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!PYHC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!PYHC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!PYHC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PYHC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1317107,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!PYHC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!PYHC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!PYHC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!PYHC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb79bd91d-51b0-496b-a268-32838f2fe09b_1024x1024.png 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><figcaption class="image-caption">A dystopian game of Connect Four, imagined by Midjourney AI.</figcaption></figure></div><p>One of the apps we built in lab this week was a&nbsp;<strong><a href="https://github.com/seanoliver/connect-four-oo">browser-based version of Connect Four</a></strong>&nbsp;in JavaScript. The next day, we refactored our code to fit within the Object-Oriented Programming paradigm centered around a unified <code>Game</code> object that manages the data and functionality for a given game, along with "Player" objects to manage individual player preferences.</p><p>Having to do this refactoring was was a great exercise. It really helped to highlight the importance of context in function calls and also highlighted in practical terms some of the real benefits of OOP. Once we refactored the functionality into <code>Game</code> objects, things that would have been extremely complicated to do became trivial. For example, spinning up multiple simultaneous instances of a game, extending the game class to allow for subclasses with special rules like more players, bigger boards, and so on.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J_NA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J_NA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png 424w, https://substackcdn.com/image/fetch/$s_!J_NA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png 848w, https://substackcdn.com/image/fetch/$s_!J_NA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png 1272w, https://substackcdn.com/image/fetch/$s_!J_NA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J_NA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png" width="812" height="1018" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1018,&quot;width&quot;:812,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:514997,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!J_NA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png 424w, https://substackcdn.com/image/fetch/$s_!J_NA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png 848w, https://substackcdn.com/image/fetch/$s_!J_NA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png 1272w, https://substackcdn.com/image/fetch/$s_!J_NA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a97af30-c7f7-47e9-80db-edfe2c9a2f7d_812x1018.png 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><figcaption class="image-caption">A simple, bowser-based version of <a href="https://seanoliver.dev/connect-four-oo/">Connect Four</a>.</figcaption></figure></div><p>I&#8217;ve started a&nbsp;<strong><a href="https://github.com/seanoliver/connect-four-oo">running list</a></strong>&nbsp;on GitHub of new features I plan to roll out, but in the meantime you can start playing with the simple version here:&nbsp;<strong><a href="https://seanoliver.dev/connect-four-oo/">https://seanoliver.dev/connect-four-oo/</a></strong></p><h2>Bug Report: The Trouble with <code>this</code></h2><blockquote><p><em>If debugging is the process of removing bugs, then programming must be the process of putting them in.</em></p><p><em>&#8212; Edsger W. Dijkstra</em></p></blockquote><p><em>Each week, I&#8217;ll share a particularly nasty bug I encountered along with how I resolved it.</em></p><p>This week's bug involves the infamous <code>this</code> keyword in JavaScript. In my game object, I have a method called <code>makeHtmlBoard</code>, which creates the game board and adds a click event listener to the top of each column, allowing the user to drop a piece in their turn. There's also an <code>endGame</code> method that congratulates the winner and should stop the user from being able to continue to add pieces to the board.</p><p>Here are the relevant sections of code:</p><pre><code><code>class Game {
  makeHtmlBoard() {
&#9;// ...
  &#9;top.addEventListener('click', this.handleClick.bind(this));
&#9;// ...
  }

  endGame(msg) {
   // ...
    top.removeEventListener('click', this.handleClick.bind(this));
&#9;// ...
  }
}</code></code></pre><p>Unfortunately, we quickly realized that&nbsp;<code>endGame</code>&nbsp;was not actually removing the event listener, so a user could keep dropping pieces onto the game board even after the game had ended.</p><p>We added some&nbsp;<code>console.log()</code>s in various places to confirm that:</p><ol><li><p>Every line of code was, in fact, running when it was supposed to</p></li><li><p><code>this</code> correctly referenced the current instance of&nbsp;<code>Game</code>&nbsp;each time it was used</p></li></ol><p>After exhausting other possibilities, we realized we weren&#8217;t fully familiar with all the magic the&nbsp;<code>bind()</code>&nbsp;function was doing under the hood. We&#8217;d only been introduced to it in a lecture earlier that day. </p><p>We took a trip to the&nbsp;<strong><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind">MDN docs</a></strong>&nbsp;and our mistake dawned upon us:</p><blockquote><p><em>The&nbsp;</em><code>bind()</code>&nbsp;method creates a new function that, when called, has its <code>this</code> keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.</p></blockquote><p>The&nbsp;<code>bind()</code>&nbsp;method&nbsp;<strong>creates a new function</strong>! D&#8217;oh! &#129318;&#8205;&#9794;&#65039;</p><p>While they might look the same, the&nbsp;<code>removeEventListener</code>&nbsp;was referencing a different function in memory than&nbsp;<code>addEventListener</code>, so it couldn&#8217;t find the correct listener to remove!</p><p>The solution was to store a single version of the bound function reference in a variable in the&nbsp;<code>Game</code>&nbsp;constructor and use it for both adding and removing the event listener:</p><pre><code><code>class Game {
  constructor(height = 6, width = 7) {
    // ...
    this.boundHandleClick = this.handleClick.bind(this);
    // ...
  }

  makeHtmlBoard() {
    // ...
    top.addEventListener('click', this.boundHandleClick);
    // ...
  }

  endGame(msg) {
    // ...
    const top = document.getElementById('column-top');
    top.removeEventListener('click', this.boundHandleClick);
    // ...
  }
}</code></code></pre><h2><strong>Surf Report: Tech Layoffs Feeding Startup Surge?</strong></h2><ol><li><p><strong><a href="https://www.wired.com/story/tech-layoffs-are-feeding-a-new-startup-surge/">Tech layoffs are feeding a new startup surge</a></strong></p></li><li><p><strong><a href="https://waitbutwhy.com/?ck_subscriber_id=2057727318">Tim Urban&#8217;s new book is finally here!</a></strong></p></li><li><p><strong><a href="https://www.youtube.com/watch?v=lAopNJMbFEI">Aliens mostly hang out in America</a></strong></p></li><li><p><strong><a href="https://charlottebuff.com/unicode/misc/rejected-emoji-proposals/">Emoji proposals rejected by the Unicode Consortium</a></strong></p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #2: Memory Game]]></title><description><![CDATA[A story of NodeLists, HTMLCollections, and identity theft.]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding-2-memory-game</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding-2-memory-game</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Sat, 18 Feb 2023 02:29:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0bb68d29-aced-4682-bfa0-8fe0d64b9741_2408x1812.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Progress</strong></h2><p><strong>Memory Game.</strong> I wrapped up the <a href="https://github.com/seanoliver/memory-game">final pre-work project</a> before bootcamp begins next week. It&#8217;s a traditional memory game where you have to flip over two cards at a time trying to find two that match.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cvyG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cvyG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif 424w, https://substackcdn.com/image/fetch/$s_!cvyG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif 848w, https://substackcdn.com/image/fetch/$s_!cvyG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif 1272w, https://substackcdn.com/image/fetch/$s_!cvyG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cvyG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif" width="800" height="494" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:494,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3453842,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&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_!cvyG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif 424w, https://substackcdn.com/image/fetch/$s_!cvyG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif 848w, https://substackcdn.com/image/fetch/$s_!cvyG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif 1272w, https://substackcdn.com/image/fetch/$s_!cvyG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff693eef6-1e82-4baa-adf9-edb0ccf0b69a_800x494.gif 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">Check it out at <a href="https://seanoliver.dev/memory-game">https://seanoliver.dev/memory-game</a></figcaption></figure></div><p>Building it was a fun, iterative process that had me going back over the code I'd already written for the base-level functionality and enriching it with new features and capabilities. I started with the ability to flip over a single card and then added layers of feature logic one at a time: allowing two cards at a time to be flipped, randomly generating the colors on the back, letting the user set the number of cards, letting the user restart the game, keeping track of the score, and using GIFs instead of colors as the card backs.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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>It was cool to see that even as I added most of this functionality, the length of the underlying JS file didn't change much from when I'd finished it with just the basic card flip capability. You can see in the <a href="https://github.com/seanoliver/memory-game/commits/main">commit history</a> that most of my updates had me adding as many lines of code as I was deleting.</p><p>I also had a very &#8220;proud dad&#8221; moment with Mika as she excitedly dove right into beta testing my 1-player game, finding a way to turn it into a 2-player game, and beating me at it. We are now playing it every night at dinner time and she's making feature requests. &#129318;&#8205;&#9794;&#65039;</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/SeanOliver/status/1626046255041486851?s=20&quot;,&quot;full_text&quot;:&quot;Achievement unlocked!\n\nStill very basic design but today my daughter and I played a browser based matching game I built from scratch using vanilla JS! <span class=\&quot;tweet-fake-link\&quot;>#LearningToCode</span>\n\nGive it a whirl! <a class=\&quot;tweet-url\&quot; href=\&quot;https://seanoliver.dev/memory-game\&quot;>seanoliver.dev/memory-game</a> &quot;,&quot;username&quot;:&quot;SeanOliver&quot;,&quot;name&quot;:&quot;Sean Oliver&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Thu Feb 16 02:30:12 +0000 2023&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/FpDgcCOaAAAUSkX.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/Wm2zJ8k6LB&quot;,&quot;alt_text&quot;:null}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:0,&quot;like_count&quot;:0,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:false}" data-component-name="Twitter2ToDOM"></div><p><strong>Deep Work</strong>. I started and finished reading <em><a href="https://www.goodreads.com/book/show/25744928-deep-work?ac=1&amp;from_search=true&amp;qid=pV1mDceFFx&amp;rank=1">Deep Work</a></em> by Cal Newport this week. I&#8217;ve long been a fan of Cal&#8217;s writing so I was excited to dig right into this one. I feel like now was the perfect time for me to come across it, too, as the satisfaction that comes with doing deep work is one of the things that has drawn me to programming in the first place. Cal defines &#8220;deep work&#8221; as follows:</p><blockquote><p><em><strong>Deep Work</strong>: Professional activities performed in a state of distraction-free concentration that push your cognitive capabilities to their limit. These efforts create new value, improve your skill, and are hard to replicate.</em></p></blockquote><p>This is opposed to &#8220;shallow work:&#8221;</p><blockquote><p><em><strong>Shallow Work</strong>: Noncognitively demanding, logistical-style tasks, often performed while distracted. These efforts tend to not create much new value in the world and are easy to replicate.</em></p></blockquote><p>There&#8217;s no way to escape shallow work&#8212;in fact some jobs, including most executive-level jobs, are made up almost entirely of shallow work. But the goal should be to minimize the deep as much as one can and/or is appropriate. Because of &#8220;The Deep Work Hypothesis:&#8221;</p><blockquote><p><em><strong>The Deep Work Hypothesis</strong>: The ability to perform deep work is becoming increasingly rare at exactly the same time it is becoming increasingly valuable in our economy. As a consequence, the few who cultivate this skill, and then make it the core of their working life, will thrive.&nbsp;</em></p></blockquote><p>This focus on delivering truly differentiated value to the world is something that&#8217;s becoming more important as things like AI start gobbling up knowledge work&#8212;<a href="https://futurism.com/the-byte/bing-ai-responds-marriage">and marriages!</a>&#8212;and the idea of learning a skill once and doing it for the rest of your life goes away. My favorite futurist who is actually a historian, YNH, first introduced me to the concept in <em>Homo Deus</em> and it feels really relevant here, especially when you consider that learning something new <em>is</em> in itself deep work:</p><blockquote><p><em>Traditionally, life has been divided into two main parts: a period of learning followed by a period of working. Very soon this traditional model will become utterly obsolete, and the only way for humans to stay in the game will be to keep learning throughout their lives, and to reinvent themselves repeatedly. Many if not most humans may be unable to do so.</em></p><p><em>&#8212; Yuval Noah Harari, Homo Deus</em></p></blockquote><p>But what&#8217;s more personally important to me is the sense of satisfaction that comes from entering the flow state (h/t to Csikszentmihalyi). He writes that, &#8220;human beings, it seems, are at their best when immersed deeply in something challenging.&#8221;</p><blockquote><p><em>Ironically, jobs are actually easier to enjoy than free time, because like flow activities they have built-in goals, feedback rules, and challenges, all of which encourage one to become involved in one&#8217;s work, to concentrate and lose oneself in it. Free time, on the other hand, is unstructured, and requires much greater effort to be shaped into something that can be enjoyed.</em></p></blockquote><p>The me from 10 years ago would have scoffed at this idea, but as I&#8217;ve gotten older I&#8217;ve come to appreciate the process of working toward accomplishing things because it&#8217;s in that process that I demonstrate the values to which I hold myself.</p><h2>Problems</h2><p><strong>Stolen wallet</strong>. My cross-body bag, containing my wallet and keys, was stolen from me yesterday en route to Pennsylvania to pay my mom a long overdue visit. As a result, I had to cancel the trip at the very last minute and fly back to California just eight hours after having landed in Newark.</p><p>Needless to say, it was an extremely stressful and depressing 36 hours, and the hassle of having to re-secure my accounts and replace the things that were lost is one that I&#8217;ll be dealing with for the foreseeable future.</p><p>When I&#8217;m feeling down, I turn to a note that I keep on my phone where I collect quotes that inspire me and remind me to take a broader perspective. This one stood out to me yesterday:</p><blockquote><p><em>Everything can be taken from a man but one thing: the last of the human freedoms&#8212;to choose one&#8217;s attitude in any given s4et of circumstances, to choose one&#8217;s own way.</em></p><p><em>&#8212; Viktor Frankl, Man&#8217;s Search for Meaning</em></p></blockquote><p>It&#8217;s very hard to read this sentiment from a guy who survived Auschwitz and keep feeling bad about myself. So here are some silver linings:</p><ul><li><p>I am learning a ton about <a href="https://www.reddit.com/r/EDC/">the EDC movement</a> (not the music festival, but just as cool IMO), and I&#8217;m currently geeking out over a set of minimalist supplies for keeping my important items with me securely at all times moving forward.</p></li><li><p>This interruption gave me a lot of downtime which I was able to put to some good use. I read the entirety of <em>Deep Work</em> and I made a lot of progress on an open source <a href="https://logseq.com/">Logseq</a> theme I hope to launch in the coming days as part of my developer portfolio.</p></li><li><p>I was inspired by the&#8212;surprisingly&#8212;authentically good people that work for United&#8217;s ground and baggage services team. They really exhausted every option they could to help me out, including stopping a fully boarded plane from taking off so the flight crew could search my seat area.</p></li></ul><p><code>NodeLists</code><strong> and </strong><code>HTMLCollections</code><strong>.</strong> While working through the Memory Game project I encountered the first of what I expect will be many quirky behaviors of some of JavaScript&#8217;s built-in functions.</p><p>In the function that checks the two flipped cards to see if they match, I had planned to flip cards that do not match back over by iterating over them and adjusting their class name accordingly:</p><pre><code>const flippedCards = document.getElementsByClassName('flipped');

function checkMatches() {
&nbsp; if (flippedCards[0].className === flippedCards[1].className) {
&nbsp; &nbsp; for (const card of flippedCards) {
&nbsp; &nbsp; &nbsp; card.classList.toggle('matched');
&nbsp; &nbsp; &nbsp; card.classList.toggle('flipped');
&nbsp; &nbsp; }
&nbsp; }
}</code></pre><p>Unfortunately <code>getElementsByClassName</code> returns an <code>HTMLCollection</code> which is a live list of elements that updates in real time to reflect the conditions specified at declaration time.</p><p>So in this case, each time I toggled off the flipped class from a given card, the card dropped out of the list and everything behind it moved up by one index value. In other words if I had two cards in <code>flippedCards</code>, my function would flip the card at index 0, drop it from the list, and move the second card to index 0 which, from JavaScript&#8217;s point of view, had already been handled. The second card wasn&#8217;t getting flipped!</p><p>The function <code>querySelectorAll</code>, on the other hand, returns a <code>NodeList</code> which is &#8220;static.&#8221; Each element is essentially a reference to the live element but the references are static from the time they were declared.</p><p>I had a helpful chat about this with my cohort-mates in our Slack channel and landed on a couple solutions:</p><ol><li><p>Iterate backwards through the <code>HTMLCollection</code>, so the next index value always <em>will</em> exist, or</p></li><li><p>Use <code>querySelectorAll</code></p></li></ol><p>I actually like the &#8220;live&#8221; aspect of the <code>HTMLCollection</code> because it means that I can declare flippedCards once and then know that it&#8217;s reflecting whatever is live in the DOM whenever it&#8217;s called, as opposed to having to keep track of when it was most recently declared. So I ended up going with option 1.</p><h2>Plans</h2><p><strong>Rithm School</strong>. Classes begin Monday morning! I have to say, it&#8217;s been a long time getting to this moment, and I&#8217;m now at the point where I&#8217;m itching to get started. The time is upon us!</p><h2>Surf Report</h2><p><em>Here are some interesting tidbits I&#8217;ve found on the internet this week. Thanks to ChatGPT for the clever name for this section.</em></p><p>Here's a sampling of some of the interesting stuff I've found from around the internet.</p><p><strong>Chart: Apple vs. China</strong>. I&#8217;m not sure there&#8217;s a lot to take away from this other than the fact that, wow, Apple is really, <em>really</em> big. (Source: <a href="https://qualitycompounding.substack.com/p/never-invest-in-the-next-big-thing">Compounding Quality</a>)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hSUi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd2e00c6-9ad0-4416-b631-51d951846f93_904x904.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hSUi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd2e00c6-9ad0-4416-b631-51d951846f93_904x904.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hSUi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd2e00c6-9ad0-4416-b631-51d951846f93_904x904.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hSUi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd2e00c6-9ad0-4416-b631-51d951846f93_904x904.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hSUi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd2e00c6-9ad0-4416-b631-51d951846f93_904x904.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hSUi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd2e00c6-9ad0-4416-b631-51d951846f93_904x904.jpeg" width="904" height="904" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd2e00c6-9ad0-4416-b631-51d951846f93_904x904.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:904,&quot;width&quot;:904,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!hSUi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd2e00c6-9ad0-4416-b631-51d951846f93_904x904.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hSUi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd2e00c6-9ad0-4416-b631-51d951846f93_904x904.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hSUi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd2e00c6-9ad0-4416-b631-51d951846f93_904x904.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hSUi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd2e00c6-9ad0-4416-b631-51d951846f93_904x904.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><strong>PianoGPT</strong>. An amazing demo applying predictive piano playing to a low-fidelity 8-button controller. This was actually made in 2018, long before ChatGPT. There&#8217;s even a live web demo you can play with <a href="https://piano-genie.glitch.me/">here</a>.</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/DrJimFan/status/1625167688883646464?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1625167688883646464%7Ctwgr%5E%7Ctwcon%5Es1_&amp;ref_url=file%3A%2F%2F%2FApplications%2FLogseq.app%2FContents%2FResources%2Fapp%2Felectron.html%2Fpage%2Fsean20is20coding20232&quot;,&quot;full_text&quot;:&quot;We&#8217;ve seen a gazillion startups using OpenAI APIs to do &#8220;co-pilot for X&#8221;. What&#8217;s next?\n\nEnter *physical* co-pilot! Here&#8217;s a compelling demo: you improvise by playing a &#8220;low resolution&#8221; piano, and the co-pilot compiles it real-time to Hi-Fi music! It unleashes our inner pianist.&#129525; &quot;,&quot;username&quot;:&quot;DrJimFan&quot;,&quot;name&quot;:&quot;Jim Fan&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Mon Feb 13 16:19:05 +0000 2023&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://substackcdn.com/image/upload/w_1028,c_limit,q_auto:best/l_twitter_play_button_rvaygk,w_88/i4ywe53rfenod6izr2xk&quot;,&quot;link_url&quot;:&quot;https://t.co/wQEch37mi5&quot;,&quot;alt_text&quot;:null}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:1166,&quot;like_count&quot;:6580,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:&quot;https://video.twimg.com/ext_tw_video/1625167638572974083/pu/vid/1280x720/ajK-IPofwycUEBdU.mp4?tag=12&quot;,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p><strong><a href="https://www.nytimes.com/wirecutter/guides/identity-theft-protection/">Wirecutter&#8217;s Identity Theft Article</a></strong>. Say what you will about the NYTimes, I&#8217;ve always found Wirecutter&#8217;s product reviews to be particularly practical and unbiased. Their article on identity theft solutions is also really <em>useful</em> because it shares a comprehensive list of actions you can take to be proactive about securing your identity. This is an area to which I really haven&#8217;t paid enough attention.&nbsp;</p><p>This bag theft issue (knock on wood) could have been a lot worse, and it really can happen to anyone. If you haven&#8217;t already, I encourage you to take a look at your information security measures and make sure you&#8217;re doing what you can to protect yourself.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding #1: JS DOM Manipulation]]></title><description><![CDATA[Welcome to the first edition of Sean is Coding!]]></description><link>https://newsletter.seanoliver.dev/p/sic-1-meme-generator-and-js-dom-manipulation</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sic-1-meme-generator-and-js-dom-manipulation</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Fri, 10 Feb 2023 22:50:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!G1Bh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome to the first edition of Sean is Coding! I&#8217;m still playing around with the format/content so feel free to respond and let me know if there&#8217;s anything you&#8217;d like to see more of.</p><h2>The Latest</h2><p>I&#8217;m wrapping up a rewarding first week of funemployment before my bootcamp cohort begins classes. For those of you I haven&#8217;t told already, I&#8217;m joining  <a href="https://www.rithmschool.com/">Rithm School</a>, an SF-based (but now fully remote) software engineering bootcamp that teaches JavaScript and Python.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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>I&#8217;m using the time this week and next to work through the packet of pre-work that covers foundational topics like web technologies, algorithms, and basic data structures in JavaScript. It also includes some fun assignments like this kooky <a href="https://github.com/seanoliver/meme-gen">Meme Generator</a>,  a battery of 60+ algorithm problems we had to solve, and some other basic web projects to get our feet wet.</p><p>I also had some great conversations, dinners, and pair programming sessions with an array of colleagues and friends, some of which I hadn&#8217;t caught up with since the pandemic lockdowns began.</p><h2>Look What I Learned</h2><p><em>Here&#8217;s a new programming concept/technique I learned this week.</em></p><h4>DOM Manipulation in JS</h4><p>Until now, most of my exposure to JS has been about learning the basics of programming&#8212;manipulating data types and structures, techniques like closure and recursion, functional vs. object-oriented paradigms, etc.</p><p>But the main benefit of a language like JavaScript is in all the ways it interacts with the browser right out of the box. I&#8217;d known about this, of course, but didn&#8217;t really get a chance to sink my teeth in until this Meme Generator <a href="https://github.com/seanoliver/meme-gen/blob/main/memegen.js">project</a> this week. </p><p>You can play with the tool live <a href="https://seanoliver.dev/meme-gen/">here</a>.</p><h2>Shiny Object </h2><p><em>I love trying out new apps, gadgets, and other useful products before they break into the mainstream zeitgeist. Here&#8217;s a peek into what&#8217;s been piquing my interest recently: </em></p><h4>Readwise Reader</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G1Bh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G1Bh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg 424w, https://substackcdn.com/image/fetch/$s_!G1Bh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg 848w, https://substackcdn.com/image/fetch/$s_!G1Bh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!G1Bh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G1Bh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Readwise Reader | The first read-it-later app built for power readers.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Readwise Reader | The first read-it-later app built for power readers." title="Readwise Reader | The first read-it-later app built for power readers." srcset="https://substackcdn.com/image/fetch/$s_!G1Bh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg 424w, https://substackcdn.com/image/fetch/$s_!G1Bh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg 848w, https://substackcdn.com/image/fetch/$s_!G1Bh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!G1Bh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c28ce2-040b-4603-8794-44b9f8486e96_2400x1260.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><figcaption class="image-caption"><a href="https://readwise.io/read">Readwise Reader</a> might be the perfect read-it-later app.</figcaption></figure></div><p>Readwise recently launched their read-it-later app called <a href="https://readwise.io/read">Reader</a>, and it&#8217;s completely blowing my mind. I&#8217;ve tried similar apps like Pocket, Instapaper, Raindrop, and others, but they never stuck. Usually they ended up becoming  cluttered and overwhelming with links whose context I&#8217;d forgotten.</p><p>For the first time, I find myself actually making time to go through it and actually process the stuff I marked to read later.</p><p><strong>Why I like it</strong></p><ul><li><p>They&#8217;ve really figured out how to parse all kinds of pages and present the content well. I rarely get any weirdly truncated text or missing images.</p></li><li><p>Highlighting works flawlessly and syncs not only across the desktop and mobile apps, but even to the original website where the content was posted.</p></li><li><p>All of the highlights go into my Readwise SRS queue and into my second brain in Logseq.</p></li><li><p>Text-to-speech read aloud on the mobile app for when I&#8217;m out and want to catch up on some reading.</p></li><li><p>AI generated article summaries</p></li><li><p>Auto expands Twitter threads and treats them like normal articles</p></li><li><p>It also has a &#8220;feed&#8221; area that takes in emails, email newsletters, and RSS feeds from which you can pick and choose what you want without having everything clutter your inbox queue.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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 Sean is Coding! 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[Sean is Coding]]></title><description><![CDATA[Follow my journey from marketing to software engineering]]></description><link>https://newsletter.seanoliver.dev/p/sean-is-coding</link><guid isPermaLink="false">https://newsletter.seanoliver.dev/p/sean-is-coding</guid><dc:creator><![CDATA[Sean Oliver]]></dc:creator><pubDate>Sun, 29 Jan 2023 18:54:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c96770c-2b36-406e-a38d-738b9ef7fe07_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi! I&#8217;m Sean, a tech enthusiast turned software engineer based (proudly) in San Francisco with my beautiful wife, our two truly astonishing kids, and our adorable 3.5 pound&nbsp;<a href="https://www.mic.com/life/are-pets-gateway-drug-parenting">gateway pup</a>, Pixel. He was momentarily&nbsp;<a href="https://www.instagram.com/pixelthemaltipoo/">Instagram famous</a>, but then we had human kids and his career took a back seat.</p><p>I&#8217;ve always had a deep passion for new technology, problem-solving, and building useful things. Now after a decade building a career in product marketing, I&#8217;m finally taking the leap to build one around my love of programming and software engineering.</p><p>Since starting this journey in earnest, I&#8217;ve found such immense fulfillment in learning new skills, discovering creative solutions, and being a part of a community of driven developers (and fellow devs-in-training). For me, this is a move that feels long overdue, so I&#8217;m excited to <a href="https://www.swyx.io/learn-in-public/">learn in public</a> and share what I&#8217;m learning, building, and struggling with. Hit subscribe to follow along!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.seanoliver.dev/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">Subscribe for free to follow my journey from marketing to software engineering!</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></p>]]></content:encoded></item></channel></rss>