<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="https://onlyrss.org">
  
  <!-- Channel title, link, and description -->
  <channel>
    <atom:link href="https://onlyrss.org/feed.xml" rel="self" type="application/rss+xml" />  
    <title>OnlyRSS</title>
    <link>https://onlyrss.org</link>
    <description>
      OnlyRSS started out as an RSS feed—with no associated website (hence the domain name.) The articles only existed in the feed, and they could only be accessed via RSS readers such as Feedly and Inoreader.
      As I became increasingly interested in typography, I decided to be a little more traditional and actually make my articles visible on a website. At that point, OnlyRSS.org became my “learning tool” i.e. it was my reason to learn the fundamentals of HTML, CSS, and JavaScript.
    </description>

    <!-- Channel image for RSS aggregators -->
    <image>
      <url>https://onlyrss.org/pwaicons/windows11/LargeTile.scale-200.png</url>
      <title>OnlyRSS</title>
      <link>https://onlyrss.org</link>
    </image> 

    <!-- Blog articles -->

   <item>
      <guid isPermaLink="false">article37</guid>
      <title>What can you do with an AI browser?</title>
      <link>https://onlyrss.org/posts/ai-browser-examples.html</link>
      <pubDate>Sat, 11 Oct 2025 19:15:00 GMT</pubDate>
      <description>
        <![CDATA[

    <article>
      <header>
        <h1>What can you do with an AI browser?</h1>
          <p>
            I've been using an AI browser for a few days, so thought I'd share some examples of what you can do with it. I've tried to think of tasks that I often find myself doing when online, that I find tedious.
          </p>
      </header>

      <section>
        <h2>Background</h2>
        <p>
          It's easy to suffer from AI fatigue at the moment. We're bombarded with new product launches, endless webinars and presentations (some of which I'm responsible for, sorry), marketing spam, and let's not forget the LinkedIn posts telling you that "you are prompting wrong".
        </p>
        <p>
         Given the deluge of AI-related news, it's easy to miss some of the genuinely useful releases that have happened recently. I've already covered the <a href="nano-banana-examples.html">Nano Banana image editing model that's part of Google Gemini</a>—which is particularly useful for enhancing and colourising old photographs. But I've not yet covered an "AI browser". This is mostly because I had initially dismissed them as not being useful to me. Well, I recently installed the Comet browser, and I have to say, it's actually quite useful. 
        </p>
        <p>
          The <a href="https://www.perplexity.ai/comet" target="_blank">Comet browser</a> is a free (currently) AI-native web browser developed by <a href="https://www.perplexity.ai/" target="_blank">Perplexity</a>. Its key differentiator is that it has a built-in AI assistant that can help you with a wide range of tasks, from the mundane to the complex.
        </p>
        <p>
           Most importantly, <strong>it can perform actions on websites</strong> e.g. it can navigate UIs, fill in forms, wait for elements to load etc. If it fails or hits a dead end, it's "smart" enough to try again using a different approach.
        </p>
        <p>
          Below are some examples that I've had some success with in my limited usage.
        </p>
      </section>

      <section>
        <h2>Examples</h2>
        <h3>Look for alternative/competing products</h3>
        <p>
          While on a product page, ask the AI to find competing products.
        </p>
        <figure>
          <img src="https://onlyrss.org/images/ai-browser-product-alternatives.webp" width="1024" height="890" style="border-radius: 5px;" alt="Screenshot of a Garmin Forerunner 255 product page on a website, showing a blurred person in a video banner at the top, several feature icons and descriptions below the heading 'Run At A Higher Level,' and three Garmin Forerunner watches displayed at the bottom. On the right side, there is an AI assistant panel listing alternative running watches to the Forerunner 255, including Coros Pace 3, Garmin Forerunner 265, Polar Pacer Pro, and Suunto Race S/9 Peak Pro.">
          <figcaption>
              On the product page for the Garmin Forerunner 255 I asked for product alternatives, and got back a good list that includes some options I've considered in the past.
          </figcaption>
        </figure>
        
        <h3>Get a broader view of the news</h3>
        <p>
          Get a different perspective on the news. While reading a news story, ask the AI to find other sources.
        </p>
        <p>
          Of course, we should all be using <a href="https://ground.news/" target="_blank">Ground News</a> for this, but if you happen to be on a news site that's not Ground News, then this might be handy.
        </p>
        <figure>
          <img src="https://onlyrss.org/images/ai-browser-more-sources.webp" width="1024" height="890" style="border-radius: 5px;" alt="Screenshot of a BBC News article titled 'It's going to be really bad: Fears over AI bubble bursting grow in Silicon Valley' with a large aerial image of Silicon Valley, including the circular Apple headquarters. The article is written by Lily Jamali and discusses concerns about an artificial intelligence bubble. On the right side, an AI assistant panel provides a list of finance and stock market-focused news sources related to AI bubble risks, including Yahoo, The Telegraph, CNN, RTÉ, SVB Financial, and Investopedia.">
          <figcaption>
            As impartial as the BBC is, it's always good to get a different perspective on the news. In this example I asked for similar sources, but asked it to focus on sources that specifically covered finance.
          </figcaption>
        </figure>

        <h3>Easily extract data from websites</h3>
        <p>
          Extract data from a website that would otherwise be difficult or time consuming to get manually e.g. lists, links etc. and then output in your preferred format.
        </p>
        <figure>
          <img src="https://onlyrss.org/images/ai-browser-get-links.webp" width="1024" height="890" style="border-radius: 5px;" alt="Screenshot of the OnlyRSS About page featuring a photo of the author. Below the photo is a row of colorful social media icons, representing various social platforms. On the right side, an AI assistant panel displays a Markdown list of the social links shown on the page, including CodePen, BlueSky, Threads, Facebook, Twitter (X), LinkedIn, Instagram, GitHub, Strava, Goodreads, Concept 2 Log, Komoot, Mastodon, YouTube, and Zwift.">
          <figcaption>
            The only place I actually list all my links to social networks is on my blog, but the list is all wrapped up in HTML. Comet did a good job of exporting the list to Markdown.
          </figcaption>
        </figure>

        <h3>Help you get the best price</h3>
        <p>
          Get the AI to do the tedious stuff for you. For example, find the best price (per unit/weight/volume) while doing the weekly shop.
        </p>
        <p>
          I actually did this manually before I got access to Comet. And I <em>thought</em> I'd found the cheapest price per unit weight for a bag of fruit & nuts, but when I then tried this search with Comet the following week, it found a cheaper option. Whereas I had searched for "fruit and nuts", Comet had tried that, but it then also tried "raisins and nuts", and that's where the cheaper option was. Note to the people at Ocado, you need to add semantic search!
        </p>
        <figure>
          <img src="https://onlyrss.org/images/ai-browser-price-per-unit.webp" width="1024" height="890" style="border-radius: 5px;" alt="Screenshot of the Ocado website product page for 'Ocado Mixed Nuts & Raisins,' showing a 200g bag priced at £1.70 (£0.85 per 100g). The product details, price, and weight are clearly displayed, as well as additional information such as vegetarian and vegan attributes and user ratings. On the right, an AI assistant panel summarizes this item as the lowest cost per unit weight fruit and nut bag available on Ocado, with a detailed breakdown of composition and attributes">
          <figcaption>
            I thought I was good at finding the best deal, but it looks like AI is even better.
          </figcaption>
        </figure>

        <h3>Manage Docker containers 🤓</h3>
        <p>
          Ok, this one is a little niche, but I wanted to give the AI a slightly more complex task, and updating a Docker container seemed like a good test. I use Portainer on my NAS to manage my Docker containers, so I asked the AI to upgrade one of the running containers (SpeedTest) to the latest version.
        </p>
        <p>
          It performed the following steps:
        </p>

        <ol>
          <li>Stopped the existing SpeedTest container</li>
          <li>Pulled the latest SpeedTest image from the registry</li>
          <li>Recreated and started the container with the same settings (including ports) and ensured the config was preserved</li>
          <li>Verified the container was running and had upgraded to the latest version</li>
        </ol>

        <p>
          This is particularly impressive because it required the AI to navigate a complex web interface, understand Docker concepts, and execute multiple sequential operations without any errors.
        </p>

        <figure>
          <img src="https://onlyrss.org/images/ai-browser-manage-docker.webp" width="1024" height="849" style="border-radius: 5px;" alt="Screenshot of the Portainer.io dashboard showing details of the 'SpeedTest' Docker container. The interface lists container status information, including the container ID, name, internal IP address, and status as running. Administration options and actions like stopping, restarting, and removing the container are visible. On the right, an AI assistant panel summarizes the process for updating the SpeedTest container to the latest version, including steps for stopping, pulling the latest image, recreating with the same port mappings, and preserving volumes and settings. The update is confirmed as successful and fully operational">
          <figcaption>
            I wanted to give the AI a slightly more complex task, and updating a Docker container seemed like a good example.
          </figcaption>
        </figure>
      </section>

      <section>
        <h2>Conclusion</h2>
        <p>
          I've only been using Comet for a few days, but I'm already finding it useful. It's not perfect, and it can be a little slow at times, but it's already saved me time and effort on a few occasions.
        </p>
        <p>
           I'll be sticking with it over the next few weeks at least, and I'll be interested to see if I continue to use the AI features or end up using it like any other browser.
        </p>

      </section>

    </article>

        ]]>
      </description>
    </item>



        <!-- nano banana -->
    <item>
      <guid isPermaLink="false">article36</guid>
      <title>Photo editing using Gemini</title>
      <link>https://onlyrss.org/posts/nano-banana-examples.html</link>
      <pubDate>Sun, 05 Oct 2025 14:30:00 GMT</pubDate>
      <description>
        <![CDATA[

          <header>
            <h1>Photo editing using Gemini</h1>
            <p>
              Ten examples of photos edited using the new Nano Banana model from Google Gemini. The key takeaway? Each example just required uploading an image to the Gemini app and typing a single prompt—no tech skills needed.
            </p>
            <p>
            You're reading this in your RSS reader, which is great! But, in the version on the source site the images are clickable, which toggles between original and AI edited. If you want to see that, then go <a href="https://onlyrss.org/posts/nano-banana-examples.html">here</a>. Otherwise, the content is identical between the RSS version and original</p>
          </header>

          <article>
          <h2>Nano Banana</h2>
          <p>
            Nano Banana (officially Gemini 2.5 Flash Image) is an AI image generating and editing tool created by Google. It's the first AI image tool I've used that actually edits your original image, rather than creating a brand new one where key elements—like people's faces—are distorted beyond recognition.
          </p>
          <p>Android users can get Gemini from the <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.bard&pcampaignid=web_share" target="_blank">Play Store</a>. Apple users can get it from the <a href="https://apps.apple.com/us/app/google-gemini/id6477489729" target="_blank">App Store</a>.</p>

          <figure>
            <img src="https://onlyrss.org/images/nano-screenshot.webp" width="400" height="867" style="border-radius: 10px;" alt="A screenshot of the Gemini app on an Android device displays a dark interface with the greeting Hello Mark, and buttons for Create Image, Write, Build, and Deep Research. Near the bottom, a chat window shows a user prompt requesting to 'Add the King of England at our table having a drink'">
            <figcaption>
                Just add an image and a prompt, that's all you need to edit photos using the Nano Banana model in the Gemini app.
            </figcaption>
          </figure>
          

        <!-- Examples - section -->
        <section>
          <h2>Examples</h2>
          <p>
            Below are 10 examples using my own photos. My favourite use-case is enhancing and colourising old family photos. I used to do this with Adobe Photoshop, but it was a long and tedious process. With Gemini, it's just a few clicks and a single prompt.
          </p>

          <figure>
            <img src="https://onlyrss.org/images/nano-cwmbwrla-old.webp" width="800" height="1200" alt="A man crouching on a grassy field holding a young girl standing in front of him, with a backdrop of houses and hills in the distance.">
            <figcaption>Prompt: "Enhance and colourise."
              <p>The original photo was taken in 1949 in Cwmbwrla Park, Swansea, Wales. The large building seen in the back-left that looks like a prison, is in fact my old school (Manselton School). The exact spot this photo was taken is now the location of the new(ish) Burlais Primary School.</p>
            </figcaption>
          </figure>
          <figure>
            <img src="https://onlyrss.org/images/nano-cwmbwrla-new.webp"  width="800" height="1200" alt="In the AI version, the image is in colour and is much more detailed.">
            <figcaption>The result
            </figcaption>
          </figure>

          <p>You can take a photo of a model and place it in a new scene.</p>

          <figure>
            <img src="https://onlyrss.org/images/nano-viper-old.webp" width="800" height="600" alt="A detailed model of a white and red spaceship (colonial Viper Mark 2 from Battlestar Galactica) shown  on a stand indoors">
            <figcaption>
              Prompt: "Place this model in a real space scene, as if it's a real space fighter, make sure to show the engine thrust and a nebula in the background."
            </figcaption>
          </figure>
          <figure>
            <img src="https://onlyrss.org/images/nano-viper-new.webp" width="800" height="600" alt="In the AI version, the same ship appears in space with a nebula in the background.">
            <figcaption>
              The result
            </figcaption>
          </figure>

          <p>You can take a photo of a real person and turn it into a model!</p>

          <figure>
            <img src="https://onlyrss.org/images/nano-model-old.webp" width="800" height="1400" alt="A man wearing a blue t-shirt stands outdoors in front of a mountain landscape under a bright sky in the first image.">
            <figcaption>
              Prompt: "Create a 1/7 scale commercialized figurine of the characters in the picture, in a realistic style, in a real environment. The figurine is placed on a computer desk. The figurine has a round transparent acrylic base, with no text on the base. The content on a black computer monitor is a 3D modelling process of this figurine. Next to the computer monitor is a toy packaging box with a single two-dimensional flat illustration of the figurine on the front of the box and no words or logos."
            </figcaption>
          </figure>
          <figure>
            <img src="https://onlyrss.org/images/nano-model-new.webp" width="800" height="1400" alt="The man is depicted as a realistic figurine next to a illustrated box, with a computer screen showing his model in the background.">
            <figcaption>
              The result
            </figcaption>
          </figure>

          <p>You can enhance and colourise photos of U.S. Army Air Forces personnel who came to South Wales during WW2 and stole our women! (It's ok great uncle Pete, I think she was happy to be stolen).</p>
          
          <figure>
            <img src="https://onlyrss.org/images/nano-pete-old.webp" width="1000" height="1000" alt="A sepia-toned World War II-era photograph of a man in a military uniform with sergeant chevrons and ribbons, standing outdoors in front of a building.">
            <figcaption>
              Prompt: "Enhance and colourise."
            </figcaption>
          </figure>
          <figure>
            <img src="https://onlyrss.org/images/nano-pete-new.webp" width="1000" height="1000" alt=" The AI-restored version enhances the image in color, making the uniform, insignia, and man's features clearer and more vivid.">
            <figcaption>
              The result
            </figcaption>
          </figure>

          <p>You can take a photo of a real scene and turn it into an oil painting in the style of Van Gogh (other styles are available).</p>
          
          <figure>
            <img src="https://onlyrss.org/images/nano-gogh-old.webp" width="800" height="584" alt="A realistic photograph of a countryside scene with grassy field, a dirt road curving to the right, and a sun shining through a partly cloudy sky." >
            <figcaption>
              Prompt: "Turn this into an oil painting in the style of Vincent van Gogh."
            </figcaption>
          </figure>
          <figure>
            <img src="https://onlyrss.org/images/nano-gogh-new.webp" width="800" height="584" alt="The AI image is a vibrant impressionist painting of a rural landscape with a bright sun and dynamic swirling clouds in the sky, showing lush green fields and a dirt path on the right.">
            <figcaption>
              The result
            </figcaption>
          </figure>

          <p>You can have a drink with a friend… and a king!</p>

          <figure>
            <img src="https://onlyrss.org/images/nano-king-old.webp" width="800" height="450" alt="Two men smiling and sitting together at a table with glasses of beer in a relaxed indoor setting." >
            <figcaption>
              Prompt: "Add the King of England at our table having a drink."
            </figcaption>
          </figure>
          <figure>
            <img src="https://onlyrss.org/images/nano-king-new.webp" width="800" height="450" alt="In the AI image, a third man, resembling the King of England, has joined them at the table, and all three are smiling for the photo.">
            <figcaption>
              The result
            </figcaption>
          </figure>

          <p>You can remove elements of your past that you're not proud of.</p>

          <figure>
            <img src="https://onlyrss.org/images/nano-cross-old.webp" width="800" height="533" alt="Two young children sit on the bonnet of a car, both wearing blue jackets, they are holding crosses.">
            <figcaption>
              Prompt: "Remove the crosses in the kids' hands and replace with ice creams."
            </figcaption>
          </figure>
          <figure>
            <img src="https://onlyrss.org/images/nano-cross-new.webp" width="800" height="533" alt="In the AI image the crosses have been replaced with ice creams.">
            <figcaption>
              The result
            </figcaption>
          </figure>

          <p>The prompt used to create the scale model above isn't limited to people.</p>

          <figure>
            <img src="https://onlyrss.org/images/nano-bike-old.webp" width="800" height="600" alt="A vintage green motorcycle parked outdoors in front of a tiered stone wall and garden.">
            <figcaption>
              Prompt: "Create a 1/7 scale commercialized model of the motorbike in the picture, in a realistic style, in a real environment. The model is placed on a computer desk. The model has a rectangle wooden base, with no text on the base. The content on a black computer monitor is a 3D modelling process of this model. Next to the computer monitor is a toy packaging box with a single two-dimensional flat illustration of the motorbike on the front of the box and no words or logos."
            </figcaption>
          </figure>
          <figure>
            <img src="https://onlyrss.org/images/nano-bike-new.webp" width="800" height="600" alt="The AI image shows a highly detailed model version of the same motorcycle on a desk, with a box and computer screen displaying its digital design in the background.">
            <figcaption>
              The result
            </figcaption>
          </figure>

          <p>You can imagine famous artworks as real people (who may or may not look like Kate Winslet).</p>

          <figure>
            <img src="https://onlyrss.org/images/nano-statue-old.webp" width="800" height="1082" alt="A marble bust of a figure wearing ornate armor and an elaborate winged helmet, displayed on a wooden pedestal in a museum setting.">
            <figcaption>
              Prompt: "Imagine this statue as a real person"
            </figcaption>
          </figure>
          <figure>
            <img src="https://onlyrss.org/images/nano-statue-new.webp" width="800" height="1082" alt="In the AI-generated image, the statue appears as a lifelike person with realistic coloring and texture, closely matching the pose and details of the original sculpture.">
            <figcaption>
              The result
            </figcaption>
          </figure>

          <p>You can make yourself look far cooler (and more serious) than you actually are.</p>

          <figure>
            <img src="https://onlyrss.org/images/nano-mountain-old.webp" width="800" height="548" alt="Man with short gray hair and beard standing outdoors in a blue shirt, with a mountainous landscape in the background; default view is a clear, bright photograph.">
            <figcaption>
              Prompt: "Turn this image into a dark, moody, oil painting"
            </figcaption>
          </figure>
          <figure>
            <img src="https://onlyrss.org/images/nano-mountain-new.webp" width="800" height="548" alt=" In the AI version, it's now a dramatic, dark oil painting style of the same scene.">
            <figcaption>
              The result
            </figcaption>
          </figure>

        </section>

        </article>

        ]]>
      </description>
    </item>


    <!-- enshittification of UK supermarkets coding -->
    <item>
      <guid isPermaLink="false">article35</guid>
      <title>The enshittification of UK supermarkets</title>
      <link>https://onlyrss.org/posts/the-enshittification-of-UK-supermarkets.html</link>
      <pubDate>Sun, 27 Jul 2025 14:30:00 GMT</pubDate>
      <description>
        <![CDATA[

          <header>
            <h1>The enshittification of UK supermarkets</h1>
            <p>
              UK supermarkets have transformed simple shopping into a data-harvesting nightmare. What was once as easy as picking up an item and paying has become a multi-tiered pricing system requiring apps, weekly unlocks, and surrendering personal data just to access “normal” prices.
            </p>
          </header>

          <Article>
            <p>A rant about the <a href="https://www.merriam-webster.com/slang/enshittification" target="_blank" title="View the definition of enshittification">enshittification</a> of UK supermarkets. </p>
      
            <p>I remember the first time I visited the US when I was around 10 years old. I was in a shop, had my chosen product in hand, and approached the counter with the exact change ready. But, of course, I didn't actually have the exact change ready, because the price shown wasn't the actual price as it didn't include sales tax, and I remember thinking that this made absolutely no sense—mostly because it <em>makes absolutely no sense!</em>.</p>

            <p>Skip forward 40 years, and now in the UK, across all major supermarkets we have the “standard” (or as I like to call it “artificially inflated” price), and the “member” price. i.e. what would more realistically be considered the “normal” price, but now you have to hand over your personal details and fuss about with a card/phone every time you want to buy something.</p>

            <p>At Sainsbury's it's got worse. The member price is called the “Nectar Price”, and now they have introduced a 3<sup>rd</sup> tier, called “Your Nectar Prices”. Did you notice what they did there? It's different because it starts with “Your…”, which is part of the marketing name for this “feature”. I'm sure this won't confuse anyone, although according to this <a href="https://www.reddit.com/r/britishproblems/comments/1m1dqym/having_to_unlock_your_nectar_prices_every_week_to/" target="_blank" title="View this thread on Reddit which shows that people are already confused by this">thread on Reddit</a>, it is clearly confusing everyone.</p>
            
            <p>“Your Nectar Prices” are personalised prices. And to get these personalised prices, you have to open the Nectar app each week and hit an “unlock” button. This is very important, because without this no one would ever open the Nectar app and see the ads (sorry, “partner offers”), and the people who thought that this UX Hellscape was a good idea would never hit their Success Metrics. I can just see them celebrating now, probably a 10,000% increase in engagement with the Nectar app 🥳🥳🥳… 🤮. Although, unlike publicity, there <em>is</em> such a thing as bad engagement.</p>

            <p>It's all a bit confusing, so I've lifted the following extract from the <a href="https://www.nectar.com/about/privacy-and-legal/nectar-prices" target="_blank">Sainsbury's website</a>.</p>

            <ul>
              <li>
                <strong>Nectar Prices</strong>
                <ul style="margin-top: 0;">
                <li>Nectar Prices are discounted prices available to Nectar members on selected products from time to time.</li>
                <li>Nectar Prices are available when you shop instore in supermarkets via any checkouts or when using SmartShop (SmartShop App or handset) or online at www.sainsburys.co.uk or using the Sainsbury’s App.</li>
                </ul>
              </li>
            </ul>

            <ul>
              <li>
                <strong>Your Nectar Prices</strong>
                <ul style="margin-top: 0;">
                <li>Your Nectar Prices are up to 10 personalised price offers made each week, on things you love or things we think you’ll love based on your shopping history.</li>
                <li>Each week before you shop, unlock your available Your Nectar Price offers (see below).  New Your Nectar Price offers will land each week on a Friday.  If you do not unlock your offers before you scan the item, you will not receive the discount.</li>
                </ul>
              </li>
            </ul>

            <p>So, in summary, to pay “normal” prices now in Sainsbury's, you have to register, install an app, open the app each week, and hit a button. In the past all you had to do was pick up an item and go to the counter!</p>

            <p>I recently noticed that my local Co-op was also inflating their “normal” prices, sorry… I mean “offering discounts to members”, so I signed up to the app. A week later they were hacked and lost the names and addresses of all 6.5 million of its members.</p>

            <p>Also, GDPR states that you should only hold PII if you need it to run your business (not sure why, maybe to reduce the exposure when you get hacked?)—maybe I'm being stupid, but you don't need to know my name or where I live to sell me a sandwich!</p>

            <p>And as annoying as these pain points are, there's a far more serious side to this particular enshittification. Who is least likely to jump through all these hoops? The elderly, the poor, and the vulnerable. Those who don't have Smartphones, or who don't have the technical knowledge. These are the people who will be paying well above what's fair for food.</p>

            <p>My message to UK supermarkets is simple, focus on making money from the margins on selling goods. Invest your profits back into more efficient supply chains, etc., not on making apps your customers shouldn't need and don't want.</p>

            <p>As an aside, I have an extra message for Sainsbury's. Beef Mince is NOT beef that has previously been minced and is now compacted so tightly <a href="https://www.bbc.co.uk/news/business-65124883" target="_blank" title="View the BBC article on this issue"> that it has a measurable gravitational field</a>. It's beef that has been minced and is STILL minced.</p>
          </Article>
        ]]>
      </description>
    </item>


        <!-- vibe coding -->
    <item>
      <guid isPermaLink="false">article34</guid>
      <title>AI-assisted coding is the electric-assisted cycling of software development</title>
      <link>https://onlyrss.org/posts/vibe-coding.html</link>
      <pubDate>Fri, 11 Apr 2025 09:30:00 GMT</pubDate>
      <description>
        <![CDATA[
          <header>
            <h1>AI-assisted coding is the electric-assisted cycling of software development</h1>
            <p>
              My premise here is that electric bikes don't just make cycling easier for existing cyclists—for many people they make cycling possible. I see many parallels with AI-assisted software development i.e., for existing software developers AI-assisted coding makes their job easier, for people who can't code, it makes software development <em>possible</em>. And I see both (electric bikes and AI coding) as good things.
            </p>
          </header>

          <article>

            <section>
              <h2>Why I'm defending vibe coding (and electric-assisted cycling)?</h2>
              <p>Creating software using an AI-coding assistant, relying <em>fully</em> on the AI and without ever writing the code yourself is termed “<a href="https://en.wikipedia.org/wiki/Vibe_coding" target="_blank" title="Read about vibe coding on Wikipedia">vibe coding</a>”.</p>
              <p>I see a lot of comments and memes online related to vibe coding, typically pointing out that vibe coding can only get you so far (before even the AI can't maintain/update what it's created), or it's simply “bad” as the developer does not understand the code that's been created. And these things are true, yet they are only relevant if you're a professional software developer.</p>
              <p>If you're not a professional software developer, and you just want to create an app for yourself that accesses a weather API and determines the best period to go cycling during the day, or a circuit training app that selects 10 exercises at random for you to do each day based on the equipment you have access to, then the fact that you don't understand the code that has been created by the AI is utterly irrelevant.</p>
              <p> Is the generated code well commented, efficient, scalable, and does it embrace best practice? The answer to all these is simple: it… does… not… f**king… matter. There's only one thing that matters—does it solve the problem?</p>
          </section>

          <section>
              <h2>For many people, AI coding (like electric-assisted cycling) is the only option</h2>
              <p>I see more people cycling now than I did even just a few years ago. That's not exactly true (or at least it's hard to prove, I've not actually been counting), I guess what I mean is that I see a much broader variety of people cycling now than I used to.</p>
              <p>I live in the UK, where cycling typically means a middle-aged guy, with enough disposable income to drop £3-5k on a bike (or bikes! all purchased via the Cycle to Work scheme, that are never going to be used to cycle to work, and weighs less than the roast dinner he ate the previous day), dressed in Lycra, and looking like he's training for the Tour de France, or at least like he's in an urgent rush to get somewhere. We know these people as Middle-Aged Men In Lycra (<a href="https://en.wikipedia.org/wiki/Mamil" target="_blank" title="Read about MAMIL on Wikipedia">MAMILs</a>).</p>
              <p>More recently, while out on my bike, I've seen older people (yes, people, not just men!) wearing normal clothes—as if they don't care about the loss of efficiency due to their baggy t-shirts and flappy shorts. Not only that, but they're also sitting up straight on their bikes, and looking around at their environment, some of these fools are even smiling and chatting to each other (wasting oxygen that could be better used to help propel them forward), it's madness I tell you, madness!</p>
              <p>Anyway, my point is that these new cyclists are typically on electric bikes. And if it's the electric bike that has <s>encouraged</s> enabled them to get outside for a few hours to explore their environment on a sunny Sunday afternoon, as opposed to sitting in front of the telly watching Cash in the Attic (other old-people shows are available) then I'm all for it.</p>
          </section>

          <section>
              <h2><q>Vibe coders should just learn to code</q></h2>
              <p>Damn right! And you should sell your car and walk everywhere, and I should learn how to spell “<s>seperately</s>” “<s>sepratley</s>” “separately”, and addicts should just stop taking drugs, and Trump should stop lying like the sack of sh… I digress.</p>
              <p>The simple fact is that many people can't code. It might be an issue with not having time to learn, or that the return-on-investment on learning is not worth it i.e., maybe they only wanted to create that one bike-ride weather app, or circuit training app. Is that worth a month-long Python course? (And anyway, shouldn't Python developers learn real languages like assembly and machine code?)</p>
              <p>Accept it or not, but for many people, coding (like spelling for me) is just not something they will ever get, it doesn't matter how much they try and learn it.</p>
              <p>And anyway, why should they learn to code? Coding is a means to an end isn't it? Isn't the aim to create working software?</p>
              <p>I've heard similar comments about electric-assisted cycling e.g., “it's cheating, they should just use a real bike”. And it's true, if they were hoping to use their electric bike during the Tour de France, it would indeed be classed as cheating, but I suspect this is not the aim in most cases. And a “real” bike? What does that even mean, do real bikes have suspension and gears? Is using a bike computer like a Garmin or Wahoo cheating?</p>
          </section>

          <section>
              <h2>Conclusion</h2>
              <p>
                In conclusion, if you have a problem, if no one else can help, <s>and if you can find them… maybe you can hire The A-Team</s> then give vibe coding a try. It's not bad, or wrong, or cheating, and there's no need to take a shower afterwards.
              </p>
              <p>
                And if all goes well, you might create something that has never before existed, and I reckon that's probably a good thing… unless of course you created <a href="https://en.wikipedia.org/wiki/Truth_Social" target="_blank" title="Read about TruthSocial on Wikipedia">Truth Social</a>, in which case… you can just f**k off.
              </p>

              <figure>
                <img src="https://onlyrss.org/images/vibe-coding.webp" alt="A sketch of an old-man cycling on an electric bike while also using a laptop" width="695" height="695" loading="lazy">
                <figcaption>Warning: Vibe-coding and cycling are mutually exclusive activities.</figcaption>
              </figure>
              
          </section>

          </article>

                ]]>
      </description>
    </item>

        <!-- Same News, different views -->
    <item>
      <guid isPermaLink="false">article33</guid>
      <title>Same news, different views: The BBC's design at home and abroad</title>
      <link>https://onlyrss.org/posts/same-news-different-views.html</link>
      <pubDate>Sun, 06 Apr 2025 17:30:00 GMT</pubDate>
      <description>
        <![CDATA[
          <header>
            <h1>Same news, different views: The BBC's design at home and abroad</h1>
            <p>
              Around a year ago I noticed that the BBC news site had updated their article format—and I really liked the new look. But, I then realised that I had my VPN on and was actually seeing the site as viewed from the US! Have our American cousins evolved so much during our split 400 years ago that they now have a better appreciation of typography and design?
            </p>
          </header>

          <article>

              <section>
              <h2>Introduction</h2>
              <p>
                It's perfectly normal for news websites to have different layouts and styles. Image and paragraph width, choice of typeface (Serif vs Sans-Serif), use of colours, horizontal page-alignment, position of the byline, location of the search field etc. All these features differ between news publishers, but, they are typically consistent <em>within</em> a single publisher.
              </p>
              <p>
                Apart from consistency providing the reader with a more user-friendly experience, it also helps to build brand recognition, and, maybe even more importantly (at least from a cost point-of-view), it's simpler to design, build, and support one solution than it is two, especially when you consider that many of the choices are subjective. For example, does it really matter if the byline is above or below the header image?
              </p>
              <p>
                This is why I'm confused as to why the BBC News site went to the trouble of creating a different design for its international audience. I understand that differences around content were required (due to rights issues etc.) and that some layout changes would be required (as the international version is ad-supported), but why change the typography, layout, colours etc.?
              </p>
            </section>

            <section>
            <h2>Page Layout</h2>
            <p>
              I guess we (in the UK) like colour, and the rest of the world…&nbsp;doesn't?
            </p>

            <figure>
                <img src="https://onlyrss.org/images/bbc-inside-uk.webp" />
              <figcaption>UK version (2-column, red header)</figcaption>
            </figure>

            <figure>
                <img src="https://onlyrss.org/images/bbc-outside-uk.webp" />
              <figcaption>International version</figcaption>
            </figure>

            <table class="comparison-table" style="width: 100%;">
              <thead>
              <tr>
                <th>Page Element</th>
                <th>UK</th>
                <th>International</th>
              </tr>
              </thead>
              <tbody>
              <tr>
                <td>Layout</td>
                <td>Two column</td>
                <td>One column</td>
              </tr>
              <tr>
                <td>Background colour</td>
                <td>Off white</td>
                <td>Pure white</td>
              </tr>
              <tr>
                <td>Header images</td>
                <td>Image width > Copy width</td>
                <td>Image width > Copy width</td>
              </tr>
              <tr>
                <td>Body images</td>
                <td>Image width > Copy width</td>
                <td>Image width = Copy width</td>
              </tr>
              <tr>
                <td>Byline</td>
                <td>Below header image</td>
                <td>Between title and header image</td>
              </tr>
              <tr>
                <td>Original publish date</td>
                <td>Yes</td>
                <td>No</td>
              </tr>
              <tr>
                <td>Updated date</td>
                <td>Yes</td>
                <td>Yes</td>
              </tr>
              </tbody>
            </table>
            </section>

            <section>
              <h2>Features</h2>
              <p>
                Even though the BBC is very insistent that UK users now register when using the website, the site lacks the ability to save articles. Yet this is a feature in the international version. Saving articles on a news site isn't the most common feature, and I tend to save useful articles to a <a href="https://docs.feedly.com/article/60-how-can-i-save-an-article-to-a-board" target="_blank">Feedly board</a> anyway, so this isn't an issue for me, but it's still a strange inconsistency.
              </p>
              <p>
                The international version also has a share button (as do almost all news websites), which is missing from the UK version. I'm not sure why this is the case, but I suspect it's because the international version is ad-supported, and the BBC wants to encourage sharing to increase traffic to the site. But, it's such a useful feature (after all, sharing <em>is</em> caring), and it's such an <a href="https://christianheilmann.com/2024/11/16/whats-your-excuse-for-not-using-the-web-share-api/" target="_blank">easy feature to implement</a>, it seems like a very odd omission to me.
              </p>
              </section>

            <section>
            <h2>Typography</h2>
            <p> In the UK we get a sans-serif font, narrow paragraph width, and for some reason, a grey background (ok, I know, I use an off-yellow background, so who am I to criticise). The international version gets a larger serif font, wider paragraph, and a white background. </p>
            <p> There is some consistency—unfortunately. Across both versions the BBC still refuses to use real quotes (“ ”) and <a href="https://www.thepunctuationguide.com/em-dash.html" target="_blank" title="An em dash should be used when you want to create a strong break in the structure of a sentence—often to emphasize a point.">em dashes</a> (—), and instead uses typewriter style quotes (" ") 🤢 and <a href="https://www.thepunctuationguide.com/en-dash.html" target="_blank" title="The en dash is used to represent a span or range of numbers, dates, or time">en dashes</a> (–) 😱. </p>

            <figure>
                <img slot="first" src="https://onlyrss.org/images/bbc-type-inside-uk.webp" />
              <figcaption>Comparison: UK version (sans-serif, grey background, narrow)</figcaption>
            </figure>

            <figure>
                <img slot="second" src="https://onlyrss.org/images/bbc-type-outside-uk.webp" />
              <figcaption>International version (serif, white background, wider)</figcaption>
            </figure>

            <table class="comparison-table" style="width: 100%;">
              <thead>
              <tr>
                <th>Paragraph Element</th>
                <th>UK</th>
                <th>International</th>
              </tr>
              </thead>
              <tbody>
              <tr>
                <td>Font size</td>
                <td>16px</td>
                <td>18px</td>
              </tr>
              <tr>
                <td>Typeface</td>
                <td>BBC Reith Sans</td>
                <td>BBC Reith Serif</td>
              </tr>
              <tr>
                <td>Width/Measure</td>
                <td>580px (~73 characters)</td>
                <td>722px (~86 characters)</td>
              </tr>
              <tr>
                <td>Line height</td>
                <td>22px</td>
                <td>26px</td>
              </tr>
              </tbody>
            </table>
            </section>

            <section>
            <h2>Conclusions</h2>
            <p>
              The international version of the website is operated by BBC Global News Ltd., the for-profit BBC subsidiary, which also operates the BBC World News television channel.
            </p>
            <p>
              This commercial distinction likely explains many of the differences. The international version, with its revenue-generating objectives, employs more reader-friendly typography (serif fonts are generally considered easier to read in longer articles), offers social sharing to increase traffic, and provides article-saving functionality to encourage return visits. Meanwhile, the UK version, funded by the license fee, doesn't have the same commercial pressures.
            </p>
            <p>
              What remains puzzling is why the BBC maintains two entirely different design systems rather than a single flexible system that could accommodate both commercial and non-commercial needs. The development and maintenance costs for dual systems must be substantial, and the brand inconsistency seems counterproductive to the BBC's global identity.
            </p>
            <p>
              Why does this bother me so much that I wrote a blog post about it? To be honest, I much prefer the international version, and I do pay a license fee to the BBC, so I guess I'm just a little jealous!
            </p>
            </section>

          </article>

                ]]>
      </description>
    </item>



    <!-- calendar heatmap -->
    <item>
      <guid isPermaLink="false">article32</guid>
      <title>Why Product Managers need to embrace the tech</title>
      <link>https://onlyrss.org/posts/why-product-managers-need-to-embrace-the-tech.html</link>
      <pubDate>Sun, 16 Mar 2025 17:30:00 GMT</pubDate>
      <description>
        <![CDATA[
        <article>
          <header>
            <h1>Why Product Managers need to embrace the tech</h1>
            <p>
              After 16 years as a Product Manager, I share my thoughts on why
              technical knowledge is highly beneficial for product managers.
            </p>
          </header>

          <h2>Background</h2>
          <p>
            I’ve been a Product Manager for 16 years. I don’t mean I’ve worked
            <em>in</em> product management for 16 years, I mean I’ve literally had
            the individual contributor (IC) role of Product Manager (PM) for 16
            years.
          </p>
          <p>
            Does this mean I lack the skills required to become a Director-, VP-, or
            Chief-of-Product? No idea, it’s never occurred to me to apply for any of
            those roles. Is it just a lack of ambition then? The answer to that
            depends on how you define ambition. If you limit your definition of
            professional ambition to mean “taking on more responsibility”—which is
            business speak for “managing people”—then yes, I have no ambition. But,
            if your definition of ambition includes “trying to be as good as you can
            in your <em>current</em> role”, then I would consider myself to be very
            ambitious (surprise! I subscribe to the latter definition).
          </p>
          <p>
            If this all sounds like me trying to justify why I’ve had the same role
            for the last 16&nbsp;years, then I’ve done an effective job of writing
            my introduction, because that’s exactly what I was aiming for.
          </p>
          <p>
            The upshot of this is that I’ve <s>gained some experience</s> developed strong “opinions” on what
            it takes to be a good IC PM. But before I dive into what I’ve learned
            over the last 16&nbsp;years, here’s my definition of Product Management
            (it can mean different things in different organisations or industries).
          </p>
          <blockquote>
            <q>A PM listens to customers, understands their problems, and then uses
              his/her knowledge of the technology available to define and build*
              solutions.</q>
          </blockquote>
          <p>
            *in many organisations, the PM role ends with the definition, which is a
            shame, the building part is one of the most rewarding aspects of being a
            PM—it also helps that I’ve never met a software engineer I didn’t want
            to go to the pub with.
          </p>
          <p>
            While understanding customers is crucial, that ground has been
            thoroughly explored in PM resources. Instead, I want to focus on an
            equally vital but <span style="white-space: nowrap;">oft-overlooked</span> aspect of product management:
            technical knowledge.
          </p>

          <h2>But that’s what engineers are for, right?</h2>
          <p>
            I like to compare being a PM to being an architect (of buildings, not
            software). Imagine you’re an architect who designs homes. You meet with
            the client, and you try and understand their unique situation e.g. Are
            they young or old? Do they enjoy entertaining or are they hermits? Do
            they have cats or dogs? Do they have (or plan to have) a large family?
            Do they enjoy gardening? Do they work from home? Do they own multiple
            cars? What’s their budget? When do they want to move in?
          </p>
          <p>
            These are important questions that need to be answered before an
            architect can begin the design process. The home has to be designed to
            meet the client’s needs, but it should also be designed so that it takes
            advantage of the latest building materials, can be constructed
            economically, and that once built, is easy to maintain. To do this the
            architect needs to be aware of trends and advances in engineering, in
            building materials, in building standards etc.
          </p>
          <p>
            Just as an architect needs to understand construction materials and
            engineering principles, a PM needs knowledge of the technical tools and
            platforms available. Without this knowledge, we risk designing solutions
            that are impractical, inefficient, expensive, or even impossible to
            build.
          </p>
          <p>
            In other words, a PM must deeply understand not just the problem space
            (#obvs), but also <em>the solution space</em> to be truly effective.
          </p>
          <p>
            What follows is a description of the types of technologies I try to keep
            up with, and the methods I use to ensure that I stay updated efficiently.
            I’ve also thrown in a few examples of how keeping abreast of these
            technologies has benefited me, my products, and my users. One big
            caveat, I’m a PM for a data analytics company with a big focus on UI
            products that run in the browser. If you’re a PM for a company that
            makes
            <a href="https://www.equus.co.uk/collections/halloween-horse-riding" target="_blank">Halloween costumes for horses</a>, I’m sorry,
            this is not the blog post for you.
          </p>

          <h2>The tech & resources</h2>
          <h3>HTML, CSS, and JavaScript</h3>
          <p>
            Your tech stack might use AWS, Azure, or Google Cloud. Your developers
            might be coding in C# on .Net or JavaScript on Node.js. But at the end
            of the day, when your users interact with your product in the browser,
            that browser is using HTML, CSS and JavaScript to display your content.
          </p>
          <ul>
            <li>
              HTML is the language used to define the semantic structure and content
              of web pages, like the skeleton and text.
            </li>
            <li>
              CSS is the language used to control the visual styling and layout,
              everything from colours and fonts to animations and responsive design.
            </li>
            <li>
              JavaScript takes care of the user interactions, manipulating content
              dynamically, and communicating with servers, enabling everything from
              simple button clicks to complex single-page applications.
            </li>
          </ul>
          <p>
            Each of these 3 technologies is being constantly developed and updated,
            but it’s CSS that has probably been through the most rapid changes over
            the last few years. Many of the recent additions to the CSS spec can
            be implemented into your products to improve the experience for your users,
            but also to simplify the build effort i.e.&nbsp; reduce the time
            required by your developers.
          </p>

          <h4>Resources</h4>
          <ul>
            <li>
              <a href="https://play.pocketcasts.com/podcasts/8b549490-46c7-0138-9767-0acc26574db2" target="_blank">The CSS Podcast</a> : Each episode focusses on a single CSS feature. <strong>If you only pick one resource from this list, I'd recommend this one</strong>.
            </li>
            <li>
              <a href="https://www.youtube.com/@KevinPowell" target="_blank">Kevin Powell's YouTube channel</a> : Lots of great
              content on CSS (and some HTML). With a strong focus
              on upcoming CSS features.
            </li>
            <li>
              <a href="https://play.pocketcasts.com/podcasts/6f808470-d243-013b-f46f-0acc26574db2" target="_blank">Just a Spec</a>: Podcast series with a focus on web standards and understanding the fundamentals.
            </li>
            <li><a href="https://play.pocketcasts.com/podcasts/b0627330-1ea4-013c-f622-0acc26574db2" target="_blank">Bad at CSS</a> : A podcast series where developers discuss their struggles with CSS, and share their learning experiences.
            </li>
            <li>
              <a href="https://play.pocketcasts.com/podcasts/d8fb5c80-1d1e-012f-f6d4-525400c11844" target="_blank">ShopTalk</a> : If you enjoy listening to two smart people chatting about web tech, this is the one for you. They're up to episode №655!
            </li>
            <li>
              <a href="https://feedbin.com/starred/56d6b0fe68e5efd3d447fd5bf328a57e.xml" target="_blank">RSS: Chris Coyier's Starred Articles </a> : Chris Coyier is a web designer, founder of CSS Tricks and co-founder of CodePen. He's also a co-host of the above mentioned ShopTalk podcast. When Chris comes across an interesting article he stars it in his RSS reader. This RSS feed is a collection of those starred articles.
            </li>
          </ul>

          <h3>Browsers</h3>
          <p>
            Your product is going to be displayed to your users via a browser, and
            most likely one of the big 4 i.e. Chrome, Safari, Edge, and Firefox.
          </p>
          <p>
            You should keep up-to-date on the latest features of each, 
            understand what they have in common, and what differentiates them. For
            example, across the 4 browsers I've listed, there’s actually only 3
            rendering engines used (the rendering engine interprets the HTML, CSS,
            and JavaScript to display web pages). Chrome and Edge are both based on
            <a href="https://www.chromium.org/Home/" target="_blank">Chromium</a>, which uses the
            <a href="https://www.chromium.org/blink/" target="_blank">Blink</a> engine. Safari uses
            <a href="https://webkit.org/" target="_blank">WebKit</a>, and Firefox uses
            <a href="https://firefox-source-docs.mozilla.org/overview/gecko.html" target="_blank">Gecko</a>. But, on mobile Apple devices,
            whatever browser you install (Chrome,
            Firefox etc.) you’re actually just installing Safari wrapped in some
            Chrome/Firefox UI.
          </p>
          <h4>Resources</h4>
          <ul>
            <li>
              <a href="https://developer.chrome.com/blog" target="_blank">Chrome blog</a> (<a href="https://developer.chrome.com/blog/feed.xml" target="_blank">RSS</a>) : For Google's Chrome.
            </li>
            <li>
              <a href="https://blog.mozilla.org/en/category/products/firefox/" target="_blank">Mozilla blog</a> (<a href="https://blog.mozilla.org/en/category/products/firefox/feed/" target="_blank">RSS</a>) : For Mozilla's Firefox.
            </li>
            <li>
              <a href="https://webkit.org/" target="_blank">WebKit blog</a> (<a href="https://webkit.org/feed/" target="_blank">RSS</a>) : For Apple's Safari.
            </li>
            <li>
              <a href="https://blogs.windows.com/msedgedev/" target="_blank">Edge blog</a> (<a
                href="https://blogs.windows.com/msedgedev/feed/" target="_blank">RSS</a>) : For Microsoft's Edge.
            </li>
            <li>
              <a href="https://webkit.org/blog/16458/announcing-interop-2025/" target="_blank">Interop 2025</a> 
              : Each year the browser vendors get together and decide what to focus
              on for the following year. There's a high probability that some of
              these new capabilities might be worth taking advantage of across your
              products.
            </li>
            <li>
              <a href="https://web.dev/baseline" target="_blank">Baseline</a> : Baseline gives you
              clear information about which browser features are ready to use in
              your products today.
            </li>
          </ul>

          <h3>Browser Dev Tools</h3>
          <p>
            The Dev Tools is a whole suite of developer focused tools running in
            your browser that can be accessed by hitting the <kbd>F12</kbd> key on
            Windows (<kbd>Cmd</kbd> + <kbd>Option</kbd> + <kbd>I</kbd> on a Mac).
            These are incredibly powerful, and not just for developers. You can use
            them when doing some QA, to take full-page screenshots, and even to edit
            live web pages (very useful when you want to try out some changes you're
            considering to the content or UI).
          </p>
          <p>
            Much like the browsers themselves, the Dev Tools are also updated
            frequently with new features, and it’s worthwhile knowing what new
            capabilities are available.
          </p>
          <h4>Resources</h4>
          <ul>
            <li>
              <a href="https://developer.chrome.com/docs/devtools" target="_blank">Chrome DevTools website</a> : You'll discover loads of
              useful links to Dev Tools resources.
            </li>
            <li>
              <a href="https://www.youtube.com/playlist?list=PLNYkxOF6rcIAcezfL8q0rjt13ufKseL5X" target="_blank">Dev Tools Tips YouTube
                playlist</a>
              (<a href="https://www.youtube.com/feeds/videos.xml?playlist_id=PLNYkxOF6rcIAcezfL8q0rjt13ufKseL5X" target="_blank">RSS
                feed</a>) : To access more than 40 short (~5&nbsp;minutes) videos that will
              help you get the most out of the Dev Tools. Note: the videos are kinda
              cheesy, but they are informative.
            </li>
            <li>
              <a href="https://developer.chrome.com/docs/devtools/news" target="_blank">What's new in Dev Tools blog</a> : If you really want
              to get into the nitty-gritty.
            </li>
          </ul>

          <h3>Windows, Mac, iOS, and Android</h3>
          <p>
            So, all our apps are rendered using HTML, CSS, and JavaScript, and then
            displayed via Chrome, Safari, Edge, and Firefox. But, those browsers are
            most likely going to be running on Windows, Mac, iOS, or Android. And the
            browsers are quite well integrated into the OS, so an app running in
            Chrome on Windows won’t necessarily render your product the same as
            Chrome running on a Mac. For example, subtle differences in font rendering, device-specific features, or OS-level optimizations can lead to variations in how a web app is displayed.
          </p>
          <h4>Resources</h4>
          <ul>
            <li>
              <a href="https://blogs.windows.com/" target="_blank">Windows blog</a> (<a href="https://blogs.windows.com/feed/" target="_blank">RSS</a>) : For
              Microsoft's Windows.
            </li>
            <li>
              <a href="https://www.apple.com/newsroom/" target="_blank">Apple newsroom</a> (<a
                href="https://www.apple.com/newsroom/rss-feed.rss" target="_blank">RSS</a>) : For Apple's Mac and iOS.
            </li>
            <li>
              <a href="https://blog.google/products/android/" target="_blank">Google blog</a> (<a
                href="https://blog.google/products/android/rss/" target="_blank">RSS</a>) : For Google's Android.
            </li>
          </ul>

          <h3>Microsoft 365</h3>
          <p>
            If the product you manage has an export capability, then it's likely
            that the exported data is going to end up in MS Office. If it's
            unstructured data then it's likely to be imported into Word or PowerPoint,
            if it's structured data then it's probably going to be end up in Excel.
          </p>
          <p>
            By keeping up-to-date with the features of these products you can ensure
            that your products' exports are compatible with the products included in
            M365 (including Copilot). You can even advise your users on how best to
            derive maximum value from the data you provide them when using MS Office
            apps.
          </p>
          <h4>Resources</h4>
          <ul>
            <li>
              <a href="https://www.microsoft.com/en-us/microsoft-365/blog/" target="_blank">Microsoft 365 blog</a>
              (<a href="https://www.microsoft.com/en-us/microsoft-365/blog/feed/" target="_blank">RSS</a>) : For the latest updates on
              Microsoft 365.
            </li>
            <li>
              <a href="https://www.microsoft.com/en-us/microsoft-365/roadmap" target="_blank">Microsoft 365 roadmap</a> : To see what's coming
              next. You can use the Products filter to limit
              the Roadmap to just the products you're interested in. They also offer
              an
              <a href="https://www.microsoft.com/releasecommunications/api/v2/m365/rss" target="_blank">RSS feed</a>.
            </li>
            <li>
              <a
                href="https://support.microsoft.com/en-gb/topic/join-the-microsoft-365-insider-program-3c7dda4f-4d05-0783-3a9a-182b50acb8a9" target="_blank">Join
                the Microsoft 365 Insider program</a> : If you do this you'll get early—before your users—access to
              Office updates.
            </li>
            <li>
              <a href="https://techcommunity.microsoft.com/category/microsoft365/blog/microsoft365insiderblog" target="_blank">Insider program
                blog</a>
              (<a
                href="https://techcommunity.microsoft.com/t5/s/gxcuf89792/rss/board?board.id=Microsoft365InsiderBlog" target="_blank">RSS</a>) :
              If you don't sign-up to the Insider program (or can't due to
              corporate policies) it's worth following the blog.
            </li>
          </ul>

          <h2>Examples</h2>
          <p>
            Ok, so what has all this technology monitoring done for me as a Product
            Manager? Or more importantly, how has it benefited my users? Good question,
            and what better way to answer than with examples?
          </p>

          <h3>View Transitions</h3>
          <p>View Transitions are a recent addition to CSS that allow a page element (title, paragraph, image etc.) to animate between an initial and final state. This can be within a single page or across pages. A typical example would be from a thumbnail of a video, which when clicked would transition/animate to the full size playback version of the video.</p>
          <p>I use View Transitions on this site to transition from the article titles on the homepage, to the article titles on the article pages, this is shown in the animation below (25% of normal speed).</p>
          <p>
            <img  src="https://onlyrss.org/images/view-transitions-compressed.gif" alt="Animated screenshot of a list of blog titles on a blog homepage. When a title is clicked, the title transitions (or fades) into the same title but on the top of the blog article page." />
          </p>

          <h3>The Web Share API</h3>
          <p>
            I recently discovered the
            <a href="https://w3c.github.io/web-share/" target="_blank">Web Share API</a> (via
            <a href="https://christianheilmann.com/2024/11/16/whats-your-excuse-for-not-using-the-web-share-api/" target="_blank">this blog
              post</a>), a powerful tool that bridges JavaScript, browsers, and operating
            systems. Not only will it provide my users with an enhanced sharing
            experience, but it will also significantly reduce our research,
            development, and maintenance effort.
          </p>
          <p>
            Rather than having to research the most common sharing destinations e.g.
            Facebook, X, LinkedIn, WeChat etc., used by my clients, and then define,
            build, and maintain those options—and probably sacrifice the less
            popular ones. The Web Share API simply invokes the Operating Systems’
            native sharing menu (yes, apparently this is a thing that exists!).
          </p>
          <p>
            The result is that the user will see only the options for the apps they
            have installed. This even includes the people the user most
            frequently/recently shares content with.
          </p>
          <p>
            The screenshot below is taken from invoking the share option on this
            website, and it’s an example of what a Windows user (in this case, me)
            would see.
          </p>
          <p><img src="https://onlyrss.org/images/native-share-screenshot.webp" alt="A screenshot of a modal dialog showing icons for a variety of email clients and social networks" /></p>
          <p>
            There is one caveat however, the Web Share API is not supported on
            Firefox (what’s even more unfortunate is that “it’s not supported on
            Firefox” is something I find myself uttering far too frequently).
          </p>

          <h3>Progressive Web Apps</h3>
          <p>
            Much like the Web Share API,
            <a href="https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps" target="_blank">Progressive Web Apps</a>
            (PWAs) require very little effort to implement, but can greatly improve
            the users’ experience.
          </p>
          <p>
            With very little development effort, you can allow your users to
            “install” your web application on their OS (desktop or mobile). Your app
            will get a dedicated launch icon, a splash screen, and no
            <a href="https://www.nngroup.com/articles/browser-and-gui-chrome/" target="_blank">browser chrome</a>. On mobile your app will
            fill the screen, just like a native
            application.
          </p>
          <p>
            Once installed, as far as the user is concerned your app will look and
            behave like a native Windows, Mac, iOS, or Android application—PWAs even
            support offline capabilities and push notifications.
          </p>
          <p>
            The screenshot below is of this blog, which has been implemented as a
            PWA.
          </p>
          <p><img src="https://onlyrss.org/images/pwa.webp" alt="A mockup of 2 mobile phones, each of which are showing a page from the onlyRSS blog. The blog page contents take up the whole screen of the phone." /></p>
          <p>
            There is one caveat however, Firefox dropped their support for PWAs in
            2021. A decision that has angered and perplexed developers and users
            alike. The good news is that PWAs are a
            <a href="https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement" target="_blank">progressive enhancement</a>.
            If the user’s browser supports PWAs, then that’s great, if it
            doesn’t, then there’s no downside. Your app will continue to run in the
            browser as usual.
          </p>

          <h3>Python & Copilot in Excel</h3>
          <p>
            I’ve been waiting for this update to Excel for months (I subscribe to
            the MS Office roadmap updates via RSS), and only recently (Jan 2025) got
            access. MacOS users will have to wait until March.
          </p>
          <p>
            The combination of Python and M365 Copilot in Excel means that Excel
            users can now use natural language to analyse and visualise data in
            Excel with the full power of Python—no knowledge of coding in Python
            required.
          </p>
          <p>
            As an example, the jitter chart shown below (which is a replication of
            one available from within one of my products) can be created with Python
            in Excel with just a few prompts.
          </p>
          <p>
            I’ve mentioned this game-changing Excel update to a few colleagues (all
            of whom use Excel), and none were aware of its existence.
          </p>
          <p><img src="https://onlyrss.org/images/jitter-python.webp" alt="A screenshot of a data visualisation, specifically a jitter chart that shows the age distribution of aircraft grouped by aircraft type." /></p>

          <h3>Dev Tools</h3>
          <!--MARK: Dev Tools-->
          <p>
            Here’s the description of the Chrome Dev Tools (other browsers have
            their own version of dev tools) taken directly from the
            <a href="https://developer.chrome.com/docs/devtools" target="_blank">Dev Tools website</a>.
          </p>
          <blockquote>
            <q>Chrome DevTools is a set of web developer tools built directly into
              the Google Chrome browser. DevTools lets you
              <mark>edit pages on-the-fly</mark> and diagnose problems quickly,
              which helps you build better websites, faster.</q>
          </blockquote>
          <p>
            I’ve highlighted one specific section of the description, because for
            Product Managers I think it’s really useful. It’s really easy to use the
            Dev Tools to edit the text on a webpage, and if you know some HTML &
            CSS, you can even make more fundamental changes to the page. This can be
            useful if you want to add a ticket to your backlog asking for small
            changes. Rather than trying to describe what you want (which could be
            misinterpreted) simply make the change to the live page and capture a
            screenshot—there’s even a screenshot tool built into Dev Tools (it even
            lets you capture a full page screenshot, including any of the page
            currently below the bottom of the viewport.)
          </p>
          <p><img src="https://onlyrss.org/images/dev-tools-edit.gif" alt="An animation showing the dev tools being used to manually change the text of a live BBC article title. The user is swapping the word “Trump” with the word “moron”. Clearly the author of this blog post believes (correctly so) that Trump is a moron." /></p>

          <h3>CSS one-liners</h3>
          <ul>
            <li>
              <p>
                <code>scrollbar-gutter: stable</code> This will stop horizontal
                content shift when moving between pages that require/don’t-require a
                vertical scrollbar. Or when you open a modal/popup. See this in
                action in this
                <a href="https://www.youtube.com/watch?v=ZFhPGfLfSa8" target="_blank">YouTube Short</a>
                from
                <a href="https://bsky.app/profile/kevinpowell.co" target="_blank">Kevin Powell</a>.
              </p>
            </li>
            <li>
              <p>
                <code>@view-transition {navigation: auto;}</code> This one line of
                CSS will add a subtle fade effect when your users navigate between
                pages. When combined with an app running as a PWA on mobile, this
                gives your application a much more native feel. I learnt about View
                Transitions from an
                <a href="https://shoptalkshow.com/566/#t=06:14" target="_blank">episode</a> of the
                <a href="https://shoptalkshow.com/" target="_blank">Shop Talk Show podcast</a>. You
                can also visit my own
                <a href="https://onlyrss.org/posts/view-transitions.html" target="_blank">blog post</a>
                that covers both versions of View Transitions i.e. same-document and
                cross-document.
              </p>
            </li>
            <li>
              <p>
                <code>p{text-wrap: pretty;}</code> This single line will improve
                your application’s typography by removing widows &amp; orphans. i.e.
                single words that stand alone at the end of a paragraph or text
                block. You can see this in action in this
                <a href="https://developer.chrome.com/blog/css-text-wrap-pretty" target="_blank">Chrome for developer blog post</a>
                by <a href="https://bsky.app/profile/nerdy.dev" target="_blank">Adam Argyle</a>.
              </p>
            </li>
            <li>
              <p>
                <code>font-variant-numeric: tabular-nums;</code> If you have tables
                with columns that contain only numeric data (that represent
                quantities or an order/position), then please use a font that
                supports tabular numbers, and ensure that font’s
                <code>tabular-nums</code> feature is enabled—yes, fonts have
                features. To understand why this is important, see this
                <a href="https://sebastiandedeyne.com/tabular-numbers" target="_blank">blog post</a>
                from <a href="https://bsky.app/profile/sebdd.net" target="_blank">Seb De Deyne</a>.
              </p>
            </li>
          </ul>

          <h3>Last but definitely not least</h3>
            <p>
              I cannot write an article on the benefits of keeping up-to-date with tech without mentioning the <a href="https://dailytechnewsshow.com/about/" target="_blank">Daily Tech News Show</a> podcast. This podcast covers the most important tech news of the day.
            </p>
            <p>The host, <a href="https://en.wikipedia.org/wiki/Tom_Merritt" target="_blank">Tom Merritt</a>, is a great presenter, and the show is always highly informative. I’ve been listening to DTNS (and its earlier iteration, Tech News Today) for almost 15 years, and if I ever sound like I know what I'm talking about when I'm talking about tech, it's because of Tom Merritt.
            </p>


          <h2>Conclusion</h2>
          <!--MARK: Conclusion-->
            <p>
              I hope I’ve convinced you that as a Product Manager, keeping up-to-date
              with the latest technologies can greatly benefit you, your products, and
              your users. I’ve also tried to show that it’s not as difficult as you
              might think. The resources I’ve listed are all free, and many are
              available in audio format (so you can listen while you workout), or via RSS feeds (so you'll never need to go looking for new content, and can always skip articles/posts that are not of interest).
            </p>
            <p>
              The above tech topics and associated resources are not meant to be exhaustive, they are just some of the ones that <em>I</em> find useful. I think the key point is that you should be aware of the technologies that are most relevant to <em>your</em> products and <em>your</em> users, and then find the resources that will help you keep up-to-date with those technologies.
            </p>
        </article>
                ]]>
      </description>
    </item>



    <!-- Learning Log 2024 -->
    <item>
      <guid isPermaLink="false">article31</guid>
      <title>Learning Log: 2024</title>
      <link>https://onlyrss.org/posts/learning-log-2024.html</link>
      <pubDate>Tue, 24 Dec 2024 13:30:00 GMT</pubDate>
      <description>
      <![CDATA[
              <article>
                <header>
                  <h1>Learning log: 2024</h1>
                  <p>
                    My 2024 learning goals and resources. In this post I outline my learning goals for 2024 and list the resources I used.
                  </p>
                </header>

                <section>
                  <h2>2024 goals</h2>
                  <p>
                    During January 2024 I finally completed the Mimo JavaScript course. This course took many months, and was my primary source of training for JavaScript. It also represented the end of chapter 1 of my learning journey (i.e. HTML, CSS, and JavaScript ). I'll continue to use learning resources for these technologies, but it's now time to focus on chapter 2 i.e. SQL and Python. Again, I'll be using Mimo as the primary learning resource for these.
                  </p>
                </section>

          <section>
            <h2>Resources</h2>

            <!--MARK: HTML, CSS and JS-->
            <section>
              <h3>HTML, CSS, and JavaScript</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th><th>Progress</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://mimo.org/web/197/section/0" target="_blank">Mimo: JavaScript</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://web.dev/learn/pwa" target="_blank">web.dev: Learn PWA</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://web.dev/learn/performance" target="_blank">web.dev: Learn Performance</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><video-tag></video-tag></td>
                    <td><a href="https://www.youtube.com/playlist?list=PLNYkxOF6rcIDI0QtJvW6vKonTxn6azCsD" target="_blank">Google: Designing in the browser.</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://www.theodinproject.com/" target="_blank">The Odin Project</a></td>
                    <td><progress-meter><progress-percent style="--progress: 75"></progress-percent></progress-meter></td>
                  </tr>
                </tbody>
              </table>
            </section>

            <!--MARK: SQL & Python-->
            <section>
              <h3>SQL and Python</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th><th>Progress</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://mimo.org/web/145/section/0" target="_blank">Mimo: SQL</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://mimo.org/web/125/section/0" target="_blank">Mimo: Python</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                </tbody>
              </table>
            </section>

            <!--MARK: Typography-->
            <section>
              <h3>Typography</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th><th>Progress</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><book-tag></book-tag></td>
                    <td><a href="https://legible-typography.com/en/" target="_blank">Legibility</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><book-tag></book-tag></td>
                    <td><a href="https://www.goodreads.com/book/show/182761576-thinking-with-type" target="_blank">Thinking with Type: A Critical Guide for Designers, Writers, Editors, and Students.</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><book-tag></book-tag></td>
                    <td><a href="https://www.goodreads.com/book/show/182761416-universal-principles-of-typography" target="_blank">Universal Principles of Typography: 100 Key Concepts for Choosing and Using Type.</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                </tbody>
              </table>
            </section>

            <!--MARK: Misc-->
            <section>
              <h3>Miscellaneous</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th><th>Progress</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://www.cloudskillsboost.google/journeys/118" target="_blank">Google: Generative AI learning path</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://www.productledcertified.com/ai-for-product-management" target="_blank">Mind the Product: AI for Product Management</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><book-tag></book-tag></td>
                    <td><a href="https://atomicdesign.bradfrost.com/table-of-contents/" target="_blank">Atomic Design.</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><book-tag></book-tag></td>
                    <td><a href="https://www.goodreads.com/book/show/26535513-storytelling-with-data" target="_blank">Storytelling with Data: A Data Visualization Guide for Business Professionals.</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><book-tag></book-tag></td>
                    <td><a href="https://www.goodreads.com/book/show/525862.The_Little_Know_It_All" target="_blank">The Little Know-It-All: Common Sense for Designers.</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://www.nan.fyi/svg-paths" target="_blank">Understanding SVG paths</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><video-tag></video-tag></td>
                    <td><a href="https://www.youtube.com/playlist?list=PL4-IK0AVhVjP0EeV513_b30lhGRTfMbYd" target="_blank">Kevin Powell's SVG beginners guide</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><book-tag></book-tag></td>
                    <td><a href="https://www.goodreads.com/book/show/199796760-visualize-this" target="_blank">Visualize This: The FlowingData Guide to Design, Visualization, and Statistics.</a></td>
                    <td><progress-meter><progress-percent style="--progress: 10"></progress-percent></progress-meter></td>
                  </tr>
                </tbody>
              </table>
            </section>
          </section>
          </article>
        ]]>
      </description>
    </item>

    <!-- calendar heatmap -->
    <item>
      <guid isPermaLink="false">article30</guid>
      <title>Visualising my daily constitutionals (walks)</title>
      <link>https://onlyrss.org/posts/visualising-my-daily-constitutionals.html</link>
      <pubDate>Tue, 17 Dec 2024 17:30:00 GMT</pubDate>
      <description>
        <![CDATA[

        <article>
            <h1>Visualising my daily constitutionals (walks)</h1>
              <p>
                The result of my attempt to build a calendar heatmap from scratch with HTML, CSS, and JS. The heatmap visualises my daily walks in 2024.
              </p>
          </header>

          <section>
            <h2>Calendar heatmaps</h2>
              <p>
                It's hard to think of another chart type that can show daily data over a 12-month period in such a small space as well as a calendar heatmap.
              </p>
              <p>
                Calendar heatmaps allow you to glean: relative values between individual days, busiest days e.g. Mondays, weekends etc. (by looking at the rows), busiest weeks (by looking at the columns), and any trends throughout the year.
              </p>

            <h2>Building from scratch</h2>
              <p>
                My version below is based on the <a href="https://github.com/dbs-sticky" title="View the commit graph on my GitHub profile">GitHub commit calendar heatmap</a>. And like the GitHub version, you can hover over each cell to see the relevant data for that day, in my case, the date and distance walked.
              </p>
              <p>
                My initial version used a linear colour scale (specifically the brightness, referred to as “lightness” in the <a href="https://en.wikipedia.org/wiki/Oklab_color_space" title="Read about oklch on wikipedia">oklch colour space</a>), the problem I found was that the majority of my walks were ~5&#8239;km, but I had a single walk that was 50&#8239;km. The result was one very bright cell, with the rest all pretty much the same dull shade of green.
              </p>
              <p>
                I then decided to use a logarithmic scale for brightness, and this worked much better. The logarithmic scale allowed the short (5–10&#8239;km) walks to remain visible, and the differences between them to be discernible.
              </p>
              <p>
                The issue now was that the long walks were too similar to each other in brightness e.g. my 50&#8239;km walk looked almost the same brightness as my 20&#8239;km walk. So, I decided to bring in a second parameter i.e. a drop-shadow. The spread of the drop-shadow  increases (linearly) with the distance walked, specifically, each 10&#8239;km walked adds 1 pixel of spread to the shadow. The result is an “overspill” effect, reminiscent of an old CRT display.
              </p>
              <p>
                As an aside, I noticed that the overspill was appearing behind adjacent cells, so I set the z-index of each cell to be equal to the distance walked, so brighter cells are always on a layer above less bright cells.
              </p>

          </section>

          <p>NOTE: As you're reading this in an RSS reader, you'll need to visit the <a href="https://onlyrss.org/posts/visualising-my-daily-constitutionals.html">source article</a> to view the heatmap as an interactive element, below it's included as a simple image.
          </p>

          <img src="https://onlyrss.org/images/calendar-heatmap-rss.webp" alt="A calendar heatmap showing the distance walked each day in 2024. The heatmap uses a logarithmic scale for brightness, and a drop-shadow effect to show the distance walked. The result is an “overspill” effect, reminiscent of an old CRT display." width="1221" height="244" loading="lazy">

          <section>
            <h2>Conclusions</h2>
              <p>
                I really like the way this one has turned out—especially the overspill effect. But, I'm far less happy with the code itself. I was about 90% of the way through building it—struggling to align the day and month labels—when I realised that I should have simply used a HTML table, rather than CSS Grid & Flex.
              </p>

          </section>

        </article>


                ]]>
      </description>
    </item>

    <!-- the daily constitutional -->
    <item>
      <guid isPermaLink="false">article29</guid>
      <title>Bring back the daily constitutional</title>
      <link>https://onlyrss.org/posts/the-daily-constitutional.html</link>
      <pubDate>Wed, 11 Dec 2024 17:30:00 GMT</pubDate>
      <description>
        <![CDATA[

        <article>
              <header style="view-transition-name: post27">
                <h1>Bring back the daily constitutional</h1>
                  <p>
                    After discovering the concept of the daily constitutional recently while reading Sherlock Holmes, I think it's a phrase (and practice) that deserves a comeback.
                  </p>
              </header>

              <section>
                <h2>Introduction</h2>
                <p>I've been working my way through Arthur Conan Doyle's Sherlock Holmes short stories. It's a great way to boost my end-of-year Goodreads stats (I'm counting each short story as a “book”—this is <a href="https://en.wikipedia.org/wiki/Goodhart%27s_law">Goodhart's Law</a> in action), and I've always enjoyed the TV adaptations. Recently, in addition to the books, I've been listening to the <a href="https://www.goalhangerpodcasts.com/sherlock">Sherlock & Co. podcast</a>, which I highly recommend.</p>
                <p>The first Holmes story was published in 1887, and it turns out that language has evolved over the last 137 years (and maybe not always for the better). The standout example for me was the use of the word “ejaculate,” which is used 23 times throughout the books. Today it refers to a very specific type of “outburst,” but back then it referred to any form of outburst, and in Doyle's books, it specifically refers to verbal outbursts (which is a good thing, otherwise I'd expect the whole series of books to be banned in American schools). Honestly, I'd love to try and bring back this use of the word, maybe by using it in the office? (alas, I have a mortgage to pay, so I think I'll give this a miss).</p>
                <p>Although I managed to determine the meaning of “ejaculate” from the context, the word “constitutional” (example below) was something I had to look up (one thing I love about eReaders is how easy they make it to look up the meaning and etymology of a word).</p>
                <blockquote>
                    <q>It just happened, however, that this hour coincided with Blessington's constitutional, which seems to show that they were not very well acquainted with his daily routine.</q>
                    <br>
                    — Dr Watson in <i><a href="https://sherlock-holm.es/stories/plain-text/cano.txt#:~:text=It%20just%20happened, his%20daily%20routine" target="_blank" title="View this quote in context of the short story">The Resident Patient</a></i>
                </blockquote>
              </section>

              <section>
                <h2>The daily constitutional</h2>
                <p>Here's the definition of constitutional from the Oxford dictionary:</p>
                <p><strong>noun:</strong> constitutional; a walk taken regularly to maintain or restore good health. e.g. “she went out for a constitutional.”</p>
                <p>The dictionary describes the above usage as dated, which leaves the modern-day usage as the two adjectives below:</p>
                <ol>
                    <li>relating to an established set of principles governing a state.</li>
                    <li>relating to someone's nature or physical condition.</li>
                </ol>
                <p>It's the second adjective above that relates to its use as a noun. i.e., taking a daily constitutional is good for one's constitution, aka health.</p>
                <p>This is a phrase (and practice) that I think deserves to make a comeback.</p>
              </section>

              <section>
                <h2>Wouldn't joining a gym be better?</h2>
                <p>As I write this post it's December, typically a month of overindulgence (alcohol, mince pies, rom-coms, etc.). The good news is that in December we can all eat and drink as much as we like, because in January we're all going to “work it off” by going to the gym or taking up running. The problem with going to the gym or going for a run is that those things are really hard, and also (at least for beginners), they're not fun.
                </p>
                <p>I suspect that the vast majority of people who take up running or join a gym in January have quit before February kicks in. And then it's back to sitting at a desk all day, ready for the cycle to begin again the following December.</p>
                <p> But there is another option, a boring but much easier, cheaper, and more enjoyable option, and that's to just go for a walk each day i.e., to take a “daily constitutional.”</p>
                <p>You're not going to get a six-pack by taking a one-hour walk each day (you're not going to get one by <em>paying</em> a gym membership either), but you will get to take a break from work/sitting, get some fresh air, explore your local surroundings, burn some calories (~300kcal), and maybe learn something from listening to a podcast.</p>
              </section>

              <section>
                <h2>How's my campaign going?</h2>
                <p>Not well to be honest.</p>
                <figure>
                  <img src="https://onlyrss.org/images/whatsapp-constitutional.webp" alt="Screenshot of a WhatsApp message between my wife and me, where I state I'm about to go for my daily constitutional, and she asks if I mean a walk or something else" width="1080" height="652" loading="lazy">
                  <figcaption>A recent—and real—exchange with the wife.</figcaption>
                </figure>
              </section>

            </article>

        ]]>
      </description>
    </item>

    <!-- Learning Log 2023 -->
    <item>
      <guid isPermaLink="false">article28</guid>
      <title>Learning Log: 2023</title>
      <link>https://onlyrss.org/posts/learning-log-2023.html</link>
      <pubDate>Fri, 29 Dec 2023 13:30:00 GMT</pubDate>
      <description>
        <![CDATA[
          <article>
          
            <header>
              <h1 style="view-transition-name: post26">Learning log: 2023</h1>
              <div class="tldr">
                <p>
                  My focus this year was meant to be SQL & Python, but it ended up being mostly JavaScript, and then of course, like everyone else, I got a bit distracted by Generative AI. On this page you'll find links to all the resources I used.
                </p>
              </div>
            </header>

            <!--Goals-->
            <section>
              <h2>2023 goals</h2>
              <p>
                I'm disappointed with my progress this year. It was meant to be the year I finally learnt SQL, but about halfway through the year I changed my working hours (I now officially start at 7am), and the hour I used to spend each morning learning new skills was no longer available to me.
              </p>
              <p>
                Generative AI also affected my learning this year, in two ways:
              </p>
                <ol>
                  <li>I needed to learn about how GenAI works, and had to brush-up on my "prompt-engineering", specifically for some work projects (I'm sure I'm not alone in this!).</li>
                  <li>My subscription to GitHub Copilot (in VSCode) changed the way I was learning to code. Essentially providing me with a "learning assistant".</li>
                </ol>
              <p>
                I'm almost at the end of my JavaScript course (on Mimo), so once this is complete, I'll then switch to SQL and Python. My aim is to have a good understanding of HTML, CSS, JavaScript, SQL, and Python by the end of 2024.
              </p>
            </section>

            <!--Typography-->
            <section>
              <h2>Resources</h2>

            <!--HTML and CSS-->
            <section>
              <h3>HTML / CSS / JavaScript</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th><th>Progress</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://web.dev/learn/images/" target="_blank">web.dev: Learn Images</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://web.dev/learn/html/" target="_blank">web.dev: Learn HTML</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://mimo.org/web/197/section/0" target="_blank">Mimo: JavaScript</a></td>
                    <td><progress-meter><progress-percent style="--progress: 87"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><book-tag></book-tag></td>
                    <td><a href="https://javascript-for-web-designers.abookapart.com/" target="_blank">JavaScript for web designers</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                </tbody>
              </table>
            </section>

            <!--Data Viz-->
            <section>
              <h3>Data visualisation</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th><th>Progress</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://data.humdata.org/dataviz-guide/" target="_blank">HDX: Data Visualization Guidelines</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><tutorial-tag></tutorial-tag></td>
                    <td><a href="https://pencilandpaper.io/articles/ux-pattern-analysis-enterprise-data-tables/" target="_blank">Pencil & Paper: Data Table Design UX Patterns</a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><tutorial-tag></tutorial-tag></td>
                    <td><a href="https://blog.datawrapper.de/category/datavis-dos-and-donts/" target="_blank">Datawrapper: Data Viz Do's and Don'ts </a></td>
                    <td><progress-meter><progress-percent style="--progress: 100"></progress-percent></progress-meter></td>
                  </tr>
                </tbody>
              </table>
            </section>

            <!--AI-->
            <section>
              <h3>AI</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th><th>Progress</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://www.cloudskillsboost.google/journeys/118" target="_blank">Google: Generative AI learning path</td>
                    <td><progress-meter><progress-percent style="--progress: 75"></progress-percent></progress-meter></td>
                  </tr>
                </tbody>
              </table>
            </section>

            <!--Misc-->
            <section>
              <h3>Miscellaneous</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th><th>Progress</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><course-tag></course-tag></td>
                    <td><a href="https://www.nan.fyi/svg-paths" target="_blank">Understanding SVG paths</a></td>
                    <td><progress-meter><progress-percent style="--progress: 28"></progress-percent></progress-meter></td>
                  </tr>
                  <tr>
                    <td><book-tag></book-tag></td>
                    <td><a href="https://legible-typography.com/en/" target="_blank">Legibility</a></td>
                    <td><progress-meter><progress-percent style="--progress: 60"></progress-percent></progress-meter></td>
                  </tr>
                </tbody>
              </table>
            </section>
          </article>

      ]]>
      </description>
    </item>

    <!-- Canada photos -->
    <item>
      <guid isPermaLink="false">article27</guid>
      <title>Holiday: The Canadian Rockies</title>
      <link>https://onlyrss.org/posts/the-canadian-rockies-holiday.html</link>
      <pubDate>Thur, 21 Dec 2023 13:00:00 GMT</pubDate>
      <description>
        <![CDATA[
          <article>
            <section>
              <h2>Introduction</h2>
              <p>
                To celebrate our 20<sup>th</sup> wedding anniversary the wife and I spent two weeks in Canada during late September 2023. We flew into Vancouver and then drove to Whistler, Clearwater, Jasper, Banff, and finished in Calgary. The scenery was breathtaking, and the weather was perfect. The following image gallery is a selection of my favourite photographs from the trip.
              </p>
            </section>

            <section>
              <h2>Gallery</h2>
              <br>
              <p style="font-size: larger">
              <strong>For anyone viewing this in an RSS reader, you'll need to visit the <a href="https://onlyrss.org/posts/the-canadian-rockies-holiday.html">source article</a> to view the gallery.</strong>
              </p>
              <br><br>
            </section>
            
            <section>
              <h2>Building the gallery</h2>
              <p>
                I needed some help with this post. I'd already built filters for the Homepage and Changelog page, so I had that ready to go, but, I wasn't sure I had the CSS skills to get the gallery working the way I wanted. I managed to get close, but not close enough, so I followed an <a href="https://blog.logrocket.com/responsive-image-gallery-css-flexbox">online tutorial</a>.
              </p>
              <p>
                I wanted the image popups to be a Web Component, so I could easily reuse them in future by simply using a custom HTML tag e.g. <code>&lt;dialog-image&gt;</code>. I also wanted to use the <code>&lt;dialog&gt;</code> element (<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog">now that it's supported across the main browsers</a>), which I'd never used before, to serve up the full-sized images. Luckily, a <a href="https://www.raymondcamden.com/2023/12/13/an-image-dialog-web-component">tutorial appeared recently</a> which describes how to do exactly that.
              </p>
              <p>
                Links to all the resources I used are listed below:
              </p>

              <ul>
                <li><strong>The gallery filters:</strong> <a href="https://www.youtube.com/watch?v=jZiZs8cZAKU" title="Watch Kevin Powell's video on YouTube">Kevin Powell's video on YouTube</a> </li>
                <li><strong>The gallery design/CSS:</strong> <a href="https://blog.logrocket.com/responsive-image-gallery-css-flexbox">LogRocket's image gallery tutorial</a></li>
                <li><strong>The popup Web Component:</strong> <a href="https://www.raymondcamden.com/2023/12/13/an-image-dialog-web-component">Raymond Camden's dialog Web Component tutorial</a> </li>
              </ul>
            </section>

            <section>
              <h2>Web Components</h2>
              <p>
                Here's a definition of Web Components I just pulled off the web:
              </p>
              <blockquote>
                <q>Web Components are a set of web platform APIs that allow you to create new custom, reusable, encapsulated HTML tags to use in web pages and web apps. Custom components and widgets build on the Web Component standards, will work across modern browsers, and can be used with any JavaScript library or framework that works with HTML.</q>
                <br>
                  <cite><a href="https://www.webcomponents.org/introduction">— WebComponents.org</a></cite>
              </blockquote>
              <p>
                So basically, developers now have the ability to create their own custom HTML tags, and via JavaScript and CSS, control how they work and look. This is a big deal, and I'm sure it will be a game changer for web development in the future. I'm not going to go into any more detail here, but if you want to learn more, I recommend you check out <a href="https://www.webcomponents.org/introduction">WebComponents.org</a>.
              </p>
              <p>
                The image popup Web Component I created for this post was my first Web Component. I then went off on a bit of a "Web Component All The Things" binge, and created 4 more. I targeted article page elements that are common across all articles, and then created a Web Component for each. So far, I've converted the following page elements into reusable Web Components:
              </p>

                <ul>
                  <li>Global navigation</li>
                  <li>Table of contents</li>
                  <li>Feedback footer</li>
                  <li>Share buttons</li>
                </ul>

              <p>
                I suspect I'll create a few more, and that the amount of copying & pasting I'll be doing in future will be greatly decreased!
              </p>
            </section>

            <section>
              <h2>Conclusions</h2>
              <p>
                I am aware that this article is the modern-day equivalent of a slideshow of holiday snaps, but I don't care. I'm pleased with how the gallery and popups look and am glad I went off on a Web Component creation tangent, as it's going to make my website much easy to maintain in the future.
              </p>
              <p>
                The page requires just <mark>1.1MB</mark> of resources to load, although each thumbnail image selected will trigger the load of the full-sized image (<mark>≈150KB each</mark>). Even so, I'm pleased with the overall page performance.
              </p>
            </section>
          </article>

        ]]>
      </description>
    </item>

    <!-- Using 'text-wrap: balance' -->
    <item>
      <guid isPermaLink="false">article26</guid>
      <title>View Transitions: A basic implementation</title>
      <link>https://onlyrss.org/posts/view-transitions.html</link>
      <pubDate>Tue, 06 Dec 2023 16:00:00 GMT</pubDate>
      <description>
        <![CDATA[

          <article>
            <section>
              <h2>Background</h2>
              <p>
                I hadn't written an article for quite some time, so decided to write about the View Transitions feature that has been added (behind a feature flag) to Google Chrome. I implemented View Transitions on this site about 6&nbsp;months ago, and I couldn't remember why I hadn't already written about it. Then, during my research, I remembered Dave Rupert's blog post "<a href="https://daverupert.com/2023/05/getting-started-view-transitions/" title="Read 'Getting started with View Transitions' on Dave's blog" target="_blank">Getting started with View Transitions</a>" and I realised it covered everything I wanted to say, and he'd done a much better job of explaining it than I could have.
              </p>
              <p>
                However, it's such a cool little feature, and so easy to implement, that I decided to write about it anyway. And let's be honest, the web can't have too many cool animated GIFs, can it?
              </p>
            </section>

            <section>
              <h2>Browser support</h2>
              <p>
                Currently only Google Chrome (v115+) supports multipage View Transitions, and even then it's behind a flag. So, if you want to test your implementation (or see how it looks on this blog), then copy <strong>chrome://flags/#view-transition-on-navigation</strong> to the clipboard, paste it into the URL bar, then select 'Enabled' alongside the 'viewTransition API for navigations' option.
              </p>
              <p>
                Now that you've enabled the feature in Chrome, you can test the feature by navigating between pages on this site, or better still, try the following blogs which have both implemented View Transitions:
                <ul>
                  <li><a href="https://daverupert.com/" title="Dave Rupert's blog" target="_blank">Dave Rupert's blog</a></li>
                  <li><a href="https://chriscoyier.net/" title="Chris Coyier's blog" target="_blank">Chris Coyier's blog</a></li>
                </ul>
              </p>
            </section>

            <section>
              <h2>Transition between pages</h2>
              <p>
                With the Chrome feature flag enabled, to achieve a fade as you move between pages (<span class="fig-ref">fig.&nbsp;1</span>), you need to add the following code to the &lt;head&gt; of each page:
              </p>
                  <pre><code class="language-html">&lt;meta name="view-transition" content="same-origin"&gt;</code></pre>
              <p>
                The result is a subtle fade as you move between pages (the animation shown below has been slowed to 25% of normal speed). On mobile—especially when combined with a Progressive Web App (PWA)—the feeling you get is very “native-app” like.
              </p>
              <figure>
                <img style="border: 1px solid lightgrey; border-radius: 5px;" src="https://onlyrss.org/images/transition-page.gif" width="371" height="821" alt="An animated GIF showing a user selecting various pages from a mobile blog's top navigation menu. When the new page loads, the previous page fades away, and the new page fades into view.">
                <figcaption>Transitions between pages. This animation has been slowed to 25% of normal speed.</figcaption>
              </figure>
            </section>

            <section>
                <h2>Transition between page elements</h2>
                <p>
                  To achieve a transition between page elements, for example, a blog post title on your homepage, and the title on the blog post itself (<span class="fig-ref">fig.&nbsp;2</span>), we need to create a link between the two elements, to do this, we use the 'view-transition-name' style.
                </p>
                <p>
                  For example, on my   blog's homepage, for the most recent blog post i.e. post23, I have the following code:
                </p>
                    <pre><code class="language-html">&lt;card-body&gt;
        &lt;h2 style="view-transition-name: post23">Using 'text-wrap: balance'&lt;/h2&gt;
        …
      &lt;/card-body&gt;</code></pre>
                <p>
                  Then, on the corresponding blog post page, I have the following:
                </p>
                    <pre><code class="language-html">&lt;header&gt;
        &lt;h1 style="view-transition-name: post23"&gt;Using 'text-wrap: balance'&lt;/h1&gt;
        …
      &lt;/header&gt;
      </code></pre>

                <p>
                  This is all the information the View Transitions API requires. The result is a smooth transition between the two elements (and locations), as shown in the animation below (the animation shown below has been slowed to 25% of normal speed).

                <figure>
                  <img style="border: 1px solid lightgrey; border-radius: 5px;" src="https://onlyrss.org/images/transition-titles.gif" width="371" height="821" alt="An animated GIF showing a list of blog articles on a blog's homescreen. When one of the article titles from the list is clicked, the article title transitions upwards towards the top of the screen, at the same time, the page transitions to the blog article proper. The title finally settles at the top of the article and matches the location of the article title.">
                  <figcaption>Transition between page elements. This animation has been slowed to 25% of normal speed.</figcaption>
                </figure>
            </section>

            <section>
              <h2>Summary</h2>
              <p>
                There's a lot more to View Transitions than I've covered here, but I wanted to keep this article to just the basics. If you want to learn more, then I recommend you read Dave Rupert's article "<a href="https://daverupert.com/2023/05/getting-started-view-transitions/" title="Read 'Getting started with View Transitions' on Dave's blog" target="_blank">Getting started with View Transitions</a>".
              </p>
            </section>

            <!-- feedback -->
            <footer>
              <feedback-contact></feedback-contact>
            </footer>

          </article>

        ]]>
      </description>
    </item>

            <!-- Using 'text-wrap: balance' -->
    <item>
      <guid isPermaLink="false">article25</guid>
      <title>Using 'text-wrap: balance'</title>
      <link>https://onlyrss.org/posts/css-balance.html</link>
      <pubDate>Tue, 11 Apr 2023 11:30:00 GMT</pubDate>
      <description>
        <![CDATA[
          <article>
            <section>
              <h2>
                Background
              </h2>
                <p>
                  If you're reading this then you are probably already aware of the upcoming new CSS feature:
                </p>
                <pre><code>text-wrap: balance;</code></pre>
                <p>
                  If not, then please visit the <a href="https://developer.chrome.com/blog/css-text-wrap-balance/" title="view the full explanation at the Chrome dev blog">Chrome dev blog</a> for the full details.
                </p>
                <p>
                  Basically, it's a way to "balance" titles, headings, and short paragraphs such that there are a similar number of words per line (and hence avoid widowed words). For simplicity, I'm going to refer to it as <em>CSS Balance</em> from now on.
                </p>
                <p>
                  I'm not going to repeat the information that's available on the Chrome dev blog, the aim of this article is to demonstrate the effect of using CSS Balance on a typical blog, specifically this blog. Basically, I'm going to show some examples so you can decide if it's something you should implement on your website.
                </p>
            </section>

            <section>
                <h2>Examples</h2>
                <p>
                  The following examples have not been configured specifically to demonstrate the effects of CSS Balance, they are simply the result of enabling CSS Balance on titles and headings on this website.
                </p>
                <h3>Homepage cards</h3>
                <p>
                  Figure 1 below shows the first 3 cards from my homepage. Figure 2 shows the same 3 cards but with CSS Balance enabled.
                </p>

              <figure>
                <img src="https://onlyrss.org/images/balance-before.webp" width="995" height="437" alt="A screenshot of 2 identical html cards, both include an image, a title, and a short description. In the card on the left the title is on 2 lines, but the second line only includes the word '10', in the second card, the title is also on 2 lines, but the second line includes the words in 'Windows 10'.">
                <figcaption>Figure 1. Without CSS Balance enabled.</figcaption>
              </figure>

              <figure>
                <img src="https://onlyrss.org/images/balance-after.webp" width="995" height="437" alt="A screenshot of 2 identical html cards, both include an image, a title, and a short description. In the card on the left the title is on 2 lines, but the second line only includes the word '10', in the second card, the title is also on 2 lines, but the second line includes the words in 'Windows 10'.">
                <figcaption>Figure 2.With CSS Balance enabled.</figcaption>
              </figure>

              <p>
                As you can see, CSS Balance has had an effect on the titles of all 3 cards. The effect is probably most beneficial on the first card, where the words "Product" and "Manager" belong together, and on the second card, where the words "progress" and "bars" benefit from being together.
              </p>
              <p>
                In total, 13 out of the 22 homepage cards have multiline titles, and each one of those multiline titles was altered when CSS Balance was enabled. 
              </p>

              <p>
                Where CSS Balance is probably most beneficial is in stopping scenarios like that shown below in Figure 3, i.e. where a single number has appeared on a line by itself. Although to be fair, a non-breaking space should probably have been used in this scenario to keep "Windows" and "10" together.
              </p>

              <figure>
                <img src="https://onlyrss.org/images/balance.webp" width="698" height="430" alt="A screenshot of 2 identical html cards, both include an image, a title, and a short description. In the card on the left the title is on 2 lines, but the second line only includes the word '10', in the second card, the title is also on 2 lines, but the second line includes the words in 'Windows 10'.">
                <figcaption>Figure 3. Without CSS Balance (left), and with CSS Balance (right).</figcaption>
              </figure>
              <h3>
                Article titles (Desktop)
              </h3>
              <p>
                I use a wider article page layout compared to the majority of blogs i.e. 840px, and I don't tend to use very long article titles. Because of this, my article titles typically only span a single line, and therefore CSS Balance has no effect when viewing my articles on a typical desktop.
              </p>


              <h3>
                Article titles (&lt;Desktop)
              </h3>
              <p>
                Once you view articles on something narrower than a typical desktop display, the situation is very different.
              </p>

              <figure>
                <img src="https://onlyrss.org/images/15-million-no-balance.gif" width="684" height="139" alt="A screenshot of 2 identical html cards, both include an image, a title, and a short description. In the card on the left the title is on 2 lines, but the second line only includes the word '10', in the second card, the title is also on 2 lines, but the second line includes the words in 'Windows 10'.">
                <figcaption>Figure 4. Without CSS Balance.</figcaption>
              </figure>

              <p>
                In Figure 4 above, where CSS Balance is NOT enabled, we see that as the viewport width is reduced, the last word on the first line simply drops to a new line, as you would expect. This is a good example of why CSS Balance is useful, without it "meters" becomes disconnected from "million", which then becomes disconnected from "15".
              </p>

              <p>
                With CSS Balance enabled (Figure 5 below), there is far less movement of the title as the viewport width is reduced, and the phrase "15 million meters" remains together.
              </p>


              <figure>
                <img src="https://onlyrss.org/images/15-million-balance.gif" width="684" height="139" alt="A screenshot of 2 identical html cards, both include an image, a title, and a short description. In the card on the left the title is on 2 lines, but the second line only includes the word '10', in the second card, the title is also on 2 lines, but the second line includes the words in 'Windows 10'.">
                <figcaption>Figure 5. With CSS Balance.</figcaption>
              </figure>

            </section>

            <section>
              <h2>Summary</h2>
              <p>
                So, should you enable CSS Balance on your website? Yeah, why not, it's literally 1 line of CSS. It's easy to enable it for your website (you'll need to try it in a canary build of Google Chrome) and then see if you like the effects. I'll be leaving it enabled on onlyrss.org, and will wait for browsers to add support.
              </p>
            </section>

            <article>
          ]]>
      </description>
    </item>



            <!-- 10 benefits of RSS for Product Managers -->
    <item>
      <guid isPermaLink="false">article24</guid>
      <title>10 benefits of RSS for Product Managers</title>
      <link>https://onlyrss.org/posts/10-benefits-of-rss-for-product-managers.html</link>
      <pubDate>Sun, 02 Apr 2023 11:30:00 GMT</pubDate>
      <description>
        <![CDATA[
          <article>
          <section>
              <h2>The benefits</h2>
                <p>
                  RSS can be a valuable tool for Product Managers. It allows them to stay up to date on industry news and trends, track competitors, and better understand their customers. If you're new to RSS, then see my previous article: <a href="../posts/rss-part-1.html" target="_blank">What is RSS and what are aggregators?</a>
                </p>
                <p>
                  In the list below I summarise 10 benefits (if humans had 8 digits, I'd have only listed 8) for Product Managers.
                </p>

                <h3>1. Stay up to date with technology trends</h3>
                  <p>
                    RSS feeds can deliver the latest emerging technology trends to your RSS aggregator without having to scour the web. This can help you stay ahead of the curve and make you aware of new technologies that could be leveraged to improve your existing products—or enable entirely new products.
                  </p>
                <h3>2. Identify new opportunities</h3>
                  <p>
                    RSS feeds can also be a great way to identify new opportunities. By reading about the latest news and trends in your industry, you can better identify industry specific problems early, and therefore start the product discovery process before your competitors.
                  </p>
                <h3>3. Monitor your competitors</h3>
                  <p>
                    RSS feeds can also be used to track your competitors' activities. This can help you identify new trends, see what features they're adding to their products, and get a sense of their overall strategy.
                  </p>
                <h3>4. Understand your customers</h3>
                  <p>
                    RSS feeds can also be used to listen to your customers. By subscribing to your customers' websites, social media platforms etc. you can get a sense of their needs and pain points, and better understand their future strategy. This information can be invaluable for making decisions about your product roadmap.
                  </p>
                <h3>5. Know your tools</h3>
                  <p>
                    Subscribe to product blogs in order to be aware of the latest enhancements to tools often used by Product Managers e.g. Microsoft 365, Jira, Confluence, Feedly, Aha!, Figma etc. Some of these tools (Microsoft 365?), might also be the same tools that your customers use. Can your product take advantage of upcoming enhancements e.g. integration with MS Teams?
                  </p>
                <h3>6. Monitor the effect of your go-to-market activities</h3>
                  <p>
                    RSS can be used to monitor websites for any mention of recent go-to-market activities. Set up keyword search alerts related to the specific product (or product enhancement) you've launched and have any mentions delivered directly to your RSS aggregator.
                  </p>
                <h3>7. Monitor any mentions of your product</h3>
                  <p>
                    It's always good practice to have keyword search alerts setup for your portfolio of products. Whenever one of your products is mentioned online (news, blogs, forums etc.) you can be alerted via RSS. Many RSS aggregators will also make it easy to share this insight with your colleagues either via a custom RSS feed, or via an email newsletter. 
                  </p>
                <h3>8. Monitor any mentions of your brand</h3>
                  <p>
                    Similar to №7, but for your brand. i.e. set keyword search alerts for any mention of your brand.
                  </p>
                <h3>9. Add RSS to your products</h3>
                  <p>
                    RSS is not only a technology that can be used to make you a better Product Manager, but also a technology that can be added to your products. Do you have a product blog? If so, does it support RSS? Do your products include a news or alerting feature? If so, can this be implemented via RSS?
                  </p>
                <h3>10. Save time</h3>
                  <p>
                    It's possible that as a Product Manager you're already doing many of the things listed above—but without the help of RSS. If so, then using RSS can save you a great deal of time. That's really the main benefit of RSS. Visiting multiple websites to check for updates is time consuming and inefficient. Using RSS to have these updates delivered to you and made available in a single application is fast and efficient. 
                  </p>

            </section>

            <!-- feedback -->
            <footer>
              <p>
                If you have any comments on this article then please get in touch via <a href="https://twitter.com/dbs_sticky" title="My Twitter profile" target="_blank">Twitter</a> or <a href="https://mastodon.social/@DBSSticky#" title="My Mastodon profile" target="_blank">Mastodon</a>.
              </p>
            </footer>

          </article>
                ]]>
      </description>
    </item>


            <!-- html and css table -->
    <item>
      <guid isPermaLink="false">article23</guid>
      <title>HTML and CSS table with progress bar and percentage</title>
      <link>https://onlyrss.org/posts/table-with-progress-indicator.html</link>
      <pubDate>Sun, 05 Mar 2023 11:30:00 GMT</pubDate>
      <description>
        <![CDATA[
      <section>
        <h2>Background</h2>
          <p>
            I recently created my first HTML tables for my <a href="../posts/learning-log-2022.html" title="Read the 'Learning Log 2022' article">Learning Log 2022 article</a>. Each row in the table was a course or book I had used during the previous year, and I wanted to add a progress indicator within the rows to show my progress. It took some effort to get the tables looking and functioning the way I wanted (mostly due to declaring the progress variable in the HTML and not the CSS) so I thought the solution was worth sharing.
          </p>
          <p>
            The difference between the table shown below and those used in my previous article is the inclusion of the percentage value. That required a little hack that takes advantage of <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Counter_Styles/Using_CSS_counters" title="Read about CSS Counters at mozilla.org.">CSS Counters</a>.
          </p>

        <h2>The result</h2>
          <p>
            An image of the table is included below. You can visit <a href="https://codepen.io/dbssticky/pen/XWPWGzm" Title="View and edit the table in CodePen">CodePen</a> to see (and edit) the table and view the HTML & CSS. The CodePen version includes some helpful comments in the CSS.
          </p>

          <img src="https://onlyrss.org/images/og/html-table-og.png" alt="">

      </section>

          <br>

      <section>
        <h2>Notes and code</h2>
          <p>
            The tags in the first column are added via ::before pseudo-elements.
          </p>
          <p>
            The second column will use an ellipsis when the text is too long for the column (there's a special place in Hell for people who build tables with unequal row-heights).
          </p>
          <p>
            For the third column, the percentage progress for each row is declared in the HTML as a <a href="https://www.w3schools.com/css/css3_variables.asp" title="Read about CSS Variables at W3Schools.">CSS Variable</a>. This is then used to set the progress bar length, and also the percentage text. If the percentage is equal to 100%, then the text is swapped for a “✓” and the progress bar colour is changed to green. 
          </p>
          <p>
            To show the percentage value alongside the progress bar (without including it as separate text in the HTML or CSS) I define a CSS counter-reset and set it to the progress variable. I then use the ::before element where the content is set to the CSS counter value (nothing has been “counted”, so this is equal to the counter-reset i.e. the progress variable). It's a bit of a hack that allows me to get a CSS Variable displayed as text on the page.
          </p>

      </section>

      <!-- feedback -->
      <footer>
        <feedback-contact></feedback-contact>
      </footer>

    </article>
                ]]>
      </description>
    </item>



        <!-- air india putting their recent order into context -->
    <item>
      <guid isPermaLink="false">article22</guid>
      <title>Air India: putting their recent order into context</title>
      <link>https://onlyrss.org/posts/the-air-india-order.html</link>
      <pubDate>Tue, 21 Feb 2023 11:30:00 GMT</pubDate>
      <description>
        <![CDATA[

    <article>
      <section>
        <h2>Putting the numbers into context</h2>
          <p>
            A lot of articles have been written recently that discuss Air India's record-breaking order of new Airbus and Boeing aircraft. Many articles have not however mentioned the size and breakdown of Air India's current fleet.
          </p>
          <p> 
            I thought I'd try and reuse the same data visualisation (the isotype chart) from my <a href="../posts/top-25-pax-airlines.html">previous blog post</a> and create a new isotype chart for Air India that attempts to compare their current fleet alongside their recent order.
          </p>
          <p>
            Before we get to the chart, just a quick note on the order itself. Strictly speaking, it's not what would be referred to as a firm-order. Air India have signed a Letter of Intent (LoI), this is defined below:
          </p>

          <p>
            <strong>Letter of Intent:</strong> a written document stating that a customer agrees in principle to purchase aircraft from a manufacturer at a given price and for a given quantity, sometimes including an approximate delivery schedule. However, a deposit has not been paid and the buyer has not fully committed to the purchase as they are still able to walk away from the deal. Thus, the manufacturer cannot guarantee the delivery slots until the finer details of the purchase agreement are negotiated and agreed upon. Once the purchase agreement is signed and a deposit paid, the LoI is converted to a firm-order.
          </p>
          <h3>The chart</h3>
          <p>
            Whenever the media quote a number or a statistic, you should always ask yourself one question i.e. Is this a big number? (Or, in some cases, is this a small number?). Well, when it comes to the Air India Letter of Intent… yes, it's a really big number!
          </p>


      </section>

        <div class="paper">

          <div class="chart-title">
            Air India's fleet
          </div>

          <div class="chart-description">
            <div>
              Solid colours reflect their current fleet i.e. in-service, stored, and firm-orders (there are just 5 aircraft on firm-order).<br>
              Faded colours reflect the aircraft currently on Letter of Intent (LoI).<br>
              <p>
              They have a current fleet of <mark>126</mark> aircraft, the current fleet plus the LoI fleet is <mark>596</mark> aircraft. That's an increase of <mark>373%</mark>.
              <p>
            </div>
          </div>

            <div>
          <img src="../images/air-india-rss.webp">
            </div>

      <section>
        <h2>The data source</h2>
        <p>
          Data was sourced from Cirium's <a href="https://www.cirium.com/solutions/fleets-analyzer/" title="view the marketing page for Fleets Analyzer">Ascend Fleets Analyzer</a>. Current fleet includes in-service, stored/parked, and aircraft on firm order. Data was captured on 19 February 2023.
        </p>
      </section>

      <!-- feedback -->
      <footer>
        <feedback-contact></feedback-contact>
      </footer>

    </article>

    <!-- related articles -->
    <aside>
      <h1>related articles</h1>
      <a href="../posts/top-25-pax-airlines.html">
        <h2>Infographic: The world's largest 25 airlines</h2>
        <p>
          A 'small-multiples isotype infographic' that shows the world's top 25 passenger airlines, broken down by aircraft manufacturer.
        </p>
      </a>
    </aside>

  </body>

                ]]>
      </description>
    </item>
    <!-- Infographic: 25 largest passenger airlines -->
    <item>
      <guid isPermaLink="false">article21</guid>
      <title>Infographic: 25 largest passenger airlines</title>
      <link>https://onlyrss.org/posts/top-25-pax-airlines.html</link>
      <pubDate>Sat, 4 Feb 2023 11:30:00 GMT</pubDate>
      <description>
        <![CDATA[

  <body>
    <article>
      <section>
        <h2>Background</h2>
        <p>
          Inspiration for this chart came from the recent infographic on <a href="https://www.visualcapitalist.com/top-25-fleets-of-combat-tanks/" title="view the article at Visual Capitalist">VisualCapitalist.com</a> which visualises the world’s top 25 fleets of combat tanks (they specifically state “combat” tanks, which intrigues me, are there tanks designed for the daily commute?).</p>
          <p> Their chart was a jpg, and I wanted to see if I could build something similar using HTML & CSS (without JavaScript or a charting library). I used a similar set of airline fleet data that I used for my <a href="https://onlyrss.org/posts/airbus-vs-boeing-charts.html" title="read my previous data viz article"> previous data viz article</a>.
          <p>
      </section>

      <section>
        <h2>The result</h2>
        <p>
          <strong>Note: If you are reading this in an RSS aggregator, then the HTML/CSS/JS version of the chart below has been replaced with a static image, to see the full version please <a href="https://onlyrss.org/posts/top-25-pax-airlines.html"> view the article at my blog</a>.</strong></p>
        <p>
         My 'small-multiples isotype infographic' (a very pretentious name for a chart that's full of tiny pictures of aircraft) was built using HTML, CSS, and just a little JavaScript.
        </p>
        <p>To display this page (not just the infographic) the browser requires 334&#8239;kB of resources (text, styles, images, fonts etc.), but due to the magic of text compression, only around 255&#8239;kB is actually transferred to the browser. On a good internet connection, page load times are around 200&#8239;ms. For comparison, the 'top 25 fleets of combat tanks' image is 920&#8239;kB, and when that image is loaded in their article page, 4.9&#8239;MB of resources are transferred to the browser!
        </p>
        <p>
          I've included details on how I built it and what I learnt along the way after the infographic—that information is strictly for nerds, or “normies” who are trying to fall asleep.
        </p>
      </section>

      <section>
        <p>
        <img width="1200px" src="https://onlyrss.org/images/25-largest-airlines-v2.png">
        </p>
       <span ><a href="https://onlyrss.org/images/25-largest-airlines-v2.png" style="color:firebrick" title="A hi-resolution PNG suitable for sharing or printing" download="">Click here to download this infographic as an image.</a></span>

        <h2>How it's built</h2>
        <h3>The isotype charts</h3>
        <p>
          There's nothing clever about the construction of the isotypes. Each chart is just a single &lt;div&gt; that contains between 1 and 3 &lt;span&gt; elements (one for each manufacturer). Each &lt;span&gt; then contains a series of aircraft glyphs e.g. <span class="ac-glyph">🛧🛧🛧🛧🛧</span>.
        </p>
        <h3>The aircraft glyph</h3>
        <p>
          Each tiny aircraft image is the <a href="https://www.compart.com/en/unicode/U+1F6E7" title="view this glyph">Up-Pointing Airplane Unicode glyph (&amp;#x1F6E7;)</a>, and there are 10,016 tiny aircraft in the chart! My first attempt at this chart used inline SVGs for the aircraft, it worked, but it wasn't very performant. It then hit me that I could simply use an aircraft Unicode glyph i.e. a font, and this solution worked on my desktop, but not on Android, where the aircraft glyph was replaced with squares.
          <p>
          It turned out my default font did not support the aircraft glyph, so I had to find one that did. I eventually settled on <a href="https://fonts.google.com/noto/specimen/Noto+Sans+Symbols+2" title="view this font on Google Fonts"> Noto Sans Symbols 2</a>. My only issue with this font was the size, i.e. it's >300&#8239;KB (it contained a lot of symbols). I then learnt about <a href="https://fontforge.org/en-US/" title="visit the Font Forge home page">Font Forge</a>, and I used this to remove all glyphs except for the aircraft, essentially creating a new single-glyph font file (3&#8239;KB, yeah!). 
        </p>
        <h3>Populating the isotypes</h3>
        <p>
          As mentioned above, 10,016 aircraft glyphs are used in the chart, and although I could have entered them into the HTML manually, I actually updated the dataset quite a few times while making the chart, and updating the number of aircraft for each airline (and manufacturer) would have been laborious. In order to make things easier, I decided to let JavaScript (and my friend, <a href="https://github.com/mendhak" title="view Mendhak's GitHub page">Mendhak</a>, help me out).
        </p>
        <p>
          The JavaScript function is a simple loop that adds a string of aircraft glyphs into a &lt;span&gt; element based on a number I enter i.e. the number of aircraft from each manufacturer for each airline.
        </p>
        <p>
          The JavaScript function:
        </p>
<pre>
  <code>
  function <b>drawAircraft(numAircraft)</b> {
    for (var i = 1; i <= numAircraft; i++) {     
      document.write('<span class="ac-glyph">🛧</span>');
    }
  }
  </code>
</pre>

        <p>
          The HTML source:
        </p>
<pre>
  <code>
  &lt;span class=&quot;airbus aircraft grey-fill&quot;&gt;      
    &lt;script&gt;<b>drawAircraft(40)</b>;&lt;/script&gt;
  &lt;/span&gt;
  </code>
</pre>

        <p>
          The HTML output (as viewed in the browser's Developer Console):
        </p>
<pre>
  <code>
  &lt;span class=&quot;airbus aircraft grey-fill&quot;&gt;
    &lt;script&gt;<b>drawAircraft(40)</b>;&lt;/script&gt;
    <span class="ac-glyph">🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧🛧</span>      
  &lt;/span&gt;
  </code>
</pre>

        <p>
          I could have used the function above to create the isotype charts, then viewed the HTML output, copied the resulting aircraft spans from the HTML output and into the source, and then removed the JavaScript (essentially pre-computing them all). And if this was the only use of JavaScript in the page then that's what I would have done, but I had to resort JavaScript (and my friend <a href="https://github.com/mendhak" title="view Mendhak's GitHub page">Mendhak</a>, again) to build the 'Split by manufacturer' option, so I decided to leave this JavaScript in place.
        </p>
        <h3>Enabling the “Split by manufacturer” option</h3>
        <p>
          I placed a "grey-fill" style in the HTML head (which sets the aircraft font colour to grey) and applied it to all the aircraft spans. When the 'Split by manufacturer' option is ticked, this style is removed, and the manufacturer colours (defined in the CSS) are then visible. 
        </p>
        <h3>The airline tailfins</h3>
        <p>
          Each airline tailfin is an SVG. Most were created from scratch in Figma (some were modified from existing SVGs kindly sent to me by another nerd friend i.e. <a href="https://github.com/pwrignall" title="view Paul's GitHub page">Paul</a>.</p>
        <p>
          There are no bitmap/raster images used in the chart (even the aircraft font is a vector at its core). If you use your browser's zoom feature, you can zoom in on the chart and you'll notice no loss in image quality (you'll also notice that each little aircraft is a wide-body four-engine jet). A screenshot of the zoomed in isotype chart for Alaska Airlines is shown below.
        </p>
        <img src="https://onlyrss.org/images/iostype-alaska-closeup.png" width="746" height="583" alt="A closeup image of the isotype chart for Shenzhen Airlines. At the top-center of the image is the Shenzhen Airlines logo, followed by their name and position in the top-25 i.e. 24th. Below the airline name is a grid of 198 small aircraft glyphs. 116 of them are coloured for Airbus, and 82 are coloured for Boeing.">
      </section>

      <section>
        <h2>What I learnt</h2>
        <h3>How to remove unwanted glyphs from a font file</h3>
        <p>
          This is going to come in handy. The largest resources loaded for the majority of my pages are the font files, and I've always wanted to reduce the size of the files by removing glyphs I know I'm never going to use. I didn't know of an easy way to do this until I came across this <a href="https://www.grantojanen.com/videos/pg/optimize-fonts.html" title="view Grant Ojanen's tutorial">guide</a> (and then downloaded the free and open source software '<a href="https://fontforge.org/en-US/" title="view the Font Forge home page">Font Forge</a>'). 
        </p>
        <h3>Line breaks in HTML do matter (but only sometimes)</h3>
        <p>
          I was under the misguided assumption that line breaks in HTML had no effect on what was rendered in the browser. For the isotope charts where an airline had aircraft from more than a single manufacturer, this required multiple &lt;span&gt; elements, one for each manufacturer. In my code these were each separated by a line break. Unknown to me this placed a small space between the &lt;span&gt; elements' rendered output, which meant that the aircraft glyphs in the isotype charts were not forming a regular grid. The solution was to simply place the &lt;span&gt; elements on a single line. You can see this on this <a href="http://jsfiddle.net/jgvLn0c8/"> JSFiddle</a>.
        </p>
        <h3>You can define your inline SVG's path in your CSS… but not in Safari!</h3>
        <p>
          In the first version of this infographic, I used an inline SVG for the aircraft glyph, but that meant repeating the SVG 10,016 times in the HTML. I was therefore very pleased to discover that the SVG's path could be pulled out of the inline SVG and instead <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/path" title="view the 'path()' definition page at MDN docs"> defined in the CSS</a>. I was then very unpleased to discover that this was <a href="https://caniuse.com/mdn-svg_elements_path_d_path" title="view the browser support for 'SVG Element Path'"> not supported in Safari!</a>
        </p>
      </section>

      <section>
        <h2>The data source</h2>
        <p>
          All data was sourced from Cirium's <a href="https://www.cirium.com/solutions/fleets-analyzer/" title="view the marketing page for Fleets Analyzer">Ascend Fleets Analyzer</a>. Airline fleets include only stored (AKA parked) or in-service passenger aircraft. Data was captured on 26 January 2023.
        </p>
      </section>
      <!-- feedback -->
      <footer>
        <p>
          If you have any comments on this article then please get in touch via Twitter (<a href="https://twitter.com/dbs_sticky" title="My Twitter profile" target="_blank">@dbs_sticky</a>).
        </p>
      </footer>
    </article>
  </body>
                ]]>
      </description>
    </item>

<!-- Airbus vs Boeing: An experiment in charting -->
    <item>
      <guid isPermaLink="false">article20</guid>
      <title>Airbus vs Boeing: An experiment in charting</title>
      <link>https://onlyrss.org/posts/airbus-vs-boeing-charts.html</link>
      <pubDate>Tue, 20 Dec 2022 11:30:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>
          <section>
            <h2>Background</h2>
            <p>
            Inspiration for the first chart came from the recent infographic on <a href="https://www.visualcapitalist.com/cp/visualizing-country-smoking-population/" target="_blank">VisualCapitalist.com</a> which displays the share of men versus the share of women among smokers (across the world's 50 most populous countries).
            <p>
            Their chart was an embedded image. I wanted to see if I could build a similar chart using HTML & CSS. I'm sure there are charting libraries that would let me build something similar, but I wanted full control of the design, and more importantly, I wanted to test my knowledge of CSS.
            </p>
          </section>

          <section>
            <h2>The result</h2>
            <p>
            The result is the first chart shown below. In the chart, the vertical axis is used to show the airline's total fleet size (in-service and stored passenger aircraft only), and the horizontal axis shows the percentage split between Boeing and Airbus. The chart is sorted descending by total fleet size.
            </p>
            <p>
              If the chart were to be rotated 90° and the elements shared a common baseline, then it would be a <a href="https://en.wikipedia.org/wiki/Mosaic_plot" target="_blank">mosaic plot (or a Marimekko chart).</a>
            </p>

            <div class="paper">
              <div class="chart">

              <!-- RSS REPLACEMENT FOR THE CSS VERSION OF THE CHART -->
              <img src="https://onlyrss.org/images/rss-chart-1.webp" alt="chart showing the percentage of airbus vs boeing aircraft for the top ten airlines" width="876" height="1128">
              <p>If you are reading this in an RSS client, then you'll need to visit the original article to see the original CSS version of the above chart</p>

              </div>
            </div>


            <p>
              The first, skeleton version of the chart was done in about an hour – and I won't lie, I was very proud of myself. It then took me many hours (<em>okay, okay, days</em>) and three iterations to get to the finished version.
            </p>
            <p>
              It's all built using <a href="https://css-tricks.com/wp-content/uploads/2022/02/css-flexbox-poster.png" target="_blank">CSS Flexbox</a>, which, as the name suggests, is very… flexible, so there is often more than one way to achieve similar results. Multiple iterations were required as my first version only worked on desktop and tablets, not on mobile ie, it wasn't <a href="https://www.w3schools.com/html/html_responsive.asp" target="_blank">responsive</a>.
            </p>
            <p>
              The chart above looks okay, and might be suitable as an infographic, but I wouldn't add it to a report, and as a product manager I wouldn't include it in any of my analytics products. For that, I'd probably stick with the ubiquitous stacked column chart.
            </p>
          </section>

          <section>
            <h2>An alternative</h2>

              <p>
                A stacked column chart version using the same data is shown below. This was far easier to create than the chart above.
            </p>
            <div class="paper">

              <div class="bar-chart">

              <!-- RSS REPLACEMENT FOR THE CSS VERSION OF THE CHART -->
              <img src="https://onlyrss.org/images/rss-chart-2.webp" alt="chart showing the percentage of airbus vs boeing aircraft for the top ten airlines" width="866" height="641">
              <p>If you are reading this in an RSS client, then you'll need to visit the original article to see the original CSS version of the above chart</p>

              </div>
            </div>

              <p>
                It's not as visually interesting, but it is more informative. For example, it's easier to gauge the relative differences between the total fleet sizes.
              </p>
              <p>
                It's still not quite what I'd add to a report or in one of my products. To get to that point I'd replace the logos with names, and rotate it through 90° (so it becomes a bar chart), this would let me use horizontal text labels for the airlines' names.
              </p>

          </section>

          <section>
            <h2>The data source</h2>
            <p>
              All data was sourced from Cirium's <a href="https://www.cirium.com/solutions/fleets-analyzer/" target="_blank">Ascend Fleets Analyzer</a> (one of the products for which I am responsible). Airline fleets include only stored (AKA parked) or in-service Boeing or Airbus passenger aircraft (freighters were not included). Data was captured on 19 December 2022 using the search criteria shown in the screenshot below.
            </p>
            <figure>
              <img src="https://onlyrss.org/images/top-ten.webp" width="840" height="529" alt="A screenshot from Cirium's Ascend Fleets Analyzer showing search filters and a table of results.">
              <figcaption>
                A screenshot from Cirium's Ascend Fleets Analyzer showing the search used to generate the data for the charts on this page
              </figcaption>
            </figure>
          </section>

          
          <!-- feedback -->
          <footer>
            <p>
              If you have any comments on this article then please get in touch via Twitter (<a href="https://twitter.com/dbs_sticky" title="My Twitter profile" target="_blank">@dbs_sticky</a>).
            </p>
          </footer>

        </article>

        </body>
        ]]>
      </description>
    </item>

<!-- Learning Log 2022 -->
    <item>
      <guid isPermaLink="false">article19</guid>
      <title>Learning Log: 2022</title>
      <link>https://onlyrss.org/posts/learning-log-2022.html</link>
      <pubDate>Sat, 10 Dec 2022 11:30:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>
          <article>
            <!--Goals-->
            <section>
              <h2>2022 goals</h2>
              <p>
                My primary learning goal for 2022 was to gain a deeper understanding of the online presentation of unstructured content.
              </p>
              <p>
                In addition to understanding the basics, I also wanted to be able to put what I had learnt into practice. This required the continuation of my deep dive into HTML & CSS, and a total redesign and rebuild of this website—with a focus on typography and speed.
              </p>
              <p>
                In addition to my primary goal, I also made a start on the understanding, querying, and manipulation of structured data, as this will be my focus for 2023.
              </p>
              <p>
                Below is a list of the resources I used during 2022 to help me achieve my learning goals  (&#9733; = highly recommended).
              </p>
            </section>

            <!--Typography-->
            <section>
              <h2>Resources</h2>
              <h3>Typography</h3>

              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><span class="learning-format book"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://practicaltypography.com/" target="_blank">Practical Typography</a>&nbsp;&#9733;</td>
                  </tr>
                  <tr>
                    <td><span class="learning-format book"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://www.amazon.co.uk/Elements-Typographic-Style-Version-4-0/dp/0881792128" target="_blank">The Elements of Typographic Style</a></td>
                  </tr>
                  <tr>
                    <td><span class="learning-format book"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://betterwebtype.com/web-typography-book/" target="_blank">Better Web Type</a>&nbsp;&#9733;</td>
                  </tr>
                  <tr>
                    <td><span class="learning-format book"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://blog.typekit.com/2016/04/29/combining-typefaces-free-guide-to-great-typography/" target="_blank">Combining typefaces</a></td>
                  </tr>
                  <tr>
                    <td><span class="learning-format course"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://fonts.google.com/knowledge">Google’s ‘Font Knowledge’</a></td>
                  </tr>
                </tbody>
              </table>
            </section>

            <!--HTML and CSS-->
            <section>
              <h3>HTML & CSS</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><span class="learning-format course"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://www.theodinproject.com/" target="_blank">The Odin Project (only the HTML & CSS parts)</a></td>
                  </tr>
                  <tr>
                    <td><span class="learning-format course"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://www.internetingishard.com/" target="_blank">Interneting is hard!</a>&nbsp;&#9733;</td>
                  </tr>
                  <tr>
                    <td><span class="learning-format tutorial"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://www.joshwcomeau.com/css/interactive-guide-to-flexbox/" target="_blank">An Interactive Guide to Flexbox</a>&nbsp;&#9733;</td>
                  </tr>
                </tbody>
              </table>
            </section>

            <!--Data Viz-->
            <section>
              <h3>Data visualisation</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><span class="learning-format book"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://www.amazon.co.uk/Better-Data-Visualizations-Scholars-Researchers/dp/0231193114/" target="_blank">Better Data Visualizations</a></td>
                  </tr>
                  <tr>
                    <td><span class="learning-format book"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://www.amazon.co.uk/dp/B00E8W7NGA/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1" target="_blank">Cartographies of time</a></td>
                  </tr>
                </tbody>
              </table>
            </section>
            
            <!--Misc-->
            <section>
              <h3>Miscellaneous</h3>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><span class="learning-format video"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://www.youtube.com/watch?v=D56hs0Twfco" target="_blank">Figma Web Design Tutorial</a></td>
                  </tr>
                  <tr>
                    <td><span class="learning-format course"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://skills.github.com/" target="_blank">GitHub Skills</a></td>
                  </tr>
                  <tr>
                    <td><span class="learning-format course"></span></td>
                    <td class="progressbar" style="--progress: 100%"><a href="https://www.nngroup.com/articles/ux-writing-study-guide/" target="_blank">UX writing guide</a></td>
                  </tr>
                </tbody>
              </table>
            </section>

            <!--manipulating data-->
            <section>
              <h3>Understanding, querying, and exploring data (2023 goals)</h3>
              <p>Planned and in progress</p>
              <table class="learning-log">
                <thead>
                  <tr>
                    <th>Format</th><th>Resource</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td><span class="learning-format course"></span></td>
                    <td class="progressbar" style="--progress: 15%"><a href="https://www.linkedin.com/learning/paths/become-a-data-analyst" target="_blank">LinkedIn's ‘Become a data analyst’</a></td>
                  </tr>
                  <tr>
                    <td><span class="learning-format course"></span></td>
                    <td class="progressbar" style="--progress: 26%"><a href="https://www.w3schools.com/sql/default.asp" target="_blank">W3School's ‘SQL tutorial’</a></td>
                  </tr>
                  <tr>
                    <td><span class="learning-format book"></span></td>
                    <td class="progressbar" style="--progress: 5%"><a href="https://dbeaver.com/doc/dbeaver.pdf" target="_blank">DBeaver User Manual</a></td>
                  </tr>
                  <tr>
                    <td><span class="learning-format course"></span></td>
                    <td class="progressbar" style="--progress: 1%"><a href="https://learn.microsoft.com/en-us/certifications/exams/pl-300" target="_blank">PL-300: Power BI Data Analyst</a></td>
                  </tr>
                </tbody>
              </table>
            </section>

            <!-- feedback -->
            <footer>
              <p>
                If you have any comments on this article then please get in touch via Twitter (<a href="https://twitter.com/dbs_sticky" title="My Twitter profile" target="_blank">@dbs_sticky</a>).
              </p>
            </footer>

          </article>
        </body>
        ]]>            
      </description>
    </item>

<!-- zoom and enhance -->
    <item>
      <guid isPermaLink="false">article18</guid>
      <title>Zoom and enhance!</title>
      <link>https://onlyrss.org/posts/zoom-and-enhance.html</link>
      <pubDate>Sun, 02 Sep 2022 11:30:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>
            <!--introduction-->
            <section>
              <h2>Background</h2>
              <p>If you are reading this in an RSS reader, although the full article is included below, the source article has a better comparison of the original and restored photos which cannot be replicated here (as it uses JavaScript)</p>
                <p>"Zoom and enhance!" is a <a href="https://knowyourmeme.com/memes/zoom-and-enhance"> movie trope</a> that has long infuriated anyone who has even the most basic understanding of what is (and isn't) possible when manipulating images. In the past I often found myself shouting at the TV, “You can't recover information that was never there!”. It turns out that for movies and TV shows set before 2022 my outbursts were justified, but for those set during or after 2022, it's starting to look like I was very wrong.</p>
                <blockquote>
                  <q>Zoom and enhance!</q><br>
                  — Rick Deckard (and every character from CSI)
                </blockquote>
                <p>With recent advances in AI—especially with regard to image interpretation, manipulation, and generation—a few new tools have become available online that remove a lot of the skill that was previously required to enhance and colourise old black & white, or colour degraded photos.</p>
                <p>Below I provide links to 2 such AI tools and include 5 examples of old family photos that I've restored using them. I've also taken a recent colour photo, degraded it, and then used the same tools to see how the “restored” version compares with the unaltered original.</p>
            
            <!-- Tools - section -->
            <section>
              <h2>The restoration tools</h2>
                <ul>
                  <li>For the <strong>face enhancement</strong> I’ve been using the <a href="https://www.baseten.co/gallery/photo-restoration-gfp-gan">Baseten application</a> that uses the <a href="https://xinntao.github.io/projects/gfpgan">GFP-GAN algorithm</a>. </li>
                  <li>For the <strong>colourisation</strong> I’ve been using the <a href="https://palette.fm/">Palette.fm online app</a>.</li>
                </ul>
            </section>

            <!-- Examples - section -->
            <section>
              <h2>Examples</h2>
              <p> Below are 5 examples using my own family photographs that date between 1920 and 1979. Figures 1, 3, and 5 were originally black & white. While Figure 2 was originally colour, but the colour has degraded considerably and now has a very strong red cast. Figure 4 is a duotone. Each photo was digitised by scanning the original print (not the negative).
              </p>
            </section>

              <figure>
                <img img src="../images/mark-before.webp" width="1920" height="1080" alt="Two young boys on a ladybird ride." ><br>
                <img img src="../images/mark-after.webp" width="1920" height="1080" alt="Two restyored photograph of young boys on a ladybird ride." >
                <figcaption>Figure 1. Original (top), restored (bottom). My brother (right) and me (left) riding a ladybird carousel, circa 1979.</figcaption>
              </figure>

              <figure>
                <img src="../images/glyn-before.webp" width="1080" height="1080" alt="A red cast image of a young boy and his grandfather." ><br>
                <img src="../images/glyn-after.webp" width="1080" height="1080" alt="A restored photo of a young boy and his grandfather." >
                <figcaption>Figure 2. Original (top), restored (bottom). My brother and paternal grandfather (aka <abbr title="A colloquial Welsh language word from South Wales meaning 'grandfather'">bampi</abbr>), circa 1975. <a href="https://www.google.com/maps/@51.6381811,-3.9624138,3a,75y,75.9h,90.86t/data=!3m6!1e1!3m4!1s5sIMcZvsdQLfuNUpn0LpZQ!2e0!7i16384!8i8192" target="_blank">2 Torrington Rd, Gendros, Swansea, UK</a></figcaption>
              </figure>

              <figure>
                <img src="../images/rita-before.webp" width="1080" height="1920" alt="A young girl and her monther in black and white." ><br>
                <img src="../images/rita-after.webp" width="1080" height="1920" alt="A restored photograph of a young girl and her monther in black and white." >
                <figcaption>Figure 3. Original (top), restored (bottom). My mom and her mother, circa 1949.</figcaption>
              </figure>

              <figure>
                <img src="../images/edith-original.webp" width="1000" height="1000" alt="A portrait photograph of a girl in her early twenties. The image is a duotone photograph and is out of focus." ><br>
                <img src="../images/edith-restored.webp" width="1000" height="1000" alt="A restored portrait photograph of a girl in her early twenties." >
                <figcaption>Figure 4. Original (top), restored (bottom). Edith Lilian Evans (nee Mabbett, born 1899), my great-grandmother, circa 1920.</figcaption>
              </figure>


              <figure>
                <img src="../images/gillian-original.webp" width="1000" height="756" alt="A black and white photograph of a baby in a bathtub located in a garden." ><br>
                <img src="../images/gillian-restored.webp" width="1000" height="756" alt="A restored photograph of a baby in a bathtub located in a garden." >

                <figcaption>Figure 5. Original (top), restored (bottom).Gillian Heinson (my mom's cousin), circa 1947.</figcaption>
              </figure>

            </section>

            <!--My starting point-->
            <p>
              <h2>Are the results “real”?</h2>
              <p>
              The results in the examples above look amazing, but are they real? i.e. are they an accurate representation of the original photos’ subjects? We can't know for sure, as when restoring old photos the only source of truth we have are the old photos themselves. But what if we used a modern photo, removed the colour, and added a blur to the image in an attempt to make it look old? How closely would the results of face enhancement and colour restoration match the original image?</p>
              <p>For this experiment I used an image of the wife and me that was taken a couple of weeks ago. I then desaturated the image and applied a 2&#8239;px blur to remove enough of the details such that it started to look like the old photos in the examples above (actually, I think it looks worse).</p>
              <p>The original image is shown in Figure 6 below. The degraded and restored images are shown in Figure 7</p>
              <figure>
                <img src="../images/modern-original.webp" width="1000" height="1000" alt="A recent photo of my wife me.">
                <figcaption>Figure 6. The good lady her indoors, and me.</figcaption>
              </figure>
              <figure>
                <img src="../images/modern-2px-blur.webp" width="1000" height="1000" alt="The degraded version of the recent photo of my wife me."><br>
                <img src="../images/modern-2px-blur-face-colourised.webp" width="1000" height="1000" alt="The restored version of the degraded photo of my wife me.">
                <figcaption>Figure 7. A degraded modern image (top), and the results of the restoration process (bottom).</figcaption>
              </figure>
              <p> There are some pink flowers in the bush that should be green, and the face enhancement has decided to shave my beard off, but apart from that it's pretty good. Is it as good as the original? of course not. The key point here is that it's substantially better than the degraded image, and it's close enough to the original that it doesn't look like the faces or colour are "made up".
              </p>
            </section>

            <!-- summary - section -->
            <section>
              <h2>Conclusion</h2>
              <p>Some people might look at this type of AI photo restoration as some form of “distortion of the truth”, but I'd argue that an old faded black & white photograph is not the truth, it's a degraded version of the best “truth” that could be captured at the time. Does an AI  colourised photo represent a perfect reproduction of the true colour? no, but guess what—the world was never black & white either.
              </p>
              <p>I've always felt very disconnected from the people and events shown in old black & white photographs—even when they were my own family members—I didn’t understand how big the disconnect was until I saw the work of Marina Amaral, especially her <a href="https://marinamaral.com/portfolio/faces-of-auschwitz/">'Faces of Auschwitz'</a> project. Seeing those manually colourised photos made the events and people appear more real—which is extremely important given the events and people that they record.</p>
              <p>I'm sure that these AI photo restoration tools will soon become part of the many online photo libraries (such as Google Photos, Amazon Photos, and Microsoft's OneDrive), and I hope they do, as that will mean they are available to the general public and hopefully no specialised knowledge will be required.
            </section>

            <!-- feedback - section -->
            <section>
              <h2>Feedback</h2>
              <p>
                If you have any comments on this article then please get in touch via Twitter (<a
                  href="https://twitter.com/dbs_sticky" target="_blank">@dbs_sticky</a>).
              </p>
            </section>

            <!-- sharing - section -->
            <section class="sharing">
              <p>
                Share this article:
                <a href="https://x.com/intent/tweet?url=https://onlyrss.org/posts/zoom-and-enhance.html&text=Zoom%20and%20enhance&via=dbs_sticky"
                  target="_blank">Twitter </a>·
                <a href="http://www.linkedin.com/shareArticle?mini=true&url=https://onlyrss.org/posts/zoom-and-enhance.html&title=Zoom%20and%20enhance"
                  target="_blank"> LinkedIn </a>·
                <a href="mailto:?subject=OnlyRSS.org%20article:%20Zoom%20and%20enhance&body=https://onlyrss.org/posts/zoom-and-enhance.html"
                  target="_blank"> Email</a>
              </p>
            </section>

          </article>
        </body>
        ]]>            
      </description>
    </item>



    <!-- Adding screenshots to your PWA install experience -->
    <item>
      <guid isPermaLink="false">article17</guid>
      <title>My first JavaScript app</title>
      <link>https://onlyrss.org/posts/my-first-javascript-app.html</link>
      <pubDate>Sat, 11 Jun 2022 06:30:00 GMT</pubDate>
      <description>
        <![CDATA[
          <body>
            <article>
              <!--introduction-->
              <section>
                <h2>Background</h2>
                <p>I started to build this website in January 2021 with the aim of teaching myself HTML, CSS, and JavaScript. It's
                  now June 2022, and over the last few months I've been asking myself when I'm going to get around to JavaScript.
                </p>
                <p> Three days ago, while I was halfway through a circuit training session in my home-gym, I realised that since
                  starting circuit training (about a month ago) I'd been doing the same 6 exercises, and had not added anything
                  new. I was getting stuck in a routine, and decided that I needed to change it up a bit.</p>
                <p>Rather than create a new routine, or a selection of routines, I decided that it might be interesting if each
                  circuit session included a random selection of exercises. Up to this point my circuit training had consisted of
                  6 exercises, repeated for 3 circuits. I decided to create a long list of exercises that were practical for my
                  home-gym, and then pick 6 at random for each session. My rule would be simple, whatever was chosen for that
                  session—I had to do—even if it was exercises I disliked (yes, burpees).</p>
                <p>I could have just written the exercises down on bits of paper and picked them out of a hat, but I'm a nerd, so
                  “complex solutions to trivial problems” is a mantra I live by. My first thought was to use Excel (where
                  non-programming nerds do their data analysis), but then I realised that this was the excuse I
                  needed to start learning JavaScript.</p>
              </section>

              <!--My starting point-->
              <section>
                <h2>My starting point</h2>
                <p>
                  Like most people writing code, I started with a Google search, i.e. how to pick random elements from an array.
                  That search led me to <a href="https://jsfiddle.net/abdennour/oh3jL82j/"> this example on JSFiddle</a>. The
                  example shuffles an array of numbers, and then slices off the first "n" numbers from the array. It's this solution that forms the basis of the “app” that I ended up building.
                </p>

                <!-- summary - section -->
                <section>
                  <h2>The app</h2>
                  <p>I really want to call it a “programme”, but I feel that doing so puts me in a certain age category, so I'm
                    going to be cool and describe it as an “app”. It's very basic, you pick the number of exercises you
                    want, and then hit the 'create new workout' button, at which point you're presented with your chosen number of
                    exercises in the form of an ordered list.
                  </p>

                  <p><strong>To see the app in action, jump out of your RSS reader for a minute and visit the <a href="https://onlyrss.org/posts/my-first-javascript-app.html">article page</a>.</strong></p>

                  <p>
                    You can see my source code over at <a href="https://codepen.io/dbssticky/pen/MWQqXXE">CodePen</a>.
                  </p>
                  <h3>How it works</h3>
                  <p>The first thing that happens is that the max value of the slider input control is set to the array size i.e.
                    the total number of possible exercises. Once the button is pressed, the array order is randomised, and then the
                    current slider value is grabbed (i.e. the number of exercises the user has chosen) and that number of exercises is
                    read (in sequence) from the start of the randomised array. Any existing list items (exercises) are cleared from the front-end, and the new exercises are added to an ordered list and displayed to the user.</p>
                  <h3>Planned improvements</h3>
                  <ul>
                    <li>Make the app available on a page by itself which is hidden from the usual website navigation.</li>
                    <li>Add the hidden page link to the <a href="https://web.dev/app-shortcuts/">PWA app shortcuts</a>. (So I will
                      be able to quickly open the app on my phone, and it will look like a full-page app.) </li>
                    <li>Add some rules to tweak the randomised output, e.g. if output includes ring tricep-dips, don't also
                      include bench tricep-dips etc. Maybe using nested arrays?</li>
                  </ul>
                </section>

                <!--What I learnt-->
                <section>
                  <h2>What I learnt</h2>
                  <p>During the 3 days I spent working on the app (a couple of hours each day), I learnt:</P>
                  <ul>
                    <li>How to create a simple array</li>
                    <li>How to calculate the length of an array</li>
                    <li>How to get user input and set it as a variable</li>
                    <li>How to apply a variable to a HTML element's attribute</li>
                    <li>How to run a function on page load</li>
                    <li>How to pass an array into an Ordered List</li>
                    <li>That there's <a href="https://bost.ocks.org/mike/shuffle/compare.html">lots of different ways</a> to randomise using JavaScript</li>
                    <li>That ring tricep-dips are really hard!
                  </ul>


                </section>

                <!-- feedback - section -->
                <section>
                  <h2>Feedback</h2>
                  <p>
                    If you have any comments on this article then please get in touch via Twitter (<a
                      href="https://twitter.com/dbs_sticky" target="_blank">@dbs_sticky</a>).
                  </p>
                </section>
            </article>
          </body>
        ]]>            
      </description>
    </item>


     <!-- Adding screenshots to your PWA install experience -->
    <item>
      <guid isPermaLink="false">article16</guid>
      <title>Adding screenshots to your PWA install experience</title>
      <link>https://onlyrss.org/posts/adding-screenshots-to-your-pwa-install.html</link>
      <pubDate>Sat, 04 Jun 2022 11:30:00 GMT</pubDate>
      <description>
        <![CDATA[
          <body>
            <article>
              <!--introduction-->
              <section>
                <h2>Background</h2>
                  <p>During February 2022 OnlyRSS.org became a <a href="https://en.wikipedia.org/wiki/Progressive_web_application">Progressive Web App</a> (PWA). The plan wasn't really for anyone to install OnlyRSS on their mobile or desktop, it was for me to understand what was required to turn a website into a PWA—and the best way for me to understand that was to do it.</p>
                  <p>The Google Play and Apple App store are great places to discover new apps, and once you find an app that might be useful, you get to read a description and view some screenshots of the app before you decide to install. There is no convenient store for PWAs, so initial discoverability is still an issue. But, once a visitor does happen upon your PWA enabled website, and is prompted to install your PWA, there is now a solution for providing the visitor with screenshots and a description. And all that's required is a few new entries in the existing manifest file.  
              </section>

              <!--Solution-->
              <section>
                <h2>New Manifest file entries</h2>
                <p>Below you can see the required entries in the manifest file for the screenshots and description. Webp images are supported, so after capturing suitable screenshots, I'd recommend using a tool such as <a href= "https://compress-or-die.com/webp">CompressOrDie</a> and converting them to webp and compressing them as best you can (my images are all ≈40&#8239;KB each.)</p>
                    <pre><code>
            "screenshots":[
            {
              "src":"pwaicons/screenshot1.webp",
              "sizes": "485x1024",
              "type": "image/webp"
            },
            {
              "src":"pwaicons/screenshot2.webp",
              "sizes": "485x1024",
              "type": "image/webp"
            }
            ],
            "description": "Mark's blog of shower thoughts. Articles on productivity, Data Viz, HTML & CSS, software, hardware, and maybe even some fitness.",
                    </code></pre>
              </section>

              <!--result - section-->
              <section>
                <h2>Result</h2>
                <p>Once the new manifest entries have been added, when a visitor accesses your website on Chrome on Android (or Samsung Internet on Samsung devices,) in addition to being prompted to install your PWA, they will have the option to swipe-up on the install prompt and view your app description and screenshots [<span class="fig-ref">fig.&nbsp;1</span>]. The visitor can tap on the screenshots and view them full size.</p>
                  <figure>
                    <img src="../images/pwa-install.gif" width="400" height="711" loading="lazy"
                      alt="Animated GIF showing the user expanding the PWA install prompt on a mobile phone, and then being presented with the PWA description, and 2 screenshots.">
                    <figcaption>Improved PWA install prompt, showing description and screenshots on Chrome on Android. 
                    </figcaption>
                  </figure>

              <!-- compatibility - section -->
              <section>
                <h2>Compatibility</h2>
                <p>According to<a href="https://developer.mozilla.org/en-US/docs/Web/Manifest/screenshots#browser_compatibility"> mdn web docs</a>, app screenshots are supported in:
                  <ul>
                    <li>Edge on Desktop (≥88),</li>
                    <li>Chrome on Android (≥88), and</li>
                    <li>Samsung Internet on mobile(≥15.0).</li>
                  </ul>
                <p>I've tested them on Android, where they  work as advertised, <strong>but I had no luck getting them to work on Windows with Edge</strong>. I added additional screenshots to the manifest and set the <a href="https://developer.mozilla.org/en-US/docs/Web/Manifest/screenshots#browser_compatibility:~:text=The%20platform%20member%20can,specific%20application%20distribution%20platforms."> 'platform' member</a> to both 'wide', and 'windows', and neither resulted in the screenshots (or description) being visible. I've left those entries in my manifest file (in the hope that Edge/Chrome will support them in future,) they can be seen under the <a href="../manifest.json">"screenshots" section of my manifest file</a>.</p>
              </section>

              <!-- conclusions - section -->
              <section>
                <h2>Conclusions</h2>
                <p>
                  Adding screenshots and a description to your PWA is yet one more step in moving your app away from being “just a website” and towards being an “application”. It's easy to implement, and improves the installation experience for Android (and Samsung) visitors on mobile. I also suspect that in future, these app screenshots and description will start to surface in web search results (alongside an install prompt), and maybe even in app stores&#8239;&#129310;.
                </p>
              </section>

              <!-- feedback - section -->
              <section>
                <h2>Feedback</h2>
                <p>
                  If you have any comments on this article then please get in touch via Twitter (<a
                    href="https://twitter.com/dbs_sticky" target="_blank">@dbs_sticky</a>).
                </p>
              </section>
            </article>
          </body>
        ]]>            
      </description>
    </item>


    <!-- Automatically numbering figures using CSS counters -->
    <item>
      <guid isPermaLink="false">article15</guid>
      <title>Automatically numbering figures using CSS counters</title>
      <link>https://onlyrss.org/posts/auto-numbering-of-figures-with-CSS-counters.html</link>
      <pubDate>Mon, 30 May 2022 12:15:00 GMT</pubDate>
      <description>
        <![CDATA[
          <body>
            <article>
              <!--introduction-->
              <section>
                <h2>Background</h2>
                <p>For the first 13&nbsp;years of my career I worked as a research scientist for the Defence Evaluation and Research Agency (<a href="https://en.wikipedia.org/wiki/Defence_Evaluation_and_Research_Agency">DERA</a>, an agency of the UK's MoD). I worked on 3–5&nbsp;year projects covering a wide range of subjects. Even though the projects varied, they did all have one thing in common, i.e. one of the deliverables was always a report, and much like the <a href="https://youtu.be/Fy3rjQGc6lA">infamous TPS reports from Office Space</a>, the DERA reports also had to adhere to a strict format.</p>
                <p>One of those strict formats related to numbering, not just numbering of chapters, but sections, paragraphs, figures, and list items. Depending on how the document was structured, it was not unusual to have a list item with a number such as 2.1.2.15. Don't get me wrong, this convention was actually useful, if you were on page 50 and wanted to reference an item on page 5, the numbering made a lot of sense.</p>
                <p>As useful as numbering was for those DERA reports, it's not something I find myself missing when writing a blog post. But, I do still find myself numbering figures in blog posts, this is useful as I often reference the figures from within the body text.</p>
                <p>Anyone who has written a long report that requires any form of numbering knows that it's not something you should attempt to do manually—it has to be automated—otherwise you'll find yourself updating all the following chapters/sections/paragraphs etc. each time you insert a new one into the middle of the document.</p>
              </section>

              <!--heading-->
              <section>
                <h2>Solution</h2>
                  <p>There's no solution for this in HTML/CSS that's as convenient as the numbering and cross-referencing that's part of <a href="https://support.microsoft.com/en-us/office/create-a-cross-reference-300b208c-e45a-487a-880b-a02767d9774b">Microsoft Word</a>, but, there is a CSS solution that can at least handle the numbering part (but not the cross-referencing), and that solution is based on CSS Counters.</p>
                  <blockquote cite="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Counter_Styles/Using_CSS_counters">
                    CSS Counters are, in essence, variables maintained by CSS whose values may be incremented or decremented by CSS rules that track how many times they're used.<p>Source: mdn web docs</p>
                  </blockquote>
                  <p>To see a full description of CSS Counters and how they can be used, visit the CSS Counters page over at <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Counter_Styles/Using_CSS_counters">mdn web docs</a>. The use of CSS Counters below deals only with counting figures and displaying that count within the figure's caption i.e. the figcaption HTML element.</p>
                  <h3>Set the counter to zero</h3>
                    <p>First, we define a counter called "figures", and we set it to zero (it defaults to zero when reset), this goes in the body CSS declaration:</p>
                    <pre><code>body {counter-reset: figures;}</code></pre>
                  <h3>Increment the counter</h3>
                    <p>Then, we increment the counter for each figcaption element that's in the page, this goes in the figcaption CSS declaration:</p>
                    <pre><code>figcaption {counter-increment: figures;}</code></pre>
                  <h3>Display the current count</h3>
                  <p>Lastly, we display the current count of figcaptions within the figcaption CSS declaration. We do this by using the ::before pseudo selector. We place the figcaption count between the text "Figure" and ".", so we end up with something like "Figure 5.":</p>
                  <pre><code>figcaption::before {content: 'Figure ' counter(figures) '. ';}</code></pre>
                  <h2>Implementation example</h2>
                    <p>The screenshots below show the CSS used on OnlyRSS.org to display figcaptions, and the HTML used to generate figures 1 & 2.</p>
                    <figure>
                      <img src="../images/numbering-figures-css.png" width="793" height="259"
                        alt="A screenshot showing the figcaption CSS used on onlyRSS.org">
                      <figcaption>The CSS used on OnlyRSS.org to automatically number all figures.</figcaption>
                    </figure>
                    <figure>
                      <img src="../images/numbering-figures-html.png" width="793" height="200"
                        alt="A screenshot showing the figcaption HTML used to display figure 1 and figure 2.">
                      <figcaption>The HTML used on this page to display figures 1 & 2.</figcaption>
                    </figure>
                    <p>You'll notice from figure 2 above that the figcaption HTML elements do NOT include the text "Figure 1." or "Figure 2.", yet they are both visible in the figures' captions (well, they are on the main website, if you are reading this in an RSS aggregator it's possible you can't see them either!)</p>

              </section>

              <!--Issues-->
              <section>
                <h2>Issues with this solution</h2>
                  <p>Although the solution described above provides an easy method for automatically numbering figures within a page (actually, across all figures on a site that share the same style sheet,) it does have a couple of drawbacks:</p>
                  <h3>Cross-referencing</h3>
                    <p>One of the main reasons for numbering figures is so they can easily be referenced from within the article body e.g. "as you can see in figure 5". Although adding new figures into the article will not require you to manually update the figure numbers, you will still have to update any cross-references, as there's no link between the figure number and the cross-reference</p>
                  <h3>Accessibility</h3>
                    <p>Although this solution automatically adds "Figure #" in your figcaptions, it's important to note that anything added via the ::before or ::after pseudo selectors is NOT guaranteed to be available for reading aloud by screen readers (if you try and select the figcaption text above you'll notice that "Figure 1." cannot be selected.) But, I've read a couple of articles recently (<a href="https://jhalabi.com/blog/before-after-accessibility">here</a> and <a href="https://uselessdivs.com/blog/the-effect-of-css-on-screen-readers">here</a>) that seem to suggest that the majority of popular screen readers do in fact read ::before and ::after elements, even though they are not part of the <abbr title="Document Object Model">DOM</abbr>.</p>
              </section>

              <!-- feedback - section -->
              <section>
                <h2>Feedback</h2>
                <p>
                  If you have any comments on this article then please get in touch via Twitter (<a
                    href="https://twitter.com/dbs_sticky" target="_blank">@dbs_sticky</a>).
                </p>
              </section>
            </article>
          </body>
        ]]>            
      </description>
    </item>

    <!-- Loading images only when required -->
    <item>
      <guid isPermaLink="false">article14</guid>
      <title>Loading images only when (or if) they are needed</title>
      <link>https://onlyrss.org/posts/loading-images-only-when-they-are-needed.html</link>
      <pubDate>Mon, 4 Apr 2022 12:15:00 GMT</pubDate>
      <description>
        <![CDATA[
          <body>
            <article>
              <!--introduction-->
              <section>
                <p> I recently created a <a href="https://onlyrss.org/pages/subscribe.html">subscribe</a> page (which can be reached from the RSS link on the homepage). The aim was to create an easy way for users to copy the RSS feed URL (previously the link simply opened the RSS feed, which many users might have found confusing), and also gives some basic instructions on how to subscribe to OnlyRSS via two popular RSS aggregators i.e. Feedly and Inoreader. The Feedly and Inoreader instructions are both displayed as ordered lists, but I also wanted to include an animated GIF showing the subscription process for each app.</p>
              </section>

              <!--The problem-->
              <section>
                <h2>The problem</h2>
                <p>The problem I encountered was that each GIF was quite large (both in terms of page real estate and file size) and users who are already familiar with RSS probably wouldn't need to view the animations at all. In that sense, the animations are not essential to the page, but could be considered complementary to the ordered lists, furthermore, it's unlikely that a user would want to view the animation for both Feedly and Inoreader.</p>
                <p>Loading both animations would not only be wasteful (in terms of page resources), but given the large vertical size of each image, the first image (for Feedly) would push the second image and instructions (for Inoreader) below the fold, where they could potentially be missed by users entirely.</p>
                <p>What I wanted was to hide the animations from the user, and for the browser to hold-off downloading them until they were required (if at all). And I wanted this to be as seamless as possible i.e. I wanted to avoid modals and opening new tabs etc. And, of course, I wanted to avoid using JavaScript (because I don't know JavaScript.)</p>
              </section>

              <!--The solution-->
              <section>
                <h2>The solution</h2>
                <p>I've already used a non-JS method for hiding content until it's requested by the user on the <a href="https://onlyrss.org/pages/changelog.html">Changelog</a> page i.e. the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary">&lt;details&gt; and &lt;summary&gt; HTML elements</a>. So I decided to use these elements with the summary text of <i>Show me how</i>, which when clicked would display the contents of the &lt;details&gt; element i.e. the animated GIF. You can see this in action for a static image by clicking on the text below to display [<span class="fig-ref">fig. 1</span>].</p>
                <p>
                <details style="background-color:white; color:#3d74bd">
                <summary><b>Click here to see Figure 1</b></summary>
                <figure>
                  <img src="https://onlyrss.org/images/subscribecompare.webp" width="800" height="1059" alt=" ">
                  <figcaption>Figure 1. The original Subscribe page (left) alongside the final Subscribe page (right).</figcaption>
                </figure>
                </details>
                </p>
                <p> This solved the problem of the Feedly animation pushing the Inoreader animation and instructions below the fold, but it didn't help with page performance, as both animations were still being loaded by the browser.</p>

                <p>I'd previously used the image attribute <i>loading="lazy"</i> to improve page performance by letting the browser decide if an image needed to be loaded e.g. was the user close to scrolling to the part of the page that contained the image? I didn't expect this to influence images hidden within the &lt;details&gt; element—I was wrong. After applying <i>loading="lazy"</i> to both animations, they were no longer loaded by the browser until the user clicked on the summary text. This was exactly the solution I was after.</p>
                <p>With this solution in place the <a href="https://onlyrss.org/pages/subscribe.html">subscribe</a> page loads quickly—around 40ms—with all the content being above the fold, and the animations only loading if the user selects the relevant summary text.</p>
              </section>

              <!--Conclusion-->
              <section>
                <h2>Conclusions</h2>
                <p>
                  The solution I've described above is probably suitable for instructional pages where the reader would only be interested in one of many options e.g. Those explanation pages that show you how to perform some complex tasks in Excel but give you four versions of the solution, one for each recent version of Excel. In that type of scenario, hiding and delaying the load of any associated images makes a lot of sense, it condenses the page (so it looks more appealing) and improves page performance.  
                </p>
                <p>
                  As I've mentioned before, I'm not a dev, and I'm still new to HTML & CSS, so I might well look back on this post in a few months' time and cringe due to its naivety. There’re probably far easier methods to hiding (and delaying the loading of) images than what I've described above, but hey, we learn better from our mistakes, so if I do come across a better solution, I'm guessing I won't forget it :-)
                </p>
              </section>
            </article>
          </body>
        ]]>            
      </description>
    </item>


    <!-- stacked bar charts -->
    <item>
      <guid isPermaLink="false">article13</guid>
      <title>Linking tables to their associated bar charts</title>
      <link>https://onlyrss.org/posts/linking-tables-to-bar-charts.html</link>
      <pubDate>Sun, 6 Mar 2022 12:15:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>
        <main class="page">
            <article> <!-- main article -->

              <section> <!--the problem-->
                <h2>Stacked bar charts</h2>
                <p>
                  For the purpose of this article I'm going to be using a real world example, specifically a stacked bar chart designed to show the number of aircraft of each type e.g 737-800, A320-200 etc. in an Airline's fleet, categorised by the aircraft status i.e. In Service, On Order, and Storage. This 'fleet breakdown by type and status' is essential when trying to understand the composition of an airline's fleet.
                </p>
                <figure>
                  <img src="https://onlyrss.org/images/stacked-bar.webp" width="800" height="594" alt=" ">
                  <figcaption>Figure 1. The fleet breakdown for American Airlines (as at 4 Mar 2022 - Source: <a href="https://www.cirium.com/products/views/cirium-profiles/">Cirium Airline Profiles</a>.)</figcaption>
                </figure>
                <p>
                  Figure 1 above shows the Fleet breakdown for American Airlines. This chart enables us to:
                </p>
                  <ol>
                    <li>Determine the total aircraft of each type e.g. ≈300 737-800.
                    <li>Determine the relative difference in total aircraft between types e.g. ≈80 fewer A321-200 than 737-800.
                    <li>Determine the relative differences between statuses within a type e.g. More than ½ of the 737 Max are On Order.
                    <li>Easily compare the number of In Service aircraft across the different aircraft types.
                    <li>Compare (but not easily) the number of On Order and Storage aircraft across the different aircraft types.    
                  </ol>
                  <h2>The problem with stacked bar charts</h2>
                <p>
                  The main problem with the list above is №5. Although it's possible to compare the number of On Order and Storage aircraft across the aircraft types, it's not easy to do this comparison well. The In Service category is on the far left i.e., it touches the chart's baseline, whereas the other statuses typically don't. For example, which aircraft type in Figure 1 includes the highest number of Storage aircraft?  It's like trying to compare the height of individuals in a group when everyone is standing on a box of different height.
                </p>
              </section>

              <section><!--possible solutions-->
                <h2>Possible solutions</h2>
                <h3>Filtering</h3>
                <p>
                  This stacked bar chart was taken from an online application that includes the ability to filter by status. So one solution is for the user to filter the data by the status of interest. e.g. On Order. This would make the chart far simpler (it would no longer be a "stacked" bar chart), and make a comparison of the number of On Order aircraft across the aircraft types very easy, but, you'd lose the context e.g., is the number of On Order large or small compared to the number of In Service?
                </p>
                <figure>
                  <img src="https://onlyrss.org/images/bar.webp" width="800" height="216" alt=" ">
                  <figcaption>Figure 2. The same fleet summary but filtered by On Order aircraft only.</figcaption>
                </figure>
                <h3>Choosing a 'primary' status</h3>
                <p>
                  Another option would be to allow the user to select which aircraft status is aligned to the baseline. What we're really asking the user to do in this scenario is to prioritise one of the aircraft statuses over the others, i.e. to select one of them as being of 'primary interest'. This isn't a typical request we make of users when asking them to interact with charts, there's no convention to ask users to "choose their most important category". But, there is with tables…sort of.
                </p>
                <p>
                  Often, when presented with a table of data, users will sort the column of data that's of most interest to them. There's no filtering going on (although <a href="https://www.uxmatters.com/mt/archives/2009/07/the-mystery-of-filtering-by-sorting.php">previous research</a> has shown that when users are asked to filter a dataset that's presented in a table, they will often sort a column, rather than actually apply a filter), so there's no loss of context.
                </p>
                <p>
                  For Cirium Airline Profiles (the product where the stacked bar chart above is used) each stacked bar chart has an associated table of data, and both the chart and table are always visible (initial mock-ups included options where the user could toggle between table and chart, but there was a strong user preference that both should be visible at the same time.) With table and chart always visible, it opened up the possibility for some linking between the two visualisations i.e. for some table interactions to directly affect the chart.
                </p>

              <section><!--our chosen solution-->
                <h2> Linking a data table to its associated stacked bar chart</h2>
                <p>
                  In the animation below in Figure 3, each table column header is selected in-turn by the user to be sorted i.e. Total, Storage, On Order, and In Service. When a specific status in the table has been sorted (or "prioritised" by the user), the stacked bar chart is adjusted accordingly i.e.:
                </p>
                  <ol>
                    <li>the sorted status is moved to the chart's baseline
                    <li>the bars are sorted to match the sort order chosen in the table
                    <li>the status category colour is emphasised (and the others de-emphasised)
                </p>
                <p>
                  The result is essentially a bar chart within a stacked bar chart. It retains some of the simplicity of a "non-stacked" chart (as shown in Figure 2) while not throwing away the useful contextual data. 
                </p>
                <p>
                  The link between the table and chart is further emphasised by the fact that each bar in the chart aligns horizontally with its associated row in the data table (in Figure 3 below the chart and table are stacked vertically, this view is used on tablets and mobile, the desktop view has the visualisations side-by-side.)
                </p>
                <figure>
                  <img src="https://onlyrss.org/images/bar-animation.gif" width="800" height="1262" alt=" ">
                  <figcaption>Figure 3. Table-sort choice, and it's effect on the linked stacked bar chart.</figcaption>
                </figure>
              </section>
              <section><!--conclusion-->
                <h2>Conclusion</h2>
                <p>
                The solution described above, and which we implement on Cirium's Airline Profiles is not perfect (the colours specifically need to change), but I do feel that the solution does go some way to overcoming one of the issues with stacked bar charts. I wouldn't describe this feature as "essential", but I'd like to think that it's one of those "micro-interactions" that might bring a small moment of delight to some of our users.
                </p>
              </section>
              <!-- feedback - section -->
              <section>
                <p>
                  If you have any comments on this article then please get in touch via Twitter (<a
                    href="https://twitter.com/dbs_sticky" target="_blank">@dbs_sticky</a>).
                </p>
              </section>
            </article>
          </main>
        </body>
        ]]>            
      </description>
    </item>

    <!-- drop caps and indents -->
    <item>
      <guid isPermaLink="false">article12</guid>
      <title>Drop Caps and Indents</title>
      <link>https://onlyrss.org/posts/drop-caps-and-indents.html</link>
      <pubDate>Mon, 17 Jan 2022 19:00:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>
          <p>
        If you are reading this in an RSS reader, you might want to visit the actual blog,
        as the article refers to style elements that won't appear in your RSS reader.
          </p>


          <p>
            All the best blogs tend to be written by experts, and also tend to keep to a
            specific field or topic. My blog does neither of those things. For example,
            this post is about separating paragraphs using CSS, I'm only just starting
            to learn CSS, and this is my first post dedicated to the subject. Some of
            what's included below was touched upon in my previous post, specifically the
            section dedicated to what I'd learnt while using CSS to build my Kindle
            mock-up.
          </p>
          <h2>Indents</h2>

          <p>
            While writing my Kindle post last week, it made me think about how
            paragraphs are typically distinguished from one another in print and on the
            web. That led me to look into how various paragraph spacing solutions can be
            implemented with CSS.
          </p>
          <p>
            On the web, where an article is typically presented as one long page of
            text, essentially giving the author access to infinite vertical space,
            paragraphs are typically separated by some extra whitespace. But, in print,
            and on eReader devices, where content is presented on pages of fixed
            vertical height, paragraphs tend to be separated by simply indenting the
            first line. This results in more text on a single page when compared to
            adding whitespace.
          </p>
          <p>
            Strictly speaking, this indentation is only necessary for paragraphs that
            directly follow other paragraphs. No indentation is required when a
            paragraph follows a heading, sub header, figure, blockquote, etc.
          </p>
          <p>
            Luckily, there exists a CSS Selector specifically designed to target an
            element that directly follows another element, i.e. the "+" selector. And as
            we need to only target paragraphs that follow other paragraphs, we simply
            use:
          </p>

          <div class="code">
            <p>p + p {text-indent: 2.3em;}</p>
          </div>

          <p>
            You'll notice that all the paragraphs above have an indent, with the
            exception of this paragraph (which follows a code block), and the first
            paragraph (which follows a heading), i.e. neither of these paragraphs
            directly follow another paragraph. The first paragraph does start with a
            'drop cap' though, and that can be implemented via the "+" selector in CSS
            as well.
          </p>

          <h2>Drop Caps</h2>
          <p>
            I decided that I wanted to use a drop cap at the start of each new chapter,
            specifically the first letter of the first paragraph following each h2
            heading. To target the first paragraph after the h2 heading, we simply use
            h2 + p. But, we don't want to apply the drop cap style to every letter in
            that paragraph, we only want to target the first letter. To do this we add
            the ::first-letter CSS Selector.
          </p>

          <div class="code">
            <p>h2 + p::first-letter {</p>
            <p>float: left;</p>
            <p>font-size: 2.3rem;</p>
            <p>line-height: 1;</p>
            <p>margin: 0 0.1em 0 -0.1em;</p>
            <p>padding: 0.1em;</p>
            <p>}</p>
          </div>

          <p>
            That's all that's required, 2 little bits of CSS, neither of which you have
            to assign to any individual paragraph, and you end up with 3 different
            paragraph separators. i.e. indented, drop cap, and flush.
          </p>
        </body>
        ]]>            
      </description>
    </item>

    <!-- why i prefer the kindle -->
    <item>
      <guid isPermaLink="false">article11</guid>
      <title>Why I prefer the Kindle</title>
      <link>https://onlyrss.org/posts/why-i-prefer-the-kindle.html</link>
      <pubDate>Wed, 12 Jan 2022 19:00:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>

            <p><strong>
            If you are reading this in your RSS Reader, then well done, RSS is cool,
            and therefore, by extension, so are you!. But, much of this article won't
              make sense unless you visit the actual blog post, as much of the article is inside a mock-Kindle that I created with CSS. </strong>
            </p>
        <hr>
            <p>
              I created this article for two reasons: I wanted to highlight some
              Kindle benefits that are often overlooked (probably because they are
              specific to me), and I wanted to attempt some CSS that was a bit more
              adventurous than my usual tweaks to font and paragraph styles.
            </p>

            <p>
              My aim was to try and reproduce the Kindle Oasis reading experience as
              best I could (given my limited knowledge of CSS). The article is
              contained within the Kindle below. Use the Kindle's navigation buttons
              (on the right of the device) to page through the article. At the bottom
              of this page I've described what I learnt while creating my
              "mock-Kindle".
            </p>


                  <h2>Background</h2>

                  <p>
                    I didn't used to read. Don't get me wrong, I had books, almost
                    enough to fill a shelf (it was a mix of physics text books and a
                    small but treasured collection of Calvin & Hobbes) but I wasn't "a
                    reader". I didn't go to bed with a book, and picking up a book
                    during the day was not part of my routine.
                  </p>

                  <p>
                    This all changed about 7 years ago when I made a deal with a
                    colleague, if she watched the TV show Firefly, then I'd read a
                    book that she had recommended. I read that book on a Kindle, and I
                    have barely put the Kindle down since. I'm not saying that I only
                    kept up the habit of reading because of the Kindle, but I'm not
                    sure I would have carried on if I had to order books, wait for
                    them to arrive, and then struggle to read them in the dark while
                    the wife tried to go to sleep next to me.
                  </p>

                  <p>
                    The first device I bought was the Paperwhite, then I passed that
                    onto the wife and I got a newer version of the Paperwhite, and a
                    while later I bought an even newer generation Paperwhite, more
                    recently I treated myself and upgraded to a Kindle Oasis.
                  </p>

                  <h2>benefits</h2>

                  <h3>1 - The dictionary</h3>

                  <p>
                    Unlike Donald Trump, I don't <em>know all the words</em>, so being
                    able to press my fingertip on a word and see the definition is
                    great. Even more useful than the dictionary is the etymology, I
                    find that learning how a word came to be helps me to remember its
                    definition.
                  </p>

                  <h3>2 - The backlight</h3>

                  <p>
                    I mostly read in bed, and unlike my wife, I don't fall asleep as
                    soon as my head hits the pillow, so the backlight on the Kindle is
                    essential for me. On the Oasis you have the added benefit of adjusting the colour
                    temperature, and switching to dark mode.
                  </p>

                  <h3>3 - The clock!</h3>

                  <p>
                    Ok, this one might seem a bit silly, but as I read when I go to
                    bed, it's useful for me to keep an eye on the time, otherwise I
                    might find myself reading well into the small hours. Like many
                    people these days I don't have a clock in the bedroom as I rely on
                    my phone. Having the clock on the Kindle stops me periodically
                    reaching for my phone.
                  </p>

                  <h3>4 - Saving quotes</h3>

                  <p>
                    Not so important when reading fiction (which represents about 80%
                    of what I read), but when I do venture into the world of
                    non-fiction, I often like to save quotes or other useful sections
                    of text so I can easily find them again later. This is a feature
                    of the Kindle that often gets overlooked.
                  </p>

                  <h3>5 - Kindle Unlimited</h3>

                  <p>
                    Kindle Unlimited in the UK costs £7.99 pm and includes more than
                    650,000 books that can be borrowed (up to 20 at a time). Of the 4
                    books I read per month, probably 2-3 of those I've borrowed via
                    Kindle Unlimited, so for me it easily makes financial sense.
                  </p>

                  <h3>6 - Whisper sync</h3>

                  <p>
                    This is Amazon's name for the feature that lets you sync your
                    reading progress across Kindle devices and Kindle apps. When I
                    find myself in the car waiting for one of my kids to finish
                    [insert name of activity that seems really important to them now
                    but they will quit once they become a teenager here], then I'll
                    often fire up the Kindle app on my phone, and start reading where
                    I'd finished off the night before.
                  </p>

                  <h3>7 - Font size</h3>

                  <p>
                    Being a man of a "certain age", I'd recently noticed that my arms
                    were no longer long enough to allow my eyes to focus on objects
                    held in my hands. For a little while, increasing the font size on
                    the Kindle allowed me to put off the inevitable purchase of
                    reading glasses.
                  </p>

                  <h3>8 - Time left in chapter</h3>

                  <p>
                    You have some options when it comes to what's displayed in the
                    page footer on the Kindle, you can choose from the following:
                    nothing, page number, time left in chapter, time left in book, and
                    loc (like page number, but is independent of your style choices
                    e.g. font-size etc.). As I don't like to stop reading mid-chapter, the length of a chapter is a metric I use
                    when determining whether or not I'll start a chapter.
                  </p>

                  <h3>9 - Ergonomics</h3>

                  <p>
                    You can only read one page at a time, but with physical books you
                    are forced to always have 2 pages on display, so you're always
                    holding something that is twice the size it actually needs to be.
                  </p>

                  <p>
                    There's also no distortion due to the page curving in towards the
                    spine of the book (there's also no spine to break!).
                  </p>

                  <h3>10 - Dark mode</h3>

                  <p>
                    When it comes to dark mode on my PC and mobile apps I tend to
                    leave it off. But, when it comes to the Kindle, I do prefer to
                    turn dark mode on. As I read at night I always use the Kindle's
                    backlight, and in dark mode, there's just less light being emitted.
                    At the end of the day, it's the letters I want illuminated, not
                    the background.
                  </p>

            <h2>What I learnt</h2>

            <h3>It's time to go back to formula</h3>

            <p>
              My CSS "skills" are far worse than I thought. I'm comfortable enough
              with the typical CSS required for defining the style of a typical
              article body (which is one of the main reasons why I started this blog),
              but when it comes to using CSS for layout, I really don't know what I'm
              doing. Creating the Kindle above with CSS was more the result of trial
              and error, than it was me actually knowing what I was doing. So I'll be
              looking out for some CSS layout tutorials in the near future.
            </p>

            <h3>Tabular numerals are not just for tables</h3>

            <p>
              Tabular (as opposed to proportional) numerals are numerals where each figure takes up the same width.
              i.e. 1111 takes up the same with as 0000. This is important in tables, where users are comparing values that are
              stacked vertically. Basically, you want the hundreds, tens, units etc. to all be aligned vertically (for more
              details see <a href="https://creativepro.com/typetalk-know-your-figures/">this article)</a>.
            </p>

            <p>
              While creating the
              Kindle above, it occurred to me that tabular numerals should be used within body text when the numerical value
              can change dynamically. If tabular numerals are not used, then as the number changes value (and therefore also
              width), the proceeding content
              can shift horizontally, potentially leading to a word slipping onto the next line (OMG THE HORROR!!!). My case was
              a little less
              dramatic, and was related to the page number and percentage read indicators in the footer. Without tabular
              numerals, moving from page 1 to page 2 resulted in a small shift of the percentage read indicator. Not a big
              deal, but it taught me that tabular numerals are not just for tables. You can see this in action below, the top
              example uses non-tabular numerals (i.e. proportional), the bottom example uses tabular numerals.
            </p>

            <p><img src="https://onlyrss.org/images/why-i-prefer-the-kindle-notabnum.gif" alt="example showing the movement associated when using non-tabular numerals"></p>
            <p><img src="https://onlyrss.org/images/why-i-prefer-the-kindle-tabnum.gif" alt="example showing the lack of movement when using non-tabular numerals"></p>

            <h3>Separating paragraphs</h3>

            <p>
              This article made me think about how paragraphs are visually
              distinguished from one another. I'm a fan of some extra padding between
              paragraphs, but, while trying to make the Kindle text look as authentic
              as possible, I realised that most of the Kindle books I've read have no
              extra vertical space between paragraphs, but rather, they indent the
              first line of each paragraph (which makes sense I guess, as it doesn't
              waste any vertical space, which is important on devices such as
              eReaders). This is how paragraphs are separated in the "book" above.
            </p>

            <p>
              This wasn't new to me obviously, but what I hadn't noticed was that when
              indentation is used, it's usually omitted for the first paragraph in a
              section/chapter (this also makes sense, there's no paragraph directly
              above from which to be separated, and if the chapter heading is
              left-aligned, then both heading and the start of the paragraph are
              nicely aligned along the left margin, and we humans like stuff that is
              nicely aligned).
            </p>

            <p>
              At first I thought I would have to create a new paragraph class in CSS
              specifically for the first paragraph of each section (that removed the
              default paragraph indent), and then add the class manually, but it turns
              out that CSS has an easy solution for this.
            </p>

            <code> p + p { text-indent: 1.5em; } </code>

            <p>
              The "+" above means that the style (the text-indent in this example) is
              only applied to paragraphs directly proceeding other paragraphs.
            </p>

            <p>
              Conversely, if you wanted to apply a specific style to the first
              paragraph only, i.e. the paragraph directly proceeding a heading e.g.
              Heading 1, then the CSS selector would be:
            </p>

            <code> h1 + p { ... } </code>

            <h3>Using the :target selector to show hidden content</h3>

            <p>
              I haven't started to learn JavaScript (JS) yet, and as the purpose of
              this blog is for me to learn some basic web dev, it shouldn't (yet)
              include any JS. Unfortunately, the page navigation used above for the
              Kindle requires JS,...sort of.
            </p>

            <p>
              I did manage to create a version of the Kindle with working navigation
              that didn't require any JS, instead it took advantage of the :target
              pseudo selector in CSS, usually this is used to move the user to a
              specific section of a page after clicking on a link or button (e.g.
              creating a clickable Table of Contents). But, it can be used to
              selectively show page elements that are otherwise hidden.
            </p>

            <p>
              My non-JS version does work, but, it suffers from an unwanted
              "side-effect" (well, unwanted for my specific use case) i.e. it moves
              the page to the specific section (which is what it's meant to do!). You
              can see this in action when you select one of the nav buttons in the
              CodePen below (you also have to click on the start link first). So in
              the end I decided to create this page using JS, even though I had to ask
              a friend to provide the required JS.
            </p>

            <p>
              My non-JS implementation can be seen in the following CodePen. But
              you'll find a better description of how to use the :target selector to
              show hidden contents
              <a href="https://css-tricks.com/a-whole-website-in-a-single-html-file" target="_blank">here</a>.
            </p>

            <p class="codepen" data-height="700" data-default-tab="result" data-slug-hash="eYGVXOm" data-user="dbssticky">
              <span>
                See the Pen
                <a href="https://codepen.io/dbssticky/pen/eYGVXOm">
                  Only RSS - Kindle (No JS)</a>
                by mark evans (<a href="https://codepen.io/dbssticky">@dbssticky</a>)
                on <a href="https://codepen.io">CodePen</a>.</span>
            </p>


        </body>
        ]]>            
      </description>
    </item>

    <!-- Tops 2021 -->
    <item>
      <guid isPermaLink="false">article10</guid>
      <title>Tops of 2021</title>
      <pubDate>Wed, 29 Dec 2021 17:25:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>
        <p>There's no web article associated with this RSS entry. This post exists in the RSS feed only. If you're reading this, you are a member of a very, very, small club.</p>

        <p>Every year a group of friends and I exchange our 'Top's of the year'. Here's my list for 2021.</p>

        <h2>Movies (first watched during 2021)</h2>
        <ul>
        <li>Promising Young Woman</li>
        <li>Captain Fantastic</li>
        <li>Nobody</li>
        <li>Predestination</li>
        <li>The Invisible Man</li>
        <li>The Dig</li>
        <li>Whiplash</li>
        <li>Molly&#39;s Game</li>
        <li>Pride</li>
        <li>Greenland</li>

        </ul>
        <h2>Podcasts</h2>
        <ul>
        <li>Daily Tech News Show</li>
        <li>Tech&#39;s Message</li>
        <li>Kermode and Mayo&#39;s Film Review</li>
        <li>More or Less: Behind the Stats</li>
        <li>Full Fact</li>

        </ul>
        <h2>TV Shows</h2>
        <ul>
        <li>The Expanse</li>
        <li>Arcane</li>
        <li>Bosch</li>
        <li>Star Trek: Voyager</li>
        <li>Mare of Easttown</li>
        <li>Ted Lasso</li>
        <li>Squid Game</li>
        <li>Invincible</li>
        <li>Catastrophe</li>
        <li>Foundation</li>

        </ul>
        <h2>Books (books I rated 5 stars on Goodreads)</h2>
        <ul>
        <li>Project Hail Mary </li>
        <li>Shadows of the Fall (Shadow of Terra, #2)</li>
        <li>Fundamentals of Data Visualization: A Primer on Making Informative and Compelling Figures</li>
        <li>The Visual Display of Quantitative Information</li>
        <li>Exile (Trilogy)</li>
        <li>Heaven&#39;s River (Bobiverse, #4)</li>
        <li>Flight of the Javelin (Trilogy)</li>
        <li>Asylum</li>
        <li>Saga (Trilogy)</li>
        <li>House of Suns</li>
        <li>The Divide (2 books)</li>
        <li>The Code (2 books)</li>
        <li>The Palladium Wars (Trilogy)</li>

        </ul>

        </body>

        ]]>
      </description>
    </item>

    <!-- Why every Product Manager should build a website -->
    <item>
      <guid isPermaLink="false">article9</guid>
      <title>Why every Product Manager should build a website</title>
      <link>https://onlyrss.org/posts/why-every-product-manager-should-build-a-website.html</link>
      <pubDate>Sun, 18 Apr 2021 17:00:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>
        <!-- main article -->
        <article class="article">

        <!-- Intro - section -->
        <section>
        <p>I&#39;ve used very specific wording in the title of this post. The key word in the title is
                  <strong>build</strong>, I specifically don&#39;t state that every product manager should have a website, or
                  write a blog, I don&#39;t even think it&#39;s that important if Product Managers actually publish the
                  website&#39;s they build, but I do believe that all Product Managers (ok, not all, only those who are
                  responsible for online products) should go through the process of building a website. Why? well, like many of
                  my suggestions, it all comes back to Ben Franklin (<a href='https://quoteinvestigator.com/2019/02/27/tell/' target=”_blank”>or
                    maybe Confucius</a>) and the following quote:</p>
        <blockquote>
        <p>“Tell me, and I will listen; Teach me, and I’ll remember; Involve me, and I will learn.”
                    — Benjamin Franklin</p>
        </blockquote>
        <p>The reason I like this quote so much, (and refer to it so often) is because I really believe it. It&#39;s the
                  reason this website exists, I wanted to learn HTML, CSS, and JavaScript. I didn&#39;t start with a book or a
                  course...I started by building a page. This meant I made a lot of mistakes initially, mistakes I wouldn&#39;t
                  have made if I&#39;d started with a book, but I find that mistakes are hard to forget, whereas it&#39;s easy
                  to forget some instructions in a book that tell you how something should be done.</p>
        <p>OK, but what does this have to do Product Managers building websites? To help answer this question, I&#39;d
                  propose a small tweak to the above quote i.e.</p>
        <blockquote>
        <p>“Tell me, and I will listen; Teach me, and I’ll remember; Involve me, and I will understand and
                    appreciate.”
                    — Mark Evans</p>
        </blockquote>
        <p>Learning something new is great, and I&#39;ve really enjoyed learning how to build this website, but,
                  it&#39;s also had a couple of side effects:</p>
        <ol>
        <li>I have a much better <strong>understanding</strong> of what my development team does.</li>
        <li>I have a much better <strong>appreciation</strong> for what my development team does.</li>

        </ol>
        <p>Before I go any further, let me make one thing clear, <strong>I am not in any way comparing my tiny blog to
                    the products that my developers build</strong>. This website, and the products I manage, are so far apart in
                  scale and complexity that it would be laughable to even attempt to compare the two.</p>
        </section>

        <section>
        <h2>Understanding & Appreciation</h2>
        <p>Without a data team (to source, qualify, cleanse etc.) and a development team (to build the tools that allow
                  users to easily access the data) my role would be utterly redundant, I&#39;d literally have no products to
                  manage, sales would have no products to sell, and marketing would have no products to promote. So, I&#39;ve
                  always had a strong sense of appreciation for both of these teams. But, building my little hand crafted
                  website (with just HTML and CSS...so no actual programming) over the last few months has only increased my
                  appreciation for what my developers do. Even my meagre website, with its 7 pages has required quite a lot of
                  effort to create and maintain. For example, I&#39;ve:</p>
        <ul>
        <li>Moved from using CodePen to VSCode.</li>
        <li>Gone through a retagging exercise to ensure that article specific HTML5 tags are used e.g.
                    &lt;article&gt;, &lt;section&gt; etc..</li>
        <li>Refactored the website&#39;s folder structure, as I realised my initial structure wasn&#39;t scalable.
                  </li>
        <li>Moved the source files from my local PC to GitHub.</li>
        <li>Updated my version of Git due to a recent security vulnerability.</li>

        </ul>
        <p>The important thing to note about the list above, is that <strong>none of that effort has resulted in any
                    changes that are visible to someone visiting the website</strong>. Now, if all that has been required for my
                  little website, imagine the size and quantity of &quot;unseen&quot; tasks that are required for a global data
                  product built with numerous dependencies, strict security and privacy requirements, multiple databases,
                  complex access and entitlement systems, and multiple frameworks etc.</p>
        <p>So, stop reading about building websites, and pop over to CodePen and start building one &#128522;.</p>
        </section>

        <!-- feedback - section -->
        <section>
        <p>
                  If you have any comments on this article then please get in touch via Twitter (<a href="https://twitter.com/dbs_sticky" target="_blank">@dbs_sticky</a>).
                </p>
        </section>
        </article>
        </body>
        ]]>
      </description>
    </item>

    <!-- Rowing tips after 15 m meters -->
    <item>
      <guid isPermaLink="false">article8</guid>
      <title>My indoor rowing tips after 15 million meters</title>
      <link>https://onlyrss.org/posts/my-rowing-tips-after-15-million-meters.html</link>
      <pubDate>Fri, 9 Apr 2021 16:00:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>
        <article class="article">

        <!-- Intro - section -->
        <section>
        <h2>Background</h2>
        <p>I bought my <a href='https://www.concept2.com/service/indoor-rowers/model-c'>Concept 2 Model C</a>
                            rower
                            in 2001, my plan (like most people who buy exercise equipment) was to use it every week. And, like
                            most
                            people, I failed. I used the rower sporadically for a while, and then I moved house, and it just sat
                            there in my new home, gathering dust. I'd get the urge to start using it again (yes...January) and
                            as usual, it didn't last. I've always done some form of exercise, either in the gym or running,
                            and have had some long periods of running every week, but I don't think I've ever exercised
                            consistently every week for a period longer than a year.</p>
        </section>

        <section>
        <h2>2014 - New Year's day</h2>
        <p>This all changed when I hit 40. My daily routine was basically, driving to work, sitting at my desk
                            for 8hrs, driving home, making the family dinner, and then sitting in front of the TV with the wife
                            for an hour or so before bed. This was not exactly an active lifestyle. So I made a New Year's
                            resolution to row at least 30km every week (4x5km, 1x10km). I used Excel and made a big table where
                            each row was a week, and each column was 5km (it had 10 columns, so 50km). I printed the table on A3
                            paper, and stuck it up on the wall in the garage right next to the rowing machine. The aim was
                            simple, "don't break the streak", the longer I could hit 30km each week, the less
                            likely I would be to miss a week, because I'd "break the streak". I had to start off
                            slowly, but by week 3 I was up to 30km, and with the exception of a few weeks (house move, and a
                            work trip to NYC) I hit my target.</p>
        <P>The table was not the thing that kept me going, 30km per week
                            on the rower meant about 2 1/4 hrs of my time, and just rowing can be boring. To help alleviate the
                            boredom I attached my iPad to the rower, got some sports headphones, and started watching Star Trek
                            (original) from the very beginning. <strong>Exercise time was now also Star Trek time!</strong>.
                            When I got to the end of Star Trek, I watched Stargate SG1, all 10 seasons, and then Atlantis, and
                            then...you get the idea. I watched TV that I would look forward to. During September I hit 1,000,000
                            meters, and as I'd been logging my rows in the Concept 2 online log book, I qualified for my
                            free 1 million meter t-shirt and badge.</p>
        <p>Here's an image of the initial simple setup:</p>
        <p><img src="https://onlyrss.org/images/rower2014.webp" referrerpolicy="no-referrer"></p>
        <p>And here's the chart for my first year:</p>
        <p><img src="https://onlyrss.org/images/rowing-log.webp" referrerpolicy="no-referrer"></p>
        </section>

        <section>
        <h2>2015</h2>
        <p>2015 carried on much like 2014, 30km per week (this time I didn't miss any weeks). I hit 2 million
                            meters in May (you don't get any freebies for 2 million) and I also rowed my first 20km. I did my
                            first 1/2 Marathon in July, and then my 2nd in December, when I also hit 3 million meters.</p>
        </section>

        <section>
        <h2>2016 - This is the year when I realised I had been lazy</h2>
        <p>There were three things that happened in 2016 that made me realise that I needed to up my game:</p>
        <ol>
        <li>I set a New Year's resolution to row a Marathon by the end of the year.</li>
        <li>I read <a href='https://www.amazon.co.uk/Daily-Breathe-Deeper-Live-Better/dp/0595434371'>Row
                                    Daily, Breathe Deeper, Live Better: A Guide to Moderate Exercise.</a></li>
        <li>A friend of mine casually mentioned that she swam for an hour each day.</li>

        </ol>
        <p>2016 started well, with my 3rd 1/2 Marathon in January, but by week 6 my long running streak was
                            broken due to a case of "man-flu" that lasted more than 2 weeks. There followed another
                            couple of 1/2 Marathons during the year. But, it was points 2) and 3) that eventually led me to
                            reassess my rowing goal of 30km per week, and this happened in August.</p>
        <p>I was already doing a lot of what was discussed in "Row Daily, Breathe Deeper, Live Better: A
                            Guide to Moderate Exercise", but it was only when I got to the chapter on case studies that it
                            suddenly occurred to me that the book was targeted at old people (ok, at this time I was 43...but I
                            mean really old people, as in 60+). All the case studies were of people in their 60s and 70s.
                            <strong>So, here was me thinking that my 30km per week was pretty good, and here's this book
                                encouraging people in their 70s to row 70km per week!</strong> Combined with my friend doing an
                            hour swim every day, I realised that it was time to up my game. So, during August I set a new goal
                            of 70km per week (typically 7x10km). I rowed my first Marathon in November (3hr12m53.6s,
                            2:17/500m,), and hit 5 million meters in the first week of January (finally...a new t-shirt and
                            badge).</p>
        </section>

        <section>
        <h2>Setting challenges - 100km in a day</h2>
        <p>Each year I try and set a new rowing challenge, this is typically something like "row a Marathon this year", or "beat my 10km time", but during 2017 I set myself the challenge of rowing 100km in a day, I started around 8am and rowed 10km, then had a 30min break, followed by another 10km, and so on, unfortunately after 80km I had some serious knee pain, so had to stop.</p>
        <p>During late 2020 I was approaching the 15 million meter mark, so decided to attempt the '100km in a day' challenge again, but I timed it such that I'd hit the 15 million meters during the 100km attempt. I started around 8am, finished around 11pm, and spent around 9hrs on the rower in total. This time there were no knee issues, <strong>I'd done it! and I swore to never do it again</strong>, it was probably the hardest physical activity I'd ever done. Rowing 10x10km in a day requires similar effort to running 10x10km in a day (ok, maybe about 80% when compared to running). Note: Two ladies in France each managed to row <a href='https://www.row2k.com/features/899/100k-A-Day-Keeps-The-Doctor-Away/'>100km per day, every day, for a month!</a> That's more than 3 million meters in a month (it typically takes me around 2 years to row 3 million meters). When setting goals, don't worry about what other people are doing (it's a big world with a lot of talented people), if you do it will only demotivate you. Your goals should be personal to you.</p>
        </section>

        <section>
        <h2>Concept 2 setup, maintenance, and upgrades</h2>
        <p>My rowing setup has evolved over the years to the point where I'm quite happy with the current configuration, which includes:</p>
        <ul>
        <li>A dedicated wall mounted TV</li>
        <li>An Ethernet connected Amazon Fire TV stick (you don't want to be dealing with Wi-Fi issues 1/2 way through your row)</li>
        <li>An Amazon Echo (for audio and voice control of the TV).</li>
        <li>A wall chart for marking off each row.</li>

        </ul>
        <p>Here's the current setup:</p>
        <p><img src="https://onlyrss.org/images/rower2021.webp" referrerpolicy="no-referrer"></p>
        <p>At the end of this Summer (2021) my Concept 2 will be 20 years old. Concept 2s are built to survive the harsh environment of commercial gyms, if you buy one for home use, they should last forever and require very little maintenance (they also hold their value well, during the pandemic my rower was still worth about 80% of what I paid for it!). Most of the changes I've made to mine have not actually been required, here's how I've maintained and upgraded it over the last 20 years:</p>
        <ul>
        <li>After each row, I clean the main rail with glass cleaner (as the seat rollers collect gunk).</li>
        <li>Every month I oil the chain, nothing fancy, just some basic 3-in-1.</li>
        <li>Every year I give the main flywheel enclosure a vac to get rid of the dust.</li>
        <li>Every year or so I replace the batteries in the Performance Monitor (PM). Not because they are flat, but to reduce the chance of them leaking and killing the PM.</li>
        <li>Every 3 million meters or so I replace the seat rollers, they cost around £28.</li>
        <li>I upgraded the handle from the original Model C version to the version that ships with the Model D and E. There was nothing wrong with the original handle, I just wanted to use the latest version.</li>
        <li>I upgraded the PM from the PM2+ that it originally came with, to the latest PM5. Again, this was not really necessary as the PM2+ was working just fine, but, I wanted to link the PM to a phone, so I could automatically log all my rows with the Concept 2 online logbook (I'd been adding them manually up to this point). The PM5 is quite expensive (£155), but, I got £90 for my PM2+ on eBay, so the upgrade only set me back £65.</li>
        <li>I few years ago I bought a replacement bungie cord (the part that pulls back on the handle), but I've not got around to fitting it yet.</li>
        </ul>
        </section>

        <section>
        <h2>My tips for anyone who's new to indoor rowing</h2>
        <ul>
        <li>There's nothing harder than getting home from work, and then dragging your arse back out again to go to a gym. <strong>If you can, buy a rower</strong>, Concept 2s hold their value really well, if it turns out that rowing is not for you, just sell it.</li>
        <li>Set a goal, print out a table/chart, and mark off each row, <strong>start a streak</strong>, and try to keep it going.</li>
        <li>Attach a tablet to the rower, or set up a TV and watch some sci-fi (other genres are acceptable), or listen to podcasts or audio books, but <strong>do something that will keep your mind occupied</strong>.</li>
        <li><strong>Put some padding on the seat</strong>, those things are not meant for long rows!</li>
        <li><strong>Log your rows with the Concept 2 Logbook</strong>, the rewards might not be much, but I wear my t-shirt with pride.</li>
        <li><a href='https://www.c2forum.com/'>Sign up to the Concept 2 forum</a>, it's a good place to get answers to any rowing or Concept 2 related questions.</li>

        </ul>
        </section>

        <section>
        <h2>Conclusion</h2>
        <p>Rowing is now part of my lifestyle, it's fully integrated into my <a href='../posts/anatomy-of-a-lockdown-day.html'>daily routine</a>. I'm not trying to break records (obviously, I'm watching TV at the same time), but I am trying to make up for the 8hrs a day I spend sitting at a desk, and to be honest, 10km per day is probably only just managing that.</p>
        </section>

        <!-- feedback - section -->
        <section>
        <p>
                            If you have any comments on this article then please get in touch via Twitter (<a href="https://twitter.com/dbs_sticky" target="_blank">@dbs_sticky</a>).
                        </p>
        </section>
        </article>
        </body>

        ]]>
      </description>
    </item>

    <!-- chart picker -->
    <item>
      <guid isPermaLink="false">article7</guid>
      <title>Chart Picker</title>
      <link>https://onlyrss.org/posts/chart-picker.html</link>
      <pubDate>Sun, 28 Mar 2021 11:00:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>
        <article class="article">

        <!-- Intro - section -->
        <section>
        <h2>Background</h2>
        <p>Whether you work in data science, data analytics, finance, strategy, user experience, sales, marketing, or product, at some point you will be creating data visualisations, either for use externally (in your products and on social media), or internally (in your presentations and reports). As an employee of an information and analytics company, it’s important that the visualisations I choose reflect the same high standard as the underlying data, or at the very least, don’t misrepresent the data.</p>
        <p>As a product manager, I’ve used a variety of tools over the years to create mock-ups. Some tools output high-fidelity designs, but typically I’m dealing with high-level concepts that need to be created quickly and updated often (based on user feedback). For these scenarios, I’ve recently started using a free and open-source tool called <a href='https://excalidraw.com/' target="_blank">Excalidraw</a> (see my blog post about <a href='../posts/drawing-with-excalidraw.html' target="_blank">Drawing with Excalidraw</a>).</p>
        <p>During early 2021 I was managing the rebuild of one of my company&#39;s analytics tools, and the new version required the extensive use of charts in order to visualise a wide variety of data, as usual, I turned to Excalidraw to create the initial mock-ups. Before I knew it, I had amassed a large number of basic chart types, so I turned these into an Excalidraw library and added my library to the project in <a href='https://github.com/excalidraw/excalidraw-libraries' target="_blank">GitHub</a>. You can download my library <a href='https://libraries.excalidraw.com/?sort=default#dbssticky-data-viz' target="_blank">here</a> (title: &#39;Data Viz&#39;, author: &#39;@dbs-sticky&#39;).</p>
        <p>I then decided to take my library of charts and generate a “chart picker” diagram. I based this off an existing concept developed by Dr. Andrew Abela from <a href='https://extremepresentation.com/' target="_blank">ExtremePresentations</a> (anyone interested in charting is probably already familiar with this <a href='https://extremepresentation.com/design/7-charts/' target="_blank">classic version</a>). I made some changes to Dr. Abela&#39;s design, mostly around the Distribution section which I have expanded with more options. My diagram is designed to help you choose a chart based on your data, and what you are trying to convey to the user. My initial aim for creating this chart picker was to share it with my colleagues, I&#39;ve since shared it publicly, and have now made it available on <a href='https://github.com/dbs-sticky/ChartPicker' target="_blank">GitHub</a> for anyone to use or to improve upon.</p>

        </section>

        <!-- mid - section -->
        <section>
        <h2>Chart Picker links</h2>
        <ul>
        <li><a href='https://onlyrss.org/images/chart-picker-compressed.png' target="_blank">View\download the chart picker as a .png</a></li>
        <li><a href='https://onlyrss.org/images/chart-picker-compressed.svg' target="_blank">View\download the chart picker as a .svg</a></li>
        <li><a href='https://t.co/swXFJLvAwM' target="_blank">View\edit your own instance of the chart picker at Excalidraw</a></li>
        <li><a href='https://github.com/dbs-sticky/ChartPicker' target="_blank">Follow\contribute to the chart picker project at GitHub</a></li>

        </ul>

        </section>

        <!-- Conclusion - section -->
        <section>
        <h2>Chart Picker screenshot</h2>
        <p>This is a zoomed in view of the distribution section of the chart picker.</p>
        <img src="https://onlyrss.org/images/chart-picker-snippet.png" referrerpolicy="no-referrer" alt="A snippet of the 'Chart Picker'">
        </section>

        <!-- feedback - section -->
        <section>
        <p>
                        If you have any comments on this article then please get in touch via Twitter (<a href="https://twitter.com/dbs_sticky" target="_blank">@dbs_sticky</a>).
                    </p>
        </section>
        </article>
        </body>

        ]]>
      </description>
    </item>

    <!-- rss part 1 -->
    <item>
      <guid isPermaLink="false">article6</guid>
      <title>What is RSS and what are 'aggregators'?</title>
      <link>https://onlyrss.org/posts/rss-part-1.html</link>
      <pubDate>Sun, 7 Mar 2021 16:00:00 GMT</pubDate>
      <description>
        <![CDATA[
        <body>
        <article class="article">

        <!-- Intro - section -->
        <section>
        <h2>What is RSS?</h2>
        <p>RSS (Really Simple Syndication) is a web feed that allows users and applications to access updates to
                        websites in a standardised, computer-readable format. These feeds can, for example, allow you to keep
                        track of many (potentially, hundreds) different websites in a single news aggregator.</p>
        <p>Below you can see an example of the contents of an RSS feed. It&#39;s simply a channel (e.g. your
                        favourite news site), followed by a list of articles. Users of RSS never actually look at the feed (in
                        the same way that you never see all the metadata associated with each e-mail you receive), it&#39;s not
                        meant for people, it&#39;s meant for machines, i.e. the RSS aggregators.</p>
        <pre><code>
        &lt;channel&gt;
        &lt;title&gt;OnlyRSS&lt;/title&gt;
        &lt;link&gt;https://onlyrss.org&lt;/link&gt;
        &lt;description&gt;The latest posts from OnlyRSS.org&lt;/description&gt;
            &lt;item&gt;
                &lt;title&gt;Drawing with Excalidraw&lt;/title&gt;
                &lt;link&gt;https://onlyrss.org/drawing-with-excalidraw&lt;/link&gt;
                &lt;description&gt;Excalidraw is described by its creators...&lt;/description&gt;
            &lt;/item&gt;
            &lt;item&gt;
                &lt;title&gt;Working from home hardware&lt;/title&gt;
                &lt;link&gt;https://onlyrss.org/working-from-home-hardware&lt;/link&gt;
                &lt;description&gt;I recently wrote about my weekday lockdown...&lt;/description&gt;
            &lt;/item&gt;
        &lt;/channel&gt;
        </code></pre>
        </section>

        <!-- RSS aggregators - section -->
        <section>
        <h2>RSS aggregators</h2>
        <p><strong>An RSS aggregator is similar to an e-mail client, but rather than e-mails, it aggregates articles.</strong> And
                        like e-mail applications, some RSS aggregators are desktop apps, and others are online applications. <a href='https://feedly.com/' target="_blank">Feedly</a> and <a href='https://www.inoreader.com/' target="_blank">Inoreader</a> are two
                        popular online versions and both have similar capabilities.</p>
        <p>Here&#39;s how the example above could appear in an RSS aggregator. It doesn&#39;t have to appear like
                        this, for example, you could choose to view a list of just the titles, or you could select to step
                        through each article in turn (no different to the options you would get in any decent e-mail client).
                        <img src="images/rss-for-productivity-1.png" referrerpolicy="no-referrer">
        </p>
        </section>

        <!-- It's not just articles - section -->
        <section>
        <h3>It's not just articles</h3>
        <p>For simplicity, so far I&#39;ve only discussed articles, but RSS aggregators can do more than just show
                        you the latest news. Below is a list of the various types of content that you can aggregate:</p>
        <ul>
        <li>Articles</li>
        <li>Blog posts</li>
        <li>Forum posts</li>
        <li>Videos e.g. YouTube</li>
        <li>Keyword search alerts e.g. Google\Bing etc.</li>
        <li>Newsletters</li>
        <li>Daily weather reports</li>
        <li>Podcasts</li>
        <li>Updates to documents e.g. Wikipedia, Confluence etc.</li>
        <li>Status changes e.g. parcel tracking, Jira tickets etc.</li>
        <li>Price alerts e.g. CamelCamelCamel etc.</li>
        </ul>
        </section>

        <!-- and it's not just aggregation - section -->
        <section>
        <h3>...and it's not just aggregation</h3>
        <p>The basic requirement of an RSS aggregator is that it aggregates content via RSS feeds. But, much like
                        e-mail clients, RSS aggregators tend to offer more than just this basic capability. In addition to
                        aggregating content, RSS aggregators can offer other benefits, e.g.:</p>
        <ul>
        <li>Searching for feeds (so you don&#39;t have to hunt down the feed at the source website)</li>
        <li>Keyword search results e.g. allowing you to see all new Google results for a keyword search</li>
        <li>Deduplication i.e. remove or bundle together articles with similar content</li>
        <li>Prioritise content e.g. highlight all content that includes a certain keyword, or from a specific
                            source.</li>
        <li>Mute content e.g. hide all content that contains a certain keyword or phrase like &quot;Game of
                            Thrones finale&quot;</li>
        <li>Store all read content and index for search</li>
        <li>Tag content to be &#39;read later&#39;</li>
        <li>Tag content as &#39;favourite&#39;</li>
        <li>Group content into folders, or apply categories e.g. UX, DataViz, etc.</li>
        <li>Highlight sections of content and add notes</li>
        <li>Share content e.g. directly to social networks, as an e-mail newsletter, or even an RSS feed!</li>
        </ul>
        </section>

        <!-- Summary - section -->
        <section>
        <h2>Summary</h2>
        <p>Hopefully I&#39;ve managed to explain what RSS is, and also to convey some of the benefits of using an RSS
                    aggregator. My original plan for this article was to also describe in detail how I use an RSS aggregator
                    (specifically Feedly) to keep on top of my various interests, but I didn&#39;t want anyone reading this
                    article to be overwhelmed and to lose sight of the one key takeaway i.e. <strong>RSS is a powerful tool for
                        keeping on top of online content, and keeping your knowledge up to date</strong>.</p>
        </section>

        <!-- feedback - section -->
        <section>
        <p>
                        If you have any comments on this article then please get in touch via Twitter (<a href="https://twitter.com/dbs_sticky" target="_blank">@dbs_sticky</a>).
                    </p>
        </section>
        </article>
        </body>

        ]]>
      </description>
    </item>

    <!-- drawing with Excalidraw -->
    <item>
      <guid isPermaLink="false">article5</guid>
      <title>Drawing with Excalidraw</title>
      <link>https://onlyrss.org/posts/drawing-with-excalidraw.html</link>
      <pubDate>Wed, 3 Mar 2021 20:00:00 GMT</pubDate>
      <description>
        <![CDATA[
 

        <!-- main article -->
        <article class="article">

        <!-- Intro - section -->
        <section>
        <h2>Excaliwhatnow?</h2>
        <p>Excalidraw is described by its creators as a "Virtual whiteboard for sketching hand-drawn like diagrams".
                        I'd describe it slightly differently, I think I'd go with "a drawing tool that's so easy to use that you
                        spend your time making sure the drawing is effective, rather than 'pixel-fiddling'".
                    </p>
        <p>Excalidraw is great for quickly creating diagrams (you can see lots of great examples on the bottom of <a target="blank" href="https://blog.excalidraw.com/one-year-of-excalidraw/">this page</a>),
                        but it can be used for "sketch" style drawings, like the drawing below of my rowing setup.</p>

        <img src="https://onlyrss.org/images/drawing-with-excalidraw-1.png">
        <p><a href="https://onlyrss.org/images/drawing-with-excalidraw-1.svg" target="_blank">click to view full size</a></p>

        <p>Some of Excalidraw's features:
            <ul>
        <li>runs in the browser</li>
        <li>supports real-time collaboration</li>
        <li>supports multiple export formats</li>
        <li>is secure (end-to-end encrypted)</li>
        <li>is vector based (so scales to all sizes)</li>
        <li>is very easy to learn (no "learning" required)</li>
        <li>is open source</li>
        <li>is free to use</li>

        </ul>
        </p>
        </section>

        <!-- How I use it -->
        <section>
        <h2>How I use it</h2>
        <p>As a Product Manager, I'm often having to define what apps look like, how they're structured, what
                        components they include etc. and I used to do this using hi-fidelity mock-up tools such as AxureRP (or
                        even Adobe illustrator!). And to be honest, I wasted a lot of time obsessing over the size, colour and
                        exact location of various page components. Once my company got serious about UX and started embedding
                        dedicated UX resource within our squads, then it was no longer my responsibility to make my mock-ups
                        pixel perfect.</p>
        <p> This is where Excalidraw really shines (it's hard to be pixel perfect when there are no straight
                        lines!), as its focus is on a "hand-drawn" aesthetic, it lends itself well towards the creation of
                        "quick-and-dirty" sketches where the focus is to portray an idea or concept, rather than to represent a
                        final pixel perfect design. Sketches can be created and altered quickly, and all from within a browser
                        (important for those of us who work for large corporations and don't have the admin rights required to
                        install apps on our PCs).</p>
        <p>The mock-up below of a news search page took about 15mins to produce, but the sketch does highlight quite a few important features about the search page concept.</p>

        <img src="https://onlyrss.org/images/drawing-with-excalidraw-2.png">
        <p><a href="https://onlyrss.org/images/drawing-with-excalidraw-2.svg" target="_blank">click to view full size</a></p>
        <p> In addition to using it at work for mock-ups, it's also my "go-to" drawing app for this blog, as you can see in my post about my <a href="anatomy-of-a-lockdown-day.html"> lockdown days</a>.</p>
        </section>

        <!-- Libraries - section -->
        <section>
        <h2>Libraries make creating diagrams even quicker</h2>
        <p>As I've mentioned, one of the benefits of Excalidarw is the speed, but the existinace of a small (but
                        growing) community of users who share their <a href="https://libraries.excalidraw.com/" target="_blank">Libraries</a>
                        makes it even faster to create diagrams.</p>
        <img src="images/drawing-with-excalidraw-3.png">
        </section>


        <!-- Conclusion - section -->
        <section>
        <h2>Conclusions</h2>
        <p>I really can't recommend Excalidraw strongly enough, it's a great tool, built and maintained by a group of enthusiastic developers who are actively engaging with their users. But, the only way to see how good it really is, is to  <a href="https://excalidraw.com/">go and sketch something :-)</a></p>

        </section>
        <!-- feedback - section -->
        <section>
        <p>
                  If you have any comments on this article, then please reply to the tweet below:</a>
        </p>
        <blockquote class="twitter-tweet"><p lang="en" dir="ltr">Here&#39;s a short blog post about the fast, secure, and extremely easy to use drawing tool, Excalidraw. <a href="https://t.co/NRxxHSmDs9">https://t.co/NRxxHSmDs9</a></p>&mdash; Mark R Evans (@dbs_sticky) <a href="https://twitter.com/dbs_sticky/status/1366838969003085826?ref_src=twsrc%5Etfw">March 2, 2021</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
        </section>

        </article>

        ]]>
      </description>
    </item>

    <!-- Working from home hardware -->
    <item>
      <guid isPermaLink="false">article4</guid>
      <title>Working from home hardware</title>
      <link>https://onlyrss.org/posts/working-from-home-hardware.html</link>
      <pubDate>Thu, 18 Feb 2021 08:00:00 GMT</pubDate>
      <description>
                <![CDATA[
        <div class="article"><p> I recently wrote about my <a href="anatomy-of-a-lockdown-day.html"> weekday lockdown routine</a>. In this article I'll be describing the hardware I use to do my job while working from home. As a Product Manager for a suite of News and Data Analytics products, I use the tools that most office workers are familiar with, i.e. Office 365 apps, but I'm also often sketching UIs, writing requirements in Confluence, or using tools such as PowerBI etc. to analyse and visualise large datasets.</p><p> My PC is located in a bay window at one end of my kitchen diner, it's used by the whole family, and is always on. When I'm working from home I use my work laptop via a docking station and a keyboard\mouse switch, switching between work and home computers only requires the push of a couple of buttons.</p><h2>The setup</h2><p>Here&#39;s my WFH components:</p><ul><li>2 x Dell U2715H monitors (27&quot; 2560x1440)</li><li>Logitech C920 HD webcam</li><li>Logitech MX Master mouse</li><li>TerraMaster F2-421 NAS (2x4GB raid 1)</li><li>Keychron K2 keyboard (with Red switches)</li><li>Ikea Bekant desk (160x80cm)</li><li>Dell D6000 Universal dock*</li><li>Dell Latitude 7490 laptop*</li><li>Plantronics C520 headset*</li></ul><p><em>*provided by employer</em></p><p>The setup is connected to a 300Mbps (down) and 40Mbps (up) Broadband connection <a href="https://en.wikipedia.org/wiki/G.fast">(g.fast)</a> via Gigabit Ethernet.</p><p><img src="images/article4figure1.jpg" referrerpolicy="no-referrer" alt="article4figure1"></p><h2>Outputs</h2><h3>Monitors</h3><p>If you are using a laptop when WFH and have NOT got it connected to an external monitor, for the love of God please just stop right now, go on Amazon, buy a new monitor (or two) and do not return to your laptop until after the new monitor arrives. There are lots of good ways to save money in life, not buying a decent monitor is not one of them! <strong>You are staring at your monitor for more than 8hrs a day, this is not a component where you want to cut corners and &#39;make-do&#39;</strong>. Your employer should provide you with a suitable monitor, or reimburse you if you buy your own. If your employer does not believe a good monitor is worthwhile, then hold off on ordering a new monitor from Amazon, as your highest priority is finding a new employer.</p><p>When deciding which monitor to choose, I&#39;d suggest that anything with a resolution of 2560x1440px. A width of 2560px means you can have 2 apps of 1280px side-by-side, and most apps run well at 1280px. Your laptop display can be reserved for your more &quot;reference&quot; style apps, e.g. calendar, chat application, etc., while your main display is reserved for the apps required for your current task.</p><h3>Speakers</h3><p>My family don't need to hear what others are saying during my conference calls, so I use a wired headset. I know many people use Bluetooth headphones, and as good as modern Bluetooth is, I still find it less hassle to use a wire (wired headphones don't suddenly decide to connect to other devices when you're about to join a conference call).</p><h2>Inputs</h2><h3>Mice</h3><p>Again, not a component where you want to make compromises. <strong>I&#39;d recommend any of the Logitech mice in the <a href="https://www.logitech.com/en-gb/mx/master-series.html">MX Master series</a></strong>. They&#39;re geared towards productivity, and include enough useful features to make them good value for money. You don&#39;t have to get the latest version (the MX Master 3 retails for almost £100), the original version is often heavily discounted and sometimes dips below £50 <a href="https://uk.camelcamelcamel.com/product/B00ULNAOMA">(view price history)</a>.</p><h3>Keyboard</h3><p>Whereas the benefit of a good monitor and mouse are clear, the return on investment of a good quality keyboard is less clear. Keyboards come in 2 main flavours:</p><ol><li>The &#39;rubber dome&#39; keyboards that you&#39;ll find on almost all office desks across the World, and the</li><li>&#39;mechanical&#39; keyboards that you&#39;ll find on the desk of any discerning journalist, developer, or gamer.*</li></ol><p><em>*and maybe on the desks of very discerning Product Managers :-)</em></p><p>&#39;Mechanical&#39; and &#39;rubber dome&#39; here refer to the type of switches used for each key to register the key&#39;s actuation. You can buy a good &#39;rubber dome&#39; keyboard for less than £20. To get a good mechanical keyboard you&#39;re looking at at least £50, with serious mechanical keyboard enthusiasts (yes, it&#39;s a whole thing) spending £100+ on the keyboard itself, and then another £50+ on the keycaps (yes, that&#39;s also a whole thing). I have a mechanical keyboard on my desk, but I&#39;m not recommending anyone goes out and buys a mechanical keyboard. I&#39;d definitely put this component in the &#39;nice to have&#39; bucket.</p><h3>Webcam</h3><p>My wife and I both have the Logitech C920, this has been the &#39;go to&#39; HD webcam for streamers for many years now. When I bought mine back in 2018 I paid just £35...today they cost closer to £100. You can see how the price has changed for this particular webcam since February 2020.</p><p><img src="https://onlyrss.org/images/article4figure2.png" referrerpolicy="no-referrer" alt="article4image2"></p><p>Before spending money on a price inflated HD webcam, the first thing to try is to improve your lighting. <strong>There&#39;s no point having a good quality camera if you have a south facing window directly behind you</strong>. Shut the blinds, and pick up some LED lighting that can be mounted on top of the monitor. Maybe then consider a good webcam (after supply has caught up with demand).</p><h3>Microphone</h3><p>As I mentioned above, I use a headset, and it's not just becasue of Bluetooth issues. The best way to avoid background noise during conference calls is to use a dedicated headset with a mic, the mic is located right next to your mouth, and is unlikely to pick up other sounds from within your home. Bluetooth ear buds are great when you're out and about, or going for a run, and they are OK for the occasional call, but, if you are working from home on a regular basis, then you don't need to compromise. Get a dedicated wired headset, the other people on your call will thank you.</p><h2>Other</h2><h3>Ethernet</h3><p>I was lucky enough to wire up the house with Ethernet (CAT6) in January 2020, just before the whole COVID-19 thing kicked off. At home I have number of bandwidth hungry stationary devices i.e. 3 TVs, 2 desktop PCs, and a NAS. I also have a laptop (permanently on a desk), a Chromebook (that get&#39;s moved around a lot) and a very large number of IoT devices. As good as modern Wi-Fi is, it just doesn&#39;t have the same level of consistency that you get from Ethernet cable, and when you have 4 people potentially all on video calls at the same time, consistency is what you want. <strong>If it is at all practical, I would strongly recommend wiring up your home for Ethernet</strong>.</p><h2>Conclusions</h2><p>I realise that my setup might be considered &#39;overkill&#39;, but my thinking is simple, I&#39;m spending &gt;8hrs per day sitting at that desk, staring at those screens, tapping on that keyboard and shifting around that mouse, therefore it&#39;s worth putting some thought (and some money) into those components.</p></div>

                ]]>
      </description>
    </item>
    
    <!-- Anatomy of a lockdown weekday -->
    <item>
      <guid isPermaLink="false">article3</guid>
      <title>Anatomy of a lockdown weekday</title>
      <link>https://onlyrss.org/posts/anatomy-of-a-lockdown-day.html</link>
      <pubDate>Sun, 07 Feb 2021 15:23:00 GMT</pubDate>
      <description>
        <![CDATA[

        <h2>Prior to lockdown</h2><p>Prior to lockdown, I used to work from 4 different locations:</p><ul><li>Bishopsgate (round trip commute ≈ 3hrs, car, train, tube, walk)</li><li>Heathrow (round trip commute ≈ 2hrs, car)</li><li>Sutton (round trip commute ≈ 2.5-3.5hrs, car)</li><li>Home (0hrs)</li></ul><p>My start time each day was dependent upon which office I was working from, the earliest being when I was working from Sutton. To avoid the M25 traffic, I&#39;d wake at 5:30am, leave home at 5:50am and arrive at the office around 7am.</p><p>During a typical week, I was spending around <strong>11hrs simply travelling to and from my place of work</strong>. And when I arrived at work, I was typically sitting at a desk in front of a laptop.....a laptop that I&#39;d just carried with me from home.</p><p>In a typical week I&#39;d work from each of the 4 locations at least once, so there was no real sense of a fixed routine.</p><h2>During lockdown</h2><p>During March 2020, when all employees in the UK were asked to work from home (if practical), this all changed. Being a Product Manager who was often in a different location as the teams I needed to work with e.g. Tech, Sales, Marketing, Data Science, Data engineering, etc., I was used to &quot;remote working&quot;, even when that meant being in one office, and connecting with teams in a different office.</p><p>I&#39;d also got into the habit of working from home at least once a week (usually when I had to focus on a task). So shifting to working from home full-time was not a big deal, and in many ways it was preferable (for a start, I was saving 11hrs by not travelling).</p><h3>A new routine</h3><p>After a few months of working from home, I&#39;d found that my weekdays had settled into a repeating pattern that included: reading, working, eating, exercise, and TV. This is shown in the sketch below:</p><p><img src="https://onlyrss.org/images/article3figure1.png" referrerpolicy="no-referrer" alt="article3figure1"></p><p>I&#39;d start the day by getting up around 7am (I struggle to sleep past 6am to be honest) and would read my Kindle for around an hour, then I&#39;d start work around 8:30am. First thing I would do is check the news from the previous night via Feedly (I subscribe to around 120 feeds). I&#39;d often have a small lunch at 11:30am while at my desk, and then I&#39;d either go for a 5km run or walk at midday (while listening to podcasts). Right after my lunch\exercise break I&#39;d check Feedly again, and then get back to work. At the end of the workday (around 5pm) I&#39;d check Feedly one last time, and then I&#39;d be thinking about what to cook the family for dinner (we eat at 6pm, which I guess is earlier than most). </p><p>After dinner I&#39;d read again, and then it would be time for my second exercise session of the day, typically a 10km row on the Concept 2 which I&#39;d combine with watching TV. After that I&#39;d settle in front of the TV with the wife and we&#39;d watch a show that we both enjoy (so not the sci-fi I&#39;d typically watch while I row). At around 10pm I&#39;d be off to bed, but would typically read again for up to an hour.</p><h3>Reading</h3><p>I read around 45 books per year, mostly fiction, and mostly space operas, although recently I&#39;ve started to read more non-fiction. I&#39;d always struggled to read non-fiction, until I started reading in the mornings, I find that reading non-fiction in the morning, and fiction in the evenings really suits me, so it&#39;s something I&#39;m planning to continue. <a href='https://www.goodreads.com/user/show/30515830-mark-evans'>Follow me via Goodreads.</a></p><h3>Exercise</h3><p>I exercise for 2hrs per day. On the face of it this might seem like a lot, its not. When you consider that I&#39;m basically <strong>not moving for the other 22hrs (sleeping or at my desk) then moving for 2hrs each day actually doesn&#39;t feel like it&#39;s enough</strong>. And I think this is one of the most important things I&#39;ve learnt from working from home for almost a year. I no longer walk to the train, or from the tube to the office, or around the office, or go outside to buy my lunch. The only exercise I now do is via planned exercise sessions i.e. walking, running, or rowing. Apart from those activities, there&#39;s very little else I do that&#39;s burning calories. For this reason <strong>I&#39;d suggest that 2hrs of exercise each day is probably a minimum for anyone who&#39;s working from home 5 days a week</strong>. <a href='https://www.strava.com/athletes/10904388'>Follow me via Strava.</a></p><h2>Conclusion</h2><p>I don&#39;t know what&#39;s going to happen once this pandemic is over. There&#39;s a lot of discussion about us never returning to the previous office routines, and I&#39;m all in favour of not going back to the old ways. Working from home suits me, and to be honest, I think it suits employers, as I think most employees are more productive (not to mention the costs my employer must be saving on office space and reduced travel).</p><hr><h4>What is OnlyRSS?</h4><p>OnlyRSS is a collection of articles that exist only in the RSS feed itself. There&#39;s no CMS used for article creation\storage, and there&#39;s no website where articles can be viewed, the articles can only be viewed in RSS Aggregators such as <a href='http://feedly.com'>Feedly</a> and <a href='http://inoreader.com'>Inoreader</a>. If you have any comments on this article, or any questions about OnlyRSS, then please ask me (Mark Evans) via <a href='https://twitter.com/dbs_sticky'>Twitter.</a></p>



        ]]>

      </description>
    </item>
    
    <!-- Using Virtual Desktops in Windows 10 -->
    <item>
      <guid isPermaLink="false">article2</guid>
      <title>Using Virtual Desktops in Windows 10</title>
      <link>https://onlyrss.org/posts/using-virtual-desktops-in-windows-10.html</link>
      <pubDate>Sat, 06 Feb 2021 15:00:00 GMT</pubDate>            <!-- article contents -->
      <description>
        <![CDATA[
          

        <h3>A typical day</h3><p>On any typical workday I might have the following applications open on my PC:</P><p>Tasks (Outlook for Web), Agenda (Outlook for Web), Email (Outlook for Web), MS Teams (chats and meetings), Journal (Excel, where I document my activities), WhatsApp (non-work chat), Signal (non-work chat), Feedly (news aggregator), BBC.co.uk (news), Confluence (User Stories), JIRA (backlog), Word, Excel, PowerPoint, Adobe Analytics (product analytics),Tableau (product analytics), Axure or Excalidraw (prototyping & sketching).</P><p>In turns out that these applications fit quite nicely into groups, where each group is based around different tasks:</p><ol><li><strong>Plan, record, and communicate</strong> (Tasks, Agenda, Email, MS Teams, Journal)</li><li><strong>Taking a break</strong> (WhatsApp, Signal, Feedly, BBC News)</li><li><strong>Monthly reporting</strong> (Tableau, Adobe Analytics, Excel)</li><li><strong>User Story creation</strong> (Confluence, JIRA, Axure or Excalidraw)</li></ol><p>1 & 2 are 'reference tasks', I need these open all day as I'll check them frequently, 3 & 4 are examples of 'focused tasks', this is where I'd spend the majority of my day (I'd typically never have more than 2 of these on the go at the same time). Each of the above task groups is mutually exclusive. I'm either drafting my monthly report or taking a break, I'm not documenting a User Story while also communicating with a colleague via MS Teams. Many of the apps within each task group benefits from being visible at the same time e.g. when I'm planning my day it's good to see my task list and agenda side-by-side, when I'm checking to see who is trying to contact me, it's good to see emails and MS Teams open at the same time. Taking the above into account, you end up with the following basic requirements:</P><ol><li>The ability to group multiple apps together (by task). i.e. form 'task groups'.</li><li>The ability to view apps side-by-side within the task groups.</li><li>The ability to only view one task group at a time.</li><li>The ability to quickly switch between task groups.</li><li>The Windows Taskbar is poorly named.</li></ol><p>The Windows Taskbar does not show you a list of tasks, it shows you a list of apps (it's an "App bar"), and as I mention above, planning my day requires 2 apps, writing my monthly report requires 3 apps. There is no real task switcher in Windows i.e. there's nothing that allows you to easily switch between groups of apps (I think Windows Sets was Microsoft's proposed solution to this, it would have satisfied requirements 1, 3 & 4 from the list above....but not 2. But, it currently looks like Sets is not going to become a feature in Windows 10).</p><h3>Enter Virtual Desktops!</h3><p>First, let's start with a definition of what a virtual desktop is:</p><blockquote>In computing, a virtual desktop is a term used with respect to user interfaces to describe ways in which the virtual space of a computer's desktop environment is expanded beyond the physical limits of the screen's display area through the use of software. This compensates for a limited desktop area and can also be helpful in reducing clutter.</blockquote><p>Although virtual desktops have been around since the late 1980s, they were not available natively in Windows until the launch of Windows 10. Because virtual desktops are discrete, make full use of the real desktop, and allow fast switching via keyboard shortcuts, they satisfy all 4 requirements from my list.</p><h4>An example</h4><p>To keep things simple, I'm going to assume that I'm only working on a single focused task and am not taking any breaks. This leaves me with only two task groups required for my day i.e. 1) plan, record & communicate, 2) monthly reporting. For me, these task groups would look like those displayed in the image below:</p><img src="https://onlyrss.org/images/article2figure1.png" alt="sketch of dual displays" width="1938" height="377"><p>As I have a dual monitor setup, each virtual desktop includes both monitors. My first virtual desktop includes three web instances of Outlook (tasks, calendar, and emails), MS Teams (for chat and meetings), and Excel (for my journal). The second virtual desktop includes a web browser (product analytics via Adobe Analytics and Tableau) and Excel (monthly report). All the apps are open and sized appropriately, so there's no need to switch between, minimise, maximise, resize, or drag any windows. The only "window management" that's required is via the keyboard shortcuts that enable moving between virtual desktops i.e. Ctrl+Win+LeftArrow and Ctrl+Win+RightArrow. And it's this change that I believe is what makes virtual desktops so valuable.</p><p>It was only when I started to use virtual desktops in this way that I realised how much time I was spending scanning the taskbar looking for apps, moving them around, resizing them, and opening and closing them. And I was repeating this process multiple times per day as I was switching between tasks. With virtual desktops, I'll set up my reference desktop as soon as I start my day, I'll check for any unread emails, and see what meetings and tasks I have scheduled, once that's done, I'll then setup my focused desktop. Every 1/2 hour or so I'll quickly switch back to my reference desktop to see if there are any new messages or meeting requests, if not, I'll jump straight back into my focused desktop. The process of switching takes less than a second, and I've not had to hunt and peck at the Taskbar, or do any window managed to achieve this.</p><p>Even in this simple example with only 2 task groups, I've saved myself a lot of window management, but, typically I'd have 4 virtual desktops on the go, I'd have my 'taking a break' group, and sometimes a second focused group (I find it hard to focus on a single task for 8 hours, so I like to switch between two different tasks whenever possible).</p><h3>Using Windows Virtual Desktops</h3><p>To create a virtual desktop, click the Task View icon located on the Taskbar (or use the shortcut Win + Tab), then, in the top left corner, select "New desktop". To move between these 2 desktops, use Ctrl+Win+LeftArrow and Ctrl+Win+RightArrow.</p><p>While in the Task View, you can also drag apps into the virtual desktops, or right click the app and select "move to", to move apps between virtual desktops.</p><img src="/images/article2figure2.png" alt="sketch of dual displays" width="1938" height="377"><h3>What if I only have a small single display?</h3><p>If you are limited to a single small display, then it's likely that you are running your apps maximised and using the Taskbar to quickly switch between them. If this is the case, then virtual desktops aren't going to provide you with any extra utility (at least not as far as I can tell, if you've found them useful in this scenario, then let me know).</p><h3>Summary</h3><p>Virtual Desktops might not be for everyone, but since using them I've been surprised at how much more efficient I find my app management on Windows. Virtual Desktops is something I'll be sticking with, and I'm hoping that Microsoft continue to build on this new Windows 10 feature.</p>


        ]]>

      </description>
    </item>
    
    <!-- What even is OnlyRSS? -->
    <item>
      <guid isPermaLink="false">article1</guid>
      <title>What is OnlyRSS?</title>
      <link>https://onlyrss.org/pages/about.html</link>
      <pubDate>Sat, 06 Feb 2021 14:00:00 GMT</pubDate>
      <description>
        <![CDATA[

        <p>I've been using RSS feeds to aggregate web content for almost 20 years. I believe that having relevant content available in a single location makes the web a much better experience and makes me a far more productive and more knowledgeable person\employee. Unfortunately, many “modern” websites don’t support RSS, so I’m fighting back. To help readdress the balance, I’m publishing my blog articles as an RSS feed only. There’s no destination website (or CMS), the RSS feed will contain the entire article.</p><p>What does this mean? Well, for a start it makes my articles very difficult to find (and I’m ok with that), and it means that you (the subscriber) has full control over the reading experience via your RSS aggregator of choice.</p><p>I’ll probably only add an article once a month, and those articles will be on things that interest me and that I think might interest others, e.g., Data Viz, RSS, News BI tools, productivity tools etc.</p><p>If you see something in an article and want to comment, look me up on Twitter <a href="https://twitter.com/dbs_sticky">@dbs_sticky (MarkEvans)</a></p>


        ]]>
      </description>
    </item>
  </channel>
</rss>