Categories
Meta

A Good Old-Fashioned Internet Rabbit Hole

Prevailing wisdom suggests any chunks of time spent online will be steeped in outrage, anger and division. I recently spent a bit of time online and experienced none of the above. As an added bonus I learned quite a few apparently unrelated facts.

When is a condominium not a condominium? What is the email address for the Austrian Consul-General in BC? And what country governs Pheasant Island?

These are just some of the questions whose answers I learned on my recent random walk. And if you manage to read to the end of this post, you too will learn the answers to these questions and so much more…

It all started when I wanted to find out if there were any diplomatic offices in the building at 800 Pender. (But I’ll save that story for another day.) It turns out the BC Provincial Government keeps a comprehensive list of all consular offices in the province. Well done BC Government.

It turned out there are no consular offices at 800 Pender, but holy cow, the email addresses were all over the map. To be fair, about half of them were explicitly affiliated with the home country government. eg, El Salvador

Of the remainder, they seemed to fall into two categories. In the first category, the email seemed to be the personal email of the consul general, using one of the usual providers (eg. gmail, outlook, shaw.ca etc.) Well done Jamaica scoring a free sfu email address.

The third category is email addresses associated with website that is to some degree dedicated to the consul office. eg Bosnia and Herzegovina (BiH).

This got me wondering, what do I see if I go to bcbih.com? It’s a pretty snazzy website, with sections for Tourism, the CV of the Consul, investing in BiH, and investing in RS… Wait, what the heck is RS? Oh, the Republic of Srpska. Wait, what the heck is the Republic of Srpska, and who stole all their vowels?!

It turns out (according to Wikipedia) Republic of Srpska (RS) is an entity within BiH. It further turns out BiH contains 2 entities of roughly the same geographical area:

  • Republic of Srpska (primarily populated by ethnic Serbs)
  • Federation of Bosnia and Herzegovina (primarily populated by Bosniaks, and to a lesser extent Croats)

I was definitely not aware that BiH was divided geographically and ethnically in this way. If somebody told me Bosnia and Herzegovina was composed of two approximately same-sized entities, I’d have guessed one was Bosnia, the other Herzegovina. Wrong! Bosnia and Herzegovina is composed of Srpska and Bosnia Herzegovina. I had so many questions here, but I got distracted by Brčko. (pink in the map above)

It turns out Brčko is a condominium. Wait, what? According to Wikipedia, this flavour of condominium is defined as: a territory … in or over which multiple sovereign powers formally agree to share equal dominium … and exercise their rights jointly, without dividing it into “national” zones.

It’s like joint custody, but for countries instead of parents. Antarctica and Post-WWII Germany are two high profile examples of condominia. Wikipedia includes an impressive list of the current condominia. The one that caught my eye was Pheasant Island.

Pheasant Island is near the mouth of a river (Bidasoa) that defines the border of France and Spain. According to Wikipedia, Pheasant Island became a condominium when the Treaty of the Pyrenees was signed in 1659. According to the treaty the island lives with Spain from 1 February until 31 July. For the remainder of the year (1 August until 31 January) it lives with papa France.

In a world where things seem fairly firmly bolted down, geopolitically, I love the fact that there are quirky things like islands that switch from one country to another every six months.

Again, according to Wikipedia “there are no pheasants on Pheasant Island.” I wonder if there are any condos…

Categories
Software

A Simple Way to Conform to Identifiable Without adding an ID to a Legacy Data Model Object

As the title suggests, I have a mature data model, and I want to add conformance to Identifiable but (for backwards compatibility reasons) not actually add id as an instance variable

My model object in question already implements Hashable, so plan A was to use the hashValue generate id. Sadly hashValue is an Int and id needs to be a UUID. So how does one convert an Int to a UUID?

As is often the case there was a discussion on StackOverflow offering alternatives. The option that leapt out at me introduced to Swift language options I had never used before.

  1. withUnsafeBytes
  2. load(fromByteOffset: as:)

