Sites Relaunched - 2024 Edition

It’s been a while since I’ve posted anything here. I’m sorry. I’ve neglected the site and blog.

Recently, I decided that I should rework the site and blog. I totally called this in my Moved From Jekyll to Ghost post in 2022. I seem to get the urge to change everything with the site every few years. This is one of those times.

My last big blog move was from Jekyll to Ghost. This time, I’m going the other way. I’m moving back to Jekyll from Ghost.

Why?

I like the Ghost platform. I was paying for hosting from DigitalPress. They are a great hosting company. The thing is, I just wasn’t using the service enough to justify the monthly cost. It wasn’t expensive, but it does cost something.

I can host the blog and site for free from Netlify. The sites are deployed from GitHub, where I host the code for both sites.

I keep saying sites. Technically, there are two sites. There’s the blog and the rest of it. When I started this latest rework, I wasn’t going to include the blog at all. So I made the rest of the site without the blog. Then I thought I should include the blog again, just in case I wanted to start writing blogging more.

The site (www.ryangrier.com) is a static html site. I used HTML and Bootstrap to create the site. The code is available on GitHub. The site is hosted on Netlify. I created this first. I had it launched for a week or two before deciding to re-add the blog.

The blog (blog.ryangrier.com) uses Jekyll to generate the site. I created my own “theme” here that roughly matches the rest of the site. This code for the blog is also available on GitHub.

I have my old RSS URLs redirect to the new RSS URL. I did not however redirect all of the old posts. That was going to be a lot of work that I’m not really interested in doing. The blog is mostly for me anyway. I don’t think anyone is reading it.

Where’d the older posts go?

I originally imported all of the posts from Ghost. As I was cleaning up some of the old posts, I realized they were outdated. A lot of the non-technical ones didn’t need to be here anymore. So as this post was published, I removed those older posts.

I’ll likely hold onto a lot of the personal posts for about a year and then remove them. I plan on keeping the technical posts around for longer (or forever), I haven’t really decided yet.

If you really want to get to those older posts, you can find them (with some work) in the GitHub repository.

So, what’s next?

What’s next? I dunno. This may be it. Or I may decide to start writing blogging again.

Revisiting The Legend of Zelda- Breath of the Wild

Almost three years ago, I had written a post about The Legend of Zelda: Breath of the Wild. At the time, I had written that I didn’t like Breath of the Wild despite attempting the game on three different occasions. I couldn’t get into it.

Earlier this year, The Legend of Zelda: Tears of the Kingdom came out. Just before Tears of the Kingdom came out, I decided to give The Legend of Zelda: Breath of the Wild another chance.

This time it finally grabbed hold of me. The fourth time was the charm.

I started the game over from the beginning, again. This past Friday, I finished the main storyline of Breath of the Wild. I did it! Go me.

My BOTW Stats according to the loading screen

This (above) was all that I’ve done in the game.

I freed all four of the Divine Beasts. I got the Master Sword. I did not acquire the best armor or fully upgrade my armor. I was a bit nervous about the final boss fight before heading into it. I texted my friend, and local Breath of the Wild expert, Andy, beforehand and he said it would be a cakewalk. It was. I beat the boss on my first attempt.

I think I got the True Ending to the game. I freed all of the Divine Beasts and recovered all of Link’s memories.

As a caveat, I did cheat things a bit. I used a lot of Amiibo cards to get free gear and resources each day I played. It made things easier for me.

My playing time for Breath of the Wild: 75 hours

My total playing time for Breath of the Wild is 75 hours. That may seem like a lot for a video game, but this was over four separate attempts.

I’ve previously said that I didn’t like Breath of the Wild. But I’ve changed my thinking a bit there. I ended up enjoying the game.

I still find the durability of weapons tedious. But I’ve grown to appreciate the cooking. I still really enjoy the huge open world and finding (and solving) the shrines.

So what changed this time? I’m not sure.

The Legend of Zelda is one of my favorite video game franchises. I may have thought that this style of game was a one-off. The popularity of Breath of the Wild should have proven to me otherwise. The added popularity of Tears of the Kingdom is further proof.

