<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6441671</id><updated>2023-08-20T03:08:08.382-07:00</updated><category term="Keith D Commiskey"/><category term="Lifetime Web Developer"/><category term="flutter"/><category term="expiration date"/><category term="drug expiration"/><category term="expiration notifications"/><category term="expiration reminder"/><category term="expire date"/><category term="expiry"/><category term="food expiration"/><category term="javascript"/><category term="dart"/><category term="javascript developer"/><category term="js"/><category term="Coding Fun"/><category term="Coding Games"/><category term="MySQL"/><category term="chatgpt"/><category term="chrome browser extension"/><category term="coding comedy"/><category term="coding humor"/><category term="web app game"/><category term="web development humor"/><category term="2018"/><category term="3D books"/><category term="CSS 3D transforms"/><category term="CSS perspective"/><category term="CSS3"/><category term="Coding timer"/><category term="Guess Right"/><category term="KeepTrack"/><category term="Laravel"/><category term="Laravel 5.8"/><category term="Opera browser"/><category term="PHP"/><category term="Pick-a-Meal"/><category term="ST3"/><category term="Sublime Text"/><category term="SublimeText"/><category term="VSC"/><category term="Vvisual Studio Code"/><category term="app development"/><category term="authors"/><category term="blogger"/><category term="book categorization"/><category term="book classification"/><category term="book length"/><category term="books"/><category term="books on shelf"/><category term="calculator"/><category term="character conversion"/><category term="chrome extension"/><category term="coding counter"/><category term="coding dark humor"/><category term="coding interviews"/><category term="convert characters"/><category term="dark humor"/><category term="different way of thinking"/><category term="human memory algorithms"/><category term="individual mindsets"/><category term="individual thinking"/><category term="javascript basics"/><category term="javascript fundamentals"/><category term="javascript learn"/><category term="keystrokes"/><category term="math"/><category term="math 120"/><category term="math algebra"/><category term="mobile app development"/><category term="null safety"/><category term="online calculator"/><category term="pet notes"/><category term="pet reference"/><category term="react"/><category term="recommended calculator"/><category term="recommended web app"/><category term="reverse posts"/><category term="shared web app"/><category term="single page app"/><category term="spa"/><category term="sql"/><category term="suggested calculator"/><category term="trie algorithm"/><category term="veterinarian front desk"/><category term="veterinarian notes"/><category term="veterinarian reference"/><category term="veterinarian staff"/><category term="web app"/><category term="web app counter"/><category term="web app timer"/><category term="web apps"/><category term="web development"/><category term="web development interviews"/><category term="word count"/><category term="word count tool"/><category term="words"/><category term="writing"/><category term="x2b"/><title type='text'>Keith D Commiskey</title><subtitle type='html'>Flutter Developer; Former Front End Developer; Former Technical Graphics. This blog details apps and utilities I&#39;ve conceptualized, designed, and developed; complemented with developmental journeys, findings, observations, and challenges.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>120</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6441671.post-5533494425088145959</id><published>2023-08-20T02:24:00.002-07:00</published><updated>2023-08-20T02:24:41.962-07:00</updated><title type='text'>Blog Relocated from Blogspot/Blogger</title><content type='html'>&lt;p&gt;It was a long time coming, as I forever hoped Google would revive Blogger, but it&#39;s time to move it along. The straw was the inability to share a post to LinkedIn. That aside, I&#39;m curious to see if another platform might offer more blog post views. Will see how it goes.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The new blog location is now self-hosted using WordPress.org:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://kdcinfo.com/blog&quot;&gt;https://kdcinfo.com/blog&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Cheers!&lt;/p&gt;&lt;p&gt;- Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/5533494425088145959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2023/08/blog-relocated-from-blogspotblogger.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/5533494425088145959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/5533494425088145959'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2023/08/blog-relocated-from-blogspotblogger.html' title='Blog Relocated from Blogspot/Blogger'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-7641235716203952459</id><published>2023-08-19T15:42:00.001-07:00</published><updated>2023-08-19T15:42:31.622-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="chatgpt"/><title type='text'>ChatGPT gets Expressive with Emojis</title><content type='html'>&lt;p&gt;My first time seeing ChatGPT respond with emojis, and I&#39;m still . . . speechless.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLPrJOLDrOm7x8JDl6W_d0VAEn039Tfp2QCFNhllnM_KMyCDBjPwNxjGUaJbq78Q-gUXvO0AqFcAzLfC78-bHvSWpSc5n3ldnORZx-S9HmK0XKdI3zU4rnGgsPOclb1DTc1mzQ_HyL94PFEu4tZq3A2hsoJdfgXhGj-Uj1I__ivG3QA2wxbCio/s809/Screenshot%202023-08-19%20153656.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;383&quot; data-original-width=&quot;809&quot; height=&quot;189&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLPrJOLDrOm7x8JDl6W_d0VAEn039Tfp2QCFNhllnM_KMyCDBjPwNxjGUaJbq78Q-gUXvO0AqFcAzLfC78-bHvSWpSc5n3ldnORZx-S9HmK0XKdI3zU4rnGgsPOclb1DTc1mzQ_HyL94PFEu4tZq3A2hsoJdfgXhGj-Uj1I__ivG3QA2wxbCio/w400-h189/Screenshot%202023-08-19%20153656.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;- Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/7641235716203952459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2023/08/chatgpt-gets-expressive-with-emojis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/7641235716203952459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/7641235716203952459'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2023/08/chatgpt-gets-expressive-with-emojis.html' title='ChatGPT gets Expressive with Emojis'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLPrJOLDrOm7x8JDl6W_d0VAEn039Tfp2QCFNhllnM_KMyCDBjPwNxjGUaJbq78Q-gUXvO0AqFcAzLfC78-bHvSWpSc5n3ldnORZx-S9HmK0XKdI3zU4rnGgsPOclb1DTc1mzQ_HyL94PFEu4tZq3A2hsoJdfgXhGj-Uj1I__ivG3QA2wxbCio/s72-w400-h189-c/Screenshot%202023-08-19%20153656.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-6822846224103606801</id><published>2023-08-19T15:26:00.004-07:00</published><updated>2023-08-19T15:59:23.322-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="chatgpt"/><category scheme="http://www.blogger.com/atom/ns#" term="dart"/><category scheme="http://www.blogger.com/atom/ns#" term="flutter"/><title type='text'>Flutter: The perfect take!</title><content type='html'>&lt;div&gt;&lt;b&gt;Flutter FTW!&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When asked by a non-technical stranger on LinkedIn to explain what Flutter is, being I&#39;m not in sales or marketing, and knowing I&#39;d get too technical, I turned to ChatGPT to help out.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Prompt:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;As succinctly as possible (maybe just a few paragraphs), what advantages does Flutter offer for cross-platform mobile app development, and how might it compare to others such as React Native?&lt;/div&gt;&lt;p&gt;&lt;b&gt;The Perfect Take:&lt;/b&gt;&lt;/p&gt;&lt;div style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQmHuoxfTdoS-Vb9VodC6YvEocBNmo6FwrJ8As525vUjXGhmrKCcOd1nYNfF7L7rpiut1cpZhiWoNuSbyg72usdxshd3k-PDjhUWKD61qv-ZHSd2jIh7JDetY3jnqvPPRKOp_1k8W-mGxlXyh80EcPo0k3UsQMCl88ZtbGG2C6hEW8TOM1sQ6h/s787/chatgpt4_flutter_overview.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;456&quot; data-original-width=&quot;787&quot; height=&quot;185&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQmHuoxfTdoS-Vb9VodC6YvEocBNmo6FwrJ8As525vUjXGhmrKCcOd1nYNfF7L7rpiut1cpZhiWoNuSbyg72usdxshd3k-PDjhUWKD61qv-ZHSd2jIh7JDetY3jnqvPPRKOp_1k8W-mGxlXyh80EcPo0k3UsQMCl88ZtbGG2C6hEW8TOM1sQ6h/s320/chatgpt4_flutter_overview.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Flutter stands out as a leading choice for cross-platform mobile app development due to its ability to produce natively compiled applications for both mobile and web from a single codebase.&lt;/div&gt;&lt;div style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcff01;&quot;&gt;This &lt;b&gt;reduces development time&lt;/b&gt;, &lt;b&gt;improves maintainability&lt;/b&gt;, and provides &lt;b&gt;consistency across platforms&lt;/b&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using Dart, Flutter compiles directly into native code, without the need for a bridge, allowing for more efficient communication with the platform and superior performance. Its widget-based architecture enables the creation of complex and responsive UIs that closely mimic native interfaces. These features, combined with hot-reloading, enable a smoother development process.&lt;br /&gt;&lt;br /&gt;When compared to other cross-platform solutions like React Native, Flutter offers faster performance, a more consistent user experience across platforms, and an arguably better toolset for UI creation. Despite the wider adoption of JavaScript in React Native, the benefits of Dart in Flutter and its direct compilation into native code can often provide an edge, especially for projects where performance and UI expressiveness are paramount.&lt;br /&gt;&lt;/div&gt;&lt;p&gt;- ChatGPT4&lt;br /&gt;&lt;/p&gt;&lt;div&gt;P.S. And all that was without even knowing about all Flutter and Dart 3&#39;s new features!! (Its knowledge cut-off was Flutter 2.5.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/6822846224103606801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2023/08/flutter-perfect-take.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/6822846224103606801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/6822846224103606801'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2023/08/flutter-perfect-take.html' title='Flutter: The perfect take!'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQmHuoxfTdoS-Vb9VodC6YvEocBNmo6FwrJ8As525vUjXGhmrKCcOd1nYNfF7L7rpiut1cpZhiWoNuSbyg72usdxshd3k-PDjhUWKD61qv-ZHSd2jIh7JDetY3jnqvPPRKOp_1k8W-mGxlXyh80EcPo0k3UsQMCl88ZtbGG2C6hEW8TOM1sQ6h/s72-c/chatgpt4_flutter_overview.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-2225746756831923470</id><published>2023-06-21T01:17:00.005-07:00</published><updated>2023-06-21T02:03:33.960-07:00</updated><title type='text'>A Tour of some of Dart 3&#39;s Impactful New Features</title><content type='html'>I created a public Gist of my experience touring&amp;nbsp;Dart 3&#39;s new features via &lt;a href=&quot;https://codelabs.developers.google.com/codelabs/dart-patterns-records&quot; target=&quot;_blank&quot;&gt;their Dart Codelab&lt;/a&gt;.&lt;br /&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://gist.github.com/KDCinfo/fb23ff106a30512154984e22ba87dcb8&quot; target=&quot;_blank&quot;&gt;Gist files from Dart&#39;s codelab&lt;/a&gt;: Dive into Dart 3&#39;s new OO language enhancements including &lt;b&gt;patterns&lt;/b&gt;, &lt;b&gt;records&lt;/b&gt;, &lt;b&gt;enhanced switch and case&lt;/b&gt;, and &lt;b&gt;sealed classes&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px;&quot;&gt;&lt;div&gt;&lt;b&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;b&gt;&lt;i&gt;It was intriguing and educational!! &lt;/i&gt;💡&lt;/b&gt;&lt;/div&gt;&lt;/b&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;A couple of the features I recall learning or using from either previous JavaScript enhancements,&amp;nbsp;&lt;br /&gt;or definitely from when I worked with React (e.g. destructuring &#39;records&#39;).&amp;nbsp;Still others were quite new, with one or two that definitely took some time to sink in (e.g. object-destructuring a &lt;span style=&quot;font-family: courier;&quot;&gt;Duration&lt;/span&gt; object with guards).&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;When learning of Dart 3 &lt;b&gt;&lt;i&gt;records&lt;/i&gt;&lt;/b&gt;&amp;nbsp;— which help to pass type-safe maps (of a sort) without the need to create a class for them — I couldn&#39;t help but think of a Flutter Bloc analogy, &quot;&lt;b&gt;cubits for classes&lt;/b&gt;&quot;.&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU7V1k5oHvUzuOTx0J9pCaTYelBUnFl85xGnL6uV38ChZ3mbqHIDqUBQ0Rq0Zbn67_qTJvdZKXlxbwTK7St5tiu_8s23cE_L-hjmp9Njc15hRXBOj3y3XPJ5ykop2v4dNsl3FWQvq529ywJny0M6U78o6pYm9DxVzyjpp20gJcnTnKYltP69G3/s515/Screenshot%202023-06-21%20004449.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;515&quot; data-original-width=&quot;413&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU7V1k5oHvUzuOTx0J9pCaTYelBUnFl85xGnL6uV38ChZ3mbqHIDqUBQ0Rq0Zbn67_qTJvdZKXlxbwTK7St5tiu_8s23cE_L-hjmp9Njc15hRXBOj3y3XPJ5ykop2v4dNsl3FWQvq529ywJny0M6U78o6pYm9DxVzyjpp20gJcnTnKYltP69G3/w257-h320/Screenshot%202023-06-21%20004449.png&quot; width=&quot;257&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;All-in-all &lt;b&gt;it was a fun and eye-opening experience&lt;/b&gt;, and I highly recommend taking the time to go through it. &lt;span style=&quot;background-color: #fcff01;&quot;&gt;Many of the features will likely prove confusing should you begin happening across them in the wild.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The following course overview and links are also provided in the &lt;a href=&quot;https://gist.github.com/KDCinfo/fb23ff106a30512154984e22ba87dcb8&quot; target=&quot;_blank&quot;&gt;[main.dart] gist file&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Codelab: &lt;a href=&quot;https://codelabs.developers.google.com/codelabs/dart-patterns-records&quot;&gt;https://codelabs.developers.google.com/codelabs/dart-patterns-records&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;blockquote style=&quot;border: none; margin: 0 0 0 40px; padding: 0px;&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;flutter create --empty patterns_codelab&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&quot;In this course you will experiment with patterns, records, enhanced switch and case, and sealed classes. You will cover a lot of information --- yet only barely scratch the surface of these features.&quot;&lt;/li&gt;&lt;li&gt;&quot;Dart 3 introduces patterns to the language, a major new category of grammar.&amp;nbsp;Beyond this new way to write Dart code, there are several other language enhancements, including:&quot;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Records &lt;/b&gt;for bundling data of different types,&lt;/li&gt;&lt;li&gt;&lt;b&gt;class modifiers&lt;/b&gt; for controlling access, and&lt;/li&gt;&lt;li&gt;&lt;b&gt;new switch expressions&lt;/b&gt; and &lt;b&gt;if-case statements&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;For more information on patterns, see the &lt;a href=&quot;https://github.com/dart-lang/language/blob/master/accepted/future-releases/0546-patterns/feature-specification.md&quot; target=&quot;_blank&quot;&gt;feature specification&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;For even more specific information, see the individual feature specifications:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/dart-lang/language/blob/master/accepted/future-releases/records/records-feature-specification.md&quot; target=&quot;_blank&quot;&gt;Records&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/dart-lang/language/blob/master/accepted/future-releases/0546-patterns/feature-specification.md&quot; target=&quot;_blank&quot;&gt;Patterns&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/dart-lang/language/blob/master/accepted/future-releases/0546-patterns/exhaustiveness.md&quot; target=&quot;_blank&quot;&gt;Exhaustiveness checking&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/dart-lang/language/blob/master/accepted/future-releases/sealed-types/feature-specification.md&quot; target=&quot;_blank&quot;&gt;Sealed classes&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/2225746756831923470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2023/06/a-tour-of-some-of-dart-3s-impactful-new.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/2225746756831923470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/2225746756831923470'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2023/06/a-tour-of-some-of-dart-3s-impactful-new.html' title='A Tour of some of Dart 3&#39;s Impactful New Features'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU7V1k5oHvUzuOTx0J9pCaTYelBUnFl85xGnL6uV38ChZ3mbqHIDqUBQ0Rq0Zbn67_qTJvdZKXlxbwTK7St5tiu_8s23cE_L-hjmp9Njc15hRXBOj3y3XPJ5ykop2v4dNsl3FWQvq529ywJny0M6U78o6pYm9DxVzyjpp20gJcnTnKYltP69G3/s72-w257-h320-c/Screenshot%202023-06-21%20004449.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-7884816216268694503</id><published>2023-06-20T01:33:00.001-07:00</published><updated>2023-06-21T01:39:12.212-07:00</updated><title type='text'>Dart and OO: Design Patterns, Refactoring, and Code Smells</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://refactoring.guru/cert/r/MTM5NzE4&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;635&quot; data-original-width=&quot;897&quot; height=&quot;142&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgg0qTY_wrslrFTSYial_rpHByjS5qUcI4jO0UD98oe755nWzkkZPczWGDS69xIQ4i8v2p0JBHcKtk9-mJ6snO8GZTEu2QNzFYHqjadzqptLrLx-k01Ebwf98pCkW3q56u8GVawTq8rJjuTwOVIUHYai6wUNVO-ysmbORlKjrDm9-m1l15035f4=w200-h142&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;I would like to thank &lt;a href=&quot;https://refactoring.guru&quot;&gt;Refactoring.guru&lt;/a&gt; for their insightful course on, well, &lt;b&gt;refactoring&lt;/b&gt;&amp;nbsp;(and code smells) at an Object-Oriented (OO) level.&amp;nbsp;The course helped to set me on the right track for being more cognizant of my coding practices in Flutter and Dart. While some refactoring concepts might appear self-explanatory, the dissection of the refactoring processes in the course was quite detailed and thorough.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;Halfway through the course, I sought out additional resources and was ecstatic to discover a few talks by &lt;b&gt;Sandi Metz&lt;/b&gt;. Her complementary presentations addressed such like-minded subjects as code smells (which, to confirm, are &lt;i&gt;not necessarily a &#39;bad&#39; thing&lt;/i&gt;), and Object-Oriented Programming (OOP) specifically. Sandi&#39;s insights resonated greatly, and have really helped certain OO topics make a &lt;b&gt;lot&lt;/b&gt; of sense.&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=8bZh5LMaSmE&amp;amp;ab_channel=Confreaks&quot; target=&quot;_blank&quot;&gt;RailsConf 2014 - All the Little Things by Sandi Metz&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&quot;&lt;b&gt;Make Smaller Things&lt;/b&gt;&quot; - Sandi Metz [00:54]&lt;/li&gt;&lt;li&gt;&quot;&lt;b&gt;Inheritance is fine when the hierarchy is kept shallow and narrow&lt;/b&gt;, where subclasses are at the leaf nodes that use all the behavior in the superclass.&quot; [29:36]&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PJjHfa5yxlU&amp;amp;ab_channel=Confreaks&quot; target=&quot;_blank&quot;&gt;RailsConf 2016 - Get a Whiff of This by Sandi Metz&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&quot;A Code Smell doesn&#39;t mean I don&#39;t like your code, and I can&#39;t tell you why.&quot; [2:45]&lt;/li&gt;&lt;li&gt;&quot;The &lt;b&gt;definition of a code smell is that it might indicate a problem&lt;/b&gt;.&quot; [3:33]&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=YtROlyWWhV0&amp;amp;ab_channel=ExploreDDD&quot; target=&quot;_blank&quot;&gt;Sandi Metz - Talk Session: Polly Want a Message&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&quot;&lt;b&gt;Factories are where conditionals go to die.&lt;/b&gt;&quot; [29:55]&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;And for the icing on the proverbial cake, after watching Sandi&#39;s talks, I discovered another video by none other than &lt;a href=&quot;https://www.youtube.com/@Flutterly&quot; target=&quot;_blank&quot;&gt;Flutterly&lt;/a&gt;, that then &lt;i&gt;brought it all home&lt;/i&gt; by explaining the underpinnings between &lt;b&gt;abstraction&lt;/b&gt;, &lt;b&gt;inheritance&lt;/b&gt;, &lt;b&gt;and&lt;/b&gt; Dart&#39;s own &lt;b&gt;mixin classes&lt;/b&gt;. Having previously benefited from Flutterly&#39;s training videos on &lt;a href=&quot;https://www.youtube.com/watch?v=THCkkQ-V1-8&amp;amp;t=6117s&quot; target=&quot;_blank&quot;&gt;Flutter Bloc and the Repository Pattern&lt;/a&gt;, I found his insights on how these three types of classes operate to be equally enlightening and memorable.&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=OThpFGSzV1g&amp;amp;ab_channel=Flutterly&quot; target=&quot;_blank&quot;&gt;Dart Classes Explained II - Inheritance(extends) vs. Abstraction(implements) vs. Mixins(with)&lt;/a&gt; - Flutterly (letsgetwckd)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;- Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/7884816216268694503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2023/06/dart-and-oo-design-patterns-refactoring.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/7884816216268694503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/7884816216268694503'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2023/06/dart-and-oo-design-patterns-refactoring.html' title='Dart and OO: Design Patterns, Refactoring, and Code Smells'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgg0qTY_wrslrFTSYial_rpHByjS5qUcI4jO0UD98oe755nWzkkZPczWGDS69xIQ4i8v2p0JBHcKtk9-mJ6snO8GZTEu2QNzFYHqjadzqptLrLx-k01Ebwf98pCkW3q56u8GVawTq8rJjuTwOVIUHYai6wUNVO-ysmbORlKjrDm9-m1l15035f4=s72-w200-h142-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-2279232000667323695</id><published>2023-06-02T13:11:00.000-07:00</published><updated>2023-06-02T13:11:01.314-07:00</updated><title type='text'>TIL — `.nonNulls`</title><content type='html'>&lt;h1 style=&quot;text-align: left;&quot;&gt;From the source code:&amp;nbsp;&lt;/h1&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;\flutter\bin\cache\dart-sdk\lib\collection\&lt;b&gt;iterable.dart&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;/// &lt;b&gt;Operations on iterables with nullable elements.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;@Since(&quot;3.0&quot;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&lt;b&gt;extension&lt;/b&gt; NullableIterableExtensions&amp;lt;T extends Object&amp;gt; &lt;b&gt;on Iterable&lt;/b&gt;&amp;lt;T?&amp;gt; {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: small;&quot;&gt;&amp;nbsp; /// [Returns] The same elements as this iterable,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; /// except that&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;`null` values&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: courier; font-size: small;&quot;&gt;are omitted.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; Iterable&amp;lt;T&amp;gt; get &lt;b style=&quot;background-color: #fcff01;&quot;&gt;nonNulls&lt;/b&gt; =&amp;gt; NonNullsIterable&amp;lt;T&amp;gt;(this);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;dart:collection&lt;/h2&gt;&lt;p&gt;Source — changelog:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/dart-lang/sdk/blob/5d30f18892f1f825943a74e81ab02f27c2c6c26f/CHANGELOG.md#dartcollection&quot;&gt;https://github.com/dart-lang/sdk/blob/5d30f18892f1f825943a74e81ab02f27c2c6c26f/CHANGELOG.md#dartcollection&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Added&amp;nbsp;extension members:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b style=&quot;background-color: #fcff01;&quot;&gt;nonNulls&lt;/b&gt;&lt;/li&gt;&lt;li&gt;firstOrNull&lt;/li&gt;&lt;li&gt;lastOrNull&lt;/li&gt;&lt;li&gt;singleOrNull&lt;/li&gt;&lt;li&gt;elementAtOrNull&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Obtained by way of:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/FlutterDev/comments/1387579/comment/jixogo4/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button&quot;&gt;https://www.reddit.com/r/FlutterDev/comments/1387579/comment/jixogo4/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;p&gt;&lt;i&gt;&lt;b&gt;The pieces I’m most excited about:&lt;/b&gt;&lt;/i&gt; |&amp;nbsp;Vennom, u/Vennom&lt;/p&gt;&lt;/blockquote&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Sealed classes&lt;/b&gt; (so good for relaying state, especially in MVVM/MVI)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Records&lt;/b&gt; (tuples)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Class modifiers&lt;/b&gt; (lock your sub-classing down / support for proper interfaces!!)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Pattern matching&lt;/b&gt; (Destructing)&lt;/li&gt;&lt;li&gt;Added &lt;b&gt;extension members on lists&lt;/b&gt;: &lt;b style=&quot;background-color: #fcff01;&quot;&gt;nonNulls&lt;/b&gt;, firstOrNull, lastOrNull, singleOrNull, elementAtOrNull and indexed on Iterables.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Obtained by way of:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;&lt;i&gt;Dart 3.0: Best New Features &amp;amp; Why You Should Care&lt;/i&gt;&lt;/b&gt; | Kyle Venn&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://medium.com/@kvenn/dart-3-0-best-new-features-why-you-should-care-429e739f2690#a102&quot;&gt;https://medium.com/@kvenn/dart-3-0-best-new-features-why-you-should-care-429e739f2690#a102&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Obtained by way of:&lt;/p&gt;&lt;p&gt;All of the references above were due to research stemming from my initial spotting of the `nonNulls` helper method available in the intelliSense dropdown from within a DartPad inside the &lt;a href=&quot;https://dart.dev/codelabs/dart-cheatsheet#optional-positional-parameters&quot; target=&quot;_blank&quot;&gt;Dart cheatsheet codelab&lt;/a&gt;, where I ended up with the following solution — thanks to that intelliSense suggestion:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://dart.dev/codelabs/dart-cheatsheet#optional-positional-parameters&quot;&gt;https://dart.dev/codelabs/dart-cheatsheet#optional-positional-parameters&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;String joinWithCommas(int a, [int? b, int? c, int? d, int? e]) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // Add all params to List.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // Remove nulls.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // Join List with comma.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; return &amp;lt;int?&amp;gt;[a, b, c, d, e]&lt;b style=&quot;background-color: #fcff01;&quot;&gt;.nonNulls&lt;/b&gt;.join(&#39;,&#39;);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/2279232000667323695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2023/06/til-nonnulls.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/2279232000667323695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/2279232000667323695'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2023/06/til-nonnulls.html' title='TIL — `.nonNulls`'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-9212269264204995301</id><published>2021-09-16T01:23:00.002-07:00</published><updated>2021-09-18T22:30:59.747-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dart"/><category scheme="http://www.blogger.com/atom/ns#" term="flutter"/><category scheme="http://www.blogger.com/atom/ns#" term="null safety"/><title type='text'>Migrating to Dart&#39;s Null Safety</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-HDmUxtUUNvM/YUKcue2vA8I/AAAAAAAAeKc/-rs7Wm6paiU5bxgdF5NkQwPhaIFlef3EwCLcBGAsYHQ/s742/blog_for_null_safety.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;742&quot; height=&quot;194&quot; src=&quot;https://1.bp.blogspot.com/-HDmUxtUUNvM/YUKcue2vA8I/AAAAAAAAeKc/-rs7Wm6paiU5bxgdF5NkQwPhaIFlef3EwCLcBGAsYHQ/w200-h194/blog_for_null_safety.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Prior to starting on my 4th Flutter mobile app, and because it seems that every plugin now supports it, I decided to give &lt;b&gt;migrating to Dart&#39;s null safety&lt;/b&gt; a go.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;i&gt;&lt;a href=&quot;https://dart.dev/null-safety#enable-null-safety&quot; target=&quot;_blank&quot;&gt;Sound null safety is available&lt;/a&gt; in Dart 2.12 and Flutter 2.&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In reading through the migration documentation, it appears the migration tool may pose as much time and effort as migrating by hand. And being I&#39;m in this to learn the code, &lt;b&gt;migrating by hand&lt;/b&gt; is the path I&#39;ve opted for. I&#39;m currently on Step 2.4 of the &lt;a href=&quot;https://dart.dev/null-safety/migration-guide#migrating-by-hand&quot; target=&quot;_blank&quot;&gt;Migration Guide&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-56YzHxkgYHI/YUJ-UG2HWII/AAAAAAAAeKE/h2-PM6Mb1XoaXypiwn08rqjHsIz-r7NzACLcBGAsYHQ/image.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-LBqFzJ9SD2I/YUKfx6HRzqI/AAAAAAAAeKk/u9xnGbmUMCwY9_01FqVH2_ElxC68W7ogACLcBGAsYHQ/image.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;23&quot; data-original-width=&quot;880&quot; height=&quot;16&quot; src=&quot;https://lh3.googleusercontent.com/-LBqFzJ9SD2I/YUKfx6HRzqI/AAAAAAAAeKk/u9xnGbmUMCwY9_01FqVH2_ElxC68W7ogACLcBGAsYHQ/w640-h16/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Because each of my reminder apps is setup with a similar code base, I also decided to migrate all three apps at the same time. Thus far I&#39;ve got one app down to 500 critical errors, while the other two are down to 396 and 393.&lt;/p&gt;&lt;table align=&quot;center&quot; style=&quot;clear: both; text-align: center; width: 300px;&quot;&gt;
  &lt;tbody&gt;&lt;tr&gt;&lt;th style=&quot;font-weight: normal; text-align: left;&quot;&gt;&lt;a href=&quot;https://kdrecall.com&quot; target=&quot;_blank&quot;&gt;Mobile Apps&lt;/a&gt;&lt;/th&gt;&lt;th&gt;Critical&lt;/th&gt;&lt;th style=&quot;font-weight: normal;&quot;&gt;Warn&lt;/th&gt;&lt;th style=&quot;font-weight: normal;&quot;&gt;Info&lt;/th&gt;&lt;/tr&gt;
	&lt;tr&gt;&lt;td style=&quot;text-align: left;&quot;&gt;B4-I-Go&lt;/td&gt;&lt;td&gt;500&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;/tr&gt;
	&lt;tr&gt;&lt;td style=&quot;text-align: left;&quot;&gt;Hungry-on_Hand&lt;/td&gt;&lt;td&gt;396&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;56&lt;/td&gt;&lt;/tr&gt;
	&lt;tr&gt;&lt;td style=&quot;text-align: left;&quot;&gt;Xpired To Be&lt;/td&gt;&lt;td&gt;393&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Having started at over 600 critical errors on the &lt;a href=&quot;https://kdrecall.com&quot; target=&quot;_blank&quot;&gt;B4-I-Go app&lt;/a&gt;, the migration thus far has been tedious, but informative and enlightening—to both Dart, and my app&#39;s own code.&lt;/p&gt;&lt;p&gt;I&#39;m sure a pattern of migrating will emerge, but currently the most time-consuming aspect comes in having to analyze the &lt;i&gt;context&lt;/i&gt; of each error to determine if a variable&amp;nbsp;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;can&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; be null, or if it &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;will never&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&amp;nbsp;be null. It seems a small distinction between the two when &lt;a href=&quot;https://dart.dev/guides/language/language-tour#important-concepts&quot; target=&quot;_blank&quot;&gt;reading about them&lt;/a&gt;, but &lt;i&gt;in context&lt;/i&gt;, the decision seems quite important for each case.&lt;/p&gt;

