<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tobias McNulty on Caktus Group</title><link>https://www.caktusgroup.com/authors/tobias-mcnulty/</link><description>Recent content in Tobias McNulty on Caktus Group</description><generator>Hugo</generator><language>en</language><lastBuildDate>Mon, 06 Oct 2025 09:00:00 -0500</lastBuildDate><atom:link href="https://www.caktusgroup.com/authors/tobias-mcnulty/index.xml" rel="self" type="application/rss+xml"/><item><title>DjangoCon US 2025: A Celebration of Community, Code and 20 Years of Django</title><link>https://www.caktusgroup.com/blog/2025/10/06/djangocon-us-2025-celebration-community-code-20-years/</link><pubDate>Mon, 06 Oct 2025 09:00:00 -0500</pubDate><guid>https://www.caktusgroup.com/blog/2025/10/06/djangocon-us-2025-celebration-community-code-20-years/</guid><description>&lt;figure>&lt;img src="https://www.caktusgroup.com/blog/2025/10/06/djangocon-us-2025-celebration-community-code-20-years/djangocon25.jpg"
 alt="Group photo at DjangoCon US 2025">&lt;figcaption>
 &lt;p>Celebrating 20 years of Django&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;p>DjangoCon US 2025 was a milestone year for the community, as we gathered in Chicago to celebrate 20 years of Django. Attendees from around the world came together to learn about the latest developments, share their work, and strengthen the bonds that make DjangoCon such a special event. Caktus was well-represented once again, with our team contributing as organizers, speakers, and active participants throughout the week.&lt;/p></description></item><item><title>Happy 20th Birthday Django!</title><link>https://www.caktusgroup.com/blog/2025/08/11/happy-20th-birthday-django/</link><pubDate>Mon, 11 Aug 2025 12:27:30 -0400</pubDate><guid>https://www.caktusgroup.com/blog/2025/08/11/happy-20th-birthday-django/</guid><description>&lt;p>This Tuesday (tomorrow!), August 12th, we’re teaming up with &lt;a href="https://www.meetup.com/tripython/" target="_blank" rel="noopener noreferrer">TriPython&lt;/a> to host an informal Django Birthday event at &lt;a href="https://boxyard.rtp.org/" target="_blank" rel="noopener noreferrer">Boxyard RTP&lt;/a> in Durham.&lt;/p></description></item><item><title>How to Migrate your Python &amp; Django Projects to uv</title><link>https://www.caktusgroup.com/blog/2025/06/11/migrating-python-django-projects-uv/</link><pubDate>Wed, 11 Jun 2025 05:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/06/11/migrating-python-django-projects-uv/</guid><description>&lt;p>&lt;em>Editor&amp;rsquo;s note:&lt;/em> This post was updated on July 17th, 2025, to use the
