<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tim Bendt</title>
    <description>The latest articles on DEV Community by Tim Bendt (@sirtimbly).</description>
    <link>https://dev.to/sirtimbly</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F119045%2Fb058e256-0b26-467c-9c74-27d5b67121d8.jpeg</url>
      <title>DEV Community: Tim Bendt</title>
      <link>https://dev.to/sirtimbly</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sirtimbly"/>
    <language>en</language>
    <item>
      <title>Dev Journal: Maps in Apps</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Fri, 03 Sep 2021 11:36:00 +0000</pubDate>
      <link>https://dev.to/sirtimbly/dev-journal-maps-in-apps-4a0l</link>
      <guid>https://dev.to/sirtimbly/dev-journal-maps-in-apps-4a0l</guid>
      <description>&lt;p&gt;Yeah I’m posting more gifs. Sorry, not sorry.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gnMbbpcC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media3.giphy.com/media/NCPcywASJGggw/giphy.gif%3Fcid%3Decf05e47dlfkdrh2dclxpblarc07bo81gviybv18rrfns7be%26rid%3Dgiphy.gif%26ct%3Dg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gnMbbpcC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media3.giphy.com/media/NCPcywASJGggw/giphy.gif%3Fcid%3Decf05e47dlfkdrh2dclxpblarc07bo81gviybv18rrfns7be%26rid%3Dgiphy.gif%26ct%3Dg" alt="friday"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read some more of that book last night. Still not sure what to do about everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  8:54 AM
&lt;/h2&gt;

&lt;p&gt;Calling the doctor now just to see if my old prescription helps out at all again. One of the problems with medication is that I don’t know if it really works if I skip so many days. I often skip taking any prescription about 1/3 of the days of the week. Consistent habits are not easy for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  9:05 AM
&lt;/h2&gt;

&lt;p&gt;OK, only on hold for 5 minutes that time. Got things sorted out.&lt;/p&gt;

&lt;p&gt;Time to catch up on slack…&lt;/p&gt;

&lt;h2&gt;
  
  
  9:43 AM
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=z41Wy5ZF4O8"&gt;Mushroom growing from start to finish.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10:01 AM
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.atlasobscura.com/articles/camp-century-portable-nuclear-reactor"&gt;The US Army operated A Small Nuclear Power Plan in Greenland in the 1960s&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10:38 AM
&lt;/h2&gt;

&lt;p&gt;Mapbox in react isn’t rendering the base-map tiles. It seems like maybe I’m getting some sort of authentication error using the mapbox api. I’m gonna drop this customized map component and just use the base library components.&lt;/p&gt;

&lt;h2&gt;
  
  
  11:21 AM
&lt;/h2&gt;

&lt;p&gt;Success! Got the react native app to render a map with the same large GeoJSON object in a webview and compare it with a map rendered a native map component.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://uploads.timbendt.com/RPReplay_Final1630689421#9597bca5dbc76dc6a5d4018899175cf39071144563d5a98517cc1f42fe850061"&gt;video demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would say, that on my iPhone SE2 from 2020, the interactions is roughly equally good. The line drawing isn’t as clear in web-view as in the native component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SiWwxEZc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://uploads.timbendt.com/comparison%23fe77dcc6a7638ae8e41388c91bf93ea8eed7b26aa06d74d412d68710b9399a7a" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SiWwxEZc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://uploads.timbendt.com/comparison%23fe77dcc6a7638ae8e41388c91bf93ea8eed7b26aa06d74d412d68710b9399a7a" alt="comparison"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I should try to compare raster tile layer performance too.&lt;/p&gt;

&lt;h2&gt;
  
  
  12:57 PM
&lt;/h2&gt;

&lt;p&gt;Doing some planning for a hackathon in 2 weeks. Gotta figure out the scope of what we will tackle. I’ve done a lot of miro planning for this developer portal already, but don’t want to overwhelm people with everything in my mind. I tend to run on ahead and then I expect people to get annoyed if I’ve thought too far ahead of where we are at in a project — this might be one of those strengths of ADD that I need to learn to capture and not be ashamed of.&lt;/p&gt;

&lt;h2&gt;
  
  
  1:01 PM
&lt;/h2&gt;

&lt;p&gt;My wife brought me a salad for lunch. Thank you dear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rb_DUEsl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media1.giphy.com/media/rO8jS1ylBcE0g/giphy.gif%3Fcid%3Decf05e47b71zsb5uwa5kynfyfhgbwb1f37qutyt111k3xbo2%26rid%3Dgiphy.gif%26ct%3Dg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rb_DUEsl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media1.giphy.com/media/rO8jS1ylBcE0g/giphy.gif%3Fcid%3Decf05e47b71zsb5uwa5kynfyfhgbwb1f37qutyt111k3xbo2%26rid%3Dgiphy.gif%26ct%3Dg" alt="salad" title="Optional title"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2:21 PM
&lt;/h2&gt;

&lt;p&gt;Great conversations about frontend architecture. On the surface we were talking about shared state management and offline syncing functionality. One of the classic hard problems &lt;em&gt;is&lt;/em&gt; cache invalidation. But more deeply the question came up, how do I help other frontend developers communicate and listen to the other devs that rely on their expertise. What is the wedge that’s drving these developers apart. How do we improve our listening and &lt;a href="https://www.amazon.com/Daring-Greatly-Courage-Vulnerable-Transforms-ebook/dp/B007P7HRS4/ref=tmm_kin_swatch_0?_encoding=UTF8&amp;amp;qid=1631024807&amp;amp;sr=8-1"&gt;empathy&lt;/a&gt; as an organization…&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dev Journal: React native and webviews</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Thu, 02 Sep 2021 11:15:00 +0000</pubDate>
      <link>https://dev.to/sirtimbly/dev-journal-react-native-and-webviews-4e64</link>
      <guid>https://dev.to/sirtimbly/dev-journal-react-native-and-webviews-4e64</guid>
      <description>&lt;p&gt;Let’s get this going again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--auUm3-Hi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media1.giphy.com/media/AcfTF7tyikWyroP0x7/giphy.gif%3Fcid%3Decf05e479e5b6f7acddaf9ec2d6e302ab7844765aad79426%26rid%3Dgiphy.gif%26ct%3Dg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--auUm3-Hi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://media1.giphy.com/media/AcfTF7tyikWyroP0x7/giphy.gif%3Fcid%3Decf05e479e5b6f7acddaf9ec2d6e302ab7844765aad79426%26rid%3Dgiphy.gif%26ct%3Dg" alt="baby yoda dance"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have some meetings today. I have a call with a client about design work at the end of the day. I still need to call my doctor. I still need to test out a webview in a react native app. Writing these posts is like journaling during the day.&lt;/p&gt;

