<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Brad Leege</title>
    <description>Personal Web site of Brad Leege</description>
    <link>www.leege.io/</link>
    <atom:link href="www.leege.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sat, 23 Nov 2024 21:27:30 +0000</pubDate>
    <lastBuildDate>Sat, 23 Nov 2024 21:27:30 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>Mobile UW Retires After 14 Years</title>
        <description>&lt;!--excerpt.start--&gt;
&lt;p&gt;&lt;em&gt;I’m immensely proud of building something that helped people for such a long time.&lt;/em&gt;
&lt;!--excerpt.end--&gt;&lt;/p&gt;

&lt;p&gt;In a tech world that’s always hyping and promoting the “next big thing” it’s really cool when an opportunity to &lt;a href=&quot;https://it.wisc.edu/news/uw-madison-retires-wisconsin-mobile-app/&quot;&gt;celebrate something that has successfully served people for a significant period of time&lt;/a&gt;.  On a personal level it’s also gratifying to know that decisions you helped make, both &lt;a href=&quot;/2014/01/30/moving-to-a-reactive-data-server.html&quot;&gt;technical&lt;/a&gt; and &lt;a href=&quot;/2013/01/18/mobile-uw-15-released-last-night-we-released.html&quot;&gt;feature&lt;/a&gt;, were correct and proved valuable for the people who used the apps.&lt;/p&gt;

&lt;p&gt;Congratulations to the team at &lt;a href=&quot;https://www.wisc.edu&quot;&gt;UW-Madison&lt;/a&gt; and specifically John Krogman, Kathy Christoph, Hideko Mills, Nick Weaver, Dave Schroeder, and John Lucas for making Mobile UW (aka Wisconsin App) happen.&lt;/p&gt;
</description>
        <pubDate>Wed, 24 Jul 2024 00:00:00 +0000</pubDate>
        <link>www.leege.io/2024/07/24/mobile-uw-retired.html</link>
        <guid isPermaLink="true">www.leege.io/2024/07/24/mobile-uw-retired.html</guid>
        
        <category>Wisconsin</category>
        
        <category>Universty of Wisconsin</category>
        
        <category>Mobile UW</category>
        
        <category>iOS</category>
        
        <category>Android</category>
        
        
        <category>Wisconsin</category>
        
        <category>Universty of Wisconsin</category>
        
        <category>Mobile UW</category>
        
        <category>iOS</category>
        
        <category>Android</category>
        
      </item>
    
      <item>
        <title>U2 @ Sphere: Intersection of Liberal Arts &amp; Technology</title>
        <description>&lt;!--excerpt.start--&gt;
&lt;p&gt;&lt;em&gt;U2:UV Achtung Baby Live At Sphere is the ultimate expression of what’s possible at the Intersection of Liberal Arts &amp;amp; Technology.&lt;/em&gt;
&lt;!--excerpt.end--&gt;&lt;/p&gt;

&lt;p&gt;I was fortunate to to attend &lt;a href=&quot;https://www.thespherevegas.com/shows/u2&quot;&gt;U2:UV Achtung Baby Live At Sphere&lt;/a&gt; on December 1st and was overwhelmed by the experience.  The sheer scale of the audio and visual presentations left me physically disoriented for an hour or so after the show.  It truly was a one of a kind experience.&lt;/p&gt;

