Wednesday, September 04, 2024

Puerto Rico Adventure - Day 2

[Composed July 30, 2024]

We did it! We managed to get 5 children, originating in 3 different cities, to a tucked away Airbnb in Puerto Rico. Shira and I are closing out the day exhausted, but with our mission accomplished.

We started the day in Jacksonville, where we picked up J. C & J had an effortless three hour ride to Tampa. They passed the time playing video games and talking anime. What a source of nachas it was to see the kids display that powerful bond of friendship, where months apart melt away in seconds.

In Tampa, we picked up the rest of the crew. To their credit, everyone was packed, healthy and excited to start our vacay.

In the Tampa airport I had an unexpected first: Shira and the girls wanted to go explore the food court. Since we've been traveling with the kids, the recipe has always ben simple: stay together. J and D were happily camped out near an outlet charging devices and enjoying screen time. I confirmed that they both had phones, and we ran a quick test to confirm they had my number. And then I did what was previously unthinkable: I walked away and left them to chill. My gosh, they are growing up!

We strategized about who was sitting where on the plane (see the pizza box sketch) and before we know it, it was time to board. The flight to PR was, thankfully, uneventful. On the landing approach I gave D, who was sitting in the window seat, the point and shoot camera I'd brought along this trip. He and G, sitting at the other window seat, captured scenes out the window as we landed. That's usually my move, but I was pleased I could delegate this role.

So we did it, we landed in Puerto Rico and found all of our luggage waiting for us. Luggage arrival hasn't always gone our way, so this was a win. Hertz cooperated by having a nice size SUV for us to rent. One of our first challenges of the trip, however, came when we arrived at said SUV. It had no problem holding the kids and 2 large bags. Except, we had 4 large suitcases, a duffle bag and Bertha (Shira's ridiculously large carry on backpack) to haul.

The solution I arrived at was ugly, but effective. I dropped down one of the seats in the back row and put a large suitcase there. I put two large suit cases in the trunk. I had D sit in the back, and somehow we squeezed J's nearly 6 foot tall frame next to him. I then tossed J's duffle bag on top of them in the back. The three girls were in the next row. There I crammed a large suitcase at G and T's feet, zapping any legroom they hoped they could get. As for Bertha, she just got crammed into whatever space I could find.

When the packing process was done, we had five contorted children and a very full car. Tetris skills: mastered.

As we pulled out of the airport and headed towards our Airbnb, an earlier conversation Shira and I had started playing itself over and over again.

'You know', Shira suggested, 'when we land in Puerto Rico it's going to be late and the kids are going to be starving. We should make sure to bring along dinner so we're ready to feed the them.' I countered with, 'babe, relax, it will work itself out. We'll just pick up food at a restaurant, cafe or supermercado. They do eat, in Puerto Rico I confidently retorted.'

And yet, as we drove to our Airbnb, we saw fewer and fewer signs of commercial businesses. And the ones we did see, were closed for the night. The cafe or market I expected we could pop into simply never appeared. As Shira predicted it was late, dark, and everyone was beyond exhausted. What were we going to do about food?

After 20 minutes of driving we turned off the main road and headed into a series of dark and twisty neighborhood streets. As we weaved among parked cars and stray cats and dogs we found ourselves with a new challenge on our hands: Google's route to our Airbnb's address deposited us here:

This satellite image simply doesn't do the scene justice. It was dark, with no street lights to assist. Dogs were barking from surrounding yards and the only structure at the address was shuttered and didn't look anything like what was promised in the brochure.

I got out and checked the scene. This wasn't right. Not right at all.

We checked and double checked the address. Google was sure we were where we needed to be.

Re-reading the email from the Airbnb host, I saw an important clue: the host provided both an address and a latitude / longitude pair. Out of options, I figured: let's go there. We did, and thankfully, it took us here:

Ahhh, that's more like it. The scene was still pretty dark, but the house's facade was a match for the promised Airbnb. The unlocking procedure went well, and before we knew it, we were in the house and the kids were grabbing their rooms.

With the location crisis averted, we were back to the question of feeding the kids. Shira had chucked some lentil pasta and a box of mac and cheese into our luggage at the last minute. We cooked up the pasta, and used the cheese packet from the mac and cheese to make some sauce. Alas, we only had water to make the sauce, so the 'cheese' was this sort of running liquid. The kids laughed it off and were hungry enough, they were glad to have any food at all.

We tucked the kids in and with 45 minutes to spare, headed out to the nearby Walmart that was closing at 11pm. We raced through the Walmart picking up supplies and returned to a house filled with sleeping children.

The kids were wiped. Shira and I were wiped. But, by golly, we'd done it. We'd made it to Puerto Rico. And tomorrow we would have fun; whether the kids liked it or not!

Tuesday, September 03, 2024

