From 30731133aff475f100cea7fac18017505a400c38 Mon Sep 17 00:00:00 2001 From: bdunahu Date: Fri, 21 Aug 2026 20:54:39 -0400 Subject: Move contact, blog to index. Rewrite index, structural changes. --- src/operationnull/index.scm | 104 ++++++++++++++++++++++++++++ src/operationnull/pages.scm | 161 +++++--------------------------------------- src/operationnull/site.scm | 7 +- src/operationnull/theme.scm | 69 +++++++++---------- src/operationnull/utils.scm | 14 ++++ 5 files changed, 168 insertions(+), 187 deletions(-) create mode 100644 src/operationnull/index.scm create mode 100644 src/operationnull/utils.scm (limited to 'src') diff --git a/src/operationnull/index.scm b/src/operationnull/index.scm new file mode 100644 index 0000000..3c9e673 --- /dev/null +++ b/src/operationnull/index.scm @@ -0,0 +1,104 @@ +;; SPDX-License-Identifier: CC-BY-SA-4.0 +;; Copyright 2026 bdunahu +(define-module (operationnull index) + #:use-module (srfi srfi-19) + #:use-module (haunt builder blog) + #:use-module (haunt html) + #:use-module (haunt page) + #:use-module (haunt post) + #:use-module (haunt utils) + #:use-module (operationnull utils) + #:use-module (operationnull theme) + #:export (index-page)) + +(define %about + `(div (h1 "Hello!") + (div (@ (class "c")) + (p "My name is Benjamin (often 'bdunahu'), and this is my +personal site!") + (p "I obtained my masters at the " + (a (@ (href "https://www.cics.umass.edu/")) + "University of Massachusetts Amherst") + ", where I studied computer science. I now do security scanning on +Linux-based operating systems. I am part of the " + (a (@ (href "https://github.com/umacabal/umaring")) + "umass webring") + ". Try it and pretend the majority of the internet doesn't +exist!")))) + +(define %contact + `(div (h2 "Contact") + (div (@ (class "c")) + (p "I don't mind real humans contacting me:") + (ul (@ (class "ul-nb")) + (li (b "Email: ") "bdunahu @ this domain") + (li (b "IRC: ") "@ bdunahu @ libera.chat") + (li (b "matrix: ") "@bdunahu:tchncs.de") + (li (b "signal: ") "bdunahu.29")) + (p "If you want to send an encryped email:") + (ul (@ (class "ul-nb")) + (li (code "\ +curl -sL https://operationnull.com/assets/bdunahu.pub | gpg --import")) + (li "fingerprint " + (code "\ +5550 5CA6 9DE5 D342 7F31 F9AE 5F86 6C65 2A34 C996")))))) + +(define (make-blog-preview site posts) + `(div (h2 "Recent Posts " + (a (@ (href "/atom.xml")) + (img (@ (class "feed-icon") + (src "/assets/feed.png"))))) + (div (@ (class "c")) + (ul (@ (class "ul-nb")) + ,(map (lambda (post) + (let ((uri (post-uri site post))) + `(li (a (@ (href ,uri)) + ,(post-ref post 'title)) + " - " + ,(date->string (post-date post) + "~B ~d, ~Y")))) + (take-up-to 5 (posts/reverse-chronological posts)))) + (a (@ (href "/posts/")) + "see all...")))) + +(define %extras + `(div (h2 "Some stuff I do:") + (div (@ (class "c")) + (p "I recently did some independent work at the UMass Plasma +lab related to a specialized python asyncio profiler, similar to the " + (a (@ (href "https://github.com/plasma-umass/coz")) + "Coz profiler") + ", but for the event loop. It worked okay, but required a constant +workload across the profiling experiments to have actionable results. +It was still a great learning +experience!") + (p "I previously worked on my own C compiler after working on a +from-scratch compiler in coursework. I used this second compiler to +learn the basics of guile scheme. This website is written in scheme; +and my computing environments are similarly configured using " + (a (@ (href "https://guix.gnu.org/")) + "GuixSD") + ". I started contributing patches and packages. I have a little +experience with Arch (Parabola) and Debian in maintaining this server. +Someday, I may host my web, mail, IRC bouncer, etc. with scheme and +Guix too, but that requires downtime and a lot of work on top of the +work already put in.") + (p "I write, sometimes technical papers for research and classwork, but +also enjoy creative writing. I try to practice the fiction genre and +freewrite daily.") + (p "I also read a lot of Sword and Sorcery. My favorite series +is the Morlock Ambrosius series by James Enge. While the protagonists +in these stories are capable enough of saving the world, what makes it +interesting is the lack of heroism and the reality that they are their +own worst enemy, (" + (a (@ (href "https://www.oldmoonpublishing.com/evil-honey")) + "if not the secondary antagonist") + ").")))) + +(define (index-content site posts) + `(article ,%about ,%contact ,(make-blog-preview site posts) ,%extras)) + +(define (index-page site posts) + (make-page "index.html" + (base-template site "home" (index-content site posts)) + sxml->html)) diff --git a/src/operationnull/pages.scm b/src/operationnull/pages.scm index dbb7c64..8a1bfe8 100644 --- a/src/operationnull/pages.scm +++ b/src/operationnull/pages.scm @@ -1,89 +1,13 @@ ;; SPDX-License-Identifier: CC-BY-SA-4.0 ;; Copyright 2026 bdunahu (define-module (operationnull pages) - #:export (index-content - contact-content - e404 - gold-content + #:use-module (operationnull utils) + #:export (e404 recommend-content)) -(define index-content - '(article (h1 "Hello!") - (div (@ (class "c")) - (p "My name is Benjamin (often 'bdunahu'), and this is my -personal site!") - (p "I am currently attending my final semester at the " - (a (@ (href "https://www.cics.umass.edu/")) - "University of Massachusetts Amherst") - ", where I am studying computer science. I am part of the " - (a (@ (href "https://github.com/umacabal/umaring")) - "umass webring") - ". Try it and pretend the majority of the internet doesn't -exist!")) - (h1 "Some stuff I do:") - (div (@ (class "c")) - (p "Some programming, of course; I like experimenting with and -building tools for existing software.") - (p "I recently did some independent work at the UMass Plasma -lab related to a specialized python asyncio profiler. In the case of asyncio, -developers are in charge of having their tasks share resources. If you make a -mistake (i.e., by having a task not yield to other tasks), traditional profilers -may not find it, because they are concerned with ranking code by total execution -time, not considering the delicate timing between all tasks competing to run on -the same thread. My profiler 'Nemesis', would randomly select synchronous logic -to speedup during execution similar to the " - (a (@ (href "https://github.com/plasma-umass/coz")) - "Coz profiler") - " and measure the average latency changes of all other tasks -to report on real optimization impacts. This worked okay, but was -limited in usefulness since it required a constant workload across the -experiments to have actionable results. It was still a great learning -experience!") - (p "I previously worked on my own C compiler after working on a -from-scratch compiler in coursework. I used this second compiler to -learn the basics of guile scheme. This website is written in scheme; -and my computing environments are similarly configured using" - (a (@ (href "https://guix.gnu.org/")) - "GuixSD") - ". I recently started contributing patches and packages. I -have a little experience with Arch (Parabola) and Debian in -maintaining this server. Someday, I may host my web, mail, IRC -bouncer, etc. with scheme and Guix too, but that requires downtime and -a lot of work on top of the work already put in.") - (p "I write, sometimes technical papers for research -and classwork, but also enjoy creative writing. I do " - (a (@ (href "/gold.html")) - "poetry") - " occasionally. Though I prefer plot and character -design (likely cultivated from many hours playing dungeons and -dragons), and am currently focused on a series of short stories -featuring a timeline in which the goddess Freya is spiteful in the -aftermath of the " - (a (@ (href "https://en.wikipedia.org/wiki/%C3%86sir%E2%80%93Vanir_War")) - "Aesir-Vanir war") - ". It's been suggested she's the same seer who was -mistreated (if that's how you should call burned to death three times) -by the Aesir due to envy. Since she is essentially traded as a hostage -to the Aesir in the aftermath of the war, why shouldn't she be using -her seer magic venomously behind their backs? It's currently set in -Midgard, Jotunheim, and the passages in-between, following her -shamelessly unhelpful servants.") - (p "I also read a lot of Sword and Sorcery. My favorite series -is the Morlock Ambrosius series by James Enge; but you can read more about -things I find cool" - (a (@ (href "/recommend.html")) - "here") - ". While the protagonists in these stories are capable enough -of saving the world, what makes it interesting is the lack of heroism and the -reality that they are their own worst enemy, (" - (a (@ (href "https://www.oldmoonpublishing.com/evil-honey")) - "if not the secondary antagonist") - ").")))) - (define recommend-content '(article (h1 "Cool Stuff in Categories") - (p "Limited to 10 or less per category, and ordered alphabetically, -to make the process easier.") + (p "Things I use and recommend.") (h2 "Books & Series") (div (@ (class "c")) (ul (li "Bram Stoker - Dracula") @@ -100,19 +24,19 @@ to make the process easier.") )) (h2 "Music") (div (@ (class "c")) - (ul ;; (li "Agalloch - She Painted Fire Across The Skyline (Part 2)") - (li "Blind Guardian - Harvest Of Sorrow") + (ul ; + (li "Blind Guardian - Fly") (li "Catamenia - Coldbound") (li "Dool - Oweynagat") - ;; (li "Empyrium - The Franconian Woods In Winter's Silence") - (li "Enshine - Dual Existance") + (li "Empyrium - The Franconian Woods In Winter's Silence") + ;; (li "Enshine - Dual Existance") (li "Eternal Tears of Sorrow - The River Flows Frozen") (li "Evanescence - Imaginary") - ;; (li "In Flames - Pinball Map") - ;; (li "Moonspell - Wolfshade") + (li "Lunatic Soul - Monsters") (li "Palmreader - Hold/Release") - (li "Suldusk - Solus Ipse") - (li "TOOL - Rosetta Stoned") + ;; (li "Osi and the Jupiter - Much Wisdom is Such Grief") + (li "Suldusk - Anthesis") + ;; (li "TOOL - Rosetta Stoned") (li "Vylet Pony - The Wallflower Equation"))) (h2 "Software") (div (@ (class "c")) @@ -122,71 +46,16 @@ to make the process easier.") (li "guix") (li "mpv (media player)") (li "nsxiv (image viewer)") - (li "rcirc") + (li "rcirc (irc client)") (li "tor") (li "yt-dlp") - (li "zathura (pdf viewer)"))))) - -(define contact-content - '(article (h1 "Messengers") - (div (@ (class "c")) - (b "IRC: ") "@ bdunahu @ libera.chat" - (br) - (b "matrix: ") "@bdunahu:tchncs.de" - (br) - (b "signal: ") "bdunahu.29") - (h1 "Email") + (li "zathura (pdf viewer)"))) + (h2 "Favorite LLM Client?") (div (@ (class "c")) - "bdunahu @ this domain" - (ul (@ (style "font-size: 80%;")) - (p "If you know how/want to send encrypted email:") - (ul (code "curl -sL https://operationnull.com/assets/bdunahu.pub | gpg --import") - (br) - "Fingerprint: " - (code "5550 5CA6 9DE5 D342 7F31 F9AE 5F86 6C65 2A34 C996")))))) + (p "no. no no no no")))) (define e404 '(article (h1 "403/404 Error") (div (@ (class "c")) (p "The requested page does not exist, or you do not have access.")))) - -(define gold-content - '(article (h1 "Shape God") - (div (@ (class "date")) - "Written on Feb 12, 2024, updated June 30th, 2025 by bdunahu") - (br) - (div (p (@ (class "verse")) - "An abiding ash snares its feathered lord;" - (br) - "the first bears shelter, the second shadow." - (br) - "Darkness thrashes in envy, a callous cord;" - (br) - "life seldom slaughters the serf of gallows." - (br) - (br) - "In sacred wellspring bearing a kingdom," - (br) - "lowly ancients bargain poison and vice." - (br) - "A madman need savor his wisdom;" - (br) - "to take lore for sight is a witless price." - (br) - (br) - "Wanderer impaled by most faithless knife" - (br) - "tarnished talons adrift the bleeding red," - (br) - "from the icy fibers of self-suffered life" - (br) - "our king --- " - (i "war-maker! all-hater!") - " --- has fed." - (br) - (br) - "In burst fetters terror comes to bite," - (br) - "and thus conclude the coward's futile plight." - (br))))) diff --git a/src/operationnull/site.scm b/src/operationnull/site.scm index 203478f..2806d12 100644 --- a/src/operationnull/site.scm +++ b/src/operationnull/site.scm @@ -9,13 +9,14 @@ #:use-module (haunt reader) #:use-module (haunt reader commonmark) #:use-module (haunt site) + #:use-module (operationnull index) #:use-module (operationnull pages) #:use-module (operationnull static) #:use-module (operationnull theme) #:export (main-site)) (define %blog-collection - `(("Recent Posts" "/posts/index.html" ,posts/reverse-chronological))) + `(("All Posts" "/posts/index.html" ,posts/reverse-chronological))) (define main-site (site #:title "operationnull.com" @@ -25,10 +26,8 @@ #:default-metadata '((author . "bdunahu")) #:readers (list commonmark-reader) - #:builders (list (static-page index-content "index.html" "home") - (static-page contact-content "/contact.html" "contact") + #:builders (list index-page (static-page e404 "/404.html" "404 Error") - (static-page gold-content "/gold.html" "Shape God") (static-page recommend-content "/recommend.html" "cool stuff in categories") (static-directory "content/assets" "assets") (blog #:theme main-theme diff --git a/src/operationnull/theme.scm b/src/operationnull/theme.scm index 752b9c2..806faec 100644 --- a/src/operationnull/theme.scm +++ b/src/operationnull/theme.scm @@ -8,7 +8,9 @@ #:use-module (haunt site) #:use-module (ice-9 match) #:use-module (srfi srfi-19) - #:export (main-theme)) + #:use-module (operationnull utils) + #:export (main-theme + base-template)) (define %cc-by-sa-link '(a (@ (href "https://creativecommons.org/licenses/by-sa/4.0/")) @@ -21,11 +23,7 @@ (div (@ (class "intro-main")) (div (@ (class "intro-left")) (nav - (div (ul (li (a (@ (href "/contact.html")) - "contact")) - (li (a (@ (href "/posts/")) - "blog")) - (li (a (@ (href "https://git.operationnull.com/")) + (div (ul (li (a (@ (href "https://git.operationnull.com/")) "git")) (li (a (@ (href "https://codeberg.org/bdunahu")) "codeberg")) @@ -72,34 +70,35 @@ `(link (@ (rel "stylesheet") (href ,(string-append "/assets/" name ".css"))))) +(define (base-template site title body) + `((doctype "html") + (head + (meta (@ (http-equiv "Content-Type") (content "text/html; charset=UTF-8"))) + (meta (@ (http-equiv "Content-Language") (content "en"))) + (meta (@ (name "viewport") + (content "width=device-width, initial-scale=1"))) + (meta (@ (name "description") + (content "bdunahu's personal website"))) + (meta (@ (name "author") (content "bdunahu"))) + ;; (link (@ (rel "icon") + ;; (type "image/x-icon") + ;; (href "/assets/favicon.ico"))) + (title ,(string-append title " — " (site-title site))) + ,(stylesheet "site") + ,(stylesheet "xtra")) + ,%intro + (body + (div (@ (class "container")) + ,body)) + ,%footer)) + (define main-theme (theme #:name "bdunahu" - #:layout - (lambda (site title body) - `((doctype "html") - (head - (meta (@ (http-equiv "Content-Type") (content "text/html; charset=UTF-8"))) - (meta (@ (http-equiv "Content-Language") (content "en"))) - (meta (@ (name "viewport") - (content "width=device-width, initial-scale=1"))) - (meta (@ (name "description") - (content "bdunahu's personal website"))) - (meta (@ (name "author") (content "bdunahu"))) - ;; (link (@ (rel "icon") - ;; (type "image/x-icon") - ;; (href "/assets/favicon.ico"))) - (title ,(string-append title " — " (site-title site))) - ,(stylesheet "site") - ,(stylesheet "xtra")) - ,%intro - (body - (div (@ (class "container")) - ,body)) - ,%footer)) + #:layout base-template #:post-template (lambda (post) `((article - (h3 (@ (class "title")),(post-ref post 'title)) + (h1 (@ (class "title")),(post-ref post 'title)) (div (@ (class "date")) ,(date->string (post-date post) "created: ~B ~d, ~Y")) @@ -114,23 +113,19 @@ ,(post-sxml post))))) #:collection-template (lambda (site title posts prefix) - (define (post-uri post) - (string-append prefix "/" (site-post-slug site post) ".html")) - - `(article (h2 ,title + `(article (h1 ,title (a (@ (href "/atom.xml")) (img (@ (class "feed-icon") (src "/assets/feed.png"))))) ,(map (lambda (post) - (let ((uri (post-uri post))) - `(article (@ (class "summary")) + (let ((uri (post-uri site post))) + `(div (@ (class "summary")) (h3 (a (@ (href ,uri)) ,(post-ref post 'title))) (div (@ (class "date")) ,(date->string (post-date post) "~B ~d, ~Y")) (div (@ (class "post")) - ,(first-paragraph post)) - (a (@ (href ,uri)) "more...")))) + ,(first-paragraph post))))) posts))) #:pagination-template (lambda (site body previous-page next-page) diff --git a/src/operationnull/utils.scm b/src/operationnull/utils.scm new file mode 100644 index 0000000..39889ea --- /dev/null +++ b/src/operationnull/utils.scm @@ -0,0 +1,14 @@ +;; SPDX-License-Identifier: CC-BY-SA-4.0 +;; Copyright 2026 bdunahu +(define-module (operationnull utils) + #:use-module (ice-9 ftw) + #:use-module (ice-9 regex) + #:use-module (srfi srfi-2) + #:use-module (haunt site) + #:export (post-uri + get-art-metadata + collect-arts-in)) + +(define (post-uri site post) + (string-append "/posts/" (site-post-slug site post) ".html")) + -- cgit v1.2.3