Over the last couple months we’ve been busy tying up loose ends and preparing for our first “official” company-wide retreat. Even though we’re a fully distributed team, we’re big believers in the power of meet-ups and face-time. They form bonds, build trust, and create a level of personal understanding that can’t be replicated online.
Our last full company meet-up was over a year and a half ago at DjangoCon US. We celebrated by hosting a party at Portland’s favorite retro-arcade, Ground Kontrol). It was an awesome experience and for some of our team, it was their first time seeing each other in person. As great as it was, we all felt like the conference schedule got in the way of our limited time together.
The Place
We decided our next meet-up would be a full-fledged retreat and for the last year, we’ve been kicking ...
Warning: The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
Now, how many of us check the official pickle documentation (or the official docs for any other module) every time we’re going to use it? Even if we’ve read that warning before, it’s easy to forget it and mistake pickle for any other serialization format (specially when solving a problem for which pickle is just a tool). We might even be using someone ...
Episode #3 of the /dev/loop podcast is live! Pete, Brian, and Yann discuss a/b testing, PaaS (Heroku, GAE, etc.), Django 1.5’s User model, and Firenze.
You can watch the video above, or subscribe to one of our feeds below:
If you’d like to chat with us about any of the topics we covered, we’d love to see you on Freenode IRC in #lincolnloop . You can also tweet @lincolnloop with questions or comments.
A common paradigm in Django is to create different settings files for different environments (local, production, staging, etc.). Everyone has their own opinion on how to set these up (see ours here), that’s not what this post is about. Instead, I’d like to point out the inherent danger in this technique and how to prevent shooting yourself in the foot.
When setting up an environment-specific settings file, each setting should be looked at as an untestable point-of-failure. Have you ever found yourself saying, “...but it worked fine on {staging, my machine, etc.}”? This is a problem of parity and it starts with your settings files. Just because you can change all your settings between environments, it doesn’t mean you should. Use restraint. Make your settings as close as possible between environments and examine every divergence to make sure it is absolutely necessary (inheriting from a common base ...
One perk Lincoln Loop and other companies with remote staff regularly cite is the lack of a commute. Nothing beats taking the Pajama Freeway to your home office. While reviewing my time entries for last year I started to wonder what the real impact to my available time was by not commuting.
Lets look at some numbers. I am American so lets use those statistics.
If you’d like to chat with us about any of the topics we covered, we’d love to see you on Freenode IRC in #lincolnloop . You can also tweet @lincolnloop with questions or comments.
2012 was another amazing year at Lincoln Loop. I’m incredibly proud of the work we accomplished and the growth and development we’ve made as a company. A few of the highlights:
We launched our first product, Ginger. It is a critical to the way we do business at Lincoln Loop, allowing us to have meaningful discussions even when we’re not all online.
We worked with some amazing clients, including Evite, RedBeacon, National Geographic, and GamesRadar.com.
We expanded our skill set into rich JavaScript applications with Backbone.js, server configuration with Chef and Salt, and even some services in Node.js and Go
We sponsored DjangoCon US and became corporate sponsors of the Python Software Foundation
In our last installment, I introduced our distributed workplace and why we prefer it over a traditional office. Over the years, we’ve learned a lot about how to make a distributed workplace, well… work.
The single most important we learned was how to work asynchronously. In other words, we strive to create an environment where people can complete their tasks at any time of day and without waiting on anyone else to do so. This removes timezones (and personal work habits) as a constraint for doing business. Tasks that aren’t asynchronous become road blocks to productivity in the form of, “I can’t do X until Joe does Y.” Here’s a few of the most common road blocks we hit and how we dealt with them:
Asking for permission. This is a killer and we’ve all but eliminated it at Lincoln Loop. We hire trustworthy people ...
Today we’re excited to announce the launch of our premium screencast collection, Learn with Lincoln Loop. Over the years we’ve worked with a wide variety of technologies and techniques. With Learn, we’re making that accumulated knowledge available through high-quality, DRM-free training videos.
We plan to release more videos in the months ahead, covering a variety of topics for web developers. Each video will be about 20 to 30 minutes long, and will include notes and links to related resources.
The first two videos cover Spotting Performance Problems in your Django application and Syncing Backbone.js with Django. Upcoming videos will feature deployment from simple to complex, configuration management, Django project structure, and more.
We’d love to hear your feedback or ideas about Learn. Join us in #lincolnloop on Freenode, send a tweet our way @lincolnloop, or email us at info@lincolnloop.com. If you’d like ...
An important part of the process process of learning a new language is to learn the ecosystem that helps you to write better code. In a previous article I covered gdb integration with Go.
Next on my list is to find an equivalent of the fantastic Python coverage tool coverage.py. The Go equivalent is called gocov.
Let’s go ahead and install it now:
$ go get github.com/axw/gocov/gocov
$ go install github.com/axw/gocov/gocov
The two steps above have compiled and installed a binary gocov progam in your $GOPATH/bin. I would recommend adding this to your $PATH:
export PATH=$PATH:$GOPATH/bin
Now we’re ready to start using gocov in conjunction with our test suite. Here’s an example of running the test suite via gocov, generating a coverage report, and then immediately viewing that report via the less command.
Today we’re introducing a new member of the Lincoln Loop family, BotBot.me. At the moment, BotBot is beautiful hosted IRC logs (try #django or #go-nuts). We built it for people who love IRC and we want your advice to improve it.
We see BotBot becoming our personal chatroom assistant. He looks things up for you, he sends you reminders, he delivers messages to people when they aren’t available. Our initial focus has been having him remember the chatroom history and tell you what happened while you were away. He’s a replacement for your bouncer with a friendly web interface.
We’ve been happy users of Freenode’s IRC services for our company chat for years (we tried web-based chat services, but they never stuck). Recently, Github’s hubot inspired us to make our chat room better. Being the eternal tinkerers that we are, we decided to ...
Episode #2 of the /dev/loop podcast is live! Today I was joined by Pete, Graham, and Brian, and we discussed disk encryption and password sharing, client-side or server-side template rendering for Javascript, Django Rest Framework, and Graphite.
You can watch the video above, or subscribe to one of our feeds below:
If you’d like to chat with us about any of the topics we covered, we’d love to see you on Freenode IRC in #lincolnloop . You can also tweet @lincolnloop with questions or comments.
This week’s episode of the /dev/loop podcast features Pete, Yann, Michael and Brandon discussing the Go programming language, the flexibility of SVG graphics on the web, and the ups and downs of the Bootstrap toolkit.
You can watch the video above, or subscribe to one of our feeds below:
If you’d like to chat with us about any of the topics we covered, we’d love to see you on Freenode IRC in #lincolnloop . You can tweet @lincolnloop with questions or comments.
Today, several members of the Lincoln Loop team recorded our first podcast, which we’re calling “/dev/loop”. Pete, Yann, Marco, Brian, and Brandon gathered together to discuss configuration management and Salt, Selenium testing in Django 1.4, and &yet;'s excellent Realtime Conference and our takeaways from it.
You can watch the video above, or subscribe to one of our feeds below:
If you’d like to chat with us about any of the topics we covered, we’d love to see you on Freenode IRC in #lincolnloop . You can tweet @lincolnloop with questions or comments.
If you’ve never heard of Selenium, put simply, it’s a tool that allows you to create tests that are run in the browser and interact with your UI in the same way as if you were manually testing your website or app. It’s the de-facto standard to test complex Web UI interactions that usually involve a heavy use of JavaScript, and that’s probably the main use-case for it. Other than that, we also use it sometimes as a helper tool for cross-browser design (CSS) testing by running Selenium tests through different browsers and taking screenshots or recording videos.
Selenium’s been around for a long time now, and is available in various programming languages, but up until Django 1.4 came along you couldn’t have your Selenium tests (easily) integrated with your Django test suite. Since then, a new class named LiveServerTestCase, that your Selenium ...
First off, realtime websites are hard. The current toolset is rudimentary. When I first started building Ginger, I thought I must be doing it wrong because of all the trial-and-error and pieces I was building from scratch. After watching Geoff Schmidt’s keynote at DjangoCon, I realized it’s not that I’m dumb, it’s that everyone is reinventing their own wheel. His co-creation, Meteor, promises to fix that, but until then, we’re stuck with the tools we have.
One thing nearly every realtime site needs is a replay log. Public networks are inherintly unstable (doubly so for mobile). If a client disconnects for a short period of time, users will expect to receive any data it missed when it reconnects. That’s where a replay log comes in. It keeps a log of all activity and, when a client reconnects, it streams all the data it is ...
Whenever I have a conversation with someone about how we work at Lincoln Loop, people tend to be quite surprised, intrigued and skeptical, but mostly, they want to know more.
A while back we started blogging about how we do business, and I love pointing people to these articles to learn more about the details of our (un)management style. It’s particularly interesting hearing back from them about their impressions, questions, problems. Some of the most interesting ones for me are:
Few people know that there are more companies out there working in an unorthodox way, getting better results and happier people (yes, it’s not only us!)
It’s very easy to see how it would be hard (or imposible!) to apply these ideas to any other organization, but most people fail to realize how easy it is to actually do it: a culture of trust and motivation ...
I spent the vast majority of my time in the last 4 years writing, reading and debugging Python or JavaScript code. The process of learning Go was like a beautiful hike in the mountains with a small rock in my shoe. A lot of things impressed me, but using println to debug my code was travelling too far into the past. In Python we have pdb/ipdb to debug the code while running it, JavaScript offers similar tools. Over the years this pattern became a very important part of my development workflow.
A while ago, I wrote a couple of blog entries about load testing with JMeter (Part 1 and Part 2). I promised a third entry covering how to use JMeter to replay Apache logs and roughly recreate production load, but I never followed through with it. Today, I intend to rectify this grievous error.
Parsing your Apache Logs
There is more than one way to do this, but my preferred method is to use a simple Python script to do some filtering of the Apache log file you want to use and to output the desired urls as a tidy CSV file. I am using the ‘apachelog’ module for this (also available as a gist):
Full video conference: https://apprtc.appspot.com (Chrome only. First go to about:flags and Enable PeerConnection).
Is it ready?
No, but don’t let that stop you. The specification is still evolving, and vendor prefixes are the rule (except in Opera). Right now, you can get video from a webcam reliably in Chrome and Opera.