diff --git a/_includes/category-item.html b/_includes/category-item.html
new file mode 100644
index 0000000..f42eb14
--- /dev/null
+++ b/_includes/category-item.html
@@ -0,0 +1,7 @@
+
-
-
-
Practicing Ruby is proudly independent, open source, and advertising free.
If you insist on being asked for something in return, check out how to support my work.
+
+
Want to keep reading? Here are some recommendations...
+
-
diff --git a/_posts/2010-11-09-method-lookup-1.md b/_posts/2010-11-09-method-lookup-1.md
index bc63c9e..c3f4a74 100644
--- a/_posts/2010-11-09-method-lookup-1.md
+++ b/_posts/2010-11-09-method-lookup-1.md
@@ -2,7 +2,7 @@
layout: post
title: Ruby's method lookup path, Part 1
date: '2010-11-09'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/method-lookup-1
summary: Discover the complicated, multi-step dance that is the Ruby method lookup
diff --git a/_posts/2010-11-11-method-lookup-2.md b/_posts/2010-11-11-method-lookup-2.md
index 2ca5afe..f870968 100644
--- a/_posts/2010-11-11-method-lookup-2.md
+++ b/_posts/2010-11-11-method-lookup-2.md
@@ -2,7 +2,7 @@
layout: post
title: Ruby's method lookup path, Part 2
date: '2010-11-11'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/method-lookup-2
summary: Use your knowledge of Ruby's lookup path to determine where to add methods
diff --git a/_posts/2010-11-16-configurable-applications-1.md b/_posts/2010-11-16-configurable-applications-1.md
index f19935f..f344722 100644
--- a/_posts/2010-11-16-configurable-applications-1.md
+++ b/_posts/2010-11-16-configurable-applications-1.md
@@ -2,7 +2,7 @@
layout: post
title: Writing Configurable Applications, Part 1
date: '2010-11-16'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/configurable-applications-1
summary: Learn what not to do when configuring applications, then explore a simple
diff --git a/_posts/2010-11-18-configurable-applications-2.md b/_posts/2010-11-18-configurable-applications-2.md
index f8c1df4..abb345a 100644
--- a/_posts/2010-11-18-configurable-applications-2.md
+++ b/_posts/2010-11-18-configurable-applications-2.md
@@ -2,7 +2,7 @@
layout: post
title: Writing Configurable Applications, Part 2
date: '2010-11-18'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/configurable-applications-2
summary: Build dynamic Ruby-based configuration objects.
diff --git a/_posts/2010-11-25-testing-private-methods.md b/_posts/2010-11-25-testing-private-methods.md
index 4b7c575..6617433 100644
--- a/_posts/2010-11-25-testing-private-methods.md
+++ b/_posts/2010-11-25-testing-private-methods.md
@@ -2,7 +2,9 @@
layout: post
title: Testing Private Methods
date: '2010-11-25'
-categories: articles
+categories:
+ - ruby-quirks
+ - testing
author: Gregory Brown
permalink: articles/testing-private-methods
summary: Understand why testing private methods can be a code smell.
diff --git a/_posts/2010-12-01-meditations-on-bad-and-good-code-1.md b/_posts/2010-12-01-meditations-on-bad-and-good-code-1.md
index ab15713..04d3894 100644
--- a/_posts/2010-12-01-meditations-on-bad-and-good-code-1.md
+++ b/_posts/2010-12-01-meditations-on-bad-and-good-code-1.md
@@ -2,7 +2,9 @@
layout: post
title: Meditations on Bad and Good Code, Part 1
date: '2010-12-01'
-categories: articles
+categories:
+ - games
+ - maintenance
author: Gregory Brown
permalink: articles/meditations-on-bad-and-good-code-1
summary: Build an ugly tic-tac-toe game by writing the entire implementation as a
diff --git a/_posts/2010-12-03-meditations-on-bad-and-good-code-2.md b/_posts/2010-12-03-meditations-on-bad-and-good-code-2.md
index 6560a69..88c1583 100644
--- a/_posts/2010-12-03-meditations-on-bad-and-good-code-2.md
+++ b/_posts/2010-12-03-meditations-on-bad-and-good-code-2.md
@@ -2,7 +2,9 @@
layout: post
title: Meditations on Bad and Good Code, Part 2
date: '2010-12-03'
-categories: articles
+categories:
+ - games
+ - maintenance
author: Gregory Brown
permalink: articles/meditations-on-bad-and-good-code-2
summary: Read through a cleaned up version of the ugly "Tic Tac Toe" game created
diff --git a/_posts/2010-12-08-uses-for-modules-1.md b/_posts/2010-12-08-uses-for-modules-1.md
index 4b0ea1c..62ce574 100644
--- a/_posts/2010-12-08-uses-for-modules-1.md
+++ b/_posts/2010-12-08-uses-for-modules-1.md
@@ -2,7 +2,7 @@
layout: post
title: Uses for Modules, Part 1
date: '2010-12-08'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/uses-for-modules-1
summary: Use modules as namespaces for your libraries and applications.
diff --git a/_posts/2010-12-10-uses-for-modules-2.md b/_posts/2010-12-10-uses-for-modules-2.md
index 6a02d56..8e3c77e 100644
--- a/_posts/2010-12-10-uses-for-modules-2.md
+++ b/_posts/2010-12-10-uses-for-modules-2.md
@@ -2,7 +2,7 @@
layout: post
title: Uses for Modules, Part 2
date: '2010-12-10'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/uses-for-modules-2
summary: Use mixins as an alternative to multiple inheritance to augment class definitions.
diff --git a/_posts/2010-12-14-uses-for-modules-3.md b/_posts/2010-12-14-uses-for-modules-3.md
index 7c63ec8..bab837b 100644
--- a/_posts/2010-12-14-uses-for-modules-3.md
+++ b/_posts/2010-12-14-uses-for-modules-3.md
@@ -2,7 +2,7 @@
layout: post
title: Uses for Modules, Part 3
date: '2010-12-14'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/uses-for-modules-3
summary: See how modules can be used as namespaced function bags, and as singleton
diff --git a/_posts/2010-12-15-uses-for-modules-3a.md b/_posts/2010-12-15-uses-for-modules-3a.md
index 0a10240..b602d59 100644
--- a/_posts/2010-12-15-uses-for-modules-3a.md
+++ b/_posts/2010-12-15-uses-for-modules-3a.md
@@ -2,7 +2,7 @@
layout: post
title: Addendum to Uses For Modules, Part 3
date: '2010-12-15'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/uses-for-modules-3a
summary: Learn the subtle differences between "extend self", "def self.method", and
diff --git a/_posts/2010-12-16-uses-for-modules-4.md b/_posts/2010-12-16-uses-for-modules-4.md
index cc79ea3..50337f8 100644
--- a/_posts/2010-12-16-uses-for-modules-4.md
+++ b/_posts/2010-12-16-uses-for-modules-4.md
@@ -2,7 +2,7 @@
layout: post
title: Uses for Modules, Part 4
date: '2010-12-16'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/uses-for-modules-4
summary: Explore the use of mixins for customizing individual objects.
diff --git a/_posts/2010-12-21-rapid-prototyping.md b/_posts/2010-12-21-rapid-prototyping.md
index d6c1c36..1863260 100644
--- a/_posts/2010-12-21-rapid-prototyping.md
+++ b/_posts/2010-12-21-rapid-prototyping.md
@@ -2,7 +2,9 @@
layout: post
title: Rapid Prototyping
date: '2010-12-21'
-categories: articles
+categories:
+ - games
+ - building
author: Gregory Brown
permalink: articles/rapid-prototyping
summary: Build a tiny prototype of a tetris game on the command line.
diff --git a/_posts/2010-12-23-obfuscations-of-christmas-past.md b/_posts/2010-12-23-obfuscations-of-christmas-past.md
index 2afffbb..2723ee6 100644
--- a/_posts/2010-12-23-obfuscations-of-christmas-past.md
+++ b/_posts/2010-12-23-obfuscations-of-christmas-past.md
@@ -2,7 +2,7 @@
layout: post
title: Obfuscations of Christmas Past
date: '2010-12-23'
-categories: articles
+categories: everything-else
author: Gregory Brown
permalink: articles/obfuscations-of-christmas-past
summary: Tear apart an obfuscated Ruby program from Leah Neukirchen to learn
diff --git a/_posts/2010-12-28-duck-typing-in-practice-1.md b/_posts/2010-12-28-duck-typing-in-practice-1.md
index c48ea44..542f602 100644
--- a/_posts/2010-12-28-duck-typing-in-practice-1.md
+++ b/_posts/2010-12-28-duck-typing-in-practice-1.md
@@ -2,7 +2,7 @@
layout: post
title: Duck Typing in Practice, Part 1
date: '2010-12-28'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/duck-typing-in-practice-1
summary: Investigate the three main ways of doing type checking in Ruby, then work
diff --git a/_posts/2010-12-31-duck-typing-in-practice-2.md b/_posts/2010-12-31-duck-typing-in-practice-2.md
index a54df1c..cc35aba 100644
--- a/_posts/2010-12-31-duck-typing-in-practice-2.md
+++ b/_posts/2010-12-31-duck-typing-in-practice-2.md
@@ -2,7 +2,9 @@
layout: post
title: Duck Typing in Practice, Part 2
date: '2010-12-31'
-categories: articles
+categories:
+ - open-source
+ - ruby-quirks
author: Gregory Brown
permalink: articles/duck-typing-in-practice-2
summary: Examine real uses of Ruby's duck-typing capabilities in various open source
diff --git a/_posts/2011-01-03-ruby-hackers.md b/_posts/2011-01-03-ruby-hackers.md
index c988092..081a00d 100644
--- a/_posts/2011-01-03-ruby-hackers.md
+++ b/_posts/2011-01-03-ruby-hackers.md
@@ -2,7 +2,7 @@
layout: post
title: Interesting Ruby Hackers
date: '2011-01-03'
-categories: articles
+categories: spotlights
author: Gregory Brown
permalink: articles/ruby-hackers
summary: Find out which Ruby hackers consistently write great code worth reading.
diff --git a/_posts/2011-01-07-ruby-hacker-writers.md b/_posts/2011-01-07-ruby-hacker-writers.md
index ce923b8..8bad30d 100644
--- a/_posts/2011-01-07-ruby-hacker-writers.md
+++ b/_posts/2011-01-07-ruby-hacker-writers.md
@@ -2,7 +2,7 @@
layout: post
title: Interesting Ruby Hacker-Writers
date: '2011-01-07'
-categories: articles
+categories: spotlights
author: Gregory Brown
permalink: articles/ruby-hacker-writers
summary: Find out which Ruby hackers consistently write great content worth reading.
diff --git a/_posts/2011-01-14-dirty-testing-secrets.md b/_posts/2011-01-14-dirty-testing-secrets.md
index 0bcf421..1ee0e2a 100644
--- a/_posts/2011-01-14-dirty-testing-secrets.md
+++ b/_posts/2011-01-14-dirty-testing-secrets.md
@@ -2,7 +2,7 @@
layout: post
title: Dirty Little Secrets about Testing
date: '2011-01-14'
-categories: articles
+categories: testing
author: Gregory Brown
permalink: articles/dirty-testing-secrets
summary: Take a look at some dark corners of the traditional testing dogma.
diff --git a/_posts/2011-01-19-thoughts-on-mocking-1.md b/_posts/2011-01-19-thoughts-on-mocking-1.md
index 4985f90..caf8d45 100644
--- a/_posts/2011-01-19-thoughts-on-mocking-1.md
+++ b/_posts/2011-01-19-thoughts-on-mocking-1.md
@@ -2,7 +2,7 @@
layout: post
title: Thoughts on Mocking, Part 1
date: '2011-01-19'
-categories: articles
+categories: testing
author: Gregory Brown
permalink: articles/thoughts-on-mocking-1
summary: Consider how the ideas from Martin Fowler's "Mocks aren't Stubs" can be applied
diff --git a/_posts/2011-01-22-thoughts-on-mocking-2.md b/_posts/2011-01-22-thoughts-on-mocking-2.md
index 180a2c3..10ebf96 100644
--- a/_posts/2011-01-22-thoughts-on-mocking-2.md
+++ b/_posts/2011-01-22-thoughts-on-mocking-2.md
@@ -2,7 +2,7 @@
layout: post
title: Thoughts on Mocking, Part 2
date: '2011-01-22'
-categories: articles
+categories: testing
author: Gregory Brown
permalink: articles/thoughts-on-mocking-2
summary: Explore a few good uses of mock objects from a non-mockist's perspective.
diff --git a/_posts/2011-01-26-how-to-practice-1.md b/_posts/2011-01-26-how-to-practice-1.md
index 48014be..ad3c1db 100644
--- a/_posts/2011-01-26-how-to-practice-1.md
+++ b/_posts/2011-01-26-how-to-practice-1.md
@@ -2,7 +2,7 @@
layout: post
title: How to practice, Part 1
date: '2011-01-26'
-categories: articles
+categories: everything-else
author: Gregory Brown
permalink: articles/how-to-practice-1
summary: Discover a new way to practice your coding skills by asking yourself the
diff --git a/_posts/2011-01-28-how-to-practice-2.md b/_posts/2011-01-28-how-to-practice-2.md
index d89b0cf..a60f499 100644
--- a/_posts/2011-01-28-how-to-practice-2.md
+++ b/_posts/2011-01-28-how-to-practice-2.md
@@ -2,7 +2,7 @@
layout: post
title: How to practice, Part 2
date: '2011-01-28'
-categories: articles
+categories: everything-else
author: Gregory Brown
permalink: articles/how-to-practice-2
summary: 'See an example of how the practice methods outlined in Issue 1.21 can be
diff --git a/_posts/2011-02-05-solid-design-principles.md b/_posts/2011-02-05-solid-design-principles.md
index d8090cd..06742b5 100644
--- a/_posts/2011-02-05-solid-design-principles.md
+++ b/_posts/2011-02-05-solid-design-principles.md
@@ -2,7 +2,7 @@
layout: post
title: SOLID Design Principles
date: '2011-02-05'
-categories: articles
+categories: software-design
author: Gregory Brown
permalink: articles/solid-design-principles
summary: Work through code samples inspired by Sandi Metz's "SOLID Object-oriented
diff --git a/_posts/2011-02-11-connascence.md b/_posts/2011-02-11-connascence.md
index 3ecd370..50f6128 100644
--- a/_posts/2011-02-11-connascence.md
+++ b/_posts/2011-02-11-connascence.md
@@ -2,7 +2,7 @@
layout: post
title: Connascence as a Software Design Metric
date: '2011-02-11'
-categories: articles
+categories: software-design
author: Gregory Brown
permalink: articles/connascence
summary: Work through code samples inspired by Jim Weirich's "Building Blocks of Modularity"
diff --git a/_posts/2011-02-22-creational-design-patterns.md b/_posts/2011-02-22-creational-design-patterns.md
index 9afd718..051a0f3 100644
--- a/_posts/2011-02-22-creational-design-patterns.md
+++ b/_posts/2011-02-22-creational-design-patterns.md
@@ -2,7 +2,7 @@
layout: post
title: Creational Design Patterns
date: '2011-02-22'
-categories: articles
+categories: software-design
author: Gregory Brown
permalink: articles/creational-design-patterns
summary: Examine a use case for each of the classic creational design patterns laid
diff --git a/_posts/2011-02-28-structural-design-patterns.md b/_posts/2011-02-28-structural-design-patterns.md
index 8ba535a..3eefa49 100644
--- a/_posts/2011-02-28-structural-design-patterns.md
+++ b/_posts/2011-02-28-structural-design-patterns.md
@@ -2,7 +2,7 @@
layout: post
title: Structural Design Patterns
date: '2011-02-28'
-categories: articles
+categories: software-design
author: Gregory Brown
permalink: articles/structural-design-patterns
summary: Examine a use case for each of the classic structural design patterns laid
diff --git a/_posts/2011-08-23-ways-to-load-code.md b/_posts/2011-08-23-ways-to-load-code.md
index aaa0179..db45c0a 100644
--- a/_posts/2011-08-23-ways-to-load-code.md
+++ b/_posts/2011-08-23-ways-to-load-code.md
@@ -2,7 +2,7 @@
layout: post
title: Ways to load code
date: '2011-08-23'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/ways-to-load-code
summary: Explore the strengths and weaknesses of the many code loading mechanisms
diff --git a/_posts/2011-08-30-attacking-sticky-problems.md b/_posts/2011-08-30-attacking-sticky-problems.md
index a4740ab..ad6e19e 100644
--- a/_posts/2011-08-30-attacking-sticky-problems.md
+++ b/_posts/2011-08-30-attacking-sticky-problems.md
@@ -2,7 +2,7 @@
layout: post
title: How to attack sticky problems
date: '2011-08-30'
-categories: articles
+categories: problem-solving
author: Gregory Brown
permalink: articles/attacking-sticky-problems
summary: Work through a few lessons that will help you find a starting point whenever
diff --git a/_posts/2011-09-06-closures-are-complicated.md b/_posts/2011-09-06-closures-are-complicated.md
index cb6f7e2..7e77ab7 100644
--- a/_posts/2011-09-06-closures-are-complicated.md
+++ b/_posts/2011-09-06-closures-are-complicated.md
@@ -2,7 +2,7 @@
layout: post
title: A closure is a double edged sword
date: '2011-09-06'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/closures-are-complicated
summary: Discover why the closure property can sometimes lead to hard-to-spot memory
diff --git a/_posts/2011-09-13-building-enumerable-and-enumerator.md b/_posts/2011-09-13-building-enumerable-and-enumerator.md
index 8474184..c920d4d 100644
--- a/_posts/2011-09-13-building-enumerable-and-enumerator.md
+++ b/_posts/2011-09-13-building-enumerable-and-enumerator.md
@@ -2,7 +2,7 @@
layout: post
title: Building Enumerable & Enumerator in Ruby
date: '2011-09-13'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/building-enumerable-and-enumerator
summary: Learn about Ruby's powerful iteration tools by implementing some of its functionality
diff --git a/_posts/2011-09-20-regession-testing.md b/_posts/2011-09-20-regession-testing.md
index 471b22c..4631acc 100644
--- a/_posts/2011-09-20-regession-testing.md
+++ b/_posts/2011-09-20-regession-testing.md
@@ -2,7 +2,7 @@
layout: post
title: Thoughts on regression testing
date: '2011-09-20'
-categories: articles
+categories: testing
author: Gregory Brown
permalink: articles/regession-testing
summary: Benefit from two lessons about regression testing that were learned the hard
diff --git a/_posts/2011-09-27-learning-new-things-step-by-step.md b/_posts/2011-09-27-learning-new-things-step-by-step.md
index 822c474..b535861 100644
--- a/_posts/2011-09-27-learning-new-things-step-by-step.md
+++ b/_posts/2011-09-27-learning-new-things-step-by-step.md
@@ -2,7 +2,9 @@
layout: post
title: Learning new things step-by-step
date: '2011-09-27'
-categories: articles
+categories:
+ - games
+ - problem-solving
author: Gregory Brown
permalink: articles/learning-new-things-step-by-step
summary: Build a simple arcade game in 13 tiny steps.
diff --git a/_posts/2011-10-04-unobtrusive-ruby-in-practice.md b/_posts/2011-10-04-unobtrusive-ruby-in-practice.md
index b86d2e0..c0a649d 100644
--- a/_posts/2011-10-04-unobtrusive-ruby-in-practice.md
+++ b/_posts/2011-10-04-unobtrusive-ruby-in-practice.md
@@ -2,7 +2,7 @@
layout: post
title: '"Unobtrusive Ruby" in Practice'
date: '2011-10-04'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/unobtrusive-ruby-in-practice
summary: Explore ideas from Mike Burns's "Unobtrusive Ruby" blog post via practical
diff --git a/_posts/2011-10-11-ruby-and-the-singleton-pattern-dont-get-along.md b/_posts/2011-10-11-ruby-and-the-singleton-pattern-dont-get-along.md
index 1182993..72e5024 100644
--- a/_posts/2011-10-11-ruby-and-the-singleton-pattern-dont-get-along.md
+++ b/_posts/2011-10-11-ruby-and-the-singleton-pattern-dont-get-along.md
@@ -2,7 +2,7 @@
layout: post
title: Ruby and the singleton pattern don't get along
date: '2011-10-11'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/ruby-and-the-singleton-pattern-dont-get-along
summary: Model the singleton pattern in seven different ways, without discovering
diff --git a/_posts/2011-10-18-building-unix-style-command-line-applications.md b/_posts/2011-10-18-building-unix-style-command-line-applications.md
index e918a41..9efd94d 100644
--- a/_posts/2011-10-18-building-unix-style-command-line-applications.md
+++ b/_posts/2011-10-18-building-unix-style-command-line-applications.md
@@ -2,7 +2,9 @@
layout: post
title: Building Unix-style command line applications
date: '2011-10-18'
-categories: articles
+categories:
+ - building
+ - ruby-quirks
author: Gregory Brown
permalink: articles/building-unix-style-command-line-applications
summary: Build a basic clone of the 'cat' utility while learning some Ruby idioms
diff --git a/_posts/2011-10-27-from-requirements-discovery-to-release.md b/_posts/2011-10-27-from-requirements-discovery-to-release.md
index 2babebf..bae3375 100644
--- a/_posts/2011-10-27-from-requirements-discovery-to-release.md
+++ b/_posts/2011-10-27-from-requirements-discovery-to-release.md
@@ -2,7 +2,10 @@
layout: post
title: From requirements discovery to release
date: '2011-10-27'
-categories: articles
+categories:
+ - games
+ - problem-solving
+ - software-design
author: Gregory Brown
permalink: articles/from-requirements-discovery-to-release
summary: Watch a small game project develop from the brainstorming phase to its first
diff --git a/_posts/2011-11-02-domain-specific-apis.md b/_posts/2011-11-02-domain-specific-apis.md
index d34f99b..7996a18 100644
--- a/_posts/2011-11-02-domain-specific-apis.md
+++ b/_posts/2011-11-02-domain-specific-apis.md
@@ -2,7 +2,9 @@
layout: post
title: Domain specific API construction
date: '2011-11-02'
-categories: articles
+categories:
+ - domain-modeling
+ - ruby-quirks
author: Gregory Brown
permalink: articles/domain-specific-apis
summary: Master classic Ruby DSL design patterns by ripping off well-known libraries
diff --git a/_posts/2011-11-09-binary-file-formats.md b/_posts/2011-11-09-binary-file-formats.md
index 11187ed..b71e49b 100644
--- a/_posts/2011-11-09-binary-file-formats.md
+++ b/_posts/2011-11-09-binary-file-formats.md
@@ -2,7 +2,7 @@
layout: post
title: Working with binary file formats
date: '2011-11-09'
-categories: articles
+categories: cs-concepts
author: Gregory Brown
permalink: articles/binary-file-formats
summary: Read and write bitmap files using only a few dozen lines of Ruby code.
diff --git a/_posts/2011-11-23-arguments-and-results-1.md b/_posts/2011-11-23-arguments-and-results-1.md
index 55dbf34..7afdbcd 100644
--- a/_posts/2011-11-23-arguments-and-results-1.md
+++ b/_posts/2011-11-23-arguments-and-results-1.md
@@ -2,7 +2,7 @@
layout: post
title: Thoughts on "Arguments and Results", Part 1
date: '2011-11-23'
-categories: articles
+categories: domain-modeling
author: Gregory Brown
permalink: articles/arguments-and-results-1
summary: Work through argument objects inspired by James Noble's classic "Arguments
diff --git a/_posts/2011-11-30-arguments-and-results-2.md b/_posts/2011-11-30-arguments-and-results-2.md
index 4345f53..43d368d 100644
--- a/_posts/2011-11-30-arguments-and-results-2.md
+++ b/_posts/2011-11-30-arguments-and-results-2.md
@@ -2,7 +2,7 @@
layout: post
title: Thoughts on "Arguments and Results", Part 2
date: '2011-11-30'
-categories: articles
+categories: domain-modeling
author: Gregory Brown
permalink: articles/arguments-and-results-2
summary: Work through result objects inspired by James Noble's classic "Arguments
diff --git a/_posts/2012-01-03-qualities-of-great-software.md b/_posts/2012-01-03-qualities-of-great-software.md
index 9f4003d..25e2f57 100644
--- a/_posts/2012-01-03-qualities-of-great-software.md
+++ b/_posts/2012-01-03-qualities-of-great-software.md
@@ -2,7 +2,7 @@
layout: post
title: The qualities of great software
date: '2012-01-03'
-categories: articles
+categories: maintenance
author: Gregory Brown
permalink: articles/qualities-of-great-software
summary: See what ISO/IEC 9126 has to say about software quality, and how its metrics
diff --git a/_posts/2012-01-10-patterns-for-building-excellent-examples.md b/_posts/2012-01-10-patterns-for-building-excellent-examples.md
index 5850c03..faa826d 100644
--- a/_posts/2012-01-10-patterns-for-building-excellent-examples.md
+++ b/_posts/2012-01-10-patterns-for-building-excellent-examples.md
@@ -2,7 +2,7 @@
layout: post
title: Patterns for building excellent examples
date: '2012-01-10'
-categories: articles
+categories: communication
author: Gregory Brown
permalink: articles/patterns-for-building-excellent-examples
summary: Learn how to write code samples that clearly communicate ideas to other programmers.
diff --git a/_posts/2012-01-17-exploring-a-turing-tarpit.md b/_posts/2012-01-17-exploring-a-turing-tarpit.md
index e4bfa7b..925f37b 100644
--- a/_posts/2012-01-17-exploring-a-turing-tarpit.md
+++ b/_posts/2012-01-17-exploring-a-turing-tarpit.md
@@ -2,7 +2,7 @@
layout: post
title: Exploring the depths of a Turing tarpit
date: '2012-01-17'
-categories: articles
+categories: cs-concepts
author: Gregory Brown
permalink: articles/exploring-a-turing-tarpit
summary: Read the code for a simple Brainf*ck interpreter and think about how it might
diff --git a/_posts/2012-01-25-spiral-staircase-of-refactoring.md b/_posts/2012-01-25-spiral-staircase-of-refactoring.md
index 352ff3f..e3e2102 100644
--- a/_posts/2012-01-25-spiral-staircase-of-refactoring.md
+++ b/_posts/2012-01-25-spiral-staircase-of-refactoring.md
@@ -2,7 +2,7 @@
layout: post
title: Building a better Turing tarpit
date: '2012-01-25'
-categories: articles
+categories: cs-concepts
author: Gregory Brown
permalink: articles/spiral-staircase-of-refactoring
summary: In this issue, we improve the design of the Brainf*ck interpreter that was
diff --git a/_posts/2012-02-02-framework-design-and-implementation-1.md b/_posts/2012-02-02-framework-design-and-implementation-1.md
index 01e4a6c..6f21dd5 100644
--- a/_posts/2012-02-02-framework-design-and-implementation-1.md
+++ b/_posts/2012-02-02-framework-design-and-implementation-1.md
@@ -2,7 +2,7 @@
layout: post
title: Framework design and implementation, Part 1
date: '2012-02-02'
-categories: articles
+categories: software-design
author: Gregory Brown
permalink: articles/framework-design-and-implementation-1
summary: Dig through the Newman mail framework's source code in search of useful patterns
diff --git a/_posts/2012-02-08-framework-design-and-implementation-2.md b/_posts/2012-02-08-framework-design-and-implementation-2.md
index d8ed7f5..beb61b1 100644
--- a/_posts/2012-02-08-framework-design-and-implementation-2.md
+++ b/_posts/2012-02-08-framework-design-and-implementation-2.md
@@ -2,7 +2,7 @@
layout: post
title: Framework design and implementation, Part 2
date: '2012-02-08'
-categories: articles
+categories: software-design
author: Gregory Brown
permalink: articles/framework-design-and-implementation-2
summary: Explore some lessons learned the hard way in developing the Newman mail framework.
diff --git a/_posts/2012-02-15-disciplined-inheritance-1.md b/_posts/2012-02-15-disciplined-inheritance-1.md
index f03a500..55d550d 100644
--- a/_posts/2012-02-15-disciplined-inheritance-1.md
+++ b/_posts/2012-02-15-disciplined-inheritance-1.md
@@ -2,7 +2,7 @@
layout: post
title: Criteria for disciplined inheritance, Part 1
date: '2012-02-15'
-categories: articles
+categories: domain-modeling
author: Gregory Brown
permalink: articles/disciplined-inheritance-1
summary: See how M. Sakkinen's notion of "Disciplined Inheritance" in 1989 still applies
diff --git a/_posts/2012-02-21-disciplined-inheritance-2.md b/_posts/2012-02-21-disciplined-inheritance-2.md
index 0fe2026..7173d9d 100644
--- a/_posts/2012-02-21-disciplined-inheritance-2.md
+++ b/_posts/2012-02-21-disciplined-inheritance-2.md
@@ -2,7 +2,7 @@
layout: post
title: Criteria for disciplined inheritance, Part 2
date: '2012-02-21'
-categories: articles
+categories: domain-modeling
author: Gregory Brown
permalink: articles/disciplined-inheritance-2
summary: Discover how Barbara Liskov's concept of "behavioral subtypes" apply to object
diff --git a/_posts/2012-02-28-using-games-to-practice-domain-modeling.md b/_posts/2012-02-28-using-games-to-practice-domain-modeling.md
index fc7b974..056f050 100644
--- a/_posts/2012-02-28-using-games-to-practice-domain-modeling.md
+++ b/_posts/2012-02-28-using-games-to-practice-domain-modeling.md
@@ -2,7 +2,9 @@
layout: post
title: Using games to practice domain modeling
date: '2012-02-28'
-categories: articles
+categories:
+ - games
+ - domain-modeling
author: Gregory Brown
permalink: articles/using-games-to-practice-domain-modeling
summary: Learn about modeling non-trivial business logic by implementing Minecraft's
diff --git a/_posts/2012-03-13-coding-in-the-danger-zone.md b/_posts/2012-03-13-coding-in-the-danger-zone.md
index 2e19f60..d11bec7 100644
--- a/_posts/2012-03-13-coding-in-the-danger-zone.md
+++ b/_posts/2012-03-13-coding-in-the-danger-zone.md
@@ -2,7 +2,7 @@
layout: post
title: Lessons learned from coding in the danger zone
date: '2012-03-13'
-categories: articles
+categories: maintenance
author: Gregory Brown
permalink: articles/coding-in-the-danger-zone
summary: Establish a few survival skills for working in hostile programming environments.
diff --git a/_posts/2012-04-10-tdd-costs-and-benefits.md b/_posts/2012-04-10-tdd-costs-and-benefits.md
index 410cc60..c5a45e1 100644
--- a/_posts/2012-04-10-tdd-costs-and-benefits.md
+++ b/_posts/2012-04-10-tdd-costs-and-benefits.md
@@ -2,7 +2,7 @@
layout: post
title: What are the costs and benefits of TDD?
date: '2012-04-10'
-categories: articles
+categories: testing
author: Gregory Brown
permalink: articles/tdd-costs-and-benefits
summary: Think through how to evaluate the impact of test-driven development on your
diff --git a/_posts/2012-05-10-tricks-for-working-with-text-and-files.md b/_posts/2012-05-10-tricks-for-working-with-text-and-files.md
index e5eaa2f..8f9cd70 100644
--- a/_posts/2012-05-10-tricks-for-working-with-text-and-files.md
+++ b/_posts/2012-05-10-tricks-for-working-with-text-and-files.md
@@ -2,7 +2,9 @@
layout: post
title: Tricks for working with text and files
date: '2012-05-10'
-categories: articles
+categories:
+ - ruby-quirks
+ - working-with-data
author: Gregory Brown
permalink: articles/tricks-for-working-with-text-and-files
summary: Tear apart a minimal clone of the Jekyll blog engine in search of helpful
diff --git a/_posts/2012-05-15-solving-the-scoring-predictions-kata.md b/_posts/2012-05-15-solving-the-scoring-predictions-kata.md
index bc405e2..702205f 100644
--- a/_posts/2012-05-15-solving-the-scoring-predictions-kata.md
+++ b/_posts/2012-05-15-solving-the-scoring-predictions-kata.md
@@ -2,7 +2,7 @@
layout: post
title: Solving the "Scoring Predictions" kata
date: '2012-05-15'
-categories: articles
+categories: problem-solving
author: James Edward Gray II
permalink: articles/solving-the-scoring-predictions-kata
summary: Work through a coding puzzle and learn some fun tricks along the way. (w.
diff --git a/_posts/2012-05-21-persisting-relations-in-a-polyglot-world.md b/_posts/2012-05-21-persisting-relations-in-a-polyglot-world.md
index 220fcc9..96f4d0f 100644
--- a/_posts/2012-05-21-persisting-relations-in-a-polyglot-world.md
+++ b/_posts/2012-05-21-persisting-relations-in-a-polyglot-world.md
@@ -2,7 +2,7 @@
layout: post
title: Persisting relations in a polyglot world
date: '2012-05-21'
-categories: articles
+categories: cs-concepts
author: Piotr Szotkowski
permalink: articles/persisting-relations-in-a-polyglot-world
summary: Explore some non-traditional persistence mechanisms and their uses. (w.
diff --git a/_posts/2012-06-05-confident-ruby.md b/_posts/2012-06-05-confident-ruby.md
index 327b923..ad5240a 100644
--- a/_posts/2012-06-05-confident-ruby.md
+++ b/_posts/2012-06-05-confident-ruby.md
@@ -2,7 +2,7 @@
layout: post
title: Writing confident code
date: '2012-06-05'
-categories: articles
+categories: communication
author: Avdi Grimm
permalink: articles/confident-ruby
summary: Develop intention-revealing code that is confident about its responsibilities.
diff --git a/_posts/2012-06-12-implementing-the-active-record-pattern-1.md b/_posts/2012-06-12-implementing-the-active-record-pattern-1.md
index f1af8bb..746f068 100644
--- a/_posts/2012-06-12-implementing-the-active-record-pattern-1.md
+++ b/_posts/2012-06-12-implementing-the-active-record-pattern-1.md
@@ -2,7 +2,7 @@
layout: post
title: Implementing the Active Record pattern, Part 1
date: '2012-06-12'
-categories: articles
+categories: software-design
author: Gregory Brown
permalink: articles/implementing-the-active-record-pattern-1
summary: Build a basic foundation to serve as the groundwork for implementing an ActiveRecord-style
diff --git a/_posts/2012-06-19-hidden-costs-of-inheritance.md b/_posts/2012-06-19-hidden-costs-of-inheritance.md
index 23aa360..949060c 100644
--- a/_posts/2012-06-19-hidden-costs-of-inheritance.md
+++ b/_posts/2012-06-19-hidden-costs-of-inheritance.md
@@ -2,7 +2,7 @@
layout: post
title: The hidden costs of inheritance
date: '2012-06-19'
-categories: articles
+categories: software-design
author: Gregory Brown
permalink: articles/hidden-costs-of-inheritance
summary: Think through some problems with inheritance-based modeling and then try
diff --git a/_posts/2012-07-03-implementing-the-active-record-pattern-2.md b/_posts/2012-07-03-implementing-the-active-record-pattern-2.md
index 43885f8..0346398 100644
--- a/_posts/2012-07-03-implementing-the-active-record-pattern-2.md
+++ b/_posts/2012-07-03-implementing-the-active-record-pattern-2.md
@@ -2,7 +2,7 @@
layout: post
title: Implementing the Active Record pattern, Part 2
date: '2012-07-03'
-categories: articles
+categories: software-design
author: Gregory Brown
permalink: articles/implementing-the-active-record-pattern-2
summary: Consider using "object-oriented mixins" to reduce inheritance-related problems
diff --git a/_posts/2012-07-10-responsibility-centric-vs-data-centric-design.md b/_posts/2012-07-10-responsibility-centric-vs-data-centric-design.md
index 88c6658..e89cbf4 100644
--- a/_posts/2012-07-10-responsibility-centric-vs-data-centric-design.md
+++ b/_posts/2012-07-10-responsibility-centric-vs-data-centric-design.md
@@ -2,7 +2,10 @@
layout: post
title: Responsibility-centric vs. data-centric design
date: '2012-07-10'
-categories: articles
+categories:
+ - domain-modeling
+ - software-design
+ - working-with-data
author: Greg Moeck
permalink: articles/responsibility-centric-vs-data-centric-design
summary: Work through two approaches to object modeling and examine their tradeoffs.
diff --git a/_posts/2012-07-17-tdd-lessons-learned.md b/_posts/2012-07-17-tdd-lessons-learned.md
index 2ea4bd5..efa8e3d 100644
--- a/_posts/2012-07-17-tdd-lessons-learned.md
+++ b/_posts/2012-07-17-tdd-lessons-learned.md
@@ -2,7 +2,7 @@
layout: post
title: Lessons learned from my TDD self-study
date: '2012-07-17'
-categories: articles
+categories: testing
author: Gregory Brown
permalink: articles/tdd-lessons-learned
summary: Revisit the reasons for Gregory's 90-day self-study on TDD, and see the results.
diff --git a/_posts/2012-07-18-end-to-end-testing-is-essential.md b/_posts/2012-07-18-end-to-end-testing-is-essential.md
index cfa473a..f7224de 100644
--- a/_posts/2012-07-18-end-to-end-testing-is-essential.md
+++ b/_posts/2012-07-18-end-to-end-testing-is-essential.md
@@ -2,7 +2,7 @@
layout: post
title: End-to-end testing is essential
date: '2012-07-18'
-categories: articles
+categories: testing
author: Gregory Brown
permalink: articles/end-to-end-testing-is-essential
summary: Build acceptance tests that reflect application behavior, rather than implementation
diff --git a/_posts/2012-07-19-refactoring-is-not-redesign.md b/_posts/2012-07-19-refactoring-is-not-redesign.md
index 29a468a..0aba5d8 100644
--- a/_posts/2012-07-19-refactoring-is-not-redesign.md
+++ b/_posts/2012-07-19-refactoring-is-not-redesign.md
@@ -2,7 +2,7 @@
layout: post
title: Refactoring is not redesign
date: '2012-07-19'
-categories: articles
+categories: testing
author: Gregory Brown
permalink: articles/refactoring-is-not-redesign
summary: 'Discover how the differences between refactoring and redesign affect testing
diff --git a/_posts/2012-07-24-mock-objects-deeply-influence-design.md b/_posts/2012-07-24-mock-objects-deeply-influence-design.md
index 0f40d63..82b3859 100644
--- a/_posts/2012-07-24-mock-objects-deeply-influence-design.md
+++ b/_posts/2012-07-24-mock-objects-deeply-influence-design.md
@@ -2,7 +2,7 @@
layout: post
title: Mock objects deeply influence design
date: '2012-07-24'
-categories: articles
+categories: testing
author: Gregory Brown
permalink: articles/mock-objects-deeply-influence-design
summary: Learn the rules that you need to follow in order to use mock objects as an
diff --git a/_posts/2012-07-26-spiking-is-not-cowboy-coding.md b/_posts/2012-07-26-spiking-is-not-cowboy-coding.md
index a822943..5462cfb 100644
--- a/_posts/2012-07-26-spiking-is-not-cowboy-coding.md
+++ b/_posts/2012-07-26-spiking-is-not-cowboy-coding.md
@@ -2,7 +2,7 @@
layout: post
title: Spiking is not cowboy coding
date: '2012-07-26'
-categories: articles
+categories: testing
author: Gregory Brown
permalink: articles/spiking-is-not-cowboy-coding
summary: Search for the boundary lines between organized chaos and wild, unstructured
diff --git a/_posts/2012-08-07-intro-to-basic-statistical-methods.md b/_posts/2012-08-07-intro-to-basic-statistical-methods.md
index 7e6eca6..996880d 100644
--- a/_posts/2012-08-07-intro-to-basic-statistical-methods.md
+++ b/_posts/2012-08-07-intro-to-basic-statistical-methods.md
@@ -2,7 +2,7 @@
layout: post
title: A practical application of basic statistical methods
date: '2012-08-07'
-categories: articles
+categories: working-with-data
author: Jia Wu
permalink: articles/intro-to-basic-statistical-methods
summary: Crunch some numbers to see how Olympic medal wins relate to GDP and population.
diff --git a/_posts/2012-08-19-temporal-coupling-and-the-law-of-demeter.md b/_posts/2012-08-19-temporal-coupling-and-the-law-of-demeter.md
index 76ad774..210916d 100644
--- a/_posts/2012-08-19-temporal-coupling-and-the-law-of-demeter.md
+++ b/_posts/2012-08-19-temporal-coupling-and-the-law-of-demeter.md
@@ -2,7 +2,7 @@
layout: post
title: Temporal coupling and the Law of Demeter
date: '2012-08-19'
-categories: articles
+categories: software-design
author: Gregory Brown
permalink: articles/temporal-coupling-and-the-law-of-demeter
summary: See how NASA JPL's take on the Law of Demeter simplifies building robust
diff --git a/_posts/2012-09-04-event-loops-demystified.md b/_posts/2012-09-04-event-loops-demystified.md
index 24c958d..c185ff9 100644
--- a/_posts/2012-09-04-event-loops-demystified.md
+++ b/_posts/2012-09-04-event-loops-demystified.md
@@ -2,7 +2,7 @@
layout: post
title: Event loops demystified
date: '2012-09-04'
-categories: articles
+categories: cs-concepts
author: Magnus Holm
permalink: articles/event-loops-demystified
summary: Build a Node.js/EventMachine-style event loop in roughly 150 lines of Ruby
diff --git a/_posts/2012-09-18-building-the-rstatus-api.md b/_posts/2012-09-18-building-the-rstatus-api.md
index 3ed75b4..48a94c3 100644
--- a/_posts/2012-09-18-building-the-rstatus-api.md
+++ b/_posts/2012-09-18-building-the-rstatus-api.md
@@ -2,7 +2,7 @@
layout: post
title: 'Building the rstat.us API: Choices and challenges'
date: '2012-09-18'
-categories: articles
+categories: software-design
author: Carol Nichols
permalink: articles/building-the-rstatus-api
summary: Consider the design tradeoffs between the JSON API and hypermedia API styles.
diff --git a/_posts/2012-10-02-process-spawning-patterns.md b/_posts/2012-10-02-process-spawning-patterns.md
index 2504d6d..df107bc 100644
--- a/_posts/2012-10-02-process-spawning-patterns.md
+++ b/_posts/2012-10-02-process-spawning-patterns.md
@@ -2,7 +2,9 @@
layout: post
title: Process spawning patterns
date: '2012-10-02'
-categories: articles
+categories:
+ - cs-concepts
+ - ruby-quirks
author: Jesse Storimer
permalink: articles/process-spawning-patterns
summary: Implement Ruby's system and backticks methods using the fork/exec pattern.
diff --git a/_posts/2012-10-16-growing-a-stable-codebase.md b/_posts/2012-10-16-growing-a-stable-codebase.md
index ca7ea7b..8ddf18a 100644
--- a/_posts/2012-10-16-growing-a-stable-codebase.md
+++ b/_posts/2012-10-16-growing-a-stable-codebase.md
@@ -2,7 +2,7 @@
layout: post
title: Guidelines for growing a stable codebase
date: '2012-10-16'
-categories: articles
+categories: communication
author: Jordan Byron and Gregory Brown
permalink: articles/growing-a-stable-codebase
summary: Discover the process we use for continuously improving practicingruby.com.
diff --git a/_posts/2012-10-28-relationships-between-objects.md b/_posts/2012-10-28-relationships-between-objects.md
index 165b6f9..f98bb68 100644
--- a/_posts/2012-10-28-relationships-between-objects.md
+++ b/_posts/2012-10-28-relationships-between-objects.md
@@ -2,7 +2,7 @@
layout: post
title: Understanding the relationships between objects
date: '2012-10-28'
-categories: articles
+categories: domain-modeling
author: Gregory Brown
permalink: articles/relationships-between-objects
summary: Learn how to model dependencies, notifications, adjustments, and internal
diff --git a/_posts/2012-11-13-expanding-your-code-reading-horizons.md b/_posts/2012-11-13-expanding-your-code-reading-horizons.md
index 981b0aa..61dd3aa 100644
--- a/_posts/2012-11-13-expanding-your-code-reading-horizons.md
+++ b/_posts/2012-11-13-expanding-your-code-reading-horizons.md
@@ -2,7 +2,9 @@
layout: post
title: Expanding your code reading horizons
date: '2012-11-13'
-categories: articles
+categories:
+ - communication
+ - cs-concepts
author: Gregory Brown
permalink: articles/expanding-your-code-reading-horizons
summary: See how much even a few dozen lines of code can tell you about a programming
diff --git a/_posts/2012-11-27-ant-colony-simulation.md b/_posts/2012-11-27-ant-colony-simulation.md
index 189bab6..0abbd07 100644
--- a/_posts/2012-11-27-ant-colony-simulation.md
+++ b/_posts/2012-11-27-ant-colony-simulation.md
@@ -2,7 +2,10 @@
layout: post
title: Simulating the emergent behavior of ant colonies
date: '2012-11-27'
-categories: articles
+categories:
+ - building
+ - games
+ - working-with-data
author: Gregory Brown
permalink: articles/ant-colony-simulation
summary: Explore how simple rules for individuals can yield complex group behavior
diff --git a/_posts/2012-12-11-adventure-in-prototypes.md b/_posts/2012-12-11-adventure-in-prototypes.md
index e9fb22f..8a1f67a 100644
--- a/_posts/2012-12-11-adventure-in-prototypes.md
+++ b/_posts/2012-12-11-adventure-in-prototypes.md
@@ -2,7 +2,9 @@
layout: post
title: An adventure in prototypes
date: '2012-12-11'
-categories: articles
+categories:
+ - building
+ - games
author: Avdi Grimm
permalink: articles/adventure-in-prototypes
summary: Build a text adventure game and a prototype-based object model, at the same
diff --git a/_posts/2013-01-01-parsing-json-the-hard-way.md b/_posts/2013-01-01-parsing-json-the-hard-way.md
index 5619cd8..4203481 100644
--- a/_posts/2013-01-01-parsing-json-the-hard-way.md
+++ b/_posts/2013-01-01-parsing-json-the-hard-way.md
@@ -2,7 +2,9 @@
layout: post
title: Parsing JSON the hard way
date: '2013-01-01'
-categories: articles
+categories:
+ - cs-concepts
+ - ruby-quirks
author: Aaron Patterson
permalink: articles/parsing-json-the-hard-way
summary: Learn about low-level parser and compiler tools by implementing a JSON parser.
diff --git a/_posts/2013-01-15-self-guided-code-tour.md b/_posts/2013-01-15-self-guided-code-tour.md
index 4e8a3f0..8800f16 100644
--- a/_posts/2013-01-15-self-guided-code-tour.md
+++ b/_posts/2013-01-15-self-guided-code-tour.md
@@ -2,7 +2,9 @@
layout: post
title: A self-guided tour of an interesting codebase
date: '2013-01-15'
-categories: articles
+categories:
+ - communication
+ - cs-concepts
author: Gregory Brown
permalink: articles/self-guided-code-tour
summary: Practice your code reading skills by walking through a small GUI client to
diff --git a/_posts/2013-01-25-gentle-intro-to-actor-based-concurrency.md b/_posts/2013-01-25-gentle-intro-to-actor-based-concurrency.md
index a5d5046..0d142eb 100644
--- a/_posts/2013-01-25-gentle-intro-to-actor-based-concurrency.md
+++ b/_posts/2013-01-25-gentle-intro-to-actor-based-concurrency.md
@@ -2,7 +2,7 @@
layout: post
title: A gentle introduction to actor-based concurrency
date: '2013-01-25'
-categories: articles
+categories: cs-concepts
author: Alberto F. Capel and Gregory Brown
permalink: articles/gentle-intro-to-actor-based-concurrency
summary: Solve "Dining Philosophers" using mutex locks, then do it again using actors.
diff --git a/_posts/2013-02-12-code-reuse-is-complicated.md b/_posts/2013-02-12-code-reuse-is-complicated.md
index 8ad7813..d33f534 100644
--- a/_posts/2013-02-12-code-reuse-is-complicated.md
+++ b/_posts/2013-02-12-code-reuse-is-complicated.md
@@ -2,7 +2,7 @@
layout: post
title: 'Code reuse in Ruby: It''s complicated!'
date: '2013-02-12'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/code-reuse-is-complicated
summary: "Learn the costs and benefits of the many ways that Ruby lets you reuse code.\r\n\r\n"
diff --git a/_posts/2013-02-26-debugging-without-doom-and-gloom.md b/_posts/2013-02-26-debugging-without-doom-and-gloom.md
index 5ada81b..114aa7b 100644
--- a/_posts/2013-02-26-debugging-without-doom-and-gloom.md
+++ b/_posts/2013-02-26-debugging-without-doom-and-gloom.md
@@ -2,7 +2,7 @@
layout: post
title: Debugging without the doom and gloom
date: '2013-02-26'
-categories: articles
+categories: everything-else
author: Carol Nichols
permalink: articles/debugging-without-doom-and-gloom
summary: Use stack traces, the Pry console, and tests to hunt bugs with confidence.
diff --git a/_posts/2013-03-12-cleaning-up-bloated-method-interfaces.md b/_posts/2013-03-12-cleaning-up-bloated-method-interfaces.md
index 782e3d0..bac3f52 100644
--- a/_posts/2013-03-12-cleaning-up-bloated-method-interfaces.md
+++ b/_posts/2013-03-12-cleaning-up-bloated-method-interfaces.md
@@ -2,7 +2,7 @@
layout: post
title: Cleaning up bloated method interfaces
date: '2013-03-12'
-categories: articles
+categories: ruby-quirks
author: Gregory Brown
permalink: articles/cleaning-up-bloated-method-interfaces
summary: Tame a complex method interface using keyword arguments and parameter objects.
diff --git a/_posts/2013-03-26-demeter-archaeology.md b/_posts/2013-03-26-demeter-archaeology.md
index 8f7bb1c..9017acf 100644
--- a/_posts/2013-03-26-demeter-archaeology.md
+++ b/_posts/2013-03-26-demeter-archaeology.md
@@ -2,7 +2,7 @@
layout: post
title: 'The Law of Demeter: Some archaeological notes'
date: '2013-03-26'
-categories: articles
+categories: software-design
author: David A. Black
permalink: articles/demeter-archaeology
summary: Explore the history of a classic design principle and how it relates to Ruby.
diff --git a/_posts/2013-04-10-from-scripting-to-oop.md b/_posts/2013-04-10-from-scripting-to-oop.md
index 04de77b..ae6d437 100644
--- a/_posts/2013-04-10-from-scripting-to-oop.md
+++ b/_posts/2013-04-10-from-scripting-to-oop.md
@@ -2,7 +2,7 @@
layout: post
title: 'From adhoc script to object-oriented program '
date: '2013-04-10'
-categories: articles
+categories: domain-modeling
author: Gregory Brown
permalink: articles/from-scripting-to-oop
summary: Gradually convert a "throwaway" procedural program into a well-defined domain
diff --git a/_posts/2013-04-23-avoiding-brittleness-in-data-munging.md b/_posts/2013-04-23-avoiding-brittleness-in-data-munging.md
index 4d2853d..951cae5 100644
--- a/_posts/2013-04-23-avoiding-brittleness-in-data-munging.md
+++ b/_posts/2013-04-23-avoiding-brittleness-in-data-munging.md
@@ -2,7 +2,9 @@
layout: post
title: Avoiding brittleness in data munging projects
date: '2013-04-23'
-categories: articles
+categories:
+ - maintenance
+ - working-with-data
author: Gregory Brown
permalink: articles/avoiding-brittleness-in-data-munging
summary: Process data and generate reports without writing unmaintainable spaghetti
diff --git a/_posts/2013-05-07-low-cost-approach-to-side-projects.md b/_posts/2013-05-07-low-cost-approach-to-side-projects.md
index 60778a1..91d9ba2 100644
--- a/_posts/2013-05-07-low-cost-approach-to-side-projects.md
+++ b/_posts/2013-05-07-low-cost-approach-to-side-projects.md
@@ -2,7 +2,7 @@
layout: post
title: A low cost approach to working on side projects
date: '2013-05-07'
-categories: articles
+categories: problem-solving
author: Gregory Brown
permalink: articles/low-cost-approach-to-side-projects
summary: Save time by building a standalone feature before designing a complete product.
diff --git a/_posts/2013-06-04-simulating-tiny-worlds.md b/_posts/2013-06-04-simulating-tiny-worlds.md
index 11f4913..2243194 100644
--- a/_posts/2013-06-04-simulating-tiny-worlds.md
+++ b/_posts/2013-06-04-simulating-tiny-worlds.md
@@ -2,7 +2,10 @@
layout: post
title: Simulating tiny worlds for fun and profit
date: '2013-06-04'
-categories: articles
+categories:
+ - building
+ - games
+ - problem-solving
author: Gregory Brown
permalink: articles/simulating-tiny-worlds
summary: Practice exploratory programming by modeling forest fires, rabbit populations,
diff --git a/_posts/2013-07-02-implementing-an-http-file-server.md b/_posts/2013-07-02-implementing-an-http-file-server.md
index c20fe28..6549dcb 100644
--- a/_posts/2013-07-02-implementing-an-http-file-server.md
+++ b/_posts/2013-07-02-implementing-an-http-file-server.md
@@ -2,7 +2,9 @@
layout: post
title: Implementing a minimal HTTP server in Ruby
date: '2013-07-02'
-categories: articles
+categories:
+ - building
+ - cs-concepts
author: Luke Francl
permalink: articles/implementing-an-http-file-server
summary: Build just enough HTTP functionality from scratch to serve up static files.
diff --git a/_posts/2013-08-06-exploratory-data-analysis.md b/_posts/2013-08-06-exploratory-data-analysis.md
index 4697201..f46e9b6 100644
--- a/_posts/2013-08-06-exploratory-data-analysis.md
+++ b/_posts/2013-08-06-exploratory-data-analysis.md
@@ -2,7 +2,9 @@
layout: post
title: Using data to explore questions about our lives
date: '2013-08-06'
-categories: articles
+categories:
+ - building
+ - working-with-data
author: Jia Wu and Gregory Brown
permalink: articles/exploratory-data-analysis
summary: Aggregate and analyze 500+ data points from a SMS-based mood study using
diff --git a/_posts/2013-09-05-improving-legacy-systems.md b/_posts/2013-09-05-improving-legacy-systems.md
index 42e9136..c383ae3 100644
--- a/_posts/2013-09-05-improving-legacy-systems.md
+++ b/_posts/2013-09-05-improving-legacy-systems.md
@@ -2,7 +2,7 @@
layout: post
title: Making incremental improvements to legacy systems
date: '2013-09-05'
-categories: articles
+categories: maintenance
author: Jordan Byron and Gregory Brown
permalink: articles/improving-legacy-systems
summary: Experience the challenge of overhauling one of Practicing Ruby's oldest features.
diff --git a/_posts/2013-10-01-low-level-computing.md b/_posts/2013-10-01-low-level-computing.md
index 89b9df9..e0b7f81 100644
--- a/_posts/2013-10-01-low-level-computing.md
+++ b/_posts/2013-10-01-low-level-computing.md
@@ -2,7 +2,7 @@
layout: post
title: Exploring low-level computing concepts with Ruby
date: '2013-10-01'
-categories: articles
+categories: cs-concepts
author: Gregory Brown
permalink: articles/low-level-computing
summary: Implement a minimal simulator of the classic 6502 processor using nothing
diff --git a/_posts/2013-11-12-infrastructure-automation.md b/_posts/2013-11-12-infrastructure-automation.md
index 0996efe..6b1d473 100644
--- a/_posts/2013-11-12-infrastructure-automation.md
+++ b/_posts/2013-11-12-infrastructure-automation.md
@@ -2,7 +2,7 @@
layout: post
title: Infrastructure automation by example
date: '2013-11-12'
-categories: articles
+categories: maintenance
author: Mathias Lafeldt, Jordan Byron, and Gregory Brown
permalink: articles/infrastructure-automation
summary: Discover why infrastructure automation matters by exploring real Chef recipes.
diff --git a/_posts/2013-12-11-wumpus.md b/_posts/2013-12-11-wumpus.md
index 49fcbbf..2bcf7ae 100644
--- a/_posts/2013-12-11-wumpus.md
+++ b/_posts/2013-12-11-wumpus.md
@@ -2,7 +2,9 @@
layout: post
title: 'Hunt the Wumpus: An exercise in creative coding'
date: '2013-12-11'
-categories: articles
+categories:
+ - building
+ - games
author: Gregory Brown
permalink: articles/wumpus
summary: 'Build Gregory Yob''s classic text-based game from scratch, using the provided
diff --git a/_posts/2014-02-17-sustainable-foss-quality.md b/_posts/2014-02-17-sustainable-foss-quality.md
index c5677a1..60af2d1 100644
--- a/_posts/2014-02-17-sustainable-foss-quality.md
+++ b/_posts/2014-02-17-sustainable-foss-quality.md
@@ -2,7 +2,7 @@
layout: post
title: 'Sustainable maintenance: Focus on quality first '
date: '2014-02-17'
-categories: articles
+categories: open-source
author: Eric Hodel and Gregory Brown
permalink: articles/sustainable-foss-quality
summary: Learn three useful practices for maintaining high quality open source projects
diff --git a/_posts/2014-03-31-study-guide-1.md b/_posts/2014-03-31-study-guide-1.md
index d64238e..bee2bf7 100644
--- a/_posts/2014-03-31-study-guide-1.md
+++ b/_posts/2014-03-31-study-guide-1.md
@@ -2,7 +2,7 @@
layout: post
title: A self guided course on streams, files, file formats, and sockets
date: '2014-03-31'
-categories: articles
+categories: cs-concepts
author: Gregory Brown
permalink: articles/study-guide-1
summary: Explore UNIX-style stream processing, binary file formats, the Racc parser
diff --git a/_posts/2014-09-08-information-anatomy.md b/_posts/2014-09-08-information-anatomy.md
index 46a52ef..a23ce24 100644
--- a/_posts/2014-09-08-information-anatomy.md
+++ b/_posts/2014-09-08-information-anatomy.md
@@ -2,7 +2,10 @@
layout: post
title: The anatomy of information in software systems
date: '2014-09-08'
-categories: articles
+categories:
+ - problem-solving
+ - software-design
+ - working-with-data
author: Gregory Brown
permalink: articles/information-anatomy
summary: Explore the tradeoffs involved in designing message formats, and the messy
diff --git a/_posts/2015-03-26-problem-discovery.md b/_posts/2015-03-26-problem-discovery.md
index dffb6c0..f2ca7b7 100644
--- a/_posts/2015-03-26-problem-discovery.md
+++ b/_posts/2015-03-26-problem-discovery.md
@@ -2,7 +2,7 @@
layout: post
title: Problem discovery comes before problem solving
date: '2015-03-26'
-categories: articles
+categories: problem-solving
author: Gregory Brown
permalink: articles/problem-discovery
summary: A brief story about why you should play around with problems before trying
diff --git a/_posts/2015-09-10-formula-processing.md b/_posts/2015-09-10-formula-processing.md
index 620b3ea..e066012 100644
--- a/_posts/2015-09-10-formula-processing.md
+++ b/_posts/2015-09-10-formula-processing.md
@@ -2,7 +2,9 @@
layout: post
title: 'Safely evaluating user-defined formulas and calculations '
date: '2015-09-10'
-categories: articles
+categories:
+ - cs-concepts
+ - working-with-data
author: Solomon White and Gregory Brown
permalink: articles/formula-processing
summary: Learn how to use Dentaku to evaluate Excel-like formulas
diff --git a/_sass/_layout.scss b/_sass/_layout.scss
index 5286a70..2c514c0 100644
--- a/_sass/_layout.scss
+++ b/_sass/_layout.scss
@@ -248,3 +248,44 @@
}
}
}
+
+/* OTHER SITE STYLES */
+
+.header {
+ text-align: center;
+ padding-top: 40px;
+ padding-bottom: 80px;
+}
+
+.header h1 {
+ font-size: 50px;
+ font-weight: bold;
+}
+
+.categories div {
+ margin-bottom: 30px;
+}
+
+.categories div h3 {
+ border-bottom: 1px solid #ddd;
+ padding-bottom: 5px;
+}
+
+.categories div ul {
+ list-style: none;
+ margin-left: 0px;
+}
+
+a.view-all {
+ float: right;
+ font-size: 16px;
+ color: #111;
+ padding-top: 2px;
+}
+
+.related-posts h3 {
+ text-align: center;
+ background-color: #fffbaf;
+ padding-top: 10px;
+ padding-bottom: 10px;
+}
diff --git a/archives.md b/archives.md
new file mode 100644
index 0000000..fbc001d
--- /dev/null
+++ b/archives.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Archives
+permalink: /archives
+---
+
+
+
+ {% for post in site.posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/building.md b/categories/building.md
new file mode 100644
index 0000000..08e610c
--- /dev/null
+++ b/categories/building.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Building on your knowledge
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","building" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/communication.md b/categories/communication.md
new file mode 100644
index 0000000..6d9e162
--- /dev/null
+++ b/categories/communication.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Communication
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","communication" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/cs-concepts.md b/categories/cs-concepts.md
new file mode 100644
index 0000000..689373b
--- /dev/null
+++ b/categories/cs-concepts.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Exploring CS concepts with Ruby
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","cs-concepts" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/domain-modeling.md b/categories/domain-modeling.md
new file mode 100644
index 0000000..290c7b2
--- /dev/null
+++ b/categories/domain-modeling.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Domain modeling
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","domain-modeling" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/editors-picks.md b/categories/editors-picks.md
new file mode 100644
index 0000000..9963a48
--- /dev/null
+++ b/categories/editors-picks.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Editor's picks
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","editors-picks" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/everything-else.md b/categories/everything-else.md
new file mode 100644
index 0000000..443e633
--- /dev/null
+++ b/categories/everything-else.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Everything else
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","everything-else" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/games.md b/categories/games.md
new file mode 100644
index 0000000..f91e338
--- /dev/null
+++ b/categories/games.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Games
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","games" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/maintenance.md b/categories/maintenance.md
new file mode 100644
index 0000000..4fefc6b
--- /dev/null
+++ b/categories/maintenance.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Maintaining code and quality
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","maintenance" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/most-popular.md b/categories/most-popular.md
new file mode 100644
index 0000000..fcfd071
--- /dev/null
+++ b/categories/most-popular.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Most popular
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","most-popular" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/open-source.md b/categories/open-source.md
new file mode 100644
index 0000000..d26e427
--- /dev/null
+++ b/categories/open-source.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Open source
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","open-source" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/problem-solving.md b/categories/problem-solving.md
new file mode 100644
index 0000000..42c709e
--- /dev/null
+++ b/categories/problem-solving.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Problem solving
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","problem-solving" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/ruby-quirks.md b/categories/ruby-quirks.md
new file mode 100644
index 0000000..ab34193
--- /dev/null
+++ b/categories/ruby-quirks.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Ruby quirks
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","ruby-quirks" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/software-design.md b/categories/software-design.md
new file mode 100644
index 0000000..b49c6a6
--- /dev/null
+++ b/categories/software-design.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Software design
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","software-design" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/spotlights.md b/categories/spotlights.md
new file mode 100644
index 0000000..13868e2
--- /dev/null
+++ b/categories/spotlights.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Spotlights
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","spotlights" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/testing.md b/categories/testing.md
new file mode 100644
index 0000000..b8958c2
--- /dev/null
+++ b/categories/testing.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: All things testing
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","testing" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/categories/working-with-data.md b/categories/working-with-data.md
new file mode 100644
index 0000000..6e79d1f
--- /dev/null
+++ b/categories/working-with-data.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Working with data
+---
+
+
+
+ {% assign posts = site.posts | where:"categories","working-with-data" %}
+ {% for post in posts %}
+ -
+
+
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
+
+ {% endfor %}
+
+
diff --git a/index.html b/index.html
index ec69750..63873c2 100644
--- a/index.html
+++ b/index.html
@@ -3,14 +3,252 @@
---
-
- {% for post in site.posts %}
- -
-
-
{{ post.summary }}
Issue {{ post.issue_number }} — {{ post.date | date: "%B %-d, %Y" }}
-
- {% endfor %}
-
+
+
+
+
+ {% assign posts = site.posts | where:"categories","most-popular" %}
+
+ Most popular lessons
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","editors-picks" %}
+
+ Editor's picks
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","working-with-data" %}
+
+ Working with data
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","building" %}
+
+ Building on your knowledge
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","testing" %}
+
+ All things testing
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","spotlights" %}
+
+ Spotlights
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","software-design" %}
+
+ Software design
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","domain-modeling" %}
+
+ Domain modeling
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","ruby-quirks" %}
+
+ Ruby quirks
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","games" %}
+
+ Games
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","open-source" %}
+
+ Open source
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","problem-solving" %}
+
+ Problem solving
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","communication" %}
+
+ Communication
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","maintenance" %}
+
+ Maintaining code and quality
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","cs-concepts" %}
+
+ Exploring CS concepts with Ruby
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
+
+ {% assign posts = site.posts | where:"categories","everything-else" %}
+
+ Everything else
+ {% if posts.size > 5 %}
+ View All
+ {% endif %}
+
+
+ {% for post in posts limit:5 %}
+ {% include category-item.html post=post %}
+ {% endfor %}
+
+
+
diff --git a/ruby-divider.png b/ruby-divider.png
new file mode 100644
index 0000000..36580e5
Binary files /dev/null and b/ruby-divider.png differ