I’ve spent a lot of time biking in SF and there’s been a few intersections where clearly the traffic engineer responsible went to town with a crazy design. This is my personal top 5, a “worst of” list of sorts. #5: SF Bike Coalition at Market & Valencia Tons of bike commuters ride everyday by the SF Bike Coalition offices. Most of them keep straight but a few of them have to turn left to get to…
In his 1984 Turing Award lecture , Ken Thompson inserted a backdoor into the C compiler that was undetectable. I was re-reading the paper recently and that got me wondering – how hard would it be to backdoor an open source model? To test that out, I decided to try to make a code model that would: mispell pip install requests as pip install reuqests (note the typo) only mispell the package on…
A few years back (4 years already!) I built Infinity Pools , an extension to block the constantly refreshing feeds from Facebook and Twitter. Unfortunately, after a few months, both websites changed how they refresh their feeds and the extension broke. A couple weeks ago, I decided to take another stab at it. I’ve always felt it made more sense to block websites after a certain amount of time, so…
Writing a job post feels like pulling teeth, which is why most job posts end up reading like an ambitious mission statement ( “We want to disrupt the pizza delivery market!” ) followed by laundry list of requirements ( Python! Javascript! Mongo! AWS! ). Luckily, there’s a better way to do this – and once you know the proper structure it will be a lot easier, too! It will help you attract…
The other day I randomly came across one of Larry Wall’s keynotes, Perl, the first postmodern language . It’s a fascinating read and really articulates what makes scripting languages different from other languages. I remember when I started using Python, after years of using C. It felt like I finally found a tool that fit my hand. Why that? Besides convenience reasons 1 , I think the main reason…
Every social media website, from the big ones to the smaller ones (i.e: Pocket) have some sort of infinite feed that you can keep scrolling, basically forever. One of my 2018 resolutions is to spend a bit less time inside these “infinite pools”. Of course, I used this resolution as an excuse to play with the extension APIs for Chrome, Safari and Firefox, and ended up building an extension to hide…
My biggest shock when moving to San Francisco was seeing the heartbreaking number of people living in the streets. I have the feeling that in the last few years, things have been getting worse. There are more people on the street, more tent campments and more drug use. I just learnt through this very cool article about the city of San Francisco’s open data initiative , so I decided to check if my…
Palantir is well known for its grueling interview process. It’s pretty common for new applicants to go through a dozen(!) interviews. 1 I don’t think anyone made a conscious decision to have things this way – nobody called a Monday morning meeting to make their hiring process horrible. Instead, they probably started with a sensible interview process 2 , which slowly evolved over time. I have an…
The other day I stumbled upon a fascinating sub-subculture – people making and wearing parody shirts of popular brands. It’s fascinating to see people trying to make brand logos their own. For example, Patagucci was a short-lived brand based that sold Patagonia-inspired clothing: They unfortunately had to shutdown after receiving a Cease and Desist from Patagonia, but this doesn’t seem to have…
A couple months ago I started noticing that my habit of checking reddit in small moments of downtime – like while waiting for a build – was pretty disruptive. It’s hard to get back to work after having been distracted by random stories of startup glory and drama. It turns out a lot of people have this exact same problem, and there’s a small cottage industry of apps for that. I don’t like…
There’s an interesting post about rate-limiting making the rounds on social media. Reading it reminded me of the day where we got involuntarily DDoSed by Google. If you have a Gmail account, the Nylas API uses the Google Calendar API to sync your calendars and events. The Google calendar API is really well thought-out, and has one awesome feature: webhooks. The API lets you programatically…
There’s a lot of blog posts about scaling distributed systems to hundreds of thousands users, but not many are about the basics mistakes you’ll make when trying to build one. In this post, I’ll share three things I wish I had learned in college (instead of the hard way 😁!). 1. Limits are everything I learned this pretty quickly: you can not expect an external service to always work. Even big…
I work at Nylas as an engineer on the API team. We’re still pretty small, so engineers in my team also have to handle customer support duties. It’s great for customers because they get to talk directly to the person who wrote the API they’re using 1 . With 2015 coming to an end, I decided to recap the most important things I learned about customer support. 1. Customer support is about people (I…
Ah the life of the beginning freelancer. Landing contracts. Writing code. Arguing with cheap clients. Looking for contracts (actually spending an awful lot of time on the latter). Workshop is a service which sends you ten high-quality leads every day. They’ve got an awesome sales pitch which resonated deeply with me 1 . Let’s see what makes it so good. Aside: telling people what you’re about…
Let’s try something a little different. I’ve always loved picking apart great sales pages to see what makes them tick. Snappy is a customer support webapp which targets small to medium-sized companies. They have a great sales page which uses customer quotes really well. Introduction This is the first thing you see about snappy. The design is quite minimalist, but there are links to all the…
This tip courtesy of my colleague Dwayne Litzenberger . Vagrant is a great tool. My only gripe with it is that it forces everyone to share the same vm settings, which can be painful, especially when you have a slow computer. It seems there’s a ~/.vagrant.d directory for specifying overrides but it’s run before Vagrantfile , which makes it useless to override variables defined in Vagrantfile .…
Ever since I went back to Javascript, I’ve been missing C#’s async/await system. With C# you can mark some methods async . Afterwards, you can call them “synchronously” using the await keyword. Behind the scenes, the compiler rewrites the code to use callbacks. For example, C# lets you write something like this: var status = await $ . get ( " /login " ); // await returns a status object. if (…
I’m using Jekyll to generate this blog. It’s pretty cool once you get the hang of it. Yesterday I had a problem stackoverflow couldn’t solve: I wanted to filter my blog posts to keep only the ones who weren’t categorized. I had to write a really simple plugin to do this. Here it is: module Jekyll module UncategorizedFilter # Returns back all categories related to a primary category # e.g. "blog"…
I spent most of last week working on implementing auth. I knew it’d be painful, but I didn’t thought it’d be that painful. There’s so much implementation details to know about, I’m not even sure I’ve designed something secure even after spending hours on it. This post is a way to clarify my thoughts on authentication. Sorry if it’s a little dense and hard to follow! Traditional auth Do you…
I haven’t written a status report for a long long time. I got stuck with a DNS bug which took a while to resolve and I got sidetracked by other projects. Things are getting better though: I’ve resolved this DNS bug and I’m halfway through adding multi-user support. The DNS bug DNS is complex, and my ISP having some pretty aggressive caching made solving this bug a lesson in patience. The problem…
Call me weird but I’ve always loved reading longform sales pages. Lately I’ve been reading through some programming ebooks sales pages and I’ve noticed a pattern again and again: every one of them is extremely short . For example, here’s how Working with unix processes sells itself 1 . Of course the subject is deeply technical, but I’m sure people would have benefited from a little more…
A friend of mine always talks about leaving his cushy job at $BIGCORP to go work fulltime on his indie game venture. I don’t think it’s a good idea, and I’ll try to show why in my trademark hand-wavy way. When there’s a lot of demand for a product, concurrents move-in to try to capture some of the market. If the products are very similar — economists say “undifferentiated” — there will be a…
For the longest time, I’ve wondered if Humble Bundles and Steam sales were hurting or helping the video games industry. There’s not a lot of data about this on the Internet but some indie gamemakers were kind enough to share some numbers on their blogs. Jason Rohrer, explained in a post why he was refusing to participate in Steam Sales. He also gave a couple figures and graphs about his sales. The…
My uncle is a teacher. When I was a kid, he would often slip into “teacher mode” even not in a school setting. Not only would he lecture us (which I’m glad he did), but he would also try to discipline us as if we were a classroom. Having to write a memoir during your holidays is not fun. This is to say we often forget how much stuff we unconsciously pick up from work. This week Github released a…
I spent the past afternoon wrestling with fabric, Apache, Virtualenv and PostgreSQL. I was going to write a long post about how Unix is old, creaky and mostly designed to be used with a text editor, when I heard about Augeas . Augeas is a tool to modify UNIX config files from the commandline. It’s used by a lot of projects, notably Puppet. This is how you add an entry in /etc/hosts with augeas:…
I’m learning rails at the moment. Coming from python, the ruby community seems markedly different. One thing doesn’t change, though: package managers suck. I was so confused by rbenv, rvm, bundler and gems that I thought it’d be safer to install it in a virtual machine. Since it didn’t want to waste my time poking in the dark, I wrote a small tool to do this: vagrant-rails . It’s a set of shell…
I’m just noting this in case I forget. You should left-align text most of the time. For those who don’t know, justifying text means inserting spaces between words to fill the whole column. For example, this is some left-aligned text: Well, the way they make shows is, they make one show. That show's called a pilot. Then they show that show to the people who make shows, and on the strength of that…
Just a quick thought. RSS is very obviously in a bad shape. Mailing lists on the other hand are as good as ever. There’s two reasons for this: RSS got its lunch eaten by alternatives who offered more (Facebook/Twitter/Reddit). Why waste time checking your RSS reader when you’ve already most of it on twitter? Second, mailing lists are set and forget. You’ve only got to check your inbox from time to…
I recently discovered the practice of price anchoring, which is based on a cognitive bias we all have called… anchoring . Put simply, when presented with choices, our brains have a natural tendency to take a decision based on the first choice we’ve seen. Anchoring is why for instance 37signals chose this design: Over this older one: On the older design, the eye is attracted to the “Plus Plan”,…
I just realized that my last status report was exactly one month ago. Well, so much for having semi-regular status reports… Anyway! Last month was an exciting one. I’m really close to releasing Kite v0.2! The most important features are: easy deployment. Deploying a fully-featured mail server is litterally one command away Emails are now grouped by thread. Partial multiple user support. There’s no…
I get a lot of emails asking about my progress on kite , so from now on I’ll regularly share a quick status report. I spent the last four weeks working on backend stuff, in particular: Adding dovecot to the puppet recipe Rewriting the postfix config Setting up supervisor to monitor kite’s various daemons Creating a thread indexing daemon Adding dovecot to the puppet recipe I’ve had a lot of…
I recently tried redshift , a program to adjust the screen temperature (the proportion of red and blues) according to the hour of the day. However, I was bitten by a small bug on the old version of Ubuntu I was using : Redshift would fail to start and complain that it couldn’t find my location. Thankfully, it’s possible to pass redshift the latitude and longitude directly : redshift -l 33:-96 You…
I’m working on a couple django apps which use separate virtualenvs and I very often have to source the virtualenv activation script. It got so tedious that I had to write a small script to automate the finding of the activation script. The following python script, named “findact”, searches in the recursively for a file named “activate”. If it is not found, it starts again from the parent…
Last week I had to add support for i18n to a django application. Everything went swiftly, except for one thing : I needed to output a translated JSON structure in my HTML and doing this simple with json.dumps triggered a TypeError exception, with the message : “<django.utils.functional.__proxy__ object at 0x987a86c> is not JSON serializable”. The solution to this problem is to define a custom…
I’ve recently started to use the excellent Zurb Foundation CSS framework, and I like it a lot. There’s one problem though: like most grid frameworks, it expects you to use non-semantic class names in your HTML to specify the placement of the elements. <div class="row"> <div class="two columns" id="navbar"> </div> <div class="ten columns" id="content"> </div> </div> Thankfully, if you use Sass,…
I recently had to implement a django filter. My problem was that I had an event page similar to the github feed. I wanted to format a date diferently whether the event occured in the current week or at another date. Instead of doing it in code or in the template (bad), I decided to write a filter for that. Directory structure Django expects to find the filters and template tag for an application…