It’s been in the back of my mind for quite some time now to get back on here the start writing some more. Sadly, I typically psych myself out instead and end up with nothing. Luckily, I guess you can call it luck, I’ve had quite a tumultuous past six months.

New job

Back in October of 2013, I joined Hortonworks. Looking back, it still feels surreal, dreamlike even. Since graduating from RPI in 2010, the thought of joining a Silicon Vally software company, a company in the Mecca of software development, appeared to me as this unattainable goal. With the help of a friend and the support of an amazing lady, I took a leap to what I thought was a far-off platform, something I’d maybe get close to. Maybe something I could try again in a few months for. Turns out: I was wrong. It’s been a few months now, and it’s been a great experience. I’ve the opportunity to met more than a handful of people who I only knew by name, profile picture and open source contributions. All and all, it’s been awesome and I’m glad that I had the encouragement from others to try to follow my dreams.

Half a decade

Speaking of people who give me encouragement, I’ve also had the pleasure to spend the last five years with Laura. After a few years of dating at RPI, we’ve been living together for about three and a half years now. And I wouldn’t want it any other way.

I never really considered that I’d find myself in a committed relationship this early in my life already (I suppose that’s a rather “new” way to consider things given that I’m 25), but I’m here. And I kind of like it. I remember back in college when Laura and I were still learning about each other when we were both “learning” how to get back into a long-term relationship. We both had our quirks, but we worked through those, and boy am I glad we did. I know I don’t tell her enough, although she’d probably give me crap if I told her any more often than I presently do, but I’m not sure what I’d do if I didn’t have Laura around. She’s been amazing over the past six months in more detail than I care to publicly go into, and words don’t do it justice to describe how happy I am that she’s in my life.

Never discard anyone who is willing to deal with more tough times to help you follow your dreams. Hold on to that person and don’t let them go.

Death scare

I’ve already said that I’m 25, but I had quite a scare recently that I never expected to have. In short, I had a doctor in the emergency room tell me, “You’re lucky that you came in here today. You saved your own life.” That statement took a few days to sink in (about the duration of my hospital stay), but I am also one that deals with things by, well, not dealing with them. Sitting in the ER, I don’t think I’ve ever had such a high percentage of puns/jokes for total things I said.

After about three or four days of dealing with tremendous leg pain (I had trouble putting any amount of weight on my one leg for that period), I dragged (only half-kidding) over to an urgent care establishment close by where I live. Now, the emergency room doctor told me that I saved my life, but I tend to think that the doctor who saw me there is actually the one who saved my life, as he’s the one who still told me to go up to the hospital and get checked to see if I had a blood clot in my leg, despite having “none” of the risk factors.

Up the road to the hospital I went. After getting sent around the hospital a couple of times (thanks, receptionist), I finally got myself admitted and the ultrasound was administered. Sure enough, the nice lady scanning my leg got a super-serious look on her face and repeatedly told me “I’m really glad you came here”, “I’m really glad you’re here”; that was just the start of it.

Just like that, I was diagnosed with a deep venous thrombosis (DVT), or, in layman’s terms, a blood clot in my leg. To the emergency room waiting area I went. After a few hours in a wheelchair (as I was told that I wasn’t allowed to walk anymore), I was taken back for a CT scan of my chest to make sure that I didn’t have a piece of that clot also in my chest. This, is where things got scary.

About an hour or two after the CT scan, laying on a bed in the emergency room, the doctor came in and delivered me that wonderful news that I had a pulmonary embolism (PE), or, again in layman’s terms, a blood clot in my lungs. For those who might not know it: this is bad. Very bad. Lots of really bad things can happen to the patient if that clot decides to move closer to your heart. Bad things that could have easily put me under the knife that day. Luckily, I had somebody watching over me that day, and the rest of that week, and didn’t have to do any of that.

Fast-forward three days through a bunch of intra-venous fluids and medicines, lots of blood samples, and lots of crappy television, I was released back home, still with leg pain, but also with ample thinned blood and a healthy heart. While the jury is still out on why I developed this clot(s) in the first place, I find myself very lucky how this all fell into place in the end.

And finally, a public service announcement: if you ever find yourself in a situation where you have intense leg pain, especially when you put weight on it, go see a doctor immediately. Do not mess around with this stuff. Sitting in a desk chair for the better part of my day probably didn’t help my situation, but it’s usually not sufficient to cause a blood clot to form, so don’t worry too much my programmer friends.

Scaling Pinterest - From 0 to 10s of Billions of Page Views a Month in Two Years another day, another blog post linked by HackerNews.

There are lots of interesting points raised that I think hold a lot of merit. Some, that I’ve trying to better myself about recently which is why this one hit home.

  • When you push something to the limit all these technologies fail in their own special way.
  • Architecture is doing the right thing when growth can be handled by adding more of the same stuff.

It’s funny how simple those two statements are yet how difficult they can be to follow. Developing on and for Apache Accumulo, I will attest that the fewer moving pieces in any application, the easier it is to get to the bottom of the question “why is this slow??”

But, the most important point to me is this:

  • It will fail. Keep it simple.

I’ve been trying hard lately to not get so caught up in the ever-present concern of is this the most optimal solution. It’s easy to sit on a problem, no matter how trivial, and just spin your wheels on it for 2x, 3x, 5x longer than you should. Some would say it’s a deficiency in Java developers (StatelessServerSessionManager and other absurd classnames) but, given TIMTOWTDI from Perl, I don’t think the argument holds much weight. I degress.