&lt;p&gt;Processing things the next day all I could think about was &lt;a href=&quot;https://hbr.org/2011/08/steve-jobss-ultimate-lesson-fo&quot;&gt;Steve Jobs’s famous quote&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Technology alone is not enough. It’s technology married with the liberal arts, married with the humanities, that yields the results that makes our hearts sing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s the alchemy of these two components, U2 and Sphere, that produces something so magical and greater than the sum of its parts.  On its own &lt;a href=&quot;https://www.thespherevegas.com&quot;&gt;Sphere&lt;/a&gt; is truly an engineering marvel, but ultimatley it’s just a $2 Billion large metallic dome.  To truly realize and surpass its potential it is dependent upon the creativity of artists.  This is where &lt;a href=&quot;https://www.u2.com&quot;&gt;U2&lt;/a&gt; and their production team deliver with aplomb.  Long regarded as the one of the best live bands in the world, even U2 had to push themselves past their creative limits to truly produce a show of this scale.&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;https://www.flickr.com/photos/129164231@N02/53380823562/&quot;&gt;
        &lt;img src=&quot;https://live.staticflickr.com/65535/53380823562_e57d1114dd_c.jpg&quot; alt=&quot;Sphere Excskeleton LED lights&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;&lt;i&gt;Sphere&apos;s exoskeleten that&apos;s made up of over 1.2 million LED lights. &amp;copy; 2023 Brad Leege&lt;/i&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;
    &lt;a href=&quot;https://www.flickr.com/photos/129164231@N02/53382058759/&quot;&gt;
        &lt;img src=&quot;https://live.staticflickr.com/65535/53382058759_6388597c85_c.jpg&quot; alt=&quot;U2 performing with Las Vegas skyline projected on Sphere&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;&lt;i&gt;U2 performing with Las Vegas skyline projected on Sphere. &amp;copy; 2023 Brad Leege&lt;/i&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Ultimately no amount of words, photos, nor videos (though &lt;a href=&quot;https://www.flickr.com/photos/129164231@N02/albums/72177720313208957&quot;&gt;I’ll try on my photo album&lt;/a&gt;) can truly convey what this particular show is all about… it has to be experienced live and in person.  Thankfully U2 &lt;a href=&quot;https://www.billboard.com/music/rock/u2-las-vegas-residency-sphere-tickets-1235328384/&quot;&gt;just extended their run until March 2, 2024&lt;/a&gt; and I highly recommend going if you can.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.livedesignonline.com/concerts/u2-sphere-las-vegas-alex-murphy-brings-lights&quot;&gt;“U2 At Sphere Las Vegas: Alex Murphy Brings Up The Lights”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=El-a0rbmAIA&quot;&gt;“Behind U2’s Residency at Sphere Las Vegas - Apple Music”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.npr.org/2023/10/24/1208060535/u2-las-vegas-residency-sphere&quot;&gt;“A band, a brand, a spectacle, a Sphere - NPR”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://esdevlin.com/work/the-sphere&quot;&gt;“Es Devlin’s Nevada Ark”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 07 Dec 2023 00:00:00 +0000</pubDate>
        <link>www.leege.io/2023/12/07/u2-sphere.html</link>
        <guid isPermaLink="true">www.leege.io/2023/12/07/u2-sphere.html</guid>
        
        <category>U2</category>
        
        <category>Sphere</category>
        
        <category>arts</category>
        
        <category>humanities</category>
        
        <category>technology</category>
        
        <category>Audio</category>
        
        <category>Video</category>
        
        <category>Las Vegas</category>
        
        <category>Steve Jobs</category>
        
        <category>product</category>
        
        
        <category>U2</category>
        
        <category>Sphere</category>
        
        <category>arts</category>
        
        <category>humanities</category>
        
        <category>technology</category>
        
        <category>Audio</category>
        
        <category>Video</category>
        
        <category>Las Vegas</category>
        
        <category>Steve Jobs</category>
        
        <category>product</category>
        
      </item>
    
      <item>
        <title>What We Built and Delivered In BrightDrop&apos;s 1st Year</title>
        <description>&lt;!--excerpt.start--&gt;
&lt;p&gt;&lt;em&gt;We turned a proof of concept business plan announced at CES 2021 into production hardware and software while building out a company in a single year.&lt;/em&gt;
&lt;!--excerpt.end--&gt;&lt;/p&gt;

&lt;p&gt;At CES 2022 this week &lt;a href=&quot;https://www.gobrightdrop.com/newsroom/brightdrop-announces-walmart-as-new-ev-customer-and-expands-collaboration-with-fedex-at-ces&quot;&gt;BrightDrop announced an expanded partnership with FedEx and new collaboration with Walmart to power their InHome delivery service&lt;/a&gt;.  This was made possible by our ability to assemble a team of hardware and software engineers, product managers, sales, and leadership all distributed across North America in Atlanta, Detroit, San Francisco, Toronto, and remote who were able to hit the ground running as a collective.  Together we turned &lt;a href=&quot;https://www.gobrightdrop.com/newsroom/gm-launches-brightdrop&quot;&gt;business plans first announced at CES 2021&lt;/a&gt; into real life hardware and software that proved our solutions to the market and more importantly to two major partners in FedEx and Walmart.&lt;/p&gt;

&lt;p&gt;My team was charged with building the software that our customers use to work with the EV delivery vechiles and e-Pallets.  I was one of the first mobile engineers hired in March 2021 and my focus was on designing the iOS application architecture that would easily scale to support:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Features for customers to work with their EVs and e-Pallets&lt;/li&gt;
  &lt;li&gt;Authentication and Authorization&lt;/li&gt;
  &lt;li&gt;Automated Testing&lt;/li&gt;
  &lt;li&gt;Localization&lt;/li&gt;
  &lt;li&gt;and whatever else we discovered along the way that was needed 😀&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture not only had to support these features, but more importantly had to be accessible and easy to work with for new team members that joined over the course of the year.  I’m very pleased with how this work enabled the iOS team to iterate and ship quickly and reliably this year.&lt;/p&gt;

&lt;p&gt;It’s been an amazing first year and I can’t wait to see what we can accomplish together this year!&lt;/p&gt;

