(Aug '19) CSS-Only Chat

So, it turns out that css background-images don't get loaded until the relevant selector is triggered.

Many people might say "neat!"

I used it to build a bi-directional CSS-only async chat.

Read More

(Aug '18) Totes-not-amazon.com: Markov Chain Generation for AWS Announcements

I challenge you to reliably tell the difference between AWS and Totes-not-amazon.

Read More

(Jun '18) Scarr: S3 + Cloudfront + ACM + Route53

There are a bunch of free/cheap options for hosting static sites (just html/css/js) out there: github pages, netlify, firebase hosting - but when I want to build a bulletproof static site "for real", my go-to toolset is S3 for hosting with Cloudfront caching in front of it.

My workflow for that usually looks like:

Read More

(Mar '18) Building a url-shortener with Lambda — JUST Lambda

Some people, when confronted with a problem, think "I know, I'll use AWS Lambda." Now they have thousands of concurrent problems.

If you want to know how to build a sanely-architected url-shortener using AWS Lambda on top of a datastore like Postgres, this is not the post for you. We're going to build a Rube-Goldberg url-shortener using just Lambda.

Read More

(Jul '17) Disguising Ruby as Javascript

Because my parents didn't raise me right, I decided to take another crack at making valid ruby that is indistinguishable from javascript.

Update: This post became a talk at RubyConf 2018.

Read More

(May '17) Twitter + Ffmpeg

Want to upload audio to twitter? You can't. You'd have to upload it to soundcloud, then post that link to twitter. Some clients will give you a nice in-app soundcloud player and some won't.

You can upload video to twitter, though.

Read More

(Jan '17) Catcher's Mitt- A Simple Tool To Print Http Requests

The other day I released Mitt, a simple tool that listens for http connections on a specified port and prints out requests to stdout.

Read More

(Dec '16) Bulk Upload Mailgun Suppressions CSV

This is just another one of those posts summarizing some time I wasted so hopefully someone else won't waste theirs.

If you have a big list of suppressions (emails of users who unsubscribed, marked you as spam, etc) from another email provider (eg Sendgrid) and want to import them into Mailgun, there's no easy way to do it. The web UI doesn't seem to have a way and their SDKs don't support it yet.

Their API, however, does. Here's a little ruby script that will read a sendgrid csv and upload all the emails to mailgun as suppressions (in this case "complaints", which are the equivalent of sendgrid's "spam" list emails).

Read More

(Aug '16) How to use time

How much work should you do? If you manage a team, how much work should each of your direct reports do?

It's a simple question, but how you answer it can have a profound impact on your company and culture.

Read More

(May '16) Making Ruby Look Like Javascript

Yeah, yeah, but your scientists were so preoccupied with whether or not they could that they didn't stop to think if they should. - Dr. Ian Malcolm, Jurassic park

Inspired by this tweet, I was wondering tonight to what degree I could make ruby look like other languages. Please don't anyone ever actually do this.

Read More

(Jul '15) Down With Craftsmanship

The appeal to "craftsmanship" is a blight on software engineering decision-making.

Maybe you've been through a technical debate like this:

Read More

(May '15) Wallopics Is Dead


Wallopics.com is broken. Imgur decided to start blocking it. It won't be coming back. If you still want to use it, you can download this html file and open it in a browser.

Read More

(Feb '15) I'd like To Hate on Sports Fans

I’d like to rag on sports fans for their ridiculous tribalism, but then I realize that half my clothing is just one organization or another that I’d like to associate with, and that I feel a sense of camaraderie with those who share those preferences.

Read More

(Sep '14) Load useful data in the rails console

The basics

I spend plenty of time in the rails console in my local dev environment, and I often find myself in need of dummy data or specific objects set up to mess around with. For example, the user I test most things with is KevinKuchta, so I might run kevin = User.find_by_username('KevinKuchta'). It's like 40 characters long, but I type it often enough that I'd love to optimize it (and similar bits of code).

Read More

(Aug '14) Fishy Code: In Which I Lose My Mind

An Unexpected Journey

Localhost? Why the hell is it accessing localhost?

Those words ran through my head while I peered at a pile of compressed javascript. It was in a js file being loaded from a remove server- someservice.com/api.js. It was part of a connection speed test api I was using on a weekend project.

Read More

(Jul '13) Why Startups

When you work for a large company, you work for yourself.

You work hard because you're incentivized to do so: you're given raises if you do and fired if you don't. You're motivated almost entirely by the incentives the company provides you with. Because a lot of people at the company are the same way, at least a few of them will follow those incentives to the letter, benefiting themselves to the detriment of the company.

Read More

(Jul '13) Why I'm Leaving

Last Friday I tendered my resignation at Expensify, the startup I've been working at for the last 2 years. The following Tuesday (by mutual decision) was my last day.

Before I made the decision to start looking at other companies, I wrote a short essay to myself outlining the reasons. Since several people have asked, here follows a cleaned-up version of that essay.

Read More

(May '13) Chrome is too smart for its own good

Run the following into the chrome console:

    var foo = 3;

Read More

(Apr '13) Ember.js @each@each workaround


This is just a simple workaround post for future references. For more in-depth reading, read up on Ember's object model.

Read More

(Jan '12) Basic Authentication With Jsonp

Note: I use github's api as an example here because, at the time of writing, it supported both jsonp and basic authentication. That is no longer the case, though, so these examples probably won't work as-is. As far as I'm aware, though, the technique is still sound.

Read More

(Aug '11) Mac shell script to toggle socks proxy


A simple script that'll toggle your System Preferences proxy settings on a Mac. It takes one argument- the name of the interface on which to toggle the proxy (eg, 'Airport' or 'Ethernet'). You can easily wrap this with an automator script using the "Get specified text" action to provide the argument and the 'Shell Script' action to run the script.

Read More

(Aug '11) Matching PHP and JS Encryption


You'd think that encryption is in encryption- AES is AES, DES is DES, etc. Encrypt with scheme X, decrypt with scheme X, and it comes out clean. Turns out, though, that it's not that easy. Or rather, it is, but the relevant libraries on different platforms like to do things different. Consider that to encrypt/decrypt something with AES you need:

Read More

(Apr '11) Converting state-plane coordinates in ruby

I got a pile of data with coordinates last night. The coordinates were in State Plane NY West format, which is a semi-state specific coordinate system that needs to be translated before you can use it like latitude/longitude. There are better references out there if you want a thorough treatise on the subject, but I thought I'd give the concrete solutions I came up with in case you, like me, just want to get lat/lon and could hardly care less about 80's era cartography.

Read More

(Feb '11) Facebook iFrame Authorization

So, it turns out that any facebook page, when loaded in an iframe, will explode. That is, it'll display the facebook logo and nothing else. It'd say it's an anti-clickjacking measure, if I had to guess.

Read More

(Feb '11) Senior Project

What is it?

"Senior Project" is the capstone class in the RIT Software Engineering program. It's a 6-month project on a team of 4-5 SEs working for an external client on a real problem. In my case, I'm working with 4 other seniors (Chris Tosswill, Matt Olenik, Bernard Stern, and Pete Bergeron; our sponsor is Eastman Kodak.

Read More

(Dec '10) How to analyze global functions from a chrome content script

So, it turns out that the code run in chrome content scripts run in their own context. As such, I can't access global variables set by in-page code. However, chrome content scripts do use the same DOM. Further, when <script> elements are inserted into the DOM dynamically, they're run using the page's context, and can access those global variables/functions.

Read More

(Oct '10) Engineer'd

I'm sick of Facebook's liking system. I can see their idea, but it's become complete crap. 99% of "likes" that show up in my feed are either thoroughly inane our outright malicious (seriously, I never thought I'd see this much clickjacking in the wild).

Read More

(Jul '10) Wrttnin Quine

Because I got bored and my javascript is rusty, I put together what I'm calling a Wrttn.in quine.

Read More

(Jun '10) Cheap Tricks

I heard a fun statistic today: the average software development turnover rate is 20% annually. The Bureau of Labor Statistics says 33% for all departures in IT, and 15% for quits. Let's say it's 20%- that's a whole new company every 5 years (not really, of course, but it's still a significant chunk of your company gone in that period). How can any company achieve consistent results when more than half their company is swapped out every 3 years? Predictable budgets and schedules become hella-difficult, not even to mention the cost of training new employees and the lost production while that's happening.

Read More

(Apr '10) Fulstack, empty coffee cup

I recently undertook participation in RIT48 with my good friends Chris 'Cap' Tosswill (a fellow software engineer) and Meghan Manders (a designer). RIT48 is a competition to create a web business in 48 hours, with mixed emphasis on business plan and implementation. Our team got a working prototype of our product (FulStack.com) up and running, and we won second place (+ $400)!

Read More

(Feb '10) No Comment

Much like throwing a kitten into a pit of rottweilers, there are a few questions you can throw into any group of developers that'll have them at each other's throats in moments. One fun one I discovered recently was:

Read More

(Feb '10) Autotune the Project

Hell is shiny objects

I don't know about you, but I often suffer from a lack of motivation on personal projects. Usually it goes something like this:

  1. Be sitting at my computer and thing "Hey, I've got a half hour; I could try to fix that bug in the FPA event model."

Read More

(Jan '10) Modern Font Embedding or How I learned to hate IE all over again

Note: This post is so out of date as to be useless. Ignore it!

Read More

(Jan '10) Why not roll my own?

Writing a blog engine is a right of passage for young developers.

Read More

(Dec '09) Kevin Kuchta's Blog

"A man's domain is his castle"

Read More