Goodbye, Tortuga.

Thursday, April 25, 2024 

On April 21st, 2024, at 20:39, Tortuga was gently put to rest after a three year-long struggle with what was probably cancer and a short-lived victory over a mycoplasma bacterial blood infection.

She first took advantage of our yard-cat support program in 2009 as a juvenile cat and passed at about 15 or 16 years of age. She lived a good life, had 5 kittens on March 27th, 2010 that were all weaned and adopted out successfully, and grew old never wanting for food, shelter, or comfort, and never suffering any meaningful illness or injury until her last year.

Over the years, she was the beneficiary of a very strong community support network that took her in whenever she needed it and gave her loving care. She had housemates, human and feline, and a few canine over the years and was always gracious and pleasant, if not always enthusiastic about the four-legged companions.

I am eternally, deeply grateful to everyone who helped her over the years and who made my work and travel possible and Tortuga’s life pleasant and comfortable in my absence, especially in her later years as she needed more care.

She was the best, sweetest cat I’ve ever known. She was always polite, always pleasant, and never scratched or bit, not even when startled or annoyed by dogs. She never broke things or pushed things over or made a mess.

She wasn’t a big fan of other cats, and only a select few were tolerated as guests in her garden. She wanted to start every morning by marking her territory and she ruled her garden with a fierceness that vastly exceeded her tiny size. She started there, spent her last day in the sun there, and will spend eternity there.

Almost every night I was home, she slept in my bed with me. Almost every day I was working at home, she would hop up and sleep quietly between my keyboard and monitor on her little bed there. She didn’t meow much or fuss but purred easily and happily.

In later years, she’d sometimes wake me just before light by prodding my back or nipping to ask for pets; after 5 or 10 minutes of purring and being petted, she would settle back to sleep. It was a ritual that I came to very much enjoy.

Whenever I came home from my travels, no matter how late, as I opened the door into the living space, I’d hear her stir, jumping down from the attic maybe or from my bed or the window perch upstairs and tap-tap-tap down the stairs and trot up to greet me, rubbing my leg and purring. She’d let me scoop her up and snuggle her, though she wasn’t normally a carry cat, and then walk circles around me for 10 or 15 minutes, welcoming me home in the sweetest way possible. She came to know my departures too and always gave me a look of disappointment, sometimes refusing to come to the door to see me off, but usually relenting for one last scritch on the head.

When Corona hit in 2020, I was in Iraq after leaving her in January of 2020 thinking I’d be back in the spring. I couldn’t make it home for almost two years. The longest I’d been away before then was less than 6 months and even that only once or twice. She’s a cat, and by then an old cat, so I didn’t expect much, but in January of 2022, I opened the door late at night to the sound of her tap-tap-tapping down the stairs to greet me.

She was laid to rest in the garden she ruled for 15 years.

I went through the thousands of pictures I’ve taken of her and others have shared with me and tried to find a few from every year from her first foray in 2009 until her last day. If you knew her at some point during this time, I hope this brings back fond memories of a very special kitty.

2009: Tortuga finds food, takes over a house, and becomes part of the family.

2010 Tortuga has kittens and settles into her role as queen of the garden.

2011 Tortuga takes ownership of my desk.

2012

2013

2014

2015

2016

2017

2018

2019

2020 Corona time.

2021 Corona time.

I didn’t get to see Tortuga at all from January of 2020 until January of 2022.

2022 Reunited.

2023

A typical welcome home when I’d been away too long.

2024 The queen of the garden forever.

Posted at 08:35:14 GMT-0700

Category: Cats

A one page home/new tab page with random pictures, time, and weather

Thursday, April 11, 2024 

Are you annoyed by a trend in browsers to default to an annoying advertising page with new tabs? I sure am. And they don’t make it easy to change that. I thought, rather than a blank new tab page, why not load something cute and local. I enlisted claude.ai to help expedite the code and got something I like.

homepage.html is a very simple default page that loads a random image from a folder as a background, overlays the current local time in the one correct time format with seconds, live update, and throws up the local weather from wttr.in after a delay (to avoid hitting the server unnecessarily if you’re not going to keep the tab blank long enough to see the weather).