withUnsafeBytes is an array ‘operator’ that will (I believe) iterate over all the bytes in the array. load will pour the bytes into a new object whose type is specified by the as: parameter. As somebody who has done a small amount of writing c and ZERO c++ this code feels very foreign to me.

I chose to solve my problems with two pieces of code. First I extended Int like this:

extension Int {
    public var asID: UUID {
        let vals: [Int64] = [Int64(self), 0]
        return vals.withUnsafeBytes { $0.load(as: UUID.self) }
    }
}

I then added Identifiable conformance like this:

extension Thread: Identifiable {
    public var id: UUID {
        return self.hashValue.asID
    }
}

Solving this problem reminded me just how much complexity there is ‘under the hood’ in almost any code we write. I find it amazing that:

  1. There are smart people who are well versed in the (obscure?) corners of the software engineering information domain.
  2. By invoking an appropriate combination of keywords in the search bar, I can be connected to the helpful guidance created by these smart people.

Yay technology!

Categories
Software

SwiftUI TextField Focus

When a new view gets presented on the screen (for example a password entry view) most of the time it makes sense to start with the focus in the text field. The keyboard should be visible and the user should be able to just start typing. Sure it’s a minor inconvenience to force users to first tap in the field, and then start typing, but heck we’re not savages are we?

UIKit’s UITextfield always had support for programmatically setting focus via UIResponder. [myTextField makeFirstResponder]

I get the sense this functionality has been gradually evolving in SwiftUI. I feel like the current implementation is more complex than the UIResponder model from yesteryear. I don’t want to sound like I’m grumbling here, and I feel like the complexity is needed to stay true to the SwiftUI model (composability, single source of truth, etc.) Having said that, I did need to iterate way more than anticipated.

The first piece is the @FocusState descriptor used to describe a variable in a View struct. There appear to be two ways to use FocusState.

  1. a Binding<Bool> type when there is a single View that either has or does not have focus
  2. a Binding<enum?> type where there are multiple views, and maybe one of them has focus, or maybe none of them have focus.

I should point out that the notion of focus here is broader than just text entry views. Any type of View and have focus, but the expected behaviour for focus in non-textEntry views is beyond the scope of this post.

Here is an example of how to use a Binding<Bool> FocusState

struct AddEntryView: View {
    
    @Binding var unsavedData: String
    @FocusState var addEntryHasFocus: Bool

    var body: some View {
        TextEditor(text: $unsavedData)
            .focused($addEntryHasFocus)
            .defaultFocus($addEntryHasFocus, true)
    }
}

Here is an example of how to use a Binding<enum?> FocusState

struct PasswordView: View {
    enum PasswordField {
        case secure
        case regular
    }
    @FocusState private var passwordField: PasswordField?
    @State var passwordText1: String = ""
    @State var passwordText2: String = ""
    let passwordExists: Bool

    var body: some View {
        VStack() {
            SecureField("Enter password", text: $passwordText1)
                .focused($passwordField, equals: .secure)
            TextField("Create a password", text: $passwordText2)
                .focused($passwordField, equals: .regular)
        }
        .defaultFocus($passwordField, .secure)
    }
}

Unfortunately, my use case is sort of in between these two implementation options. I only want one field, but sometimes I want it to be a TextField, and sometimes I want it to be a SecureField.

struct PasswordView: View {
    @FocusState private var passwordField: ????
    @State var passwordText: String = ""
    let passwordExists: Bool

    var body: some View {
        if passwordExists {
            SecureField("Enter password", text: $passwordText)
                .focused(????)
        } else {
            TextField("Create a password", text: $passwordText)
                .focused(????)
        }
    }
}

Since there will only ever be one field displayed, I naively thought I could just use the same Binding<Bool> var for both SecureField and TextField. Sadly those values just get ignored. So I need to use the enum approach, even there will only ever be a single field.

