<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[semicolonic]]></title><description><![CDATA[Modern Javascript development shouldn't scare the shit out of you.]]></description><link>https://semicolonic.com/</link><image><url>https://semicolonic.com/favicon.png</url><title>semicolonic</title><link>https://semicolonic.com/</link></image><generator>Ghost 5.88</generator><lastBuildDate>Sun, 11 Jan 2026 09:45:25 GMT</lastBuildDate><atom:link href="https://semicolonic.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Alea: Part One - React Basics]]></title><description><![CDATA[Starting from scratch with React.]]></description><link>https://semicolonic.com/alea-iteration-1-react/</link><guid isPermaLink="false">673adb237cfd97336fac5a12</guid><dc:creator><![CDATA[BEH]]></dc:creator><pubDate>Mon, 18 Nov 2024 06:15:13 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1605870445919-838d190e8e1b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE1fHxkaWNlfGVufDB8fHx8MTczMTkxMDQ5NXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="bare-bones-client-side-application">Bare Bones (Client-side Application)</h2><h3 id="flavor-react">Flavor: React</h3><img src="https://images.unsplash.com/photo-1605870445919-838d190e8e1b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE1fHxkaWNlfGVufDB8fHx8MTczMTkxMDQ5NXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Alea: Part One - React Basics"><p>As a reminder, here&apos;s a <a href="https://semicolonic.com/this-is-how-we-do-it/" rel="noreferrer">link to how this series will unfold</a> and a guide to setting up your dev environment (coming soon).</p><p>To get started, we go into our terminal program and run a command that will haunt your dreams after a while: </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-2.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="1360" height="314" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-2.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-2.png 1000w, https://semicolonic.com/content/images/2024/11/image-2.png 1360w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">bash console command</span></figcaption></figure><p>This command will go through all of the installation of packages necessary to get a project up and running, and create the project folder under the name that you gave it. At the end of the install, it gives you some options for commands to run - go ahead and <code>npm start</code> in the console. It&apos;ll clear, and you should see that your React app is running happily on <code>localhost:3000</code>. If we go there using our web browser: DISCO! We&apos;re in business.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-4.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="1173" height="1179" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-4.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-4.png 1000w, https://semicolonic.com/content/images/2024/11/image-4.png 1173w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">http://localhost:3000/ - IT SPINS</span></figcaption></figure><p>It&apos;s not much, but hey, it&apos;s yours! You made it happen. If this is your first time doing any coding: Congratulations, you&apos;ve already done the thing! You can stop RIGHT HERE and I guarantee you that you can look someone in the eye at a party and tell them you&apos;ve started doing web development.</p><h3 id="beyond-the-boilerplate">Beyond the Boilerplate</h3><p>Now go to your IDE of choice and open the folder you created. You&apos;ll see a file structure that looks something like this:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-3.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="901" height="1057" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-3.png 600w, https://semicolonic.com/content/images/2024/11/image-3.png 901w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">starting file structure - ignore the name of the folder being different</span></figcaption></figure><p>Even for something as simple as the page we just looked at, there&apos;s a lot of stuff that happens under the hood, and at some point or another, you might touch all of these files or, at the very least, understand what they are and why they&apos;re important. For now, we&apos;ll start by opening <code>src/App.js</code>, which has the code that makes up the page we saw on port 3000. </p><p>As a reminder, all code in this series is given in screenshot form. No copy-pasting!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-6.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="2000" height="1711" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-6.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-6.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-6.png 1600w, https://semicolonic.com/content/images/2024/11/image-6.png 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Default source in src/App.js</span></figcaption></figure><p>If this looks intimidating, take a few square breaths, then let&apos;s look at the three essential parts:</p><ol><li>There are the <code>import</code> statements that load in the spinning logo image and the other styling for the page.</li><li>A function <code>App</code> whose only job is to return the JSX (<strong>J</strong>ava<strong>S</strong>cript e<strong>X</strong>tension), which is just a blend of Javascript and HTML that is compiled by the React library to make the final HTML we see in the browser.</li><li>The <code>export</code> statement for the <code>App</code> function. By exporting <code>App</code>, we make it available to the rest of our code. In this case, if you open <code>src/index.js</code>, you&apos;ll see the JSX tag corresponding to the exported <code>App</code> here. </li></ol><p>Even in this straightforward file, you can see the whole loop that makes up React: we import things we need, declare a function to make a piece of HTML that we want, and then export it to be used somewhere else. <strong>Everything</strong> we do after this adds detail and decoration to this process.</p><p>Speaking of which, let&apos;s start by scooping out the template JSX in <code>function App ( )</code> for our dice roller. We need:</p><ol><li>A title so people know the name of our app. (BRANDING!)</li><li>An input for the number of dice to roll.</li><li>An input for the type of dice to roll.</li><li>A button to make everything GO.</li><li>An output area with the results from the input.</li></ol><p>For now, we won&apos;t worry about anything WORKING, although some of it will &apos;work&apos; automatically. Without doing anything fancy, we get this:</p><figure class="kg-card kg-image-card"><img src="https://semicolonic.com/content/images/2024/11/image-7.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="2000" height="2711" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-7.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-7.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-7.png 1600w, https://semicolonic.com/content/images/2024/11/image-7.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>Once you&apos;re done, you can go back to the browser and behold the majesty of what you&apos;ve made.</p><h3 id="breaking-shit">Breaking Shit</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-8.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="1154" height="1985" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-8.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-8.png 1000w, https://semicolonic.com/content/images/2024/11/image-8.png 1154w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">BOOM GOES THE DYNAMITE</span></figcaption></figure><p>Congratulations. You&apos;ve officially <em>Broken the Shit</em> out of something you&apos;re working on, which is a time-honored tradition in development. The whole process is to start with something simple, break the shit out of it to get it closer to what you want it to be, fix all the broken bits, and wind up with something new that you&apos;ll get to break all over again.</p><p>You&apos;ll also notice in your console that React isn&apos;t happy with us either:</p><figure class="kg-card kg-image-card"><img src="https://semicolonic.com/content/images/2024/11/image-9.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="1165" height="609" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-9.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-9.png 1000w, https://semicolonic.com/content/images/2024/11/image-9.png 1165w" sizes="(min-width: 720px) 720px"></figure><p>This is an easy fix - remove the <code>import logo</code> statement from the beginning of the file and save it again. Voila! Typically, this is how it works: I fix things in the console <strong>first</strong>, since those will eventually stop everything from building, leaving you looking at Javascript errors. Then, I fix all the visual problems and get things back to looking pretty. (Note: In this case, we&apos;re just going to concentrate on getting things LEGIBLE, with minimal fuss.) To do that, we go into the <code>App.css</code> and replace the contents with the CSS below.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-10.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="2000" height="4044" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-10.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-10.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-10.png 1600w, https://semicolonic.com/content/images/2024/11/image-10.png 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">src/App.css</span></figcaption></figure><p>Which when we look at the app again in the browser, gives us a much better result.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-11.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="1674" height="1106" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-11.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-11.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-11.png 1600w, https://semicolonic.com/content/images/2024/11/image-11.png 1674w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Our far less ugly app.</span></figcaption></figure><p>You should see the app in the middle of the screen, and it may have white columns on either side where the <code>max-width</code> ends, but your screen continues. Feel free to play around with any of the styles in this file. This isn&apos;t a styling tutorial, which is worthy of a whole tutorial in and of itself. Feel free to experiment and take everything in a completely different direction as we go along - I&apos;ll be cleaning up and making things fancy between iterations. The next starting point may look different than where we finish. Just remember that <em>functionality </em>is essential; don&apos;t get so lost in the weeds that you can&apos;t follow along. There&apos;s always time to go wild after everything works.</p><h3 id="adding-reactivity">Adding Reactivity</h3><p>This &apos;works&apos; in that you can adjust the number of dice up or down, choose different sides of the dice, and endlessly click on the button. None of it is hooked up to anything else, so let&apos;s do that. Let&apos;s go back to <code>App.js</code> and add some actual React logic to the <code>App</code> function <strong>before</strong> we return the JSX:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-12.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="2000" height="1211" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-12.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-12.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-12.png 1600w, https://semicolonic.com/content/images/2024/11/image-12.png 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">src/App.js - Adding reactivity.</span></figcaption></figure><p>In React, you use a number of &quot;hooks&quot; to connect the UI (and the user) to data. <code>useState</code> boils down to: </p><ol><li>Identifying a value we need to keep track of (the number of dice to roll)</li><li>Saving that value somewhere we can use it and find it later for display (<code>diceCount</code>)</li><li>Exposing a function so we can <strong>change</strong> that value through our input (<code>setDiceCount</code>)</li></ol><p>Which is what Line 5 boils down to. We then repeat that for the other values we care about in our app:</p><ol><li>The number of dice we roll.</li><li>The sides (maximum value) of each of those dice.</li><li>The set of results we get from rolling them.</li><li>The total of our set of results.</li></ol><p>So, we set up all of those variables and their associated functions, then apply them where needed in the UI. For example, the number of dice input needs to display the number of dice <strong>and</strong> the function to change it get applied to the <strong>number of dice</strong> input and the <strong>number of sides</strong> input:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-13.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="2000" height="1600" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-13.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-13.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-13.png 1600w, https://semicolonic.com/content/images/2024/11/image-13.png 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">App.js: The Input Section</span></figcaption></figure><p>In the input section, we&apos;re assigning the number of dice input to the <code>diceCount</code> variable. You can prove this works by changing the number of dice to roll in the code. On Line 5 of <code>App.js</code>, set <code>useState(2)</code> to <code>useState(10)</code> or any other number, and check the UI again. You should see whatever value you&apos;ve put in there. The same applies on Line 6 of <code>App.js</code> with the number of sides. </p><p>Changing those values <strong>through the UI </strong>requires that we listen for when the input&apos;s value changes, then pass the new value to our <code>diceCount</code> variable. To do that we use the <code>onChange</code> hook. When that hook is called, it doesn&apos;t just get the new value &#x2013; it gets the entire <strong>event</strong> associated with the user making a change. We take that event, pick out the part we need (<code>e.target.value</code>) and pass that into the <code>setDiceCount( )</code> function. Then we do the same thing with the <code>diceSides</code> selector.</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F631;</div><div class="kg-callout-text">Input events are a WHOLE THING to learn about. For now, we&apos;re just going to skim past everything that comes along with events and focus on the critical bits. The event <code spellcheck="false" style="white-space: pre-wrap;">e</code> carries an object called <code spellcheck="false" style="white-space: pre-wrap;">target</code> that represents the <b><strong style="white-space: pre-wrap;">input element </strong></b>the event came from. Inside the object <code spellcheck="false" style="white-space: pre-wrap;">target</code> is both the old value of the input <b><strong style="white-space: pre-wrap;">before</strong></b> the change (<code spellcheck="false" style="white-space: pre-wrap;">previousValue</code>), and the value <b><strong style="white-space: pre-wrap;">after</strong></b> the change, <code spellcheck="false" style="white-space: pre-wrap;">value</code>. That&apos;s the only part of the event we care about, so we pluck it out, and use the <code spellcheck="false" style="white-space: pre-wrap;">Math</code> function to make sure we get a whole number no matter what.<br><br>You can <a href="https://developer.mozilla.org/en-US/docs/Web/API/Event?ref=semicolonic.com" rel="noreferrer">read about input events here</a> if you feel up to it.</div></div><p>Next, we&apos;ll hook up the ROLL button to take our input and generate the results. First, we need to make the function that does the work, putting it under the section where we declare all our variables. Hang onto your boots:</p><figure class="kg-card kg-image-card"><img src="https://semicolonic.com/content/images/2024/11/image-16.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="2000" height="1433" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-16.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-16.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-16.png 1600w, https://semicolonic.com/content/images/2024/11/image-16.png 2000w" sizes="(min-width: 720px) 720px"></figure><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">Detailed Explanation of the rollDice Function</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"></div>
        </div><p>Once we have the function written, we simply attach it to the button using the hook for the event we want to associate with it: <code>onClick</code></p><figure class="kg-card kg-image-card"><img src="https://semicolonic.com/content/images/2024/11/image-17.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="2000" height="1711" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-17.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-17.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-17.png 1600w, https://semicolonic.com/content/images/2024/11/image-17.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>Finally, we add our output to the output section. The total is self-explanatory. For the results, remember that we have an Array of values. Arrays have a built-in function, <code>map</code>, that goes through the array item by item, performing the same function for each slot. In our case, we want to take the result in that slot and make a new list-item in our list for it:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-20.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="2000" height="989" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-20.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-20.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-20.png 1600w, https://semicolonic.com/content/images/2024/11/image-20.png 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Adding our results to the output area.</span></figcaption></figure><p>We also put the total where it belongs in the template as well.</p><p>After we&apos;re done, we check the console for any issues, fixing anything that it complains about, or giving ourselves a quick high-five if the console is clear.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-21.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="1728" height="493" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-21.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-21.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-21.png 1600w, https://semicolonic.com/content/images/2024/11/image-21.png 1728w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">All systems go, Houston.</span></figcaption></figure><p>And so we can test it out in the browser:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://semicolonic.com/content/images/2024/11/image-22.png" class="kg-image" alt="Alea: Part One - React Basics" loading="lazy" width="1680" height="1230" srcset="https://semicolonic.com/content/images/size/w600/2024/11/image-22.png 600w, https://semicolonic.com/content/images/size/w1000/2024/11/image-22.png 1000w, https://semicolonic.com/content/images/size/w1600/2024/11/image-22.png 1600w, https://semicolonic.com/content/images/2024/11/image-22.png 1680w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">8 dice, 10 max ... LOOKING GOOD</span></figcaption></figure><h3 id="wrapping-up">Wrapping Up</h3><p>So now we&apos;ve: </p><ul><li>Started our project in React.</li><li>Made the basic input and output functionality.</li><li>Styled our app so that it is not a complete eyesore.</li><li>We tested our work to make sure it worked as expected.</li></ul><p>Next, we will do it all over again ... in Vue!</p>]]></content:encoded></item><item><title><![CDATA[First Project: A Dice-Rolling App]]></title><description><![CDATA[Dangit, I dropped my dice in the toilet.]]></description><link>https://semicolonic.com/first-project-a-dice-rolling-app/</link><guid isPermaLink="false">672abfe77cfd97336fac5726</guid><dc:creator><![CDATA[BEH]]></dc:creator><pubDate>Sun, 17 Nov 2024 02:36:11 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1581788927061-ac0e09850ed0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEzfHxkaWNlfGVufDB8fHx8MTczMDg0NzQ5OXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1581788927061-ac0e09850ed0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEzfHxkaWNlfGVufDB8fHx8MTczMDg0NzQ5OXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="First Project: A Dice-Rolling App"><p>For our first project, we will make a dice-rolling app. We&apos;ll take it from a simple (and ugly) one-trick pony web page to a for-real progressive web application that we will package up for the Apple App Store and Google Play for 99&#xA2;.</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Before getting started, remember to get your developer environment set up on your computer. This article assumes that you&apos;re all set with a console, Git and Node installations, and some basic familiarity with using the command line.</div></div><h2 id="a-dice-rolling-app-really">A Dice-Rolling App? Really?</h2><p>I have several reasons for choosing a dice-rolling app as the first project I&apos;ll walk through here. The first one is that I am really, really tired of to-do apps. Yes, they have all of the input, output, and UI elements needed for any web application, but MY GOD, they&apos;re so boring.</p><p>The second is that once you grasp the basics, you can go in many different directions depending on your interests. Want to make it so you&apos;re working with playing cards or Tarot cards? With a few logical and UI changes, that&apos;s an achievable goal. Want to make your app all graphical and flashy with animations or backgrounds? Go for it. How about having multiple users use the same &quot;table&quot; together in real-time? Statistics, analysis, visualizations &#x2013; the humble dice-roller is an excellent place to start.</p><p>Finally, a cheap or freemium app like this won&apos;t replace your day job, but going from zero to seeing your work on the App Store is incredibly motivational. Take what you&apos;ve learned and start from the top with your idea.</p><p><a href="https://semicolonic.com/alea-iteration-1-react/" rel="noreferrer">On to the first iteration</a>!</p>]]></content:encoded></item><item><title><![CDATA[This is How We'll Do It]]></title><description><![CDATA[A quick overview of our modern Javascript tutorial series and post structure.]]></description><link>https://semicolonic.com/this-is-how-we-do-it/</link><guid isPermaLink="false">672acafd7cfd97336fac5750</guid><category><![CDATA[meta]]></category><category><![CDATA[intro]]></category><category><![CDATA[overview]]></category><dc:creator><![CDATA[BEH]]></dc:creator><pubDate>Wed, 06 Nov 2024 18:54:42 GMT</pubDate><media:content url="https://semicolonic.com/content/images/2024/11/montell.png.png" medium="image"/><content:encoded><![CDATA[<img src="https://semicolonic.com/content/images/2024/11/montell.png.png" alt="This is How We&apos;ll Do It"><p>As we start this journey together, I thought I&apos;d put together a game plan for how I approach this project, what to expect from each step of the process, and to serve as a reminder if I get distracted along the way. I&apos;ll update this page as we go along if any step seems to be dragging on or if I realize I forgot something important alomg the way. </p><div class="kg-card kg-header-card kg-v2 kg-width-regular " style="background-color: #000000;" data-background-color="#000000">
            
            <div class="kg-header-card-content">
                
                <div class="kg-header-card-text kg-align-center">
                    <h2 id="the-project" class="kg-header-card-heading" style="color: #FFFFFF;" data-text-color="#FFFFFF"><span style="white-space: pre-wrap;">The Project</span></h2>
                    <p id="create-a-web-application-using-modern-javascript-tools-in-an-iterative-fashion-until-the-application-is-productionready-and-deployed" class="kg-header-card-subheading" style="color: #FFFFFF;" data-text-color="#FFFFFF"><span style="white-space: pre-wrap;">Create a web application using modern Javascript tools in an iterative fashion, until the application is production-ready and deployed.</span></p>
                    
                </div>
            </div>
        </div><h2 id="step-one-the-bare-bones">Step One: The Bare Bones</h2><p>We&apos;ll create the first iteration of our app using a modern front-end framework, starting with React. This will be a purely client-side version, and to be honest, it&apos;ll probably be pretty janky.</p><h2 id="step-two-style-over-substance">Step Two: Style Over Substance</h2><p>Using the final product from Step One, we&apos;ll add styling and reorganize our app to make it beautiful on any device&#x2014;well, &quot;beautiful.&quot; Since having many different options here multiplies the work involved, we&apos;ll go through three styling options before settling on one.</p><ul><li>Vanilla CSS</li><li>A UI Kit</li><li>Tailwind CSS</li></ul><h2 id="step-three-function-over-form">Step Three: Function Over Form</h2><p>We&apos;ll return to the functional side and start adding the parts of web applications that don&apos;t get top billing. We&apos;ll refine our application, separate our concerns, and prepare for the next step. This is where the scary shit starts, so we&apos;ll take it slow and do a lot of unnecessary logging to the console so it&apos;s clear what we&apos;re adding.</p><ul><li>Using SSO for authentication</li><li>Reactive programming and observables</li><li>Using browser storage</li><li>Other refinements TBD</li></ul><h2 id="step-four-datalore">Step Four: Datalore</h2><p>Before we jump to a public-facing app, we&apos;ll get down and dirty with exactly what our application will do and what we want (and don&apos;t want) people to do with it. We&apos;ll also think about our data and how to generate, store, and manage it. We&apos;ll compare the different approaches, choose one, and write up a plan. This is where we start to get serious!</p><ul><li>Key-Value Stores</li><li>NoSQL</li><li>SQL (starring Postgres)</li></ul><h2 id="step-five-protect-server">Step Five: Protect &amp; Server</h2><p>We&apos;ll split our application into front and back ends (even if that distinction gets lost along the way ... we&apos;ll talk about it). We&apos;ll take our existing application and move our data to the server where it belongs using NextJS, the meta-framework related to React. </p><p>After this step, we&apos;ll start alternating installments: One strand will continue with our current app in React, the other beginning a grander vision in another framework: Svelte and SvelteKit.</p><h2 id="step-six-deploy-ahoy">Step Six: Deploy, Ahoy!</h2><p>Deciding where and how to deploy our application. More TBD</p><h2 id="step-seven-stores-mores">Step Seven: Stores &amp; Mores</h2><p>TBD</p>]]></content:encoded></item><item><title><![CDATA[A Brief Introduction]]></title><description><![CDATA[Wherein we talk about what's to come.]]></description><link>https://semicolonic.com/a-brief-introduction/</link><guid isPermaLink="false">6701ef5e7cfd97336fac5468</guid><category><![CDATA[meta]]></category><category><![CDATA[intro]]></category><dc:creator><![CDATA[BEH]]></dc:creator><pubDate>Sun, 06 Oct 2024 02:01:02 GMT</pubDate><media:content url="https://semicolonic.com/content/images/2024/10/retro-computer.png" medium="image"/><content:encoded><![CDATA[<img src="https://semicolonic.com/content/images/2024/10/retro-computer.png" alt="A Brief Introduction"><p>Everyone has to start somewhere.</p><p>I spent many of the first years of my career as a developer flailing around like an inflatable man in front of a car dealership. I picked up bad habits, followed bad patterns, adopted bad technologies (<a href="https://blog.adobe.com/en/publish/2019/05/30/the-future-of-adobe-air?ref=semicolonic.com" rel="noreferrer">Adobe Air,</a> anyone?), and went down <strong>way</strong> too many dead ends.</p><p>Over the last 15 years &#x2013; the section of my career where I could call myself a developer without worrying someone would check my ID and toss me out of the club &#x2013; I&apos;ve also prioritized mentoring others. Being a developer is one of the most rewarding things I can do with my time and energy. I try to fan those flames whenever I can in others, and I&apos;ve been proud to be a part of several success stories.</p><p>Semicolonic is my attempt to take that mentorship on the road, if you will, for a wider audience. We&apos;ll start at a point where folks interested in becoming web developers can come along for the ride: Exploring the current Javascript frameworks (both client-side and server-side), comparing and contrasting. </p><p>Your feedback is part of the process. If I find an audience among folks who need to understand CSS or the basics of HTML, we&apos;ll also take some time to review that. Think of Semicolonic as the hip, cool TA in your self-taught developer journey.</p><p>OK, sleeves rolled up. Let&apos;s go.</p>]]></content:encoded></item></channel></rss>