&lt;p&gt;For more coverage:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cnbc.com/2022/01/05/walmart-and-fedex-sign-deals-for-thousands-of-gms-new-electric-vans.html&quot;&gt;CNBC: “Walmart and FedEx sign deals with GM for thousands of new BrightDrop electric vans”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.forbes.com/sites/alanohnsman/2022/01/05/gms-ev-push-yields-orders-for-thousands-of-electric-brightdrop-vans-from-walmart-fedex/?sh=21e62001b86f&quot;&gt;Forbes: “GM’s EV Push Yields Orders For Thousands Of Electric BrightDrop Vans From Walmart, FedEx”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://techcrunch.com/2022/01/05/gms-brightdrop-brings-on-walmart-as-new-ev-customer-fedex-ups-existing-order/&quot;&gt;Techcrunch: “GM’s BrightDrop brings on Walmart as new EV customer as FedEx ups existing order”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.theverge.com/2022/1/5/22867087/walmart-brightdrop-electric-delivery-van-gm-fedex&quot;&gt;The Verge: “Walmart and FedEx ordering thousands of electric delivery vans from GM’s BrightDrop”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Sun, 09 Jan 2022 00:00:00 +0000</pubDate>
        <link>www.leege.io/2022/01/09/ces-brightdtop.html</link>
        <guid isPermaLink="true">www.leege.io/2022/01/09/ces-brightdtop.html</guid>
        
        <category>BrightDrop</category>
        
        <category>CES</category>
        
        <category>delivery</category>
        
        <category>distributed</category>
        
        <category>EV</category>
        
        <category>EV600</category>
        
        <category>EV410</category>
        
        <category>FedEx</category>
        
        <category>GM</category>
        
        <category>iOS</category>
        
        <category>mobile</category>
        
        <category>lastmile</category>
        
        <category>logistics</category>
        
        <category>remote</category>
        
        <category>Walmart</category>
        
        
        <category>BrightDrop</category>
        
        <category>CES</category>
        
        <category>delivery</category>
        
        <category>distributed</category>
        
        <category>EV</category>
        
        <category>EV600</category>
        
        <category>EV410</category>
        
        <category>FedEx</category>
        
        <category>GM</category>
        
        <category>iOS</category>
        
        <category>mobile</category>
        
        <category>lastmile</category>
        
        <category>logistics</category>
        
        <category>remote</category>
        
        <category>Walmart</category>
        
      </item>
    
      <item>
        <title>End of an Era: Apple Discontinues iTunes U</title>
        <description>&lt;!--excerpt.start--&gt;
&lt;p&gt;&lt;em&gt;I’m incredibly proud to have been part of the team that created this product and it’s global impact on education.&lt;/em&gt;
&lt;!--excerpt.end--&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/us/app/itunes-u/id490217893&quot;&gt;iTunes U&lt;/a&gt; is a course management sytem designed to enable instructors to manage their courses and students to learn on-the-go via Apple’s market leading mobile device, the iPod.  Its original innovation was to support distribution of course documents, audio / visual materials, course lectures, and podcasting.  It is used around the world at such institutions as Stanford, Duke, UC Berkeley Harvard, Michigan, and Wisconsin.  After 14 years &lt;a href=&quot;https://support.apple.com/guide/itunesu/welcome/web&quot;&gt;Apple is now discontinuing iTunes U&lt;/a&gt; at the end of the year.&lt;/p&gt;

&lt;p&gt;iTunes U was developed in 2006-7 as a collaboration between Apple and four leading universities (Wisconsin, Missouri, Michigan, and Brown).  &lt;a href=&quot;https://www.linkedin.com/in/jancheetham/&quot;&gt;Jan Cheetham&lt;/a&gt; and I represented the &lt;a href=&quot;https://www.wisc.edu&quot;&gt;University of Wisconsin-Madison&lt;/a&gt; focusing on podcasting.  At the time, &lt;a href=&quot;https://www.wired.com/2005/03/curry/&quot;&gt;podcasting was an emerging technology&lt;/a&gt; and the iPhone hadn’t been released yet.&lt;/p&gt;

&lt;p&gt;Congratulations to &lt;a href=&quot;https://www.linkedin.com/in/jasonediger/&quot;&gt;Jason Ediger&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/ericbailey3/&quot;&gt;Eric Bailey&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/charlesdharcourt/&quot;&gt;Charles d’Harcourt&lt;/a&gt; and everyone on the team for developing such a long lasting and impactful product.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20211204/ipod-sillhouette-ad.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

