diff --git a/.envrc b/.envrc index d4b93ce..f773b0e 100644 --- a/.envrc +++ b/.envrc @@ -1,2 +1,4 @@ use flake layout node +mkdir -p "${HOME}/Library/Application Support/SourceGit" +echo "${PATH}" > "${HOME}/Library/Application Support/SourceGit/PATH" diff --git a/.gitignore b/.gitignore index eaedb26..c4bb138 100644 --- a/.gitignore +++ b/.gitignore @@ -161,3 +161,31 @@ fontawesome-pro-6.3.0-web ### Nix Flake gitignore ### result + +### MacOS gitignore ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/.prettierignore b/.prettierignore index aad4421..1fea400 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1 @@ -node_modules -themes +layouts/_default/index.manifest.json diff --git a/.prettierrc b/.prettierrc index 7c5268b..672b6f3 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,3 +4,6 @@ overrides: - files: "*.html" options: parser: "go-template" + - files: "*.gotmpl" + options: + parser: "go-template" diff --git a/.woodpecker.yml b/.woodpecker.yml index 4de02aa..881a8fd 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,14 +1,15 @@ when: branch: master - event: push + event: + - push + - cron + cron: "weekly-build" steps: - name: Build site - image: nixos/nix:2.24.11 + image: hugomods/hugo:std-base-non-root-0.141.0 commands: - - echo 'experimental-features = flakes nix-command' >> /etc/nix/nix.conf - - nix build - - mkdir public && cp -av result/* public + - hugo --minify - name: Deploy to pages image: codeberg.org/xfix/plugin-codeberg-pages-deploy:1 settings: diff --git a/.zed/settings.json b/.zed/settings.json new file mode 100644 index 0000000..eb5924a --- /dev/null +++ b/.zed/settings.json @@ -0,0 +1,13 @@ +{ + "languages": { + "HTML": { + "formatter": { + "external": { + "command": "prettier", + "arguments": ["--stdin-filepath", "{buffer_path}"] + } + } + } + }, + "file_types": { "HTML": ["gotmpl"] } +} diff --git a/README.md b/README.md index 400066a..165340a 100644 --- a/README.md +++ b/README.md @@ -6,18 +6,20 @@ My personal website. Hosted over at ## Notes to self -All dependencies are now bundled as a Nix Flake. The only trouble with this is -that npm packages don't play well with Nix (and especially Flakes), so npm -packages are specified twice: once in `package{-lock}.json` and then again in -`node*.nix`. +### Nix dev shell + +All developer dependencies are now bundled as a Nix Flake. The only trouble with +this is that npm packages don't play well with Nix (and especially Flakes), so +npm packages are specified twice: once in `package{-lock}.json` and then again +in `node*.nix`. Compounding this, there are formatters and commit hooks that require npm to be functional. So, to develop right now requires allowing direnv to setup the Nix development shell, then immediately installing npm packages via `npm ci`. VSCode -(with extensions) and Zed are smart enough to figure out how to use direnv, but -other programs (like SourceGit) not so much, so you'll need to launch those -programs from inside a direnv shell to make sure they have Prettier, Husky, and -all that jazz to execute the hooks. +(with extensions) and Zed are smart enough to figure out how to use direnv, and +direnv will pass the PATH to SourceGit for Mac, but other programs aren't that +smart, so you'll need to launch those programs from inside a direnv shell to +make sure they have Prettier, Husky, and all that jazz to execute the hooks. Last compounding factors: if `node_modules` is present in the root directory, then node2nix won't create a correct derivation, so `node_modules` will need to @@ -30,3 +32,11 @@ run. Yes, hopefully I can get completely away from npm here soon, but this is a minor inconvenience considering how (not) often I install new packages into this site, and really discourages me from contributing to the website obesity crisis. + +### Nix building + +Nix building will not work because Hugo reaches out to the internet via content +adapters, and that (by intention) is not perfectly reproducable. As such, +_development_ tools are installed in a Nix shell, but building has been removed +from the Flake. Thankfully, hugomods provides "canonical" Docker images for hugo +now. diff --git a/assets/characters/README.md b/assets/characters/README.md new file mode 100644 index 0000000..3b2d851 --- /dev/null +++ b/assets/characters/README.md @@ -0,0 +1,30 @@ +# Characters + +Imaginary friends that help me inject personality into my articles. These are +anthropomorphized versions of animals that I have known in real life. I tried to +draw them roughly in the style of Chris Pasquini, but failed myself, then tried +using Perplexity's image generation. The style isn't quite the same, but I like +it for these animals. Also, Perplexity does a horrible job of labeling images, +so ignore the ref sheet emotion labels. + +## Spawn of Satan (aka Spawn aka SOS) + +![Spawn ref sheet](spawn/_ref-body-perplexity.png) + +Spawn of Satan is the name Travis gave to the cannulated cow, and it stuck. +Spawn is old and cynical after having every professor with a new idea experiment +on her. After being in academia for so long, she knows her way around +mathematics and the scientific method reasonably well, even if she's never +formally taken a college course in the sciences. She is the realist to any blog +post's optimist. + +## Whelen + +![Whelen ref sheet](whelen/_ref-body-perplexity.png) + +Whelen is a happy-go-lucky German Shepherd/Husky mix puppy. He's been to school +once - and that was just to get neutered - so his knowledge of math and science, +heck, even of the humanities, isn't very good. He is very naive and thinks +everyone is nice and wants to be his friend, but he is also friendly to everyone +and is very vocal when he feels left out. He will step in when any blog post is +getting too technical and demand an explanation for real people (dogs?). diff --git a/assets/characters/spawn/_ref-blueeye-perplexity.png b/assets/characters/spawn/_ref-blueeye-perplexity.png new file mode 100644 index 0000000..b8bef00 Binary files /dev/null and b/assets/characters/spawn/_ref-blueeye-perplexity.png differ diff --git a/assets/characters/spawn/_ref-body-perplexity.png b/assets/characters/spawn/_ref-body-perplexity.png new file mode 100644 index 0000000..04f95a6 Binary files /dev/null and b/assets/characters/spawn/_ref-body-perplexity.png differ diff --git a/assets/characters/spawn/_ref-bodysmirk-perplexity.png b/assets/characters/spawn/_ref-bodysmirk-perplexity.png new file mode 100644 index 0000000..afb9ba2 Binary files /dev/null and b/assets/characters/spawn/_ref-bodysmirk-perplexity.png differ diff --git a/assets/characters/spawn/_ref-face-perplexity.png b/assets/characters/spawn/_ref-face-perplexity.png new file mode 100644 index 0000000..de286db Binary files /dev/null and b/assets/characters/spawn/_ref-face-perplexity.png differ diff --git a/assets/characters/spawn/body-anger.png b/assets/characters/spawn/body-anger.png new file mode 100644 index 0000000..0f9fd87 Binary files /dev/null and b/assets/characters/spawn/body-anger.png differ diff --git a/assets/characters/spawn/body-lazy.png b/assets/characters/spawn/body-lazy.png new file mode 100644 index 0000000..530eb46 Binary files /dev/null and b/assets/characters/spawn/body-lazy.png differ diff --git a/assets/characters/spawn/body-skeptic.png b/assets/characters/spawn/body-skeptic.png new file mode 100644 index 0000000..8e110dc Binary files /dev/null and b/assets/characters/spawn/body-skeptic.png differ diff --git a/assets/characters/spawn/body-snark.png b/assets/characters/spawn/body-snark.png new file mode 100644 index 0000000..e2be9e1 Binary files /dev/null and b/assets/characters/spawn/body-snark.png differ diff --git a/assets/characters/spawn/body-tired.png b/assets/characters/spawn/body-tired.png new file mode 100644 index 0000000..3d84c4d Binary files /dev/null and b/assets/characters/spawn/body-tired.png differ diff --git a/assets/characters/spawn/face-confusion.png b/assets/characters/spawn/face-confusion.png new file mode 100644 index 0000000..6a70166 Binary files /dev/null and b/assets/characters/spawn/face-confusion.png differ diff --git a/assets/characters/spawn/face-happy.png b/assets/characters/spawn/face-happy.png new file mode 100644 index 0000000..445dcef Binary files /dev/null and b/assets/characters/spawn/face-happy.png differ diff --git a/assets/characters/spawn/face-neutral.png b/assets/characters/spawn/face-neutral.png new file mode 100644 index 0000000..44b5522 Binary files /dev/null and b/assets/characters/spawn/face-neutral.png differ diff --git a/assets/characters/spawn/face-sad.png b/assets/characters/spawn/face-sad.png new file mode 100644 index 0000000..15fdb4e Binary files /dev/null and b/assets/characters/spawn/face-sad.png differ diff --git a/assets/characters/spawn/face-toldyouso.png b/assets/characters/spawn/face-toldyouso.png new file mode 100644 index 0000000..9a908bb Binary files /dev/null and b/assets/characters/spawn/face-toldyouso.png differ diff --git a/assets/characters/whelen/_ref-body-perplexity.png b/assets/characters/whelen/_ref-body-perplexity.png new file mode 100644 index 0000000..e5d4103 Binary files /dev/null and b/assets/characters/whelen/_ref-body-perplexity.png differ diff --git a/assets/characters/whelen/_ref-face-perplexity.png b/assets/characters/whelen/_ref-face-perplexity.png new file mode 100644 index 0000000..107709c Binary files /dev/null and b/assets/characters/whelen/_ref-face-perplexity.png differ diff --git a/assets/characters/whelen/body-determined.png b/assets/characters/whelen/body-determined.png new file mode 100644 index 0000000..2c37c46 Binary files /dev/null and b/assets/characters/whelen/body-determined.png differ diff --git a/assets/characters/whelen/body-happy.png b/assets/characters/whelen/body-happy.png new file mode 100644 index 0000000..ef40187 Binary files /dev/null and b/assets/characters/whelen/body-happy.png differ diff --git a/assets/characters/whelen/body-neutral.png b/assets/characters/whelen/body-neutral.png new file mode 100644 index 0000000..9737ccc Binary files /dev/null and b/assets/characters/whelen/body-neutral.png differ diff --git a/assets/characters/whelen/body-sad.png b/assets/characters/whelen/body-sad.png new file mode 100644 index 0000000..2056f02 Binary files /dev/null and b/assets/characters/whelen/body-sad.png differ diff --git a/assets/characters/whelen/body-tired.png b/assets/characters/whelen/body-tired.png new file mode 100644 index 0000000..855a49d Binary files /dev/null and b/assets/characters/whelen/body-tired.png differ diff --git a/assets/characters/whelen/body-worry.png b/assets/characters/whelen/body-worry.png new file mode 100644 index 0000000..2dd85e2 Binary files /dev/null and b/assets/characters/whelen/body-worry.png differ diff --git a/assets/characters/whelen/face-anticipation.png b/assets/characters/whelen/face-anticipation.png new file mode 100644 index 0000000..0be27d0 Binary files /dev/null and b/assets/characters/whelen/face-anticipation.png differ diff --git a/assets/characters/whelen/face-bored.png b/assets/characters/whelen/face-bored.png new file mode 100644 index 0000000..d376b4d Binary files /dev/null and b/assets/characters/whelen/face-bored.png differ diff --git a/assets/characters/whelen/face-happy.png b/assets/characters/whelen/face-happy.png new file mode 100644 index 0000000..af35cae Binary files /dev/null and b/assets/characters/whelen/face-happy.png differ diff --git a/assets/characters/whelen/face-neutral.png b/assets/characters/whelen/face-neutral.png new file mode 100644 index 0000000..1a93432 Binary files /dev/null and b/assets/characters/whelen/face-neutral.png differ diff --git a/assets/characters/whelen/face-skeptic.png b/assets/characters/whelen/face-skeptic.png new file mode 100644 index 0000000..33cc063 Binary files /dev/null and b/assets/characters/whelen/face-skeptic.png differ diff --git a/assets/characters/whelen/face-tired.png b/assets/characters/whelen/face-tired.png new file mode 100644 index 0000000..f395166 Binary files /dev/null and b/assets/characters/whelen/face-tired.png differ diff --git a/assets/characters/whelen/face-worry.png b/assets/characters/whelen/face-worry.png new file mode 100644 index 0000000..563b68e Binary files /dev/null and b/assets/characters/whelen/face-worry.png differ diff --git a/assets/graphics/fa/bitcoin.svg b/assets/graphics/fa/bitcoin.svg new file mode 100644 index 0000000..8815bce --- /dev/null +++ b/assets/graphics/fa/bitcoin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/block-quote.svg b/assets/graphics/fa/block-quote.svg new file mode 100644 index 0000000..faa51e9 --- /dev/null +++ b/assets/graphics/fa/block-quote.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/candy-bar.svg b/assets/graphics/fa/candy-bar.svg new file mode 100644 index 0000000..3c0bdfa --- /dev/null +++ b/assets/graphics/fa/candy-bar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/chevrons-down.svg b/assets/graphics/fa/chevrons-down.svg new file mode 100644 index 0000000..0fab552 --- /dev/null +++ b/assets/graphics/fa/chevrons-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/circle-info.svg b/assets/graphics/fa/circle-info.svg new file mode 100644 index 0000000..025e8d0 --- /dev/null +++ b/assets/graphics/fa/circle-info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/circle-quarters.svg b/assets/graphics/fa/circle-quarters.svg new file mode 100644 index 0000000..31f53d2 --- /dev/null +++ b/assets/graphics/fa/circle-quarters.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/code.svg b/assets/graphics/fa/code.svg new file mode 100644 index 0000000..c43b6d1 --- /dev/null +++ b/assets/graphics/fa/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/codeberg.svg b/assets/graphics/fa/codeberg.svg new file mode 100644 index 0000000..d5fdd1a --- /dev/null +++ b/assets/graphics/fa/codeberg.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/graphics/fa/ebay.svg b/assets/graphics/fa/ebay.svg new file mode 100644 index 0000000..cc19ef6 --- /dev/null +++ b/assets/graphics/fa/ebay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/ethereum.svg b/assets/graphics/fa/ethereum.svg new file mode 100644 index 0000000..b200fd2 --- /dev/null +++ b/assets/graphics/fa/ethereum.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/google-scholar.svg b/assets/graphics/fa/google-scholar.svg new file mode 100644 index 0000000..e2b6347 --- /dev/null +++ b/assets/graphics/fa/google-scholar.svg @@ -0,0 +1 @@ + diff --git a/assets/graphics/fa/hacker-news.svg b/assets/graphics/fa/hacker-news.svg new file mode 100644 index 0000000..1d402c1 --- /dev/null +++ b/assets/graphics/fa/hacker-news.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/lightning.svg b/assets/graphics/fa/lightning.svg new file mode 100644 index 0000000..e8cc00c --- /dev/null +++ b/assets/graphics/fa/lightning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/link.svg b/assets/graphics/fa/link.svg new file mode 100644 index 0000000..9ace2c7 --- /dev/null +++ b/assets/graphics/fa/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/lutris.svg b/assets/graphics/fa/lutris.svg new file mode 100644 index 0000000..fd6d2aa --- /dev/null +++ b/assets/graphics/fa/lutris.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/graphics/fa/matrix.svg b/assets/graphics/fa/matrix.svg new file mode 100644 index 0000000..a178912 --- /dev/null +++ b/assets/graphics/fa/matrix.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/graphics/fa/monero.svg b/assets/graphics/fa/monero.svg new file mode 100644 index 0000000..2a1a5dc --- /dev/null +++ b/assets/graphics/fa/monero.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/p.svg b/assets/graphics/fa/p.svg new file mode 100644 index 0000000..8082e1d --- /dev/null +++ b/assets/graphics/fa/p.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/right-to-bracket.svg b/assets/graphics/fa/right-to-bracket.svg new file mode 100644 index 0000000..0d86ac3 --- /dev/null +++ b/assets/graphics/fa/right-to-bracket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/rss.svg b/assets/graphics/fa/rss.svg new file mode 100644 index 0000000..ce2e0d4 --- /dev/null +++ b/assets/graphics/fa/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/scroll.svg b/assets/graphics/fa/scroll.svg new file mode 100644 index 0000000..2d5e7a8 --- /dev/null +++ b/assets/graphics/fa/scroll.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/spotify.svg b/assets/graphics/fa/spotify.svg new file mode 100644 index 0000000..cb99987 --- /dev/null +++ b/assets/graphics/fa/spotify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/zcash.svg b/assets/graphics/fa/zcash.svg new file mode 100644 index 0000000..2a9c9d7 --- /dev/null +++ b/assets/graphics/fa/zcash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/zotero.svg b/assets/graphics/fa/zotero.svg new file mode 100644 index 0000000..2948c62 --- /dev/null +++ b/assets/graphics/fa/zotero.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/graphics/millironx-icon.png b/assets/graphics/millironx-icon.png new file mode 100644 index 0000000..1c4913f Binary files /dev/null and b/assets/graphics/millironx-icon.png differ diff --git a/assets/graphics/millironx-icon.svg b/assets/graphics/millironx-icon.svg new file mode 100644 index 0000000..42b2777 --- /dev/null +++ b/assets/graphics/millironx-icon.svg @@ -0,0 +1,51 @@ + + + + + + + + + + diff --git a/assets/graphics/millironx.svg b/assets/graphics/millironx.svg index c0e4bd1..2e1c756 100644 --- a/assets/graphics/millironx.svg +++ b/assets/graphics/millironx.svg @@ -1,43 +1,42 @@ - + - - - - - - - - + path { + stroke: black; + fill: none; + fill-rule: evenodd; + stroke-dasharray: none; + stroke-linecap: round; + stroke-linejoin: round; + stroke-miterlimit: 4; + stroke-opacity: 1; + stroke-width: 6; + } + + @media (prefers-color-scheme: dark) { + path { + stroke: white; + } + } + + + + + + diff --git a/assets/scripts/phone-masking.js b/assets/scripts/phone-masking.js index 1edbd77..fd2d427 100644 --- a/assets/scripts/phone-masking.js +++ b/assets/scripts/phone-masking.js @@ -1 +1,15 @@ -$("#phone").mask("(000) 000-0000"); +// Built by perplexity.ai +function maskPhoneNumber(input) { + input.addEventListener("input", function (e) { + var x = e.target.value + .replace(/\D/g, "") + .match(/(\d{0,3})(\d{0,3})(\d{0,4})/); + e.target.value = !x[2] + ? x[1] + : "(" + x[1] + ") " + x[2] + (x[3] ? "-" + x[3] : ""); + }); +} + +// Usage +var phoneInput = document.getElementById("phone"); +maskPhoneNumber(phoneInput); diff --git a/assets/styles/millironx.css b/assets/styles/millironx.css index a4fcf70..00ad31e 100644 --- a/assets/styles/millironx.css +++ b/assets/styles/millironx.css @@ -165,7 +165,18 @@ ); --container-border: light-dark(var(--swiss-brown-6), var(--eclipse-16)); --container-background: light-dark(var(--swiss-brown-4), var(--eclipse-12)); + --container-border-alt: light-dark(var(--eclipse-16), var(--swiss-brown-6)); + --container-background-alt: light-dark( + var(--eclipse-12), + var(--swiss-brown-4) + ); --motto-background: rgba(0, 0, 0, 0.66); + --page-button-text: var(--prickly-pear-yellow-1); + --page-button-background: var(--prickly-pear-yellow-8); + --page-button-background-hover: var(--prickly-pear-yellow-10); + --page-button-background-active: var(--prickly-pear-yellow-12); + --page-button-background-disabled: var(--prickly-pear-yellow-6); + --page-button-text-disabled: var(--eclipse-7); /* Fonts @@ -174,7 +185,10 @@ "URW Bookman L", "Georgia Pro", Georgia, serif; --font-family-slab-serif: Rockwell, "Rockwell Nova", "Roboto Slab", "DejaVu Serif", "Sitka Small", serif; + --font-family-transitional: Charter, "Bitstream Charter", "Sitka Text", + Cambria, serif; --font-family-system-ui: system-ui, sans-serif; + --font-family-monospace: "Nimbus Mono PS", "Courier New", monospace; } /* @@ -186,6 +200,26 @@ html { font-family: var(--font-family-slab-serif); } +body { + display: flex; + flex-direction: column; + min-height: 98vh; + margin: 0 8px; + align-items: center; +} + +.container { + max-width: min(60rem, 100vw - 2rem); +} + +.footer-inner { + width: min(60rem, 100vw - 2rem); + display: flex; + justify-content: space-between; + align-items: center; + flex-shrink: 0; +} + a { color: var(--link-color); } @@ -235,6 +269,39 @@ nav a:hover { background-color: var(--nav-button-background-hover); } +main { + display: flex; + flex-direction: column; +} + +article p, +.character-dialog-text, +article li { + font-family: var(--font-family-transitional); + font-size: 1.15rem; + text-justify: inter-word; + text-align: justify; + hyphens: auto; +} + +article > p { + text-indent: 2ch; + line-height: 1.5em; +} + +article h1 + p, +article h2 + p, +article h3 + p, +article h4 + p, +article h5 + p, +article h6 + p { + text-indent: 0; +} + +.footnotes p { + font-size: smaller; +} + figure { border-color: var(--container-border); border-width: 1.5pt; @@ -244,33 +311,41 @@ figure { padding: 1.25pt; } -blockquote { +figure:has(blockquote) { background: linear-gradient( to right, var(--container-border), var(--container-background) ); - border-left: 5px solid black; - padding: 1px; - padding-left: 6px; + border: none; + border-radius: 0; + border-left: 6px solid black; + padding: 0.25em 1em; } -blockquote small::before { +figure:has(blockquote) > blockquote { + margin: 0; +} + +figure:has(blockquote) > figcaption::before { content: "\2014 \00A0"; } -blockquote small { +figure:has(blockquote) > figcaption { + margin-top: -1em; + margin-bottom: 1em; font-size: 80%; } footer { + display: flex; + flex-direction: column; + align-items: center; background-color: var(--container-background); margin: 0 0 -1em -1em; width: calc(100% - 1em); padding: 0.25em 1.25em; - display: flex; - justify-content: space-between; - align-items: center; + font-size: smaller; } form { @@ -295,6 +370,25 @@ textarea:invalid { border-bottom-color: var(--ear-tag-red); } +code { + font-family: var(--font-family-monospace); +} + +/* + abbr element "tooltip" for mobile + heavily modified from https://bitsofco.de/making-abbr-work-for-touchscreen-keyboard-mouse/ +*/ +abbr[title]:focus::after { + content: attr(title); + background-color: #1e1e1e; + color: #fff; + border-radius: 0.125em; + box-shadow: 1px 1px 5px 0 rgba(0, 0, 0, 0.4); + font-size: smaller; + padding: 0.5em; + display: block; +} + /* Container-type helper classes */ @@ -304,6 +398,12 @@ textarea:invalid { width: 100%; } +.motto-wrapper { + display: block; + flex: 1 0 30vh; + margin-bottom: 1em; +} + .motto { position: relative; display: grid; @@ -313,6 +413,7 @@ textarea:invalid { font-weight: 600; text-shadow: 0 0 10px rgba(0, 0, 0, 0.33); width: 100%; + height: 100%; padding: 0 0 0.5em 0; border-radius: 0.25rem; z-index: 10; @@ -340,6 +441,7 @@ textarea:invalid { .motto .motto-inside h1 { background-color: var(--motto-background); + padding: 0.5rem; } .card { @@ -351,11 +453,23 @@ textarea:invalid { margin: 1rem 0; padding: 0.5rem; padding-top: 0; - position: relative; display: flex; flex-direction: column; } +.card-content { + display: flex; + flex-direction: column; + flex-grow: 1; +} + +.card-header { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-grow: 1; +} + .card-link { white-space: nowrap; display: inline-flex; @@ -363,22 +477,26 @@ textarea:invalid { align-items: center; text-underline-offset: 0.25em; backface-visibility: hidden; - margin: 0 0.5em; + margin: 0.1em 0.25em; + padding: 0.33em; + padding-right: 0.45em; +} + +.card-body { + margin-top: 0.33em; } .category-button { - position: absolute; - top: 1em; - right: 1em; display: grid; + align-items: center; + justify-items: center; color: white; background-color: var(--ear-tag-red); border-radius: 0.5em; padding: 1em; -} - -.card-title a h3 { - margin-right: 3.5em; + margin: 1em; + height: 2em; + aspect-ratio: 1 / 1; } .card-title > a { @@ -421,6 +539,118 @@ textarea:invalid { fill: currentColor; } +.account-bucket { + display: grid; + grid-template-columns: 3em 1em 1fr; + background-color: var(--container-background-alt); + padding: 1em 0; + border-radius: 0.5em; + border-color: var(--container-border-alt); + border-style: solid; + color: light-dark(white, black); + margin: 1em 0; + align-items: center; +} + +.account-bucket h3 { + align-self: center; + writing-mode: sideways-lr; +} + +.account-bucket details { + grid-column: 3; +} + +.account-bucket .crypto-list { + grid-column: 3; + max-width: 100%; +} + +.account-list { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + width: calc(100% - 1.5em); +} + +.account-bucket .account-list { + grid-column: 3; +} + +.account-list a { + font-size: xx-large; + text-decoration: none; + color: inherit; + padding: 0.5em; +} + +.account-list a:hover { + background-color: var(--container-background); + border-color: var(--container-border); + border-width: 2.5px; + border-radius: 0.5em; + border-style: solid; + padding: calc(0.5em - 2.5px); +} + +figcaption .mono { + color: light-dark(black, white); + overflow-wrap: anywhere; +} + +.crypto-list details { + max-width: 100%; +} + +.character-dialog { + display: grid; + width: calc(100% - 1rem); + grid-template-columns: 5rem 1fr; + grid-template-rows: auto auto; + gap: 1em; + margin: 0.5rem; +} + +.character-avatar { + display: grid; + max-width: 100%; + grid-row: 1 / span 2; + grid-column: 1; + align-self: start; + align-items: center; + justify-items: center; + min-width: 5rem; + min-height: 5rem; + border-radius: 5rem; + align-items: center; + border-style: solid; + border-color: var(--nav-button-background-hover); + background-color: var(--cowhide-2); +} + +.character-avatar > img { + max-width: 4rem; + max-height: 4rem; +} + +.character-dialog-bubble { + display: grid; + grid-template-rows: auto auto; + align-self: start; + border-radius: 0.5em; + border-width: 0.2rem; + border-color: var(--nav-button-background); + border-style: outset; + row-gap: 0.5rem; + padding: 0.5rem; + background-color: var(--container-border); + min-height: 5rem; +} + +.character-dialog-title { + font-weight: bolder; +} + /* Helper classes */ @@ -431,6 +661,9 @@ textarea:invalid { .img-fluid { max-width: 100%; height: auto; + display: grid; + align-items: center; + justify-items: center; } .float-left { @@ -443,6 +676,68 @@ textarea:invalid { max-width: 100%; } +.pagination { + display: flex; + justify-content: center; + gap: 0.5em; + padding-left: 0; +} + +.pagination li { + list-style-type: none; + color: var(--nav-button-text); +} + +.pagination li a { + color: var(--page-button-text); + background-color: var(--page-button-background); + border-radius: 0.05rem; + border-style: outset; + border-width: 0.2rem; + border-color: var(--page-button-background); + width: 2rem; + max-width: 1.8vw; + aspect-ratio: 1 / 1; + display: flex; + justify-content: center; + align-items: center; + margin: 0.2rem; + text-decoration: none; + padding: 0 0.2rem; + font-family: var(--font-family-system-ui); +} + +.pagination li a:hover { + background-color: var(--page-button-background-hover); +} + +.pagination li.active a { + background-color: var(--page-button-background-active); +} + +.pagination li.disabled a { + cursor: not-allowed; + background-color: var(--page-button-background-disabled); + color: var(--page-button-text-disabled); + border-style: solid; +} + +.mono { + font-family: var(--font-family-monospace); + font-weight: 600; +} + +.bolder { + font-weight: bolder; + background-color: rgba(0, 0, 0, 0.33); + border-radius: 0.25em; +} + +/* Specific elements */ +#content { + flex: 1 0 max-content; +} + /* Desktop screen size adjustments */ @@ -480,6 +775,15 @@ textarea:invalid { flex-direction: row; } + .person-profile { + position: sticky; + top: 0; + width: 300px; + min-width: 20vw; + max-width: 30vw; + margin-bottom: 5vh; + } + /* Helper classes */ @@ -501,20 +805,19 @@ textarea:invalid { margin-right: 1rem; } - .card-header { + .card-thumbnail { width: 20vw; flex-shrink: 0; } - .card-body { - margin-left: 1rem; + .card-thumbnail:not( + :has(~ .card-content > .card-header > .card-title > .dt-published) + ) { + width: 10vw; } - .bolder { - font-weight: bolder; - background-color: rgba(0, 0, 0, 0.33); - border-radius: 0.25em; - padding: 0.25em 0.75em 0.5em 0.33em; + .card-content { + margin-left: 1rem; } /* @@ -534,79 +837,3 @@ textarea:invalid { clear: both; } } /* end @media */ - -@media (prefers-reduced-motion: no-preference) { - @supports (animation-timeline: scroll()) and (animation-range: 0 50vh) { - @keyframes sticky-header { - from { - height: 50vh; - top: 6rem; - } - - to { - height: 10vh; - top: -1rem; - } - } - - @keyframes blurry-header { - from { - filter: blur(0); - } - - to { - filter: blur(2px); - } - } - - @keyframes transparent-text-bg { - from { - background-color: var(--motto-background); - } - to { - background-color: rgba(0, 0, 0, 0); - } - } - - main, - footer { - position: relative; - top: 55vh; - } - - .motto { - position: fixed; - top: 12rem; - - animation: sticky-header linear forwards; - animation-timeline: scroll(); - animation-range: 0 50vh; - } - - .motto::before { - filter: blur(12px); - - top: 2rem; - - animation: blurry-header linear forwards; - animation-timeline: scroll(); - animation-range: 0 50vh; - } - - .motto-inside h1 { - animation: transparent-text-bg linear forwards; - animation-timeline: scroll(); - animation-range: 0 40vh; - } - - @media (min-width: 768px) { - .motto { - width: calc(100% - 8rem); - } - - .motto::before { - top: 0; - } - } - } /* end @supports */ -} /* end @media */ diff --git a/assets/styles/scrolling-header.css b/assets/styles/scrolling-header.css new file mode 100644 index 0000000..acc8a4b --- /dev/null +++ b/assets/styles/scrolling-header.css @@ -0,0 +1,68 @@ +@media (prefers-reduced-motion: no-preference) { + @supports (animation-timeline: scroll()) and (animation-range: 0 50vh) { + @keyframes sticky-header { + from { + flex-basis: 30vh; + } + + to { + flex-basis: 0; + } + } + + .motto-wrapper { + position: sticky; + top: 0; + z-index: 100; + + animation: sticky-header linear forwards; + animation-timeline: scroll(); + animation-range: 0 30vh; + + contain: content; + } + + @keyframes blurry-header { + from { + filter: blur(0); + } + + to { + filter: blur(3.5px); + } + } + + .motto::before { + animation: blurry-header linear forwards; + animation-timeline: scroll(); + animation-range: 0 30vh; + } + + @keyframes transparent-text-bg { + from { + background-color: var(--motto-background); + text-shadow: 0 0 10px rgba(0, 0, 0, 0.33); + } + to { + background-color: rgba(0, 0, 0, 0); + text-shadow: 0 0 10px rgba(0, 0, 0, 1); + } + } + .motto-inside h1 { + animation: transparent-text-bg linear forwards; + animation-timeline: scroll(); + animation-range: 0 30vh; + } + + .motto-inside h1 small { + display: block; + font-size: calc(1vh + 1vw); + line-height: calc(1vh + 1vw); + } + + main section { + margin: 0 0.25em; + contain: content; + } + } /* end @supports */ +} /* end @media */ diff --git a/config.toml b/config.toml index d394723..8a730b3 100644 --- a/config.toml +++ b/config.toml @@ -1,7 +1,9 @@ baseURL = "https://millironx.com" languageCode = "en-us" -title = "MillironX" -paginate = 5 +title = "Milliron X" + +[pagination] +pagerSize = 5 [build] writeStats = true @@ -9,42 +11,47 @@ writeStats = true [Params] cardImage = "saddles" motto = "" +images = ["saddles.jpg"] +categories = [] [taxonomies] people = "people" tag = "tags" category = "categories" -[module] +[mediaTypes] -[[module.mounts]] -source = "static" -target = "static" +[mediaTypes."application/atom+xml"] +suffixes = ["xml"] -[[module.mounts]] -source = "assets/graphics" -target = "assets/graphics" +[outputs] +home = ["atom", "html", "manifest"] +page = ["html"] +section = ["html", "atom"] +term = ["html", "atom"] -[[module.mounts]] -source = "assets/images" -target = "assets/images" +[outputFormats] -[[module.mounts]] -source = "assets/scripts" -target = "assets/scripts" +[outputFormats.atom] +mediaType = "application/atom+xml" +baseName = "feed" -[[module.mounts]] -source = "assets/styles" -target = "assets/styles" +[outputFormats.manifest] +name = "manifest" +baseName = "manifest" +mediaType = "application/json" +notAlternative = "true" -[[modules.mounts]] -source = "assets/scripts/custom" -target = "assets/scripts/custom" +[markup] -[[module.mounts]] -source = "./node_modules/jquery/dist" -target = "assets/scripts/jquery" +[markup.goldmark] -[[module.mounts]] -source = "./node_modules/jquery-mask-plugin/dist" -target = "assets/scripts/jquery-mask-plugin" +[markup.goldmark.parser] + +[markup.goldmark.parser.attribute] +block = true + +[markup.goldmark.renderHooks] + +[markup.goldmark.renderHooks.link] +enableDefault = true diff --git a/content/_index.md b/content/_index.md index aae5dd7..1cfe790 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,12 +1,11 @@ --- -title: Home cardImage: charolette cardImageDescription: She almost looks like she's in her native country again. motto: My name is Thomas Christensen
I am Milliron X description: The homepage of Thomas A. Christensen II -layout: _default/list menu: main: + name: Home params: icon: home weight: -1000 @@ -29,58 +28,3 @@ to a sense of withholding, prestige, and power. Together, these two symbols represent the qualities I strive for in each of my works: authenticity, originality, power, depth, and prestige. - -## Who am I? - -{{< imgproc me-and-lady Resize "768x" "float-right" >}} Image courtesy -[Guy McCutcheon Photography](https://www.guymccutcheon.com/) {{< /imgproc >}} - -I am - -- 🧬 A bioinformatician (by profession) -- 📐 An engineer (by education) -- 🐂 A rancher (by lifestyle) -- 🖥️ A techie (self-taught) -- 🎥 And a filmmaker (at heart) - -I've got a soft spot for Brown Swiss dairy cows (just in case you couldn't tell -by the pictures), and am sometimes called "one of those crazy, Wyoming dairy cow -people." I love anything to do with cattle or technology, but especially -anything to do with both of them. - -_{{< abbr "Born again, fundamentalist, dispensationalist, King James Bible-believing, independent Baptist" >}}Christian{{< /abbr >}}, -American, Convervative, Pro-gun, Heterosexual - any questions?_ - -## Where am I? - -{{< imgproc wy-in-ks Resize "768x" "float-left" / >}} - -I am a Wyomingite sojurning in Kansas. That ought to lead to some interesting -stories. - -Around the web you can find me at (in order of subjective importance) - -- {{< fa github >}} GitHub: [@MillironX](https://github.com/MillironX) -- {{< fa orcid >}} ORDiD: - [0000-0003-1219-9320](https://orcid.org/0000-0003-1219-9320) -- {{< fa gitlab >}} GitLab: [@MillironX](https://gitlab.com/MillironX) -- {{< fa vimeo >}} Vimeo: - [Thomas Christensen II](https://vimeo.com/tchristensenii) -- {{< fa stack-overflow >}} StackExchange: - [Milliron X](https://stackexchange.com/users/4863541/milliron-x) -- {{< fa steam >}} Steam: [MillironX](https://steamcommunity.com/id/millironx) - -This list is intended to verify my identity on other sites. Please do _not_ use -it as fodder to try and "follow" me on each of these platforms. I stand with -RMS: - -{{< blockquote "Richard Stallman _in_ [If you feel your organization needs a 'presence' in Facebook](https://stallman.org/facebook-presence.html)" >}} -Facebook is a bad place for a person to be. When people find us on Facebook, we -lead them away from Facebook and then talk with them elsewhere. -{{< /blockquote >}} - -I typically don't respond to inquiries made on these platforms. Please use -[my contact form](/contact), instead. - - - diff --git a/content/academia/_index.md b/content/academia/_index.md index 10e4083..ea2eb55 100644 --- a/content/academia/_index.md +++ b/content/academia/_index.md @@ -14,13 +14,15 @@ menu: fa-thumbnail: university --- -> I have spent too long in school and not enough time in the middle of nowhere -> -> -- Baxter Black, DVM - During my time in academia, I have amassed a few notable accomplishments. Of course, as the old saying goes, "if it isn't published, then it never happened," -so here is a list of everything that actually happened. Several of these -articles are also available on -[my Google Scholar page](https://scholar.google.com/citations?user=gbP4RDgAAAAJ), -but this is the complete list. +so here is a list of everything that actually happened. + +Academia is not the be-all and end-all of life (contrary to what your professor +might have told you). I've found the side-effects to be similar to this guy's: + + +> I have spent too long in school and not enough time in the middle of nowhere, +> and it has inhibited my ability to learn the simple things. +{author="Baxter Black, DVM"} + diff --git a/content/academia/bpv-genetics.md b/content/academia/bpv-genetics.md new file mode 100644 index 0000000..edd678f --- /dev/null +++ b/content/academia/bpv-genetics.md @@ -0,0 +1,42 @@ +--- +title: "Genetic analysis of bovine papillomas" +date: 2024-09-19 +categories: + - poster +people: + - Thomas A. Christensen II + - Rachel Palinski + - Bob Gentry +journal: + "National Association of Animal Breeders Technical Conference Student Poster + session" +location: "Middleton, Wisconsin" +--- + +Bovine papillomavirus (BPV) is a major cause of reproductive failure in cattle. +In bulls, penile papillomas caused by BPV may cause reluctance to breed, and is +always a cause to fail an animal on a breeding soundness exam. Historically, it +has been thought that BPV was transmitted via direct contact and could be +controlled by managing clinically presenting animals in the herd, but more +recent evidence suggests alternative modes of transmission. BPV has been found +repeatably in clinically healthy animals, and in non-cutaneous secretions +including milk, blood, urine and semen. Currently, no commercially available BPV +vaccine uses isolated viral particles and naturally occurring virus does not +produce cross-protective immunity. In order to develop a proper vaccine for +penile papillomas further studies are required to understand the epidemiology of +BPV in herds. While vulvar, cutaneous, and mammary papillomas have been +genotyped in recent years, this information is not available for penile +papillomas. In this study there were 31 submissions, collected from 7 states, +NE, KS, NY, TX, AL, MO and SD (14 different cattle operations) Samples were +collected between August of 2022 and April 2024. Twenty-two submissions were +penile papillomas and with pooling of samples represented over 50 penile +papillomas. Samples were metagenomically sequenced at the Kansas State +Veterinary Diagnostic Lab, and the genotype of each sample was determined using +the phylogenetic analysis. The clade of each sample was determined by aligning +consensus sequences of the L1 gene (used for both for phylogeny and as a vaccine +target) using MAFFT and a maximum-likelihood phylogeny generated in Mega X. +Analysis found that all penile papilloma submissions were composed of BPV type +2, with one sample showing co-infection with BPV type 1. Conversely, cutaneous +and teat papillomas had BPV genotypes that were more variable with genotypes of +1,2,7,12,14,29 and 40. These results indicate that BPV type 2 and type 1 provide +a unified target for bovine penile papilloma vaccine development. diff --git a/content/academia/got-warts-naab.md b/content/academia/got-warts-naab.md new file mode 100644 index 0000000..adea3d8 --- /dev/null +++ b/content/academia/got-warts-naab.md @@ -0,0 +1,14 @@ +--- +title: + "Got Warts? Bovine Papillomavirus Pathogenesis, Transmission, and Vaccination" +date: 2024-09-19 +featured: false +categories: + - presentation +people: + - Bob Gentry + - Thomas A. Christensen II +journal: + "National Association of Animal Breeders Technical Conference Sponsor session" +location: "Middleton, Wisconsin" +--- diff --git a/content/academia/metagenomics/thumbnail.jpg b/content/academia/metagenomics/thumbnail.jpg new file mode 100644 index 0000000..b952da2 Binary files /dev/null and b/content/academia/metagenomics/thumbnail.jpg differ diff --git a/content/academia/pva-aiche/thumbnail.jpg b/content/academia/pva-aiche/thumbnail.jpg new file mode 100644 index 0000000..80f1c8e Binary files /dev/null and b/content/academia/pva-aiche/thumbnail.jpg differ diff --git a/content/academia/taxprofiler.md b/content/academia/taxprofiler.md index 88c62e4..b629a8a 100644 --- a/content/academia/taxprofiler.md +++ b/content/academia/taxprofiler.md @@ -1,6 +1,7 @@ --- title: - "nf-core/taxprofiler: highly parallelised and flexible pipeline for metagenomic taxonomic classification and profiling" + "nf-core/taxprofiler: highly parallelised and flexible pipeline for + metagenomic taxonomic classification and profiling" date: 2023-10-23 featured: true tags: @@ -16,9 +17,25 @@ people: - Maxime Borry - Mahwash Jamy - nf-core community - - James A. Fellows Yate + - James A. Fellows Yates link: https://doi.org/10.1101/2023.10.20.563221 journal: bioRxiv --- -Metagenomic classification tackles the problem of characterising the taxonomic source of all DNA sequencing reads in a sample. A common approach to address the differences and biases between the many different taxonomic classification tools is to run metagenomic data through multiple classification tools and databases. This, however, is a very time-consuming task when performed manually - particularly when combined with the appropriate preprocessing of sequencing reads before the classification. Here we present nf-core/taxprofiler, a highly parallelised read-processing and taxonomic classification pipeline. It is designed for the automated and simultaneous classification and/or profiling of both short- and long-read metagenomic sequencing libraries against a 11 taxonomic classifiers and profilers as well as databases within a single pipeline run. Implemented in Nextflow and as part of the nf-core initiative, the pipeline benefits from high levels of scalability and portability, accommodating from small to extremely large projects on a wide range of computing infrastructure. It has been developed following best-practise software development practises and community support to ensure longevity and adaptability of the pipeline, to help keep it up to date with the field of metagenomics. +Metagenomic classification tackles the problem of characterising the taxonomic +source of all DNA sequencing reads in a sample. A common approach to address the +differences and biases between the many different taxonomic classification tools +is to run metagenomic data through multiple classification tools and databases. +This, however, is a very time-consuming task when performed manually - +particularly when combined with the appropriate preprocessing of sequencing +reads before the classification. Here we present nf-core/taxprofiler, a highly +parallelised read-processing and taxonomic classification pipeline. It is +designed for the automated and simultaneous classification and/or profiling of +both short- and long-read metagenomic sequencing libraries against a 11 +taxonomic classifiers and profilers as well as databases within a single +pipeline run. Implemented in Nextflow and as part of the nf-core initiative, the +pipeline benefits from high levels of scalability and portability, accommodating +from small to extremely large projects on a wide range of computing +infrastructure. It has been developed following best-practise software +development practises and community support to ensure longevity and adaptability +of the pipeline, to help keep it up to date with the field of metagenomics. diff --git a/assets/images/library.jpg b/content/academia/thumbnail.jpg similarity index 100% rename from assets/images/library.jpg rename to content/academia/thumbnail.jpg diff --git a/content/academia/yavsap/index.md b/content/academia/yavsap/index.md new file mode 100644 index 0000000..3ffc79c --- /dev/null +++ b/content/academia/yavsap/index.md @@ -0,0 +1,54 @@ +--- +title: "YAVSAP: versatile viral quasispecies analysis for veterinary samples" +date: 2024-03-05 +featured: false +categories: + - presentation +people: + - Thomas A. Christensen II + - Steven Stancic + - Andrea Lu + - Dana Mitzel + - William Wilson + - Rachel Palinski +journal: "Phi Zeta Research Day" +location: "Manhattan, Kansas" +tags: + - virus + - quasispecies + - next-generation sequencing + - pipeline +awards: + - "2nd Place Large Animal Applied Research Presentation" +link: "/academia/yavsap/yavsap.pdf" +--- + +Viral populations within an infected host are composed of viral particles with a +spectrum of genetic mutations rather than a unified genome. This phenomenon is +referred to as viral "quasispecies," and has been useful for the understanding +of viral transmission and early detection of new viral variants. Next generation +sequencing (NGS) has enabled the study of these quasispecies for many viral +species, notably Influenza A and B, Human Immunodeficiency Virus (HIV), Foot and +Mouth Disease Virus (FMDV), and Severe Acute Respiratory Syndrome Coronavirus 2 +(SARS CoV2), and established protocols and computer analysis tools have been +developed for these species. Some of the most important viruses, such as +emerging and exotic disease agents, however, do not have replicatable protocols +or software tools capable of producing valid output from their sequence data. +Here, we present Yet Another Viral Subspecies Analysis Pipeline (YAVSAP). YAVSAP +is a fully automated bioinformatic pipeline built from the ground up to identify +and analyze viral quasispecies of any arbitrary virus in human and veterinary +samples. YAVSAP provides reference-based genome mapping of both long- and +short-read sequencing reads to any reference genome that the user chooses, +identifies subconsensus variants and haplotypes, and assesses the phylogenies of +all viral sequences found within a sample. YAVSAP is written in Nextflow and +conforms to the nf-core initiative's standards, which allows it to run on +low-end computers, high performance computing (HPC) clusters, or anything in +between with zero configuration. YAVSAP has been tested on viruses of interest +to veterinary medicine and public health, including Japanese Encephalitis Virus +(JEV), Influenza D Virus (IDV), Bovine Coronavirus (BCoV), SARS CoV2, and Rift +Valley Fever Virus (RVFV), and can correctly identify consensus genomes and +quasispecies within samples containing each of these viruses. This tool provides +a means for biologists with little bioinformatic experience to analyze deep +sequence data while correcting for many of the pitfalls associated with previous +and current analysis platforms. YAVSAP is open source software and is publicly +available at https://github.com/ksumngs/yavsap. diff --git a/content/academia/yavsap/yavsap.pdf b/content/academia/yavsap/yavsap.pdf new file mode 100644 index 0000000..14462c7 Binary files /dev/null and b/content/academia/yavsap/yavsap.pdf differ diff --git a/content/blogroll/_index.md b/content/blogroll/_index.md index 2a17fb5..307a619 100644 --- a/content/blogroll/_index.md +++ b/content/blogroll/_index.md @@ -1,5 +1,15 @@ --- -draft: true +title: "Blogroll" +menu: + main: + name: Blogroll + params: + icon: scroll + weight: -800 +cardImage: eclipse +cardImageDescription: | + Randall Monroe was right. Eclipses are way cooler than they sound. +suppressRss: true --- ## Stuff I like on the internet @@ -7,39 +17,4 @@ draft: true This section of a website used to be called a "blogroll." I don't know what it's called now. In order to be on this list, I must have been subscribed or otherwise follow it for over a year. It's amazing how little stuff on the -internet can't make that cut. - -### [Thru the Bible](https://ttb.org/) - -I'm convinced that the word of God is timeless, and we need less commentary and -cherry-picking of favorite verses, and more study of the complete Bible. Dr. -McGee does just that. - -### [Enoch the Cow Vet](https://youtube.com/channel/UC6PPmHUbcdOSzX5tLB3uXdw) - -A veterinarian/agricultural channel that doesn't make me cringe. "God built -these things for cows for vets ... [there are] so many aspects of the cow that -are just designed for vets." Amen, Enoch. Amen. - -### [Proglogion](https://blog.drwile.com/) - -The blog of my high school science teacher (of sorts). It is refreshing to find -a creationist who can still think critically. I love his "bad sermon -illustrations" posts. - -### [The Milk Check](https://www.jacoby.com/learning-center/podcasts-overview/) - -A pragmatic inside look at dairy marketing. I only understand half of what -they're talking about, but I learn something new every episode. - -### [Brian Harry's Blog](https://devblogs.microsoft.com/bharry/) - -Where else are you going to find a blog about cows _and_ version control? The -blog is basically dead now, but it's still fun to go back and read the farm -stories. - -### [Car Talk](https://cartalk.com/) - -The antics of these guys are enough to make anyone have to pull over to the side -of the road from laughing too much. I dread the day when NPR fully axes the only -good program to cross their airwaves. +internet can make that cut. diff --git a/content/blogroll/brian-harry/index.md b/content/blogroll/brian-harry/index.md new file mode 100644 index 0000000..a75e0bd --- /dev/null +++ b/content/blogroll/brian-harry/index.md @@ -0,0 +1,8 @@ +--- +title: Brian Harry's blog +link: https://devblogs.microsoft.com/bharry/ +--- + +Where else are you going to find a blog about cows _and_ version control? The +blog is basically dead now, but it's still fun to go back and read the farm +stories. diff --git a/content/blogroll/brian-harry/thumbnail.png b/content/blogroll/brian-harry/thumbnail.png new file mode 100644 index 0000000..98cd5b5 Binary files /dev/null and b/content/blogroll/brian-harry/thumbnail.png differ diff --git a/content/blogroll/car-talk/index.md b/content/blogroll/car-talk/index.md new file mode 100644 index 0000000..ee66c77 --- /dev/null +++ b/content/blogroll/car-talk/index.md @@ -0,0 +1,8 @@ +--- +title: Car Talk +link: https://cartalk.com +--- + +The antics of these guys are enough to make anyone have to pull over to the side +of the road from laughing too much. I dread the day when NPR fully axes the only +good program to cross their airwaves. diff --git a/content/blogroll/car-talk/thumbnail.jpg b/content/blogroll/car-talk/thumbnail.jpg new file mode 100644 index 0000000..d09dcaf Binary files /dev/null and b/content/blogroll/car-talk/thumbnail.jpg differ diff --git a/content/blogroll/enoch-the-cow-vet/index.md b/content/blogroll/enoch-the-cow-vet/index.md new file mode 100644 index 0000000..0e3f074 --- /dev/null +++ b/content/blogroll/enoch-the-cow-vet/index.md @@ -0,0 +1,8 @@ +--- +title: Enoch the Cow Vet +link: https://youtube.com/channel/UC6PPmHUbcdOSzX5tLB3uXdw +--- + +A veterinarian/agricultural channel that doesn't make me cringe. "God built +these things for cows for vets ... [there are] so many aspects of the cow that +are just designed for vets." Amen, Enoch. Amen. diff --git a/content/blogroll/enoch-the-cow-vet/thumbnail.jpg b/content/blogroll/enoch-the-cow-vet/thumbnail.jpg new file mode 100644 index 0000000..3e99c2f Binary files /dev/null and b/content/blogroll/enoch-the-cow-vet/thumbnail.jpg differ diff --git a/content/blogroll/proslogion/index.md b/content/blogroll/proslogion/index.md new file mode 100644 index 0000000..f73002f --- /dev/null +++ b/content/blogroll/proslogion/index.md @@ -0,0 +1,8 @@ +--- +title: Proslogion +link: https://blog.drwile.com +--- + +The blog of my high school science teacher (of sorts). It is refreshing to find +a creationist who can still think critically. I love his "bad sermon +illustrations" posts. diff --git a/content/blogroll/proslogion/thumbnail.jpg b/content/blogroll/proslogion/thumbnail.jpg new file mode 100644 index 0000000..2369d6c Binary files /dev/null and b/content/blogroll/proslogion/thumbnail.jpg differ diff --git a/content/blogroll/thru-the-bible/index.md b/content/blogroll/thru-the-bible/index.md new file mode 100644 index 0000000..9863380 --- /dev/null +++ b/content/blogroll/thru-the-bible/index.md @@ -0,0 +1,8 @@ +--- +title: Thru the Bible +link: https://ttb.org +--- + +I'm convinced that the word of God is timeless, and we need less commentary and +cherry-picking of favorite verses, and more study of the complete Bible. Dr. +McGee does just that. diff --git a/content/blogroll/thru-the-bible/thumbnail.jpg b/content/blogroll/thru-the-bible/thumbnail.jpg new file mode 100644 index 0000000..87c7d57 Binary files /dev/null and b/content/blogroll/thru-the-bible/thumbnail.jpg differ diff --git a/assets/images/eclipse.jpg b/content/blogroll/thumbnail.jpg similarity index 100% rename from assets/images/eclipse.jpg rename to content/blogroll/thumbnail.jpg diff --git a/content/code/_content.gotmpl b/content/code/_content.gotmpl new file mode 100644 index 0000000..2992e8b --- /dev/null +++ b/content/code/_content.gotmpl @@ -0,0 +1,75 @@ +{{ $data := dict }} +{{ $url := "https://code.millironx.com/api/v1/users/millironx/repos" }} +{{ with try (resources.GetRemote $url) }} + {{ with .Err }} + {{ errorf "Unable to get remote resource %s: %s" $url . }} + {{ else with .Value }} + {{ $data = . | transform.Unmarshal }} + {{ end }} +{{ else }} + {{ errorf "Unable to get remote resource %s" $url }} +{{ end }} + +{{ range $data }} + {{/* Get tags of this repository. To quote Steve Edstrom, "If it doesn't have a + tag, it doesn't count." + */}} + {{ $tagUrl := print "https://code.millironx.com/api/v1/repos/millironx/" .name "/tags" }} + {{ $tagData := dict }} + {{ with try (resources.GetRemote $tagUrl) }} + {{ with .Err }} + {{ errorf "Unable to get remote resource %s: %s" $tagUrl . }} + {{ else with .Value }} + {{ $tagData = . | transform.Unmarshal }} + {{ end }} + {{ else }} + {{ errorf "Unable to get remote resource %s" $tagUrl }} + {{ end }} + + {{ $firstTag := index $tagData 0 }} + + {{ if $firstTag }} + {{ $dates := dict "date" (time.AsTime $firstTag.commit.created) }} + + {{ $content := dict "mediaType" "text/markdown" "value" .description }} + {{ $categories := slice "code" }} + {{ $people := slice "Thomas A. Christensen II" }} + {{ $link := .html_url }} + {{ $featured := (gt .stars_count 0) }} + {{ $tags := .topics }} + {{ $params := dict + "categories" $categories + "people" $people + "link" $link + "featured" $featured + "tags" $tags + }} + {{ $page := dict + "content" $content + "dates" $dates + "title" .name + "path" .name + "params" $params + }} + {{ $.AddPage $page }} + + {{ $item := . }} + {{ with $url := $item.avatar_url }} + {{ with resources.GetRemote $url }} + {{ with .Err }} + {{ errorf "Unable to get remote resource %s: %s" $url . }} + {{ else }} + {{ $content := dict "mediaType" .MediaType.Type "value" .Content }} + {{ $resource := dict + "content" $content + "path" (print $item.name "/thumbnail." .MediaType.SubType) + }} + {{ $.AddResource $resource }} + {{ end }} + {{ else }} + {{ errorf "Unable to get remote resource %s" $url }} + {{ end }} + {{ end }} + {{ end }} + +{{ end }} diff --git a/content/code/_index.md b/content/code/_index.md new file mode 100644 index 0000000..c7c7df5 --- /dev/null +++ b/content/code/_index.md @@ -0,0 +1,14 @@ +--- +title: Coding projects +menu: + main: + name: Code + params: + icon: code + link: https://code.millironx.com + weight: 50 +fa-thumbnail: code +link: https://code.millironx.com +--- + +A Forgejo instance dedicated to cows and technology diff --git a/content/contact/_index.html b/content/contact/_index.html index 79d864c..3d73f4f 100644 --- a/content/contact/_index.html +++ b/content/contact/_index.html @@ -15,12 +15,21 @@ menu: weight: 1 fa-thumbnail: file-signature validation: true +suppressRss: true --- + +
Contact Me - + + + +
+