Rails 6 errors: the good, the bad, the ugly

Lately when I'm supposed to be getting actually useful things done, I find myself procrastinating by writing code instead. I have a Rails 6 codebase I've been fiddling with.

The other day as I did some reload-driven-development, I got this error:

The Good

Wow, development-mode error screens have come a long way since Rails 1. There's so much information here!

First off, there's the exception, the full path, and the message.

Then a nice source code listing with the error highlighted.

Followed by a trace with selectable app and framework filters.

Then there's a bunch more essential contextual info.

Then we get to the real doozy: an interactive REPL embedded right in the error page.

I showed this to a friend who is familiar with Java and JavaScript web frameworks and she was like, “whoah”.

The Bad

Ruby's auto-suggestion is great, until it's not. Here, the suggestion of the mysterious video_path is worse than useless. There is no “video” concept in the application, so what even is this referring to? Presumably, somewhere in the thousands of methods known to the entire Ruby VM, it found a method called video_path. This is going to be a “wait, what!?” moment for anyone who doesn't understand just how broad the auto-suggest feature can be.

But why is it even looking for a votes_path method? Well, here we get to the actual problem, which is that votes_path.canvass was nil.

It was only the fact that I have a fair amount of experience with Rails form helpers that led me to realize that the fact it was looking for votes_path instead of canvass_votes_path, despite the nested resource array given to model:, indicated that maybe .canvass was missing. I have no idea how a Rails newbie would have figured this out. The fact that form_with happily breezes by a nil in the supplied array without so much as a warning is… unexpected.

The Ugly

It does not help in diagnosing the problem, that the apparent receiver for the incorrect route helper method is an inscrutable collection of symbols and hex. This is why, when I do metaprogramming that involves on-the-fly class or module generation, I like to generate a helpful name for the new class/module while I'm at it. I'm tempted to see if I can find where this class is being generated and submit a PR. At least in dev mode, it would be nice to have a meaningful generated moniker.

screenshot of gleek.io

Tools for turning descriptions into diagrams

Sometimes I have a picture of a software design in my head and I just want to draw it. If I don't need to collaborate with anyone remotely I might just draw it freehand. For collaborations and for diagrams I might want to iterate on, a tool like LucidChart can be really handy.

But sometimes I just want to list concepts as I hear them, fill in the connections between them, and let a computer worry about layout. That's what the tools below are all about. The particulars of each tool differ, but all of them let you enter a simple text description, e.g.:

Read More

How to relax your Ruby version specification in your Gemfile

Have you ever run into this error?

Your Ruby version is 2.6.1, but your Gemfile specified 2.6.3

Annoying, right? You know your Ruby version is new enough to run this application, but the Gemfile is so fussy.

Turns out, Gemfiles don't have to be so picky. Just like you can relax version dependencies for gems, you can also make your Ruby version specifier less specific. As with gems, the secret is using the tiddly-waka (~>) operator:

ruby '~> 2.6.0'

Now this project will run with any patch version of Ruby 2.6 without complaint.

SIGAVDI #55: Lavender Yogurt Edition

Hello friends,

I just got back to Tennessee after a wonderful couple of weeks in St. Louis. Hey look, here's another pairing video with Jess! I wanted to deepen my understanding of TypeScript, so we started implementing one of my go-to “learn a language” programs: a text adventure game.

TypeScript is boring, but that's kind of the point. And it has some nice type inferencing.

BTW, Jess has a newsletter and if you like this one you will love hers.

Something I realized in conversation with Jess this past week: technologies and practices often act as proxies for culture.

You want to adopt microservices but really you want small feature teams to be able to act independently and quickly.

You wanted Linux in the server room but really you wanted a culture of sharing instead of information-hoarding.

You wanted Spring instead of J2EE but really you wanted a culture of open-source.

You want Kubernetes but really you want a culture of developers taking responsibility for delivery.

You want chaos engineering but really you want a culture of resilience to the unexpected.

Very often, we don't consciously realize that a desirable technology is really a stand-in for a desirable culture. And in the absence of culture adoption, the technology fails to deliver the hoped-for benefits.

Technologies and practices evolve in a context: a context of culture. How do we import the culture and not just the tech? We can't adopt culture by taking a course or reading a book.

Cultural adoption requires making contact with the society that has adopted the culture already. We have to attend their meetups and conferences. Follow them on Twitter. Maybe hire some of them.