&lt;code>PATH_add&lt;/code> hook for direnv and to recommend including &lt;code>uv sync --locked&lt;/code>
in your &lt;code>.envrc&lt;/code> file.&lt;/p></description></item><item><title>DjangoCon Europe 2025 Highlights</title><link>https://www.caktusgroup.com/blog/2025/05/27/djangocon-europe-2025-highlights/</link><pubDate>Tue, 27 May 2025 05:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/05/27/djangocon-europe-2025-highlights/</guid><description>&lt;p>Three Cakti recently attended DjangoCon Europe 2025 in Dublin and it was a wonderful experience! It was great to see and chat with various Django community members we usually only see once or twice a year. Beyond that, we were most impressed by the consistently high quality of the talks throughout all three days of the conference. It was a pleasure to listen to so many excellent presentations, including the lightning talks at the end of each day. Here are some of our favorite talks.&lt;/p></description></item><item><title>Tips for Tracking Django Model Changes with django-pghistory</title><link>https://www.caktusgroup.com/blog/2025/04/07/tips-tracking-django-model-changes-django-pghistory/</link><pubDate>Mon, 07 Apr 2025 10:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/04/07/tips-tracking-django-model-changes-django-pghistory/</guid><description>&lt;p>Django and its admin interface are a big part of &lt;a href="https://www.caktusgroup.com/blog/2016/12/14/django-boring-or-why-tech-startups-should-use-django/">why Caktus uses
Django&lt;/a>,
but the admin's ability to log database changes is limited. For
example, it shows only changes made via the Django admin, not via other
parts of the site.&lt;/p></description></item><item><title>Cakti Share Their Favorite Tools For Streamlined Workflows</title><link>https://www.caktusgroup.com/blog/2025/03/27/cakti-share-their-favorite-tools-for-streamlined-worklows/</link><pubDate>Thu, 27 Mar 2025 20:09:03 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/03/27/cakti-share-their-favorite-tools-for-streamlined-worklows/</guid><description>&lt;p>Let’s jump into it!&lt;/p>
&lt;p>At Caktus, we’re always looking for tools that help us streamline our workflows, increase productivity, and make our day-to-day tasks more efficient. Whether you&amp;rsquo;re managing projects, writing code, or debugging, the right tools can make all the difference. Here are some of our favorite tools that we love using to get the job done!&lt;/p></description></item><item><title>How to Use regexp_matches and regexp_match in PostgreSQL</title><link>https://www.caktusgroup.com/blog/2025/03/19/how-use-regexp_matches-and-regexp_match-postgresql/</link><pubDate>Wed, 19 Mar 2025 08:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/03/19/how-use-regexp_matches-and-regexp_match-postgresql/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>&lt;code>regexp_matches()&lt;/code> and &lt;code>regexp_match()&lt;/code> are two similar &lt;a href="https://www.postgresql.org/docs/current/functions-string.html" target="_blank" rel="noopener noreferrer">string
functions&lt;/a>
that support regular expression matching directly in the PostgreSQL
database. &lt;code>regexp_matches()&lt;/code> was added in &lt;a href="https://www.postgresql.org/docs/8.3/release-8-3.html" target="_blank" rel="noopener noreferrer">PostgreSQL
8.3&lt;/a>, and
&lt;code>regexp_match()&lt;/code> was added in &lt;a href="https://www.postgresql.org/docs/release/10.0/" target="_blank" rel="noopener noreferrer">PostgreSQL
10&lt;/a> (keep reading to see
how ChatGPT struggled to answer this question).&lt;/p></description></item><item><title>Private, ngrok-like Dev Servers with Tailscale</title><link>https://www.caktusgroup.com/blog/2025/03/12/private-ngrok-dev-servers-tailscale/</link><pubDate>Wed, 12 Mar 2025 10:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/03/12/private-ngrok-dev-servers-tailscale/</guid><description>&lt;p>This past week, I learned that it's possible to run
&lt;a href="https://tailscale.com/" target="_blank" rel="noopener noreferrer">Tailscale&lt;/a> in a local &lt;code>docker-compose.yml&lt;/code> on a
developer's workstation, and securely allow access to services in the
docker-compose file to other users on your Tailnet.&lt;/p></description></item><item><title>How to Deploy Selectively to Production</title><link>https://www.caktusgroup.com/blog/2025/03/04/how-deploy-selectively-production/</link><pubDate>Tue, 04 Mar 2025 11:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/03/04/how-deploy-selectively-production/</guid><description>&lt;p>Sometimes, it&amp;rsquo;s necessary to deploy a set of features and/or bug fixes to production before part of the current &amp;ldquo;testing&amp;rdquo; branch has been tested completely in a Q/A or staging environment.&lt;/p></description></item><item><title>How to fix factory_boy post-generation deprecation warnings</title><link>https://www.caktusgroup.com/blog/2025/02/18/how-fix-factory_boy-post-generation-deprecation-warning/</link><pubDate>Tue, 18 Feb 2025 17:52:17 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/02/18/how-fix-factory_boy-post-generation-deprecation-warning/</guid><description>&lt;p>We use &lt;a href="https://factoryboy.readthedocs.io/en/stable/" target="_blank" rel="noopener noreferrer">factory_boy&lt;/a> for
bootstrapping test data on many Python and Django projects at Caktus.
Recently, we encountered a deprecation warning on an older project that
had been using &lt;code>factory_boy&lt;/code> for some time:&lt;/p></description></item><item><title>Reflections on DjangoCon US 2024: Highlights, Takeaways, and Community Connections</title><link>https://www.caktusgroup.com/blog/2024/12/16/reflections-djangocon-us-2024-highlights-takeaways-and-community-connections/</link><pubDate>Mon, 16 Dec 2024 23:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2024/12/16/reflections-djangocon-us-2024-highlights-takeaways-and-community-connections/</guid><description>&lt;p>DjangoCon 2024 was a resounding success for the community, with attendees from all over the world gathering to learn about the latest developments in Django and to connect with the Django community. Caktus was well-represented at the conference, with six of our team members attending. In this blog post, we share our experiences at DjangoCon 2024, including our favorite talks, the people we met, and the things we learned. We also offer some tips for future attendees on how to get the most out of DjangoCon.&lt;/p></description></item><item><title>How to Automate Google Sheets to ODK Central</title><link>https://www.caktusgroup.com/blog/2023/03/08/how-automate-google-sheets-odk-central/</link><pubDate>Wed, 08 Mar 2023 15:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2023/03/08/how-automate-google-sheets-odk-central/</guid><description>&lt;p>&lt;a href="https://getodk.org/" target="_blank" rel="noopener noreferrer">ODK&lt;/a> is a popular tool for offline data collection
with a &lt;a href="https://forum.getodk.org/" target="_blank" rel="noopener noreferrer">thriving user community&lt;/a>. Like a
number of other offline data collection tools, it uses the &lt;a href="https://xlsform.org/en/" target="_blank" rel="noopener noreferrer">XLSForm
standard&lt;/a> for authoring forms. While convenient
to author and exchange, authoring the forms in Excel means each
iteration of the form must be uploaded to the &lt;a href="https://docs.getodk.org/central-intro/" target="_blank" rel="noopener noreferrer">ODK
Central&lt;/a> server that distributes
forms to mobile data collection applications, such as &lt;a href="https://docs.getodk.org/collect-intro/" target="_blank" rel="noopener noreferrer">ODK
Collect&lt;/a>.&lt;/p></description></item><item><title>How We Built a Caktus Cloud</title><link>https://www.caktusgroup.com/blog/2022/12/01/how-we-built-caktus-cloud/</link><pubDate>Thu, 01 Dec 2022 16:15:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2022/12/01/how-we-built-caktus-cloud/</guid><description>&lt;p>As a research project this year at Caktus, we decided to build our own
private cloud. Some of Caktus' clients prefer or require that their
data and workloads remain on premises, which begs the question, &amp;quot;How
can we bring a modern, cloud-like experience to an on-premises data
center?&amp;quot;&lt;/p></description></item><item><title>How to Handle Django Login Redirects with HTMX</title><link>https://www.caktusgroup.com/blog/2022/11/11/how-handle-django-login-redirects-htmx/</link><pubDate>Fri, 11 Nov 2022 17:08:26 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2022/11/11/how-handle-django-login-redirects-htmx/</guid><description>&lt;p>One of my favorite parts of working at Caktus is the community of
developers who share knowledge within and outside our teams. Many of us
work on different projects, but still take time to come together, share
what we've learned, and apply those learnings to other projects.&lt;/p></description></item><item><title>Meet the New Owners of Caktus</title><link>https://www.caktusgroup.com/blog/2022/01/14/meet-new-owners-caktus/</link><pubDate>Fri, 14 Jan 2022 13:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2022/01/14/meet-new-owners-caktus/</guid><description>&lt;p>Nearly every week, I receive an email or two from a third party
expressing interest in buying Caktus. As a matter of habit, I don't
open them, let alone respond. Most are scattershot, venture capital
firms looking for Software-as-a-Service companies (which Caktus is not).
But when an employee approached me in 2018 expressing an interest in
making Caktus employee-owned, I listened.&lt;/p></description></item><item><title>How to Decouple Your App From its Operating System with Docker</title><link>https://www.caktusgroup.com/blog/2021/06/04/decouple-app-operating-system/</link><pubDate>Fri, 04 Jun 2021 13:48:53 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2021/06/04/decouple-app-operating-system/</guid><description>&lt;p>We regularly update and improve our &lt;a href="https://www.caktusgroup.com/services/python-django-upgrades-and-sustainability/">upgrades and sustainability service
offerings&lt;/a>
at Caktus, and a recent upgrade for a client precipitated a solution
that I felt might be worth sharing. At Caktus, the preferred approach
for addressing upgrades and sustainability is to make incremental
updates to a project over time, trying to keep both Django and the
servers themselves on a long-term support version. These are select
versions of Django and Ubuntu, for example, that generally have much
longer support periods than other versions, i.e., they are a good fit
for applications that you will need to continue maintaining well into
the future.&lt;/p></description></item><item><title>How to Use the "docker" Docker Image to Run Your Own Docker daemon</title><link>https://www.caktusgroup.com/blog/2020/02/25/docker-image/</link><pubDate>Tue, 25 Feb 2020 13:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2020/02/25/docker-image/</guid><description>&lt;p>There exists on Docker hub a Docker image called
&lt;a href="https://hub.docker.com/_/docker" target="_blank" rel="noopener noreferrer">docker&lt;/a>. It also has two flavors,
&amp;quot;stable&amp;quot; and a &amp;quot;dind&amp;quot; (Docker-in-Docker). What is this image for and
what is the purpose of these two different image tags?&lt;/p></description></item><item><title>How to Set Up a Centralized Log Server with rsyslog</title><link>https://www.caktusgroup.com/blog/2019/06/20/how-to-set-up-centralized-log-server-rsyslog/</link><pubDate>Thu, 20 Jun 2019 12:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2019/06/20/how-to-set-up-centralized-log-server-rsyslog/</guid><description>&lt;p>For many years, we've been running an ELK (Elasticsearch, Logstash,
Kibana) stack for centralized logging. We have a specific project that
requires on-premise infrastructure, so sending logs off-site to a hosted
solution was not an option. Over time, however, the maintenance
requirements of this self-maintained ELK stack were staggering.
Filebeat, for example, filled up all the disks on all the servers in a
matter of hours, not once, but twice (and for different reasons) when it
could not reach its Logstash/Elasticsearch endpoint. Metricbeat suffered
from a similar issue: It used far too much disk space relative to the
value provided in its Elasticsearch indices. And while provisioning a
self-hosted ELK stack has gotten easier over the years, it's still a
lengthy process, which requires extra care anytime an upgrade is needed.
Are these problems solvable? Yes. But for our needs, a simpler solution
was needed.&lt;/p></description></item><item><title>How to Switch to a Custom Django User Model Mid-Project</title><link>https://www.caktusgroup.com/blog/2019/04/26/how-switch-custom-django-user-model-mid-project/</link><pubDate>Fri, 26 Apr 2019 16:32:33 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2019/04/26/how-switch-custom-django-user-model-mid-project/</guid><description>&lt;p>The Django documentation recommends always &lt;a href="https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project" target="_blank" rel="noopener noreferrer">starting your project with a
custom user
model&lt;/a>
(even if it's identical to Django's to begin with), to make it easier
to customize later if you need to. But what are you supposed to do if
you didn't see this when starting a project, or if you inherited a
project without a custom user model and you need to add one?&lt;/p></description></item><item><title>How to Use Django Bulk Inserts for Greater Efficiency</title><link>https://www.caktusgroup.com/blog/2019/01/09/django-bulk-inserts/</link><pubDate>Wed, 09 Jan 2019 13:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2019/01/09/django-bulk-inserts/</guid><description>&lt;p>It's been awhile since we &lt;a href="https://www.caktusgroup.com/blog/2011/09/20/bulk-inserts-django/">last discussed bulk
inserts&lt;/a>
on the Caktus blog. The idea is simple: if you have an application that
needs to insert a lot of data into a Django model &amp;mdash; for example a
background task that processes a CSV file (or some other text file) &amp;mdash;
it pays to &amp;quot;chunk&amp;quot; those updates to the database so that multiple
records are created through a single database operation. This reduces
the total number of round-trips to the database, something my colleague
Dan Poirier discussed in more detail in the post linked above.&lt;/p></description></item><item><title>Automating Dokku Setup with AWS Managed Services</title><link>https://www.caktusgroup.com/blog/2017/10/16/automating-dokku-setup-aws-managed-services/</link><pubDate>Mon, 16 Oct 2017 13:30:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2017/10/16/automating-dokku-setup-aws-managed-services/</guid><description>&lt;p>&lt;a href="http://dokku.viewdocs.io/dokku/" target="_blank" rel="noopener noreferrer">Dokku&lt;/a> is a great little tool. It lets
you set up your own virtual machine (VM) to facilitate quick and easy
Heroku-like deployments through a &lt;code>git push&lt;/code> command. Builds are fast,
and updating environment variables is easy. The problem is that Dokku
includes all of your services on a single instance. When you run your
database on the Dokku instance, you risk losing it (and any data that's
not yet backed up) should your VM suddenly fail.&lt;/p></description></item><item><title>Managing your AWS Container Infrastructure with Python</title><link>https://www.caktusgroup.com/blog/2017/06/28/managing-your-aws-container-infrastructure-with-python/</link><pubDate>Wed, 28 Jun 2017 13:30:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2017/06/28/managing-your-aws-container-infrastructure-with-python/</guid><description>&lt;p>We deploy Python/Django apps to a wide variety of hosting providers at
Caktus. Our
&lt;a href="https://github.com/caktus/django-project-template" target="_blank" rel="noopener noreferrer">django-project-template&lt;/a>
includes a &lt;a href="https://docs.saltstack.com/en/latest/topics/" target="_blank" rel="noopener noreferrer">Salt&lt;/a>
configuration to set up an Ubuntu virtual machine on just about any
hosting provider, from scratch. We've also modified this a number of
times for local hosting requirements when our customer required the
application we built to be hosted on hardware they control. In the past,
we also &lt;a href="http://fabulaws.readthedocs.io/en/latest/architecture.html" target="_blank" rel="noopener noreferrer">built our own
tool&lt;/a> for
creating and managing EC2 instances automatically via the Amazon Web
Services (AWS) APIs. In March, my colleague &lt;a href="https://www.caktusgroup.com/about/dan-poirier/">Dan
Poirier&lt;/a> wrote an excellent post about &lt;a href="https://www.caktusgroup.com/blog/2017/03/23/hosting-django-sites-amazon-elastic-beanstalk/">deploying
Django applications to Elastic
Beanstalk&lt;/a>
demonstrating how we&amp;rsquo;ve used that service.&lt;/p></description></item><item><title>Here's a Production-Ready Dockerfile for Your Python/Django App</title><link>https://www.caktusgroup.com/blog/2017/03/14/production-ready-dockerfile-your-python-django-app/</link><pubDate>Tue, 14 Mar 2017 08:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2017/03/14/production-ready-dockerfile-your-python-django-app/</guid><description>&lt;p>&lt;strong>Update (October 29, 2019):&lt;/strong> I updated this post with more recent
Django and Postgres versions, to use Python and pip directly in the
container (instead of in a separate virtual environment, which was
unnecessary), and switched to a non-root user via Docker instead of
uWSGI.&lt;/p></description></item><item><title>Caktus Attends Wagtail CMS Sprint in Reykjavik</title><link>https://www.caktusgroup.com/blog/2017/02/17/caktus-attends-wagtail-cms-sprint-reykjavik/</link><pubDate>Fri, 17 Feb 2017 23:15:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2017/02/17/caktus-attends-wagtail-cms-sprint-reykjavik/</guid><description>&lt;p>Caktus CEO Tobias McNulty and Sales Engineer David Ray recently had the opportunity to attend a &lt;a href="https://wagtail.io/blog/reykjavik-2017/" target="_blank" rel="noopener noreferrer">development sprint&lt;/a> for the &lt;a href="https://wagtail.io/" target="_blank" rel="noopener noreferrer">Wagtail&lt;/a> Content Management System (CMS) in Reykjavik, Iceland. The two-day software development sprint attracted 15 attendees hailing from a total of 5 countries across North America and Europe.&lt;/p></description></item><item><title>Django is Boring, or Why Tech Startups (Should) Use Django</title><link>https://www.caktusgroup.com/blog/2016/12/14/django-boring-or-why-tech-startups-should-use-django/</link><pubDate>Wed, 14 Dec 2016 15:04:32 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2016/12/14/django-boring-or-why-tech-startups-should-use-django/</guid><description>&lt;p>I recently attended &lt;a href="https://www.djangounderthehood.com/" target="_blank" rel="noopener noreferrer">Django Under The Hood&lt;/a> in Amsterdam, an annual gathering of Django core team members and developers from around the world. A common theme discussed at the conference this year is that “Django is boring.” While it’s not the first time this has been discussed, it still struck me as odd. Upon further reflection, however, I see Django’s “boringness” as a huge asset to the community and potential adopters of the framework.&lt;/p></description></item><item><title>Caktus expands anti-discrimination policies to include sexual orientation, gender identity</title><link>https://www.caktusgroup.com/blog/2016/04/04/caktus-expands-anti-harassment-policy-include-sexual-orientation-gender-identity/</link><pubDate>Mon, 04 Apr 2016 17:34:32 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2016/04/04/caktus-expands-anti-harassment-policy-include-sexual-orientation-gender-identity/</guid><description>&lt;p>For the past few months, we’ve been working on broadening our anti-harassment and equal employment policy. We’re very pleased to announce that our policies now include sexual orientation and gender identity as of March 24, 2016.&lt;/p></description></item><item><title>Making Clean Code a Part of Your Build Process (And More!)</title><link>https://www.caktusgroup.com/blog/2015/08/15/making-clean-code-part-your-build-process/</link><pubDate>Sat, 15 Aug 2015 12:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2015/08/15/making-clean-code-part-your-build-process/</guid><description>&lt;p>At Caktus, &amp;ldquo;clean&amp;rdquo; (in addition to &amp;ldquo;working&amp;rdquo;!) code is an important part of our delivery. For all new projects, we achieve that by using &lt;a href="https://flake8.readthedocs.org/en/latest/" target="_blank" rel="noopener noreferrer">flake8&lt;/a>. &lt;strong>flake8&lt;/strong> is a wrapper around several tools: &lt;a href="http://pep8.readthedocs.org/en/latest/" target="_blank" rel="noopener noreferrer">pep8&lt;/a>, &lt;a href="https://pypi.python.org/pypi/pyflakes" target="_blank" rel="noopener noreferrer">pyflakes&lt;/a>, and &lt;a href="https://pypi.python.org/pypi/mccabe" target="_blank" rel="noopener noreferrer">McCabe&lt;/a>. &lt;strong>pep8&lt;/strong> checks to make sure your code matches the &lt;a href="https://www.python.org/dev/peps/pep-0008/" target="_blank" rel="noopener noreferrer">PEP 0008&lt;/a> style guidelines, &lt;strong>pyflakes&lt;/strong> looks for a few additional things like unused imports or variables, and &lt;strong>McCabe&lt;/strong> raises warnings about overly complex sections of code.&lt;/p></description></item><item><title>Using Unsaved Related Models for Sample Data in Django 1.8</title><link>https://www.caktusgroup.com/blog/2015/07/28/using-unsaved-related-models-sample-data-django-18/</link><pubDate>Tue, 28 Jul 2015 15:54:33 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2015/07/28/using-unsaved-related-models-sample-data-django-18/</guid><description>&lt;p>&lt;strong>Note:&lt;/strong> In between the time I originally wrote this post and it
getting published, a
&lt;a href="https://code.djangoproject.com/ticket/25160" target="_blank" rel="noopener noreferrer">ticket&lt;/a> and &lt;a href="https://github.com/django/django/pull/5060" target="_blank" rel="noopener noreferrer">pull
request&lt;/a> were opened in
Django to remove &lt;code>allow_unsaved_instance_assignment&lt;/code> and move validation
to the model &lt;code>save()&lt;/code> method, which makes much more sense anyways. It's
likely this will even be backported to Django 1.8.4. So, if you're
using a version of Django that doesn't require this, hopefully you'll
never stumble across this post in the first place! If this is still an
issue for you, here's the original post:&lt;/p></description></item><item><title>Creating and Using Open Source: A Guide for ICT4D Managers</title><link>https://www.caktusgroup.com/blog/2015/05/29/creating-and-using-open-source-guide-ict4d-managers/</link><pubDate>Fri, 29 May 2015 18:25:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2015/05/29/creating-and-using-open-source-guide-ict4d-managers/</guid><description>&lt;p>Choosing an open source product or platform upon which to build an ICT4D service is hard. Creating a sustainable, volunteer-driven open source project is even harder. There is a proliferation of open source tools in the world, but the messaging used to describe a given project does not always line up with the underlying technology. For example, the project may make claims about modularity or pluggability that, upon further investigation, prove to be exaggerations at best. Similarly, managers of ICT4D projects may be attracted to Open Source because of the promise of a “free” product, but as we’ve learned through trial and error at Caktus, it’s not always less costly to adapt an existing open source project than it would be to engineer a quality system from the ground up.&lt;/p></description></item><item><title>PyPy.js: What? How? Why? by Ryan Kelly (PyCon 2015 Must-See Talk: 5/6)</title><link>https://www.caktusgroup.com/blog/2015/05/26/pypyjs-what-how-why-ryan-kelly/</link><pubDate>Tue, 26 May 2015 17:21:14 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2015/05/26/pypyjs-what-how-why-ryan-kelly/</guid><description>&lt;p>&lt;em>Part five of six in our &lt;a href="https://www.caktusgroup.com/blog/2015/04/28/pycon-2015-must-see-talk-favorites/">PyCon 2015 Must-See Series&lt;/a>, a weekly highlight of talks our staff enjoyed at PyCon.&lt;/em>&lt;/p>
&lt;p>From Ryan Kelly&amp;rsquo;s talk I learned that it is actually possible, today, to run Python in a web browser (not something that interprets Python-like syntax and translates it into JavaScript, but an actual Python interpreter!). PyPy.js combines two technologies, &lt;a href="http://pypy.org/" target="_blank" rel="noopener noreferrer">PyPy&lt;/a> (the Python interpreter written in Python) and &lt;a href="http://kripken.github.io/emscripten-site/" target="_blank" rel="noopener noreferrer">Emscripten&lt;/a> (an LLVM-to-JavaScript converter, typically used for getting games running in the browser), to run PyPy in the browser. This talk is a must-see for anyone who&amp;rsquo;s longed before to write client-side Python instead of JavaScript for a web app. While realistically being able to do this in production may still be a ways off, at least in part due to the multiple megabytes of JavaScript one needs to download to get it working, I enjoyed the view Ryan&amp;rsquo;s talk provided into the internals of this project. PyPy itself is always fascinating, and this talk made it even more so.&lt;/p></description></item><item><title>Why I Love Technical Blogging</title><link>https://www.caktusgroup.com/blog/2015/01/23/why-i-love-technical-blogging/</link><pubDate>Fri, 23 Jan 2015 16:06:51 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2015/01/23/why-i-love-technical-blogging/</guid><description>&lt;p>I love writing blog posts, and today I’m setting out to do something I’ve never tried before: write a blog post about writing blog posts. A big part of our mission at Caktus is to foster and help grow the Python and Django development communities, both locally and nationally. Part of how we’ve tried to accomplish this in the past is through hosting development sprints, sponsoring and attending conferences such as PyCon and DjangoCon, and building a knowledge base of common problems in Python and Django development in our blog. Many in the Django community first get to know Caktus through our blog, and it’s both gratifying and humbling when I meet someone at a conference and the person thanks me for a post Caktus wrote that helped him or her solve a technical problem at some point in the past.&lt;/p></description></item><item><title>Removal of Mural</title><link>https://www.caktusgroup.com/blog/2014/07/11/removal-mural/</link><pubDate>Fri, 11 Jul 2014 15:12:20 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2014/07/11/removal-mural/</guid><description>&lt;p>
We have recently heard complaints about the painting over of the mural on the side of 108 Morris, the building we purchased and are restoring in Downtown Durham. I am personally distressed at this response. I see now, in retrospect, where we needed to work harder to discuss our decision with the community. In our enthusiasm to bring more life to Downtown Durham via ground-level retail space and offices for our staff, we were blind to what the public response might be to the mural. Its removal was not a decision taken lightly and one done in consultation with the Historic Preservation Commission. However, we handled this poorly. We apologize for not making more efforts to include the community in this decision.
&lt;/p></description></item><item><title>Caktus Supports Libya Elections with World’s First SMS Voter Registration System</title><link>https://www.caktusgroup.com/blog/2014/06/25/caktus-supporting-libyas-elections-worlds-first-sms-voter-registration-system/</link><pubDate>Wed, 25 Jun 2014 17:16:19 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2014/06/25/caktus-supporting-libyas-elections-worlds-first-sms-voter-registration-system/</guid><description>&lt;p>Today’s election in Libya, the second general election for a governing body since Gaddafi’s ouster, is being supported in-country by our Caktus team. Caktus developers created Libya's SMS voter registration system, the first of its kind in the world.
&lt;/p></description></item><item><title>Caktus is going to Montréal for PyCon 2014!</title><link>https://www.caktusgroup.com/blog/2014/04/10/caktus-going-montreal-pycon-2014/</link><pubDate>Thu, 10 Apr 2014 13:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2014/04/10/caktus-going-montreal-pycon-2014/</guid><description>&lt;p>Caktus is happy to once again sponsoring and
attending &lt;a href="https://us.pycon.org/2014/" target="_blank" rel="noopener noreferrer">PyCon&lt;/a> in Montreal this year.
Year after year, we look forward to this conference and we are always
impressed with the quality of the speakers that the conference draws.
The team consistently walks away with new ideas from attending the
talks, open spaces and working on sprints that they are excited to
implement here at Caktus and in their personal projects.&lt;/p></description></item><item><title>Caktus Implementing New Policy Modeled on Foreign Corrupt Practices Act</title><link>https://www.caktusgroup.com/blog/2014/04/04/caktus-implementing-new-policy-modeled-foreign-corrupt-practices-act/</link><pubDate>Fri, 04 Apr 2014 21:23:59 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2014/04/04/caktus-implementing-new-policy-modeled-foreign-corrupt-practices-act/</guid><description>&lt;p>Caktus&amp;rsquo; successful growth in mobile messaging applications overseas has
been a wonderful point of pride for us. The work we&amp;rsquo;re doing
internationally has real impact on burgeoning democracies, HIV/AIDs
patients, and others where technology makes all the difference.&lt;/p></description></item><item><title>Using strace to Debug Stuck Celery Tasks</title><link>https://www.caktusgroup.com/blog/2013/10/30/using-strace-debug-stuck-celery-tasks/</link><pubDate>Wed, 30 Oct 2013 19:56:31 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2013/10/30/using-strace-debug-stuck-celery-tasks/</guid><description>&lt;p>&lt;a href="http://www.celeryproject.org/" target="_blank" rel="noopener noreferrer">Celery&lt;/a> is a great tool for background
task processing in &lt;a href="https://www.djangoproject.com/" target="_blank" rel="noopener noreferrer">Django&lt;/a>. We use it
in a lot of the custom web apps we build at Caktus, and it's quickly
becoming the standard for all variety of task scheduling work loads,
from simple to highly complex.&lt;/p></description></item><item><title>Central logging in Django with Graylog2 and graypy</title><link>https://www.caktusgroup.com/blog/2013/09/18/central-logging-django-graylog2-and-graypy/</link><pubDate>Wed, 18 Sep 2013 14:00:12 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2013/09/18/central-logging-django-graylog2-and-graypy/</guid><description>&lt;p>Django's &lt;a href="https://docs.djangoproject.com/en/1.5/topics/logging/" target="_blank" rel="noopener noreferrer">logging
configuration&lt;/a>
facilities, which arrived in version 1.3, have greatly eased (and
standardized) the process of configuring logging for Django projects.
When building complex and interactive web applications at Caktus, we've
found that detailed (and properly configured!) logs are key to
successful and efficient debugging. Another step in that process &amp;mdash;
which can be particularly useful in environments where you have multiple
web servers &amp;mdash; is setting up a centralized logging server to receive
all your logs and make them available through an easily accessible web
interface. There are a number useful tools to do this, but one we've
found that works quite well is &lt;a href="http://graylog2.org/" target="_blank" rel="noopener noreferrer">Graylog2&lt;/a>.
Installing and configuring Graylog2 is outside the scope of this post,
but there are plenty of tutorials on how to do so accessible through
your search engine of choice.&lt;/p></description></item><item><title>Migrating to a Custom User Model in Django</title><link>https://www.caktusgroup.com/blog/2013/08/07/migrating-custom-user-model-django/</link><pubDate>Wed, 07 Aug 2013 13:10:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2013/08/07/migrating-custom-user-model-django/</guid><description>&lt;p>&lt;strong>UPDATE: Read a&lt;/strong> &lt;a href="https://www.caktusgroup.com/blog/2019/04/26/how-switch-custom-django-user-model-mid-project/">&lt;strong>newer blog post on this
topic&lt;/strong>&lt;/a>.&lt;/p>
&lt;p>The new &lt;a href="https://docs.djangoproject.com/en/1.5/topics/auth/customizing/" target="_blank" rel="noopener noreferrer">custom user model
configuration&lt;/a>
that arrived in Django makes it relatively straightforward to swap in
your own model for the Django user model. In most cases, Django's
built-in &lt;code>User&lt;/code> model works just fine, but there are times when certain
limitations (such as the &lt;a href="https://docs.djangoproject.com/en/1.5/ref/models/fields/#emailfield" target="_blank" rel="noopener noreferrer">length of the email
field&lt;/a>)
require a custom user model to be installed. If you're starting out
with a custom user model, setup and configuration are relatively
straightforward, but if you need to migrate an existing legacy project
(e.g., one that started out in Django 1.4 or earlier), there are a few
gotchas that you might run into. We did this recently for one of our
larger, long-term client projects at Caktus, and here's an outline of
how we'd recommend tackling this issue:&lt;/p></description></item><item><title>PBS' Half the Sky Documentary Site Developed by Caktus</title><link>https://www.caktusgroup.com/blog/2012/10/05/pbs-half-sky-documentary-site-developed-caktus/</link><pubDate>Fri, 05 Oct 2012 19:03:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2012/10/05/pbs-half-sky-documentary-site-developed-caktus/</guid><description>&lt;p>Earlier this year Caktus had the honor of working with Sonnet Media and
PBS&amp;rsquo; Independent Lens on the documentary, &lt;a href="http://www.pbs.org/independentlens/half-the-sky/" target="_blank" rel="noopener noreferrer">[&lt;em>Half the Sky: Turning
Oppression into Opportunity for Women
Worldwide.&lt;/em>]{.underline}&lt;/a>
Originally a best-selling book by Nicholas Kristof and Sheryl WuDunn,
the book adapted into a two part documentary series. The documentary
gives a voice to oppressed women around the world and brings a greater
awareness to their struggles to the rest of the globe. Half the Sky also
highlights a few of the amazing women who are directly making a change
in their countries by community organizing and advocating for women&amp;rsquo;s
rights through non-governmental organizations.&lt;/p></description></item><item><title>Planning Our First ShipIt Day at Caktus</title><link>https://www.caktusgroup.com/blog/2012/10/01/planning-our-first-shipit-day-caktus/</link><pubDate>Mon, 01 Oct 2012 16:10:33 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2012/10/01/planning-our-first-shipit-day-caktus/</guid><description>&lt;p>I'm delighted to write that last Friday, we announced we'll be trying
our first &amp;quot;ShipIt Day&amp;quot; at Caktus in October. ShipIt Days, also known
as FedEx Days, provide a time for the team to set aside what occupies us
most days&amp;mdash;building fantastic &lt;a href="https://www.caktusgroup.com/services/custom-web-applications/">web
applications&lt;/a> using Python and
Django for our wonderful &lt;a href="https://www.caktusgroup.com/portfolio/">clients&lt;/a>&amp;mdash;and pick up something
new or scratch an itch that's been bugging us for awhile. We got the
idea from the book &lt;em>&lt;a href="http://www.danpink.com/drive" target="_blank" rel="noopener noreferrer">Drive&lt;/a>&lt;/em> by Daniel
Pink, and it was also suggested independently by a number of &lt;a href="https://www.caktusgroup.com/about/">team
members&lt;/a>.&lt;/p></description></item><item><title>Django Fundamentals Bootcamp Recap</title><link>https://www.caktusgroup.com/blog/2012/07/12/django-fundamentals-bootcamp-recap/</link><pubDate>Thu, 12 Jul 2012 20:34:03 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2012/07/12/django-fundamentals-bootcamp-recap/</guid><description>&lt;p>On June 8th and 9th, Caktus hosted its first
&lt;a href="http://www.caktusgroup.com/events/details/django-fundamentals-bootcamp" target="_blank" rel="noopener noreferrer">&lt;/a>Django
Fundamentals Bootcamp. The Caktus team developed the idea for the
course, which was a crossword drill application, and has been developing
the structure and content of the course over the past year. The bootcamp
was designed to teach programmers who have experience in programming
with different languages and introduce them to the fundamentals of
building a web application with Django. We created an interactive
environment where the instructors and students were able to communicate
with one another which solved the issue of how to begin developing in an
unfamiliar language.&lt;/p></description></item><item><title>Karen Tracey to Deliver Keynote at DjangoCon Europe 2012</title><link>https://www.caktusgroup.com/blog/2012/05/31/karen-tracey-deliver-keynote-djangocon-europe-2012/</link><pubDate>Thu, 31 May 2012 19:47:14 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2012/05/31/karen-tracey-deliver-keynote-djangocon-europe-2012/</guid><description>&lt;p>I am very proud to announce that &lt;a href="https://www.caktusgroup.com/about/#kmtracey">Karen Tracey&lt;/a>, Lead
Developer at Caktus and Django Core Developer, will be &lt;a href="http://2012.djangocon.eu/blog/announcing-our-final-keynote-speaker-karen-tracey/" target="_blank" rel="noopener noreferrer">delivering a
keynote
address&lt;/a>
at &lt;a href="http://2012.djangocon.eu/" target="_blank" rel="noopener noreferrer">DjangoCon Europe&lt;/a> next week. This will be
Karen's first speech to the Django community, of which she has been an
exemplary member since 2006.&lt;/p></description></item><item><title>Narrowing the Gender Gap in the Open Source community</title><link>https://www.caktusgroup.com/blog/2012/05/24/narrowing-gender-gap-open-source-community/</link><pubDate>Thu, 24 May 2012 20:44:57 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2012/05/24/narrowing-gender-gap-open-source-community/</guid><description>&lt;p>Diversity is important in a workplace environment. Having different
points of view from people with different life experiences brings
&lt;a href="http://www.brighthub.com/office/human-resources/articles/90910.aspx" target="_blank" rel="noopener noreferrer">creative new ideas and innovative
solutions&lt;/a>
to the software development process. As a team of web developers that
designs and builds custom web applications, creativity and gender
diversity, I would argue, are closely tied and both crucial to the
success of our projects.&lt;/p></description></item><item><title>Using Django and Celery with Amazon SQS</title><link>https://www.caktusgroup.com/blog/2011/12/19/using-django-and-celery-amazon-sqs/</link><pubDate>Mon, 19 Dec 2011 16:26:48 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/12/19/using-django-and-celery-amazon-sqs/</guid><description>&lt;p>Amazon's &lt;a href="http://aws.amazon.com/sqs/" target="_blank" rel="noopener noreferrer">Simple Queue Service&lt;/a> (SQS) is a
relatively new offering in the family of Amazon Web Services (AWS).
It's also an appealing one, because it proposes to quickly and easily
replace a common component of the stack in a typical web application,
thereby obviating the need to run a separate queue server like
&lt;a href="http://www.rabbitmq.com/" target="_blank" rel="noopener noreferrer">RabbitMQ&lt;/a>. While RabbitMQ &amp;mdash; the typical
favorite for Celery users &amp;mdash; is not necessarily difficult to install or
maintain, removing it from the stack of a web application means one less
component that might fail, offloading that service to AWS &amp;mdash; especially
for applications with a small to moderate queue volume &amp;mdash; might prove
financially advantageous.&lt;/p></description></item><item><title>Scraping Data and Web Standards</title><link>https://www.caktusgroup.com/blog/2011/12/06/scraping-data-and-web-standards/</link><pubDate>Tue, 06 Dec 2011 21:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/12/06/scraping-data-and-web-standards/</guid><description>&lt;p>We're currently involved in a project with the &lt;a href="http://jomc.unc.edu/" target="_blank" rel="noopener noreferrer">UNC School of
Journalism&lt;/a> that
hopes to help rural newspapers in North Carolina leverage
&lt;a href="http://openblockproject.org/" target="_blank" rel="noopener noreferrer">OpenBlock&lt;/a>.  The project is
called OpenRural, and if you're a software developer you can find the
latest code &lt;a href="https://github.com/openrural/openrural-nc" target="_blank" rel="noopener noreferrer">on
GitHub&lt;/a>.&lt;/p></description></item><item><title>Caktus Group Welcomes Designer and Front End Developer Julia Elman</title><link>https://www.caktusgroup.com/blog/2011/09/30/caktus-group-welcomes-designer-and-front-end-developer-julia-elman/</link><pubDate>Fri, 30 Sep 2011 15:52:22 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/09/30/caktus-group-welcomes-designer-and-front-end-developer-julia-elman/</guid><description>&lt;p>I'm delighted to announce that Julia Elman has joined our growing team
of web developers here at Caktus. Julia started her design career almost
10 years ago in an internal marketing group, and first learned about
Django at the SXSW Interactive Festival in 2008. Prior to joining the
Caktus team, Julia worked at the Lawrence Journal World (the birthplace
of Django) and as a freelance designer.&lt;/p></description></item><item><title>Testing Web Server Configurations with Fabric and ApacheBench</title><link>https://www.caktusgroup.com/blog/2011/09/13/testing-web-server-configurations-fabric-and-apachebench/</link><pubDate>Tue, 13 Sep 2011 18:16:33 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/09/13/testing-web-server-configurations-fabric-and-apachebench/</guid><description>&lt;p>Load testing a site with ApacheBench is fairly straight forward.
Typically you'd just SSH to a machine on the same network as the one
you want to test, and run a command like this:&lt;/p></description></item><item><title>The Buddha Website Nominated for Webby Award</title><link>https://www.caktusgroup.com/blog/2011/04/12/buddha-website-nominated-webby-award/</link><pubDate>Tue, 12 Apr 2011 16:09:44 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/04/12/buddha-website-nominated-webby-award/</guid><description>&lt;p>I'm delighted to announce that the &lt;a href="https://www.caktusgroup.com/portfolio/project/the-buddha-a-pbs-documentary/">PBS companion website for The
Buddha&lt;/a>
&amp;mdash; a site that Caktus helped build using the Django web framework &amp;mdash;
has been nominated for a Webby Award in the Religion and Spirituality
category! Online voting for the People&amp;rsquo;s Voice awards is now underway
and we would appreciate you &lt;a href="http://webby.aol.com/media_types/web?focused_on_category=973#cat_id_973" target="_blank" rel="noopener noreferrer">voting for the
site&lt;/a>
and encouraging others to do so as well. You can also view the entry
page directly
&lt;a href="http://webby.aol.com/entries/57606" target="_blank" rel="noopener noreferrer">here&lt;/a>.&lt;/p></description></item><item><title>New Job Posting: Linux Systems Administrator with Python/Django experience</title><link>https://www.caktusgroup.com/blog/2011/03/12/new-job-posting-linux-systems-administrator-pythondjango-experience/</link><pubDate>Sat, 12 Mar 2011 16:56:33 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/03/12/new-job-posting-linux-systems-administrator-pythondjango-experience/</guid><description>&lt;p>I'm delighted to announce that we've just published another job
posting for a Linux Systems Administrator at Caktus. The position will
involve maintaining existing Linux servers, designing and building
highly-scalable deployments, and assistance with Django deployment and
development as time permits. This is a full-time position, with
benefits, and is based out of our Carrboro, NC office (a short drive
from Raleigh, Durham, and Chapel Hill).&lt;/p></description></item><item><title>Caktus Consulting Group Sponsors PyCon 2011</title><link>https://www.caktusgroup.com/blog/2011/03/09/caktus-consulting-group-sponsors-pycon-2011/</link><pubDate>Thu, 10 Mar 2011 03:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/03/09/caktus-consulting-group-sponsors-pycon-2011/</guid><description>&lt;p>&lt;a href="http://us.pycon.org/2011/home/" target="_blank" rel="noopener noreferrer">PyCon 2011
Atlanta&lt;/a> is just
around the corner, and I'm proud to announce that Caktus is a gold
sponsor at the conference this year! We sponsored DjangoCon in both 2009
and 2010, and this year agreed to extend that support to the Python
community in general.&lt;/p></description></item><item><title>New Careers Page Inaugurated with Django Job Posting</title><link>https://www.caktusgroup.com/blog/2011/02/09/new-careers-page-inaugurated-django-job-posting/</link><pubDate>Wed, 09 Feb 2011 16:50:47 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/02/09/new-careers-page-inaugurated-django-job-posting/</guid><description>&lt;p>I&amp;rsquo;m pleased to announce that we just released a new &lt;a href="https://www.caktusgroup.com/careers/" title="Careers at Caktus">Careers section&lt;/a> of our web site here at Caktus. The section has been inaugurated with a new posting for a full-time Django developer position based out of our Carrboro, NC office (not far from Raleigh, Durham, or Chapel Hill), so kindly check it out and let us know if you or someone you know might be a good fit!&lt;/p></description></item><item><title>HIV Results, Birth Reminders, and Clinic Communication in Malawi</title><link>https://www.caktusgroup.com/blog/2010/12/29/hiv-results-birth-reminders-and-clinic-communication-malawi/</link><pubDate>Wed, 29 Dec 2010 23:52:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/12/29/hiv-results-birth-reminders-and-clinic-communication-malawi/</guid><description>&lt;p>I recently returned from a 6 week trip in Malawi, where I was heavily
involved in the implementation and deployment of &lt;a href="https://www.caktusgroup.com/portfolio/project/unicef-project-mwana/">Project
Mwana&lt;/a>, an Information and
Communication Technology (ICT) project focused on Maternal and Newborn
Child Health (MNCH). The project is currently running as a pilot in both
Zambia and Malawi. This post is a fairly technical overview of what the
project does and the way in which it was developed.&lt;/p></description></item><item><title>Simplifying the Testing of Unmanaged Database Models in Django (Updated for Django 4.2 in 2024)</title><link>https://www.caktusgroup.com/blog/2010/09/24/simplifying-the-testing-of-unmanaged-database-models-in-django/</link><pubDate>Fri, 24 Sep 2010 15:01:09 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/09/24/simplifying-the-testing-of-unmanaged-database-models-in-django/</guid><description>&lt;p>&lt;em>Editor's note: This post was originally published in September, 2010
and was updated in December, 2024 to incorporate changes in Django and
improvements suggested by our readers. It has also been tested for
compatibility as of the Django 4.2 release.&lt;/em>&lt;/p></description></item><item><title>Caktus Consulting Group Seeks Two Python/Django Web Developers</title><link>https://www.caktusgroup.com/blog/2010/09/03/caktus-consulting-group-seeks-two-python-django-web-developers/</link><pubDate>Fri, 03 Sep 2010 15:13:03 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/09/03/caktus-consulting-group-seeks-two-python-django-web-developers/</guid><description>&lt;p>I'm delighted to announce that &lt;a href="https://www.caktusgroup.com/">Caktus&lt;/a>
is looking for two Python and/or Django web developers to join our team
on a contract or part-time basis, with the potential for full-time work
in the future.&lt;/p></description></item><item><title>Caktus Consulting Group Sponsors DjangoCon 2010</title><link>https://www.caktusgroup.com/blog/2010/08/26/caktus-consulting-group-sponsors-djangocon-2010/</link><pubDate>Thu, 26 Aug 2010 17:50:45 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/08/26/caktus-consulting-group-sponsors-djangocon-2010/</guid><description>&lt;p>&lt;a href="http://djangocon.us" target="_blank" rel="noopener noreferrer">DjangoCon 2010&lt;/a> is just around the corner, and
I'm proud to announce that Caktus is sponsoring the conference again
this year!&lt;/p></description></item><item><title>Caktus Consulting Group Welcomes Lead Developer Karen Tracey</title><link>https://www.caktusgroup.com/blog/2010/08/12/caktus-consulting-group-welcomes-lead-developer-karen-tracey/</link><pubDate>Thu, 12 Aug 2010 19:10:43 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/08/12/caktus-consulting-group-welcomes-lead-developer-karen-tracey/</guid><description>&lt;p>I'm delighted to welcome Karey Tracey to our growing team of web
developers here at Caktus. Karen is a core developer of the Django web
framework and specializes in the development and testing of applications
for the web. She is also the author of &lt;a href="https://www.packtpub.com/django-1-1-testing-and-debugging/book" target="_blank" rel="noopener noreferrer">&lt;em>Django 1.1 Testing and
Debugging&lt;/em>&lt;/a>,
published by Packt Publishing in April, 2010.&lt;/p></description></item><item><title>Expanded services, portfolio, and more in the new Caktus web site</title><link>https://www.caktusgroup.com/blog/2010/06/07/expanded-services-portfolio-and-more-in-the-new-caktus-web-site/</link><pubDate>Mon, 07 Jun 2010 20:46:20 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/06/07/expanded-services-portfolio-and-more-in-the-new-caktus-web-site/</guid><description>&lt;p>We're pleased to announce the release of the latest and greatest Caktus
web presence yet. This edition features an enhanced &lt;a href="https://www.caktusgroup.com/services/">services
section&lt;/a> and &lt;a href="https://www.caktusgroup.com/portfolio/">portfolio&lt;/a>. Among other things,
the new site demonstrates how our &lt;a href="https://www.caktusgroup.com/content-management/">Django-based content management
system&lt;/a> can be used to connect related pages in
customized, innovative ways.&lt;/p></description></item><item><title>Caktus Consulting Group hosts 2nd Django sprint in NC Triangle area</title><link>https://www.caktusgroup.com/blog/2010/03/16/caktus-consulting-group-hosts-2nd-django-sprint-in-nc-triangle-area/</link><pubDate>Tue, 16 Mar 2010 16:36:31 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/03/16/caktus-consulting-group-hosts-2nd-django-sprint-in-nc-triangle-area/</guid><description>&lt;p>&lt;a href="http://www.djangoproject.com/" target="_blank" rel="noopener noreferrer">Django&lt;/a> is a tool we use every day to
build &lt;a href="https://www.caktusgroup.com/services/">fantastic web apps&lt;/a> here at Caktus, and a development
sprint is a concerted, focused period of time in which developers meet
in the same space to get things done on a project.&lt;/p></description></item><item><title>Decoupled Django Apps and the Beauty of Generic Relations</title><link>https://www.caktusgroup.com/blog/2010/03/11/decoupled-django-apps-and-the-beauty-of-generic-relations/</link><pubDate>Thu, 11 Mar 2010 21:18:02 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/03/11/decoupled-django-apps-and-the-beauty-of-generic-relations/</guid><description>&lt;p>Like just about everyone else, we've written our own suite of tools to
help with building complex content management systems in Django here at
&lt;a href="https://www.caktusgroup.com/services">Caktus&lt;/a>. We reviewed a number of the existing CMSes out
there, but in almost every case the navigation and page structure were
so tightly coupled the system broke down when it came time to add
additional, non-CMS pages.&lt;/p></description></item><item><title>Caktus Sends Team of Five to PyCon 2010 in Atlanta</title><link>https://www.caktusgroup.com/blog/2010/02/17/caktus-sends-team-of-five-to-pycon-2010-in-atlanta/</link><pubDate>Wed, 17 Feb 2010 18:08:30 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/02/17/caktus-sends-team-of-five-to-pycon-2010-in-atlanta/</guid><description>&lt;p>&lt;a href="http://www.python.org" target="_blank" rel="noopener noreferrer">Python&lt;/a> and
&lt;a href="http://www.djangoproject.org" target="_blank" rel="noopener noreferrer">Django&lt;/a> are tools we use on a daily basis
to build &lt;a href="https://www.caktusgroup.com/services/">fantastic web apps&lt;/a> here at Caktus. I'm pleased
to announce that Caktus is sending five developers--Colin, Alex, Mike,
Mark, and myself--to &lt;a href="http://us.pycon.org/2010/about/" target="_blank" rel="noopener noreferrer">PyCon 2010&lt;/a>!
PyCon is an annual gathering for users and developers of the open source
Python programming language. This year the US conference is being held
in Atlanta, GA. We'll be driving down tomorrow (Thursday) from Chapel
Hill, NC and staying for the conference weekend plus one day of the
sprints.&lt;/p></description></item><item><title>Caktus Consulting Group hosts Django sprint in Triangle, NC area</title><link>https://www.caktusgroup.com/blog/2009/12/06/caktus-consulting-group-hosts-django-sprint-in-triangle-nc-area/</link><pubDate>Sun, 06 Dec 2009 19:37:17 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/12/06/caktus-consulting-group-hosts-django-sprint-in-triangle-nc-area/</guid><description>&lt;p>&lt;a href="http://www.djangoproject.com/" target="_blank" rel="noopener noreferrer">Django&lt;/a> is a tool we use every day to
build &lt;a href="http://www.caktusgroup.com/services/" target="_blank" rel="noopener noreferrer">rock-solid web apps&lt;/a> here
at Caktus, and a development sprint is a concerted, focused period of
time in which developers meet in the same space to get things done on a
project.&lt;/p></description></item><item><title>Open Source Django Projects from Caktus Consulting Group</title><link>https://www.caktusgroup.com/blog/2009/09/07/open-source-django-apps-from-caktus-consulting-group/</link><pubDate>Mon, 07 Sep 2009 23:48:44 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/09/07/open-source-django-apps-from-caktus-consulting-group/</guid><description>&lt;p>At Caktus we're big fans of reusing code. We leverage many open source
projects--especially Django apps--to accomplish a variety of tasks. In
addition, we've written quite a few pluggable apps over the paste two
years that we reuse over and over again for different projects. As a way
of giving back to the community, we've polished and released a portion
of that code as open source ourselves. While some of the projects have
been available on Google Code for awhile now, we just put together a
consolidated list of &lt;a href="http://www.caktusgroup.com/portfolio/community/" target="_blank" rel="noopener noreferrer">open source Django
projects&lt;/a> on our web
site to serve as a jumping off point for all the projects we like, we
contributed to, and we created. Enjoy!&lt;/p></description></item><item><title>Caktus Consulting Group, LLC sponsors DjangoCon 2009</title><link>https://www.caktusgroup.com/blog/2009/09/05/djangocon-2009/</link><pubDate>Sun, 06 Sep 2009 03:58:29 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/09/05/djangocon-2009/</guid><description>&lt;p>&lt;a href="http://www.djangoproject.com/" target="_blank" rel="noopener noreferrer">Django&lt;/a> is a tool we use on a daily
basis to build &lt;a href="http://www.caktusgroup.com/services/" target="_blank" rel="noopener noreferrer">fantastic web
apps&lt;/a> here at Caktus, and
&lt;a href="http://www.djangocon.org" target="_blank" rel="noopener noreferrer">DjangoCon&lt;/a> is the annual conference for
Django developers and other community members. We are proud to announce
that Caktus Consulting Group, LLC is sponsoring DjangoCon 2009!&lt;/p></description></item><item><title>Creating recursive, symmetrical many-to-many relationships in Django</title><link>https://www.caktusgroup.com/blog/2009/08/14/creating-recursive-symmetrical-many-to-many-relationships-in-django/</link><pubDate>Fri, 14 Aug 2009 18:10:43 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/08/14/creating-recursive-symmetrical-many-to-many-relationships-in-django/</guid><description>&lt;p>In Django, a recursive many-to-many relationship is a &lt;code>ManyToManyField&lt;/code>
that points to the same model in which it's defined &lt;code>('self')&lt;/code>. A
symmetrical relationship is one in where, when &lt;code>a.contacts = [b]&lt;/code>, a is
in &lt;code>b.contacts&lt;/code>.&lt;/p></description></item><item><title>Towards a Standard for Django Session Messages</title><link>https://www.caktusgroup.com/blog/2009/06/19/towards-a-standard-for-django-session-messages/</link><pubDate>Fri, 19 Jun 2009 15:31:13 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/06/19/towards-a-standard-for-django-session-messages/</guid><description>&lt;p>Django needs a standard way in which session-specific messages can be created and retrieved for display to the user. For years we&amp;rsquo;ve been surviving using &lt;code>user.message_set&lt;/code> to store messages that are really specific to the current session, not the user, or using the latest and greatest Django snippet, pluggable app, or custom crafted middleware to handle messages in a more appropriate way.&lt;/p></description></item><item><title>Remote logging with Python logging and Django</title><link>https://www.caktusgroup.com/blog/2009/06/09/remote-logging-with-python-logging-and-django/</link><pubDate>Tue, 09 Jun 2009 12:47:10 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/06/09/remote-logging-with-python-logging-and-django/</guid><description>&lt;p>As part of my work on &lt;a href="http://www.everywatt.com/" target="_blank" rel="noopener noreferrer">EveryWatt&lt;/a>, our
fledgling energy monitoring web site, I needed a way to consolidate log
messages from all the data loggers we have running in a single place. If
you're not familiar with it, Python's &lt;a href="http://docs.python.org/library/logging.html" target="_blank" rel="noopener noreferrer">logging
module&lt;/a> is good stuff and
worth checking out. We already used it for logging to files locally, and
the module defines an
&lt;a href="http://docs.python.org/library/logging.html#logging.handlers.HTTPHandler" target="_blank" rel="noopener noreferrer">HTTPHandler&lt;/a>
that can deliver log messages to a remote server via HTTP.&lt;/p></description></item><item><title>Testing Django Views for Concurrency Issues (Updated for Django 4.2 in 2024)</title><link>https://www.caktusgroup.com/blog/2009/05/26/testing-django-views-for-concurrency-issues/</link><pubDate>Tue, 26 May 2009 19:59:25 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/05/26/testing-django-views-for-concurrency-issues/</guid><description>&lt;p>&lt;em>Editor's note: This post was originally published in May, 2009 and was
updated in December, 2024 to incorporate changes in Django and
improvements suggested by our readers. It has also been tested for
compatibility as of the Django 4.2 release.&lt;/em>&lt;/p></description></item><item><title>Parsing Microseconds in a Django Form</title><link>https://www.caktusgroup.com/blog/2009/05/26/parsing-microseconds-in-a-django-form/</link><pubDate>Tue, 26 May 2009 13:43:56 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/05/26/parsing-microseconds-in-a-django-form/</guid><description>&lt;p>There's currently no way to accept microsecond-precision input through
a Django form's DateTimeField. This is an &lt;a href="http://code.djangoproject.com/ticket/9459%20" target="_blank" rel="noopener noreferrer">acknowledged
bug&lt;/a>, but the official
solution might not come very soon, because the real fix is non-trivial.&lt;/p></description></item><item><title>Seamlessly switch off (and on) a Django (or other WSGI) site for upgrades</title><link>https://www.caktusgroup.com/blog/2009/05/25/seamlessly-switch-off-and-on-a-django-or-other-wsgi-site-for-upgrades/</link><pubDate>Mon, 25 May 2009 19:53:18 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/05/25/seamlessly-switch-off-and-on-a-django-or-other-wsgi-site-for-upgrades/</guid><description>&lt;p>In preparation for migrating the &lt;a href="http://www.everywatt.com" target="_blank" rel="noopener noreferrer">EveryWatt&lt;/a>
database from one machine to another, I wrote this little
&lt;a href="http://www.wsgi.org/wsgi/What_is_WSGI" target="_blank" rel="noopener noreferrer">WSGI&lt;/a> script to easily disable
the site while I copy the data. Since it doesn't depend on
&lt;a href="http://www.djangoproject.com/" target="_blank" rel="noopener noreferrer">Django&lt;/a> or really anything else (other
than a functioning WSGI server), you can use it for other upgrades, too.&lt;/p></description></item><item><title>Eclipse Ganymede and Subclipse on Ubuntu - JavaHL (JNI) not available</title><link>https://www.caktusgroup.com/blog/2009/05/21/eclipse-ganymede-and-subsclipe-on-ubuntu-javahl-jni-not-available/</link><pubDate>Thu, 21 May 2009 15:10:25 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/05/21/eclipse-ganymede-and-subsclipe-on-ubuntu-javahl-jni-not-available/</guid><description>&lt;p>I finally got around to updating my &lt;a href="http://www.eclipse.org" target="_blank" rel="noopener noreferrer">Eclipse&lt;/a>,
&lt;a href="http://pydev.sourceforge.net/" target="_blank" rel="noopener noreferrer">PyDev&lt;/a>, and
&lt;a href="http://subclipse.tigris.org/" target="_blank" rel="noopener noreferrer">Subclipse&lt;/a> environment today, which I use
for &lt;a href="http://www.djangoproject.com" target="_blank" rel="noopener noreferrer">Django&lt;/a> development.&lt;/p>
&lt;p>Formerly I was using the SvnKit (pure-Java) libraries. SvnKit &amp;quot;felt&amp;quot;
slow to me, compared to my command line SVN client, so this time I tried
to get the JavaHL (JNI) libraries working.&lt;/p></description></item><item><title>Downsizing an LVM/RAID root partition</title><link>https://www.caktusgroup.com/blog/2009/04/23/recovering-lvm-on-raid/</link><pubDate>Thu, 23 Apr 2009 20:04:03 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/04/23/recovering-lvm-on-raid/</guid><description>&lt;p>At Caktus we use
&lt;a href="http://en.wikipedia.org/wiki/Logical_Volume_Manager_%28Linux%29" target="_blank" rel="noopener noreferrer">LVM2&lt;/a> on a
&lt;a href="http://en.wikipedia.org/wiki/RAID_1#RAID_1" target="_blank" rel="noopener noreferrer">RAID1&lt;/a> device to ease disk
management on a number of our servers. Recently I needed to downsize the
root partition of one of the servers, so I rebooted onto an Ubuntu 8.10
LiveCD and attempted to load the RAID/LVM info.&lt;/p></description></item><item><title>Migrating from django-photologue 1.x to 2.x</title><link>https://www.caktusgroup.com/blog/2009/03/27/migrating-from-django-photologue-1x-to-2x/</link><pubDate>Fri, 27 Mar 2009 17:52:30 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/03/27/migrating-from-django-photologue-1x-to-2x/</guid><description>&lt;p>We're in the process of updating a web app for a client that was built
last year about this time using &lt;a href="http://www.djangoproject.com" target="_blank" rel="noopener noreferrer">Django&lt;/a>
and &lt;a href="http://code.google.com/p/django-photologue/" target="_blank" rel="noopener noreferrer">Photologue&lt;/a>. Needless
to say, there have been a lot of changes to both over the past year!&lt;/p></description></item><item><title>Solving NFS issues on embedded machines</title><link>https://www.caktusgroup.com/blog/2009/03/25/solving-nfs-issues-on-embedded-machines/</link><pubDate>Wed, 25 Mar 2009 16:07:27 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/03/25/solving-nfs-issues-on-embedded-machines/</guid><description>&lt;p>As part of my work on &lt;a href="http://www.everywatt.com" target="_blank" rel="noopener noreferrer">EveryWatt&lt;/a>, I setup an
NFS-based development environment for one of the data loggers we use for
energy monitoring in the Caktus office. The stock 2.4 Linux kernel in
the machine seemed to have some trouble mounting the file system root I
had exported from one of our servers. The symptoms included long delays
for most if not all activities that used the file system and lots of
messages like these in dmesg:&lt;/p></description></item><item><title>Why Caktus Uses Django</title><link>https://www.caktusgroup.com/blog/2009/01/13/why-caktus-uses-django/</link><pubDate>Tue, 13 Jan 2009 15:45:31 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/01/13/why-caktus-uses-django/</guid><description>&lt;p>Here at &lt;a href="http://www.caktusgroup.com/services/" target="_blank" rel="noopener noreferrer">Caktus&lt;/a>, we use the
popular &lt;a href="http://www.djangoproject.com" target="_blank" rel="noopener noreferrer">Django&lt;/a> web framework for a lot
of our custom web application development. We don't use Django simply
because it's popular, easy to learn, or happened to be the first thing
we found. We've written web apps in PHP, Java, and Ruby on Rails--all
before we discovered Django--but were never quite satisfied. Following
are just a few of the reasons that we both enjoy working with Django and
believe it gives you (the client) the best end-product.&lt;/p></description></item><item><title>Entering Contacts in CiviCRM</title><link>https://www.caktusgroup.com/blog/2008/11/05/entering-contacts-in-civicrm/</link><pubDate>Wed, 05 Nov 2008 20:29:51 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2008/11/05/entering-contacts-in-civicrm/</guid><description>&lt;p>One of our non-profit clients recently asked for help entering the
numerous business cards they get at trade shows, etc., into their
Customer Relationship Management database, a copy of
&lt;a href="http://www.civicrm.org" target="_blank" rel="noopener noreferrer">CiviCRM&lt;/a> that &lt;a href="http://www.caktusgroup.com/services/non-profit/" target="_blank" rel="noopener noreferrer">we setup and manage for
them&lt;/a>. The best path
for entering contacts isn't necessarily obvious from the get-go, but
the following procedure is the best we've found and has the lowest
up-front investment (you might be able to do something more efficient
with a Profile, but that doesn't seem as flexible with respect to
matching existing contacts).&lt;/p></description></item><item><title>Caktus' New Web Presence</title><link>https://www.caktusgroup.com/blog/2008/10/27/caktus-new-web-presence/</link><pubDate>Mon, 27 Oct 2008 14:11:22 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2008/10/27/caktus-new-web-presence/</guid><description>&lt;p>In honor of our recent one year anniversary (August 31st), we revamped
our web presence to address a couple concerns about the original site:&lt;/p></description></item><item><title>Free and Open Source security scanning software</title><link>https://www.caktusgroup.com/blog/2008/09/07/free-and-open-source-security-scanning-software/</link><pubDate>Sun, 07 Sep 2008 17:45:23 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2008/09/07/free-and-open-source-security-scanning-software/</guid><description>&lt;p>I was pretty disappointed when I discovered today that Nessus, the
security scanner I've used for many years now, had discontinued its
free plugin feed. The plugin feed is used to disseminate updated
security alerts in an automated fashion to the security scanner, as they
become available. The price tag on Nessus' new &amp;quot;Professional Feed&amp;quot;:
$1200.&lt;/p></description></item><item><title>Is Asterisk More Silent Than You'd Like?</title><link>https://www.caktusgroup.com/blog/2007/12/15/is-asterisk-more-silent-than-youd-like/</link><pubDate>Sat, 15 Dec 2007 19:06:01 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2007/12/15/is-asterisk-more-silent-than-youd-like/</guid><description>&lt;p>At Caktus, we use the &lt;a href="http://www.asterisk.org/" target="_blank" rel="noopener noreferrer">Asterisk&lt;/a> open source
telephony platform. While setting up Asterisk, we tested a number of
different system environments and configurations to help determine what
would best fit our telephone needs. This involved running Asterisk on
both real and virtual machines and testing several configuration front
ends, including &lt;a href="http://www.freepbx.org/" target="_blank" rel="noopener noreferrer">FreePBX&lt;/a> and
&lt;a href="http://destar.berlios.de/" target="_blank" rel="noopener noreferrer">DeStar&lt;/a>. This article discusses a fairly
technical problem we confronted while installing a basic Asterisk setup
on the Debian GNU/Linux operating system (on real hardware); namely,
when the ztdummy Linux kernel module was loaded, Asterisk was unable to
play back any recordings (even its own). When we unloaded the ztdummy
module, however, recordings would play back fine. The catch, of course,
was that we needed ztdummy loaded for conference room support.&lt;/p></description></item></channel></rss>