<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://blog.danbraun.me/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>blog.danbraun.me</title>
    <link>https://blog.danbraun.me/</link>
    <atom:link href="https://blog.danbraun.me/feed.xml" rel="self" type="application/rss+xml" />
    <description>A blog written by Dan Braun</description>
    <language>en</language>
    <item>
      <title>Kayaking Wingra Creek</title>
      <link>https://blog.danbraun.me/posts/kayaking-wingra-creek/</link>
      <description>&lt;p&gt;I&#39;ve used this path next to a creek dozens of times. Today I instead kayaked down the creek and it was like I&#39;d never been there before.&lt;/p&gt;
&lt;p&gt;I was going to drive all the way to Madison for a 9 A.M. race and wanted to do more with my time there, so I brought along my kayak. The race would start and end right by a place to put a kayak into a creek I&#39;ve only ever walked or rode along.&lt;/p&gt;
&lt;p&gt;The creek barely has any current at all and continues from where I was for about 2 miles east before feeding into Lake Monona. It was quiet, easy paddling.&lt;/p&gt;
&lt;p&gt;Wildlife was twice as close to me. I floated close enough to illicit indignant glares from a few herons (including an elusive green one). In the water, it was mostly small pan fish except for several very large carp.&lt;/p&gt;
&lt;p&gt;I ended up traversing the lake ahead and paddling a loop around another alcove, adding 3 or 4 miles to my route. But the Wingra Creek stretch exceeded my expectations.&lt;/p&gt;
&lt;p&gt;Although my experience was bolstered by perfect weather, sunny and in the mid-seventies - no wind, I would highly recommend this sneaky little river for an urban paddle.&lt;/p&gt;
&lt;video controls=&quot;&quot;&gt;
        &lt;source src=&quot;https://res.cloudinary.com/brauntrutta/video/upload/s--fBeXgIn6--/f_auto:video,q_auto/v1/blog/jwaxeuclk9rjica6xjnl&quot; type=&quot;video/mp4&quot; /&gt;
        Your browser does not support the video tag.
    &lt;/video&gt;
</description>
      <pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/kayaking-wingra-creek/</guid>
    </item>
    <item>
      <title>Visiting Seattle, Washington</title>
      <link>https://blog.danbraun.me/posts/visiting-seattle-washington/</link>
      <description>&lt;p&gt;For a special race, I flew to Seattle, WA.&lt;/p&gt;
&lt;h2&gt;Getting to My Motel 6&lt;/h2&gt;
&lt;p&gt;Not planning in advance and spending very little time looking, I got the motel I deserved. At first I thought myself clever. After landing in SeaTac I need only to take the light rail south one stop to it&#39;s terminus. From there it should have been an easy one mile walk with a single right turn. As it would turn out, Military &amp;quot;Road&amp;quot; was treated locally as a highway. It had no sidewalk, forcing me to pull my roller bag directly behind me lest it get run over by high speed traffic.&lt;/p&gt;
&lt;p&gt;Crossing a railing-less overpass, rearview mirrors from large trucks wizzed by inches from my head. Amongst the detritus, I stepped over broken glass and gobs of VHS tape that had been eviscerated from a cassette which, when I saw it, was labeled with the movie &lt;em&gt;Lethal Force&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The motel room itself was, minimal. No coffee machine and it was a walk over to the next building to get ice.&lt;/p&gt;
&lt;h2&gt;Shake Out Run&lt;/h2&gt;
&lt;p&gt;I was in town for a race in 2 days so after my harrowing walk to the room, I changed and headed back out the same direction to a public path which lead to Puget Sound.&lt;/p&gt;
&lt;p&gt;Just 1 block west of where the train dropped me off earlier, the path started and lead down a ravine, following a creek towards the Sound for about 4 miles.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/path-to-sound&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/path-to-sound 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/path-to-sound 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/path-to-sound 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a fern lined paved path&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;850&quot; /&gt;&lt;figcaption&gt;The path to Puget Sound&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Besides frequent low flying air traffic and a section that passed an odoriferous sewage treatment plant, it was a pleasant and well occupied trail. I saw a few other joggers, dog walkers and biker riders along the way.&lt;/p&gt;
&lt;p&gt;At the end of the trail I followed a long fishing peer into the Sound to make my turnaround. There might have been otters splashing just below the waves in the clear saltwater. A sign on the pier informed visitors on which crabs were legal to catch.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/puget&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/puget 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/puget 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/puget 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a wide view of Puget Sound&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1200&quot; /&gt;&lt;figcaption&gt;A bay with Puget Sound beyond&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Time to Be a Tourist&lt;/h2&gt;
&lt;p&gt;I woke up Friday morning relieved that nothing terrible happened overnight at this motel. I slept well and didn&#39;t notice any bed bugs.&lt;/p&gt;
&lt;p&gt;My plan was to put on a backpack and take the light rail north to downtown Seattle. I would not worry about looking like a dorky tourist with a camera. I would see all the big things.&lt;/p&gt;
&lt;p&gt;The &amp;quot;1 Line&amp;quot; as it&#39;s called was fast but it would take over 30 minutes before I&#39;d exit the car into one of the 4 downtown stations. Sitting with my full backpack beside me and facing the opposite side of the train car, I craned my neck around to see the city go by between each stop.&lt;/p&gt;
&lt;p&gt;After descending into a final tunnel I stepped out onto the platform for the University Street station and walked to my first stop, a coffee shop to caffeinate, eat a sausage egg sandwich and catch up on my journal. It was early and Pike Place Market wouldn&#39;t be open for a couple of hours yet.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/pikes&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/pikes 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/pikes 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/pikes 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Pike Place Market&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;914&quot; /&gt;&lt;figcaption&gt;Pike Place Market&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;It was a hotel lobby and not very interesting to sit at, so I left and started to walk my way to the Pike Place Market area. When I made it there it was barely 7 AM and very empty. I could see where everything would be, but I did not see boats being unloaded by fishermen in boots and raincoats like I envisioned. It was more like a closed shopping mall.&lt;/p&gt;
&lt;p&gt;I walked past the big famous sign and found the glistening, grotesque gum walls. It was too dark for good photos, but that was probably for the best.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/gumwall&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/gumwall 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/gumwall 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/gumwall 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;walls in an alley covered in thousands of pieces of chewing gum&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; /&gt;&lt;figcaption&gt;The Gum Walls&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I followed a maze of alleys and closed shops to find the water front. Unfortunately, I&#39;d timed my visit during a massive construction project that rendered most of the Seattle waterfront behind Pike Place Market a wasteland of closed sidewalks, traffic barrels and machinery. Through chain linked fences I saw the big ferris wheel sitting idly, still under a shadow as 8 AM passed. A fog gloomed off the bay and draped over the sky scrappers.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/morning-ferris&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/morning-ferris 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/morning-ferris 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/morning-ferris 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;dark and deserted waterfront with a idle ferris wheel&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; /&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/fog-scrapers&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/fog-scrapers 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/fog-scrapers 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/fog-scrapers 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;fog surrounding sky scrapers&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; /&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;It occurred to me that I needed to get to the Space Needle. Then I could come back here when everything was open. I pre-purchased my tickets sitting at another coffee shop and walked several blocks over to the Seattle Center. The line was already long but moved quickly. The Space Needle was full of thousands of other space needles, in that there were models of it everywhere. The Space Needle in varying states of construction, the Space Needle made out of Legos and of course the many Space Needles for sale in the gift shop. I was set on getting a Space Needle snow globe.&lt;/p&gt;
&lt;p&gt;The line of visitors was broken into chunks and feed into an elevator which sped ear-poppingly fast up the tower with windows facing the city. I arrived at the top and started wandering around with my camera, dodging selfie sticks and ducking past photos in progress.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/needle-view&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/needle-view 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/needle-view 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/needle-view 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a view of the Seattle skyline from the Space Needle&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; /&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The fog had mostly lifted and staff did a good job of keeping the observation deck from becoming too crowded. After a couple of laps I took a staircase down to a lower deck with a rotating, glass floor.&lt;/p&gt;
&lt;p&gt;Having absorbed the experience to my satisfaction I queued up for the ride back down to find my snow globe. A recorded narration informed us about the buildings visible from the elevator. At the bottom the door opened into the round expanse of the Space Needle gift shop. With the assistance of a cheery gender fluid employee at the counter I chose a globe that made the most sense to me. Not too big, but not too slight looking either.&lt;/p&gt;
&lt;p&gt;With the Space Needle experience completed, I walked back to Pike Place Market. At this point I was getting concerned about my increasingly sore legs and the race tomorrow. Seattle is built on some very steep hills, to my surprise.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/steep&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/steep 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/steep 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/steep 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;the steep grade of a downtown street in Seattle&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; /&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The market was now in full swing. Vendors at the farmer&#39;s market sold blemish-less produce from curated displays. I saw the guys shouting orders at the famous fish throwing area; though I did not see any fish being thrown.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/produce&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/produce 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/produce 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/produce 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;produce at a famers market&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; /&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/fish-market&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/fish-market 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/fish-market 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/fish-market 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a fish market display of fresh fish on ice&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; /&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/fish-mongers&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/fish-mongers 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/fish-mongers 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/fish-mongers 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;the famous fish mongers of pike place market in seattle standing around and talking to people&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;757&quot; /&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Fish did land on my plate for a late lunch of grilled salmon and prawn cocktail. I did some shopping after finding a few interesting small independent shops selling unique art shirts and ironic pop culture designs on refrigerator magnets. Ron (Swanson) Solo? Yes!&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/glass-orbs&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/glass-orbs 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/glass-orbs 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/glass-orbs 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a view down an urban alley with hanging glass orb lights&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; /&gt;&lt;figcaption&gt;A well known view in downtown Seattle&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I couldn&#39;t stay downtown for much longer, my rental car would be ready soon. After a short break in my motel room I called my second ever Uber ride to take me to the rental place. My driver nearly drove into oncoming traffic on the way out and apologized profusely. Before I exited his car I told him to be careful. &amp;quot;You are too young to die.&amp;quot;&lt;/p&gt;
&lt;p&gt;With the freedom of my own vehicle I pointed it towards Mt. Rainier. This was a new idea. I saw its snow covered peak from the train on the way back to my motel and was blown away. I don&#39;t know how I missed it from the Space Needle. It must had been covered by clouds.&lt;/p&gt;
&lt;p&gt;It struck me as utterly improbable that something on our planet could look so huge. The Cascade mountain range is visible to the east from Seattle. These looked reasonably sized considering their distance. But as you follow them with your eyes to the south, this ridiculous white and blue triangle reaches so far into the sky that it looks like a geometrically peculiar group of clouds. How close could I get to it before the sun went down?&lt;/p&gt;
&lt;p&gt;Apparently close enough that I couldn&#39;t see it anymore. I drove up to a trailhead north of the mountain and could now only see the towering &amp;quot;foothills&amp;quot; at the perimeter of the national park. The best view during this impromptu side quest was from a small park on Tapper lake. I made a promise to myself to return to Mt. Rainier at some point in the future.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/foothills&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/foothills 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/foothills 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/foothills 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;blog author at the foothills of mt. rainier&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; /&gt;&lt;figcaption&gt;Selfie of me just within the borders of Mt. Rainier National Park&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/mtrainier&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/mtrainier 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/mtrainier 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/mtrainier 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Mount Rainier in the distance&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;732&quot; /&gt;&lt;figcaption&gt;Mt. Rainier&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Race Day&lt;/h2&gt;
&lt;p&gt;Saturday was race day. I quickly got ready and drove towards Carnation. The race went better than expected. I share that experience in &lt;a href=&quot;https://blog.danbraun.me/posts/i-beat-the-blerch/&quot;&gt;this post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The driving directions home brought me though the heart of rush hour. I wondered if these people around me did this every day. Were the Audis and Teslas worth it?&lt;/p&gt;
&lt;p&gt;I dropped off my car and got back on the light rail to spend a final afternoon in the City. This time I set off from the Chinatown International District station to explore and find some interesting things to eat.&lt;/p&gt;
&lt;p&gt;Sushi and wagyu sliders from Fuji Sushi were my first treats. Wagyu is fancy beef. These were fancy sliders. Later I would dive into something new to me, a shaved ice treat with taro balls and grass jelly. This was a traditional Taiwanese dessert from a place called Meet Fresh. Taro balls are created by mashing together dasheen (or taro, a root vegetable), sweet potato and tapioca starch - it reminded me of mochi. The grass jelly was like a black tasteless jello. Kind of weird but good with a bite of ice cream.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/sushi-sliders&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/sushi-sliders 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/sushi-sliders 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/sushi-sliders 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a photo of sushi and slider burgers&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1005&quot; /&gt;&lt;figcaption&gt;Sushi and Wagyu Sliders &lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/taro&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/taro 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/taro 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/taro 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a Taiwanese shaved ice dessert&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1200&quot; /&gt;&lt;figcaption&gt;Double Taro Signature 雙芋招牌 (Taro Paste, Vanilla Ice Cream, Taro Balls, Grass Jelly and Grass jelly shaved ice.)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;In between those treats was a hike around the Chinatown area. Lots of interesting places to eat but I only have one stomach. After walking under an overpass, I saw police and EMT surrounding a person who lay unconscious on the sidewalk. Rounding that block and heading back the direction I&#39;d come, I passed many more unhoused and behaviorally unpredictable people.&lt;/p&gt;
&lt;p&gt;Walking later to the Pike Place Market area though Pioneer Park I would see many more homeless people. I&#39;d smell urine often before finally seeing someone pissing on a wall. Public urination and homelessness persists in all cities, but it seemed especially prevalent in Seattle. So much so I looked up some info on it and indeed, Seattle and other West Coast cities have homelessness rates 5 times that of Chicago, for example. &lt;a href=&quot;https://en.wikipedia.org/wiki/Homelessness_in_Seattle&quot;&gt;Studies have found&lt;/a&gt; a large reason for this being housing costs.&lt;/p&gt;
&lt;p&gt;I crossed some invisible line near the waterfront by the big ferris wheel. Here I didn&#39;t notice the homelessness anymore. I saw a &lt;a href=&quot;https://photos.app.goo.gl/2qKoxFACowTfaGVv6&quot;&gt;man playing heavy metal guitar&lt;/a&gt; along with a some pre-recorded material. He wasn&#39;t playing any solos, just jamming along with riffs much like I would have been doing in my bedroom as a teenager. Neither I or this man have been teenagers in a long time. We exchanged devil horns.&lt;/p&gt;
&lt;p&gt;He was doing what I see many buskers here and at home are now doing, playing along to a recording. I don&#39;t like it. It seems like karaoke.&lt;/p&gt;
&lt;p&gt;Following the waterfront amongst the tourists, I was grateful to have my spirits lifted by a Latin American festival with live music (no karaoke).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/festival&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/festival 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/festival 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/festival 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a sunny afternoon festival on a pier&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;804&quot; /&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Pike&#39;s Market was all but completely closed on a Saturday afternoon so I headed back to the train station and motel for the night.&lt;/p&gt;
&lt;h2&gt;The Long Voyage Home&lt;/h2&gt;
&lt;p&gt;The trip home did not go well. I got on my flight ok, but the flight was diverted to an emergency landing in Bozeman, MT due to an ill passenger.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/bozeman&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/bozeman 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/bozeman 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/bozeman 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a view of the mountains from the Bozeman airport&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1200&quot; /&gt;&lt;figcaption&gt;At least I could look at mountains while I waited&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Respect to United for accommodating this individual but this would begin a series of delays. We remained in Bozeman for a few hours. My connection in Chicago would be switched to a later flight because of this and that plane itself would be delayed for its own reasons.&lt;/p&gt;
&lt;p&gt;I got home very late, but my cat was happy to see me.&lt;/p&gt;
</description>
      <pubDate>Sun, 01 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/visiting-seattle-washington/</guid>
    </item>
    <item>
      <title>I Beat the Blerch</title>
      <link>https://blog.danbraun.me/posts/i-beat-the-blerch/</link>
      <description>&lt;p&gt;For my second ever half marathon, I beat The Blerch.&lt;/p&gt;