&lt;p&gt;Last night I checked out &lt;a href="https://www.amazon.com/ADHD-Advantage-Diagnosis-Greatest-Strength-ebook/dp/B00OZ0TMLY/ref=tmm_kin_swatch_0?_encoding=UTF8&amp;amp;qid=1630598048&amp;amp;sr=8-1"&gt;a book&lt;/a&gt; from the libarary about ADHD. I feel like I need to take this seriously and start really paying attention to this side of myself — not just be embarassed and ashamed because of the stigma around having a “disorder”. I could find coping mechanisms and look for opportunities to use my strengths, but I have a deep-seated belief that ADD makes me a bad worker, and it will get me fired.&lt;/p&gt;

&lt;h2&gt;
  
  
  9:54 AM
&lt;/h2&gt;

&lt;p&gt;Great meeting about our big project, it kept me engaged with problem solving. Now, I think I’m going to try to load the web view in the mobile app like I started yesterday.&lt;/p&gt;

&lt;h2&gt;
  
  
  10:02 AM
&lt;/h2&gt;

&lt;p&gt;My iPhone doesn’t have VPN access to the necessary dev servers. Need to run the web application container locally so I can do a real tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  10:49 AM
&lt;/h2&gt;

&lt;p&gt;Distracted with &lt;a href="https://spectrum.ieee.org/the-scandalous-history-of-the-last-rotor-cipher-machine"&gt;an article about mid-century cryptography machines&lt;/a&gt;. How amazing would it be to build a purely mechanical or maybe an electromechanical crypto device.&lt;/p&gt;

&lt;h2&gt;
  
  
  11:11 AM
&lt;/h2&gt;

&lt;p&gt;Trying to make some progress. Discovering lots of little issues with the container react application. Like some bizarre browser detection feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a5uWREAK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://uploads.timbendt.com/CleanShot-2021-09-02-at-11.10.57.png%23c63777a611af47843a743855af22fcd153d2a92ffe161f0dfa99d0d5c97625e8" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a5uWREAK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://uploads.timbendt.com/CleanShot-2021-09-02-at-11.10.57.png%23c63777a611af47843a743855af22fcd153d2a92ffe161f0dfa99d0d5c97625e8" alt="unsupported browser?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I mean this works… technically. So can I get a mapbox map to show up here? If I can get the same map and data to render in both ways then this test will be done.&lt;/p&gt;

&lt;h2&gt;
  
  
  3:25 PM
&lt;/h2&gt;

&lt;p&gt;I had another good meeting. I like filling up my day with meetings like that, I feel productive despite myself when I can help make decisions and discuss problems. Now it’s time for a little design meeting with my longest-running freelance client. We manage to do some good design work, and it’s almost all on the phone while I work in figma and he watches me. Some designers would probably lose their minds. I feel really proud of the work we did to re-design hundreds of screens of functionality over the last couple of years.&lt;/p&gt;

&lt;h2&gt;
  
  
  5:24 PM
&lt;/h2&gt;

&lt;p&gt;Did some good work today. Did not call my doctor. Took a short nap over lunch. I never got past that stupid unsupported browser warning. So I’m going to have to yank all of the features out of this web app and just make a really minimal reproduction app that doesn’t have any of the login stuff in it tomorrow. And then I need to figure out some good answers about offline sync options.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dev Blogging: An Attempt to Maintain Focus</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Wed, 01 Sep 2021 11:15:00 +0000</pubDate>
      <link>https://dev.to/sirtimbly/dev-blogging-an-attempt-to-maintain-focus-5570</link>
      <guid>https://dev.to/sirtimbly/dev-blogging-an-attempt-to-maintain-focus-5570</guid>
      <description>&lt;p&gt;I want to put my effort and focus into my job. I’m finding it difficult lately. For various reasons I’m not feeling very productive, seeing a decreased amount of focus during the day. Yesterday I was able to focus for a few meetings, but the rest of the day I was distracted constantly. Then about 4:30 I felt the energy drain out and my mind felt fuzzy and I was suddenly able to focus. 45 minutes of productivity per day is not enough.&lt;/p&gt;

&lt;p&gt;The honesty is difficult. This blog has not been about things like this in a long time. I don’t like the idea of publishing these thoughts forever, they are pretty cringe. At the same time I’ve been watching youtube channels where people do fun projects and also just show the real side of themselves. I don’t think I can do video right now, but I can write and publish a blog. And it might help me when I feel like I need to just get some of the thoughts out of my head. ADHD is difficult to manage and having a place to pour some thoughts out might help.&lt;/p&gt;

&lt;p&gt;So that’s this post: a log of my thoughts and accomplishments from one day. An account of what I’m doing to deal with various challenges and tasks.&lt;/p&gt;

&lt;p&gt;Today I plan to do the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Have several short meetings about current projects.&lt;/li&gt;
&lt;li&gt;Edit and Post this file at the end of the day.&lt;/li&gt;
&lt;li&gt;Call and set up a Doctor’s appointment.&lt;/li&gt;
&lt;li&gt;Create a react-native test application with an embedded webview that can load with injected authentication tokens.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This file will be updated as I proceed.&lt;/p&gt;

&lt;h2&gt;
  
  
  9:16 AM
&lt;/h2&gt;

&lt;p&gt;Just wrote the above. Listening to Pandora station “Tiësto Radio”.&lt;/p&gt;

&lt;p&gt;Installed &lt;a href="https://github.com/react-native-webview/react-native-webview"&gt;https://github.com/react-native-webview/react-native-webview&lt;/a&gt; in my test project. It’s an &lt;a href="https://docs.expo.dev/clients/getting-started/"&gt;expo&lt;/a&gt; app. Something weird happened to my project. The start script changed form &lt;code&gt;expo start&lt;/code&gt; to &lt;code&gt;react-native start&lt;/code&gt;. When I run &lt;code&gt;react-native run-ios&lt;/code&gt; it starts up a very slow xcode build process.&lt;/p&gt;

&lt;p&gt;I have about 1 hour until my first meeting of the day.&lt;/p&gt;

&lt;h2&gt;
  
  
  9:29 AM
&lt;/h2&gt;

&lt;p&gt;I did somehow get the simulator to open my project.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;expo start --dev-client&lt;/code&gt; then click the link in the web UI “Run on iOS Simulator” which opens a custom URL scheme link on the device.&lt;/p&gt;