</description>
        <pubDate>Sat, 04 Dec 2021 00:00:00 +0000</pubDate>
        <link>www.leege.io/2021/12/04/itunes-u-discontinued.html</link>
        <guid isPermaLink="true">www.leege.io/2021/12/04/itunes-u-discontinued.html</guid>
        
        <category>Apple</category>
        
        <category>education</category>
        
        <category>highered</category>
        
        <category>iPod</category>
        
        <category>iTunes</category>
        
        <category>iTunes U</category>
        
        <category>mobile</category>
        
        <category>product</category>
        
        <category>podcasts</category>
        
        <category>Wisconsin</category>
        
        
        <category>Apple</category>
        
        <category>education</category>
        
        <category>highered</category>
        
        <category>iPod</category>
        
        <category>iTunes</category>
        
        <category>iTunes U</category>
        
        <category>mobile</category>
        
        <category>product</category>
        
        <category>podcasts</category>
        
        <category>Wisconsin</category>
        
      </item>
    
      <item>
        <title>Proud To Be Part of the BrightDrop Team Making EV Delivery Happen</title>
        <description>&lt;p&gt;&lt;!--excerpt.start--&gt;
&lt;em&gt;BrightDrop Completes Record-Setting Build of its First Electric Light Commercial Vehicle; Unveils New Vehicle and Inks Deal with Verizon&lt;/em&gt;
 &lt;!--excerpt.end--&gt;&lt;/p&gt;

&lt;p&gt;I had the great priviledge to join &lt;a href=&quot;https://www.gobrightdrop.com&quot;&gt;BrightDrop&lt;/a&gt; this past April to work on electrifying the delivery and logistics sector.  Being part of the team that is bringing vehicles, tools, and services to the market that give commercial delivery and logistics vendors the ability to choose solutions that take diesel burning vehicles off the roads and reduce operating costs while doing so has been truly outstanding.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.gm.com/media/us/en/gm/news.detail.html/content/Pages/news/us/en/2021/sep/0928-brightdrop.html&quot;&gt;Today’s announcements&lt;/a&gt; of the GM record-setting time build out of BrightDrop’s first delivery vehicle, the EV600, and the new EV410 vehicle that Verizon will be using are just some of the amazing things we’re working on.&lt;/p&gt;
</description>
        <pubDate>Tue, 28 Sep 2021 00:00:00 +0000</pubDate>
        <link>www.leege.io/2021/09/28/brightdrop-first-ev.html</link>
        <guid isPermaLink="true">www.leege.io/2021/09/28/brightdrop-first-ev.html</guid>
        
        <category>BrightDrop</category>
        
        <category>GM</category>
        
        <category>EV</category>
        
        <category>EV600</category>
        
        <category>EV410</category>
        
        <category>Verizon</category>
        
        <category>delivery</category>
        
        <category>logistics</category>
        
        <category>environment</category>
        
        
        <category>BrightDrop</category>
        
        <category>GM</category>
        
        <category>EV</category>
        
        <category>EV600</category>
        
        <category>EV410</category>
        
        <category>Verizon</category>
        
        <category>delivery</category>
        
        <category>logistics</category>
        
        <category>environment</category>
        
      </item>
    
      <item>
        <title>FCFinder V2 - Football (Soccer), GraphQL, and SwiftUI Pandemic Adventures</title>
        <description>&lt;p&gt;&lt;!--excerpt.start--&gt;
&lt;em&gt;FCFinder V2 is an application for displaying the locations of football clubs by league and by year.&lt;/em&gt;
 &lt;!--excerpt.end--&gt;&lt;/p&gt;

&lt;h3 id=&quot;background&quot;&gt;Background&lt;/h3&gt;

&lt;p&gt;A combination of events earlier this year led me to my most recent personal side project, FC Finder V2.  Specificaly, I’d been wanting to explore &lt;a href=&quot;https://graphql.org&quot;&gt;GraphQL&lt;/a&gt; as well as start learning &lt;a href=&quot;https://developer.apple.com/documentation/swiftui/&quot;&gt;SwiftUI&lt;/a&gt;, especailly after Apple announced it’s second rev at WWDC in June.  My problem was that I couldn’t decide on a good way to do so until the timely combination of the COVID-19 pandemic and the &lt;a href=&quot;https://blog.mapbox.com/deprecating-studio-classic-styles-d8892ac38cb4&quot;&gt;deprecation of Mapbox Classic Map Styles&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The European and North American pandemic shutdowns in the spring resulted in the last 2 months of the traditional season of football leagues in Europe being put on hold until pandemic could be managed in each country (except for the USA 🤦‍♂️).  Seasons traditionally start in August and end in May so that meant in order to begin the new 2020-2021 season many leagues had to first complete their 2019-2020 seasons.  The result was that there was a glut of football being broadcast in the USA over the summer as different countries’ leagues returned to finish their seasons and I became curious to learn more about these leagues and their clubs, many of which I’d never watched before.&lt;/p&gt;

