<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Stephen's Website</title>
    <link href="https://sglmr.com/subscribe/blog/atom.xml" rel="self" />
    <link href="https://sglmr.com/" />
    <updated>2026-05-08T00:00:00+00:00</updated>
    <author>
        <name>Stephen</name>
    </author>
    <id>https://sglmr.com/</id>
    
    <entry>
        <title>Programming still sucks</title>
        <link href="https://sglmr.com/blog/programming-still-sucks/" />
        <id>https://sglmr.com/blog/programming-still-sucks/</id>
        <updated>2026-05-07T00:00:00+00:00</updated>
        <summary type="html">&lt;p&gt;This story is so good, it&#39;s one of the best things I&#39;ve read all year.&lt;/p&gt;
&lt;p&gt;It was inspired by this &lt;a href=&#34;https://www.stilldrinking.org/programming-sucks&#34;&gt;Programming Sucks&lt;/a&gt; from 2014.&lt;/p&gt;</summary>
    </entry>
    
    <entry>
        <title>Thienan Tran: Talking to 35 strangers</title>
        <link href="https://sglmr.com/blog/thienan-tran-talking-to-35-strangers/" />
        <id>https://sglmr.com/blog/thienan-tran-talking-to-35-strangers/</id>
        <updated>2026-05-05T00:00:00+00:00</updated>
        <summary type="html">&lt;p&gt;It was fun reading Thienan&#39;s story/experiment/challenge about talking to strangers at the gym. I regret not doing something like this years ago.&lt;/p&gt;</summary>
    </entry>
    
    <entry>
        <title>Lemon parmesean couscous</title>
        <link href="https://sglmr.com/blog/lemon-parmesean-couscous/" />
        <id>https://sglmr.com/blog/lemon-parmesean-couscous/</id>
        <updated>2026-05-04T00:00:00+00:00</updated>
        <summary type="html">&lt;p&gt;Couscous is a fast, easy side to throw together while other things are cooking.&lt;/p&gt;
&lt;h2 id=&#34;Ingredients&#34;&gt;Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 cup Regular/Moroccan Couscous (dry)&lt;/li&gt;
&lt;li&gt;1 cup Boiling Water or Broth&lt;/li&gt;
&lt;li&gt;1 tbsp Butter or Extra Virgin Olive Oil&lt;/li&gt;
&lt;li&gt;½ Lemon (zested and juiced)&lt;/li&gt;
&lt;li&gt;¼ cup Grated Parmesan cheese&lt;/li&gt;
&lt;li&gt;Salt and Pepper to taste&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Optional:&lt;/em&gt;&lt;ul&gt;
&lt;li&gt;&lt;em&gt;*Use chicken or vegetable broth for more flavor.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fresh parsley or chives to top while serving.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;Instructions&#34;&gt;Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cook:&lt;/strong&gt; Place the dry couscous in a heat-proof bowl. Pour the boiling water (or broth) over the top. Add a tiny pinch of salt and a drizzle of oil/butter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wait:&lt;/strong&gt; Cover the bowl with a lid or a plate. Let it sit undisturbed for 5 minutes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fluff:&lt;/strong&gt; Remove the lid and use a fork to gently fluff the couscous.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fold:&lt;/strong&gt; Fold in the lemon zest, lemon juice, and Parmesan cheese. Season with a generous crack of black pepper.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serve.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;Notes&#34;&gt;Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zest first, juice second:&lt;/strong&gt; It is easier to zest a whole lemon than a squeezed-out half.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Toast it:&lt;/strong&gt; If you have an extra 2 minutes, toast the dry couscous in a pan with a little butter until it smells nutty before adding the water.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pearl Couscous:&lt;/strong&gt; Increase the water to 1¼ to 1½ cups for pearl couscous. Pearl couscous will need to be simmered for 10-15 minutes to cook.&lt;/li&gt;
&lt;/ul&gt;</summary>
    </entry>
    
    <entry>
        <title>Static site regrets... I&#39;ve got a few</title>
        <link href="https://sglmr.com/blog/static-site-regrets/" />
        <id>https://sglmr.com/blog/static-site-regrets/</id>
        <updated>2026-05-01T00:00:00+00:00</updated>
        <summary type="html">&lt;p&gt;It was a little premature to &lt;a href=&#34;/blog/this-site-is-static-now/&#34;&gt;celebrate&lt;/a&gt; moving this site to a static site generator. It&#39;s been all of 2 weeks and I have more than a few regrets...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I miss writing from anywhere more than I thought I would.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I am syncing with Obsidian sync to write content, but I can&#39;t correct and publish it from anywhere. I also don&#39;t have access to the generator everywhere for local previewing. There&#39;s more friction in my writing process than I anticipated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&#39;ve accidentally published draft posts at least 3 times.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I don&#39;t think anyone really reads or subscribes to this blog, so it&#39;s probably a non-issue. Regardless, it&#39;s a little embarrassing to accidentally publish incomplete draft posts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I miss content organization.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Django admin provided a lot of &#34;free&#34; organization and &#34;CMS&#34;-like capabilities to my writing. I started missing that and researching how I could add a headless CMS to my static site. Before I got very far, I realized... I&#39;m basically rebuilding what I had in Django and picking up more dependencies and &#34;hacks&#34; along the way.&lt;/p&gt;