&lt;p&gt;It shows the app with custom native code inside it. Now can I get it to run on my actual device?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D8hq-5UU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://uploads.timbendt.com/CleanShot-2021-09-01-at-09.28.38.png%23effeabd3c1107c59ce3d0755ceecec06c28810e1e433f7449888c01e50b5695c" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D8hq-5UU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://uploads.timbendt.com/CleanShot-2021-09-01-at-09.28.38.png%23effeabd3c1107c59ce3d0755ceecec06c28810e1e433f7449888c01e50b5695c" alt="simulator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I want to skip the EAS build service for now. Can I just use the built in Apple tools? Plug in my iphone with USB. Launch XCode. &lt;a href="https://developer.apple.com/documentation/xcode/running-your-app-in-the-simulator-or-on-a-device"&gt;Apple Docs&lt;/a&gt;. Add my work apple id to the accounts preferences in XCode. Change the project settings the associate with my work team for apple developer program membership.&lt;/p&gt;

&lt;p&gt;Receive error in XCode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Failed to register bundle identifier
The app identifier "com.timbly.donewithit" cannot be registered to your development team because it is not available. Change your bundle identifier to a unique string to try again.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wat? Go make some more coffee. Just opened a new bag of “Late Night” from &lt;a href="https://methodicalcoffee.com/"&gt;Methodical Coffee&lt;/a&gt;. Dark roast provided by &lt;a href="https://www.bottomless.com/"&gt;bottomless&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  9:54 AM
&lt;/h2&gt;

&lt;p&gt;Worrying about tornadoes.&lt;/p&gt;

&lt;h2&gt;
  
  
  9:58 AM
&lt;/h2&gt;

&lt;p&gt;If the proof of concept app doesn’t run on an actual device it doesn’t count as working in my mind. It’s important to carry test projects through the lenght of the development cycle. We call them tracer bullets sometimes. There’s not a lot of meat on the bones, but the project needs to traverse the full length of the process to find any gotchas.&lt;/p&gt;

&lt;p&gt;Changing the bundle identifier to something else fixed the error in xcode, because I created the project and gave it a bundle identifier before I added my new apple ID that’s associated with a developer account.&lt;/p&gt;

&lt;h2&gt;
  
  
  10:05 AM
&lt;/h2&gt;

&lt;p&gt;Build errors relating to expo. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E9dTzjGk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://uploads.timbendt.com/CleanShot-2021-09-01-at-10.03.50.png%23070b72aa672154259f5c24e68e263adf9e571709675e07662e4c16c85f29ae54" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E9dTzjGk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://uploads.timbendt.com/CleanShot-2021-09-01-at-10.03.50.png%23070b72aa672154259f5c24e68e263adf9e571709675e07662e4c16c85f29ae54" alt="errors"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/a/59696931"&gt;Attempting to close xcode and open the .xcworkspace file instead&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s building for longer - so this feels promising.&lt;/p&gt;

&lt;p&gt;No, it failed in the node scripts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.google.com/search?q=expo+sane+Error:+EMFILE:+too+many+open+files&amp;amp;source=hp&amp;amp;ei=EKcvYZ7kIJeu5NoPyP2r0AU&amp;amp;iflsig=ALs-wAMAAAAAYS-1IHgRr9NVH2TLtcsgoA3767GDfq3-&amp;amp;oq=expo+sane+Error:+EMFILE:+too+many+open+files&amp;amp;gs_lcp=Cgdnd3Mtd2l6EAMyBQgAEM0CMgUIABDNAjIFCAAQzQIyBQgAEM0COgUIABCABDoECAAQDToGCAAQBxAeOgYIABANEB5QjR1Y31JgjFRoAXAAeACAAYsBiAGkCpIBBDIuMTCYAQCgAQKgAQGwAQA&amp;amp;sclient=gws-wiz&amp;amp;ved=0ahUKEwierND3ld7yAhUXF1kFHcj-CloQ4dUDCAo&amp;amp;uact=5"&gt;Googling&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Attempting: &lt;code&gt;brew reinstall watchman&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Requires XCode command line tools. Attempting &lt;code&gt;xcode-select --install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dq7UVpbn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://uploads.timbendt.com/CleanShot-2021-09-01-at-10.19.48.png%2359d0b21eea9729f1049fd7bcd48a42d58dcbd35e257d054aaa13fa65153154ad" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dq7UVpbn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://uploads.timbendt.com/CleanShot-2021-09-01-at-10.19.48.png%2359d0b21eea9729f1049fd7bcd48a42d58dcbd35e257d054aaa13fa65153154ad" alt="too long" title="Between 10 hours and 10 minutes remaining."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  11:26 AM
&lt;/h2&gt;

&lt;p&gt;Two meetings. Need a break. Time to make some lunch and then watch some youtube.&lt;/p&gt;

&lt;h2&gt;
  
  
  12:00 PM
&lt;/h2&gt;

&lt;p&gt;I had a confusing meeting that was full of information that I don’t know what to do with it. I have enough to keep me busy this is a confusing thing to try to figure out.&lt;/p&gt;

&lt;h2&gt;
  
  
  12:21 PM
&lt;/h2&gt;

&lt;p&gt;I feel so lazy. I can’t do anything.&lt;/p&gt;

&lt;p&gt;YouTube is stupid. There’s nothing on there. I don’t want to play games.&lt;/p&gt;

&lt;p&gt;Time to call that doctor.&lt;/p&gt;

&lt;p&gt;Reinstalling watchman again while on hold.&lt;/p&gt;

&lt;p&gt;It’s weird that macOS is version 11 now. It’s been OS X v 10.x for almost 20 years.&lt;/p&gt;

&lt;h2&gt;
  
  
  3:38 PM
&lt;/h2&gt;

&lt;p&gt;Got sick while on hold. Really sick to my stomach. Had to lay down. Took a long nap. I feel like a failure. Back up and trying again. OK, let’s see if the stupid project will build again.&lt;/p&gt;

&lt;h2&gt;
  
  
  3:43 PM
&lt;/h2&gt;

&lt;p&gt;OK the development app started on my iPhone but I can’t get it to connect to my launcher.&lt;/p&gt;

&lt;h2&gt;
  
  
  3:50 PM
&lt;/h2&gt;

&lt;p&gt;OK, got it figured out. It seems to be just my laptop’s IP address and port 8081. And it reloads when I change my JS. Now I can start testing it for real on a real device. Success!&lt;/p&gt;

&lt;h2&gt;
  
  
  4:05 PM
&lt;/h2&gt;

&lt;p&gt;Love this channel: &lt;a href="https://www.youtube.com/watch?v=fNxcOON1VNM"&gt;https://www.youtube.com/watch?v=fNxcOON1VNM&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Outcomes
&lt;/h3&gt;

&lt;p&gt;Meetings: partial success, had to skip 2 while sick&lt;/p&gt;

