Initial commit: Personal website with projects section
This commit is contained in:
commit
08020a1f96
|
|
@ -0,0 +1,36 @@
|
|||
# Dependencies
|
||||
node_modules/
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# Production build
|
||||
/build
|
||||
|
||||
# Development
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# IDE and Editor files
|
||||
.idea/
|
||||
.vscode/
|
||||
*.sublime-project
|
||||
*.sublime-workspace
|
||||
*.code-workspace
|
||||
|
||||
# Logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# System Files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
# Glenn Thompson's Personal Website
|
||||
|
||||
A modern, responsive personal blog built to share experiences in technology, engineering, and travel, with a focus on life in the Middle East and technical explorations.
|
||||
|
||||
Visit the live site at [https://glenneth.org](https://glenneth.org)
|
||||
|
||||
## Features
|
||||
- Responsive design optimized for all devices
|
||||
- Clean, modern UI with subtle animations
|
||||
- Dedicated sections for:
|
||||
- Technical blog posts
|
||||
- Travel stories
|
||||
- Engineering insights
|
||||
- About me
|
||||
- Project showcase
|
||||
|
||||
## Technology Stack
|
||||
- HTML5
|
||||
- CSS (Tailwind CSS for styling)
|
||||
- JavaScript
|
||||
- Static site generation capabilities
|
||||
|
||||
## Local Development
|
||||
1. Clone this repository
|
||||
2. Install dependencies:
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
3. Start the development server:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Contact
|
||||
For any inquiries, please reach out to [glenn@glenneth.org](mailto:glenn@glenneth.org)
|
||||
|
||||
## License
|
||||
MIT License
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>"Aesthetic Meets Ergonomics - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>"Aesthetic Meets Ergonomics</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>Blog</span>
|
||||
<span>•</span>
|
||||
<time datetime=""2024-04-08 16:50"">"2024-04-08 16:50"</time>
|
||||
</div>
|
||||
<h2>In the quest for the ultimate ergonomic keyboard, aesthetics often take a backseat to functionality. Yet, when I first laid eyes on the Glove80, I was struck by its elegant design—a refreshing departure from the utilitarian look typical of many ergonomic keyboards. Unlike the retro vibes of the Kinesis Advantage or the DIY aesthetics of most Dactyls, the Glove80 boasts a modern, sleek appearance that complements the contemporary design language of Apple, Google, and LG devices. With its clean lines and visually appealing legends, the Glove80 not only promises ergonomic comfort but does so with style, standing out amidst a sea of competitors.</h2>
|
||||
<p>As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant transformation. The hands-on tasks of yesteryears were gradually replaced by a deluge of documentations—writing, reviewing, and endless typing. This shift brought with it an unwelcome companion: discomfort in my hands and wrists, a stark reminder of the ergonomic pitfalls of conventional keyboards. It was in this context that my quest for a more ergonomic typing solution began, leading me towards the world of ALICE layout keyboards, with the <a href="https://www.keychron.com/products/keychron-q10-pro-alice-layout-qmk-via-wireless-custom-mechanical-keyboard"><strong>Q10 Pro</strong> by Keychron</a> being my initial foray into this new realm.</p>
|
||||
<p>However, the relief was partial, and the shadow of wrist strain persisted, urging me to delve deeper into the ergonomic keyboard universe. My search for a truly ergonomic solution brought me to the doorstep of the <a href="https://www.moergo.com"><strong>Glove80</strong> by MoErgo</a>. Boasting a unique split design, concave key wells, and a commitment to ergonomics that seemed almost tailor-made for my situation, the Glove80 held the promise of being the oasis I was desperately seeking in the desert of my wrist discomfort.</p>
|
||||
<p>This journey from an ALICE layout keyboard user to a Glove80 enthusiast was not just about finding a better typing tool; it was about embracing a healthier typing posture and redefining my interaction with computers. After a month of integrating the Glove80 into my workflow, I'm ready to share my insights and experiences. This review will explore the initial adaptation period, the impact on my wrist health, and whether the Glove80 lives up to its promise as an ergonomic game-changer.</p>
|
||||
<h3>First Impressions: Feel and Experience</h3>
|
||||
<p>Upon beginning my typing journey with the Glove80, two aspects immediately stood out. The unique choc spacing, combined with finger-specific curves for each key column, facilitated effortless access to the bottom and number rows, as well as several function keys—without the need to move my hands. This ease of reach extended to the thumb keys, thoughtfully laid out in an arc to match the natural movement of my thumbs. Additionally, the keyboard's low profile on the desk encouraged a neutral wrist position, enhancing comfort during long typing sessions. These features converged to create a typing experience that was not just comfortable but intuitively aligned with natural hand movements.</p>
|
||||
<h4>The Details That Matter</h4>
|
||||
<h5>Ergonomics at Its Core</h5>
|
||||
<p>The hallmark of the Glove80 is its ergonomics, designed to seamlessly integrate with the user's hand movements. After fine-tuning the tenting and tilting angles—made possible by the adjustable feet on each half of the keyboard—my hands naturally fell into the optimal typing position. The thoughtfully designed key layout meant that reaching for higher rows required merely straightening or curling my fingers, aided by the keyboard's choc spacing. Each column's unique height and curve catered to the different lengths of my fingers, further minimizing strain.</p>
|
||||
<h5>Key Innovations</h5>
|
||||
<p>The Glove80 introduces keycaps with a novel MCC profile, featuring raised sides and a central cylindrical channel, made from a slick POM material. This design supports the natural sliding of fingers across keys, reducing the need to lift hands while typing. The keyboard's thumb clusters are another highlight, offering six easily accessible keys per hand. This ergonomic layout ensures that most keys are within reach without stretching, a testament to the keyboard's user-centric design.</p>
|
||||
<h5>Beyond Typing: Features and Flexibility</h5>
|
||||
<ul>
|
||||
<li><strong>Tenting and Adjustability:</strong> The Glove80's customizable tenting angles, enhanced by sturdy locking nuts, ensure a tailored typing experience that can be finely adjusted to individual preferences.</li>
|
||||
<li><strong>Comfortable Palm Rest:</strong> The integrated, detachable palm rest offers additional comfort, catering to different typing styles with ease.</li>
|
||||
<li><strong>Switch Selection:</strong> While the standard Kailh choc switches are adequate, enthusiasts might prefer customizing their keyboard with preferred switches for an optimized typing feel. I opted for the lighter Kailh Choc V1, Red Pro Linear 35gf switches.</li>
|
||||
<li><strong>Keycaps:</strong> The high-quality POM keycaps, combined with attractive and durable legends, enhance the keyboard's tactile and visual appeal.</li>
|
||||
<li><strong>Tech-Savvy Features:</strong> From its easy-to-use firmware updates via a web interface to seamless Bluetooth connectivity and impressive battery life, the Glove80 is designed for a modern, wireless world.</li>
|
||||
<li><strong>RGB Lighting:</strong> While currently limited in customization, the RGB LEDs offer aesthetic versatility to match any setup.</li>
|
||||
</ul>
|
||||
<h3>Concluding Thoughts</h3>
|
||||
<p>The Glove80 keyboard represents a significant leap forward in ergonomic design, marrying aesthetics with unmatched comfort and functionality. Its thoughtful features—from the infinitely adjustable tenting to the innovative keycap design—set a new standard for what ergonomic keyboards can be. While there's room for improvement in switch selection and RGB customization, these are minor quibbles in an otherwise outstanding product. For those in search of ergonomic excellence without compromising on style or performance, the Glove80 is an investment worth making, promising a typing experience that's not just comfortable but truly enjoyable.</p>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
---
|
||||
title: "Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard"
|
||||
author: "Glenn Thompson"
|
||||
date: "2024-04-08 16:50"
|
||||
tags: ["personal", "tech", "keyboards", "glove80"]
|
||||
---
|
||||
|
||||
## In the quest for the ultimate ergonomic keyboard, aesthetics often take a backseat to functionality. Yet, when I first laid eyes on the Glove80, I was struck by its elegant design—a refreshing departure from the utilitarian look typical of many ergonomic keyboards. Unlike the retro vibes of the Kinesis Advantage or the DIY aesthetics of most Dactyls, the Glove80 boasts a modern, sleek appearance that complements the contemporary design language of Apple, Google, and LG devices. With its clean lines and visually appealing legends, the Glove80 not only promises ergonomic comfort but does so with style, standing out amidst a sea of competitors.
|
||||
|
||||
As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant transformation. The hands-on tasks of yesteryears were gradually replaced by a deluge of documentations—writing, reviewing, and endless typing. This shift brought with it an unwelcome companion: discomfort in my hands and wrists, a stark reminder of the ergonomic pitfalls of conventional keyboards. It was in this context that my quest for a more ergonomic typing solution began, leading me towards the world of ALICE layout keyboards, with the [**Q10 Pro** by Keychron](https://www.keychron.com/products/keychron-q10-pro-alice-layout-qmk-via-wireless-custom-mechanical-keyboard) being my initial foray into this new realm.
|
||||
|
||||
However, the relief was partial, and the shadow of wrist strain persisted, urging me to delve deeper into the ergonomic keyboard universe. My search for a truly ergonomic solution brought me to the doorstep of the [**Glove80** by MoErgo](https://www.moergo.com). Boasting a unique split design, concave key wells, and a commitment to ergonomics that seemed almost tailor-made for my situation, the Glove80 held the promise of being the oasis I was desperately seeking in the desert of my wrist discomfort.
|
||||
|
||||
This journey from an ALICE layout keyboard user to a Glove80 enthusiast was not just about finding a better typing tool; it was about embracing a healthier typing posture and redefining my interaction with computers. After a month of integrating the Glove80 into my workflow, I'm ready to share my insights and experiences. This review will explore the initial adaptation period, the impact on my wrist health, and whether the Glove80 lives up to its promise as an ergonomic game-changer.
|
||||
|
||||
### First Impressions: Feel and Experience
|
||||
|
||||
Upon beginning my typing journey with the Glove80, two aspects immediately stood out. The unique choc spacing, combined with finger-specific curves for each key column, facilitated effortless access to the bottom and number rows, as well as several function keys—without the need to move my hands. This ease of reach extended to the thumb keys, thoughtfully laid out in an arc to match the natural movement of my thumbs. Additionally, the keyboard's low profile on the desk encouraged a neutral wrist position, enhancing comfort during long typing sessions. These features converged to create a typing experience that was not just comfortable but intuitively aligned with natural hand movements.
|
||||
|
||||
#### The Details That Matter
|
||||
|
||||
##### Ergonomics at Its Core
|
||||
|
||||
The hallmark of the Glove80 is its ergonomics, designed to seamlessly integrate with the user's hand movements. After fine-tuning the tenting and tilting angles—made possible by the adjustable feet on each half of the keyboard—my hands naturally fell into the optimal typing position. The thoughtfully designed key layout meant that reaching for higher rows required merely straightening or curling my fingers, aided by the keyboard's choc spacing. Each column's unique height and curve catered to the different lengths of my fingers, further minimizing strain.
|
||||
|
||||
##### Key Innovations
|
||||
|
||||
The Glove80 introduces keycaps with a novel MCC profile, featuring raised sides and a central cylindrical channel, made from a slick POM material. This design supports the natural sliding of fingers across keys, reducing the need to lift hands while typing. The keyboard's thumb clusters are another highlight, offering six easily accessible keys per hand. This ergonomic layout ensures that most keys are within reach without stretching, a testament to the keyboard's user-centric design.
|
||||
|
||||
##### Beyond Typing: Features and Flexibility
|
||||
|
||||
- **Tenting and Adjustability:** The Glove80's customizable tenting angles, enhanced by sturdy locking nuts, ensure a tailored typing experience that can be finely adjusted to individual preferences.
|
||||
- **Comfortable Palm Rest:** The integrated, detachable palm rest offers additional comfort, catering to different typing styles with ease.
|
||||
- **Switch Selection:** While the standard Kailh choc switches are adequate, enthusiasts might prefer customizing their keyboard with preferred switches for an optimized typing feel. I opted for the lighter Kailh Choc V1, Red Pro Linear 35gf switches.
|
||||
- **Keycaps:** The high-quality POM keycaps, combined with attractive and durable legends, enhance the keyboard's tactile and visual appeal.
|
||||
- **Tech-Savvy Features:** From its easy-to-use firmware updates via a web interface to seamless Bluetooth connectivity and impressive battery life, the Glove80 is designed for a modern, wireless world.
|
||||
- **RGB Lighting:** While currently limited in customization, the RGB LEDs offer aesthetic versatility to match any setup.
|
||||
|
||||
### Concluding Thoughts
|
||||
|
||||
The Glove80 keyboard represents a significant leap forward in ergonomic design, marrying aesthetics with unmatched comfort and functionality. Its thoughtful features—from the infinitely adjustable tenting to the innovative keycap design—set a new standard for what ergonomic keyboards can be. While there's room for improvement in switch selection and RGB customization, these are minor quibbles in an otherwise outstanding product. For those in search of ergonomic excellence without compromising on style or performance, the Glove80 is an investment worth making, promising a typing experience that's not just comfortable but truly enjoyable.
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>A Rollercoaster Week - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>A Rollercoaster Week</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>Blog</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-05-01 17:40:58+03:00">2024-05-01 17:40:58+03:00</time>
|
||||
</div>
|
||||
<p>Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional achievements, and personal challenges.</p>
|
||||
<h2>The Journey Begins</h2>
|
||||
<p>It all started on a Monday morning in Amman as I embarked on a journey to attend a Quality Control (QC) conference in Newcastle. The anticipation of presenting my work at an international forum filled me with excitement and nerves. The conference was scheduled for just one day, but the impact it had on me would last much longer.</p>
|
||||
<h2>A Successful Presentation</h2>
|
||||
<p>Tuesday arrived, and with it came the day of the conference. Armed with a PowerPoint presentation comprising over 130 slides, I delved into four hours of intense presenting. Despite the pressure, the conference was a resounding success. My project received positive feedback, and I felt a sense of accomplishment as I shared my work with colleagues from around the world.</p>
|
||||
<h2>The Toll of Travel</h2>
|
||||
<p>However, as I returned to Amman on Wednesday, I couldn't shake off a sense of exhaustion. Little did I know that the toll of travel would soon manifest itself in a most unexpected manner. </p>
|
||||
<p>Thursday morning greeted me with heavy flu-like symptoms. It hit me like a ton of bricks. The combination of jet lag, long hours of presenting, and exposure to new environments had taken its toll on my immune system. I was bedridden, grappling with a chesty cough that seemed relentless.</p>
|
||||
<h2>The Show Must Go On</h2>
|
||||
<p>Despite my illness, there was no time for rest. The following week demanded my presence at a site meeting where I was tasked with condensing my extensive slide deck into a concise presentation of just 12 slides. The challenge was daunting, but I tackled it with determination.</p>
|
||||
<h2>Reflecting on the Journey</h2>
|
||||
<p>As I look back on the rollercoaster week that was, I'm struck by the juxtaposition of success and struggle. From the heights of presenting at an international conference to the lows of battling illness, it was a journey that tested my resilience and resolve.</p>
|
||||
<p>But through it all, one thing remains clear: adversity only serves to make us stronger. Each obstacle we overcome, whether professional or personal, contributes to our growth and development.</p>
|
||||
<p>So here's to the rollercoaster weeks, the ones filled with ups and downs, twists and turns. For it is in those moments of challenge that we discover the true extent of our capabilities.</p>
|
||||
<p>As I upload this blog post using Hugo, I do so with a renewed sense of gratitude for the journey and all it has taught me. Here's to embracing the ride, wherever it may take us.</p>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
---
|
||||
title: A Rollercoaster Week: From Amman to Newcastle, and back again
|
||||
author: Glenn Thompson
|
||||
date: 2024-05-01 17:40:58+03:00
|
||||
tags: work, travel
|
||||
---
|
||||
|
||||
Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional achievements, and personal challenges.
|
||||
|
||||
## The Journey Begins
|
||||
|
||||
It all started on a Monday morning in Amman as I embarked on a journey to attend a Quality Control (QC) conference in Newcastle. The anticipation of presenting my work at an international forum filled me with excitement and nerves. The conference was scheduled for just one day, but the impact it had on me would last much longer.
|
||||
|
||||
## A Successful Presentation
|
||||
|
||||
Tuesday arrived, and with it came the day of the conference. Armed with a PowerPoint presentation comprising over 130 slides, I delved into four hours of intense presenting. Despite the pressure, the conference was a resounding success. My project received positive feedback, and I felt a sense of accomplishment as I shared my work with colleagues from around the world.
|
||||
|
||||
## The Toll of Travel
|
||||
|
||||
However, as I returned to Amman on Wednesday, I couldn't shake off a sense of exhaustion. Little did I know that the toll of travel would soon manifest itself in a most unexpected manner.
|
||||
|
||||
Thursday morning greeted me with heavy flu-like symptoms. It hit me like a ton of bricks. The combination of jet lag, long hours of presenting, and exposure to new environments had taken its toll on my immune system. I was bedridden, grappling with a chesty cough that seemed relentless.
|
||||
|
||||
## The Show Must Go On
|
||||
|
||||
Despite my illness, there was no time for rest. The following week demanded my presence at a site meeting where I was tasked with condensing my extensive slide deck into a concise presentation of just 12 slides. The challenge was daunting, but I tackled it with determination.
|
||||
|
||||
## Reflecting on the Journey
|
||||
|
||||
As I look back on the rollercoaster week that was, I'm struck by the juxtaposition of success and struggle. From the heights of presenting at an international conference to the lows of battling illness, it was a journey that tested my resilience and resolve.
|
||||
|
||||
But through it all, one thing remains clear: adversity only serves to make us stronger. Each obstacle we overcome, whether professional or personal, contributes to our growth and development.
|
||||
|
||||
So here's to the rollercoaster weeks, the ones filled with ups and downs, twists and turns. For it is in those moments of challenge that we discover the true extent of our capabilities.
|
||||
|
||||
As I upload this blog post using Hugo, I do so with a renewed sense of gratitude for the journey and all it has taught me. Here's to embracing the ride, wherever it may take us.
|
||||
|
|
@ -0,0 +1,295 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Transitioning from Hugo to Haunt - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>Transitioning from Hugo to Haunt</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>Blog</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-05-15 10:30">2024-05-15 10:30</time>
|
||||
</div>
|
||||
<h1>Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix</h1>
|
||||
<p>Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.</p>
|
||||
<h2>Discovering Scheme with System Crafters</h2>
|
||||
<p>My journey began with a desire to dive deeper into programming languages and their ecosystems. I am a member of the <a href="https://systemcrafters.net/community/">System Crafters Community</a>, and its founder, David Wilson, announced a short four week course as an introduction to Guile Scheme. The course, <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/">Hands-On Guile Scheme for Beginners</a>, provided me with a robust introduction to Guile Scheme, a language that emphasizes simplicity and elegance. David's clear explanations and practical examples made learning Scheme both engaging and approachable.</p>
|
||||
<h2>The Move to GNU Guix</h2>
|
||||
<p>Inspired by the principles of Scheme, I decided to take a leap further into the open-source world by transitioning from Arch Linux to GNU Guix. The Guix community, particularly the folks in the <code>#systemcrafters</code> channel on <code>irc.libera.chat</code>, were incredibly supportive and instrumental in helping me navigate this new environment. Their guidance made the switch smooth and rewarding, reinforcing the power and flexibility of GNU Guix as a functional package manager and operating system. More about that experience in another post.</p>
|
||||
<p>There are too many individuals to name here that have helped with the installation and configuration on Gnu guix to mention here. You all have been an incredible help for which I am extremely grateful. Thank you all , for enduring my ignorance, and for your patience and your help.</p>
|
||||
<h2>From Hugo to Haunt</h2>
|
||||
<p>As I settled into Guix, I faced a challenge: Hugo, the static site generator I previously used, was not available as a Guix package. This led me to explore alternatives and eventually discover <a href="https://dthompson.us/projects/haunt.html">Haunt</a>, a Scheme-based static site generator that aligns perfectly with my newfound appreciation for Scheme and Guix.</p>
|
||||
<h2>Overcoming Challenges with Haunt</h2>
|
||||
<p>Transitioning to Haunt wasn't without its challenges. There are no readily available templating systems available for haunt like there are for hugo, but there are plenty of examples <a href="https://awesome.haunt.page/">here</a>. One of my own primary difficulties was creating a custom template that matched my site's aesthetic requirements and functionality needs. Initially, I struggled with configuring the theme layout and ensuring the CSS was applied correctly. Another hurdle was generating the correct URLs for posts and ensuring that summaries appeared as intended on the front page.</p>
|
||||
<p>Thankfully, the Haunt manual proved to be an invaluable resource throughout this process. The comprehensive documentation provided clear guidance on using various modules, functions, and procedures. By carefully studying the examples and explanations, I was able to overcome the obstacles and achieve the desired results for my site. The manual's detailed descriptions of Haunt's inner workings were particularly helpful in understanding how to leverage the flexibility of Scheme to customize my blog.</p>
|
||||
<h2>Crafting My Own Template</h2>
|
||||
<p>Moving from Hugo to Haunt required me to create my own template and customize my site's appearance. This was an exciting opportunity to apply the skills I had learned from David's course and experiment with Scheme in a practical context.</p>
|
||||
<h4>Creating the Template</h4>
|
||||
<p>Haunt's flexibility allowed me to define my own theme layout and structure. Here's a snippet of my <code>haunt.scm</code> file, where I defined the theme layout and added custom footer content:</p>
|
||||
<pre><code class="language-scheme">(use-modules (haunt asset)
|
||||
(haunt builder blog)
|
||||
(haunt builder atom)
|
||||
(haunt builder assets)
|
||||
(haunt reader commonmark)
|
||||
(haunt site)
|
||||
(haunt post)
|
||||
(sxml simple) ; For HTML generation
|
||||
(srfi srfi-1)
|
||||
(srfi srfi-19)) ; For date and time procedures
|
||||
|
||||
;; Load custom templates
|
||||
(load "templates/post.scm")
|
||||
|
||||
(define (format-date date)
|
||||
(date->string date "~Y-~m-~d"))
|
||||
|
||||
;; Define a function to generate the URL for a post
|
||||
(define (post-url post)
|
||||
(string-append "/" (post-slug post) ".html"))
|
||||
|
||||
;; Define a function to extract a summary from the post content
|
||||
(define (post-summary post)
|
||||
(let ((content (post-sxml post)))
|
||||
(if (null? content)
|
||||
""
|
||||
(let ((first-paragraph (car content)))
|
||||
(if (string? first-paragraph)
|
||||
(substring first-paragraph 0 (min 200 (string-length first-paragraph)))
|
||||
(sxml->string first-paragraph))))))
|
||||
|
||||
;; Define the theme layout
|
||||
(define (theme-layout site title content)
|
||||
(let ((current-year (number->string (date-year (current-date)))))
|
||||
`(html
|
||||
(head
|
||||
(meta (@ (charset "utf-8")))
|
||||
(meta (@ (name "viewport") (content "width=device-width, initial-scale=1.0, shrink-to-fit=no")))
|
||||
(link (@ (rel "stylesheet") (href "/assets/palenight.css")))
|
||||
(style
|
||||
" .craftering {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
}
|
||||
.webring-text {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
}
|
||||
.craftering a {
|
||||
color: #dddddd;
|
||||
}
|
||||
.webring-text a {
|
||||
color: #dddddd;
|
||||
}")
|
||||
(title ,title))
|
||||
(body
|
||||
(header (h1 ,(site-title site)))
|
||||
(main ,content)
|
||||
(footer (@ (class "bg-black bottom-0 w-100 pa3") (role "contentinfo"))
|
||||
(div (@ (class "flex justify-between"))
|
||||
(div (@ (class "webring-text"))
|
||||
(p "I am part of the " (a (@ (href "https://systemcrafters.net") (target "_blank")) "System Crafters") " webring:"))
|
||||
(div (@ (class "craftering"))
|
||||
(a (@ (href "https://craftering.systemcrafters.net/@glenneth/previous")) "←")
|
||||
(a (@ (href "https://craftering.systemcrafters.net/")) "craftering")
|
||||
(a (@ (href "https://craftering.systemcrafters.net/@glenneth/next")) "→"))))))))
|
||||
|
||||
;; Define the custom theme with a consistent layout for index
|
||||
(define my-theme
|
||||
(theme #:name "My Custom Theme"
|
||||
#:layout theme-layout
|
||||
#:post-template post-template
|
||||
#:collection-template
|
||||
(lambda (site title posts prefix)
|
||||
`(div (@ (class "content"))
|
||||
(h2 ,title)
|
||||
(ul
|
||||
,@(map (lambda (post)
|
||||
`(li
|
||||
(article
|
||||
(header
|
||||
(h3 (a (@ (href ,(post-url post))) ,(post-title post))))
|
||||
(p ,(format-date (post-date post)))
|
||||
(p ,(post-summary post))
|
||||
(p (a (@ (href ,(post-url post))) "Read more...")))))
|
||||
posts))))))
|
||||
|
||||
;; Site configuration
|
||||
(site #:title "Just Another Personal Blog"
|
||||
#:domain "glenneth.srht.site"
|
||||
#:default-metadata
|
||||
'((author . "Glenn Thompson")
|
||||
(email . "glenn@kirstol.org"))
|
||||
#:readers (list commonmark-reader)
|
||||
#:builders (list
|
||||
(blog #:theme my-theme)
|
||||
(atom-feed)
|
||||
(atom-feeds-by-tag)
|
||||
(static-directory "images")
|
||||
(static-directory "assets")))
|
||||
</code></pre>
|
||||
<h3>Customizing the CSS</h3>
|
||||
<p>To give my site a personalized touch, I crafted a CSS stylesheet that matched my aesthetic preferences. Here’s an excerpt from my <code>palenight.css</code> file:</p>
|
||||
<pre><code class="language-css">body {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.content, header, footer, main {
|
||||
max-width: 90%;
|
||||
padding: 0 5%;
|
||||
}
|
||||
|
||||
header {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
footer {
|
||||
text-align: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #292d3e;
|
||||
color: #d0d0d0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #82aaff;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #c792ea;
|
||||
}
|
||||
|
||||
.content {
|
||||
background-color: #1e1e2e;
|
||||
padding: 20px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
article {
|
||||
background-color: #282a36;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
article header {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.date {
|
||||
color: #6272a4;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/* Additional styles for the craftering */
|
||||
.craftering {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.webring-text {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.craftering a {
|
||||
color: #dddddd;
|
||||
}
|
||||
|
||||
.webring-text a {
|
||||
color: #dddddd;
|
||||
}
|
||||
|
||||
/* Additions for mobile device readability */
|
||||
|
||||
meta {
|
||||
name: viewport;
|
||||
content: width=device-width, initial-scale=1, shrink-to-fit=no;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
/* Customize styles for smaller screens */
|
||||
.logo {
|
||||
max-width: 200px;
|
||||
}
|
||||
|
||||
}
|
||||
</code></pre>
|
||||
<p>I use the <code>doom-palenight</code> theme in Emacs, my preferred text editor, and I wanted my site to match that aesthetic.</p>
|
||||
<h3>Publishing with Haunt and Hut</h3>
|
||||
<p>In addition to using Haunt, I adopted hut, a set of command-line tools for interacting with SourceHut, to publish my blog. This streamlined my workflow, making it easier to manage and deploy my site directly from my local environment.</p>
|
||||
<h3>Conclusion</h3>
|
||||
<p>Transitioning from Hugo to Haunt, learning Scheme, and embracing GNU Guix has been an enriching experience. It's not just about using new tools; it's about joining a community that values simplicity, transparency, and collaboration. If you're curious about Scheme or GNU Guix, I highly recommend checking out David Wilson's course on System Crafters and joining the discussions on IRC.</p>
|
||||
<p>I am not a developer of any kind, and learning Scheme has opened my eyes as to how I can craft an environment that I want to work in, and not endure a working environment that the computer is forcing upon me.</p>
|
||||
<p>Thank you for reading, and stay tuned for more updates on my journey!</p>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,273 @@
|
|||
---
|
||||
title: Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
|
||||
author: Glenn Thompson
|
||||
date: 2024-05-15 10:30
|
||||
tags: personal, tech, keyboards, glove80
|
||||
---
|
||||
|
||||
# Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
|
||||
|
||||
Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.
|
||||
|
||||
## Discovering Scheme with System Crafters
|
||||
|
||||
My journey began with a desire to dive deeper into programming languages and their ecosystems. I am a member of the [System Crafters Community](https://systemcrafters.net/community/), and its founder, David Wilson, announced a short four week course as an introduction to Guile Scheme. The course, [Hands-On Guile Scheme for Beginners](https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/), provided me with a robust introduction to Guile Scheme, a language that emphasizes simplicity and elegance. David's clear explanations and practical examples made learning Scheme both engaging and approachable.
|
||||
|
||||
## The Move to GNU Guix
|
||||
|
||||
Inspired by the principles of Scheme, I decided to take a leap further into the open-source world by transitioning from Arch Linux to GNU Guix. The Guix community, particularly the folks in the `#systemcrafters` channel on `irc.libera.chat`, were incredibly supportive and instrumental in helping me navigate this new environment. Their guidance made the switch smooth and rewarding, reinforcing the power and flexibility of GNU Guix as a functional package manager and operating system. More about that experience in another post.
|
||||
|
||||
There are too many individuals to name here that have helped with the installation and configuration on Gnu guix to mention here. You all have been an incredible help for which I am extremely grateful. Thank you all , for enduring my ignorance, and for your patience and your help.
|
||||
|
||||
## From Hugo to Haunt
|
||||
|
||||
As I settled into Guix, I faced a challenge: Hugo, the static site generator I previously used, was not available as a Guix package. This led me to explore alternatives and eventually discover [Haunt](https://dthompson.us/projects/haunt.html), a Scheme-based static site generator that aligns perfectly with my newfound appreciation for Scheme and Guix.
|
||||
|
||||
## Overcoming Challenges with Haunt
|
||||
|
||||
Transitioning to Haunt wasn't without its challenges. There are no readily available templating systems available for haunt like there are for hugo, but there are plenty of examples [here](https://awesome.haunt.page/). One of my own primary difficulties was creating a custom template that matched my site's aesthetic requirements and functionality needs. Initially, I struggled with configuring the theme layout and ensuring the CSS was applied correctly. Another hurdle was generating the correct URLs for posts and ensuring that summaries appeared as intended on the front page.
|
||||
|
||||
Thankfully, the Haunt manual proved to be an invaluable resource throughout this process. The comprehensive documentation provided clear guidance on using various modules, functions, and procedures. By carefully studying the examples and explanations, I was able to overcome the obstacles and achieve the desired results for my site. The manual's detailed descriptions of Haunt's inner workings were particularly helpful in understanding how to leverage the flexibility of Scheme to customize my blog.
|
||||
|
||||
## Crafting My Own Template
|
||||
|
||||
Moving from Hugo to Haunt required me to create my own template and customize my site's appearance. This was an exciting opportunity to apply the skills I had learned from David's course and experiment with Scheme in a practical context.
|
||||
|
||||
#### Creating the Template
|
||||
|
||||
Haunt's flexibility allowed me to define my own theme layout and structure. Here's a snippet of my `haunt.scm` file, where I defined the theme layout and added custom footer content:
|
||||
|
||||
```scheme
|
||||
(use-modules (haunt asset)
|
||||
(haunt builder blog)
|
||||
(haunt builder atom)
|
||||
(haunt builder assets)
|
||||
(haunt reader commonmark)
|
||||
(haunt site)
|
||||
(haunt post)
|
||||
(sxml simple) ; For HTML generation
|
||||
(srfi srfi-1)
|
||||
(srfi srfi-19)) ; For date and time procedures
|
||||
|
||||
;; Load custom templates
|
||||
(load "templates/post.scm")
|
||||
|
||||
(define (format-date date)
|
||||
(date->string date "~Y-~m-~d"))
|
||||
|
||||
;; Define a function to generate the URL for a post
|
||||
(define (post-url post)
|
||||
(string-append "/" (post-slug post) ".html"))
|
||||
|
||||
;; Define a function to extract a summary from the post content
|
||||
(define (post-summary post)
|
||||
(let ((content (post-sxml post)))
|
||||
(if (null? content)
|
||||
""
|
||||
(let ((first-paragraph (car content)))
|
||||
(if (string? first-paragraph)
|
||||
(substring first-paragraph 0 (min 200 (string-length first-paragraph)))
|
||||
(sxml->string first-paragraph))))))
|
||||
|
||||
;; Define the theme layout
|
||||
(define (theme-layout site title content)
|
||||
(let ((current-year (number->string (date-year (current-date)))))
|
||||
`(html
|
||||
(head
|
||||
(meta (@ (charset "utf-8")))
|
||||
(meta (@ (name "viewport") (content "width=device-width, initial-scale=1.0, shrink-to-fit=no")))
|
||||
(link (@ (rel "stylesheet") (href "/assets/palenight.css")))
|
||||
(style
|
||||
" .craftering {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
}
|
||||
.webring-text {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
}
|
||||
.craftering a {
|
||||
color: #dddddd;
|
||||
}
|
||||
.webring-text a {
|
||||
color: #dddddd;
|
||||
}")
|
||||
(title ,title))
|
||||
(body
|
||||
(header (h1 ,(site-title site)))
|
||||
(main ,content)
|
||||
(footer (@ (class "bg-black bottom-0 w-100 pa3") (role "contentinfo"))
|
||||
(div (@ (class "flex justify-between"))
|
||||
(div (@ (class "webring-text"))
|
||||
(p "I am part of the " (a (@ (href "https://systemcrafters.net") (target "_blank")) "System Crafters") " webring:"))
|
||||
(div (@ (class "craftering"))
|
||||
(a (@ (href "https://craftering.systemcrafters.net/@glenneth/previous")) "←")
|
||||
(a (@ (href "https://craftering.systemcrafters.net/")) "craftering")
|
||||
(a (@ (href "https://craftering.systemcrafters.net/@glenneth/next")) "→"))))))))
|
||||
|
||||
;; Define the custom theme with a consistent layout for index
|
||||
(define my-theme
|
||||
(theme #:name "My Custom Theme"
|
||||
#:layout theme-layout
|
||||
#:post-template post-template
|
||||
#:collection-template
|
||||
(lambda (site title posts prefix)
|
||||
`(div (@ (class "content"))
|
||||
(h2 ,title)
|
||||
(ul
|
||||
,@(map (lambda (post)
|
||||
`(li
|
||||
(article
|
||||
(header
|
||||
(h3 (a (@ (href ,(post-url post))) ,(post-title post))))
|
||||
(p ,(format-date (post-date post)))
|
||||
(p ,(post-summary post))
|
||||
(p (a (@ (href ,(post-url post))) "Read more...")))))
|
||||
posts))))))
|
||||
|
||||
;; Site configuration
|
||||
(site #:title "Just Another Personal Blog"
|
||||
#:domain "glenneth.srht.site"
|
||||
#:default-metadata
|
||||
'((author . "Glenn Thompson")
|
||||
(email . "glenn@kirstol.org"))
|
||||
#:readers (list commonmark-reader)
|
||||
#:builders (list
|
||||
(blog #:theme my-theme)
|
||||
(atom-feed)
|
||||
(atom-feeds-by-tag)
|
||||
(static-directory "images")
|
||||
(static-directory "assets")))
|
||||
```
|
||||
|
||||
### Customizing the CSS
|
||||
|
||||
To give my site a personalized touch, I crafted a CSS stylesheet that matched my aesthetic preferences. Here’s an excerpt from my `palenight.css` file:
|
||||
|
||||
```css
|
||||
body {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.content, header, footer, main {
|
||||
max-width: 90%;
|
||||
padding: 0 5%;
|
||||
}
|
||||
|
||||
header {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
footer {
|
||||
text-align: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #292d3e;
|
||||
color: #d0d0d0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #82aaff;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #c792ea;
|
||||
}
|
||||
|
||||
.content {
|
||||
background-color: #1e1e2e;
|
||||
padding: 20px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
article {
|
||||
background-color: #282a36;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
article header {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.date {
|
||||
color: #6272a4;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/* Additional styles for the craftering */
|
||||
.craftering {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.webring-text {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.craftering a {
|
||||
color: #dddddd;
|
||||
}
|
||||
|
||||
.webring-text a {
|
||||
color: #dddddd;
|
||||
}
|
||||
|
||||
/* Additions for mobile device readability */
|
||||
|
||||
meta {
|
||||
name: viewport;
|
||||
content: width=device-width, initial-scale=1, shrink-to-fit=no;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
/* Customize styles for smaller screens */
|
||||
.logo {
|
||||
max-width: 200px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
I use the `doom-palenight` theme in Emacs, my preferred text editor, and I wanted my site to match that aesthetic.
|
||||
|
||||
### Publishing with Haunt and Hut
|
||||
|
||||
In addition to using Haunt, I adopted hut, a set of command-line tools for interacting with SourceHut, to publish my blog. This streamlined my workflow, making it easier to manage and deploy my site directly from my local environment.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Transitioning from Hugo to Haunt, learning Scheme, and embracing GNU Guix has been an enriching experience. It's not just about using new tools; it's about joining a community that values simplicity, transparency, and collaboration. If you're curious about Scheme or GNU Guix, I highly recommend checking out David Wilson's course on System Crafters and joining the discussions on IRC.
|
||||
|
||||
I am not a developer of any kind, and learning Scheme has opened my eyes as to how I can craft an environment that I want to work in, and not endure a working environment that the computer is forcing upon me.
|
||||
|
||||
Thank you for reading, and stay tuned for more updates on my journey!
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>A Journey Through GNU Guix - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>A Journey Through GNU Guix</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>Blog</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-07-26 10:30">2024-07-26 10:30</time>
|
||||
</div>
|
||||
<h1>A Journey Through GNU Guix: From Installation to Returning to Arch Linux</h1>
|
||||
<p>As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey was insightful, filled with learning experiences, but ultimately led me back to the reliable shores of Arch. Here's a detailed account of my venture into GNU Guix, adding non-GNU channels, dealing with Nvidia drivers, running SwayWM, and the eventual retreat to Arch.</p>
|
||||
<h2>Installation of GNU Guix</h2>
|
||||
<p>The installation process of GNU Guix was straightforward, thanks to the well-documented guide provided on their official website. Here's a quick rundown of the steps I followed:</p>
|
||||
<ol>
|
||||
<li><strong>Downloading the Installation Image</strong>: I started by downloading the latest ISO image from the <a href="https://guix.gnu.org/">GNU Guix website</a>.</li>
|
||||
<li><strong>Creating a Bootable USB</strong>: Using <code>dd</code>, I created a bootable USB stick to install GNU Guix on my system.</li>
|
||||
<li><strong>Booting into the Installer</strong>: Booting from the USB was smooth, and I was greeted with the GNU Guix installer. The installer's simplicity reminded me of early days with Arch, where a minimalistic approach is preferred.</li>
|
||||
<li><strong>Partitioning and Setting Up File Systems</strong>: I partitioned my drive using <code>fdisk</code> and set up my file systems. I opted for ext4 for simplicity.</li>
|
||||
<li><strong>Configuring the System</strong>: Following the partition setup, I proceeded to configure my system by selecting the required packages and services. I decided to go with the Sway window manager as it's my preferred choice on Arch.</li>
|
||||
</ol>
|
||||
<h2>System Configuration</h2>
|
||||
<p>During the installation process a window appears informing you that the <code>config.scm</code> file is located at <code>/etc/config.scm</code>. The first time I installed gnu guix on my work laptop I missed this message (pilot error) and I had to ask in the <a href="https://systemcrafters.net">System Crafters</a> IRC channel at <code>irc.libera.chat</code>, <code>#systemcrafters</code>. Come and join. It's a great place to be and the community there are an absolute treasure. Use your favourite IRC client or join through the webchat <a href="https://web.libera.chat/?channel=#systemcrafters">here</a>. We would be glad to see you. Tell them glenneth sent you :).</p>
|
||||
<p>My point is, I missed some vital information, so to the guix manual online it was. This can be found <a href="https://guix.gnu.org/manual/devel/en/guix.html">here</a>. This link will take you to the dev version of the manual. Something else they don't tell you. This version has a little more detail than the standard manual, and I believe details extra features and may even be a little more up to date.</p>
|
||||
<h2>Adding Non-GNU Channels</h2>
|
||||
<p>One of the standout features of GNU Guix is the ability to add non-GNU channels to access a wider array of software packages. Here's how I did it:</p>
|
||||
<ol>
|
||||
<li><strong>Editing Channels</strong>: I edited the <code>~/.config/guix/channels.scm</code> file to include non-GNU channels.<pre><code class="language-scheme">(cons* (channel
|
||||
(name 'non-gnu)
|
||||
(url "https://example.com/non-gnu-channel.git"))
|
||||
%default-channels)
|
||||
</code></pre>
|
||||
</li>
|
||||
<li><strong>Updating Channels</strong>: Running <code>guix pull</code> updated my system to include packages from the non-GNU channel.</li>
|
||||
</ol>
|
||||
<h2>Installing Nvidia Drivers</h2>
|
||||
<p>Being a gamer and someone who requires GPU acceleration for certain tasks, Nvidia drivers were a must. Here's the process I followed:</p>
|
||||
<ol>
|
||||
<li><strong>Adding Nvidia Channel</strong>: Added a channel that includes Nvidia drivers.</li>
|
||||
<li><strong>Installing Drivers</strong>: Installed the drivers using <code>guix package -i nvidia-driver</code>.</li>
|
||||
<li><strong>Configuring the System</strong>: I had to manually configure Xorg to use the Nvidia drivers, which involved editing the Xorg configuration files.</li>
|
||||
</ol>
|
||||
<h2>Creating My Home Environment</h2>
|
||||
<p>To personalize my setup further, I used <code>guix home import</code> to create my own home environment and add packages. This allowed me to have a consistent environment across different machines. I also edited the <code>config.scm</code> file to include the latest Linux kernels and Nvidia drivers.</p>
|
||||
<p>Additionally, I used the <code>syncthing home-service-type</code> in my <code>home-configuration.scm</code> file to install and configure Syncthing. This setup ensured my files were always in sync across devices, which is crucial for my workflow.</p>
|
||||
<h2>GNOME</h2>
|
||||
<p>All was good and I had a solid desktop environment running, even though it was gnome desktop. I had never used gnome, and I am more at home with a keyboard driven workflow. I had come from hyprland on Arch and wanted to get back to that workflow. The option I was presented with, in order to continue using wayland, pipewire etc. was SwayWM.</p>
|
||||
<h2>Sway</h2>
|
||||
<p>Installing SwayWM and it's dependencies and nice to haves was relatively straightforward. add the required packages, sway, swaybg, swayidle, swaylock, to my home-configuration.scm gile and run <code>guix home reconfigure</code> easy! The packages were installed and we were good to go.</p>
|
||||
<p>The first issue I encountered was that sway does not run with the proprietary nvidia drivers, this was on the work laptop. I could get it to run but only after adding the <code>--unsupported-gpu</code> flag to <code>exec sway</code>. Lo and behold, we had a default sway window manager running.</p>
|
||||
<h2>Challenges with SwayWM and SMB Shares</h2>
|
||||
<p>With the system set up, I ran into a major roadblock: accessing SMB shares in a file manager while running SwayWM.</p>
|
||||
<ol>
|
||||
<li><strong>Thunar and GNOME Files</strong>: Neither Thunar nor the GNOME Files application could access SMB shares. This was crucial for my workflow as I frequently access network shares.</li>
|
||||
<li><strong>Troubleshooting</strong>: I tried various solutions, including installing additional packages and tweaking configurations, but nothing seemed to work.</li>
|
||||
<li><strong>Community Support</strong>: I reached out to the GNU Guix community for help. While they were supportive, the solutions provided didn't resolve my issues.</li>
|
||||
</ol>
|
||||
<p>To ensure that the problem was not hardware-related, I went out and purchased a Lenovo ThinkPad E16 Gen 1. I upgraded the RAM to 48GB and installed a Lenovo 2TB SSD to make it my personal laptop. However, even on this new setup, I faced the same issues accessing SMB shares and some networking services just wouldn't work.</p>
|
||||
<p>I tried deleting the <code>gdm</code> login manager in my system configuration file, but after rebooting it was still showing the gnome login window. This was after reading somewhere online that sway was not on friendly terms with the gdm login manager.</p>
|
||||
<h2>Returning to Arch Linux</h2>
|
||||
<p>After several days of troubleshooting and not being able to access my SMB shares reliably, I made the difficult decision to revert to Arch Linux. The steps were:</p>
|
||||
<ol>
|
||||
<li><strong>Reinstalling Arch</strong>: I reinstalled Arch Linux using my tried-and-tested setup process.</li>
|
||||
<li><strong>Configuring SwayWM</strong>: Set up SwayWM and ensured all my applications were running smoothly.</li>
|
||||
<li><strong>Accessing SMB Shares</strong>: Accessing SMB shares was seamless, just as it was before my experiment with GNU Guix.</li>
|
||||
</ol>
|
||||
<h2>Conclusion</h2>
|
||||
<p>I am still running GNU guix on the work laptop, I had to cave on my personal laptop and revert to Arch. My journey with GNU Guix was both enlightening and challenging. While I appreciate the functional package management and the philosophy behind GNU Guix, certain practical issues, like accessing SMB shares, were deal-breakers for my workflow. Arch Linux continues to be my go-to distribution, providing the flexibility and reliability I need for my daily tasks. So, at the moment I am using my personal laptop for work and still trying to figure out the issues I am having on my work laptop. But, to be honest, I prefer working on the thinkpad over working on the MSI laptop that work handed out :).</p>
|
||||
<p>If you're an enthusiast looking to explore new package management paradigms, I highly recommend giving GNU Guix a try. Just be prepared for a few hiccups along the way, and always have a backup plan!</p>
|
||||
<hr>
|
||||
<p>Feel free to share your thoughts and experiences with GNU Guix or any other distributions you've tried. Let's keep the conversation going!</p>
|
||||
<h2>Shameless plug</h2>
|
||||
<p>Go <a href="https://systemcrafters.net/community/">here</a> to find all the ways you can engage with the SystemCrafters community. It's a great place to hang out and discuss all thing craftery. You will also notice the Craftering ring that I am a part of. Click the links and see blogs by some of the community members. Always interesting to read what other Crafters are up to.</p>
|
||||
<p>Thanks for taking the time to read my blog post. It is greatly appreciated, and I hope you come back.</p>
|
||||
<p>Happy Hacking!!</p>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
---
|
||||
title: A Journey Through GNU Guix: From Installation to Returning to Arch Linux
|
||||
author: Glenn Thompson
|
||||
date: 2024-07-26 10:30
|
||||
tags: personal, tech, gnu, guix, swaywm, nvidia
|
||||
---
|
||||
|
||||
# A Journey Through GNU Guix: From Installation to Returning to Arch Linux
|
||||
|
||||
As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey was insightful, filled with learning experiences, but ultimately led me back to the reliable shores of Arch. Here's a detailed account of my venture into GNU Guix, adding non-GNU channels, dealing with Nvidia drivers, running SwayWM, and the eventual retreat to Arch.
|
||||
|
||||
## Installation of GNU Guix
|
||||
|
||||
The installation process of GNU Guix was straightforward, thanks to the well-documented guide provided on their official website. Here's a quick rundown of the steps I followed:
|
||||
|
||||
1. **Downloading the Installation Image**: I started by downloading the latest ISO image from the [GNU Guix website](https://guix.gnu.org/).
|
||||
2. **Creating a Bootable USB**: Using `dd`, I created a bootable USB stick to install GNU Guix on my system.
|
||||
3. **Booting into the Installer**: Booting from the USB was smooth, and I was greeted with the GNU Guix installer. The installer's simplicity reminded me of early days with Arch, where a minimalistic approach is preferred.
|
||||
4. **Partitioning and Setting Up File Systems**: I partitioned my drive using `fdisk` and set up my file systems. I opted for ext4 for simplicity.
|
||||
5. **Configuring the System**: Following the partition setup, I proceeded to configure my system by selecting the required packages and services. I decided to go with the Sway window manager as it's my preferred choice on Arch.
|
||||
|
||||
## System Configuration
|
||||
|
||||
During the installation process a window appears informing you that the `config.scm` file is located at `/etc/config.scm`. The first time I installed gnu guix on my work laptop I missed this message (pilot error) and I had to ask in the [System Crafters](https://systemcrafters.net) IRC channel at `irc.libera.chat`, `#systemcrafters`. Come and join. It's a great place to be and the community there are an absolute treasure. Use your favourite IRC client or join through the webchat [here](https://web.libera.chat/?channel=#systemcrafters). We would be glad to see you. Tell them glenneth sent you :).
|
||||
|
||||
My point is, I missed some vital information, so to the guix manual online it was. This can be found [here](https://guix.gnu.org/manual/devel/en/guix.html). This link will take you to the dev version of the manual. Something else they don't tell you. This version has a little more detail than the standard manual, and I believe details extra features and may even be a little more up to date.
|
||||
|
||||
## Adding Non-GNU Channels
|
||||
|
||||
One of the standout features of GNU Guix is the ability to add non-GNU channels to access a wider array of software packages. Here's how I did it:
|
||||
|
||||
1. **Editing Channels**: I edited the `~/.config/guix/channels.scm` file to include non-GNU channels.
|
||||
```scheme
|
||||
(cons* (channel
|
||||
(name 'non-gnu)
|
||||
(url "https://example.com/non-gnu-channel.git"))
|
||||
%default-channels)
|
||||
```
|
||||
2. **Updating Channels**: Running `guix pull` updated my system to include packages from the non-GNU channel.
|
||||
|
||||
## Installing Nvidia Drivers
|
||||
|
||||
Being a gamer and someone who requires GPU acceleration for certain tasks, Nvidia drivers were a must. Here's the process I followed:
|
||||
|
||||
1. **Adding Nvidia Channel**: Added a channel that includes Nvidia drivers.
|
||||
2. **Installing Drivers**: Installed the drivers using `guix package -i nvidia-driver`.
|
||||
3. **Configuring the System**: I had to manually configure Xorg to use the Nvidia drivers, which involved editing the Xorg configuration files.
|
||||
|
||||
## Creating My Home Environment
|
||||
|
||||
To personalize my setup further, I used `guix home import` to create my own home environment and add packages. This allowed me to have a consistent environment across different machines. I also edited the `config.scm` file to include the latest Linux kernels and Nvidia drivers.
|
||||
|
||||
Additionally, I used the `syncthing home-service-type` in my `home-configuration.scm` file to install and configure Syncthing. This setup ensured my files were always in sync across devices, which is crucial for my workflow.
|
||||
|
||||
## GNOME
|
||||
|
||||
All was good and I had a solid desktop environment running, even though it was gnome desktop. I had never used gnome, and I am more at home with a keyboard driven workflow. I had come from hyprland on Arch and wanted to get back to that workflow. The option I was presented with, in order to continue using wayland, pipewire etc. was SwayWM.
|
||||
|
||||
## Sway
|
||||
|
||||
Installing SwayWM and it's dependencies and nice to haves was relatively straightforward. add the required packages, sway, swaybg, swayidle, swaylock, to my home-configuration.scm gile and run `guix home reconfigure` easy! The packages were installed and we were good to go.
|
||||
|
||||
The first issue I encountered was that sway does not run with the proprietary nvidia drivers, this was on the work laptop. I could get it to run but only after adding the `--unsupported-gpu` flag to `exec sway`. Lo and behold, we had a default sway window manager running.
|
||||
|
||||
## Challenges with SwayWM and SMB Shares
|
||||
|
||||
With the system set up, I ran into a major roadblock: accessing SMB shares in a file manager while running SwayWM.
|
||||
|
||||
1. **Thunar and GNOME Files**: Neither Thunar nor the GNOME Files application could access SMB shares. This was crucial for my workflow as I frequently access network shares.
|
||||
2. **Troubleshooting**: I tried various solutions, including installing additional packages and tweaking configurations, but nothing seemed to work.
|
||||
3. **Community Support**: I reached out to the GNU Guix community for help. While they were supportive, the solutions provided didn't resolve my issues.
|
||||
|
||||
To ensure that the problem was not hardware-related, I went out and purchased a Lenovo ThinkPad E16 Gen 1. I upgraded the RAM to 48GB and installed a Lenovo 2TB SSD to make it my personal laptop. However, even on this new setup, I faced the same issues accessing SMB shares and some networking services just wouldn't work.
|
||||
|
||||
I tried deleting the `gdm` login manager in my system configuration file, but after rebooting it was still showing the gnome login window. This was after reading somewhere online that sway was not on friendly terms with the gdm login manager.
|
||||
|
||||
## Returning to Arch Linux
|
||||
|
||||
After several days of troubleshooting and not being able to access my SMB shares reliably, I made the difficult decision to revert to Arch Linux. The steps were:
|
||||
|
||||
1. **Reinstalling Arch**: I reinstalled Arch Linux using my tried-and-tested setup process.
|
||||
2. **Configuring SwayWM**: Set up SwayWM and ensured all my applications were running smoothly.
|
||||
3. **Accessing SMB Shares**: Accessing SMB shares was seamless, just as it was before my experiment with GNU Guix.
|
||||
|
||||
## Conclusion
|
||||
|
||||
I am still running GNU guix on the work laptop, I had to cave on my personal laptop and revert to Arch. My journey with GNU Guix was both enlightening and challenging. While I appreciate the functional package management and the philosophy behind GNU Guix, certain practical issues, like accessing SMB shares, were deal-breakers for my workflow. Arch Linux continues to be my go-to distribution, providing the flexibility and reliability I need for my daily tasks. So, at the moment I am using my personal laptop for work and still trying to figure out the issues I am having on my work laptop. But, to be honest, I prefer working on the thinkpad over working on the MSI laptop that work handed out :).
|
||||
|
||||
If you're an enthusiast looking to explore new package management paradigms, I highly recommend giving GNU Guix a try. Just be prepared for a few hiccups along the way, and always have a backup plan!
|
||||
|
||||
---
|
||||
|
||||
Feel free to share your thoughts and experiences with GNU Guix or any other distributions you've tried. Let's keep the conversation going!
|
||||
|
||||
## Shameless plug
|
||||
|
||||
Go [here](https://systemcrafters.net/community/) to find all the ways you can engage with the SystemCrafters community. It's a great place to hang out and discuss all thing craftery. You will also notice the Craftering ring that I am a part of. Click the links and see blogs by some of the community members. Always interesting to read what other Crafters are up to.
|
||||
|
||||
Thanks for taking the time to read my blog post. It is greatly appreciated, and I hope you come back.
|
||||
|
||||
Happy Hacking!!
|
||||
|
|
@ -0,0 +1,130 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>A Journey into Scheme - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>A Journey into Scheme</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>Blog</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-09-24 09:30">2024-09-24 09:30</time>
|
||||
</div>
|
||||
<h1>My Journey into Scheme: Building a Simple Symlink Manager with Guile Scheme</h1>
|
||||
<h2>Introduction</h2>
|
||||
<p>I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—specifically Guile Scheme. I'm writing this post to share how I built <code>stash</code>, a utility that mimics GNU Stow's functionality, and how my learning journey was shaped by David Wilson's "Hands-On Guile Scheme for Beginners" course from System Crafters, more about this below.</p>
|
||||
<h2>How I Started with Scheme</h2>
|
||||
<p>My programming background was <em>VERY</em> limited, I produce documents in (La)Tex but I decided to take the plunge into learning Scheme, thanks to a course led by David Wilson from System Crafters. The course, <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/">"Hands-On Guile Scheme for Beginners"</a>, was incredibly helpful in making Scheme accessible even for someone like me, without a traditional programming background. I know (La)Tex isn't a programming language, it's typesetting. But how hard can it be? Right?</p>
|
||||
<p>The course took me through the basics of Scheme, from simple expressions to more complex concepts like functions, recursion, and working with files. This structured learning environment gave me the confidence to start building <code>stash</code>.</p>
|
||||
<p>The course was "instructor-led" with live meet-up sessions weekly. David has since made this course on-demand, and will be, if not already, available at the above link. Highly recommended if you are interested in taking your first steps with scheme.</p>
|
||||
<h2>Why Build Stash?</h2>
|
||||
<p>After completing David Wilson's course, I wanted to put my newly found Guile Scheme skills into practice with a real project. It wasn't enough just to understand the language conceptually—I needed to build something tangible that solved a problem I encountered regularly in my workflow. Writing <code>stash</code> gave me that opportunity. It allowed me to apply what I'd learned while also deepening my understanding of file manipulation, command-line tools, and conflict resolution—all within the Guile Scheme environment.</p>
|
||||
<p>After migrating to GNU/Linux and speaking with other <a href="https://systemcrafters.net/community">System Crafters Community</a> members, I found I needed a way to manage symbolic links and organize directories. Existing tools like GNU Stow helped, but I wanted to learn how such tools are built. I decided to write my own version using Guile Scheme to enhance my understanding of the language and to have more control over the functionality.</p>
|
||||
<p>The goal of <code>stash</code> is simple: allow users to move directories and create symlinks with conflict resolution, offering options to overwrite, back up, skip, or cancel the operation.</p>
|
||||
<h2>Breaking Down Stash</h2>
|
||||
<p>The core of <code>stash</code> revolves around:</p>
|
||||
<ol>
|
||||
<li><strong>Moving Directories</strong>: Using Scheme's file manipulation functions, I learned how to move directories and files around. </li>
|
||||
<li><strong>Creating Symlinks</strong>: I implemented functions to create symlinks to the moved directories, ensuring that the original structure remains accessible.</li>
|
||||
<li><strong>Conflict Resolution</strong>: One of the key features I wanted was handling conflicts when a file or symlink already exists at the target location. This required prompting the user for input and responding accordingly (backup, overwrite, skip, or cancel).</li>
|
||||
</ol>
|
||||
<p>Here's an excerpt of the core functionality that handles moving a source directory and creating a symlink:</p>
|
||||
<pre><code class="language-scheme">;;; Helper function to move source to target
|
||||
(define (move-source-to-target source-dir target-dir)
|
||||
"Move the entire source directory to the target directory."
|
||||
(let* ((source-dir (expand-home source-dir))
|
||||
(target-dir (expand-home target-dir))
|
||||
(source-name (basename source-dir))
|
||||
(target-source-dir (string-append target-dir "/" source-name)))
|
||||
(if (file-exists? target-source-dir)
|
||||
;; Conflict handling here...
|
||||
...)
|
||||
(rename-file source-dir target-source-dir)
|
||||
(display (format #f "Moved ~a to ~a\n" source-dir target-source-dir))))
|
||||
</code></pre>
|
||||
<h2>What I Learned</h2>
|
||||
<p>This project taught me a lot about not just Scheme, but programming in general:</p>
|
||||
<ul>
|
||||
<li><strong>File and Directory Manipulation</strong>: Scheme's file handling functions were different from what I had experienced before, but they allowed for powerful manipulation of file systems.</li>
|
||||
<li><strong>Command-Line Utilities</strong>: Scheme isn't just a language for academic exercises; you can write real, useful command-line tools with it.</li>
|
||||
<li><strong>Problem Solving</strong>: From parsing command-line arguments to resolving conflicts with existing files, every part of the program required careful thought and consideration of edge cases.</li>
|
||||
</ul>
|
||||
<h2>Guile Scheme Support Resources</h2>
|
||||
<ol>
|
||||
<li><p><strong><a href="https://www.gnu.org/software/guile/docs/">Guile Scheme Documentation</a></strong>
|
||||
The official documentation for Guile Scheme, which includes tutorials, references, and the Guile Manual.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://www.gnu.org/software/guile/manual/html_node/">Guile Reference Manual</a></strong>
|
||||
A comprehensive manual covering core language concepts, libraries, and functions available in Guile Scheme.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="http://community.schemewiki.org/">Scheme Wiki</a></strong>
|
||||
A community-maintained wiki that covers various Scheme dialects, including Guile Scheme, with tutorials, guides, and general information on Scheme programming.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="http://schemers.org/">Guile at Schemers.org</a></strong>
|
||||
A site dedicated to Scheme with resources, libraries, tools, and documentation for Scheme and its implementations, including Guile.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://systemcrafters.net/">System Crafters</a></strong>
|
||||
Led by David Wilson, System Crafters provides tutorials and blog posts on Guile Scheme and other GNU tools.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://lists.gnu.org/mailman/listinfo/guile-user">Guile Users Mailing List</a></strong>
|
||||
Join the Guile mailing list to ask questions and engage with the Guile Scheme community.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://github.com/artyom-poptsov/guile-cookbook">Guile Cookbook</a></strong>
|
||||
An unofficial GitHub repository with practical code snippets and tips for Guile Scheme, covering various common use cases and tasks.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://libera.chat/">#guile and #scheme on Libera Chat IRC</a></strong>
|
||||
A helpful IRC channel where you can connect with other Guile users for real-time support and advice.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://Libera.chat/">#systemcrafters on Libera Chat IRC</a></strong>
|
||||
A <em>SUPER</em> helpful IRC channel not only for guile and scheme, there are a huge variety of different people here. Tell them glenneth sent you.</p>
|
||||
</li>
|
||||
</ol>
|
||||
<h2>Next Steps</h2>
|
||||
<p>I am still refining <code>stash</code>, especially around its conflict resolution system and the way it handles symbolic links. But it's in a usable state, and I'm excited to continue iterating on it. You can check out the code <a href="https://codeberg.org/glenneth/stash">on Codeberg</a>.</p>
|
||||
<p>If you're curious about Scheme and how it can be used practically, I highly recommend checking out David Wilson's course. It's been instrumental in helping me grasp the concepts I needed to build this tool. Here's the link, again :) <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/">"Hands-On Guile Scheme for Beginners"</a></p>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
---
|
||||
title: A Journey into Scheme
|
||||
author: Glenn Thompson
|
||||
date: 2024-09-24 09:30
|
||||
tags: personal, tech, guile, scheme, gnu, development
|
||||
---
|
||||
|
||||
# My Journey into Scheme: Building a Simple Symlink Manager with Guile Scheme
|
||||
|
||||
## Introduction
|
||||
I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—specifically Guile Scheme. I'm writing this post to share how I built `stash`, a utility that mimics GNU Stow's functionality, and how my learning journey was shaped by David Wilson's "Hands-On Guile Scheme for Beginners" course from System Crafters, more about this below.
|
||||
|
||||
## How I Started with Scheme
|
||||
My programming background was *VERY* limited, I produce documents in (La)Tex but I decided to take the plunge into learning Scheme, thanks to a course led by David Wilson from System Crafters. The course, ["Hands-On Guile Scheme for Beginners"](https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/), was incredibly helpful in making Scheme accessible even for someone like me, without a traditional programming background. I know (La)Tex isn't a programming language, it's typesetting. But how hard can it be? Right?
|
||||
|
||||
The course took me through the basics of Scheme, from simple expressions to more complex concepts like functions, recursion, and working with files. This structured learning environment gave me the confidence to start building `stash`.
|
||||
|
||||
The course was "instructor-led" with live meet-up sessions weekly. David has since made this course on-demand, and will be, if not already, available at the above link. Highly recommended if you are interested in taking your first steps with scheme.
|
||||
|
||||
## Why Build Stash?
|
||||
After completing David Wilson's course, I wanted to put my newly found Guile Scheme skills into practice with a real project. It wasn't enough just to understand the language conceptually—I needed to build something tangible that solved a problem I encountered regularly in my workflow. Writing `stash` gave me that opportunity. It allowed me to apply what I'd learned while also deepening my understanding of file manipulation, command-line tools, and conflict resolution—all within the Guile Scheme environment.
|
||||
|
||||
After migrating to GNU/Linux and speaking with other [System Crafters Community](https://systemcrafters.net/community) members, I found I needed a way to manage symbolic links and organize directories. Existing tools like GNU Stow helped, but I wanted to learn how such tools are built. I decided to write my own version using Guile Scheme to enhance my understanding of the language and to have more control over the functionality.
|
||||
|
||||
The goal of `stash` is simple: allow users to move directories and create symlinks with conflict resolution, offering options to overwrite, back up, skip, or cancel the operation.
|
||||
|
||||
## Breaking Down Stash
|
||||
The core of `stash` revolves around:
|
||||
|
||||
1. **Moving Directories**: Using Scheme's file manipulation functions, I learned how to move directories and files around.
|
||||
2. **Creating Symlinks**: I implemented functions to create symlinks to the moved directories, ensuring that the original structure remains accessible.
|
||||
3. **Conflict Resolution**: One of the key features I wanted was handling conflicts when a file or symlink already exists at the target location. This required prompting the user for input and responding accordingly (backup, overwrite, skip, or cancel).
|
||||
|
||||
Here's an excerpt of the core functionality that handles moving a source directory and creating a symlink:
|
||||
|
||||
```scheme
|
||||
;;; Helper function to move source to target
|
||||
(define (move-source-to-target source-dir target-dir)
|
||||
"Move the entire source directory to the target directory."
|
||||
(let* ((source-dir (expand-home source-dir))
|
||||
(target-dir (expand-home target-dir))
|
||||
(source-name (basename source-dir))
|
||||
(target-source-dir (string-append target-dir "/" source-name)))
|
||||
(if (file-exists? target-source-dir)
|
||||
;; Conflict handling here...
|
||||
...)
|
||||
(rename-file source-dir target-source-dir)
|
||||
(display (format #f "Moved ~a to ~a\n" source-dir target-source-dir))))
|
||||
```
|
||||
|
||||
## What I Learned
|
||||
This project taught me a lot about not just Scheme, but programming in general:
|
||||
|
||||
- **File and Directory Manipulation**: Scheme's file handling functions were different from what I had experienced before, but they allowed for powerful manipulation of file systems.
|
||||
- **Command-Line Utilities**: Scheme isn't just a language for academic exercises; you can write real, useful command-line tools with it.
|
||||
- **Problem Solving**: From parsing command-line arguments to resolving conflicts with existing files, every part of the program required careful thought and consideration of edge cases.
|
||||
|
||||
## Guile Scheme Support Resources
|
||||
|
||||
1. **[Guile Scheme Documentation](https://www.gnu.org/software/guile/docs/)**
|
||||
The official documentation for Guile Scheme, which includes tutorials, references, and the Guile Manual.
|
||||
|
||||
2. **[Guile Reference Manual](https://www.gnu.org/software/guile/manual/html_node/)**
|
||||
A comprehensive manual covering core language concepts, libraries, and functions available in Guile Scheme.
|
||||
|
||||
3. **[Scheme Wiki](http://community.schemewiki.org/)**
|
||||
A community-maintained wiki that covers various Scheme dialects, including Guile Scheme, with tutorials, guides, and general information on Scheme programming.
|
||||
|
||||
4. **[Guile at Schemers.org](http://schemers.org/)**
|
||||
A site dedicated to Scheme with resources, libraries, tools, and documentation for Scheme and its implementations, including Guile.
|
||||
|
||||
5. **[System Crafters](https://systemcrafters.net/)**
|
||||
Led by David Wilson, System Crafters provides tutorials and blog posts on Guile Scheme and other GNU tools.
|
||||
|
||||
6. **[Guile Users Mailing List](https://lists.gnu.org/mailman/listinfo/guile-user)**
|
||||
Join the Guile mailing list to ask questions and engage with the Guile Scheme community.
|
||||
|
||||
7. **[Guile Cookbook](https://github.com/artyom-poptsov/guile-cookbook)**
|
||||
An unofficial GitHub repository with practical code snippets and tips for Guile Scheme, covering various common use cases and tasks.
|
||||
|
||||
8. **[#guile and #scheme on Libera Chat IRC](https://libera.chat/)**
|
||||
A helpful IRC channel where you can connect with other Guile users for real-time support and advice.
|
||||
|
||||
9. **[#systemcrafters on Libera Chat IRC](https://Libera.chat/)**
|
||||
A *SUPER* helpful IRC channel not only for guile and scheme, there are a huge variety of different people here. Tell them glenneth sent you.
|
||||
|
||||
## Next Steps
|
||||
I am still refining `stash`, especially around its conflict resolution system and the way it handles symbolic links. But it's in a usable state, and I'm excited to continue iterating on it. You can check out the code [on Codeberg](https://codeberg.org/glenneth/stash).
|
||||
|
||||
If you're curious about Scheme and how it can be used practically, I highly recommend checking out David Wilson's course. It's been instrumental in helping me grasp the concepts I needed to build this tool. Here's the link, again :) ["Hands-On Guile Scheme for Beginners"](https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/)
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="A personal account of an intense week of international travel and professional challenges">
|
||||
<meta property="og:title" content="A Rollercoaster Week: From Amman to Newcastle, and back again">
|
||||
<meta property="og:description" content="A journey filled with conference presentations, international travel, and unexpected challenges">
|
||||
<meta property="og:url" content="https://glenneth.org/content/posts/amman-newcastle-journey">
|
||||
<title>Amman to Newcastle Journey - Glenn Thompson</title>
|
||||
<link href="../../dist/styles.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="/" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="/#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="/#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="/#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
<a href="/#contact" class="nav-link text-accent-blue hover:text-accent-cyan">Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="pt-24 pb-16 px-4">
|
||||
<article class="max-w-4xl mx-auto prose prose-palenight">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<a href="/" class="inline-flex items-center text-accent-blue hover:text-accent-cyan transition-colors">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
Back to Home
|
||||
</a>
|
||||
<span class="text-palenight-300 text-sm">~4 min read</span>
|
||||
</div>
|
||||
|
||||
<header class="mb-8">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Personal</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-05-01T17:40:58+03:00">May 1, 2024</time>
|
||||
</div>
|
||||
<h1 class="text-4xl font-serif font-bold text-accent-yellow mb-4">
|
||||
A Rollercoaster Week: From Amman to Newcastle, and back again
|
||||
</h1>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">work</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">travel</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="content text-palenight-100 space-y-6">
|
||||
<p>Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional achievements, and personal challenges.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">The Journey Begins</h2>
|
||||
|
||||
<p>It all started on a Monday morning in Amman as I embarked on a journey to attend a Quality Control (QC) conference in Newcastle. The anticipation of presenting my work at an international forum filled me with excitement and nerves. The conference was scheduled for just one day, but the impact it had on me would last much longer.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">A Successful Presentation</h2>
|
||||
|
||||
<p>Tuesday arrived, and with it came the day of the conference. Armed with a PowerPoint presentation comprising over 130 slides, I delved into four hours of intense presenting. Despite the pressure, the conference was a resounding success. My project received positive feedback, and I felt a sense of accomplishment as I shared my work with colleagues from around the world.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">The Toll of Travel</h2>
|
||||
|
||||
<p>However, as I returned to Amman on Wednesday, I couldn't shake off a sense of exhaustion. Little did I know that the toll of travel would soon manifest itself in a most unexpected manner.</p>
|
||||
|
||||
<p>Thursday morning greeted me with heavy flu-like symptoms. It hit me like a ton of bricks. The combination of jet lag, long hours of presenting, and exposure to new environments had taken its toll on my immune system. I was bedridden, grappling with a chesty cough that seemed relentless.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">The Show Must Go On</h2>
|
||||
|
||||
<p>Despite my illness, there was no time for rest. The following week demanded my presence at a site meeting where I was tasked with condensing my extensive slide deck into a concise presentation of just 12 slides. The challenge was daunting, but I tackled it with determination.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Reflecting on the Journey</h2>
|
||||
|
||||
<p>As I look back on the rollercoaster week that was, I'm struck by the juxtaposition of success and struggle. From the heights of presenting at an international conference to the lows of battling illness, it was a journey that tested my resilience and resolve.</p>
|
||||
|
||||
<p>But through it all, one thing remains clear: adversity only serves to make us stronger. Each obstacle we overcome, whether professional or personal, contributes to our growth and development.</p>
|
||||
|
||||
<p>So here's to the rollercoaster weeks, the ones filled with ups and downs, twists and turns. For it is in those moments of challenge that we discover the true extent of our capabilities.</p>
|
||||
|
||||
<p>As I upload this blog post using Hugo, I do so with a renewed sense of gratitude for the journey and all it has taught me. Here's to embracing the ride, wherever it may take us.</p>
|
||||
</div>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,119 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="An in-depth review of the Glove80 ergonomic keyboard by Glenn Thompson">
|
||||
<meta property="og:title" content="Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard">
|
||||
<meta property="og:description" content="An in-depth review exploring the unique design, features, and impact on typing comfort of the Glove80 ergonomic keyboard">
|
||||
<meta property="og:url" content="https://glenneth.org/content/posts/glove80-review">
|
||||
<title>Glove80 Review - Glenn Thompson</title>
|
||||
<link href="../../dist/styles.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="/" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="/#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="/#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="/#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
<a href="/#contact" class="nav-link text-accent-blue hover:text-accent-cyan">Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="pt-24 pb-16 px-4">
|
||||
<article class="max-w-4xl mx-auto prose prose-palenight">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<a href="/" class="inline-flex items-center text-accent-blue hover:text-accent-cyan transition-colors">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
Back to Home
|
||||
</a>
|
||||
<span class="text-palenight-300 text-sm">~8 min read</span>
|
||||
</div>
|
||||
|
||||
<header class="mb-8">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Tech</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-04-08">April 8, 2024</time>
|
||||
</div>
|
||||
<h1 class="text-4xl font-serif font-bold text-accent-yellow mb-4">
|
||||
Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard
|
||||
</h1>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">keyboards</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">tech</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="content text-palenight-100 space-y-6">
|
||||
<p>In the quest for the ultimate ergonomic keyboard, aesthetics often take a backseat to functionality. Yet, when I first laid eyes on the Glove80, I was struck by its elegant design—a refreshing departure from the utilitarian look typical of many ergonomic keyboards. Unlike the retro vibes of the Kinesis Advantage or the DIY aesthetics of most Dactyls, the Glove80 boasts a modern, sleek appearance that complements the contemporary design language of Apple, Google, and LG devices. With its clean lines and visually appealing legends, the Glove80 not only promises ergonomic comfort but does so with style, standing out amidst a sea of competitors.</p>
|
||||
|
||||
<p>As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant transformation. The hands-on tasks of yesteryears were gradually replaced by a deluge of documentations—writing, reviewing, and endless typing. This shift brought with it an unwelcome companion: discomfort in my hands and wrists, a stark reminder of the ergonomic pitfalls of conventional keyboards. It was in this context that my quest for a more ergonomic typing solution began, leading me towards the world of ALICE layout keyboards, with the <a href="https://www.keychron.com/products/keychron-q10-pro-alice-layout-qmk-via-wireless-custom-mechanical-keyboard" class="text-accent-blue hover:text-accent-cyan">Q10 Pro by Keychron</a> being my initial foray into this new realm.</p>
|
||||
|
||||
<p>However, the relief was partial, and the shadow of wrist strain persisted, urging me to delve deeper into the ergonomic keyboard universe. My search for a truly ergonomic solution brought me to the doorstep of the <a href="https://www.moergo.com" class="text-accent-blue hover:text-accent-cyan">Glove80 by MoErgo</a>. Boasting a unique split design, concave key wells, and a commitment to ergonomics that seemed almost tailor-made for my situation, the Glove80 held the promise of being the oasis I was desperately seeking in the desert of my wrist discomfort.</p>
|
||||
|
||||
<p>This journey from an ALICE layout keyboard user to a Glove80 enthusiast was not just about finding a better typing tool; it was about embracing a healthier typing posture and redefining my interaction with computers. After a month of integrating the Glove80 into my workflow, I'm ready to share my insights and experiences. This review will explore the initial adaptation period, the impact on my wrist health, and whether the Glove80 lives up to its promise as an ergonomic game-changer.</p>
|
||||
|
||||
<h3 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">First Impressions: Feel and Experience</h3>
|
||||
|
||||
<p>Upon beginning my typing journey with the Glove80, two aspects immediately stood out. The unique choc spacing, combined with finger-specific curves for each key column, facilitated effortless access to the bottom and number rows, as well as several function keys—without the need to move my hands. This ease of reach extended to the thumb keys, thoughtfully laid out in an arc to match the natural movement of my thumbs. Additionally, the keyboard's low profile on the desk encouraged a neutral wrist position, enhancing comfort during long typing sessions. These features converged to create a typing experience that was not just comfortable but intuitively aligned with natural hand movements.</p>
|
||||
|
||||
<h4 class="text-xl font-serif font-bold text-accent-yellow mt-6 mb-3">The Details That Matter</h4>
|
||||
|
||||
<h5 class="text-lg font-serif font-bold text-accent-yellow mt-4 mb-2">Ergonomics at Its Core</h5>
|
||||
|
||||
<p>The hallmark of the Glove80 is its ergonomics, designed to seamlessly integrate with the user's hand movements. After fine-tuning the tenting and tilting angles—made possible by the adjustable feet on each half of the keyboard—my hands naturally fell into the optimal typing position. The thoughtfully designed key layout meant that reaching for higher rows required merely straightening or curling my fingers, aided by the keyboard's choc spacing. Each column's unique height and curve catered to the different lengths of my fingers, further minimizing strain.</p>
|
||||
|
||||
<h5 class="text-lg font-serif font-bold text-accent-yellow mt-4 mb-2">Key Innovations</h5>
|
||||
|
||||
<p>The Glove80 introduces keycaps with a novel MCC profile, featuring raised sides and a central cylindrical channel, made from a slick POM material. This design supports the natural sliding of fingers across keys, reducing the need to lift hands while typing. The keyboard's thumb clusters are another highlight, offering six easily accessible keys per hand. This ergonomic layout ensures that most keys are within reach without stretching, a testament to the keyboard's user-centric design.</p>
|
||||
|
||||
<h5 class="text-lg font-serif font-bold text-accent-yellow mt-4 mb-2">Beyond Typing: Features and Flexibility</h5>
|
||||
|
||||
<ul class="list-disc pl-6 space-y-2">
|
||||
<li><strong class="text-accent-purple">Tenting and Adjustability:</strong> The Glove80's customizable tenting angles, enhanced by sturdy locking nuts, ensure a tailored typing experience that can be finely adjusted to individual preferences.</li>
|
||||
<li><strong class="text-accent-purple">Comfortable Palm Rest:</strong> The integrated, detachable palm rest offers additional comfort, catering to different typing styles with ease.</li>
|
||||
<li><strong class="text-accent-purple">Switch Selection:</strong> While the standard Kailh choc switches are adequate, enthusiasts might prefer customizing their keyboard with preferred switches for an optimized typing feel. I opted for the lighter Kailh Choc V1, Red Pro Linear 35gf switches.</li>
|
||||
<li><strong class="text-accent-purple">Keycaps:</strong> The high-quality POM keycaps, combined with attractive and durable legends, enhance the keyboard's tactile and visual appeal.</li>
|
||||
<li><strong class="text-accent-purple">Tech-Savvy Features:</strong> From its easy-to-use firmware updates via a web interface to seamless Bluetooth connectivity and impressive battery life, the Glove80 is designed for a modern, wireless world.</li>
|
||||
<li><strong class="text-accent-purple">RGB Lighting:</strong> While currently limited in customization, the RGB LEDs offer aesthetic versatility to match any setup.</li>
|
||||
</ul>
|
||||
|
||||
<h3 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Concluding Thoughts</h3>
|
||||
|
||||
<p>The Glove80 keyboard represents a significant leap forward in ergonomic design, marrying aesthetics with unmatched comfort and functionality. Its thoughtful features—from the infinitely adjustable tenting to the innovative keycap design—set a new standard for what ergonomic keyboards can be. While there's room for improvement in switch selection and RGB customization, these are minor quibbles in an otherwise outstanding product. For those in search of ergonomic excellence without compromising on style or performance, the Glove80 is an investment worth making, promising a typing experience that's not just comfortable but truly enjoyable.</p>
|
||||
</div>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,182 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="A journey through GNU Guix and the eventual return to Arch Linux">
|
||||
<meta property="og:title" content="A Journey Through GNU Guix: From Installation to Returning to Arch Linux">
|
||||
<meta property="og:description" content="An exploration into GNU Guix, its challenges, and the eventual return to Arch Linux">
|
||||
<meta property="og:url" content="https://glenneth.org/content/posts/gnu-guix-journey">
|
||||
<title>GNU Guix Journey - Glenn Thompson</title>
|
||||
<link href="../../dist/styles.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="/" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="/#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="/#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="/#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="pt-24 pb-16 px-4">
|
||||
<div class="max-w-4xl mx-auto">
|
||||
<div class="content text-palenight-100 space-y-6">
|
||||
<article class="prose prose-palenight">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<a href="/" class="inline-flex items-center text-accent-blue hover:text-accent-cyan transition-colors">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
Back to Home
|
||||
</a>
|
||||
<time datetime="2024-07-26T10:30:00" class="text-palenight-300">July 26, 2024</time>
|
||||
</div>
|
||||
|
||||
<header class="mb-8">
|
||||
<h1 class="text-4xl font-serif font-bold text-accent-yellow">A Journey Through GNU Guix: From Installation to Returning to Arch Linux</h1>
|
||||
<div class="flex items-center gap-4 text-palenight-300">
|
||||
<time datetime="2024-07-26T10:30:00">July 26, 2024</time>
|
||||
<span>•</span>
|
||||
<span>By Glenn Thompson</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<p class="mb-6">As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey was insightful, filled with learning experiences, but ultimately led me back to the reliable shores of Arch. Here's a detailed account of my venture into GNU Guix, adding non-GNU channels, dealing with Nvidia drivers, running SwayWM, and the eventual retreat to Arch.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Installation of GNU Guix</h2>
|
||||
|
||||
<p class="mb-4">The installation process of GNU Guix was straightforward, thanks to the well-documented guide provided on their official website. Here's a quick rundown of the steps I followed:</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Downloading the Installation Image</strong>: I started by downloading the latest ISO image from the <a href="https://guix.gnu.org/" class="text-accent-blue hover:text-accent-cyan">GNU Guix website</a>.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Creating a Bootable USB</strong>: Using <code class="text-accent-purple">dd</code>, I created a bootable USB stick to install GNU Guix on my system.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Booting into the Installer</strong>: Booting from the USB was smooth, and I was greeted with the GNU Guix installer. The installer's simplicity reminded me of early days with Arch, where a minimalistic approach is preferred.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Partitioning and Setting Up File Systems</strong>: I partitioned my drive using <code class="text-accent-purple">fdisk</code> and set up my file systems. I opted for ext4 for simplicity.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Configuring the System</strong>: Following the partition setup, I proceeded to configure my system by selecting the required packages and services. I decided to go with the Sway window manager as it's my preferred choice on Arch.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">System Configuration</h2>
|
||||
|
||||
<p class="mb-4">During the installation process a window appears informing you that the <code class="text-accent-purple">config.scm</code> file is located at <code class="text-accent-purple">/etc/config.scm</code>. The first time I installed gnu guix on my work laptop I missed this message (pilot error) and I had to ask in the <a href="https://systemcrafters.net" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> IRC channel at <code class="text-accent-purple">irc.libera.chat</code>, <code class="text-accent-purple">#systemcrafters</code>. Come and join. It's a great place to be and the community there are an absolute treasure. Use your favourite IRC client or join through the webchat <a href="https://web.libera.chat/?channel=#systemcrafters" class="text-accent-blue hover:text-accent-cyan">here</a>. We would be glad to see you. Tell them glenneth sent you :).</p>
|
||||
|
||||
<p class="mb-4">My point is, I missed some vital information, so to the guix manual online it was. This can be found <a href="https://guix.gnu.org/manual/devel/en/guix.html" class="text-accent-blue hover:text-accent-cyan">here</a>. This link will take you to the dev version of the manual. Something else they don't tell you. This version has a little more detail than the standard manual, and I believe details extra features and may even be a little more up to date.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Adding Non-GNU Channels</h2>
|
||||
|
||||
<p class="mb-4">One of the standout features of GNU Guix is the ability to add non-GNU channels to access a wider array of software packages. Here's how I did it:</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Editing Channels</strong>: I edited the <code class="text-accent-purple">~/.config/guix/channels.scm</code> file to include non-GNU channels.</li>
|
||||
</ol>
|
||||
|
||||
<pre class="bg-base-darker p-4 rounded-lg overflow-x-auto mb-4"><code class="text-palenight-100 font-mono text-sm">(cons* (channel
|
||||
(name 'non-gnu)
|
||||
(url "https://example.com/non-gnu-channel.git"))
|
||||
%default-channels)</code></pre>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6" start="2">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Updating Channels</strong>: Running <code class="text-accent-purple">guix pull</code> updated my system to include packages from the non-GNU channel.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Installing Nvidia Drivers</h2>
|
||||
|
||||
<p class="mb-4">Being a gamer and someone who requires GPU acceleration for certain tasks, Nvidia drivers were a must. Here's the process I followed:</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Adding Nvidia Channel</strong>: Added a channel that includes Nvidia drivers.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Installing Drivers</strong>: Installed the drivers using <code class="text-accent-purple">guix package -i nvidia-driver</code>.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Configuring the System</strong>: I had to manually configure Xorg to use the Nvidia drivers, which involved editing the Xorg configuration files.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Creating My Home Environment</h2>
|
||||
|
||||
<p class="mb-4">To personalize my setup further, I used <code class="text-accent-purple">guix home import</code> to create my own home environment and add packages. This allowed me to have a consistent environment across different machines. I also edited the <code class="text-accent-purple">config.scm</code> file to include the latest Linux kernels and Nvidia drivers.</p>
|
||||
|
||||
<p class="mb-4">Additionally, I used the <code class="text-accent-purple">syncthing home-service-type</code> in my <code class="text-accent-purple">home-configuration.scm</code> file to install and configure Syncthing. This setup ensured my files were always in sync across devices, which is crucial for my workflow.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">GNOME</h2>
|
||||
|
||||
<p class="mb-4">All was good and I had a solid desktop environment running, even though it was gnome desktop. I had never used gnome, and I am more at home with a keyboard driven workflow. I had come from hyprland on Arch and wanted to get back to that workflow. The option I was presented with, in order to continue using wayland, pipewire etc. was SwayWM.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Sway</h2>
|
||||
|
||||
<p class="mb-4">Installing SwayWM and it's dependencies and nice to haves was relatively straightforward. add the required packages, sway, swaybg, swayidle, swaylock, to my home-configuration.scm gile and run <code class="text-accent-purple">guix home reconfigure</code> easy! The packages were installed and we were good to go.</p>
|
||||
|
||||
<p class="mb-4">The first issue I encountered was that sway does not run with the proprietary nvidia drivers, this was on the work laptop. I could get it to run but only after adding the <code class="text-accent-purple">--unsupported-gpu</code> flag to <code class="text-accent-purple">exec sway</code>. Lo and behold, we had a default sway window manager running.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Challenges with SwayWM and SMB Shares</h2>
|
||||
|
||||
<p class="mb-4">With the system set up, I ran into a major roadblock: accessing SMB shares in a file manager while running SwayWM.</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Thunar and GNOME Files</strong>: Neither Thunar nor the GNOME Files application could access SMB shares. This was crucial for my workflow as I frequently access network shares.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Troubleshooting</strong>: I tried various solutions, including installing additional packages and tweaking configurations, but nothing seemed to work.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Community Support</strong>: I reached out to the GNU Guix community for help. While they were supportive, the solutions provided didn't resolve my issues.</li>
|
||||
</ol>
|
||||
|
||||
<p class="mb-4">To ensure that the problem was not hardware-related, I went out and purchased a Lenovo ThinkPad E16 Gen 1. I upgraded the RAM to 48GB and installed a Lenovo 2TB SSD to make it my personal laptop. However, even on this new setup, I faced the same issues accessing SMB shares and some networking services just wouldn't work.</p>
|
||||
|
||||
<p class="mb-4">I tried deleting the <code class="text-accent-purple">gdm</code> login manager in my system configuration file, but after rebooting it was still showing the gnome login window. This was after reading somewhere online that sway was not on friendly terms with the gdm login manager.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Returning to Arch Linux</h2>
|
||||
|
||||
<p class="mb-4">After several days of troubleshooting and not being able to access my SMB shares reliably, I made the difficult decision to revert to Arch Linux. The steps were:</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Reinstalling Arch</strong>: I reinstalled Arch Linux using my tried-and-tested setup process.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Configuring SwayWM</strong>: Set up SwayWM and ensured all my applications were running smoothly.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Accessing SMB Shares</strong>: Accessing SMB shares was seamless, just as it was before my experiment with GNU Guix.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Conclusion</h2>
|
||||
|
||||
<p class="mb-4">I am still running GNU guix on the work laptop, I had to cave on my personal laptop and revert to Arch. My journey with GNU Guix was both enlightening and challenging. While I appreciate the functional package management and the philosophy behind GNU Guix, certain practical issues, like accessing SMB shares, were deal-breakers for my workflow. Arch Linux continues to be my go-to distribution, providing the flexibility and reliability I need for my daily tasks. So, at the moment I am using my personal laptop for work and still trying to figure out the issues I am having on my work laptop. But, to be honest, I prefer working on the thinkpad over working on the MSI laptop that work handed out :).</p>
|
||||
|
||||
<p class="mb-4">If you're an enthusiast looking to explore new package management paradigms, I highly recommend giving GNU Guix a try. Just be prepared for a few hiccups along the way, and always have a backup plan!</p>
|
||||
|
||||
<hr class="my-8 border-palenight-400">
|
||||
|
||||
<p class="mb-4">Feel free to share your thoughts and experiences with GNU Guix or any other distributions you've tried. Let's keep the conversation going!</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Shameless plug</h2>
|
||||
|
||||
<p class="mb-4">Go <a href="https://systemcrafters.net/community/" class="text-accent-blue hover:text-accent-cyan">here</a> to find all the ways you can engage with the SystemCrafters community. It's a great place to hang out and discuss all thing craftery. You will also notice the Craftering ring that I am a part of. Click the links and see blogs by some of the community members. Always interesting to read what other Crafters are up to.</p>
|
||||
|
||||
<p class="mb-4">Thanks for taking the time to read my blog post. It is greatly appreciated, and I hope you come back.</p>
|
||||
|
||||
<p class="mb-4">Happy Hacking!!</p>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,337 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="A journey from Hugo to Haunt, exploring Scheme and GNU Guix">
|
||||
<meta property="og:title" content="Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix">
|
||||
<meta property="og:description" content="My journey into the world of Scheme, GNU Guix, and static site generation">
|
||||
<meta property="og:url" content="https://glenneth.org/content/posts/hugo-to-haunt">
|
||||
<title>Hugo to Haunt Transition - Glenn Thompson</title>
|
||||
<link href="../../dist/styles.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="/" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="/#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="/#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="/#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
<a href="/#contact" class="nav-link text-accent-blue hover:text-accent-cyan">Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="pt-24 pb-16 px-4">
|
||||
<article class="max-w-4xl mx-auto prose prose-palenight">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<a href="/" class="inline-flex items-center text-accent-blue hover:text-accent-cyan transition-colors">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
Back to Home
|
||||
</a>
|
||||
<span class="text-palenight-300 text-sm">~10 min read</span>
|
||||
</div>
|
||||
|
||||
<header class="mb-8">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Tech</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-05-15T10:30:00">May 15, 2024</time>
|
||||
</div>
|
||||
<h1 class="text-4xl font-serif font-bold text-accent-yellow mb-4">
|
||||
Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
|
||||
</h1>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">personal</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">tech</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">scheme</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="content text-palenight-100 space-y-6">
|
||||
<p>Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Discovering Scheme with System Crafters</h2>
|
||||
|
||||
<p>My journey began with a desire to dive deeper into programming languages and their ecosystems. I am a member of the <a href="https://systemcrafters.net/community/" class="text-accent-blue hover:text-accent-cyan">System Crafters Community</a>, and its founder, David Wilson, announced a short four week course as an introduction to Guile Scheme. The course, <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/" class="text-accent-blue hover:text-accent-cyan">Hands-On Guile Scheme for Beginners</a>, provided me with a robust introduction to Guile Scheme, a language that emphasizes simplicity and elegance. David's clear explanations and practical examples made learning Scheme both engaging and approachable.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">The Move to GNU Guix</h2>
|
||||
|
||||
<p>Inspired by the principles of Scheme, I decided to take a leap further into the open-source world by transitioning from Arch Linux to GNU Guix. The Guix community, particularly the folks in the <code class="text-accent-purple">#systemcrafters</code> channel on <code class="text-accent-purple">irc.libera.chat</code>, were incredibly supportive and instrumental in helping me navigate this new environment. Their guidance made the switch smooth and rewarding, reinforcing the power and flexibility of GNU Guix as a functional package manager and operating system. More about that experience in another post.</p>
|
||||
|
||||
<p>There are too many individuals to name here that have helped with the installation and configuration on Gnu guix to mention here. You all have been an incredible help for which I am extremely grateful. Thank you all, for enduring my ignorance, and for your patience and your help.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">From Hugo to Haunt</h2>
|
||||
|
||||
<p>As I settled into Guix, I faced a challenge: Hugo, the static site generator I previously used, was not available as a Guix package. This led me to explore alternatives and eventually discover <a href="https://dthompson.us/projects/haunt.html" class="text-accent-blue hover:text-accent-cyan">Haunt</a>, a Scheme-based static site generator that aligns perfectly with my newfound appreciation for Scheme and Guix.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Overcoming Challenges with Haunt</h2>
|
||||
|
||||
<p>Transitioning to Haunt wasn't without its challenges. There are no readily available templating systems available for haunt like there are for hugo, but there are plenty of examples <a href="https://awesome.haunt.page/" class="text-accent-blue hover:text-accent-cyan">here</a>. One of my own primary difficulties was creating a custom template that matched my site's aesthetic requirements and functionality needs. Initially, I struggled with configuring the theme layout and ensuring the CSS was applied correctly. Another hurdle was generating the correct URLs for posts and ensuring that summaries appeared as intended on the front page.</p>
|
||||
|
||||
<p>Thankfully, the Haunt manual proved to be an invaluable resource throughout this process. The comprehensive documentation provided clear guidance on using various modules, functions, and procedures. By carefully studying the examples and explanations, I was able to overcome the obstacles and achieve the desired results for my site. The manual's detailed descriptions of Haunt's inner workings were particularly helpful in understanding how to leverage the flexibility of Scheme to customize my blog.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Crafting My Own Template</h2>
|
||||
|
||||
<p>Moving from Hugo to Haunt required me to create my own template and customize my site's appearance. This was an exciting opportunity to apply the skills I had learned from David's course and experiment with Scheme in a practical context.</p>
|
||||
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mt-6 mb-3">Creating the Template</h3>
|
||||
|
||||
<p>Haunt's flexibility allowed me to define my own theme layout and structure. Here's a snippet of my <code class="text-accent-purple">haunt.scm</code> file, where I defined the theme layout and added custom footer content:</p>
|
||||
|
||||
<pre class="bg-base-darker p-4 rounded-lg overflow-x-auto"><code class="text-palenight-100 font-mono text-sm">(use-modules (haunt asset)
|
||||
(haunt builder blog)
|
||||
(haunt builder atom)
|
||||
(haunt builder assets)
|
||||
(haunt reader commonmark)
|
||||
(haunt site)
|
||||
(haunt post)
|
||||
(sxml simple) ; For HTML generation
|
||||
(srfi srfi-1)
|
||||
(srfi srfi-19)) ; For date and time procedures
|
||||
|
||||
;; Load custom templates
|
||||
(load "templates/post.scm")
|
||||
|
||||
(define (format-date date)
|
||||
(date->string date "~Y-~m-~d"))
|
||||
|
||||
;; Define a function to generate the URL for a post
|
||||
(define (post-url post)
|
||||
(string-append "/" (post-slug post) ".html"))
|
||||
|
||||
;; Define a function to extract a summary from the post content
|
||||
(define (post-summary post)
|
||||
(let ((content (post-sxml post)))
|
||||
(if (null? content)
|
||||
""
|
||||
(let ((first-paragraph (car content)))
|
||||
(if (string? first-paragraph)
|
||||
(substring first-paragraph 0 (min 200 (string-length first-paragraph)))
|
||||
(sxml->string first-paragraph))))))
|
||||
|
||||
;; Define the theme layout
|
||||
(define (theme-layout site title content)
|
||||
(let ((current-year (number->string (date-year (current-date)))))
|
||||
`(html
|
||||
(head
|
||||
(meta (@ (charset "utf-8")))
|
||||
(meta (@ (name "viewport") (content "width=device-width, initial-scale=1.0, shrink-to-fit=no")))
|
||||
(link (@ (rel "stylesheet") (href "/assets/palenight.css")))
|
||||
(style
|
||||
" .craftering {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
}
|
||||
.webring-text {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
}
|
||||
.craftering a {
|
||||
color: #dddddd;
|
||||
}
|
||||
.webring-text a {
|
||||
color: #dddddd;
|
||||
}")
|
||||
(title ,title))
|
||||
(body
|
||||
(header (h1 ,(site-title site)))
|
||||
(main ,content)
|
||||
(footer (@ (class "bg-black bottom-0 w-100 pa3") (role "contentinfo"))
|
||||
(div (@ (class "flex justify-between"))
|
||||
(div (@ (class "webring-text"))
|
||||
(p "I am part of the " (a (@ (href "https://systemcrafters.net") (target "_blank")) "System Crafters") " webring:"))
|
||||
(div (@ (class "craftering"))
|
||||
(a (@ (href "https://craftering.systemcrafters.net/@glenneth/previous")) "←")
|
||||
(a (@ (href "https://craftering.systemcrafters.net/")) "craftering")
|
||||
(a (@ (href "https://craftering.systemcrafters.net/@glenneth/next")) "→"))))))))
|
||||
|
||||
;; Define the custom theme with a consistent layout for index
|
||||
(define my-theme
|
||||
(theme #:name "My Custom Theme"
|
||||
#:layout theme-layout
|
||||
#:post-template post-template
|
||||
#:collection-template
|
||||
(lambda (site title posts prefix)
|
||||
`(div (@ (class "content"))
|
||||
(h2 ,title)
|
||||
(ul
|
||||
,@(map (lambda (post)
|
||||
`(li
|
||||
(article
|
||||
(header
|
||||
(h3 (a (@ (href ,(post-url post))) ,(post-title post))))
|
||||
(p ,(format-date (post-date post)))
|
||||
(p ,(post-summary post))
|
||||
(p (a (@ (href ,(post-url post))) "Read more...")))))
|
||||
posts))))))
|
||||
|
||||
;; Site configuration
|
||||
(site #:title "Just Another Personal Blog"
|
||||
#:domain "glenneth.srht.site"
|
||||
#:default-metadata
|
||||
'((author . "Glenn Thompson")
|
||||
(email . "glenn@kirstol.org"))
|
||||
#:readers (list commonmark-reader)
|
||||
#:builders (list
|
||||
(blog #:theme my-theme)
|
||||
(atom-feed)
|
||||
(atom-feeds-by-tag)
|
||||
(static-directory "images")
|
||||
(static-directory "assets")))</code></pre>
|
||||
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mt-6 mb-3">Customizing the CSS</h3>
|
||||
|
||||
<p>To give my site a personalized touch, I crafted a CSS stylesheet that matched my aesthetic preferences. Here's an excerpt from my <code class="text-accent-purple">palenight.css</code> file:</p>
|
||||
|
||||
<pre class="bg-base-darker p-4 rounded-lg overflow-x-auto"><code class="text-palenight-100 font-mono text-sm">body {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.content, header, footer, main {
|
||||
max-width: 90%;
|
||||
padding: 0 5%;
|
||||
}
|
||||
|
||||
header {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
footer {
|
||||
text-align: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #292d3e;
|
||||
color: #d0d0d0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #82aaff;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #c792ea;
|
||||
}
|
||||
|
||||
.content {
|
||||
background-color: #1e1e2e;
|
||||
padding: 20px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
article {
|
||||
background-color: #282a36;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
article header {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.date {
|
||||
color: #6272a4;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/* Additional styles for the craftering */
|
||||
.craftering {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.webring-text {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.craftering a {
|
||||
color: #dddddd;
|
||||
}
|
||||
|
||||
.webring-text a {
|
||||
color: #dddddd;
|
||||
}
|
||||
|
||||
/* Additions for mobile device readability */
|
||||
meta {
|
||||
name: viewport;
|
||||
content: width=device-width, initial-scale=1, shrink-to-fit=no;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
/* Customize styles for smaller screens */
|
||||
.logo {
|
||||
max-width: 200px;
|
||||
}
|
||||
}</code></pre>
|
||||
|
||||
<p>I use the <code class="text-accent-purple">doom-palenight</code> theme in Emacs, my preferred text editor, and I wanted my site to match that aesthetic.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Conclusion</h2>
|
||||
|
||||
<p>Transitioning from Hugo to Haunt, learning Scheme, and embracing GNU Guix has been an enriching experience. It's not just about using new tools; it's about joining a community that values simplicity, transparency, and collaboration. If you're curious about Scheme or GNU Guix, I highly recommend checking out David Wilson's course on System Crafters and joining the discussions on IRC.</p>
|
||||
|
||||
<p>I am not a developer of any kind, and learning Scheme has opened my eyes as to how I can craft an environment that I want to work in, and not endure a working environment that the computer is forcing upon me.</p>
|
||||
|
||||
<p>Thank you for reading, and stay tuned for more updates on my journey!</p>
|
||||
</div>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,163 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="A journey into Scheme programming and building a symlink manager">
|
||||
<meta property="og:title" content="A Journey into Scheme: Building a Simple Symlink Manager with Guile Scheme">
|
||||
<meta property="og:description" content="Learning Guile Scheme and building a practical tool for managing symlinks">
|
||||
<meta property="og:url" content="https://glenneth.org/content/posts/scheme-journey">
|
||||
<title>Journey into Scheme - Glenn Thompson</title>
|
||||
<link href="../../dist/styles.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="/" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="/#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="/#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="/#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="pt-24 pb-16 px-4">
|
||||
<div class="max-w-4xl mx-auto">
|
||||
<div class="content text-palenight-100 space-y-6">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<a href="/" class="inline-flex items-center text-accent-blue hover:text-accent-cyan transition-colors">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
Back to Home
|
||||
</a>
|
||||
<time datetime="2024-09-24T09:30:00" class="text-palenight-300">September 24, 2024</time>
|
||||
</div>
|
||||
|
||||
<header class="mb-8">
|
||||
<h1 class="text-4xl font-serif font-bold text-accent-yellow">A Journey into Scheme: Building a Simple Symlink Manager with Guile Scheme</h1>
|
||||
<div class="flex items-center gap-4 text-palenight-300 mt-4">
|
||||
<time datetime="2024-09-24T09:30:00">September 24, 2024</time>
|
||||
<span>•</span>
|
||||
<span>By Glenn Thompson</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section class="prose prose-palenight max-w-none">
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Introduction</h2>
|
||||
<p class="mb-4">I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—specifically Guile Scheme. I'm writing this post to share how I built <code class="text-accent-purple">stash</code>, a utility that mimics GNU Stow's functionality, and how my learning journey was shaped by David Wilson's "Hands-On Guile Scheme for Beginners" course from System Crafters, more about this below.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">How I Started with Scheme</h2>
|
||||
<p class="mb-4">My programming background was <em>VERY</em> limited, I produce documents in (La)Tex but I decided to take the plunge into learning Scheme, thanks to a course led by David Wilson from System Crafters. The course, <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/" class="text-accent-blue hover:text-accent-cyan">"Hands-On Guile Scheme for Beginners"</a>, was incredibly helpful in making Scheme accessible even for someone like me, without a traditional programming background. I know (La)Tex isn't a programming language, it's typesetting. But how hard can it be? Right?</p>
|
||||
|
||||
<p class="mb-4">The course took me through the basics of Scheme, from simple expressions to more complex concepts like functions, recursion, and working with files. This structured learning environment gave me the confidence to start building <code class="text-accent-purple">stash</code>.</p>
|
||||
|
||||
<p class="mb-4">The course was "instructor-led" with live meet-up sessions weekly. David has since made this course on-demand, and will be, if not already, available at the above link. Highly recommended if you are interested in taking your first steps with scheme.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Why Build Stash?</h2>
|
||||
<p class="mb-4">After completing David Wilson's course, I wanted to put my newly found Guile Scheme skills into practice with a real project. It wasn't enough just to understand the language conceptually—I needed to build something tangible that solved a problem I encountered regularly in my workflow. Writing <code class="text-accent-purple">stash</code> gave me that opportunity. It allowed me to apply what I'd learned while also deepening my understanding of file manipulation, command-line tools, and conflict resolution—all within the Guile Scheme environment.</p>
|
||||
|
||||
<p class="mb-4">After migrating to GNU/Linux and speaking with other <a href="https://systemcrafters.net/community" class="text-accent-blue hover:text-accent-cyan">System Crafters Community</a> members, I found I needed a way to manage symbolic links and organize directories. Existing tools like GNU Stow helped, but I wanted to learn how such tools are built. I decided to write my own version using Guile Scheme to enhance my understanding of the language and to have more control over the functionality.</p>
|
||||
|
||||
<p class="mb-4">The goal of <code class="text-accent-purple">stash</code> is simple: allow users to move directories and create symlinks with conflict resolution, offering options to overwrite, back up, skip, or cancel the operation.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Breaking Down Stash</h2>
|
||||
<p class="mb-4">The core of <code class="text-accent-purple">stash</code> revolves around:</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Moving Directories</strong>: Using Scheme's file manipulation functions, I learned how to move directories and files around.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Creating Symlinks</strong>: I implemented functions to create symlinks to the moved directories, ensuring that the original structure remains accessible.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Conflict Resolution</strong>: One of the key features I wanted was handling conflicts when a file or symlink already exists at the target location. This required prompting the user for input and responding accordingly (backup, overwrite, skip, or cancel).</li>
|
||||
</ol>
|
||||
|
||||
<p class="mb-4">Here's an excerpt of the core functionality that handles moving a source directory and creating a symlink:</p>
|
||||
|
||||
<pre class="bg-base-darker p-4 rounded-lg overflow-x-auto mb-4"><code class="text-palenight-100 font-mono text-sm">;;; Helper function to move source to target
|
||||
(define (move-source-to-target source-dir target-dir)
|
||||
"Move the entire source directory to the target directory."
|
||||
(let* ((source-dir (expand-home source-dir))
|
||||
(target-dir (expand-home target-dir))
|
||||
(source-name (basename source-dir))
|
||||
(target-source-dir (string-append target-dir "/" source-name)))
|
||||
(if (file-exists? target-source-dir)
|
||||
;; Conflict handling here...
|
||||
...)
|
||||
(rename-file source-dir target-source-dir)
|
||||
(display (format #f "Moved ~a to ~a\n" source-dir target-source-dir))))</code></pre>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">What I Learned</h2>
|
||||
<p class="mb-4">This project taught me a lot about not just Scheme, but programming in general:</p>
|
||||
|
||||
<ul class="list-disc pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">File and Directory Manipulation</strong>: Scheme's file handling functions were different from what I had experienced before, but they allowed for powerful manipulation of file systems.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Command-Line Utilities</strong>: Scheme isn't just a language for academic exercises; you can write real, useful command-line tools with it.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Problem Solving</strong>: From parsing command-line arguments to resolving conflicts with existing files, every part of the program required careful thought and consideration of edge cases.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Guile Scheme Support Resources</h2>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://www.gnu.org/software/guile/docs/" class="text-accent-blue hover:text-accent-cyan">Guile Scheme Documentation</a></strong><br>
|
||||
The official documentation for Guile Scheme, which includes tutorials, references, and the Guile Manual.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://www.gnu.org/software/guile/manual/html_node/" class="text-accent-blue hover:text-accent-cyan">Guile Reference Manual</a></strong><br>
|
||||
A comprehensive manual covering core language concepts, libraries, and functions available in Guile Scheme.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="http://community.schemewiki.org/" class="text-accent-blue hover:text-accent-cyan">Scheme Wiki</a></strong><br>
|
||||
A community-maintained wiki that covers various Scheme dialects, including Guile Scheme, with tutorials, guides, and general information on Scheme programming.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="http://schemers.org/" class="text-accent-blue hover:text-accent-cyan">Guile at Schemers.org</a></strong><br>
|
||||
A site dedicated to Scheme with resources, libraries, tools, and documentation for Scheme and its implementations, including Guile.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://systemcrafters.net/" class="text-accent-blue hover:text-accent-cyan">System Crafters</a></strong><br>
|
||||
Led by David Wilson, System Crafters provides tutorials and blog posts on Guile Scheme and other GNU tools.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://lists.gnu.org/mailman/listinfo/guile-user" class="text-accent-blue hover:text-accent-cyan">Guile Users Mailing List</a></strong><br>
|
||||
Join the Guile mailing list to ask questions and engage with the Guile Scheme community.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://github.com/artyom-poptsov/guile-cookbook" class="text-accent-blue hover:text-accent-cyan">Guile Cookbook</a></strong><br>
|
||||
An unofficial GitHub repository with practical code snippets and tips for Guile Scheme, covering various common use cases and tasks.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://libera.chat/" class="text-accent-blue hover:text-accent-cyan">#guile and #scheme on Libera Chat IRC</a></strong><br>
|
||||
A helpful IRC channel where you can connect with other Guile users for real-time support and advice.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://libera.chat/" class="text-accent-blue hover:text-accent-cyan">#systemcrafters on Libera Chat IRC</a></strong><br>
|
||||
A <em>SUPER</em> helpful IRC channel not only for guile and scheme, there are a huge variety of different people here. Tell them glenneth sent you.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Next Steps</h2>
|
||||
<p class="mb-4">I am still refining <code class="text-accent-purple">stash</code>, especially around its conflict resolution system and the way it handles symbolic links. But it's in a usable state, and I'm excited to continue iterating on it. You can check out the code <a href="https://codeberg.org/glenneth/stash" class="text-accent-blue hover:text-accent-cyan">on Codeberg</a>.</p>
|
||||
|
||||
<p class="mb-4">If you're curious about Scheme and how it can be used practically, I highly recommend checking out David Wilson's course. It's been instrumental in helping me grasp the concepts I needed to build this tool. Here's the link, again :) <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/" class="text-accent-blue hover:text-accent-cyan">"Hands-On Guile Scheme for Beginners"</a></p>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>[Your Title] - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<!-- Your content goes here -->
|
||||
<h1>[Your Title]</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>[Category]</span>
|
||||
<span>•</span>
|
||||
<time datetime="[YYYY-MM-DD]">[Month DD, YYYY]</time>
|
||||
</div>
|
||||
|
||||
<!-- Article content here -->
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Create a deploy directory if it doesn't exist
|
||||
mkdir -p deploy
|
||||
|
||||
# Clean up any previous deploy files
|
||||
rm -rf deploy/*
|
||||
|
||||
# Run build process to ensure latest CSS
|
||||
echo "Building CSS..."
|
||||
npm run build
|
||||
|
||||
# Copy necessary files
|
||||
echo "Copying files..."
|
||||
cp index.html deploy/
|
||||
cp -r dist deploy/
|
||||
|
||||
# Copy content directory excluding markdown files
|
||||
echo "Copying content (excluding markdown files)..."
|
||||
find content -type f ! -name "*.md" -exec cp --parents {} deploy/ \;
|
||||
|
||||
# Copy JS files
|
||||
cp -r src/js deploy/js
|
||||
|
||||
# Create a zip file for easy upload
|
||||
echo "Creating zip archive..."
|
||||
cd deploy
|
||||
zip -r ../website-deploy.zip ./*
|
||||
|
||||
echo "Deployment package created successfully!"
|
||||
echo "Your files are ready in the 'website-deploy.zip' file"
|
||||
echo "You can also find individual files in the 'deploy' directory"
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>"Aesthetic Meets Ergonomics - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>"Aesthetic Meets Ergonomics</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>Blog</span>
|
||||
<span>•</span>
|
||||
<time datetime=""2024-04-08 16:50"">"2024-04-08 16:50"</time>
|
||||
</div>
|
||||
<h2>In the quest for the ultimate ergonomic keyboard, aesthetics often take a backseat to functionality. Yet, when I first laid eyes on the Glove80, I was struck by its elegant design—a refreshing departure from the utilitarian look typical of many ergonomic keyboards. Unlike the retro vibes of the Kinesis Advantage or the DIY aesthetics of most Dactyls, the Glove80 boasts a modern, sleek appearance that complements the contemporary design language of Apple, Google, and LG devices. With its clean lines and visually appealing legends, the Glove80 not only promises ergonomic comfort but does so with style, standing out amidst a sea of competitors.</h2>
|
||||
<p>As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant transformation. The hands-on tasks of yesteryears were gradually replaced by a deluge of documentations—writing, reviewing, and endless typing. This shift brought with it an unwelcome companion: discomfort in my hands and wrists, a stark reminder of the ergonomic pitfalls of conventional keyboards. It was in this context that my quest for a more ergonomic typing solution began, leading me towards the world of ALICE layout keyboards, with the <a href="https://www.keychron.com/products/keychron-q10-pro-alice-layout-qmk-via-wireless-custom-mechanical-keyboard"><strong>Q10 Pro</strong> by Keychron</a> being my initial foray into this new realm.</p>
|
||||
<p>However, the relief was partial, and the shadow of wrist strain persisted, urging me to delve deeper into the ergonomic keyboard universe. My search for a truly ergonomic solution brought me to the doorstep of the <a href="https://www.moergo.com"><strong>Glove80</strong> by MoErgo</a>. Boasting a unique split design, concave key wells, and a commitment to ergonomics that seemed almost tailor-made for my situation, the Glove80 held the promise of being the oasis I was desperately seeking in the desert of my wrist discomfort.</p>
|
||||
<p>This journey from an ALICE layout keyboard user to a Glove80 enthusiast was not just about finding a better typing tool; it was about embracing a healthier typing posture and redefining my interaction with computers. After a month of integrating the Glove80 into my workflow, I'm ready to share my insights and experiences. This review will explore the initial adaptation period, the impact on my wrist health, and whether the Glove80 lives up to its promise as an ergonomic game-changer.</p>
|
||||
<h3>First Impressions: Feel and Experience</h3>
|
||||
<p>Upon beginning my typing journey with the Glove80, two aspects immediately stood out. The unique choc spacing, combined with finger-specific curves for each key column, facilitated effortless access to the bottom and number rows, as well as several function keys—without the need to move my hands. This ease of reach extended to the thumb keys, thoughtfully laid out in an arc to match the natural movement of my thumbs. Additionally, the keyboard's low profile on the desk encouraged a neutral wrist position, enhancing comfort during long typing sessions. These features converged to create a typing experience that was not just comfortable but intuitively aligned with natural hand movements.</p>
|
||||
<h4>The Details That Matter</h4>
|
||||
<h5>Ergonomics at Its Core</h5>
|
||||
<p>The hallmark of the Glove80 is its ergonomics, designed to seamlessly integrate with the user's hand movements. After fine-tuning the tenting and tilting angles—made possible by the adjustable feet on each half of the keyboard—my hands naturally fell into the optimal typing position. The thoughtfully designed key layout meant that reaching for higher rows required merely straightening or curling my fingers, aided by the keyboard's choc spacing. Each column's unique height and curve catered to the different lengths of my fingers, further minimizing strain.</p>
|
||||
<h5>Key Innovations</h5>
|
||||
<p>The Glove80 introduces keycaps with a novel MCC profile, featuring raised sides and a central cylindrical channel, made from a slick POM material. This design supports the natural sliding of fingers across keys, reducing the need to lift hands while typing. The keyboard's thumb clusters are another highlight, offering six easily accessible keys per hand. This ergonomic layout ensures that most keys are within reach without stretching, a testament to the keyboard's user-centric design.</p>
|
||||
<h5>Beyond Typing: Features and Flexibility</h5>
|
||||
<ul>
|
||||
<li><strong>Tenting and Adjustability:</strong> The Glove80's customizable tenting angles, enhanced by sturdy locking nuts, ensure a tailored typing experience that can be finely adjusted to individual preferences.</li>
|
||||
<li><strong>Comfortable Palm Rest:</strong> The integrated, detachable palm rest offers additional comfort, catering to different typing styles with ease.</li>
|
||||
<li><strong>Switch Selection:</strong> While the standard Kailh choc switches are adequate, enthusiasts might prefer customizing their keyboard with preferred switches for an optimized typing feel. I opted for the lighter Kailh Choc V1, Red Pro Linear 35gf switches.</li>
|
||||
<li><strong>Keycaps:</strong> The high-quality POM keycaps, combined with attractive and durable legends, enhance the keyboard's tactile and visual appeal.</li>
|
||||
<li><strong>Tech-Savvy Features:</strong> From its easy-to-use firmware updates via a web interface to seamless Bluetooth connectivity and impressive battery life, the Glove80 is designed for a modern, wireless world.</li>
|
||||
<li><strong>RGB Lighting:</strong> While currently limited in customization, the RGB LEDs offer aesthetic versatility to match any setup.</li>
|
||||
</ul>
|
||||
<h3>Concluding Thoughts</h3>
|
||||
<p>The Glove80 keyboard represents a significant leap forward in ergonomic design, marrying aesthetics with unmatched comfort and functionality. Its thoughtful features—from the infinitely adjustable tenting to the innovative keycap design—set a new standard for what ergonomic keyboards can be. While there's room for improvement in switch selection and RGB customization, these are minor quibbles in an otherwise outstanding product. For those in search of ergonomic excellence without compromising on style or performance, the Glove80 is an investment worth making, promising a typing experience that's not just comfortable but truly enjoyable.</p>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>A Rollercoaster Week - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>A Rollercoaster Week</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>Blog</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-05-01 17:40:58+03:00">2024-05-01 17:40:58+03:00</time>
|
||||
</div>
|
||||
<p>Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional achievements, and personal challenges.</p>
|
||||
<h2>The Journey Begins</h2>
|
||||
<p>It all started on a Monday morning in Amman as I embarked on a journey to attend a Quality Control (QC) conference in Newcastle. The anticipation of presenting my work at an international forum filled me with excitement and nerves. The conference was scheduled for just one day, but the impact it had on me would last much longer.</p>
|
||||
<h2>A Successful Presentation</h2>
|
||||
<p>Tuesday arrived, and with it came the day of the conference. Armed with a PowerPoint presentation comprising over 130 slides, I delved into four hours of intense presenting. Despite the pressure, the conference was a resounding success. My project received positive feedback, and I felt a sense of accomplishment as I shared my work with colleagues from around the world.</p>
|
||||
<h2>The Toll of Travel</h2>
|
||||
<p>However, as I returned to Amman on Wednesday, I couldn't shake off a sense of exhaustion. Little did I know that the toll of travel would soon manifest itself in a most unexpected manner. </p>
|
||||
<p>Thursday morning greeted me with heavy flu-like symptoms. It hit me like a ton of bricks. The combination of jet lag, long hours of presenting, and exposure to new environments had taken its toll on my immune system. I was bedridden, grappling with a chesty cough that seemed relentless.</p>
|
||||
<h2>The Show Must Go On</h2>
|
||||
<p>Despite my illness, there was no time for rest. The following week demanded my presence at a site meeting where I was tasked with condensing my extensive slide deck into a concise presentation of just 12 slides. The challenge was daunting, but I tackled it with determination.</p>
|
||||
<h2>Reflecting on the Journey</h2>
|
||||
<p>As I look back on the rollercoaster week that was, I'm struck by the juxtaposition of success and struggle. From the heights of presenting at an international conference to the lows of battling illness, it was a journey that tested my resilience and resolve.</p>
|
||||
<p>But through it all, one thing remains clear: adversity only serves to make us stronger. Each obstacle we overcome, whether professional or personal, contributes to our growth and development.</p>
|
||||
<p>So here's to the rollercoaster weeks, the ones filled with ups and downs, twists and turns. For it is in those moments of challenge that we discover the true extent of our capabilities.</p>
|
||||
<p>As I upload this blog post using Hugo, I do so with a renewed sense of gratitude for the journey and all it has taught me. Here's to embracing the ride, wherever it may take us.</p>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,295 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Transitioning from Hugo to Haunt - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>Transitioning from Hugo to Haunt</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>Blog</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-05-15 10:30">2024-05-15 10:30</time>
|
||||
</div>
|
||||
<h1>Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix</h1>
|
||||
<p>Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.</p>
|
||||
<h2>Discovering Scheme with System Crafters</h2>
|
||||
<p>My journey began with a desire to dive deeper into programming languages and their ecosystems. I am a member of the <a href="https://systemcrafters.net/community/">System Crafters Community</a>, and its founder, David Wilson, announced a short four week course as an introduction to Guile Scheme. The course, <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/">Hands-On Guile Scheme for Beginners</a>, provided me with a robust introduction to Guile Scheme, a language that emphasizes simplicity and elegance. David's clear explanations and practical examples made learning Scheme both engaging and approachable.</p>
|
||||
<h2>The Move to GNU Guix</h2>
|
||||
<p>Inspired by the principles of Scheme, I decided to take a leap further into the open-source world by transitioning from Arch Linux to GNU Guix. The Guix community, particularly the folks in the <code>#systemcrafters</code> channel on <code>irc.libera.chat</code>, were incredibly supportive and instrumental in helping me navigate this new environment. Their guidance made the switch smooth and rewarding, reinforcing the power and flexibility of GNU Guix as a functional package manager and operating system. More about that experience in another post.</p>
|
||||
<p>There are too many individuals to name here that have helped with the installation and configuration on Gnu guix to mention here. You all have been an incredible help for which I am extremely grateful. Thank you all , for enduring my ignorance, and for your patience and your help.</p>
|
||||
<h2>From Hugo to Haunt</h2>
|
||||
<p>As I settled into Guix, I faced a challenge: Hugo, the static site generator I previously used, was not available as a Guix package. This led me to explore alternatives and eventually discover <a href="https://dthompson.us/projects/haunt.html">Haunt</a>, a Scheme-based static site generator that aligns perfectly with my newfound appreciation for Scheme and Guix.</p>
|
||||
<h2>Overcoming Challenges with Haunt</h2>
|
||||
<p>Transitioning to Haunt wasn't without its challenges. There are no readily available templating systems available for haunt like there are for hugo, but there are plenty of examples <a href="https://awesome.haunt.page/">here</a>. One of my own primary difficulties was creating a custom template that matched my site's aesthetic requirements and functionality needs. Initially, I struggled with configuring the theme layout and ensuring the CSS was applied correctly. Another hurdle was generating the correct URLs for posts and ensuring that summaries appeared as intended on the front page.</p>
|
||||
<p>Thankfully, the Haunt manual proved to be an invaluable resource throughout this process. The comprehensive documentation provided clear guidance on using various modules, functions, and procedures. By carefully studying the examples and explanations, I was able to overcome the obstacles and achieve the desired results for my site. The manual's detailed descriptions of Haunt's inner workings were particularly helpful in understanding how to leverage the flexibility of Scheme to customize my blog.</p>
|
||||
<h2>Crafting My Own Template</h2>
|
||||
<p>Moving from Hugo to Haunt required me to create my own template and customize my site's appearance. This was an exciting opportunity to apply the skills I had learned from David's course and experiment with Scheme in a practical context.</p>
|
||||
<h4>Creating the Template</h4>
|
||||
<p>Haunt's flexibility allowed me to define my own theme layout and structure. Here's a snippet of my <code>haunt.scm</code> file, where I defined the theme layout and added custom footer content:</p>
|
||||
<pre><code class="language-scheme">(use-modules (haunt asset)
|
||||
(haunt builder blog)
|
||||
(haunt builder atom)
|
||||
(haunt builder assets)
|
||||
(haunt reader commonmark)
|
||||
(haunt site)
|
||||
(haunt post)
|
||||
(sxml simple) ; For HTML generation
|
||||
(srfi srfi-1)
|
||||
(srfi srfi-19)) ; For date and time procedures
|
||||
|
||||
;; Load custom templates
|
||||
(load "templates/post.scm")
|
||||
|
||||
(define (format-date date)
|
||||
(date->string date "~Y-~m-~d"))
|
||||
|
||||
;; Define a function to generate the URL for a post
|
||||
(define (post-url post)
|
||||
(string-append "/" (post-slug post) ".html"))
|
||||
|
||||
;; Define a function to extract a summary from the post content
|
||||
(define (post-summary post)
|
||||
(let ((content (post-sxml post)))
|
||||
(if (null? content)
|
||||
""
|
||||
(let ((first-paragraph (car content)))
|
||||
(if (string? first-paragraph)
|
||||
(substring first-paragraph 0 (min 200 (string-length first-paragraph)))
|
||||
(sxml->string first-paragraph))))))
|
||||
|
||||
;; Define the theme layout
|
||||
(define (theme-layout site title content)
|
||||
(let ((current-year (number->string (date-year (current-date)))))
|
||||
`(html
|
||||
(head
|
||||
(meta (@ (charset "utf-8")))
|
||||
(meta (@ (name "viewport") (content "width=device-width, initial-scale=1.0, shrink-to-fit=no")))
|
||||
(link (@ (rel "stylesheet") (href "/assets/palenight.css")))
|
||||
(style
|
||||
" .craftering {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
}
|
||||
.webring-text {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
}
|
||||
.craftering a {
|
||||
color: #dddddd;
|
||||
}
|
||||
.webring-text a {
|
||||
color: #dddddd;
|
||||
}")
|
||||
(title ,title))
|
||||
(body
|
||||
(header (h1 ,(site-title site)))
|
||||
(main ,content)
|
||||
(footer (@ (class "bg-black bottom-0 w-100 pa3") (role "contentinfo"))
|
||||
(div (@ (class "flex justify-between"))
|
||||
(div (@ (class "webring-text"))
|
||||
(p "I am part of the " (a (@ (href "https://systemcrafters.net") (target "_blank")) "System Crafters") " webring:"))
|
||||
(div (@ (class "craftering"))
|
||||
(a (@ (href "https://craftering.systemcrafters.net/@glenneth/previous")) "←")
|
||||
(a (@ (href "https://craftering.systemcrafters.net/")) "craftering")
|
||||
(a (@ (href "https://craftering.systemcrafters.net/@glenneth/next")) "→"))))))))
|
||||
|
||||
;; Define the custom theme with a consistent layout for index
|
||||
(define my-theme
|
||||
(theme #:name "My Custom Theme"
|
||||
#:layout theme-layout
|
||||
#:post-template post-template
|
||||
#:collection-template
|
||||
(lambda (site title posts prefix)
|
||||
`(div (@ (class "content"))
|
||||
(h2 ,title)
|
||||
(ul
|
||||
,@(map (lambda (post)
|
||||
`(li
|
||||
(article
|
||||
(header
|
||||
(h3 (a (@ (href ,(post-url post))) ,(post-title post))))
|
||||
(p ,(format-date (post-date post)))
|
||||
(p ,(post-summary post))
|
||||
(p (a (@ (href ,(post-url post))) "Read more...")))))
|
||||
posts))))))
|
||||
|
||||
;; Site configuration
|
||||
(site #:title "Just Another Personal Blog"
|
||||
#:domain "glenneth.srht.site"
|
||||
#:default-metadata
|
||||
'((author . "Glenn Thompson")
|
||||
(email . "glenn@kirstol.org"))
|
||||
#:readers (list commonmark-reader)
|
||||
#:builders (list
|
||||
(blog #:theme my-theme)
|
||||
(atom-feed)
|
||||
(atom-feeds-by-tag)
|
||||
(static-directory "images")
|
||||
(static-directory "assets")))
|
||||
</code></pre>
|
||||
<h3>Customizing the CSS</h3>
|
||||
<p>To give my site a personalized touch, I crafted a CSS stylesheet that matched my aesthetic preferences. Here’s an excerpt from my <code>palenight.css</code> file:</p>
|
||||
<pre><code class="language-css">body {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.content, header, footer, main {
|
||||
max-width: 90%;
|
||||
padding: 0 5%;
|
||||
}
|
||||
|
||||
header {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
footer {
|
||||
text-align: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #292d3e;
|
||||
color: #d0d0d0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #82aaff;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #c792ea;
|
||||
}
|
||||
|
||||
.content {
|
||||
background-color: #1e1e2e;
|
||||
padding: 20px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
article {
|
||||
background-color: #282a36;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
article header {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.date {
|
||||
color: #6272a4;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/* Additional styles for the craftering */
|
||||
.craftering {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.webring-text {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.craftering a {
|
||||
color: #dddddd;
|
||||
}
|
||||
|
||||
.webring-text a {
|
||||
color: #dddddd;
|
||||
}
|
||||
|
||||
/* Additions for mobile device readability */
|
||||
|
||||
meta {
|
||||
name: viewport;
|
||||
content: width=device-width, initial-scale=1, shrink-to-fit=no;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
/* Customize styles for smaller screens */
|
||||
.logo {
|
||||
max-width: 200px;
|
||||
}
|
||||
|
||||
}
|
||||
</code></pre>
|
||||
<p>I use the <code>doom-palenight</code> theme in Emacs, my preferred text editor, and I wanted my site to match that aesthetic.</p>
|
||||
<h3>Publishing with Haunt and Hut</h3>
|
||||
<p>In addition to using Haunt, I adopted hut, a set of command-line tools for interacting with SourceHut, to publish my blog. This streamlined my workflow, making it easier to manage and deploy my site directly from my local environment.</p>
|
||||
<h3>Conclusion</h3>
|
||||
<p>Transitioning from Hugo to Haunt, learning Scheme, and embracing GNU Guix has been an enriching experience. It's not just about using new tools; it's about joining a community that values simplicity, transparency, and collaboration. If you're curious about Scheme or GNU Guix, I highly recommend checking out David Wilson's course on System Crafters and joining the discussions on IRC.</p>
|
||||
<p>I am not a developer of any kind, and learning Scheme has opened my eyes as to how I can craft an environment that I want to work in, and not endure a working environment that the computer is forcing upon me.</p>
|
||||
<p>Thank you for reading, and stay tuned for more updates on my journey!</p>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>A Journey Through GNU Guix - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>A Journey Through GNU Guix</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>Blog</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-07-26 10:30">2024-07-26 10:30</time>
|
||||
</div>
|
||||
<h1>A Journey Through GNU Guix: From Installation to Returning to Arch Linux</h1>
|
||||
<p>As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey was insightful, filled with learning experiences, but ultimately led me back to the reliable shores of Arch. Here's a detailed account of my venture into GNU Guix, adding non-GNU channels, dealing with Nvidia drivers, running SwayWM, and the eventual retreat to Arch.</p>
|
||||
<h2>Installation of GNU Guix</h2>
|
||||
<p>The installation process of GNU Guix was straightforward, thanks to the well-documented guide provided on their official website. Here's a quick rundown of the steps I followed:</p>
|
||||
<ol>
|
||||
<li><strong>Downloading the Installation Image</strong>: I started by downloading the latest ISO image from the <a href="https://guix.gnu.org/">GNU Guix website</a>.</li>
|
||||
<li><strong>Creating a Bootable USB</strong>: Using <code>dd</code>, I created a bootable USB stick to install GNU Guix on my system.</li>
|
||||
<li><strong>Booting into the Installer</strong>: Booting from the USB was smooth, and I was greeted with the GNU Guix installer. The installer's simplicity reminded me of early days with Arch, where a minimalistic approach is preferred.</li>
|
||||
<li><strong>Partitioning and Setting Up File Systems</strong>: I partitioned my drive using <code>fdisk</code> and set up my file systems. I opted for ext4 for simplicity.</li>
|
||||
<li><strong>Configuring the System</strong>: Following the partition setup, I proceeded to configure my system by selecting the required packages and services. I decided to go with the Sway window manager as it's my preferred choice on Arch.</li>
|
||||
</ol>
|
||||
<h2>System Configuration</h2>
|
||||
<p>During the installation process a window appears informing you that the <code>config.scm</code> file is located at <code>/etc/config.scm</code>. The first time I installed gnu guix on my work laptop I missed this message (pilot error) and I had to ask in the <a href="https://systemcrafters.net">System Crafters</a> IRC channel at <code>irc.libera.chat</code>, <code>#systemcrafters</code>. Come and join. It's a great place to be and the community there are an absolute treasure. Use your favourite IRC client or join through the webchat <a href="https://web.libera.chat/?channel=#systemcrafters">here</a>. We would be glad to see you. Tell them glenneth sent you :).</p>
|
||||
<p>My point is, I missed some vital information, so to the guix manual online it was. This can be found <a href="https://guix.gnu.org/manual/devel/en/guix.html">here</a>. This link will take you to the dev version of the manual. Something else they don't tell you. This version has a little more detail than the standard manual, and I believe details extra features and may even be a little more up to date.</p>
|
||||
<h2>Adding Non-GNU Channels</h2>
|
||||
<p>One of the standout features of GNU Guix is the ability to add non-GNU channels to access a wider array of software packages. Here's how I did it:</p>
|
||||
<ol>
|
||||
<li><strong>Editing Channels</strong>: I edited the <code>~/.config/guix/channels.scm</code> file to include non-GNU channels.<pre><code class="language-scheme">(cons* (channel
|
||||
(name 'non-gnu)
|
||||
(url "https://example.com/non-gnu-channel.git"))
|
||||
%default-channels)
|
||||
</code></pre>
|
||||
</li>
|
||||
<li><strong>Updating Channels</strong>: Running <code>guix pull</code> updated my system to include packages from the non-GNU channel.</li>
|
||||
</ol>
|
||||
<h2>Installing Nvidia Drivers</h2>
|
||||
<p>Being a gamer and someone who requires GPU acceleration for certain tasks, Nvidia drivers were a must. Here's the process I followed:</p>
|
||||
<ol>
|
||||
<li><strong>Adding Nvidia Channel</strong>: Added a channel that includes Nvidia drivers.</li>
|
||||
<li><strong>Installing Drivers</strong>: Installed the drivers using <code>guix package -i nvidia-driver</code>.</li>
|
||||
<li><strong>Configuring the System</strong>: I had to manually configure Xorg to use the Nvidia drivers, which involved editing the Xorg configuration files.</li>
|
||||
</ol>
|
||||
<h2>Creating My Home Environment</h2>
|
||||
<p>To personalize my setup further, I used <code>guix home import</code> to create my own home environment and add packages. This allowed me to have a consistent environment across different machines. I also edited the <code>config.scm</code> file to include the latest Linux kernels and Nvidia drivers.</p>
|
||||
<p>Additionally, I used the <code>syncthing home-service-type</code> in my <code>home-configuration.scm</code> file to install and configure Syncthing. This setup ensured my files were always in sync across devices, which is crucial for my workflow.</p>
|
||||
<h2>GNOME</h2>
|
||||
<p>All was good and I had a solid desktop environment running, even though it was gnome desktop. I had never used gnome, and I am more at home with a keyboard driven workflow. I had come from hyprland on Arch and wanted to get back to that workflow. The option I was presented with, in order to continue using wayland, pipewire etc. was SwayWM.</p>
|
||||
<h2>Sway</h2>
|
||||
<p>Installing SwayWM and it's dependencies and nice to haves was relatively straightforward. add the required packages, sway, swaybg, swayidle, swaylock, to my home-configuration.scm gile and run <code>guix home reconfigure</code> easy! The packages were installed and we were good to go.</p>
|
||||
<p>The first issue I encountered was that sway does not run with the proprietary nvidia drivers, this was on the work laptop. I could get it to run but only after adding the <code>--unsupported-gpu</code> flag to <code>exec sway</code>. Lo and behold, we had a default sway window manager running.</p>
|
||||
<h2>Challenges with SwayWM and SMB Shares</h2>
|
||||
<p>With the system set up, I ran into a major roadblock: accessing SMB shares in a file manager while running SwayWM.</p>
|
||||
<ol>
|
||||
<li><strong>Thunar and GNOME Files</strong>: Neither Thunar nor the GNOME Files application could access SMB shares. This was crucial for my workflow as I frequently access network shares.</li>
|
||||
<li><strong>Troubleshooting</strong>: I tried various solutions, including installing additional packages and tweaking configurations, but nothing seemed to work.</li>
|
||||
<li><strong>Community Support</strong>: I reached out to the GNU Guix community for help. While they were supportive, the solutions provided didn't resolve my issues.</li>
|
||||
</ol>
|
||||
<p>To ensure that the problem was not hardware-related, I went out and purchased a Lenovo ThinkPad E16 Gen 1. I upgraded the RAM to 48GB and installed a Lenovo 2TB SSD to make it my personal laptop. However, even on this new setup, I faced the same issues accessing SMB shares and some networking services just wouldn't work.</p>
|
||||
<p>I tried deleting the <code>gdm</code> login manager in my system configuration file, but after rebooting it was still showing the gnome login window. This was after reading somewhere online that sway was not on friendly terms with the gdm login manager.</p>
|
||||
<h2>Returning to Arch Linux</h2>
|
||||
<p>After several days of troubleshooting and not being able to access my SMB shares reliably, I made the difficult decision to revert to Arch Linux. The steps were:</p>
|
||||
<ol>
|
||||
<li><strong>Reinstalling Arch</strong>: I reinstalled Arch Linux using my tried-and-tested setup process.</li>
|
||||
<li><strong>Configuring SwayWM</strong>: Set up SwayWM and ensured all my applications were running smoothly.</li>
|
||||
<li><strong>Accessing SMB Shares</strong>: Accessing SMB shares was seamless, just as it was before my experiment with GNU Guix.</li>
|
||||
</ol>
|
||||
<h2>Conclusion</h2>
|
||||
<p>I am still running GNU guix on the work laptop, I had to cave on my personal laptop and revert to Arch. My journey with GNU Guix was both enlightening and challenging. While I appreciate the functional package management and the philosophy behind GNU Guix, certain practical issues, like accessing SMB shares, were deal-breakers for my workflow. Arch Linux continues to be my go-to distribution, providing the flexibility and reliability I need for my daily tasks. So, at the moment I am using my personal laptop for work and still trying to figure out the issues I am having on my work laptop. But, to be honest, I prefer working on the thinkpad over working on the MSI laptop that work handed out :).</p>
|
||||
<p>If you're an enthusiast looking to explore new package management paradigms, I highly recommend giving GNU Guix a try. Just be prepared for a few hiccups along the way, and always have a backup plan!</p>
|
||||
<hr>
|
||||
<p>Feel free to share your thoughts and experiences with GNU Guix or any other distributions you've tried. Let's keep the conversation going!</p>
|
||||
<h2>Shameless plug</h2>
|
||||
<p>Go <a href="https://systemcrafters.net/community/">here</a> to find all the ways you can engage with the SystemCrafters community. It's a great place to hang out and discuss all thing craftery. You will also notice the Craftering ring that I am a part of. Click the links and see blogs by some of the community members. Always interesting to read what other Crafters are up to.</p>
|
||||
<p>Thanks for taking the time to read my blog post. It is greatly appreciated, and I hope you come back.</p>
|
||||
<p>Happy Hacking!!</p>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,130 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>A Journey into Scheme - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>A Journey into Scheme</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>Blog</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-09-24 09:30">2024-09-24 09:30</time>
|
||||
</div>
|
||||
<h1>My Journey into Scheme: Building a Simple Symlink Manager with Guile Scheme</h1>
|
||||
<h2>Introduction</h2>
|
||||
<p>I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—specifically Guile Scheme. I'm writing this post to share how I built <code>stash</code>, a utility that mimics GNU Stow's functionality, and how my learning journey was shaped by David Wilson's "Hands-On Guile Scheme for Beginners" course from System Crafters, more about this below.</p>
|
||||
<h2>How I Started with Scheme</h2>
|
||||
<p>My programming background was <em>VERY</em> limited, I produce documents in (La)Tex but I decided to take the plunge into learning Scheme, thanks to a course led by David Wilson from System Crafters. The course, <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/">"Hands-On Guile Scheme for Beginners"</a>, was incredibly helpful in making Scheme accessible even for someone like me, without a traditional programming background. I know (La)Tex isn't a programming language, it's typesetting. But how hard can it be? Right?</p>
|
||||
<p>The course took me through the basics of Scheme, from simple expressions to more complex concepts like functions, recursion, and working with files. This structured learning environment gave me the confidence to start building <code>stash</code>.</p>
|
||||
<p>The course was "instructor-led" with live meet-up sessions weekly. David has since made this course on-demand, and will be, if not already, available at the above link. Highly recommended if you are interested in taking your first steps with scheme.</p>
|
||||
<h2>Why Build Stash?</h2>
|
||||
<p>After completing David Wilson's course, I wanted to put my newly found Guile Scheme skills into practice with a real project. It wasn't enough just to understand the language conceptually—I needed to build something tangible that solved a problem I encountered regularly in my workflow. Writing <code>stash</code> gave me that opportunity. It allowed me to apply what I'd learned while also deepening my understanding of file manipulation, command-line tools, and conflict resolution—all within the Guile Scheme environment.</p>
|
||||
<p>After migrating to GNU/Linux and speaking with other <a href="https://systemcrafters.net/community">System Crafters Community</a> members, I found I needed a way to manage symbolic links and organize directories. Existing tools like GNU Stow helped, but I wanted to learn how such tools are built. I decided to write my own version using Guile Scheme to enhance my understanding of the language and to have more control over the functionality.</p>
|
||||
<p>The goal of <code>stash</code> is simple: allow users to move directories and create symlinks with conflict resolution, offering options to overwrite, back up, skip, or cancel the operation.</p>
|
||||
<h2>Breaking Down Stash</h2>
|
||||
<p>The core of <code>stash</code> revolves around:</p>
|
||||
<ol>
|
||||
<li><strong>Moving Directories</strong>: Using Scheme's file manipulation functions, I learned how to move directories and files around. </li>
|
||||
<li><strong>Creating Symlinks</strong>: I implemented functions to create symlinks to the moved directories, ensuring that the original structure remains accessible.</li>
|
||||
<li><strong>Conflict Resolution</strong>: One of the key features I wanted was handling conflicts when a file or symlink already exists at the target location. This required prompting the user for input and responding accordingly (backup, overwrite, skip, or cancel).</li>
|
||||
</ol>
|
||||
<p>Here's an excerpt of the core functionality that handles moving a source directory and creating a symlink:</p>
|
||||
<pre><code class="language-scheme">;;; Helper function to move source to target
|
||||
(define (move-source-to-target source-dir target-dir)
|
||||
"Move the entire source directory to the target directory."
|
||||
(let* ((source-dir (expand-home source-dir))
|
||||
(target-dir (expand-home target-dir))
|
||||
(source-name (basename source-dir))
|
||||
(target-source-dir (string-append target-dir "/" source-name)))
|
||||
(if (file-exists? target-source-dir)
|
||||
;; Conflict handling here...
|
||||
...)
|
||||
(rename-file source-dir target-source-dir)
|
||||
(display (format #f "Moved ~a to ~a\n" source-dir target-source-dir))))
|
||||
</code></pre>
|
||||
<h2>What I Learned</h2>
|
||||
<p>This project taught me a lot about not just Scheme, but programming in general:</p>
|
||||
<ul>
|
||||
<li><strong>File and Directory Manipulation</strong>: Scheme's file handling functions were different from what I had experienced before, but they allowed for powerful manipulation of file systems.</li>
|
||||
<li><strong>Command-Line Utilities</strong>: Scheme isn't just a language for academic exercises; you can write real, useful command-line tools with it.</li>
|
||||
<li><strong>Problem Solving</strong>: From parsing command-line arguments to resolving conflicts with existing files, every part of the program required careful thought and consideration of edge cases.</li>
|
||||
</ul>
|
||||
<h2>Guile Scheme Support Resources</h2>
|
||||
<ol>
|
||||
<li><p><strong><a href="https://www.gnu.org/software/guile/docs/">Guile Scheme Documentation</a></strong>
|
||||
The official documentation for Guile Scheme, which includes tutorials, references, and the Guile Manual.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://www.gnu.org/software/guile/manual/html_node/">Guile Reference Manual</a></strong>
|
||||
A comprehensive manual covering core language concepts, libraries, and functions available in Guile Scheme.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="http://community.schemewiki.org/">Scheme Wiki</a></strong>
|
||||
A community-maintained wiki that covers various Scheme dialects, including Guile Scheme, with tutorials, guides, and general information on Scheme programming.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="http://schemers.org/">Guile at Schemers.org</a></strong>
|
||||
A site dedicated to Scheme with resources, libraries, tools, and documentation for Scheme and its implementations, including Guile.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://systemcrafters.net/">System Crafters</a></strong>
|
||||
Led by David Wilson, System Crafters provides tutorials and blog posts on Guile Scheme and other GNU tools.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://lists.gnu.org/mailman/listinfo/guile-user">Guile Users Mailing List</a></strong>
|
||||
Join the Guile mailing list to ask questions and engage with the Guile Scheme community.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://github.com/artyom-poptsov/guile-cookbook">Guile Cookbook</a></strong>
|
||||
An unofficial GitHub repository with practical code snippets and tips for Guile Scheme, covering various common use cases and tasks.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://libera.chat/">#guile and #scheme on Libera Chat IRC</a></strong>
|
||||
A helpful IRC channel where you can connect with other Guile users for real-time support and advice.</p>
|
||||
</li>
|
||||
<li><p><strong><a href="https://Libera.chat/">#systemcrafters on Libera Chat IRC</a></strong>
|
||||
A <em>SUPER</em> helpful IRC channel not only for guile and scheme, there are a huge variety of different people here. Tell them glenneth sent you.</p>
|
||||
</li>
|
||||
</ol>
|
||||
<h2>Next Steps</h2>
|
||||
<p>I am still refining <code>stash</code>, especially around its conflict resolution system and the way it handles symbolic links. But it's in a usable state, and I'm excited to continue iterating on it. You can check out the code <a href="https://codeberg.org/glenneth/stash">on Codeberg</a>.</p>
|
||||
<p>If you're curious about Scheme and how it can be used practically, I highly recommend checking out David Wilson's course. It's been instrumental in helping me grasp the concepts I needed to build this tool. Here's the link, again :) <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/">"Hands-On Guile Scheme for Beginners"</a></p>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="A personal account of an intense week of international travel and professional challenges">
|
||||
<meta property="og:title" content="A Rollercoaster Week: From Amman to Newcastle, and back again">
|
||||
<meta property="og:description" content="A journey filled with conference presentations, international travel, and unexpected challenges">
|
||||
<meta property="og:url" content="https://glenneth.org/content/posts/amman-newcastle-journey">
|
||||
<title>Amman to Newcastle Journey - Glenn Thompson</title>
|
||||
<link href="../../dist/styles.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="/" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="/#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="/#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="/#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
<a href="/#contact" class="nav-link text-accent-blue hover:text-accent-cyan">Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="pt-24 pb-16 px-4">
|
||||
<article class="max-w-4xl mx-auto prose prose-palenight">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<a href="/" class="inline-flex items-center text-accent-blue hover:text-accent-cyan transition-colors">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
Back to Home
|
||||
</a>
|
||||
<span class="text-palenight-300 text-sm">~4 min read</span>
|
||||
</div>
|
||||
|
||||
<header class="mb-8">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Personal</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-05-01T17:40:58+03:00">May 1, 2024</time>
|
||||
</div>
|
||||
<h1 class="text-4xl font-serif font-bold text-accent-yellow mb-4">
|
||||
A Rollercoaster Week: From Amman to Newcastle, and back again
|
||||
</h1>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">work</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">travel</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="content text-palenight-100 space-y-6">
|
||||
<p>Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional achievements, and personal challenges.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">The Journey Begins</h2>
|
||||
|
||||
<p>It all started on a Monday morning in Amman as I embarked on a journey to attend a Quality Control (QC) conference in Newcastle. The anticipation of presenting my work at an international forum filled me with excitement and nerves. The conference was scheduled for just one day, but the impact it had on me would last much longer.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">A Successful Presentation</h2>
|
||||
|
||||
<p>Tuesday arrived, and with it came the day of the conference. Armed with a PowerPoint presentation comprising over 130 slides, I delved into four hours of intense presenting. Despite the pressure, the conference was a resounding success. My project received positive feedback, and I felt a sense of accomplishment as I shared my work with colleagues from around the world.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">The Toll of Travel</h2>
|
||||
|
||||
<p>However, as I returned to Amman on Wednesday, I couldn't shake off a sense of exhaustion. Little did I know that the toll of travel would soon manifest itself in a most unexpected manner.</p>
|
||||
|
||||
<p>Thursday morning greeted me with heavy flu-like symptoms. It hit me like a ton of bricks. The combination of jet lag, long hours of presenting, and exposure to new environments had taken its toll on my immune system. I was bedridden, grappling with a chesty cough that seemed relentless.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">The Show Must Go On</h2>
|
||||
|
||||
<p>Despite my illness, there was no time for rest. The following week demanded my presence at a site meeting where I was tasked with condensing my extensive slide deck into a concise presentation of just 12 slides. The challenge was daunting, but I tackled it with determination.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Reflecting on the Journey</h2>
|
||||
|
||||
<p>As I look back on the rollercoaster week that was, I'm struck by the juxtaposition of success and struggle. From the heights of presenting at an international conference to the lows of battling illness, it was a journey that tested my resilience and resolve.</p>
|
||||
|
||||
<p>But through it all, one thing remains clear: adversity only serves to make us stronger. Each obstacle we overcome, whether professional or personal, contributes to our growth and development.</p>
|
||||
|
||||
<p>So here's to the rollercoaster weeks, the ones filled with ups and downs, twists and turns. For it is in those moments of challenge that we discover the true extent of our capabilities.</p>
|
||||
|
||||
<p>As I upload this blog post using Hugo, I do so with a renewed sense of gratitude for the journey and all it has taught me. Here's to embracing the ride, wherever it may take us.</p>
|
||||
</div>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,119 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="An in-depth review of the Glove80 ergonomic keyboard by Glenn Thompson">
|
||||
<meta property="og:title" content="Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard">
|
||||
<meta property="og:description" content="An in-depth review exploring the unique design, features, and impact on typing comfort of the Glove80 ergonomic keyboard">
|
||||
<meta property="og:url" content="https://glenneth.org/content/posts/glove80-review">
|
||||
<title>Glove80 Review - Glenn Thompson</title>
|
||||
<link href="../../dist/styles.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="/" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="/#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="/#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="/#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
<a href="/#contact" class="nav-link text-accent-blue hover:text-accent-cyan">Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="pt-24 pb-16 px-4">
|
||||
<article class="max-w-4xl mx-auto prose prose-palenight">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<a href="/" class="inline-flex items-center text-accent-blue hover:text-accent-cyan transition-colors">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
Back to Home
|
||||
</a>
|
||||
<span class="text-palenight-300 text-sm">~8 min read</span>
|
||||
</div>
|
||||
|
||||
<header class="mb-8">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Tech</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-04-08">April 8, 2024</time>
|
||||
</div>
|
||||
<h1 class="text-4xl font-serif font-bold text-accent-yellow mb-4">
|
||||
Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard
|
||||
</h1>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">keyboards</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">tech</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="content text-palenight-100 space-y-6">
|
||||
<p>In the quest for the ultimate ergonomic keyboard, aesthetics often take a backseat to functionality. Yet, when I first laid eyes on the Glove80, I was struck by its elegant design—a refreshing departure from the utilitarian look typical of many ergonomic keyboards. Unlike the retro vibes of the Kinesis Advantage or the DIY aesthetics of most Dactyls, the Glove80 boasts a modern, sleek appearance that complements the contemporary design language of Apple, Google, and LG devices. With its clean lines and visually appealing legends, the Glove80 not only promises ergonomic comfort but does so with style, standing out amidst a sea of competitors.</p>
|
||||
|
||||
<p>As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant transformation. The hands-on tasks of yesteryears were gradually replaced by a deluge of documentations—writing, reviewing, and endless typing. This shift brought with it an unwelcome companion: discomfort in my hands and wrists, a stark reminder of the ergonomic pitfalls of conventional keyboards. It was in this context that my quest for a more ergonomic typing solution began, leading me towards the world of ALICE layout keyboards, with the <a href="https://www.keychron.com/products/keychron-q10-pro-alice-layout-qmk-via-wireless-custom-mechanical-keyboard" class="text-accent-blue hover:text-accent-cyan">Q10 Pro by Keychron</a> being my initial foray into this new realm.</p>
|
||||
|
||||
<p>However, the relief was partial, and the shadow of wrist strain persisted, urging me to delve deeper into the ergonomic keyboard universe. My search for a truly ergonomic solution brought me to the doorstep of the <a href="https://www.moergo.com" class="text-accent-blue hover:text-accent-cyan">Glove80 by MoErgo</a>. Boasting a unique split design, concave key wells, and a commitment to ergonomics that seemed almost tailor-made for my situation, the Glove80 held the promise of being the oasis I was desperately seeking in the desert of my wrist discomfort.</p>
|
||||
|
||||
<p>This journey from an ALICE layout keyboard user to a Glove80 enthusiast was not just about finding a better typing tool; it was about embracing a healthier typing posture and redefining my interaction with computers. After a month of integrating the Glove80 into my workflow, I'm ready to share my insights and experiences. This review will explore the initial adaptation period, the impact on my wrist health, and whether the Glove80 lives up to its promise as an ergonomic game-changer.</p>
|
||||
|
||||
<h3 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">First Impressions: Feel and Experience</h3>
|
||||
|
||||
<p>Upon beginning my typing journey with the Glove80, two aspects immediately stood out. The unique choc spacing, combined with finger-specific curves for each key column, facilitated effortless access to the bottom and number rows, as well as several function keys—without the need to move my hands. This ease of reach extended to the thumb keys, thoughtfully laid out in an arc to match the natural movement of my thumbs. Additionally, the keyboard's low profile on the desk encouraged a neutral wrist position, enhancing comfort during long typing sessions. These features converged to create a typing experience that was not just comfortable but intuitively aligned with natural hand movements.</p>
|
||||
|
||||
<h4 class="text-xl font-serif font-bold text-accent-yellow mt-6 mb-3">The Details That Matter</h4>
|
||||
|
||||
<h5 class="text-lg font-serif font-bold text-accent-yellow mt-4 mb-2">Ergonomics at Its Core</h5>
|
||||
|
||||
<p>The hallmark of the Glove80 is its ergonomics, designed to seamlessly integrate with the user's hand movements. After fine-tuning the tenting and tilting angles—made possible by the adjustable feet on each half of the keyboard—my hands naturally fell into the optimal typing position. The thoughtfully designed key layout meant that reaching for higher rows required merely straightening or curling my fingers, aided by the keyboard's choc spacing. Each column's unique height and curve catered to the different lengths of my fingers, further minimizing strain.</p>
|
||||
|
||||
<h5 class="text-lg font-serif font-bold text-accent-yellow mt-4 mb-2">Key Innovations</h5>
|
||||
|
||||
<p>The Glove80 introduces keycaps with a novel MCC profile, featuring raised sides and a central cylindrical channel, made from a slick POM material. This design supports the natural sliding of fingers across keys, reducing the need to lift hands while typing. The keyboard's thumb clusters are another highlight, offering six easily accessible keys per hand. This ergonomic layout ensures that most keys are within reach without stretching, a testament to the keyboard's user-centric design.</p>
|
||||
|
||||
<h5 class="text-lg font-serif font-bold text-accent-yellow mt-4 mb-2">Beyond Typing: Features and Flexibility</h5>
|
||||
|
||||
<ul class="list-disc pl-6 space-y-2">
|
||||
<li><strong class="text-accent-purple">Tenting and Adjustability:</strong> The Glove80's customizable tenting angles, enhanced by sturdy locking nuts, ensure a tailored typing experience that can be finely adjusted to individual preferences.</li>
|
||||
<li><strong class="text-accent-purple">Comfortable Palm Rest:</strong> The integrated, detachable palm rest offers additional comfort, catering to different typing styles with ease.</li>
|
||||
<li><strong class="text-accent-purple">Switch Selection:</strong> While the standard Kailh choc switches are adequate, enthusiasts might prefer customizing their keyboard with preferred switches for an optimized typing feel. I opted for the lighter Kailh Choc V1, Red Pro Linear 35gf switches.</li>
|
||||
<li><strong class="text-accent-purple">Keycaps:</strong> The high-quality POM keycaps, combined with attractive and durable legends, enhance the keyboard's tactile and visual appeal.</li>
|
||||
<li><strong class="text-accent-purple">Tech-Savvy Features:</strong> From its easy-to-use firmware updates via a web interface to seamless Bluetooth connectivity and impressive battery life, the Glove80 is designed for a modern, wireless world.</li>
|
||||
<li><strong class="text-accent-purple">RGB Lighting:</strong> While currently limited in customization, the RGB LEDs offer aesthetic versatility to match any setup.</li>
|
||||
</ul>
|
||||
|
||||
<h3 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Concluding Thoughts</h3>
|
||||
|
||||
<p>The Glove80 keyboard represents a significant leap forward in ergonomic design, marrying aesthetics with unmatched comfort and functionality. Its thoughtful features—from the infinitely adjustable tenting to the innovative keycap design—set a new standard for what ergonomic keyboards can be. While there's room for improvement in switch selection and RGB customization, these are minor quibbles in an otherwise outstanding product. For those in search of ergonomic excellence without compromising on style or performance, the Glove80 is an investment worth making, promising a typing experience that's not just comfortable but truly enjoyable.</p>
|
||||
</div>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,182 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="A journey through GNU Guix and the eventual return to Arch Linux">
|
||||
<meta property="og:title" content="A Journey Through GNU Guix: From Installation to Returning to Arch Linux">
|
||||
<meta property="og:description" content="An exploration into GNU Guix, its challenges, and the eventual return to Arch Linux">
|
||||
<meta property="og:url" content="https://glenneth.org/content/posts/gnu-guix-journey">
|
||||
<title>GNU Guix Journey - Glenn Thompson</title>
|
||||
<link href="../../dist/styles.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="/" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="/#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="/#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="/#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="pt-24 pb-16 px-4">
|
||||
<div class="max-w-4xl mx-auto">
|
||||
<div class="content text-palenight-100 space-y-6">
|
||||
<article class="prose prose-palenight">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<a href="/" class="inline-flex items-center text-accent-blue hover:text-accent-cyan transition-colors">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
Back to Home
|
||||
</a>
|
||||
<time datetime="2024-07-26T10:30:00" class="text-palenight-300">July 26, 2024</time>
|
||||
</div>
|
||||
|
||||
<header class="mb-8">
|
||||
<h1 class="text-4xl font-serif font-bold text-accent-yellow">A Journey Through GNU Guix: From Installation to Returning to Arch Linux</h1>
|
||||
<div class="flex items-center gap-4 text-palenight-300">
|
||||
<time datetime="2024-07-26T10:30:00">July 26, 2024</time>
|
||||
<span>•</span>
|
||||
<span>By Glenn Thompson</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<p class="mb-6">As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey was insightful, filled with learning experiences, but ultimately led me back to the reliable shores of Arch. Here's a detailed account of my venture into GNU Guix, adding non-GNU channels, dealing with Nvidia drivers, running SwayWM, and the eventual retreat to Arch.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Installation of GNU Guix</h2>
|
||||
|
||||
<p class="mb-4">The installation process of GNU Guix was straightforward, thanks to the well-documented guide provided on their official website. Here's a quick rundown of the steps I followed:</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Downloading the Installation Image</strong>: I started by downloading the latest ISO image from the <a href="https://guix.gnu.org/" class="text-accent-blue hover:text-accent-cyan">GNU Guix website</a>.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Creating a Bootable USB</strong>: Using <code class="text-accent-purple">dd</code>, I created a bootable USB stick to install GNU Guix on my system.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Booting into the Installer</strong>: Booting from the USB was smooth, and I was greeted with the GNU Guix installer. The installer's simplicity reminded me of early days with Arch, where a minimalistic approach is preferred.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Partitioning and Setting Up File Systems</strong>: I partitioned my drive using <code class="text-accent-purple">fdisk</code> and set up my file systems. I opted for ext4 for simplicity.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Configuring the System</strong>: Following the partition setup, I proceeded to configure my system by selecting the required packages and services. I decided to go with the Sway window manager as it's my preferred choice on Arch.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">System Configuration</h2>
|
||||
|
||||
<p class="mb-4">During the installation process a window appears informing you that the <code class="text-accent-purple">config.scm</code> file is located at <code class="text-accent-purple">/etc/config.scm</code>. The first time I installed gnu guix on my work laptop I missed this message (pilot error) and I had to ask in the <a href="https://systemcrafters.net" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> IRC channel at <code class="text-accent-purple">irc.libera.chat</code>, <code class="text-accent-purple">#systemcrafters</code>. Come and join. It's a great place to be and the community there are an absolute treasure. Use your favourite IRC client or join through the webchat <a href="https://web.libera.chat/?channel=#systemcrafters" class="text-accent-blue hover:text-accent-cyan">here</a>. We would be glad to see you. Tell them glenneth sent you :).</p>
|
||||
|
||||
<p class="mb-4">My point is, I missed some vital information, so to the guix manual online it was. This can be found <a href="https://guix.gnu.org/manual/devel/en/guix.html" class="text-accent-blue hover:text-accent-cyan">here</a>. This link will take you to the dev version of the manual. Something else they don't tell you. This version has a little more detail than the standard manual, and I believe details extra features and may even be a little more up to date.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Adding Non-GNU Channels</h2>
|
||||
|
||||
<p class="mb-4">One of the standout features of GNU Guix is the ability to add non-GNU channels to access a wider array of software packages. Here's how I did it:</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Editing Channels</strong>: I edited the <code class="text-accent-purple">~/.config/guix/channels.scm</code> file to include non-GNU channels.</li>
|
||||
</ol>
|
||||
|
||||
<pre class="bg-base-darker p-4 rounded-lg overflow-x-auto mb-4"><code class="text-palenight-100 font-mono text-sm">(cons* (channel
|
||||
(name 'non-gnu)
|
||||
(url "https://example.com/non-gnu-channel.git"))
|
||||
%default-channels)</code></pre>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6" start="2">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Updating Channels</strong>: Running <code class="text-accent-purple">guix pull</code> updated my system to include packages from the non-GNU channel.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Installing Nvidia Drivers</h2>
|
||||
|
||||
<p class="mb-4">Being a gamer and someone who requires GPU acceleration for certain tasks, Nvidia drivers were a must. Here's the process I followed:</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Adding Nvidia Channel</strong>: Added a channel that includes Nvidia drivers.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Installing Drivers</strong>: Installed the drivers using <code class="text-accent-purple">guix package -i nvidia-driver</code>.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Configuring the System</strong>: I had to manually configure Xorg to use the Nvidia drivers, which involved editing the Xorg configuration files.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Creating My Home Environment</h2>
|
||||
|
||||
<p class="mb-4">To personalize my setup further, I used <code class="text-accent-purple">guix home import</code> to create my own home environment and add packages. This allowed me to have a consistent environment across different machines. I also edited the <code class="text-accent-purple">config.scm</code> file to include the latest Linux kernels and Nvidia drivers.</p>
|
||||
|
||||
<p class="mb-4">Additionally, I used the <code class="text-accent-purple">syncthing home-service-type</code> in my <code class="text-accent-purple">home-configuration.scm</code> file to install and configure Syncthing. This setup ensured my files were always in sync across devices, which is crucial for my workflow.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">GNOME</h2>
|
||||
|
||||
<p class="mb-4">All was good and I had a solid desktop environment running, even though it was gnome desktop. I had never used gnome, and I am more at home with a keyboard driven workflow. I had come from hyprland on Arch and wanted to get back to that workflow. The option I was presented with, in order to continue using wayland, pipewire etc. was SwayWM.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Sway</h2>
|
||||
|
||||
<p class="mb-4">Installing SwayWM and it's dependencies and nice to haves was relatively straightforward. add the required packages, sway, swaybg, swayidle, swaylock, to my home-configuration.scm gile and run <code class="text-accent-purple">guix home reconfigure</code> easy! The packages were installed and we were good to go.</p>
|
||||
|
||||
<p class="mb-4">The first issue I encountered was that sway does not run with the proprietary nvidia drivers, this was on the work laptop. I could get it to run but only after adding the <code class="text-accent-purple">--unsupported-gpu</code> flag to <code class="text-accent-purple">exec sway</code>. Lo and behold, we had a default sway window manager running.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Challenges with SwayWM and SMB Shares</h2>
|
||||
|
||||
<p class="mb-4">With the system set up, I ran into a major roadblock: accessing SMB shares in a file manager while running SwayWM.</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Thunar and GNOME Files</strong>: Neither Thunar nor the GNOME Files application could access SMB shares. This was crucial for my workflow as I frequently access network shares.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Troubleshooting</strong>: I tried various solutions, including installing additional packages and tweaking configurations, but nothing seemed to work.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Community Support</strong>: I reached out to the GNU Guix community for help. While they were supportive, the solutions provided didn't resolve my issues.</li>
|
||||
</ol>
|
||||
|
||||
<p class="mb-4">To ensure that the problem was not hardware-related, I went out and purchased a Lenovo ThinkPad E16 Gen 1. I upgraded the RAM to 48GB and installed a Lenovo 2TB SSD to make it my personal laptop. However, even on this new setup, I faced the same issues accessing SMB shares and some networking services just wouldn't work.</p>
|
||||
|
||||
<p class="mb-4">I tried deleting the <code class="text-accent-purple">gdm</code> login manager in my system configuration file, but after rebooting it was still showing the gnome login window. This was after reading somewhere online that sway was not on friendly terms with the gdm login manager.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Returning to Arch Linux</h2>
|
||||
|
||||
<p class="mb-4">After several days of troubleshooting and not being able to access my SMB shares reliably, I made the difficult decision to revert to Arch Linux. The steps were:</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Reinstalling Arch</strong>: I reinstalled Arch Linux using my tried-and-tested setup process.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Configuring SwayWM</strong>: Set up SwayWM and ensured all my applications were running smoothly.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Accessing SMB Shares</strong>: Accessing SMB shares was seamless, just as it was before my experiment with GNU Guix.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Conclusion</h2>
|
||||
|
||||
<p class="mb-4">I am still running GNU guix on the work laptop, I had to cave on my personal laptop and revert to Arch. My journey with GNU Guix was both enlightening and challenging. While I appreciate the functional package management and the philosophy behind GNU Guix, certain practical issues, like accessing SMB shares, were deal-breakers for my workflow. Arch Linux continues to be my go-to distribution, providing the flexibility and reliability I need for my daily tasks. So, at the moment I am using my personal laptop for work and still trying to figure out the issues I am having on my work laptop. But, to be honest, I prefer working on the thinkpad over working on the MSI laptop that work handed out :).</p>
|
||||
|
||||
<p class="mb-4">If you're an enthusiast looking to explore new package management paradigms, I highly recommend giving GNU Guix a try. Just be prepared for a few hiccups along the way, and always have a backup plan!</p>
|
||||
|
||||
<hr class="my-8 border-palenight-400">
|
||||
|
||||
<p class="mb-4">Feel free to share your thoughts and experiences with GNU Guix or any other distributions you've tried. Let's keep the conversation going!</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Shameless plug</h2>
|
||||
|
||||
<p class="mb-4">Go <a href="https://systemcrafters.net/community/" class="text-accent-blue hover:text-accent-cyan">here</a> to find all the ways you can engage with the SystemCrafters community. It's a great place to hang out and discuss all thing craftery. You will also notice the Craftering ring that I am a part of. Click the links and see blogs by some of the community members. Always interesting to read what other Crafters are up to.</p>
|
||||
|
||||
<p class="mb-4">Thanks for taking the time to read my blog post. It is greatly appreciated, and I hope you come back.</p>
|
||||
|
||||
<p class="mb-4">Happy Hacking!!</p>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,337 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="A journey from Hugo to Haunt, exploring Scheme and GNU Guix">
|
||||
<meta property="og:title" content="Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix">
|
||||
<meta property="og:description" content="My journey into the world of Scheme, GNU Guix, and static site generation">
|
||||
<meta property="og:url" content="https://glenneth.org/content/posts/hugo-to-haunt">
|
||||
<title>Hugo to Haunt Transition - Glenn Thompson</title>
|
||||
<link href="../../dist/styles.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="/" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="/#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="/#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="/#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
<a href="/#contact" class="nav-link text-accent-blue hover:text-accent-cyan">Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="pt-24 pb-16 px-4">
|
||||
<article class="max-w-4xl mx-auto prose prose-palenight">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<a href="/" class="inline-flex items-center text-accent-blue hover:text-accent-cyan transition-colors">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
Back to Home
|
||||
</a>
|
||||
<span class="text-palenight-300 text-sm">~10 min read</span>
|
||||
</div>
|
||||
|
||||
<header class="mb-8">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Tech</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-05-15T10:30:00">May 15, 2024</time>
|
||||
</div>
|
||||
<h1 class="text-4xl font-serif font-bold text-accent-yellow mb-4">
|
||||
Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
|
||||
</h1>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">personal</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">tech</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">scheme</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="content text-palenight-100 space-y-6">
|
||||
<p>Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Discovering Scheme with System Crafters</h2>
|
||||
|
||||
<p>My journey began with a desire to dive deeper into programming languages and their ecosystems. I am a member of the <a href="https://systemcrafters.net/community/" class="text-accent-blue hover:text-accent-cyan">System Crafters Community</a>, and its founder, David Wilson, announced a short four week course as an introduction to Guile Scheme. The course, <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/" class="text-accent-blue hover:text-accent-cyan">Hands-On Guile Scheme for Beginners</a>, provided me with a robust introduction to Guile Scheme, a language that emphasizes simplicity and elegance. David's clear explanations and practical examples made learning Scheme both engaging and approachable.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">The Move to GNU Guix</h2>
|
||||
|
||||
<p>Inspired by the principles of Scheme, I decided to take a leap further into the open-source world by transitioning from Arch Linux to GNU Guix. The Guix community, particularly the folks in the <code class="text-accent-purple">#systemcrafters</code> channel on <code class="text-accent-purple">irc.libera.chat</code>, were incredibly supportive and instrumental in helping me navigate this new environment. Their guidance made the switch smooth and rewarding, reinforcing the power and flexibility of GNU Guix as a functional package manager and operating system. More about that experience in another post.</p>
|
||||
|
||||
<p>There are too many individuals to name here that have helped with the installation and configuration on Gnu guix to mention here. You all have been an incredible help for which I am extremely grateful. Thank you all, for enduring my ignorance, and for your patience and your help.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">From Hugo to Haunt</h2>
|
||||
|
||||
<p>As I settled into Guix, I faced a challenge: Hugo, the static site generator I previously used, was not available as a Guix package. This led me to explore alternatives and eventually discover <a href="https://dthompson.us/projects/haunt.html" class="text-accent-blue hover:text-accent-cyan">Haunt</a>, a Scheme-based static site generator that aligns perfectly with my newfound appreciation for Scheme and Guix.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Overcoming Challenges with Haunt</h2>
|
||||
|
||||
<p>Transitioning to Haunt wasn't without its challenges. There are no readily available templating systems available for haunt like there are for hugo, but there are plenty of examples <a href="https://awesome.haunt.page/" class="text-accent-blue hover:text-accent-cyan">here</a>. One of my own primary difficulties was creating a custom template that matched my site's aesthetic requirements and functionality needs. Initially, I struggled with configuring the theme layout and ensuring the CSS was applied correctly. Another hurdle was generating the correct URLs for posts and ensuring that summaries appeared as intended on the front page.</p>
|
||||
|
||||
<p>Thankfully, the Haunt manual proved to be an invaluable resource throughout this process. The comprehensive documentation provided clear guidance on using various modules, functions, and procedures. By carefully studying the examples and explanations, I was able to overcome the obstacles and achieve the desired results for my site. The manual's detailed descriptions of Haunt's inner workings were particularly helpful in understanding how to leverage the flexibility of Scheme to customize my blog.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Crafting My Own Template</h2>
|
||||
|
||||
<p>Moving from Hugo to Haunt required me to create my own template and customize my site's appearance. This was an exciting opportunity to apply the skills I had learned from David's course and experiment with Scheme in a practical context.</p>
|
||||
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mt-6 mb-3">Creating the Template</h3>
|
||||
|
||||
<p>Haunt's flexibility allowed me to define my own theme layout and structure. Here's a snippet of my <code class="text-accent-purple">haunt.scm</code> file, where I defined the theme layout and added custom footer content:</p>
|
||||
|
||||
<pre class="bg-base-darker p-4 rounded-lg overflow-x-auto"><code class="text-palenight-100 font-mono text-sm">(use-modules (haunt asset)
|
||||
(haunt builder blog)
|
||||
(haunt builder atom)
|
||||
(haunt builder assets)
|
||||
(haunt reader commonmark)
|
||||
(haunt site)
|
||||
(haunt post)
|
||||
(sxml simple) ; For HTML generation
|
||||
(srfi srfi-1)
|
||||
(srfi srfi-19)) ; For date and time procedures
|
||||
|
||||
;; Load custom templates
|
||||
(load "templates/post.scm")
|
||||
|
||||
(define (format-date date)
|
||||
(date->string date "~Y-~m-~d"))
|
||||
|
||||
;; Define a function to generate the URL for a post
|
||||
(define (post-url post)
|
||||
(string-append "/" (post-slug post) ".html"))
|
||||
|
||||
;; Define a function to extract a summary from the post content
|
||||
(define (post-summary post)
|
||||
(let ((content (post-sxml post)))
|
||||
(if (null? content)
|
||||
""
|
||||
(let ((first-paragraph (car content)))
|
||||
(if (string? first-paragraph)
|
||||
(substring first-paragraph 0 (min 200 (string-length first-paragraph)))
|
||||
(sxml->string first-paragraph))))))
|
||||
|
||||
;; Define the theme layout
|
||||
(define (theme-layout site title content)
|
||||
(let ((current-year (number->string (date-year (current-date)))))
|
||||
`(html
|
||||
(head
|
||||
(meta (@ (charset "utf-8")))
|
||||
(meta (@ (name "viewport") (content "width=device-width, initial-scale=1.0, shrink-to-fit=no")))
|
||||
(link (@ (rel "stylesheet") (href "/assets/palenight.css")))
|
||||
(style
|
||||
" .craftering {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
}
|
||||
.webring-text {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
}
|
||||
.craftering a {
|
||||
color: #dddddd;
|
||||
}
|
||||
.webring-text a {
|
||||
color: #dddddd;
|
||||
}")
|
||||
(title ,title))
|
||||
(body
|
||||
(header (h1 ,(site-title site)))
|
||||
(main ,content)
|
||||
(footer (@ (class "bg-black bottom-0 w-100 pa3") (role "contentinfo"))
|
||||
(div (@ (class "flex justify-between"))
|
||||
(div (@ (class "webring-text"))
|
||||
(p "I am part of the " (a (@ (href "https://systemcrafters.net") (target "_blank")) "System Crafters") " webring:"))
|
||||
(div (@ (class "craftering"))
|
||||
(a (@ (href "https://craftering.systemcrafters.net/@glenneth/previous")) "←")
|
||||
(a (@ (href "https://craftering.systemcrafters.net/")) "craftering")
|
||||
(a (@ (href "https://craftering.systemcrafters.net/@glenneth/next")) "→"))))))))
|
||||
|
||||
;; Define the custom theme with a consistent layout for index
|
||||
(define my-theme
|
||||
(theme #:name "My Custom Theme"
|
||||
#:layout theme-layout
|
||||
#:post-template post-template
|
||||
#:collection-template
|
||||
(lambda (site title posts prefix)
|
||||
`(div (@ (class "content"))
|
||||
(h2 ,title)
|
||||
(ul
|
||||
,@(map (lambda (post)
|
||||
`(li
|
||||
(article
|
||||
(header
|
||||
(h3 (a (@ (href ,(post-url post))) ,(post-title post))))
|
||||
(p ,(format-date (post-date post)))
|
||||
(p ,(post-summary post))
|
||||
(p (a (@ (href ,(post-url post))) "Read more...")))))
|
||||
posts))))))
|
||||
|
||||
;; Site configuration
|
||||
(site #:title "Just Another Personal Blog"
|
||||
#:domain "glenneth.srht.site"
|
||||
#:default-metadata
|
||||
'((author . "Glenn Thompson")
|
||||
(email . "glenn@kirstol.org"))
|
||||
#:readers (list commonmark-reader)
|
||||
#:builders (list
|
||||
(blog #:theme my-theme)
|
||||
(atom-feed)
|
||||
(atom-feeds-by-tag)
|
||||
(static-directory "images")
|
||||
(static-directory "assets")))</code></pre>
|
||||
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mt-6 mb-3">Customizing the CSS</h3>
|
||||
|
||||
<p>To give my site a personalized touch, I crafted a CSS stylesheet that matched my aesthetic preferences. Here's an excerpt from my <code class="text-accent-purple">palenight.css</code> file:</p>
|
||||
|
||||
<pre class="bg-base-darker p-4 rounded-lg overflow-x-auto"><code class="text-palenight-100 font-mono text-sm">body {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.content, header, footer, main {
|
||||
max-width: 90%;
|
||||
padding: 0 5%;
|
||||
}
|
||||
|
||||
header {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
footer {
|
||||
text-align: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #292d3e;
|
||||
color: #d0d0d0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #82aaff;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #c792ea;
|
||||
}
|
||||
|
||||
.content {
|
||||
background-color: #1e1e2e;
|
||||
padding: 20px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
article {
|
||||
background-color: #282a36;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
article header {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.date {
|
||||
color: #6272a4;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/* Additional styles for the craftering */
|
||||
.craftering {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.webring-text {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.craftering a {
|
||||
color: #dddddd;
|
||||
}
|
||||
|
||||
.webring-text a {
|
||||
color: #dddddd;
|
||||
}
|
||||
|
||||
/* Additions for mobile device readability */
|
||||
meta {
|
||||
name: viewport;
|
||||
content: width=device-width, initial-scale=1, shrink-to-fit=no;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
/* Customize styles for smaller screens */
|
||||
.logo {
|
||||
max-width: 200px;
|
||||
}
|
||||
}</code></pre>
|
||||
|
||||
<p>I use the <code class="text-accent-purple">doom-palenight</code> theme in Emacs, my preferred text editor, and I wanted my site to match that aesthetic.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Conclusion</h2>
|
||||
|
||||
<p>Transitioning from Hugo to Haunt, learning Scheme, and embracing GNU Guix has been an enriching experience. It's not just about using new tools; it's about joining a community that values simplicity, transparency, and collaboration. If you're curious about Scheme or GNU Guix, I highly recommend checking out David Wilson's course on System Crafters and joining the discussions on IRC.</p>
|
||||
|
||||
<p>I am not a developer of any kind, and learning Scheme has opened my eyes as to how I can craft an environment that I want to work in, and not endure a working environment that the computer is forcing upon me.</p>
|
||||
|
||||
<p>Thank you for reading, and stay tuned for more updates on my journey!</p>
|
||||
</div>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,163 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="A journey into Scheme programming and building a symlink manager">
|
||||
<meta property="og:title" content="A Journey into Scheme: Building a Simple Symlink Manager with Guile Scheme">
|
||||
<meta property="og:description" content="Learning Guile Scheme and building a practical tool for managing symlinks">
|
||||
<meta property="og:url" content="https://glenneth.org/content/posts/scheme-journey">
|
||||
<title>Journey into Scheme - Glenn Thompson</title>
|
||||
<link href="../../dist/styles.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="/" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="/#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="/#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="/#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="pt-24 pb-16 px-4">
|
||||
<div class="max-w-4xl mx-auto">
|
||||
<div class="content text-palenight-100 space-y-6">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<a href="/" class="inline-flex items-center text-accent-blue hover:text-accent-cyan transition-colors">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-2" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
Back to Home
|
||||
</a>
|
||||
<time datetime="2024-09-24T09:30:00" class="text-palenight-300">September 24, 2024</time>
|
||||
</div>
|
||||
|
||||
<header class="mb-8">
|
||||
<h1 class="text-4xl font-serif font-bold text-accent-yellow">A Journey into Scheme: Building a Simple Symlink Manager with Guile Scheme</h1>
|
||||
<div class="flex items-center gap-4 text-palenight-300 mt-4">
|
||||
<time datetime="2024-09-24T09:30:00">September 24, 2024</time>
|
||||
<span>•</span>
|
||||
<span>By Glenn Thompson</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section class="prose prose-palenight max-w-none">
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Introduction</h2>
|
||||
<p class="mb-4">I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—specifically Guile Scheme. I'm writing this post to share how I built <code class="text-accent-purple">stash</code>, a utility that mimics GNU Stow's functionality, and how my learning journey was shaped by David Wilson's "Hands-On Guile Scheme for Beginners" course from System Crafters, more about this below.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">How I Started with Scheme</h2>
|
||||
<p class="mb-4">My programming background was <em>VERY</em> limited, I produce documents in (La)Tex but I decided to take the plunge into learning Scheme, thanks to a course led by David Wilson from System Crafters. The course, <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/" class="text-accent-blue hover:text-accent-cyan">"Hands-On Guile Scheme for Beginners"</a>, was incredibly helpful in making Scheme accessible even for someone like me, without a traditional programming background. I know (La)Tex isn't a programming language, it's typesetting. But how hard can it be? Right?</p>
|
||||
|
||||
<p class="mb-4">The course took me through the basics of Scheme, from simple expressions to more complex concepts like functions, recursion, and working with files. This structured learning environment gave me the confidence to start building <code class="text-accent-purple">stash</code>.</p>
|
||||
|
||||
<p class="mb-4">The course was "instructor-led" with live meet-up sessions weekly. David has since made this course on-demand, and will be, if not already, available at the above link. Highly recommended if you are interested in taking your first steps with scheme.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Why Build Stash?</h2>
|
||||
<p class="mb-4">After completing David Wilson's course, I wanted to put my newly found Guile Scheme skills into practice with a real project. It wasn't enough just to understand the language conceptually—I needed to build something tangible that solved a problem I encountered regularly in my workflow. Writing <code class="text-accent-purple">stash</code> gave me that opportunity. It allowed me to apply what I'd learned while also deepening my understanding of file manipulation, command-line tools, and conflict resolution—all within the Guile Scheme environment.</p>
|
||||
|
||||
<p class="mb-4">After migrating to GNU/Linux and speaking with other <a href="https://systemcrafters.net/community" class="text-accent-blue hover:text-accent-cyan">System Crafters Community</a> members, I found I needed a way to manage symbolic links and organize directories. Existing tools like GNU Stow helped, but I wanted to learn how such tools are built. I decided to write my own version using Guile Scheme to enhance my understanding of the language and to have more control over the functionality.</p>
|
||||
|
||||
<p class="mb-4">The goal of <code class="text-accent-purple">stash</code> is simple: allow users to move directories and create symlinks with conflict resolution, offering options to overwrite, back up, skip, or cancel the operation.</p>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Breaking Down Stash</h2>
|
||||
<p class="mb-4">The core of <code class="text-accent-purple">stash</code> revolves around:</p>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">Moving Directories</strong>: Using Scheme's file manipulation functions, I learned how to move directories and files around.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Creating Symlinks</strong>: I implemented functions to create symlinks to the moved directories, ensuring that the original structure remains accessible.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Conflict Resolution</strong>: One of the key features I wanted was handling conflicts when a file or symlink already exists at the target location. This required prompting the user for input and responding accordingly (backup, overwrite, skip, or cancel).</li>
|
||||
</ol>
|
||||
|
||||
<p class="mb-4">Here's an excerpt of the core functionality that handles moving a source directory and creating a symlink:</p>
|
||||
|
||||
<pre class="bg-base-darker p-4 rounded-lg overflow-x-auto mb-4"><code class="text-palenight-100 font-mono text-sm">;;; Helper function to move source to target
|
||||
(define (move-source-to-target source-dir target-dir)
|
||||
"Move the entire source directory to the target directory."
|
||||
(let* ((source-dir (expand-home source-dir))
|
||||
(target-dir (expand-home target-dir))
|
||||
(source-name (basename source-dir))
|
||||
(target-source-dir (string-append target-dir "/" source-name)))
|
||||
(if (file-exists? target-source-dir)
|
||||
;; Conflict handling here...
|
||||
...)
|
||||
(rename-file source-dir target-source-dir)
|
||||
(display (format #f "Moved ~a to ~a\n" source-dir target-source-dir))))</code></pre>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">What I Learned</h2>
|
||||
<p class="mb-4">This project taught me a lot about not just Scheme, but programming in general:</p>
|
||||
|
||||
<ul class="list-disc pl-6 mb-6">
|
||||
<li class="mb-2"><strong class="text-accent-purple">File and Directory Manipulation</strong>: Scheme's file handling functions were different from what I had experienced before, but they allowed for powerful manipulation of file systems.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Command-Line Utilities</strong>: Scheme isn't just a language for academic exercises; you can write real, useful command-line tools with it.</li>
|
||||
<li class="mb-2"><strong class="text-accent-purple">Problem Solving</strong>: From parsing command-line arguments to resolving conflicts with existing files, every part of the program required careful thought and consideration of edge cases.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Guile Scheme Support Resources</h2>
|
||||
|
||||
<ol class="list-decimal pl-6 mb-6">
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://www.gnu.org/software/guile/docs/" class="text-accent-blue hover:text-accent-cyan">Guile Scheme Documentation</a></strong><br>
|
||||
The official documentation for Guile Scheme, which includes tutorials, references, and the Guile Manual.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://www.gnu.org/software/guile/manual/html_node/" class="text-accent-blue hover:text-accent-cyan">Guile Reference Manual</a></strong><br>
|
||||
A comprehensive manual covering core language concepts, libraries, and functions available in Guile Scheme.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="http://community.schemewiki.org/" class="text-accent-blue hover:text-accent-cyan">Scheme Wiki</a></strong><br>
|
||||
A community-maintained wiki that covers various Scheme dialects, including Guile Scheme, with tutorials, guides, and general information on Scheme programming.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="http://schemers.org/" class="text-accent-blue hover:text-accent-cyan">Guile at Schemers.org</a></strong><br>
|
||||
A site dedicated to Scheme with resources, libraries, tools, and documentation for Scheme and its implementations, including Guile.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://systemcrafters.net/" class="text-accent-blue hover:text-accent-cyan">System Crafters</a></strong><br>
|
||||
Led by David Wilson, System Crafters provides tutorials and blog posts on Guile Scheme and other GNU tools.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://lists.gnu.org/mailman/listinfo/guile-user" class="text-accent-blue hover:text-accent-cyan">Guile Users Mailing List</a></strong><br>
|
||||
Join the Guile mailing list to ask questions and engage with the Guile Scheme community.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://github.com/artyom-poptsov/guile-cookbook" class="text-accent-blue hover:text-accent-cyan">Guile Cookbook</a></strong><br>
|
||||
An unofficial GitHub repository with practical code snippets and tips for Guile Scheme, covering various common use cases and tasks.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://libera.chat/" class="text-accent-blue hover:text-accent-cyan">#guile and #scheme on Libera Chat IRC</a></strong><br>
|
||||
A helpful IRC channel where you can connect with other Guile users for real-time support and advice.</li>
|
||||
|
||||
<li class="mb-4"><strong class="text-accent-purple"><a href="https://libera.chat/" class="text-accent-blue hover:text-accent-cyan">#systemcrafters on Libera Chat IRC</a></strong><br>
|
||||
A <em>SUPER</em> helpful IRC channel not only for guile and scheme, there are a huge variety of different people here. Tell them glenneth sent you.</li>
|
||||
</ol>
|
||||
|
||||
<h2 class="text-2xl font-serif font-bold text-accent-yellow mt-8 mb-4">Next Steps</h2>
|
||||
<p class="mb-4">I am still refining <code class="text-accent-purple">stash</code>, especially around its conflict resolution system and the way it handles symbolic links. But it's in a usable state, and I'm excited to continue iterating on it. You can check out the code <a href="https://codeberg.org/glenneth/stash" class="text-accent-blue hover:text-accent-cyan">on Codeberg</a>.</p>
|
||||
|
||||
<p class="mb-4">If you're curious about Scheme and how it can be used practically, I highly recommend checking out David Wilson's course. It's been instrumental in helping me grasp the concepts I needed to build this tool. Here's the link, again :) <a href="https://systemcrafters.net/courses/hands-on-guile-scheme-beginners/" class="text-accent-blue hover:text-accent-cyan">"Hands-On Guile Scheme for Beginners"</a></p>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>[Your Title] - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<!-- Your content goes here -->
|
||||
<h1>[Your Title]</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>[Category]</span>
|
||||
<span>•</span>
|
||||
<time datetime="[YYYY-MM-DD]">[Month DD, YYYY]</time>
|
||||
</div>
|
||||
|
||||
<!-- Article content here -->
|
||||
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,25 @@
|
|||
// Handle mobile menu toggle
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
// Smooth scroll for navigation links
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
const target = document.querySelector(this.getAttribute('href'));
|
||||
if (target) {
|
||||
target.scrollIntoView({
|
||||
behavior: 'smooth'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Add scroll event listener for navbar
|
||||
const navbar = document.querySelector('nav');
|
||||
window.addEventListener('scroll', () => {
|
||||
if (window.scrollY > 0) {
|
||||
navbar.classList.add('shadow-md');
|
||||
} else {
|
||||
navbar.classList.remove('shadow-md');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
const { marked } = require('marked');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// Configure marked options
|
||||
const options = {
|
||||
headerIds: true,
|
||||
gfm: true
|
||||
};
|
||||
|
||||
// Footer template
|
||||
const footer = `
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>`;
|
||||
|
||||
function convertMarkdownToHtml(mdFilePath) {
|
||||
// Read markdown file
|
||||
const markdown = fs.readFileSync(mdFilePath, 'utf-8');
|
||||
|
||||
// Extract metadata from markdown (assuming front matter)
|
||||
const metadata = {};
|
||||
const content = markdown.replace(/^---\n([\s\S]*?)\n---\n/, (_, frontMatter) => {
|
||||
frontMatter.split('\n').forEach(line => {
|
||||
const [key, value] = line.split(': ');
|
||||
if (key && value) {
|
||||
metadata[key.trim()] = value.trim();
|
||||
}
|
||||
});
|
||||
return '';
|
||||
});
|
||||
|
||||
// Convert markdown to HTML
|
||||
const articleContent = marked.parse(content, options);
|
||||
|
||||
// Create full HTML document
|
||||
const html = `<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>${metadata.title || 'Blog Post'} - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>${metadata.title || 'Blog Post'}</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>${metadata.category || 'Blog'}</span>
|
||||
<span>•</span>
|
||||
<time datetime="${metadata.date || ''}">${metadata.date || ''}</time>
|
||||
</div>
|
||||
${articleContent}
|
||||
</article>
|
||||
</div>
|
||||
</main>${footer}`;
|
||||
|
||||
// Write HTML file
|
||||
const htmlFilePath = mdFilePath.replace(/\.md$/, '.html');
|
||||
fs.writeFileSync(htmlFilePath, html);
|
||||
console.log(`Converted ${path.basename(mdFilePath)} to HTML`);
|
||||
}
|
||||
|
||||
// If running from command line
|
||||
if (require.main === module) {
|
||||
const mdFilePath = process.argv[2];
|
||||
if (!mdFilePath) {
|
||||
console.error('Please provide a markdown file path');
|
||||
process.exit(1);
|
||||
}
|
||||
convertMarkdownToHtml(mdFilePath);
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,324 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description"
|
||||
content="Glenn Thompson's personal blog about technology, engineering, and travel experiences in the Middle East">
|
||||
<meta property="og:title" content="Glenn Thompson - Technology, Engineering & Travel">
|
||||
<meta property="og:description"
|
||||
content="Exploring the intersection of electrical engineering, technology, and cultural experiences from two decades in the Middle East">
|
||||
<meta property="og:url" content="https://glenneth.org">
|
||||
<title>Glenn Thompson - Technology, Engineering & Travel</title>
|
||||
<link href="./dist/styles.css" rel="stylesheet">
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap"
|
||||
rel="stylesheet">
|
||||
<script defer src="./src/js/main.js"></script>
|
||||
</head>
|
||||
|
||||
<body class="bg-base-bg text-palenight-50">
|
||||
<nav class="fixed w-full bg-base-darker/80 backdrop-blur-sm shadow-sm z-50 border-b border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex">
|
||||
<a href="#" class="flex items-center font-serif text-xl font-bold text-accent-purple">Glenn
|
||||
Thompson</a>
|
||||
</div>
|
||||
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
||||
<a href="#about" class="nav-link text-accent-blue hover:text-accent-cyan">About</a>
|
||||
<a href="#blog" class="nav-link text-accent-blue hover:text-accent-cyan">Blog</a>
|
||||
<a href="#projects" class="nav-link text-accent-blue hover:text-accent-cyan">Projects</a>
|
||||
<a href="#contact" class="nav-link text-accent-blue hover:text-accent-cyan">Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main>
|
||||
<!-- Hero Section -->
|
||||
<section class="pt-24 pb-16 px-4 sm:pt-32 sm:pb-24 bg-base-bg">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="text-center">
|
||||
<h1 class="text-4xl font-serif font-bold tracking-tight text-accent-yellow sm:text-6xl">
|
||||
Technology, Engineering & Travel
|
||||
</h1>
|
||||
<p class="mt-6 text-lg leading-8 text-palenight-100 max-w-2xl mx-auto">
|
||||
Exploring the intersection of electrical engineering, technology, and cultural experiences from
|
||||
two decades in the Middle East.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Featured Posts -->
|
||||
<section id="blog" class="py-16">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<h2 class="text-3xl font-serif font-bold text-accent-yellow mb-8">Blog Posts</h2>
|
||||
<div class="grid gap-8 md:grid-cols-2">
|
||||
<!-- Scheme Journey Post -->
|
||||
<article
|
||||
class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Tech</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-09-24T09:30:00">September 24, 2024</time>
|
||||
</div>
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
|
||||
<a href="/content/posts/scheme-journey.html"
|
||||
class="hover:text-accent-cyan transition-colors">
|
||||
A Journey into Scheme: Building a Simple Symlink Manager
|
||||
</a>
|
||||
</h3>
|
||||
<p class="text-palenight-100 mb-4">Learning Guile Scheme and building a practical tool for
|
||||
managing symlinks...</p>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">scheme</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">guile</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">gnu</span>
|
||||
</div>
|
||||
</article>
|
||||
<!-- GNU Guix Journey Post -->
|
||||
<article
|
||||
class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Tech</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-07-26T10:30:00">July 26, 2024</time>
|
||||
</div>
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
|
||||
<a href="/content/posts/gnu-guix-journey.html"
|
||||
class="hover:text-accent-cyan transition-colors">
|
||||
A Journey Through GNU Guix: From Installation to Returning to Arch Linux
|
||||
</a>
|
||||
</h3>
|
||||
<p class="text-palenight-100 mb-4">An exploration into GNU Guix, its challenges, and the
|
||||
eventual return to Arch Linux...</p>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">tech</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">gnu</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">linux</span>
|
||||
</div>
|
||||
</article>
|
||||
<!-- Hugo to Haunt Post -->
|
||||
<article
|
||||
class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Tech</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-05-15T10:30:00">May 15, 2024</time>
|
||||
</div>
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
|
||||
<a href="/content/posts/hugo-to-haunt.html"
|
||||
class="hover:text-accent-cyan transition-colors">
|
||||
Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
|
||||
</a>
|
||||
</h3>
|
||||
<p class="text-palenight-100 mb-4">A journey into the world of Scheme, GNU Guix, and static site
|
||||
generation...</p>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">personal</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">tech</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">scheme</span>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Amman to Newcastle Journey -->
|
||||
<article
|
||||
class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Personal</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-05-01T17:40:58+03:00">May 1, 2024</time>
|
||||
</div>
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
|
||||
<a href="/content/posts/amman-newcastle-journey.html"
|
||||
class="hover:text-accent-cyan transition-colors">
|
||||
A Rollercoaster Week: From Amman to Newcastle, and back again
|
||||
</a>
|
||||
</h3>
|
||||
<p class="text-palenight-100 mb-4">A journey filled with conference presentations, international
|
||||
travel, and unexpected challenges...</p>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">work</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">travel</span>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Glove80 Review -->
|
||||
<article
|
||||
class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-2">
|
||||
<span>Tech</span>
|
||||
<span>•</span>
|
||||
<time datetime="2024-04-08">April 8, 2024</time>
|
||||
</div>
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
|
||||
<a href="/content/posts/glove80-review.html"
|
||||
class="hover:text-accent-cyan transition-colors">
|
||||
Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard
|
||||
</a>
|
||||
</h3>
|
||||
<p class="text-palenight-100 mb-4">An in-depth review exploring the unique design, features, and
|
||||
impact on typing comfort of the Glove80 ergonomic keyboard...</p>
|
||||
<div class="flex gap-2">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">keyboards</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-bg text-xs">tech</span>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Projects Section -->
|
||||
<section id="projects" class="py-16 bg-base-darker">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<h2 class="text-3xl font-serif font-bold text-accent-yellow mb-8">Projects</h2>
|
||||
<div class="grid gap-8 md:grid-cols-2 lg:grid-cols-3">
|
||||
<!-- Personal Website Project -->
|
||||
<article
|
||||
class="bg-base-bg p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">Personal Website</h3>
|
||||
<p class="text-palenight-100 mb-4">A modern, responsive personal website built with HTML,
|
||||
TailwindCSS, and JavaScript. Features a dark theme and blog functionality.</p>
|
||||
<div class="flex gap-2 mb-4">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">HTML</span>
|
||||
<span
|
||||
class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">TailwindCSS</span>
|
||||
<span
|
||||
class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">JavaScript</span>
|
||||
</div>
|
||||
<a href="https://github.com/glenneth1/personal-website"
|
||||
class="text-accent-cyan hover:text-accent-purple transition-colors">View Source →</a>
|
||||
</article>
|
||||
|
||||
<!-- Symlink Manager Project -->
|
||||
<article
|
||||
class="bg-base-bg p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
|
||||
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">Scheme Symlink Manager</h3>
|
||||
<p class="text-palenight-100 mb-4">A command-line tool built with Guile Scheme for managing
|
||||
symbolic links in Unix-like systems. Simplifies dotfile management.</p>
|
||||
<div class="flex gap-2 mb-4">
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">Scheme</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">Guile</span>
|
||||
<span class="text-palenight-300 px-2 py-1 rounded-full bg-base-darker text-xs">CLI</span>
|
||||
</div>
|
||||
<a href="#" class="text-accent-cyan hover:text-accent-purple transition-colors">Coming Soon
|
||||
→</a>
|
||||
</article>
|
||||
|
||||
<!-- Add Project Card -->
|
||||
<article
|
||||
class="bg-base-bg p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors flex items-center justify-center">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-100 mb-2">More projects coming soon!</p>
|
||||
<p class="text-accent-cyan">Stay tuned...</p>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- About Section -->
|
||||
<section id="about" class="py-16 bg-base-bg">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
|
||||
<div>
|
||||
<h2 class="text-3xl font-serif font-bold text-accent-purple mb-6">About Me</h2>
|
||||
<p class="text-palenight-100 mb-4">
|
||||
With over 20 years in the electrical engineering field, I've had the privilege of working on
|
||||
groundbreaking projects across the Middle East. My journey has been marked by continuous
|
||||
learning, cultural exploration, and technological innovation.
|
||||
</p>
|
||||
<p class="text-palenight-100 mb-4">
|
||||
Beyond my professional work, I'm passionate about technology, particularly static site
|
||||
generation, Scheme programming, and tools like GNU Guix and Haunt. This blog is where I
|
||||
share my experiences, insights, and the lessons learned along the way.
|
||||
</p>
|
||||
</div>
|
||||
<div class="bg-base-darker p-8 rounded-lg shadow-md border border-palenight-400/20">
|
||||
<h3 class="text-xl font-bold text-accent-yellow mb-4">Areas of Focus</h3>
|
||||
<ul class="space-y-3">
|
||||
<li class="flex items-center text-palenight-100">
|
||||
<svg class="w-5 h-5 text-accent-blue mr-2" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd"
|
||||
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
Electrical Engineering
|
||||
</li>
|
||||
<li class="flex items-center text-palenight-100">
|
||||
<svg class="w-5 h-5 text-accent-blue mr-2" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd"
|
||||
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
Static Site Generation
|
||||
</li>
|
||||
<li class="flex items-center text-palenight-100">
|
||||
<svg class="w-5 h-5 text-accent-blue mr-2" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd"
|
||||
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
Scheme Programming
|
||||
</li>
|
||||
<li class="flex items-center text-palenight-100">
|
||||
<svg class="w-5 h-5 text-accent-blue mr-2" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd"
|
||||
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
Middle Eastern Culture
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Contact Section -->
|
||||
<section id="contact" class="py-16 bg-base-darker">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<h2 class="text-3xl font-serif font-bold text-accent-purple mb-6">Get in Touch</h2>
|
||||
<p class="text-palenight-100 mb-8">
|
||||
Interested in connecting? Feel free to reach out for discussions about technology, engineering,
|
||||
or sharing travel stories.
|
||||
</p>
|
||||
<a href="mailto:glenn@glenneth.org"
|
||||
class="inline-flex items-center px-6 py-3 border border-accent-blue text-base font-medium rounded-md text-accent-blue hover:bg-accent-blue hover:text-base-bg transition-colors">
|
||||
Send a Message
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank"
|
||||
class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous"
|
||||
class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org"
|
||||
class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org"
|
||||
class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"name": "glenneth-org",
|
||||
"version": "1.0.0",
|
||||
"description": "Personal website and blog of Glenn Thompson - https://glenneth.org",
|
||||
"scripts": {
|
||||
"dev": "concurrently \"npm run watch:css\" \"npm run serve\"",
|
||||
"build": "tailwindcss -i ./src/input.css -o ./dist/styles.css --minify",
|
||||
"watch:css": "tailwindcss -i ./src/input.css -o ./dist/styles.css --watch",
|
||||
"serve": "live-server --port=3000 --no-browser",
|
||||
"convert": "node src/js/md-to-html.js"
|
||||
},
|
||||
"keywords": [
|
||||
"blog",
|
||||
"personal-website",
|
||||
"engineering",
|
||||
"technology",
|
||||
"glenneth.org"
|
||||
],
|
||||
"author": "Glenn Thompson <glenn@glenneth.org>",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^10.4.14",
|
||||
"concurrently": "^8.0.1",
|
||||
"live-server": "^1.2.2",
|
||||
"marked": "^11.1.0",
|
||||
"postcss": "^8.4.21",
|
||||
"tailwindcss": "^3.3.0"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
html {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply antialiased text-palenight-50;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
@apply font-serif;
|
||||
}
|
||||
}
|
||||
|
||||
@layer components {
|
||||
.nav-link {
|
||||
@apply inline-flex items-center px-1 pt-1 text-sm font-medium text-accent-blue hover:text-accent-cyan transition-colors;
|
||||
}
|
||||
|
||||
.blog-card {
|
||||
@apply bg-base-bg rounded-lg shadow-md overflow-hidden hover:shadow-lg transition-shadow duration-300 border border-palenight-400/20;
|
||||
}
|
||||
|
||||
.button-primary {
|
||||
@apply inline-flex items-center px-6 py-3 border border-accent-blue text-base font-medium rounded-md text-accent-blue hover:bg-accent-blue hover:text-base-bg transition-colors;
|
||||
}
|
||||
}
|
||||
|
||||
.prose {
|
||||
@apply max-w-none;
|
||||
}
|
||||
|
||||
.prose img {
|
||||
@apply rounded-lg shadow-md;
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
// Handle mobile menu toggle
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
// Smooth scroll for navigation links
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
const target = document.querySelector(this.getAttribute('href'));
|
||||
if (target) {
|
||||
target.scrollIntoView({
|
||||
behavior: 'smooth'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Add scroll event listener for navbar
|
||||
const navbar = document.querySelector('nav');
|
||||
window.addEventListener('scroll', () => {
|
||||
if (window.scrollY > 0) {
|
||||
navbar.classList.add('shadow-md');
|
||||
} else {
|
||||
navbar.classList.remove('shadow-md');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
const { marked } = require('marked');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// Configure marked options
|
||||
const options = {
|
||||
headerIds: true,
|
||||
gfm: true
|
||||
};
|
||||
|
||||
// Footer template
|
||||
const footer = `
|
||||
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="text-center">
|
||||
<p class="text-palenight-300">© 2024 Glenn Thompson. All rights reserved.</p>
|
||||
<div class="webring-text mt-6">
|
||||
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
|
||||
</div>
|
||||
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">←</a>
|
||||
<a href="https://craftering.systemcrafters.net/" class="hover:text-accent-cyan">craftering</a>
|
||||
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">→</a>
|
||||
</div>
|
||||
<p class="text-palenight-300 mt-2">
|
||||
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
|
||||
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>`;
|
||||
|
||||
function convertMarkdownToHtml(mdFilePath) {
|
||||
// Read markdown file
|
||||
const markdown = fs.readFileSync(mdFilePath, 'utf-8');
|
||||
|
||||
// Extract metadata from markdown (assuming front matter)
|
||||
const metadata = {};
|
||||
const content = markdown.replace(/^---\n([\s\S]*?)\n---\n/, (_, frontMatter) => {
|
||||
frontMatter.split('\n').forEach(line => {
|
||||
const [key, value] = line.split(': ');
|
||||
if (key && value) {
|
||||
metadata[key.trim()] = value.trim();
|
||||
}
|
||||
});
|
||||
return '';
|
||||
});
|
||||
|
||||
// Convert markdown to HTML
|
||||
const articleContent = marked.parse(content, options);
|
||||
|
||||
// Create full HTML document
|
||||
const html = `<!DOCTYPE html>
|
||||
<html lang="en" class="bg-base-bg">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>${metadata.title || 'Blog Post'} - Glenn Thompson</title>
|
||||
<link href="/dist/styles.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&family=Merriweather:wght@400;700&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body class="bg-base-bg text-palenight-200 font-sans">
|
||||
<header class="bg-base-darker border-b border-palenight-400/20">
|
||||
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-serif font-bold text-accent-yellow hover:text-accent-cyan transition-colors">Glenn Thompson</a>
|
||||
<div class="flex space-x-6">
|
||||
<a href="/" class="text-palenight-200 hover:text-accent-cyan transition-colors">Home</a>
|
||||
<a href="/#blog" class="text-palenight-200 hover:text-accent-cyan transition-colors">Blog</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="py-12">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<article class="prose prose-invert prose-palenight max-w-none">
|
||||
<h1>${metadata.title || 'Blog Post'}</h1>
|
||||
<div class="flex items-center gap-2 text-accent-cyan text-sm mb-8">
|
||||
<span>${metadata.category || 'Blog'}</span>
|
||||
<span>•</span>
|
||||
<time datetime="${metadata.date || ''}">${metadata.date || ''}</time>
|
||||
</div>
|
||||
${articleContent}
|
||||
</article>
|
||||
</div>
|
||||
</main>${footer}`;
|
||||
|
||||
// Write HTML file
|
||||
const htmlFilePath = mdFilePath.replace(/\.md$/, '.html');
|
||||
fs.writeFileSync(htmlFilePath, html);
|
||||
console.log(`Converted ${path.basename(mdFilePath)} to HTML`);
|
||||
}
|
||||
|
||||
// If running from command line
|
||||
if (require.main === module) {
|
||||
const mdFilePath = process.argv[2];
|
||||
if (!mdFilePath) {
|
||||
console.error('Please provide a markdown file path');
|
||||
process.exit(1);
|
||||
}
|
||||
convertMarkdownToHtml(mdFilePath);
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: [
|
||||
"./index.html",
|
||||
"./src/**/*.{html,js}"
|
||||
],
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
base: {
|
||||
bg: '#292D3E', // Main background
|
||||
darker: '#242837', // Darker background for contrast
|
||||
lighter: '#32374D', // Lighter background for hover states
|
||||
},
|
||||
palenight: {
|
||||
50: '#C8D3F5', // Lightest text
|
||||
100: '#A9B8E8', // Light text
|
||||
200: '#828BB8', // Muted text
|
||||
300: '#676E95', // Comments/muted
|
||||
400: '#444B6A', // Darker muted
|
||||
500: '#32374D', // Background highlight
|
||||
600: '#292D3E', // Main background
|
||||
700: '#242837', // Darker background
|
||||
800: '#1B1E2B', // Darkest background
|
||||
900: '#14161F', // Black background
|
||||
},
|
||||
accent: {
|
||||
purple: '#C792EA', // Purple accent
|
||||
blue: '#82AAFF', // Blue accent
|
||||
green: '#C3E88D', // Green accent
|
||||
yellow: '#FFCB6B', // Yellow accent
|
||||
orange: '#F78C6C', // Orange accent
|
||||
red: '#FF5370', // Red accent
|
||||
cyan: '#89DDFF', // Cyan accent
|
||||
}
|
||||
},
|
||||
fontFamily: {
|
||||
sans: ['Inter', 'system-ui', 'sans-serif'],
|
||||
serif: ['Merriweather', 'serif'],
|
||||
mono: ['JetBrains Mono', 'monospace'],
|
||||
},
|
||||
typography: {
|
||||
DEFAULT: {
|
||||
css: {
|
||||
maxWidth: 'none',
|
||||
color: '#C8D3F5',
|
||||
a: {
|
||||
color: '#82AAFF',
|
||||
'&:hover': {
|
||||
color: '#89DDFF',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [],
|
||||
}
|
||||
Binary file not shown.
Loading…
Reference in New Issue