By Casey Liss
Small Hurdles

Last night I added native post-to-Twitter support to Camel. In and of itself, this is not particularly remarkable. However, the path to get there is an interesting example of how developers work, and how one small change can create some significant ripples.

Genesis

Everything started with me deciding to add the ability to make link posts to Camel. That went smoothly and, at first glance, didn’t create any further problems. Until:

I needed to do something to fix this.

Diversion #1: RSS Modifications

Thus, I did what was recommended, and I had seen a zillion times before. I modified the RSS generator to set the URL of the post not as my own site, but instead the target of the link post. All seemed well.

Then I made a second link post and realized something else was amiss.

A New Problem

At the time, I was using IFTTT to automatically tweet when I make new posts to this site. That was working perfectly, until I made that change to how the RSS worked. Notice the difference between this tweet, which was before the change:

As compared to this tweet, after the change:

You’ll notice in the latter tweet, the link is to the external URL, not to this site. This is a change from how it was before I adjusted the RSS feed. Unfortunately, I preferred it the old way.

I was now at an impasse — I could either have RSS work the way I want or Twitter work the way I want. At a glance, there was no way to tell IFTTT to use a different URL for what it posts to Twitter.

Diversion #2: Creating a Twitter App

Most of the motivation for using IFTTT was to avoid having to write my own Twitter client into Camel. I didn’t want to do that specifically because I wasn’t sure how the OAuth flow would work. The idea was for Camel to autonomously post to Twitter; I had no intention of building a login flow just for that.

As it turns out, I had made a poor assumption.

When creating a Twitter application (which is to say, asking Twitter for the ability to access its data programmatically), you can actually get the requisite OAuth tokens by hand for the account that created the application. So, I created an application off of the @caseyliss Twitter account, and was able to mock something up using the twitter package for Node.

However, since I created the app off of my Twitter account, it could only post to my account. Now that I had things working, I need to create a Twitter application off of the @caseylisscom account, so tweets would be posted from there. That should have been easy, until I ran into this:

Twitter Error

At a glance, this is no big deal. Until I remembered that my phone number is associated with my @caseyliss account. Unsurprisingly, Twitter only allows a phone number to be used for one account.

Diversion #3: Getting a Burner Number

Most people need a “burner” phone number to do nefarious things. Perhaps they’re trafficking illegal items. Perhaps they’re running around on their spouse.

Me? I’m trying to get my blog to post to Twitter.

I wasn’t sure how to go about getting a burner number that can receive text messages. I asked on Twitter, and got a few responses. Most immediately jumped to Google Voice, but others pointed out that Google Voice can’t receive messages from short codes. So, that was a non-starter.

By the magic of Twitter, though, I did get the winning suggestion:

I quickly checked out Burner, and it looked promising. I downloaded it, set up a number for free[1], and plugged that into Twitter. It sent me a confirmation code, which Burner received no problem, and I was up and running.

A New New Problem: Determining When to Tweet

The next obstacle was determining the right time to tweet. Camel doesn’t have any sort of database, and Heroku has an ephemeral filesystem, which means I can’t just save a record of the last post that has been tweeted. Thus, the only reliable way to figure out what has been tweeted is to look at the tweets of the account itself. In my case, that meant inspecting @caseylisscom’s tweets.

Though I very rarely write tweets by hand from @caseylisscom, I do on a rare occasion. Thus, it wouldn’t be as simple as just grabbing the most recent tweet, or even the most recent tweet that had a URL associated with it. I needed a reliable way to determine when Camel itself had tweeted last.

The easiest answer? Look for tweets posted by the just-created Twitter app that Camel uses.

The general idea is, Camel looks at the most recent tweet posted using “Camel Spitter” (the aforementioned app) has made. Once it finds the most recent auto-tweet, Camel looks at the URL on that post, and sees if it matches the URL of the most recent post within Camel. If not, Camel will fire off a new tweet for that post.

Diversion #4: Deployment Issues

At this point, I had:

  • A RSS feed that points to the external link when the post is a link post
  • A Twitter app unique to my website
  • Code to automatically tweet when a new post is posted

I had everything I needed, so I went ahead and deployed the changes to Heroku. Which didn’t work:

module.js:340
throw err;
      ^
Error: Cannot find module 'Twitter'
	at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/app/camel.js:21:15)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

Uhhhhhh… what?

After doing a bit of trial-and-error, I realized that my Mac’s file system (🔔) is not case-sensitive, but the one Heroku uses is. Thus, this line:

