(un)Limited Storage!

We need to get out of the habit of calling things “unlimited” that obviously aren’t. When Flickr gave itself a makeover they announced “1 Terabyte of storage” which in my opinion is a better headline than “Unlimited storage” because 1TB actually means something and unlimited obviously doesn’t.

Microsoft previously announced unlimited storage for O365 subscribers and has since had to renege when a user hilariously abused the unlimited storage. It’s not really abuse though, is it? You said “unlimited”, Microsoft, and now you’re upset that someone was foolish enough to take you at your word. There’s more than a few ways this situation could have been handled more delicately and I have a way to prevent it from ever happening again; stop calling things unlimited.

There are always limits, and companies having to take ownership of those limits means consumers can actually make informed decisions. Storage, bandwidth, etc., we all know these things have a cost, so let’s just be upfront about that reality and have a little transparency.

And don’t think I’ve forgotten about you, wireless carriers. If you want to avoid press like this

you’re going to have to be honest about what your costs are, and what we’re getting for our money.

The College Loan Bubble

Clay Shirky tweeted this article by Malcolm Harris on why the College Loan Bubble™ isn’t a real bubble and will never pop. Near the end is this passage that made me pause (emphasis mine):

The truth is that, although the college wage premium has increased in the past three decades or so, it’s not because young graduates are on average better off. Between 1986 and 2013, their median real annual earnings increased by less than $800. But over the same period, for those with no college, real earnings dropped by $2,525. The economic choice this country poses to young people about higher education has stopped being about opportunity for wealth—now it’s about fear of poverty. Empirically, the latter is a more effective motivator. Whether or not this is an appropriate way to produce educated workers is, in theory, a question for our democracy.

Higher education was never supposed to be about job training, but due to a variety of factors over many years that is what it became. Unfortunately for higher ed, one of the most rapidly growing sectors in this country is technology. And that sector’s reliance on, and reverence for, the college degree is at an all time low and dropping.

The bubble may not exist and may never burst, but more and more of those dollars are probably going to go into dev bootcamps and out of traditional universities.

Let They Who Are Without Downtime Cast the First Stone

I’ve (begrudgingly) been a Comcast customer for a long time and I have outages roughly one per month or more. So do a lot of other people. So it’s pretty tone deaf of Comcast to tweet this:

@Xfinity on twitter: "Google Fiber whiffs. Outage caused Kansas City customers to miss part of World Series game. Outage cause unclear."

Note: @xfinity has since deleted this promoted tweet.

Particularly considering the fact that Google apologized and credited effected customers for the outage.

We’re all waiting for our checks, Comcast.


Via @pwnela on twitter.

Don't Lecture Me. Really.

I’m as big a fan of unsubstantiated anecdotal arguments as anyone but deciding you’re not willing to give up lecturing doesn’t suddenly make it a quality learning experience.

Molly Worthen almost admits as much herself near the end of the article (emphasis mine):

Note-taking is important partly for the record it creates, but let’s be honest. Students forget most of the facts we teach them not long after the final exam, if not sooner. The real power of good notes lies in how they shape the mind.


Read Lecture Me. Really. on nytimes.com.

Apple Hates the Mouse

Today Apple released a new keyboard, trackpad, and magic mouse. They all have internal batteries, recharge via lightning cable, and the trackpad and keyboard have been improved over the already excellent previous models.

The Magic Mouse 2, however, is actually worse. They fixed none of the original issues around terrible ergonomics and an unpleasant click area, and they added two new drawbacks; it doesn’t have 3D Touch (the Magic Trackpad 2 does) and you can’t use it while charging because the port is on the bottom.

We get it Apple, you hate mice. You’re all in on the trackpad. That’s fine. You make excellent trackpads. Maybe just give up on the mouse altogether. They are clearly not your strong suit anyway.

HBO Now on Android (Sucks)

HBO Now, HBO’s admission that most people don’t want cable, launched as an iOS exclusive 3 months ago. If you don’t have an iOS device, and weren’t sneaky enough to use a friend’s to setup your account then watch on a laptop, you’ve been sadly waiting all this time. But the wait is over! HBO Now is available on Google Play and it’s a really kind of pathetic port.

Unlike it’s older sibling, HBO Go, HBO Now on android doesn’t have Chromecast support, and for some reason blocks anyone with a rooted device from even installing it.