I’m not sure what to play next. I’ve only played (and finished) two video games this year. Both games were very long (70+ hr games).

I have many games to play (including Tears of the Kingdom). I also have the Breath of the Wild DLC. But I may just need a shorter game as a palette cleanser.

MyCntdwn Is Still Being Used

In late 2019, I removed my first app, MyCntdwn, from the App Store. It was a sad day for me, but it was also time. I had been hemming and hawing on whether I wanted to continue to support MyCntdwn (and Showers: White Noise Generator). I finally decided to stop developing it and haven’t looked back.

Every week, I get an email from Apple with app usage statistics. This email also includes usage statistics for apps that are no longer listed. I find these emails interesting.

MyCntdwn Usage in April 2023

The image above is part of this week’s email. It shows that MyCntdwn had 375 sessions from opted in users in the past week. Isn’t that crazy? MyCtndwn is still being used by some people. Not many, but by some. The app hasn’t been updated since 2017 and was removed from sale in 2019.

Part of me would love to post one more update to the app. That update would just tell people to download Daniel Gauthier’s excellent Up Ahead app.

These emails from Apple telling me poeple are using the app haven’t perked my interested in reviving MyCntdwn at all. But I’m glad that some folks are still getting use out of a very old app.

Books: March 2023 Update

It’s already March of 2023. Crazy huh? Time is flying by.

I’m keeping up my long habit of reading a lot of books. I am not a fast reader, but I tend to read every day. I also listen to books which helps.

I’ve already finished nine books in 2023. I thought I would give my thoughts on a few of those books below.

Fletch and the Widow Bradley

I finished Fletch and the Widow Bradley by Gregory McDonald in early January.

I started reading the Fletch books shortly after I heard them as a recommendation on MacBreak Weekly. On episode 838, Andy Ihnatko recommended the Fletch series of books. He noted that they are included as part of an Audible subscription. I’ve been listening to these books through Audible.

The first few books were really good. Fletch and the Widow Bradley book wasn’t as good as the first two.

These books are fast reads. I’m about halfway through the series (currently reading Fletch’s Moxie). I’ve been reading these in between longer books.

Rules of Civility: A Novel

Like I said in my Some of my favorite things - 2022 Edition post, Amor Towles was suggested to me by a soccer parent. She not only recommended A Gentleman in Moscow, but all of Amor Towles’s books.

Rules of Civility: A Novel by Amor Towles is fantastic. I started reading this book late last year but didn’t finish until early this year. It details how a chance encounter could change someone’s life in an unexpected way.

This isn’t an action-packed or high-suspense novel. However, there were evenings when I didn’t want to put the book down. I really enjoyed it.

The Three-Body Problem

I was recommended The Three-Body Problem by Cixin Liu (translated by Ken Liu) a few years ago by a good friend of mine. At the time, I tried to get into it, but just couldn’t. Oddly enough, this was around the same time I tried getting into The Expanse series. I must have been in a weird state during that time.

I tried again earlier this year. This time I not only made it through the entire book, but I loved it.

The Three-Body Problem is a fantastic Sci-fi novel. It takes place in China over a few decades. This is the first in a series of novels. I’m looking forward to reading the next book in the series.

The Lincoln Highway: A Novel

I just finished The Lincoln Highway: A Novel by Amor Towles this past week. I’ve now read all of his novels.

The same soccer parent who recommended this book, also lent me this book to read. My wife and kids joke that I’m now part of a soccer book club.

This book is slightly different than the others from Amor Towles. Each chapter is from a different person’s perspective. But it was also an excellent book.

Amor Towles has quickly become one of my favorite authors. I’m looking forward to more work from him.

Wrapping up

These weren’t all of the books that I’ve read so far in 2023. But these are the most memorable.

All of the books above are great reads if you’re looking for any suggestions.

Book links are affiliate links through bookshop.org.

Stopwatch Project

I’m still looking for a new project to work on. Previously, I had mentioned that I built a Podcast Downloader. That project will (still) likely never see the light of day.

I’ve also been working on something else. This is a replica of Apple’s Stopwatch functionality in the Clock app. This project has been open-sourced on my Github account. You can view the project here.