&lt;p&gt;Posting this file to my blog… waiting until the next day.&lt;/p&gt;

&lt;p&gt;Call and set up a Doctor’s appointment: fail.&lt;/p&gt;

&lt;p&gt;Create a react-native test application: Partial Success. Still need to test the webview and the auth tokens.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Reduce Software Delivery Cycle Time and Switch To Github Actions</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Wed, 14 Oct 2020 18:15:00 +0000</pubDate>
      <link>https://dev.to/sirtimbly/reduce-software-delivery-cycle-time-and-switch-to-github-actions-33dk</link>
      <guid>https://dev.to/sirtimbly/reduce-software-delivery-cycle-time-and-switch-to-github-actions-33dk</guid>
      <description>&lt;p&gt;At &lt;a href="https://inv.tech/"&gt;Invisible&lt;/a&gt; we have a small but focused team of engineers that want to ship quickly. We are marching towards a goal of building a company and technology platform that can employ people everywhere in the world to do knowledge work at a fair wage. We manage complex project and operations teams with our custom tools, so we have a lot of software components that need to be developed and maintained.&lt;/p&gt;

&lt;p&gt;We have adopted a monorepo structure for our platform so that everyone on the team remains in tight sync on what is happening around the different parts of the company. This also allows us to maintain some level of coupling between front-end and back-end services without creating multiple PRs on different repos. The unanticipated cost of the mono-repo for us was the time our CI pipeline took to run.&lt;/p&gt;

&lt;p&gt;We were on CircleCI and had configured our CI test jobs to run all of the tests for every service in parallel every time we push code to a Pull Request. This configuration is perfect if you need to make sure that one service wont fail when another service or package changes. We treat our entire platform as one product, even though certain members of the team focus on just one part of the platform most of the time. But, our PR test runs were very slow, often over 20 minutes. This was happening because of several configuration choices we made early on, including running &lt;code&gt;yarn install&lt;/code&gt; with lerna across every service and package up front then caching, which resulted in a 900 MB workspace cache file that needed to be downloaded for every successive step in the CI work-flow.&lt;/p&gt;

&lt;p&gt;A slow test run time is annoying, but it became unbearable when we started insisting on a linear git history for our master branch. This setting means that every PR has to be re-based any time another PR is merged by someone else. Since we often have a dozen or more active PRs being worked on in one repository, this timer would have to re-start many times each day. Developers would make a change to code, see the test results come back, but the master branch had already been merged into by someone else. The owner of the PR would need to go back, re-base, force push, and start waiting for tests to finish all over again. Getting a feature to staging would often take an hour of sitting and waiting, and coordinating with other devs. Deploys to production often required manual intervention by a developer using a command line tool.&lt;/p&gt;

&lt;p&gt;The core problem here is “tight coupling”. One team’s ability to ship is impacted by another person or team’s actions (merging first). Developers were prevented from finishing their work by circumstances outside of their control. With a structure like this, each developer we add would slow down every other person and team, that’s inverse efficiency scaling! Adding more people slows us all down! On the road to speed all instances of tight coupling between teams and services need to be eliminated.&lt;/p&gt;

&lt;p&gt;This resulted in a very slow “cycle-time” — the time it takes to get from PR open to deployed in production. Every time a developer has to switch contexts and wait for an async process results in massive inefficiency.&lt;/p&gt;

&lt;p&gt;We began outlining what we wanted to change about our CI configuration and created a goal of every CI test run being finished in less than 5 minutes. And every deployment script finishing in less than 5 minutes. Here’s how we configured our work-flows to do that.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We use path filtering in actions so that only the services that have changed actually run their unique tests.&lt;/li&gt;
&lt;li&gt;We parallelized our runs so that multiple kinds of tests run at once.&lt;/li&gt;
&lt;li&gt;We utilize small caches, unique to each service, instead of one big cache, so it can be downloaded and decompressed in seconds.&lt;/li&gt;
&lt;li&gt;The only “global” tests are very short linting tests that don’t require as much installation and setup time.&lt;/li&gt;
&lt;li&gt;We added a check to our back-end service that spots any breaking changes to our graphql schema and stops developers from shipping breaking changes, which helps eliminate another point of tight coupling between services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After these changes our PR test suite runs between 1 and 4 minutes. All of this has significantly improved our cycle time. Everyone on the team can feel how much faster they are able to move with these shorter waits. We are also able to deploy more confidently because we know changes and fixes will be relatively quick and cheap to ship as well.&lt;/p&gt;

&lt;p&gt;The switch from Circle to Github Actions will impact our bottom line as we will be using fewer minutes of compute time and we can use lower cost compute resources since each work-flow is doing less work. We can also take advantage of the 3000 minutes that are included with the Github pro team plan we were already paying for.&lt;/p&gt;

&lt;p&gt;We are going to add a few more lint checks in the near future, and improve our automatic syncing of issue status in JIRA using these actions. I’m very excited about unblocking our engineering team to move faster. Instead of slowing down as we add more engineers, we can ensure each developer on the team is able to ship more often and more confidently.&lt;/p&gt;

</description>
      <category>ci</category>
      <category>devops</category>
      <category>monorepo</category>
      <category>githubactions</category>
    </item>
    <item>
      <title>The Bridges Between Design and Code</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Thu, 30 Jul 2020 18:15:00 +0000</pubDate>
      <link>https://dev.to/sirtimbly/the-bridges-between-design-and-code-2ffo</link>
      <guid>https://dev.to/sirtimbly/the-bridges-between-design-and-code-2ffo</guid>
      <description>&lt;p&gt;The problems with design-code hand-off are still manifold. I’ve been doing this for like 20 years and the process of turning visual direction into interactive applications is still fraught. Here are a few hints and principles to help you understand where this problem space has evolved lately.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use &lt;a href="https://figma.com/"&gt;Figma&lt;/a&gt;, but it’s not magic. Figma is an excellent design tool that is more accessible to devs since it’s web-based and collaborative. Devs get better access to measurement tools, colors, and specific CSS values that can be forklifted into a component, but honestly that saves us 2—5 lines of code in the component implementation, so don’t get hung up on that. &lt;/li&gt;