I watched a movie called Liberal Arts last night. It was well-written but ultimately not worth the time I put into it, except maybe that it prodded me to think about the reasons I didn't like it.

Our society is full of moralizing stories and books and movies about the Man's Journey: how he sets out to seek his fortune and defeat his predecessors, and then, victory in hand, he returns home and accepts his proper role as a settled, contented, somewhat diminished pillar of society. A stabilizing influence and mentor. Jung talked about this narrative a lot. Joseph Campbell decided all myth everywhere was about this one story.

(Where is woman in this story? Oh, she's there to support the Hero, give him a motivation, and to help him sort through his feelings, obviously. 🙄)

I spent the first part of my life trying to skip directly to the last bit, and I've since decided it's overrated. I don't want to be anyone's pillar. I'm here to know less, feel more, and eat tacos.

This week kicks off almost two full weeks without my indispensable assistant Robin. She's on much-deserved computer-free vacation. It'll be interesting to see how I fare without her constantly greasing the wheels and lightening my email load.

What I'm grateful for this week: The card game Fluxx, and especially Cthulhu Fluxx. These games are a bit like Calvin Ball: the rule is that the rules always change.

This week's chosen meetup: KnoxPy!

Let's see how I did:

  • 😞 Book summer camps for the kids. I filled out all the forms for the camp they really wanted and then found out it was completely full. I still need to look into alternates, but I already know most of them are too expensive for me.

  • ✔ Start on getting 2018 non-biz numbers to my accountant. This was easier than I'd feared because it turned out I'd kept YNAB up to date last year. I need to get on the ball for this year.

  • ✔ Write an anxiety-inducing email. Done, and it didn't go over as badly as I'd feared.

  • 😐Finalize Let’s Make a Chatbot in Ruby as a product, and prepare for launch. I didn't get as far as I'd hoped with this, but I did start to break the one big video down into ~15-minute sections.

This week:

  • At least finish breaking up the videos for Let’s Make a Chatbot in Ruby

  • Get ready for the kids arriving for the summer.

  • Put some thought into scheduling: how am I going to spend time with the kids and also meet work commitments?

And that's plenty for this week. As always, thanks for reading, and please reply with your thoughts.



SIGAVDI #54: Watermelon Salad Edition

Hello friends,

This week I am in St. Louis, visiting Jess. As usual, we’ve been yelling at code together and streaming it (video 1, video 2).

Oh oh oh before I get into the rest of this email, I just wanna say I’ve been working super hard on getting my new chatbots video ready for sale. It has a proper name now: Let’s Build a Chatbot in Ruby!

And I made a cover graphic!

And you can buy it in beta for $15! I’d love to get some more beta customers to give me feedback on it 😁

OK, shameless self-promotion out of the way…

Once I was employee #1 in a funded, incubated startup. The investor/advisors made sure that the founders had all their ducks in a row. Accounting! Payroll! Legal! Branding! Lean startup coaching! Office space! Networking!

And, of course, hiring staff, i.e., me. Which was nice for me, but probably a bit premature in retrospect.

It all seemed to keep the founders quite busy, right up to when the startup folded. I’m not going to claim that all this legitimacy theater was the cause of the company’s failure; ultimately it was a matter of insufficient product value. But I submit that the distractions didn’t help.

Since then, I’ve observed this same phenomenon from the middle distance, via friends and colleagues, at a lot of funded startups. I believe it is possible to give a startup just enough money to waste all of its’ time.

Having money leads to spending money, and spending money costs time. Spending other people’s money costs even more time. You have to perform due diligence to reassure yourself that you’re spending the money well, and the more money, the more time it costs.

Here’s the important bit: a lot of legitimacy theater is about managing risk. E.g. what if by failing to do a full legal review, we omit a line in a contract, and fail to give ourselves the option of suing an incompetent contractor?

But this omits consideration of the opportunity risk: what are we risking by dithering and expending cycles on dotting Is and crossing Ts? What if in the meantime, that contractor decides to move forward with a different opportunity?

My theory: if you look at the early history of of successfully bootstrapped (non–funded) companies, I suspect you’d find a lot of fudged procedures in the beginning. They made handshake deals instead of running everything through legal. They sorted the books out after the fact.

There’s the Way Things Are Done, and then there’s the way they actually happen.

This week I’ve been making a concerted effort to write some Actual Code (see those videos above), which means turning my travel machine into an Actual Coding Workstation.

For reasons I might go into in another newsletter, I’m committed to developing on Windows systems these days. Over the past year I’ve done enough Rails and Node development with native Windows to decide, once and for all, that it’s a non-starter. By “native”, I mean: using Node or Ruby interpreters + libraries compiled for Windows.

(These days it’s not so much a Microsoft/Windows problem as an ecosystem problem: any nontrivial Ruby or Node project has hundreds or thousands of third-party dependencies (packages, tools, etc.) and every five minutes some open-source developer out there introduces a Windows regression into the latest version of a gem or package. Not out of malice, mind you, but just because they don’t have access (or time) to test on a Windows box. Much of the time it’s not a simple regression, but an interaction between packages/tools that results in an error.)

So. Fully-native development is out. But! After a fair amount of time exercising it, I can happily say that Windows Subsystem for Linux (WSL) is fucking amazing and a real game-changer. We can now install Ubuntu, Arch, Fedora, etc. directly from the Windows Store, and in my experience it Just Works.

No recompiling, no container boot times, no massive memory usage, no SSHing, no setting up filesystem mappings, no port mapping. Just pop open a WSL terminal, install needed packages straight from distro repos, and code away, using a combination of native and Linux tools. There are some I/O efficiency issues when working with thousands of files (cough NPM cough), but the recently-announced WSL2 promises to address this.

This week I took things a step further and installed VS Code Insiders so I could play with the new Remote Development support, and it’s super cool. It transparently runs editor extensions on the remote side. Whether “remote” means over SSH, via Docker, or local WSL instance. This means that, for instance, a code-linting extension will automatically run using the target development environment, instead of behaving subtly differently because it’s running on the “client” side.

What I’m grateful for this week: I feel like I basically covered that above: WSL. Also, frequent flyer points that take me to see the people I love.

What meetup I’m going to this week: none, while I’m in St. Louis. But I can report that I had a nice time meeting folks and learning about WebPack at last week’s KnoxJS!

Let’s see how I did:

  • ✔ Livestream with Jess, since I'll be in St. Louis. Done! See above.

  • ✔ Pre-sell and get started marketing the chatbots video. Done!

  • ❌ Book a Rubber Duck Session or two. Nope. I had one potential session that I had to cancel because I got sick 😭

  • ❌ Pick a first business metric to track and figure out how to track it. Nope.

  • ❌ Book summer camp(s) for the kids Ugh, nope.

This week:

  • Book summer camps for the kids.

  • Start on getting 2018 non-biz numbers to my accountant

  • Write an anxiety-inducing email

  • Finalize Let’s Make a Chatbot in Ruby as a product, and prepare for launch.

That’s it for now. See you next week!

SIGAVDI #53: Tamale Edition

Hello friends,

I'm on my mom's back porch on a sunny Sunday in Knoxville. Last night I spent a solid 6 hours dancing and socializing at my favorite club night. Today I feel pleasantly fatigued and a bit languid.

A minute ago I looked up one of my old blog articles and was struck by how much of an asshole I used to be. When I started blogging I was strongly influenced by the tone of early popular blogs, which were mostly White Men Having Smug Opinions About Things. I guess I thought: ah, this must be how you make a name for yourself: have loud Hot Takes about everything, and criticize the writing of people with a bigger following until someone takes notice of you.

At first I thought this was just a stage everyone passes through. But as I think about it more I wonder if it's a patriarchy pattern. Something something hero's journey, something something Luke Skywalker, something something kill your father-figure.

Joseph Campbell is an interesting read but boy oh boy, dude had a one-track mind. I've read Hero with 1,000 Faces, and listened to his famous interview series with Bill Moyers. And what came across was less that the same archetypes are repeated over and over, and more that Campbell had one big idea and found ways to see it everywhere.

Hm, this is a cautionary tale when it comes to me and my obsession with seeing processes. Also, I just criticized the pattern of tearing down an old guy by tearing down an old guy 😂

I still have lots of opinions, albeit with lower confidence. Hm, actually, let me quote the article I just linked:

The loudest, most bombastic engineer states their case with certainty, and that shuts down discussion. Other people either assume the loudmouth knows best, or don’t want to stick out their neck and risk criticism and shame. This is especially true if the loudmouth is senior, or there is any other power differential.

Diverse members of your team may be less likely to have experienced the collegial, open debate environment, and may feel uncertain of their position. This means you might not hear their ideas. Given the extensive research that shows diverse teams make smarter decisions, this is tragic.

Even if someone does have the courage to push back, in practice the original speaker isn’t likely to be holding their opinion as loosely as they think. Having stated their case, they are anchored to it and will look for evidence that confirms it and reject anything contradictory. It is a natural tendency to want to win the argument and be the smartest person in the room.

Once upon a time, Cardboard Tube Swordplay (CTS) wasn't considered a legitimate sport. If people had heard of it at all they generally sneered at it. If it appeared in popular culture at all it was usually as the butt of jokes.

One way or another, the early CTS players (“tubies”) found each other. They recognized kindred spirits and started having meetups and even conventions. Slowly, painfully, and with many arguments they hammered out the sport we all know and love today.

Where once there was just a vague, amorphous area of overlapping interest, the tubies created boundaries and categories. They created the classes of competition – longtube, paper towel, packing tube, etc., along with standardized tube gauges. They came up with quantified ways to rate and rank competitors. They agreed on safety regulations. They composed the Rites of Challenge. Leagues were formed. Eventually, twelve recognized Tube Masters gathered together and authored The Way of the Tube (WotT), which defined (among other things) the path of tube ascendancy: how a novice must apprentice to a series of masters before finally confronting the Cardboard Gauntlet.

By defining boundaries of what was and was not CTS, the tubies conferred legitimacy on themselves. When outsiders would make uneducated claims about tubies being “a bunch of kids beating each other over the heads with foam swords”, the CTS community was able to push back and tell them that, actually, headstrikes are banned, duels are carefully refereed, and styrofoam is never involved. Steadily the sport gained recognition and serious coverage.

A generation passed, and a funny thing happened. What was once a sport for nerds and weirdos became a pop culture phenomenon. Where once a novice could spend months searching for a Tube Master to train them, now thousands of YouTube videos offered “how to” tutorials. Accelerated training “tubecamps” sprang up all over the world.

A new breed of tubies arose: ones who had never faced the tubie stigma; had never been derisively told to pick up a “real sport”.

And these nu-tubies showed no respect or even gratefulness to the old guard. They scorned the apprenticeship system. They made stupid mistakes and created unnecessary drama that never would have happened if they had just adhered to the Rites of Challenge. They introduced outlandish new elements such as pool noodles.

Many established CTS authorities questioned whether this new guard were even “real tubies” at all. Some elders, including several of the WotT authors, began pushing for a tubie certification program. They created cults of personality, recruiting impressionable younger tubies searching for a sense of identity, teaching them to sneer at “damp tubies” for being insufficiently disciplined.

The free-thinking youngsters, in response, accused the old-timers of “gatekeeping”. They pointed out that some CTS traditions such as the Cardboard Gauntlet were more like hazing rituals, which discouraged prospective players. They noted that the old guard seemed to all come from the same socioeconomic background and questioned whether toxic CTS culture was keeping the sport from becoming more diverse.

More importantly, they asked, wasn't CTS originally supposed to be about having fun, not about parsing rule manuals?

The elders replied: This kind of fun is serious business. We created this game out of chaos. We painfully won our recognition, the recognition that you now enjoy. This is our game, and you can't play it if you don't play it right.

What I'm grateful for this week: The DJs, staff, and everyone who attends my local goth/industrial night. It's an inspiring, cathartic, restorative experience every time I go, and I've met so many wonderful friends through it.

What meetup I'm going to this week: well I'm off to St. Louis on Wednesday, but I might be able to make KnoxvilleJS. I haven't been to that one yet.

Let's see how I did:

  • ✔ Get two me-authored RubyTapas episodes ready for the team. Done. Two more episodes on async are moving forward into production.
  • ✔ Get another episode of The Cache Flush out. Done, and you can find it here
  • ✔ Keep working out on a daily basis. Maybe not every day, but I get a few five-mile runs and a night of dancing in, so ima call that a win
  • ✔ Edit that video about building chatbots in Ruby. Done! I'm excited to move forward into publishing and marketing this one.

This week:

  • Livestream with Jess, since I'll be in St. Louis
  • Pre-sell and get started marketing the chatbots video.
  • Book a Rubber Duck Session or two. Want me to sit down with you and talk code, architecture, career, or other? Get in touch!
  • Pick a first business metric to track and figure out how to track it.
  • Book summer camp(s) for the kids


That's plenty for today. Thanks for reading, and stay in touch!

Featured Video Play Icon

Test-Driven Re-implementation with Josh Thompson

Yesterday Josh Thompson, one of my Rubber Duck Session clients, proposed a novel idea for deliberately practicing coding skills: take a popular open-source project with a good test suite, delete a class, and re-implement the class using only the tests as a guide. Then, compare and contrast our implementation with the original!

I suggested the Rake codebase, and this video is an unedited recording of the session. Enjoy!

SIGAVDI #52: Grit Fritters Edition

Hello friends,

I am mildly out-of-sorts as I write this. The front of my favorite local dive appears to have fallen off, complicating my afternoon plans of meeting my mom there. Entropy is everywhere!

What dismays me about technology is this: not the machine itself but the way its architecture echoes outward, imposing a grid of quantification on everything it touches.

This article about life in Silicon Valley is powerful and a bit painful. I keep saying, you can’t do this shit 8-12 hours a day and not have it warp your outlook.

A programmer spends thirty years in the industry, and one day they designs a beautifully simple and elegant programming language. Or API. Then they go on the conference circuit pointing out the virtues of simplicity, and bemoaning why other developers can’t just keep things simple.

What’s omitted: It took them thirty years to figure out what was “the simplest thing that could possibly work”.

The simplest step isn’t always the easiest step, because simplicity comes from wisdom. Sometimes the most accessible first step is to do the thing you know is overcomplicated, but you don’t yet have the perspective needed to simplify it. Once it’s in use, you’ll start to see where to pare it down.

Example: I kicked off a Patreon recently. I made the tiers too elaborate. I knew I was making them too elaborate. But I couldn’t figure out what to drop and what to keep.

Now that it’s been up for a few weeks, I’m getting a much better idea of what makes sense for the tiers, and I’ll be simplifying it soon.

Example: I usually don’t figure out what the “core idea” of one my talks is until I’ve given it at least three times. Then one day it finally dawns on me what I’m really getting at, and I reorganize the talk to emphasize that core idea.

“Do the simplest thing that could possibly work”. “Minimum viable product”. These concepts are supposed to be enablers of action, but sometimes they are obstacles. We often start out jumbled full of thoughts and only later do we realize which one was central and which ones were peripheral.

Sometimes the most expedient step to take is to start with elaborated complexity, and give yourself license to pare down instead of add.

Last night I went to my first fashion show ever and it was amazing. It was a celebration of embodiment and of the endless conversation-with-past-and-future that is art. I highly recommend attending one if you ever have the opportunity.

More broadly, I strongly endorse adopting the strategy of defaulting to “yes, please” when someone recommends or invites you to something you’ve never done before. I don’t think I realized just how much I’d internalized the philosophy of “oh that’s not the kind of thing I do” until I started deliberately saying “yes” to new experiences.

The problem with “that’s not my kind of thing” is that eventually, you stop seeing other possibilities at all. They become part of the background noise. They become the restaurant you’ve passed so many times that you never think of trying it out.

Let's see how I did:

  • ✔ Book May travel. Done! Off to St. Louis again in a week and a half, look forward to more livestreams of Jess and I yelling at computers! 😂
  • ✔ Update my website. Done! I'm really happy with this accomplishment, for the first time my site actually reflects everything I do.
  • ✔ Invite a half-dozen new RubyTapas guest chefs. More than done! Lots of great new guests coming up…
  • ❌ Go through my stupid mail. Well, I went through all my email. The snowdrift of snail-mail continues to accumulate.
  • ✔ Push consulting paperwork forward. Done.

Bonus points:

  • Catch up on RubyTapas tasks. Done. Intros and promos and edits and tagging, oh my!

This week:

  • Get two me-authored RubyTapas episodes ready for the team. We need to fill some gaps in the schedule, and I have some episodes on async processing just waiting to be written and recorded…
  • Get another episode of The Cache Flush out.
  • Keep working out on a daily basis.
  • Edit that video about building chatbots in Ruby.
  • Ugh can we just leave it at that for now? I want a win.

Until next time… thanks for reading, and feel free to reply!

SIGAVDI #51: Ninja Bomb Edition

Hello friends,

First off, if you got another duplicate SIGAVDI recently I apologize. I have now indefinitely disabled the automatic RSS-to-email rule in Drip, because they can’t seem to reliably record the fact that a given entry has already been sent out.

I’m writing this from Phat Bites in Nashville, which is a wonderfully funky little cafe and I recommend it. Have them pick a sandwich for you.

I’m in Nasvhille because I spent the last few days at deliver:Agile, which is apparently the “more tech-focused Agile conference”. This still makes me wonder what they talk about at all the OTHER Agile conferences, but I’m sure I’ll find out one of these years.

I opted to speak at deliver:Agile even though it conflicted with RailsConf in part because I’m making a deliberate effort to swim in bigger ponds. One of the things I really appreciated about this conference is that I didn’t meet anyone who seemed like they’d be likely to call themselves “a Java programmer” or “a Ruby programmer”, etc.. Most of the attendees were developers, but as a crowd everyone seemed to be more focused on value and results than on specific technologies. It was refreshing.

People to pay more attention to, post-deliver:Agile, an incomplete list:

I also got to meet Rebecca Wirfs-Brock in person 🤩🤩🤩

Random thought while running today: there are some things you just can’t do solo.

I remember being a young programmer and reading about Agile practices and getting all excited and wanting to “be agile” even though my team wasn’t. And the fact is, I could and did do some of the techniques associated with Agile, like TDD. And they were quite helpful. But I wasn’t “being Agile”, I was just using TDD.

I have no doubt that individuals like me practicing Agile-associated techniques were one of the factors that eventually caused many organizations to “go agile”. At the same time, I’ll bet the same phenomenon also fed the fallacy that Agile just meant adding those techniques to your repertoire.

The same goes for making a sociotechnical system resilient: by definition you can’t do it solo.

There is a qualitative difference between the numbers one and two. Everything after that is quantitative, but two is important.

For where two or three are gathered in my name, there I am with them.

— Matthew 18:20

I’ve been reflecting on just how much of my life has been ruled by anxiety. I don’t think I ever really understood how large a role it played because it was the air I breathed. It took experiencing periods of a week or more without anxiety for me to really start to see it.

I’ve often said I like the person I am when I drink, better than the one I am sober, and there’s a simple reason for that: alcohol turns off my anxiety. I make choices based on what I actually want rather than based on what I’m anxious about.

Fear is unavoidable, but short-lived. Either the scary thing happens or it doesn’t. Either I do the thing I’m afraid of or I retreat to safety.

Anxiety is long-acting poison. A holdover from when the longer we roamed the tall grass the higher the probability we’d be attacked by a tiger.

Tasting anxiety-free life for even a week is like tasting sushi for the first time. My standards are permanently raised. I don’t have to live with this fist in my guts? Sign me up.

OK, let’s see how I did.

  • ✔ Prep to speak at Deliver:Agile in a week. Done. I put a solid couple days of work into updating the No Return talk, and I’m pretty happy with the edits.

  • ✔ Finish landing page/video for Flawless Ruby YES! I finally finished it!!! Go check it out and buy my shit 😁

  • ❌ Edit video on building chatbots in Ruby. Nope, but I shouldn’t have carried this forward in the first place. That was way too much to expect in a week.

  • ❌Nail down my first part-time contracting gig. Jess pointed out that “nail down” is not a thing I can actually do on my own. The best I can hope for is “push forward”, which is exactly what I did.

  • ❌ Start coding in earnest on That One Side Project I keep flaking on. Again, this was overcommitting so I don’t feel bad about not touching it.

  • ✔ Post another episode of The Cache Flush. Go check it out and subscribe

Bonus points:

This week’s meetup: Knox.Net

(This is something new… lately I’ve been making an effort to choose a new meetup to attend every week that I’m in town. I think I’m going to start explicitly listing the meetup I pick in SIGAVDI so I actually remember.)

For the rest of this week and next week…

  • Book May travel.

  • Update my website. This past week it really started to bug me that I don’t actually have a homepage that lists all the stuff I do: speaking, consulting, screencasting, writing, podcasting, etc.

  • Invite a half-dozen new RubyTapas guest chefs (I’m always looking for more, hint hint… if you have something to say to this audience, jab that “reply” button!)

  • Go through my stupid mail. There is enough stacked up that it is a Task.

  • Push consulting paperwork forward. I forgot how much lead time there was in this game…

  • I think I’m going to leave the last couple of slots open because I feel like something important is going to occur to me later.

And that’s it for today. As always, thanks for reading and please reply!!!