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:
@caseyliss
You seem to have forgot to somehow expose the links in your RSS. Just links to the
post on the site.
— Hampus Jensen (@Leonick91)
February 6, 2015
@caseyliss
Having the item link be your link and including a permalink to your site at
the bottom of the post content seem to be "standard".
— Hampus Jensen (@Leonick91)
February 6, 2015
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:
Camel Gets Link Posts http://t.co/f36LORcVzD
— Liss Is More (@caseylisscom)
February 6, 2015
As compared to this tweet, after the change:
Top Gear Aftermath http://t.co/849tDD5TVV
— Liss Is More (@caseylisscom)
February 8, 2015
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:

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:
@caseyliss maybe a job for
@burner ?
— Andrew Davidson (@amdavidson)
February 9, 2015
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:
Top Gear Aftermath
http://t.co/aySRavVYVu
— Liss Is More (@caseylisscom)
February 9, 2015
…and I couldn’t be happier.
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
to follow the link
- Click the
to get a permanent link to this page.
- Click the
- 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 →.
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.
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.

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.

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.

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.

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-
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.
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 Monitor — Infant 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.
Stroller — Graco 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 Bag — Eddie 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 Bag — Tom 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 Crib — Graco 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 Pail — Ubbi 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 Sucker — NoseFrida — $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.
Swing — Mamaroo 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 Carrier — Evenflo 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.

Swaddle — Halo 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 Noise — Sleep 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.
Pump — Medela 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.
Pillow — My 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 Logger — Baby 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.
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:

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:

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.