var twitter = require('Twitter');

Just needed to be changed to:

var twitter = require('twitter');

And everything was right as rain.

Turns Out

None of the actions above are particularly remarkable, but what made it interesting to me is that a seemingly innocuous change — adding the ability to create link posts to Camel — caused quite the avalanche of random changes and issues.

Despite all the pain, Camel is now considerably more robust than it was just a week ago. I’m extremely happy with where it’s ended up. The challenges were, well, challenging, but that’s exactly what makes software development so much fun.

When the dust settled, after all that work, I got this:

…and I couldn’t be happier.


  1. Burner gives you 60 free text messages & 20 free minutes when you install; it’s an in-app purchase to get more.


 

I’ve long wondered what happens to the cars that the hosts of Top Gear drive once they’re done with them — particularly so for cars they drive on foreign soil. In the past, I’ve noticed some of them end up in the studio, but not always. What happens to the others?

Someone has posted pictures of Richard Hammond’s Bentley once he was done using it in the recent episode in Australia. From the link:

By the end of this episode the cars still worked perfectly, although they suffered minor cosmetic damages.

After looking at these pictures, it’s clear that not everyone has the same definition of “minor damages”.

Link via Top Gear Box


 

A couple of important changes to Camel, for those that are using it, or are considering doing so:

  • Support for link posts such as this one.
    • Click the hand to follow the link
    • Click the anchor to get a permanent link to this page.
  • Significant cleanup of the post rendering logic, so it’s not… well… insane.

I was pretty embarrassed about how rough the post rendering logic was. It was a mess of seemingly-redundant functions with hard-to-differentiate names. Now, the process is much simpler and thus much easier to follow, extend, or debug.

When I originally wrote Camel, I had really thought about supporting link posts, but I wanted to force myself to have something to say. I didn’t want this to just be a dumping ground for links I find — that’s what Twitter is for. Now that I feel like I’ve established a voice for myself and this website, I went ahead and added support for link posts.

Naturally, all of these changes are on Github, save for the settings to use emoji as the link/anchor indicators. I’m not even sure I’ll stick with those, but I wanted to try something other than ∞ and →.


Appearance: Random Trek 37

I had the pleasure of joining Scott McNulty on his very clever podcast, Random Trek. The premise behind Random Trek is to have a different guest each week come on and discuss a random episode of Star Trek — from any of the series.

For me, I was only really familiar with Star Trek: The Next Generation. When Scott told me that I was randomly assigned an episode from TNG, I was thrilled with my good luck.

Upon watching my episode, Shades of Gray, I realized my luck was short-lived.

Star Trek fan or not, you may enjoy listening to me on the episode trying not to be too negative about what is widely considered to be the worst episode from The Next Generation. Needless to say, it was… challenging.


Falling in Love with Virginia

Freshly graduated from Virginia Tech, I was now a month into my first real job, in Charlottesville, Virginia. The job made for an easy transition from childhood into the adult world. I wore shorts in the summer and was one of the few that believed in collared shirts. My “job” was to write software that ran slot machines. When I was “debugging”, I was playing the slots. Unfortunately for me, even when I won, there was no cashier to bring my vouchers to.

Friendships were hard to come by at first. I liked my coworkers a lot, but most were quite a bit older than I. A dear friend from college an hour away in Richmond provided solace, but we didn’t hang out all the time. I had no money, but when it came to time, I was the richest man alive.


One Saturday in late October, we were slated to have a beautiful day. I didn’t have anything going on, so I decided to visit my alma mater. However, instead of going the direct route, I decided to go via the Blue Ridge Parkway. This turned what should have been a 2 ½ hour drive into a roughly 5 ½ hour drive. With nothing but time, why not?

At the time, I still had my favorite car of all time: my 1991 Nissan 300ZX. It wasn’t the twin-turbo, it weighed way too much, and as such was slower than dirt. Nevertheless, it was (and remains) beautiful, it had T-Tops, five speeds, a clutch, and a workable stereo. Helpfully the Blue Ridge Parkway has a maximum speed limit of 45 MPH, so speed wasn’t really a factor anyway.

The point of this trip was to relax, enjoy the weather, enjoy the sights, and take everything in.

Having never really driven the Parkway before, I wasn’t sure what to expect. Since I left early on the Saturday before Halloween, I quickly found there was no one on the road. It was just me, my car, and my music.

Z by the BRP Sign

