~gpanders/gpanders.com

3212022b270df10b5d6b568ae41db12edc23bf6e — Greg Anders 1 year, 2 months ago 9a4759a
Use more semantic HTML
M assets/css/base.tpl.css => assets/css/base.tpl.css +40 -46
@@ 1,7 1,7 @@
:root {
    --main-fg-color: #282828;
    --main-bg-color: #fff;
    --strong-color: #000;
    --strong-color: #282828;
    --subtle-color: #666;
    --border-color: #dbdbdb;
    --link-color: #0066d6;


@@ 51,14 51,6 @@ a:hover {

h1, h2, h3, h4, h5, h6 {
  color: var(--strong-color);
  margin: 0;
}

/* Add a little more whitespace around headers on larger screens */
@media only screen and (min-width: 800px) {
  h1, h2, h3, h4, h5, h6 {
    margin: 1.5rem 0 0 0;
  }
}

h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {


@@ 121,72 113,69 @@ nav {
}

.Banner {
  list-style: none;
  display: grid;
  align-items: baseline;
  margin: auto;
  max-width: {{ .Site.Params.width }};
  padding: 0;
  max-width: {{ site.Params.width }};
  line-height: 2;
  grid-template-columns: auto;
  text-align: center;
}

.Banner-item {
  text-align: center;
  padding: 0 1em;
.Banner-menu {
  list-style: none;
  display: grid;
  align-items: baseline;
  margin: 0;
  padding: 0;
  grid-row: 2;
}

.Banner-item--title {
.Banner-title {
  grid-row: 1;
  grid-column: 1 / {{ len site.Menus.nav | add 1 }};
  margin: 0;
}

.Banner-item {
  grid-row: 1;
}

.Banner-link {
  color: var(--strong-color);
  padding: 0.5rem 1rem;
}

.Banner-item--search {
  grid-row: 3;
.Banner-search {
  grid-row: 2;
  grid-column: 1 / {{ len site.Menus.nav | add 1 }};
}

@media only screen and (min-width: 600px) {
  .Banner {
    grid-template-columns: 1fr auto;
  }

  .Banner-item {
    text-align: left;
    padding: 0;
    grid-row: 1;
  }

  .Banner-item--title {
    grid-column: 1;
  .Banner-menu {
    grid-row: 1;
  }

  .Banner-item--search {
  .Banner-search {
    grid-row: 1;
    grid-column: 2;
  }
}

.Banner-link {
  font-size: 1rem;
  color: var(--strong-color);
  padding: 0.5rem 1rem;
}

.Banner-item--title .Banner-link {
  font-size: 1.5rem;
  font-weight: 700;
}

.Content {
  padding: 1em;
  overflow: auto;
}

.Subheader {
.Heading {
  margin-bottom: 0;
}

.Subheading {
  font-size: 14px;
  color: var(--subtle-color);
  margin: 0;
}

.Tags {


@@ 261,20 250,25 @@ nav {
  padding: 1em;
  color: var(--subtle-color);
  border-top: 1px solid var(--border-color);
  font-size: smaller;
}

.Project-link {
.Project-list {
  margin: 0;
}

.Project-list dt {
  font-weight: 500;
  margin-top: 1em;
}

.Project-link a {
.Project-list a {
  color: var(--main-fg-color);
}

.Project-desc {
.Project-list dd {
  font-size: 0.8rem;
  color: var(--subtle-color);
  margin: 0;
}

.List-header {

M content/blog/booting-linux-zcu102.md => content/blog/booting-linux-zcu102.md +12 -12
@@ 30,7 30,7 @@ but the information is often stale, badly formatted, obscure, or just plain
wrong. This guide aspires to be what Xilinx's wiki should be: a step-by-step
solution from nothing to Linux.

## What You'll Need
### What You'll Need

1.  A ZCU102 evaluation board
2.  A USB-connection to the board's UART (the kit comes with this cable)


@@ 43,7 43,7 @@ solution from nothing to Linux.
    compilers and other tools required to build the Linux kernel and other
    components.

## Step 1: Build your design in Vivado
### Step 1: Build your design in Vivado

This process is pretty well outlined in [Vivado's
tutorials](https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_1/ug1209-embedded-design-tutorial.pdf)


@@ 55,7 55,7 @@ who's programmed an FPGA with Vivado before.
Once the bitstream is finished compiling, go to `File` > `Export` > `Export
Hardware`.  Make sure "Include bitstream" is checked.

## Step 2: Launch SDK
### Step 2: Launch SDK

While still in Vivado, go to `File` > `Launch SDK`. You can accept the defaults
in the Launch SDK window or specify a custom location -- it doesn't really


@@ 68,7 68,7 @@ all of the files to initialize the processing system (PS) to the settings you
gave it in the IP integrator. The HDF file also contains your bitstream and any
drivers for custom IP you might have included.

## Step 3: Create the First Stage Boot Loader (FSBL)
### Step 3: Create the First Stage Boot Loader (FSBL)

In the Vivado SDK, go to `File` > `New` > `Application Project`. In the **New
Project** dialog that appears, call the project `fsbl` and set the OS Platform


@@ 93,14 93,14 @@ ahead and enable `FSBL_DEBUG_DETAILED_VAL`, just in case:
#define FSBL_DEBUG_DETAILED_VAL     (1U)
```

## Step 4: Create the PMU Firmware (PMUFW)
### Step 4: Create the PMU Firmware (PMUFW)

This step is almost identical to the last one. Create a new Application Project
and this time call it `pmufw`. Set the Processor to `psu_pmu_0`.  Click
**Next** and select the only option in the **Templates** window (ZynqMP PMU
Firmware).  Click Finish.

## Step 5: Create the Device Tree Binary (dtb) files
### Step 5: Create the Device Tree Binary (dtb) files

First, clone Xilinx's
[device-tree-xlnx](https://github.com/Xilinx/device-tree-xlnx) repository (it


@@ 158,7 158,7 @@ to the top of your `system-top.dts` file or you can append the contents of
Once you have your `system.dtb` file, copy it to the FAT32 (boot) partition of
your SD card.

## Step 6: Compile U-Boot
### Step 6: Compile U-Boot

Clone Xilinx's [U-Boot repository](https://github.com/Xilinx/u-boot-xlnx).
Again, **be sure to check out the tag corresponding to the version of Vivado


@@ 183,7 183,7 @@ $ make
Once U-Boot is done compiling, you should see a `u-boot.elf` file in that
directory.

## Step 7: Compile Arm Trusted Firmware (ATF)
### Step 7: Compile Arm Trusted Firmware (ATF)

This process is similar to building U-Boot. Clone Xilinx's [ARM Trusted
Firmware repository](https://github.com/Xilinx/arm-trusted-firmware), check out


@@ 197,7 197,7 @@ $ make PLAT=zynqmp bl31
Once complete, you should have a `bl31.elf` file under
`build/zynqmp/release/bl31/`.

## Step 8: Create a boot image
### Step 8: Create a boot image

This step is covered pretty well in Vivado's [Embedded Design
Tutorial](https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_1/ug1209-embedded-design-tutorial.pdf).


@@ 235,7 235,7 @@ you can install the boot files using
$ sudo make INSTALL_DIR=/media/sd install
```

## Step 9: Compile the Linux kernel
### Step 9: Compile the Linux kernel

Clone Xilinx's [fork of the Linux kernel](https://github.com/Xilinx/linux-xlnx)
and check out the tag corresponding to your Vivado version. Again, make sure


@@ 258,7 258,7 @@ Xilinx U-Boot fork.

Copy the `Image` file to the FAT32 (boot) partition of your SD card.

## Step 10: Find or create a file system
### Step 10: Find or create a file system

There are a thousand and one ways to procure a file system for Linux, so do
whatever works for you. If you want just a minimal Debian or Ubuntu file system,


@@ 277,7 277,7 @@ create a Debian-based root file system, use the process outlined
However you get it, install the file system to the ext4 partition of your
SD card.

## Step 12: Boot Linux
### Step 12: Boot Linux

We're finally there! Put your SD card into your device and make sure the boot
pins are set to boot from SD card mode (see [ZCU102 User

M content/blog/creating-your-own-git-server.md => content/blog/creating-your-own-git-server.md +6 -6
@@ 32,7 32,7 @@ supplementary tools to handle things like access control and HTTP access.

[sourcehut]: https://sr.ht

## Evaluating the choices
### Evaluating the choices

Depending on your needs, you may want to install something like [GitLab's
Community Edition][gitlab-ce] which is very easy to set up and provides things


@@ 55,7 55,7 @@ Finally, we'll use the built-in `git daemon` to serve repositories over the
[Gogs]: https://gogs.io
[Gitolite]: https://gitolite.com/gitolite/index.html

## Preparing your server
### Preparing your server

You can run your git server on something as simple as a Raspberry Pi or a
Digital Ocean droplet. It's not very demanding, so you don't need much


@@ 75,7 75,7 @@ And make sure you can SSH to the `git` user on your server:

    $ ssh git@yourserver.com

## Gitolite
### Gitolite

Next, install the excellent [Gitolite][] tool. Gitolite makes managing your
server much easier and allows you to do things like user management, access


@@ 112,7 112,7 @@ how you add new SSH keys (either for yourself or for other users).
Gitolite also interfaces quite nicely with `git-daemon` and `gitweb`. Be sure
to check out the thorough documentation on [Gitolite's website][Gitolite].

## git daemon
### git daemon

Git includes a `daemon` subcommand that will listen for incoming connections
and serve data over the `git://` protocol. This allows you to clone repos from


@@ 159,7 159,7 @@ readable by the special `daemon` user.

[gitweb-daemon]: https://gitolite.com/gitolite/gitweb-daemon.html

## Gitweb and HTTP
### Gitweb and HTTP

The most difficult part of setting up a git server is the web frontend and HTTP
access. The git documentation has a section on [Smart HTTP][] which is a good


@@ 241,7 241,7 @@ You may think it still looks drab, but I'm fairly proud of how it turned out.
[gitweb.conf]: https://git-scm.com/docs/gitweb.conf
[archived]: https://web.archive.org/web/20200326151219/https://git.gpanders.com/

## Gitolite tips and tricks
### Gitolite tips and tricks

Here are some of the Gitolite tricks I've set up on my server that you may find
useful.

M content/blog/git-plumbing.md => content/blog/git-plumbing.md +1 -1
@@ 4,7 4,7 @@ date: 2020-03-02
tags: [git]
---

## Porcelain and Plumbing
### Porcelain and Plumbing


### git commit

M content/blog/the-zettelkasten.md => content/blog/the-zettelkasten.md +5 -5
@@ 39,7 39,7 @@ because it works for me doesn't mean it'll work for you.
[Getting Things Done]: https://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0143126563
[appdemic]: https://appademic.tech/zettelkasten-thoughtful-plain-text-note-taking/#fn3

## What is a Zettelkasten?
### What is a Zettelkasten?

Quoting from the [blog post above][appdemic] (emphasis mine):



@@ 123,7 123,7 @@ soon), but you can also use something like [The Archive][] or [nvALT][].
[no-categories]: https://zettelkasten.de/posts/no-categories/
[nvALT]: https://brettterpstra.com/projects/nvalt/

## Examples
### Examples

Ok, you're a visual learner. I get it, I am too. Here's an example of what one
of my own Zettels looks like:


@@ 142,7 142,7 @@ Enlightenment, he re-imagined science's relationship with nature, insisting
that nature was mechanistic but rather highly complex and interwoven. His
discipline would later come to be known as ecology [[20191213143234]].

## Influenced
### Influenced

- George Perkins Marsh [[20191213092520]]
- Ernst Haeckel [[20191213151234]]


@@ 150,7 150,7 @@ discipline would later come to be known as ecology [[20191213143234]].
- Charles Darwin
- Goethe

## Backlinks
### Backlinks

- [[20191213092520]]
- [[20191213151234]]


@@ 188,7 188,7 @@ and go about my day. The whole process is very fast and very low friction.

[Zotero]: https://www.zotero.org/

## Conclusion
### Conclusion

I have been growing my own Zettelkasten for about 6 months now and have,
amazingly, been able to get the process to stick, which is more than I can say

M layouts/_default/baseof.html => layouts/_default/baseof.html +2 -2
@@ 15,9 15,9 @@
<body>
  {{ partialCached "banner.html" . }}
  <main>
    <div class="Content">
    <section class="Content">
      {{ block "main" . }}{{ end }}
    </div>
    </section>
    {{ if ne .Kind "section" }}
      {{ partialCached "sidebar.html" . }}
    {{ end }}

M layouts/partials/banner.html => layouts/partials/banner.html +25 -25
@@ 1,27 1,27 @@
<nav>
  <ul class="Banner">
    <li class="Banner-item Banner-item--title">
      <a class="Banner-link" href="{{ "" | absURL }}">{{ site.Title }}</a>
    </li>
    <li class="Banner-item Banner-item--search">
      <form class="Search-form" role="search" action="https://duckduckgo.com/" method="GET" accept-charset="UTF-8">
        <input type="hidden" name="sites" value="{{ .Site.BaseURL }}">
        <label>
          <input name="q" aria-label="Search" class="Search-input" placeholder="Search…" tabindex="0" autocomplete="off" autocapitalize="off" required>
        </label>
        <label class="Search-icon">
          <input type="submit" aria-label="Submit">
          <svg aria-hidden="true" height="16" width="16" viewBox="0 0 515.558 515.558">
            <path d="m378.344 332.78c25.37-34.645 40.545-77.2 40.545-123.333 0-115.484-93.961-209.445-209.445-209.445s-209.444 93.961-209.444 209.445 93.961 209.445 209.445 209.445c46.133 0 88.692-15.177 123.337-40.547l137.212 137.212 45.564-45.564c0-.001-137.214-137.213-137.214-137.213zm-168.899 21.667c-79.958 0-145-65.042-145-145s65.042-145 145-145 145 65.042 145 145-65.043 145-145 145z"/>
          </svg>
        </label>
        <ul class="Search-results"></ul>
      </form>
    </li>
    {{- range site.Menus.nav -}}
    <li class="Banner-item">
      <a class="Banner-link" href="{{ .URL | absURL }}">{{ .Name }}</a>
    </li>
    {{- end -}}
  </ul>
  <div class="Banner">
    <h1 class="Banner-title"><a class="Banner-link" href="{{ "" | absURL }}">{{ site.Title }}</a></h1>
    <ul class="Banner-menu">
      <li class="Banner-item Banner-search">
        <form class="Search-form" role="search" action="https://duckduckgo.com/" method="GET" accept-charset="UTF-8">
          <input type="hidden" name="sites" value="{{ .Site.BaseURL }}">
          <label>
            <input name="q" aria-label="Search" class="Search-input" placeholder="Search…" tabindex="0" autocomplete="off" autocapitalize="off" required>
          </label>
          <label class="Search-icon">
            <input type="submit" aria-label="Submit">
            <svg aria-hidden="true" height="16" width="16" viewBox="0 0 515.558 515.558">
              <path d="m378.344 332.78c25.37-34.645 40.545-77.2 40.545-123.333 0-115.484-93.961-209.445-209.445-209.445s-209.444 93.961-209.444 209.445 93.961 209.445 209.445 209.445c46.133 0 88.692-15.177 123.337-40.547l137.212 137.212 45.564-45.564c0-.001-137.214-137.213-137.214-137.213zm-168.899 21.667c-79.958 0-145-65.042-145-145s65.042-145 145-145 145 65.042 145 145-65.043 145-145 145z"/>
            </svg>
          </label>
          <ul class="Search-results"></ul>
        </form>
      </li>
      {{- range site.Menus.nav -}}
      <li class="Banner-item">
        <a class="Banner-link" href="{{ .URL | absURL }}">{{ .Name }}</a>
      </li>
      {{- end -}}
    </ul>
  </div>
</nav>

M layouts/partials/footer.html => layouts/partials/footer.html +1 -1
@@ 1,5 1,5 @@
{{ with site.Params.footer }}
<footer class="Footer">
  {{ . | safeHTML }}
  <small>{{ . | safeHTML }}</small>
</footer>
{{ end }}

M layouts/partials/goatcounter.html => layouts/partials/goatcounter.html +1 -1
@@ 1,4 1,4 @@
{{ with resources.Get "js/count.js" | fingerprint }}
  <script defer src="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" data-goatcounter="https://stats.gpanders.com/count"></script>
  <noscript><img src="https://stats.gpanders.com/count?p={{ $.Page.RelPermalink }}&t={{ $.Page.Title }}"></noscript>
  <noscript><img aria-hidden="true" alt="" role="none" src="https://stats.gpanders.com/count?p={{ $.Page.RelPermalink }}&t={{ $.Page.Title }}"></noscript>
{{ end }}

M layouts/partials/heading.html => layouts/partials/heading.html +5 -5
@@ 1,10 1,10 @@
<header>
  <h1 class="p-name"><a class="u-url u-uid" href="{{ .RelPermalink }}" rel="bookmark">{{ .Title }}</a></h1>
  <div class="Subheader">
  {{ with .PublishDate | default nil }}
  <h2 class="Heading p-name"><a class="u-url u-uid" href="{{ .RelPermalink }}" rel="bookmark">{{ .Title }}</a></h2>
  <p class="Subheading">
    {{ with .PublishDate | default nil }}
    <time class="dt-published" datetime="{{ .Format "2006-01-02T15:04:05Z07:00" }}">
      {{ .Format "January 2, 2006" }}
    </time>
  {{ end }}
  </div>
    {{ end }}
  </p>
</header>

M layouts/partials/sidebar.html => layouts/partials/sidebar.html +12 -14
@@ 1,18 1,18 @@
<div class="Sidebar">
<section class="Sidebar">
  <div class="h-card">
    <h3 class="p-name"><a class="u-url" href="{{ "" | absURL }}">Greg Anders</a></h3>
    <h2 class="p-name"><a class="u-url" href="{{ "" | absURL }}">Greg Anders</a></h2>
    <div class="p-note">
      <p>Electrical and computer engineer and open source software enthusiast.</p>
      <p>I use this site to write about things I learn or find interesting.</p>
    </div>
    <h4>Email</h4>
    <h3>Email</h3>
    <p class="u-email"><a rel="me" href="mailto:contact@gpanders.com">contact@gpanders.com</a></p>
    </h4>
    <h4>PGP</h4>
    <h3>PGP</h3>
    <p class="u-key"><a href="/publickey.txt">56E93C2FB6B08BDB</a></p>
    <h4>Questions or comments?</h4>
    <h3>Questions or comments?</h3>
    <p>Send a message to my <a href="https://lists.sr.ht/~gpanders/public-inbox">public inbox</a>.</p>
    <h4>Other places to find me</h4>
    <h3>Other places to find me</h3>
    <ul>
      <li><a rel="me" href="https://git.sr.ht/~gpanders">sourcehut</a></li>
      <li><a rel="me" href="https://github.com/gpanders">GitHub</a></li>


@@ 21,13 21,11 @@
    </ul>
  </div>

  <h4>Featured Projects</h4>
  <ul>
  <h3>Featured Projects</h3>
  <dl class="Project-list">
    {{ range where (where .Site.RegularPages "Section" "projects") ".Params.featured" "eq" true }}
    <li>
      <div class="Project-link"><a href="{{ with .Params.href }}{{ . }}{{ else }}{{ .RelPermalink }}{{ end }}">{{ .Title }}</a></div>
      <div class="Project-desc">{{ .Summary }}</div>
    </li>
    <dt><a href="{{ with .Params.href }}{{ . }}{{ else }}{{ .RelPermalink }}{{ end }}">{{ .Title }}</a></dt>
    <dd>{{ .Summary }}</dd>
    {{ end }}
  </ul>
</div>
  </dl>
</section>