This is the blog, but if you want to know more about me and my projects, check out the Projects and About pages.

The Story of Egg.js

image

If you know me, read this site or Punching Kitty, or even just follow me on Twitter, it won’t surprise you that I like to put an easter egg in everything I make. (Example: Type the konami code right now.) APIs or command line programs aren’t always the best easter egg medium, but website are fertile ground and about two months ago I got tired of pasting the same basic easter egg code in all of my websites and thought about making a quick library to add easter eggs and tracking (you’ve got to know if people have figured them out!). Egg.js was born. I threw some simple javascript code together and pushed it up to GitHub…and then it needed a peer review (I practice what a preach) and sent it over to my friend Rob who is the best Javascript dev I know and he made some great suggestions / rewrote it. In the end, it works well and has a nice simple interface to get out the way and let you focus on the joke and not all of the setup.

A few days later, I was sitting at the Clojure/West conference, in between sessions, and said to Rob: “I wonder if I should submit this to Hacker News. It feels like one of those silly things that always take off and hit the homepage.”

image

I told you!

Yes, I was 100% right, but it was actually far more popular than I thought and, shockingly, the Hacker News comments were pretty nice. All of a sudden, Egg.js was one of the trending Javascript repos, sitting with the likes of React JS and React Native!

image

A few days later it raced past 1000 stars on GitHub and it’s still growing. Crazy. I guess people like silly web jokes.

You can check out the details at thatmikeflynn.com/egg.js.

Syncing Your Mac Photos Library to Google Photos

image

I’m in the midst of recovering from Google IO but wanted to play with getting my Photos (aka New iPhoto) library from my Mac to the new Google Photos. Google supplies a Mac client for auto-importing but it will only watch a directory for new files and has no explicit import from Photos / iPhoto function. You could drag your folders from Photos to a different folder and have those sync to Google (and then delete them after) but that’s a terrible solution.

Here’s a better solution:

  1. You’ll need to open the terminal application (don’t be scared).

  2. Run the following command:

ln -s "/Users/`whoami`/Pictures/Photos Library.photoslibrary/Masters/" "/Users/`whoami`/Pictures/Photos Masters"
  1. You’ll then see a directory called “Photos Masters” in your Pictures directory.

  2. Go to the settings for your Google Photos importer (click on the status bar icon and click “Preferences”)

  3. Add to the “Desktop folders” list by clicking “Add…” and selecting the new Photos Masters directory.

After that you’ll see your Google Photos importer start sucking in all of your photos! It’s going to take a while.

My Current Interests (May 2015)

I’d like to start listing the stuff I’m playing with these days as a way to look back and as a way to track my progress (or lack there of).

Currently working on / playing with / reading about…

Soldering

My family went to Maker Faire and my daughter was really into it. All she could talk about was robots and how she wanted to make her own robot friend. We settled on a marshmallow shooter project for now (she’s only 2.75) but I need to step up my robot making skills while she levels up to the point where we can make a robot together.

3D Printing

My Solidoodle Press has been out of commission for a little while and I’ve been too busy to really dive in, but I’ve got a new RMA’d version sitting in my home office and I’m itching to get back in to all that is 3D printing.

Quadcopters

Another hobby had to cast aside for a while that I’m looking to get back in to. I have a Hubsan H107D that I’d like to keep practicing FPV (first person view) flight in the hopes of putting the two above interests together to make my own quadcopter.

Card Tricks

I used to be pretty interested in magic when I was in middle and high school, but I’d like to get back in to it and learning it the right way. I luckily have access to a very skilled magician so I have the right books in hand, I just need to read them and get practicing!

Database and Big Data Tech

Getting a deeper understanding of the lower-level workings of databases, particularly big data is a new interest after talking to the founder of Pachyderm recently. They are being very gracious in answering my questions while living the life of crazy busy start up founders.

ScreenShop Demo at 500 Startups WMD 2015

image

The folks at Comedy Hack Day reached out and asked Dan, Toby and myself to get the band back together to do the ScreenShop demo for the 500 Startups conference: “Weapons of Mass Distribution”. Unfortunately Toby was in New York and couldn’t make it, but fortunately I got all his lines!

Here’s the video embedded below and you should watch the whole thing, but if you want to jump to our demo you can click right here!

The performance went well, with none of the technical issues from the first big demo, and thanks Craig and Brian @ Cultivated Wit, to the crowd at WMD and to 500 Startups for inviting us!

Life as a Gopher

image

It seems like discussions about Go (or Golang), Google’s new-ish, C-like, programming language, are everywhere these days. I’ve been using Go in my free time to work on little projects for the last few months and thought it was time to jot down a few thoughts on the language.

Background