Puerto Rico Adventure - Day 1

[Composed July 29, 2024]

Today we nominally started our trip to Puerto Rico. With a smooth evening flight, we made it as far as Jacksonville, FL. C is traveling with us and that did make for two moments in the trip that made Shira and me smile.

The first is that we got to introduce C to the American Airlines Admiral's Club. Ahh yes, a taste of the good life: and she thoroughly enjoyed it. Who wouldn't, with unlimited macaroons and donuts on hand?

The other moment came as we found our seats on the plane. Because C is now 15, we can sit in an exit row. 'Ugh,' she groaned as we started organizing ourselves in our seats. 'I can't reach my bag, this is so annoying.' That annoyance, we explained, is because the exit row comes with extra legroom. This resource that I so cherished she saw through a different lens: her carry-on tucked under the seat in front of her, was no longer within reach. She cracked us up.

While today marks the beginning of our Puerto Rico trip, it also marks the completion of C's personal adventure. For the past week she had been volunteering at Arlington County's Civil War Spy Camp. Being a camp counselor was all new territory for C, and we couldn't have been more proud of how she handled the challenge.

But it wasn't just serving in a new role at camp that made the week special. We did a heap of activities, including hiking on the AT, axe throwing, visiting with cousins and bowling. She completed her driving permit's training course (earning a 95% on the final test!) and got some serious touch-typing practice in (Thanks typingclub.com! You rock!). She traded the majority of her screen time for reading time*, getting to fall in love with both the Song of Lioness and Last Air Bender graphic novel series. She mastered making corn tortillas from scratch, and I learned the secret to making a meal C will love: add more cheese!

Did she love every minute of her Uncle and Aunt's boot camp? Yeah, no. But she totally rose to the occasion and instead of vegging out during one of her last weeks before school, she crushed it.


*Have no fear, C still got plenty of screen time. It just wasn't the portion size she was used to.

Friday, August 30, 2024

gptel: Mindblowing integration between Emacs and ChatGPT

ChatGPT and its LLM brethren have been a potent source of FOMO: the AI revolution is happening, and I feel like I'm forever late to the party. After getting comfortable with OpenAI's web interface and coding my own command line tool, I figured it was time to complete the trilogy by integrating an LLM AI into Emacs.

As with many topics, there were a number of available Emacs packages, and it wasn't immediately obvious which was 'the best.' And then I watched this (to me) blandly named YouTube video: Every LLM in Emacs, with gptel and was hooked.

This 17 minute video blew my mind. If you're remotely interested in emacs and LLMs, stop reading this post and go watch this video. Heck, watch it a couple of times. In it, the gptel package developer goes through the why and how of gptel, and demonstrates some next-level uses of this package.

So gptel is my answer for adding them magic of ChatGPT to Emacs. gptel can be used both interactively and programmatically. I've found the former capability let's me have a running conversation with an 'assistant.' I can get answers to coding, writing or any other question on my mind without having to leave Emacs. Score.

But interactive use is just the beginning. By leveraging gptel-request, it's possible to automate common patterns. For example, I can set the region to include a word and run bs-gptel-define-word. In a few moments, ChatGPT will come back with a definition, examples, synonyms and antonyms. Here's the definition this function reports for FOMO:

In some respects, this is hardly exciting. There are a number of dictionary services are already integrated into Emacs, so why bother hand coding another? Yet, using gptel has two advantages. First, by changing the prompt, I can easily adjust the output. For example, here's the FOMO definition with a prompt that asks for active and passive voice examples:

The other benefit of using gptel for definitions is that the universe of what's considered a definable term is far larger. For example, I can ask for the 'definition' of a CSS property box-sizing: border-box.

Heck, it even handles slang. Here's the definition of slang: what the sigma

This would have been handy when we were traveling with our nieces and nephew, and this phrase came up repeatedly.

Another example of automating a task by leveraging gptel is gptel-proof. This is an early attempt at coding a proofreading tool within Emacs. The package works by taking an arbitrary region of text and asking ChatGPT to fix the spelling and grammar. The result is embedded back in the original document, surrounded by the familiar version control conflict markers. For example, here's what I see when I proofread this paragraph.

By using the conflict markers, I can use M-x vc-resolve-conflicts, to interactively compare and adopt the improved text.

What I like about this approach is that I don't need to blindly accept the LLM's changes. By using ediff, I'm combining both the magic of AI with the magic of emacs, to make, well, more magic. It's magical. A

This all feels like a very awkward start to using such a game-changing capability. But, at least I've started!

Here's some additional inspiration on the topic: Integrate Emacs with ChatGPT or any LLM, Powerful AI Prompts I have Known and Loved - that you can use, and Emacs pinky Saver: a voice driving GPT4 co-worker for emacs. together.ai is a platform for letting me interact with more LLMs than just ChatGPT.