&lt;p&gt;For a complete explanation, I&#39;ll defer to &lt;a href=&quot;https://theoatmeal.com/comics/running&quot;&gt;Matthew Inman&#39;s comic&lt;/a&gt;. This race event&#39;s theme is based on that.&lt;/p&gt;
&lt;p&gt;Basically, the Blerch is a flying blob of mayonnaise that follows you around, tempting you to slow down or stop, and maybe eat a sandwich.&lt;/p&gt;
&lt;h2&gt;Where Was This Thing?&lt;/h2&gt;
&lt;p&gt;It was slightly silly to run this. I really like &lt;a href=&quot;https://www.theoatmeal.com/&quot;&gt;theoatmeal.com&lt;/a&gt; and Matthew&#39;s humor, but probably not enough to fly 1800 miles from Wisconsin to Seattle. A week or so before &lt;a href=&quot;https://blog.danbraun.me/posts/the-madison-mini-half-marathon/&quot;&gt;my first half marathon&lt;/a&gt;, I was thinking of the comic linked above and Googled around to find it again. I wanted to get a shirt or something with the Blerch on it. This comic has been around since the time I was really starting to get interested in running, 10 or more years ago.&lt;/p&gt;
&lt;p&gt;Then there it was, the &lt;a href=&quot;https://www.beattheblerch.com/&quot;&gt;website&lt;/a&gt; for Beat the Blerch. It would happen in about a month. I already had that week off from work - it was the week of labor day - and I hadn&#39;t yet planned on going anywhere else. I looked up the costs and it wasn&#39;t that bad. I could do this, even if it was a bit silly. First I would see how the Madison race went.&lt;/p&gt;
&lt;p&gt;A week later the Madison race well! I&#39;d fly to Seattle for a race! I rewound my training schedule back 4 weeks as it seemed to work well for my first half marathon - but dialed up things a bit. Adding a minute to intervals and an additional medium long run to each week.&lt;/p&gt;
&lt;h2&gt;Getting There&lt;/h2&gt;
&lt;p&gt;The flight out was unremarkable. From the SeaTac airport I took what&#39;s called the &amp;quot;1 Line&amp;quot;, a light rail system one stop south to a station one mile from my motel.&lt;/p&gt;
&lt;p&gt;Now I had to walk one mile to my motel. This seemed easy enough from Google Maps. However, it proved to be a harrowing experience which I would have do multiple times in the coming days.&lt;/p&gt;
&lt;p&gt;Part of the walk in particular, though not on an actual freeway, felt like it. After a turn south off sidewalks though a sketchy neighborhood, the sidewalk ended and I now had to march along a trash strewn shoulder as cars and trucks speed by at high speeds. Part of this stretch included an overpass crossing the real freeway. The walking space narrowed to about a 2 foot curb. I pulled my roller bag behind me and stepped over broken glass.&lt;/p&gt;
&lt;p&gt;Rear view mirrors on large trucks flew by within inches of my head. Oddly, part of the refuse included gobs of VHS tape from smashed cassettes. One such case was labeled with the movie &amp;quot;Lethal Force&amp;quot;.&lt;/p&gt;
&lt;p&gt;Finally, I arrived at my horrible little motel. A Motel 6. There was no coffee machine in my room. I had to walk outside and into a laundry room next door to get ice. I didn&#39;t bother asking about continental breakfast. I did not put much thought or time into this reservation.&lt;/p&gt;
&lt;p&gt;I would be here for three nights. Despite my traumatic walk, I got changed and headed back the same direction to do a shake out run which I had planned. I worried about a new pain in the ball of my left foot that cropped up during my walk though the airport earlier. It subsided a bit during this eight mile run. The next day I explored downtown Seattle before picking up a rental car to drive to the race the following Saturday.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/shakeout&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/shakeout 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/shakeout 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/shakeout 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Fishing pier extending out into a bay with over calm water with mountains in the distance&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1200&quot; /&gt;&lt;figcaption&gt;Fishing pier at the turnaround of my shake out run.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Carnation Instant Breakfast&lt;/h2&gt;
&lt;p&gt;The race would take place just outside a small town an hour east of Seattle called Carnation. It reminded me of a &lt;a href=&quot;https://www.youtube.com/watch?v=Ql3v_-F3uGw&quot;&gt;jingle I remember&lt;/a&gt; from TV for what must had been a horribly processed chocolate flavored powder that you&#39;d mix with water and create an &amp;quot;instant breakfast&amp;quot;. I later looked this up and indeed, the Carnation evaporated milk company has roots in this town.&lt;/p&gt;
&lt;p&gt;My race, the half, would not start until 9:00. There was to be a full and half marathon, 10k and 5k all starting about an hour apart respectively. At nearly 7:00 I stopped at &lt;a href=&quot;https://aromacoffeeco.com/&quot;&gt;Aroma Coffee&lt;/a&gt;, just 5 minutes up the road from Carnation and ate a delicious chocolate muffin with an Americano. I killed as much time as I could stand, typing into my journal. But too excited, I left in about a half an hour.&lt;/p&gt;
&lt;p&gt;I arrived at Tolt Park, where the event would take place. Runners were just starting to arrive. But already music was playing and an MC was welcoming everyone. It was still chilly but the sun was starting to peak over the trees.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/arch&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/arch 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/arch 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/arch 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;A green inflatable start and finish line arch&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1315&quot; /&gt;&lt;figcaption&gt;The start/finish&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;A large red barn dominated the space adjacent to the inflated start/finish. The arch was green with custom graphics of the Blerch and the words: &amp;quot;Let there be agony, let there be cake&amp;quot;. Occupying the large paved area between the arch and the barn were several tents including EMS, merchandising, a donut burrito building station (more on this later), an orca wildlife conservation fundraiser and, oddly, a window installation company.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/station&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/station 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/station 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/station 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a table full of donut boxes&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;938&quot; /&gt;&lt;figcaption&gt;The &quot;Burritoughnut&quot; making station&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I headed for the packet pickup line which led up to the barn. Along with my race bib came a respectable amount of swag including a t-shirt, Blerch bobble head, stickers and candy. Even the bag was green and had a Blerch graphic on it. These items were added to the ones I&#39;ve already purchased which included Blerch socks and a Blerch hoodie. I was completely Blerched out!&lt;/p&gt;
&lt;p&gt;At 8 the full marathon started. There were only a few dozen racers who lined up. Mr. Inman and a woman who might be his wife took the mic from the MC and stepped up an elevated platform at the start line to address the crowd and throw donut holes to them. Matthew welcomed everyone and started a countdown from 10.&lt;/p&gt;
&lt;p&gt;After the runners left and had made the first turn, I took my &lt;em&gt;Blerchandise&lt;/em&gt; to my rental car and left what I thought I might want after the race with gear check.&lt;/p&gt;
&lt;p&gt;Now I could begin my warm up, jogging to a nearby walking bridge that crossed the Snoqualmie River. It arched highly over the clear water and I instinctively started looking for fish. An older couple were peering over the railing and I stopped to ask them if the saw any trout. &amp;quot;Yes!&amp;quot;, they replied pointing to areas where salmon, in fact, were cruising around in pods and splashing at the surface.&lt;/p&gt;
&lt;p&gt;We discussed fishing and I told them that I&#39;d forgotten my fly rod. I also told them I was warming up for a race and that I&#39;d better get back to it, which made them laugh.&lt;/p&gt;
&lt;h2&gt;The Race&lt;/h2&gt;
&lt;p&gt;Now it was our turn, the half marathoners, to line up and have donut holes thrown down to us. I asked for one and received a chocolate covered one which made my fingers look like they had poop on them. I gobbled it up and wiped my fingers against my legs the best I could.&lt;/p&gt;
&lt;p&gt;There were a few hundred of us so we were split into 2 waves. With some confidence I chose the first, faster group. Matthew then instructed 2 people with a length of garden hose to separate  the 2 groups. This seemed ceremonial. Did a garden hose carry special meaning in Oatmeal lore?&lt;/p&gt;
&lt;p&gt;We started our countdown together and off we went. I eyeballed my watch and tried to keep my pace close to 8 minutes per mile. This was very difficult to not go over with the crowd and excitement.&lt;/p&gt;
&lt;p&gt;The trail was beautiful. We crossed multiple bridges over rivers and creeks. Much of the level route followed the contours of steep topography, ascending up from my left and down from my right. Large trees reached over the path and their branches were covered in a thick moss in such a way that made all their features rounded and soft. They reminded me of coral reefs.&lt;/p&gt;
&lt;p&gt;In the spirit of the Blerch, volunteers at the first aid station scolded us. Telling us to slow down or stop. I apologized as I passed.&lt;/p&gt;
&lt;p&gt;I ran as though the Blerch was truly on my heals. 5 miles in I couldn&#39;t help but let my pace creep up to 7:30, I felt good.&lt;/p&gt;
&lt;p&gt;The route was an out-and-back. Near the turn around I uncomfortably woofed down a small Nutella sandwich from a large spread of treats that included cake.&lt;/p&gt;
&lt;p&gt;During the last few miles of the race, the 10k runners were on the course and I had to weave though this new traffic. Their race was the most attended with about 700 athletes. A great deal of them were walking which created an obstacle course on the narrow path.&lt;/p&gt;
&lt;p&gt;On a bridge, two people in Blerch costumes were standing there with tiny, leashed dogs. I had to slow down to a stop not to trample the little beasts. This was fine, and added to the funny, weird vibe of this event. There were more costumes here than I&#39;d seen at any other race, and I complemented as many of them as possible.&lt;/p&gt;
&lt;p&gt;Many people said encouraging things to me as I passed them going the other direction. I started to do the same although, towards the end, I got a response like: &amp;quot;What&#39;d he say?&amp;quot; My speech was getting a bit ragged.&lt;/p&gt;
&lt;p&gt;Approaching the last mile I really pushed and started running at my 10k pace. On the final stretch recognized a woman with a stomping gate that I hadn&#39;t seen since the beginning of the race and passed her.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/finish&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/finish 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/finish 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/finish 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Blog author crossing the finish arch&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1143&quot; /&gt;&lt;figcaption&gt;Me finishing&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I stepped through the Blerch green inflated finish arch and stopped my watch. I turned around to speak to Miss Stompy: &amp;quot;I finally caught up with you!&amp;quot;, &amp;quot;I know, I saw you!&amp;quot; Some random guy: &amp;quot;I was following you the last couple of miles, you helped pace me, thank you!&amp;quot; Me &amp;quot;yes I could hear you!&amp;quot; ... These were the frantic endorphin buzzed conversations I enjoy at the end of a tough race. They are wonderful.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/metal&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/metal 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/metal 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/metal 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a custom designed finisher metal&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1042&quot; /&gt;&lt;figcaption&gt;The finisher metal for Beat the Blerch 2023&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Results and Sugar&lt;/h2&gt;
&lt;p&gt;I finished with a time of 1 hour and 39 minutes, a personal best out of the now 2 half marathons I&#39;ve run. Overall, I placed 14 of 428 and 2 of 23 in my age group.&lt;/p&gt;
&lt;p&gt;One final challenge remained, the &lt;em&gt;Burritoughnut&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I cautiously approached the assembly station where a few young volunteers were panicking about a hornet that would not leave the bowl of bacon bits. Into my tortilla I placed 2 halves of donuts, one blueberry one chocolate. Not to be denied my bacon, I bravely brushed aside the hornet and piled bacon bits onto my donuts. To this was added marshmallows (both candy and traditional types), whipped cream and chocolate syrup.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/donuts&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/donuts 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/donuts 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/donuts 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a table covered in donuts&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;2133&quot; /&gt;&lt;figcaption&gt;The &quot;Burritoughnut&quot; making station.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The combination of savory bacon crunch and the soft give of my teeth passing though the tortilla into billowy donuts and marshmallows was a revelation in gluttony.&lt;/p&gt;
&lt;p&gt;Glycogen restored.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/burrito&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/burrito 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/burrito 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/burrito 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;A tortilla filled with donuts, bacon and marshmallows&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1345&quot; /&gt;&lt;figcaption&gt;The Burritoughnut&lt;/figcaption&gt;&lt;/figure&gt;</description>
      <pubDate>Wed, 13 Sep 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/i-beat-the-blerch/</guid>
    </item>
    <item>
      <title>Getting API Results with PHP and Doing Something With Them</title>
      <link>https://blog.danbraun.me/posts/getting-api-results-with-php-and-doing-something-with-them/</link>
      <description>&lt;p&gt;A need arose at work for displaying a list of Eventbrite events on a webpage with the expectation being that this list would update dynamically.&lt;/p&gt;
