diff --git a/Site/Posts/90_of_my_homepage_was_useless.md b/Site/Posts/90_of_my_homepage_was_useless.md index 4b17abf..fbed92e 100644 --- a/Site/Posts/90_of_my_homepage_was_useless.md +++ b/Site/Posts/90_of_my_homepage_was_useless.md @@ -5,6 +5,7 @@ "date": "6 December 2023", "contents": false, "hero": "photo-1686061593213-98dad7c599b9", + "topics": ["Blogging", "How-To"], "related": [ { "title": "Giscus Is Awesome", "description": "I can add comments to my statically generated blog? Using GitHub Discussions?? For Free??? And it works????", "fileName": "giscus_is_awesome" }, { "title": "Daily Grug", "description": "Need inspiration start day, made API.", "fileName": "daily_grug" }, diff --git a/Site/Posts/a_scrum_odyssey.md b/Site/Posts/a_scrum_odyssey.md index e96c13e..0697140 100644 --- a/Site/Posts/a_scrum_odyssey.md +++ b/Site/Posts/a_scrum_odyssey.md @@ -5,6 +5,7 @@ "date": "20 October 2023", "contents": false, "hero": "photo-1637070950324-413a2f873db2", + "topics": ["Processes"], "related": [ { "title": "An Introduction to Sprache", "description": "Sprache is a parser-combinator library for C# that uses Linq to construct parsers. In this post I describe the fundamentals of understanding grammars and parsing them with Sprache, with several real-world examples.", "fileName": "sprache" }, { "title": "Deploying ASP.NET 7 Projects with Railway", "description": "Railway is a startup cloud infrastructure provider that has gained traction for being easy to use and cheap for hobbyists. Let's get a .NET 7 Blazor WASM app up and running with it!", "fileName": "deploying_aspdotnet_7_projects_with_railway" } diff --git a/Site/Posts/adding_a_database_to_our_railway_app.md b/Site/Posts/adding_a_database_to_our_railway_app.md index 040106c..6ae83ce 100644 --- a/Site/Posts/adding_a_database_to_our_railway_app.md +++ b/Site/Posts/adding_a_database_to_our_railway_app.md @@ -5,6 +5,7 @@ "date": "8 November 2023", "contents": false, "hero": "photo-1541509411630-9c14b774ecba", + "topics": ["Databases", "Deployment", "Dotnet", "How-To"], "related": [ { "title": "Deploying ASP.NET 7 Projects with Railway", "description": "Railway is a startup cloud infrastructure provider that has gained traction for being easy to use and cheap for hobbyists. Let's get a .NET 7 Blazor WASM app up and running with it!", "fileName": "deploying_aspnet_7_projects_with_railway" }, { "title": "Book Club 10/2023: Functional Patterns in C#", "description": "This month I've focused on functional domain modeling and related patterns. We're just a few weeks away from the release of the next version of C#, and like each previous version it'll introduce even more functional features.", "filename": "book_club_10-2023" }, diff --git a/Site/Posts/bandwidth_is_infinite_ly_troublesome.md b/Site/Posts/bandwidth_is_infinite_ly_troublesome.md index dfd9504..1506cd9 100644 --- a/Site/Posts/bandwidth_is_infinite_ly_troublesome.md +++ b/Site/Posts/bandwidth_is_infinite_ly_troublesome.md @@ -5,6 +5,7 @@ "date": "26 April 2024", "contents": true, "hero": "photo-1451187580459-43490279c0fa", + "topics": ["Distribution", "Performance"], "series": "Fallacies of Distributed Computing", "related": [ { "title": "Latency is Zero and the Speed of Light is Getting Faster", "description": "Latency is a constant and unavoidable fact of nature, but we can plan for it, work around it, and respond to it.", "fileName": "latency_is_zero" }, diff --git a/Site/Posts/book_club-2-2024.md b/Site/Posts/book_club-2-2024.md index 5d943df..54ed4d6 100644 --- a/Site/Posts/book_club-2-2024.md +++ b/Site/Posts/book_club-2-2024.md @@ -5,6 +5,7 @@ "date": "24 February 2024", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": [Architecture", "Testing"], "series": "Book Club", "related": [ { "title": "Book Club 1/2024: What is a Software Architect?", "description": "A few meandering and maybe unhelpful thoughts on the title \"Software Architect\"", "fileName": "book_club_1-2024" }, diff --git a/Site/Posts/book_club_1-2024.md b/Site/Posts/book_club_1-2024.md index da3469e..4fb9535 100644 --- a/Site/Posts/book_club_1-2024.md +++ b/Site/Posts/book_club_1-2024.md @@ -5,6 +5,7 @@ "date": "24 January 2024", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Architecture", "Industry"], "series": "Book Club", "related": [ { "title": "Book Club 12/2023: Workflow, Process, and Agile", "description": "Some thoughts on how to organize software development and teams, and how non-technical factors help (or hinder) us developing better software.", "fileName": "book_club_12-2023" }, diff --git a/Site/Posts/book_club_10-2023.md b/Site/Posts/book_club_10-2023.md index 4cbde84..eb371cd 100644 --- a/Site/Posts/book_club_10-2023.md +++ b/Site/Posts/book_club_10-2023.md @@ -5,6 +5,7 @@ "date": "27 October 2023", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Patterns", "Languages", "Dotnet"], "series": "Book Club", "related": [ { "title": "Book Club 9/2023: Papers I Love", "description": "Reflecting on the final Strange Loop conference, having attended several 'Papers We Love' talks, I'm motivated to share five papers I love.", "fileName": "book_club_9-2023" }, diff --git a/Site/Posts/book_club_11-2023.md b/Site/Posts/book_club_11-2023.md index fdbbe3e..b3b1696 100644 --- a/Site/Posts/book_club_11-2023.md +++ b/Site/Posts/book_club_11-2023.md @@ -5,6 +5,7 @@ "date": "22 November 2023", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Dotnet"], "series": "Book Club", "related": [ { "title": "A Scrum Odyssey", "description": "A journey away from daily scrum meetings, as a cycle of eight Shakespearean sonnets.", "fileName": "a_scrum_odyssey" }, diff --git a/Site/Posts/book_club_12-2023.md b/Site/Posts/book_club_12-2023.md index 510620a..01c8352 100644 --- a/Site/Posts/book_club_12-2023.md +++ b/Site/Posts/book_club_12-2023.md @@ -5,6 +5,7 @@ "date": "16 December 2023", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Processes", "Industry"], "series": "Book Club", "related": [ { "title": "Book Club 11/2023: New .NET, New C#", "description": "The release of .NET 8 brings a lot of features I'm excited for!", "fileName": "book_club_11-2023" }, diff --git a/Site/Posts/book_club_3-2024.md b/Site/Posts/book_club_3-2024.md index 650cde5..c8fdd67 100644 --- a/Site/Posts/book_club_3-2024.md +++ b/Site/Posts/book_club_3-2024.md @@ -5,6 +5,7 @@ "date": "25 March 2024", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Processes", "Architecture"], "series": "Book Club", "related": [ { "title": "Book Club 2/2024: Recovering from TDD and Unit Tests", "description": "TDD and unit tests are overused and often misprescribed. What do we really hope to gain from our tests, and what testing practices support our goals?", "fileName": "book_club_2-2024" }, diff --git a/Site/Posts/book_club_4-2024.md b/Site/Posts/book_club_4-2024.md index 783f73c..24a442c 100644 --- a/Site/Posts/book_club_4-2024.md +++ b/Site/Posts/book_club_4-2024.md @@ -5,6 +5,7 @@ "date": "24 April 2024", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Architecture", "Patterns", "Databases"], "series": "Book Club", "related": [ { "title": "Book Club 3/2024: Simplicity", "description": "Everything is too complicated.", "fileName": "book_club_3-2024" }, diff --git a/Site/Posts/book_club_5-2024.md b/Site/Posts/book_club_5-2024.md index 3920072..86babe9 100644 --- a/Site/Posts/book_club_5-2024.md +++ b/Site/Posts/book_club_5-2024.md @@ -5,6 +5,7 @@ "date": "29 May 2024", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Architecture", "Patterns"], "series": "Book Club", "related": [ { "title": "Book Club 4/2024: I Don't Like ORMs", "description": "Object-relational mappers are more trouble than they're worth.", "fileName": "book_club_4-2024" }, diff --git a/Site/Posts/book_club_6-7-2024.md b/Site/Posts/book_club_6-7-2024.md index b4665f7..bb3223c 100644 --- a/Site/Posts/book_club_6-7-2024.md +++ b/Site/Posts/book_club_6-7-2024.md @@ -5,6 +5,7 @@ "date": "29 July 2024", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Postgres", "Databases"], "series": "Book Club", "related": [ { "title": "Book Club 5/2024: SOLID", "description": "Is SOLID still relevant?", "fileName": "book_club_5-2024" }, diff --git a/Site/Posts/book_club_8-2024.md b/Site/Posts/book_club_8-2024.md index c830a64..5a2cf7b 100644 --- a/Site/Posts/book_club_8-2024.md +++ b/Site/Posts/book_club_8-2024.md @@ -5,6 +5,7 @@ "date": "2 September 2024", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Industry"], "series": "Book Club", "related": [ { "title": "Book Club 6&7/2024: Postgres", "description": "I have become further radicalized to the opinion that we should all just be using PostgreSQL", "fileName": "book_club_6-7-2024" }, diff --git a/Site/Posts/book_club_9-2023.md b/Site/Posts/book_club_9-2023.md index 40c1ca8..b9d9bee 100644 --- a/Site/Posts/book_club_9-2023.md +++ b/Site/Posts/book_club_9-2023.md @@ -5,6 +5,7 @@ "date": "28 September 2023", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Learning"], "series": "Book Club", "related": [ { "title": "An Introduction to Sprache", "description": "Sprache is a parser-combinator library for C# that uses Linq to construct parsers. In this post I describe the fundamentals of understanding grammars and parsing them with Sprache, with several real-world examples.", "fileName": "sprache" }, diff --git a/Site/Posts/book_club_9-2024.md b/Site/Posts/book_club_9-2024.md index d1ec27f..b18c264 100644 --- a/Site/Posts/book_club_9-2024.md +++ b/Site/Posts/book_club_9-2024.md @@ -5,6 +5,7 @@ "date": "28 September 2024", "contents": false, "hero": "photo-1672309558498-cfcc89afff25", + "topics": ["Blogging"], "series": "Book Club", "related": [ { "title": "Book Club 8/2024: Labor", "description": "Using Labor Day as an excuse to wonder about some recent trends in the industry", "fileName": "book_club_8-2024" }, diff --git a/Site/Posts/clean_meetings_a_software_engineers_guide.md b/Site/Posts/clean_meetings_a_software_engineers_guide.md index 58ec7f9..2696b3c 100644 --- a/Site/Posts/clean_meetings_a_software_engineers_guide.md +++ b/Site/Posts/clean_meetings_a_software_engineers_guide.md @@ -5,6 +5,7 @@ "date": "3 December 2023", "contents": true, "hero": "photo-1568992687947-868a62a9f521", + "topics": ["Processes", "How-To"], "related": [ { "title": "Deploying ASP.NET 7 Projects with Railway", "description": "Railway is a startup cloud infrastructure provider that has gained traction for being easy to use and cheap for hobbyists. Let's get a .NET 7 Blazor WASM app up and running with it!", "fileName": "deploying_aspnet_7_projects_with_railway" }, { "title": "Book Club 10/2023: Functional Patterns in C#", "description": "This month I've focused on functional domain modeling and related patterns. We're just a few weeks away from the release of the next version of C#, and like each previous version it'll introduce even more functional features.", "filename": "book_club_10-2023" }, diff --git a/Site/Posts/consider_a_tiling_window_manager.md b/Site/Posts/consider_a_tiling_window_manager.md index d4b7015..c826164 100644 --- a/Site/Posts/consider_a_tiling_window_manager.md +++ b/Site/Posts/consider_a_tiling_window_manager.md @@ -5,6 +5,7 @@ "date": "12 February 2024", "contents": false, "hero": "photo-1559644705-15d30e582900", + "topics": ["Tooling"], "related": [ { "title": "Eight Maxims", "description": "A few principles for thoughtful software engineering.", "fileName": "eight_maxims" }, { "title": "My (Continuing) Descent Into Madness", "description": "It started simply enough, when I asked myself if I should try an IDE other than Visual Studio. Mere months later, I'm now using a tiling window manager. This is the story of my (continuing) descent into madness.", "fileName": "my_continuing_descent_into_madness" }, diff --git a/Site/Posts/daily_grug.md b/Site/Posts/daily_grug.md index 2b4f4bf..e8f917d 100644 --- a/Site/Posts/daily_grug.md +++ b/Site/Posts/daily_grug.md @@ -5,6 +5,7 @@ "date": "26 October 2023", "contents": false, "hero": "photo-1456406644174-8ddd4cd52a06", + "topics": ["Projects"], "related": [ { "title": "A Scrum Odyssey", "description": "A journey away from daily scrum meetings, as a cycle of eight Shakespearean sonnets.", "fileName": "a_scrum_odyssey" }, { "title": "Giscus is Awesome", "description": "I can add comments to my statically generated blog? Using GitHub Discussions?? For Free??? And it works????", "fileName": "giscus_is_awesome" } diff --git a/Site/Posts/deploying_aspdotnet_7_projects_with_railway.md b/Site/Posts/deploying_aspdotnet_7_projects_with_railway.md index ba7b5a5..4f72987 100644 --- a/Site/Posts/deploying_aspdotnet_7_projects_with_railway.md +++ b/Site/Posts/deploying_aspdotnet_7_projects_with_railway.md @@ -5,6 +5,7 @@ "date": "5 September 2023", "contents": true, "hero": "photo-1580940583249-77175ce5f75a", + "topics": ["Dotnet", "Deployment", "How-To"], "related": [ { "title": "An Introduction to Sprache", "description": "Sprache is a parser-combinator library for C# that uses Linq to construct parsers. In this post I describe the fundamentals of understanding grammars and parsing them with Sprache, with several real-world examples.", "fileName": "sprache" }, { "title": "Console2048", "description": "Jumping on the bandwagon, here's a C# implementation of Console 2048. Of course, 2048 has had a few console implementations, and most better done than this, but here it is anyway, because sometimes life is a mixed bag of apples and grapes.", "fileName": "console2048" } diff --git a/Site/Posts/deploying_your_prolog_api_with_docker.md b/Site/Posts/deploying_your_prolog_api_with_docker.md index 3c9d1d4..f9953dc 100644 --- a/Site/Posts/deploying_your_prolog_api_with_docker.md +++ b/Site/Posts/deploying_your_prolog_api_with_docker.md @@ -5,6 +5,7 @@ "date": "28 June 2024", "contents": false, "hero": "photo-1464095718138-d9c47312eac5", + "topics": ["Languages", "Deployment"], "related": [ { "title": "Deploying ASP.NET 7 Projects with Railway", "description": "Railway is a startup cloud infrastructure provider that has gained traction for being easy to use and cheap for hobbyists. Let's get a .NET 7 Blazor WASM app up and running with it!", "fileName": "deploying_aspdotnet_7_projects_with_railway" }, { "title": "\"Should I Learn (Insert Some Tech Here)?\"", "description": "One of the most common questions - would it be good to learn this or that language, framework, database, etc? Taking even a little time to learn something new is good all around, but is it really worth making an investment in yourself to grow personally and professionally? Let's take a deep dive into this topic.", "fileName": "should_i_learn_insert_some_tech_here" }, diff --git a/Site/Posts/develop_effective_coding_standards.md b/Site/Posts/develop_effective_coding_standards.md index 8efe516..11a644c 100644 --- a/Site/Posts/develop_effective_coding_standards.md +++ b/Site/Posts/develop_effective_coding_standards.md @@ -5,6 +5,7 @@ "date": "14 February 2024", "contents": false, "hero": "photo-1523240795612-9a054b0db644", + "topics": ["Standards", "Processes"], "related": [ { "title": "Eight Maxims", "description": "A few principles for thoughtful software engineering.", "fileName": "eight_maxims" }, { "title": "Clean Meetings: A Software Engineer's Guide", "description": "If being in meetings all day isn't bad enough, spending more time thinking about them seems horrible. Here's a simple guide on making sure you're getting the most out of your meetings.", "fileName": "clean_meetings_a_software_engineers_guide" }, diff --git a/Site/Posts/dont_retro_the_same_twice.md b/Site/Posts/dont_retro_the_same_twice.md index d9b9c4d..cdfec07 100644 --- a/Site/Posts/dont_retro_the_same_twice.md +++ b/Site/Posts/dont_retro_the_same_twice.md @@ -5,6 +5,7 @@ "date": "22 July 2024", "contents": false, "hero": "photo-1488841714725-bb4c32d1ac94", + "topics": ["Processes"], "related": [ { "title": "Reclaim Your Agile: The One Clever Trick Agile Coaches Don't Want You to Know", "description": "What if I told you there's one trick to being able to reshape your team's development process without your company knowing it? What if I told you that you can achieve actual Agile even though you work in a Scrum firm?", "fileName": "reclaim_your_agile" }, { "title": "Eight Maxims", "description": "A few principles for thoughtful software engineering.", "fileName": "eight_maxims" }, diff --git a/Site/Posts/eight_maxims.md b/Site/Posts/eight_maxims.md index 3170237..49a69ef 100644 --- a/Site/Posts/eight_maxims.md +++ b/Site/Posts/eight_maxims.md @@ -5,6 +5,7 @@ "date": "17 January 2024", "contents": false, "hero": "photo-1553736277-055142d018f0", + "topics": ["Industry", "Processes", "Standards"], "related": [ { "title": "Clean Meetings: A Software Engineer's Guide", "description": "If being in meetings all day isn't bad enough, spending more time thinking about them seems horrible. Here's a simple guide on making sure you're getting the most out of your meetings.", "fileName": "clean_meetings_a_software_engineers_guide" }, { "title": "My (Continuing) Descent Into Madness", "description": "It started simply enough, when I asked myself if I should try an IDE other than Visual Studio. Mere months later, I'm now using a tiling window manager. This is the story of my (continuing) descent into madness.", "fileName": "my_continuing_descent_into_madness" }, diff --git a/Site/Posts/end_to_end_encryption_witn_blazor_wasm.md b/Site/Posts/end_to_end_encryption_witn_blazor_wasm.md index 1dda0dd..fa280df 100644 --- a/Site/Posts/end_to_end_encryption_witn_blazor_wasm.md +++ b/Site/Posts/end_to_end_encryption_witn_blazor_wasm.md @@ -5,6 +5,7 @@ "date": "17 April 2024", "contents": true, "hero": "photo-1572435555646-7ad9a149ad91", + "topics": ["Dotnet", "Security", "How-To"], "related": [ { "title": "Write Your Own RDBMS Versioned Migration Boilerplate", "description": "Versioned migrations are an essential tool for systems using an RDBMS, and it's no work at all to start your applications the right way with this pattern.", "fileName": "write_your_own_rdbms_versioned_migration_boilerplate" }, { "title": "Deploying ASP.NET 7 Projects with Railway", "description": "Railway is a startup cloud infrastructure provider that has gained traction for being easy to use and cheap for hobbyists. Let's get a .NET 7 Blazor WASM app up and running with it!", "fileName": "deploying_aspdotnet_7_projects_with_railway" }, diff --git a/Site/Posts/farewell_twin_cities_code_camp.md b/Site/Posts/farewell_twin_cities_code_camp.md index 37ce9ac..1f027af 100644 --- a/Site/Posts/farewell_twin_cities_code_camp.md +++ b/Site/Posts/farewell_twin_cities_code_camp.md @@ -5,6 +5,7 @@ "date": "27 March 2024", "contents": false, "hero": "photo-1529268209110-62be1d87fe75", + "topics": ["Industry"], "related": [ { "title": "An Introduction to Sprache", "description": "Sprache is a parser-combinator library for C# that uses Linq to construct parsers. In this post I describe the fundamentals of understanding grammars and parsing them with Sprache, with several real-world examples.", "fileName": "sprache" }, { "title": "Daily Grug", "description": "Need inspiration start day, made API.", "fileName": "daily_grug" }, diff --git a/Site/Posts/four_deeply_ingrained_csharp_cliches.md b/Site/Posts/four_deeply_ingrained_csharp_cliches.md index dbcba45..b584fbc 100644 --- a/Site/Posts/four_deeply_ingrained_csharp_cliches.md +++ b/Site/Posts/four_deeply_ingrained_csharp_cliches.md @@ -5,6 +5,7 @@ "date": "4 February 2024", "contents": false, "hero": "photo-1619468654139-877048c5a71f", + "topics": ["Dotnet", "Standards"], "related": [ { "title": "Eight Maxims", "description": "A few principles for thoughtful software engineering.", "fileName": "eight_maxims" }, { "title": "My (Continuing) Descent Into Madness", "description": "It started simply enough, when I asked myself if I should try an IDE other than Visual Studio. Mere months later, I'm now using a tiling window manager. This is the story of my (continuing) descent into madness.", "fileName": "my_continuing_descent_into_madness" }, diff --git a/Site/Posts/free_planning_poker.md b/Site/Posts/free_planning_poker.md index 9a6d9fe..fb3c2a1 100644 --- a/Site/Posts/free_planning_poker.md +++ b/Site/Posts/free_planning_poker.md @@ -5,6 +5,7 @@ "date": "13 April 2024", "contents": false, "hero": "photo-1596451190630-186aff535bf2", + "topics": ["Projects", "Dotnet"], "related": [ { "title": "Reclaim Your Agile: The One Clever Trick Agile Coaches Don't Want You to Know", "description": "What if I told you there's one trick to being able to reshape your team's development process without your company knowing it? What if I told you that you can achieve actual Agile even though you work in a Scrum firm?", "fileName": "reclaim_your_agile" }, { "title": "Deploying ASP.NET 7 Projects with Railway", "description": "Railway is a startup cloud infrastructure provider that has gained traction for being easy to use and cheap for hobbyists. Let's get a .NET 7 Blazor WASM app up and running with it!", "fileName": "deploying_aspdotnet_7_projects_with_railway" }, diff --git a/Site/Posts/giscus_is_awesome.md b/Site/Posts/giscus_is_awesome.md index 8026239..f691669 100644 --- a/Site/Posts/giscus_is_awesome.md +++ b/Site/Posts/giscus_is_awesome.md @@ -5,6 +5,7 @@ "date": "14 September 2023", "contents": false, "hero": "photo-1591799589332-7a340007f79f", + "topics": ["Tooling", "Blogging"], "related": [ { "title": "Deploying ASP.NET 7 Projects with Railway", "description": "Railway is a startup cloud infrastructure provider that has gained traction for being easy to use and cheap for hobbyists. Let's get a .NET 7 Blazor WASM app up and running with it!", "fileName": "deploying_aspdotnet_7_projects_with_railway" }, { "title": "An Introduction to Sprache", "description": "Sprache is a parser-combinator library for C# that uses Linq to construct parsers. In this post I describe the fundamentals of understanding grammars and parsing them with Sprache, with several real-world examples.", "fileName": "sprache" }, diff --git a/Site/Posts/guerrila_devex_testing.md b/Site/Posts/guerrila_devex_testing.md index a160733..d839952 100644 --- a/Site/Posts/guerrila_devex_testing.md +++ b/Site/Posts/guerrila_devex_testing.md @@ -5,6 +5,7 @@ "date": "11 October 2024", "contents": false, "hero": "photo-1708358097162-be6494dd44b3", + "topics": ["Processes", "DevEx", "How-To"], "related": [ { "title": "The Case for Single-Reviewer PRs", "description": "Or, strengthening your team and its code with communication, professionalism, and trust.", "fileName": "the_case_for_single_reviewer_prs" }, { "title": "Reclaim Your Agile: The One Clever Trick Agile Coaches Don't Want You to Know", "description": "What if I told you there's one trick to being able to reshape your team's development process without your company knowing it? What if I told you that you can achieve actual Agile even though you work in a Scrum firm?", "fileName": "reclaim_your_agile" }, diff --git a/Site/Posts/its_better_to_be_consistently_incorrect_than_consistently_correct.md b/Site/Posts/its_better_to_be_consistently_incorrect_than_consistently_correct.md index 21abf83..e0e9e9b 100644 --- a/Site/Posts/its_better_to_be_consistently_incorrect_than_consistently_correct.md +++ b/Site/Posts/its_better_to_be_consistently_incorrect_than_consistently_correct.md @@ -5,6 +5,7 @@ "date": "15 February 2024", "contents": true, "hero": "photo-1598826739205-d09823c3bc3d", + "topics": ["Architecture", "DevEx", "Standards"], "related": [ { "title": "Eight Maxims", "description": "A few principles for thoughtful software engineering.", "fileName": "eight_maxims" }, { "title": "Reclaim Your Agile: The One Clever Trick Agile Coaches Don't Want You to Know", "description": "What if I told you there's one trick to being able to reshape your team's development process without your company knowing it? What if I told you that you can achieve actual Agile even though you work in a Scrum firm?", "filename": "reclaim_your_agile" }, diff --git a/Site/Posts/ive_indiewebbed_my_site.md b/Site/Posts/ive_indiewebbed_my_site.md index 8018a1e..5200b66 100644 --- a/Site/Posts/ive_indiewebbed_my_site.md +++ b/Site/Posts/ive_indiewebbed_my_site.md @@ -5,6 +5,7 @@ "date": "1 April 2024", "contents": false, "hero": "photo-1589933767411-38a58367efd7", + "topics": ["BLogging", "Patterns", "Tooling"], "related": [ { "title": "Giscus Is Awesome", "description": "I can add comments to my statically generated blog? Using GitHub Discussions?? For Free??? And it works????", "fileName": "giscus_is_awesome" }, { "title": "Daily Grug", "description": "Need inspiration start day, made API.", "fileName": "daily_grug" }, diff --git a/Site/Posts/ive_stopped_using_visual_studio.md b/Site/Posts/ive_stopped_using_visual_studio.md index 5c3c16c..f6fe37d 100644 --- a/Site/Posts/ive_stopped_using_visual_studio.md +++ b/Site/Posts/ive_stopped_using_visual_studio.md @@ -5,6 +5,7 @@ "date": "30 September 2024", "contents": false, "hero": "photo-1649180564403-db28d5673f48", + "topics": ["Tooling", "DevEx", "Dotnet"], "related": [ { "title": "My (Continuing) Descent Into Madness", "description": "It started simply enough, when I asked myself if I should try an IDE other than Visual Studio. Mere months later, I'm now using a tiling window manager. This is the story of my (continuing) descent into madness.", "fileName": "my_continuing_descent_into_madness" }, { "title": "90% of my Homepage was Useless", "description": "In a few days, I reduced the size of my homepage to 10% of what it had been, and sped it up by 50-66%.", "fileName": "90_of_my_homepage_was_useless" }, diff --git a/Site/Posts/just_use_postgresql.md b/Site/Posts/just_use_postgresql.md index e7b4fc8..ec28864 100644 --- a/Site/Posts/just_use_postgresql.md +++ b/Site/Posts/just_use_postgresql.md @@ -5,6 +5,7 @@ "date": "13 January 2024", "contents": false, "hero": "photo-1599921778557-082147629542", + "topics": ["Databases", "Postgres", "Standards"], "related": [ { "title": "Write Your Own RDBMS Versioned Migration Boilerplate", "description": "Versioned migrations are an essential tool for systems using an RDBMS, and it's no work at all to start your applications the right way with this pattern.", "fileName": "write_your_own_rdbms_versioned_migration_boilerplate" }, { "title": "Quick & Dirty Sequential IDs in MongoDB", "description": "Mongo doesn't natively support generating sequential IDs. Here's a quick & dirty solution to get you up and going if you need sequential IDs.", "fileName": "quick_and_dirty_sequential_ids_in_mongo" }, diff --git a/Site/Posts/lateny_is_zero.md b/Site/Posts/lateny_is_zero.md index 91045da..e5b191b 100644 --- a/Site/Posts/lateny_is_zero.md +++ b/Site/Posts/lateny_is_zero.md @@ -5,6 +5,7 @@ "date": "29 March 2024", "contents": true, "hero": "photo-1451187580459-43490279c0fa", + "topics": ["Distribution", "Performance"], "series": "Fallacies of Distributed Computing", "related": [ { "title": "The Network is Unreliable and Reliability is Scary", "description": "Indeed the network is unreliable, and this is especially concerning for modern, distributed system. The catch though is that it never can be 100% reliable, and we can't create systems that perfectly compensate for this.", "fileName": "the_network_is_reliable" }, diff --git a/Site/Posts/learn_the_old_languages.md b/Site/Posts/learn_the_old_languages.md index da76700..234e28e 100644 --- a/Site/Posts/learn_the_old_languages.md +++ b/Site/Posts/learn_the_old_languages.md @@ -5,6 +5,7 @@ "date": "20 September 2024", "contents": false, "hero": "photo-1637356216542-0d0a4e93f992", + "topics": ["Languages", "Learning"], "related": [ { "title": "It's Better to be Consistently Incorrect than Inconsistently Correct", "description": "On consistency in code and what it means for something to be 'incorrect'", "fileName": "its_better_to_be_consistently_incorrect_than_consistently_correct" }, { "title": "90% of my Homepage was Useless", "description": "In a few days, I reduced the size of my homepage to 10% of what it had been, and sped it up by 50-66%.", "fileName": "90_of_my_homepage_was_useless" }, diff --git a/Site/Posts/my_continuing_descent_into_madness.md b/Site/Posts/my_continuing_descent_into_madness.md index ed8d6cc..a88e461 100644 --- a/Site/Posts/my_continuing_descent_into_madness.md +++ b/Site/Posts/my_continuing_descent_into_madness.md @@ -5,6 +5,7 @@ "date": "9 December 2023", "contents": false, "hero": "photo-1549605659-32d82da3a059", + "topics": ["Tooling", "DevEx"], "related": [ { "title": "Giscus Is Awesome", "description": "I can add comments to my statically generated blog? Using GitHub Discussions?? For Free??? And it works????", "fileName": "giscus_is_awesome" }, { "title": "A Scrum Odyssey", "description": "A journey away from daily scrum meetings, as a cycle of eight Shakespearean sonnets.", "fileName": "a_scrum_odyssey" }, diff --git a/Site/Posts/on_task_priority.md b/Site/Posts/on_task_priority.md index 3bb8b40..cf726a6 100644 --- a/Site/Posts/on_task_priority.md +++ b/Site/Posts/on_task_priority.md @@ -5,6 +5,7 @@ "date": "3 March 2024", "contents": false, "hero": "photo-1623045832976-664b045bfea3", + "topics": ["Processes"], "related": [ { "title": "Reclaim Your Agile: The One Clever Trick Agile Coaches Don't Want You to Know", "description": "What if I told you there's one trick to being able to reshape your team's development process without your company knowing it? What if I told you that you can achieve actual Agile even though you work in a Scrum firm?", "fileName": "reclaim_your_agile" }, { "title": "Clean Meetings: A Software Engineer's Guide", "description": "If being in meetings all day isn't bad enough, spending more time thinking about them seems horrible. Here's a simple guide on making sure you're getting the most out of your meetings.", "fileName": "clean_meetings_a_software_engineers_guide" }, diff --git a/Site/Posts/postgres_use_views_to_refactor_to_soft_delete.md b/Site/Posts/postgres_use_views_to_refactor_to_soft_delete.md index 7da531f..d6210f1 100644 --- a/Site/Posts/postgres_use_views_to_refactor_to_soft_delete.md +++ b/Site/Posts/postgres_use_views_to_refactor_to_soft_delete.md @@ -5,6 +5,7 @@ "date": "5 October 2024", "contents": true, "hero": "photo-1560506839-a23b986135a0", + "topics": ["Databases", "Postgres", "How-To", "Architecture"], "related": [ { "title": "Write Your Own RDBMS Versioned Migration Boilerplate", "description": "Versioned migrations are an essential tool for systems using an RDBMS, and it's no work at all to start your applications the right way with this pattern.", "fileName": "write_your_own_rdbms_versioned_migration_boilerplate" }, { "title": "Just Use PostgreSQL", "description": "With a vast and growing ecosystem of database systems, data models, patterns, and paradigms, choosing the right one can be a long and complicated process. I prefer a simpler approach: Just use PostgreSQL.", "fileName": "just_use_postgresql" }, diff --git a/Site/Posts/quick_and_dirty_sequential_ids_in_mongo.md b/Site/Posts/quick_and_dirty_sequential_ids_in_mongo.md index 83da2ae..4ac2a52 100644 --- a/Site/Posts/quick_and_dirty_sequential_ids_in_mongo.md +++ b/Site/Posts/quick_and_dirty_sequential_ids_in_mongo.md @@ -5,6 +5,7 @@ "date": "1 November 2023", "contents": false, "hero": "photo-1534078362425-387ae9668c17", + "topics": ["Databases", "Mongo", "How-To"], "related": [ { "title": "Deploying ASP.NET 7 Projects with Railway", "description": "Railway is a startup cloud infrastructure provider that has gained traction for being easy to use and cheap for hobbyists. Let's get a .NET 7 Blazor WASM app up and running with it!", "fileName": "deploying_aspdotnet_7_projects_with_railway" }, { "title": "Giscus is Awesome", "description": "I can add comments to my statically generated blog? Using GitHub Discussions?? For Free??? And it works????", "fileName": "giscus_is_awesome" } diff --git a/Site/Posts/reclaim_your_agile.md b/Site/Posts/reclaim_your_agile.md index e73905b..c61bbff 100644 --- a/Site/Posts/reclaim_your_agile.md +++ b/Site/Posts/reclaim_your_agile.md @@ -5,6 +5,7 @@ "date": "13 December 2023", "contents": true, "hero": "photo-1526232761682-d26e03ac148e", + "topics": ["Processes"], "related": [ { "title": "Clean Meetings: A Software Engineer's Guide", "description": "If being in meetings all day isn't bad enough, spending more time thinking about them seems horrible. Here's a simple guide on making sure you're getting the most out of your meetings.", "fileName": "clean_meetings_a_software_engineers_guide" }, { "title": "A Scrum Odyssey", "description": "A journey away from daily scrum meetings, as a cycle of eight Shakespearean sonnets.", "filename": "a_scrum_odyssey" }, diff --git a/Site/Posts/roll_your_own_csharp_results.md b/Site/Posts/roll_your_own_csharp_results.md index adfbc94..81a22ad 100644 --- a/Site/Posts/roll_your_own_csharp_results.md +++ b/Site/Posts/roll_your_own_csharp_results.md @@ -5,6 +5,7 @@ "date": "3 May 2024", "contents": false, "hero": "photo-1562158147-f8d6fbcd76f8", + "topics": ["Dotnet", "Patterns", "How-To"], "related": [ { "title": "Roll Your Own End-to-End Encryption in Blazor WASM", "description": "Using the SubtleCrypto API to get simple end-to-end encryption for a collaborative Blazor WASM app.", "fileName": "end_to_end_encryption_witn_blazor_wasm" }, { "title": "Book Club 10/2023: Functional Patterns in C#", "description": "This month I've focused on functional domain modeling and related patterns. We're just a few weeks away from the release of the next version of C#, and like each previous version it'll introduce even more functional features.", "fileName": "book_club_10-2023" }, diff --git a/Site/Posts/scrum_is_not_agile.md b/Site/Posts/scrum_is_not_agile.md index 96931cf..3bc771e 100644 --- a/Site/Posts/scrum_is_not_agile.md +++ b/Site/Posts/scrum_is_not_agile.md @@ -5,6 +5,7 @@ "date": "5 June 2024", "contents": false, "hero": "photo-1480099225005-2513c8947aec", + "topics": ["Processes", "Industry"], "related": [ { "title": "Reclaim Your Agile: The One Clever Trick Agile Coaches Don't Want You to Know", "description": "What if I told you there's one trick to being able to reshape your team's development process without your company knowing it? What if I told you that you can achieve actual Agile even though you work in a Scrum firm?", "fileName": "reclaim_your_agile" }, { "title": "On Task Priority", "description": "Some thoughts on assigning priority to our tasks.", "fileName": "on_task_priority" }, diff --git a/Site/Posts/should_i_learn_insert_some_tech_here.md b/Site/Posts/should_i_learn_insert_some_tech_here.md index b7eed08..e49c85b 100644 --- a/Site/Posts/should_i_learn_insert_some_tech_here.md +++ b/Site/Posts/should_i_learn_insert_some_tech_here.md @@ -5,6 +5,7 @@ "date": "14 November 2023", "contents": false, "hero": "photo-1522435229388-6f7a422cd95b", + "topics": ["Learning"], "related": [ { "title": "Book Club 9/2023: Papers I Love", "description": "Reflecting on the final Strange Loop conference, having attended several 'Papers We Love' talks, I'm motivated to share five papers I love.", "fileName": "book_club_9-2023" }, { "title": "A Scrum Odyssey", "description": "A journey away from daily scrum meetings, as a cycle of eight Shakespearean sonnets.", "fileName": "a_scrum_odyssey" }, diff --git a/Site/Posts/the_case_for_single_reviewer_prs.md b/Site/Posts/the_case_for_single_reviewer_prs.md index df44f73..c12245a 100644 --- a/Site/Posts/the_case_for_single_reviewer_prs.md +++ b/Site/Posts/the_case_for_single_reviewer_prs.md @@ -5,6 +5,7 @@ "date": "13 July 2024", "contents": false, "hero": "photo-1559629304-47a70c8c042e", + "topics": ["Processes"], "related": [ { "title": "Develop Effective Coding Standards", "description": "Bad coding standards are worse than no standards, and even good standards are sometimes unnecessary. What's the utility in coding standards, and what makes a good one?", "fileName": "develop_effective_coding_standards" }, { "title": "It's Better to be Consistently Incorrect than Inconsistently Correct", "description": "On consistency in code and what it means for something to be 'incorrect'", "fileName": "its_better_to_be_consistently_incorrect_than_consistently_correct" }, diff --git a/Site/Posts/the_network_is_reliable.md b/Site/Posts/the_network_is_reliable.md index 598d3bf..3f68b97 100644 --- a/Site/Posts/the_network_is_reliable.md +++ b/Site/Posts/the_network_is_reliable.md @@ -5,6 +5,7 @@ "date": "21 February 2024", "contents": true, "hero": "photo-1451187580459-43490279c0fa", + "topics": ["Distribution", "Processes", "Patterns"], "series": "Fallacies of Distributed Computing", "related": [ { "title": "Book Club 9/2023: Papers I Love", "description": "Reflecting on the final Strange Loop conference, having attended several 'Papers We Love' talks, I'm motivated to share five papers I love.", "fileName": "book_club_9-2023" }, diff --git a/Site/Posts/the_network_is_secure.md b/Site/Posts/the_network_is_secure.md index b2c80e2..9960cbc 100644 --- a/Site/Posts/the_network_is_secure.md +++ b/Site/Posts/the_network_is_secure.md @@ -5,6 +5,7 @@ "date": "30 May 2024", "contents": true, "hero": "photo-1451187580459-43490279c0fa", + "topics": ["Distribution", "Security"], "series": "Fallacies of Distributed Computing", "related": [ { "title": "Bandwidth is Infinite ... ly Troublesome", "description": "The bandwidth of the world-wide web has increased dramatically, but so has its demand. There's an abolute limit to how much data we can all transmit, and working around that requires dilligence.", "fileName": "bandwidth_is_infinite_ly_troublesome" }, diff --git a/Site/Posts/there_is_one_admin.md b/Site/Posts/there_is_one_admin.md index f6e1c12..a5c5405 100644 --- a/Site/Posts/there_is_one_admin.md +++ b/Site/Posts/there_is_one_admin.md @@ -5,6 +5,7 @@ "date": "23 August 2024", "contents": true, "hero": "photo-1451187580459-43490279c0fa", + "topics": ["Distribution", "Processes", "Architecture"], "series": "Fallacies of Distributed Computing", "related": [ { "title": "The Topologies They Are a-Changin'", "description": "Okay, dumb title, but could you really have done better? Shifting topologies have always presented problems for distributed computing, and modern infrastructure systems sometimes leave us worse off than ever before.", "fileName": "topology_doesnt_change" }, diff --git a/Site/Posts/theres_always_money_in_the_banana_stand.md b/Site/Posts/theres_always_money_in_the_banana_stand.md index fae6fb8..da5c36c 100644 --- a/Site/Posts/theres_always_money_in_the_banana_stand.md +++ b/Site/Posts/theres_always_money_in_the_banana_stand.md @@ -5,6 +5,7 @@ "date": "30 August 2024", "contents": false, "hero": "photo-1451187580459-43490279c0fa", + "topics": ["Distribution", "Architecture"], "series": "Fallacies of Distributed Computing", "related": [ { "title": "There Are Infinite Administrators", "description": "Yes, infinite, and they're inventing more each day! The larger the system, the greater the problem that nobody really knows how it all works.", "fileName": "there_is_one_admin" }, diff --git a/Site/Posts/topology_doesnt_change.md b/Site/Posts/topology_doesnt_change.md index af13ca2..102099d 100644 --- a/Site/Posts/topology_doesnt_change.md +++ b/Site/Posts/topology_doesnt_change.md @@ -5,6 +5,7 @@ "date": "19 June 2024", "contents": true, "hero": "photo-1451187580459-43490279c0fa", + "topics": ["Distribution", "Architecture"], "series": "Fallacies of Distributed Computing", "related": [ { "title": "There's More to Network Security than the Network", "description": "Assuming a secure network in a distributed system loses sight of all the ways vulnerabilities can creep into our systems. Just as distributed computing makes our systems 10x more complex, the same effect is felt on security.", "fileName": "the_network_is_secure" }, diff --git a/Site/Posts/using_interfaces.md b/Site/Posts/using_interfaces.md index 9f3b414..bcda929 100644 --- a/Site/Posts/using_interfaces.md +++ b/Site/Posts/using_interfaces.md @@ -5,6 +5,7 @@ "date": "8 June 2024", "contents": false, "hero": "photo-1634136145105-03a3c2455513", + "topics": ["Standards", "Architecture"], "related": [ { "title": "Develop Effective Coding Standards", "description": "Bad coding standards are worse than no standards, and even good standards are sometimes unnecessary. What's the utility in coding standards, and what makes a good one?", "fileName": "develop_effective_coding_standards" }, { "title": "It's Better to be Consistently Incorrect than Inconsistently Correct", "description": "On consistency in code and what it means for something to be 'incorrect'", "fileName": "its_better_to_be_consistently_incorrect_than_consistently_correct" }, diff --git a/Site/Posts/why_i_have_this_blog.md b/Site/Posts/why_i_have_this_blog.md index 32c7bbb..54a5b7c 100644 --- a/Site/Posts/why_i_have_this_blog.md +++ b/Site/Posts/why_i_have_this_blog.md @@ -5,6 +5,7 @@ "date": "9 September 2024", "contents": false, "hero": "photo-1436918898788-ebce04d38e46", + "topics": ["Blogging"], "related": [ { "title": "My (Continuing) Descent Into Madness", "description": "A journey away from daily scrum meetings, as a cycle of eight Shakespearean sonnets.", "fileName": "my_continuing_descent_into_madness" }, { "title": "Thing I Made: FreePlanningPoker.io", "description": "I made a free planning poker tool and named it aptly.", "fileName": "free_planning_poker" }, diff --git a/Site/Posts/write_your_own_rdbms_versioned_migration_boilerplate.md b/Site/Posts/write_your_own_rdbms_versioned_migration_boilerplate.md index e31e3f3..6bbacfb 100644 --- a/Site/Posts/write_your_own_rdbms_versioned_migration_boilerplate.md +++ b/Site/Posts/write_your_own_rdbms_versioned_migration_boilerplate.md @@ -5,6 +5,7 @@ "date": "25 November 2023", "contents": false, "hero": "photo-1596563910641-86f6aebaab9a", + "topics": ["Databases", "How-To"], "related": [ { "title": "Adding a Database to our Railway App", "description": "Last time I looked at Railway, I got it up and running with a Blazor WASM app. Now, I'll look at adding a PostgreSQL database to it.", "fileName": "adding_a_database_to_our_railway_app" }, { "title": "Quick & Dirty Sequential IDs in MongoDB", "description": "Mongo doesn't natively support generating sequential IDs. Here's a quick & dirty solution to get you up and going if you need sequential IDs.", "fileName": "quick_and_dirty_sequential_ids_in_mongo" } diff --git a/Static/site.css b/Static/site.css index c544e04..819df4b 100644 --- a/Static/site.css +++ b/Static/site.css @@ -341,7 +341,8 @@ header { } header small { - display: block; + display: flex; + gap: 40px; font-family: 'Montserrat'; font-weight: 400; font-size: 10pt; @@ -367,8 +368,12 @@ header { margin-right: 2px; } - header>small>span { - margin-right: 36px; + header>small>span.topics { + margin-left: auto; + } + + header>small>span.topics a:not(:last-child) { + margin-right: 4px; } header p { diff --git a/Templates/archive.liquid b/Templates/archive.liquid index dffb7a7..a8928fd 100644 --- a/Templates/archive.liquid +++ b/Templates/archive.liquid @@ -14,6 +14,10 @@
Series Archive
{{ seriesDescription | raw }}
+ {% elif topic %} +
+

Topic: {{ topic }}

+
{% else %}

A blog about software engineering and architecture.

{% endif %} diff --git a/Templates/article.liquid b/Templates/article.liquid index 515eeea..017dd03 100644 --- a/Templates/article.liquid +++ b/Templates/article.liquid @@ -19,6 +19,15 @@ History + + {% if topics %} + + + {% for topic in topics %} + {{ topic }} + {% endfor %} + + {% endif %}

{{ description }}

diff --git a/build.csx b/build.csx index 91f8608..c77caa2 100644 --- a/build.csx +++ b/build.csx @@ -16,6 +16,7 @@ using System; using System.Text.Json; IEnumerable seriesInfo = []; +IEnumerable topicInfo = []; using (var reader = new StreamReader("Config/series.json")) { @@ -112,6 +113,7 @@ new MetalsharpProject() .Use(project => // Add SEO and "series" metadata to posts { var seriesPosts = new Dictionary>>(); + var topicPosts = new Dictionary>>(); var posts = project.OutputFiles.Where(f => f.Directory.StartsWith(@".\Posts")); foreach (var post in posts) @@ -151,6 +153,21 @@ new MetalsharpProject() seriesPosts.Add(seriesName, [ post.Metadata ]); } } + + if (post.Metadata.TryGetValue("topics", out var topicsObject) && topicsObject is IEnumerable topics) + { + foreach (var topic in topics) + { + if (topicPosts.TryGetValue(seriesName, out var topicPostsList)) + { + seriesPosts[topic] = [ ..topicPostsList, post.Metadata ]; + } + else + { + topicPosts.Add(topic, [ post.Metadata ]); + } + } + } } foreach (var series in seriesPosts) @@ -164,6 +181,18 @@ new MetalsharpProject() ["posts"] = series.Value.OrderByDescending(p => DateTime.Parse(p["date"].ToString())) })); } + + foreach (var topic in topicPosts) + { + project.AddOutput(new MetalsharpFile(string.Empty, $".\\Series\\{topic.Key.ToLowerInvariant()}.html", new Dictionary() + { + ["title"] = topic.Key, + ["topic"] = topic.Key, + ["template"] = "archive", + ["removeScrollspy"] = true, + ["posts"] = topic.Value.OrderByDescending(p => DateTime.Parse(p["date"].ToString())) + })); + } }) .Use(project => // Add table of contents to posts {