The reviews are already pouring in, and they are not happy.

Less than favorable HBO Now reviews on Google Play

Get it together, HBO.

Unicorns and Rainbows, a Year in Reflection

Google Calendar event reminder

A year ago I said I wanted to be interviewed by Ben Orenstein and he generously agreed to… me asking him again in a year. That’s a reasonable response when you think about it. I’ve never heard an episode of Giant Robots Smashing into Other Giant Robots that wasn’t amazing, and imposter syndrome aside, I don’t know that I’m on the same level as his other guests.

Well it’s been a whole year. Spoiler alert; I did not become a professional developer in time. As the event on my calendar drew nearer I asked myself “What did you do with that year?”

In no particular order I…

All the while working with the best team I’ve ever worked with and being the luckiest part of an incredible family. Not too shabby for 365 days. So is this whole article just one giant #humblebrag? No!

It’s a reminder that plans don’t always unfold the way we think they should. I didn’t spend a year becoming a junior developer; I spent a year getting as awesome as possible at my job, doing things I love to do, and spending time with people I love to spend time with.

It wasn’t all unicorns and rainbows. I didn’t accomplish everything I set out to do and things didn’t always go my way. I still want to upgrade from amateur dev to junior dev. But it’s important to reflect on successes while we learn from missteps.

I’m still available for interview if you’re interested, Ben.

Building Sunrise Robot

H3LiOS, adorable robo-mascot for Sunrise Robot

This is H3LiOS, the mascot for Sunrise Robot.

What is Sunrise Robot? It’s a podcast network of shows for technologists, gamers, artists and cultural enthusiasts. It was founded by me and my co-host on Flipping Tables, Michael Edwards. It’s awesome and you should totally go check it out, listen, subscribe, and maybe even support us. But that’s not what this post is about. This post is about the stack we used to build Sunrise Robot.

When we decided to build this thing we knew we had a lot of decisions to make. And the internet being the way it is meant there is no shortage of opinions on the Best Way™ to do it. The three areas we had to primarily make choices in were:

  1. CDN
  2. web host
  3. CMS

We immediately found that all of these areas overlap to a huge extent. We could have just done a one-click install of wordpress on literally any hosting service, started uploading episodes to their “unlimited” storage, and called it a day. In return for the ease of setting that up we would be making a lot of trade offs. Let’s look at each piece.

CDN

A CDN (content delivery network) is just a place to store and serve files on the surface. For a podcast (or podcast network like Sunrise Robot) we also need industry-reliable data about each episode’s performance.

When we launched Flipping Tables in the beginning of 2014 we just hosted in Dropbox. Free? Reliable(ish)? Easy to use? It’s a great tool to use at first, but you give up a lot. It doesn’t scale because it’s not meant for content delivery at scale. It doesn’t give you any control over the URLs of your files. It doesn’t give you any info about file activity. These problems are true of any similar service as well like Google Drive/Copy/etc.

Then there is “unlimited” web hosting but aside from control over the URLs there isn’t really much advantage over Dropbox.

So we went with…

Libsyn. Industry-trusted analytics, works at scale, and fairly priced. It took me a minute to fully understand “monthly storage” but for a service like Libsyn is makes sense. Flipping Tables has been on Libsyn since mid-November and it’s been working great. It’s worth noting that Libsyn also provides webpage and feed services but you can use them for just file hosting/analytics which makes a lot more sense when you want control over your host and CMS.

Web host

Web hosts are a dime a dozen. From cheap-o free services to shared hosting; from super high performance private servers to full stack solutions like wordpress.com or Squarespace.

Full stack solutions mean using the included CMS. We considered wordpress and Squarespace but they just weren’t quite right for our needs. By the time we cut out the cruft and hacked in the features we needed it didn’t make sense to use a plug-and-play solution that really wasn’t.

Shared hosting has a bad reputation for the ridiculous number of asterisks on their unlimited plans. I think a big part of this bad reputation comes from the glut of wordpress sites in the last ten years. The sheer number of “how to speed up wordpress” posts, caching plugins, and the more recent popularization of static site builders is a testament to how difficult it is to run a full features CMS on shared hosting.

So we went with…

It is really affordable though and if you aren’t using a database driven CMS it is actually a pretty decent option. So how are we managing content without a CMS?