My personal goal as of late is just as simple as those 6 words. When you have a problem, think about it enough to make sure you understand the problem, and just do it! Now, I’m not advocating rushing into a problem as that’s going to cause you to shoehorn yourself into a situation where you’re constantly working around terrible initial assumptions, interfaces, etc (no, of course I’ve never done this myself… many times…). Trying to apply it, think of things this way: you can classify reasons you write software into one of two really generic buckets:

  • You want to create something new
  • You want to make something that was created better

Say you’re writing something new. A calendar. You design some data storage plan, a rudimentary API, and a grid-layout for show calendar events. Cool. You get 70-80% through implementing the API and then you realize; wait. What is more than one person uses this and they’re in different timezones?? Rewind, add in locale information. Keep going. Stop. It would be really nice to build in some native notification hooks. Desktop notifications? Email support? A sweet AJAX-y service that you could auto-embedded in your browser as you navigate and load in via Greasemonkey? Point being, you quickly find yourself completely overwhelmed with “things you have to do” and, ultimately, never ship a damn thing.

I’ll save you the excess of me writing another contrived example, but the same logic trap can catch you when trying to fix a problem. It’s more subtle, typically presenting itself via the word “rewrite”, but the end result is the same. If you lose sight of what you meant to create, you and your user end up empty handed.

HackerNews tends to be a bit of a time-waster for me these days, but, every now and again, I come across something that’s a real gem. This time it happened to be a presentation from Zach Holman.

If I only knew this shit in college

I won’t summarize it so as to not bias your opinion and take-away from the source. But, wow. I don’t think I’ve read something that has hit so close to home in a while.

I’ve been out of school for almost three years now, and I can hardly believe it. I like to think that I’ve learned quite a bit after leaving college, but I know that in comparison to where I could be, much less where other people my age and younger are, I’ve moved next to nowhere. So yes, I’ve grown, but by how much?

I could hypothesize about such a measurement all day, but I don’t really think that’s the point here: the point is that I recognize this and continue to try to achieve newer and greater results. Growth and happiness is by far what I should be concerned about. “Love what you do and make a modest salary.”

When the time comes to move on to the next company, I hope I have the time, resources and ability (probably luck too) to find a company that chooses me for what I’ve done where I can focus on creating something new that’s amazing.

Goodbye Django, Hello Jekyll


A little backstory, I first made this little site when I migrated off old physical hardware I had (at my parent’s house I believe it was?) and instead bought a Linode. At the time, I had done more in Python than Ruby and was tired of PHP, so I figured I’d use Django to just roll my own little site. Partially from an engineering/learning standpoint, and the rest coming from a “I don’t to deal with Wordpress’ issues” standpoint.

I ended up deciding to try out Jekyll. I had used it once of twice via Github Pages, but hadn’t really thought about the possibilities of using it personally. When I took a moment to think about it, the thought of having a nice templated system in which to create static content in a very memory constrained system, Jekyll really was a no brainer. I aligns very well with the functionality I wanted and how I use it.

I will note that the category functionality is a little wacky. Jekyll has a bunch of nice built-in features such as pagination, but in searching around, I found that the community was very big into making plugins. I can appreciate a clean functional base, but there seemed to be some very basic problems that weren’t solved outside of the plugin realm. I will admit that I could just be missing something from a documentation standpoint, but you could also argue lack of good documentation too.

Anyways, same blog, much smaller footprint, (mostly) happier Josh.

When I started dabbling in running a web server a few years ago, I found out rather quickly that when you run a server, you *will* have "people" trying to SSH into it that you shouldn't be. Now whether these are botnets or active hackers, I don't know nor really care (if someone really wants to hack me, I probably don't have the knowledge to really stop them. I prefer to focus on catching 99.9% of low-hanging-fruit hackers).

The solution I have is to use Fail2ban which monitors the system log for failed SSH attempts and will automatically lock out these IP addresses (using iptables) for a configurable amount of time. After a host gets locked out, I get an email letting me know the IP and the result of a WHOIS lookup.

So, I have all these fun IP addresses and registered addresses of "people" I don't like. So what did I do? I counted them all up, and threw their information on a map that I can look at!

I wrote a C++ application that uses Qt to parse the data, get the lat-long for the address via GoogleMap's service, and count up the number of times I've seen that IP address overall.

<a href=http://localhost:4000/images/spammap-loaded-data.png">SpamMap Loaded Data

The list of IP addresses and counts are both sortable. Choosing a row will load that data into the map on the right side.

SpamMap Chosen Data

There were a couple of reasons I had for doing this. Primarily, I wanted a way to get back into C++ again (it's been quite a while). After attending Qt Developer Days in November 2010, I needed to actually stretch my desktop application developer legs (aside: I don't need to do that again anytime soon). The other motive is that after getting all of these emails about failed SSH attempts, I was rather curious to see what the primary geographic location where these attempts originate from.

As a note, this is most definitely far from any sort of production. I can't say I really cared enough to take the time to figure out how to do everything I wanted to do in Qt (sorry :(, Qt). So, fair warning, it is what it is.

Finally, I have a project page set up that you can view at https://projects.penguinsinabox.com/projects/spammap.

Enjoy!