Images have to be in a local folder and in a predictable naming structure, as written “image_001.webp” to “image_999.webp.” If the random enumerator chooses an image name that doesn’t exist, you get a blank page.

Browsers don’t auto-rotate by exif (or webp) metadata, so orient all images in the folder as you’d like them to appear.

The weather information is only “current” which isn’t all that useful to me, I’d like tomorrows weather, but that’s not quite possible with the one-liner format yet.

How you set the homepage and new tab default page varies by browser.  In Brave try hamburger->appearance->show home button->select option->paste the location of the homepage.html file, e.g. file://home/gessel/homepage.html.

The pictures are up to you, but here’s the code:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>New Tab</title>
  <style>
    body {
      margin: 0;
      padding: 0;
      height: 100vh;
      display: flex;
      justify-content: center;
      align-items: flex-start;
      overflow: hidden;
    }

    #background-image {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-size: cover;
      background-position: center;
      z-index: -1;
    }

    #time-date {
      position: absolute;
      top: 20px;
      right: 20px;
      font-size: 48px;
      color: white;
      text-shadow: 3px 3px 8px rgba(0, 0, 0, 1);
      font-family: sans-serif;
      font-weight: bold;
    }

    #weather {
      position: absolute;
      bottom: 20px;
      left: 20px;
      font-size: 24px;
      color: white;
      text-shadow: 3px 3px 8px rgba(0, 0, 0, 1);
      font-family: sans-serif;
    }
  </style>
</head>
<body>
  <div id="background-image"></div>
  <div id="time-date"></div>
  <div id="weather"></div>

  <script>
    // Function to get a random image from the 'image_001.webp' to 'image_230.webp' range
    // Edit image folder to match the folder you want to store the images in
    // edit the min and max image index range to match the images 
    // set the imageName extension to suit (e.g. .jpg, .webp, .png)
    // white screen usually means the images or folder can't be found
    function getRandomImage() {
      const imageFolder = '.images/';
      const minImageIndex = 1;
      const maxImageIndex = 230;
      const randomIndex = Math.floor(Math.random() * (maxImageIndex - minImageIndex + 1)) + minImageIndex;
      const imageName = `image_${randomIndex.toString().padStart(3, '0')}.webp`;
      return `${imageFolder}${imageName}`;
    }

    // Function to update the time and date display
    // Updates every second, uses the only technically correct* date and time format
    // * The best kind of correct.
    function updateTimeDate() {
      const dateTimeElement = document.getElementById('time-date');
      const currentDate = new Date();
      const year = currentDate.getFullYear();
      const month = String(currentDate.getMonth() + 1).padStart(2, '0');
      const day = String(currentDate.getDate()).padStart(2, '0');
      const hours = String(currentDate.getHours()).padStart(2, '0');
      const minutes = String(currentDate.getMinutes()).padStart(2, '0');
      const seconds = String(currentDate.getSeconds()).padStart(2, '0');
      const formattedDateTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
      dateTimeElement.textContent = formattedDateTime;
    }

    // Function to fetch and display the weather information
    // The delay is set for 10 seconds to avoid hitting the wttr.in server if you're just 
    // opening a tab to enter a web address.  Hopefully one-line forcasts will be implemented
    // soon - check https://github.com/chubin/wttr.in/issues/447 for progress
    async function updateWeather() {
      const weatherElement = document.getElementById('weather');
      try {
        await new Promise(resolve => setTimeout(resolve, 10000)); // 10-second delay
        const response = await fetch('https://wttr.in/?m&format=%l%20%c+%C+%t%20+%h%20+%w\n');
        const weatherData = await response.text();
        weatherElement.textContent = weatherData;
      } catch (error) {
        console.error('Error fetching weather information:', error);
        weatherElement.textContent = 'Error fetching weather information.';
      }
    }

    // Set the random background image
    const backgroundImage = document.getElementById('background-image');
    backgroundImage.style.backgroundImage = `url('${getRandomImage()}')`;

    // Update the time and date every second
    setInterval(updateTimeDate, 1000);

    // Update the weather information every 100 minutes
    updateWeather();
    setInterval(updateWeather, 6000000);

    // thanks to claude.ai for helping with the scripts.
  </script>
</body>
</html>

 

Posted at 05:48:19 GMT-0700

Category: CodeHowToLinuxTechnologyWeather