&lt;li&gt;Don’t try to keep your static designs perfectly up to date with the work that makes it into production. Design tools are best used for creating a point-in-time snapshot. That snapshot will be attached to a story, ticket or issue in the project management tool, directing what developers should be creating. If the first implementation was sloppy and rushed because of deadlines, then put another story in the next sprint and keep circling in on that perfection until the product manager tells you to stop.&lt;/li&gt;
&lt;li&gt;Developers should not be allowed to push code to production without someone reviewing it for proper reuse of components and consistent usage of design token values instead of hard-coded colors, fonts and sizes.&lt;/li&gt;
&lt;li&gt;The designer needs to start with a systems and tokens mindset. They have to create reusable symbols that stick to a strict set of font styles, and colors. These values need to be synced with the code component theme values constantly. Also, the designer should have symbolic representations in their design tool that closely match up with the components that the developers have created. &lt;/li&gt;
&lt;li&gt;A documentation site or app for you system is nice, but quickly turns into so much useless static artifacts if it’s not tightly integrated with the code that runs in production. For this reason we use &lt;a href="https://docz.site/"&gt;Docz&lt;/a&gt; to write markdown with lots of integrated live examples of everything the component API is capable of.&lt;/li&gt;
&lt;li&gt;Having a designer that knows how to write CSS and HTML is incredibly valuable. Working in the correct medium of the web is a turbo-booster in making that transition from idea to implementation. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I still operate on both sides of this line, I produce designs for one team to implement in Figma, and have to answer their questions to give specific answers about all the details that a static image can’t cover. In my experience humility and agility are key in the design role.&lt;/p&gt;

&lt;p&gt;I also create React components based on the work of designers in another team and manage a dev team that produces components in a design system. We have to deal with all the technical aspects of packaging up a library of reusable widgets, and maintaining them. I believe Organization and communication skills are key in the engineering management role.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Weeknotes 5</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Sat, 23 Mar 2019 18:15:00 +0000</pubDate>
      <link>https://dev.to/sirtimbly/weeknotes-5-4oha</link>
      <guid>https://dev.to/sirtimbly/weeknotes-5-4oha</guid>
      <description>&lt;p&gt;Liquid syntax error: Unknown tag 'endraw'&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Weeknotes #4</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Thu, 14 Mar 2019 18:15:00 +0000</pubDate>
      <link>https://dev.to/sirtimbly/weeknotes-4-21gc</link>
      <guid>https://dev.to/sirtimbly/weeknotes-4-21gc</guid>
      <description>&lt;h2&gt;
  
  
  Monday
&lt;/h2&gt;

&lt;p&gt;Hmm… guess I missed last week. Stress sunk it’s claws into me.&lt;/p&gt;

&lt;p&gt;Sore back. I’m feeling so old. Did some babysitting. Grateful for a big blessing on our family.&lt;/p&gt;

&lt;p&gt;Cleaned up inboxes and task lists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tuesday
&lt;/h2&gt;

&lt;p&gt;Business development and networking.&lt;/p&gt;

&lt;p&gt;Created a “hire-me” page which required further integration of the CMS on systematicui.com as well as creating a twitter card.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wednesday
&lt;/h2&gt;

&lt;p&gt;Can’t stop reading about &lt;a href="https://inv.tech"&gt;inv.tech&lt;/a&gt;. What a fascinating company, so completely transparent.&lt;/p&gt;

&lt;p&gt;Completely trapped by over a foot of snow. Winter is still here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thursday
&lt;/h2&gt;

&lt;p&gt;So, I built an interesting script for generating a Nuxt website from a static HTML file. It’s not that hard but it is interesting. Nuxt will lose any static payload data once it’s done with hydration, assuming that you will make an API call after hydration. That’s a bit of a pain, so you have to write your dynamic generation-time data into a JSON file and then embed it in your output JS with webpack &lt;code&gt;require()&lt;/code&gt; assignment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Friday
&lt;/h2&gt;

&lt;p&gt;🌞🌤❄️🌬☔️&lt;a href="https://www.npmjs.com/package/emojiweather"&gt;cool emoji weather library&lt;/a&gt; parses text and picks an emoji.&lt;/p&gt;

&lt;p&gt;Started watching &lt;a href="https://www.invisionapp.com/design-system-manager/expert-advice/heartache-design-scale"&gt;https://www.invisionapp.com/design-system-manager/expert-advice/heartache-design-scale&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I ordered contacts with an app. Pretty neat experience, but it’s still amazing how often multi-step forms lose state or experience similar bugs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.prototypr.io/what-do-you-need-to-know-before-starting-a-design-system-448158acc084"&gt;https://blog.prototypr.io/what-do-you-need-to-know-before-starting-a-design-system-448158acc084&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/invisible-reports/why-report-in-public-d4b94306a52f"&gt;https://medium.com/invisible-reports/why-report-in-public-d4b94306a52f&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Weeknotes #3</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Sat, 02 Mar 2019 18:15:00 +0000</pubDate>
      <link>https://dev.to/sirtimbly/weeknotes-3-45hf</link>
      <guid>https://dev.to/sirtimbly/weeknotes-3-45hf</guid>
      <description>&lt;p&gt;Over the Weekend I spent quite a bit of time on a side project that could turn into a really interesting service. It’s a tool that’s useful for deploying and testing CSS design systems. Puppeteer + Docker + Node + Typescript + Mongo Stitch. Super exciting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monday
&lt;/h2&gt;

&lt;p&gt;Played with my boys in the morning, enjoyed the sun and watched a small avalanche on the mountain nearby.&lt;/p&gt;

&lt;p&gt;I’ve been writing docs, and came up with 12 Factors for Enterprise-Level Front-End Code Quality&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Linting&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Unit Testing&lt;/li&gt;
&lt;li&gt;E2E or Integration Testing&lt;/li&gt;
&lt;li&gt;Git, PRs and Code reviews&lt;/li&gt;
&lt;li&gt;Continuous Integration&lt;/li&gt;
&lt;li&gt;Multiple Environments&lt;/li&gt;
&lt;li&gt;Dependency Mgmt. &amp;amp; Security Auditing&lt;/li&gt;
&lt;li&gt;Visual Regression Testing&lt;/li&gt;
&lt;li&gt;Error Monitoring&lt;/li&gt;
&lt;li&gt;Performance Monitoring&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tuesday
&lt;/h2&gt;

&lt;p&gt;Hey someone &lt;a href="https://github.com/frctl/fractalite"&gt;started on a new version of Fractal&lt;/a&gt;! It even has a Vue demo. 😍&lt;/p&gt;

&lt;p&gt;I built a new project boilerplate for design system projects using &lt;a href="https://parceljs.org/"&gt;Parcel&lt;/a&gt; for compilation, &lt;a href="https://github.com/xojs/xo"&gt;XO&lt;/a&gt; for Linting, even somehow managed to get &lt;a href="https://github.com/xojs/eslint-config-xo-typescript"&gt;TypeScript Support&lt;/a&gt; working.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wednesday
&lt;/h2&gt;