I went to high school in a small town in Connecticut. My parents are New Yorkers. I consider myself to be a child of the northeast — a “yankee”. Going to school in southwest Virginia was amazing, but I was… ready to leave. I knew I didn’t want to live there. Within Virginia, I knew I didn’t want to go to the DC suburbs because I like to measure 5 mile commutes in minutes not hours.

When I landed the job in Charlottesville, I had told myself I’d put in a couple years, and then move back to where I belonged: back to the northeast.

What I began to learn that day was that there’s a strip of Virginia — the strip in the center — that is just right.

Z by Otter Lake

Driving down the Blue Ridge Parkway, I still remember what I listened to. Being just removed from college, I still had a huge love for collegiate a cappella. Around that time, my favorite group from back at school, Juxtaposition, had just released Me Put On Show. Additionally, one of my friends from back in Connecticut had insisted I take a listen to Big & Rich’s Horse of a Different Color, which was surprisingly excellent.

I remember vividly how it was a foggy day; when you climb to the elevations that the Parkway ran through, interesting things happen. Namely, you can actually pass through a cloud, and come up above it. This is looking back upon the top of the cloud I had just driven through.

Cloud

The Parkway has overlooks every couple of miles, and as I drove, I would stop whenever I felt the urge. The views were phenomenal, as at that altitude, many of the leaves had already changed colors. It was really breathtaking.

This trip changed everything for me. It allowed me to leave behind any preconceptions of Virginia. The trip showed me what Virginia really is: not only a truly magnificent part of the country, but also my home.

Humans are social creatures. We value being connected. That’s why we stare at our phones all the time; always seeking yet another connection. It’s only when we disconnect from everyone else that we can really connect with ourselves.

Z at Rock Point

You Thought Naming a Project Was Hard

Meaghan O’Connell writes about how impossible it is to pick the perfect baby name. So much of this article reminded me of the experience Erin and I had.

We’d settle on an idea and then see it everywhere. We’d overhear other women at Baby Gap shopping for their nephews with one of our names. It sounded so not special when they said it.

I eavesdropped on more conversations during the nine months Erin carried then-Sprout now-Declan than I had in my entire life prior.

Giving your baby a name, it turns out, also includes anticipating how other children will cruelly twist it to hurt them. After a few rounds of brainstorming possible mean things, you begin to think you may have missed your calling.

This is bad in general. Imagine your surname is Liss. On the list of baby names we can never ever use:

  • Cash Liss
  • Chastity Liss
  • Hope Liss
  • Love Liss
  • Richard Liss

Meaghan also has some excellent advice:

When I brought up a name I liked and a friend told me that, just so I knew, it was on her list of potential baby names […] I decided that even if I did have the perfect name, I would never, ever share it with anyone.

In a not-particularly-unusual stroke of genius, Erin thought it’d be wise for us to make that very promise to each other. I can’t recommend it enough for soon-to-be parents.


Baby Stuff We Use

What with us having a new baby in the house, Erin and I have been asked quite a few times what baby stuff we’re using.

Often, we’ll just refer them to Marco and Tiff’s really excellent baby stuff review. In fact, Erin and I used that very review when buying for Declan. If I were you, I’d take our recommendations, pair it with the Arments’, and decide for yourself.

This is not a Wirecutter-style “this is the best available” sort of post. Unless otherwise noted, while we did extensive cross-shopping, we didn’t buy alternatives. If you’re looking for that kind of a post, try  Marco/Tiff’s or The Night Light.

Since we originally wrote this post, we’ve now written a new one for toddler stuff.

Baby MonitorInfant Optics DXR-8 — $160
Originally, we had recommended the $220 Motorola MBP-43. That unit was nice, and had the advantage of having two cameras. However, the power supply for the monitor died. Then we had to buy third party replacements because Motorola didn’t sell first party ones. Those third party ones also died. Finally, after almost two years, the receptacle for the power supply dislodged and fell off within the monitor itself. Not good.

We replaced the Motorola with the Infant Optics, and can’t be happier. Perhaps the biggest (and unexpected) benefit of the unit is that the monitor is powered by a standard micro USB cable. This means, unlike the Motorola, I can power the monitor from my laptop. Additionally, the software that powers the Infant Optics seems to be an updated version of the same software that runs the Motorola, which is a good thing. Finally, the Infant Optics includes a wide-angle lens, and a zoom lens is available, which allows a much crisper video than would be available digitally.