&lt;p&gt;I’d built a &lt;a href=&quot;/2012/12/08/this-is-my-latest-personal-project-called-fc.html&quot;&gt;Web application called FC Finder&lt;/a&gt; back in 2012 that mapped football leagues’ clubs and displayed the current favorite beers of the local supporters using the &lt;a href=&quot;https://untappd.com/api/docs&quot;&gt;Untappd API&lt;/a&gt;.  There were a couple of major problems with repurposing this Web app though, namely&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The hardcoded club rosters had become out of date due to &lt;a href=&quot;https://en.wikipedia.org/wiki/Promotion_and_relegation&quot;&gt;relegation&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;The map stopped displaying due to the End of Life of Mapbox Classic Map Styles.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From this FCFinder V2 was born.&lt;/p&gt;

&lt;h3 id=&quot;extensible-data-model-served-by-graphql&quot;&gt;Extensible Data Model Served By GraphQL&lt;/h3&gt;

&lt;p&gt;Extensibility was the primary feature for the new system.  While the original had leagues and their clubs hardcoded client side, the new system needed to be able to support different countries, different league tiers, and different seasons.  To solve this problem I created a data model containing Clubs, Leagues, and Countries that were tied together via a lookup table called ClubsToLeagues running in &lt;a href=&quot;https://www.postgresql.org&quot;&gt;PostgreSQL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I had never worked with GraphQL before so I was eager to find out for myself how it all operated and if it lived up to the hype.  I decided that I wanted to write the server application in &lt;a href=&quot;https://kotlinlang.org&quot;&gt;Kotlin&lt;/a&gt; and host it on &lt;a href=&quot;https://www.heroku.com&quot;&gt;Heroku&lt;/a&gt;.  I was really pleased to find and make use of &lt;a href=&quot;https://github.com/ExpediaGroup/graphql-kotlin&quot;&gt;Expedia’s GraphQL-Kotlin&lt;/a&gt; library for this project.  I found the library and examples to be exactly what I needed to not only wrap my head around how GraphQL worked but also how to then build out what I needed.  It integrated easily with the &lt;a href=&quot;http://sparkjava.com&quot;&gt;Spark Java Web framework&lt;/a&gt; and &lt;a href=&quot;https://github.com/JetBrains/Exposed&quot;&gt;JetBrain’s Exposed ORM&lt;/a&gt; to provide a clean multi-tiered architecture.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20201129/graphql-architecture.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One of my favorite learnings about GraphQL is that generates API schema when run.  This is immensely helpful for confirming what has been built while in active development.  It’s also incredibly helpful for clients that will make use of the API.  That said, I found that it’s &lt;em&gt;absolutely imperative&lt;/em&gt; to use the &lt;a href=&quot;https://github.com/graphql/graphql-playground&quot;&gt;GraphQL Playground&lt;/a&gt; app to work with it.&lt;/p&gt;

&lt;p&gt;Thanks to all of this open source software and community I was able to learn GraphQL and to build a functional GraphQL server that powers the client application.  To pay it forward I’ve also made my server code available on GitHub for others to see and hopefully learn from.  It’s available at:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bleege/FCFinderV2&quot;&gt;https://github.com/bleege/FCFinderV2&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;swiftui-client&quot;&gt;SwiftUI Client&lt;/h3&gt;

&lt;p&gt;On the surface SwiftUI’s opinionated design, namely a stateless declaritive UI that reflects a dynamic data model, makes a lot of sense.  In essence it’s a classic &lt;a href=&quot;https://en.wikipedia.org/wiki/Model–view–viewmodel&quot;&gt;MVVM design pattern&lt;/a&gt;.  In practice though I found it to be more of a lift to wrap my head around it than I originally anticipated.  Specifically, the interplay of the new annotations &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@ObservedObject&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Published&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@State&lt;/code&gt; and their bindings to the View’s objects.  The biggest issue was with the &lt;a href=&quot;https://developer.apple.com/documentation/swiftui/picker&quot;&gt;Picker&lt;/a&gt; and getting it to track selections.  I eventually was able to settle on a solution by specifying a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.tag()&lt;/code&gt; for the &lt;a href=&quot;https://developer.apple.com/documentation/swiftui/text&quot;&gt;Text&lt;/a&gt; in each Picker and binding it the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Published&lt;/code&gt; var in the ViewModel.  It makes sense now that it has been built but building it initially took more thought than I originally had expected.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;/images/20201129/selection-ux.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;Once I was able to nail down the data state binding issue I found the rest of the build out to be quite smooth.  The &lt;a href=&quot;https://developer.apple.com/documentation/combine&quot;&gt;Combine Framework&lt;/a&gt; is a very welcome shift in the Apple ecosystem to provide out of the box support for reactive applications.  I’m a big fan of &lt;a href=&quot;http://reactivex.io&quot;&gt;Rx&lt;/a&gt; so it’s nice to no longer have to bundle 3rd party libraries to build a reactive application.  Combine does a good job of providing a lot of the necessary glue that binds SwiftUI’s View and Model so this whole system works.  That said I did find that just like RxSwift really shines when paired with RxCocoa, Combine is very much missing that Widget wrapper layer.  Thankfully the &lt;a href=&quot;https://combine.community&quot;&gt;Combine Community&lt;/a&gt; is actively building out the &lt;a href=&quot;https://github.com/CombineCommunity/CombineCocoa&quot;&gt;CombineCocoa&lt;/a&gt; library to fill this gap.&lt;/p&gt;