&lt;table align=&quot;center&quot; style=&quot;width: 90%;&quot;&gt;
	&lt;tbody&gt;&lt;tr&gt;
		&lt;td rowspan=&quot;2&quot; style=&quot;text-align: center; width: 40px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: x-large;&quot;&gt;?&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
		&lt;td rowspan=&quot;2&quot; style=&quot;text-align: center; width: 20px;&quot;&gt;|=&amp;gt;&lt;/td&gt;
		&lt;td&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;
			Indicates an object member&#39;s leftmost operand can be null; &lt;a href=&quot;https://dart.dev/guides/language/language-tour#other-operators&quot; target=&quot;_blank&quot;&gt;example&lt;/a&gt;: &lt;span style=&quot;font-family: courier;&quot;&gt;foo?.bar&lt;/span&gt; selects property &lt;span style=&quot;font-family: courier;&quot;&gt;bar&lt;/span&gt; from expression &lt;span style=&quot;font-family: courier;&quot;&gt;foo&lt;/span&gt; unless &lt;span style=&quot;font-family: courier;&quot;&gt;foo&lt;/span&gt; is &lt;span style=&quot;font-family: courier;&quot;&gt;null&lt;/span&gt; (in which case the value of &lt;span style=&quot;font-family: courier;&quot;&gt;foo?.bar&lt;/span&gt; is &lt;span style=&quot;font-family: courier;&quot;&gt;null&lt;/span&gt;).
          &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;
	&lt;/tr&gt;&lt;tr&gt;
		&lt;td&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;
			You can make a variable nullable by putting a question mark (&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;b&gt;?&lt;/b&gt;&lt;/span&gt;) at the end of its type.
			For example, a variable of type &lt;span style=&quot;font-family: courier;&quot;&gt;int?&lt;/span&gt; might be an &lt;span style=&quot;font-family: courier;&quot;&gt;integer&lt;/span&gt;, or it might be &lt;span style=&quot;font-family: courier;&quot;&gt;null&lt;/span&gt;.
		&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td rowspan=&quot;3&quot; style=&quot;margin-top: 10px; text-align: center; width: 40px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: x-large;&quot;&gt;!&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
		&lt;td rowspan=&quot;3&quot; style=&quot;text-align: center; width: 20px;&quot;&gt;|=&amp;gt;&lt;/td&gt;
		&lt;td style=&quot;padding-top: 15px;&quot;&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;If you know that an expression never evaluates to null but Dart disagrees.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;
	&lt;/tr&gt;&lt;tr&gt;
		&lt;td&gt;&lt;ul style=&quot;list-style: none; margin: 0px;&quot;&gt;&lt;li&gt;&lt;code&gt;
			Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; _dataMap = {};&lt;br /&gt;
			_dataMap.putIfAbsent(&#39;message&#39;, () =&amp;gt; []);&lt;br /&gt;
			_dataMap[&#39;message&#39;]!.add(&#39;Welcome!&#39;);
		&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;
	&lt;/tr&gt;&lt;tr&gt;
		&lt;td&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;
			// ^^^ &#39;&lt;b&gt;!&lt;/b&gt;&#39; means we know the message key will never be null because we added it on the line above.
		&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;
	&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;The other two prominent null safe keywords are &lt;span style=&quot;font-family: courier;&quot;&gt;required&lt;/span&gt; and &lt;span style=&quot;font-family: courier;&quot;&gt;late&lt;/span&gt;. While &lt;span style=&quot;font-family: courier;&quot;&gt;required&lt;/span&gt; was introduced before I began learning Flutter via the &lt;span style=&quot;font-family: courier;&quot;&gt;@required&lt;/span&gt; annotation, which is easily remedied by removing the `@`, I&#39;ve come across ample variables that have made good of the &lt;a href=&quot;https://dart.dev/guides/language/language-tour#late-variables&quot; target=&quot;_blank&quot;&gt;new &lt;b&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;late&lt;/span&gt;&lt;/b&gt; modifier&lt;/a&gt;, which simply indicates the variable &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;will be&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; initialized later.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-style: normal;&quot;&gt;⚠&lt;/span&gt; &lt;span style=&quot;font-size: medium;&quot;&gt;If you fail to initialize a &lt;span style=&quot;font-family: courier;&quot;&gt;late&lt;/span&gt; variable, a runtime error occurs when the variable is used.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Fortunately, should errors prevail when the migration is complete, I should also get a good look at &lt;a href=&quot;https://flutter.dev/docs/development/tools/sdk/release-notes/release-notes-2.5.0&quot; target=&quot;_blank&quot;&gt;Flutter&#39;s new debugging updates&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Happy migrating!&lt;/p&gt;&lt;p&gt;- Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;hr /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Converting nullable dynamic Lists inside Maps&lt;/h2&gt;&lt;div&gt;As a last-minute add, below is a null-safe approach used to convert a &lt;span style=&quot;font-family: courier;&quot;&gt;dynamic&lt;/span&gt; List inside a Map, such as when using &lt;span style=&quot;font-family: courier;&quot;&gt;json.decode&lt;/span&gt;, into a List of &lt;span style=&quot;font-family: courier;&quot;&gt;String&lt;/span&gt;s.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If anyone knows if anything is incorrect or can be done better, please comment. Always looking to learn proper methodologies and better approaches.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Two scenarios:&lt;/b&gt; A key exists in a Map, or it doesn&#39;t (is null).&lt;/div&gt;&lt;/div&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px;&quot;&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier; font-size: medium;&quot;&gt;Map&amp;lt;String, &lt;b&gt;List&amp;lt;dynamic&amp;gt;&lt;/b&gt;&amp;gt; _statusObj = {&#39;message&#39;: [&#39;Hello!&#39;]};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px;&quot;&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier; font-size: medium;&quot;&gt;Map&amp;lt;String, &lt;b&gt;List&amp;lt;dynamic&amp;gt;&lt;/b&gt;&amp;gt; _statusObj = {};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;A null-safe solution:&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px;&quot;&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier; font-size: medium;&quot;&gt;&lt;b&gt;List&amp;lt;String&amp;gt;&lt;/b&gt; _alertMsgs = &lt;b&gt;List&amp;lt;String&amp;gt;.from(&lt;/b&gt;_statusObj[&quot;message&quot;]&lt;b&gt;?&lt;/b&gt;.toList() &lt;b&gt;??&lt;/b&gt; &amp;lt;String&amp;gt;[]&lt;b&gt;)&lt;/b&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Reference notes with comments&lt;/b&gt; and some approaches that didn&#39;t work:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Gist: &lt;a href=&quot;https://gist.github.com/KDCinfo/f329655032b7b189dfdd9e82e97010e3&quot;&gt;https://gist.github.com/KDCinfo/f329655032b7b189dfdd9e82e97010e3&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;DartPad (runs the ^^^ Gist): &lt;a href=&quot;https://dartpad.dev/f329655032b7b189dfdd9e82e97010e3&quot;&gt;https://dartpad.dev/f329655032b7b189dfdd9e82e97010e3&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/9212269264204995301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2021/09/migrating-to-darts-null-safety.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/9212269264204995301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/9212269264204995301'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2021/09/migrating-to-darts-null-safety.html' title='Migrating to Dart&#39;s Null Safety'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-HDmUxtUUNvM/YUKcue2vA8I/AAAAAAAAeKc/-rs7Wm6paiU5bxgdF5NkQwPhaIFlef3EwCLcBGAsYHQ/s72-w200-h194-c/blog_for_null_safety.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-7171163839666993949</id><published>2021-09-13T01:30:00.002-07:00</published><updated>2021-09-13T01:55:52.654-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="flutter"/><title type='text'>The Appreciation of a Framework</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;. . . that inspires productivity.&lt;/h2&gt;&lt;blockquote&gt;The tl;dr is that, thanks to &lt;a href=&quot;https://flutter.dev/&quot; target=&quot;_blank&quot;&gt;Flutter&lt;/a&gt;, my third app is now live in both &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.kdcinfo.kdrecall_x2b&quot; target=&quot;_blank&quot;&gt;Google&#39;s Play Store&lt;/a&gt; (for Android) and &lt;a href=&quot;https://apps.apple.com/us/app/kd-recall-xpired-to-be/id1585280787&quot; target=&quot;_blank&quot;&gt;Apple&#39;s App Store&lt;/a&gt; (for iPhones and iPads).&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The appreciation comes in the form of the &lt;a href=&quot;https://flutter.dev/docs/whats-new&quot; target=&quot;_blank&quot;&gt;Flutter framework&lt;/a&gt; providing a solid base from which to learn mobile app development, without getting lost in the intricate details of every minute facet of the mobile app engine underpinnings. This allows you to learn as you go, and to still be productive as you continue learning more, and more (and more).&lt;/p&gt;&lt;p&gt;I also &lt;a href=&quot;https://kdcinfo.blogspot.com/2016/11/keep-track.html&quot;&gt;enjoyed working with the Laravel framework&lt;/a&gt; (circa 2017). Once familiar with a framework, and in learning some of its nuances, app development time becomes more and more about the app than the tool. I&#39;ve been enjoying seeing that transition with Flutter, and it&#39;s inspiring.&lt;/p&gt;&lt;p&gt;Also thanks to the Flutter framework, and in setting up a &lt;a href=&quot;https://kdcinfo.blogspot.com/2021/07/hello-suite.html&quot;&gt;shared theme and coding structure&lt;/a&gt;, this third app&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;b&gt;only took five weeks to complete!&lt;/b&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;And—that development time was shared with learning how to implement new features such as push and local notifications, and for some devices (primarily iOS), how to give the app&#39;s icon a &quot;badge&quot; indicating the app has an update waiting.&lt;/p&gt;&lt;p&gt;So, a big thank you to the &lt;a href=&quot;https://flutter.dev/community&quot; target=&quot;_blank&quot;&gt;Flutter team&lt;/a&gt; —&amp;nbsp;and to &lt;a href=&quot;https://www.udemy.com/course/learn-flutter-dart-to-build-ios-android-apps/&quot; target=&quot;_blank&quot;&gt;Academind&lt;/a&gt; for getting us developers started off in the right direction early on.&lt;/p&gt;&lt;p&gt;- Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Further Reading: Mobile App Details&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-ara1s3tZ4Js/YT7sRZQvmkI/AAAAAAAAeJw/-QehVYxcgQwBmWV2pXUDUbjIwQwolwyhACLcBGAsYHQ/s2048/05.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img alt=&quot;This image is of the primary mobile app interface for &amp;quot;Xpired To Be&amp;quot;.&quot; border=&quot;0&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;1152&quot; height=&quot;320&quot; src=&quot;https://1.bp.blogspot.com/-ara1s3tZ4Js/YT7sRZQvmkI/AAAAAAAAeJw/-QehVYxcgQwBmWV2pXUDUbjIwQwolwyhACLcBGAsYHQ/w180-h320/05.png&quot; title=&quot;The primary mobile app interface for the &amp;quot;Xpired To Be&amp;quot; reminder app.&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Titled &quot;Xpired To Be&quot;, this app is the third in a collection of free &#39;simple reminder apps&#39; collectively named &lt;i&gt;KD-reCall&lt;/i&gt;, and is paralleled with my &lt;a href=&quot;https://chrome.google.com/webstore/detail/expired-to-be/kamjiblbgmiobifooelpmlkojmadmcan&quot; target=&quot;_blank&quot;&gt;open-sourced Chrome browser extension&lt;/a&gt;*.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;&lt;b&gt;*Note&lt;/b&gt;: Due to the Chrome extension operating solely in the browser, the mobile app and Chrome extension are not linked, and do not share data.&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The Xpired To Be app aims to remind you to replenish items that will expire soon, such as medicine, first aid items, or pantry items.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Do you know when your butter expires?&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;gt; Expiration item examples:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;First aid ointment&lt;/li&gt;&lt;li&gt;Cough drops&lt;/li&gt;&lt;li&gt;Vitamins&lt;/li&gt;&lt;li&gt;BBQ sauce&lt;/li&gt;&lt;li&gt;Honey&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;clear: both; text-align: left;&quot;&gt;KD-reCall Details&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-Xw0CUq7UYVM/YT7km5-fHOI/AAAAAAAAeJo/8U4sTEDjdkwCmzjLOAj7ohE6rY91VQg0QCLcBGAsYHQ/s1024/kdrecall_1024_500_x2b.png&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img alt=&quot;This banner represents &amp;quot;Xpired To Be&amp;quot;, the third in a collection of free &#39;simple reminder apps&#39; collectively named KD-reCall.&quot; border=&quot;0&quot; data-original-height=&quot;500&quot; data-original-width=&quot;1024&quot; height=&quot;156&quot; src=&quot;https://1.bp.blogspot.com/-Xw0CUq7UYVM/YT7km5-fHOI/AAAAAAAAeJo/8U4sTEDjdkwCmzjLOAj7ohE6rY91VQg0QCLcBGAsYHQ/w320-h156/kdrecall_1024_500_x2b.png&quot; title=&quot;&amp;quot;Xpired To Be&amp;quot; is the third in a collection of free &#39;simple reminder apps&#39; collectively named KD-reCall.&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;An account is required to use any app in the KD-reCall reminder app collection, however, accounts are free, and only one account/email is needed for any KD-reCall reminder app.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://kdrecall.com&quot;&gt;KD-reCall.com&lt;/a&gt; — An alternate interface that allows for web-based user registration and general account settings for all KD-reCall mobile apps.&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Xpired To Be&lt;/b&gt; - Released: Sep 2021&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.kdcinfo.kdrecall_x2b&quot; target=&quot;_blank&quot;&gt;Google Play Store&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://apps.apple.com/us/app/kd-recall-xpired-to-be/id1585280787&quot; target=&quot;_blank&quot;&gt;Apple App Store&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;B4-I-Go&lt;/b&gt; - Released: Aug 2021&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.kdcinfo.kdrecall_b4igo&quot; target=&quot;_blank&quot;&gt;Google Play Store&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://apps.apple.com/us/app/kd-recall-b4-i-go/id1578787893&quot; target=&quot;_blank&quot;&gt;Apple App Store&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Hungry on Hand&lt;/b&gt; (pilot project) - Released: Mar 2021&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.kdcinfo.kdrecall_hungry&quot; target=&quot;_blank&quot;&gt;Google Play Store&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Related Blog Posts&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://kdcinfo.blogspot.com/2021/08/wrote-app-got-mac-wrote-another-app.html&quot; target=&quot;&quot;&gt;Wrote an App; Got a Mac; Wrote another App&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://kdcinfo.blogspot.com/2021/07/architectural-challenges-my-flutter.html&quot;&gt;Architectural Challenges: My Flutter Frankenstein&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://kdcinfo.blogspot.com/2021/07/hello-suite.html&quot;&gt;&quot;Hello Suite&quot;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://kdcinfo.blogspot.com/2021/07/i-got-flutter-full-course.html&quot;&gt;I got a Flutter Full Course Certification—Now what?!&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Research References&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;Plugins:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://pub.dev/packages/flutter_local_notifications&quot; target=&quot;_blank&quot;&gt;Flutter Local Notifications&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/MaikuB/flutter_local_notifications/tree/master/flutter_local_notifications&quot; target=&quot;_blank&quot;&gt;Readme and Setup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://pub.dev/documentation/flutter_local_notifications/latest/flutter_local_notifications/flutter_local_notifications-library.html&quot; target=&quot;_blank&quot;&gt;Library&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/MaikuB/flutter_local_notifications/blob/master/flutter_local_notifications/example/lib/main.dart&quot; target=&quot;_blank&quot;&gt;Practical Examples&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://pub.dev/packages/flutter_app_badger&quot; target=&quot;_blank&quot;&gt;Flutter App Badger&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Two articles I scrutinized and aggregated to learn the fundamentals for implementing Local Notifications.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/local-notifications-in-flutter/&quot; target=&quot;_blank&quot;&gt;How to Set Up Local Notifications in Flutter&lt;/a&gt; - [&lt;a href=&quot;https://github.com/TomerPacific/BirthdayCalendar/blob/main/birthday_calendar/lib/service/notification_service.dart&quot; target=&quot;_blank&quot;&gt;Code&lt;/a&gt;] - Tomer Ben Rachel. &quot;How to Set Up Local Notifications in Flutter.&quot; freeCodeCamp. April 26, 2021.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/implementing-local-notifications-in-flutter/&quot; target=&quot;_blank&quot;&gt;LogRocket: Implementing local notifications in Flutter&lt;/a&gt;&amp;nbsp;- [&lt;a href=&quot;https://github.com/iloveteajay/flutter_local_notification/blob/master/tasker/lib/notification_service.dart&quot; target=&quot;_blank&quot;&gt;Code&lt;/a&gt;] - Nelson Michael. &quot;Implementing local notifications in Flutter.&quot; LogRocket. August 31, 2021.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: verdana;&quot;&gt;#&lt;b&gt;Flutter&lt;/b&gt;&amp;nbsp;—&amp;nbsp;&lt;u&gt;putting the focus back on app development&lt;/u&gt;.&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/7171163839666993949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2021/09/the-appreciation-of-framework.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/7171163839666993949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/7171163839666993949'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2021/09/the-appreciation-of-framework.html' title='The Appreciation of a Framework'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-ara1s3tZ4Js/YT7sRZQvmkI/AAAAAAAAeJw/-QehVYxcgQwBmWV2pXUDUbjIwQwolwyhACLcBGAsYHQ/s72-w180-h320-c/05.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-4736511243637220659</id><published>2021-08-04T03:03:00.002-07:00</published><updated>2021-09-13T01:56:14.784-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="flutter"/><title type='text'>Wrote an App; Got a Mac; Wrote another App</title><content type='html'>&lt;p&gt;Or more specifically, &quot;Wrote an app &lt;i&gt;for Android&lt;/i&gt;; Bought my &lt;i&gt;first&lt;/i&gt; Mac; Wrote another app &lt;i&gt;for iOS and Android&lt;/i&gt;.&quot;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;App development is a time-consuming, minutely detailed process, and there is little time for pause.&lt;/p&gt;&lt;/blockquote&gt;&lt;table align=&quot;center&quot; style=&quot;width: 90%;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); min-width: 65px; padding: 3px 6px; vertical-align: top;&quot;&gt;Mar&amp;nbsp;29&lt;/td&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;&lt;b&gt;First Flutter mobile app&amp;nbsp;approved&lt;/b&gt; for Closed Testing in the Google Play Store.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;Apr&amp;nbsp;22&lt;/td&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;First interview for a Flutter Developer position&amp;nbsp;(knowingly premature—but a part of learning). Walked through an hour-long presentation of my app development. In the end, they asked twice about iOS development, but I&#39;ve never owned a Mac.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;May&amp;nbsp;14&lt;/td&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;&lt;b&gt;My first Mac arrives&lt;/b&gt;—a refurbished 16&quot; MBP direct from Apple.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;Jul&amp;nbsp;30&lt;/td&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;&lt;b&gt;Second reminder app approved&lt;/b&gt; and marked as &quot;Ready for Sale&quot; in the Apple App Store (although it&#39;s free).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;Aug&amp;nbsp;1&lt;/td&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;&lt;b&gt;Second reminder app approved&lt;/b&gt;&amp;nbsp;for Closed Testing in the Google Play Store.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;Aug&amp;nbsp;4&lt;/td&gt;&lt;td style=&quot;border-top: 1px solid rgb(0, 0, 0); padding: 3px 6px; vertical-align: top;&quot;&gt;&lt;b&gt;First app released&lt;/b&gt; to Google Play Store.&amp;nbsp;&lt;br /&gt;&lt;b&gt;Second app released to &lt;u&gt;both app stores&lt;/u&gt;&lt;/b&gt;&amp;nbsp;(store links provided below).&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;border-top: 1px solid rgb(136, 136, 136); clear: both; padding-top: 15px; text-align: center;&quot;&gt;Simple Reminders&lt;/h2&gt;&lt;div style=&quot;display: flex; width: 100%;&quot;&gt;&lt;div style=&quot;flex: 1 1 0%;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-jtqP7lPn78g/YQhg67Q4BVI/AAAAAAAAd-Q/mDb1ul17I2M8D1zxuRRz20qhL94hAo4AACLcBGAsYHQ/s2400/00.jpg&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall: Splash screen&quot; border=&quot;0&quot; data-original-height=&quot;2400&quot; data-original-width=&quot;1080&quot; height=&quot;200&quot; src=&quot;https://1.bp.blogspot.com/-jtqP7lPn78g/YQhg67Q4BVI/AAAAAAAAd-Q/mDb1ul17I2M8D1zxuRRz20qhL94hAo4AACLcBGAsYHQ/w90-h200/00.jpg&quot; title=&quot;KD-reCall: Splash screen&quot; width=&quot;90&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;flex: 2 1 0%;&quot;&gt;&lt;p&gt;As referenced in my &lt;a href=&quot;https://kdcinfo.blogspot.com/2021/07/hello-suite.html&quot;&gt;Hello Suite&lt;/a&gt; and &lt;a href=&quot;https://kdcinfo.blogspot.com/2021/07/architectural-challenges-my-flutter.html&quot;&gt;Architectural Challenges&lt;/a&gt; posts, I began work on what I hope to be a collection of simple reminder apps (free, and ad-free).&amp;nbsp;&lt;/p&gt;&lt;p&gt;As a part of that collection, each reminder app has its own reminder purpose. However, the purpose of the apps themselves was not the point of creating the apps. Although they may well prove useful to someone, the selection of the reminder topics were for simplicity, so time could be spent focused more on the continued learnings of Flutter, and the design of the &lt;a href=&quot;https://kdrecall.com&quot; target=&quot;_blank&quot;&gt;overall &#39;shared app&#39; strategy&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div style=&quot;flex: 1 1 0%;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-ruvh-HVSs3w/YQYyuHPt1fI/AAAAAAAAd9s/fPZaNHM7kYY6X-Ny99lhbqYob4huMWv-gCLcBGAsYHQ/s2608/blog_04_k1.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall: Shell&quot; border=&quot;0&quot; data-original-height=&quot;2608&quot; data-original-width=&quot;1205&quot; height=&quot;200&quot; src=&quot;https://1.bp.blogspot.com/-ruvh-HVSs3w/YQYyuHPt1fI/AAAAAAAAd9s/fPZaNHM7kYY6X-Ny99lhbqYob4huMWv-gCLcBGAsYHQ/w92-h200/blog_04_k1.png&quot; title=&quot;KD-reCall: Shell&quot; width=&quot;92&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 style=&quot;border-top: 1px solid rgb(136, 136, 136); clear: both; padding-top: 15px; text-align: center;&quot;&gt;Pilot App&lt;/h2&gt;&lt;div style=&quot;display: flex; width: 100%;&quot;&gt;&lt;div style=&quot;flex: 1 1 0%;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-6WVZZJrUKS8/YQYytPP-IwI/AAAAAAAAd9g/4N0xYIGknVEnoJP3HcRdFo5pno_5U8hBQCPcBGAYYCw/s2048/blog_04_h1.png&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall: Hungry on Hand login screen&quot; border=&quot;0&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;1152&quot; height=&quot;200&quot; src=&quot;https://1.bp.blogspot.com/-6WVZZJrUKS8/YQYytPP-IwI/AAAAAAAAd9g/4N0xYIGknVEnoJP3HcRdFo5pno_5U8hBQCPcBGAYYCw/w112-h200/blog_04_h1.png&quot; title=&quot;KD-reCall: Hungry on Hand login screen&quot; width=&quot;112&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;flex: 2 1 0%;&quot;&gt;&lt;p&gt;The pilot app for the collection is named&amp;nbsp;&lt;i&gt;Hungry on Hand&lt;/i&gt;. Its primary &#39;reminder purpose&#39; is to help folks keep track of snacks or beverages they have on hand. The simplicity of this app&#39;s purpose served to get me through the architectural hurdles I faced, while at the same time tying it to my own custom-built back-end API.&lt;/p&gt;&lt;p&gt;This first app was also designed and built with the concept of it housing a shell that would be used as a core for the other apps in the collection (e.g., no hard-coding, and everything should be modular).&lt;/p&gt;&lt;/div&gt;&lt;div style=&quot;flex: 1 1 0%;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-XzayZs96e7g/YQYytfjfpbI/AAAAAAAAd90/bPSD3lAzyqEzSfSS9qNwruQzRXku54xlACPcBGAYYCw/s2048/blog_04_h2.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall: Hungry on Hand main screen&quot; border=&quot;0&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;1152&quot; height=&quot;200&quot; src=&quot;https://1.bp.blogspot.com/-XzayZs96e7g/YQYytfjfpbI/AAAAAAAAd90/bPSD3lAzyqEzSfSS9qNwruQzRXku54xlACPcBGAYYCw/w112-h200/blog_04_h2.png&quot; title=&quot;KD-reCall: Hungry on Hand main screen&quot; width=&quot;112&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 style=&quot;border-top: 1px solid rgb(136, 136, 136); clear: both; padding-top: 15px; text-align: center;&quot;&gt;Second Pilot&lt;/h2&gt;&lt;div style=&quot;display: flex; width: 100%;&quot;&gt;&lt;div style=&quot;flex: 1 1 0%;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-pKyiGPFwy6w/YPz7TB76oSI/AAAAAAAAd5o/ICz6M5e4plkaLpzIMN3rB4gZUQe7aElzACPcBGAYYCw/s2560/Screenshot_20210724-224552.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall: B4-I-Go login screen&quot; border=&quot;0&quot; data-original-height=&quot;2560&quot; data-original-width=&quot;1440&quot; height=&quot;200&quot; src=&quot;https://1.bp.blogspot.com/-pKyiGPFwy6w/YPz7TB76oSI/AAAAAAAAd5o/ICz6M5e4plkaLpzIMN3rB4gZUQe7aElzACPcBGAYYCw/w113-h200/Screenshot_20210724-224552.png&quot; title=&quot;KD-reCall: B4-I-Go login screen&quot; width=&quot;113&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;flex: 2 1 0%;&quot;&gt;&lt;p&gt;The second reminder app took me to whole new levels of learning with Flutter, as I faced many more challenges and a lot of lightbulbs. For example, this app added a 3rd-level screen, which required a new approach to a variety of design considerations &lt;a href=&quot;https://api.flutter.dev/flutter/widgets/WillPopScope-class.html&quot; target=&quot;_blank&quot;&gt;such as better navigation control&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I learned a variety of &lt;a href=&quot;https://developer.apple.com/design/human-interface-guidelines/ios/&quot; target=&quot;_blank&quot;&gt;iOS styles&lt;/a&gt;, Cupertino-specific widgets, and lessons. One such lesson is to &lt;a href=&quot;https://developer.apple.com/design/human-interface-guidelines/macos/windows-and-views/drawers/&quot; target=&quot;_blank&quot;&gt;not use Drawers&lt;/a&gt;. Another is to &lt;a href=&quot;https://stackoverflow.com/a/67842063/638153&quot; target=&quot;_blank&quot;&gt;not use the CupertinoPageScaffold if you plan on using a SnackBar&lt;/a&gt; (as the bounty I put up on Stack Overflow helped me to understand).&lt;/p&gt;&lt;/div&gt;&lt;div style=&quot;flex: 1 1 0%;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-qZxBpaKu8Hg/YQYys4FIQHI/AAAAAAAAd90/KRtQ00FnfG0i0x4MQpCF8clXbNMPWtn1gCPcBGAYYCw/s2608/blog_04_b2.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall: B4-I-Go main screen&quot; border=&quot;0&quot; data-original-height=&quot;2608&quot; data-original-width=&quot;1205&quot; height=&quot;200&quot; src=&quot;https://1.bp.blogspot.com/-qZxBpaKu8Hg/YQYys4FIQHI/AAAAAAAAd90/KRtQ00FnfG0i0x4MQpCF8clXbNMPWtn1gCPcBGAYYCw/w92-h200/blog_04_b2.png&quot; title=&quot;KD-reCall: B4-I-Go main screen&quot; width=&quot;92&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;width: 100%;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-jdOw4MYAf70/YQYyszAi_6I/AAAAAAAAd94/93akmNJnYQUsRG0BehuyiEkOz25rGwXBQCPcBGAYYCw/s1024/blog_04_b3.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall: B4-I-Go composite screen&quot; border=&quot;0&quot; data-original-height=&quot;500&quot; data-original-width=&quot;1024&quot; height=&quot;156&quot; src=&quot;https://1.bp.blogspot.com/-jdOw4MYAf70/YQYyszAi_6I/AAAAAAAAd94/93akmNJnYQUsRG0BehuyiEkOz25rGwXBQCPcBGAYYCw/w320-h156/blog_04_b3.png&quot; title=&quot;KD-reCall: B4-I-Go composite screen&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 style=&quot;border-top: 1px solid rgb(136, 136, 136); clear: both; padding-top: 15px; text-align: center;&quot;&gt;First Mac&lt;/h2&gt;&lt;p style=&quot;clear: both;&quot;&gt;I currently have no opinions as of yet between my career-long relationship with Windows, and my newfound knowledge of the Mac.&lt;/p&gt;&lt;p&gt;I can say that relearning keystrokes was not at the top of my list of things to be learning, which I resolved with the help of two different software setups (I can elaborate if anyone is curious). With those in place, I&#39;ve gotten into a good flow in working between my dated MSI and my new MBP, and so far they&#39;ve worked fairly well together. Currently, the Mac does everything WRT coding and builds, and the MSI is used for everything else.&lt;/p&gt;&lt;h2 style=&quot;border-top: 1px solid rgb(136, 136, 136); clear: both; padding-top: 15px; text-align: center;&quot;&gt;App Availability&lt;/h2&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Hungry on Hand&lt;/b&gt;: &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.kdcinfo.kdrecall_hungry&quot; target=&quot;_blank&quot;&gt;Google Play Store&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;B4-I-Go&lt;/b&gt;: &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.kdcinfo.kdrecall_b4igo&quot; target=&quot;_blank&quot;&gt;Google Play Store&lt;/a&gt; | &lt;a href=&quot;https://apps.apple.com/us/app/kd-recall-b4-i-go/id1578787893&quot; target=&quot;_blank&quot;&gt;Apple App Store&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;border-top: 1px solid rgb(136, 136, 136); clear: both; padding-top: 15px; text-align: center;&quot;&gt;Next Up!&lt;/h2&gt;&lt;p&gt;The third app in the reminder collection will be used as a base for me to learn more about Firebase, and &lt;i&gt;maybe&lt;/i&gt; BLoC (if applicable). I aim for it to be complete within two months, and although I will be pushing for less than one, I suppose it could take three—I have no idea how many more learning challenges I may encounter.&lt;/p&gt;&lt;p&gt;My aim and hope is to eventually be able to help find solutions and create productive apps for a small to medium-sized company.&lt;/p&gt;&lt;p&gt;Until then, another app awaits creation, and I&#39;ve got a database to design and more methodologies to learn!&lt;/p&gt;&lt;p&gt;Happy coding!&lt;/p&gt;&lt;p&gt;- Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/4736511243637220659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2021/08/wrote-app-got-mac-wrote-another-app.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/4736511243637220659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/4736511243637220659'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2021/08/wrote-app-got-mac-wrote-another-app.html' title='Wrote an App; Got a Mac; Wrote another App'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-jtqP7lPn78g/YQhg67Q4BVI/AAAAAAAAd-Q/mDb1ul17I2M8D1zxuRRz20qhL94hAo4AACLcBGAsYHQ/s72-w90-h200-c/00.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-382681981478371475</id><published>2021-07-30T19:17:00.003-07:00</published><updated>2021-09-13T01:56:27.936-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="flutter"/><title type='text'>Architectural Challenges: My Flutter Frankenstein</title><content type='html'>&lt;blockquote&gt;The Bottom line: I really like Flutter.&lt;br /&gt;It has been extremely challenging at times,&amp;nbsp;but the lessons learned from those challenges have been mostly fundamental and insightful.&lt;/blockquote&gt;&lt;p&gt;My first &lt;i&gt;major challenge&lt;/i&gt; with Flutter came in October when I found I could not update multiple Flutter widgets from various &#39;reactive&#39; sources using Flutter&#39;s Provider package.&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0px 40px; padding: 0px;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;b&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;I got to a point in my app development where I just couldn&#39;t get the code to do what I needed it to do.&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Thus began an architectural journey...&lt;/p&gt;&lt;p&gt;Scouring the web, I tried dozens of variations with every aspect of Flutter&#39;s&amp;nbsp;&lt;a href=&quot;https://pub.dev/packages/provider&quot; target=&quot;_blank&quot;&gt;Provider package&lt;/a&gt; I could find information on. I came close to succeeding a couple times, but always, &lt;i&gt;always&lt;/i&gt; hit a solid road block towards the end of each implementation.&lt;/p&gt;&lt;p&gt;In the end, my entire codebase felt really... procedural (read, cluttered). I felt claustrophobic in my own code, and could not make heads or tails of all the different flows (and I&#39;ve got plenty of Draw.io diagrams to show for it).&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-fxpfITXwGGM/YQResv0Z7xI/AAAAAAAAd9A/HpX5n10rAzYvWGorIP7gwF8A5Y49hmqdgCLcBGAsYHQ/s2048/kdrecall-data-flows-03b_100p.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Flutter Architectural Flow: Before&quot; border=&quot;0&quot; data-original-height=&quot;1344&quot; data-original-width=&quot;2048&quot; height=&quot;210&quot; src=&quot;https://1.bp.blogspot.com/-fxpfITXwGGM/YQResv0Z7xI/AAAAAAAAd9A/HpX5n10rAzYvWGorIP7gwF8A5Y49hmqdgCLcBGAsYHQ/w320-h210/kdrecall-data-flows-03b_100p.png&quot; title=&quot;Flutter Architectural Flow: Before&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Pressing pause on development, I ventured through an insightful &lt;a href=&quot;https://www.coursera.org/specializations/software-design-architecture&quot; target=&quot;_blank&quot;&gt;Coursera series on Computer and Object Oriented Systems Design&lt;/a&gt;. That course helped me to open my views on what other approaches could be out there to help with my architectural woes.&lt;/p&gt;&lt;div style=&quot;border-bottom: 1px solid rgb(170, 170, 170); border-top: 1px solid rgb(119, 119, 119); margin: 30px 0px;&quot;&gt;&lt;h2 style=&quot;text-align: center;&quot;&gt;? ? ? Options ? ? ?&lt;/h2&gt;&lt;/div&gt;&lt;p&gt;I knew I was still too new to Flutter to try BLoC just yet, and fortunately a search revealed a couple &quot;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;clean architecture&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&quot; approaches that were more &#39;Provider-like&#39;.&lt;/p&gt;&lt;ol start=&quot;1&quot; style=&quot;font-size: 2rem; font-weight: bold; text-align: left;&quot; type=&quot;I&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 1rem; font-weight: normal;&quot;&gt;The first of the two architectures I ventured to learn was &lt;a href=&quot;https://www.filledstacks.com&quot; target=&quot;_blank&quot;&gt;FilledStacks&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Filled Stacks provides &lt;a href=&quot;https://www.youtube.com/c/FilledStacks&quot; target=&quot;_blank&quot;&gt;in-depth tutorials&lt;/a&gt; showing both their &lt;a href=&quot;https://www.filledstacks.com/post/flutter-and-provider-architecture-using-stacked/&quot; target=&quot;_blank&quot;&gt;clean architecture&lt;/a&gt;, as well as a transition into using their own &lt;a href=&quot;https://pub.dev/packages/stacked&quot; target=&quot;_blank&quot;&gt;FilledStacks library package&lt;/a&gt;. Their package aims to do most of the clean architectural heavy lifting, and helps with boilerplate. The Filled Stacks courses were insightful and informative, and I loved the Clean Architecture approach, but he lost me on TDD.&lt;/p&gt;&lt;p&gt;After deliberating, I resolved that I didn&#39;t want to become reliant on a 3rd party library. With my being so new to Flutter, if something broke in their package, I wouldn&#39;t know that it wasn&#39;t me doing something wrong. A package such as this is highly beneficial to developers who have the years of experience who can simply know when something isn&#39;t working &quot;as expected.&quot;&lt;/p&gt;&lt;ol start=&quot;2&quot; style=&quot;font-size: 2rem; font-weight: bold; text-align: left;&quot; type=&quot;I&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 1rem; font-weight: normal;&quot;&gt;The final architectural approach left to put to the test—&lt;a href=&quot;https://raywenderlich.com/6373413-state-management-with-provider&quot; target=&quot;_blank&quot;&gt;Ray Wenderlich&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Coincidentally, it turns out that Ray&#39;s architectural approach &lt;i&gt;is based on the FilledStacks architecture&lt;/i&gt;, &lt;i&gt;&lt;b&gt;but&lt;/b&gt;&lt;/i&gt; it doesn&#39;t rely on the &lt;span style=&quot;font-family: courier;&quot;&gt;Stacked&lt;/span&gt; package library. Upon review, I found the &lt;i&gt;essence&lt;/i&gt; of Ray&#39;s architectural structure and tutorial walkthrough insightful, as it is essentially a pragmatic lesson in how to use the &lt;a href=&quot;https://pub.dev/packages/get_it&quot; target=&quot;_blank&quot;&gt;get_it&lt;/a&gt; package; also used by others such as&amp;nbsp;&lt;a href=&quot;https://resocoder.com/2019/10/21/flutter-tdd-clean-architecture-course-13-dependency-injection-user-interface/&quot; target=&quot;_blank&quot;&gt;Reso Coder&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Unfortunately, however, despite it&#39;s insights into the architecture outside of the Stacked package, it didn&#39;t detail any reactiveness as FilledStacks provides.&lt;/p&gt;&lt;div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;So at that point, I had two paths to my goal of a cleaner architecture—both with their own limitations.&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;After further deliberation, I decided to attempt to merge the &lt;span style=&quot;font-family: courier;&quot;&gt;get_it&lt;/span&gt; facets of Rays tutorial with the &lt;a href=&quot;https://github.com/FilledStacks/stacked/blob/master/packages/stacked/lib/src/state_management/reactive_service_mixin.dart&quot; target=&quot;_blank&quot;&gt;reactiveness of the FilledStacks architecture&lt;/a&gt;. I double checked the licensing on the code for FilledStacks (&lt;a href=&quot;https://pub.dev/packages/stacked/license&quot; target=&quot;_blank&quot;&gt;MIT&lt;/a&gt;), and I proceeded to create my own little architectural Frankenstein, which, when done, did not work.&lt;/p&gt;&lt;div&gt;Slightly baffled, I created a simple, pared down skeleton version of the code I had just attempted to compound into my own app, and lo and behold, &lt;b&gt;&lt;i&gt;it worked!&lt;/i&gt;&lt;/b&gt; That was Dec 19. After months of failure in finding a good architectural approach that solved my app&#39;s needs, I was too tired to be excited.&lt;/div&gt;&lt;p&gt;I then applied that skeleton setup to my own app, making all the pertinent adjustments across files, and when done, &lt;b&gt;&lt;i&gt;it also worked!&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style=&quot;border-bottom: 1px solid rgb(170, 170, 170); border-top: 1px solid rgb(119, 119, 119); margin: 30px 0px;&quot;&gt;&lt;h2 style=&quot;text-align: center;&quot;&gt;! ! ! WOOT ! ! !&lt;/h2&gt;&lt;/div&gt;&lt;p&gt;Since that breakthrough, I continued refactoring the rest of the app to leverage the new reactive architectural design. It was tedious, but I can now diagram my app&#39;s architectural flow without it becoming a game of Twister.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-F23C9go-8a8/YQSnOFrATcI/AAAAAAAAd9M/Z5S2ege73ZgQ6wANUeFATdPWZPtW1CUjACLcBGAsYHQ/s951/clean_architecture_skeleton_03_100p.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Flutter Architectural Flow: After&quot; border=&quot;0&quot; data-original-height=&quot;951&quot; data-original-width=&quot;851&quot; height=&quot;320&quot; src=&quot;https://1.bp.blogspot.com/-F23C9go-8a8/YQSnOFrATcI/AAAAAAAAd9M/Z5S2ege73ZgQ6wANUeFATdPWZPtW1CUjACLcBGAsYHQ/w286-h320/clean_architecture_skeleton_03_100p.png&quot; title=&quot;Flutter Architectural Flow: After&quot; width=&quot;286&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;References&lt;/h3&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Coursera Object Oriented Design&lt;br /&gt;&lt;a href=&quot;https://www.coursera.org/specializations/software-design-architecture&quot;&gt;https://www.coursera.org/specializations/software-design-architecture&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Filled Stacks&lt;br /&gt;&lt;a href=&quot;https://filledstacks.com/post/flutter-and-provider-architecture-using-stacked&quot;&gt;https://filledstacks.com/post/flutter-and-provider-architecture-using-stacked&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ray Wenderlich&lt;br /&gt;&lt;a href=&quot;https://raywenderlich.com/6373413-state-management-with-provider&quot;&gt;https://raywenderlich.com/6373413-state-management-with-provider&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Pilot App: Hungry on Hand - A detailed development history&lt;br /&gt;&lt;a href=&quot;https://bitbucket.org/kcommiskey/kdrecall-apps/wiki/History&quot;&gt;https://bitbucket.org/kcommiskey/kdrecall-apps/wiki/History&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;-Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/382681981478371475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2021/07/architectural-challenges-my-flutter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/382681981478371475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/382681981478371475'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2021/07/architectural-challenges-my-flutter.html' title='Architectural Challenges: My Flutter Frankenstein'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-fxpfITXwGGM/YQResv0Z7xI/AAAAAAAAd9A/HpX5n10rAzYvWGorIP7gwF8A5Y49hmqdgCLcBGAsYHQ/s72-w320-h210-c/kdrecall-data-flows-03b_100p.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-1344023769152480351</id><published>2021-07-25T02:57:00.000-07:00</published><updated>2021-09-13T01:56:38.222-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="flutter"/><title type='text'>&quot;Hello Suite&quot;</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;When completing a lengthy course on an interesting topic such as mobile app development via Flutter, the satisfaction of the certification at the end can be short-lived, as &lt;i&gt;the real joy comes in the form of creating your own actual apps&lt;/i&gt;.&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px;&quot;&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Recommended course of action:&lt;/h3&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px;&quot;&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&quot;Just start building something . . . &lt;i&gt;anything!&lt;/i&gt;&quot;&lt;/h3&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;i&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;But what?!&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;My First Flutter —and mobile— App (...Suite)&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-AbWYlgXx09Q/YPzqsHz_cuI/AAAAAAAAd5A/CssaRNOxsEQiZSL0w7edsrj3ekSoWizZgCPcBGAYYCw/s542/kdrecall_10_apps_02b.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall: A collection of mobile reminder apps&quot; border=&quot;0&quot; data-original-height=&quot;407&quot; data-original-width=&quot;542&quot; height=&quot;150&quot; src=&quot;https://1.bp.blogspot.com/-AbWYlgXx09Q/YPzqsHz_cuI/AAAAAAAAd5A/CssaRNOxsEQiZSL0w7edsrj3ekSoWizZgCPcBGAYYCw/w200-h150/kdrecall_10_apps_02b.png&quot; title=&quot;KD-reCall: A collection of mobile reminder apps&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;In considering this was my first mobile app, chances were pretty good its code wouldn&#39;t be looking too spit-n-polished in the end, so I decided against going with my prized project.&lt;p&gt;&lt;/p&gt;&lt;p&gt;I craved to create something unique, and with dozens of smaller project ideas to choose from, I eventually determined to break from the flock of &quot;Hello World&quot; first-timer apps, and opted to face the challenge of creating a suite of apps, . . . as my first app. 😁&lt;/p&gt;&lt;br /&gt;&lt;hr /&gt;&lt;h3 style=&quot;text-align: center;&quot;&gt;The suite&#39;s theme: Simple Reminders&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-STSJ0rVnO9g/YPzv6sx1MMI/AAAAAAAAd5I/JweVNsJUIGImhmKHAMi8xha_bGJ31cokwCPcBGAYYCw/s290/image.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall: Simple Reminders - Logo&quot; border=&quot;0&quot; data-original-height=&quot;120&quot; data-original-width=&quot;290&quot; height=&quot;83&quot; src=&quot;https://1.bp.blogspot.com/-STSJ0rVnO9g/YPzv6sx1MMI/AAAAAAAAd5I/JweVNsJUIGImhmKHAMi8xha_bGJ31cokwCPcBGAYYCw/w200-h83/image.png&quot; title=&quot;KD-reCall: Simple Reminders&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;text-align: left;&quot;&gt;The suite actually began with the name &#39;KDC App Suite,&#39; but it was soon changed to KD-reCall in an effort to better tie the suite&#39;s title into the &#39;reminder&#39; theme. The initials are for branding, and because it was only ever really meant as a personal-use project, and for the experience; but if others might benefit, then all the better.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;The goal has been for there to be 10 reminder apps in the &lt;i&gt;suite&lt;/i&gt;. I use the term &quot;suite&quot; loosely, as I&#39;ve recently begun referring to them more as a &quot;collection of apps&quot; in the unfortunate event that I can only complete a couple of them, which just doesn&#39;t feel very &quot;suite-ish.&quot;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Project Immensity: Confirmed&lt;/h2&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Quite simply, it was determined that each app would share the authentication system, and a common shell, with each having its own unique core purpose. Moreover, the entire KD-reCall collection would be complemented with a web-based interface to assist with authentication and user account settings.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;That was as far as the &quot;simply&quot; part went. After the logo and theme design, the first few months were dedicated to the creation of the back-end API and the web-based version of the suite—with absolutely no hands-on with Flutter during this development time. 😢 This became fairly extensive as the authentication system I designed includes an array of features.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Once the web-based &quot;authentication and preferences&quot; interface was coupled with the back-end API, the authentication portion of the mobile app was created, and the mobile and web versions were then fine-tuned to work side by side.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;The final authentication feature, DND, was completed in October, which is when I was met with my first major Flutter challenge—setting and sharing values between `Provider`s.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thus began quite the challenging&amp;nbsp;architectural journey through various Flutter state paradigms and packages, which I look forward to sharing soon.&lt;/p&gt;&lt;br /&gt;&lt;table align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center;&quot;&gt;How it started&lt;/th&gt;&lt;th style=&quot;text-align: center;&quot;&gt;How it&#39;s going&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-i3B5SlEIiEk/YPz4Wn2hBxI/AAAAAAAAd5M/D801j4oIw04M5XKF_uUiD1hgV0g2yjCZwCPcBGAsYHg/s2560/Screenshot_20200703-020849.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall Login Screen - Before&quot; border=&quot;0&quot; data-original-height=&quot;2560&quot; data-original-width=&quot;1440&quot; height=&quot;320&quot; src=&quot;https://1.bp.blogspot.com/-i3B5SlEIiEk/YPz4Wn2hBxI/AAAAAAAAd5M/D801j4oIw04M5XKF_uUiD1hgV0g2yjCZwCPcBGAsYHg/w180-h320/Screenshot_20200703-020849.png&quot; title=&quot;KD-reCall Login Screen&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-pKyiGPFwy6w/YPz7TB76oSI/AAAAAAAAd5o/ICz6M5e4plkMieHWvrZlTGIlQ3Xgo_RAQCPcBGAsYHg/s2560/Screenshot_20210724-224552.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;KD-reCall Login Screen - After&quot; border=&quot;0&quot; data-original-height=&quot;2560&quot; data-original-width=&quot;1440&quot; height=&quot;320&quot; src=&quot;https://1.bp.blogspot.com/-pKyiGPFwy6w/YPz7TB76oSI/AAAAAAAAd5o/ICz6M5e4plkMieHWvrZlTGIlQ3Xgo_RAQCPcBGAsYHg/w180-h320/Screenshot_20210724-224552.png&quot; title=&quot;KD-reCall Login Screen&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;-Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/1344023769152480351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2021/07/hello-suite.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/1344023769152480351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/1344023769152480351'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2021/07/hello-suite.html' title='&quot;Hello Suite&quot;'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-AbWYlgXx09Q/YPzqsHz_cuI/AAAAAAAAd5A/CssaRNOxsEQiZSL0w7edsrj3ekSoWizZgCPcBGAYYCw/s72-w200-h150-c/kdrecall_10_apps_02b.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-6997013436594011873</id><published>2021-07-21T02:53:00.002-07:00</published><updated>2021-09-13T01:56:46.720-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="flutter"/><title type='text'>I got a Flutter Full Course Certification—Now what?!</title><content type='html'>&lt;style&gt;ul.tarr::before { content: &#39;\27a2&#39;; position: absolute; left: 25px; }&lt;/style&gt;
&lt;p&gt;&lt;b&gt;&lt;u&gt;The Goal&lt;/u&gt;&lt;/b&gt;: Find a mutually-accommodating position working on productive solutions involving mobile apps built with Flutter or JavaScript-based web interfaces before the end of the year.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;u&gt;The Plan&lt;/u&gt;&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;line-height: 1.5; list-style: none;&quot;&gt;
    &lt;li style=&quot;padding-top: 0px;&quot;&gt;&lt;b&gt;→ Phase I&lt;/b&gt;:&amp;nbsp;&lt;ul style=&quot;list-style: none;&quot;&gt;
            &lt;li&gt;Begin learning mobile app development via Flutter.&lt;/li&gt;
            &lt;li&gt;
                &lt;ul&gt;
                    &lt;li&gt;Complete. Yay! 🥈&lt;/li&gt;
                &lt;/ul&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li style=&quot;padding-top: 12px;&quot;&gt;&lt;b&gt;→ Phase II&lt;/b&gt;:&amp;nbsp;&lt;ul style=&quot;list-style: none;&quot;&gt;
            &lt;li&gt;Focus on a solid project to continue to broaden and strengthen Flutter knowledge.&lt;/li&gt;
            &lt;li&gt;
                &lt;ul&gt;
                    &lt;li&gt;98% complete. This is what my next few posts will cover. ✍&lt;/li&gt;
                &lt;/ul&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li style=&quot;padding-top: 12px;&quot;&gt;&lt;b&gt;→ Phase III&lt;/b&gt;:&amp;nbsp;&lt;ul style=&quot;list-style: none;&quot;&gt;
            &lt;li&gt;Interview prep and job search.&lt;/li&gt;
            &lt;li&gt;
                &lt;ul&gt;
                    &lt;li&gt;Although I am one of those developers who is more comfortable discussing code while coding, I aim to learn how to discuss code without context as well (i.e., &quot;Define the &#39;spread operator&#39;&quot;). 🧐&lt;/li&gt;
                &lt;/ul&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li style=&quot;padding-top: 12px;&quot;&gt;&lt;b&gt;→ Phase IV&lt;/b&gt;:&amp;nbsp;&lt;ul style=&quot;list-style: none;&quot;&gt;
            &lt;li&gt;Upon finding a mutually-accommodating position, go above and beyond to help make my new job a success. 🤝&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-1gCHu-6u-y8/XobFRhkSpuI/AAAAAAAAbfE/LKIzTFIE5L4tON4XNll8KjlFUiray-IvwCPcBGAYYCw/s936/flutter-dart-code-3d.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;804&quot; data-original-width=&quot;936&quot; height=&quot;172&quot; src=&quot;https://1.bp.blogspot.com/-1gCHu-6u-y8/XobFRhkSpuI/AAAAAAAAbfE/LKIzTFIE5L4tON4XNll8KjlFUiray-IvwCPcBGAYYCw/w200-h172/flutter-dart-code-3d.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;&lt;u&gt;The Bottom line&lt;/u&gt;&lt;/b&gt;: I really like Flutter. It has been extremely challenging at times, but the lessons learned from those challenges have been mostly fundamental and insightful.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I&#39;m looking forward to sharing some of those insights.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-Keith | &lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/6997013436594011873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2021/07/i-got-flutter-full-course.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/6997013436594011873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/6997013436594011873'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2021/07/i-got-flutter-full-course.html' title='I got a Flutter Full Course Certification—Now what?!'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-1gCHu-6u-y8/XobFRhkSpuI/AAAAAAAAbfE/LKIzTFIE5L4tON4XNll8KjlFUiray-IvwCPcBGAYYCw/s72-w200-h172-c/flutter-dart-code-3d.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-1136989991263202942</id><published>2020-07-06T01:40:00.000-07:00</published><updated>2021-09-13T01:56:56.974-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="chrome browser extension"/><title type='text'>New Browser Extension: Too-Much-Time</title><content type='html'>&lt;h1 style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/too-much-time/okogpcjdmbagmocinoialgklbbjalbfn?hl=en&amp;amp;authuser=0&quot; target=&quot;_blank&quot;&gt;Browser Extension: Too-Much-Time&lt;/a&gt;&lt;/h1&gt;&lt;div&gt;&lt;div&gt;This blog entry is to simply document the creation and publishing of my third browser extension now available in the &lt;a href=&quot;https://chrome.google.com/webstore/detail/too-much-time/okogpcjdmbagmocinoialgklbbjalbfn?hl=en&amp;amp;authuser=0&quot; target=&quot;_blank&quot;&gt;Chrome Web Store&lt;/a&gt;. The extension was relatively light and more of a personal project to accomplish something during—and break the monotony of—my mobile app development learning curve (which is coming along nicely).&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-q7xTQFnHKMo/XwLeI6M5ojI/AAAAAAAAcKA/Qs_lz1uzqZYBv5yH90zdrOuNWvDQuqMMwCK4BGAsYHg/s640/tmt_640-400.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;400&quot; data-original-width=&quot;640&quot; src=&quot;https://1.bp.blogspot.com/-q7xTQFnHKMo/XwLeI6M5ojI/AAAAAAAAcKA/Qs_lz1uzqZYBv5yH90zdrOuNWvDQuqMMwCK4BGAsYHg/s320/tmt_640-400.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Too-Much-Time Browser Extension Popup&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Too-Much-Time is a simple browser extension that allows you to &#39;time&#39; the time you spend on certain websites.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;When the time you specify is up, you&#39;ll get an alert offering you the opportunity to stop or snooze.&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;As with my other two browser extensions, Too-Much-Time is not only free, it&#39;s open source.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Although I was really hoping to have this quite simplistic concept developed within a day, in the end, even two days would have been surreal. But also in the end, I&#39;m pleased with what the simple concept of trying to limit my time on [enter addicting online web service here] became.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Situational Examples:&lt;/h4&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;If you find you&#39;ve been spending a little more time than you would prefer on your favorite social networking site.&lt;/li&gt;&lt;li&gt;Or perhaps you&#39;d like to time your shopping on your favorite eCommerce site.&lt;/li&gt;&lt;li&gt;Perhaps you&#39;d like to time your efforts spent researching through an informational site.&lt;/li&gt;&lt;li&gt;Or put in &#39;just enough&#39; reading on a particular reading site before bed.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-0rtjM-VUZXE/XwLiQBrdQBI/AAAAAAAAcKc/mk7deEBU5LIU9Xr3G8MHsTDxvQQiexZnwCK4BGAsYHg/s128/tmt_128-128.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;128&quot; data-original-width=&quot;128&quot; height=&quot;34&quot; src=&quot;https://1.bp.blogspot.com/-0rtjM-VUZXE/XwLiQBrdQBI/AAAAAAAAcKc/mk7deEBU5LIU9Xr3G8MHsTDxvQQiexZnwCK4BGAsYHg/w34-h34/tmt_128-128.png&quot; width=&quot;34&quot; /&gt;&lt;/a&gt;&lt;/div&gt;The intent of this extension was to be an annoyance to help get you (okay, &lt;i&gt;me&lt;/i&gt;) off websites that you (*&lt;i&gt;I&lt;/i&gt;) spend a tad too much time on.&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Installation&lt;/h2&gt;&lt;div&gt;From within your favorite browser, navigate to the &lt;a href=&quot;https://chrome.google.com/webstore/detail/too-much-time/okogpcjdmbagmocinoialgklbbjalbfn?hl=en&amp;amp;authuser=0&quot; target=&quot;_blank&quot;&gt;Chrome Web Store&lt;/a&gt; and click the &quot;Add to Browser&quot; button.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Instructions and FAQ&lt;/h4&gt;&lt;div&gt;As mentioned, as with my first two Chrome extensions, the code for this extension is open source and &lt;a href=&quot;https://github.com/KDCinfo/too-much-time&quot; target=&quot;_blank&quot;&gt;available on GitHub&lt;/a&gt;. The &lt;font face=&quot;courier&quot; size=&quot;2&quot;&gt;readme&lt;/font&gt;&amp;nbsp;on GitHub provides additional insights for installation and usage, along with a host of other edge-of-your-seat informational items.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Always open to feedback! If you come across a bug, you can also feel free to look at the code, and see if you can find a fix. I&#39;m also open to Pull Requests and possibly even contributors.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Keith D Commiskey @ 2020-07-06&lt;/div&gt;&lt;div&gt;Lifetime Web Developer&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://keithdc.com&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-FF1sx_H3bSc/XwLil-K1_dI/AAAAAAAAcKw/UWpbkirP-CEOCu9R0ZyeaCTG32hiLKqOgCK4BGAsYHg/s1280/tmt_1280-800.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;313&quot; src=&quot;https://1.bp.blogspot.com/-FF1sx_H3bSc/XwLil-K1_dI/AAAAAAAAcKw/UWpbkirP-CEOCu9R0ZyeaCTG32hiLKqOgCK4BGAsYHg/w500-h313/tmt_1280-800.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/1136989991263202942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2020/07/new-browser-extension-too-much-time.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/1136989991263202942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/1136989991263202942'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2020/07/new-browser-extension-too-much-time.html' title='New Browser Extension: Too-Much-Time'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-q7xTQFnHKMo/XwLeI6M5ojI/AAAAAAAAcKA/Qs_lz1uzqZYBv5yH90zdrOuNWvDQuqMMwCK4BGAsYHg/s72-c/tmt_640-400.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-1649483324390780753</id><published>2020-04-03T00:40:00.001-07:00</published><updated>2020-04-03T18:45:34.868-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="app development"/><category scheme="http://www.blogger.com/atom/ns#" term="dart"/><category scheme="http://www.blogger.com/atom/ns#" term="flutter"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile app development"/><category scheme="http://www.blogger.com/atom/ns#" term="web development"/><title type='text'>Learning Mobile App Development via Flutter</title><content type='html'>&lt;div&gt;
&lt;h2&gt;
Learning: Mobile App Development - via Flutter&lt;/h2&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://raw.githubusercontent.com/flutter/flutter/master/examples/platform_view/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 4em; margin-left: 1em; margin-top: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;192&quot; data-original-width=&quot;192&quot; src=&quot;https://raw.githubusercontent.com/flutter/flutter/master/examples/platform_view/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;
What is … Flutter? &lt;b&gt;Flutter is a mobile—and web—app development framework&lt;/b&gt; powered by the Dart programming language. It is akin to React Native or Ionic, and is built by Google. &lt;a href=&quot;https://flutterigniter.com/ultimate-javascript-dart-syntax-guide/&quot; target=&quot;_blank&quot;&gt;Dart is akin to JavaScript&lt;span style=&quot;color: black;&quot;&gt;—&lt;/span&gt;but not.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Since coming out of beta in December 2018, trends from &lt;a href=&quot;https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-other-frameworks-libraries-and-tools&quot; target=&quot;_blank&quot;&gt;Stack Overflow&lt;/a&gt; and &lt;a href=&quot;https://learning.linkedin.com/blog/tech-tips/the-fastest-growing-skills-among-software-engineers--and-how-to-&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt; have indicated Flutter has become—and is currently—&lt;b&gt;a well-developed, easy-to-use,&amp;nbsp;&lt;a href=&quot;https://flutter.dev/community&quot; target=&quot;_blank&quot;&gt;community-driven framework for developing natively compiled apps&lt;/a&gt;&lt;/b&gt;. It is currently used by a &lt;a href=&quot;https://flutter.dev/showcase&quot; target=&quot;_blank&quot;&gt;variety of vendors including Square, Sonos, eBay&lt;/a&gt;, and of course, Google also uses Flutter to develop some of&amp;nbsp;&lt;a href=&quot;https://insights.daffodilsw.com/blog/10-amazing-apps-built-using-flutter-framework&quot; target=&quot;_blank&quot;&gt;its own products such as Google Ads&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
Flutter 101: The Course&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-1gCHu-6u-y8/XobFRhkSpuI/AAAAAAAAbfA/ABuhfdXlWn0U7T_VQJVcXVIIqsO2d5HWwCLcBGAsYHQ/s1600/flutter-dart-code-3d.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 3em; margin-right: 1em; margin-top: 4em;&quot;&gt;&lt;img alt=&quot;A 3D image of Sublime Text 3 code editor with code open and 3D books protruding perpendicularly out of the 3D image but near halfway into and through the image.&quot; border=&quot;0&quot; data-original-height=&quot;804&quot; data-original-width=&quot;936&quot; height=&quot;274&quot; src=&quot;https://1.bp.blogspot.com/-1gCHu-6u-y8/XobFRhkSpuI/AAAAAAAAbfA/ABuhfdXlWn0U7T_VQJVcXVIIqsO2d5HWwCLcBGAsYHQ/s320/flutter-dart-code-3d.png&quot; title=&quot;Created by Keith D Commiskey in 2020 with MS 3D Paint&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span id=&quot;goog_150675030&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://academind.com/&quot; target=&quot;_blank&quot;&gt;Academind&lt;/a&gt;&lt;span id=&quot;goog_150675031&quot;&gt;&lt;/span&gt; (&lt;a href=&quot;https://www.udemy.com/course/learn-flutter-dart-to-build-ios-android-apps/&quot; target=&quot;_blank&quot;&gt;Udemy; Online Education&lt;/a&gt;) provides &lt;a href=&quot;https://academind.com/learn/&quot; target=&quot;_blank&quot;&gt;over 150 high-quality courses&lt;/a&gt; across near two dozen topics, and is devoted to real-life success via online learning. Tagline aside, their Flutter course in point is a fine-tuned 36-hour course, and is &lt;i&gt;the most detailed study program I have ever had the pleasure of going through&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Max, the instructor, &lt;b&gt;goes through the course with an ever-encouraging tone&lt;/b&gt;, dropping tips and tricks and hints between every instruction. In fact, these tips and tricks are dropped so often, &lt;span style=&quot;color: #ee6666;&quot;&gt;&lt;b&gt;&lt;i&gt;if you skip thirty seconds of instruction, you could potentially lose out on a handful of intrinsic insights that could save you hours of developmental headaches later on&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;. Notes abound.&lt;br /&gt;
&lt;br /&gt;
Due to the vast depths of shared knowledge throughout the lectures, many students have signaled their need—and desire—for going through the course multiple times. I, on the other hand, went through every minute of the course an equivalent of seven times—in one pass. Between taking copious notes on every single detail of instruction, reading through every comment in the majority of lectures—and contributing my own comments throughout, all in addition to typing through all the code—and testing—every detail, you are assured to come out the other side with at least three fully featured apps.&lt;br /&gt;
&lt;br /&gt;
In the end you will have the opportunity to take one of your apps, say the &quot;Meals&quot; app, for instance, and upload it to either the Google Store, the Apple Store (if you have a Mac), or both.&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
Icing on the Cake&lt;/h3&gt;
Two key things this course does above and beyond:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;color: #ee6666; font-size: 2rem;&quot; type=&quot;I&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: white; font-size: 1rem;&quot;&gt;&lt;b&gt;It runs you through not-so-happy paths&lt;/b&gt;, (&quot;incidentally&quot; on purpose) and&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: white; font-size: 1rem;&quot;&gt;&lt;b&gt;it helps you to understand why and how things broke&lt;/b&gt;.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
Max provides &lt;span style=&quot;color: #ee6666;&quot;&gt;&lt;i&gt;concrete decisions on coding styles&lt;/i&gt;&lt;/span&gt;, but is also adamant and direct when a particular approach is simply &quot;one way of doing things.&quot; He provides a heavy emphasis on detailing how to approach any given situation in a variety of ways—providing insightful input on the pros and cons of each.&lt;br /&gt;
&lt;br /&gt;
In honor of doing what you love in life and in sharing your knowledge with others, it is with pride I am able to share the Flutter course completion certificate provided by Max of Academind. I look forward to my travels down the road they helped begin to pave.&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
Course Completion Certificate&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Title: &quot;&lt;b&gt;Learn Flutter &amp;amp; Dart to Build iOS &amp;amp; Android Apps [2020]&lt;/b&gt;&quot;&lt;/li&gt;
&lt;li&gt;Certificate: &lt;a href=&quot;https://ude.my/UC-aaa10e86-9311-4dd7-8a24-3e9531777591&quot;&gt;https://ude.my/UC-aaa10e86-9311-4dd7-8a24-3e9531777591&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Platform: Udemy: Completed: March 25, 2020; 36 hours&lt;/li&gt;
&lt;li&gt;Instructor: Academind by Maximilian Schwarzmuller&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-NrjOBtu4NIg/Xoa65FM1A2I/AAAAAAAAbes/rxizDnsdyzoPDrIk7swBzdu_Np0ougnygCLcBGAsYHQ/s1600/udemy_certificate_UC-aaa10e86-9311.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Flutter course certificate of completion for Keith D Commiskey&quot; border=&quot;0&quot; data-original-height=&quot;1190&quot; data-original-width=&quot;1600&quot; height=&quot;238&quot; src=&quot;https://1.bp.blogspot.com/-NrjOBtu4NIg/Xoa65FM1A2I/AAAAAAAAbes/rxizDnsdyzoPDrIk7swBzdu_Np0ougnygCLcBGAsYHQ/s320/udemy_certificate_UC-aaa10e86-9311.jpg&quot; title=&quot;Flutter course certificate of completion: Keith D Commiskey&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
Flutter Learning Path Logistics&lt;/h3&gt;
I initially went through the following two courses which ultimately led me to the course on Udemy (as they were intended to do—thankfully so).&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=GLSG_Wh_YWc&quot; target=&quot;_blank&quot;&gt;Flutter Tutorial for Beginners&lt;/a&gt;&amp;nbsp;→ Udemy course prequel—this is basically the first section of the Udemy course, ergo, I would suggest just doing the course version, as it is likely more up to date.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Academind |&amp;nbsp;YouTube: &lt;b&gt;03:22:18&lt;/b&gt; (3 days; Jan 6 - 8; 29)&lt;/li&gt;
&lt;li&gt;Build iOS and Android Apps with Google&#39;s Flutter &amp;amp; Dart&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=x0uinJvhNxI&quot; target=&quot;_blank&quot;&gt;Flutter Crash Course for Beginners 2020&lt;/a&gt;&amp;nbsp;→ A really good intro course&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Academind |&amp;nbsp;YouTube: &lt;b&gt;05:44:31&lt;/b&gt; (3 days; Feb 5 - 7)&lt;/li&gt;
&lt;li&gt;Build a Flutter App with Google&#39;s Flutter &amp;amp; Dart&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
Next Phase&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Building [Pragmatic] Mobile Apps&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
Keith D Commiskey @ 2020-04-03&lt;/div&gt;
&lt;div&gt;
Lifetime Web Developer&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://keithdc.com/&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/1649483324390780753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2020/04/learning-mobile-app-development-via.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/1649483324390780753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/1649483324390780753'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2020/04/learning-mobile-app-development-via.html' title='Learning Mobile App Development via Flutter'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-1gCHu-6u-y8/XobFRhkSpuI/AAAAAAAAbfA/ABuhfdXlWn0U7T_VQJVcXVIIqsO2d5HWwCLcBGAsYHQ/s72-c/flutter-dart-code-3d.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-9080116535926849164</id><published>2020-01-27T14:51:00.001-08:00</published><updated>2020-01-27T17:57:17.346-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="chrome browser extension"/><category scheme="http://www.blogger.com/atom/ns#" term="expiration date"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="react"/><category scheme="http://www.blogger.com/atom/ns#" term="single page app"/><category scheme="http://www.blogger.com/atom/ns#" term="spa"/><category scheme="http://www.blogger.com/atom/ns#" term="web app"/><category scheme="http://www.blogger.com/atom/ns#" term="x2b"/><title type='text'>React Component Marries Chrome Browser Extension</title><content type='html'>Less than two years later, Chrome browser extension requests opportunity to see other code.&lt;br /&gt;
&lt;br /&gt;
Ever wondered how to wrap a Chrome browser extension inside a React component to allow the extension to run as a SPA? &lt;b&gt;The &lt;a href=&quot;https://github.com/KDCinfo/expired-to-be-spa&quot; target=&quot;_blank&quot;&gt;Expired To Be: SPA&lt;/a&gt; version does just that.&lt;/b&gt;&amp;nbsp;It is a React alarm component I wrote that wraps and queues alarms in conjunction with the Chrome browser API.&lt;br /&gt;
&lt;br /&gt;
Having React stand in as Chrome&#39;s storage, queue, and notification platform worked out really well. Although obviously there is the maintenance and understanding of the integral relationship between the two technologies, the same can be said for Redux or any technology that is tightly integrated.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-134EFc-48r4/Xi-EWZnTH_I/AAAAAAAAa3w/RQoviNASIPs_WHxLUuXtVHONHib2QcwTwCEwYBhgL/s1600/splash_x2b_320.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;222&quot; data-original-width=&quot;320&quot; src=&quot;https://1.bp.blogspot.com/-134EFc-48r4/Xi-EWZnTH_I/AAAAAAAAa3w/RQoviNASIPs_WHxLUuXtVHONHib2QcwTwCEwYBhgL/s1600/splash_x2b_320.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
SPA History: The Marriage&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-bECkIaHOdlQ/Xi-GNmjfW_I/AAAAAAAAa38/EhjLPwjmb0cu7rSBDe5HdHZVQX8_982qQCEwYBhgL/s1600/x2b-react-architecture.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;829&quot; data-original-width=&quot;1045&quot; height=&quot;253&quot; src=&quot;https://1.bp.blogspot.com/-bECkIaHOdlQ/Xi-GNmjfW_I/AAAAAAAAa38/EhjLPwjmb0cu7rSBDe5HdHZVQX8_982qQCEwYBhgL/s320/x2b-react-architecture.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Visual Overview: A detailed schematic outlining the integration between the React &#39;Alarms&#39; component and Chrome browser extension can be found on &lt;a href=&quot;https://github.com/KDCinfo/expired-to-be/blob/master/public/x2b/expired-to-be_page-load_07.svg&quot; target=&quot;_blank&quot;&gt;GitHub: Expired To Be Page Load Architecture Diagram&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
As noted in the &lt;a href=&quot;https://kdcinfo.blogspot.com/2018/04/expired-to-be-now-available-most.html&quot; target=&quot;_blank&quot;&gt;Expired To Be: SPA article&lt;/a&gt; on Sunday, April 2018, &quot;Both apps share the same source code, which is all open source on GitHub.&quot;&lt;br /&gt;
&lt;br /&gt;
Also noted in the same article, &quot;&lt;a href=&quot;https://github.com/KDCinfo/done-for-now&quot; target=&quot;_blank&quot;&gt;Alarms API—For my React-based Alarms API&lt;/a&gt;,&quot; I borrowed the `TimerBox` component from my previous &lt;a href=&quot;https://kdcinfo.com/app/done-for-now/&quot; target=&quot;_blank&quot;&gt;&#39;Done (for now)&#39; SPA&lt;/a&gt;. (Done (for now) is a multi-timer; it was my 3rd React app, and my 1st TypeScript project.)&lt;br /&gt;
&lt;h3&gt;
SPA Integration Caveats&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The SPA and Chrome extension do not share alarms. The extension uses Chrome&#39;s own internal storage and alarm system, which is not accessible from a normal web page.
&lt;ul&gt;
&lt;li&gt;Could this be done? Certainly! Given proper T&amp;amp;E and if there were a demand for it, I have a theory or two on how to make this work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;The SPA web page (tab) must stay open to allow the alarms to run. The Chrome extension runs in the browser&#39;s background.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
The Chronus of it All&lt;/h3&gt;
&lt;a href=&quot;https://github.com/KDCinfo/expired-to-be-spa/blob/master/public/extensions/chrome/history.md#detailed-development-history&quot; target=&quot;_blank&quot;&gt;&amp;gt; &lt;mark&gt;2018-02-06&lt;/mark&gt; - Tuesday&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;mark&gt;Began project&lt;/mark&gt;: Copied over folders and files from &#39;&lt;a href=&quot;https://github.com/KDCinfo/character-counts&quot; target=&quot;_blank&quot;&gt;Character Counts&lt;/a&gt;&#39; (my first Chrome extension) and began editing.&lt;/li&gt;
&lt;/ul&gt;
@2:05 PM&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Got &quot;Expired To Be&quot; stripped down to essentials.
&lt;ul&gt;
&lt;li&gt;Ready for development.&lt;/li&gt;
&lt;li&gt;Then notifications.&lt;/li&gt;
&lt;li&gt;and localState.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://github.com/KDCinfo/expired-to-be-spa/blob/master/public/extensions/chrome/history.md#detailed-development-history-continued&quot; target=&quot;_blank&quot;&gt;&amp;gt; &lt;mark&gt;2018-02-23&lt;/mark&gt; - Friday&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
@12:30 AM&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Got x2bStorage setup for get and halfway with set (and clearItem).&lt;/li&gt;
&lt;li&gt;Feels like I made a lot of progress, and it feels like I haven&#39;t &#39;cause I&#39;ve been working on this for the last 2-3 hours or so. Need to finish this part up so I can do the export, so I can then do the SPA page (&lt;mark&gt;React is doubtful; more likely just plain HTML/CSS/JS&lt;/mark&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://github.com/KDCinfo/expired-to-be-spa/blob/master/public/extensions/chrome/history.md#x2b-version-20&quot; target=&quot;_blank&quot;&gt;&amp;gt; &lt;mark&gt;2018-03-01&lt;/mark&gt; - Thursday&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
@5:29 PM&lt;br /&gt;
&lt;br /&gt;
Figured out solution to my problem.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Wrap popup.html in an index.php. popup.html is read from manifest.json by the Chrome Extension. index.php is read from travis.yml by GitHub Pages.
&lt;ul&gt;
&lt;li&gt;Will be wrapped with library loads.&lt;/li&gt;
&lt;li&gt;React can load via &amp;lt;script&amp;gt;.&lt;/li&gt;
&lt;li&gt;Alarms API can load via &amp;lt;script&amp;gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
So; &lt;mark&gt;&#39;Expired To Be&#39; is going to be introduced to React, and React&#39;s build process.&lt;/mark&gt; Gonna do a CRA install.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/KDCinfo/expired-to-be-spa/commit/ec9b97b7d0bd49dd1f7e555c2b5cf59cf8b86249&quot; target=&quot;_blank&quot;&gt;&amp;gt; &lt;mark&gt;2020-01-26&lt;/mark&gt; - Sunday&lt;/a&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: none;&quot;&gt;
&lt;li&gt;&lt;mark&gt;Chrome browser extension files for separation of code space.&lt;/mark&gt; GitHub clone proceedings commenced. &lt;a href=&quot;https://github.com/KDCinfo/expired-to-be-spa&quot; target=&quot;_blank&quot;&gt;Expired To Be: SPA repo now resides in its own space&lt;/a&gt;, and &lt;a href=&quot;https://kdcinfo.github.io/expired-to-be-spa/&quot; target=&quot;_blank&quot;&gt;is available from it&#39;s own URL&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Chrome browser extension turns focus to family ties and is now poised to assist with a couple new sibling ventures. More to come...&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Keith D Commiskey&lt;br /&gt;
&lt;a href=&quot;https://keithdc.com/&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/9080116535926849164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/react-component-marries-chrome-browser.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/9080116535926849164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/9080116535926849164'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/react-component-marries-chrome-browser.html' title='React Component Marries Chrome Browser Extension'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-134EFc-48r4/Xi-EWZnTH_I/AAAAAAAAa3w/RQoviNASIPs_WHxLUuXtVHONHib2QcwTwCEwYBhgL/s72-c/splash_x2b_320.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-855354290809499461</id><published>2020-01-19T14:20:00.001-08:00</published><updated>2020-01-20T23:15:13.346-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="authors"/><category scheme="http://www.blogger.com/atom/ns#" term="book categorization"/><category scheme="http://www.blogger.com/atom/ns#" term="book classification"/><category scheme="http://www.blogger.com/atom/ns#" term="book length"/><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="word count"/><category scheme="http://www.blogger.com/atom/ns#" term="word count tool"/><category scheme="http://www.blogger.com/atom/ns#" term="words"/><category scheme="http://www.blogger.com/atom/ns#" term="writing"/><title type='text'>Introducing: The Book Length Classification and Word Count Tool</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-cqIwk50gcl8/Xiak2fxlxuI/AAAAAAAAa1M/2IKINeZ8G84QCyshIJgOMX2ePIWDqKNWACLcBGAsYHQ/s1600/book-lengths-600-198.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;198&quot; data-original-width=&quot;600&quot; src=&quot;https://1.bp.blogspot.com/-cqIwk50gcl8/Xiak2fxlxuI/AAAAAAAAa1M/2IKINeZ8G84QCyshIJgOMX2ePIWDqKNWACLcBGAsYHQ/s1600/book-lengths-600-198.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Where does your story fit?&lt;/b&gt; Novel, Novella, Novellette, Modern Short Story, Short Story, Short-Short Prose, Flash Fiction?&lt;br /&gt;
&lt;br /&gt;
Introducing: The &lt;b&gt;Book Length Classification and Word Count Tool&lt;/b&gt; — Providing aggregated insights distinguishing the differences between a Short Story, Novella, Novel, etc.&lt;br /&gt;
&lt;br /&gt;
Comments and suggestions always welcome. Disqus comments are provided at the bottom of the article page.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kdcinfo.com/wordcount&quot;&gt;https://kdcinfo.com/wordcount&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Thanks,&lt;br /&gt;
Keith D Commiskey&lt;br /&gt;
https://keithdc.com&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/855354290809499461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/introducing-book-length-classification.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/855354290809499461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/855354290809499461'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/introducing-book-length-classification.html' title='Introducing: The Book Length Classification and Word Count Tool'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-cqIwk50gcl8/Xiak2fxlxuI/AAAAAAAAa1M/2IKINeZ8G84QCyshIJgOMX2ePIWDqKNWACLcBGAsYHQ/s72-c/book-lengths-600-198.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-8991198027973761706</id><published>2020-01-18T22:00:00.000-08:00</published><updated>2020-01-29T03:22:32.822-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript basics"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript developer"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript fundamentals"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript learn"/><category scheme="http://www.blogger.com/atom/ns#" term="js"/><title type='text'>JavaScript Informational: Best of the Basics</title><content type='html'>&lt;div id=&quot;info-js-content&quot;&gt;
&lt;h1&gt;
Best of the Basics: JavaScript Informational&lt;/h1&gt;
&lt;div id=&quot;article-id-00&quot;&gt;
&lt;img alt=&quot;JavaScript Informational: Image by: Keith D Commiskey | https://keithdc.com @2020&quot; class=&quot;article-base ref-link-open-00&quot; src=&quot;https://kdcinfo.com/app/info-js/info-js-600-198.png&quot; title=&quot;JavaScript Informational: Image by: Keith D Commiskey | https://keithdc.com @2020&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
JavaScript Informational: Best of the Basics: A full run through for entry- and mid-level developers looking for some solid fundamentals. Comments and suggestions always welcome.&lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
For those new to the language, this is my own personal introduction to the topic garnered from over 17 years of experience: I&#39;m throwing it out into the informational nexus. &lt;span class=&quot;no-wrap&quot;&gt;-Keith D Commiskey&lt;/span&gt;&lt;/div&gt;
&lt;em&gt;So you wanna control your browser, ehhh...?&lt;/em&gt;

    &lt;br /&gt;
&lt;h2&gt;
Start with a Solid Base&lt;/h2&gt;
&lt;div class=&quot;left-bar&quot;&gt;
&lt;span class=&quot;code&quot;&gt;Variables&lt;/span&gt; are the crux of most programming languages, and a good place to start. You have to be able to ask for, handle, save, and recall various tidbits of information.&lt;/div&gt;
&lt;ul class=&quot;indent-05&quot;&gt;
&lt;li&gt;&lt;span class=&quot;text-bold&quot;&gt;Q:&lt;/span&gt; Why would you want to create a variable?&lt;/li&gt;
&lt;li style=&quot;height: 5px; line-height: 0; list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;text-bold&quot;&gt;A:&lt;/span&gt; Variables are a part of what allows us to control “app”lications—such as your web browser.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;left-bar&quot;&gt;
Everyone reading this informational on a web browser has the ability to &lt;b&gt;create a variable in less than 30 seconds.&lt;/b&gt;
        For instance, most browsers allow you to open their “developer tools” using the F12 key.
        If you click the “Console” tab at the top of those tools, and type the following at the &amp;gt; prompt:
        &lt;span class=&quot;code&quot;&gt;var &lt;span class=&quot;text-bold&quot;&gt;myvar&lt;/span&gt; = “hello”;&lt;/span&gt; and press enter.
    &lt;/div&gt;
&lt;div class=&quot;indent-05 congratz&quot;&gt;
Congratulations!&lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
Here, &lt;span class=&quot;code&quot;&gt;myvar&lt;/span&gt; is the &lt;i&gt;name&lt;/i&gt; of your variable (&lt;span class=&quot;code&quot;&gt;var&lt;/span&gt; is you telling the computer that you are about to create a variable).
        &lt;b&gt;Once you assign information to a variable, you can then access that information&lt;/b&gt;—by referring to your variable&#39;s name—&lt;b&gt;with other code.&lt;/b&gt;
        For instance, you can assign numbers to two different variable names, and then add those two variables together.
        In doing that, you will have basically just created the &#39;addition&#39; function on a calculator. Bet you didn&#39;t know you&#39;d be doing that today.
    &lt;/div&gt;
&lt;ul class=&quot;indent-05&quot;&gt;
&lt;li&gt;&lt;span class=&quot;text-bold&quot;&gt;Q:&lt;/span&gt; &lt;i&gt;What kind&lt;/i&gt; of information can you put in a variable?&lt;/li&gt;
&lt;li style=&quot;height: 5px; line-height: 0; list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;text-bold&quot;&gt;A:&lt;/span&gt;
            These are called &lt;u&gt;data types&lt;/u&gt;, and they refer to things like &lt;span class=&quot;data-type&quot;&gt;string&lt;/span&gt;s and &lt;span class=&quot;data-type&quot;&gt;number&lt;/span&gt;s.
            Previously you added a &lt;span class=&quot;data-type&quot;&gt;string&lt;/span&gt;, &lt;b&gt;“&lt;span class=&quot;code&quot;&gt;hello&lt;/span&gt;”&lt;/b&gt;.
            Then just now you mentally added a &lt;span class=&quot;data-type&quot;&gt;number&lt;/span&gt;, which you could do by typing &lt;span class=&quot;code&quot;&gt;var myvar = 34;&lt;/span&gt; and pressing enter.
        &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;left-bar&quot;&gt;
You can check what data type a variable is holding by using: &lt;span class=&quot;code&quot;&gt;typeof myvar;&lt;/span&gt; which will return either “&lt;span class=&quot;data-type&quot;&gt;string&lt;/span&gt;” or “&lt;span class=&quot;data-type&quot;&gt;number&lt;/span&gt;” (or a few others).
    &lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
In JavaScript, just like &lt;span class=&quot;data-type&quot;&gt;string&lt;/span&gt; and &lt;span class=&quot;data-type&quot;&gt;number&lt;/span&gt;, there are &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures&quot; target=&quot;kdcNewWinExt&quot;&gt;seven of these data types&lt;/a&gt;, and they&#39;re referred to as “&lt;b&gt;primitive data types&lt;/b&gt;”
        which just means the base objects themselves cannot be altered (for instance, the &lt;span class=&quot;data-type&quot;&gt;number&lt;/span&gt; 3 will always be the &lt;span class=&quot;data-type&quot;&gt;number&lt;/span&gt; 3,
        although your &lt;span class=&quot;code&quot;&gt;myvar&lt;/span&gt; reference to the &lt;span class=&quot;data-type&quot;&gt;number&lt;/span&gt; 3 may change).
    &lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
Alongside these seven primitive data types, there is the &lt;b&gt;“&lt;span class=&quot;data-type&quot;&gt;object&lt;/span&gt;” data type&lt;/b&gt;, which is the primary way that we—as developers—work with data.
        These objects can also be based on the seven primitive data types, and as a reference (variable assignment) to those primitive data types, their values &lt;i&gt;can be changed&lt;/i&gt;.
    &lt;/div&gt;
&lt;div class=&quot;imp-note&quot;&gt;
&lt;h2 align=&quot;center&quot;&gt;
An Important Note&lt;/h2&gt;
&lt;div align=&quot;center&quot;&gt;
When assigning a type of data to a variable—be it a &lt;span class=&quot;data-type&quot;&gt;string&lt;/span&gt;, &lt;span class=&quot;data-type&quot;&gt;number&lt;/span&gt;,
                or other—&lt;b&gt;it should never be changed to a different data type&lt;/b&gt;.
                If you initially assign &lt;span class=&quot;code&quot;&gt;var myvar = 3;&lt;/span&gt; you should
                not try to set it later in the code to be &lt;span class=&quot;code&quot;&gt;myvar = “3”;&lt;/span&gt;
                (which is a &lt;span class=&quot;data-type&quot;&gt;string&lt;/span&gt;—not a &lt;span class=&quot;data-type&quot;&gt;number&lt;/span&gt;).
        &lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
The Base&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Data is one of the underlying fundamentals consistent across every application.&lt;/li&gt;
&lt;li&gt;Variables allow us to handle that data.&lt;/li&gt;
&lt;li&gt;Data Types allow us to keep things organized.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
It&#39;s All About the Data&lt;/h2&gt;
&lt;h3&gt;
Understanding Data Types&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
&lt;b&gt;The basis for most things you do with data in JavaScript.&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
&lt;span class=&quot;code&quot;&gt;typeof&lt;/span&gt; =&amp;gt; &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures&quot;&gt;Data Types&lt;/a&gt; =&amp;gt; The types of data that are stored in variables.
    &lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
As your program grows, it will grow harder to keep track of all your variables.
        When you get code from other developers, it will grow harder to keep track of all your variables.
        With every new feature you add to your web app, it will grow harder to keep track of all your variables.
    &lt;/div&gt;
&lt;ul class=&quot;indent-05&quot;&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
            &lt;b&gt;To keep track of your variables, you need to be able to check them.&lt;/b&gt;
        &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
            You&#39;ll need to see what type of data is in them (if any), or if they even exist (i.e. &lt;i&gt;if they&#39;ve been created&lt;/i&gt;).
        &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
            Checking data types helps us control the flow of our data.
        &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;left-bar&quot;&gt;
&lt;u&gt;Important Note:&lt;/u&gt; There are two ways a variable comes into being, and we can check for those states.
        If the variable hasn&#39;t been created and doesn&#39;t exist at all, it is undeclared (and &lt;b&gt;will throw a Reference error&lt;/b&gt; in the browser).
        If the variable has been created but hasn&#39;t been assigned anything, it is &lt;span class=&quot;data-type&quot;&gt;undefined&lt;/span&gt; (which you can—and will—check for regularly).
    &lt;/div&gt;
&lt;ul class=&quot;indent-05&quot;&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
            &lt;b&gt;Declared:&lt;/b&gt; &lt;span class=&quot;code&quot;&gt;var myVar;&lt;/span&gt; // But &lt;b&gt;&#39;NOT defined&#39;&lt;/b&gt;.&lt;br /&gt;
        &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
            &lt;b&gt;Defined:&lt;/b&gt; &lt;span class=&quot;code&quot;&gt;myVar = &#39;&#39;;&lt;/span&gt; // The &lt;span class=&quot;code&quot;&gt;=&lt;/span&gt; assignment operator will assign a value and define the variable.
        &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;imp-note&quot; style=&quot;margin: 2rem auto; padding: 1.5rem 2rem;&quot;&gt;
&lt;i&gt;&lt;b&gt;This really is important stuff,&lt;/b&gt; I promise!&lt;/i&gt; If you&#39;re bored ... it will pass (or try accounting &lt;i&gt;(j/k!!)&lt;/i&gt;). This really is just the basics. You can&#39;t build the house until you learn to swing the hammer (and other cool sayings...) &lt;span class=&quot;data-type&quot;&gt; :) &lt;/span&gt;
    &lt;/div&gt;
&lt;h2&gt;
And without further ado...&lt;/h2&gt;
&lt;h3&gt;
Introducing... &lt;b&gt;&lt;i&gt;Your&lt;/i&gt; Data Types!&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
The &lt;span class=&quot;code&quot;&gt;typeof&lt;/span&gt; operator (or, &quot;command&quot;) will return &lt;b&gt;lowercase strings&lt;/b&gt; for each of the data types listed below.
        As &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof#Description&quot; target=&quot;kdcNewWinExt&quot;&gt;noted on MDN&lt;/a&gt;,
        these &lt;span class=&quot;code&quot;&gt;typeof&lt;/span&gt; return strings can be one of the following:
    &lt;/div&gt;
&lt;table class=&quot;indent-05 data-type-table&quot;&gt;
        &lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;span class=&quot;code&quot;&gt;typeof&lt;/span&gt;&lt;/th&gt;&lt;th&gt;Result&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
        &lt;tbody&gt;
&lt;tr class=&quot;text-bold&quot;&gt;&lt;td&gt;String&lt;/td&gt;&lt;td&gt;&quot;&lt;span class=&quot;&quot; data-type=&quot;&quot;&gt;string&lt;/span&gt;&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;text-bold&quot;&gt;&lt;td&gt;Number&lt;/td&gt;&lt;td&gt;&quot;&lt;span class=&quot;&quot; data-type=&quot;&quot;&gt;number&lt;/span&gt;&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;text-bold&quot;&gt;&lt;td&gt;Boolean&lt;/td&gt;&lt;td&gt;&quot;&lt;span class=&quot;&quot; data-type=&quot;&quot;&gt;boolean&lt;/span&gt;&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;text-bold&quot;&gt;&lt;td&gt;Undefined&lt;/td&gt;&lt;td&gt;&quot;&lt;span class=&quot;&quot; data-type=&quot;&quot;&gt;undefined&lt;/span&gt;&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Null&lt;/td&gt;&lt;td&gt;&quot;&lt;span class=&quot;&quot; data-type=&quot;&quot;&gt;object&lt;/span&gt;&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Function object&lt;/td&gt;&lt;td&gt;&quot;&lt;span class=&quot;&quot; data-type=&quot;&quot;&gt;function&lt;/span&gt;&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Symbol (new in ECMAScript 2015)&lt;/td&gt;&lt;td&gt;&quot;&lt;span class=&quot;&quot; data-type=&quot;&quot;&gt;symbol&lt;/span&gt;&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;BigInt (new in ECMAScript 2020)&lt;/td&gt;&lt;td&gt;&quot;&lt;span class=&quot;&quot; data-type=&quot;&quot;&gt;bigint&lt;/span&gt;&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;text-bold&quot;&gt;&lt;td&gt;Any other object&lt;/td&gt;&lt;td&gt;&quot;&lt;span class=&quot;&quot; data-type=&quot;&quot;&gt;object&lt;/span&gt;&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
    &lt;/table&gt;
&lt;h3&gt;
Some Clarity&lt;/h3&gt;
&lt;table class=&quot;indent-05&quot;&gt;
        &lt;tbody&gt;
&lt;tr&gt;
            &lt;td colspan=&quot;3&quot;&gt;&lt;span class=&quot;data-type text-bold&quot;&gt;Number&lt;/span&gt;, &lt;span class=&quot;data-type text-bold&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;data-type text-bold&quot;&gt;Boolean&lt;/span&gt;, &lt;span class=&quot;data-type text-bold&quot;&gt;Object&lt;/span&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td style=&quot;width: 100px;&quot;&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;ul style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        &lt;span class=&quot;code&quot;&gt;var = “string”; // &lt;span class=&quot;text-bold&quot;&gt;3, “3”, true|false, {}&lt;/span&gt;&lt;/span&gt;
                    &lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 100px;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;width: 100px;&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
            &lt;td colspan=&quot;3&quot; style=&quot;padding-top: 2rem;&quot;&gt;&lt;span class=&quot;data-type text-bold&quot;&gt;Undefined&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;ul style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        The check for `&lt;span class=&quot;code&quot;&gt;undefined&lt;/span&gt;` will check both the &#39;undeclared&#39; and &#39;undefined&#39; states (these two states were noted earlier).
                    &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        The `&lt;span class=&quot;code&quot;&gt;(typeof yourReference !== &#39;undefined&#39;)&lt;/span&gt;` condition is used quite a bit.
                    &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        &lt;u&gt;Note&lt;/u&gt;: `&lt;span class=&quot;code&quot;&gt;typeof&lt;/span&gt;` returns a lowercase &#39;&lt;span class=&quot;data-type&quot;&gt;string&lt;/span&gt;&#39; ^^^ for comparison.
                    &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;Example:&lt;br /&gt;
                        &lt;div class=&quot;indent-05i&quot;&gt;
&lt;span class=&quot;code indent-it&quot;&gt;if (typeof myVar !== &#39;undefined&#39;) {&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;code indent-05i&quot;&gt;   console.log(&#39;Nice! Variable is set.&#39;);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;code indent-ib&quot;&gt;}&lt;/span&gt;
                        &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 100px;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;width: 100px;&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
            &lt;td colspan=&quot;3&quot; style=&quot;padding-top: 2rem;&quot;&gt;&lt;span class=&quot;data-type text-bold&quot;&gt;Null&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;ul style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        Value of &lt;span class=&quot;code&quot;&gt;var&lt;/span&gt; set to &lt;i&gt;nothingness&lt;/i&gt; (some methods return &lt;span class=&quot;data-type&quot;&gt;null&lt;/span&gt;).
                    &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        To check for &lt;span class=&quot;data-type&quot;&gt;null&lt;/span&gt;, instead of &lt;span class=&quot;code&quot;&gt;typeof&lt;/span&gt;, use &lt;span class=&quot;code&quot;&gt;if (&lt;b&gt;myVar === null&lt;/b&gt;) { ... }&lt;/span&gt;.
                    &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        Due to legacy reasons, &lt;span class=&quot;code&quot;&gt;typeof null === &quot;object&quot;&lt;/span&gt;.
                    &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        Remember, &lt;span class=&quot;data-type&quot;&gt;null&lt;/span&gt; is not the same as &lt;span class=&quot;data-type&quot;&gt;undefined&lt;/span&gt; or empty (“”).
                    &lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 100px;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;width: 100px;&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
            &lt;td colspan=&quot;3&quot; style=&quot;padding-top: 2rem;&quot;&gt;&lt;span class=&quot;data-type&quot;&gt;Symbol&lt;/span&gt;, &lt;span class=&quot;data-type&quot;&gt;BigInt&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;ul style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        Advanced topics; Relatively new to JavaScript.
                    &lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 100px;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;width: 100px;&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
            &lt;td colspan=&quot;3&quot;&gt;&lt;h3&gt;
Don&#39;t change data types !!!&lt;/h3&gt;
&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;ul style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        In other words, &lt;i&gt;don&#39;t change a variable&#39;s data type&lt;/i&gt; &lt;b&gt;by placing &lt;u&gt;a new type of value&lt;/u&gt; in the variable&lt;/b&gt;.
                    &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        If a variable is a &quot;string&quot;, it &lt;b&gt;should always be a string!&lt;/b&gt;
                    &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
                        Coding Examples:
                        &lt;ul style=&quot;list-style-type: none; margin: 0; padding: 0;&quot;&gt;
&lt;li style=&quot;margin: 0; padding: 1rem 0;&quot;&gt;
                                &lt;div class=&quot;indent-05i&quot;&gt;
// This will work (in JavaScript), but is considered poor practice.&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;var myNumber = &quot;3&quot;;&lt;/span&gt; // Should instead set to just the Number 3&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;myNumber = 4;&lt;/span&gt;
                                &lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;background-color: rgb(215 , 255 , 235); margin: 0; padding: 1rem 0;&quot;&gt;
                                &lt;div class=&quot;indent-05i&quot;&gt;
&lt;b&gt;// Best practice!&lt;/b&gt;&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;var myNumber = 3;&lt;/span&gt; // Look ma&#39;, no quotes!&lt;br /&gt;
&lt;span class=&quot;code&quot;&gt;myNumber = 4;&lt;/span&gt; // A &quot;Number&quot; is a type of object like &quot;String&quot;.
                                &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
        &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;
To the Code!&lt;/h2&gt;
&lt;h3&gt;
Comparing ... Stuff&lt;/h3&gt;
&lt;div&gt;
Comparators &amp;lt; === &amp;gt; simply compare two data items. For example, &lt;span class=&quot;code&quot;&gt;3 == 3&lt;/span&gt; compares two 3s.&lt;/div&gt;
&lt;div&gt;
The biggest thing here to learn and remember is that there are two ways to compare data items.
        &lt;br /&gt;
&lt;ul style=&quot;max-width: 600px;&quot;&gt;
&lt;li style=&quot;margin: 1.5rem 0 0.5rem -1rem;&quot;&gt;
                &lt;b&gt;Compare the Values&lt;/b&gt; (between two variables) &lt;span class=&quot;code&quot;&gt;==&lt;/span&gt; and &lt;span class=&quot;code&quot;&gt;!=&lt;/span&gt;&lt;br /&gt;
                Use 2 character signs to just compare the values.&lt;br /&gt;
                &lt;span class=&quot;code&quot;&gt;3 == &#39;3&#39;&lt;/span&gt; === true.
            &lt;/li&gt;
&lt;li style=&quot;margin: 2rem 0 0.5rem -1rem;&quot;&gt;
                &lt;b&gt;Compare the Values &lt;u&gt;AND&lt;/u&gt; the Data Types&lt;/b&gt; &lt;span class=&quot;code&quot;&gt;===&lt;/span&gt; and &lt;span class=&quot;code&quot;&gt;!==&lt;/span&gt;&lt;br /&gt;
                Use 3 character signs to compare the values &lt;u&gt;AND&lt;/u&gt; the data types.&lt;br /&gt;
                &lt;span class=&quot;code&quot;&gt;3 === &#39;3&#39;&lt;/span&gt; === false because one is a &lt;span class=&quot;data-type&quot;&gt;number&lt;/span&gt; and one is a &lt;span class=&quot;data-type&quot;&gt;string&lt;/span&gt;.
            &lt;/li&gt;
&lt;li style=&quot;margin: 2rem 0 0.5rem -1rem;&quot;&gt;Best practice is to &lt;span class=&quot;text-bold&quot;&gt;always use &lt;span class=&quot;code&quot;&gt;===&lt;/span&gt;&lt;/span&gt; (especially being that variables should never change what &#39;&lt;span class=&quot;data-type&quot;&gt;type&lt;/span&gt;&#39; of values they hold).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;table style=&quot;border-radius: 10px; border-spacing: 0.5rem; border: 1px dashed green; margin: 1rem 0 1rem 2rem; max-width: 600px; padding: 0.5rem; width: 80%;&quot;&gt;
        &lt;tbody&gt;
&lt;tr&gt;
            &lt;td&gt;Common algebra comparison operators.&lt;/td&gt;
            &lt;td style=&quot;text-align: center; width: 10%;&quot;&gt;&lt;span class=&quot;code&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;
            &lt;/td&gt;
            &lt;td style=&quot;text-align: center; width: 10%;&quot;&gt;&lt;span class=&quot;code&quot;&gt;&amp;lt;=&lt;/span&gt;&amp;nbsp;
            &lt;/td&gt;
            &lt;td style=&quot;width: 10%;&quot;&gt;&lt;span class=&quot;code&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;
            &lt;/td&gt;
            &lt;td style=&quot;width: 10%;&quot;&gt;&lt;span class=&quot;code&quot;&gt;&amp;gt;=&lt;/span&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;span class=&quot;code&quot;&gt;Check for value only&lt;/span&gt;&lt;/td&gt;
            &lt;td style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;code&quot;&gt;==&lt;/span&gt;
            &lt;/td&gt;
            &lt;td style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;code&quot;&gt;&lt;b&gt;!=&lt;/b&gt;&lt;/span&gt;
            &lt;/td&gt;
            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;span class=&quot;code&quot;&gt;Check value &lt;b&gt;&lt;u&gt;and&lt;/u&gt; data type&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
            &lt;td style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;code&quot;&gt;===&lt;/span&gt;
            &lt;/td&gt;
            &lt;td style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;code&quot;&gt;&lt;b&gt;!==&lt;/b&gt;&lt;/span&gt;
            &lt;/td&gt;
            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;
        &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;
Coding Styles; Standards vs. Preferences&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
As you learn to code, you will quickly find there are many ways to do things. These &#39;options&#39; can at times lead to industry standards, while others lead more to personal preferences.
        Additionally, different industries may have different coding styles.
    &lt;/div&gt;
&lt;div class=&quot;imp-note&quot; style=&quot;margin: 2rem auto; padding: 1.5rem 2rem;&quot;&gt;
Best practices can at times be subjective; choose your preference.
        But! &lt;b&gt;Be able to code in the style of the project you&#39;re working in.&lt;/b&gt;
    &lt;/div&gt;
&lt;h4&gt;
Optional: Curly Braces (grouping bits of code)&lt;/h4&gt;
&lt;div class=&quot;left-bar&quot;&gt;
When using various features of JavaScript, many times you will be provided &lt;b&gt;an option&lt;/b&gt; to wrap your code with
        &lt;span class=&quot;code text-bold&quot; style=&quot;background-color: yellow; color: red; padding: 0.25rem;&quot;&gt;{&lt;/span&gt; curly braces &lt;span class=&quot;code text-bold&quot; style=&quot;background-color: yellow; color: red; padding: 0.25rem;&quot;&gt;}&lt;/span&gt;.
        When you come across these &lt;i&gt;optional braces&lt;/i&gt;... Best practice is to &lt;span class=&quot;text-bold&quot;&gt;&quot;always&quot; wrap your statements with curly braces&lt;/span&gt;.
    &lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
For example, not using them for statements that only have one line (one ... &quot;event to run&quot;) is optional.
        However, &lt;span class=&quot;text-bold&quot;&gt;consistency would dictate&lt;/span&gt;—because you have to use them when you have two or more lines of code to run—&lt;span class=&quot;text-bold&quot;&gt;they should always be used.&lt;/span&gt;
    &lt;/div&gt;
&lt;ul style=&quot;list-style-type: none;&quot;&gt;
&lt;li style=&quot;margin: 0; padding: 1rem 0 0;&quot;&gt;
            Coding Examples:
        &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 1rem 0;&quot;&gt;
            &lt;div class=&quot;indent-05i&quot;&gt;
// This will work, and some developers prefer this.&lt;br /&gt;
&lt;span class=&quot;code indent-it&quot;&gt;if (alwaysWrapWithBraces === true) &lt;span style=&quot;color: red; outline: 2px solid red; padding: 0.25rem;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;code indent-05i&quot;&gt;   console.log(&quot;One-liners should be wrapped up for consistency.&quot;);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;code indent-ib&quot;&gt;&lt;span style=&quot;color: red; outline: 2px solid red; padding: 0.25rem;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;background-color: rgb(215 , 255 , 235); margin: 0; padding: 1rem 0;&quot;&gt;
            &lt;div class=&quot;indent-05i&quot;&gt;
&lt;b&gt;// Best practice (subjective)&lt;/b&gt;&lt;br /&gt;
&lt;span class=&quot;code indent-it&quot;&gt;if (alwaysWrapWithBraces === true) &lt;span style=&quot;background-color: yellow; color: red; padding: 0.25rem;&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;code indent-05i&quot;&gt;   console.log(&quot;Consistency is a valued trait in web development.&quot;);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;code indent-ib&quot;&gt;&lt;span style=&quot;background-color: yellow; color: red; padding: 0.25rem;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Optional: Semicolons&lt;/h4&gt;
&lt;div&gt;
Same holds true for &lt;b&gt;semicolons&lt;/b&gt;at the end of a line&lt;b&gt;;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
They are optional, but because there are some &lt;a class=&quot;text-bold&quot; href=&quot;https://www.freecodecamp.org/news/codebyte-why-are-explicit-semicolons-important-in-javascript-49550bea0b82/&quot; target=&quot;kdcNewWinExt&quot;&gt;gotchas&lt;/a&gt; you have to watch out for,
        and for which &lt;b&gt;merely introduce more potential entry points for bugs&lt;/b&gt;, as with the argument for curly braces, &lt;b&gt;it&#39;s best to just always include them.&lt;/b&gt;&lt;/div&gt;
&lt;h3&gt;
Parentheses Matter!&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
In programming, when you need a couple things to &lt;b&gt;happen at the same time&lt;/b&gt;—just like with algebra priorities of Addition, Subtration, Multiplication, etc. (PE(MD(AS)))—
        there are times when you need to &lt;b&gt;tell the browser in which order things need to be done.&lt;/b&gt;
    &lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
Such a time in development would be when performing actual math calculations, or sometimes when performing other operations as well.
    &lt;/div&gt;
&lt;div class=&quot;indent-05&quot;&gt;
&lt;i&gt;For these examples&lt;/i&gt;, understand that &lt;span class=&quot;code&quot;&gt;Math.random()&lt;/span&gt;
        &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random&quot; target=&quot;kdcNewWinExt&quot;&gt;returns a floating-point, pseudo-random number in the range 0–1 (inclusive of 0, but not 1)&lt;/a&gt;.
        Ergo,&lt;br /&gt;
&lt;div class=&quot;indent-05&quot;&gt;
&lt;span class=&quot;no-wrap&quot;&gt;&lt;span class=&quot;code&quot;&gt;Math.random()&lt;/span&gt; &amp;lt;= &lt;b&gt;0.999999999999999999&lt;/b&gt;&lt;/span&gt; and&lt;br /&gt;
&lt;span class=&quot;no-wrap&quot;&gt;&lt;span class=&quot;code&quot;&gt;Math.random()*2&lt;/span&gt; &amp;lt;= &lt;b&gt;1.9999999999999999&lt;/b&gt;&lt;/span&gt;
        &lt;/div&gt;
&lt;table style=&quot;border-spacing: 0.5rem 0.2rem;&quot;&gt;
            &lt;thead&gt;
&lt;tr&gt;
                    &lt;th&gt;Parentheses Placement&lt;/th&gt;
                    &lt;th&gt;Possible&lt;br /&gt;
Values&lt;/th&gt;
                &lt;/tr&gt;
&lt;/thead&gt;
            &lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;span class=&quot;mask&quot;&gt;Math.floor(&lt;/span&gt;Math.random() * 2 - 1&lt;span class=&quot;mask&quot;&gt;)&lt;/span&gt;&lt;/td&gt;
                    &lt;td class=&quot;code-td-right no-wrap&quot;&gt;&lt;b&gt;// -1 – 0&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;span class=&quot;mask&quot;&gt;Math.floor(&lt;/span&gt;Math.random() * (2 - 1)&lt;span class=&quot;mask&quot;&gt;)&lt;/span&gt;&lt;/td&gt;
                    &lt;td class=&quot;code-td-right no-wrap&quot;&gt;&lt;b&gt;// 1&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;span class=&quot;mask&quot;&gt;Math.floor(&lt;/span&gt;Math.random() * (3 - 1)&lt;span class=&quot;mask&quot;&gt;)&lt;/span&gt;&lt;/td&gt;
                    &lt;td class=&quot;code-td-right no-wrap&quot;&gt;&lt;b&gt;// 0 – 1&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;span class=&quot;mask&quot;&gt;Math.floor(&lt;/span&gt;Math.random() * (3 - 1) + 1&lt;span class=&quot;mask&quot;&gt;)&lt;/span&gt;&lt;/td&gt;
                    &lt;td class=&quot;code-td-right no-wrap&quot;&gt;&lt;b&gt;// 1 – 2&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;span class=&quot;mask&quot;&gt;Math.floor(&lt;/span&gt;Math.random() * 3&lt;span class=&quot;mask&quot;&gt;)&lt;/span&gt;&lt;/td&gt;
                    &lt;td class=&quot;code-td-right no-wrap&quot;&gt;&lt;b&gt;// 0 – 2&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
        &lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
Your best approach when coding things of this nature is to &lt;b&gt;know what your expected output should be.&lt;/b&gt; Then you can &lt;b&gt;perform testing based on your expected output.&lt;/b&gt;
    &lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
For breaking down more complex math problems, you can also try an online calculator such as the &quot;Equation Calculator&quot; I shared in &lt;a href=&quot;https://kdcinfo.blogspot.com/2019/10/solve-for-x-with-equation-calculator.html&quot; target=&quot;kdcNewWinInt&quot;&gt;Oct 2019, &quot;Solve for &#39;x&#39; with the Equation Calculator&quot;&lt;/a&gt;.
    &lt;/div&gt;
&lt;h2&gt;
Miscellaneous Tidbits&lt;/h2&gt;
&lt;div class=&quot;left-bar&quot;&gt;
As you progress in your early learning, the following tidbits of advice should help advance your fundamental understanding of certain things that often go unsaid.&lt;/div&gt;
&lt;h3&gt;
Naming Conventions&lt;/h3&gt;
&lt;ul class=&quot;indent-05&quot;&gt;
&lt;li style=&quot;margin: 0; padding: 0.5rem 0 0;&quot;&gt;
            &lt;span class=&quot;text-bold&quot;&gt;HTML &amp;lt;tags&amp;gt;&amp;lt;/tags&amp;gt;:&lt;/span&gt; The general concensus is that &lt;span class=&quot;code&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt; tags are &quot;almost always&quot; lowercase.
            However—technically—&lt;b&gt;it doesn&#39;t matter.&lt;/b&gt; &lt;span class=&quot;text-bold&quot;&gt;But!&lt;/span&gt; I look at my code from 2005 and it&#39;s &amp;lt;YELLING AT ME&amp;gt;!
            I&#39;ve preferred lowercase ever since that JUMPED out at me one day.
            &lt;span class=&quot;code&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt; is a good exception to this rule.
        &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 1.5rem 0 0;&quot;&gt;
            &lt;span class=&quot;text-bold&quot;&gt;HTML ID attributes&lt;/span&gt; should simply avoid using &lt;b&gt;kebab-case&lt;/b&gt;, and instead use either &lt;b&gt;camelCase&lt;/b&gt; or &lt;b&gt;PascalCase&lt;/b&gt;.
            After many years of seeing differently, this took some major thought adjustment, but my IDs from here-on-out will be &lt;b&gt;PascalCase&lt;/b&gt; (aka, TitleCase).
        &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 1.5rem 0 0;&quot;&gt;
            &lt;span class=&quot;text-bold&quot;&gt;CSS &lt;span class=&quot;code&quot;&gt;.class-names&lt;/span&gt;&lt;/span&gt; should be written and named using &lt;b&gt;kebab-case&lt;/b&gt; (all-lowercase-with-hyphens).
        &lt;/li&gt;
&lt;li style=&quot;margin: 0; padding: 1.5rem 0 0;&quot;&gt;
            &lt;span class=&quot;text-bold&quot;&gt;JavaScript &lt;span class=&quot;code&quot;&gt;variable&lt;/span&gt; and &lt;span class=&quot;code&quot;&gt;function&lt;/span&gt; names&lt;/span&gt; should be written and named using &lt;b&gt;camelCase&lt;/b&gt; (not to be confused with &lt;b&gt;TitleCase&lt;/b&gt; (or &lt;b&gt;PascalCase&lt;/b&gt;)).
        &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Comments are Public&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
HTML, CSS, and JavaScript code &lt;b&gt;comments can be seen by anyone&lt;/b&gt; who can view your web page.
        Comments are hidden from the browser&#39;s &quot;viewing&quot; page, but the comments are still accessible if you view the page source (Ctrl|Cmd-U) or explore in your browser&#39;s Developer Tools.
    &lt;/div&gt;
&lt;div class=&quot;indent-05&quot;&gt;
&lt;span class=&quot;text-bold&quot;&gt;Do NOT put sensitive or similar information in comments.&lt;/span&gt;
        &lt;/div&gt;
&lt;h3&gt;
&amp;lt;u&amp;gt;&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
The &lt;span class=&quot;code&quot;&gt;&amp;lt;u&amp;gt;&lt;/span&gt; tag is fine to use in some cases;
        especially if the site&#39;s &lt;span style=&quot;border: 1px dashed purple;&quot;&gt;&amp;lt;a&amp;gt;&lt;/span&gt; link styles are &lt;span style=&quot;border: 1px dashed purple;&quot;&gt;emphasized&lt;/span&gt; in some manner
        so as not be confused with the &lt;u&gt;standard &amp;lt;u&amp;gt; underline&lt;/u&gt;.
        Understand the context in which you&#39;re working in.
        Be aware of your development environment and a site&#39;s own coding styles.
    &lt;/div&gt;
&lt;h3&gt;
Copy/Paste&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
Pasting into Notepad is a nice trick for removing certain hidden characters that hitch a ride when copying sections of data from the internet or various documents (especially with code).
        Unfortunately it will not &quot;always&quot; remove all hidden characters.
        If problems with a certain section of text in your code persists and is proving challenging,
        you can also try pasting into a Word Processor, most of which provide the option to &quot;show hidden characters.&quot;
    &lt;/div&gt;
&lt;div class=&quot;indent-05&quot;&gt;
A couple approaches I use when I paste things into anywhere—and then begin experiencing issues— (indicating it was due to the paste):
        &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Delete a chunk of the pasted information, test to see if the issue is still there, then &#39;undo&#39; the delete. Repeat until the error goes away, and narrow it down.&lt;/li&gt;
&lt;li&gt;When you use you left-right arrow keys to scroll through text, you&#39;ll see the cursor scroll happily along.
                Hidden characters, however, will cause the cursor to &#39;skip a beat&#39; as it &#39;goes over&#39; the hidden character.
                When you see this skip happen, you know there&#39;s something in there, and you can trim it out.
            &lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;h3&gt;
Block vs. Inline vs. Inline-Block Elements&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
&lt;span class=&quot;code&quot;&gt;DIV&lt;/span&gt;s and &lt;span class=&quot;code&quot;&gt;SPAN&lt;/span&gt;s&lt;br /&gt;
&lt;h4&gt;
Understanding &quot;block&quot; vs. &quot;inline&quot; vs. &quot;inline-block&quot; elements is crucial to front-end web development.&lt;/h4&gt;
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements&quot; target=&quot;kdcNewWinExt&quot;&gt;MDN has already done an excellent job of explaining these concepts.&lt;/a&gt;
    &lt;/div&gt;
&lt;div class=&quot;indent-05&quot;&gt;
Spending one to two days digging deep into these will allow you to better comprehend some even more powerful features
            such as &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Layout_mode&quot; target=&quot;kdcNewWinExt&quot;&gt;Layout mode&lt;/a&gt;, Flexbox, and CSS Grid.
        &lt;/div&gt;
&lt;h3&gt;
Padding, Margin&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
It is extremely crucial to learn these, and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block&quot; target=&quot;kdcNewWinExt&quot;&gt;no one explains it like MDN!&lt;/a&gt;
    &lt;/div&gt;
&lt;h3&gt;
Border; Outline&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/border&quot; target=&quot;kdcNewWinExt&quot;&gt;According to MDN&lt;/a&gt;,

        &lt;br /&gt;
&lt;div class=&quot;indent-05&quot;&gt;
Borders and outlines are very similar. However, outlines differ from borders in the following ways:
            &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Outlines never take up space, as they are drawn outside of an element&#39;s content.&lt;/li&gt;
&lt;li&gt;According to the spec, outlines don&#39;t have to be rectangular, although they usually are.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul class=&quot;left-bar&quot;&gt;
&lt;li style=&quot;margin-bottom: 1rem;&quot;&gt;A &lt;span class=&quot;code&quot;&gt;`border: 5px solid red;`&lt;/span&gt; will visibly move/shift adjacent content.&lt;/li&gt;
&lt;li&gt;An &lt;span class=&quot;code&quot;&gt;`outline: 5px solid red;`&lt;/span&gt; is more of an overlay and will not affect the contents.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
New HTML Element Types: YMMV (your miles may vary)&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
Check compatibility charts regularly for target audience browser support.
        The MDN docs should be required reading (or at least required skimming).
        &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en/docs/Web/HTML&quot; target=&quot;kdcNewWinExt&quot;&gt;MDN HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en/docs/Web/CSS&quot; target=&quot;kdcNewWinExt&quot;&gt;MDN CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en/docs/Web/JavaScript&quot; target=&quot;kdcNewWinExt&quot;&gt;MDN JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caniuse.com/&quot; target=&quot;kdcNewWinExt&quot;&gt;Can I use...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
Every feature has its own chart. MDN especially includes notes on limitations of use, and all the charts usually include mobile browser support.
    &lt;/div&gt;
&lt;div class=&quot;indent-05&quot;&gt;
As you grow with JavaScript, MDN and StackOverflow will typically become your primary go-tos.
            Although MDN may appear to be more cryptic early on, you will become more comfortable with it as you progress.
        &lt;/div&gt;
&lt;h3&gt;
Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;HTML Validation | &lt;a href=&quot;https://validator.w3.org/&quot; target=&quot;kdcNewWinExt&quot;&gt;https://validator.w3.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CSS Validation | &lt;a href=&quot;http://jigsaw.w3.org/css-validator/&quot; target=&quot;kdcNewWinExt&quot;&gt;http://jigsaw.w3.org/css-validator/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Cheat Sheets&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;HTML5 cheat sheet | &lt;a href=&quot;https://websitesetup.org/html5-cheat-sheet/&quot; target=&quot;kdcNewWinExt&quot;&gt;https://websitesetup.org/html5-cheat-sheet/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Windows keyboard shortcuts | &lt;a href=&quot;https://www.google.com/search?q=windows+keystrokes&quot; target=&quot;kdcNewWinExt&quot;&gt;https://www.google.com/search?q=windows+keystrokes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
A few common locations for project files&lt;/h3&gt;
&lt;table&gt;
        &lt;tbody&gt;
&lt;tr&gt;
            &lt;td colspan=&quot;2&quot;&gt;Local:&lt;/td&gt;
            &lt;td style=&quot;border-bottom: 1px dotted maroon;&quot;&gt;&lt;b&gt;Location on Computer/Drive&lt;/b&gt;&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td style=&quot;width: 100px;&quot;&gt;&lt;/td&gt;
            &lt;td style=&quot;width: 125px;&quot;&gt;Windows&lt;/td&gt;
            &lt;td&gt;[Desktop, My Documents, etc.]&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Mac&lt;/td&gt;
            &lt;td&gt;[Desktop, Documents, etc.]&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Linux&lt;/td&gt;
            &lt;td&gt;[/var/www/html/]&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;3&quot;&gt;Remote:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;https://github.com/&quot; target=&quot;kdcNewWinExt&quot;&gt;GitHub&lt;/a&gt;&lt;/td&gt;
            &lt;td style=&quot;border-top: 1px dotted maroon;&quot;&gt;Provides &lt;u&gt;free public repositories&lt;/u&gt;&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
                &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;
                &lt;td&gt;A &quot;repository&quot; is a virtual folder that stores your project&#39;s files.
                    You can have multiple repositories; each with its own project files.
                &lt;/td&gt;
            &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;https://gist.github.com/&quot; target=&quot;kdcNewWinExt&quot;&gt;GitHub Gists&lt;/a&gt;&lt;/td&gt;
            &lt;td style=&quot;border-top: 1px dotted maroon;&quot;&gt;More for &lt;b&gt;code snippets&lt;/b&gt;&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;https://bitbucket.org/&quot; target=&quot;kdcNewWinExt&quot;&gt;BitBucket&lt;/a&gt;&lt;/td&gt;
            &lt;td style=&quot;border-top: 1px dotted maroon;&quot;&gt;Like GitHub, but isntead of free public repositories, BitBucket provides &lt;u&gt;free private repositories&lt;/u&gt;&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;https://codepen.com/&quot; target=&quot;kdcNewWinExt&quot;&gt;CodePen&lt;/a&gt;&lt;/td&gt;
            &lt;td style=&quot;border-top: 1px dotted maroon;&quot;&gt;Free online text editor with live preview pane&lt;/td&gt;
        &lt;/tr&gt;
&lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td colspan=&quot;2&quot; style=&quot;border-top: 1px dotted maroon;&quot;&gt;Others...&lt;/td&gt;
        &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;
The #1 essential tip for progressing your skills&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
&lt;span class=&quot;text-bold&quot;&gt;Little, Tiny, Side Projects&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;imp-note&quot; style=&quot;margin: 2rem auto; padding: 1.5rem 2rem;&quot;&gt;
Familiarity through repetition is a big part of the initial learning curve.
    &lt;/div&gt;
&lt;div class=&quot;left-bar&quot;&gt;
Make yourself a list of &quot;things&quot; you can create... perhaps some that might benefit your own work or study habits.
        The more little projects you challenge yourself to do, the more &#39;life training badges&#39; you&#39;ll garner.
    &lt;/div&gt;
&lt;div class=&quot;indent-05&quot;&gt;
If you can build yourself any little &quot;thing&quot; that does something with HTML, CSS, and JavaScript, you&#39;ll have created a miracle. Build on it from there.
        &lt;/div&gt;
&lt;h3&gt;
Acronysms&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
You may come across the acronym &lt;span class=&quot;code&quot;&gt;a11y&lt;/span&gt;; which refers to the word &quot;Accessibility,&quot; which begins with an &lt;span class=&quot;code&quot;&gt;A&lt;/span&gt;, followed by 11 characters and ending in a &quot;&lt;span class=&quot;code&quot;&gt;y&lt;/span&gt;.&quot;
    &lt;/div&gt;
&lt;div class=&quot;indent-05&quot;&gt;
You will also come across this with i18n for internationalization (coding for other languages).&lt;/div&gt;
&lt;div class=&quot;indent-05&quot;&gt;
These types of &quot;acronysms&quot; are explained here: &lt;a href=&quot;https://en.wikipedia.org/wiki/Acronym&quot;&gt;https://en.wikipedia.org/wiki/Acronym#Other_conventions&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;indent-05&quot;&gt;
FYI: &quot;acronysms&quot; is a made-up word; although there are 17k Google results. I enjoy research. :D&lt;/div&gt;
&lt;h2&gt;
Learning Resources&lt;/h2&gt;
&lt;div class=&quot;imp-note&quot;&gt;
&lt;span class=&quot;text-bold&quot;&gt;One of the best coding walkthrough and &lt;span class=&quot;no-wrap&quot;&gt;challenge sites for learning.&lt;/span&gt;&lt;/span&gt;
        &lt;br /&gt;
&lt;div&gt;
&lt;b&gt;f&lt;/b&gt;ree &lt;b&gt;C&lt;/b&gt;ode &lt;b&gt;C&lt;/b&gt;amp.org&lt;br /&gt;
&lt;a href=&quot;https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/basic-javascript&quot;&gt;Good simple, progressive, code exercises&lt;/a&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
Additional Learning Resources.&lt;/h3&gt;
&lt;div class=&quot;left-bar&quot;&gt;
&lt;div class=&quot;indent-05&quot;&gt;
Good base for code style: &lt;a href=&quot;http://www.w3schools.com/js/default.asp&quot;&gt;W3School JavaScript Tutorial&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;indent-05&quot;&gt;
Deeper base for code style: &lt;a href=&quot;http://www.w3schools.com/js/js_conventions.asp&quot;&gt;W3School JavaScript Style Guide and Coding Conventions&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;
Brought to you by&lt;/h2&gt;
&lt;div class=&quot;left-bar&quot; style=&quot;padding-bottom: 3rem;&quot;&gt;
&lt;br /&gt;
Keith D Commiskey @ 2020-01-18&lt;br /&gt;
Lifetime Web Developer&lt;br /&gt;
&lt;a href=&quot;https://keithdc.com/&quot; target=&quot;kdcNewWinInt&quot;&gt;https://keithdc.com/&lt;/a&gt;
    &lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: white; border-radius: 5px; border: 1px solid blue; bottom: 0.5rem; margin: 0; padding: 0.75rem; right: 0.5rem;&quot; type=&quot;footer&quot;&gt;
&lt;a href=&quot;https://keithdc.com/&quot; target=&quot;kdcNewWinInt&quot;&gt;2020-01-18&lt;/a&gt; | &lt;a href=&quot;https://keithdc.com/&quot; target=&quot;kdcNewWinInt&quot;&gt;KeithDC&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/8991198027973761706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/javascript-informational-best-of-basics.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/8991198027973761706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/8991198027973761706'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/javascript-informational-best-of-basics.html' title='JavaScript Informational: Best of the Basics'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-434535350902687799</id><published>2020-01-16T14:10:00.001-08:00</published><updated>2020-01-19T14:23:01.646-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript developer"/><category scheme="http://www.blogger.com/atom/ns#" term="js"/><title type='text'>Popular Development Tags: Starting 2020</title><content type='html'>&lt;h1&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Popular Development Tags: Stack Overflow&lt;/span&gt;&lt;/h1&gt;
&lt;h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Starting off the year 2020&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Below are the results for the &lt;a href=&quot;https://stackoverflow.com/tags&quot; target=&quot;kdcExtWin&quot;&gt;most popular tags on Stack Overflow&lt;/a&gt; beginning the year 2020.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;style&gt;td { padding: 0.5rem; }&lt;/style&gt;

&lt;br /&gt;
&lt;table style=&quot;border-spacing: 1rem 0.5rem; border: 2px solid green; margin: 1rem auto; min-width: 500px; width: 95%;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;javascript&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;1,931,524&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;845 asked today, 4835 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;java&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;1,626,006&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;585 asked today, 3235 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;c#&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;1,373,811&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;453 asked today, 2427 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;php&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;1,327,017&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;324 asked today, 2107 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;python&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;1,326,607&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;1073 asked today, 6290 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;android&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;1,245,015&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;369 asked today, 2209 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;jquery&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;974,371&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;136 asked today, 862 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;html&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;961,389&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;331 asked today, 1954 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;c++&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;650,668&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;210 asked today, 1251 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;css&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;643,527&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;213 asked today, 1263 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;ios&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;618,621&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;178 asked today, 897 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px dotted green; font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;mysql&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px dotted green;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;583,152&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;159 asked today, 999 this week&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;verdana&amp;quot; , sans-serif;&quot;&gt;Posted: 2020-01-16 by: &lt;a href=&quot;https://keithdc.com/&quot;&gt;Keith D Commiskey&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/434535350902687799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/popular-development-tags-starting-2020.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/434535350902687799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/434535350902687799'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/popular-development-tags-starting-2020.html' title='Popular Development Tags: Starting 2020'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-4951050931921344163</id><published>2020-01-16T04:43:00.002-08:00</published><updated>2020-01-19T14:23:38.312-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript developer"/><category scheme="http://www.blogger.com/atom/ns#" term="js"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="sql"/><title type='text'>There&#39;s code in my ... code! A common experience?</title><content type='html'>After writing about 500 initial lines of code in designing a database schema for a web app, I realized I&#39;d gone and added 150 lines of JavaScript code—for handling 30 lines of JSON data I&#39;d written above that—all directly in my `.sql` file.&lt;br /&gt;
&lt;br /&gt;
I often create new &#39;untitled&#39; documents for temporary storage, but was curious if others might find themselves writing something completely different smack in the middle of their source? Productive tangents?&lt;br /&gt;
&lt;br /&gt;
I subsequently relocated the code into its own private `HTML` file, where it can now actually be tested to see if the code runs and all...&lt;br /&gt;
&lt;br /&gt;
Keith D Commiskey&lt;br /&gt;
&lt;a href=&quot;https://keithdc.com/&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;--Update--&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The code took a few adjustments, but was able to run as intended. I stripped it out six hours later and streamlined the entire approach, although I wouldn&#39;t have found that streamlined approach had I not gone through the pain of initially overthinking it. I will blog the resulting coding tool within a couple days (hint: it&#39;s on &lt;a href=&quot;https://codepen.io/KeithDC/&quot; target=&quot;_blank&quot;&gt;CodePen&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/4951050931921344163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/theres-code-in-my-code-common-experience.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/4951050931921344163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/4951050931921344163'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/theres-code-in-my-code-common-experience.html' title='There&#39;s code in my ... code! A common experience?'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-2177855635670628754</id><published>2020-01-14T04:34:00.001-08:00</published><updated>2021-09-29T00:51:07.561-07:00</updated><title type='text'>Instructing My First Tutoring Course [2019 Sep-Oct]</title><content type='html'>&lt;div class=&quot;intro&quot; style=&quot;line-height: 1.6;&quot;&gt;
&lt;b&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;The results of teaching my first tutoring course:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b style=&quot;font-family: &amp;quot;helvetica neue&amp;quot;, arial, helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b style=&quot;font-family: &amp;quot;helvetica neue&amp;quot;, arial, helvetica, sans-serif;&quot;&gt;Background:&lt;/b&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt; I took on teaching this class less than two weeks prior to the class starting. I had never taken the course before. I had never formerly taught a class before. The only thing that caught me up was the second week in my correcting some misleading coding standards.&lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;I believe the end results (and comments) sum up a lot about me. &lt;/span&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;color: cyan;&quot;&gt;I start out good&lt;/span&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;, &lt;/span&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;color: red;&quot;&gt;I take a slump&lt;/span&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt; (a learning curve to thoroughness), and &lt;/span&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;color: green;&quot;&gt;&lt;b&gt;I come roaring back&lt;/b&gt;&lt;/span&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt; to finish out the last half of the project with zest, and a much better comprehension of the entire situation (...&lt;/span&gt;&lt;i style=&quot;font-family: &amp;quot;helvetica neue&amp;quot;, arial, helvetica, sans-serif;&quot;&gt;and accounting for curriculum adjustments&lt;/i&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;).&lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;All in all, I believe—and hope—the students learned something, and if they continue to pursue web development, I hope their learning experience has helped them in their efforts.&lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;Keith D Commiskey&lt;/span&gt;&lt;a href=&quot;https://keithdc.com/&quot; style=&quot;cursor: pointer; font-family: &amp;quot;helvetica neue&amp;quot;, arial, helvetica, sans-serif;&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-Bbc-np7wH-0/Xh23ksf4gUI/AAAAAAAAay4/Lj3l3MhThM0KFRwm7MhYHoOWoyX0-uU_QCLcBGAsYHQ/s1600/reno-collective.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;759&quot; data-original-width=&quot;1012&quot; height=&quot;240&quot; src=&quot;https://1.bp.blogspot.com/-Bbc-np7wH-0/Xh23ksf4gUI/AAAAAAAAay4/Lj3l3MhThM0KFRwm7MhYHoOWoyX0-uU_QCLcBGAsYHQ/s320/reno-collective.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;h3&gt;
&lt;b&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;COURSE DELIVERIES&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;item-inner&quot; style=&quot;line-height: 1.6;&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;h4 style=&quot;font-weight: bold;&quot;&gt;
            &lt;span class=&quot;href&quot; face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;HTML, CSS and JavaScript in Reno&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;span class=&quot;href&quot; face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;From September 9th, 2019 to October 5th, 2019&lt;br /&gt;Saturday workshops from 9am to 1pm&lt;br /&gt;Reno Collective (1515 Plumas St)&lt;br /&gt;You &lt;b&gt;CONFIRMED&lt;/b&gt; teaching this course on September 3rd
                            (&lt;span class=&quot;href&quot;&gt;change&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;h3&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;
                            &lt;b&gt;COURSE DETAILS&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;div&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&lt;b&gt;HTML, CSS and JavaScript&lt;/b&gt; | Monday Sep 9th to Saturday Oct 5th
                            &lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&lt;b&gt;Instructor:&lt;/b&gt; &lt;span class=&quot;href&quot;&gt;Keith Commiskey&lt;/span&gt;
                            &lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&lt;b&gt;Student Group:&lt;/b&gt; RENO-2019-08
                            &lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&lt;b&gt;Workshops:&lt;/b&gt; Reno Collective &lt;span class=&quot;href&quot;&gt; | 1515 Plumas St&lt;/span&gt; | Saturday from 9am to 1pm
                            &lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&lt;b&gt;Total number of students enrolled:&lt;/b&gt; 4
                            &lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&lt;b&gt;Weekly Completions:&lt;/b&gt;
                            &lt;span style=&quot;color: green;&quot;&gt;&lt;b&gt;4&lt;/b&gt; (0 missing)&lt;/span&gt;
                            &lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;3&lt;/b&gt; (1 missing)&lt;/span&gt;
                            &lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;3&lt;/b&gt; (1 missing)&lt;/span&gt;
                            &lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;3&lt;/b&gt; (1 missing)&lt;/span&gt;
                            &lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&lt;b&gt;Weekly Rating:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;
&lt;li&gt;Wk 1:&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;&lt;b&gt;4.25&lt;/b&gt;&lt;/span&gt;
                            (4 responses)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Wk 2:&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;3.8&lt;/b&gt;&lt;/span&gt;
                            (5 responses)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Wk 3:&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;&lt;b&gt;5&lt;/b&gt;&lt;/span&gt;
                            (3 responses)&lt;/li&gt;
&lt;li&gt;Wk 4:&amp;nbsp;&lt;span style=&quot;color: green;&quot;&gt;&lt;b&gt;4.67&lt;/b&gt;&lt;/span&gt;
                            (3 responses)&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;&lt;b&gt;Average Rating: 4.43&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;h3&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot;, arial, helvetica, sans-serif&quot;&gt;INSTRUCTOR FEEDBACK&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ion-item class=&quot;item item-block item-ios&quot;&gt;&lt;/ion-item&gt;&lt;br /&gt;
&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;
                                &lt;ion-label class=&quot;label label-ios bb&quot; style=&quot;display: inline-block; font-weight: bold; margin: 0.5rem 0px;&quot;&gt;Week 0 Feedback&amp;nbsp;&lt;/ion-label&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&amp;gt;&amp;nbsp;Good so far!&lt;br /&gt;&amp;gt;&amp;nbsp;Positive&lt;br /&gt;&amp;gt;&amp;nbsp;More cohesive presentation of written material would help. 4-5 different apps were used to present &#39;written&#39; course material. At least 3 different text editors were used.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&lt;ion-label class=&quot;label label-ios bb&quot; style=&quot;display: inline-block; font-weight: bold; margin: 0.5rem 0px;&quot;&gt;&lt;br /&gt;&lt;/ion-label&gt;&lt;/span&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&lt;ion-label class=&quot;label label-ios bb&quot; style=&quot;display: inline-block; font-weight: bold; margin: 0.5rem 0px;&quot;&gt;Week 1 Feedback&amp;nbsp;&lt;/ion-label&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&amp;gt;&amp;nbsp;Nothing
                                        &lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&amp;gt;&amp;nbsp;I would love a little bit more preparation with the assignment in advance so that troubleshooting is easier.&lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&amp;gt;&amp;nbsp;I wish the instructor was more prepared for the class. It seems like he has a wealth of knowledge, but doesn&#39;t seem like he reviews the class material. It is a little frustrating having your instructor tell you to add tags around your labels to get your CSS to work - then your CSS still does not work. Only to find out after we briefly went over the &#39;answers&#39; that I never needed to add tags to begin with. Instead I should have focused my time on correcting the HTML surrounding my labels...&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;
&lt;ion-item class=&quot;item item-block item-ios&quot; text-wrap=&quot;&quot;&gt;&lt;/ion-item&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;I understand there are many ways to do things with web dev and I am by no means saying the instructor is bad. He is very knowledgeable and does answer many questions.
                                        &lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;&amp;gt;&amp;nbsp;More of a focused approach for the workshop assignment, so that we all proceed with solving issues with our code in the same direction. Otherwise it&#39;s hard to work with others to understand things better when we all diverge so far off course, this early in the game.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;
&lt;ion-item class=&quot;item item-block item-ios&quot; text-wrap=&quot;&quot;&gt;
&lt;/ion-item&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;button-effect&quot;&gt;
&lt;/div&gt;
&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;

                            
                        
                        &lt;ion-col class=&quot;col&quot; col-12=&quot;&quot; col-lg-6=&quot;&quot;&gt;
                            &lt;ion-list class=&quot;list list-ios&quot;&gt;
                                &lt;ion-list-header class=&quot;item item-ios list-header list-header-ios&quot; no-lines=&quot;&quot;&gt;
                                    &lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;ion-label class=&quot;label label-ios bb&quot; style=&quot;display: inline-block; font-weight: bold; margin: 0.5rem 0px;&quot;&gt;&lt;br /&gt;&lt;/ion-label&gt;
&lt;ion-label class=&quot;label label-ios bb&quot; style=&quot;display: inline-block; font-weight: bold; margin: 0.5rem 0px;&quot;&gt;Week 2 Feedback&amp;nbsp;&lt;/ion-label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/ion-list-header&gt;&lt;ion-item class=&quot;item item-block item-ios&quot; text-wrap=&quot;&quot;&gt;&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&amp;gt;&amp;nbsp;Very satisfied. I felt the instructor did a great job explaining the JS topics that we were covering. He also did an excellent job in answering all of the questions that I had. He answered some more advanced questions for me that were not covered in the videos and it really helped me make some more connections.
                                        &lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt;&amp;nbsp;Keith has been magical in helping to explain some of the nuanced topics that the videos gloss over. He spent like three hours on the phone with me the other night explaining JavaScript syntax to me.&lt;/div&gt;
&lt;/div&gt;
&lt;/ion-item&gt;&lt;ion-item class=&quot;item item-block item-ios&quot; text-wrap=&quot;&quot;&gt;
&lt;div class=&quot;button-effect&quot;&gt;
&lt;/div&gt;
&lt;/ion-item&gt;
                            &lt;/ion-list&gt;
                        &lt;/ion-col&gt;
                    &lt;/span&gt;
                    &lt;ion-col class=&quot;col&quot; col-12=&quot;&quot; col-lg-6=&quot;&quot;&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;
                        &lt;/span&gt;
                        &lt;ion-list class=&quot;list list-ios&quot;&gt;&lt;span face=&quot;&amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot; style=&quot;line-height: 1.6;&quot;&gt;
                                &lt;ion-list-header class=&quot;item item-ios list-header list-header-ios&quot; no-lines=&quot;&quot;&gt;
                                    &lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&lt;ion-label class=&quot;label label-ios bb&quot; style=&quot;display: inline-block; font-weight: bold; margin: 0.5rem 0px;&quot;&gt;&lt;br /&gt;&lt;/ion-label&gt;
&lt;ion-label class=&quot;label label-ios bb&quot; style=&quot;display: inline-block; font-weight: bold; margin: 0.5rem 0px;&quot;&gt;Week 3 Final Feedback&lt;/ion-label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/ion-list-header&gt;&lt;ion-item class=&quot;item item-block item-ios&quot; text-wrap=&quot;&quot;&gt;&lt;div class=&quot;item-inner&quot;&gt;
&lt;div class=&quot;input-wrapper&quot;&gt;
&amp;gt;&amp;nbsp;Thank you! I appreciate how patient you were with me while I asked question after question.
                                        &lt;br /&gt;
&amp;gt;&amp;nbsp;Keith was awesome - a lot of questions were thrown at him and I think he did a great job in answering them. He seemed like he warmed up and got more comfortable on classes 3 and 4.&lt;br /&gt;
The way he answered my questions were never really &quot;here is the answer&quot;, they were more &quot;here is some information, try this&quot; which gave me an opportunity to figure out the bigger problem in smaller pieces - which I appreciated.&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/--oTwXhGJzM0/XiFMP5h7ggI/AAAAAAAAa0g/hbm79AdIIvcac7QTK_q5nUxiGOxtma0WQCLcBGAsYHQ/s1600/Week%2B3%2BWorkshop.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1280&quot; height=&quot;180&quot; src=&quot;https://1.bp.blogspot.com/--oTwXhGJzM0/XiFMP5h7ggI/AAAAAAAAa0g/hbm79AdIIvcac7QTK_q5nUxiGOxtma0WQCLcBGAsYHQ/s320/Week%2B3%2BWorkshop.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/ion-item&gt;&lt;/span&gt;&lt;ion-item class=&quot;item item-block item-ios&quot; text-wrap=&quot;&quot;&gt;
&lt;div class=&quot;button-effect&quot;&gt;
&lt;/div&gt;
&lt;/ion-item&gt;
                        &lt;/ion-list&gt;
                    &lt;/ion-col&gt;
                &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;button-effect&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/2177855635670628754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/instructing-my-first-tutoring-course.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/2177855635670628754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/2177855635670628754'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2020/01/instructing-my-first-tutoring-course.html' title='Instructing My First Tutoring Course [2019 Sep-Oct]'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-Bbc-np7wH-0/Xh23ksf4gUI/AAAAAAAAay4/Lj3l3MhThM0KFRwm7MhYHoOWoyX0-uU_QCLcBGAsYHQ/s72-c/reno-collective.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-631971947846035751</id><published>2019-11-03T15:50:00.000-08:00</published><updated>2019-11-07T15:40:35.290-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3D books"/><category scheme="http://www.blogger.com/atom/ns#" term="books on shelf"/><category scheme="http://www.blogger.com/atom/ns#" term="CSS 3D transforms"/><category scheme="http://www.blogger.com/atom/ns#" term="CSS perspective"/><category scheme="http://www.blogger.com/atom/ns#" term="CSS3"/><title type='text'>CSS3 3D Books on a Shelf</title><content type='html'>In an attempt to spice up a navigation system I&#39;m working on, I took to &lt;a href=&quot;https://codepen.com/&quot; target=&quot;kdcNewWin&quot;&gt;CodePen&lt;/a&gt; to experiment with some CSS-based 3D books on a shelf.&lt;br /&gt;
&lt;br /&gt;
Although I believe the books turned out pretty good, I dashed the effort in lieu of a more simplistic approach. That aside, figured I would share the books I came up with, primarily because web development projects are fun to share.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-ndB4pW53sPM/Xb9iP0B9uMI/AAAAAAAAZwY/YYKUUl7_L3geMTpdU1Bd7rC6b74x4ovqgCLcBGAsYHQ/s1600/css-3d-books-on-shelf.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;309&quot; data-original-width=&quot;420&quot; height=&quot;235&quot; src=&quot;https://1.bp.blogspot.com/-ndB4pW53sPM/Xb9iP0B9uMI/AAAAAAAAZwY/YYKUUl7_L3geMTpdU1Bd7rC6b74x4ovqgCLcBGAsYHQ/s320/css-3d-books-on-shelf.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;
Development Phases&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codepen.io/KeithDC/pen/bGGaRPN&quot; target=&quot;kdcNewWin&quot;&gt;Bad Shelves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codepen.io/KeithDC/pen/bGGaxLe&quot; target=&quot;kdcNewWin&quot;&gt;Good Shelves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codepen.io/KeithDC/pen/WNNdLap&quot; target=&quot;kdcNewWin&quot;&gt;Narrower Shelves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codepen.io/KeithDC/pen/OJJzdVW&quot; target=&quot;kdcNewWin&quot;&gt;Shelves with Taller Books (latest/most developed)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Sources&lt;/h3&gt;
The base for this development effort was in part thanks to 
    &lt;a href=&quot;https://3dtransforms.desandro.com/&quot; target=&quot;kdcNewWin&quot;&gt;Intro to CSS 3D Transforms&lt;/a&gt; by 
    &lt;a href=&quot;https://github.com/desandro/3dtransforms&quot; target=&quot;kdcNewWin&quot;&gt;David DeSandro&lt;/a&gt;.
    Although I completely overhauled and applied all types of modifications, David&#39;s examples provided the initial insights.
  &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/repeating-linear-gradient&quot; target=&quot;kdcNewWin&quot;&gt;Gradient lines&lt;/a&gt; for the edged faces on books is thanks to &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/repeating-linear-gradient&quot; target=&quot;kdcNewWin&quot;&gt;moz://a&#39;s MDN web docs&lt;/a&gt;.
  &lt;br /&gt;
&lt;br /&gt;
I originally tried a pseudo &lt;code&gt;:after&lt;/code&gt; class for the shelf, but due to perspective incompatibilities, I ended up only using this for the soft blur between books.
    The pseudo class approach I tried was based on this &lt;a href=&quot;https://stackoverflow.com/a/25891733/638153&quot; target=&quot;kdcNewWin&quot;&gt;Stack Overflow: Answer&lt;/a&gt; by &lt;a href=&quot;https://stackoverflow.com/users/3577849/jme11&quot; target=&quot;kdcNewWin&quot;&gt;jme11&lt;/a&gt; with a &lt;a href=&quot;https://www.bootply.com/7h2JKXv40U&quot; target=&quot;kdcNewWin&quot;&gt;Demo on Bootply&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;codepen&quot; data-default-tab=&quot;html,result&quot; data-height=&quot;265&quot; data-pen-title=&quot;Shelves with Taller Books&quot; data-slug-hash=&quot;OJJzdVW&quot; data-theme-id=&quot;0&quot; data-user=&quot;KeithDC&quot; style=&quot;border: 2px solid; box-sizing: border-box; display: flex; height: 265px; margin: 1em 0; padding: 1em;&quot;&gt;
See the Pen &lt;a href=&quot;https://codepen.io/KeithDC/pen/OJJzdVW&quot;&gt;
  Shelves with Taller Books&lt;/a&gt; by Keith D Commiskey (&lt;a href=&quot;https://codepen.io/KeithDC&quot;&gt;@KeithDC&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io/&quot;&gt;CodePen&lt;/a&gt;.
&lt;/div&gt;
&lt;script async=&quot;&quot; src=&quot;https://static.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;

-Keith D Commiskey&lt;br /&gt;
&lt;a href=&quot;https://keithdc.com/&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Update&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; [2019-11-07]&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
The more simplistic approach I took was with rotating just one plane, as opposed to animating 3, 4, 5, or 6 panes on each book as I was doing above. Yet as simplistic as they may be, I believe they turned out pretty good (for a non-designer).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-COfnyaRq9bM/XcSpqP1IBCI/AAAAAAAAZyg/-3YTuw2q4P00VdG6yejVm_VVDjUfyFstgCLcBGAsYHQ/s1600/storycore34-flyout-left-menu.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;335&quot; data-original-width=&quot;489&quot; height=&quot;135&quot; src=&quot;https://1.bp.blogspot.com/-COfnyaRq9bM/XcSpqP1IBCI/AAAAAAAAZyg/-3YTuw2q4P00VdG6yejVm_VVDjUfyFstgCLcBGAsYHQ/s200/storycore34-flyout-left-menu.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-Ap013_ffnmc/XcSpqClBcCI/AAAAAAAAZyk/MRcr2BQEROw4N3ibJV7ugFJw5DW_2Ys_gCLcBGAsYHQ/s1600/storycore34-flyout-right-menu.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; display: inline !important; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;398&quot; data-original-width=&quot;477&quot; height=&quot;166&quot; src=&quot;https://1.bp.blogspot.com/-Ap013_ffnmc/XcSpqClBcCI/AAAAAAAAZyk/MRcr2BQEROw4N3ibJV7ugFJw5DW_2Ys_gCLcBGAsYHQ/s200/storycore34-flyout-right-menu.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-Ap013_ffnmc/XcSpqClBcCI/AAAAAAAAZyk/MRcr2BQEROw4N3ibJV7ugFJw5DW_2Ys_gCLcBGAsYHQ/s1600/storycore34-flyout-right-menu.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; display: inline !important; float: right; margin-bottom: 1em; margin-left: 1em; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/631971947846035751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2019/11/css3-3d-books-on-shelf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/631971947846035751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/631971947846035751'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2019/11/css3-3d-books-on-shelf.html' title='CSS3 3D Books on a Shelf'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-ndB4pW53sPM/Xb9iP0B9uMI/AAAAAAAAZwY/YYKUUl7_L3geMTpdU1Bd7rC6b74x4ovqgCLcBGAsYHQ/s72-c/css-3d-books-on-shelf.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-7473669118545938070</id><published>2019-10-20T02:02:00.002-07:00</published><updated>2019-11-01T11:42:57.211-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Guess Right"/><category scheme="http://www.blogger.com/atom/ns#" term="KeepTrack"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel 5.8"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="Pick-a-Meal"/><category scheme="http://www.blogger.com/atom/ns#" term="web apps"/><title type='text'>Triple Web App Revival: Keep Track; Pick-a-Meal; Guess Right</title><content type='html'>&lt;h2&gt;
Triple Web App Revival: Keep Track; Pick-a-Meal; Guess Right&lt;/h2&gt;
I develop web apps for continual daily training and as a way to stay productive---and because they can sometimes produce fun and useful tools to use in life. Sadly, two of those utilities, and one of my games took to the sidelines last year. Fortunately, however, I was finally able to devote some time to getting them all up and running once again.&lt;br /&gt;
&lt;br /&gt;
Tech Details: tl;dr---The PHP EOL crept up on me, and in upgrading PHP, I also had to upgrade Laravel, which I knew was going to take some time (turned out two weeks&#39; worth, but could&#39;ve been worse). Unfortunately I don&#39;t recall much about all the controllers I wrote, and I likely understand less about traits and middleware than ever before. But alas, I am not a Laravel Developer; I know enough to get my apps working (&lt;i&gt;usually&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
It was a delight to see all three sites spin back up---the blue on KeepTrack was beautiful; the coffee cup on Pick-a-Meal gorgeous; and the depth the letter cubes project on Guess Right seduced me into playing a few games for fum.&lt;br /&gt;
&lt;br /&gt;
I did cut out the Facebook login, but alas, I need to shift back to my job search. I did add in e-mail verification, which I believe was a major step up.&lt;br /&gt;
&lt;br /&gt;
And without further ado... readers and eaters, I bring you, the revival of ...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://kdcinfo.com/keeptrack&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;444&quot; data-original-width=&quot;640&quot; height=&quot;138&quot; src=&quot;https://1.bp.blogspot.com/-sWTFeytaWww/XawsrphJ7WI/AAAAAAAAZn8/NQZq-dwyOTUUanWBoj3tR8XmdHwyFUaPwCLcBGAsYHQ/s200/splash_keeptrack_640.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Keep Track&lt;/b&gt; -&amp;nbsp;&lt;a href=&quot;https://kdcinfo.com/keeptrack&quot;&gt;https://kdcinfo.com/keeptrack&lt;/a&gt;&lt;br /&gt;
Keep Track is a free online personal inventory manager for keeping track of all types of &#39;stuff&#39;... &quot;Your stuff!&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://kdcinfo.com/pickameal&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;222&quot; data-original-width=&quot;320&quot; height=&quot;138&quot; src=&quot;https://1.bp.blogspot.com/-qVP5COhFzl0/Xawlv082-CI/AAAAAAAAZnE/YFipRcjucH4L7az10P_C6lNkO4AN8_2AwCLcBGAsYHQ/s200/splash_pickameal_320.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;Pick-a-Meal&lt;/b&gt; - &lt;a href=&quot;https://kdcinfo.com/pickameal&quot;&gt;https://kdcinfo.com/pickameal&lt;/a&gt;&lt;br /&gt;
Can&#39;t decide what to eat? Can&#39;t decide where to eat? Let Pick-a-Meal pick it for you!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://kdcinfo.com/guessright&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;222&quot; data-original-width=&quot;320&quot; height=&quot;138&quot; src=&quot;https://1.bp.blogspot.com/-YT0mgMiiDSI/Xawmf-jMTEI/AAAAAAAAZnQ/4o4OPPBMZIYnrF3UKE7ZW597uAvWPm1VwCLcBGAsYHQ/s200/splash_guessright_320.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;Guess Right&lt;/b&gt; - &lt;a href=&quot;https://kdcinfo.com/guessright&quot;&gt;https://kdcinfo.com/guessright&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Guess Right and Be Happy!&lt;/b&gt; Instructions: 1) Pick the right letters and be happy. 2) Choose the wrong letters and try again. Life is simple! &lt;b&gt;Stop thinking and just guess. It&#39;s fun, fun, fun!!!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://kdcbase.com/&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;500&quot; data-original-width=&quot;300&quot; height=&quot;200&quot; src=&quot;https://1.bp.blogspot.com/-EfsPGStB_3w/XawnB-OByfI/AAAAAAAAZnY/p-GK24I9DlMzamshHY9DjmIXCHGdUVPsgCLcBGAsYHQ/s200/book_vert_final2.jpg&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
I also added all three of these back to my &lt;a href=&quot;https://kdcbase.com/&quot;&gt;web app showcase&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Always open to input.&lt;br /&gt;
&lt;br /&gt;
-Keith D Commiskey&lt;br /&gt;
&lt;a href=&quot;https://keithdc.com/&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
P.S. On a side note, a couple days back I also devised a resume versioning system and wrote up a&amp;nbsp;&lt;a href=&quot;https://codepen.io/KeithDC/pen/pooNjbm&quot; target=&quot;_blank&quot;&gt;Version Conversion Utility&lt;/a&gt;. It&#39;s available (with tl;dr instructions) on CodePen.&amp;nbsp;&lt;a href=&quot;https://codepen.io/KeithDC/pen/pooNjbm&quot; target=&quot;_blank&quot;&gt;https://codepen.io/KeithDC/pen/pooNjbm&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/7473669118545938070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2019/10/triple-web-app-revival-keep-track-pick.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/7473669118545938070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/7473669118545938070'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2019/10/triple-web-app-revival-keep-track-pick.html' title='Triple Web App Revival: Keep Track; Pick-a-Meal; Guess Right'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-sWTFeytaWww/XawsrphJ7WI/AAAAAAAAZn8/NQZq-dwyOTUUanWBoj3tR8XmdHwyFUaPwCLcBGAsYHQ/s72-c/splash_keeptrack_640.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-2581475682718620490</id><published>2019-10-17T14:58:00.000-07:00</published><updated>2019-11-01T11:45:12.046-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="calculator"/><category scheme="http://www.blogger.com/atom/ns#" term="math"/><category scheme="http://www.blogger.com/atom/ns#" term="math 120"/><category scheme="http://www.blogger.com/atom/ns#" term="math algebra"/><category scheme="http://www.blogger.com/atom/ns#" term="online calculator"/><category scheme="http://www.blogger.com/atom/ns#" term="recommended calculator"/><category scheme="http://www.blogger.com/atom/ns#" term="recommended web app"/><category scheme="http://www.blogger.com/atom/ns#" term="shared web app"/><category scheme="http://www.blogger.com/atom/ns#" term="suggested calculator"/><title type='text'>Solve for &#39;x&#39; with the Equation Calculator</title><content type='html'>&lt;a href=&quot;https://twitter.com/kdcinfo/status/1184945592360820736&quot; target=&quot;_blank&quot;&gt;Tweet Tweet !!&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;
&lt;div dir=&quot;ltr&quot; lang=&quot;en&quot;&gt;
The &quot;&lt;b&gt;Equation Calculator&lt;/b&gt;&quot; is the best &quot;&lt;b&gt;solve for x&lt;/b&gt;&quot; calculator I&#39;ve come across: &lt;a href=&quot;https://www.symbolab.com/solver/equation-calculator&quot;&gt;https://www.symbolab.com/solver/equation-calculator&lt;/a&gt; ... and it takes full URL calculations &lt;a href=&quot;https://www.symbolab.com/solver/equation-calculator/%5Cleft(x-25000%5Cright)%5Ccdot0.05%3D0.25x&quot;&gt;https://www.symbolab.com/solver/equation-calculator/%5Cleft(x-25000%5Cright)%5Ccdot0.05%3D0.25x&lt;/a&gt; complete with step-by-step solutions. (&lt;a href=&quot;https://twitter.com/hashtag/Symbolab?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Symbolab&lt;/a&gt;; &lt;a href=&quot;https://twitter.com/hashtag/Eqsquest?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Eqsquest&lt;/a&gt;)&amp;nbsp;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;
— Keith D Commiskey (@kdcinfo)&amp;nbsp;&lt;a href=&quot;https://twitter.com/kdcinfo/status/1184945592360820736?ref_src=twsrc%5Etfw&quot;&gt;October 17, 2019&lt;/a&gt;&lt;/blockquote&gt;
Although learning the Solver on a TI-83 or -84 is just as helpful (especially being that&#39;s allowed during tests).&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
For the Solver,&amp;nbsp;where&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;(x-25000) * 0.05 = 0.25x&lt;/span&gt;&lt;br /&gt;
... just let Solver&#39;s&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace; font-size: x-small;&quot;&gt;0= (x-25000) * 0.05 - 0.25x&lt;/span&gt;&lt;/blockquote&gt;
-&lt;a href=&quot;https://keithdc.com/&quot;&gt;keithdc.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script async=&quot;&quot; charset=&quot;utf-8&quot; src=&quot;https://platform.twitter.com/widgets.js&quot;&gt;&lt;/script&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/2581475682718620490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2019/10/solve-for-x-with-equation-calculator.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/2581475682718620490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/2581475682718620490'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2019/10/solve-for-x-with-equation-calculator.html' title='Solve for &#39;x&#39; with the Equation Calculator'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-7645658659365180253</id><published>2019-09-12T14:10:00.001-07:00</published><updated>2019-11-01T11:45:43.556-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="keystrokes"/><category scheme="http://www.blogger.com/atom/ns#" term="Opera browser"/><title type='text'>Opera Browser Disables Keystrokes in other Apps [O-63 / W-1809]</title><content type='html'>Recently I&#39;ve been experiencing intermittent issues in trying to use certain keystrokes in a few of my more common Windows-based applications. The two primary shortcuts I found that I cannot use are &lt;b&gt;Ctrl-Shift-Home&lt;/b&gt; and &lt;b&gt;Ctrl-Shift-End&lt;/b&gt;. These two shortcuts should highlight from the current cursor position to either the top or bottom of the available selection set, respectively.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/--zLPCinhjd0/XXqzzddsQgI/AAAAAAAAZXI/PCqNcB6NWuAdyo2M5Ukm7klG0J6VuYhIwCLcBGAsYHQ/s1600/keys_shft-ctrl-home-end-05.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;126&quot; data-original-width=&quot;462&quot; height=&quot;87&quot; src=&quot;https://1.bp.blogspot.com/--zLPCinhjd0/XXqzzddsQgI/AAAAAAAAZXI/PCqNcB6NWuAdyo2M5Ukm7klG0J6VuYhIwCLcBGAsYHQ/s320/keys_shft-ctrl-home-end-05.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
I checked all types of OS-level keyboard settings. After closing a few apps in an effort to reboot, I suddenly found I could use those keystrokes again! So I brought back up my apps . . . one at a time. &lt;b&gt;The moment I reopened Opera, the keystrokes disabled.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I tried disabling a lot of the various settings in Opera, one of which required a restart. I could not find a setting that gave me back these keystrokes.&lt;br /&gt;
&lt;br /&gt;
Strangely, Shift-Home and Shift-End both work. Ctrl-Home and Ctrl-End also both work. They just don&#39;t all work together. Additionally, all the Shift/Ctrl arrow keys also function fine.&lt;br /&gt;
&lt;br /&gt;
I am in the dark as to why those keystrokes are disabled at the OS level affecting every application (including Opera itself) while Opera is open. Fortunately I only use the Opera browser for periodic web development testing and for playing WwF (via Facebook) with my mom. :D&lt;br /&gt;
&lt;br /&gt;
System: Windows 10 Home 1809 17763.737&lt;br /&gt;
Opera: 63.0.3368.71&lt;br /&gt;
Test Apps: Notepad; Wordpad; Sublime Text 3; Browser input areas.&lt;br /&gt;
&lt;br /&gt;
#NowIKnow #TechNuances&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/7645658659365180253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2019/09/opera-browser-disables-keystrokes-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/7645658659365180253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/7645658659365180253'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2019/09/opera-browser-disables-keystrokes-in.html' title='Opera Browser Disables Keystrokes in other Apps [O-63 / W-1809]'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/--zLPCinhjd0/XXqzzddsQgI/AAAAAAAAZXI/PCqNcB6NWuAdyo2M5Ukm7klG0J6VuYhIwCLcBGAsYHQ/s72-c/keys_shft-ctrl-home-end-05.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6441671.post-2353160926074010201</id><published>2019-08-23T18:45:00.001-07:00</published><updated>2019-11-01T11:33:26.523-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pet notes"/><category scheme="http://www.blogger.com/atom/ns#" term="pet reference"/><category scheme="http://www.blogger.com/atom/ns#" term="veterinarian front desk"/><category scheme="http://www.blogger.com/atom/ns#" term="veterinarian notes"/><category scheme="http://www.blogger.com/atom/ns#" term="veterinarian reference"/><category scheme="http://www.blogger.com/atom/ns#" term="veterinarian staff"/><title type='text'>Pet Ref App: A Customizable Reference Tool</title><content type='html'>&lt;h2&gt;
Introducing the &quot;&lt;a href=&quot;https://petrefapp.com/&quot; target=&quot;_blank&quot;&gt;Pet Ref App&lt;/a&gt;&quot;: A customizable reference tool.&lt;/h2&gt;
&lt;h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://1.bp.blogspot.com/-N8EcrryvHNw/XawrGurP-JI/AAAAAAAAZn0/ak3VhiFAT5w4cac9_Nebv6UUNwc6HFwpgCEwYBhgL/s1600/splash_pra_320-222.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;222&quot; data-original-width=&quot;320&quot; src=&quot;https://1.bp.blogspot.com/-N8EcrryvHNw/XawrGurP-JI/AAAAAAAAZn0/ak3VhiFAT5w4cac9_Nebv6UUNwc6HFwpgCEwYBhgL/s1600/splash_pra_320-222.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
The Pet Ref App is an all-in-one location for pet-related notes and meds.&lt;/h3&gt;
&lt;h4&gt;
Easy to use, the web app can be used in vet offices, by students in pet-related fields, or as personal notes or school references.&lt;/h4&gt;
&lt;b&gt;Now Open!&lt;/b&gt; As of Thursday, August 22, 2019, the &lt;a href=&quot;https://petrefapp.com/&quot; target=&quot;_blank&quot;&gt;Pet Ref App site officially launched&lt;/a&gt; and is &lt;a href=&quot;https://petrefapp.com/demo/?page=create&quot; target=&quot;_blank&quot;&gt;ready for sign-ups&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;u&gt;Web App Background&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
The Pet Ref App resource tool was initially created to help with gaining an understanding of &quot;what means what&quot; when first starting to work with pets. There is so much information involved in caring for pets, and most times all of this information is strewn across books, binders, and websites, or worse, the information is only shared verbally amongst individuals.&lt;br /&gt;
&lt;br /&gt;
This made learning about pet care challenging. This reference app was an attempt to centralize the information, while making it accessible via any computer or phone (#lovetheweb).&lt;br /&gt;
&lt;br /&gt;
In demonstrating the reference tool, it appeared others could benefit from the information as well. An administrative tool with preset logins was then created to allow others the opportunity to update the information as well. This allowed those with even more knowledge to contribute, thus improving the quality of the information gathered.&lt;br /&gt;
&lt;br /&gt;
In thinking broader, it became clear that one potential path for the app was in providing it to the general public—thus, &lt;a href=&quot;https://petrefapp.com/&quot; target=&quot;_blank&quot;&gt;petrefapp.com&lt;/a&gt; was born. A home page was created, and a demo site provided (which doubles as a &#39;new account&#39; base).&lt;br /&gt;
&lt;br /&gt;
One advertisement is shown on the &quot;View Mode&quot; page to try to help offset site operating costs. This ad can also be turned off by the account&#39;s Admin user by way of a very small paid subscription. But the information is available to those with ad blockers (and those running Opera) just as well. Why not block them? Because that&#39;s not what this app is about. The core &lt;a href=&quot;https://kdcinfo.com/&quot;&gt;kdcinfo.com&lt;/a&gt; policy (the parent of petrefapp.com) isn&#39;t about forcing ads on people—making money on sites comes second to providing a quality tool that others can benefit from. Additionally, even with ad blockers, people are encouraged to donate as well, which certainly helps to contribute to the site&#39;s longevity.&lt;br /&gt;
&lt;br /&gt;
Being a brand new site, please use the &lt;a href=&quot;https://petrefapp.com/?page=contact&quot; target=&quot;_blank&quot;&gt;Contact Form&lt;/a&gt; (upper-right corner and footer) should you discover any issues, or just for general feedback. Thanks for reading!!&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #757575; font-family: &amp;quot;roboto&amp;quot; , sans-serif; font-size: 15px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white; color: #757575; font-family: &amp;quot;roboto&amp;quot; , sans-serif; font-size: 15px;&quot;&gt;- Keith D Commiskey, Creator&lt;/span&gt;&lt;br /&gt;
|&amp;nbsp;&lt;a href=&quot;https://petrefapp.com/&quot; target=&quot;_blank&quot;&gt;https://petrefapp.com&lt;/a&gt;&lt;br /&gt;
| &lt;a href=&quot;https://keithdc.com/&quot;&gt;https://keithdc.com&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;-- 
Keith D Commiskey
https://keithdc.com&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kdcinfo.blogspot.com/feeds/2353160926074010201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kdcinfo.blogspot.com/2019/08/pet-ref-app-customizable-reference-tool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/2353160926074010201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6441671/posts/default/2353160926074010201'/><link rel='alternate' type='text/html' href='http://kdcinfo.blogspot.com/2019/08/pet-ref-app-customizable-reference-tool.html' title='Pet Ref App: A Customizable Reference Tool'/><author><name>Keith D Commiskey</name><uri>http://www.blogger.com/profile/03370917317493536635</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAabJvJc7tqakjlK2SfWEeU4iPpMQ9TJH9HCCq4_RHX1Fm6r1GKBfqBtB2FXzXcw4TswSGlnornlsPEZ6cmzS_jjlIQMzEznO6pFAhzxU7UkoFMvzOkfTYx8lfBnbP0A/s220/keith-sac-01.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-N8EcrryvHNw/XawrGurP-JI/AAAAAAAAZn0/ak3VhiFAT5w4cac9_Nebv6UUNwc6HFwpgCEwYBhgL/s72-c/splash_pra_320-222.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>