In summary, the Infant Optics has all the perks of the Motorola and, a few months in, none of the drawbacks.

StrollerGraco Aire3 Click Connect Travel System — $250
This is a Babies R Us exclusive. A “travel system” means this package includes an infant carrier, stroller that the carrier plugs into, and a base for the car that the carrier plugs into. There are plenty of arguments for and against travel systems, but we really like this one. We chose it because we both have average-size sedans, and the stroller portion folds up easier and smaller than most of the competitors. Additionally, there is only one brake toggle, on the right side, instead of one per side. We also got to a second base, so each car has one. The only complaint I have is that there is no snack tray for Declan once he outgrows the carrier part; only a cupholder.

Mom’s Diaper BagEddie Bauer Meadowbrook — $40
We initially got this diaper bag. Erin loves it and I like it. It doesn’t have hooks on the top at either end to hook onto a stroller, but on the plus side the main compartment is a cavern. Plus, it’s unisex and the changing pad is spacious.

Dad’s Diaper BagTom Bihn Parental Unit — $140
As a surprise Christmas/Hanukkah gift, Erin got me the newly-released (and often reviewed) Tom Bihn Parental Unit. I have other Tom Bihn bags and get way more enjoyment out of them than I should from… bags. Regardless, I really dig the Parental Unit because it’s durable, unisex, spacious, and has tons of compartments. Like Erin’s bag, the Parental Unit could really use stroller hooks. Also, the compartments don’t open quite as wide as I like. However, the fancier shoulder strap Erin sprung for is really comfortable, and the bag is easy to carry at the side or at your back.

UPDATE 25 June 2017: Recently Tom Bihn has updated the Parental Unit with a “version 2”. The folks at Tom Bihn were nice enough to send us a unit to test out. While the Tom Bihn folks kept most of the great stuff about the Parental Unit the same, they did make a few improvements. Most notably, the new Parental Unit’s main compartment opens far wider than the original Parental Unit. A small change, but an important one. I already loved our Parental Unit; now, I can’t recommend the Parental Unit enough.

Portable CribGraco Pack 'n Play with Cuddle Cove Rocking Seat — $140
We got a pretty… involved… pack and play. Not only is it a portable crib, but it also has a bassinet and a changing pad. As it turns out, we only used the bassinet a couple times, but we use the changing pad constantly. Were we to do it again, we wouldn’t bother with the bassinet, but I definitely recommend having the changing pad. Regardless, the whole thing collapses to be surprisingly small, with ease. (Ours is actually the “Brompton” color/pattern.)

Diaper PailUbbi Diaper Pail — $90
While absurdly expensive for what is really just a glorified trash can, I really like the Ubbi. The big advantages are its steel (not permeable plastic) construction that should never pick up any smells, and it doesn’t require special bags. Competing diaper pails such as the polarizing Diaper Genie can be much cheaper, but require expensive custom bags that I understand don’t last very long. Additionally, some have reported that the stink from the diapers can permeate the plastic. We decided on the Ubbi and have been very happy with it. It takes any 10 gallon trash bag, doesn’t let smells out, and is sturdy. The only complaint I have is that it’s smaller than you would expect; that said, we only change the bag once or twice a week.

Snot SuckerNoseFrida — $15
You use a tube and a crayon-like applicator to snuck snot out of your baby’s nose. Totally gross. Totally works. There’s filters between you and the snot, so it’s not nearly as gross as you’d think. Well, that’s what I tell myself, anyway.

SwingMamaroo Bouncer — $175-250
We got this mostly because I thought it was frikkin’ cool. The seat bounces in five different ways, in five different intensities. Additionally, you can use some of the built-in ambient noises, or plug in a device like your iPhone and use the Mamaroo’s onboard speakers. I love it. Declan… doesn’t seem to care one way or the other. The Mamaroo is really nifty, but I’m not sure if it’s really worth the money over a more traditional swing.

Infant CarrierEvenflo Infant Soft Carrier — $15
There are other far more popular options, such as the Baby Bjorn, which we haven’t tried yet. We also had a Baby K’Tan, but it was far more fiddly and we didn’t care for it. The Evenflo is semi-easy to put on by yourself, and pretty comfortable for me once it is on. Declan seems content enough.

Baby Burrito
Baby Burrito

SwaddleHalo SleepSack — $20
Babies love to be swaddled, since they just spent 9 months all wrapped up. We also tried the SwaddleMe, but prefer the SleepSacks. They do use really loud velcro, which is frustrating, but they are super easy to put Declan into. And he loves them.