&lt;p&gt;I’ve also made the source code for the client available on GitHub.  Please feel free to explore it at:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bleege/FCFinderV2App&quot;&gt;https://github.com/bleege/FCFinderV2App&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;thoughts&quot;&gt;Thoughts&lt;/h3&gt;

&lt;p&gt;I really enjoyed this project (not to mention definitely filled some of the time gap caused by the pandemic lockdown) and getting to wrap my head around both of these relatively new technologies.  I can see the merits of GraphQL, but like anything it’s not a one size fits all tool.  I think it’s major use case is going to be as an abstraction layer for existing data services.&lt;/p&gt;

&lt;p&gt;As for SwiftUI, I think it’s a major step in the right direction for Apple.  That said it still feels a bit under baked (see &lt;a href=&quot;https://developer.apple.com/documentation/mapkit/map&quot;&gt;MapKit’s Map&lt;/a&gt;).  It’s also held back by being an iOS 13+ technology (and iOS 14+ only in cases like MapKit).  Thankfully iOS 12 usage numbers should finally start to dry up in many mainstream apps which will allow SwiftUI and Combine to start being used more.  I think Combine is actually going to lead when it comes to adoption as it’s easier to refactor existing app plumbing.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;/images/20201129/london-club-map.png&quot; /&gt;
&lt;/p&gt;

&lt;h3 id=&quot;next-steps&quot;&gt;Next Steps&lt;/h3&gt;

&lt;p&gt;Next on the TODO list to keep adding countries, leagues, and seasons to the data model.  I really love seeing the clubs mapped out, especially Tier 1 vs Tier 2 in the same country, as I find it an interesting way to learn about likely rivalries (derbys) between clubs as well as get a feel for some of the socio-economic situations for different clubs and their supporters.&lt;/p&gt;

&lt;p&gt;I’m also considering adding macOS support to the client.  One of the promises of SwiftUI is that it’s relatively easy to be able to build apps that work well across all of Apple’s hardware and OS environments.  I’d like to get a feel for just how true that is.&lt;/p&gt;

</description>
        <pubDate>Sun, 29 Nov 2020 00:00:00 +0000</pubDate>
        <link>www.leege.io/2020/11/29/fcfinderv2.html</link>
        <guid isPermaLink="true">www.leege.io/2020/11/29/fcfinderv2.html</guid>
        
        <category>iOS</category>
        
        <category>GraphQL</category>
        
        <category>Heroku</category>
        
        <category>Kotlin</category>
        
        <category>SwiftUI</category>
        
        <category>Swift</category>
        
        <category>PostgreSQL</category>
        
        <category>Projects</category>
        
        
        <category>Projects</category>
        
        <category>SwiftUI</category>
        
        <category>GraphQL</category>
        
        <category>Kotlin</category>
        
        <category>iOS</category>
        
        <category>PostgreSQL</category>
        
      </item>
    
      <item>
        <title>UIKonf 2020 Goes Remote</title>
        <description>&lt;!--excerpt.start--&gt;
&lt;p&gt;The organizers of &lt;a href=&quot;https://uikonf.com&quot;&gt;UIKonf&lt;/a&gt; just announced that this year’s conference will be remote only due to COVID-19 pandemic.  I’m really glad that they did this to help in the fight against this disease while still allowing the conference to continue.  UIKonf has been my favorite tech conference due to it’s forward thinking and social nature and this year is shaping up to be no different.  The best part is now everyone can experience this for themselves for just € 100.
&lt;!--excerpt.end--&gt;&lt;/p&gt;

&lt;p&gt;Switching formats is not an easy nor inexpensive task, especially when it occurs a little over a month from dates of the conference (May 17 to May 19).  As such it’s very important to the iOS Community, and me personally, that we help the organizers out as best we can so that not only can UIKonf happen in 2020 but that it’s also able to survive for future years.  I’ve been lucky enough to get to know the organizers over the past few years personally and I can understand the pressure they’re under.&lt;/p&gt;

&lt;p&gt;Here’s some options for how you can help:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Buy a &lt;a href=&quot;https://ti.to/uikonf/uikonf-2020&quot;&gt;Remote Ticket&lt;/a&gt; for € 100&lt;/li&gt;
  &lt;li&gt;Make a &lt;a href=&quot;https://ti.to/uikonf/uikonf-2020/with/u-uwf4mk1cc&quot;&gt;Support Donation&lt;/a&gt; for € 100&lt;/li&gt;
  &lt;li&gt;If you’ve previously bought a Regular Ticket for € 559 tell the organizers that you’d like to donate the € 459 conversion to Remote Ticket rebate that they’re offering.  It’s what I’ve done already and would happily do again.&lt;/li&gt;
&lt;/ol&gt;

</description>
        <pubDate>Sat, 04 Apr 2020 00:00:00 +0000</pubDate>
        <link>www.leege.io/2020/04/04/uikonf-remote.html</link>
        <guid isPermaLink="true">www.leege.io/2020/04/04/uikonf-remote.html</guid>
        
        <category>apple</category>
        
        <category>berlin</category>
        
        <category>community</category>
        
        <category>conferences</category>
        
        <category>covid-19</category>
        
        <category>equality</category>
        
        <category>europe</category>
        
        <category>germany</category>
        
        <category>iphone</category>
        
        <category>ios</category>
        
        <category>livestream</category>
        
        <category>mobile</category>
        
        <category>pandemic</category>
        
        <category>people</category>
        
        <category>remote</category>
        
        <category>swift</category>
        
        <category>uikonf</category>
        
        <category>travel</category>
        
        
        <category>Conferences</category>
        
        <category>Community</category>
        
        <category>Berlin</category>
        
      </item>
    
      <item>
        <title>UIKonf 2019 Review</title>
        <description>&lt;!--excerpt.start--&gt;
&lt;p&gt;This was my second time attending &lt;a href=&quot;http://uikonf.com&quot;&gt;UIKonf&lt;/a&gt; in Berlin and it more than lived up to my fondest &lt;a href=&quot;/2018/05/24/uikonf.html&quot;&gt;memories from UIKonf 2018&lt;/a&gt;.  I was pleasantly surprised by to find the so many people that I’d met and interacted with the previous year were back again and that they all remembered me!  It was truly being back amongst friends… even after a year’s time and 4400 miles travelled.
&lt;!--excerpt.end--&gt;&lt;/p&gt;

&lt;p&gt;As UIKonf is well known for, the quality and range of topics again this year was no different.  Traditionally the conference organizers utilize an anonymous Call For Proposal process to select the talks, but this year decided to have an &lt;a href=&quot;http://uikonf.com/2019/01/29/all-female-speaker-lineup.html&quot;&gt;“all-female speaker line up on stage”&lt;/a&gt;.  While this caused some consternation when it was announced, by far the feedback that I heard while there and my own personal experience being there was very positive.  &lt;strong&gt;UIKonf was still UIKonf.&lt;/strong&gt;  I think this was a great experiment and more importantly sets the bar much higher for other tech conferences in having more women as featured speakers going forward.  There should be no more excuses.  For more details about the reasoning behind this check out &lt;a href=&quot;https://www.hackingwithswift.com/articles/174/uikonf-goes-all-female-for-2019-speakers&quot;&gt;Hacking with Swift’s interview with conference organizer Sabine Geithner&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’m already looking forward to attending again next year, but until then please enjoy a few of my favorite presentations from this year:&lt;/p&gt;

&lt;h4 id=&quot;shannon-hughes---detangling-gesture-recognizers&quot;&gt;Shannon Hughes - Detangling Gesture Recognizers&lt;/h4&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/yw1AVD_0_w8&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h4 id=&quot;julie-yaunches---consistency-principle&quot;&gt;Julie Yaunches - Consistency Principle&lt;/h4&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/3HoCsq6ijWY&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h4 id=&quot;sally-shepard---swift-to-hack-hardware&quot;&gt;Sally Shepard - Swift to Hack Hardware&lt;/h4&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/_LlNHWl7fqY&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h4 id=&quot;füsun-wehrmann---from-heroic-leaders-to-high-performing-teams&quot;&gt;Füsun Wehrmann - From Heroic Leaders To High Performing Teams&lt;/h4&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/2KsbaibzB04&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h4 id=&quot;ellen-shapiro---kotlinnative&quot;&gt;Ellen Shapiro - Kotlin/Native&lt;/h4&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/dMm6zyW2i9I&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h4 id=&quot;kate-castellano---what-to-expect-when-you-are-templating-clues-approach-to-backend-driven-uis&quot;&gt;Kate Castellano - What to expect when you are templating? Clue’s approach to Backend Driven UIs&lt;/h4&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/_Dom_Fn87C0&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;For more great talks please explore the full &lt;a href=&quot;https://www.youtube.com/playlist?list=PLdr22uU_wISr-FYeKblv3LMe_kHFzRFBw&quot;&gt;UIKonf 2019 Session Playlist&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Sun, 23 Jun 2019 00:00:00 +0000</pubDate>
        <link>www.leege.io/2019/06/23/unikonf.html</link>
        <guid isPermaLink="true">www.leege.io/2019/06/23/unikonf.html</guid>
        
        <category>apple</category>
        
        <category>berlin</category>
        
        <category>community</category>
        
        <category>conferences</category>
        
        <category>diversity</category>
        
        <category>equality</category>
        
        <category>europe</category>
        
        <category>germany</category>
        
        <category>iphone</category>
        
        <category>ios</category>
        
        <category>kotlin</category>
        
        <category>mobile</category>
        
        <category>people</category>
        
        <category>swift</category>
        
        <category>uikonf</category>
        
        <category>travel</category>
        
        
        <category>Conferences</category>
        
        <category>Community</category>
        
        <category>Berlin</category>
        
      </item>
    
      <item>
        <title>Beautiful night along the Spree in Berlin</title>
        <description>
</description>
        <pubDate>Fri, 31 May 2019 00:00:00 +0000</pubDate>
        <link>www.leege.io/2019/05/31/berlin-spree-photo.html</link>
        <guid isPermaLink="true">www.leege.io/2019/05/31/berlin-spree-photo.html</guid>
        
        <category>berlin</category>
        
        <category>europe</category>
        
        <category>germany</category>
        
        <category>photos</category>
        
        <category>spree</category>
        
        <category>travel</category>
        
        
        <category>Berlin</category>
        
        <category>Travel</category>
        
        <category>Photos</category>
        
      </item>
    
      <item>
        <title>DotSwift 2019 Review</title>
        <description>&lt;!--excerpt.start--&gt;
&lt;p&gt;I attended the &lt;a href=&quot;https://2019.dotswift.io/&quot;&gt;DotSwift conference&lt;/a&gt; in Paris, France the last week of January.  It’s an afternoon of a series of 18 minute talks and 5 “lightning talks” that last 4 minutes all on topics related to Swift software development.  This conference brings together people from across Europe and North America and emphasizes presence / social interaction.  In fact one of my favorite things about the conferece was it’s “No Wifi” policy.  This encouraged attendees and presenters to talk with each other during breaks as well as enable attendees to give their full attention to the presentations.&lt;br /&gt;
&lt;!--excerpt.end--&gt;&lt;/p&gt;

&lt;p&gt;Here are some of my favorite presentations from the conference:&lt;/p&gt;

&lt;h4 id=&quot;daniel-jalkut---just-enough-objective-c&quot;&gt;Daniel Jalkut - Just Enough Objective-C&lt;/h4&gt;

&lt;p&gt;Discusses how even “Pure Swift” apps live in a world of Objective-C code.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/eSxXmnmjYZk&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h4 id=&quot;mark-dalrymple---wht-is-tht&quot;&gt;Mark Dalrymple - Wh@t is th@t?&lt;/h4&gt;

&lt;p&gt;A deep dive into what annotations are, how they work, and most interestly how to find them in the iOS SDK.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/MPkMf7Pbp5c&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h4 id=&quot;janina-kutyn---catransform3d-you-dont-need-to-know-them&quot;&gt;Janina Kutyn - CATransform3D: You don’t need to know them&lt;/h4&gt;

&lt;p&gt;Fascinating technical details about the math that powers Apple’s Core Animation APIs.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/vZq09zB0sfU&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h4 id=&quot;soroush-khanlou---from-problem-to-solution&quot;&gt;Soroush Khanlou - From Problem to Solution&lt;/h4&gt;

&lt;p&gt;A guide on how simplied solutions reveal themselves via iteration and abstraction.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/3G_ffcgRLMw&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;To learn more about the conference make sure to checkout the conference &lt;a href=&quot;https://www.dotconferences.com/conference/dotswift-2019&quot;&gt;videos&lt;/a&gt; and &lt;a href=&quot;https://www.flickr.com/photos/97226415@N08/sets/72157676085258497/&quot;&gt;photos&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Sun, 03 Feb 2019 00:00:00 +0000</pubDate>
        <link>www.leege.io/2019/02/03/dotswift.html</link>
        <guid isPermaLink="true">www.leege.io/2019/02/03/dotswift.html</guid>
        
        <category>apple</category>
        
        <category>community</category>
        
        <category>conferences</category>
        
        <category>dotswift</category>
        
        <category>europe</category>
        
        <category>france</category>
        
        <category>iphone</category>
        
        <category>ios</category>
        
        <category>mobile</category>
        
        <category>paris</category>
        
        <category>people</category>
        
        <category>swift</category>
        
        <category>travel</category>
        
        
        <category>Conferences</category>
        
        <category>Community</category>
        
        <category>Paris</category>
        
      </item>
    
  </channel>
</rss>
