<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Kurt J. Lewis]]></title><description><![CDATA[Technology, code, and lessons learned the hard way]]></description><link>https://kurtjlewis.com/</link><image><url>https://kurtjlewis.com/favicon.png</url><title>Kurt J. Lewis</title><link>https://kurtjlewis.com/</link></image><generator>Ghost 4.8</generator><lastBuildDate>Fri, 17 Apr 2026 10:42:47 GMT</lastBuildDate><atom:link href="https://kurtjlewis.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Looking at 2023]]></title><description><![CDATA[<p>It&apos;s now the third week of 2023 as I write this, though I&apos;ve been thinking about writing it for a lot longer. Things are mostly the same for me, but there&apos;s a few things I&apos;d like to write about: I&apos;ve</p>]]></description><link>https://kurtjlewis.com/looking-at-2023/</link><guid isPermaLink="false">63b23dcc1e263305a1e942e5</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Thu, 19 Jan 2023 04:52:26 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2023/01/IMG_2672.JPG" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2023/01/IMG_2672.JPG" alt="Looking at 2023"><p>It&apos;s now the third week of 2023 as I write this, though I&apos;ve been thinking about writing it for a lot longer. Things are mostly the same for me, but there&apos;s a few things I&apos;d like to write about: I&apos;ve been thinking a lot about running and biking recently:</p><h2 id="on-running">On Running</h2><p>In July when Harvest and I moved, I had new neighborhoods to explore on my runs, and for a few weeks I increased my weekly mileage by around ~50%. It turns out that was too much for my ever-aging body to handle, and I developed what I now know to be a case of &quot;chondromalacia patellae&quot;, or &quot;Runner&apos;s Knee&quot;. When it first started, my knee was always sore right under the knee cap - trying to bounce on one leg actively hurt, and running, while possible, definitely felt wrong. In the spirit of trying to avoid creating an injury that would permanently impact my ability to run, I took a few weeks off. A few weeks turned into months of continuing soreness, to the point I saw a physical therapist about it. For the past three months I&apos;ve been doing quad and tendon strengthening exercises, and have slowly made progress in how long I can run pain free, I&apos;m currently up to ~14 minutes, in 2 minute intervals!</p><p>Not being able to run has really highlighted for me how important running is to me. I&apos;ve been running off and on for the better part of 15 years, and I&apos;ve stopped running temporarily before - but never because I didn&apos;t have a choice. Now that I can&apos;t, it&apos;s all I want to do. It&apos;s made me realize how much I don&apos;t like the feeling of being injured - and I&apos;ve resolved to do everything I can to get back into running again, and when I do, not to take my health for granted. That means being strict about how much I increase milage, being consistent on recovery, and not overdoing it. </p><h2 id="biking">Biking</h2><p>In my pursuit for more &quot;type 2 fun&quot;, I&apos;ve long been thinking about buying a bike. But, they&apos;re expensive (and I&apos;m cheap) - so I kept putting it off. Not being able to run, and seeing the exact bike I wanted actually in stock a short distance away, I finally made the purchase - though not without a lot of waffling. I bought a Trek Domane AL - an &quot;endurance road bike&quot;. There&apos;s a lot of options out there when it comes to choosing a bike - and a lot of decisions to make. For me, I suspect the Domane will fit my desired riding. It&apos;s been rainy in California for much of the past few weeks so I&apos;ve only had a few chances to take it out, &#xA0;but it&apos;s been fun. I&apos;m still figuring some things out, like maintenance and fit adjustments. I&apos;m looking forward to hopefully doing some long rides this summer!</p><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2023/01/image.png" class="kg-image" alt="Looking at 2023" loading="lazy" width="1231" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2023/01/image.png 600w, https://kurtjlewis.com/content/images/size/w1000/2023/01/image.png 1000w, https://kurtjlewis.com/content/images/2023/01/image.png 1231w" sizes="(min-width: 720px) 720px"></figure><p><a href="https://www.strava.com/athletes/48004362">I record all my runs and rides to Strava - follow me if you&apos;re interested in following along (and I&apos;m always looking for more people to follow on Strava!)</a></p><h2 id="some-media-ive-been-enjoying">Some Media I&apos;ve Been Enjoying</h2><p>I&apos;ve been watching a lot of running and biking related content on Youtube, and I&apos;ve found a few that I&apos;ve really enjoyed:</p><ul><li><a href="https://www.youtube.com/watch?v=rVWpIfM4BJU&amp;list=PLpShiRze6hi_426_gXtK7oXdjqWs9_a1u">&quot;Cycling to Argentina&quot;</a> - an in-progress series where a pair of touring bikers ride from Alaska to Argentina. Great shots and it&apos;s fun to follow their progress.</li><li><a href="https://www.youtube.com/watch?v=Zbl0jhbpiM0">&quot;The Barkley Marathons&quot;</a> - the Barkley is a really esoteric and interesting race that few finish, this documentary follows a particularly interesting year</li><li><a href="https://www.youtube.com/watch?v=iC7Lh4opLsc">&quot;How to Run 100 Miles&quot;</a> - Another short documentary on a pair of runners as they prep and run an ultramarathon</li></ul><p>I can&apos;t even run one mile without knee pain right now - so 100 miles isn&apos;t in my plans - but it&apos;s a lot of fun to watch these videos.</p>]]></content:encoded></item><item><title><![CDATA[Some Recent Photos]]></title><description><![CDATA[<p>Last year I bought myself a small mirror-less camera, mostly for hiking. I&apos;ve been trying to work on my photography skills, and while most of what I take doesn&apos;t come out looking so good, I&apos;ve gotten a few I&apos;m proud of. Here</p>]]></description><link>https://kurtjlewis.com/some-recent-photos/</link><guid isPermaLink="false">637955851e263305a1e94272</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Fri, 25 Nov 2022 21:56:20 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2022/11/IMG_2298.JPG" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2022/11/IMG_2298.JPG" alt="Some Recent Photos"><p>Last year I bought myself a small mirror-less camera, mostly for hiking. I&apos;ve been trying to work on my photography skills, and while most of what I take doesn&apos;t come out looking so good, I&apos;ve gotten a few I&apos;m proud of. Here they are:</p><h2 id="rancho-san-antonio-preserve-2022-10-30">Rancho San Antonio Preserve 2022-10-30</h2><p>I purposefully bought a camera that I could take hiking, here&apos;s some photos from a <a href="https://www.strava.com/activities/8044302114">6 mile loop in Rancho San Antonio Preserve</a>. Towards the end I came around a corner upon a flock of Turkeys on a hill below the trail.</p><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-5.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1390" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-5.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-5.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-5.png 1390w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-6.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1390" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-6.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-6.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-6.png 1390w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-7.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="618" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-7.png 600w, https://kurtjlewis.com/content/images/2022/11/image-7.png 618w"></figure><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-8.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1390" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-8.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-8.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-8.png 1390w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-9.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1390" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-9.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-9.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-9.png 1390w" sizes="(min-width: 720px) 720px"></figure><h2 id="driving-the-coast-2022-11-12">Driving the Coast 2022-11-12</h2><p>Harvest, Swiss, and I took a drive up the coast from Santa Cruz to Pescadero on a quiet Saturday.</p><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-3.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1390" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-3.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-3.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-3.png 1390w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-1.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1391" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-1.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-1.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-1.png 1391w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-2.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1390" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-2.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-2.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-2.png 1390w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-4.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1390" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-4.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-4.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-4.png 1390w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1390" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image.png 1000w, https://kurtjlewis.com/content/images/2022/11/image.png 1390w" sizes="(min-width: 720px) 720px"></figure><h2 id="fighters-jets">Fighters Jets</h2><p>I live close-ish to a landing pattern for Moffet Field, and on very rare occasions I can catch some cool planes as they land.</p><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-10.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1391" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-10.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-10.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-10.png 1391w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-11.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1390" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-11.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-11.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-11.png 1390w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/11/image-12.png" class="kg-image" alt="Some Recent Photos" loading="lazy" width="1391" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/11/image-12.png 600w, https://kurtjlewis.com/content/images/size/w1000/2022/11/image-12.png 1000w, https://kurtjlewis.com/content/images/2022/11/image-12.png 1391w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Hiking Peters Creek Loop]]></title><description><![CDATA[<p>At the end of June, I went for a 12 mile hike in <a href="https://www.parks.ca.gov/?page_id=539">Portola Redwoods State Park</a>. Portola is one of my favorite parks in the bay area. It feels so remote even though Silicon Valley being just a few miles away. Driving to Portola is always an adventure. It</p>]]></description><link>https://kurtjlewis.com/hiking-peters-creek-loop/</link><guid isPermaLink="false">62f0919b1e263305a1e94216</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Mon, 08 Aug 2022 04:50:11 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2022/08/IMG_1626.JPG" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2022/08/IMG_1626.JPG" alt="Hiking Peters Creek Loop"><p>At the end of June, I went for a 12 mile hike in <a href="https://www.parks.ca.gov/?page_id=539">Portola Redwoods State Park</a>. Portola is one of my favorite parks in the bay area. It feels so remote even though Silicon Valley being just a few miles away. Driving to Portola is always an adventure. It takes around an hour to drive up Page Mill and back down into the valley that holds the park. But the descent into the park has always been a favorite of mine, it&apos;s fun to drive and has some great views.</p><p>Peters Creek Loop has been on my list of to-do hikes for a while now. Because it takes so long to get into the park, &#xA0;we wanted to do a hike that made the drive worth it. The trail that takes you to the loop is relatively boring close to the parking lot, but eventually culimnates in a ~1 mile loop through old growth redwoods alongside Peters Creek. The descent into the creek is steep, meaning the climb back out is miserable, especially because you&apos;re already 6 miles into the hike. The old trees around this section of Peters Creek are beautiful though - and I love the idea of seeing a remote area 0nly accessible to those dedicated enough to walk there.</p><p>It felt like every map of the trail I looked at had a different estimate for elevation. I think my Strava recording below felt accurate overall - there&apos;s definitely more elevation change on this trail than the official state park website claims.</p><figure class="kg-card kg-image-card"><img src="https://kurtjlewis.com/content/images/2022/08/image.png" class="kg-image" alt="Hiking Peters Creek Loop" loading="lazy" width="698" height="927" srcset="https://kurtjlewis.com/content/images/size/w600/2022/08/image.png 600w, https://kurtjlewis.com/content/images/2022/08/image.png 698w"></figure><p>I&apos;ve also been trying to get into capturing pictures and videos on my hikes. I try not to annoy my companions with stopping to set up shots, and I&apos;m still figuring out editing tools, but I took my camera along with me and put the results together into this video:</p><!--kg-card-begin: html--><iframe width="560" height="315" src="https://www.youtube.com/embed/U8I6DDmTJLk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><!--kg-card-end: html--><p>I look forward to trying to capture more of my hikes on camera, so hopefully there will be more videos to come. Harvest and I have been busy with a local move these past few weeks, but I hope to return to the trails soon.</p><!--kg-card-begin: html--><iframe height="405" width="590" frameborder="0" allowtransparency="true" scrolling="no" src="https://www.strava.com/activities/7341615392/embed/fd894b186d88979af9cee2ef80775d530c4d519f"></iframe><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[A Late November Blog Post]]></title><description><![CDATA[<p>It&apos;s almost the end of November, which also means 2020 is coming to a close. I told myself that I&apos;d write a blog post over my five day break from work, and here I am doing that. In May I&apos;d hoped that I&apos;</p>]]></description><link>https://kurtjlewis.com/a-late-november-blog-post/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5da</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Sat, 28 Nov 2020 18:45:10 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2020/11/PXL_20201125_200026046.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2020/11/PXL_20201125_200026046.jpg" alt="A Late November Blog Post"><p>It&apos;s almost the end of November, which also means 2020 is coming to a close. I told myself that I&apos;d write a blog post over my five day break from work, and here I am doing that. In May I&apos;d hoped that I&apos;d write more on my blog - though I have not. I&apos;d like to start writing smaller blog posts on focused topics with less concern for perfection. We&apos;ll see if it really happens.</p><figure class="kg-card kg-image-card"><img src="/content/images/2020/11/image-1.png" class="kg-image" alt="A Late November Blog Post" loading="lazy"></figure><h2 id="spending-the-holidays-in-california">Spending the Holidays in California</h2><p>Harvest and I spent a lot of late October and early November debating how we&apos;d handle the holidays. We&apos;d both like to go home, but it doesn&apos;t make sense with the number of COVID-19 cases, especially in Ohio, to do so. So, we&apos;ll be making the best of it in California, and looking forward to the first chance we get to go home when things are safer. Summer &apos;21?</p><h2 id="hiking">Hiking</h2><p>Starting in May or June, parks and open space preserves on the peninsula started to open again, which meant we could pick hiking back up. We&apos;ve since done a number of hikes, and a handful that would be better described as walks. One such walk was the Stanford Dish loop, a 3.something mile loop in the hills west of Stanford leading to the base of the Stanford Radio Telescope dish.</p><figure class="kg-card kg-image-card"><img src="/content/images/2020/11/image-2.png" class="kg-image" alt="A Late November Blog Post" loading="lazy"></figure><p>This summer I&apos;ve also done my longest hike yet, which was a ~10 mile loop in the Windy Hill Open Space Preserve, which may be one of my favorite preserves on the peninsula. I like hiking up hill, and Windy Hill is a nice climb - this route was a little over 1,800 ft in elevation gain. It offers some really nice views of the Bay as well.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2020/11/image-3.png" class="kg-image" alt="A Late November Blog Post" loading="lazy"><figcaption>Looking eastward from a trail south of Windy Hill</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2020/11/image-4.png" class="kg-image" alt="A Late November Blog Post" loading="lazy"><figcaption>View looking north-east from Windy Hill</figcaption></figure><p></p><p>I want to keep increasing the distance and difficulty of my hikes, though the long ones take a lot of time out of my weekends which already feel short enough.</p><h2 id="running">Running</h2><p>I&apos;m still running - and apparently with enough frequency that it became necessary to replace my running shoes! When I wake up in the mornings now the temperature can be in the high 30&apos;s, &#xA0;which makes it difficult to get out the door. I try to capitalize on the warmer mornings for my longer runs, and there are still mornings in the low 50&apos;s, at least for now.</p><p>I try to run three or four times a week, with varying success from week to week. In October there was a step tracking event at work that served as nice encouragement and a way to make up for the days I couldn&apos;t get outside in August and September from wildfire smoke. </p><figure class="kg-card kg-image-card"><img src="/content/images/2020/11/image-5.png" class="kg-image" alt="A Late November Blog Post" loading="lazy"></figure><p></p><h2 id="swiss">Swiss</h2><p>In May I wrote about the new four-legged addition to my life - Swiss. Over the past months we&apos;ve really gotten to know each other, he&apos;s grown from a very shy fellow to an opinionated and goofy friend. We&apos;ve worked on manners, sharing, and separation anxiety and he&apos;s made a lot of progress on all fronts. He really likes going for daily walks on the Bay Shore trail, and he and I have nightly disagreements over who gets to use my pillows in bed. </p><figure class="kg-card kg-image-card"><img src="/content/images/2020/11/image.png" class="kg-image" alt="A Late November Blog Post" loading="lazy"></figure>]]></content:encoded></item><item><title><![CDATA[Passing the Time at Home]]></title><description><![CDATA[<p>I began work from home on March 13th, followed shortly behind by Bay Area counties initiating shelter in place orders. For me, that means I&apos;ve been feeling the direct impact of Coronavirus for almost 60 days. I think I&apos;m overdue for a blog update, so I&</p>]]></description><link>https://kurtjlewis.com/life-during-covid-19/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5d9</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Sun, 10 May 2020 23:20:34 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2020/05/bayshore-trail.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2020/05/bayshore-trail.jpg" alt="Passing the Time at Home"><p>I began work from home on March 13th, followed shortly behind by Bay Area counties initiating shelter in place orders. For me, that means I&apos;ve been feeling the direct impact of Coronavirus for almost 60 days. I think I&apos;m overdue for a blog update, so I&apos;m going to write about how I&apos;ve been adapting and keeping busy during the past two months.</p><p>Who would have known at the start of March that we would be spending our last days in the office, or going on our last hikes. I struggle a lot with how I talk about the impact of Coronavirus. I know I speak from a place of great privilege, as someone who has not lost their livelihood, a loved one, or faced other major hardships. The changes to my life have been not been insignificant in terms of my daily routine, but I am thankful that their extent is only that far. My sympathies go out to those that are dealing with the loss of their job, or worse, a loved one.</p><h1 id="work">Work</h1><p>Work is probably the single thing I spend the most time on. I work from home at my desk most of the day, but I&apos;ve been switching things up a little and working from the patio or other rooms when I can. It&apos;s weird working from home, and I definitely don&apos;t like it as much as working in the office, but I&apos;m grateful that I have a great job and even better coworkers during these extraordinary times. </p><h1 id="swiss">Swiss</h1><p>I haven&apos;t written about it here yet, but Harvest and I picked up a new friend! His name is Swiss (short for Swiss Cheese, his shelter assigned name). When we first got him he was a very shy fellow, who did a lot of howling and kept his distance from everything that moved. Over the past few weeks he&apos;s grown into an affectionate interesting little guy. He follows Harvest around like a shadow, and we&apos;ve started preparing him for a life where we aren&apos;t at home 24/7. We really lucked out with our timing when we got him, we adopted him only three or four days before shelter in place orders were initiated. He&apos;s been a great addition to our home, and he&apos;s done a great job of making sure we&apos;re keeping a consistent routine and our mental health.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2020/05/image-1.png" class="kg-image" alt="Passing the Time at Home" loading="lazy"><figcaption>Swiss on the lawn</figcaption></figure><h1 id="sourdough">Sourdough</h1><p>I&apos;ve turned into one of those people that talked about my sourdough starter too much. Over the course of more than 15 days I got a sourdough starter consistently rising to the point that I could make my first loaf of sourdough with it! I followed<a href="https://twitter.com/boubou_101/status/1244757174112473092"> this tweet thread by Jonathan Guillotte-Blouin</a> from sourdough starter inception to my first loaf of bread.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2020/05/image.png" class="kg-image" alt="Passing the Time at Home" loading="lazy"><figcaption>My first loaf of sourdough</figcaption></figure><h1 id="running">Running</h1><p>I&apos;ve been running again, usually somewhere in the area of 10-15 miles a week. On weekdays I often do between 1.5-3 miles, while on weekends I try and break 3 miles on each run. I&apos;m a lot slower than I used to be, but it feels good to get out and run a little bit. I&apos;m hoping I can keep it up throughout the summer and build up a base that helps keep me more motivated through next year&apos;s winter. Maybe I&apos;ll even run a race this summer (if they come back).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2020/05/image-3.png" class="kg-image" alt="Passing the Time at Home" loading="lazy"><figcaption>My pace over a recent 5k. Work to do!</figcaption></figure><h1 id="video-games">Video Games</h1><p>I&apos;ve been playing video games in my spare time a lot, which probably doesn&apos;t help with a sense of never stepping away from my computer. The games I&apos;ve been playing most have been <a href="https://www.riskofrain.com/">Risk of Rain 2</a> and Red Dead Redemption 2. I&apos;ve put countless hours into Risk of Rain 2, especially playing with friends, and I highly recommend it to anyone looking for something to do.</p><h1 id="cooking">Cooking</h1><p>I&apos;ve been trying out some new recipies, especially those that involve my new dutch oven! I&apos;ve made a whole roast chicken in it, as well as a drunken chicken gumbo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2020/05/image-4.png" class="kg-image" alt="Passing the Time at Home" loading="lazy"><figcaption>Whole roast chicken on a bed of bread, onion, and squash.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2020/05/image-5.png" class="kg-image" alt="Passing the Time at Home" loading="lazy"><figcaption>Drunken Chicken Gumbo. A whole can of beer in this!</figcaption></figure><h1 id="blogging">Blogging?</h1><p>I&apos;ve been thinking that becoming more active on my blog might help me find something to do, help grow me as a writer, and make my blog a little more lively. Will I follow up on it? I&apos;m not sure I will, but I hope to!</p>]]></content:encoded></item><item><title><![CDATA[Adjusting to Life in California]]></title><description><![CDATA[<p>This summer, Harvest and I moved to the Bay Area so we could start our respective jobs. We&apos;ve been here for just about a month and a half now, and things are starting to feel like home.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="/content/images/2019/09/20190903_193349.jpg" class="kg-image" alt="Sunset over the bay" loading="lazy"><figcaption>Sunset over the bay</figcaption></figure><p>This summer as part of our move</p>]]></description><link>https://kurtjlewis.com/adjusting-to-life-in-california/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5d7</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Wed, 11 Sep 2019 03:46:49 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2019/09/20190721_101335-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2019/09/20190721_101335-1.jpg" alt="Adjusting to Life in California"><p>This summer, Harvest and I moved to the Bay Area so we could start our respective jobs. We&apos;ve been here for just about a month and a half now, and things are starting to feel like home.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="/content/images/2019/09/20190903_193349.jpg" class="kg-image" alt="Adjusting to Life in California" loading="lazy"><figcaption>Sunset over the bay</figcaption></figure><p>This summer as part of our move we drove across the country, stopping at 11 different national parks. We spent time in Utah, Wyoming, and South Dakota just to name a few. It was an amazing but exhausting 9 days, and I&apos;m so glad we chose to make the drive like we did. Now we&apos;re living in Redwood City, which is about half way down the peninsula. We&apos;ve got easy access to a trail called the bay shore trail, which I use regularly for jogs and evening walks. &#xA0;The above and below pictures were taken from that trail.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="/content/images/2019/09/20190830_064044.jpg" class="kg-image" alt="Adjusting to Life in California" loading="lazy"><figcaption>Sunrise over the bay</figcaption></figure><p>We both started work in August, and while I won&apos;t speak too much for Harvest, we both like our jobs a lot. I&apos;m working in an office in Sunnyvale, and I couldn&apos;t be happier with work. I&apos;m still getting ramped up with my team, but I&apos;m looking forward to working with them as I continue to gain experience. The worst part of my day is my commute; it&apos;s about an hour door to door, though most of it is completed on a company bus. I&apos;m working on making that time useful, but I have found I get motion sick. Something about the swaying of the bus, I think. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="/content/images/2019/09/20190726_152016.jpg" class="kg-image" alt="Adjusting to Life in California" loading="lazy"><figcaption>Taken on the Montara Mountain Trail</figcaption></figure><p>Harvest and I have been going on weekly hikes, which has done a lot help us explore the area and show us some of what California has to offer. The bay area is beautiful, and it&apos;s incredible how close to the suburban sprawl you&apos;ll find a great hiking trail. We&apos;ve got a couple of hikes we&apos;ve really liked so far, including one in Pacifica and a few just west of us like Pulgas Ridge. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="/content/images/2019/09/20190908_145700-1.jpg" class="kg-image" alt="Adjusting to Life in California" loading="lazy"><figcaption>The bay from Pulgas Ride Preserve</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[University of Cincinnati Graduation]]></title><description><![CDATA[<p>College is over, and that&apos;s weird. I&apos;ve spent the last 17 years in school, and now I&apos;m not in school anymore.</p><p>I&apos;ve had a fantastic senior year - filled with friends I&apos;m having a hard time saying goodbye to, a</p>]]></description><link>https://kurtjlewis.com/university-of-cincinnati-graduation/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5d5</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Mon, 06 May 2019 19:35:15 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2019/05/DSC_0613.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2019/05/DSC_0613.jpg" alt="University of Cincinnati Graduation"><p>College is over, and that&apos;s weird. I&apos;ve spent the last 17 years in school, and now I&apos;m not in school anymore.</p><p>I&apos;ve had a fantastic senior year - filled with friends I&apos;m having a hard time saying goodbye to, a few classes with <a href="https://github.com/kurtlewis/EECE5183Compiler">really fun projects to work on</a>, and the end of my involvement with great student organizations like <a href="https://revolutionuc.com">RevolutionUC</a> and <a href="https://ucceasambassadors.com">UC CEAS Ambassadors</a>. This year went by too fast - and when I stop to look back, so did the other four. College changed me in a lot of ways, and it&apos;s so weird to look back at who I was my first year in 2014, compared to who I am now. I was sitting on campus the other evening thinking about all the memories I have on this 2 square mile block of land, and it&apos;s hard to leave them all behind.</p><p>I wouldn&apos;t be where I am without the help of the people around me, and to them I am so greatful. My family, friends, and girlfriend have made all the difference for me, and kept me sane whether they know it or not.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="/content/images/2019/05/IMG_20190504_090915_119.jpg" class="kg-image" alt="University of Cincinnati Graduation" loading="lazy"><figcaption>My family + Harvest</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/05/IMG_20190504_090902_666.jpg" class="kg-image" alt="University of Cincinnati Graduation" loading="lazy"><figcaption>The &quot;Dank Memes&quot; team - it all started at our first Hackathon</figcaption></figure><p>I&apos;m going to miss the University, Cincinnati, and my time here. I&apos;m looking forward to the repping the bearcats in the future. For now, i&apos;m headed home to to relax this summer before <a href="https://kurtjlewis.com/after-graduation-at-google/">moving on to the next to the next big thing!</a> Oh, and one more thing... I couldn&apos;t be happier to say that Harvest and I have decided to move together - she&apos;s accepted a position in the bay area! <a href="https://thinkteachgrow.com/oh-ca/">I&apos;ll let her tell you about that.</a></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/05/IMG_20190505_175747_714.jpg" class="kg-image" alt="University of Cincinnati Graduation" loading="lazy"><figcaption>I lived here for two years!</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[RevolutionUC 8]]></title><description><![CDATA[<p>The start of March was the 8th RevolutionUC, and my last one as well. While I wasn&apos;t in charge this year, I&apos;ve written a blog post for every other year, so why not this one?</p><h2 id="my-role">My Role</h2><p>This year I was just an advisor for the</p>]]></description><link>https://kurtjlewis.com/revolutionuc-8/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5d4</guid><category><![CDATA[ACM]]></category><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Tue, 02 Apr 2019 15:10:31 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2019/04/revuc-full-team-19.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2019/04/revuc-full-team-19.jpg" alt="RevolutionUC 8"><p>The start of March was the 8th RevolutionUC, and my last one as well. While I wasn&apos;t in charge this year, I&apos;ve written a blog post for every other year, so why not this one?</p><h2 id="my-role">My Role</h2><p>This year I was just an advisor for the team. I attended meetings, gave advice, and pointed people to the resources they could use to solve their problems. I helped make sure some of the i&apos;s were dotted and t&apos;s were crossed, but I didn&apos;t really do much work, and definitely a fraction of the work I&apos;ve done in the past. This year the director was <a href="https://noahbass.com">Noah</a>, the new president of ACM. He and the leadership team &#xA0;did a great job and I&apos;m really happy with the direction the group is taking the event in. It was hard to step back and release control, but I&apos;d be lying if I didn&apos;t say I loved the decrease in stress, work, and meetings. I added less gray hairs this year than I did in a month last year!</p><h2 id="the-event">The Event</h2><p>This was the biggest RevolutionUC ever, at over 380 hackers! There were 66 projects submitted, which is a great submission rate. More than half of our hackers were first time hackathon hackers. The event ran smoothly (great work by the new leadership), judging went off without a hitch, and it was just as much fun as ever. The event is starting to get bigger than I think we realized it ever could! Every year the event becomes more polished and perfected and I don&apos;t have any reason to believe that will be stopping anytime soon.</p><h2 id="moving-on">Moving on</h2><p>I guess I don&apos;t have as much to say about this year&apos;s event, and I&apos;m writing this post many weeks later than I usually do. It&apos;s easy to feel confident in the future of the event after seeing what this year&apos;s leadership pulled off, and how promising the younger members of the team are. I&apos;m so thankful for the opportunities being involved with RevolutionUC has afforded me. I wouldn&apos;t be the person I am today, or in the place I am today, without the skills I learned and the friends I made from my invovlement with the event. To any potential readers who have the opportunity, I can&apos;t recommend getting involved enough. As for the team that&apos;s already involved, they can only go up from here! I wish them many more years of success and hacking!</p><h1 id="build-learn-grow-">Build. Learn. Grow.</h1><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="/content/images/2019/04/revuc-seniors-19.jpg" class="kg-image" alt="RevolutionUC 8" loading="lazy"><figcaption>The seniors of RevolutionUC.</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Building a Budget]]></title><description><![CDATA[<p>I&apos;m getting to that point in my life where I have to start pretending to be an adult, and part of that is budgeting my spending. I spent a few hours this past weekend writing a custom budgeting spreadsheet in Google Sheets, which was my first dive into</p>]]></description><link>https://kurtjlewis.com/building-a-budget/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5d3</guid><category><![CDATA[Code]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Tue, 26 Feb 2019 23:13:12 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2019/02/20190226_164652.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2019/02/20190226_164652.jpg" alt="Building a Budget"><p>I&apos;m getting to that point in my life where I have to start pretending to be an adult, and part of that is budgeting my spending. I spent a few hours this past weekend writing a custom budgeting spreadsheet in Google Sheets, which was my first dive into Google App Script.</p><p>I&apos;ve always loved managing my finances, and I&apos;m a data-oriented person, so tracking my expenses and categories is something I&apos;ve toyed with before. For a while I tracked my expenses with <a href="https://www.youneedabudget.com/">You Need a Budget</a> (which has a free student trial!), but a couple of annoyances stopped me from doing it for any long period of time. It took data straight from synced financial services, and showed things like transfers between synced institutions which was annoying to me. Showing transfer payments makes everything more confusing in my opinion, and it muddles your actual spending. Overall though, YNAB was nice, but I never kept up with it. I decided I wanted to build something custom, with the hope that the time investment of building it would keep me motivated in keeping it up to date.</p><p>When I sat down to build out a budget spreadsheet for myself, I knew I wanted it to be both minimal and flexible. I wanted to track my income, spending, and saving with amounts and categories for those values. I setup columns for four broad categories, &quot;Income&quot;, &quot;Need Spend&quot;, &quot;Want Spend&quot;, and &quot;Saving&quot;. &#xA0;For me, these are my four big types of money movement, and I&apos;m content using them as broad categories. Each group has a column for a quick description, a column for a category, and a column for amount. I made these individual columns each named ranges in Sheets. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/02/image.png" class="kg-image" alt="Building a Budget" loading="lazy"><figcaption>My four broad category columns</figcaption></figure><p>Inside each of my four categories, I have sub-categories, defined on another sheet &#xA0;called <code>Categories</code> and referenced through named ranges. By using custom drop downs defined through data-validation rules, I can ensure a consistent name is used for different categories, which makes the app script later a lot easier. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/02/image-1.png" class="kg-image" alt="Building a Budget" loading="lazy"><figcaption>Sub-categories</figcaption></figure><p>I built some simple <code>=SUM(...)</code> rules for summing up individual columns into cells representing their totals, and added some more formulas to calculate the percent each broad category was of the total spend or total income.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/02/image-2.png" class="kg-image" alt="Building a Budget" loading="lazy"><figcaption>Example of summation cells</figcaption></figure><h1 id="google-app-script">Google App Script</h1><p>The interesting part of this adventure was writing Google App Script to support summing subcategories and then presenting their summations and the percentages they represented for my monthly budget. This was my first real dive into Google App Script, and it was a pleasant experience. I&apos;ve written some rudimentary Microsoft Excel VBA before, and in many ways this experience emulated that one in a more familiar-feeling language. My script can be found at the bottom of this post in it&apos;s entirety, but I&apos;m going to walk through most of it piece by piece.</p><p>My <code>calculateCategories</code> function does some initial setup and defines the locations future data will go into, then uses helper functions to do much of the actual work. First I needed to get the spreadsheet objects, which is straightforward enough.</p><pre><code>  // get sheets
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var activeSheet = spreadsheet.getActiveSheet();</code></pre><p>I&apos;m a big best-practices guy, but I&apos;m sure I missed a few while I was writing this. For example, there&apos;s probably a real way of making sure the script only runs on specific sheets. I don&apos;t know what it is, so I used a cell-check to ensure the macro was enabled, and this way my categories or other sheets won&apos;t be overwritten by the macro.</p><pre><code>  // ensure the current sheet contains &quot;budget macro enabled&quot; in A2
  var val = activeSheet.getRange(&quot;A2&quot;).getValue();
  if (val != &quot;budget macro enabled&quot;) {
    // don&apos;t execute!
    return;
  }</code></pre><p>The last part of <code>calculateCategories</code> sets some variables up and then runs the helper functions. By using variables, I only have to change the code in one place if I reorganize the spreadsheet or rename things. Then I can iterate through the broad categories doing the real work with some helper functions.</p><pre><code>  // constants
  var startRow = 12;
  var totalIn = &quot;B4&quot;;
  var totalOut = &quot;D4&quot;;
  var types = [&quot;Income&quot;, &quot;Need&quot;, &quot;Want&quot;, &quot;Saving&quot;];
  var activeName = activeSheet.getName();
  
  // Iterate through types to build sums
  for (idx in types) {
    var map = buildMap(spreadsheet, activeName, types[idx]);
    startRow = writeData(activeSheet, startRow, map, types[idx], totalIn, totalOut);
  }</code></pre><p>My function <code>buildMap</code> iterates over a single broad category per call. It pulls the subcategories from the <code>Categories</code> sheet and initializes their sum to <code>0</code>. I use named ranges to minimize the impact of future column additions or deletions. </p><pre><code> var categories = spreadsheet.getRangeByName(&quot;Origin&quot; + strName + &quot;Categories&quot;).getValues();
  
  // initialize the map
  var map = {};
  // ensure map has a blank value
  map[&quot;&quot;] = 0;
  for (row in categories) {
    for (col in categories[row]) {
      Logger.log(categories[row][col]);
      map[categories[row][col]] = 0;
    }
  }</code></pre><p>The last part of <code>buildMap</code> then iterates through the entered categories and amounts on the active sheet and sums them into the map [object] structure I initialized. It again pulls from named ranges to know where categories and amounts are. Because the spreadsheet is duplicated, I identify named ranges with the active spreadsheet name prefixed to them.</p><pre><code>// build sums
  categories = spreadsheet.getRangeByName(activeName + &quot;!&quot; + strName + &quot;Categories&quot;).getValues();
  var amounts = spreadsheet.getRangeByName(activeName + &quot;!&quot; + strName + &quot;Amounts&quot;).getValues();
  for (row in categories) {
    for (col in categories[row]) {
      map[categories[row][col]] = map[categories[row][col]] + amounts[row][col];
    }
  }</code></pre><p>The <code>writeData</code> function does the actual insertion of the map values into the spreadsheet. Each call to this function only writes the data for a specific broad category. &#xA0;This is where I use a lot of the variables I setup earlier. The first part of the <code>writeData</code> function writes a header, which colors a separator for broad categories and denotes which category the below subcategories fall into.</p><pre><code>// write a header row
  var values = [
    [ strName, &quot;&quot;, &quot;&quot;, &quot;&quot;]
  ]
  var r = activeSheet.getRange(startRow, 1, 1, 4);
  r.setBackground(&quot;lightgray&quot;);
  r.setValues(values);
  startRow++;</code></pre><p> The last part of the <code>writeData</code> function iterates over the values in the map and does a handful of things. It writes the key in the map, which is the subcategory. It writes the total sum for that key, and then it set up a formula for the percent of total income and spend that sum represents. It&apos;s only appropriate to display the percentage of spend for the spend categories, so only those two categories have it. The code also sets formatting rules for the currency and percentage fields it writes.</p><pre><code>  // iterate through keys and write them
  for (key in map) {
    if (key != &quot;&quot;) { // if the key is blank don&apos;t output it
      // make sure the background is white
      activeSheet.getRange(startRow, 1, 1, 4).setBackground(&quot;white&quot;);
      
      // write the key
      activeSheet.getRange(startRow, 1, 1, 1).setValue(key);
      
      // actual sum
      r = activeSheet.getRange(startRow, 2, 1, 1);
      r.setValue(map[key]);
      r.setNumberFormat(&quot;$0.00&quot;)
      
      // write the formulas to calculate percents
      a1Sum = activeSheet.getRange(startRow, 2, 1, 1).getA1Notation();
      r = activeSheet.getRange(startRow, 3, 1, 1)
      r.setValue(&quot;=(&quot; + a1Sum + &quot; / &quot; + totalIn + &quot;)&quot;);
      r.setNumberFormat(&quot;0%&quot;); 
      
      // only do division by total spend if need or want
      if (strName == &quot;Need&quot; || strName == &quot;Want&quot;) {
        r = activeSheet.getRange(startRow, 4, 1, 1);
        r.setValue(&quot;=(&quot; + a1Sum + &quot; / &quot; + totalOut + &quot;)&quot;);
        r.setNumberFormat(&quot;0%&quot;);
      }
      startRow++;
    }</code></pre><p>Here&apos;s what the output looks like once it&apos;s been generated. This screenshot doesn&apos;t have any real values in it, so all percentages appear as <code>#DIV/0!</code>.</p><figure class="kg-card kg-image-card"><img src="/content/images/2019/02/image-3.png" class="kg-image" alt="Building a Budget" loading="lazy"></figure><p>The last step is setting up a trigger so that the script runs on every edit. I edited triggers via the Google Scripts menu and added a new one so that every edit of the spreadsheet triggers the app script to run.</p><figure class="kg-card kg-image-card"><img src="/content/images/2019/02/image-4.png" class="kg-image" alt="Building a Budget" loading="lazy"></figure><p>And that&apos;s it! I haven&apos;t uploaded the code to GitHub (do people do that with Google App Script?), so here it is in it&apos;s entirety, as I use it at time of writing this post. I don&apos;t currently intend to make a public version of the spreadsheet for sharing, but if you&apos;re interested in seeing it I can copy the template to a new spreadsheet and share it with you! <a href="/links">Reach out to me on twitter or via email!</a></p><pre><code>function calculateCategories() {
  Logger.log(&quot;Starting now.&quot;);
  // get sheet
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var activeSheet = spreadsheet.getActiveSheet();
  
  // ensure the current sheet contains &quot;budget macro enabled&quot; in A2
  var val = activeSheet.getRange(&quot;A2&quot;).getValue();
  if (val != &quot;budget macro enabled&quot;) {
    // don&apos;t execute!
    return;
  }
  
  // constants
  var startRow = 12;
  var totalIn = &quot;B4&quot;;
  var totalOut = &quot;D4&quot;;
  var types = [&quot;Income&quot;, &quot;Need&quot;, &quot;Want&quot;, &quot;Saving&quot;];
  var activeName = activeSheet.getName();
  
  // Iterate through types to build sums
  for (idx in types) {
    var map = buildMap(spreadsheet, activeName, types[idx]);
    startRow = writeData(activeSheet, startRow, map, types[idx], totalIn, totalOut);
  }
}

