~willvaughn/willvaughn.org

329ab17bf408392ffb45fe9124455cbcbe8c04a5 — William Vaughn 2 months ago 4d87395
exported with ox-hugo
M blog.org => blog.org +11 -1
@@ 44,8 44,10 @@ To build, architect, and operate data-centric software applications. To create p
:PROPERTIES:
:CUSTOM_ID: employment
:END:
#+begin_export html
<div class="tiled">
<div class="tile full">
#+end_export
*** [[https://www.carbonlighthouse.com/][Carbon Lighthouse]] - San Francisco, CA
*2016-Present -- VP of Software < SWE Manager < Lead SWE < Sr. SWE*\\
Mission driven company to stop climate change through energy efficiency in commercial real estate.\\


@@ 59,8 61,10 @@ Led a devops team building energy modeling applications on AWS, Kubernetes, and 
- Guided direct reports through COVID-19 remote transitions and two rounds of layoffs.
- Revamped software engineer hiring process adapting it to remote positions and outstaffing.

#+begin_export html
</div>
<div class="tile full">
#+end_export
*** [[http://rga.com][R/GA]] - Portland OR
*2015-2016 -- Sr. SWE*\\
Premier design, branding, and advertising agency.\\


@@ 69,8 73,10 @@ Was embedded at Nike Headquarters on the [[https://www.nike.com/nike-by-you][Nik
- Delivered new mobile/web frontend for one of Nike's most profitable online experiences.
- Unlocked new sales drivers by working hand-in-hand with Nike.com teams to provide API integration between our embedded app and product pages.
- Bootstrapped team successfully to learn React/Redux and adopt test first culture.
#+begin_export html
</div>
<div class="tile">
#+end_export
*** [[http://www.cascadeenergy.com][Cascade Energy]] - Portland, OR
*2012-2016 -- Sr. SWE < SWE*\\
Industrial Energy Efficiency Consultancy.\\


@@ 78,15 84,19 @@ Full-stack development of industrial energy management tool [[http://energysense

- Built scalable file ingest system on AWS EC2, S3, SQS, and DynamoDb.
- Developed calculation UI and API enabling expert mechanical engineers to create models on time-series measurements.
#+begin_export html
</div>
<div class="tile">
#+end_export
*** ID Branding/[[http://www.liquidagency.com][Liquid Agency]] - Portland, OR
*2010-2012 -- Jr. SWE*\\
Brand advertising, design, strategy and experience agency. ID Branding was acquired by Liquid Agency in early 2011.
- High level design and brand communication web applications for clients.
- Microsites for Nike, Trimet, and other regional clients.
#+begin_export html
</div>
</div>
#+end_export
** Education
:PROPERTIES:
:CUSTOM_ID: education


@@ 3103,7 3113,7 @@ I used Poetry for a long time in my open source project [[https://githbub.com/na

Thanks for reading, see you out there in the source code.

** DONE Moving to sourcehut
** DONE Moving to sourcehut                                       :writings:
:PROPERTIES:
:EXPORT_DATE: [2021-12-04 Sat 23:53]
:EXPORT_FILE_NAME: moving-to-sourcehut

M content/_index.md => content/_index.md +1 -0
@@ 1,5 1,6 @@
+++
title = "William Vaughn"
author = ["William Vaughn"]
draft = false
+++


M content/articles/arch-linux-first-steps.md => content/articles/arch-linux-first-steps.md +2 -2
@@ 27,7 27,7 @@ pacman -S zsh

## User and groups setup {#user-and-groups-setup}

<https://wiki.archlinux.org/index.php/Users%5Fand%5Fgroups#User%5Fmanagement>
<https://wiki.archlinux.org/index.php/Users_and_groups#User_management>

```sh
useradd -m -g wheel -s /usr/bin/zsh <USERNAME>


@@ 86,4 86,4 @@ Need `xclip`

```sh
pacman -S xclip
```
```
\ No newline at end of file

M content/articles/arch-linux-lts-kernel.md => content/articles/arch-linux-lts-kernel.md +3 -3
@@ 10,7 10,7 @@ draft = false

In order to stop my system from continuing to update the original linux kernel, I edited the ignored packages list in my `/etc/pacman.conf` file.

```conf
```cfg
IgnorePkg   = linux
```



@@ 33,7 33,7 @@ I'm using a standard boot loader that stores configs in _/boot/loader/loader.con

_/boot/loader/entries/arch.conf_

```conf
```cfg
title Arch Linux (ENCRYPTED)
linux /vmlinuz-linux-lts
initrd /initramfs-linux-lts.img


@@ 50,4 50,4 @@ Once my machine was restarted it was using the `linux-lts` kernel.
```sh
uname -rs
# Linux 4.19.92-1-lts
```
```
\ No newline at end of file

M content/articles/arch-linux-on-my-lenovo-t470s.md => content/articles/arch-linux-on-my-lenovo-t470s.md +1 -1
@@ 250,4 250,4 @@ Login as `root` user with the password you set.

## Conclusion {#conclusion}

This is a minimal install of a Arch Linux on an SSD nvme disk. I hope it all worked for you too! Feel free to email me with any corrections or issues you faced. Check out my [next entry](/articles/arch-linux-first-steps) on my own personal first steps on Arch Linux, things like installing the GNOME desktop environment and setting up the WiFi and such. Thanks for reading!
This is a minimal install of a Arch Linux on an SSD nvme disk. I hope it all worked for you too! Feel free to email me with any corrections or issues you faced. Check out my [next entry](/articles/arch-linux-first-steps) on my own personal first steps on Arch Linux, things like installing the GNOME desktop environment and setting up the WiFi and such. Thanks for reading!
\ No newline at end of file

M content/articles/arch-linux-on-my-toshiba-chromebook-2--2014.md => content/articles/arch-linux-on-my-toshiba-chromebook-2--2014.md +9 -9
@@ 11,7 11,7 @@ I started by trying to install Fedora 32 on this machine, just could not figure 

## Specs of the laptop {#specs-of-the-laptop}

By looking at the [Chrome OS Devices Arch Wiki](https://wiki.archlinux.org/index.php/Chrome%5FOS%5Fdevices/Chromebook) I found some basic specs for the Toshiba Chromebook 2
By looking at the [Chrome OS Devices Arch Wiki](https://wiki.archlinux.org/index.php/Chrome_OS_devices/Chromebook) I found some basic specs for the Toshiba Chromebook 2

| Available | Brand   | Model                | Processor                   | RAM      | Storage   | Upgradable | SeaBIOS | Remarks                   |
|-----------|---------|----------------------|-----------------------------|----------|-----------|------------|---------|---------------------------|


@@ 22,22 22,22 @@ By looking at the [Chrome OS Devices Arch Wiki](https://wiki.archlinux.org/index

This was fun. These resources helped me get it done. I flailed for a while and had to read these pages a lot in order to figure it out.

-   <https://wiki.archlinux.org/index.php/Chrome%5FOS%5Fdevices#Enabling%5FLegacy%5FBoot%5FMode>
-   <https://wiki.archlinux.org/index.php/Chrome_OS_devices#Enabling_Legacy_Boot_Mode>
-   <https://linuxconfig.org/how-to-install-any-linux-distro-on-a-chromebook#h2-getting-the-chromebook-ready>
-   <https://www.youtube.com/watch?v=JcZ711cxKdA>
-   <https://wiki.archlinux.org/index.php/Chrome%5FOS%5Fdevices/Custom%5Ffirmware#Flashing%5Fwith%5FMrChromebox's%5FFirmware%5FUtility%5FScript>
-   <https://wiki.archlinux.org/index.php/Chrome_OS_devices/Custom_firmware#Flashing_with_MrChromebox's_Firmware_Utility_Script>
-   <https://mrchromebox.tech/>


## Installation process {#installation-process}

-   <https://wiki.archlinux.org/index.php/Installation%5Fguide>
-   <https://wiki.archlinux.org/index.php/Installation_guide>


### Partitioning {#partitioning}

-   [Arch Wiki Partitioning](https://wiki.archlinux.org/index.php/Partitioning#Example%5Flayouts)
-   [Arch Wiki Swap file](https://wiki.archlinux.org/index.php/Swap#Swap%5Ffile)
-   [Arch Wiki Partitioning](https://wiki.archlinux.org/index.php/Partitioning#Example_layouts)
-   [Arch Wiki Swap file](https://wiki.archlinux.org/index.php/Swap#Swap_file)

I used [`parted`](https://wiki.archlinux.org/index.php/Parted) to partition the disk. First I figured out which device was the correct one to partition by running...



@@ 92,7 92,7 @@ pacstrap base base-devel linux linux-firmware intel-ucode sudo vim emacs git net

### The Rest {#the-rest}

Follow the [Arch Wiki Installation guide](https://wiki.archlinux.org/index.php/Installation%5FGuide), and clicked on many links to read more. I used GRUB as a boot loader.
Follow the [Arch Wiki Installation guide](https://wiki.archlinux.org/index.php/Installation_Guide), and clicked on many links to read more. I used GRUB as a boot loader.


## Post Install {#post-install}


@@ 100,7 100,7 @@ Follow the [Arch Wiki Installation guide](https://wiki.archlinux.org/index.php/I

### Swap file {#swap-file}

-   [Arch Wiki - Swap File](https://wiki.archlinux.org/index.php/Swap#Swap%5Ffile)
-   [Arch Wiki - Swap File](https://wiki.archlinux.org/index.php/Swap#Swap_file)

I decided to use a 1GB swap file for swap space at `/swapfile`.



@@ 129,4 129,4 @@ Use `free -m` to verify that the swap is available.

## Conclusion {#conclusion}

I just took apart a laptop, installed a new bios on it, and installed Arch Linux for the third or fourth time. Each time I get more comfortable with what a computer actually is every time I do this. I now have GNOME, firefox and Emacs installed on this little thing and I am actually using it around the house for basic end user style computing, and it works really well. Email me if you have one of these relics and want some help doing the same.
I just took apart a laptop, installed a new bios on it, and installed Arch Linux for the third or fourth time. Each time I get more comfortable with what a computer actually is every time I do this. I now have GNOME, firefox and Emacs installed on this little thing and I am actually using it around the house for basic end user style computing, and it works really well. Email me if you have one of these relics and want some help doing the same.
\ No newline at end of file

M content/articles/emacs-wisdom-from-the-internet.md => content/articles/emacs-wisdom-from-the-internet.md +1 -1
@@ 140,4 140,4 @@ OR
Run pdb (like this?): python -m pdb -m module.path.to.your_code
```

That is going to kick you into the pdb prompt. Now you need to type `help` and read the [pdb docs](https://docs.python.org/3/library/pdb.html).
That is going to kick you into the pdb prompt. Now you need to type `help` and read the [pdb docs](https://docs.python.org/3/library/pdb.html).
\ No newline at end of file

M content/articles/formatting-and-reinstalling-raspian-on-raspberry-pi-3.md => content/articles/formatting-and-reinstalling-raspian-on-raspberry-pi-3.md +1 -1
@@ 64,4 64,4 @@ Done! This microSD is ready for the pi.

## Installing Raspian with NOOBS {#installing-raspian-with-noobs}

Start up the Raspberry Pi 3 with the NOOBS disk, follow the easy to use application to install an OS.
Start up the Raspberry Pi 3 with the NOOBS disk, follow the easy to use application to install an OS.
\ No newline at end of file

M content/articles/installing-centos-on-protectli-vault.md => content/articles/installing-centos-on-protectli-vault.md +1 -1
@@ 31,4 31,4 @@ That takes a while, then you can `eject` it
sudo eject /dev/sdb
```

Shut down my vault, put the USB key in and follow the [Protectli CentOS Install Docs](https://protectli.com/kb/how-to-install-centos-on-the-vault/).
Shut down my vault, put the USB key in and follow the [Protectli CentOS Install Docs](https://protectli.com/kb/how-to-install-centos-on-the-vault/).
\ No newline at end of file

M content/articles/irc-services-at-home-with-k3s.md => content/articles/irc-services-at-home-with-k3s.md +4 -4
@@ 9,15 9,15 @@ draft = false
This is a follow-on to my previous two blogs about running ZNC and Bitlbee in k3s/Docker.

-   [Running ZNC Bouncer with k3s](/articles/running-znc-bouncer-with-k3s)
-   [Running Bitlbee & Signald with Docker](/articles/running-bitlbee-and-signald-with-docker)
-   [Running Bitlbee &amp; Signald with Docker](/articles/running-bitlbee-and-signald-with-docker)

In my prior k3s blog I ran a `NodePort` Kubernetes Service because I was unable to figure out how to get an Ingress setup and how to run ZNC behind a reverse proxy. I've figured that out now. It wasn't entirely simple because there were a few non-obvious things that needed to be undestood.

1.  IRC needs to be proxied via TCP not HTTP, and ZNC should take that traffic separately.
    -   [ZNC Wiki - Revers Proxy](https://wiki.znc.in/Reverse%5FProxy#Traefik)
    -   [ZNC Wiki - Revers Proxy](https://wiki.znc.in/Reverse_Proxy#Traefik)
    -   [Traefik IngressRouteTCP](https://doc.traefik.io/traefik/routing/providers/kubernetes-crd/#kind-ingressroutetcp)
2.  Host Server Name Indication (HostSNI) only works if you're using TLS, so routing by subdomains only works if you're bothering with SSL/TLS.
    -   [Traefik Endpoints](https://doc.traefik.io/traefik/routing/routers/#entrypoints%5F1)
    -   [Traefik Endpoints](https://doc.traefik.io/traefik/routing/routers/#entrypoints_1)
3.  ZNC Configuration for URIPrefix allows ZNC's webadmin to serve assets while behind a reverse proxy
    -   [URIPrefix](https://wiki.znc.in/Configuration#Listener)
4.  The way to configure k3s addons like Traefik, is to drop their configuration in a server folder.


@@ 354,4 354,4 @@ spec:

## ZNC Webadmin Listeners {#znc-webadmin-listeners}

{{< figure src="/images/irc-services-with-k3s/znc-listeners.png" >}}
{{< figure src="/images/irc-services-with-k3s/znc-listeners.png" >}}
\ No newline at end of file

M content/articles/moving-to-sourcehut.md => content/articles/moving-to-sourcehut.md +2 -1
@@ 2,6 2,7 @@
title = "Moving to sourcehut"
author = ["William Vaughn"]
date = 2021-12-04T23:53:00-08:00
tags = ["writings"]
draft = false
+++



@@ 37,4 38,4 @@ I also love their willingness to dispense with the status quo and push their use
-   <https://git-rebase.io/>
-   <https://useplaintext.email/>

I hope I'll see your projects on sourcehut. Please come contribute on mine!
I hope I'll see your projects on sourcehut. Please come contribute on mine!
\ No newline at end of file

M content/articles/my-personal-irc-renaissance.md => content/articles/my-personal-irc-renaissance.md +5 -5
@@ 6,9 6,9 @@ tags = ["writings", "homelab"]
draft = false
+++

## Freenode->Libera + System Crafters {#freenode-libera-plus-system-crafters}
## Freenode-&gt;Libera + System Crafters {#freenode-libera-plus-system-crafters}

A few months ago the parts of the Internet concerned with free and open source software and IT were abuzz about an [IRC Exodus from Freenode to Libera](https://news.ycombinator.com/item?id=27286628). I hadn't used IRC in quite a while, and had never been a regular user. I've always been interested in it but had never consistently logged in. Early this year I began to occassionaly come across videos from David Wilson's [System Crafters YouTube](https://www.youtube.com/channel/UCAiiOTio8Yu69c3XnR7nQBQ) channel in my social channels. The videos were excellent, informative, organized, and well-aligned with my interest in GNU Emacs and Linux at large. I really got hooked by the playlist on [Learning Emacs Lisp](https://www.youtube.com/watch?v=RQK%5FDaaX34Q&list=PLEoMzSkcN8oPQtn7FQEF3D7sroZbXuPZ7). Just after the Freenode/Libera kerfuffle, `daviwil` (as I now know him) started the `#systemcrafters` channel on [Libera](https://libera.chat) and did an [excellent video](https://youtu.be/qWHTZIYTA4s) and [live stream](https://youtu.be/Qci8t%5FjpVGA) detailing how to configure one of the built-in IRC clients in emacs -- [ERC](https://www.gnu.org/software/emacs/manual/html%5Fmono/erc.html). I followed along and for the first time had an IRC client I loved using! I also found a community in the `#systemcrafters` channel that was welcoming, fun, helpful and collaborative.
A few months ago the parts of the Internet concerned with free and open source software and IT were abuzz about an [IRC Exodus from Freenode to Libera](https://news.ycombinator.com/item?id=27286628). I hadn't used IRC in quite a while, and had never been a regular user. I've always been interested in it but had never consistently logged in. Early this year I began to occassionaly come across videos from David Wilson's [System Crafters YouTube](https://www.youtube.com/channel/UCAiiOTio8Yu69c3XnR7nQBQ) channel in my social channels. The videos were excellent, informative, organized, and well-aligned with my interest in GNU Emacs and Linux at large. I really got hooked by the playlist on [Learning Emacs Lisp](https://www.youtube.com/watch?v=RQK_DaaX34Q&list=PLEoMzSkcN8oPQtn7FQEF3D7sroZbXuPZ7). Just after the Freenode/Libera kerfuffle, `daviwil` (as I now know him) started the `#systemcrafters` channel on [Libera](https://libera.chat) and did an [excellent video](https://youtu.be/qWHTZIYTA4s) and [live stream](https://youtu.be/Qci8t_jpVGA) detailing how to configure one of the built-in IRC clients in emacs -- [ERC](https://www.gnu.org/software/emacs/manual/html_mono/erc.html). I followed along and for the first time had an IRC client I loved using! I also found a community in the `#systemcrafters` channel that was welcoming, fun, helpful and collaborative.

Below you'll find descriptions of how far I am down the rabbit hole. I honestly don't know how much further it goes! 😄



@@ 42,11 42,11 @@ After doing this two or three times, and having watched 7 videos about learning 
-   [0x0](https://melpa.org/#/0x0) on MELPA


## Bitlbee & Signald {#bitlbee-and-signald}
## Bitlbee &amp; Signald {#bitlbee-and-signald}

So, now I'm in ERC and IRC all the time. This is basically my facebook or instagram. It's inevitable that I should start thinking about how I can ERC-ify all textual communication in my life. I use Emacs for email, RSS, youtube, reddit, and news. Why shouldn't I use it for texting my friends and family? That's what [Bitlbee](https://www.bitlbee.org/main.php/news.r.html) is for, it bridges IRC to other common chat applications. I'm now running my own bitlbee server on my local network too! Some nice folks wrote and distributed [libpurple-signald](https://github.com/hoehermann/libpurple-signald), a library that bridges the [Signal](https://www.signal.org/) chat application to bitlbee, allowing me to text my wife and my friends from the lovely confines of emacs. 🗨

**Update**: Check out the new blogs [Running Bitlbee & Signald with Docker](/articles/running-bitlbee-and-signald-with-docker/) and [IRC Services at Home with K3s](/articles/irc-services-at-home-with-k3s/).
**Update**: Check out the new blogs [Running Bitlbee &amp; Signald with Docker](/articles/running-bitlbee-and-signald-with-docker/) and [IRC Services at Home with K3s](/articles/irc-services-at-home-with-k3s/).


## crafter-bot {#crafter-bot}


@@ 56,4 56,4 @@ I'm lurking on this project [benoitj/crafter-bot](https://github.com/benoitj/cra

## Conclusion {#conclusion}

Thanks for reading about my IRC revival. Come find me on the `#systemcrafters` channel on irc.libera.chat. You can `/query nackjicholson` anytime! Hope to hear from you soon! 🖖
Thanks for reading about my IRC revival. Come find me on the `#systemcrafters` channel on irc.libera.chat. You can `/query nackjicholson` anytime! Hope to hear from you soon! 🖖
\ No newline at end of file

M content/articles/pihole-and-wireguard-vpn-on-raspberry-pi-3.md => content/articles/pihole-and-wireguard-vpn-on-raspberry-pi-3.md +7 -7
@@ 109,7 109,7 @@ Note that throughout this article `192.168.1.1` is my router gateway, and `192.1

After install be sure to copy your admin webpage login. I also checked the lines added to `/etc/dhcpcd.conf` (as referenced in the [prerequisites](https://docs.pi-hole.net/main/prerequisites/#ip-addressing)). I didn't actually find that Pi-hole had added any lines, so I configured `dhcpcd.conf` myself to statically set an IP for the RPI 3 on my network.

```conf
```cfg
# Static IP configuration:
# Using my EdgeRouterX 192.168.1.1
# Pointing the nameserver locally and backed up with Cloudflare


@@ 177,7 177,7 @@ sudo useradd -s /usr/sbin/nologin -r -M cloudflared
sudo vim /etc/default/cloudflared
```

```conf
```cfg
# Commandline args for cloudflared
CLOUDFLARED_OPTS=--port 5053 --upstream https://1.1.1.1/dns-query --upstream https://1.0.0.1/dns-query
```


@@ 191,7 191,7 @@ sudo chown cloudflared:cloudflared /usr/local/bin/cloudflared
sudo vim /etc/systemd/system/cloudflared.service
```

```conf
```cfg
[Unit]
Description=cloudflared DNS over HTTPS proxy
After=syslog.target network-online.target


@@ 274,7 274,7 @@ I followed the instructions on this github page . They were also referenced in t

Here is my server config `/etc/wireguard/wg0.conf`.

```conf
```cfg
[Interface]
Address = 192.168.2.1/24
SaveConfig = true


@@ 293,7 293,7 @@ AllowedIPs = 192.168.2.2/32

-   [WireGuard ArchWiki](https://wiki.archlinux.org/index.php/WireGuard)
-   [Set up cloudflared with WireGuard](https://tau.gr/posts/2019-03-03-set-up-cloudflared-ubuntu-wireguard/)
-   [Pi-hole/WireGuard Reddit Post](https://www.reddit.com/r/WireGuard/comments/g6yc1z/how%5Fto%5Fsetup%5Fwireguard%5Fvia%5Fpihole%5Fthrough%5Fvpn/)
-   [Pi-hole/WireGuard Reddit Post](https://www.reddit.com/r/WireGuard/comments/g6yc1z/how_to_setup_wireguard_via_pihole_through_vpn/)
-   [notasausage/pi-hole-unbound-wireguard](https://github.com/notasausage/pi-hole-unbound-wireguard)

I'm using the `linux-lts` kernel so I ran the following.


@@ 311,7 311,7 @@ And:

My `/etc/wireguard/wg0.conf`

```conf
```cfg
[Interface]
Address = 192.168.2.2/24
PrivateKey = <client_private_key>


@@ 337,4 337,4 @@ You can also download the app for WireGuard on your phone and connect with it. Y

## Conclusion {#conclusion}

I hope you got through it too! My ads don't always block when I'm on my Arch Linux laptop unfortunately. Be sure to email me if you find the solution to that. Thanks for reading!
I hope you got through it too! My ads don't always block when I'm on my Arch Linux laptop unfortunately. Be sure to email me if you find the solution to that. Thanks for reading!
\ No newline at end of file

M content/articles/pypa-python-packaging-user-guide-review.md => content/articles/pypa-python-packaging-user-guide-review.md +1 -1
@@ 27,4 27,4 @@ I used Poetry for a long time in my open source project [aiosql](https://githbub
-   Links to a lot of PEPs.
-   All the ways to deploy and distribute a Python application, with examples and trade-offs.

Thanks for reading, see you out there in the source code.
Thanks for reading, see you out there in the source code.
\ No newline at end of file

M content/articles/running-bitlbee-and-signald-with-docker.md => content/articles/running-bitlbee-and-signald-with-docker.md +8 -8
@@ 13,13 13,13 @@ draft = false

In order for Bitlbee to work with Signal, you need some libraries, [signald](https://signald.org/) and [libpurple-signald](https://github.com/hoehermann/libpurple-signald). The libpurple library is a common requirement for many bitlbee bridges, and fortunately there is already a suitable docker container with bitlbee and libpurple pre-installed, [ezkrg/bitlbee-libpurple](https://github.com/ezkrg/docker-bitlbee-libpurple). However, it does not have signald installed in it. We will need to run another container, [finn/signald](https://git.callpipe.com/finn/signald), and give the bitlbee container access to it via a shared volume. Once the containers are set and available, we'll use systemd to ensure they start on boot.

1.  [Setup Storage & Cross Communication Volumes](#setup-storage-and-cross-communication-volumes)
1.  [Setup Storage &amp; Cross Communication Volumes](#setup-storage-and-cross-communication-volumes)
2.  [Run the Containers](#run-the-containers)
3.  [Login & Verify Device with Signal](#login-and-verify-device-with-signal)
3.  [Login &amp; Verify Device with Signal](#login-and-verify-device-with-signal)
4.  [Create a Systemd User Unit](#create-a-systemd-user-unit)


## Setup Storage & Cross Communication Volumes {#setup-storage-and-cross-communication-volumes}
## Setup Storage &amp; Cross Communication Volumes {#setup-storage-and-cross-communication-volumes}

```bash
mkdir -p ~/.cache/docker-bitlbee/bitlbee


@@ 48,7 48,7 @@ docker run \
```


## Login & Verify Device with Signal {#login-and-verify-device-with-signal}
## Login &amp; Verify Device with Signal {#login-and-verify-device-with-signal}

More official instructions are available at [libpurple-signald HOWTO.md](https://github.com/hoehermann/libpurple-signald/blob/master/HOWTO.md).



@@ 106,11 106,11 @@ save

## Create a Systemd User Unit {#create-a-systemd-user-unit}

For more on how systemd works see [Systemd/User - How It Works](https://wiki.archlinux.org/title/Systemd/User#How%5Fit%5Fworks).
For more on how systemd works see [Systemd/User - How It Works](https://wiki.archlinux.org/title/Systemd/User#How_it_works).

Make a signald service at `.config/systemd/user/docker-signald.service`

```conf
```cfg
[Unit]
Description=A signald container service



@@ 125,7 125,7 @@ WantedBy=default.target

Make the bitlbee service at `~/.config/systemd/user/docker-bitlbee.service`

```conf
```cfg
[Unit]
Description=A Bitlbee IRC bridge container
Wants=docker-signald.service


@@ 155,4 155,4 @@ systemctl --user  enable docker-signald.service

## Conclusion {#conclusion}

That should do it. I hope this has helped you run bitlbee on your system.
That should do it. I hope this has helped you run bitlbee on your system.
\ No newline at end of file

M content/articles/running-znc-bouncer-with-k3s.md => content/articles/running-znc-bouncer-with-k3s.md +1 -1
@@ 227,4 227,4 @@ machine vault.local login mynick port 32667 password myuser/libera:MY_ZNC_PASSWO

## Conclusion {#conclusion}

I truly hope you'll find that running your own ZNC on Kubernetes is a great learning experience, and works quite well! Be well, see you on irc.libera.chat!
I truly hope you'll find that running your own ZNC on Kubernetes is a great learning experience, and works quite well! Be well, see you on irc.libera.chat!
\ No newline at end of file

M content/articles/the-git-add-manual-review.md => content/articles/the-git-add-manual-review.md +35 -35
@@ 73,40 73,40 @@ git add --edit
This opens up my `$EDITOR` (vim) and then I can tweak this diff. Here's my edit that leaves the `macOS` header in the first diff chunk and important bits of the second chunk.

````nil
 diff --git a/README.md b/README.md
 index eb107d0..fa359f8 100644
 --- a/README.md
 +++ b/README.md
 @@ -48,25 +48,28 @@ brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-rel
  brew update
  brew install msodbcsql mssql-tools
  ```
  https://stackoverflow.com/questions/44527452/cant-open-lib-odbc-driver-13-for-sql-server-sym-linking-issue

  #### Installing MySQL

 ##### macOS
 -
 -TODO: Probably something like `brew install mysql` or `brew install mariadb`.
 -
  ##### amzn2

  ```bash
  sudo yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
  sudo yum install -y mysql-community-client
  ```

 +How about add some more description here.
 +
 +I want to leave this important bit in though!
 +
  ### Installing Project Dependencies

  ```
  poetry install
  ```

  If you get a clang/ssl error during `poetry install`, it's possible your linker+brew+Apple aren't playing well together. Try pointing your linker to openssl directly, via:
diff --git a/README.md b/README.md
index eb107d0..fa359f8 100644
--- a/README.md
+++ b/README.md
@@ -48,25 +48,28 @@ brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-rel
 brew update
 brew install msodbcsql mssql-tools
 ```
 https://stackoverflow.com/questions/44527452/cant-open-lib-odbc-driver-13-for-sql-server-sym-linking-issue

 #### Installing MySQL

##### macOS
-
-TODO: Probably something like `brew install mysql` or `brew install mariadb`.
-
 ##### amzn2

 ```bash
 sudo yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
 sudo yum install -y mysql-community-client
 ```

+How about add some more description here.
+
+I want to leave this important bit in though!
+
 ### Installing Project Dependencies

 ```
 poetry install
 ```

 If you get a clang/ssl error during `poetry install`, it's possible your linker+brew+Apple aren't playing well together. Try pointing your linker to openssl directly, via:
````




@@ 137,4 137,4 @@ Pretty easy, answer the prompts and make your decisions. When you're done the in

## Conclusion {#conclusion}

I've been actively trying to make cleaner and smaller commits to simplify code review for my colleagues. I'm hopeful that what I learned here with `git-add` will help the next time I'm faced with a messy or complicated diff that could be split into simpler pieces. Thanks for reading!
I've been actively trying to make cleaner and smaller commits to simplify code review for my colleagues. I'm hopeful that what I learned here with `git-add` will help the next time I'm faced with a messy or complicated diff that could be split into simpler pieces. Thanks for reading!
\ No newline at end of file

M content/articles/the-git-diff-manual-review.md => content/articles/the-git-diff-manual-review.md +13 -18
@@ 11,45 11,40 @@ This is a fairly short, but informative, manual for a powerful command in the gi
1.  Show changes between the working tree and the index (or another tree).

    AKA What you could tell git to add to the staging area for a commit.

    ```sh
          git diff
    git diff
    ```
2.  Show changes between the index and tree.

    AKA Show what is staged for the next commit.

    ```sh
          git diff --cached HEAD
    git diff --cached HEAD
    ```
3.  Show changes between two trees.

    AKA Show difference in between commits

    ```sh
          # Show diff for the last few commits to where our branch is now.
          git diff HEAD~3 HEAD
    # Show diff for the last few commits to where our branch is now.
    git diff HEAD~3 HEAD

          # For ranges
          git diff 9a29ab57 HEAD
          git diff 9a29ab57..HEAD
    # For ranges
    git diff 9a29ab57 HEAD
    git diff 9a29ab57..HEAD
    ```
4.  Show changes between two blob objects.

    AKA diff specific files.

    ```sh
          # Show changes to the config.toml file in the last 3 commits.
          git diff HEAD~3..HEAD -- ./config.toml
    # Show changes to the config.toml file in the last 3 commits.
    git diff HEAD~3..HEAD -- ./config.toml
    ```
5.  Show changes between two files on disk.

    AKA Show difference in your working tree, to what's in a commit.

    ```sh
          # What has changed about these files.
          git diff HEAD -- ./config.toml
          git diff HEAD~3 -- ./blog.org
    # What has changed about these files.
    git diff HEAD -- ./config.toml
    git diff HEAD~3 -- ./blog.org
    ```

The way I wrote these here is close to how they're written in the manual. Understanding `git-diff` is aided by understanding the flow of git commits and objects; concepts like the index (staging area), the working tree, and references. I suggest reviewing the `gittutorial` manuals to brush up on these concepts if you need to.


@@ 62,4 57,4 @@ Some other highlights of the manual:
-   in the weeds info about diff algorithm options.
-   Some options that really only exist for writing scripts against.

Thanks for reading this manual review! Be well.
Thanks for reading this manual review! Be well.
\ No newline at end of file

M content/articles/the-git-log-manual-review.md => content/articles/the-git-log-manual-review.md +7 -7
@@ 23,7 23,7 @@ This is a one-dimensional and basic usage of `git log`, and that has been perfec
The log can all but replace the github network page, or fancy proprietary git GUI tools.

```sh
 git log --all --graph
git log --all --graph
```

This is remarkably good for visualizing the basics of whose doing what, and where. I can imagine in large projects this view could get a bit unwieldy, in which case you'll need to use it with some surgery. In normal size projects this is a good way to quickly get your bearings.


@@ 36,7 36,7 @@ It's worth a note that the `--decorate` option which shows the full ref names fo
There are times when seeing how branches have been merged into each other is useful, but much of the time this is just noise. Filter out the noise:

```sh
 git log --no-merges
git log --no-merges
```




@@ 56,7 56,7 @@ It's a bit trickier when a file has changed locations of course, but `git log` h
You want to know how a certain section of a file changed.

```nil
 git log -L 1,20:app.py
git log -L 1,20:app.py
```

Show every commit, and diffs for them, which makes an alteration to the first 20 lines of a python file. Probably going to consist of changes that document every time you made new imports. :)


@@ 64,7 64,7 @@ Show every commit, and diffs for them, which makes an alteration to the first 20
You can also look at commits which alter a particular function in a file.

```nil
 git log -L :create_app:app.py
git log -L :create_app:app.py
```

This will show all commits which affected the `create_app` function. Extremely useful!


@@ 77,13 77,13 @@ The above commands automatically shows the full diffs for each commit, but if yo
You can use `-s`, `--no-patch` to suppress the diff output entirely.

```sh
 git log --no-patch -L :create_app:app.py
git log --no-patch -L :create_app:app.py
```

To format the commits, the `--pretty` options are really convenient. The options in increasingly more verbose order are `oneline`, `short`, `medium`, `full`, `fuller`, `email`, `raw`. You can also of course set your own formats.

```sh
 git log --no-patch --pretty=oneline -L :create_app:app.py
git log --no-patch --pretty=oneline -L :create_app:app.py
```




@@ 135,4 135,4 @@ git log --perl-regexp --regexp-ignore-case --grep='^sep[ae]rate\s'

## Conclusion {#conclusion}

I really enjoyed learning more about `git log` and I hope that it prompts me to ask more interesting questions of my repositories. All the best! Thanks for reading the manual review!
I really enjoyed learning more about `git log` and I hope that it prompts me to ask more interesting questions of my repositories. All the best! Thanks for reading the manual review!
\ No newline at end of file

M content/articles/the-git-manual-review.md => content/articles/the-git-manual-review.md +1 -1
@@ 20,4 20,4 @@ Reviews:
-   [git-log](/articles/the-git-log-manual-review)
-   [git-rebase](/articles/the-git-rebase-manual-review)
-   [git-diff](/articles/the-git-diff-manual-review)
-   [git-add](/articles/the-git-add-manual-review)
-   [git-add](/articles/the-git-add-manual-review)
\ No newline at end of file

M content/articles/the-git-rebase-manual-review.md => content/articles/the-git-rebase-manual-review.md +1 -1
@@ 203,4 203,4 @@ E---H'---I'---J'  topicA

There is even more to discover about this command. In this blog I covered only what I know and use in my day to day work. I'm merely an aspiring time traveler! Thanks for reading this manual review! I hope it has been helpful.

**Update:** The good people at <https://sourcehut.org> have put together the pinnacle guide on `git-rebase` at <https://git-rebase.io/>.
**Update:** The good people at <https://sourcehut.org> have put together the pinnacle guide on `git-rebase` at <https://git-rebase.io/>.
\ No newline at end of file

M content/articles/the-giteveryday-manual-review.md => content/articles/the-giteveryday-manual-review.md +1 -1
@@ 10,4 10,4 @@ The `giteveryday(7)` manual seeks to describe a minimal set of useful commands f

There really isn't much of a reason to read this manual. I actually found it rather interesting, but only from an archaeology of software development point of view. It feels a bit outdated for a beginning programmer. It describes ways to email patches to developers, and apply patches from emails, as well as how to spin up a git daemon or a git web front-end. I recommend scanning this manual quickly for the example commands that are being described and only reading more if something catches your interest.

Thanks for reading this manual review!
Thanks for reading this manual review!
\ No newline at end of file

M content/articles/the-gitrevisions-manual-review.md => content/articles/the-gitrevisions-manual-review.md +9 -9
@@ 25,14 25,14 @@ It's difficult to go far in git without using refnames. These are things like `H

There are these other special HEAD refnames which stay consistent in their meaning, even as you change or alter the state of your repository.

| VARIANT            | DESCRIPTION                                                                               |
|--------------------|-------------------------------------------------------------------------------------------|
| @                  | An alias for HEAD, when used on its own.                                                  |
| HEAD               | commit on which you based changes in the working tree                                     |
| FETCH\_HEAD        | head of last fetched branch using `git fetch`                                             |
| ORIG\_HEAD         | created internally by git when git is doing an operation that moves HEAD in a drastic way |
| MERGE\_HEAD        | commit which you into your branch with `git merge`                                        |
| CHERRY\_PICK\_HEAD | commit you are cherry picking when you run `git cherry-pick`                              |
| VARIANT          | DESCRIPTION                                                                               |
|------------------|-------------------------------------------------------------------------------------------|
| @                | An alias for HEAD, when used on its own.                                                  |
| HEAD             | commit on which you based changes in the working tree                                     |
| FETCH_HEAD       | head of last fetched branch using `git fetch`                                             |
| ORIG_HEAD        | created internally by git when git is doing an operation that moves HEAD in a drastic way |
| MERGE_HEAD       | commit which you into your branch with `git merge`                                        |
| CHERRY_PICK_HEAD | commit you are cherry picking when you run `git cherry-pick`                              |


### Parent selection with `<rev>^[<n>]` {#parent-selection-with-rev-n}


@@ 131,4 131,4 @@ git diff origin/master:blog.org 'origin/master@{1 week ago}:blog.org'

## Conclusion {#conclusion}

After reading and reviewing this manual, I am planning to commands which leverage the power of revisions like `git-log`, `git-rebase`, and `git-push`. I think I'll be coming back to this document pretty often as I dig into these other tools. As always, thank you so much for reading this manual review!
After reading and reviewing this manual, I am planning to commands which leverage the power of revisions like `git-log`, `git-rebase`, and `git-push`. I think I'll be coming back to this document pretty often as I dig into these other tools. As always, thank you so much for reading this manual review!
\ No newline at end of file

M content/articles/the-gittutorial-manual-review.md => content/articles/the-gittutorial-manual-review.md +2 -2
@@ 36,7 36,7 @@ git log -p HEAD..FETCH_HEAD

The usage of `git fetch` and the `FETCH_HEAD` symbol as a way to peek at code. This also demonstrates the concept of commit ranges, which I rarely use and probably could use more.

The two-dot `..` form means: show everything that is reachable from FETCH\_HEAD, but exclude anything that is reachable from HEAD. The example in the manual is a peek at Bob's changes absent of Alice's changes.
The two-dot `..` form means: show everything that is reachable from FETCH_HEAD, but exclude anything that is reachable from HEAD. The example in the manual is a peek at Bob's changes absent of Alice's changes.

The three-dot `...` form means: show everything that is reachable from either, but exclude anything that is reachable from both. This is a view of Alice's changes combined with Bob's changes.



@@ 85,4 85,4 @@ The index let's git show us the difference between the state of the working dire

The `gittutorial-2` is worth a look, you'll learn about how git works in a way which should help you master it. There's still a lot more for me to read about git. My plan is to move on to the `giteveryday` manual. I've also been trying to work my way through the [Git User's Manual](https://git.github.io/htmldocs/user-manual.html), as well as the manual for [Magit](https://magit.vc/manual/magit.html); a great interface to git from within Emacs. It doesn't shield you from git, but like `gitk`, it gives you a different way to visualize and manipulate the database of git objects.

Go RTFM! And as always, thanks for reading the manual review!
Go RTFM! And as always, thanks for reading the manual review!
\ No newline at end of file

M content/articles/the-tmux-manual-review.md => content/articles/the-tmux-manual-review.md +1 -1
@@ 83,4 83,4 @@ There are a few session manager tools out there for tmux, and all of them addres

## Conclusion {#conclusion}

I can't emphasize enough that you should take a few hours to read _The Tao of Tmux_ book. It is a much more thorough walkthrough of tmux concepts than I gave here. It has illustrations and examples that will illuminate the ways you can use tmux to do whatever fits your workflow. Best of luck on your journey with tmux! Thanks for reading!
I can't emphasize enough that you should take a few hours to read _The Tao of Tmux_ book. It is a much more thorough walkthrough of tmux concepts than I gave here. It has illustrations and examples that will illuminate the ways you can use tmux to do whatever fits your workflow. Best of luck on your journey with tmux! Thanks for reading!
\ No newline at end of file

M content/articles/the_curl_manual_review.md => content/articles/the_curl_manual_review.md +11 -11
@@ 314,7 314,7 @@ When requests start getting large, difficult to remember, or tedious to type; yo

This saves our complicated configuration.

_bulk\_station\_download.txt_
_bulk_station_download.txt_

```txt
url = "https://www.ncei.noaa.gov/data/global-hourly/access/[2012-2019]/{7294023234,72503014732}.csv"


@@ 350,17 350,17 @@ curl \

This [StackOverflow](https://stackoverflow.com/questions/18215389/how-do-i-measure-request-and-response-times-at-once-using-curl) has great information about how to do this, and the `curl` manual has a list of the templating variables you can use in your `-w` template files.

_curl\_request\_info.txt_
_curl_request_info.txt_

```txt
    time_namelookup:  %{time_namelookup}\n
       time_connect:  %{time_connect}\n
    time_appconnect:  %{time_appconnect}\n
   time_pretransfer:  %{time_pretransfer}\n
      time_redirect:  %{time_redirect}\n
 time_starttransfer:  %{time_starttransfer}\n
                    ----------\n
         time_total:  %{time_total}\n
   time_namelookup:  %{time_namelookup}\n
      time_connect:  %{time_connect}\n
   time_appconnect:  %{time_appconnect}\n
  time_pretransfer:  %{time_pretransfer}\n
     time_redirect:  %{time_redirect}\n
time_starttransfer:  %{time_starttransfer}\n
                   ----------\n
        time_total:  %{time_total}\n
```

Then make a request. This one doesn't even download the file, it just pipes it's content to `/dev/null` and shows the stats.


@@ 391,4 391,4 @@ There were a few other things I thought looked cool, but didn't play with.
-   Abort slow downloads after a given time `-y`, `--speed-time`
-   Retries with `--retry`

Remember to RTFM! Thanks for reading my review.
Remember to RTFM! Thanks for reading my review.
\ No newline at end of file

M content/resume.md => content/resume.md +3 -3
@@ 22,7 22,7 @@ To build, architect, and operate data-centric software applications. To create p

### [Carbon Lighthouse](https://www.carbonlighthouse.com/) - San Francisco, CA {#carbon-lighthouse-san-francisco-ca}

**2016-Present -- VP of Software < SWE Manager < Lead SWE < Sr. SWE**<br />
**2016-Present -- VP of Software &lt; SWE Manager &lt; Lead SWE &lt; Sr. SWE**<br />
Mission driven company to stop climate change through energy efficiency in commercial real estate.<br />
Led a devops team building energy modeling applications on AWS, Kubernetes, and Python.



@@ 54,7 54,7 @@ Was embedded at Nike Headquarters on the [Nike By You (aka Nike iD)](https://www

### [Cascade Energy](http://www.cascadeenergy.com) - Portland, OR {#cascade-energy-portland-or}

**2012-2016 -- Sr. SWE < SWE**<br />
**2012-2016 -- Sr. SWE &lt; SWE**<br />
Industrial Energy Efficiency Consultancy.<br />
Full-stack development of industrial energy management tool [SENSEI](http://energysensei.com/).



@@ 82,4 82,4 @@ Brand advertising, design, strategy and experience agency. ID Branding was acqui
Portland State University, September 2009-Jan 2010 (No Degree)<br />
Pacific University, August 2004 -- March 2006 (No Degree)<br />
University of Oregon September 2002 -- June 2004 (No Degree)<br />
La Grande High School, Graduated 2002<br />
La Grande High School, Graduated 2002<br />
\ No newline at end of file