&lt;p&gt;Eventbrite, for whatever reason, does not provide a snap in widget for non-Wordpress websites, which this website is. They do have an app marketplace that sells a 3rd party solution with an annul fee and the inherent inflexibility of vender maintained markup.&lt;/p&gt;
&lt;p&gt;On the other hand, Eventbrite provides an API which provides more functionality with their platform than I would ever need for this project.&lt;/p&gt;
&lt;p&gt;Despite it&#39;s overkill of features, I&#39;m choosing the API route. It has the advantage of not being beholden to a 3rd party&#39;s development decisions and will allow us to design its frontend however we like.&lt;/p&gt;
&lt;h2&gt;What Does This Thing Need to Do?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Authenticate and retrieve event list data from our client&#39;s Eventbrite account&lt;/li&gt;
&lt;li&gt;Serve this request result from an endpoint on our site&#39;s server&lt;/li&gt;
&lt;li&gt;Handoff the data from our own endpoint in step 2 to the front end&lt;/li&gt;
&lt;li&gt;Format, style and display the event on 1 or more pages of our website&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Accessing the API&lt;/h2&gt;
&lt;p&gt;Eventbrite&#39;s API is available to anyone with an account on their platform after creating an &amp;quot;Eventbrite app&amp;quot;. Since this is included with the free tier, I created my own account to test with. I was surprised to find that there seems to be nothing preventing the creation of public events for random locations. I created some test events at a place in Helsinki called &lt;em&gt;Karaoke Bar Restroom&lt;/em&gt;. To be safe, I published these events as &amp;quot;private&amp;quot; and limited their capacity to 1. Time will tell if I get any angry calls about &lt;em&gt;My Test Event 1&lt;/em&gt; which will take place in October.&lt;/p&gt;
&lt;p&gt;I&#39;ve written the code for accessing event data in PHP. As is recommended, making requests from the API is done from the server side in order to protect the API key, or specifically the private token provided in the account settings.&lt;/p&gt;
&lt;p&gt;So, the process here is: you retrieve data from the vendor with server-side code (PHP for me), then create your own endpoint that your frontend code (Javascript) makes requests to and displays.&lt;/p&gt;
&lt;h2&gt;ChatGPT and Building the PHP Part&lt;/h2&gt;
&lt;p&gt;To be honest, I haven&#39;t had a lot of experience working with APIs in PHP. This being the case I was interested in how much help I could get from ChatGPT using their free 3.5 version.&lt;/p&gt;
&lt;p&gt;My first naive prompt was simply: &lt;em&gt;&amp;quot;With PHP, write a script that uses the Eventbrite api to list all events by an organizer&amp;quot;&lt;/em&gt;. It immediately responded with an answer complete with explanations.&lt;/p&gt;
&lt;p&gt;The answer used placeholders where any private token or API keys should be entered. You should of course never type any of that stuff into ChatGPT.&lt;/p&gt;
&lt;p&gt;The code made sense and was easy to understand, but it didn&#39;t work. One problem is that ChatGPT assumed I wanted the script to obtain my private token programmatically, which in my case is unnecessary. I wasn&#39;t creating an app where the user would be logging into Eventbrite. I can obtain that from the account settings. It also suggested using the &lt;code&gt;stream_context_create&lt;/code&gt; and &lt;code&gt;file_get_contents&lt;/code&gt; PHP functions where I would prefer to use cURL. I didn&#39;t bother to debug it and just tried a new prompt.&lt;/p&gt;
&lt;p&gt;Interestingly, differently worded prompts suggested different request solutions. At one point it suggested using Guzzle, a PHP HTTP client. But what I was doing was simple enough to use cURL, which is almost always enabled. After a couple of more answers I had a working script to polish up.&lt;/p&gt;
&lt;p&gt;But there was one more thing to solve. I  want to display both the event information and the venue name. Eventbrite treats venues as separate records from events. The event object only contains a venue ID, so a second request would have to be made get their names. Furthermore, the results of these 2 requests would need to be combined.&lt;/p&gt;
&lt;p&gt;So I went back to ChatGPT and tried asking for the events &lt;em&gt;with&lt;/em&gt; the venue names. This failed. Although ChatGPT seems to have a pretty good understanding of what the response format from the API should look like, including key names, it seemed to be missing some of the facts. It was suggesting that I simply pull the venue name from the &amp;quot;venue_name&amp;quot; key in the event object...only there is no venue name key, only an venue id. Perhaps it was using a deprecated feature?&lt;/p&gt;
&lt;p&gt;So not knowing if I could be so specific, I tried the following prompt: &lt;em&gt;&amp;quot;in php use the eventbrite api and cURL to return a list of events and then make a second api call to the api to return the venue name using the venue id in each event from the first request result. Then combine these 2 results so that they may be consumed by a client&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This level of specificity payed off. I could have almost copy/pasted it directly into my IDE. All the steps where there, but I needed to clean up how it was authenticating the request.&lt;/p&gt;
&lt;p&gt;More interestingly, I saw what might had been an undetected inefficiency. For the venue names, it suggested looping though the event results and making a new request to the venue endpoint in each iteration of the loop. Though generous, there is a limit to the requests per hour for this API. Further, the loop would of had to wait for a response for each event.&lt;/p&gt;
&lt;p&gt;To improve this I retrieved all of the venues separately and stashed these into a simplified array. Then, similar to ChatGPT&#39;s suggestion, I looped though the events and added a property in each of the event objects called &lt;code&gt;venue_name&lt;/code&gt;.  Encode, echo and its done!&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// using m1/env to get my .env value for the private token&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$env&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Parser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;file_get_contents&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;../.env&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$env_arr&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$env&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$PRIVATE_TOKEN&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$env_arr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;EVENTBRITE_PRIVATE_TOKEN&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$ORG_ID&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// the organization&#39;s ID;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Eventbrite&#39;s endpoints&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$ch_events&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curl_init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;https://www.eventbriteapi.com/v3/organizations/&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$ORG_ID&lt;/span&gt;&lt;/span&gt;/events/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$ch_venues&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curl_init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;https://www.eventbriteapi.com/v3/organizations/&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$ORG_ID&lt;/span&gt;&lt;/span&gt;/venues/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ch_events&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;TRUE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ch_events&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CURLOPT_HEADER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;FALSE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ch_events&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CURLOPT_HTTPHEADER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Authorization: Bearer &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$PRIVATE_TOKEN&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ch_venues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;TRUE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ch_venues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CURLOPT_HEADER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;FALSE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_setopt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ch_venues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CURLOPT_HTTPHEADER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Authorization: Bearer &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$PRIVATE_TOKEN&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Initialize multiple cURL requests. This runs both requests in parallel.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$mh&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curl_multi_init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_multi_add_handle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$mh&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ch_events&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_multi_add_handle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$mh&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ch_venues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Execute multiple cURL requests&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$curl_exec_running&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token function&quot;&gt;curl_multi_exec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$mh&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$curl_exec_running&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$curl_exec_running&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Check for cURL errors&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl_multi_errno&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$mh&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Error: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curl_multi_errno&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$mh&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Get the results of each cURL request&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$event_response&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curl_multi_getcontent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ch_events&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$venue_response&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curl_multi_getcontent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ch_venues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Decode the JSON responses&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$events&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;json_decode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$event_response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$venues&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;json_decode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$venue_response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Clean up cURL resources&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_multi_remove_handle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$mh&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ch_events&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_multi_remove_handle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$mh&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ch_venues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;curl_multi_close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$mh&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Check if the event request was successful&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// and separate events into an new array&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$events&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;events&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token variable&quot;&gt;$event_list&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$events&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;events&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Error: Unable to fetch events.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token keyword&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Check if the venue request was successful&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// and separate venues into a new array&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$venues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;venues&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token variable&quot;&gt;$venue_list&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$venues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;venues&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Error: Unable to fetch venues.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token keyword&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Define an simpler array to store venue names&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token variable&quot;&gt;$venue_names&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$venue_list&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$venue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token variable&quot;&gt;$venue_names&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$venue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$venue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// Combine event details with venue names&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$event_list&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token variable&quot;&gt;$event_venue_id&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;venue_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$venue_names&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$event_venue_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;		&lt;span class=&quot;token variable&quot;&gt;$event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;venue_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$venue_names&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$event_venue_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Content-Type: application/json&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;json_encode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$event_list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON_PRETTY_PRINT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Building the Javascript Part&lt;/h2&gt;
&lt;p&gt;Javascript&#39;s fetch API seems to be be the best way today to retrieve data from an API in the browser. So, I&#39;ll be using a JS API, to request data from my API which requested data from a vendor API. &lt;strong&gt;API&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;As with the PHP script above, I asked for help from ChatGPT to fill gaps in my experience. I asked it for the best way to go about error handling, and how to use moment.js to handle time formats more easily that javascript&#39;s native methods.&lt;/p&gt;
&lt;p&gt;The below script assumes some elements on the HTML page, loops though the retrieved list of events and attaches a new list item to &lt;code&gt;&amp;quot;.event-list ul&amp;quot;&lt;/code&gt; for each. I&#39;ve left out the CSS for brevity.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; eventList &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.event-list ul&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; preloader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.preloader&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;apiRequest&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;/* /path/to/my/endpoint */&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;		&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;			&lt;br /&gt;			&lt;span class=&quot;token comment&quot;&gt;// Check if the response status is OK (status code 200)&lt;/span&gt;&lt;br /&gt;			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ok&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;HTTP error! Status: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;			&lt;span class=&quot;token comment&quot;&gt;// If the response is okay, parse the JSON data&lt;/span&gt;&lt;br /&gt;			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;		&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;			&lt;br /&gt;			&lt;span class=&quot;token comment&quot;&gt;// Process the JSON data if the request was successful&lt;/span&gt;&lt;br /&gt;			console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Data received:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;			&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;			&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; template &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;			&lt;br /&gt;			output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; event_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; event_url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; event_desc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;description&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; event_start &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;local&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; event_end &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;end&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;local&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; event_month &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event_start&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLocaleString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;en-US&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;					&lt;span class=&quot;token literal-property property&quot;&gt;month&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;short&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; event_day &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event_start&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; dayNumber &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event_start&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; daysOfWeek &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Sun&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Mon&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Tue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Wed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Thu&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Fri&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Sat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; event_dayofweek &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; daysOfWeek&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;dayNumber&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; event_starttime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;moment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_start&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;h:mm A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; event_endtime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;moment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_end&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;h:mm A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; event_venue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;	&lt;br /&gt;				&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;online_event &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;					event_venue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;a href=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;event_url&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;						Online Event&lt;br /&gt;					&amp;lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;					event_venue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;venue_name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;	&lt;br /&gt;				template &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&lt;br /&gt;	&lt;br /&gt;					&amp;lt;li&gt;&lt;br /&gt;						&amp;lt;div class=&quot;event-row&quot;&gt;&lt;br /&gt;							&amp;lt;div class=&quot;date-box-col&quot;&gt;				&lt;br /&gt;								&amp;lt;div&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;event_month&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/div&gt;				&lt;br /&gt;								&amp;lt;div&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;event_day&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/div&gt;				&lt;br /&gt;								&amp;lt;div&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;event_dayofweek&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/div&gt;				&lt;br /&gt;							&amp;lt;/div&gt;				&lt;br /&gt;							&amp;lt;div class=&quot;info-col&quot;&gt;			&lt;br /&gt;								&amp;lt;h2&gt;&lt;br /&gt;									&amp;lt;a href=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;event_url&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;										&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;event_name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&lt;br /&gt;									&amp;lt;/a&gt;&lt;br /&gt;								&amp;lt;/h2&gt;						&lt;br /&gt;								&amp;lt;p&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;event_desc&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/p&gt;&lt;br /&gt;								&amp;lt;div class=&quot;start-end-time&quot;&gt;&lt;br /&gt;									&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;event_starttime&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; - &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;event_endtime&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&lt;br /&gt;								&amp;lt;/div&gt;&lt;br /&gt;								&amp;lt;div class=&quot;location&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;event_venue&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/div&gt;			&lt;br /&gt;							&amp;lt;/div&gt;				&lt;br /&gt;						&amp;lt;/div&gt;				&lt;br /&gt;					&amp;lt;/li&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;			eventList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; template&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;			preloader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Loaded!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;			preloader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;loaded&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;			eventList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opacity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;	&lt;br /&gt;		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;		&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;			&lt;span class=&quot;token comment&quot;&gt;// Handle errors that occurred during the fetch &lt;/span&gt;&lt;br /&gt;			&lt;span class=&quot;token comment&quot;&gt;// or in the previous then block&lt;/span&gt;&lt;br /&gt;			console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Fetch error:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;apiRequest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/api-events-results&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/api-events-results 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/api-events-results 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/api-events-results 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;a screen shot showing a list of test events with silly names&quot; loading=&quot;lazy&quot; width=&quot;1358&quot; height=&quot;1054&quot; /&gt;&lt;figcaption&gt;My test events&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Bringing This to a Real Website with Silverstripe CMS&lt;/h2&gt;
&lt;p&gt;Working with my employer we hired a firm several years ago to build a number of websites that I would maintain going forward. This company uses an open source framework and CMS called &lt;a href=&quot;https://www.silverstripe.org/&quot;&gt;Silverstripe&lt;/a&gt; which I&#39;d come to enjoy working with. Silverstripe is based in New Zealand and is therefore maintained by a group of nerdy, lovable hobbits.&lt;/p&gt;
&lt;p&gt;Briefly, our installations include their CMS module built on top of a framework that, with &lt;a href=&quot;https://docs.silverstripe.org/en/5/developer_guides/model/data_model_and_orm/&quot;&gt;ORM&lt;/a&gt;, allows you to add fields to a database with PHP classes and display those fields with their templating language mixed in with HTML templates.&lt;/p&gt;
&lt;p&gt;It&#39;s a MVC design pattern, and the system uses controller classes that can mix things up when you require more than just CRUD.&lt;/p&gt;
&lt;p&gt;It is within one of these controller classes that I would implement the above Eventbrite API request script, creating an endpoint from which I could request an events list to display within a Silverstripe template.&lt;/p&gt;
&lt;p&gt;Silverstripe uses &lt;em&gt;actions&lt;/em&gt; which are public methods which may be called via a route that includes their name. In my case I&#39;ve created an action called &amp;quot;events&amp;quot;. In the browser, the javascript could use this action with &lt;code&gt;fetch(&#39;/home/events&#39;)&lt;/code&gt;. I implemented this in &lt;code&gt;PageController&lt;/code&gt;, which can be extended by other controllers for other &lt;a href=&quot;https://docs.silverstripe.org/en/5/developer_guides/templates/template_inheritance/#template-types-and-locations/&quot;&gt;page types&lt;/a&gt; (ie. &lt;code&gt;HomePageController&lt;/code&gt;). This way all page types have access to this action.&lt;/p&gt;
&lt;p&gt;So, in the fetch example from the previous paragraph, I could instead use the Silverstripe &lt;code&gt;$Link&lt;/code&gt; template variable like this: &lt;code&gt;fetch($Link+&#39;events&#39;)&amp;quot;&lt;/code&gt;. &lt;code&gt;$Link&lt;/code&gt; returns the URL segment for the current page.&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// PageController.php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token package&quot;&gt;SilverStripe&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;CMS&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Controllers&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;ContentController&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token package&quot;&gt;M1&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Env&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Parser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;PageController&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ContentController&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token comment&quot;&gt;/**&lt;br /&gt;         * An array of actions that can be accessed via a request. &lt;br /&gt;         *&lt;br /&gt;         * @var array&lt;br /&gt;         */&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$allowed_actions&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;events&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token keyword static-context&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;events&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	        &lt;span class=&quot;token comment&quot;&gt;// All the PHP in the first snippet of this article above&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;What Else Can This Thing Do?&lt;/h2&gt;
&lt;p&gt;With what I&#39;ve learned and accomplished above, I&#39;ll be able to bring an Eventbrite events list to a website built with PHP or Silverstripe and it will update when our client updates their events. After a page load anyway.&lt;/p&gt;
&lt;p&gt;A next step might be to create a &lt;a href=&quot;https://docs.silverstripe.org/en/5/developer_guides/extending/modules/&quot;&gt;Silverstripe module&lt;/a&gt;, basically a composer package. This way in future projects I could composer require it, set some config and like magic I have an Eventbrite event listing that needs only to be included and styled.&lt;/p&gt;
&lt;p&gt;Also I&#39;ve only tapped the surface of the API which allows for writing as well as reading.&lt;/p&gt;
&lt;p&gt;If you&#39;re reading this (wow, thanks) and see something above that looks completely bonkers, irresponsible or ill advised, please &lt;a href=&quot;https://blog.danbraun.me/connect/&quot;&gt;send me a message&lt;/a&gt; about it so I might &lt;a href=&quot;https://youtu.be/QFtSVe0uHvc?si=QDdO-P-7qQboLjYJ&amp;amp;t=22&quot;&gt;repent and leave my evil ways&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Tue, 05 Sep 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/getting-api-results-with-php-and-doing-something-with-them/</guid>
    </item>
    <item>
      <title>Lets Get Some Shoes</title>
      <link>https://blog.danbraun.me/posts/lets-get-some-shoes/</link>
      <description>&lt;p&gt;Running eventually got me &lt;a href=&quot;https://www.youtube.com/watch?v=wCF3ywukQYA&quot;&gt;excited about shoes&lt;/a&gt;. Running shoes cost less than road bikes, thankfully, but they are not cheap.&lt;/p&gt;
&lt;p&gt;New shoes feel awesome on a run. Though it may be part mental, they seem to lift your feet up with each step like soft exploding marshmallows. They look great down there too, especially the brightly colored ones.&lt;/p&gt;
&lt;p&gt;Here&#39;s my current lineup:&lt;/p&gt;
&lt;h2&gt;Hoka ONE ONE - Arahi 6&lt;/h2&gt;
&lt;p&gt;Purchased in April of this year, these shoes currently have 287 miles on them. Arahis are &amp;quot;semi -correcting&amp;quot; or stabilizing shoes. I use them due to a pronation in my gate and I &lt;em&gt;think&lt;/em&gt; these types of shoes help. Stabilizing shoes have a bit of extra material in them which makes them heavier, but I don&#39;t believe this makes much of a difference to someone at my amateur level.&lt;/p&gt;
&lt;p&gt;I&#39;ve not had a serious injury this year and with these shoes having spent the most time on my feet, they have that going for them.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/arahi6-287mi&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/arahi6-287mi 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/arahi6-287mi 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/arahi6-287mi 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Hoka one one Arahi 6 running shoes&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; /&gt;&lt;figcaption&gt;Hoka ONE ONE Arahi 6&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Saucony - Tempus&lt;/h2&gt;
&lt;p&gt;Bought sometime in July this year, these shoes currently have 134 miles on them. These are my first Sauconys and the start of my &lt;em&gt;rotation&lt;/em&gt; of shoes. These shoes were not replacements but a means of providing my physiology the variation that the shoe industry promises will benefit me. Like the Arahis, these shoes are designed for stabilization and have taken me on some of my longest runs to date.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/tempus-107mi&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/tempus-107mi 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/tempus-107mi 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/tempus-107mi 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Saucony Tempus shoes&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; /&gt;&lt;figcaption&gt;Saucony Tempus&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Saucony - Endorphin Speed 3&lt;/h2&gt;
&lt;p&gt;Added to the rotation shortly after the Tempus, these shoes only have 45 miles on them to date. These are my speed work and race shoes. They contain a nylon plate in the soles meant to propel my feet into victory.&lt;/p&gt;
&lt;p&gt;These shoes hold the prestige of carrying me though my &lt;a href=&quot;https://blog.danbraun.me/posts/the-madison-mini-half-marathon/&quot;&gt;first half marathon&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/speed3-45mi&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/speed3-45mi 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/speed3-45mi 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/speed3-45mi 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Saucony Endorphin Speed 3 shoes&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; /&gt;&lt;figcaption&gt;Saucony Endorphin Speed 3&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Salomon - Sense Ride 4&lt;/h2&gt;
&lt;p&gt;I&#39;ve had these for almost a year but they only have 139 miles on them. These are trail running shoes and I&#39;ve not focused on trail running as much this year. But recently I&#39;m getting back into it as I&#39;ve signed up for a half marathon trail race in October, the S&#39;more Fun Trail Run at Mirror Lake State Park.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/senseride4-139mi&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/senseride4-139mi 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/senseride4-139mi 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/senseride4-139mi 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Salomon Sense Ride 4 shoes&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; /&gt;&lt;figcaption&gt;Salomon Sense Ride 4&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;As such, I should probably buy another pair of trail shoes which leads me to....&lt;/p&gt;
&lt;h2&gt;Altra - Lone Peak 7&lt;/h2&gt;
&lt;p&gt;I just bought these a few days ago and have used them once on a 5 mile trail run. They&#39;re kind of weird. The shape of these are &amp;quot;natural&amp;quot;, with the toe box shaped more like a foot instead of tapering to a point as in most shoes. I still haven&#39;t decided if I like this.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/lonepeak7-5mi&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/lonepeak7-5mi 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/lonepeak7-5mi 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/lonepeak7-5mi 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Altra Lone Peak 7 shoes&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; /&gt;&lt;figcaption&gt;Altra Lone Peak 7&lt;/figcaption&gt;&lt;/figure&gt;</description>
      <pubDate>Fri, 01 Sep 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/lets-get-some-shoes/</guid>
    </item>
    <item>
      <title>The Madison Mini Half Marathon</title>
      <link>https://blog.danbraun.me/posts/the-madison-mini-half-marathon/</link>
      <description>&lt;p&gt;Yesterday I ran my first half marathon. The &lt;a href=&quot;https://madisonminimarathon.com/&quot;&gt;Madison Mini&lt;/a&gt; is an annual race that has taken place in Madison, Wisconsin for the last 15 years. Around 2000 participants ran this year between the half and 5k events. Temperatures were in the mid 60s and could not have been more comfortable for a run.&lt;/p&gt;
&lt;h2&gt;Before the Gun&lt;/h2&gt;
&lt;p&gt;Early in the morning at my house things started out poorly as I shot out of bed worried about not being able to pick up my bib. &amp;quot;Day of&amp;quot; packet pickup was stated not to be allowed unless a fee had been paid. I did not pay the fee and had forgotten about driving to one of the designated car dealerships the day before. I soon reasoned that there&#39;s no way I&#39;d simply be turned away at the registration booth because of this, and I was right. I would instead be billed $25 for not looking at a new Lexus.&lt;/p&gt;
&lt;p&gt;I pinned on my bib and joined my group of fellow trainees for a group photo. The past 10 weeks I have been joining most of them twice a week for training runs, though only running with a handful of them due to our pace. And among them a woman named Carol had been the only consistent running partner. Carol&#39;s 65 years of age and has run multiple full marathons including this year&#39;s Boston Marathon. She&#39;s kept me good company the past 10 weeks and familiarized me with my &amp;quot;talking&amp;quot; pace, given our light conversations.&lt;/p&gt;
&lt;p&gt;Photo taken, I went to find the portapotty lines and do my best to avoid issues during the race. Success was had on this front and with a bit more effort I found my way into the heavily barricaded starting corral. I saw others using this area for warm up runs and I did the same along with some of the dynamic exercises I&#39;d learned during training. After this I found my desired pacer, a man holding a sign for a 1:50 finish time or 8:40/min pace.&lt;/p&gt;
&lt;h2&gt;The Early Stretch&lt;/h2&gt;
&lt;p&gt;My mom found a place to stand off to my right as the national anthem finished playing. The crowd of some 1500 runners edged toward the start line as the loud MC started the countdown. Then an air horn started the run. I started my watch after a slow shuffle towards the starting line and kept an eye on my pacer.&lt;/p&gt;
&lt;p&gt;The first couple miles started east toward the capital square. The energy was enormous and I fully enjoyed the sound of hundreds of foot steps all around me. During the first few blocks I felt hyper sensitive to every tiny sensation in my legs. Is that a pain? Will I crumple to the street before mile 2? But after about 10 minutes my nerves calmed and I entered into cruse control.&lt;/p&gt;
&lt;p&gt;Running on one of the older, rounded streets off the square, I moved up ahead of my pacer to avoid the angle and soon found my pace creeping to 8 min / mile. This felt good to me and I felt comfortable to continue this way.&lt;/p&gt;
&lt;p&gt;By the time we approached Mill St. to make the turn toward the arboretum, I found myself with a different group of runners. There were small cliques of 2 - 3 people around me, some heavy with conversation. Their ease with running made me feel comfortable and I really settled into an enjoyable part of the race. Within the arboretum we ran with a slight breeze under the shady trees. A group of wild turkeys spectated from the side of the road and the views of Lake Wingra to the right were lovely.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/madison-mini-1&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/madison-mini-1 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/madison-mini-1 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/madison-mini-1 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Blog author running in Madison Mini half marathon on in the UW Madison Arboretum&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1200&quot; /&gt;&lt;figcaption&gt;Running in the arboretum&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;The Middle&lt;/h2&gt;
&lt;p&gt;I would occasionally bump up my speed to get past a chatty group whose conversation I&#39;d gotten bored of. Roadside supporters held signs for their sons/daughters/wives etc. A surprising number of these targeted individuals seemed to be running near me (go Jordan!). In one case a runner&#39;s husband or boyfriend, not in the race, ran along side us on the sidewalk to support her. Other friends of runners would pop by on bikes to say hello and discuss where such and such was on the route.&lt;/p&gt;
&lt;p&gt;Between miles 8 and 10 I started to feel the work my legs were doing. Close to mile 10 we took a left off of Regent Street and passed the Camp Randall stadium where I&#39;d once seen Pink Floyd. There, a couple held a sign that read something like &amp;quot;You&#39;ve Got This, Random Stranger!&amp;quot;. I pointed at them and shouted &amp;quot;Hey, I&#39;m a random stranger&amp;quot; to which the guy replied &amp;quot;What?&amp;quot;, &amp;quot;I&#39;M A RANDOM STRANGER&amp;quot;. They responded then, gleefully: &amp;quot;Ya you are! Woo!&amp;quot;.&lt;/p&gt;
&lt;p&gt;Reaching mile 10, my legs were now definitely starting to fatigue and my left hip, though not painful, was feeling a bit of pressure. We were on a path near the trail to Picnic Point. With the turn around just ahead, faster runners were heading back in the other direction to my right. Here I recognized Matt from our training group. &amp;quot;Hey Matt!&amp;quot; I shouted. After a moment he shouted back: &amp;quot;Hey Daniel! Have a good one!&amp;quot;. That recharged me and the stiff feelings in my legs lifted significantly. After the turnaround I kicked up my pace and started passing people.&lt;/p&gt;
&lt;p&gt;It was the last couple of miles now and I could stop worrying about conserving stamina. I reached a quiet stretch where everyone was either a ways ahead or behind me. A lone college student under a tree cheered passers by. &amp;quot;I&#39;m so lonely&amp;quot; I shouted at him. &amp;quot;What?&amp;quot;, &amp;quot;I&#39;M SO LONELY&amp;quot;. &amp;quot;Awwwe&amp;quot;, he whimpered.&lt;/p&gt;
&lt;p&gt;Back out on the streets now and approaching mile 12, I saw our coach, Megan as we rounded a corner. I waved and she shouted: &amp;quot;Carol&#39;s just ahead, you can catch her!&amp;quot;&lt;/p&gt;
&lt;p&gt;I had been wondering where my training buddy was, and sure enough I could see her short white hair and unusual gate just ahead. It was at the start of the course&#39;s major hill up Observatory Drive. She was stopping and stepping off the road ahead and I worried that something was wrong. But then she quickly got going again.&lt;/p&gt;
&lt;h2&gt;The Hill&lt;/h2&gt;
&lt;p&gt;&amp;quot;I finally caught you!&amp;quot; I said as I reached her. She was having problems with her back, having had surgery there. Knowing she wouldn&#39;t want me slowing for her, I quickly said bye and charged up the hill. This was the hardest part of the race. I was soon heaving and so where others around me. One girl sounded as though she was literally dying as I passed her, vocalizing loudly with each exhale.&lt;/p&gt;
&lt;p&gt;I&#39;d saved plenty of energy for this and made it to the top without having to slow much. I felt the corners of my mouth creasing to a slight smile.&lt;/p&gt;
&lt;p&gt;Shortly there after, a pair of women where talking behind me: &amp;quot;I know you don&#39;t know me, but I was just diagnosed with MS yesterday, and I&#39;m running this anyway&amp;quot;. I turned around could only think of saying &amp;quot;Hell ya&amp;quot; with a thumbs up. Then I could feel my throat tighten and tears pushing against my eyes. Behind me I could hear her crying.&lt;/p&gt;
&lt;h2&gt;The End&lt;/h2&gt;
&lt;p&gt;Pushing my pace a little harder now and experiencing some ambivalence about what we were all doing here and the privilege of having a healthy body, we turned onto University Ave. Just ahead was the final turn to the finish line. After I made that turn, I pushed my pace to near maximum and just ran really fast. I finished with a time of 1:42:39.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/madison-mini&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/madison-mini 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/madison-mini 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/madison-mini 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Blog author running in Madison Mini half marathon crossing the finish line&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1200&quot; /&gt;&lt;figcaption&gt;At the finish line&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Extrapolating my finish time out to a full marathon, this would not qualify me for the Boston Marathon in my age category. But as my first half marathon, I am satisfied with this result.&lt;/p&gt;
&lt;p&gt;On the other side of the finish line I found a bottled water, finisher metal, banana, Clif Bar and some other small granola treat to give to my mom who was nowhere to be found at the moment. I also found the backdrop for race portraits. I stood in front of it and opted to have my photo taken while holding everything I&#39;d collected.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/madison-mini-2&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/madison-mini-2 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/madison-mini-2 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/madison-mini-2 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Blog author after running in Madison Mini half marathon getting a finisher portrait taking while holding a banana&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1200&quot; /&gt;&lt;figcaption&gt;I love bananas&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I soon found Carol and my mom, the later bearing a foil pan with 2 huge pecan covered cinnamon rows. She&#39;d been at the farmers market on the square during my run. I asked her if she had a fork, she did.&lt;/p&gt;
&lt;h2&gt;What&#39;s Next?&lt;/h2&gt;
&lt;p&gt;By the end of the day, back home, I&#39;d registered for a 3rd half marathon for this year. One month from now I&#39;ll fly to Seattle Washington and participate in &lt;a href=&quot;https://www.beattheblerch.com/&quot;&gt;Beat the Blerch&lt;/a&gt;. This is a race organized my Matthew Inman, creator of &lt;a href=&quot;https://theoatmeal.com/&quot;&gt;TheOatmeal.com&lt;/a&gt; and several books, games and probably some other things. I&#39;d been a fan of his work for many years now. In fact, his humor about running is partly to blame for my running career. I plan to heave that blame onto his shoulders if I get the opportunity at this race.&lt;/p&gt;
&lt;p&gt;Then in October, I&#39;ll run in &lt;a href=&quot;https://runsignup.com/Race/WI/Baraboo/SmoreFunTrailRun&quot;&gt;S&#39;more Fun Trail Run&lt;/a&gt; which will happen right next door to me at Mirror Lake State Park.&lt;/p&gt;
</description>
      <pubDate>Sun, 13 Aug 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/the-madison-mini-half-marathon/</guid>
    </item>
    <item>
      <title>Races Update</title>
      <link>https://blog.danbraun.me/posts/races-update/</link>
      <description>&lt;p&gt;I write this during the hottest weather we&#39;ve experienced so far this summer in Wisconsin. Nineties and humid these past few days, but cool enough in the morning to get some runs and rides in. Just this morning I rode 64 miles with some wonderful folks. We started at 6:30 AM and avoided the heat. And yesterday I ran a good feeling 9.5 miles similarly early and was back home well before dangerous temps.&lt;/p&gt;
&lt;p&gt;The way I felt after that run makes me believe that I&#39;m improving this summer over previous years. My legs felt pushed and tired but none of the overwhelming stiffness or worse, pain that I&#39;ve experienced at that distance in the past.&lt;/p&gt;
&lt;h2&gt;Madison Mini Training&lt;/h2&gt;
&lt;p&gt;Starting in June I train with a group of runners who are all training for the &lt;a href=&quot;https://madisonminimarathon.com/&quot;&gt;Madison Mini half marathon&lt;/a&gt;. We meet every Wednesday and Saturday.&lt;/p&gt;
&lt;p&gt;For me personally its been a slow start. The distances in our runs have been below my usual efforts; 3 to 4 miles the first couple of weeks. But this will change. Starting next weekend the distance will be up to 8 miles.&lt;/p&gt;
&lt;p&gt;Regardless, I look forward to these runs. Its fun running with other people especially if someone else is keeping the pace. Also, Madison is a beautiful city and a welcome change to my usual back road runs (which are pretty beautiful too).&lt;/p&gt;
&lt;p&gt;A woman named Megan leads us through warm up exercises. This has led to me trying to recreate these routines at home before my own runs - a positive development I&#39;m sure.&lt;/p&gt;
&lt;h2&gt;Recent Races in 2023&lt;/h2&gt;
&lt;h3&gt;Mother of a Run - 13k (May 13)&lt;/h3&gt;
&lt;p&gt;This is the longest road race I&#39;ve run, 3 kilometers more than my usual 10k efforts. It included some challenging climbs too.&lt;/p&gt;
&lt;p&gt;The race was organized around a fundraiser for the town of Lodi&#39;s Optimist Club. Susie the Duck, Lodi&#39;s mascot was there. I&#39;d share my photo of us but some mean looking person photo bombed us.&lt;/p&gt;
&lt;p&gt;The organizers spell &amp;quot;mother&amp;quot; in the race&#39;s title like &amp;quot;M@TH#R&amp;quot;. As if mother was a bad word. I suppose it&#39;s meant to imply motherf**ker? But Susie the Duck was there, and what about the children? Cool shirt anyway.&lt;/p&gt;
&lt;p&gt;I finished 4th of 33 and 1st in my small age group with a chip time of 58:23.3.&lt;/p&gt;
&lt;h3&gt;Run Madtown - 5k and 10k (May 27 and 28)&lt;/h3&gt;
&lt;p&gt;Two runs here, back to back (evening and following morning). These were really big races and I had difficulty staking out an appropriate position in the starting corals. I put a decent effort in to both of these events but the real draw was just being in a race with so many other people. The streets are closed off or managed by police throughout the courses. How special are we?&lt;/p&gt;
&lt;p&gt;I finished the 5K 22nd of 511 with a chip time of 22:16 and 2nd of 18 in my age division. For the 10K I finished 10th of 296 with a time of 45:54 and 1st of 7 in my age division. The 2 finisher metals I got for these are gorgeous metal and stained glass works of art depicting the Madison skyline.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/dan-run-madtown&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/dan-run-madtown 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/dan-run-madtown 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/dan-run-madtown 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Blog author running in front of the Madison Square&quot; loading=&quot;lazy&quot; width=&quot;1079&quot; height=&quot;593&quot; /&gt;&lt;figcaption&gt;Run Madtown, entering State Street and heading towards the finish.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3&gt;Eagle Chase - 10K (July 1)&lt;/h3&gt;
&lt;p&gt;I signed up for this race less than 2 weeks ahead of time. I felt eager to run another race and the offerings on hand included a free back massage after the race and free breakfast.&lt;/p&gt;
&lt;p&gt;The course was an out-and-back in Sauk City and followed the excellent &amp;quot;Great Sauk Trail&amp;quot;. This trail is a paved path that follows the Wisconsin River for the duration of our event.&lt;/p&gt;
&lt;p&gt;I started off too hard. Even with my fancy watch clearly indicating 6:00 - 6:30 min/mile, a pace I could never keep up, it was difficult to tamp down the adrenaline. The course mixed 3 races together, a half marathon, 10K and 5K. Most races are like this but I really would like a 10K all to ourselves one day.&lt;/p&gt;
&lt;p&gt;Excuses aside, I paid for my lack of discipline and began suffering soon after the half way point. As if to drive the point home, another 10ker eased up behind me. I suspected they were a &amp;quot;her&amp;quot; as her cadence was quite fast. She stayed right behind me and drove me into the ground, basically. Finally giving in, I eased off and she passed with a &amp;quot;good effort!&amp;quot; and proceeded to recede into the distance.&lt;/p&gt;
&lt;p&gt;She ended up finishing a good minute ahead of me. Smoked!&lt;/p&gt;
&lt;p&gt;I finished this one 3rd of 53 and 1st in my age range - a time of 44:11. The award I got for this is by far the most dangerous object I&#39;ve ever received at a race. Its a thin piece of metal craved into the event&#39;s eagle mascot with very, very sharp points. No attempt was made to file down any of the corners and the piece of twine they used to tie it onto was far to scratchy to wear around my neck.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/dan-in-eagle-chase&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/dan-in-eagle-chase 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/dan-in-eagle-chase 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/dan-in-eagle-chase 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Blog author running in Eagle Chase race on a paved path between picnic tables and trash cans&quot; loading=&quot;lazy&quot; width=&quot;2940&quot; height=&quot;1747&quot; /&gt;&lt;figcaption&gt;Near the finish at Eagle Chase&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Upcoming Races&lt;/h2&gt;
&lt;p&gt;Aside from the half marathon I&#39;m training for in August, I&#39;ve signed up for a race on Washington Island in Door County. I going to ditch it and eat the $35 (er, donate it). I signed up for it probably thinking that I&#39;d take the previous day off and that its neat to run on an island in Door County. And it would be, but... driving 4.5 hours to run for 45 minutes while missing my training group run in Madison seems ludicrous to me today.&lt;/p&gt;
&lt;p&gt;So for now I&#39;ll  just keep training for the Madison Mini.&lt;/p&gt;
</description>
      <pubDate>Tue, 04 Jul 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/races-update/</guid>
    </item>
    <item>
      <title>RenderATL - Day 1</title>
      <link>https://blog.danbraun.me/posts/renderatl-day-1/</link>
      <description>&lt;p&gt;My job sends us to one conference a year and I wanted to go to &amp;quot;An Event Apart&amp;quot;. Alas &lt;a href=&quot;https://aneventapart.com/&quot;&gt;this would not be&lt;/a&gt;. That conference did not survive the economic pressures of the pandemic and will no longer be happening.&lt;/p&gt;
&lt;p&gt;Looking around online I found RenderATL. Though originally conceived for discussions around React, which I don&#39;t use, the event has become more generalized according to it&#39;s &lt;a href=&quot;https://www.renderatl.com/&quot;&gt;website&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Arrival&lt;/h2&gt;
&lt;p&gt;The conference began on May 31st with workshops, but I couldn&#39;t arrive until late that day. So being free to just relax I chomped on a huge Atlanta burger (these include fried green tomatoes on top of the meat) and perused the schedule of speaking events starting the next day.&lt;/p&gt;
&lt;p&gt;The next morning I ran a route around the surrounding &amp;quot;hotel district&amp;quot;, as its called. I ran past hotels, stadiums and the Centennial Olympic Park, location of the 1996 Olympic games.&lt;/p&gt;
&lt;p&gt;Back at the hotel, finding the registration area was a small adventure. After spending a couple dozen minutes wandering down escalators and across sky walks I spotted 2 guys taking a selfie in front of a RenderATL sign. They knew where to at least start heading so I joined them. Some time after that we found ourselves in a long line snaking out the door and down the sidewalk along a building adjacent to the hotel.&lt;/p&gt;
&lt;p&gt;Reaching the head of the line, we were frisked and our bags searched. I briefly thought that this security might be overkill, but anyone watching the news in the United States would think again.&lt;/p&gt;
&lt;p&gt;With a laniard finally slung around my neck I traversed a few flights of escalators and found the Main Stage. It was 9:00 AM and time for the first speaker. But it wouldn&#39;t be until sometime after 9:30 before Banjo Obayomi took the stage to speak at a frenzied pace about generative AI.&lt;/p&gt;
&lt;h2&gt;Day 1 Talks&lt;/h2&gt;
&lt;h3&gt;Banjo Obayomi&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/banjo_obayomi&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/banjo_obayomi 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/banjo_obayomi 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/banjo_obayomi 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Speaker Banjo Obayomi on stage at RenderATL&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;2250&quot; /&gt;&lt;figcaption&gt;Banjo Obayomi&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/banjtheman&quot;&gt;Banjo&lt;/a&gt; had an interesting and timely presentation but needed to cram it all into around 10 minutes due to the late start. I don&#39;t think that was on him, the conference perhaps had too many attendees to process.&lt;/p&gt;
&lt;p&gt;He discussed word graphs, transformers, large language models (LLM) and so on. Working at Amazon, he had some AWS products to talk about, as well as his own projects.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://aws.amazon.com/codewhisperer/&quot;&gt;Amazon CodeWhisperer&lt;/a&gt; uses AI to assist in writing code. Something like Github&#39;s Copilot. Something called &lt;a href=&quot;https://catalog.workshops.aws/hpc-slurm/en-US/introduction/sagemaker-intro&quot;&gt;Jupyter&lt;/a&gt; allows you to share documents that contain live code, text and other visualizations.&lt;/p&gt;
&lt;p&gt;Banjo has also written a book with AI, a chatbot and something that uses ChatGPT to generate AWS Lambda functions.&lt;/p&gt;
&lt;h3&gt;Paolo Mariselli&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.paolamariselli.com/&quot;&gt;Paolo&lt;/a&gt;, director of product design at Bumble, spoke about good and bad managers. This was first of several &amp;quot;leadership&amp;quot; talks I added to my track. The opportunity for promotion to management hasn&#39;t presented itself at my job, nor am I especially hoping to transition to a management role. But to be frank, it could be a big boost in income and a fresh path - a break from patterns? Also, leadership skills are useful to anyone working on a team.&lt;/p&gt;
&lt;p&gt;Anyway this speaker made the case that good managers improve almost everything about a company&#39;s culture, productivity and profit. And, surprisingly, to support your individual contributors (or &amp;quot;IC&amp;quot;, a new term for me) even if their path leads to a different employer.&lt;/p&gt;
&lt;h3&gt;Ashton Fizer&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/ashton_fizer&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/ashton_fizer 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/ashton_fizer 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/ashton_fizer 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Speaker Ashton Fizer on stage at RenderATL&quot; loading=&quot;lazy&quot; width=&quot;3109&quot; height=&quot;1749&quot; /&gt;&lt;figcaption&gt;Ashton Fizer&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://heyashten.com/&quot;&gt;Ashton&lt;/a&gt; walked us through setting up a completely browser based augmented reality application. She made the point that requiring users to download an app to their mobile device is exclusionary and that having something that runs completely in a browser democratizes the experience you&#39;ve developed.&lt;/p&gt;
&lt;p&gt;Her example incorporated &lt;a href=&quot;https://threejs.org/&quot;&gt;three.js&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API&quot;&gt;WebGL&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API&quot;&gt;WebXR&lt;/a&gt;. Some of the setup requires Java to interact with WebGL.&lt;/p&gt;
&lt;p&gt;I&#39;ll be interested to try this myself as aside from what she promised was some simple Java, everything else sits on an HTML page and seems achievable with only front-end coding and some server setup.&lt;/p&gt;
&lt;h3&gt;Jose Rodriguez Salinas&lt;/h3&gt;
&lt;p&gt;Jose, a senior software engineer at Dropbox, discussed going &amp;quot;beyond code&amp;quot;: the difference between working as an individual contributor and taking on a leadership role in your organization.&lt;/p&gt;
&lt;p&gt;He presented a concept he called &amp;quot;The Chasm&amp;quot;, the gulf between being the coder siloed within a part of a project versus having knowledge and influence over the entire project.&lt;/p&gt;
&lt;p&gt;On one side of the chasm, you work within a well defined scope getting specific tasks done. Across this chasm you&#39;re involved with deciding &lt;em&gt;what&lt;/em&gt; tasks need to get done, who should be involved and what might need to happen further down the roadmap. And as you progress from there, you&#39;re working outside your team to create new projects and initiatives.&lt;/p&gt;
&lt;p&gt;This speaker then concluded with sharing design document templates, referring to technical blogs, like Airbnb&#39;s and introducing the idea of employee research groups (ERGs).&lt;/p&gt;
&lt;h3&gt;Matt Diamler&lt;/h3&gt;
&lt;p&gt;This mid-day presentation was done in a fire-side chat style with &lt;a href=&quot;https://www.linkedin.com/in/mattdaimler/&quot;&gt;Matt, Senior VP of Product&lt;/a&gt; at &lt;a href=&quot;https://www.zillow.com/&quot;&gt;Zillow&lt;/a&gt;, being interviewed on stage.&lt;/p&gt;
&lt;p&gt;I didn&#39;t take any notes here as this was more an inspirational session. Matt created the company that originally allowed passengers to choose their seats on flights, which was bought by Expedia. He then co-founded another company that created an app for realtors to use, which was then bought by Zillow which brought him to his current role at that company. I&#39;d say Matt&#39;s doing OK.&lt;/p&gt;
&lt;p&gt;And Matt seems OK, better than OK. I&#39;ve heard people talk about certain &amp;quot;magnetic&amp;quot; personalities but this was a first hand look at the real thing. It was easy to see why this man isn&#39;t just lucky (though he made it clear that he was aware of his privilege). When speaking about his work, he emits a childlike joyfulness in all directions. Approachable in the extreme.&lt;/p&gt;
&lt;h3&gt;Izhar Buendia&lt;/h3&gt;
&lt;p&gt;A product designer at Netflix, Izhar focused on using design in business decisions. Honestly, the standout for Izhar&#39;s talk were his slides that listed the salaries of major market, big company designers. These ranged from $400K - $700K.&lt;/p&gt;
&lt;p&gt;After recovering from the reminder of how impoverished we all were, he went on to describe design as different from art in that it works to provide solutions as opposed to asking questions. He stepped through historical references to this idea in Taoism, Feng Shui (and the big bucks paid for this), Hippocrates&#39; ergonomics and the industrial revolution and the efficiency gains of placing workers in the right position next to machines.&lt;/p&gt;
&lt;p&gt;Izhar then briefly explained the &lt;a href=&quot;https://en.wikipedia.org/wiki/Human_processor_model&quot;&gt;Human Processor Model&lt;/a&gt; and the work done by professor John M. Carroll to describe the role of design in optimizing the interaction between people and computers. &lt;a href=&quot;https://www.uie.com/&quot;&gt;Jared Spool&lt;/a&gt;, a major player in the UX space, was mentioned. And the statement that there is a 1:100 return on investment in user experience.&lt;/p&gt;
&lt;p&gt;Mr. Buendia concluded with a few real world examples including Airbnb&#39;s push in 2021, during the pandemic, to make hosting mainstream and using design to surface the concept of Superhosts - mentors to new hosts, General Electric&#39;s creation of the UX Center of Excellence and Uber&#39;s 2015 expansion to countries outside the US where cash, not electronic payments were commonplace. Design was used to successfully implement this cash workflow.&lt;/p&gt;
&lt;h3&gt;Taylor Poindexter&lt;/h3&gt;
&lt;p&gt;Taylor is a software engineer manager at Spotify. Her talk was similar to Jose&#39;s and also addressed expanding your role in your company.&lt;/p&gt;
&lt;p&gt;While Jose shared his ideas on what it looked like to take on a leadership role, Taylor&#39;s talk focused on looking inward and deciding how it would work for you and what that change would look like.&lt;/p&gt;
&lt;p&gt;It was a frank discussion about the realities of being responsible for other people. This type of work has different challenges and will be hard. And that difficulty increases with team size - varying personalities multiplied by the number of people under your charge. It will be a balancing act between flexibility — mistakes will happen — and rigidity —  will someone need to be addressed for being disrespectful?&lt;/p&gt;
&lt;p&gt;No longer will you be hiding in a pair of headphones with a predictable schedule for the day. You&#39;ll need to account for things that come up and also be aware of your own biases and triggers when dealing with your team. Taylor suggests taking an interest in your team, having one on ones that are separate from just project updates.&lt;/p&gt;
&lt;p&gt;She also made the case that managing may not be something you take on forever - a &amp;quot;pendulum career&amp;quot; she called it, where you switch between a leadership and individual contributor.&lt;/p&gt;
&lt;h3&gt;Homer Ganes&lt;/h3&gt;
&lt;p&gt;At my job we&#39;re beginning to address accessibility in all of our websites, and Homer&#39;s talk on designing for ADA compliance was timely.&lt;/p&gt;
&lt;p&gt;A UI engineer with a somewhat dour delivery, Homer warned us with statistical data on the correlation between non-compliant visual design and the frustration of low vision users (LVU). Examples where shared of what a LVU would have to do if a zoomed in screen now places content off screen — being forced to use keyboard shortcuts — and other basic requirements such color contrast ratios, heading usage, font sizes and more.&lt;/p&gt;
&lt;p&gt;Lastly he drove home the point of empathy: cognitive, emotional and compassionate.&lt;/p&gt;
&lt;h3&gt;Chris Coyier&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/chris_coyier&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/chris_coyier 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/chris_coyier 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/chris_coyier 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Speaker Chris Coyier on stage at RenderATL&quot; loading=&quot;lazy&quot; width=&quot;3492&quot; height=&quot;1964&quot; /&gt;&lt;figcaption&gt;Chris Coyier&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I &amp;quot;know&amp;quot; Chris from being a fan the podcast he co-hosts with Dave Rupert, &amp;quot;&lt;a href=&quot;https://shoptalkshow.com/&quot;&gt;ShopTalk&lt;/a&gt;&amp;quot;. Chris also co-founded &lt;a href=&quot;https://codepen.io/&quot;&gt;codepen.io&lt;/a&gt; as well as creating the website &lt;a href=&quot;https://css-tricks.com/&quot;&gt;CSS-Tricks&lt;/a&gt; which he sold to DigitalOcean in 2022. If you work on websites you know all of these places.&lt;/p&gt;
&lt;p&gt;He started of with a &amp;quot;venn diagram&amp;quot; that illustrated the intersection between websites and websites with CSS. It was a circle 😆&lt;/p&gt;
&lt;p&gt;This set the mood for the remainder of his talk. I personally enjoyed the humor he brought to describing new CSS features that will solve old problems. New ways to place things (subgrid, masonry) size things (inline/block size, cqi units, container queries), color things (oklch), gain more control over the cascade (@layer) and move things (view-transition).&lt;/p&gt;
&lt;p&gt;If we learned nothing else: inline goes this way: ← → and block goes that way: ↑ ↓&lt;/p&gt;
&lt;h2&gt;Day 1 Conclusion&lt;/h2&gt;
&lt;p&gt;The first day of sessions at RenderATL spanned a number of topics that were somewhat or completely relevant to me. The schedule did slip around and some sessions got moved, but I did not end up sitting at a talk I couldn&#39;t derive some knowledge from.&lt;/p&gt;
&lt;p&gt;I did notice that most of the talks were more informative than hands on. Maybe this was what I had missed from not being there for the workshops the day before, but in other developer conferences I&#39;ve enjoyed running a &lt;em&gt;npm install&lt;/em&gt; or two and actually coding along with the presenter. Mostly, we watched PowerPoint decks and took notes.&lt;/p&gt;
&lt;p&gt;As for the vendors, I made it over to that area during lunch but couldn&#39;t find much interest in it as I&#39;m neither looking for a job nor do I develop enterprise apps that need a serverless video encoding solution, for example. Github&#39;s booth had cool stickers though.&lt;/p&gt;
</description>
      <pubDate>Thu, 01 Jun 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/renderatl-day-1/</guid>
    </item>
    <item>
      <title>Off to the Races</title>
      <link>https://blog.danbraun.me/posts/off-to-the-races/</link>
      <description>&lt;p&gt;No previous posts about running so here&#39;s the scoop. I&#39;ve been running on and off for the past 10ish years. I started doing local races in May of 2018 at &amp;quot;Best Fest&amp;quot;, a 5k in Portage, Wisconsin.&lt;/p&gt;
&lt;p&gt;Before my late 30s I did virtually nothing athletic which saves me from comparison to a younger, fitter version of myself. 😉 I also feel no shame getting medals at small races that have maybe 3 or 4 other people in my age category. I&#39;m turning 47 this summer.&lt;/p&gt;
&lt;h2&gt;Racing Season&lt;/h2&gt;
&lt;p&gt;During the winter I have occasional opportunities to run outside or on a treadmill if I&#39;m desperate, but mostly switch over to indoor cycling and cross country skiing. So, a running season for me takes shape from about April to October.&lt;/p&gt;
&lt;p&gt;But another terrible factor that annually shapes this season is injury. I&#39;ve experienced a consistent pattern building up mileage until something hurts too bad to keep running and I have to quit for months. Its usually a knee or hip.&lt;/p&gt;
&lt;p&gt;When this happened last year I went to a physio to see what was up. &amp;quot;Your not injured&amp;quot; was the diagnosis I received. Hmm. It was determined to be a neuromuscular issue where my brain was not fully connecting to some muscles. Or something like that.&lt;/p&gt;
&lt;p&gt;Exercises were assigned, checkups were scheduled and they got me back running. I also became more cautious about building milage and really do try to keep occasional strength exercises in the schedule. I also brought back regular yoga. At least twice a week.&lt;/p&gt;
&lt;p&gt;All this to say that I&#39;m really trying to keep anything but winter from taking me off the road or trail.&lt;/p&gt;
&lt;h2&gt;The Plan So Far&lt;/h2&gt;
&lt;p&gt;This year, I&#39;m into it earlier than usual. My first race listed below happened in early April. And after a mistake at my second race of the year, I added a new gadget to my running, a Garmin Forerunner watch.&lt;/p&gt;
&lt;p&gt;Using the watch I&#39;ve started to structure my training to a plan Garmin provides and adjusts based on recorded data. I&#39;m trying a &amp;quot;Training for a 10k&amp;quot; plan with a target race being one in July.&lt;/p&gt;
&lt;p&gt;The plan has me doing things that I&#39;ve not done before. Like &amp;quot;strides&amp;quot;. Basically interval training with short bursts of speed work. This almost sent me back to the bench last weekend with what seemed like a pulled groin. So its not perfect. I believe I&#39;m out of that trouble today and have not had to stop running. Which is good news as I&#39;ve already signed up for several more races, including...&lt;/p&gt;
&lt;p&gt;I&#39;ve signed up for my first ever half marathon. The Madison Mini. I would prefer this milestone not be called &amp;quot;mini&amp;quot;, but it will none the less be a major achievement for me. A distance I&#39;ve never run before.&lt;/p&gt;
&lt;p&gt;To further apply the pressure to stay injury free I signed up for an in person training program specifically for the &#39;mini where I will meet with other runners, coaches and pacers twice a week starting in June. This is something I&#39;m really excited about as running has been such a solo journey for me so far.&lt;/p&gt;
&lt;h2&gt;Races I&#39;ve Run So Far in 2023:&lt;/h2&gt;
&lt;h3&gt;Cottontail Classic - 10k (April 8th)&lt;/h3&gt;
&lt;h4&gt;Thoughts and comments:&lt;/h4&gt;
&lt;p&gt;Chilly morning. Easter themed so, pastel colors on the shirt and a person dressed as the easter bunny. Bunny ears were available to registrants, but I opted out for fear of a detrimental effects on my aerodynamics and ego.&lt;/p&gt;
&lt;p&gt;I kicked off from the start line way too fast and burned out pretty bad a quarter of the way through.&lt;/p&gt;
&lt;p&gt;Finished 11th out of 80 45:09.48 (chip time)&lt;/p&gt;
&lt;h3&gt;Run the Rock - 10k (April 23rd)&lt;/h3&gt;
&lt;h4&gt;Thoughts and comments:&lt;/h4&gt;
&lt;p&gt;This time my race crew (Mom) was along. Again a chilly morning. I started at the top and held the lead for the first half. But the joke was on me as I ran pass the turn around point and its seemingly despondent volunteer who simply waved me along.&lt;/p&gt;
&lt;p&gt;It wasn&#39;t her fault, I could have asked. But because of this (not my first) SNFU, I bought a Garmin Forerunner 245 on the way home.&lt;/p&gt;
&lt;p&gt;Anyway, the race was a benefit for childhood cancer, that was the real point.&lt;/p&gt;
&lt;p&gt;Finished 5th out of 16 49:30.15 (chip time)&lt;/p&gt;
&lt;h2&gt;Upcoming Races&lt;/h2&gt;
&lt;h3&gt;Mother of a Run - 13k (May 13)&lt;/h3&gt;
&lt;h3&gt;Run Madtown - 5k and 10k (May 27 and 28)&lt;/h3&gt;
&lt;h3&gt;The Rec Run - 10k (July 22nd)&lt;/h3&gt;
&lt;h3&gt;Madison Mini - Half Marathon (August 12)&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/cottontail-finish&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/cottontail-finish 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/cottontail-finish 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/cottontail-finish 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;blog author finishing at the cottontail classic race being followed by a very happy looking woman&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;998&quot; /&gt;&lt;figcaption&gt;Me finishing a race. That woman behind me has an attitude I aspire to.&lt;/figcaption&gt;&lt;/figure&gt;</description>
      <pubDate>Thu, 11 May 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/off-to-the-races/</guid>
    </item>
    <item>
      <title>More Chickens</title>
      <link>https://blog.danbraun.me/posts/more-chickens/</link>
      <description>&lt;p&gt;I love eggs. I put them in my smoothies raw. I fry them runny, sunny side up to top 3 to 4 at a time over my oatmeal and avocado toast. Liberal amounts of coarse grain salt, olive oil and/or butter is applied. Nutritional yeast will also dust the occasion with its fish food-like appearance and funky punch.&lt;/p&gt;
&lt;p&gt;Several years ago I built a chicken coop all by myself in my backyard. I painted it fluorescent green with purple trim. Chickens are ridiculous, so their home should be too.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/coop&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/coop 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/coop 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/coop 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;A ridiculous looking green and purple chicken coop&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;846&quot; /&gt;&lt;figcaption&gt;I think it&#39;s art.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I started my poultry journey with six chicks. Then and now I buy them for a few bucks each from a local farm supply store. A lady just plucks them from a glass and wood display and sets them into a little fold up cardboard carton. Kind of like a take home box from a restaurant complete with a handle on top.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/chicken-box&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/chicken-box 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/chicken-box 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/chicken-box 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Chicken in a cardboard carton&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1201&quot; /&gt;&lt;figcaption&gt;Happy meal?&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Anyway that first batch grew up in my basement and garage while I finished building the coop and run. A &#39;run&#39; is a fenced in area outside the actually coop part where the birds sleep, lay eggs and poop piles of feces to be removed regularly. I use a snow shovel.&lt;/p&gt;
&lt;p&gt;Nowadays the run is where my adult birds spend 100% of their time when not in the coop. This is because that inaugural group of 6 became 3 one day when a hawk visited death upon my flock. I was home when it happened and was alerted to the event when I heard wings flapping against the side of my house. The hawk had one of the chickens up against the side of my house. That was one of the places they liked to hang out when I let them free range in my yard. The raptor killed 2 more immediately after that. It did not go away until I was able to chase down the remaining birds and get them into the run.&lt;/p&gt;
&lt;p&gt;With an additional one dying a few weeks later, perhaps from the stress of trauma, I bought 4 new chicks to staff up once more. But one turned out to be a rooster. These birds are all supposed to be hens but I&#39;ve never seen this guaranteed and to be fair, its apparently a &lt;a href=&quot;https://backyardpoultry.iamcountryside.com/chickens-101/how-to-tell-the-sex-of-baby-chicks/&quot;&gt;difficult&lt;/a&gt; skill to sex a newborn chick.&lt;/p&gt;
&lt;p&gt;The rooster was cool for a while. He looked very pretty and hearing that authentic rooster crow really drove home the rustic aesthetic of my house and surroundings. However, this rooster was bent on killing one my hens. This particular girl was my favorite of the group. The most personable I guess. And she was one of the O.Gs. So even though I don&#39;t give them names, I did care enough to put an end to the bloodshed. Asking around I found an Amish fellow whose trade it was to dispatch and butcher chickens and other livestock from surrounding family farms. He chuckled when I asking him how much. &amp;quot;5 bucks&amp;quot;.&lt;/p&gt;
&lt;p&gt;The rooster, for his sins, became a fresh roast. But it was not good. These type of chickens, maybe because of the breed, do not make for good eating. The mostly uneaten, gamey carcass did make for good chicken stock though and many good bowls of soup resulted.&lt;/p&gt;
&lt;p&gt;So, starting with 6 birds in 2017, losing 4 and adding 3 (minus the rooster) in 2021 makes 5? But I actually have only 4 in the coop now. I just remembered, one died mysteriously after the rooster met its Amish fate. Maybe she died of heart ache. Not a memorable hen in any case. Remember I don&#39;t name them.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/final-four&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/final-four 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/final-four 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/final-four 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;3 adult chickens standing in a run&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1006&quot; /&gt;&lt;figcaption&gt;Some of the old guard&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;So with only 4 birds producing an ever shriveling number of eggs (2 of those girls are going on 6 years now, past their egg-y prime), I obtained 4 new cadets from the local Farm &amp;amp; Fleet. They were placed into the same take home carton, from the same glass paneled cases with the same glove-less farm woman hands. As I write this bird flu is a thing, so the daily cavalier handling of birds by these employees is surprising.&lt;/p&gt;
&lt;p&gt;But my 4 new birds, after about 3 weeks, seem completely healthy and are hopefully all hens. I know where to go if not though. 🍗&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/red-chick&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/red-chick 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/red-chick 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/red-chick 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;A Rhode Island Red chick&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1600&quot; /&gt;&lt;figcaption&gt;A Rhode Island Red chick&lt;/figcaption&gt;&lt;/figure&gt;</description>
      <pubDate>Thu, 30 Mar 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/more-chickens/</guid>
    </item>
    <item>
      <title>Drone Music</title>
      <link>https://blog.danbraun.me/posts/drone-music/</link>
      <description>&lt;p&gt;Drone, a subgenre of ambient, is an unflattering label for music. An annoying person &lt;em&gt;drones&lt;/em&gt; on. Drones take intrusive photos or worse.&lt;/p&gt;
&lt;p&gt;But “drone” makes sense. It really is what this music does. Moving slowly, almost imperceptibly. No drops or hooks. There is often no discernable tempo. When it’s done well, the listener can just be and focus fully on the sound.&lt;/p&gt;
&lt;h2&gt;Listening&lt;/h2&gt;
&lt;p&gt;My experience as a listener to drone music can be traced back to when I could have mostly been considered a metalhead (and metal still rules \m/). More specifically, the industrial, experimental leanings of Godflesh or the remix albums of Nine Inch Nails. The latter introduced me to Aphex Twin and later his &lt;em&gt;Selected Ambient Works II&lt;/em&gt; album.&lt;/p&gt;
&lt;p&gt;Presently, a few other artists I can think of that produce very good examples in this genre include Markus Guentner, Tim Hecker, BVDub, Rafael Anton Irisarri (particularly his “The Sight Below” project) and Chihei Hatakeyama.&lt;/p&gt;
&lt;p&gt;So compelling was Guentner’s Soundcloud preview to his &lt;a href=&quot;https://www.astrangelyisolatedplace.com/asipv004-markus-guentner-theia&quot;&gt;&lt;em&gt;Theia&lt;/em&gt;&lt;/a&gt; album several years back, that I ordered the only vinyl record I’ve purchased in recent memory.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/theia-record&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/theia-record 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/theia-record 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/theia-record 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;photograph of Markus Guentner&#39;s Theia clear vinyl record&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; /&gt;&lt;figcaption&gt;Theia by Markus Guentner. Clear vinyl is so cool.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;To me, 13 minutes of &lt;em&gt;Theia’s&lt;/em&gt; first  track &lt;em&gt;Magnetar&lt;/em&gt; are not enough. The track seems to only be using two chords, but is nearly able to saturate my entire consciousness. Emotionally, it conveys a feeling of humble revelation in the presence of enormous energy; the listener being dwarfed by the size of planets and galaxies. The album’s namesake, &lt;em&gt;Theia&lt;/em&gt;, is a &lt;a href=&quot;https://en.wikipedia.org/wiki/Theia_(planet)&quot;&gt;hypothesized planet&lt;/a&gt; that smashed into the early solar system’s Earth forming the moon.&lt;/p&gt;
&lt;p&gt;I can listen very closely to the sounds in &lt;em&gt;Magnetar&lt;/em&gt; and new layers keep revealing themselves. There’s just so much going on for something moving so slowly. Notes in the lower registers are sustained without moving much, others are responsible for the slow movement between the two chords mentioned earlier. While at the top vaporous wisps and dry crackles indicate cosmic debris striking the hull of our spacecraft as it approaches the event horizon… I can’t help my imagination while listening to this.&lt;/p&gt;
&lt;p&gt;Guentner, the others listed above and many more have an ability to summate layers of sound, filling in the entire frequency spectrum, while competently mixing everything. To me, this makes good drone music.&lt;/p&gt;
&lt;h2&gt;Creating&lt;/h2&gt;
&lt;p&gt;I’ve tried doing this myself. It&#39;s my nature to research the work of producers who seem to know what they’re doing before attempting my own experiments, but Markus et al have given me little to work with. For learning and creativity, I should be thankful for this. But I’d love to know how &lt;em&gt;Magnetar&lt;/em&gt; was created!&lt;/p&gt;
&lt;p&gt;Not all drone artists are cagey about their techniques. Look for “rbeny” on Youtube and you’ll find someone who is very open and happy to share how they’re arriving at their sounds. From what I&#39;ve seen, he uses modular synths and other hardware with a mixture of generative sequencing and live interaction - good ol&#39; knob twittling.&lt;/p&gt;
&lt;p&gt;Much of Irisarri and Hatakeyama’s music is created using guitars and effects. Unlike rbeny, I believe they record live, real-time performances to which additional layers are added and effected to create the lush, dreamy results which I enjoy so much in their music.&lt;/p&gt;
&lt;p&gt;I’ve also found that recording long passages of sounds from the real world brings life to an otherwise “in the box” process. Though I possess some hardware synths, the main instrument for my own drones has been the DAW. &lt;em&gt;Bitwig&lt;/em&gt; in particular.&lt;/p&gt;
&lt;p&gt;The centerpiece of most DAWs, the timeline, doesn’t always sit well with producing drone music. Rather than following a linear path, drone seems to occupy a “state”. A drone track starts in one state, and morphs through others. It may be my job to set the parameters and rules to define the shape and duration of those states.&lt;/p&gt;
&lt;p&gt;Timelines are like a grid. It expects you to have some plan as to where things are headed. Ironically, &lt;em&gt;Bitwig&lt;/em&gt; offers a tool called “the grid”, which doesn’t need a timeline at all. &lt;em&gt;Bitwig&#39;s&lt;/em&gt; grid is like &lt;em&gt;max/msp&lt;/em&gt; but far easier, in my experience. It&#39;s also like using a modular system, only without all the boutique hardware.&lt;/p&gt;
&lt;p&gt;So this is a tool I’ve used to bring about drones and ambient music that doesn’t benefit from a timeline’s static road map. Below is a video recording of a fun competition where we were required to create something in the grid using only ten “squares”.&lt;/p&gt;
&lt;iframe style=&quot;max-width:100%;height:auto;aspect-ratio: 16 / 9&quot; width=&quot;800&quot; height=&quot;441&quot; src=&quot;https://www.youtube.com/embed/jl9VONKQpo4&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;Bitwig&lt;/em&gt; has an especially strong set of options when it comes to sending generative, semi-random modulation signals to parameters in synths and effects. Above this is being done completely within the grid.&lt;/p&gt;
&lt;p&gt;Individual software instruments can have their own set of modulators, and those instruments can be grouped with each group having a set of their own modulators. Then you can modulate those modulators… It can go on and on like this.&lt;/p&gt;
&lt;p&gt;In my song &lt;em&gt;Promise&lt;/em&gt; I did such a layering mixing 2 sampler instruments loaded with resampled chords. I think the chords were originally played back with a soft synth and effects. With a simple pair of notes harmonizing two of these sampled triads a fourth from one another, I could animate a number of instrument and effects properties creating a perpetual evolution of sonic variation. A third sampler in this group played back a field recording of wind who’s amplitude I used to modulate the gain levels of the other 2 samplers via a side chain modulator.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/drone-samplers-chain&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/drone-samplers-chain 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/drone-samplers-chain 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/drone-samplers-chain 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Screenshot of Bitwig instrument chain&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;294&quot; /&gt;&lt;figcaption&gt;3 instrument layers and their effects being modulated&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;To add additional texture I recorded a couple of external sources. In one I played a percussive pattern tapping sticks against a tongue drum. For the other I plugged in an electric guitar and pick-scraped a string that was in key.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/bell-gtr-recordingtracks&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/bell-gtr-recordingtracks 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/bell-gtr-recordingtracks 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/bell-gtr-recordingtracks 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Screen shot of long recordings in Bitwig&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;186&quot; /&gt;&lt;figcaption&gt;External sounds record into Bitwig&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The final major element in &lt;em&gt;Promise&lt;/em&gt; is the bass sound. For this I recorded myself playing 2 notes on a soft-synth switching between the two when it felt correct to do so. Like the tongue drum tapping, I didn’t listen to a click and ignored the tempo set in the DAW.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/tempo-free-bass-notes&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/tempo-free-bass-notes 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/tempo-free-bass-notes 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/tempo-free-bass-notes 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Screenshot of midi notes in Bitwig&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;414&quot; /&gt;&lt;figcaption&gt;Tempo free bass notes&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I found a pleasant vista near my house and shot enough high speed video to couple the track with a simple visualization. I find adding a visual element both satisfies my interest in videography and adds a fitting accompaniment to this music.&lt;/p&gt;
&lt;iframe style=&quot;max-width:100%;height:auto;aspect-ratio: 16 / 9&quot; width=&quot;800&quot; height=&quot;441&quot; src=&quot;https://www.youtube.com/embed/wxwKiIzt4fY&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;</description>
      <pubDate>Sun, 05 Feb 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/drone-music/</guid>
    </item>
    <item>
      <title>Eleventy, Images and Cloudinary</title>
      <link>https://blog.danbraun.me/posts/eleventy-images-and-cloudinary/</link>
      <description>&lt;p&gt;Recently I had to figure out a way to serve images in my posts that not only worked, but performed well.&lt;/p&gt;
&lt;h2&gt;Eleventy&lt;/h2&gt;
&lt;p&gt;This site, my first &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; site, works by generating static pages from Nunjucks templates and markdown files. Eleventy is flexible in what kind of files it uses, but that&#39;s how I&#39;m using it. Blog content (not images - see below) and code all live together in a Git repository on Github. To serve the site, I have a free Netlify account that watches this repo and builds it&#39;s static pages when things change.&lt;/p&gt;
&lt;h2&gt;Cloudinary&lt;/h2&gt;
&lt;p&gt;Strictly speaking, Netlify is not entirely serving the site.&lt;/p&gt;
&lt;p&gt;In most of my posts I want to add images. Though its possible to add website images directly into the repository with everything else, its not a good idea for a number of reasons. There are several solutions to this, like Git&#39;s &amp;quot;large file storage&amp;quot; (LFS) - which Netlify provides tools for.&lt;/p&gt;
&lt;p&gt;But I&#39;ve had a &lt;a href=&quot;https://cloudinary.com/&quot;&gt;Cloudinary&lt;/a&gt; account sitting dormant for years. I had used for a long abandoned blog. Hopefully this blog doesn&#39;t suffer a similar fate.&lt;/p&gt;
&lt;p&gt;Cloudinary can be used to add images to a static site which has no server storage or database of its own. I simply use Cloudinary&#39;s website interface to upload images I want to use on my site, and Cloudinary generates a URL to access those images. Whats more is you can add &amp;quot;transformations&amp;quot;, extra segments to that URL, and it will return that image resized or altered in some way.&lt;/p&gt;
&lt;p&gt;Like Netlify, I&#39;m also using the free tier at Cloudinary. Notice a theme? Cloudinary&#39;s free tier seems generous enough - though difficult to explain so I won&#39;t do that here, suffice it to say there&#39;s a limit to the number of transformations allowed per month.&lt;/p&gt;
&lt;h2&gt;Lighthouse and CLS&lt;/h2&gt;
&lt;p&gt;So my first idea for displaying photos worked pretty well. I finally got my head around &lt;code&gt;srcset&lt;/code&gt; and &lt;code&gt;sizes&lt;/code&gt; and could use Cloudinary to request small, medium and large versions of each image to fill in the &lt;code&gt;srcset&lt;/code&gt; attribute each time the site builds.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; source_low &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://res.cloudinary.com/*******/image/upload/c_scale,w_400/f_auto/blog/filename&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; source_med &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://res.cloudinary.com/*******/image/upload/c_scale,w_800/f_auto/blog/filename&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; source_high &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://res.cloudinary.com/*******/image/upload/c_scale,w_1600/f_auto/blog/filename&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;figure&gt;&lt;br /&gt;      &amp;lt;img src=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;source_low&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; &lt;br /&gt;           srcset=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;source_low&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; 400w,&lt;br /&gt;           &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;source_med&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; 800w,&lt;br /&gt;           &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;source_high&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; 1600w&quot;&lt;br /&gt;           sizes=&quot;(min-width: 768px) 768px, 100vw&quot;&lt;br /&gt;           alt=&quot;alt text&quot; &lt;br /&gt;           loading=&quot;lazy&quot;&gt;&lt;br /&gt;    &amp;lt;figcaption&gt;caption text&amp;lt;/figcaption&gt;&lt;br /&gt;  &amp;lt;/figure&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is great because I never have to resize and keep track of extra copies of images.&lt;/p&gt;
&lt;p&gt;But something is missing. Chrome&#39;s Lighthouse told me so. Most easily accessed under a tab in Chrome&#39;s dev tools, Lighthouse is there to judge you and your website. Ok, maybe not you - and really, its trying to help.&lt;/p&gt;
&lt;p&gt;In my case, under it&#39;s &amp;quot;Performance&amp;quot; metrics, I needed to pay more attention to CLS or &amp;quot;Cumulative Layout Shift&amp;quot;. Simply, my pages were sliding content around as images downloaded. Maybe not as noticeable on faster connections, the browser was in fact downloading text faster than images. Because I hadn&#39;t bothered to &lt;strong&gt;tell the browser how much space the images would occupy&lt;/strong&gt; before they arrived, the images were just rudely shoving content out of their way.&lt;/p&gt;
&lt;h2&gt;My Solution to CLS: Shortcode and Cloudinary&#39;s Metadata GET Request&lt;/h2&gt;
&lt;p&gt;In the previous code example you may have noticed the glaring omission of width and height attributes in the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag. If not, you can be forgiven as many of us have grown to consider them as quaint vestigial attributes from a time before CSS.&lt;/p&gt;
&lt;p&gt;However, modern browsers now use the width and height image attributes to calculate an aspect ratio and use this data to save a spot for those rude images. Thereby reducing CLS.&lt;/p&gt;
&lt;p&gt;Now here&#39;s what I had to solve:&lt;/p&gt;
&lt;p&gt;I could manually pass a known width and height &lt;em&gt;every time&lt;/em&gt; I added an image to my blog. But that would suck.&lt;/p&gt;
&lt;p&gt;Or, I could just make every image the same size and hard code a width and height. That would also suck - are my photos and screen shots not... Art?&lt;/p&gt;
&lt;p&gt;Therefore, I needed a way dynamically obtain each image&#39;s width and height at build so Eleventy could render my image tags with whatever its dimensions happened to be. Note that even though I&#39;m referencing a set of images for srcset, only the dimensions of one of them needs to be known. The browser needs only to calculate an aspect ratio - which is the same for all these uniformly scaled images.&lt;/p&gt;
&lt;p&gt;It took me a couple of nights of searching the web, reviewing &lt;a href=&quot;https://www.raymondcamden.com/2022/11/04/adding-responsive-images-with-cloudinary&quot;&gt;excellent blogs like Raymond Camden&#39;s&lt;/a&gt; and asking questions online to arrive at a simple API request to Cloudinary that works just like how I was already requesting images. Instead I needed to use a &amp;quot;transformation&amp;quot; called &lt;a href=&quot;https://cloudinary.com/documentation/transformation_reference#fl_getinfo&quot;&gt;fl_getinfo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oddly, it doesn&#39;t transform a resulting image, but instead returns a JSON string with the image&#39;s metadata. For example,&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot; style=&quot;font-size: 0.8em&quot;&gt;https://res.cloudinary.com/*********/image/upload/fl_getinfo/blog/beans.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;may return something like:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;input&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;width&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1600&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;height&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;bytes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;358731&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;&quot;output&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;format&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;jpg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;bytes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;307179&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;width&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1600&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;height&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1200&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once everything was setup, in my blog post markdown files I could drop in a shortcode wherever I wanted an image:&lt;/p&gt;
&lt;pre class=&quot;language-nunjucks&quot;&gt;&lt;code class=&quot;language-nunjucks&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;!&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;blog&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;md&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;blogImage&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rockisland&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Sunrise on Rock Island&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Sunrise on Rock Island&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;!&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;omitting&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;filetype&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;suffix&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;will&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;allow&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;Cloudinary&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;choose&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;suitable&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make sure to set &lt;code&gt;templateEngineOverride: njk,md&lt;/code&gt; in the front matter so Eleventy runs markdown files though the Nunjucks engine first and process the shortcodes.&lt;/p&gt;
&lt;p&gt;Here is what the function for the &lt;code&gt;blogImage&lt;/code&gt; shortcode looks like. I&#39;m using the Eleventy plugin &lt;code&gt;eleventy-fetch&lt;/code&gt; to cache results, which I&#39;ll explain below.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* utils.js */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; eleventyFetch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@11ty/eleventy-fetch&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;blogImage&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; source_low &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://res.cloudinary.com/***********/image/upload/c_scale,w_400/f_auto/blog/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filename&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; source_med &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://res.cloudinary.com/***********/image/upload/c_scale,w_800/f_auto/blog/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filename&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; source_high &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://res.cloudinary.com/***********/image/upload/c_scale,w_1600/f_auto/blog/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filename&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; infoURL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://res.cloudinary.com/***********/image/upload/fl_getinfo/blog/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filename&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;eleventyFetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;infoURL&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;duration&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1y&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;json&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;oh no...&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;error&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;figure&gt;&lt;br /&gt;      &amp;lt;img src=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;source_med&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; &lt;br /&gt;           srcset=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;source_low&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; 400w,&lt;br /&gt;           &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;source_med&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; 800w,&lt;br /&gt;           &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;source_high&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; 1600w&quot;&lt;br /&gt;           sizes=&quot;(min-width: 768px) 768px, 100vw&quot;&lt;br /&gt;           alt=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;alt&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; &lt;br /&gt;           loading=&quot;lazy&quot;&lt;br /&gt;           width=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;width&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;br /&gt;           height=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;height&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&gt;&lt;br /&gt;    &amp;lt;figcaption&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;caption&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/figcaption&gt;&lt;br /&gt;  &amp;lt;/figure&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I start by declaring the function as &lt;code&gt;async&lt;/code&gt; so I can use &lt;code&gt;await&lt;/code&gt; later for the API request. The params argument contains a filename, caption and alt text from the shortcode call coming from markdown files.&lt;/p&gt;
&lt;p&gt;Then I set variables to hold 3 URLs used by srcset and 1 more for requesting the image metadata.&lt;/p&gt;
&lt;p&gt;Next is where I obtain the file meta data in JSON format. &lt;code&gt;result&lt;/code&gt; is the object holding these values and I access them with dot notation.&lt;/p&gt;
&lt;p&gt;Finally I build the HTML string and mix in all the values obtained above, including the all important width and height.&lt;/p&gt;
&lt;p&gt;I then require this function into my .eleventy.js so that I can create the shortcode referencing it using the config object&#39;s &lt;code&gt;addNunjucksAsyncShortcode&lt;/code&gt; method. The async version is required in this case.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* .eleventy.js */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; blogImage &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;./utils&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;eleventyConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;&lt;br /&gt;  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addNunjucksAsyncShortcode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;blogImage&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;blogImage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.11ty.dev/docs/plugins/fetch/&quot;&gt;eleventy-fetch&lt;/a&gt; plugin was an unintentional find during this process of discovery. But it made sense to use it.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;eleventyFetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;infoURL&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;duration&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1y&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;json&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;oh no...&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;error&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It creates a &lt;code&gt;.cache&lt;/code&gt; folder in the root of your project, and in my case its saving each of the json strings that Cloudinary is sending me with my fl_getinfo requests. For one year.&lt;/p&gt;
&lt;p&gt;This is only relevant during local development, though there are some hoops you can jump though to have Netlify open access to a &lt;code&gt;.cache&lt;/code&gt; folder during production builds (Edit: or use the &lt;a href=&quot;https://www.11ty.dev/docs/plugins/fetch/#running-this-on-your-build-server&quot;&gt;netlify-cache-plugin&lt;/a&gt;). I&#39;m only using it locally though to prevent unnecessary transitions and perhaps cut down on build times once I have more than 5 blog posts.&lt;/p&gt;
&lt;p&gt;This all results in a handsome &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; element after the site builds.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot; style=&quot;font-size: 0.8em&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;figure&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/blog/rockisland&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;      &lt;span class=&quot;token attr-name&quot;&gt;srcset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/blog/rockisland 400w,&lt;br /&gt;           https://res.cloudinary.com/brauntrutta/image/upload/t_blog-me/blog/rockisland 800w,&lt;br /&gt;           https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/blog/rockisland 1600w&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;           &lt;span class=&quot;token attr-name&quot;&gt;sizes&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(min-width: 768px) 768px, 100vw&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;           &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Sunrise on Rock Island&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;           &lt;span class=&quot;token attr-name&quot;&gt;loading&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;lazy&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;           &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;1600&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;           &lt;span class=&quot;token attr-name&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;1200&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;figcaption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Sunrise on Rock Island&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;figcaption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;figure&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I didn&#39;t anticipate digging quite so deep into making some images appear on my blog site. I haven&#39;t even got pagination figured out yet! But I&#39;m really happy to appease our Lighthouse overlords.&lt;/p&gt;
&lt;p&gt;This idea could be extended. For example, I could add more parameters to return a smaller, floated image. Currently all my images using this shortcode take up the full with of the main column.&lt;/p&gt;
&lt;p&gt;Since I couldn&#39;t bare the irony of ending this post as the only entry without an image, here&#39;s some vegetables:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/six-buttercup-squash&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/six-buttercup-squash 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/six-buttercup-squash 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/six-buttercup-squash 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Buttercup squash lined up on a deck railing&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;681&quot; /&gt;&lt;figcaption&gt;Buttercup squash from my garden, 2022 season&lt;/figcaption&gt;&lt;/figure&gt;</description>
      <pubDate>Fri, 20 Jan 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/eleventy-images-and-cloudinary/</guid>
    </item>
    <item>
      <title>Tiny Microphones from Slovakia</title>
      <link>https://blog.danbraun.me/posts/tiny-microphones-from-slovakia/</link>
      <description>&lt;p&gt;I found out about a company called &lt;a href=&quot;https://store.lom.audio/&quot;&gt;LOM&lt;/a&gt; on Youtube, probably from these &lt;a href=&quot;https://www.youtube.com/@FreeToUseSounds&quot;&gt;nice folks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;LOM specializes in &amp;quot;sensitive microphones and sensor for field recording&amp;quot;. They also run a label for experimental music from Eastern Europe. Aside from traditional condenser microphones, they also sell piezo contact microphones, electo-magnetic field sensors and something called a Geofón, which can be used to record very faint vibrations in &amp;quot;various materials&amp;quot;, such as underwater.&lt;/p&gt;
&lt;p&gt;A really cool company in Bratislava, Slovakia except for the fact that most of their products are usually listed as sold out. Understandable given their niche applications, but pretty frustrating if you&#39;re suddenly excited about recording the inside of your toilet.&lt;/p&gt;
&lt;p&gt;The way to obtain something from them is to sign up for their newsletter and participate in the sport of speed clicking through their online store after they announce the limited availability of something. I&#39;ve tried and failed multiple times. Once available, microphones like the Geofón will sell out in a matter of minutes.&lt;/p&gt;
&lt;p&gt;I finally did succeed in ordering a pair of their highly sensitive, omni-directional &lt;a href=&quot;https://store.lom.audio/collections/mikrousi-series/products/mikrousi-pro&quot;&gt;mikroUši Pro&lt;/a&gt; microphones with wind guards.&lt;/p&gt;
&lt;p&gt;About a week later they arrived in the mail along with some stickers. A real DIY vibe.&lt;/p&gt;
&lt;p&gt;The mics came with a pair of mounting clips and small tin containing adorable little wind guards from a company call Bumblebee Industries. That&#39;s what they looked like too, little puffy black bumble bees.&lt;/p&gt;
&lt;p&gt;They stopped being cute once I tried to wrestle them over the mics. The distressingly sexual process of locating their tiny openings into which the microphones are to be inserted is in fact so problematic that Bumblebee Industries has a video on Youtube to help guide the process.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/wind-bubbles&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/wind-bubbles 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/wind-bubbles 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/wind-bubbles 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Man demonstrating how to mount windguards onto microphones&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;859&quot; /&gt;&lt;figcaption&gt;Man demonstrating how to mount windguards onto microphones&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Its apparently easier after first few times. Mmm hmm.&lt;/p&gt;
&lt;p&gt;Once this happy union is achieved, the microphones have proven to be very powerful field recording devices. I&#39;ve mostly used them plugged into my Tascam DR-100MKII PCM recorder via sturdy XLR connectors which are comically bigger and heaver than the tiny mics they are attached to.&lt;/p&gt;
&lt;p&gt;I&#39;ll let the sound samples below speak for themselves.&lt;/p&gt;
&lt;h2&gt;Madison Art Fair&lt;/h2&gt;
&lt;p&gt;I copied a technique from the Youtube channel mentioned earlier and clipped the mics to a backpack with the recorder inside. I then spent an hour walking though a crowded downtown art fair.&lt;/p&gt;
&lt;audio controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673580073/blog/Madison-Art-Fair-220709_01.mp3&quot; type=&quot;audio/mpeg&quot; /&gt;
  &lt;!-- fallback for non-supporting browsers goes here --&gt;
  &lt;p&gt;
    Your browser does not support HTML audio, but you can still
    &lt;a href=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673580073/blog/Madison-Art-Fair-220709_01.mp3&quot;&gt;download the file&lt;/a&gt;.
  &lt;/p&gt;
&lt;/audio&gt;
&lt;h2&gt;Dell Creek State Wildlife Area at night&lt;/h2&gt;
&lt;p&gt;There&#39;s a state wildlife area near my home. On an August night I parked in one if its small interior gravel lots and set up my recorder and mics nearby. I then took a walk down the road so the gear could be left to record for nearly an hour. Listening to the result is a nice reminder of summer during winter months.&lt;/p&gt;
&lt;audio controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673580072/blog/dell-creek-state-wildlife-area-220815_01.mp3&quot; type=&quot;audio/mpeg&quot; /&gt;
  &lt;!-- fallback for non-supporting browsers goes here --&gt;
  &lt;p&gt;
    Your browser does not support HTML audio, but you can still
    &lt;a href=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673580072/blog/dell-creek-state-wildlife-area-220815_01.mp3&quot;&gt;download the file&lt;/a&gt;.
  &lt;/p&gt;
&lt;/audio&gt;
&lt;h2&gt;Rock Island State Park&lt;/h2&gt;
&lt;p&gt;At the tip of Wisconsin&#39;s &amp;quot;thumb&amp;quot; are located 2 islands. Washington Island is large and populated. But another, further out and smaller is Rock Island. It is not populated but for a handful of park personnel. I spent a night there camping in one of its hike-in backpacking sites. It was located on the southeast shore of the island where waves from Lake Michigan crash in nonstop.&lt;/p&gt;
&lt;audio controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673580072/blog/rock-island-lake-waves-edit_01.mp3&quot; type=&quot;audio/mpeg&quot; /&gt;
  &lt;!-- fallback for non-supporting browsers goes here --&gt;
  &lt;p&gt;
    Your browser does not support HTML audio, but you can still
    &lt;a href=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673580072/blog/rock-island-lake-waves-edit_01.mp3&quot;&gt;download the file&lt;/a&gt;.
  &lt;/p&gt;
&lt;/audio&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/rockisland&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/rockisland 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/rockisland 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/rockisland 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Sunrise on Rock Island&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1200&quot; /&gt;&lt;figcaption&gt;Sunrise on Rock Island&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Eastern Towhee in my backyard&lt;/h2&gt;
&lt;p&gt;Just some birds from behind my house. Record in July.&lt;/p&gt;
&lt;audio controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673580072/blog/220704_0220_01-eastern-towhee.mp3&quot; type=&quot;audio/mpeg&quot; /&gt;
  &lt;!-- fallback for non-supporting browsers goes here --&gt;
  &lt;p&gt;
    Your browser does not support HTML audio, but you can still
    &lt;a href=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673580072/blog/220704_0220_01-eastern-towhee.mp3&quot;&gt;download the file&lt;/a&gt;.
  &lt;/p&gt;
&lt;/audio&gt;
&lt;h2&gt;Tainter Creek&lt;/h2&gt;
&lt;p&gt;This was recorded late spring on the upper stretches of one of the may &lt;em&gt;driftless area&lt;/em&gt; creeks in southwest Wisconsin. Much of this recording contained clipping due to having the input too hot and the frogs being just so damn loud.&lt;/p&gt;
&lt;audio controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673580072/blog/tainter-creek-220527_01.mp3&quot; type=&quot;audio/mpeg&quot; /&gt;
  &lt;!-- fallback for non-supporting browsers goes here --&gt;
  &lt;p&gt;
    Your browser does not support HTML audio, but you can still
    &lt;a href=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673580072/blog/tainter-creek-220527_01.mp3&quot;&gt;download the file&lt;/a&gt;.
  &lt;/p&gt;
&lt;/audio&gt;
</description>
      <pubDate>Fri, 13 Jan 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/tiny-microphones-from-slovakia/</guid>
    </item>
    <item>
      <title>Ice Ice Junto</title>
      <link>https://blog.danbraun.me/posts/ice-ice-junto/</link>
      <description>&lt;p&gt;I recently joined an online &lt;a href=&quot;https://disquiet.com/2012/01/27/the-disquiet-junto/&quot;&gt;project by Marc Weidenbaum&lt;/a&gt; a.k.a. Disquiet on &lt;a href=&quot;http://post.lurk.org/@disquiet&quot;&gt;Mastondon&lt;/a&gt;. Basically, Marc drops an email once a week with a musical or audio assignment to be completed in 4 days. Things like &amp;quot;use one of these previously created drum loops&amp;quot; or, in the case of this post, &amp;quot;create a track using ice clanking in a glass&amp;quot;.&lt;/p&gt;
&lt;p&gt;The 4 days mentioned above run from Friday to Monday. I started my composition on Sunday morning by bringing a few glasses, water and a small tub of ice to a quiet room. The rules did not stipulate whether or not one could use multiple glasses of water.&lt;/p&gt;
&lt;img class=&quot;post-image-small&quot; src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/s--rxb2gZTr--/c_scale,w_250/v1673274620/blog/ice-mics-500.jpg&quot; alt=&quot;microphones and a glass of ice water&quot; /&gt;
&lt;p&gt;I clipped a pair of &lt;a href=&quot;https://store.lom.audio/collections/mikrousi-series&quot;&gt;LOM mikroUši&lt;/a&gt; microphones to an iPad stand and recorded about 5 minutes of pouring and clanking, being sure to capture some sustained tones from the glasses that I could loop and pitch to scale in a sampler.&lt;/p&gt;
&lt;p&gt;Here&#39;s part of that recording:&lt;/p&gt;
&lt;audio controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673314898/blog/ice-glass-short.mp3&quot; type=&quot;audio/mpeg&quot; /&gt;
  &lt;!-- fallback for non-supporting browsers goes here --&gt;
  &lt;p&gt;
    Your browser does not support HTML audio, but you can still
    &lt;a href=&quot;https://res.cloudinary.com/brauntrutta/video/upload/v1673314898/blog/ice-glass-short.mp3&quot;&gt;download the file&lt;/a&gt;.
  &lt;/p&gt;
&lt;/audio&gt;
&lt;p&gt;In Bitwig I chopped up a dozen or so parts that had interesting variations and tones to make a sort of marimba sound.&lt;/p&gt;
&lt;p&gt;I used a set of ringing glass samples that ended up being 34 cents shy of a C#. In the sampler I could layer them so that each would or would not play back based on the velocity of the note playing, with cross fading in between.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/bitwig-sampler-layers&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/bitwig-sampler-layers 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/bitwig-sampler-layers 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/bitwig-sampler-layers 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Bitwig screenshot&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;527&quot; /&gt;&lt;figcaption&gt;This is how I set up one of the samplers in Bitwig to play back samples of ice clanking glass&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The next big help for this song came from the Stepic VST plugin I recently acquired. It emulates the way a hardware 16-step sequencer works plus much much more. I used it to trigger patterns, playing marimba like tones and what ended up sounding like tablas. With Stepic, I shortened a rhythmic gate pattern to just 5 beats, while notes used a pattern of 6 beats - with all of this being repeated every 16 steps. This created a poly-rhythmic sequence that had a 5/4 or 10/4 feel. Maybe a drummer can tell me.&lt;/p&gt;
&lt;p&gt;Then tonally, I constrained notes to the phrygian mode with a root note of E2. I started with my own note ideas but quickly got lost in the endless variations Stepic can &lt;em&gt;suggest&lt;/em&gt; and found something I liked much better. I think the sound of the water glass based notes had a nice warble from the liquid moving about in them. Something that takes work to tease out of a synthesizer, but got for free here.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/stepic-vst&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/stepic-vst 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/stepic-vst 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/stepic-vst 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Stepic VST screenshot&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1165&quot; /&gt;&lt;figcaption&gt;Stepic VST plugin&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The last prominent sound idea for the track were the drones that start, continue though and finish things out.&lt;/p&gt;
&lt;p&gt;Again with the help of Bitwig&#39;s sampler I bounced a chord that fit the key of the song and resampled it. I then used the sampler&#39;s textures mode, which is basically granular synthesis. Using voice stacking, multiple voices will play back simultaneously per single note triggered but with varied values applied to any modulations you send to an instrument&#39;s parameters (things like this are why I adore Bitwig). In this case, I sent an LFO to the playback location of each of the 3 voice&#39;s sampler play heads. In this way, with 3 voices stacked, the LFO is actually 3 different LFOs in different phases all playing different parts of the sample. This results in a satisfying drone ;)&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/bitwig-drone-sampler&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/bitwig-drone-sampler 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/bitwig-drone-sampler 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/bitwig-drone-sampler 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Bitwig sampler screenshot&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;363&quot; /&gt;&lt;figcaption&gt;Bitwig sampler in textures mode&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The remaining sounds were simpler percussive elements that took the place of where high hats and percussion might be in more traditional music. Their patterns were composed in audio clips filled with short samples of clicks and clinks.&lt;/p&gt;
&lt;p&gt;Below is the final result:&lt;/p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1420302190&amp;color=%23443830&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;/iframe&gt;&lt;div style=&quot;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&quot;&gt;&lt;a href=&quot;https://soundcloud.com/14-below-zero&quot; title=&quot;14 Below Zero&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;14 Below Zero&lt;/a&gt; · &lt;a href=&quot;https://soundcloud.com/14-below-zero/ice-ice-junto-disquiet0575&quot; title=&quot;Ice Ice Junto (Disquiet0575)&quot; target=&quot;_blank&quot; style=&quot;color: #cccccc; text-decoration: none;&quot;&gt;Ice Ice Junto (Disquiet0575)&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 12 Jan 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/ice-ice-junto/</guid>
    </item>
    <item>
      <title>A Cat Named Beans</title>
      <link>https://blog.danbraun.me/posts/a-cat-named-beans/</link>
      <description>&lt;p&gt;I have a cat named Beans. He is rescue pet from a local humane society animal shelter. I believe it&#39;s not a &amp;quot;no-kill&amp;quot; shelter so, a &amp;quot;kill shelter&amp;quot;? It doesn&#39;t say that on the sign.&lt;/p&gt;
&lt;p&gt;Beans is the name the shelter gave him and I kept it. He was already answering to it and we both like it just fine.&lt;/p&gt;
&lt;p&gt;He was the only cat that talked to me, eye to eye. But to be fair, he had an advantageous eye level location amongst the others. One of the workers there also put in a good word for him, so he must have been hustling long before I arrived.&lt;/p&gt;
&lt;p&gt;I went as far as to &amp;quot;test drive&amp;quot; one other cat in a room the shelter had for meeting your candidates, but Beans was the right one.&lt;/p&gt;
&lt;p&gt;So now he&#39;s here, going on 8 years...&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/beans&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/beans 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/beans 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/beans 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;Beans, a black and white cat lounging atop a turntable&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1200&quot; /&gt;&lt;figcaption&gt;Beans, looking down from a turntable&lt;/figcaption&gt;&lt;/figure&gt;
</description>
      <pubDate>Sat, 07 Jan 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/a-cat-named-beans/</guid>
    </item>
    <item>
      <title>Oh My Blog</title>
      <link>https://blog.danbraun.me/posts/oh-my-blog/</link>
      <description>&lt;p&gt;Its time to write about writing a blog.&lt;/p&gt;
&lt;p&gt;This is like a journal only not as personal. I don&#39;t keep a journal but I&#39;ve often thought about it because it seems like a good idea.&lt;/p&gt;
&lt;p&gt;I&#39;ve also thought of writing a blog before, because it would have the same cathartic? benefits but with less effort (less frequency) and more pictures.&lt;/p&gt;
&lt;p&gt;Here is a picture:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/early-morning-chicken-coop&quot; srcset=&quot;https://res.cloudinary.com/brauntrutta/image/upload/t_blog-low/f_auto/blog/early-morning-chicken-coop 400w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-med/f_auto/blog/early-morning-chicken-coop 800w, https://res.cloudinary.com/brauntrutta/image/upload/t_blog-high/f_auto/blog/early-morning-chicken-coop 1600w&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; alt=&quot;A lighted chicken coop casting shadows in the early morning dark&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;983&quot; /&gt;&lt;figcaption&gt;This is a winter, early morning photo of my backyard chicken coop&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;This will also be a personal web design project. I do that stuff for a living and want to start experiencing these special powers creatively, and with the benefit of sharpening my skills.&lt;/p&gt;
&lt;p&gt;For this site, I&#39;m using Eleventy. &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; is a static site generator and my FOMO is strong with these and their associated tools (JAMStack etc.)&lt;/p&gt;
&lt;p&gt;Here&#39;s another reason for starting a blog. I would much prefer my and others&#39; online world to be under our own control. Social &lt;s&gt;media&lt;/s&gt; networks are a really cool idea, but the main players out there have &lt;a href=&quot;https://www.humanetech.com/the-social-dilemma&quot;&gt;gone a little sour&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Writing is healthy. My blog will be a chance for me to examine myself and ideas that take up space in my brain. I might even be able to share useful information with others, should these writings start to pop up in front of other people.&lt;/p&gt;
&lt;p&gt;So that&#39;s it. I&#39;m going to make another go at a blog 🤙&lt;/p&gt;
</description>
      <pubDate>Sun, 01 Jan 2023 00:00:00 +0000</pubDate>
      <dc:creator>Dan Braun</dc:creator>
      <guid>https://blog.danbraun.me/posts/oh-my-blog/</guid>
    </item>
  </channel>
</rss>