And just to add a bit of insult to injury, I wasn’t able to get .defaultFocus working. According to an Apple Engineer in the dev forums, I may have uncovered a bug. woo! All that to say, my next attempt looked something like this.

struct PasswordView: View {
    enum PasswordField {
        case secure
        case regular
    }
    @FocusState private var passwordField: PasswordField?
    @State var passwordText: String = ""
    let passwordExists: Bool

    var body: some View {
	VStack() {
            if passwordExists {
                SecureField("Enter password", text: $passwordText)
                    .focused($passwordField, equals: .secure)
            } else {
                TextField("Create a password", text: $passwordText)
                    .focused($passwordField, equals: .regular)
            }
        }
        .onAppear {
            passwordField = passwordExists ? .secure : .regular
        }
    }
}

BUT, I encountered a life cycle issue. .onAppear gets called before the document gets loaded. In my case, the document contents determine whether to show the TextField or the SecureField. So I needed to replace .onAppear with onChange. So here’s an approximation of my final code.

struct PasswordView: View {
    enum PasswordField {
        case secure
        case regular
    }
    @FocusState private var passwordField: PasswordField?
    @State var passwordText: String = ""
    @Binding var document: TurtleDocument

    var body: some View {
	VStack() {
            if document.passwordExists {
                SecureField("Enter password", text: $passwordText)
                    .focused($passwordField, equals: .secure)
            } else {
                TextField("Create a password", text: $passwordText)
                    .focused($passwordField, equals: .regular)
            }
        }
        .onChange(of: document.encryptedData) {
            passwordField = document.passwordExists ? .secure : .regular

        }
    }
}
Categories
Software

Investigating SwiftUI Document-based Apps

My Turtle app is a document-based app (iOS and MacOS) was written a long time ago. The iOS version relied heavily on UIDocumentBrowserViewController for managing the documents. After a couple of years of neglect the document management was starting to have problems. The iOS version wasn’t able to create new documents. Also closing and saving a document seemed to fail about half of the time.

Eventually these problems made the app unusable enough that I started weighing my options on how best to get things working again. I first considered doing something incremental, focussing on specific issues with the iOS build and sticking with the UIKit based implementation.

But then I saw a WWDC video demonstrating how to get started building a SwiftUI Document based app. I felt some trepidation that there would be a lot of refactoring from UIDocument to SwiftUI’s Document. The UIDocument subclass included metadata that in hindsight was could/should have been UI state. The original implementation also includes complexity related to supporting one iOS target and one macOS target. Last but not least, Turtle supports two different document formats. (Legacy and Threaded) I’m positive I’ve done a bad job of structuring the code to support these two document formats. Moving to a SwiftUI DocumentGroup would require rebuilding this.

So despite all these reasons to stick with the messy UIKit implementation, I jumped into a SwiftUI implementation. While I still have some functionality gaps, on the whole this conversion has been satisfying and even fun.

Future posts will detail some of the issues I’ve encountered along the way.

Categories
Cycling

Van Isle 2024 Bike Trip – Day 7

Go back to Day 6

I was heading home today. Purely out of stubbornness I had not consulted the Swartz Bay ferry schedules. In hindsight, I’m not sure what my motivation was for this.

Leg 1 Ruckle -> Fulford Harbour

Ruckle Provincial Park to Fulford Harbour ferry terminal

I got an early start. The sun was barely up. My tent was covered with a very heavy dew. A downside to solo cycling is that it’s hard to shake dry a fly on your own.

The ride to Fulford felt like it took 10 minutes. When I got to the terminal, the recently departed ferry was chugging away, and asking me: ‘Dude, why didn’t you just check my schedule??’

But this extra time at Fulford was truly a gift. It gave me time to brave the long coffee shop queue and eat one of the yummier cinnamon buns I’ve ever come across. Holy cow it was good.

Leg 2 Tsawwassen -> Home!

Tsawwassen to Home. Two enthusiastic thumbs up for Delta’s cycling infrastructure.

