RustProof Labs: blogging for education (logo)
My book Mastering PostGIS and OpenStreetMap is available!

Visualizing Colorado's Growing Population: 2010 to 2016

By Ryan Lambert -- Published April 01, 2018

If you live in Colorado, you probably are familiar with a trend of quickly growing populations, more crowded traffic and hard-to-find homes. This post examines the change in population from 2010 to 2016 in Colorado using data from the American Community Survey. This analysis timeframe starts before the major boom really began and looks through the peak of growth in 2015.

... in 2015, when Colorado saw more than 100,000 new residents.

This map of Colorado shows growth occuring accross the majority of the counties in the state.  There are a few counties with losses in population.


Media in this Post

The medaia content in this post (maps and charts) are intended to be visual by nature. The bar charts included provide tooltips on hover (or a tap on mobile) and look great on devices of all makes and sizes. Included above each chart is a link to open that chart in a new browser tab. This provides a better on-screen experience with data-heavy charts.

The maps included in this post were saved as high resolution (600 dpi) PNG images. To see the full details on each map, right-click the image in your browser and open the image in a new tab. This allows you to zoom and pan around the displayed area.

Continue Reading

Security Incident - DNS Hijacking

By Ryan Lambert -- Published February 21, 2018

This post is intended to provide an accurate record and notification about a Security Incident (SI) that affected a RustProof Labs owned and operated website. The SI was a case of DNS Hijacking that took place on 2/19/2018 starting around 9:00 AM MST and affected all domains under the trackyourgarden.com domain. The SI was resolved by RustProof Labs staff and normal site operations were resumed at 3:20 PM MST on the same day.

No RustProof Labs owned data, systems, or servers were affected or compromised.

What Happened

In the early hours of 2/19/2018, I logged into our domain registrar's website in order to renew a couple domain names, one of them being the domain for Track Your Garden. While I was logged in, I double checked a few settings, one of them being that the domains were locked against accidental change. The settings were set correctly as I expected, I logged out, and went about my day. A few hours later at 1:50 PM I discovered that all Track Your Garden domains were throwing an invalid TLS certificate error.

Screenshot showing certificate error because the trackyourgraden.com domain was being routed to a domain with a *.domain.com certificate.

Continue Reading

PostgreSQL 10 Parallel Queries and Performance

By Ryan Lambert -- Published February 12, 2018

Last week I was reviewing my list of topic ideas and I didn't feel like writing about any of them. So I headed to the PostgreSQL Slack Channel to ask for ideas. One of the great topic ideas was to explore the performance of PostgreSQL 10's improved Parallel Query feature and that sounded like a lot of fun, and something I should consider anyway. This feature was introduced in Pg 9.6 but has seen major improvements in the latest version.

April 2019 update: I put parallel query in PostgreSQL 11 to the test on the Raspberry Pi 3B. Check it out!

Parallel query is enabled by default in PostgreSQL 10 and is controlled through the configuration value for max_parallel_workers_per_gather, set to 2 by default. To see more about configuring this feature, see this post.

Note: PostgreSQL changed their versioning policy with version 10.

Data for Testing

I decided to test this feature by loading the database of NOAA QCLCD weather data we've accumulated. There's about 10 years of daily weather observations in this database with that main table having nearly 4 million rows. This table is commonly joined to two tables, one storing the details about the weather station for each observation, the other linking to a calendar table.

Continue Reading

Database Anti-patterns: Performance Killers

By Ryan Lambert -- Published January 28, 2018

Databases are everywhere. They're in your computer, smartphone, WiFi enabled devices, and power all the web-driven technologies you use 24/7. Relational databases have the ability to provide incredible power, performance, reliance, and reporting. They also have the power to inflict severe pain, frustration, confusion and sleepless nights. You can expect the latter when a database is designed incorrectly.

This post attempts to summarize the most common, and most problematic relational database anti-patterns I have seen. These problems are not a technology problem; they are a training and experience problems. Some of these are mistakes I have made myself. Others I inherited in the form of a pre-existing system, and others still I was hired explicitly to fix.

Education is a Challenge

Relational database design, like cybersecurity, spans a wide range of very in-depth topics full of nuances and experience-driven decisions. In other words, there is a lot to learn and it isn't easy to teach. Another aspect of the problem is that database design isn't being taught very well, if at all, in typical database related coursework. Database courses focus on dry definitions of the various levels of normalization, yet spend zero effort teaching best practices for the design process or the decisions that go into determining the appropriate level of normalization.

Continue Reading

PostgreSQL Load Testing

By Ryan Lambert -- Published December 09, 2017

A recent conversation got me thinking about database performance, specifically PostgreSQL. Well, to be honest, I'm always thinking about databases and their performance. I've pushed PostgreSQL to load 500,000 records per second, compared PostgreSQL to MySQL, and more.

This conversation did make me decide it was time to put one of RustProof Labs' newest PostgreSQL databases to the test. The database is part of a new product we plan to go live with in Spring 2018. Now is the perfect time for us to do a final check of our estimates for how many users this system will be able to handle. If our assumptions were wrong we still have time to adjust.

Continue Reading

<-- Older Posts          Newer Posts -->