One of the coolest things about working at a tiny startup is getting to make foundational technical decisions and seeing how they play out. A couple years in startup time is as long as a life-age of the earth like a decade in normal business time. It lets you get feedback on how those decisions worked out as the company + team scale.
I was the first eng hire at Daybreak Health. 3 years later I was managing a team of 8 in a 70-person company. Here are the decisions I’m glad of and here are the ones I regret.
How do you build software that will last more than a decade with no maintenance?
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.
I challenge you to reliably tell the difference between AWS and Totes-not-amazon.
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.
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.
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.
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.
The other day I released Mitt, a simple tool that listens for http connections on a specified port and prints out requests to stdout.
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).
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.
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.
The appeal to “craftsmanship” is a blight on software engineering decision-making.
Maybe you’ve been through a technical debate like this:
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.
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.
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).
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.
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.
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.
Run the following into the chrome console:
(function(){
var foo = 3;
(function(){
debugger
})();
})();
This is just a simple workaround post for future references. For more in-depth reading, read up on Ember’s object model.
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.
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.
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:
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.
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.
“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.
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.
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).
Because I got bored and my javascript is rusty, I put together what I’m calling a Wrttn.in quine.
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.
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)!
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:
###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:
** Note: This post is so out of date as to be useless. Ignore it! **
"A man's domain is his castle"