&lt;p&gt;Created a project generator script for design systems with different boilerplate options for folder structure and CSS preprocessors. &lt;a href="https://github.com/sirtimbly/systematic-ui-scripts"&gt;https://github.com/sirtimbly/systematic-ui-scripts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rebuilt a Nuxt 1.4 site in Nuxt 2.4. Figured out how to get ESLint working with that setup, and typescript again. What a pain. I never realized how easy TSLint was.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thursday
&lt;/h2&gt;

&lt;p&gt;Posted a new project on my portfolio. &lt;a href="https://www.behance.net/gallery/76934425/Complex-Industry-Management-Application-Design"&gt;Designing a Perfect-fit Soluton for a Niche Industry&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Friday
&lt;/h2&gt;

&lt;p&gt;Re-discovered &lt;a href="http://astrum.nodividestudio.com/"&gt;Astrum&lt;/a&gt; for design systems. Light weight design systems running on JS in the browser. No build step or dev server. Interesting.&lt;/p&gt;

&lt;p&gt;Order some &lt;a href="https://darntough.com/"&gt;Darn Tough Socks&lt;/a&gt; they last a long time and when they do wear out you can get free replacements from the company.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Weeknotes #2</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Thu, 21 Feb 2019 18:15:00 +0000</pubDate>
      <link>https://dev.to/sirtimbly/weeknotes-2-pgf</link>
      <guid>https://dev.to/sirtimbly/weeknotes-2-pgf</guid>
      <description>&lt;h2&gt;
  
  
  Monday
&lt;/h2&gt;

&lt;p&gt;Fixed design bugs on timbly.com, more responsive, using tachyons.&lt;/p&gt;

&lt;p&gt;Had to figure out how to tell if a slot is empty on a Vue component (TS class).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;hasDefaultSlot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$slots&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It’s 2019 and CSS is awesome. But, we &lt;a href="https://stackoverflow.com/questions/31974448/how-can-i-prevent-having-just-one-hanging-word-on-a-new-line-in-an-html-element"&gt;still can’t&lt;/a&gt; prevent orphan words when wrapping lines of text.&lt;/p&gt;

&lt;p&gt;Have you tried &lt;a href="https://www.sublimemerge.com/"&gt;Sublime Merge&lt;/a&gt;? I opened it again today – I like it, but I think I still prefer &lt;a href="https://git-fork.com/"&gt;fork&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tuesday
&lt;/h2&gt;

&lt;p&gt;I’m using the AWS Amplify SDK, and it’s pretty decent. Fully featured authentication implementation. Their &lt;a href="https://aws-amplify.github.io/docs/js/"&gt;docs are nice&lt;/a&gt;, and they ship Vue and Reat UI components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wednesday
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://iconsvg.xyz/"&gt;A super usefuly way to get basic SVG icons quickly&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Thursday
&lt;/h2&gt;

&lt;p&gt;Doing a lot of Git rebase from multiple developers.&lt;/p&gt;

&lt;p&gt;Trying to get &lt;a href="https://github.com/FortAwesome/vue-fontawesome"&gt;fontawesome-vue&lt;/a&gt; to actually do treeshaking… with limited success.&lt;/p&gt;

&lt;h2&gt;
  
  
  Friday
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.browserless.io/blog/2018/06/04/puppeteer-best-practices.html"&gt;An article about running puppeteer automatically&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nezhar/chrome-shots"&gt;A good starting place for automated chrome screenshots&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lot’s of time automating visual regressing tests.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Weeknotes #1</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Sat, 16 Feb 2019 18:15:00 +0000</pubDate>
      <link>https://dev.to/sirtimbly/weeknotes-1-22ae</link>
      <guid>https://dev.to/sirtimbly/weeknotes-1-22ae</guid>
      <description>&lt;p&gt;Saw this “Weeknotes” idea on some &lt;a href="http://daverupert.com/2019/02/weeknotes-2/"&gt;other blogs&lt;/a&gt; and decided it’s a good idea. For a while I was trying to write an article every week on &lt;a href="https://dev.to/sirtimbly"&gt;dev.to&lt;/a&gt; – but I missed week 6 and now it’s hard to get back on the habit. Maybe if I’m adding some value to my personal blog again I can be a little more motivated to write.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monday
&lt;/h2&gt;

&lt;p&gt;Watched too much twitch. Apex Legends looks so awesome.&lt;/p&gt;

&lt;p&gt;Set up perforance monitoring of an app through &lt;a href="https://calibreapp.com"&gt;Calibre&lt;/a&gt; - It’s really excellent.&lt;/p&gt;

&lt;p&gt;Looked at the latest version of &lt;a href="https://uiengine.uix.space"&gt;UI Engine&lt;/a&gt; to see if it’s a good basis for my next design system. It can display plain HTML or handlebars templates like Fractal, but it also supports displaying Vue and React components, so that’s a pretty good option. Latest version has some great improvements in configuration also.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tuesday
&lt;/h2&gt;

&lt;p&gt;Found &lt;a href="https://uptimerobot.com"&gt;uptime robot&lt;/a&gt;. Good free plan. Found an &lt;a href="https://remysharp.com/2019/02/12/cern-day-1"&gt;interesting blog from Remy Sharp about rebuilding the very first web browser at CERN on the 30th anniversary of the web&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wednesday
&lt;/h2&gt;

&lt;p&gt;Lot’s of code reviews today. Hunting down the domain registrar for a client to see why their old website hosting dissappeared. Mystery. If it weren’t for &lt;a href="////archive.org"&gt;the wayback machine&lt;/a&gt; we would lose a lot more websites due to neglect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thursday
&lt;/h2&gt;

&lt;p&gt;Spent a lot of time building a initial prototype serverless+FRETS app on Zeit Now. Amazing stack. Will have to write more. It is totally possible to deploy &lt;a href="https://zeit.co/blog/scalable-apps-with-typescript-and-now-2"&gt;serverless functions written in TypeScript without pre-compiling&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Friday
&lt;/h2&gt;

&lt;p&gt;Discussed CSS and HTML with my mentee. Lots of basic rules like when to use &lt;code&gt;position&lt;/code&gt;. The concepts of selector specificity, and background images. Saw a really weird thing happen when viewing a flex element on Chrome mobile viewport emulator. The whole flex item shrunk down to fit in the available flexbox space… interesting. Setting a pixel value on the flex item seemed to solve it.&lt;/p&gt;