Waiting at Swartz Bay, I met a couple of other cyclists. One was a nice, happy guy from Seattle travelling light (ie staying in hotels, eating in restaurants) He was aiming to get to Vancouver and then put his bike on Amtrak to get back home. It sounds like you can just wheel your bike onto the train as is. No disassembly required. Definitely worth investigating.

The three of us were getting ready to disembark at Tsawwassen, we were weighing our options. Either put your bike on the bus, to get us past the tunnel, or head way east to pedal over the Alex Fraser Bridge. Seattle guy and the other cyclist were both more pragmatic than me and opted for the bus. I guess that makes me the dogmatic one. According to Google Maps I had a route through Delta what would avoid the highways. Easy peasy, right?

It turns out the ride through Delta was a little piece of heaven. It was almost all quiet farm roads. There was a great bike tunnel under the tunnel highway. Full disclosure: there was also a delicious tailwind pointing almost due north. Ascending the Alex Fraser Bridge was way easier than the Cusheon Lake hill on Saltspring.

Once over the big bridge I was in familiar territory. Queensborough, over the bridge into New West, follow the Skytrain to Central Park, 45th Ave to Earles, pick up the Skytrain path again and then home.

Just before getting home I stopped in Side Saddle (where I’d bought my bike 2 months ago) to thank them for helping make my trip possible. Since I’d stopped, I decided I could probably also pick up a cookie from Flourist. The person working cash asked me: ‘Did you bike here?’ Many answered passed through my brain, but they all seemed complicated, long winded and unfunny, so I just smiled and said ‘Yes I did!’

‘In that case you deserve a treat!’

A delicious ending to a wonderful trip.

🍪

Categories
Cycling

Van Isle 2024 Bike Trip – Day 6

Go back to Day 5

Rest day @ Ruckle

Unlike my previous day off, this one didn’t include any ambitious cycling outings. I didn’t even touch my bike until well into the afternoon. Instead, I chilled in a hammock that was set up on the beach near my site. I also walked north along the shore, just to see what I’d see. I even ate oatmeal for the first time on the trip.

The highlights of the early part of the day were the hammock and seeing an otter, swimming, and then later skulking about on the beach.

Later in the day, I walked in the other direction (ie past Grandma’s Beach and the historic farmhouse) Once I came out to the road I saw another farm house off in the distance. I’d passed this farmhouse on my ride yesterday. If I recalled correctly it had a sign at the side of the road that said things like: ‘Coffee’, ‘Lamb Sausage’, ‘Treats’

Hard to see the Treats sign from this angle, but trust me, it’s there.

I had no trouble convincing myself it would be a very good idea to further investigate the aforementioned ‘Treats.’ I walked the last stretch of road to the farm, despite having exactly $0 in cash.

Like many other stands on Saltspring, this was completely unattended and relied on customers to be honest. I saw a place where I could leave cash, but didn’t see any way of paying with my credit card. So sad! But then I noticed a sign on the wall describing how to pay with e-transfer. Nice! Last I checked, my phone was at 4%, should be enough to buy a treat or two. Hmm, actually my phone is at 2%, and when I open my bank up, it spins and spins and then times out. Try again. Black screen. Thanks for playing. No treats for you.

Hmm, how to get the electrons from that cable to jump inside my phone….

I start heading back to camp, keeping an eye on the power lines, seeing if there might be a public outlet where I could smooch1 some power. Most of the way back toward the campground there was a charging station for e-bikes. I thought of my e-bike Dover friend from yesterday and wondering if he’d made it this far and if he charged up here.

Despite the stern ‘E-Bike Charging Only!’ sign I tempted fate and hung there for a while, charging my phone. When I felt things were sufficiently charged I trudged back to the farm for my elusive treat. After no small amount of deliberation I picked my treat and tried to pay. Needless to say, the cell reception was still sucky, so I decided I walk back toward camp, where reception was excellent. When I got back to the charging station, I was able to login on my bank app. phew! I would be able to clear my name.