It’s not a complete replica of the stopwatch functionality. I only implemented the digital version and not the analog version. I’m not sure I have the patience to attempt to implement the analog version. I also didn’t implement the iPad or macOS versions of the stopwatch. I only focused on the iPhone version.

Why?

Why did I do this? I did this so I can continue to improve as a software engineer.

I don’t get as much time to write code anymore. At least not as much as I want to. Even at my day job, I spend more time not writing code. I like to believe that projects like this keep me from getting rusty.

As I’ve said, I don’t currently have a personal project to work on. So something like this helps me to continue to learn new technologies and stay current.

Development Process

This project was developed over roughly two weeks. I only worked on it for roughly an hour a night and not every night.

The project has been sitting untouched for a few weeks on my laptop. I wasn’t sure if I was going to post it at all. I finally decided to post it.

The project wasn’t code reviewed or tested too rigorously for issues. It probably isn’t my best work. It also isn’t my worst work. Overall, I’m happy with how it turned out.

Technologies

The project is written in Swift, SwiftUI, and Combine and uses an MVVM-like architecture. I am still learning each of these technologies and approaches.

Swift

I’ve been using Swift since it was announced at WWDC in 2014. I haven’t written much in Objective-C in a few years. Swift is the way to go.

Even though I have been using Swift for years, I still have a lot to learn. I didn’t learn anything new with Swift in this project. Instead, I focused on learning more about the next two technologies.

SwiftUI

I’m still new to SwiftUI. I’ve used it here and there in the past. However, I’ve never built an entire app using SwiftUI. This is a first for me.

This app is simple, but I’ve learned valuable lessons from what I have done.

At work, we’ve been slowly writing new features using SwiftUI. I think the code I wrote here will help at work.

Combine

I’ve been interested in Combine since it was announced. At the time, I had started using Combine for simple things, like dealing with notifications from NotificationCenter.

We use Combine (and RxSwift) heavily at work. It took me a while to start learning the concepts. I still need to occasionally look at guides on Combine. Any extra experience I can get with Combine (and reactive programming) is welcome to me.

I’ve come a long way with my Combine knowledge in the last few years. But I have so much more to learn.

Testing

I have always been an advocate for unit testing. The problem is that unit testing is always the last on my mind when developing. I love the idea of having unit tests, I’m just not very dedicated to writing them.

I’m trying to do a better job of that, including this project. I probably don’t need any unit tests for something like this. The entire project is an experiment. But I need to start somewhere. So, I included unit testing.

I could improve the unit testing in many ways. I could probably use something like ViewInspector to test the SwiftUI views.

I should also provide a deterministic way to test the display strings that are generated by the StopwatchViewModel class while the timer is running. Instead of hard-coding the .main RunLoop in this method:

private func startTimer() {
    timerCancellable = Timer
        .publish(every: 0.01, on: .main, in: .common)
        .autoconnect()
        .sink { [self] newDate in
            let difference = (date ?? .now).distance(to: newDate)
                
            date = newDate
            overallInterval += difference
            currentLapInterval += difference
        }
}
A Swift function that starts a timer

I could start the timer, stop it, and ensure the value is not the default display string value of “00:00.00”, but that’s not a great test. Ideally, I would advance the timer at different intervals and test the results.  

I wonder if Point-Free’s Combine Schedulers Publishers.Timer would work here. This approach would allow using any scheduler (including their TestScheduler) instead of  RunLoop.  This would allow me to advance the schedule as I desired and make the tests more deterministic.

I didn’t use this approach only because I didn’t want to depend on external libraries for this project. It was initially a thought experiment. If I would ever want to make this a full-scale app, I would investigate using Publishers.Timer.

Coverage

Stopwatch App Code Coverage Results - Showing 78.2% Coverage

The coverage on the app is decent. It’s at about 78%. It could be better. I think if I were using a testing framework like ViewInspector, I could test the SwiftUI views and get better coverage.

Summary

I’m happy with how this turned out. I didn’t spend a crazy amount of time on it. I don’t have a lot of time each night to write code. Often, I don’t get any time at night to write code.

This was a fun little experiment.

OlderNewer