From 04dd91c400a243bb0ef9b75029261781adabaa6e Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Sat, 2 Apr 2022 21:41:21 -0400
Subject: [PATCH 01/16] Compress all output files for a rep.
An item rep may be written to multiple places, and currently only
one of them gets compressed by the gzip rule.
Unfortunately while nanoc maintains a complete output list internally,
it is not exposed in the documented API. But it's not too hard to pull
out the guts and get the full list in order to compress everything.
---
Rules | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/Rules b/Rules
index 2256153..365e83a 100644
--- a/Rules
+++ b/Rules
@@ -75,16 +75,17 @@ end
postprocess do
# Gzip all text items for nginx http_static
- if !ENV['GZIP_SITE'].to_s.empty?
+ gzip_site = !ENV['GZIP_SITE'].to_s.empty?
+ if gzip_site
reps = @items.flat_map(&:reps).each do |rep|
- file = rep.raw_path
- next if !file or rep.binary?
-
- if system("gzip", "-ck9", file, [:out]=>[file + ".gz.tmp", "wb"])
- system("touch", "-r", file, file + ".gz.tmp")
- File.rename(file + ".gz.tmp", file + ".gz")
- else
- File.unlink(file + ".gz.tmp")
+ next if rep.binary?
+ rep.instance_variable_get(:@item_rep).raw_paths[:last].each do |f|
+ if system("gzip", "-nck9", f, [:out]=>["#{f}.gz.tmp", "wb"])
+ system("touch", "-r", f, "#{f}.gz.tmp")
+ File.rename("#{f}.gz.tmp", "#{f}.gz")
+ else
+ File.unlink("#{f}.gz.tmp")
+ end
end
end
end
@@ -222,8 +223,8 @@ end
compile '/gpg/*' do
filter :wkd_export_armor
write "/pubring/#{@item.identifier.components.last}.asc"
- write "/pubring/#{@item[:id64]}.asc" if item[:id64]
- write "/pubring/#{@item[:id32]}.asc" if item[:id32]
+ write "/pubring/#{@item[:id64]}.asc" if @item[:id64]
+ write "/pubring/#{@item[:id32]}.asc" if @item[:id32]
end
compile '/gpg/*', rep: :hu do
@@ -232,9 +233,7 @@ compile '/gpg/*', rep: :hu do
write "/pubring/wkd/" + @item[:wkd_hash]
end
end
-
-compile '/*.gpg' do
-end
+ignore '/*.gpg'
compile '/**/*.svg' do
filter :scour, comment_stripping: true
--
2.43.0
From 0d26554fd21870d620d2dcd5e6f289537581b6de Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Sun, 3 Apr 2022 16:02:51 -0400
Subject: [PATCH 02/16] Release cdecl99-1.2.
Maintenance release with fixes for portability issues and other
minor improvements.
---
content/archive/cdecl99/cdecl99-1.2.tar.gz | 1 +
content/archive/cdecl99/cdecl99-1.2.tar.gz.sig | 1 +
content/archive/cdecl99/cdecl99-1.2.tar.xz | 1 +
content/archive/cdecl99/cdecl99-1.2.tar.xz.sig | 1 +
content/projects/cdecl99.md | 4 ++--
gitmodules/cdecl99 | 2 +-
6 files changed, 7 insertions(+), 3 deletions(-)
create mode 120000 content/archive/cdecl99/cdecl99-1.2.tar.gz
create mode 120000 content/archive/cdecl99/cdecl99-1.2.tar.gz.sig
create mode 120000 content/archive/cdecl99/cdecl99-1.2.tar.xz
create mode 120000 content/archive/cdecl99/cdecl99-1.2.tar.xz.sig
diff --git a/content/archive/cdecl99/cdecl99-1.2.tar.gz b/content/archive/cdecl99/cdecl99-1.2.tar.gz
new file mode 120000
index 0000000..f2992a8
--- /dev/null
+++ b/content/archive/cdecl99/cdecl99-1.2.tar.gz
@@ -0,0 +1 @@
+../../../.git/annex/objects/2f/p1/SHA512-s966058--01e7f4c09c32beac469900895d0e3115ceb083bc1e273cff30cd9a7b0427359c826e7d20d0d578af92ee88598f66f629f8c756ac8b5fa38f5f930e0f77d2ac76/SHA512-s966058--01e7f4c09c32beac469900895d0e3115ceb083bc1e273cff30cd9a7b0427359c826e7d20d0d578af92ee88598f66f629f8c756ac8b5fa38f5f930e0f77d2ac76
\ No newline at end of file
diff --git a/content/archive/cdecl99/cdecl99-1.2.tar.gz.sig b/content/archive/cdecl99/cdecl99-1.2.tar.gz.sig
new file mode 120000
index 0000000..42a4117
--- /dev/null
+++ b/content/archive/cdecl99/cdecl99-1.2.tar.gz.sig
@@ -0,0 +1 @@
+../../../.git/annex/objects/pj/JW/SHA512-s310--d32edf921631e3af7fcc7aacb9579c32215f86696e83d4bbead5ed998b1ed786a640e5e16bc7b9bfbf25980907396f8d8510bca70d7039beb908a030b30f32c3/SHA512-s310--d32edf921631e3af7fcc7aacb9579c32215f86696e83d4bbead5ed998b1ed786a640e5e16bc7b9bfbf25980907396f8d8510bca70d7039beb908a030b30f32c3
\ No newline at end of file
diff --git a/content/archive/cdecl99/cdecl99-1.2.tar.xz b/content/archive/cdecl99/cdecl99-1.2.tar.xz
new file mode 120000
index 0000000..7330ce4
--- /dev/null
+++ b/content/archive/cdecl99/cdecl99-1.2.tar.xz
@@ -0,0 +1 @@
+../../../.git/annex/objects/wg/1j/SHA512-s634148--a24f095fd66e0c7fceb1b089de92d5a96d8d21c2c59d5f91da8374ca1465f65041d806bcd5cd1299778dd4d25204390f437b481f8cb07b9fa0a88cecf19185c2/SHA512-s634148--a24f095fd66e0c7fceb1b089de92d5a96d8d21c2c59d5f91da8374ca1465f65041d806bcd5cd1299778dd4d25204390f437b481f8cb07b9fa0a88cecf19185c2
\ No newline at end of file
diff --git a/content/archive/cdecl99/cdecl99-1.2.tar.xz.sig b/content/archive/cdecl99/cdecl99-1.2.tar.xz.sig
new file mode 120000
index 0000000..d70b59e
--- /dev/null
+++ b/content/archive/cdecl99/cdecl99-1.2.tar.xz.sig
@@ -0,0 +1 @@
+../../../.git/annex/objects/PV/QZ/SHA512-s310--204a5c7003d96860a28671778099578a2f89d5f0c5d8b0a0bf883762555f0db7ca202248630cf2c07858d86d7faf450f566103e94676cedcafbe0fbcafa7ac8f/SHA512-s310--204a5c7003d96860a28671778099578a2f89d5f0c5d8b0a0bf883762555f0db7ca202248630cf2c07858d86d7faf450f566103e94676cedcafbe0fbcafa7ac8f
\ No newline at end of file
diff --git a/content/projects/cdecl99.md b/content/projects/cdecl99.md
index c8ef5ba..c083ba5 100644
--- a/content/projects/cdecl99.md
+++ b/content/projects/cdecl99.md
@@ -1,9 +1,9 @@
---
title: Cdecl99
-copyright: 2021 Nick Bowler
+copyright: 2021-2022 Nick Bowler
license: gpl-3 or (at your option) any later version
module: cdecl99
-release: v1.1
+release: v1.2
---
<%= project_readme %>
diff --git a/gitmodules/cdecl99 b/gitmodules/cdecl99
index 6cc7c1a..ae2e55e 160000
--- a/gitmodules/cdecl99
+++ b/gitmodules/cdecl99
@@ -1 +1 @@
-Subproject commit 6cc7c1ad6a714b7ea8ae1445e502ec7ce4ecf4ab
+Subproject commit ae2e55ea361bf632ba771264e07ec674123b0446
--
2.43.0
From e39d97fade755e9b53e7dc0f7bd4320ade1b7b83 Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Mon, 9 May 2022 20:11:50 -0400
Subject: [PATCH 03/16] Attempt to improve focus ring styles in modern
browsers.
It seeems new browsers use a rather different focus ring style by
default from how it used to be. This means the focus rings in the
clicky table headers (which are made by CSS rules) don't look anything
like the focus rings on links.
To try and fix this, let's explicitly style all the focus rings to
be more like how they look by default in new browsers.
---
content/style.scss | 33 ++++++++++++++++++++++++---------
1 file changed, 24 insertions(+), 9 deletions(-)
diff --git a/content/style.scss b/content/style.scss
index 04736d8..d53717d 100644
--- a/content/style.scss
+++ b/content/style.scss
@@ -1,7 +1,7 @@
/*!
* Nick's web site: default stylesheet
*
- * Copyright © 2018-2021 Nick Bowler
+ * Copyright © 2018-2022 Nick Bowler
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -32,6 +32,8 @@ $annotationcolour: #708090;
$tableshadecolour: #f5f5f5;
+$focusringcolour: #628cb2;
+
@mixin header_size($maxwidth, $fontsize) {
font-size: $fontsize;
max-width: 1em * ($maxwidth / $fontsize);
@@ -48,6 +50,12 @@ a:link { color: $linkdefaultcolour; border-color: $linkdefaultcolour; }
a:visited { color: $linkvisitedcolour; border-color: $linkvisitedcolour; }
a:active { color: $linkactivecolour; border-color: $linkactivecolour; }
+@supports (outline-style: auto) {
+ a:link { border-width: 0; }
+ a:focus { outline: auto $focusringcolour; }
+ li, td, dt { &>a:link { border: solid 1px transparent; } }
+}
+
h1 { @include header_size(60em, 2em); }
h2 { @include header_size(60em, 1.5em); }
h5 { @include header_size(60em, 1em); }
@@ -275,10 +283,6 @@ $clickynames: name, date, size;
}
}
- &:focus ~ table th.clicky-#{$col}>label~label>span:first-child {
- border-color: $foregroundcolour;
- }
-
// Unhide to allow keyboard navigation
display: block !important;
pointer-events: none;
@@ -299,15 +303,22 @@ $clickynames: name, date, size;
}
}
- &:focus ~ table th.clicky-#{$col}>label~label .svg {
- border-color: $foregroundcolour;
- }
-
pointer-events: none;
position: absolute;
opacity: 0;
z-index: -2;
}
+
+ $focuslabel: ":focus ~ table th.clicky-#{$col}>label~label";
+ #{"input.clicky-#{$col+$focuslabel}"}>span:first-child
+ , #{"input.clicky-#{$col}-rev#{$focuslabel}"} .svg
+ {
+ border-color: $foregroundcolour;
+ @at-root { @supports (outline-style: auto) { & {
+ border-color: transparent;
+ outline: auto $focusringcolour;
+ }}}
+ }
}
thead.clicky label {
@@ -332,6 +343,10 @@ thead.clicky label {
&:active { color: $linkactivecolour; }
&:first-child:active>span, &~label:active>.svg {
border-color: $linkactivecolour;
+ @at-root { @supports (outline-style: auto) { & {
+ border-color: transparent;
+ outline: auto $focusringcolour;
+ }}}
}
.svg {
--
2.43.0
From 062c731462e3ec513b470308cc2dd475098ce231 Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Mon, 9 May 2022 23:35:57 -0400
Subject: [PATCH 04/16] Automatically adjust colour scheme for "dark mode".
Playing around a bit, let's try to respect "dark" mode in firefox and
support automatically switching colour scheme accordingly.
We convert all colour references in the stylesheet to new SASS mixins
that will generate rules to adapt to the correct colour scheme. The
selection is done using CSS variables that should gracefully degrade
to the original (light) colours.
---
Rules | 2 +-
content/style.scss | 96 ++++++++++++++--------
content/weblog/responsive-tables.md | 12 +--
layouts/default.xml | 6 +-
lib/colourmap.scss | 118 ++++++++++++++++++++++++++++
lib/scss-var.rb | 38 ++++++---
6 files changed, 219 insertions(+), 53 deletions(-)
create mode 100644 lib/colourmap.scss
diff --git a/Rules b/Rules
index 365e83a..b8538d8 100644
--- a/Rules
+++ b/Rules
@@ -210,7 +210,7 @@ compile '/images/*.jpg', rep: :info do
end
compile '/**/*.scss' do
- filter :sass, syntax: :scss
+ filter :sass, syntax: :scss, load_paths: ["."]
filter :css_source, uribase: \
"https://git.draconx.ca/gitweb/homepage.git/blob/" +
@item[:gitrev] + ":"
diff --git a/content/style.scss b/content/style.scss
index d53717d..5f2ef96 100644
--- a/content/style.scss
+++ b/content/style.scss
@@ -17,22 +17,23 @@
* along with this program. If not, see .
*/
-// colour definitions
-$backgroundcolour: #ffffff;
-$foregroundcolour: #000000;
+@import "lib/colourmap.scss";
-$linkdefaultcolour: #0000cd;
-$linkactivecolour: #ff0000;
-$linkvisitedcolour: #800080;
+@include defcolours
+ ( $background: #ffffff #000000
+ , $foreground: #000000 #ffffff
-$ruledefaultcolour: #d3d3d3;
-$rulestrongcolour: #696969;
+ , $linkdefault: #0000cd #a3aaff
+ , $linkactive: #ff0000
+ , $linkvisited: #800080 #e493f7
+ , $focusring: #628cb2
-$annotationcolour: #708090;
+ , $annotation: #708090
+ , $tableshade: #f5f5f5 #101010
-$tableshadecolour: #f5f5f5;
-
-$focusringcolour: #628cb2;
+ , $ruledefault: #d3d3d3 #494949
+ , $rulestrong: #696969 #939393
+ );
@mixin header_size($maxwidth, $fontsize) {
font-size: $fontsize;
@@ -40,19 +41,28 @@ $focusringcolour: #628cb2;
}
body {
- background-color: $backgroundcolour;
- color: $foregroundcolour;
font-family: sans-serif;
margin: 1em;
+
+ @include usecolours
+ ( $background-color: background
+ , $color: foreground
+ );
}
-a:link { color: $linkdefaultcolour; border-color: $linkdefaultcolour; }
-a:visited { color: $linkvisitedcolour; border-color: $linkvisitedcolour; }
-a:active { color: $linkactivecolour; border-color: $linkactivecolour; }
+a:link {
+ @include usecolours($color: linkdefault, $border-color: linkdefault);
+}
+a:visited {
+ @include usecolours($color: linkvisited, $border-color: linkvisited);
+}
+a:active {
+ @include usecolours($color: linkactive, $border-color: linkactive);
+}
@supports (outline-style: auto) {
a:link { border-width: 0; }
- a:focus { outline: auto $focusringcolour; }
+ a:focus { @include usecolour(outline, focusring, auto); }
li, td, dt { &>a:link { border: solid 1px transparent; } }
}
@@ -88,7 +98,7 @@ p.img {
}
small {
- color: $foregroundcolour;
+ @include usecolours($color: foreground);
text-align: justify;
@media (max-width: 24em) { text-align: left; }
padding: 0.5ex;
@@ -123,7 +133,7 @@ hr {
clear: both;
margin: 0.5em 0;
border: 0;
- border-top: 1px solid $ruledefaultcolour;
+ @include usecolour(border-top, ruledefault, 1px solid);
}
kbd {
@@ -141,16 +151,17 @@ kbd {
}
.permalink {
+ @include usecolours($color: annotation);
font-size: small;
- color: $annotationcolour;
a:link, a:visited { color: inherit; }
+ a:active { @include usecolours($color: linkactive); }
@media not screen { visibility: hidden; }
}
// General table styles.
table {
- border: 1px solid $ruledefaultcolour;
+ @include usecolour(border-top, ruledefault, 1px solid);
border-collapse: collapse;
width: 100%;
}
@@ -171,18 +182,20 @@ td, th {
margin: 0;
}
-thead>tr, tbody>tr { border: solid $ruledefaultcolour; }
-th, thead>tr { border-bottom: 1px solid $rulestrongcolour; }
-tbody+tbody { border-bottom: 1px solid $ruledefaultcolour; }
+thead>tr, tbody>tr { @include usecolour(border, ruledefault, solid); }
+th, thead>tr { @include usecolour(border-bottom, rulestrong, 1px solid); }
+tbody+tbody { @include usecolour(border-bottom, ruledefault, 1px solid); }
*>table, *>th { border: none; }
thead>tr { border-width: 1px; }
tbody>tr { border-width: 0 1px; }
-td + td { box-shadow: -1px 0 $backgroundcolour; }
+td + td {
+ @include usecolour(box-shadow, background, -1px 0);
+}
tbody>tr {
- &:nth-of-type(even) { background-color: $tableshadecolour; }
- &:last-child { border-bottom: solid 1px $ruledefaultcolour; }
+ &:nth-of-type(even) { @include usecolours($background-color: tableshade); }
+ &:last-child { @include usecolour(border-bottom, ruledefault, solid 1px); }
}
// Specific table styles
@@ -313,10 +326,10 @@ $clickynames: name, date, size;
#{"input.clicky-#{$col+$focuslabel}"}>span:first-child
, #{"input.clicky-#{$col}-rev#{$focuslabel}"} .svg
{
- border-color: $foregroundcolour;
+ @include usecolours($border-color: foreground);
@at-root { @supports (outline-style: auto) { & {
+ @include usecolour(outline, focusring, auto);
border-color: transparent;
- outline: auto $focusringcolour;
}}}
}
}
@@ -340,12 +353,12 @@ thead.clicky label {
padding-right: 2px;
}
- &:active { color: $linkactivecolour; }
+ &:active { @include usecolours($color: linkactive); }
&:first-child:active>span, &~label:active>.svg {
- border-color: $linkactivecolour;
+ @include usecolours($border-color: linkactive);
@at-root { @supports (outline-style: auto) { & {
+ @include usecolour(outline, focusring, auto);
border-color: transparent;
- outline: auto $focusringcolour;
}}}
}
@@ -414,7 +427,7 @@ table.filelist {
}
}
-#footer p { color: $annotationcolour; }
+#footer p { @include usecolours($color: annotation); }
#article-info p { font-style: italic; }
.wbr:after { content: "\200b"; }
@@ -440,3 +453,18 @@ ul.ordered > {
#sitetitle * { float: none; }
#footer { padding: 0 1em; }
}
+
+// page-specific dark mode styles
+@media (min-width: 35em) {
+ #page_weblog_responsive_tables {
+ @each $tN in t6 t7 t8 {
+ ##{$tN}>tbody>tr.#{$tN}-split {
+ @include usecolour_var_(border-bottom, ruledefault);
+
+ &:nth-of-type(odd) ~ tr:nth-of-type(odd) {
+ @include usecolour_var_(background-color, tableshade);
+ }
+ }
+ }
+ }
+}
diff --git a/content/weblog/responsive-tables.md b/content/weblog/responsive-tables.md
index 2063484..a668e16 100644
--- a/content/weblog/responsive-tables.md
+++ b/content/weblog/responsive-tables.md
@@ -272,12 +272,12 @@ are pretty easy to fix in the stylesheet.
#t6>thead, #t6>tbody { display: grid; }
#t6>tbody>tr.t6-split { border-bottom: 1px solid <%=
- scss_get_var(:ruledefaultcolour) %>; }
+ scss_get_colour(:ruledefault) %>; }
#t6>tbody>tr.t6-split:nth-of-type(odd) ~ tr:nth-of-type(even) {
background-color: initial;
}
#t6>tbody>tr.t6-split:nth-of-type(odd) ~ tr:nth-of-type(odd) {
- background-color: <%= scss_get_var(:tableshadecolour) %>;
+ background-color: <%= scss_get_colour(:tableshade) %>;
}
}
}
@@ -325,12 +325,12 @@ these techniques to [table 1](#t1).
#t7>thead, #t7>tbody { display: grid; }
#t7>tbody>tr.t7-split { border-bottom: 1px solid <%=
- scss_get_var(:ruledefaultcolour) %>; }
+ scss_get_colour(:ruledefault) %>; }
#t7>tbody>tr.t7-split:nth-of-type(odd) ~ tr:nth-of-type(even) {
background-color: initial;
}
#t7>tbody>tr.t7-split:nth-of-type(odd) ~ tr:nth-of-type(odd) {
- background-color: <%= scss_get_var(:tableshadecolour) %>;
+ background-color: <%= scss_get_colour(:tableshade) %>;
}
}
}
@@ -386,12 +386,12 @@ in a stylesheet. We will do it with more grids.
#t8>thead, #t8>tbody { display: grid; }
#t8>tbody>tr.t8-split { border-bottom: 1px solid <%=
- scss_get_var(:ruledefaultcolour) %>; }
+ scss_get_colour(:ruledefault) %>; }
#t8>tbody>tr.t8-split:nth-of-type(odd) ~ tr:nth-of-type(even) {
background-color: initial;
}
#t8>tbody>tr.t8-split:nth-of-type(odd) ~ tr:nth-of-type(odd) {
- background-color: <%= scss_get_var(:tableshadecolour) %>;
+ background-color: <%= scss_get_colour(:tableshade) %>;
}
}
diff --git a/layouts/default.xml b/layouts/default.xml
index 2e003ae..11aeec1 100644
--- a/layouts/default.xml
+++ b/layouts/default.xml
@@ -2,7 +2,7 @@
+
+
+
+
+
+
+
+
+
+
+
--
2.43.0
From 15534a5cb2aa7bf871f27d25c5d560168ab9d224 Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Tue, 10 May 2022 23:37:57 -0400
Subject: [PATCH 07/16] Apply background colour to the html element.
Older versions of Mozilla do not colour the entire window when
the style is applied to the body element. Using the html element
instead seems to do the job.
---
content/style.scss | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/content/style.scss b/content/style.scss
index 727a865..2708bb4 100644
--- a/content/style.scss
+++ b/content/style.scss
@@ -40,14 +40,11 @@
max-width: 1em * ($maxwidth / $fontsize);
}
+html { @include usecolours($background-color: background); }
body {
+ @include usecolours($color: foreground);
font-family: sans-serif;
margin: 1em;
-
- @include usecolours
- ( $background-color: background
- , $color: foreground
- );
}
a:link {
--
2.43.0
From e86a4a5aa2cbe15fed0ea55cb4ee6955db62b104 Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Mon, 16 May 2022 01:17:29 -0400
Subject: [PATCH 08/16] Lunar eclipse 2022-05-15
---
content/images/eclipse-20220515-223224.jpg | 1 +
content/images/eclipse-20220515-223224.yaml | 4 ++++
content/images/eclipse-20220515-223904.jpg | 1 +
content/images/eclipse-20220515-223904.yaml | 4 ++++
content/images/eclipse-20220515-225442.jpg | 1 +
content/images/eclipse-20220515-225442.yaml | 4 ++++
content/images/eclipse-20220515-230507.jpg | 1 +
content/images/eclipse-20220515-230507.yaml | 4 ++++
content/images/eclipse-20220515-231141.jpg | 1 +
content/images/eclipse-20220515-231141.yaml | 4 ++++
content/images/eclipse-20220515-231939.jpg | 1 +
content/images/eclipse-20220515-231939.yaml | 4 ++++
content/images/eclipse-20220515-232447.jpg | 1 +
content/images/eclipse-20220515-232447.yaml | 4 ++++
content/images/eclipse-20220515-232709.jpg | 1 +
content/images/eclipse-20220515-232709.yaml | 4 ++++
content/images/eclipse-20220515-233454.jpg | 1 +
content/images/eclipse-20220515-233454.yaml | 4 ++++
content/images/eclipse-20220515-233803.jpg | 1 +
content/images/eclipse-20220515-233803.yaml | 4 ++++
content/images/eclipse-20220515-234126.jpg | 1 +
content/images/eclipse-20220515-234126.yaml | 4 ++++
content/images/eclipse-20220515-234942.jpg | 1 +
content/images/eclipse-20220515-234942.yaml | 4 ++++
content/images/eclipse-20220515-235136.jpg | 1 +
content/images/eclipse-20220515-235136.yaml | 4 ++++
content/images/eclipse-20220516-000739.jpg | 1 +
content/images/eclipse-20220516-000739.yaml | 4 ++++
content/weblog/eclipse-20220515.md | 11 +++++++++++
29 files changed, 81 insertions(+)
create mode 120000 content/images/eclipse-20220515-223224.jpg
create mode 100644 content/images/eclipse-20220515-223224.yaml
create mode 120000 content/images/eclipse-20220515-223904.jpg
create mode 100644 content/images/eclipse-20220515-223904.yaml
create mode 120000 content/images/eclipse-20220515-225442.jpg
create mode 100644 content/images/eclipse-20220515-225442.yaml
create mode 120000 content/images/eclipse-20220515-230507.jpg
create mode 100644 content/images/eclipse-20220515-230507.yaml
create mode 120000 content/images/eclipse-20220515-231141.jpg
create mode 100644 content/images/eclipse-20220515-231141.yaml
create mode 120000 content/images/eclipse-20220515-231939.jpg
create mode 100644 content/images/eclipse-20220515-231939.yaml
create mode 120000 content/images/eclipse-20220515-232447.jpg
create mode 100644 content/images/eclipse-20220515-232447.yaml
create mode 120000 content/images/eclipse-20220515-232709.jpg
create mode 100644 content/images/eclipse-20220515-232709.yaml
create mode 120000 content/images/eclipse-20220515-233454.jpg
create mode 100644 content/images/eclipse-20220515-233454.yaml
create mode 120000 content/images/eclipse-20220515-233803.jpg
create mode 100644 content/images/eclipse-20220515-233803.yaml
create mode 120000 content/images/eclipse-20220515-234126.jpg
create mode 100644 content/images/eclipse-20220515-234126.yaml
create mode 120000 content/images/eclipse-20220515-234942.jpg
create mode 100644 content/images/eclipse-20220515-234942.yaml
create mode 120000 content/images/eclipse-20220515-235136.jpg
create mode 100644 content/images/eclipse-20220515-235136.yaml
create mode 120000 content/images/eclipse-20220516-000739.jpg
create mode 100644 content/images/eclipse-20220516-000739.yaml
create mode 100644 content/weblog/eclipse-20220515.md
diff --git a/content/images/eclipse-20220515-223224.jpg b/content/images/eclipse-20220515-223224.jpg
new file mode 120000
index 0000000..ecd014e
--- /dev/null
+++ b/content/images/eclipse-20220515-223224.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/7V/6K/SHA512-s62206--3c7b5e8560109819d8616fbb77e86dfe275da79bee14a99958b849e2d45fd82196a3aa88d06f7d4bb6a5258a9ee025f5505ee120388c5066dfa1b09e3c61772f/SHA512-s62206--3c7b5e8560109819d8616fbb77e86dfe275da79bee14a99958b849e2d45fd82196a3aa88d06f7d4bb6a5258a9ee025f5505ee120388c5066dfa1b09e3c61772f
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-223224.yaml b/content/images/eclipse-20220515-223224.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-223224.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-223904.jpg b/content/images/eclipse-20220515-223904.jpg
new file mode 120000
index 0000000..8f52052
--- /dev/null
+++ b/content/images/eclipse-20220515-223904.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/z1/gk/SHA512-s67272--ee40a65584c53a7bdf481f66b0633bfcb5612a832b6d033bd0e049d3b4556641168e4842e95a465031dccfb8516635c861ae64065a733cf7392bcbf88df790f3/SHA512-s67272--ee40a65584c53a7bdf481f66b0633bfcb5612a832b6d033bd0e049d3b4556641168e4842e95a465031dccfb8516635c861ae64065a733cf7392bcbf88df790f3
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-223904.yaml b/content/images/eclipse-20220515-223904.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-223904.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-225442.jpg b/content/images/eclipse-20220515-225442.jpg
new file mode 120000
index 0000000..071bd37
--- /dev/null
+++ b/content/images/eclipse-20220515-225442.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/56/0v/SHA512-s62547--acaa868e092acac5329ff17af7b36c6715b0b27c0c7e856199a5c0137fd6d27fbeb3cda7b2e71f6e45538108ecc3dc7782ea7a7ec332d2f903e79b2875d90b7c/SHA512-s62547--acaa868e092acac5329ff17af7b36c6715b0b27c0c7e856199a5c0137fd6d27fbeb3cda7b2e71f6e45538108ecc3dc7782ea7a7ec332d2f903e79b2875d90b7c
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-225442.yaml b/content/images/eclipse-20220515-225442.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-225442.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-230507.jpg b/content/images/eclipse-20220515-230507.jpg
new file mode 120000
index 0000000..0b86aad
--- /dev/null
+++ b/content/images/eclipse-20220515-230507.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/V2/pq/SHA512-s59928--c64ed7765384fd5bd27b61ccf2e927ae38dbce4737d50890c173a7e2b32ab47fea76129d804eb22462582d27e95d1703bb5c29e07e881ee4d91f3c9739f56e9a/SHA512-s59928--c64ed7765384fd5bd27b61ccf2e927ae38dbce4737d50890c173a7e2b32ab47fea76129d804eb22462582d27e95d1703bb5c29e07e881ee4d91f3c9739f56e9a
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-230507.yaml b/content/images/eclipse-20220515-230507.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-230507.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-231141.jpg b/content/images/eclipse-20220515-231141.jpg
new file mode 120000
index 0000000..597a301
--- /dev/null
+++ b/content/images/eclipse-20220515-231141.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/pq/vJ/SHA512-s61153--ca215607a273fee73a79513d2e53ca76225a428f2ee2898e7616798802dac52703b24551644f235eca14660a32f5959b59f0960157748d73d0ccc6513a501c08/SHA512-s61153--ca215607a273fee73a79513d2e53ca76225a428f2ee2898e7616798802dac52703b24551644f235eca14660a32f5959b59f0960157748d73d0ccc6513a501c08
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-231141.yaml b/content/images/eclipse-20220515-231141.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-231141.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-231939.jpg b/content/images/eclipse-20220515-231939.jpg
new file mode 120000
index 0000000..111cfce
--- /dev/null
+++ b/content/images/eclipse-20220515-231939.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/qK/wK/SHA512-s42573--ac7ec2f106c7924a66b021eac1d8e53d0f480fda49adb27ce6dfe715c05d4cd463a41ec4a8ce8dca50b186f0ef719b201b0d757d13e8f4f793d61f24ee68c2bc/SHA512-s42573--ac7ec2f106c7924a66b021eac1d8e53d0f480fda49adb27ce6dfe715c05d4cd463a41ec4a8ce8dca50b186f0ef719b201b0d757d13e8f4f793d61f24ee68c2bc
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-231939.yaml b/content/images/eclipse-20220515-231939.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-231939.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-232447.jpg b/content/images/eclipse-20220515-232447.jpg
new file mode 120000
index 0000000..237113e
--- /dev/null
+++ b/content/images/eclipse-20220515-232447.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/41/06/SHA512-s45985--47c57854f6bf0235a0beceadda5bd3e44e216ca10e4f48f1a15104d48c353405eca7d8b6834b411f2ea4d35e97fed5e83bc090db3902d2cdbbf40b6e025c6d8e/SHA512-s45985--47c57854f6bf0235a0beceadda5bd3e44e216ca10e4f48f1a15104d48c353405eca7d8b6834b411f2ea4d35e97fed5e83bc090db3902d2cdbbf40b6e025c6d8e
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-232447.yaml b/content/images/eclipse-20220515-232447.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-232447.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-232709.jpg b/content/images/eclipse-20220515-232709.jpg
new file mode 120000
index 0000000..2f3f5f7
--- /dev/null
+++ b/content/images/eclipse-20220515-232709.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/7w/J8/SHA512-s46545--ce81c5cf09098e2c3d9566b7a23705d29e2db6c08f2dc3a5129294b546f814f8f4c84a28a4a82a236d327f55bf2e8930fa5afea2f67001ce5e565a35aa89eb39/SHA512-s46545--ce81c5cf09098e2c3d9566b7a23705d29e2db6c08f2dc3a5129294b546f814f8f4c84a28a4a82a236d327f55bf2e8930fa5afea2f67001ce5e565a35aa89eb39
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-232709.yaml b/content/images/eclipse-20220515-232709.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-232709.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-233454.jpg b/content/images/eclipse-20220515-233454.jpg
new file mode 120000
index 0000000..fec7426
--- /dev/null
+++ b/content/images/eclipse-20220515-233454.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/k1/5F/SHA512-s45317--093734cb997e659c34ccceff0899ffa33b42da32c10b8f1a26ca7fc7bebcde982835f85033731c1a17c43c90a695a6e5081721d68a07109bd090fe2dced56021/SHA512-s45317--093734cb997e659c34ccceff0899ffa33b42da32c10b8f1a26ca7fc7bebcde982835f85033731c1a17c43c90a695a6e5081721d68a07109bd090fe2dced56021
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-233454.yaml b/content/images/eclipse-20220515-233454.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-233454.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-233803.jpg b/content/images/eclipse-20220515-233803.jpg
new file mode 120000
index 0000000..34a8b24
--- /dev/null
+++ b/content/images/eclipse-20220515-233803.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/P3/Z3/SHA512-s61296--0fbbe13c91dd55730ab794c173ef89cb67236af9815183b89cb4cb2422d96a69b7642b545a9759c6d701c101468276e59a63fea597b6bdd8cd591b12b5dddede/SHA512-s61296--0fbbe13c91dd55730ab794c173ef89cb67236af9815183b89cb4cb2422d96a69b7642b545a9759c6d701c101468276e59a63fea597b6bdd8cd591b12b5dddede
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-233803.yaml b/content/images/eclipse-20220515-233803.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-233803.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-234126.jpg b/content/images/eclipse-20220515-234126.jpg
new file mode 120000
index 0000000..8a16ccc
--- /dev/null
+++ b/content/images/eclipse-20220515-234126.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/jP/q9/SHA512-s62280--e38d6442ee33be62ca39f1d0976888d1b8dde77fb84043133887190e25febd2dcc7f1c0351880d5879ab542b9db3854e172be60cad1208a859e30c30e1f774dc/SHA512-s62280--e38d6442ee33be62ca39f1d0976888d1b8dde77fb84043133887190e25febd2dcc7f1c0351880d5879ab542b9db3854e172be60cad1208a859e30c30e1f774dc
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-234126.yaml b/content/images/eclipse-20220515-234126.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-234126.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-234942.jpg b/content/images/eclipse-20220515-234942.jpg
new file mode 120000
index 0000000..1dd3e25
--- /dev/null
+++ b/content/images/eclipse-20220515-234942.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/xv/81/SHA512-s75054--65490d25c866e5b275a84133da3305a2df5b31a5a5a83741ee6149d480c2fa1b446cde857487709b34bb7091f31de734b7bdc225250494f8b1ecdd1934957be2/SHA512-s75054--65490d25c866e5b275a84133da3305a2df5b31a5a5a83741ee6149d480c2fa1b446cde857487709b34bb7091f31de734b7bdc225250494f8b1ecdd1934957be2
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-234942.yaml b/content/images/eclipse-20220515-234942.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-234942.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220515-235136.jpg b/content/images/eclipse-20220515-235136.jpg
new file mode 120000
index 0000000..40f0ebb
--- /dev/null
+++ b/content/images/eclipse-20220515-235136.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/0m/kX/SHA512-s74615--1af33e462be8dcc467fb5a81400438974197918af7caa39eea77113c6e49788df04585ea574efca75699d9a79d0f1f1623d4976c17b8129dbcb6a43a4ba84685/SHA512-s74615--1af33e462be8dcc467fb5a81400438974197918af7caa39eea77113c6e49788df04585ea574efca75699d9a79d0f1f1623d4976c17b8129dbcb6a43a4ba84685
\ No newline at end of file
diff --git a/content/images/eclipse-20220515-235136.yaml b/content/images/eclipse-20220515-235136.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220515-235136.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/images/eclipse-20220516-000739.jpg b/content/images/eclipse-20220516-000739.jpg
new file mode 120000
index 0000000..fc0b549
--- /dev/null
+++ b/content/images/eclipse-20220516-000739.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/jW/6f/SHA512-s68109--7e627c88851979ffa02c55369993935c70d7a9e107ddbf334189825c87436a4fbc1d14249ffbc5f9f9b97acf752c27abe557d11b3f5bf385c62b22eee36b18b6/SHA512-s68109--7e627c88851979ffa02c55369993935c70d7a9e107ddbf334189825c87436a4fbc1d14249ffbc5f9f9b97acf752c27abe557d11b3f5bf385c62b22eee36b18b6
\ No newline at end of file
diff --git a/content/images/eclipse-20220516-000739.yaml b/content/images/eclipse-20220516-000739.yaml
new file mode 100644
index 0000000..6752422
--- /dev/null
+++ b/content/images/eclipse-20220516-000739.yaml
@@ -0,0 +1,4 @@
+---
+title: 2022-05-15/16 Lunar Eclipse from Ottawa
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
diff --git a/content/weblog/eclipse-20220515.md b/content/weblog/eclipse-20220515.md
new file mode 100644
index 0000000..ab471b7
--- /dev/null
+++ b/content/weblog/eclipse-20220515.md
@@ -0,0 +1,11 @@
+---
+title: Lunar Eclipse in Ottawa on 2022-05-15
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
+published: 2022-05-16T01:17:29-0400
+---
+
+<% images = @items.find_all("/images/eclipse-202205*.jpg")
+images.sort_by(&:identifier).each do |item| %>
+<%= gallery_img(item, caption: "") %>
+<% end %>
--
2.43.0
From c047dafad7bcb66a096284497eca6ef20ca1584d Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Sat, 4 Jun 2022 22:01:19 -0400
Subject: [PATCH 09/16] Add project page for rrace
---
.gitmodules | 3 +++
content/projects/rrace.md | 8 ++++++++
gitmodules/rrace | 1 +
3 files changed, 12 insertions(+)
create mode 100644 content/projects/rrace.md
create mode 160000 gitmodules/rrace
diff --git a/.gitmodules b/.gitmodules
index d345e88..649ec89 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,3 +4,6 @@
[submodule "gitmodules/cdecl99"]
path = gitmodules/cdecl99
url = https://git.draconx.ca/cdecl99.git
+[submodule "gitmodules/rrace"]
+ path = gitmodules/rrace
+ url = https://git.draconx.ca/rrace.git
diff --git a/content/projects/rrace.md b/content/projects/rrace.md
new file mode 100644
index 0000000..b5a111f
--- /dev/null
+++ b/content/projects/rrace.md
@@ -0,0 +1,8 @@
+---
+title: RRace
+copyright: 2022 Nick Bowler
+license: gpl-3 or (at your option) any later version
+module: rrace
+---
+
+<%= project_readme %>
diff --git a/gitmodules/rrace b/gitmodules/rrace
new file mode 160000
index 0000000..d9238fc
--- /dev/null
+++ b/gitmodules/rrace
@@ -0,0 +1 @@
+Subproject commit d9238fc6c4a4ceaeab31be2908ade413e52b60b4
--
2.43.0
From eb8b04d03e5355826a8e4e53274faf24d2320cd3 Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Sat, 9 Jul 2022 12:12:20 -0400
Subject: [PATCH 10/16] M48T59Y battery replacement
---
content/images/m48t59y-fixed.jpg | 1 +
content/images/m48t59y-fixed.yaml | 6 ++
content/images/m48t59y-installed.jpg | 1 +
content/images/m48t59y-installed.yaml | 6 ++
content/images/m48t59y-solder.jpg | 1 +
content/images/m48t59y-solder.yaml | 7 ++
content/images/m48t59y-terminals.jpg | 1 +
content/images/m48t59y-terminals.yaml | 8 ++
content/images/m48t59y.jpg | 1 +
content/images/m48t59y.yaml | 9 +++
content/style.scss | 25 ++++++-
content/weblog/ultra60-nvram.md | 101 ++++++++++++++++++++++++++
layouts/default.xsl | 45 ++++++++++--
layouts/functions.xsl | 16 +++-
lib/helpers.rb | 42 ++++++++---
15 files changed, 249 insertions(+), 21 deletions(-)
create mode 120000 content/images/m48t59y-fixed.jpg
create mode 100644 content/images/m48t59y-fixed.yaml
create mode 120000 content/images/m48t59y-installed.jpg
create mode 100644 content/images/m48t59y-installed.yaml
create mode 120000 content/images/m48t59y-solder.jpg
create mode 100644 content/images/m48t59y-solder.yaml
create mode 120000 content/images/m48t59y-terminals.jpg
create mode 100644 content/images/m48t59y-terminals.yaml
create mode 120000 content/images/m48t59y.jpg
create mode 100644 content/images/m48t59y.yaml
create mode 100644 content/weblog/ultra60-nvram.md
diff --git a/content/images/m48t59y-fixed.jpg b/content/images/m48t59y-fixed.jpg
new file mode 120000
index 0000000..d0f066e
--- /dev/null
+++ b/content/images/m48t59y-fixed.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/wK/GG/SHA512-s215590--23ec4d09ab8ed674c51d1fa81145f4983e207ca989ec65c3035ba49c876aa01c37df3ca458b80ab7863607ec80ec8ac950bd03e7d83ec493adc40fef80c55f8d/SHA512-s215590--23ec4d09ab8ed674c51d1fa81145f4983e207ca989ec65c3035ba49c876aa01c37df3ca458b80ab7863607ec80ec8ac950bd03e7d83ec493adc40fef80c55f8d
\ No newline at end of file
diff --git a/content/images/m48t59y-fixed.yaml b/content/images/m48t59y-fixed.yaml
new file mode 100644
index 0000000..6038682
--- /dev/null
+++ b/content/images/m48t59y-fixed.yaml
@@ -0,0 +1,6 @@
+---
+title: M48T59Y-70PC1 With Battery Clip
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
+description: |
+ Finished repair of M48T59Y part with external battery clip glued on top.
diff --git a/content/images/m48t59y-installed.jpg b/content/images/m48t59y-installed.jpg
new file mode 120000
index 0000000..2fa0639
--- /dev/null
+++ b/content/images/m48t59y-installed.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/jF/WK/SHA512-s821129--859631534da810c3a29d2246edf97a8d6a61a2ac67c21e18aee2753eb96a38a2856e45278f44db7a7a0ef9bb1c1ae6b00bc32e72b9b143b5d14a8abc7e376a1d/SHA512-s821129--859631534da810c3a29d2246edf97a8d6a61a2ac67c21e18aee2753eb96a38a2856e45278f44db7a7a0ef9bb1c1ae6b00bc32e72b9b143b5d14a8abc7e376a1d
\ No newline at end of file
diff --git a/content/images/m48t59y-installed.yaml b/content/images/m48t59y-installed.yaml
new file mode 100644
index 0000000..2c74fe6
--- /dev/null
+++ b/content/images/m48t59y-installed.yaml
@@ -0,0 +1,6 @@
+---
+title: M48T59Y-70PC1 Repair Complete
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
+description: |
+ Repaired M48T59Y chip installed onto the Sun Ultra 60 motherboard.
diff --git a/content/images/m48t59y-solder.jpg b/content/images/m48t59y-solder.jpg
new file mode 120000
index 0000000..5d8078e
--- /dev/null
+++ b/content/images/m48t59y-solder.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/8M/9g/SHA512-s146926--2dd1f0b920387121d4e1f658f151417d55d65dfa27a6b397343deeebde08636236a0e123a9cfa3fdeef8204425c3f7d00a5e5dcee121126535a140a059f6fb04/SHA512-s146926--2dd1f0b920387121d4e1f658f151417d55d65dfa27a6b397343deeebde08636236a0e123a9cfa3fdeef8204425c3f7d00a5e5dcee121126535a140a059f6fb04
\ No newline at end of file
diff --git a/content/images/m48t59y-solder.yaml b/content/images/m48t59y-solder.yaml
new file mode 100644
index 0000000..dc6253b
--- /dev/null
+++ b/content/images/m48t59y-solder.yaml
@@ -0,0 +1,7 @@
+---
+title: M48T59Y-70PC1 Wire Leads
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
+description: |
+ M48T59Y with battery leads connected, after disconnecting the internal
+ battery tabs.
diff --git a/content/images/m48t59y-terminals.jpg b/content/images/m48t59y-terminals.jpg
new file mode 120000
index 0000000..795475d
--- /dev/null
+++ b/content/images/m48t59y-terminals.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/98/V1/SHA512-s186948--c3277cf2aea7e159ee6203e9c7f5330f3a1c79a4d2c347c7637c19f354c7cafe2181b54fd40e84eba434a16340fb9cd3a87e76a636d45278846cb46c3d1f606e/SHA512-s186948--c3277cf2aea7e159ee6203e9c7f5330f3a1c79a4d2c347c7637c19f354c7cafe2181b54fd40e84eba434a16340fb9cd3a87e76a636d45278846cb46c3d1f606e
\ No newline at end of file
diff --git a/content/images/m48t59y-terminals.yaml b/content/images/m48t59y-terminals.yaml
new file mode 100644
index 0000000..806df38
--- /dev/null
+++ b/content/images/m48t59y-terminals.yaml
@@ -0,0 +1,8 @@
+---
+title: M48T59Y-70PC1 Battery Terminals
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
+description: |
+ M48T59Y with internal battery connections exposed. The negative connection
+ is on the left, closest to pin 14. The positive connection is on the right,
+ closest to pin 16.
diff --git a/content/images/m48t59y.jpg b/content/images/m48t59y.jpg
new file mode 120000
index 0000000..40e10d3
--- /dev/null
+++ b/content/images/m48t59y.jpg
@@ -0,0 +1 @@
+../../.git/annex/objects/5f/mJ/SHA512-s141937--ebbd8a2ad4b6d4f1c6d66d9f7ba76685c5281bff3d0fb34f7e00e3016b8422c4935aa9b87caa1c4f8ed9b1b7f727b4f2c97d49991f483317c8248f536c225620/SHA512-s141937--ebbd8a2ad4b6d4f1c6d66d9f7ba76685c5281bff3d0fb34f7e00e3016b8422c4935aa9b87caa1c4f8ed9b1b7f727b4f2c97d49991f483317c8248f536c225620
\ No newline at end of file
diff --git a/content/images/m48t59y.yaml b/content/images/m48t59y.yaml
new file mode 100644
index 0000000..7258310
--- /dev/null
+++ b/content/images/m48t59y.yaml
@@ -0,0 +1,9 @@
+---
+title: M48T59Y-70PC1
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
+description: |
+ The NVRAM module
+ used in my Sun Ultra 60 workstation. This combines a normal memory with a
+ real-time clock and an internal lithium primary cell to maintain everything.
+ However, the internal cell is long dead so this chip is dead too.
diff --git a/content/style.scss b/content/style.scss
index 2708bb4..abc6c49 100644
--- a/content/style.scss
+++ b/content/style.scss
@@ -76,6 +76,16 @@ h5 { @include header_size(60em, 1em); }
p.img { margin: 0.5em 0; }
}
+
+ @media (max-width: 45em) {
+ .inline.gallery {
+ display: block;
+ p.img {
+ a { max-width: 24em; }
+ margin: 1em 0;
+ }
+ }
+ }
}
p.img {
@@ -94,12 +104,22 @@ p.img {
border: solid 2px;
}
+ a.left { margin: 0 1em 0.5em 0; float: left; clear: left; }
+ a.right { margin: 0 0 0.5em 1em; float: right; clear: right; }
+ a.left, a.right {
+ @media (max-width: 45em) { float: none; margin: 0; }
+
+ max-width: 24em;
+ }
+
small {
@include usecolours($color: foreground);
- text-align: justify;
@media (max-width: 24em) { text-align: left; }
padding: 0.5ex;
display: block;
+ display: -moz-inline-box;
+ display: inline-block;
+ text-align: justify;
font-size: 0.9em;
}
}
@@ -137,10 +157,12 @@ kbd {
font-family: monospace;
font-size: 0.95em;
&:before { content: "% "; }
+ &.ok:before { content: "ok "; }
&>span { white-space: nowrap; }
blockquote & {
display: block;
+ & + br { display: none; }
text-align: left;
padding-left: 3em;
text-indent: -3em;
@@ -160,6 +182,7 @@ kbd {
table {
@include usecolour(border-top, ruledefault, 1px solid);
border-collapse: collapse;
+ clear: both;
width: 100%;
}
diff --git a/content/weblog/ultra60-nvram.md b/content/weblog/ultra60-nvram.md
new file mode 100644
index 0000000..ec96370
--- /dev/null
+++ b/content/weblog/ultra60-nvram.md
@@ -0,0 +1,101 @@
+---
+title: M48T59Y-70PC1 NVRAM Battery Replacement
+copyright: 2022 Nick Bowler
+license: cc-by-sa-4.0
+published: 2022-07-09T12:12:21-0400
+---
+
+*[NVRAM]: Non-Volatile Random Access Memory
+*[SRAM]: Static Random-Access Memory
+*[NOS]: New Old Stock
+*[DIP]: Dual In-line Package
+*[SOIC]: Small-Outline Integrated Circuit
+*[MAC]: Media Access Control
+
+Thanks to [Mark Henderson's Sun NVRAM FAQ][nvram-faq] for providing invaluable
+insight regarding this repair.
+{:article-info="article-info"}
+
+[nvram-faq]: http://web.archive.org/web/20150919135835/http://www.squirrel.com/sun-nvram-hostid.faq.html
+
+The Sun Ultra 60 workstation uses an ST M48T59Y-70PC1 battery-backed SRAM with
+real-time clock. When the embedded lithium primary cell inevitably dies, the
+chip is essentially useless. The most noticeable negative effect of a dead
+chip is that the workstation always powers up in a default configuration with
+diag-switch? true, running several minutes of self tests every time, with
+bogus MAC and host ID values.
+
+<%= floating_img(@items["/images/m48t59y.jpg"], caption: <
+
+This device was branded obsolescent by the manufacturer in April of 2008 and
+has presumably been out of production since around that time. Similar chips
+like the M48T58Y are still made but they are expensive (around $40) and slight
+differences may result in compatibility problems. It appears that NOS parts
+can be found fairly cheap online but these must be almost 15 years old by now
+and who knows what state the embedded batteries are in. No thanks.
+
+One option could be to find the SOIC version of the M48T59Y for which NOS also
+seems to be available, although somewhat less readily than the DIP modules, and
+then construct an adapter board to fit into the DIP socket on the motherboard.
+The SOIC package does not include the battery and crystal; instead, it has
+contacts on the top to attach a separate "SNAPHAT" package which are still
+made. This would be complicated and somewhat expensive.
+
+Fortunately, a straightforward (if time-consuming) repair is possible. This
+is a literal hackjob: we can dig through the potting to expose the battery
+terminals, disconnect the internal battery, and connect a normal battery clip.
+This enables the use of readily-available CR2032 lithium primary cells that can
+be replaced as needed, just like a normal PC. Since we already have the chip
+we need, it is not necessary to source any obscure or expensive components.
+
+<%=
+floating_img(@items["/images/m48t59y-terminals.jpg"], left: 1, caption: '')
+%>
+
+<%=
+floating_img(@items["/images/m48t59y-solder.jpg"], left: 1, caption: '')
+%>
+
+The battery contacts are located on the end opposite pin 1, between pins
+14 and 15. Looking underneath the chip there is a small well at either end
+filled with potting compound. The battery connections are inside one of
+these. Using a knife, cut back the plastic outer shell on the battery side,
+then begin scraping away potting compound until the terminals are exposed.
+You can use a suitable DIP socket to help protect the pins from accidental
+damage.
+
+Once the terminals are exposed, the internal battery must be disconnected.
+The thick protruding tabs near the bottom of the module are what we want
+to solder to. The vertical strips going up and into the module are the
+internal battery terminals. These can be desoldered from the tabs and
+lifted out of the way, or simply cut off.
+
+With the time-consuming parts completed it is a straightforward matter to
+connect a normal battery clip to the exposed terminals. As the Ultra 60 has
+no clearance issues I simply glued it to the top of the chip. Since this
+would obscure the barcode sticker which is useful to restore the original MAC
+address and host ID, I moved this sticker to the side of the chip.
+
+Finally all that remains is to put everything back together and power up
+the system. The system will run the full self-diagnostic tests again and
+if all goes well, the "NVRAM Battery Detect Test" should no longer display
+any errors. At the ok prompt, the memory can now be initialized. Where
+"AA BB CC" are the six hexadecimal digits from the orange barcode sticker:
+
+set-defaults
+setenv diag-switch? false
+8 0 20 AA BB CC AABBCC mkpl
<Ctrl-D><Ctrl-R>
+.idprom
+reset
+
+<%= gallery_img(@items["/images/m48t59y-fixed.jpg"], caption: <
+<%= gallery_img(@items["/images/m48t59y-installed.jpg"], caption: <
diff --git a/layouts/default.xsl b/layouts/default.xsl
index d5be103..7681933 100644
--- a/layouts/default.xsl
+++ b/layouts/default.xsl
@@ -222,7 +222,7 @@
-
+
@@ -400,18 +400,42 @@
+
+
+
-
+
+
+
+
+ Posted
+
+
+ , last updated
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -439,7 +463,14 @@
-
+
+
+ gallery
+
+ inline
+
+
diff --git a/layouts/functions.xsl b/layouts/functions.xsl
index a88c338..bbaf90e 100644
--- a/layouts/functions.xsl
+++ b/layouts/functions.xsl
@@ -1,7 +1,7 @@
+
+
+
+
+
+
+
diff --git a/lib/helpers.rb b/lib/helpers.rb
index 77916dd..24d37e4 100644
--- a/lib/helpers.rb
+++ b/lib/helpers.rb
@@ -1,6 +1,6 @@
# Nick's web site: Ruby helpers for processing
#
-# Copyright © 2018-2021 Nick Bowler
+# Copyright © 2018-2022 Nick Bowler
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -77,26 +77,31 @@ def counter(name = :default, item = @item)
name.to_s.capitalize + " " + ($counters[item][name] += 1).to_s
end
-def img_rep_fallback(item, rep)
- return rep unless item.reps[rep].raw_path.nil?
- return :large
+# Return a hash containing :src, :width and :height based on an image item rep.
+def img_rep_attrs(item, rep)
+ rep = :large if item.reps[rep].raw_path.nil?
+ attrs = {}
+
+ attrs[:src] ||= item_uri(item, rep: rep)
+ attrs[:width], attrs[:height] = FastImage.size(item.reps[rep].raw_path)
+
+ return attrs
end
-def gallery_img(item, rep: :large, alt: nil, caption: nil)
+def embed_img(item, rep: :large, caption: nil, block_attrs: {}, img_attrs: {})
return "[image not found]" unless item
- alt ||= item[:title]
- caption ||= alt
+ img_attrs[:alt] ||= item[:title]
+ caption ||= img_attrs[:alt]
caption = caption.strip
caption.gsub!(/\s+/, " ")
- rep = img_rep_fallback(item, rep)
- attrs = { :src => item_uri(item, rep: rep), :alt => item[:title] }
- attrs[:width], attrs[:height] = FastImage.size(item.reps[rep].raw_path)
+ img_attrs = img_rep_attrs(item, rep).merge(img_attrs)
+ block_attrs[:href] = item_uri(item, rep: :info)
b = Nokogiri::XML::Builder.new do |xml|
- xml.a(:href => item_uri(item, rep: :info)) {
- xml.img(attrs, "generate-gallery" => "generate-gallery")
+ xml.a(block_attrs) {
+ xml.img(img_attrs)
unless caption.empty?
xml << " "
xml.small { xml << caption }
@@ -106,6 +111,19 @@ def gallery_img(item, rep: :large, alt: nil, caption: nil)
b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_DECLARATION)
end
+def gallery_img(item, rep: :medium, caption: nil, alt: nil)
+ attrs = { alt: alt, "generate-gallery" => "generate-gallery" }
+ embed_img(item, rep: rep, caption: caption, img_attrs: attrs)
+end
+
+def floating_img(item, rep: :medium, caption: nil, alt: nil, left: nil)
+ battrs = { class: if left then "left" else "right" end }
+ attrs = { alt: alt }
+
+ embed_img(item, rep: rep, caption: caption,
+ block_attrs: battrs, img_attrs: attrs)
+end
+
def expand_copyright(copyright)
result = { :years => {} }
--
2.43.0
From a6bdcbd6dd9bbb5310cc3d3f3346cf169b09292e Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Tue, 13 Sep 2022 01:29:20 -0400
Subject: [PATCH 11/16] Update rrace README.
---
gitmodules/rrace | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gitmodules/rrace b/gitmodules/rrace
index d9238fc..c1dbd8f 160000
--- a/gitmodules/rrace
+++ b/gitmodules/rrace
@@ -1 +1 @@
-Subproject commit d9238fc6c4a4ceaeab31be2908ade413e52b60b4
+Subproject commit c1dbd8fcf932d82b4d77da62288b4a6cdf5c1470
--
2.43.0
From 466a4c7c22997ce016719a051d72af8371bb8863 Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Thu, 3 Nov 2022 20:51:23 -0400
Subject: [PATCH 12/16] Move whitespace handling templates into a separate
file.
This is pretty independent of anything else so we can use an
xsl:include to pull it in. Also remove duplicate definition of
f:ends-with which is in the same area.
---
layouts/default.xsl | 81 +---------------------------
layouts/whitespace.xsl | 116 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 117 insertions(+), 80 deletions(-)
create mode 100644 layouts/whitespace.xsl
diff --git a/layouts/default.xsl b/layouts/default.xsl
index 7681933..a9a75df 100644
--- a/layouts/default.xsl
+++ b/layouts/default.xsl
@@ -35,13 +35,6 @@
-
-
-
-
-
-
@@ -52,79 +45,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/layouts/whitespace.xsl b/layouts/whitespace.xsl
new file mode 100644
index 0000000..c15639a
--- /dev/null
+++ b/layouts/whitespace.xsl
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--
2.43.0
From 5e2eaac44dfd84ac3878853e352d5752867c4196 Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Fri, 4 Nov 2022 03:15:43 -0400
Subject: [PATCH 13/16] Update css_darkmode to handle media queries under
@supports.
This filter currently does not "see" anything within a @supports block,
so the hoisting of dark-mode media queries inside such a block is not
properly done.
Fix this by restructuring the filter to recurse down into these blocks.
---
lib/css-darkmode.rb | 105 ++++++++++++++++++++++++++++++++------------
1 file changed, 77 insertions(+), 28 deletions(-)
diff --git a/lib/css-darkmode.rb b/lib/css-darkmode.rb
index 50662e3..f15f64d 100644
--- a/lib/css-darkmode.rb
+++ b/lib/css-darkmode.rb
@@ -26,6 +26,22 @@ class CssDarkModeFilter < Nanoc::Filter
return nodes.reject {|x| x[:node] == :whitespace }
end
+ # Return a new list of nodes where consecutive whitespace nodes have been
+ # replaced with a single whitespace node, and if the whitespace contains
+ # one or more newlines, everything before the final newline is removed.
+ def simplify_whitespace(nodes)
+ nodes.slice_when do |a,b|
+ a[:node] != :whitespace or b[:node] != :whitespace
+ end.map do |x|
+ if x[0][:node] == :whitespace
+ combined = x.map{|y| y[:raw]}.join.sub(/.*\n/m, "\n")
+ x[0].merge({ raw: combined})
+ else
+ x[0]
+ end
+ end
+ end
+
def is_media_dark_block(x)
return false unless x[:node] == :simple_block
@@ -44,6 +60,10 @@ class CssDarkModeFilter < Nanoc::Filter
x[:prelude].index {|y| is_media_dark_block(y)}
end
+ def is_supports_block(x)
+ true if x[:node] == :at_rule and x[:name] == "supports"
+ end
+
# Remove (prefers-color-scheme: dark) conditions from a media query.
# If the resulting query is empty, returns the query's block alone.
# Otherwise, returns the modified query.
@@ -115,6 +135,54 @@ class CssDarkModeFilter < Nanoc::Filter
end
end
+ def process(tree, params)
+ last_visited = {}
+ darknodes = []
+
+ tree.delete_if do |x|
+ sep = { node: :whitespace, raw: "\n" }
+ if last_visited[:node] == :whitespace
+ # Try to maintain indentation
+ sep[:raw] += last_visited[:raw].sub(/[^\n]*\z|.*\n/m, "")
+ end
+ last_visited = x
+
+ if is_supports_block(x)
+ # Re-parse the block as a list of rules
+ s = Crass::Parser.stringify(x[:block])
+ x[:block] = Crass::Parser.parse_rules(s, params)
+
+ block = process(x[:block], params)
+ unless block.empty?
+ block << { node: :whitespace, raw: "\n" }
+ darknodes << [sep, x.merge({ block: block })]
+ end
+
+ Crass::Parser.stringify(x[:block]).strip.empty?
+ elsif is_media_dark(x)
+ if params[:alternate]
+ x = prune_media_dark(x)
+ end
+ darknodes << [sep, x]
+ end
+ end
+
+ # Combine consecutive equivalent media queries into a single query
+ result = darknodes.slice_when do |a,b|
+ !equiv_query(a[1], b[1])
+ end.each.map do |x|
+ case x[0][1]
+ when Hash
+ g = x.map{ |sep, node| node[:block] }.flatten
+ [ x[0][0], x[0][1].merge({ block: simplify_whitespace(g) }) ]
+ else
+ x
+ end
+ end.flatten
+
+ simplify_whitespace(result)
+ end
+
def run(content, params = {})
params = {
preserve_comments: true,
@@ -123,36 +191,17 @@ class CssDarkModeFilter < Nanoc::Filter
tree = Crass.parse(content, params)
- darknodes = []
- tree.delete_if { |x| darknodes << x if is_media_dark(x) }
-
- # Combine consecutive equivalent media queries into a single query
- darknodes = darknodes.slice_when{|a,b| !equiv_query(a, b)}.each.map \
- do |x|
- combined = x[0].merge({block: x.map{|x| x[:block]}.flatten})
- end
-
- # In alternate mode, remove prefers-color-scheme queries.
- if params[:alternate]
- darknodes.map!{|x| prune_media_dark(x)}
+ prologue = tree.take_while do |x|
+ x[:node] == :comment or x[:node] == :whitespace
end
+ tree.slice!(0, prologue.length)
- darkcss = ""
- darknodes.each do |x|
- darkcss += "#{Crass::Parser.stringify(x).rstrip}\n"
- end
- darkcss.sub!(/^\n*/, "")
-
- if params[:alternate]
- prologue = tree.take_while do |x|
- x[:node] == :comment or x[:node] == :whitespace
- end
-
- "#{Crass::Parser.stringify(prologue).rstrip}\n\n#{darkcss}"
- else
- output = "#{Crass::Parser.stringify(tree).rstrip}\n"
- output += "\n#{darkcss}" unless darkcss.empty?
- output
+ output = "#{Crass::Parser.stringify(prologue).rstrip}\n"
+ darknodes = process(tree, params)
+ unless params[:alternate]
+ tree = simplify_whitespace(tree)
+ output += "#{Crass::Parser.stringify(tree).rstrip}\n"
end
+ output += "#{Crass::Parser.stringify(darknodes).rstrip}\n"
end
end
--
2.43.0
From 26fb391fd994e985c8dcd310477eaffe0b72947a Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Sat, 1 Apr 2023 17:50:48 -0400
Subject: [PATCH 14/16] Fix compiled_content filter on Ruby 3.
It is apparently now required to use ** when passing a hash to a
function that takes keyword arguments.
---
lib/compiledcontent.rb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/compiledcontent.rb b/lib/compiledcontent.rb
index 016ed23..80e7911 100644
--- a/lib/compiledcontent.rb
+++ b/lib/compiledcontent.rb
@@ -1,7 +1,7 @@
# Nick's web site: compiled_content filter. Simply calls the compiled_content
# method on the current item to retrieve the text from a named rep or snapshot.
#
-# Copyright © 2022 Nick Bowler
+# Copyright © 2022-2023 Nick Bowler
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -20,6 +20,6 @@ class CompiledContentFilter < Nanoc::Filter
identifier :compiled_content
def run(content, params = {})
- return @item.compiled_content(params)
+ return @item.compiled_content(**params)
end
end
--
2.43.0
From 348da92aeda2cb82e59534bb38726e99cfea3c69 Mon Sep 17 00:00:00 2001
From: Nick Bowler
Date: Thu, 27 Jul 2023 01:47:33 -0400
Subject: [PATCH 15/16] Add new rarpd-dx project.
If the iputils folks don't want to package this anymore, I guess I can.
---
.gitmodules | 3 +++
content/projects.md | 3 +++
content/projects/rarpd-dx.md | 12 ++++++++++++
content/style.scss | 6 ++++--
gitmodules/rarpd-dx | 1 +
layouts/default.xsl | 27 +++++++++++++++++++++++++++
6 files changed, 50 insertions(+), 2 deletions(-)
create mode 100644 content/projects/rarpd-dx.md
create mode 160000 gitmodules/rarpd-dx
diff --git a/.gitmodules b/.gitmodules
index 649ec89..f24b460 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -7,3 +7,6 @@
[submodule "gitmodules/rrace"]
path = gitmodules/rrace
url = https://git.draconx.ca/rrace.git
+[submodule "gitmodules/rarpd-dx"]
+ path = gitmodules/rarpd-dx
+ url = https://git.draconx.ca/rarpd-dx.git
diff --git a/content/projects.md b/content/projects.md
index 90413c9..8db0c42 100644
--- a/content/projects.md
+++ b/content/projects.md
@@ -4,6 +4,9 @@ copyright: 2019 Nick Bowler
license: cc-by-nd-4.0
---
+*[RARP]: Reverse Address Resolution Protocol
+*[ARP]: Address Resolution Protocol
+
Most of the operations here in the workshop are tracked on our local [git
server](//git.draconx.ca) which can be browsed online. All the work here is
[free as in freedom](//www.gnu.org/philosophy/free-sw) which means you are
diff --git a/content/projects/rarpd-dx.md b/content/projects/rarpd-dx.md
new file mode 100644
index 0000000..ffaf19f
--- /dev/null
+++ b/content/projects/rarpd-dx.md
@@ -0,0 +1,12 @@
+---
+title: RARP Daemon
+copyright: 2023 Nick Bowler
+license: gpl-2 or (at your option) any later version
+module: rarpd-dx
+---
+
+*[RARP]: Reverse Address Resolution Protocol
+*[ARP]: Address Resolution Protocol
+
+<%= project_readme %>
+
diff --git a/content/style.scss b/content/style.scss
index abc6c49..17aff0b 100644
--- a/content/style.scss
+++ b/content/style.scss
@@ -67,6 +67,8 @@ h1 { @include header_size(60em, 2em); }
h2 { @include header_size(60em, 1.5em); }
h5 { @include header_size(60em, 1em); }
+h1, h2 { abbr { text-decoration: none; } }
+
@supports (display: grid) {
.gallery {
display: grid;
@@ -226,8 +228,8 @@ table.cc {
}
}
-// CSS rules for stortable clicky table headers: Update the display of
-// the /table based on the current state. Each column has its own set
+// CSS rules for sortable clicky table headers: Update the display of
+// the table based on the current state. Each column has its own set
// nearly-identical rules, only the class names differ.
//
// The clickytables.xsl stylesheet generates two inputs for each column.
diff --git a/gitmodules/rarpd-dx b/gitmodules/rarpd-dx
new file mode 160000
index 0000000..97a1829
--- /dev/null
+++ b/gitmodules/rarpd-dx
@@ -0,0 +1 @@
+Subproject commit 97a182920cd28f822aa3fcdd74ace01cf7b0a495
diff --git a/layouts/default.xsl b/layouts/default.xsl
index a9a75df..6bf8094 100644
--- a/layouts/default.xsl
+++ b/layouts/default.xsl
@@ -83,6 +83,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+