CMS

Content Management Systems are what we like to call a “solved problem” for the most part. For the majority of websites the right answer is either “Just use Squarespace” or “Just use Wordpress”. There are others but seriously; a ridiculous amount of the internet is run on those two platforms.

For us and for Sunrise Robot neither of those really fit. We needed something fast and light weight. We were willing to do work to customize it but we agreed our needs were simple enough that building up would be easier than tearing down. I’ve been using Jekyll as a static site generator for a couple years and was curious about Middleman. After some poking around the docs and setting up a few test sites I was sold.

So we went with…

Middleman. It’s powerful, flexible, and gave me a damn fine excuse to sharpen my skills.

Announcing Sunrise Robot

It’s been a long road getting here, and this is just the beginning. We’ve learned a lot, and can’t wait to see what the future holds. Sunrise robot officially launches today so go check it out! And if you want to know more, check out Mike’s post about What 52 Weeks of Podcasting Will Do To You.

Easter Eggs May Be My Favorite Part of Programming

[Chrome offline easter egg](http://www.omgchrome.com/chrome-easter-egg-trex-game-offline/)

Unfortunately, I’ve been having a lot of wifi issues with Yosemite but luckily Google has my back. From omgchrome.com:

Hidden within the browser’s new-look ‘Network Error’ page is a cute, endless running game. It even features the ‘lonely t-rex’ character used to illustrate the browser’s error pages.

Although I’d rather have network and not need to play this game, it is a clever little feature that probably took one developer an hour to add in and turns a frustrating experience into a fun break from whatever you were “working on”. For the developer it’s a nice reprieve from optimizations and algorithms and the like. It also shows a high level of craftsmanship to the software when these tiny bits of polish are added in where they may take decades to be found.

Archive.org's Most Useful Archive Ever

2,301 MS-DOS games are now available on the internet archive and playable in the browser. The description block on archive.org is very humble:

Software Library: MS-DOS Games Software for MS-DOS machines that represent entertainment and games. The collection includes action, strategy, adventure and other unique genres of game and entertainment software. Through the use of the EM-DOSBOX in-browser emulator, these programs are bootable and playable.

Yeah, Wikipedia is an amazing use of the web but Oregon Trail!

What Slack and Twitter Taught Me About FOMO

FOMO (Fear Of Missing Out) is a very real concern in these days of unlimited information and connectivity. It seems like an almost daily occurance you either say or have someone say to you “Oh! You haven’t heard/read/seen that?! ZOMG!” I’m as guilty of this as anyone, but it’s kind of a negative attitude. I’ve been working to 1. stop being that guy and 2. stop caring when I miss the most totally awesome thing ever.

Ten Thousand

I used to have all the things notify me of all the things so I would never miss anything. I also obsessed about reading my whole twitter timeline. These are fool’s errands. Not only are you never going to catch everything, but constant buzzing and beeping makes getting anything done pretty much impossible. That’s why I changed my IM to Slack, and changed how I use Twitter.

The most significant thing about Slack is that you don’t read everything everyone on your team posts. You can but you’re kind of not supposed to. If you need to see it later you’ll be able to find it. And if someone needs to address you directly they can @mention you and you’ll get a specific notification. What does that mean? While your coworkers are discussing an issue that doesn’t concern you, Slack isn’t annoying the hell out of you with fly over notifications and beeping. Later if you want to see what all the fuss was about you can go read the log and bam! you’re caught up. Staying in touch with the goings on of your office is way more efficent this way, and a lot less stressful.

I’ve been using twitter for a long time (my original account is gone, so I can’t prove it) and I used to read every. single. tweet. It made me not follow certain people because they tweeted too often. It made me obsess over which client I used so I could keep track of my read position in the timeline. It became a burden. Then recently I decided twitter (the company) is trying so hard to force me to not use twitter (the service) that way so I stopped. Now I read from the top until I see something I’ve seen before or stop caring. If I miss something? Oh well.

It’s not easy to go from the sweet-lie-you-tell-yourself of seeing “everything” to seeing only “not everything” but the result is a happier and less stressful life. Try it as an experiment: turn off notifications everywhere you can, and all the places you think you can’t. Set aside a time to look at those things. The first few days you’ll probably have the FOMO shakes, but once you detox, you’ll be amazed how much time you have that you used to waste on “keeping up” and task switching.

Remember FOMO is just the fear of missing out; the important stuff will find it’s way to you. And the rest? Well, it must not be that important.

Ted Cruz Can't Even Internet

Senator Ted Cruz took to twitter this morning to prove he has no idea how the internet works.

“Net Neutrality” is Obamacare for the Internet; the Internet should not operate at the speed of government.

@SenTedCruz tweet on "net neutrality"

You know that whole “free market” thing republicans are constantly hearlding as the right way to run the economy? Net neutrality is what makes that possible on the internet. Crapping on it just because a President you don’t like supports it doesn’t just make you appear childish and petty, it proves you are childish and petty.

Google Inbox With Recurring Reminders

I made an animated gif of the experience you get with Google Inbox if you have recurring reminders. Hopefully a fix for this coming soon.

Mark as done. Mark as done everywhere.

Apple Insecurely Patches Bash Security Flaw

Everyone is reporting that Apple has issued a patch for the bash bug known as shellshock.

arstechnica

The OS X update wasn’t yet available from Software Update on our Mavericks system when we checked, but in the meantime you can grab the Mavericks, Mountain Lion, and Lion versions of the patch manually from Apple’s software downloads site.

appleinsider

Mac owners running Mavericks can download the 3.4MB patch through Apple Support website, as can users operating Mountain Lion and Lion. For Mountain Lion, the fix comes in at 34.3MB, while the Lion download clocks in at 3.5MB. Alternatively, the patch is available through Software Update.

9TO5Mac

For users on older versions of OS X, the Mavericks fix will not work. To secure those systems, there are separate downloads for Lion and Mountain Lion. The patch will likely be available through the built-in OS X Software Update mechanism soon.

Oddly, the patch (available only on Apple’s website and not through the app store as of the time of this writing) is served over a standard http connection which means it’s subject to a man in the middle attack. Fine? Maybe, but why gamble on security ever? Particularly when issuing security patches.

(The Right) Software Development Cycle

the iterative software development cycle

source

I’ve seen the above image a few different times but I’ve always neglected to capture it until now. This is the graphic I will forevermore pull out when I find myself in never ending planning sessions for version 7 of software when they haven’t written a single line of code for version 1.

It's Okay Not To Keep Everything

My co-host on the Flipping Tables Podcast and I had a discussion on episode 033 about note taking, blogging, tweeting, transient data, and recording everything. It’s a great discussion and you should totally go listen to it but there is a specific part of that discussion relevant to this blog and blogging in general.

You are who Google says you are

You’re responsible for who you are online, as much as you are offline. You don’t want the only search result on Google for you to be a dead MySpace profile. To that end the indieweb folks thing you should control as much of your data as possible, namely all of it. While I’m empathetic to their “be technically literal and control your own destiny” mindset, I think there is a compromise.

Our every utterance is not worthy of enshrining

You should consider anything you post online to be permanent and public for the purposes of not making an ass of yourself. On the other hand, I don’t need the security of a multi-datacenter-version-controlled-backup of my tweets. I used to think I did. Maybe some people do(?), but I’ve decided that just like I don’t keep a record of everything I say during the day, I don’t need a record of everything I tweet.

It’s okay to favorite, +1, reblog, like, or whatever you do without being able to reference that interaction in twenty years. For one thing, when you give this data to a company you must consider it to be transient. You gave it away, it’s theirs now. No promise you can get it back (or get it back in a usable form, Facebook…) Second, you think you’ll want to look at all of these things later and find patterns and uncover hidden insights, but you most likely won’t.1

I am who I say I am

In the spirit of the indieweb I encourage everyone to have a space on the web they control and maintain. For me it’s this blog, but I am active on twitter and Google+ as well. I still believe different tools are suited for different purposes (you’re probably not going to see a lot of blog posts about my beard) but until now I’ve considered my behavior on social media to be canonical.

Going forward the plan is to shamelessly copy the method I’ve observed on Daring Fireball and others of (micro)blogging things I want a record of. Just because something is tweet length doesn’t mean it has to live on twitter. Just because something is wordy doesn’t mean it has to live on Google+. Those places are public, and so they represent me, but they are impermanent. The things I want to maintain I need to control.

What about comments and discussion?

The iterations of my blog over the years has almost always had comments enabled. When I switched to jekyll I decided I didn’t want them anymore. I don’t want the visual clutter, the increased technical overhead, and now I don’t want the illusion of permanent record. I’m always happy to talk to people through channels meant for discussion, this blog just isn’t one of those channels. If something important or note-worthy comes out of a discussion on social media then I’ll make a note of it. Otherwise the experience merges with the background of my life like everything else.

How very zen.

Want to vehemently agree with me? Want to tell me how wrong I am? Want more updates about my beard? Follow me on twitter and Google+.

1 I know this flys in the face of data scientists and big data and analytics. There are interesting things to be learned from observing our habits and behaviors, but there is plenty of self-reflection and personal growth to be done without pouring over your Facebook likes. Particularly when you consider that “liking” something on Facebook, “+1ing” something on Google+, or “favoriting” something on twitter has no consistent and predictable meaning person to person or even the same person time to time.

Emily 1.0

After nine months of planning, and 12 months of work, Susan and I are proud to announce Emily 1.0! It’s been a long road getting here, but with the support of family, friends, and a great community we’ve been able to take our idea and turn it into something really great. I’ve posted the changelog below so you can relive the journey with us.

Thanks for an incredible year! We’re looking forward to many, many more to come!

Changelog

Project Creators

Chief Project Maintainer

About versioning

This project follows standard semantic versioning: YEARS.MONTHS.DAYS

1.0.0

  • Emily 1.0!
  • Switching to rolling upgrades so this will be the last “version”

Fixes

  • Major bug fixes, improvements, and enhancements

0.11.13

Adds

  • Teeth changed to 7

0.11.1

Fixes

  • General minor bug fixes and improvements
  • climb now works when stairs are passed in

Adds

  • Teeth changed to 6

Bugs

  • climb only works with stairs when up is passed in, down results in a crash

0.10.20

  • Teeth changed to 5

0.10.15

Adds

  • Teeth changed to 4

0.10.11

Adds

  • walk method

Bugs

  • walk requires a PERSON or WALKING TOY external module to be included

0.10.8

Adds

  • climb method
  • climb responds to on/off parameters

Bugs

  • climb only works with small obstacles

0.10.4

Adds

  • Teeth changed to 3

0.10.0

Fixes

  • General minor bug fixes and improvements
  • crawl fully functional

0.9.20

Adds

  • Height changed to 28”
  • Weight changed to 19.6lbs

0.9.15

Adds

  • stand method

Bugs

  • stand requires external APIs to function correctly

0.9.8

Fixes

  • General minor bug fixes and improvements
  • Several additions to CONSONANTS and VOWELS

Adds

  • crawl method
  • crawl works with forward parameter but only intermittently and for short distances

Bugs

  • Calls to crawl often return reverse even when forward is sent

0.8.26

Bugs

  • sitting sometimes gets called during sleep and causes a full crash, infinite loop of calls to cry

0.8.19

Adds

  • sitting method

Bugs

  • sitting sometimes crashes but can be recovered from with roll

0.8.8

Fixes

  • roll fully functional with all direction parameters

0.8.1

Fixes

  • General major bug fixes and improvements
  • Several additions to VOWELS

Adds

  • EDIBLES can be sent to LEFT HAND or RIGHT HAND for storing before adding to MOUTH

Bugs

  • EDIBLES do not always make it to MOUTH

0.7.6

Adds

  • SIPPY-CUP API hooks

Bugs

  • Connection to SIPPY-CUP always drops and never close correctly

0.7.2

Fixes

  • General major bug fixes and improvements

Adds

  • clap method

0.6.26

Adds

  • Teeth changed to 2

0.6.23

Fixes

  • HANDS have sub-arrays LEFT HAND, RIGHT HAND

Adds

  • Small objects can be stored separately, or large objects can be shared between both
  • Small objects can be stored simultaneously

0.6.17

Fixes

  • roll accepts back to front as parameter

Adds

  • Teeth changed to 1

Bugs

  • roll back to front is unreliable and fails often

0.6.15

Fixes

  • EDIBLES array removed

Adds

  • MOM API to access EDIBLES instead of storing them locally
  • giggle can be trigger consistently from external calls like tickle

0.6.11

  • Adds “Peach” to EDIBLES array

0.6.8

  • Adds “Zuccinni” to EDIBLES array

0.6.4

  • Adds “Avacado” to EDIBLES array

0.6.0

Fixes

  • General minor bug fixes and improvements
  • “Length” changed to “Height”

Adds

  • Weight changed to 16lbs
  • Height changed to 26.7”
  • Teeth changed to 1

0.5.28

  • “Pear” to EDIBLES array

0.5.26

  • “Carrot” to EDIBLES array

0.5.22

  • “Banana” to EDIBLES array

0.5.21

  • “Squash” to EDIBLES array

0.5.14

  • “Apple” to EDIBLES array

0.5.11

Adds

  • “Sweet Potato” to EDIBLES array

0.5.8

Adds

  • “Oatmeal” to EDIBLES array

0.5.0

Fixes

  • General minor bug fixes

Adds

  • Weight changed to 15lbs 9oz

0.4.24

Adds

  • “B” to CONSONANTS array

Bugs

  • “B” always returns “Bbbbbbbbbbbbbb”

0.4.12

Adds

  • “Rice cereal” to EDIBLES array

0.4.9

Adds

  • Increased range of grab to include front and side

0.4.2

Adds

  • Length changed to 24.5in
  • Weight changed to 13lbs 13oz
  • Adds additional vaccinations for increased security

0.3.9

  • 100 days old!

0.3.7

Fixes

  • grab much more reliable

Bugs

  • Objects added to HANDS with grab are always added to MOUTH. No work around yet

0.3.0

Fixes

  • General minor bug fixes
  • giggle and smile much more reliable
  • Ratio of pleasant to unpleasant noises changed to 60/40

0.2.26

Adds

  • grab method

Bugs

  • objects that work with grab are limited, and sometimes the method is destructive to the object

0.2.17

Fixes

  • roll works right or left, but still only front to back

0.2.7

Adds

  • roll method

Bugs

  • roll only works to the left and from front to back

0.2.3

Fixes

  • giggle more reliable
  • smile now works consistently outside of sleep

Bugs

  • giggle triggers randomly when Emily is in sleep mode
  • Easy to bring out of sleep mode by accident, then can be difficult to restore sleep

0.2.1

Adds

  • Moved some support functions to Day Care™

Bugs

  • Day Care™ is expensive and appears to not work at night

0.2.0

Adds

  • Length changed to 22in
  • Weight changed to 10lbs
  • Vaccinations to prevent cross-system corruption

0.1.22

Adds

  • giggle method

Bugs

  • giggle cannot be called directly and triggers randomly

0.1.4

Adds

  • smile method
  • Changed eye color to grey-brown

Bugs

  • smiling works only while Emily is in sleep mode

0.0.14

Fixes

  • Umbilical cord completely removed
  • nursing completely stable

0.0.3

Fixes

  • nursing more reliable

0.0.1

Adds

  • Emily created!
  • Length set to 19in
  • Weight set to 7lbs 12oz
  • Hair color set to brown
  • Eye color set to grey
  • Cuteness set to infinity
  • Removed umbilical cord

Bugs

  • Cannot send messages except from cry method
  • Legacy umbilical cord remains

Opportunity, Google Glass, and Cadavers

It’s hard to drop what you’re doing and seize every interesting, potentially interesting, or secretly interesting opportunity that comes along. A decent rule of thumb might be to try to always seize the once in a lifetime chances. And if you’re not sure if it’s really once in a lifetime, but seems rare and maybe a little weird, you should probably go for it.

Too vague? Here’s a story about a diem I carped.

Working in academia has a fringe benefit of exposing you to a experts in a variety of disciplins. My colleague and I have spun our access to these interesting people into a podcast, and our very first guest was Dr. Mike Pascoe.

Here it is… you know… if you’re interested.

What you need to know from that episode is that I was invited to participate in a cadaver dissection so my department’s Google Glass could be tested in a teaching lab setting.

I am not interested in becoming a doctor. I don’t like blood and guts. When I was in middle school the fumes from the fetal pig we had to dissect made me sick. Basically what I’m trying to say is I am probably not the ideal person to perform this research.

But I did. And I’d do it again without hesitation. It was too unique an opportunity to pass up. In the weeks between agreeing to do this and actually doing it I had to keep telling myself I made the right decision. That I wasn’t going to puke and be embarrassed and look lame.

Finally I realized it didn’t matter if I puked (I didn’t) or looked lame (I may have?) What matters is that I saw an opportunity and I took it even though it was scary. Success wasn’t leaving the lab looking like a pro surgeon or even selling anyone on the merits of Google Glass (verdict is still out on that one).

Success is seizing the opportunity! Not puking was just a really nice bonus.

If you want to check out the (not particularly interesting and edited only insofar as I removed the talky bits) footage, here it is.

Logging is the Great Mystery of Our Time

Whenever I can’t find something on Google easily it typically comes down to one of two reasons:

  1. I am phrasing my question so wrong that it’s not turning up useful results
  2. No one has ever asked this question before

The first is frustrating but if you’re paying attention to the results you do get and exercise some cleverness you can muddle your way to whatever you’re really after.

The second is the real problem. No one has ever asked this question before? On Google? …ever?! What is more likely is what I’ve been experiencing while trying to learn about logging (in the context of application development). It’s been a perfect storm of:

  • common words with multiple meanings and contexts
  • complicated issue not discussed in a consistent way
  • specific issue within an otherwise active community that is largely ignored or taken for granted

My issue is that I don’t really know exactly what I’m asking for. This old Stackoverflow question/answer got me part of the way there (and that person very graciously updated their answer when I asked a followup question!) The phrase “best practices” lead me to a useful Reddit discussion, which helped me refine my Google fu and brought me to a pretty excellent, but also quite old, Ruby Rouge’s podcast. All of this was over many hours of trial and error which in Internet time is eons.

Spongebob meme: Logging

Why is logging such a difficult thing to research? For one thing it’s not a sexy topic in the development community. Another issue is that although there are about 1000 different ways to handle application logging, it’s not a hotly debated topic so you don’t find tons of forum posts with flame wars raging. Also the type of logging you do varies drastically depending on the size and complexity of your application. Small, simple applications use the Ruby standard library Logger and that’s pretty much that. Big applications built on frameworks like Rails have logging built in so it’s sort of taken for granted. There are tons of logging gems that are “better” but it’s difficult to discern why they are better when you can’t find any definitive steps on “how to log.”

Now that I have a (tenuous) handle on what logging is all about, particularly for small webservice/utilities like I’m creating, I’ve settled on this method:

  • create a “MyLogger” class with a logger object from the standard lib
  • create a class method that writes to the logger object
  • write to the logger object via the class method from wherever you need to within your application

This solutions gives you one, consistently formatted log, that you can write to from anywhere in your application, and doesn’t necessitate instantiating tons of logger objects or including logger methods in all your classes. This solution would probably blow up on a complicated or high load application, but as Time Pease said in the Ruby Rouges podcast above: “do what works until it doesn’t.”


Update 2014-08-28: I wrote even more words about logging in the form of a tutorial. Now that you’re done here, check out All Rubyists Love Logging on SitePoint.

Are You Afraid of the Dark?

I have a deep appreciation for small enhancements that make things better but don’t ruin the original design if they fail. For example, a ratcheting screwdriver, or a book with a built-in bookmark. These tiny enhancements just make you say “Neat!”

Enter SnapPower socket plates.

SnapPower socket cover

Neat!

It’s literally just a socket plate with 3 LEDs in it and a light sensor. That’s it. It does nothing except replace a plug-in night light. It does exactly one thing, really well, without wasting a socket, or wasting space with a bulky pass-through night light. But when the LEDs eventually burn out it will still be a socket plate. The lost enhancement doesn’t detract from the primary function.

You can still drive screws if the ratchet locks up.

You can still read, and mark your place in, a book if the built-in bookmark breaks.

The problem with these minor enhancements and conveniences is we become dependent on them almost immediately and are very upset if they are unavailable. Take software changes; once I got in-browser document previewing I immediately became miffed any time I had to download a document to view it. A bigger problem is when your view of something’s primary function changes. I no longer think of the SnapPower socket plates as socket plates with lights, they are lights that happen to be attached to socket plates. That means if the enhancement goes away it’s “broken.”

I’m not sure if there is a way around this entitlement attitude. “New” has to become the “new norm” and then the “norm” for progress to continue, but we’d probably all benefit from remembering that cake without icing is still cake.