&lt;h2 id=&#34;Back%20to%20Django%3F&#34;&gt;Back to Django?&lt;/h2&gt;
&lt;p&gt;I think I&#39;m going to spin up a more basic, vanilla Django proof of concept so that I can compare them side by side.  No NPM tailwind dependencies, no Redis, no PostgreSQL, no Docker, no platforms as a service, etc. Just Django, a few packages to do the basics, and a basic VPN server.&lt;/p&gt;</summary>
    </entry>
    
    <entry>
        <title>Check for preview in Workday Studio</title>
        <link href="https://sglmr.com/blog/check-for-preview-in-workday-studio/" />
        <id>https://sglmr.com/blog/check-for-preview-in-workday-studio/</id>
        <updated>2026-04-30T00:00:00+00:00</updated>
        <summary type="html">&lt;p&gt;Today I learned how to check if a Workday studio is running in the preview environment.&lt;/p&gt;
&lt;p&gt;Saving this here since I don&#39;t know if I&#39;d ever remember &lt;code&gt;context.customerId&lt;/code&gt; even a few days from now.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #ffffff&#34;&gt;&lt;pre style=&#34;line-height: 125%;&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;props[&lt;span style=&#34;color: #009C00&#34;&gt;&amp;quot;tenant&amp;quot;&lt;/span&gt;] = context.customerId;