Please enter the amount you wish to transfer. $2.50 (the price of the treat)

Minimum amount: $5

Huh, I guess I have to leave a big tip. Send. Hmm, or I could go back and get a second $2.50 treat. I have to admit I was worried how it would look, as I go back to the farm and grab a treat, and walk away. ‘Hey you didn’t pay for that.’ ‘I did, I overpaid for this other thing using my phone. But I probably can’t prove it now because there’s no cell coverage here!’

As fate would have it, I arrived at the treat stand at the same time as a dozen English hikers. There was also a farm worker (farmer?) feeding a pen of goats in an entertaining way. The hikers were much more interested in the goat feeding than a self conscious treat thief. But just to make sure, I pulled out my phone and tapped on the screen a bit, to make it look like I might have been sending money to somebody. Performative Payment.

For the record, the treats were a delicious combination of Peanut Butter and chocolate.

The rest of my rest day was consumed with hanging in the hammock, cooking and eating.

#HammockLife
Patak Paneer with sautéd carrots and kale. So good.
The fisher dudes sharing the beach with me.
Driftwood; looking toward Swartz Bay

Go to Day 7

  1. Using ‘smooch’ here is a tribute to France Jacques, who once referred to her landlord letting her ‘smooch the house’s cable signal’ ↩︎
Categories
Cycling

Van Isle 2024 Bike Trip – Day 5

Go back to Day 4

I felt good, getting up early, but was wondering whether I could handle big days back to back. Would I even make it? At least I had more Powerade to keep me charged up and electrolytic.

Leg 1 Rathtrevor -> Crofton

Rathtrevor Provincial Park to Crofton ferry
So long Rathtrevor. Nanoose Bay, here I come!

Biking through Nanaimo was easily the worst part of the trip. There were big chunks that were off the highway, but it often felt like cycling through multiple bath tubs.

  1. Ride down a crazy steep hill into a valley
  2. Pass a few kilometres on an E&N rail trail
  3. Ride back up a crazy steep hill and then do it all over again.

Also, many stretches of the paths had been under run with tree roots which had the effect of sprinkling many speed bumps (usually a foot or two apart from each other) along the way. This isn’t a big problem on an unloaded bike, but riding with panniers made these sections exciting, in a not good way.

Also, at one point I was coming up behind a woman walking her dog. I dinged my bell a couple of times to reduce the chance of scaring them. I guess neither the woman nor the dog heard the bell, because as I was riding past the dog lunged at me, knocking me over.

I was so mad/scared, but I didn’t really know what to do. I was definitely not enjoying myself in Nanaimo. The other ‘boohoo; poor me’ thing that happened is my phone died, so I had to either just stay on the highway, or run the risk of getting trapped in a dead end. (eg Transfer Beach) I also convinced myself it would be a good idea to bike into the downtown area of Ladysmith. Little did I know it was two steep uphill blocks to get there, and that it was mostly closed.

From there, I just stayed on the highway until I was through Chemainus. I then asked the nice lady selling Powerade if I could get to the Crofton ferry off the highway. She assured me I could and that mostly I needed to just follow my nose and head to the pulp mill smell. This turned out to be excellent advice.

As an added bonus, I arrived at the Crofton ferry with about an hour to hang out in a bakery/café that had yummy cookies and power outlets.

Also, while waiting in Crofton I met an interesting (chatty) dude who was heading over to Saltspring on his e-bike. He told me quite a bit about how he’d spec’d all the components, built the bike himself, all the trade-offs between having the motor in the hub vs in the BB, efficiency, etc. He also told me he’d lived quite a while in Dover, and in ‘different parts of Asia.’ (he mentioned Korea and China)

He was hoping to bomb around Saltspring, see the sights, and have enough juice in his battery to get back home.

