Colin Copeland

Colin co-founded Caktus in 2007. As Chief Technical Officer, he helps ensure that Caktus remains at the forefront of the open source community. He regularly implements services and products to better serve clients. He loves coding and still actively works on client projects, often as lead developer.

A proponent of automated testing and continuous integration, Colin is always researching best practices and creating efficiencies to improve deployment processes and provide outstanding support for Caktus clients. He particularly enjoys working on social innovation projects, some of which he’s become involved with through Code For Durham, a civic hacking brigade, which he helped to found around 2013.

One of Colin’s favorite, long-term projects was building the Open Data Policing NC website for the Southern Coalition for Social Justice, which displayed North Carolina police stop data. As a result of the project, Colin was invited to the White House Police Data Initiative in 2016 to share his ideas on how to ensure law enforcement transparency and accountability. In 2020-2021, Colin worked to relaunch the Open Data Policing NC website as NC Cop Watch. It draws on public records to publish up-to-date stop, search, and use-of-force data — broken down by race and ethnicity.

When Colin isn’t working on client projects, he continues to be motivated by volunteering through Code for Durham. He also enjoys baking, playing piano, and spending time with his family.

Hear more about Colin, his background, and his interests in this Modern CTO podcast and the DjangoChat podcast. You can also connect with him on GitHub, LinkedIn, and Twitter.

2012


cover-caktus-team-members-presenting-djangocon-2012.jpg

Caktus Team Members Presenting at DjangoCon 2012

Caktus is proud to announce that four of our developers will be presenting at this year’s DjangoCon. We are also happy to announce that we will be sponsors of DjangoCon, taking place in Washington D.C. on September 4th through the 7th. In addition to the four Caktus team members who will be presenting this year, our entire development staff will be in attendance enjoying the conference and city.

cover-thoughts-after-attending-unicef-rwanda-mhealth-conference.jpeg

Thoughts after attending the UNICEF Rwanda mHealth Conference

This past July, I had the pleasure of attending the UNICEF Rwanda Conference in Kigali, Rwanda. The conferences focus was on developing a comprehensive eHealth suite for numerous nations to implement.

cover-announcing-new-service-training.jpeg

Django Training

Caktus is proud to announce that we are now offering Django training services. This new service includes both off and on-site training for you and your team to become a Djangonaut.

Configuring a Jenkins Slave

We're pretty avid testers here at Caktus and when one of our Django projects required upgrading to Python 2.7, we also needed to upgrade our Jenkins build environment. Luckily, Jenkins supports distributed builds to allow a master install to delegate tasks to slaves instances. This way we can continue to run our primary build system on Ubuntu 10.04, which defaults to Python 2.6, and delegate tasks to an Ubuntu 11.04 environment running Python 2.7. The setup is fairly easy, but since I didn't find much out there already, I figured I write up a quick post outlining what we did.

2011


OpenBlock Geocoder, Part 3: External Geocoders

The OpenBlock geocoder is powerful and robust. It uses PostGIS for spacial queries, can extract addresses from bodies of text, and can understand block and intersection notation. We've run into a few issues with it, however, including a low geocoding success rate. This is a tough problem to solve and depends on a lot of factors (the extent of street and block data in OpenBlock, format of the street addresses, etc.), so your mileage may vary. Below I constructed a simple test using Google's Geocoding API to have as an alternative.

OpenBlock Geocoder, Part 2: Text Parsing and Entity Extraction

This is the second post in our OpenRural series reviewing OpenBlock and it's geocoder. OpenBlock Geocoder, Part 1: Data Model and Geocoding covers the internals of the OpenBlock geocoder and it's geocoding capabilities. As this posts builds upon topics covered there, you may wish to read Part 1 before proceeding. In this post we step back from the internals of the geocoder and explore how to use it along with other OpenBlock tools to parse unstructured text.

OpenBlock Geocoder, Part 1: Data Model and Geocoding

As Tobias mentioned in Scraping Data and Web Standards, Caktus is collaborating with the UNC School of Journalism to help develop Open Rural (the code is on GitHub). Open Rural hopes to help rural newspapers in North Carolina leverage OpenBlock. This blog post is the first of several covering the internals of OpenBlock and, specifically, the geocoder.

cover-lightning-talk-lunch-service-page-api.jpg

Lightning Talk Lunch: Service Page API

Leading the second talk of our Caktus Lightning Talk Lunch series, Calvin Spealman presented on the Service Page API:

The Service Page API is a prototype and proof of concept to deliver a wide range of browser plugins across multiple browsers and to extend the APIs available to websites a user visits by allowing plugins to extend the Javascript API with new libraries, integrate with external services, and more. It puts the power in the users hand to control which services can interact. This talk covers the problems with the current state of browser extensions and the difficulty in building them across multiple browsers consistently, and how the Service Page API is a solution to this, with code examples.

An alternative RapidSMS router implementation (with Celery!)

We've been using RapidSMS, a Django-powered SMS framework, more and more frequently here at Caktus. It's evolved a lot over the past year-- from being reworked to feel more like a Django app, to merging the rapidsms-core-dev and rapidsms-contrib-apps-dev repositories into a single codebase (no more submodules!), to finally becoming installable via pypi. The "new core" is in a great state now and is much easier to work with. However, one particular aspect of RapidSMS, the route process, has always been complicated and confusing to deal with. Tobias began the conversation on this issue after returning from a 6-week long UNICEF project in Zambia. He summarized the route process like so:

2010


Basic Django deployment with virtualenv, fabric, pip and rsync

Deployment is usually a tedious process with lots of tinkering until everything is setup just right. We deploy quite a few Django sites on a regular basis here at Caktus and still do tinkering, but we've attempted to functionalize some of the core tasks to ease the process. I've put together a basic example that outlines local and remote environment setup. This is a simplified example and just one of many ways to deploy a Django project (I learned a lot from Jacob Kaplan-Moss' django-deployment-workshop), so I encourage you to browse around the Django community to learn more. The entire source for this example project can be found in the caktus-deployment Bitbucket repository.