White NoiseSleep Pillow — $2
We didn’t want a white noise machine, but we wanted a white noise emitter. We got this for my old iPhone 3GS, and it works well. There’s probably better/nicer apps out there, but this was the first one we found. Bonus: it’s on all our devices, so we always have our noisemaker with us.

PumpMedela Pump In Style Advanced Backpack — $225
First things first: check with your insurance provider. They may provide you a pump for little or no cost to you. For us, we could have gotten the non-backpack version of this pump for free, but we paid a little extra for the backpack version. It’s very nondescript, which is nice. The pump works well, and the backpack has plenty of extra space for the various paraphernalia you need, such as the shields, vessel to receive the pumped milk, etc. When in the car, we pair the pump with the power inverter we got years ago, to avoid wasting a zillion dollars on batteries. Conveniently, the inverter & AC adapter both fit next to the pump housing.

PillowMy Brest Friend — $35
This is the only pillow we’ve owned, but Erin has tried the Boppy. Erin likes the humorously-named-and-seemingly-misspelled My Brest Friend. It buckles onto her so she can stand up and adjust it with one hand, while the other hand holds Declan. The My Brest Friend also has plenty of space for Declan; he’s only now, at three months, starting to outgrow it. Furthermore, it’s reasonably firm, which means Erin doesn’t have to support Declan as he’s nursing. I have doubts about the longevity of it — beneath the cover it’s just pieces of foam glued together — but so far so good.

Activity LoggerBaby Connect (iTunes) — $5
Particularly early on after a baby is born, a parent’s life is ruled by logging. How many poops did they have? What color were they? How many pees? When did they eat last? It isn’t hard to feel like your life has come down to record keeping. Baby Connect is really unattractive. However, it works really well. Erin and I have each been set up as parents in the app (you can set up other kinds of caregivers as well). Every time Declan… performs… we log it in the app. This is nice just to aid in record keeping, but it’s also a surprisingly nice way to feel a connection to them while I’m at work. I never thought I’d be excited to get a push notification when someone else took a dump, but, now I am. Life is weird.

Other Stuff — These items don’t really justify extensive commentary, but we recommend them:

  • Avent Soothie Pacifiers — $4
    Declan seems to like these more than the more traditional looking ones, and they’re completely soft.
  • Munchkin Latch Bottles/Nipples — $20
    Unbeknownst to me until we had Declan, when a baby nurses the way they hold their mouths open (the “latch”) is not like an adult drinking from a straw. It looks more like an adult eating from an apple. The Munchkin system helps encourage a much bigger/wider/better latch.
  • Medela Steam Bags — $5
    Quickly & easily sanitizes baby bottles, pumping equipment, pacifiers, and more.

UPDATED 2017-06-25 11:00 AM: Added blurb about the refreshed Parental Unit. UPDATED 2016-11-27 4:00 PM: Added Infant Optics monitor and removed Motorola.
UPDATED 2015-02-10 2:00 PM: Added Baby Connect.


Ripping it Right

A few days back, Jason Snell posted an awesome guide about how to rip DVDs and BluRays. I bought myself a reasonably priced BluRay reader and have started digitizing some of my movie collection.

I wanted to call attention to a part of Jason’s piece that I nearly missed:

If your movie or TV show has occasional subtitles for foreign languages (think Greedo in “Star Wars”), choose the Foreign Audio Search option and HandBrake will try to find any subtitles that are meant to be visible during the movie when it’s being played in its default language.

One of my biggest annoyances is missing subtitles for foreign content in an English-language film. Left to its own devices, Handbrake won’t encode any subtitles — even those used to show what foreigners are saying. The tweak Jason suggested fixes the problem:

Subtitle Selection

The only downside of choosing Foreign Audio Search is that it will require a second full scan of the movie: one to scan for the subtitles, and one to actually encode the movie. It’s worth it, so I don’t have to rely on memory to know what Captain Ramius is saying:

Ramius
Appearance: Clockwise 72

This week I returned to the no-fillers-included Clockwise to join Jason Snell, Dan Moren, and Jacqui Cheng. On this episode, we discuss Apple’s quarterly results, Kickstarter, Microsoft’s HoloLens, and technology to cure life’s little annoyances.

The beauty of Clockwise is that it’s kept to 30 minutes or less. Needless to say, that’s a time limit I’m not exactly used to; that’s what makes it so fun.


First Snow
❄️👶