One last point I think bears mentioning: On the map above there is a light blue route that would have bypassed all of Nanaimo. The previous evening, I was intending to take this route. It would have had me on logging roads, rather than JinglePot road. I ended up taking the route through the city, for the following reasons:

  • The bypass route had a lot of turns, and I’d need to have my navigational wits about me (not my strong suit)
  • I was pretty sure my phone battery was probably going to get to 0 sometime during the day.
  • Since I was travelling on my own, if I ran into bike or injury problems, I could be quite stuck in the middle of now where

Jim and Melissa very diplomatically (mostly Melissa) pointed these things out to me. When I was falling asleep, I was pretty certain I’d be taking the remote route. By the time I got up, I’d changed my mind, and opted to take the road more travelled. I wonder if I’ll ever get to go back and try the remote route…

Leg 2 Vesuvius -> Ruckle

Rathtrevor Provincial Park to Crofton ferry

Before arriving at Crofton, I’d assumed it would be a hop, skip and a jump to get from Vesuvius to Ruckle. Which was good because getting from Nanaimo had definitely emptied my tank. When I did a bit of research, I realized it was going to be more than 20 km. Not exactly what I’d had in mind.

I noticed the route was composed of legs that were mostly 3-4 km. In order to push through these legs I ‘invented’ a technique to pass the tine. If I was travelling at ~20km per hour, 3-4 km would be about 10 minutes (aka 600 seconds). So when I started on the first road I started counting to 600.

The first leg, along Vesuvius Road, ended shortly after I’d counted to 600. For the next two sections counting to 600 also ended up being a good approximation of my travel time. Then shortly before I got to Cusheon Lake, my Dover friend zoomed up behind me. He was surprised I’d got ahead of him, but I suggested he’d probably had a quality stop in Ganges, while I’d only stopped long enough to buy cheese and bananas. He zoomed off ahead of me toward Cusheon Lake. The next/last time I saw him he was on the public dock at Cusheon Lake and it looked like he was chatting with the dozen or so other people on the dock. I was happy for him.

Sadly my time passing technique didn’t work so well on the Cusheon Lake Road leg. Partly I’d lost count when I met my Dover friend. But even worse this road included the most ridiculous uphill section I think I’ve ever seen. By the time I summited this hill I was still pedalling but didn’t feel like I had much left in reserve. I was pretty well out of gas.

Once I hit Beaver Point Road, the last leg, I was very relieved. There was more up and down, and this was going to be longer than 4km, but I knew I’d get there. And once I arrived what a joyful sight. The Ruckle campground is so beautiful, and it was 80% empty.

Shortly after arriving at campsite 47.

I picked a spot by the ocean, set up my tent, and just lay down in the warm grass. it was such a lovely spot. I managed a very timid swim under challenging conditions (barnacles and waves) and then went back up to lay in the warm grass beside my tent. The sun eventually dropped behind the trees. My site was now in the shade, but the ground was still warm from the day. Utter bliss.

At one point the park ranger popped by to register me.

ranger: How’s it going?

me (smiling): Eleven out of ten.

I registered for two nights. Tomorrow I would rest.

The view from my shady patch of toasty warm ground. Bliss.

Go to Day 6

Categories
Cycling

Van Isle 2024 Bike Trip – Day 4

Go back to Day 3

Miracle Beach -> Rathtrevor

Miracle Beach Provincial Park to back to Rathtrevor

At the start of this day I was a bit nervous for a couple of reasons:

  • the crazy cramps I got the last time I rode this distance
  • wondering if Rathtrevor would be able to squeeze me in

Due to my concerns I was antsy to get an early start. I also felt more inclined to keep my route simple. ie stay on the highway, rather than finding good side road routes. Of course I made sure to catch the Headquarters Road turnoff, cuz it was so straight, quiet, smooth and lovely..

The very lovely Headquarters Road north of Courtenay

I think my first pit stop was at the gas station store at Buckley Bay. (where one catches the ferry to Denman Island) This stop was a bit like a visit to the Room of Requirement. I’d realized that I should get some pain meds for my sore back. (“But stoicism feels good!”) I also bought a Powerade, hoping it would help me avoid my end of day leg cramps.