&lt;p&gt;Saw this article about UX and login forms from Brad Frost. &lt;a href="http://bradfrost.com/blog/post/dont-get-clever-with-login-forms/"&gt;Don’t Get Clever with Login Forms&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Great Divide is Real, But You Get to Choose Your Side</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Sun, 03 Feb 2019 00:26:33 +0000</pubDate>
      <link>https://dev.to/sirtimbly/the-great-divide-is-real-but-you-get-to-choose-your-side-42i0</link>
      <guid>https://dev.to/sirtimbly/the-great-divide-is-real-but-you-get-to-choose-your-side-42i0</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fvtcfoszaitot0z8yge0d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fvtcfoszaitot0z8yge0d.jpg" alt="https://thepracticaldev.s3.amazonaws.com/i/vtcfoszaitot0z8yge0d.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some articles recently have had an impact on me, and they are important for context in this debate that is boiling up in our industry. I recommend reading &lt;a href="https://css-tricks.com/the-great-divide/" rel="noopener noreferrer"&gt;The Great Divide&lt;/a&gt;, &lt;a href="https://rachelandrew.co.uk/archives/2019/01/30/html-css-and-our-vanishing-industry-entry-points/" rel="noopener noreferrer"&gt;HTML CSS and Our Vanishing Entry-Points, by Rachel Andrews&lt;/a&gt; - as well as &lt;a href="https://christianheilmann.com/2019/01/28/html-is-and-always-was-a-compilation-target-can-we-deal-with-that/" rel="noopener noreferrer"&gt;HTML is a Compilation Target by Christian Heilmann&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;I don't actually feel all that angry about the way CSS and HTML are being treated. I feel worried. And, as is normal, the worry is about identity and how I'm perceived by others. I'm worried that I am being foolish and short-sighted about web app development. And I'm worried that I'm not actually the kind of web designer that I thought I was.&lt;/p&gt;

&lt;p&gt;And what is that identity I'm worried about maintaining? I started as the guy who does HTML and CSS cutup of photoshop files. I worked at a small agency with one other designer and several "programmers". We built hundreds of websites for small businesses. I had been making websites for myself and other since 1999, but when I graduated from college and started a "career" I really grew into an expert with CSS and all the little browser quirks and tricks that needed to be discovered the hard way. &lt;/p&gt;

&lt;p&gt;I convinced the other people in my team to move from table layouts to pure CSS around 2006. Floats, man. Floats... &lt;em&gt;Shudder&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I had taken computer science classes in college along side all the design and communication classes, but it wasn't really something I loved. I thought of myself as a designer first, but I was expected to turn my photoshop designs into real flexible web page templates that could handle any content that a CMS might put into them. And doing that design work in a browser was a lot of fun for me. The mysterious alchemy of server side programming was still a little bit beyond what I was comfortable with, despite a few forays into PHP during college. Eventually, I began scripting interactions inside Flash widgets and "Rich Internet Applications". I was able to take that knowledge and begin applying that to javascript in the browser. And around that time jQuery came out and made everything so much better.&lt;/p&gt;

&lt;p&gt;Due to some weird career shifts I found myself as a developer on an enterprise backend web development team in 2010. I found myself learning new skills rapidly, backend programming with C# and ASP.Net MVC, database design, architecture diagrams, big enterprise software development lifecycle procedures.&lt;/p&gt;

&lt;p&gt;What I've discovered over the past 20 years is that really what I wanted all along was to build awesome experiences that were easy to build and easy to share. HTML and CSS were never "the easy entry point", they were the weird technical fiddly syntax that you needed to learn to manipulate to get the desired output on the screen. Learning to be a programmer was something that had to happen organically as I needed it. Now that I've been diving deep into coding javascript applications for the last 5 years, and writing backend server apps for 9 years, I can say that I don't care to treat HTML and CSS as anything particularly "precious". They are just the structured data formats that are needed to tell the browser how to render the UI. If we have layers of tools that can create all the necessary HTML and CSS dynamically from javascript, then it doesn't really matter to me. We can still make that app accessible, we can still make it performant, we can still open it up in developer tools and view all the DOM nodes and style properties.&lt;/p&gt;

&lt;p&gt;I don't think writing all your CSS in JS is a good idea. I think we can still build useful and reusable CSS that takes advantage of the cascade, instead of fearing it. We can deal with the nature of global scope through understanding instead of just overwriting everything with a random ID to create isolation. CSS was built as it is for a reason, it's worthwhile to know the why's and understand how to use those aspects. But, that doesn't mean it's always wrong to subvert the usual expectations of how CSS works. &lt;a href="https://css-tricks.com/growing-popularity-atomic-css/" rel="noopener noreferrer"&gt;Atomic CSS&lt;/a&gt; is a great example of this.&lt;/p&gt;

&lt;p&gt;I've always held onto an identity as a frontend developer, even while I was focusing on design, or server-side development. And now that my own vision of frontend developer fits more closely with the larger view of the flood of newer JS engineers that build single page apps and bypass HTML and CSS when it's convenient, I wonder if I'm being short-sighted and irresponsible with my craft. I care about treating the web responsibly with a long-term perspective on our work being usable for dozens of years. If we build a content website with a JS toolchain we need to make sure it's outputting static HTML pages that are enhanced by JS when it's loaded - like &lt;a href="https://nuxtjs.org" rel="noopener noreferrer"&gt;Nuxt&lt;/a&gt; does.&lt;/p&gt;

&lt;p&gt;I ended up in a place where I think the modern toolchains and SPA development frameworks are really exiting and useful. I know more than I ever expected to know about the event loop, the call stack, virtual-dom, and functional code. And it was my choice to pursue learning what I did. I have privilege and luck and a great deal of enthusiasm to help me arrive at the side of the divide where I am. I can tell you it's not a great divide anymore, It's just exciting to look out across a rich and varied landscape of web development approaches and think back fondly on the peaks that I've stood upon in the past and look ahead to the foggy future where more exiting climbs await me.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>css</category>
      <category>html</category>
    </item>
    <item>
      <title>You Could be Building a Web app Without Writing any New HTML or CSS code. 😳 🤯</title>
      <dc:creator>Tim Bendt</dc:creator>
      <pubDate>Thu, 24 Jan 2019 00:02:47 +0000</pubDate>
      <link>https://dev.to/sirtimbly/you-could-be-building-a-web-app-without-writing-any-new-html-or-css-code---l7c</link>
      <guid>https://dev.to/sirtimbly/you-could-be-building-a-web-app-without-writing-any-new-html-or-css-code---l7c</guid>
      <description>&lt;p&gt;I have been writing a lot of web apps for a long time. Over the past year or so I've been slowly developing a functional JavaScript library for browser-based-apps. I was inspired by the wide variety of virtual-dom based libraries, and the concepts of functional reactive programming. Specifically there is a pattern that captured my imagination called &lt;a href="https://sam.js.org" rel="noopener noreferrer"&gt;SAM&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;SAM stands for State Action Model. And it's a way of constructing your app that works really well with simple vanilla JS. I wanted to write something using this pattern but with the additional help of TypeScript. &lt;/p&gt;

