From ad78a3e27ed2e204f7676a0df745d977f7521938 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 31 Dec 2025 08:30:21 +0000 Subject: [PATCH] Initial blog list with placeholder posts --- archetypes/blogs/index.md | 10 + assets/sass/pages/blogs.scss | 684 ++++++++++++++++++ assets/sass/style.scss | 1 + config.yml | 4 +- .../index.md | 29 + .../index.md | 41 ++ .../index.md | 48 ++ .../index.md | 41 ++ .../index.md | 38 + .../index.md | 51 ++ .../index.md | 45 ++ .../index.md | 55 ++ content/blogs/_index.md | 5 + layouts/_default/list.html | 2 +- layouts/blogs/list.html | 41 ++ layouts/blogs/single.html | 48 ++ layouts/blogs/summary.html | 26 + layouts/partials/pagination.html | 26 + layouts/post/list.html | 2 +- layouts/tags/list.html | 32 + 20 files changed, 1225 insertions(+), 4 deletions(-) create mode 100644 archetypes/blogs/index.md create mode 100644 assets/sass/pages/blogs.scss create mode 100644 content/blogs/2025-01-15-getting-started-with-hugo/index.md create mode 100644 content/blogs/2025-01-20-customizing-your-development-environment/index.md create mode 100644 content/blogs/2025-01-25-building-resilient-systems/index.md create mode 100644 content/blogs/2025-02-01-understanding-async-programming/index.md create mode 100644 content/blogs/2025-02-05-weekly-update-february-5/index.md create mode 100644 content/blogs/2025-02-10-exploring-terminal-emulators/index.md create mode 100644 content/blogs/2025-02-12-weekly-update-february-12/index.md create mode 100644 content/blogs/2025-02-15-version-control-best-practices/index.md create mode 100644 content/blogs/_index.md create mode 100644 layouts/blogs/list.html create mode 100644 layouts/blogs/single.html create mode 100644 layouts/blogs/summary.html create mode 100644 layouts/partials/pagination.html create mode 100644 layouts/tags/list.html diff --git a/archetypes/blogs/index.md b/archetypes/blogs/index.md new file mode 100644 index 0000000..c70d77a --- /dev/null +++ b/archetypes/blogs/index.md @@ -0,0 +1,10 @@ +--- +title: "{{ replace .TranslationBaseName "-" " " | title }}" +date: {{ .Date }} +url: /blogs/{{ .TranslationBaseName }}/ +tags: + - +draft: true +--- + +Write your blog post content here. diff --git a/assets/sass/pages/blogs.scss b/assets/sass/pages/blogs.scss new file mode 100644 index 0000000..bf6a8c9 --- /dev/null +++ b/assets/sass/pages/blogs.scss @@ -0,0 +1,684 @@ +.blogs-page { + min-height: 100vh; + padding: 2rem; + position: relative; + + @include media-down(lg) { + padding: 1rem; + } + + // Main container with CRT monitor styling + .blogs-container { + max-width: 900px; + margin: 0 auto; + background: linear-gradient(145deg, #e8e0c8, #c4b89a); + border-radius: 12px; + padding: 25px 30px 45px 30px; + box-shadow: + 0 30px 60px rgba(0, 0, 0, 0.8), + inset 0 2px 4px rgba(255, 255, 255, 0.3), + inset 0 -2px 4px rgba(0, 0, 0, 0.3); + position: relative; + + @include media-down(lg) { + padding: 15px 15px 35px 15px; + border-radius: 8px; + } + + // Brand on bezel + &::before { + content: "BLOG TERMINAL"; + position: absolute; + bottom: 15px; + left: 50%; + transform: translateX(-50%); + color: #666; + font-size: 11px; + font-weight: bold; + letter-spacing: 2px; + + @include media-down(lg) { + font-size: 9px; + } + } + + // Power LED indicator + &::after { + content: ""; + position: absolute; + bottom: 15px; + right: 40px; + width: 8px; + height: 8px; + background: #0f0; + border-radius: 50%; + box-shadow: + 0 0 10px #0f0, + 0 0 20px #0f0; + animation: pulse 2s ease-in-out infinite; + + @include media-down(lg) { + right: 20px; + width: 6px; + height: 6px; + } + } + } + + // CRT screen content area + .blogs-screen { + width: 100%; + min-height: 500px; + background: #000; + border-radius: 8px; + position: relative; + overflow: hidden; + box-shadow: + inset 0 0 80px rgba(0, 255, 100, 0.1), + inset 0 0 40px rgba(0, 255, 100, 0.05), + inset 3px 3px 8px rgba(255, 255, 255, 0.1), + inset -3px -3px 8px rgba(0, 0, 0, 0.5); + + @include media-down(lg) { + border-radius: 6px; + min-height: 400px; + } + + // Screen curvature/glass emboss + &::before { + content: ""; + position: absolute; + top: -5%; + left: -5%; + right: -5%; + bottom: -5%; + background: + radial-gradient( + ellipse at 30% 30%, + rgba(255, 255, 255, 0.15) 0%, + transparent 40% + ), + radial-gradient(ellipse at center, transparent 0%, rgba(0, 0, 0, 0.3) 100%); + pointer-events: none; + z-index: 3; + border-radius: 8px; + } + + // Scanlines + &::after { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: repeating-linear-gradient( + 0deg, + rgba(0, 0, 0, 0.15) 0px, + rgba(0, 0, 0, 0.15) 1px, + transparent 1px, + transparent 2px + ); + pointer-events: none; + z-index: 2; + animation: scanline 8s linear infinite; + } + } + + // Content area (no scrolling, grows with content) + .blogs-content { + position: relative; + width: 100%; + padding: 20px; + color: #0f0; + z-index: 1; + font-family: monospace; + text-shadow: 0 0 10px rgba(0, 255, 0, 0.8); + + @include media-down(lg) { + padding: 15px; + } + + // Section intro content + > section { + margin-bottom: 30px; + + h1 { + font-size: 2rem; + margin-bottom: 1rem; + animation: textGlow 1.5s ease-in-out infinite alternate; + + @include media-down(lg) { + font-size: 1.5rem; + } + } + + p { + font-size: 1rem; + line-height: 1.6; + margin-bottom: 1rem; + } + } + } + + // Blog posts listing + .blog-posts { + display: flex; + flex-direction: column; + gap: 30px; + + @include media-down(lg) { + gap: 20px; + } + } + + // Individual blog post card + .blog-post-card { + background: rgba(0, 255, 0, 0.05); + border: 1px solid rgba(0, 255, 0, 0.3); + border-radius: 4px; + padding: 20px; + transition: all 0.3s ease; + position: relative; + + @include media-down(lg) { + padding: 15px; + } + + &:hover { + background: rgba(0, 255, 0, 0.1); + border-color: rgba(0, 255, 0, 0.6); + box-shadow: 0 0 20px rgba(0, 255, 0, 0.3); + } + + // Non-weekly posts use amber color scheme + &.non-weekly { + background: rgba(255, 153, 0, 0.05); + border-color: rgba(255, 153, 0, 0.3); + + &:hover { + background: rgba(255, 153, 0, 0.1); + border-color: rgba(255, 153, 0, 0.6); + box-shadow: 0 0 20px rgba(255, 153, 0, 0.3); + } + + .blog-title { + color: #ff9900; + + .blog-date { + color: #ff9900; + text-shadow: 0 0 5px rgba(255, 153, 0, 0.5); + } + + a { + color: #ff9900; + text-shadow: 0 0 5px rgba(255, 153, 0, 0.5); + + &::after { + background: #ff9900; + box-shadow: 0 0 10px #ff9900; + } + } + } + + .blog-tags .tag { + background: rgba(255, 153, 0, 0.2); + border-color: rgba(255, 153, 0, 0.5); + color: #ff9900; + } + } + + // Post title + .blog-title { + font-size: 1.5rem; + margin-bottom: 15px; + line-height: 1.3; + display: flex; + align-items: baseline; + gap: 12px; + flex-wrap: wrap; + + @include media-down(lg) { + font-size: 1.2rem; + gap: 8px; + } + + // Date stamp (now inline) + .blog-date { + font-size: 0.75rem; + color: #0f0; + opacity: 0.7; + font-family: "DSEG7-Classic", monospace; + text-shadow: 0 0 5px rgba(0, 255, 0, 0.5); + white-space: nowrap; + + &::before { + content: "["; + margin-right: 2px; + } + + &::after { + content: "]"; + margin-left: 2px; + } + + @include media-down(lg) { + font-size: 0.7rem; + } + } + + a { + color: greenyellow; + text-decoration: none; + position: relative; + + &::after { + content: ""; + position: absolute; + bottom: -2px; + left: 0; + width: 0; + height: 2px; + background: greenyellow; + transition: width 0.3s ease; + box-shadow: 0 0 10px greenyellow; + } + + &:hover::after { + width: 100%; + } + } + } + + // Tags container + .blog-tags { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 12px; + + .tag { + display: inline-block; + padding: 4px 10px; + background: rgba(0, 255, 0, 0.2); + border: 1px solid rgba(0, 255, 0, 0.5); + border-radius: 3px; + font-size: 0.75rem; + color: #0f0; + font-family: monospace; + text-transform: uppercase; + letter-spacing: 0.5px; + + &::before { + content: "#"; + } + } + } + + // Summary text + .blog-summary { + font-size: 0.95rem; + line-height: 1.6; + opacity: 0.9; + color: #0f0; + + @include media-down(lg) { + font-size: 0.9rem; + } + + // Links in content + a { + color: greenyellow; + text-decoration: none; + position: relative; + padding-bottom: 2px; + border-bottom: 1px dotted rgba(173, 255, 47, 0.5); + transition: all 0.3s ease; + text-shadow: 0 0 5px rgba(173, 255, 47, 0.3); + + &:hover { + border-bottom-style: solid; + border-bottom-color: rgba(173, 255, 47, 0.8); + text-shadow: 0 0 10px rgba(173, 255, 47, 0.8); + background: rgba(173, 255, 47, 0.05); + } + } + + // Headings in content + h2, h3, h4, h5, h6 { + margin-top: 1.5em; + margin-bottom: 0.75em; + color: greenyellow; + text-shadow: 0 0 10px rgba(173, 255, 47, 0.5); + } + + h2 { + font-size: 1.5rem; + border-bottom: 1px solid rgba(0, 255, 0, 0.3); + padding-bottom: 0.5rem; + margin-top: 2rem; + + @include media-down(lg) { + font-size: 1.3rem; + } + } + + h3 { + font-size: 1.25rem; + + @include media-down(lg) { + font-size: 1.15rem; + } + } + + // Code blocks + code { + background: rgba(0, 255, 0, 0.1); + border: 1px solid rgba(0, 255, 0, 0.3); + padding: 2px 6px; + border-radius: 3px; + font-family: "Courier New", monospace; + font-size: 0.9em; + } + + pre { + background: rgba(0, 255, 0, 0.05); + border: 1px solid rgba(0, 255, 0, 0.3); + border-radius: 4px; + padding: 15px; + overflow-x: auto; + margin: 1.5em 0; + + code { + background: transparent; + border: none; + padding: 0; + } + } + + // Blockquotes + blockquote { + border-left: 3px solid rgba(0, 255, 0, 0.5); + padding-left: 1rem; + margin: 1.5em 0; + font-style: italic; + opacity: 0.9; + } + + // Lists + ul, ol { + margin: 1em 0; + padding-left: 2em; + + li { + margin: 0.5em 0; + } + } + + .read-more { + display: inline-block; + margin-top: 10px; + color: greenyellow; + text-decoration: none; + font-weight: bold; + position: relative; + padding: 5px 0; + + &::after { + content: ""; + position: absolute; + bottom: 3px; + left: 0; + width: 0; + height: 2px; + background: greenyellow; + transition: width 0.3s ease; + box-shadow: 0 0 10px greenyellow; + } + + &:hover::after { + width: 100%; + } + } + } + } + + // Tag filter navigation + .blog-tags-filter { + margin-bottom: 30px; + padding: 15px; + background: rgba(0, 255, 0, 0.05); + border: 1px solid rgba(0, 255, 0, 0.3); + border-radius: 4px; + + .filter-label { + display: block; + font-size: 0.9rem; + margin-bottom: 10px; + color: greenyellow; + text-shadow: 0 0 5px rgba(173, 255, 47, 0.5); + font-weight: bold; + } + + .tag-links { + display: flex; + flex-wrap: wrap; + gap: 8px; + } + + .tag-filter-link { + display: inline-block; + padding: 6px 12px; + background: rgba(0, 255, 0, 0.1); + border: 1px solid rgba(0, 255, 0, 0.3); + border-radius: 3px; + color: #0f0; + text-decoration: none; + font-size: 0.85rem; + font-family: monospace; + transition: all 0.3s ease; + text-shadow: 0 0 5px rgba(0, 255, 0, 0.5); + + &:hover { + background: rgba(0, 255, 0, 0.2); + border-color: rgba(0, 255, 0, 0.6); + box-shadow: 0 0 10px rgba(0, 255, 0, 0.4); + text-shadow: 0 0 10px rgba(0, 255, 0, 0.8); + } + + &.active { + background: rgba(0, 255, 0, 0.3); + border-color: rgba(0, 255, 0, 0.8); + box-shadow: 0 0 10px rgba(0, 255, 0, 0.5); + text-shadow: 0 0 10px rgba(0, 255, 0, 1); + } + } + } + + // Navigation styling + .blog-navigation { + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 1px solid rgba(0, 255, 0, 0.2); + } + + .blog-post-navigation { + margin-top: 30px; + padding-top: 20px; + border-top: 1px solid rgba(0, 255, 0, 0.2); + + .post-nav-links { + display: flex; + justify-content: space-between; + gap: 20px; + flex-wrap: wrap; + + @include media-down(lg) { + flex-direction: column; + gap: 10px; + } + } + } + + .nav-link { + display: inline-block; + padding: 10px 15px; + background: rgba(0, 255, 0, 0.1); + border: 1px solid rgba(0, 255, 0, 0.3); + color: #0f0; + text-decoration: none; + font-family: monospace; + font-size: 0.9rem; + transition: all 0.3s ease; + text-shadow: 0 0 5px rgba(0, 255, 0, 0.5); + border-radius: 3px; + + &:hover:not(.disabled) { + background: rgba(0, 255, 0, 0.2); + border-color: rgba(0, 255, 0, 0.6); + box-shadow: 0 0 10px rgba(0, 255, 0, 0.4); + text-shadow: 0 0 10px rgba(0, 255, 0, 0.8); + } + + &.disabled { + opacity: 0.3; + cursor: not-allowed; + } + + &.back-link { + font-weight: bold; + } + + &.prev-post, + &.next-post { + flex: 1; + text-align: center; + max-width: 400px; + + @include media-down(lg) { + max-width: 100%; + } + } + + &.prev-post { + text-align: left; + } + + &.next-post { + text-align: right; + } + } + + // Pagination styling + .pagination { + margin-top: 30px; + padding-top: 20px; + border-top: 1px solid rgba(0, 255, 0, 0.2); + text-align: center; + + ul { + display: flex; + justify-content: center; + align-items: center; + gap: 5px; + list-style: none; + padding: 0; + flex-wrap: wrap; + + li { + a, span { + display: block; + padding: 6px 12px; + background: transparent; + border: 1px solid rgba(0, 255, 0, 0.3); + color: #0f0; + text-decoration: none; + font-family: "DSEG7-Classic", monospace; + font-size: 0.9rem; + transition: all 0.3s ease; + min-width: 35px; + text-align: center; + text-shadow: 0 0 5px rgba(0, 255, 0, 0.5); + + &:hover { + background: rgba(0, 255, 0, 0.1); + border-color: rgba(0, 255, 0, 0.7); + box-shadow: + 0 0 10px rgba(0, 255, 0, 0.4), + inset 0 0 10px rgba(0, 255, 0, 0.1); + text-shadow: 0 0 10px rgba(0, 255, 0, 0.8); + } + } + + &.active span { + background: rgba(0, 255, 0, 0.2); + border-color: rgba(0, 255, 0, 0.8); + box-shadow: + 0 0 15px rgba(0, 255, 0, 0.5), + inset 0 0 10px rgba(0, 255, 0, 0.2); + text-shadow: 0 0 10px rgba(0, 255, 0, 1); + } + + // Previous/Next buttons + &:first-child a, + &:last-child a { + &::before, + &::after { + font-family: monospace; + font-weight: bold; + } + } + + // Disabled state + &.disabled { + a, span { + opacity: 0.3; + cursor: not-allowed; + + &:hover { + background: transparent; + border-color: rgba(0, 255, 0, 0.3); + box-shadow: none; + } + } + } + } + } + } +} + +@keyframes textGlow { + from { + text-shadow: 0 0 10px rgba(0, 255, 0, 0.8); + } + to { + text-shadow: + 0 0 20px rgba(0, 255, 0, 1), + 0 0 30px rgba(0, 255, 0, 0.6); + } +} + +@keyframes scanline { + 0% { + transform: translateY(0); + } + 100% { + transform: translateY(10px); + } +} + +@keyframes pulse { + 0%, + 100% { + opacity: 1; + box-shadow: + 0 0 10px #0f0, + 0 0 20px #0f0; + } + 50% { + opacity: 0.5; + box-shadow: + 0 0 5px #0f0, + 0 0 10px #0f0; + } +} diff --git a/assets/sass/style.scss b/assets/sass/style.scss index 464ff70..15806b8 100644 --- a/assets/sass/style.scss +++ b/assets/sass/style.scss @@ -18,6 +18,7 @@ @import "pages/about"; @import "pages/audio"; @import "pages/now"; +@import "pages/blogs"; @import url("https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&family=Neonderthaw&display=swap"); diff --git a/config.yml b/config.yml index 4f831a7..ddcd53b 100644 --- a/config.yml +++ b/config.yml @@ -20,8 +20,8 @@ frontmatter: - date - publishDate -disableKinds: ["taxonomy", "term"] -taxonomies: {} +taxonomies: + tag: tags params: env: production diff --git a/content/blogs/2025-01-15-getting-started-with-hugo/index.md b/content/blogs/2025-01-15-getting-started-with-hugo/index.md new file mode 100644 index 0000000..183452b --- /dev/null +++ b/content/blogs/2025-01-15-getting-started-with-hugo/index.md @@ -0,0 +1,29 @@ +--- +title: Getting Started with Hugo +date: 2025-01-15T10:00:00+00:00 +url: /blogs/getting-started-with-hugo/ +tags: + - hugo + - web development + - static sites +draft: false +--- + +Hugo is an incredibly fast static site generator that makes building websites a breeze. In this post, we'll explore why Hugo has become such a popular choice for developers and content creators alike. + +## Why Choose Hugo? + +There are several compelling reasons to choose Hugo for your next project: + +- **Speed**: Hugo is blazingly fast, building most sites in milliseconds +- **Simplicity**: Clean folder structure and intuitive templating +- **Flexibility**: Extensive theme support and customization options +- **No Dependencies**: Single binary with no need for complex toolchains + +## Getting Started + +The basics of getting started with Hugo are straightforward. Install the binary, create a new site, and you're ready to start creating content. + +## Conclusion + +Hugo provides an excellent foundation for building modern static websites. Whether you're creating a blog, portfolio, or documentation site, Hugo has the tools you need. diff --git a/content/blogs/2025-01-20-customizing-your-development-environment/index.md b/content/blogs/2025-01-20-customizing-your-development-environment/index.md new file mode 100644 index 0000000..24be60d --- /dev/null +++ b/content/blogs/2025-01-20-customizing-your-development-environment/index.md @@ -0,0 +1,41 @@ +--- +title: Customizing Your Development Environment +date: 2025-01-20T14:30:00+00:00 +url: /blogs/customizing-your-development-environment/ +tags: + - productivity + - tools + - development + - workflow +draft: false +--- + +Your development environment is where you spend most of your time as a developer. Making it work efficiently for you can dramatically improve your productivity and enjoyment of coding. + +## The Power of Personalization + +Every developer has unique preferences and workflows. What works perfectly for one person might feel clunky to another. That's why customizing your environment is so important. + +## Essential Customizations + +Here are some areas worth investing time in: + +### Terminal Setup + +A well-configured terminal can make command-line work much more pleasant. Consider customizing your shell prompt, aliases, and color scheme. + +### Editor Configuration + +Whether you prefer VS Code, Vim, or another editor, take time to learn its features and customize it to your needs. Install relevant extensions, set up keybindings, and configure linting and formatting tools. + +### Version Control + +Set up Git aliases for common operations and customize your diff and merge tools to make version control smoother. + +## Finding Your Flow + +The goal isn't to have the most plugins or the flashiest setup. It's about removing friction from your daily work and creating an environment where you can focus on solving problems. + +## Continuous Improvement + +Your needs will evolve over time. Regularly revisit your setup and adjust as you discover new tools or your workflow changes. diff --git a/content/blogs/2025-01-25-building-resilient-systems/index.md b/content/blogs/2025-01-25-building-resilient-systems/index.md new file mode 100644 index 0000000..d241135 --- /dev/null +++ b/content/blogs/2025-01-25-building-resilient-systems/index.md @@ -0,0 +1,48 @@ +--- +title: Building Resilient Systems +date: 2025-01-25T09:15:00+00:00 +url: /blogs/building-resilient-systems/ +tags: + - architecture + - reliability + - best practices + - systems design +draft: true +--- + +Building systems that can withstand failures and continue operating is one of the most important aspects of software engineering. Resilience isn't just about preventing failures—it's about designing systems that can recover gracefully when things go wrong. + +## Understanding Resilience + +Resilience in software systems means the ability to: + +- Detect failures quickly +- Isolate problems to prevent cascading failures +- Recover automatically when possible +- Degrade gracefully when full functionality isn't available + +## Key Principles + +### Redundancy + +Don't rely on single points of failure. Build redundancy into critical components. + +### Circuit Breakers + +Implement circuit breakers to prevent cascading failures when downstream services are unavailable. + +### Timeouts and Retries + +Set appropriate timeouts and implement retry logic with exponential backoff to handle transient failures. + +### Monitoring and Observability + +You can't fix what you can't see. Comprehensive monitoring and logging are essential for understanding system behavior and diagnosing issues. + +## Testing for Failure + +Chaos engineering and failure injection testing help validate that your resilience mechanisms actually work when needed. + +## Conclusion + +Building resilient systems requires thinking beyond the happy path. By anticipating failures and designing for recovery, you create systems that users can rely on even when things go wrong. diff --git a/content/blogs/2025-02-01-understanding-async-programming/index.md b/content/blogs/2025-02-01-understanding-async-programming/index.md new file mode 100644 index 0000000..63e4eb0 --- /dev/null +++ b/content/blogs/2025-02-01-understanding-async-programming/index.md @@ -0,0 +1,41 @@ +--- +title: Understanding Async Programming +date: 2025-02-01T11:00:00+00:00 +url: /blogs/understanding-async-programming/ +tags: + - programming + - javascript + - async +draft: false +--- + +Asynchronous programming is a fundamental concept in modern software development, particularly in JavaScript and web development. Understanding how to work with async operations can dramatically improve your application's performance and user experience. + +## What is Async Programming? + +Async programming allows your code to handle operations that take time without blocking the main execution thread. Instead of waiting for an operation to complete, your program can continue executing other code. + +## Common Patterns + +### Callbacks + +The original async pattern in JavaScript, callbacks are functions passed as arguments to be executed when an operation completes. + +### Promises + +Promises provide a cleaner way to handle async operations, allowing you to chain operations and handle errors more elegantly. + +### Async/Await + +Built on top of promises, async/await syntax makes asynchronous code look and behave more like synchronous code, improving readability. + +## Best Practices + +- Always handle errors in async operations +- Avoid deeply nested callbacks (callback hell) +- Use Promise.all() for parallel operations +- Understand the event loop and how it processes async operations + +## Conclusion + +Mastering async programming is essential for modern development. Take time to understand these patterns and practice implementing them in your projects. diff --git a/content/blogs/2025-02-05-weekly-update-february-5/index.md b/content/blogs/2025-02-05-weekly-update-february-5/index.md new file mode 100644 index 0000000..1d6e7c8 --- /dev/null +++ b/content/blogs/2025-02-05-weekly-update-february-5/index.md @@ -0,0 +1,38 @@ +--- +title: "Weekly Update: February 5" +date: 2025-02-05T09:00:00+00:00 +url: /blogs/weekly-update-february-5/ +tags: + - weekly + - updates +draft: false +--- + +## What I've Been Working On + +This week has been all about refining the blog system and adding some quality-of-life improvements to various projects. + +### Blog System Overhaul + +Finally got around to implementing the new blog content type with proper CRT terminal styling. The green phosphor aesthetic really brings that retro computing vibe I've been going for. + +### Reading + +Started "The Phoenix Project" - fascinating look at DevOps principles told through a narrative. Already applying some of the concepts to my personal workflow. + +### Side Projects + +- Cleaned up the home server rack cabling (again) +- Experimented with some new audio processing techniques +- Set up automated backups for all the important stuff + +## Links I Found Interesting + +- [Some Cool Article](#) - Fascinating deep dive into terminal emulation +- [Another Resource](#) - Great tips on managing dotfiles + +## Next Week's Goals + +Planning to dive deeper into Hugo's taxonomy system and maybe set up some automated deployment workflows. Also need to finally organize that cable mess behind the desk. + +Until next week! diff --git a/content/blogs/2025-02-10-exploring-terminal-emulators/index.md b/content/blogs/2025-02-10-exploring-terminal-emulators/index.md new file mode 100644 index 0000000..0244dbb --- /dev/null +++ b/content/blogs/2025-02-10-exploring-terminal-emulators/index.md @@ -0,0 +1,51 @@ +--- +title: Exploring Terminal Emulators +date: 2025-02-10T14:20:00+00:00 +url: /blogs/exploring-terminal-emulators/ +tags: + - terminal + - tools + - unix +draft: false +--- + +The terminal emulator is one of the most important tools in a developer's toolkit. Choosing the right one can significantly impact your daily workflow and productivity. + +## Why Terminal Emulators Matter + +While the basic functionality is similar across all terminal emulators, the differences in performance, features, and customization can make a huge difference in your daily experience. + +## Popular Options + +### Alacritty + +A GPU-accelerated terminal emulator written in Rust. Known for its blazing speed and minimal configuration file approach. + +### Kitty + +Feature-rich with excellent performance, supports images, tabs, splits, and has a powerful extension system. + +### iTerm2 + +macOS-only but packed with features. Split panes, search, autocomplete, and extensive customization options. + +### Warp + +A modern terminal with AI assistance, command palette, and collaborative features. + +## Key Features to Consider + +- Performance and rendering speed +- GPU acceleration support +- Unicode and emoji support +- Customization options +- Split panes and tab support +- Ligature support for programming fonts + +## My Setup + +Currently using Alacritty for its speed and simplicity. Configuration is minimal but powerful, and the GPU acceleration makes scrolling through long outputs a breeze. + +## Conclusion + +The best terminal emulator is the one that fits your workflow. Try a few and see what feels right for your needs. diff --git a/content/blogs/2025-02-12-weekly-update-february-12/index.md b/content/blogs/2025-02-12-weekly-update-february-12/index.md new file mode 100644 index 0000000..60ff4c1 --- /dev/null +++ b/content/blogs/2025-02-12-weekly-update-february-12/index.md @@ -0,0 +1,45 @@ +--- +title: "Weekly Update: February 12" +date: 2025-02-12T08:30:00+00:00 +url: /blogs/weekly-update-february-12/ +tags: + - weekly + - updates + - music +draft: false +--- + +## This Week's Highlights + +Another productive week! Got a lot done across various projects and discovered some great new music. + +### Music Discovery + +Found an incredible new album that's been on repeat all week. The production quality is phenomenal and it's perfect for late-night coding sessions. Added it to the rotation on the now playing section. + +### Tech Experiments + +Spent some time diving into terminal emulators (wrote a full post about it). Currently test-driving Alacritty and loving the performance boost from GPU acceleration. + +### Home Lab Updates + +- Upgraded the network switch firmware +- Reorganized the equipment rack (for the third time this month) +- Set up monitoring for all critical services +- Finally labeled all the cables + +## Currently Reading + +Still working through "The Phoenix Project" - the parallels to real-world IT operations are uncanny. Taking notes on bottlenecks and constraint theory. + +## Random Thoughts + +Why is cable management so satisfying yet so temporary? As soon as you get everything perfect, you need to add one more device and it all falls apart. + +## For Next Week + +- Write about my home server setup +- Explore some new static site generators +- Maybe finally tackle that Raspberry Pi cluster project I've been planning + +That's all for this week. Stay curious! diff --git a/content/blogs/2025-02-15-version-control-best-practices/index.md b/content/blogs/2025-02-15-version-control-best-practices/index.md new file mode 100644 index 0000000..8760421 --- /dev/null +++ b/content/blogs/2025-02-15-version-control-best-practices/index.md @@ -0,0 +1,55 @@ +--- +title: Version Control Best Practices +date: 2025-02-15T16:45:00+00:00 +url: /blogs/version-control-best-practices/ +tags: + - git + - workflow + - best practices +draft: false +--- + +Version control is the backbone of modern software development. While most developers know how to use git, following best practices can make collaboration smoother and your project history more useful. + +## Commit Messages Matter + +Good commit messages are crucial for understanding project history. Follow these guidelines: + +- Use the imperative mood ("Add feature" not "Added feature") +- Keep the first line under 50 characters +- Provide context in the body if needed +- Reference issue numbers when applicable + +## Branching Strategy + +Choose a branching strategy that fits your team and stick to it. Popular options include: + +- **Git Flow**: Feature branches, develop, and main branches +- **GitHub Flow**: Simple feature branches off main +- **Trunk-Based Development**: Short-lived feature branches + +## Atomic Commits + +Each commit should represent a single logical change. This makes it easier to: + +- Understand what changed and why +- Revert specific changes if needed +- Cherry-pick commits to other branches +- Review code changes + +## Code Review Culture + +Make pull requests manageable: + +- Keep PRs small and focused +- Write descriptive PR descriptions +- Respond to feedback constructively +- Use draft PRs for work-in-progress + +## Tags and Releases + +Use semantic versioning and tag releases properly. Your future self (and team) will thank you. + +## Conclusion + +These practices aren't just about following rules - they're about making your life and your team's lives easier. Start implementing them one at a time until they become second nature. diff --git a/content/blogs/_index.md b/content/blogs/_index.md new file mode 100644 index 0000000..f748a17 --- /dev/null +++ b/content/blogs/_index.md @@ -0,0 +1,5 @@ +--- +title: "Blogs" +--- + +Welcome to the blogs section. Here you'll find my thoughts and writings on various topics. diff --git a/layouts/_default/list.html b/layouts/_default/list.html index 893c10b..bfac903 100755 --- a/layouts/_default/list.html +++ b/layouts/_default/list.html @@ -10,6 +10,6 @@ {{ end }} - {{- template "_internal/pagination.html" . -}} + {{- partial "pagination.html" .Paginator -}} {{ end }} \ No newline at end of file diff --git a/layouts/blogs/list.html b/layouts/blogs/list.html new file mode 100644 index 0000000..e07a44a --- /dev/null +++ b/layouts/blogs/list.html @@ -0,0 +1,41 @@ +{{ define "main" }} +
+
+
+
+
+ {{ .Content }} +
+ + {{ $tags := slice }} + {{ range .Site.RegularPages }} + {{ if eq .Section "blogs" }} + {{ range .Params.tags }} + {{ $tags = $tags | append . }} + {{ end }} + {{ end }} + {{ end }} + {{ $tags = $tags | uniq }} + + + + + {{ partial "pagination.html" .Paginator }} +
+
+
+
+{{ end }} diff --git a/layouts/blogs/single.html b/layouts/blogs/single.html new file mode 100644 index 0000000..54b9084 --- /dev/null +++ b/layouts/blogs/single.html @@ -0,0 +1,48 @@ +{{ define "main" }} +
+
+
+
+ + +
+

+ {{ .Title }} + {{ if .Date }} + {{ .Date.Format "02/01/2006" }} + {{ end }} +

+ {{ if .Params.tags }} +
+ {{ range .Params.tags }} + {{ . }} + {{ end }} +
+ {{ end }} +
+ {{ .Content }} +
+
+ + +
+
+
+
+{{ end }} diff --git a/layouts/blogs/summary.html b/layouts/blogs/summary.html new file mode 100644 index 0000000..7f17ef1 --- /dev/null +++ b/layouts/blogs/summary.html @@ -0,0 +1,26 @@ +
+

+ {{ if in .Params.tags "weekly" }} + {{ .Title }} + {{ else }} + + {{ .Title }} + + {{ end }} + {{ if .Date }} + {{ .Date.Format "02/01/2006" }} + {{ end }} +

+ {{ if .Params.tags }} +
+ {{ range .Params.tags }} + {{ . }} + {{ end }} +
+ {{ end }} + {{ if in .Params.tags "weekly" }} +
+ {{ .Content }} +
+ {{ end }} +
diff --git a/layouts/partials/pagination.html b/layouts/partials/pagination.html new file mode 100644 index 0000000..5fb8094 --- /dev/null +++ b/layouts/partials/pagination.html @@ -0,0 +1,26 @@ +{{ $paginator := . }} +{{ if gt $paginator.TotalPages 1 }} + +{{ end }} diff --git a/layouts/post/list.html b/layouts/post/list.html index f41c6bd..9a60d34 100644 --- a/layouts/post/list.html +++ b/layouts/post/list.html @@ -18,6 +18,6 @@ you can create a layouts directory, just for that section. {{ end }} - {{ template "_internal/pagination.html" . }} + {{ partial "pagination.html" .Paginator }} {{ end }} \ No newline at end of file diff --git a/layouts/tags/list.html b/layouts/tags/list.html new file mode 100644 index 0000000..b8ca49f --- /dev/null +++ b/layouts/tags/list.html @@ -0,0 +1,32 @@ +{{ define "main" }} +
+
+
+
+
+

Posts tagged: {{ .Title }}

+
+ + {{ if .Site.Taxonomies.tags }} + + {{ end }} + + +
+
+
+
+{{ end }}