Joy o joy, the Powerade worked! I finished the ride with no cramps. As an added bonus, I made it to Rathtrevor in time to get a walk-in site (there we two left when I arrived) I felt quite good rolling up to my tent spot.

I’d only been there a couple of minutes when a 3 yr old girl and dad came over to my camp spot. Given there weren’t any other people around it seemed like they were seeking me out for something. I soon realized they were not seeking me out, but instead were seeking out the rabbits hiding in the bushes at the edge of my site.

The rabbits/bunnies that started it all.

Kate, the kid, was attempting to feed carrots and snap peas to them, and dad was giving her a lot of ‘don’t be so nervous’ type advice. Fairly quickly I was chatting up a storm with Kate, and enjoying our conversation. Meanwhile her dad had drifted back to their campsite on the opposite corner of the walk-in area.

me: How come bunny and rabbit are different words for the same thing? Other animals only have one possible word, like ‘dog.’

Kate: what about ‘puppy’.

me: hmmm, good point.

This carried on for quite a while, until her dad came by and told her it was time to go to the beach. (I’m pretty sure he still hadn’t said a word to me.) Kate calmly and firmly let dad know she had zero interest in going to the beach. dad: ‘I’ll give you a treat.’ Kate; ‘not interested.’

At this point, I kind of felt bad for dad and he appeared to be some combination of frazzled, frustrated and angry. I’m pretty sure Kate spent weekdays with mom and only saw dad on weekends. Dad gave up and went back to his tent. I could have done more to push Kate away from me, but for some reason I decided not to do that. Anytime dad was attempting to entice Kate away, I’d say nothing, and let her assert what she wanted to do.

I was looking to go for a swim. Also, seeing Kate’s carrots and snap peas made me realize I was hungry for some yummy vegetables. So I told Kate I need to go have a bath. She looked at me like this was a peculiar thing to say, but I was worried if I told her I was going swimming she’d want to go with me. I felt bad, in that she’d recently brought a book over to my camp site with the idea of reading it together, but I had to tell her it’d have to wait until after my ‘bath.’

I ended up going for a very long tootle, first to the beach/bath and then I found a wonderful farm store back at the highway. Kale, carrots, grapes, garlic, all of it so good.

My Rathtrevor veggie haul.

When I got back to camp with my produce, I got started making dinner. No sign of Kate and dad. Dinner with the veggies was truly delish! While I was cooking/eating the Victoria couple that said they were heading to Hornby (Melissa and Jim?) rolled into camp.

Through the evening, I saw a bit of Kate, but did my best to be as uninterested/uninteresting as possible. While it worked in that she didn’t linger in my camp site it felt unfortunate to be giving her the cold shoulder.

Pretty impressive work for a three year old.

Go to Day 5

Categories
Cycling

Van Isle 2024 Bike Trip – Day 3

Go back to Day 2

Miracle Beach -> Quadra -> Miracle Beach

Miracle Beach Provincial Park to Quadra and back again

This was a day off, in that I was riding with an unloaded bike. But I still seemed to have a fairly ambitious distance goal. I had a couple of reasons to see Quadra Island. The tangible reason was to pop in to visit a friend, who I normally only see in Vancouver. It was great to see her place, which faces west and is right on Quathiaski Cove.

I also wanted to get a feel for Quathiaski cove as my grandmother lived there for an unknown length of time. The only detail I knew about this time was that she rowed her younger brother across the cove to get to school. I since learned from my mom that neither Janet nor Dave (the rower and the rowee) knew how to swim at the time. Yikes.

Grouse Island, seen from Marnie’s house on Quathiaski Cove.
Am I looking at my grandmother’s route to school?

Before leaving Quadra, I opted to explore a bit. Specifically I wanted to see Rebecca Spit, where Steph and Ollie had recently put in on a 5 day kayaking trip. As an added bonus this ride could be done as a loop that would bring me past Aroma, a yummy bakery on my way back to the ferry.