&lt;p&gt;I like the idea of building something from first principles to understand what's really going on. So I started looking into how these libraries like React, Vue, Preact, and Mithril work. I discovered that you don't have to use JSX or a template compiler, you can just write hyperscript functions to render your UI. I found a &lt;a href="https://maquettejs.org" rel="noopener noreferrer"&gt;lightweight standalone virtualdom implemented in TypeScript&lt;/a&gt; and started wrapping some helpers around it to make the SAM pattern easy to follow.&lt;/p&gt;

&lt;p&gt;Thus was born FRETS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fuploads.timbendt.com.s3.amazonaws.com%2Fdropzone%2Ffretslogo4%401x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fuploads.timbendt.com.s3.amazonaws.com%2Fdropzone%2Ffretslogo4%401x.png" alt="FRETS logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sirtimbly/frets#readme" rel="noopener noreferrer"&gt;https://github.com/sirtimbly/frets#readme&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to see what a FRETS app looks like in action then &lt;a href="https://gallant-stonebraker-acf958.netlify.com/" rel="noopener noreferrer"&gt;check out this little Demo&lt;/a&gt;. It demonstrates the basic functionality of navigation, validation, and async updates.&lt;/p&gt;

&lt;p&gt;Take a look at the code in the &lt;a href="https://github.com/sirtimbly/frets-starter" rel="noopener noreferrer"&gt;frets-starter app&lt;/a&gt; to see how it's all pieced together. UI Components are pure functions. They simply return a bunch of VNodes (Virtual Dom Nodes) for the virtual-dom &lt;a href="https://maquettejs.org" rel="noopener noreferrer"&gt;rendering layer&lt;/a&gt; to use for diffing. Functions are superior to objects and template strings because they are easy to compose and refactor. (Especially with TypeScript).&lt;/p&gt;

&lt;p&gt;The user interface is a pure function with no side-effects because it is only responsible for expressing the contents of the modelProps object, which is frozen and marked as &lt;code&gt;Readonly&lt;/code&gt; for strictness whenever a developer is expected to interact with it. This is one area where Typescript can really help prevent deep modification and accidental side-effects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Atomic CSS transformed into JS
&lt;/h2&gt;

&lt;p&gt;When you see how these UI rendering methods are written you'll notice they don't look like normal hyperscript functions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$$&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./base-styles.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;grayBox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;childNodes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;border&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rounded&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bgLightyGray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;childNodes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of passing the tag name and class names as strings, I created a tool that analyzes any CSS file and generates a typescript file full of chainable helper methods to generate hyperscript functions that can only implement a strict set of classes. This approach perfectly fits the atomic CSS libraries that provide a huge collection of classes that apply exactly one visual CSS property. I like using &lt;a href="https://tachyons.io" rel="noopener noreferrer"&gt;Tachyons&lt;/a&gt; or it's lighter ancestor &lt;a href="http://basscss.com/" rel="noopener noreferrer"&gt;Bass CSS&lt;/a&gt;. The api is fluent, every time you hit '.' you get auto-completion listing all the available CSS properties to add. And when you're done chainging Atomic CSS classes you call the &lt;code&gt;.h()&lt;/code&gt; method and pass in the properties and childnodes like you would with any other hyperscript function.&lt;/p&gt;

&lt;p&gt;So the end result of this is that you're not writing anything that looks like HTML syntax or CSS syntax for your app. You're just writing functions that create HTML in the Dom and using developer friendly tools to help you find and use the CSS classes available to you for visual formatting. It's like an evolution of CSS in JS, but without the JS ever needing to parse or create CSS during runtime. &lt;/p&gt;

&lt;p&gt;I like HTML and CSS. I've been building websites for almost 20 years now. I know CSS very well, and I do not hate it. I just think it's interesting to try something new, and as a developer I enjoy the way my IDE helps me write very functional and composable code without having to do any template interpretation.&lt;/p&gt;

&lt;h2&gt;
  
  
  State
&lt;/h2&gt;

&lt;p&gt;The state in FRETS is a custom class that you pass into the FRETS constructor. Your UI will be a pure expression of this immutable object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodoListProps&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PropsWithFields&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ITodo&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// set some defaults&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Actions
&lt;/h2&gt;

&lt;p&gt;Actions are what respond to user interactions and events. When someone clicks something or types into a field the state has to be updated. Actions are responsible for this. First you write an empty class to specify your action names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodoListActions&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ActionsWithFields&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;saveName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// and the rest with this same type signature&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You have to then specify your concrete implementation on the FRETS object after it's been initialized.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;F&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FRETS&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TodoListProps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TodoListActions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TodoListProps&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TodoListActions&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;changeName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerAction&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TodoListProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// add action specific business logic here, but not validation&lt;/span&gt;
  &lt;span class="c1"&gt;// also you can add 3rd party API calls here&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any actions that kick off an async function can call &lt;code&gt;F.render()&lt;/code&gt; inside it's promise &lt;code&gt;.then&lt;/code&gt; handler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model
&lt;/h3&gt;

&lt;p&gt;The Model is responsible for handling, validating and calculating the proposed new properties that the "actions" return. This is done through two functions you specify on your app, &lt;code&gt;validator&lt;/code&gt; and &lt;code&gt;calculator&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Register the state calculation function&lt;/span&gt;
&lt;span class="nx"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newProps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TodoListProps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oldProps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TodoListProps&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;TodoListProps&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// add your derived state business logic here&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;completedCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newProps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;newProps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;completedCount&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All changes to the UI that is displayed have to be based up the values that are finally returned from the "calculator" method. Which get stored on &lt;code&gt;F.modelProps&lt;/code&gt; and are accessible from inside the UI rendering methods because they receive a reference to the App as an argument every time rendering occurs (automatically after any action is triggered).&lt;/p&gt;

&lt;p&gt;All of this working together creates a predictable loop of logic that should be easy to reason about for a developer. You always know exactly where your business logic is: mutations are happening inside an action, and derived values are inside the calculator function. Rendering logic is always in the rendering functions, and you should be able to reason about how the UI got into the state it is at any point in the application's lifecycle.&lt;/p&gt;

&lt;p&gt;There's a lot more about this in the &lt;a href="https://sirtimbly.github.io/frets/" rel="noopener noreferrer"&gt;API docs&lt;/a&gt;. And some more friendly docs are coming soon. Thanks!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>functional</category>
      <category>virtualdom</category>
    </item>
  </channel>
</rss>