&lt;span style=&#34;color: #F00; font-style: italic&#34;&gt;// true/false if the tenant is preview&lt;/span&gt;
props[&lt;span style=&#34;color: #009C00&#34;&gt;&amp;quot;inPreview&amp;quot;&lt;/span&gt;] = (props[&lt;span style=&#34;color: #009C00&#34;&gt;&amp;quot;tenant&amp;quot;&lt;/span&gt;].toString().indexOf(&lt;span style=&#34;color: #009C00&#34;&gt;&amp;quot;preview&amp;quot;&lt;/span&gt;) &amp;gt; 0) ? &lt;span style=&#34;color: #00F&#34;&gt;true&lt;/span&gt; : &lt;span style=&#34;color: #00F&#34;&gt;false&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary>
    </entry>
    
    <entry>
        <title>Find the algorithm and length of a x509 Key</title>
        <link href="https://sglmr.com/posts/get-x509-key-details-with-certutil/" />
        <id>https://sglmr.com/posts/get-x509-key-details-with-certutil/</id>
        <updated>2026-04-28T00:00:00+00:00</updated>
        <summary type="html">&lt;p&gt;Today I learned how to get the algorithm and length of an x509 key (since I couldn&#39;t find it on Workday Community).&lt;/p&gt;
&lt;p&gt;(I&#39;m using a Windows 10 computer in the &lt;code&gt;cmd&lt;/code&gt; terminal)&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #ffffff&#34;&gt;&lt;pre style=&#34;line-height: 125%;&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;certutil -dump &lt;span style=&#34;color: #009C00&#34;&gt;&amp;quot;Downloads/key.txt&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And out of that, I got a whole bunch of junk with these useful bits:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #ffffff&#34;&gt;&lt;pre style=&#34;line-height: 125%;&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;X509 Certificate:
Version: 3
Signature Algorithm:
    Algorithm ObjectID: ... Sha256RSA
    Algorithm Parameters:
    05 00
Public Key Length: 2048 bits
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary>
    </entry>
    
    <entry>
        <title>Goodbye afternoon coffee 👋</title>
        <link href="https://sglmr.com/blog/goodbye-afternoon-coffee/" />
        <id>https://sglmr.com/blog/goodbye-afternoon-coffee/</id>
        <updated>2026-04-27T00:00:00+00:00</updated>
        <summary type="html">&lt;p&gt;My 2x/day latte routine is killing me. &lt;/p&gt;
&lt;p&gt;This post marks what is probably the 5th time I&#39;ve tried giving up my coffee routine in as many years. And this time is going to be different, maybe? 🤔 🤞&lt;/p&gt;
&lt;h2 id=&#34;Why%3F&#34;&gt;Why?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;I&#39;m tired of being tired.&lt;/strong&gt; I&#39;ve been reading about how caffeine affects the body and it explains a lot of what I&#39;m feeling. It&#39;s a slow, cumulative effect that sneaks up on me.&lt;/p&gt;
&lt;div class=&#34;admonition examplez&#34;&gt;
&lt;p class=&#34;admonition-title&#34;&gt;Story time:&lt;/p&gt;
&lt;p&gt;Imagine you strap on a weighted vest every day and go out for a run. And each day, you add a few pounds of weight to the pack.  You can do it for a while, but eventually you&#39;ll collapse.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&#34;The%20revolving%20door&#34;&gt;The revolving door&lt;/h2&gt;
&lt;p&gt;I&#39;ve got a pretty consistent routine down. It goes something like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I&#39;ll drink 1 morning latte for a while.&lt;/li&gt;
&lt;li&gt;Eventually a few bad nights of sleep with the kids or a particularly hard work week leads to an, &lt;em&gt;&#34;I need a break,&#34;&lt;/em&gt; afternoon latte.&lt;/li&gt;
&lt;li&gt;Then 2x/day turns into a daily habit, with no noticeable downsides.&lt;/li&gt;
&lt;li&gt;A few months later, I hit a wall.&lt;ul&gt;
&lt;li&gt;I have trouble falling asleep before 10pm.&lt;/li&gt;
&lt;li&gt;I can&#39;t sleep in past 5am (sometimes even earlier).&lt;/li&gt;
&lt;li&gt;The 2x/day latte&#39;s aren&#39;t carrying me through the day the way they used to.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</summary>
    </entry>
    
    <entry>
        <title>Emma Goto #blog posts</title>
        <link href="https://sglmr.com/blog/emma-goto-blog-posts/" />
        <id>https://sglmr.com/blog/emma-goto-blog-posts/</id>
        <updated>2026-04-19T00:00:00+00:00</updated>
        <summary type="html">&lt;p&gt;I stumbled across &lt;a href=&#34;https://www.emgoto.com/tags/blog/&#34;&gt;Emma Goto&lt;/a&gt; writing about different parts of her blogging process. I&#39;ve been really into these kinds of posts since &lt;a href=&#34;/blog/this-site-is-static-now/&#34;&gt;This site is static now&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The posts cover things about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Her writing process&lt;/li&gt;
&lt;li&gt;Astro&lt;/li&gt;
&lt;li&gt;Digital Garden&lt;/li&gt;
&lt;li&gt;Hosting media files on a CDN&lt;/li&gt;
&lt;/ul&gt;</summary>
    </entry>
    
    <entry>
        <title>This site is static now</title>
        <link href="https://sglmr.com/blog/this-site-is-static-now/" />
        <id>https://sglmr.com/blog/this-site-is-static-now/</id>
        <updated>2026-04-18T00:00:00+00:00</updated>
        <summary type="html">&lt;p&gt;After 4 years of Django, this site is now built with a DIY static site generator. I set out to write about the new static version, but I never got past the site&#39;s history. I &lt;del&gt;have to&lt;/del&gt; maybe do a part 2 someday to cover the new static site generator.&lt;/p&gt;
&lt;h2 id=&#34;4%20years%20of%20%28mostly%29%20Django&#34;&gt;4 years of (mostly) Django&lt;/h2&gt;
&lt;p&gt;First off, just want to say that Django is awesome and I love it. I&#39;ve dabbled in Go, Flask, FastAPI, and Starlette. None of them let you build  things as quickly as you can with Django. You might not always love the Django way or need all its batteries, but they are there when you do. If you ever need to reach for a database, you&#39;re going to have to build from scratch a lot of things Django gives you out of the box.&lt;/p&gt;
&lt;h2 id=&#34;Beginning%20with%20Django&#34;&gt;Beginning with Django&lt;/h2&gt;
&lt;p&gt;4 years ago, I wanted to learn how to build &#34;real websites&#34;. So I ran through a few different tutorials. I&#39;m pretty sure I started with the &lt;a href=&#34;https://tutorial.djangogirls.org/en/&#34;&gt;Django Girls tutorial&lt;/a&gt; and then moved onto &lt;a href=&#34;https://wsvincent.com/projects/&#34;&gt;Will Vincent&#39;s books&lt;/a&gt;. From there I needed a real project. So of course I wrote a blog. Somehow I skipped the obligatory, &#34;I started a blog,&#34; post.&lt;/p&gt;
&lt;p&gt;The website also served as a hub for many other projects (Django apps):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://jrnl.sh/en/stable/&#34;&gt;jrnl&lt;/a&gt; from anywhere&lt;/li&gt;
&lt;li&gt;My own &lt;a href=&#34;https://simplenote.com&#34;&gt;Simplenote&lt;/a&gt; (with extra features)&lt;/li&gt;
&lt;li&gt;Link shortener&lt;/li&gt;
&lt;li&gt;Various habit trackers&lt;/li&gt;
&lt;li&gt;Gym log&lt;/li&gt;
&lt;li&gt;Intermittent fasting tracker&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;SQLite%2C%20PostgreSQL%2C%20or%20%22%C2%BFPor%20qu%C3%A9%20no%20los%20dos%3F%22&#34;&gt;SQLite, PostgreSQL, or &#34;¿Por qué no los dos?&#34;&lt;/h3&gt;
&lt;p&gt;I started with SQLite and in 2024, moved onto PostgreSQL for the full text search features. &lt;a href=&#34;/blog/django-blog-postgres-search-notes/&#34;&gt;I wrote a bit about it.&lt;/a&gt; Note: SQLite does have FTS, but Django&#39;s ORM doesn&#39;t have as many (if any) features for it.&lt;/p&gt;
&lt;p&gt;PostgreSQL has always been a bit stressful for me. I&#39;ve successfully restored a database backup (at least locally), but I never felt that comfortable doing it or that I had a bullet-proof backup strategy. With SQLite, I could just download the database as a file and quickly drop it into my project or a backup drive.  &lt;a href=&#34;/blog/django-export-sqlite-database-view/&#34;&gt;I wrote about that too.&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;Django%20deployment&#34;&gt;Django deployment&lt;/h3&gt;
&lt;p&gt;At first, Django deployment is a circus. Everyone seems to do it a little different. I tried maybe 4 different tutorials, they would all differ a bit from my project in some way. I bet it took two weeks of working on it in the evenings to get it working right with static and media files served correctly. Now I could do it in half a day. It was very frustrating and discouraging, but, even a blind squirrel finds an acorn once in a while.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I think the #1 issue would be linux file permissions, followed by some kind of networking issue (a unix socket, reverse proxy, firewall, etc). After struggling through a few times, I got a feel for how and why different pieces fit together and it got easier to Google the correct incantation to solve any issue. Now, AI is amazing at solving these problems.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My last and favorite way to deploy was self-hosting Dokploy on a VPS.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To get there, I tried Heroku, Digital Ocean, Linode, Hetzner, Lightsail, Render, Railway, Fly.io and Appliku.&lt;/p&gt;
&lt;p&gt;Why so many? I like to tinker, it would usually go something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Step 1: Learn to deploy on a VPS because it&#39;s cheap.
Step 2: What if something goes wrong? I&#39;ll try out a PaaS.
Step 3: Eh, I want to use SQLite (or save money or host multiple projects or...). Back to a VPS.
Step 4: Rinse and repeat.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;Static%20curious&#34;&gt;Static curious&lt;/h2&gt;
&lt;p&gt;At some point in those years, I had been interested in static sites and explored building my content with Pelican and Hugo. I can&#39;t remember if I ever actually deployed any of them. I stayed (or boomeranged) back to Django because it was nice to be able to edit my stuff on a phone or any computer anywhere. I couldn&#39;t really do that with a static site. (You can, but it&#39;s less convenient)&lt;/p&gt;
&lt;h2 id=&#34;The%20Go%20phase&#34;&gt;The Go phase&lt;/h2&gt;
&lt;p&gt;For fun, I tried to learn Go and loved a lot of things about it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&#39;s boring in mostly the best ways.&lt;/li&gt;
&lt;li&gt;You get so many great tools out of the box with Go that you have to assemble together in Python.&lt;/li&gt;
&lt;li&gt;Compiling any Go project I worked on was still faster than starting up a Python app.&lt;/li&gt;
&lt;li&gt;The programs run faster than Python.&lt;/li&gt;
&lt;li&gt;Static typing is awesome... it made me realize VSCode had superpowers I never knew existed compared to when I was writing Python.&lt;/li&gt;
&lt;li&gt;It &lt;em&gt;feels&lt;/em&gt; productive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So as I was learning Go, I picked up &lt;a href=&#34;https://lets-go.alexedwards.net&#34;&gt;Let&#39;s Go&lt;/a&gt; and learned how to build a Go web app the Go way. Then I tried rebuilding my whole blog and app the Go way. And again, I played with SQLite, PostgreSQL, sqlc vs stdlib vs pgx, different hosting providers, etc.&lt;/p&gt;
&lt;p&gt;My website ran on Go for maybe, 9 months? Eventually it came to an end. Writing Go code felt productive and efficient, but wasn&#39;t. It took so much longer to prototype ideas in Go than with Django. As a Dad with young kids, that was important. It was frustrating that it would take me 1-2 weeks to wire something up in Go that could be as fast as 2 nights in Django.&lt;/p&gt;</summary>
    </entry>
    
    <entry>
        <title>PixelWolf 88x31 Button Generator</title>
        <link href="https://sglmr.com/blog/pixelwolf-88x31-button-generator/" />
        <id>https://sglmr.com/blog/pixelwolf-88x31-button-generator/</id>
        <updated>2026-04-17T00:00:00+00:00</updated>
        <summary type="html">&lt;p&gt;After trying out a bunch of 88x31 button generators, this one was the easiest to create a few quick, lightweight buttons.&lt;/p&gt;</summary>
    </entry>
    
</feed>