The aforementioned Rebecca Spit
My scandalously naked Bridge Club at Rebecca Spit

I convinced myself I really should support the local economy. So not only did I get a yummy treat at Aroma, but I also got an order of fish and chips while waiting for the ferry.. Needless to say, I was well fuelled for my ride back to Miracle Beach.

Most of the way back to Miracle Beach I passed a farm selling mushrooms. I hummed and hawed for quite a while and then decided it was worth backtracking a few hundred metre to get what turned out to be amazing oyster mushrooms.

Yummy Oyster Mushrooms

Once back at the beach I continued my tradition of ending my day with an ocean swim. I noticed the sandy ocean floor was peppered with mysterious black objects. It turned out there were sand dollars. Who knew they lived here?

What the heck are these black things in the sand?
#naruhodo

I decided it was time to start heading back south. To be honest, at this point in the trip, I was not sure I’d be able to find a place to sleep on Saturday night. I worried I’d have to sleep in a ditch by the side of the road. Can you get arrested for that? Not sure. But plan A was going to be to try to get back to Rathtrevor…

Go to Day 4

Categories
Cycling

Van Isle 2024 Bike Trip – Day 2

Go back to Day 1

Rathtrevor Provincial Park -> Miracle Beach

Rathtrevor Provincial Park to Miracle Beach Provincial Park

Day 2 was set to be a bigger day, over 100km. Fortunately, I was able to get an early start, thanks to turning down the Whiskey offer the previous evening..

Early morning Rathtrevor light in the forest

I made the executive decision to hit the road right away, without eating breakfast. Mostly I felt like I had a big distance to cover, and I wanted to ‘earn’ my breakfast with a big, early push. That plan was scuttled early on, when I came across an apple tree offering me its delicious crop.

I’m defnitely a sucker for being able to pick an apple right off a tree.

So with first breakfast out of the way, I continued winding my way northwest. I was able to avoid the highway for most of the way through Qualicum beach on some great back roads and bike paths (sorry, no photos)

Rumor has it, oysters were invented here

Getting through Courtenay included lots of short bike paths. By the end of it, I was wishing I didn’t need to spend so much time with my nose in my phone/map. Also, it was dawning on me, that I really don’t have a great sense of direction, when there is somewhere specific I’m trying to get to. Fortunately, on the far side of Courtenay there was a wonderful back road (Old Headquarters Road) that not only had more apples, but also some yummy late season blackberries. Bliss!

I can assure you, these fellas were all delicious.

As I was getting close to Miracle Beach, I was experiencing much cramping in my legs (thighs and calfs) I was able find a way to ride that wasn’t too painful. I was very happy to see the registration area, but there was trouble ahead…

When I got to the campground, there was a long slow moving line to register. Before this moment, I had mentally scoffed at the idea of planning mundane details like camp site reservations. When it was my turn, I learned all the ‘First come, first served’ sites had been taken. I was also getting mixed messages from two park employees (who I later learned were mother and daughter.) Daughter was telling me the only way I could reserve a reservable site was to either call BC Parks or go to the web site. But then mom told me, she could register me, but all the reservable sites were booked. Eeek. (and this was a Thursday, I was getting worried how things would go when the weekend arrived.) But then daughter told mom the three walk in sites were still available and I could have the single walk-in site. At this point, I thought I’d see if I could also reserve it for the following night, just so I wouldn’t have to sleep in a ditch.

Turns out the site I was in was reserved by somebody else for the following night. Fortunately I was able to book one of the other walk-in sites for Friday night. Double phew!

Now that I had Thursday and Friday nights booked at Miracle Beach, I decided I would do a Friday day trip up to Quadra Island. I was hoping to meet up with a friend who lived there (Marnie) and also, just see/experience a place where my grandmother lived for a few years in the 1920’s

My Thursday night digs.

Go to Day 3