// builds the map of category to sum
function buildMap(spreadsheet, activeName, strName) {
  Logger.log(strName + &quot; starting now.&quot;);
  var categories = spreadsheet.getRangeByName(&quot;Origin&quot; + strName + &quot;Categories&quot;).getValues();
  
  // initialize the map
  var map = {};
  // ensure map has a blank value
  map[&quot;&quot;] = 0;
  for (row in categories) {
    for (col in categories[row]) {
      Logger.log(categories[row][col]);
      map[categories[row][col]] = 0;
    }
  }
  
  // build sums
  categories = spreadsheet.getRangeByName(activeName + &quot;!&quot; + strName + &quot;Categories&quot;).getValues();
  var amounts = spreadsheet.getRangeByName(activeName + &quot;!&quot; + strName + &quot;Amounts&quot;).getValues();
  for (row in categories) {
    for (col in categories[row]) {
      map[categories[row][col]] = map[categories[row][col]] + amounts[row][col];
    }
  }
  
  return map;
}

function writeData(activeSheet, startRow, map, strName, totalIn, totalOut) {
  // write a header row
  var values = [
    [ strName, &quot;&quot;, &quot;&quot;, &quot;&quot;]
  ]
  var r = activeSheet.getRange(startRow, 1, 1, 4);
  r.setBackground(&quot;lightgray&quot;);
  r.setValues(values);
  startRow++;
  
  // iterate through keys and write them
  for (key in map) {
    if (key != &quot;&quot;) { // if the key is blank don&apos;t output it
      // make sure the background is white
      activeSheet.getRange(startRow, 1, 1, 4).setBackground(&quot;white&quot;);
      
      // write the key
      activeSheet.getRange(startRow, 1, 1, 1).setValue(key);
      
      // actual sum
      r = activeSheet.getRange(startRow, 2, 1, 1);
      r.setValue(map[key]);
      r.setNumberFormat(&quot;$0.00&quot;)
      
      // write the formulas to calculate percents
      a1Sum = activeSheet.getRange(startRow, 2, 1, 1).getA1Notation();
      r = activeSheet.getRange(startRow, 3, 1, 1)
      r.setValue(&quot;=(&quot; + a1Sum + &quot; / &quot; + totalIn + &quot;)&quot;);
      r.setNumberFormat(&quot;0%&quot;); 
      
      // only do division by total spend if need or want
      if (strName == &quot;Need&quot; || strName == &quot;Want&quot;) {
        r = activeSheet.getRange(startRow, 4, 1, 1);
        r.setValue(&quot;=(&quot; + a1Sum + &quot; / &quot; + totalOut + &quot;)&quot;);
        r.setNumberFormat(&quot;0%&quot;);
      }
      startRow++;
    }
  }
  return startRow;   
}</code></pre>]]></content:encoded></item><item><title><![CDATA[Journaling on the Command Line]]></title><description><![CDATA[<p>I&apos;m not the first person to write a script for journaling from the command line, and I won&apos;t be the last. This is just a short blog post detailing the steps I took setting it up, and demonstrating how it works!</p><p>I got my inspiration from</p>]]></description><link>https://kurtjlewis.com/journaling-on-the-command-line/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5d2</guid><category><![CDATA[Code]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Tue, 22 Jan 2019 19:46:24 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2019/01/tea-garden-stones.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2019/01/tea-garden-stones.jpg" alt="Journaling on the Command Line"><p>I&apos;m not the first person to write a script for journaling from the command line, and I won&apos;t be the last. This is just a short blog post detailing the steps I took setting it up, and demonstrating how it works!</p><p>I got my inspiration from <a href="https://news.ycombinator.com/item?id=18873726">this comment on Hacker News</a>. I decided it&apos;d be a good way to get me into writing a couple of words a day. But, because I spend my time split across four different personal operating systems, I needed a way to sync them across each other - so I started looking for solutions. I know DropBox has a few command line utilities, but I use Google Drive much more than I use DropBox, so I decided ideally I&apos;d find a script-able GDrive tool I could use. I found <a href="https://github.com/odeke-em/drive">Drive</a> which can do everything I need it to!</p><p>The first step was setting up Drive, which requires <a href="https://golang.org/">Go</a><a>.</a> I configured Go following the instructions after <a href="https://golang.org/dl/">downloading</a> and setup my <code>GOPATH</code> and <code>PATH</code> environment variables. I installed drive with a simple command from it&apos;s <a href="https://github.com/odeke-em/drive#from-sources">documentation</a>:</p><pre><code>$ go get github.com/odeke-em/drive/cmd/drive</code></pre><p>(If you&apos;ve never used Go before, this takes a while and gives no output.)</p><p>The next step is configuring drive and logging in, which is pretty easy. Run these commands and follow the given prompts.</p><pre><code>$ mkdir ~/gdrive
$ drive init ~/gdrive</code></pre><p>The last step in my setup is adding a quick function to your <code>~/.bashrc</code> or other shell configuration dotfile. My script creates a folder for the year inside of the Journal directory, and then names each file in the format <code>mm-dd.txt</code>. It loads all files from GDrive before opening today&apos;s file, and then writes changes back to GDrive when the editor is closed. This is my configuration, appended to the end of my <code>~/.bashrc</code>:</p><pre><code># Define editor if undefined
EDITOR=vim
journal() {
  drive pull -no-prompt ~/gdrive/Journal
  mkdir -p ~/gdrive/Journal/`date +%Y`
  $EDITOR ~/gdrive/Journal/`date +%Y`/`date +%m-%d`.txt
  drive push -no-prompt ~/gdrive/Journal
}</code></pre><p>After a quick reload of your <code>~/.bashrc</code> file via <code>$ source ~/.bashrc</code>, you can now run the <code>journal</code> command to open a new text file inside a synced directory, named after today&apos;s date! Written entries are now accessible via Google Drive or on your filesystem. </p><figure class="kg-card kg-image-card"><img src="/content/images/2019/01/image.png" class="kg-image" alt="Journaling on the Command Line" loading="lazy"></figure>]]></content:encoded></item><item><title><![CDATA[Spring 2019: My Last Semester of College]]></title><description><![CDATA[<p>This week starts my last semester of college!</p><p>My time at UC is finally coming to it&apos;s end, and I&apos;m definitely sad about it. I&apos;m going to miss college - I love learning, hanging out with friends, and all the antics that go along</p>]]></description><link>https://kurtjlewis.com/spring-2019-my-last-semester-of-college/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5d1</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Mon, 14 Jan 2019 22:52:43 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2019/01/Cincinnati-Ohio-River.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2019/01/Cincinnati-Ohio-River.jpg" alt="Spring 2019: My Last Semester of College"><p>This week starts my last semester of college!</p><p>My time at UC is finally coming to it&apos;s end, and I&apos;m definitely sad about it. I&apos;m going to miss college - I love learning, hanging out with friends, and all the antics that go along with it. That said, I&apos;m definitely excited <a href="https://kurtjlewis.com/after-graduation-at-google/">about my post grad plans</a>, and that makes the closing of this chapter a little easier.</p><p>This semester I&apos;m taking 15 credit hours, including courses like Compiler Theory, Large Scale Software Engineering, Senior Design II, and Malware Analysis. I&apos;m also taking a non computer science course, which is a change in pace for me! I&apos;m taking Introduction to Macroeconomics. I had the professor for the course in my fall semester of freshman year and greatly enjoyed the course, plus I love coming full circle. This semester I also have Monday and Friday off every week!</p><p>In Senior Design, my team and I are building a distributed computing platform that runs in the browser. <a href="https://github.com/zacharysang/flock">We call it Flock</a>. I&apos;m doing a lot of infrastructure work with submitting jobs and etc. We&apos;re just now diving into implementation, so we&apos;ll see how it goes!</p><p>If you&apos;re in Cincinnati, read my blog, and want to catch up before I leave this summer, please don&apos;t hesitate to reach out!</p>]]></content:encoded></item><item><title><![CDATA[Visualizing Network Epidemic Models Using GraphStream]]></title><description><![CDATA[<p>This fall I took a course in Network Science and it&apos;s been one of my favorite courses during my time at the University of Cincinnati. I&apos;ve always liked graphs, and this course was all graph theory! One of the topics covered was different ways of describing</p>]]></description><link>https://kurtjlewis.com/visualizing-epidemic-models-using-graphstream/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5d0</guid><category><![CDATA[Code]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Tue, 08 Jan 2019 17:16:09 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2019/01/11.png" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2019/01/11.png" alt="Visualizing Network Epidemic Models Using GraphStream"><p>This fall I took a course in Network Science and it&apos;s been one of my favorite courses during my time at the University of Cincinnati. I&apos;ve always liked graphs, and this course was all graph theory! One of the topics covered was different ways of describing epidemics in networks and recently I discovered the graph visualization library, <a href="http://graphstream-project.org/">GraphStream</a>. I wanted to explore the library, and I liked the section on epidemic modeling, so I&apos;ve gone and combined the two! </p><p>This blog post has two primary parts: a main section where I&apos;ll describe the different epidemic models and show off visualizations of them in different networks, and a secondary section where I&apos;ll describe my thoughts on the library and the source code I used to generate the models.</p><h1 id="epidemic-models">Epidemic Models</h1><p>Epidemic models are mathematical models for describing the behavior of epidemics, specifically how they spread. My course covered compartmental epidemic models, and those are what I&apos;ve visualized below. Compartmental epidemic models separate populations into different categories depending on the model. These compartments describe shared characteristics of the populations within them, such as susceptible, infected, or recovered. </p><p>In these models, infection is spread at a given rate beta. Any infected node has a chance beta to spread its infection along each edge with a probability of beta. A beta of 1 means the infection will certainly spread, and a beta of 0 means it will not. In my visualizations, infected nodes take the color red, immune nodes are green, and susceptible nodes are black. Edges are represented as gray lines between nodes.</p><h2 id="si-model">SI Model</h2><p>The SI model stands for <strong>S</strong>usceptible <strong>I</strong>nfected. There are two compartments, one for susceptible nodes and one for infected nodes. Because the SI model is the simplest model I&apos;ll be discussing, it makes for a good chance to write about different types of networks. The simplest network, a random network is pretty boring - many nodes are unconnected, and when nodes are connected they form small components that an epidemic cannot escape.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/01/SI-random-150-25-0.3-1.gif" class="kg-image" alt="Visualizing Network Epidemic Models Using GraphStream" loading="lazy"><figcaption>Random Network; 150 Nodes; 0.3 Beta; 25 Iterations;</figcaption></figure><p>Random networks don&apos;t really represent real world networks like some of the later networks I&apos;ll discuss do. Another network that makes for a boring example is a fully connected network. In a fully connected network all nodes have edges to all other nodes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/01/SI-FullyConnected-50-5-0.3.gif" class="kg-image" alt="Visualizing Network Epidemic Models Using GraphStream" loading="lazy"><figcaption>Fully Connected Network; 50 Nodes; 0.3 Beta; 5 Iterations;</figcaption></figure><p>Epidemics in a fully connected network spread like wildfire. Every node has the chance to be infected by every infected node, meaning it only takes two iterations to infect all nodes in this sample network with a beta of 0.3. Not many real networks are fully connected. A small clique within a network might be fully connected, but rarely are entire networks fully connected. Regardless, epidemic modeling in fully connected networks is trivial and boring. A final network type that&apos;s boring is a grid network - grid networks are really just cool to look at but don&apos;t represent many real world networks.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/01/SI-Grid-5-20-0.3.gif" class="kg-image" alt="Visualizing Network Epidemic Models Using GraphStream" loading="lazy"><figcaption>Grid Network; 36 Nodes; 0.3 Beta; 20 Iterations;&#xA0;</figcaption></figure><p>Many real life networks are what is known as scale free. A scale free network is a network in which the degree distribution follows the power law. In a scale free network there are few nodes that have very large degrees, and many nodes that have small degrees. Think of real life networks, such as road networks, and you&apos;ll likely realize them to be scale free. Main roads in town connect to many roads, while roads in neighborhoods connect to those main roads and few others. Likewise social networks often connect through a few socialites, people who maintain a very large number of connections, whereas the average person has a relatively small number of connections. The rest of this blog post will feature scale free networks, as they tend to be the most interesting and realistic for visualizing epidemics. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/01/SI-BarabasiAlbert-100-25-0.3.gif" class="kg-image" alt="Visualizing Network Epidemic Models Using GraphStream" loading="lazy"><figcaption>Scale Free Network; 100 Nodes; 0.3 Beta; 25 Iterations;</figcaption></figure><p>In the above network, the epidemic spreads with a beta of 0.3. Once the epidemic reaches a high-degree node, the number of infected nodes explodes. The high degree nodes will continue to lead to interesting behavior in later visualizations. Here is another visualization of the SI model with a much larger value of beta - 0.5.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/01/SI-BarabasiAlbert-100-25-0.5-1.gif" class="kg-image" alt="Visualizing Network Epidemic Models Using GraphStream" loading="lazy"><figcaption>Scale Free Network; 100 Nodes; 0.5 Beta; 25 Iterations;</figcaption></figure><p>The epidemic now spreads much quicker but is still limited by the topology of the network - that is it must infect all nodes along the path to furthest leaves in order to infect the whole network.</p><h2 id="sis-model">SIS Model</h2><p>The SIS model adds another letter to the abbreviation but doesn&apos;t add another compartment. In the SIS Model nodes can now recover from the infection and return to the susceptible compartment. In these visualizations, infected nodes will change from red to black when they recover from the infection. The rate of recovery in the SIS model is determined by the parameter mu. Much like beta, mu is the probability that a given infected node recovers from its infection. The addition of this parameter creates some interesting behavior!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/01/SIS-BarabasiAlbert-100-25-0.5-0.25.gif" class="kg-image" alt="Visualizing Network Epidemic Models Using GraphStream" loading="lazy"><figcaption>Scale Free Network; 100 Nodes; 0.5 Beta; 0.25 Mu; 25 Iterations;</figcaption></figure><p>In the above network the beta is 0.5 and the mu is half of that, or 0.25. Much like in the SI network, once the epidemic reaches the high degree nodes, it explodes. But now, nodes recover at half the rate new nodes are infected, meaning the epidemic never accomplishes full infection. Of note is that the high degree node in the center is almost always infected - even if it does recover it is immediately reinfected by its neighbors. The SIS model introduces a new concept - persistence. If the recovery rate mu is too close or exceeds the infection rate beta, the epidemic will die out, like this example:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/01/SIS-BarabasiAlbert-100-25-0.5-0.4.gif" class="kg-image" alt="Visualizing Network Epidemic Models Using GraphStream" loading="lazy"><figcaption>Scale Free Network; 100 Nodes; 0.5 Beta; 0.4 Mu; 25 Iterations;</figcaption></figure><p>The equation that determines the survivability of an epidemic is known as the basic reproductive number R. </p><!--kg-card-begin: html--><center>R= (beta * average degree) / mu</center><!--kg-card-end: html--><p>If R is greater than 1, the epidemic will spread. If R is less than 1, the epidemic will die out. There&apos;s no point to visualizing a mu that exceeds the value of beta; the epidemic dies out without spreading. </p><h1 id="sir-model">SIR Model</h1><p>The SIR Model adds a new compartment: immune. In the SIR model nodes can also recover, but now recovered nodes are immune to the epidemic and can&apos;t be reinfected. The rate at which nodes recover is still governed by the parameter mu. Immune nodes are shown as green in the visualization, and because immune nodes can never be reinfected, mu now only needs to be a fraction of beta.</p><figure class="kg-card kg-image-card"><img src="/content/images/2019/01/SIR-BarabasiAlbert-100-25-0.5-0.05.gif" class="kg-image" alt="Visualizing Network Epidemic Models Using GraphStream" loading="lazy"></figure><p>The addition of immunity adds a new dynamic, especially in scale free networks. When high degree nodes become immune, entire sections of the network become protected from the epidemic, as shown in the top right of the above network.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="/content/images/2019/01/SIR-BarabasiAlbert-100-10-0.5-0.1.gif" class="kg-image" alt="Visualizing Network Epidemic Models Using GraphStream" loading="lazy"><figcaption>Scale Free Network; 100 Nodes; 0.5 Beta; 0.1 Mu; 10 Iterations;</figcaption></figure><p>In this network, because the high degree nodes quickly attain immunity, the epidemic is quickly contained. This visualization quickly demonstrates how effective vaccinating high degree nodes in a real life network can be. Increasing the value of mu further serves only to end epidemics more quickly. </p><h1 id="source-code-and-graphstream">Source Code and GraphStream</h1><p>I&apos;ve made the source code I used to generate these visualizations <a href="https://github.com/kurtlewis/network-epidemic-modeling">open source on my GitHub</a>. I won&apos;t pretend it&apos;s the cleanest code I&apos;ve ever written, because it isn&apos;t. I made some weird choices on architecture for such a small project, like using inheritance to manage the similarity of the different models.</p><p>The code to generate these visualizations actually isn&apos;t very complex! Calculating these models is as simple as calculating probabilities and switching set membership, with some additional code to handle recoloring in the graph. For instance, here&apos;s the code that infects new nodes on each step in the SI model:</p><pre><code>@Override
public void step() {
    Set&lt;Node&gt; toBeInfected = new HashSet();
    // iterate through already infected nodes and find new infections
    // add them to the set to be later marked as infected
    for (Node node : infected) {
        Iterator&lt;Node&gt; neighborsIter = node.getNeighborNodeIterator();
        while (neighborsIter.hasNext()) {
            Node neighbor = neighborsIter.next();
            if (this.rGen.nextDouble() &lt; this.beta) {
                toBeInfected.add(neighbor);
            }
        }
     }
     // iterate over nodes to be infected and switch them, then mark them
     for (Node node : toBeInfected) {
        // Switch the set membership
        susceptible.remove(node);
        infected.add(node);
        node.setAttribute(&quot;ui.class&quot;, &quot;infected&quot;);
     }
}</code></pre><p>When it comes to the GraphStream library, I initially loved it. It makes beautiful, easily configurable visualizations of networks, and it comes with generators for different types of graphs right in the box. It has some interesting paradigms for handling things like screenshots, and I struggled a lot with managing that code. Unfortunately the community around the library isn&apos;t very large, and the documentation seems to be incomplete. All the same, I recognize it&apos;s an open source library and it&apos;s fantastic for what it is. It&apos;s difficult to visualize large networks, probably regardless of the library used to do it, which unfortunately makes it unrealistic to use GraphStream for large data sets. But, for what I used it for, I liked it, and I look forward to using it again in the future!</p>]]></content:encoded></item><item><title><![CDATA[After Graduation at Google]]></title><description><![CDATA[<p>I&apos;ve spent the past many months looking for a job, and I&apos;m very excited to say that I&apos;ve accepted my first full time software engineering job! </p><p>After graduation I&apos;ll be moving to California to work for Google in Google Product Infrastructure! I&</p>]]></description><link>https://kurtjlewis.com/after-graduation-at-google/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5cf</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Fri, 16 Nov 2018 16:28:19 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2018/11/ca-grass-mountains.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2018/11/ca-grass-mountains.jpg" alt="After Graduation at Google"><p>I&apos;ve spent the past many months looking for a job, and I&apos;m very excited to say that I&apos;ve accepted my first full time software engineering job! </p><p>After graduation I&apos;ll be moving to California to work for Google in Google Product Infrastructure! I&apos;m very much looking forward to becoming a Googler! I&apos;ll be located in the bay area starting this summer. &#xA0;</p><p>I&apos;ve had a fantastic time at the University of Cincinnati, and met a multitude of lifelong friends along the way. I&apos;m not ready for college to end yet - but looking forward to work will make the last semester a little easier. Many thanks to my friends who have helped me prepare for interviews and supported me throughout college. Especially many thanks to my girlfriend Harvest for dealing with my stress.</p><p>I looked and there are no Raising Canes Chicken Fingers in the bay, but still, I think I&apos;ll be okay!</p>]]></content:encoded></item><item><title><![CDATA[A Second Year of One Second Everyday]]></title><description><![CDATA[<p>Two years ago, I began trying to record one second everyday. <a href="https://kurtjlewis.com/a-full-year-of-one-second-everyday/">Here&apos;s a link to last years!</a> Throughout the end of 2017 and the first three quarters of 2018, I&apos;ve again attempted to record a second everyday. I was less successful recording everyday, and a video</p>]]></description><link>https://kurtjlewis.com/a-second-year-of-one-second-everydays/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5ce</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Wed, 03 Oct 2018 01:53:34 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2018/10/Capture-thumbnail.PNG" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2018/10/Capture-thumbnail.PNG" alt="A Second Year of One Second Everyday"><p>Two years ago, I began trying to record one second everyday. <a href="https://kurtjlewis.com/a-full-year-of-one-second-everyday/">Here&apos;s a link to last years!</a> Throughout the end of 2017 and the first three quarters of 2018, I&apos;ve again attempted to record a second everyday. I was less successful recording everyday, and a video encoding error destroyed a few seconds, but here it is:</p><!--kg-card-begin: html--><iframe width="560" height="315" src="https://www.youtube.com/embed/L6d_wENZ1rM" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Fall Semester 2018]]></title><description><![CDATA[<p>As has become a pseudo tradition for myself - I&apos;m writing a blog post as I enter my next semester of class. Only two more semesters left!</p><p>This fall will be my last fall at UC, and I&apos;m very excited to make the most of my</p>]]></description><link>https://kurtjlewis.com/fall-semester-2018/</link><guid isPermaLink="false">60e3537cf2e74b3c211dd5cc</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Kurt Lewis]]></dc:creator><pubDate>Sat, 25 Aug 2018 20:07:13 GMT</pubDate><media:content url="https://kurtjlewis.com/content/images/2018/08/IMG_20180812_174721_842-3.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://kurtjlewis.com/content/images/2018/08/IMG_20180812_174721_842-3.jpg" alt="Fall Semester 2018"><p>As has become a pseudo tradition for myself - I&apos;m writing a blog post as I enter my next semester of class. Only two more semesters left!</p><p>This fall will be my last fall at UC, and I&apos;m very excited to make the most of my senior year - going to football games, enjoying time with friends, and soaking in my last bits of college. This fall I&apos;m taking 15 credit hours of computer science courses, including Network Theory, Formal Languages and Automata, Cloud Computing, Parallel Computing, and a senior design course. The courses I&apos;m most excited for are network theory, a graph theory course, and cloud computing. I&apos;ll be working on a year long senior design project as well. Hopefully I&apos;ll have an idea soon! I&apos;m sure my senior year is going to be full of memories and great experiences, and I already know it&apos;ll go by quicker than I want.</p><p>This summer I was a Digital Technology Intern for GE Digital. I had a great experience working at the GE Global Operations center in downtown Cincinnati, and I was exposed to a bunch of new technologies, as I continued to build experience with real world software engineering. Many thanks to my coworkers at GE, for being great and highlighting opportunities for personal growth this summer! I&apos;ll be continuing on part time with GE Digital throughout the fall. Looking back on my first internships it&apos;s cool to see how far I&apos;ve come as a software developer, and I look forward to my first full time software position following graduation. That said, I&apos;ll be doing a job search this fall, so if you see an opportunity you think I might be a good fit for, please don&apos;t hesitate to reach out to me!</p><p>In closing, here&apos;s a picture of my good friend, Chester.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="/content/images/2018/08/20180818_104514.jpg" class="kg-image" alt="Fall Semester 2018" loading="lazy"><figcaption>Chester is my family dog. He&apos;s a 9 year old Australian Shepherd.</figcaption></figure>]]></content:encoded></item></channel></rss>