I find in articles like this even a short amount of background helps color the views. For example I recently read an article where someone was saying how he showed his team of Java developers Clojure and they quickly said they didn’t like it. Well…did a bunch of OOP devs not know how to read lisp and had neither the time or inclination to learn? That might be your problem. Here’s my background: I run a dev team that is all Clojure on the backend and all Javascript (Node.js and ReactJS) on the front (and middleware) side. I used to code in PHP all the live-long day when I worked at Answers.com, and I’ve experimented with the usual suspects like Java (I made an Android app), Ruby, ObjectiveC…and now Go!

Why Go?

When I tell people why I’m so excited about Go these days I start with a seemingly odd comment: I love Clojure. I was the Sr. Architect and led the team that brought Clojure to Answers.com and when I left and came to Collective Digital Studio I brought Clojure with me and all our brand new backend technology was written in Clojure. It’s a language with a strong philosophy, it has great concurrency sugar, and it’s fast…for long-running services. Clojure isn’t fast for small scripts, not because of Clojure, but because it runs on the JVM (don’t forget to install Java!) and you have to start that up and load in all the Clojure libraries and then your code runs. That’s no good for a lot of the scripts I was having to write as a CTO who does most of his coding in short bursts in and effort to block random tasks from hitting his team. I’m writing CLI scripts, or small web servers or apps that need to be run other places that may or may not already have Java running. This issue is when I started looking and quickly found Go. In fact, Go was actually the first place I looked because it shares a lot with Clojure. Go is also a functional language with a very strong opinions but look no further than Clojure’s core.async and it’s “go blocks” for another key similarity. Where it differs from Clojure is the fact that it compiles to a native executable making it great for my #1 use case (it also differs in that it’s far far far more verbose but we’ll get to that later).

It’s similarity to Clojure is why I started learning about Go, but the breath of amazing projects written in Go kept me there because…well…look at all this cool stuff! IPFS, Pachyderm, Cayley, and a lot more

What’s Great?

I’ve already mentioned a lot of the high-level aspects of Go that I like: functional, fast, and easy concurrency, but there’s a bunch of small things that I think are really great too that I should mention. Being someone who writes both code and words frequently, I’m a huge fan of bullet points! This feels like a spot for that:

  • go fmt - I love that there is no need to argue about where your brackets go, or when or when not to use spaces, etc. I have a Sublime Text plugin that runs this for me on save and I put it in all of my Makefiles.
  • go get - It has a lot of issues for libraries (see below) but when you just want to pull down a quick Go app and run it nothing is faster than go get ...
  • go-binddata - A Go library that will generate code to merge static files in to your Go binary. I used this on my Quackerjack project to fold in the basic web ui file in to the binary for easy distribution and it worked wonderfully. – github.com/jteeuwen/go-bindata
  • Go’s project format. - This one took me longer to figure out than I would have liked, but once I found out that all .go files in an project directory are simply just concatenated together and you don’t have to worry about manually including them, I found it to be pretty great. If you want to group a few files together, then make a sub-project and use go get. Easy.
  • flag - A great CLI param processing library.
  • “Hacking with Andrew and Brad” - Every language should do videos like these.
  • defer - Being able to defer a command to when a function ends is such a nice feature. Lots of uses for it, but in a simple example just being able to open a file and then immediately tell the function to close it whenever it exists is pretty great.
  • A Bunch of Stuff I Haven’t Explored Yet - go generate, go doc, …? What did I miss?! Tell me!

What’s Not Great?

The best way to find out what’s not great in Go is to swing by Hacker News at any given day. Chances are there will be a discussion or two about what’s wrong with Go, or the Go team, or the Go tooling, or the Gopher, …

That’s not to say these arguments are wrong. I agree with a lot of them:

  1. Holy crap it’s verbose! So many if blocks and lots of repetitive code. Maybe I’m still a bit of a newbie, and maybe it’s worse coming from Clojure, but it feels like I’m typing A LOT to get something to work.
  2. It’s Google’s language, and therefore is really focused on the Google use cases and process.
  3. …and yet it’s not mentioned on this year Google IO schedule?!
  4. I wish there was a repl. There are some attempts at them, but the best option is the Go Playground which is less than ideal but I still use it all the time.
  5. go get is great to pull quick apps down, but ignoring versions is a big big problem. (Check out getgb.io for another take on go get)
  6. Comments should just be comments.

Also…

No one’s given me a plushie Gopher yet…or hell, even a Go sticker! I have Clojure stickers coming out of my ears (parenthesis stickers too) but no Go sticker.

Summary

I like Go. There’s somethings I don’t like about Go, but even on those issues I do like the amount of discussion they are getting so I’m hopeful. I’ve also made some pretty cool stuff with Go in a very short amount of time and I’m noticing the same from a lot of other developers and that says a lot. If I started a brand new tech stack at a new company today would I use Go as the base rather than Clojure? No, probably not…but I a few Go services and CLI scripts are a good thing and I know that no matter where I work or what I’m working on in the future there will be plenty of apps that will be powered by Go that that makes knowing Go a power asset to have. In short, it’s a fun language that makes sense to know business wise and that’s about as good as a language gets.

mikeflynn @ GitHub thatmikeflynn @ Twitter