Compare commits
33 Commits
columns
...
6730b1e54e
Author | SHA1 | Date | |
---|---|---|---|
6730b1e54e | |||
ec46e78628 | |||
1e9a9f6766 | |||
20e58cd15f | |||
64f9f490ad | |||
42cbd0e54a | |||
25a2de77a1 | |||
3e2f9c0684 | |||
1c3ae5b8f8 | |||
afcf272607 | |||
3059c14648 | |||
7c059148d5 | |||
023e99436e | |||
d87e798d38 | |||
20b46d3b02 | |||
052a919f12 | |||
035a3c2110 | |||
2ca498cf20 | |||
efecc52605 | |||
1e4baa950f | |||
8f5f042794 | |||
600cc9e51f | |||
65b3ad7fbf | |||
a966b59b66 | |||
bfc93af28f | |||
7a73eafa85 | |||
9f90810e0f | |||
dca5d47578 | |||
495f964297 | |||
f234121e3f | |||
f76b8e7bf4 | |||
2c5c0750bf | |||
bda333c88a |
41
content/acoustic-panels.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
Title: Theatre Acoustic Panels
|
||||||
|
Date: 2021-10-21
|
||||||
|
Category: Creations
|
||||||
|
Summary: Panels for acoustic treatment in my home theatre.
|
||||||
|
Short: 3
|
||||||
|
|
||||||
|
Acoustic treatment is one of the most overlooked aspects of home audio. There's
|
||||||
|
no point in spending money on premium speakers if the room they are playing in
|
||||||
|
has poor acoustics.
|
||||||
|
|
||||||
|
The primary purpose of acoustic panels is to reduce the reverberations caused by
|
||||||
|
sound reflecting off the smooth walls of the theatre. The path of the reflected
|
||||||
|
sound is a longer distance to your ear compared to the sound coming directly
|
||||||
|
from the speaker. This causes the reflected sound to be delayed by the time it
|
||||||
|
reaches your ear. The delayed signal interferes with itself, causing comb
|
||||||
|
filtering which distorts the signal.
|
||||||
|
|
||||||
|
Acoustic panels are placed geometrically where the sound from the speakers would
|
||||||
|
reflect off the wall to reach the listener's ears. The insulation inside the
|
||||||
|
panels absorbs energy from the soundwave which reduces its volume and
|
||||||
|
interference.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
I made six frames in the wood shop of my local makerspace, Protospace. After
|
||||||
|
cutting the 1x4" pine boards to length, I made a jig so I could quickly join
|
||||||
|
them together with screws.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
I added 4" batts of Rockwool insulation into each frame after it was assembled.
|
||||||
|
I then wrapped the frame with black speaker fabric and stabled it in place while
|
||||||
|
trying to pull it taut.
|
||||||
|
|
||||||
|
I sat in my theatre while a friend slid a handheld mirror along the wall until I
|
||||||
|
could see the middle of the speaker in its reflection. This told me the centre
|
||||||
|
point of where to mount each panel because the reflected sound would take the
|
||||||
|
same path to my ear.
|
||||||
|
|
||||||
|
<span class="aside">Four in the front, two in the back</span>
|
||||||
|

|
@@ -3,6 +3,7 @@ Date: 2021-04-08
|
|||||||
Category: Writing
|
Category: Writing
|
||||||
Summary: Details about the backup system for all of my data.
|
Summary: Details about the backup system for all of my data.
|
||||||
Wide: true
|
Wide: true
|
||||||
|
Short: 1
|
||||||
|
|
||||||
[TOC]
|
[TOC]
|
||||||
|
|
||||||
@@ -83,9 +84,8 @@ sslcacertfile = /etc/ssl/certs/ca-certificates.crt
|
|||||||
|
|
||||||
### Notes
|
### Notes
|
||||||
|
|
||||||
I use Standard Notes to take notes and wrote the tool
|
I use Standard Notes to take notes and wrote the tool [standardnotes-fs](https://github.com/tannercollin/standardnotes-fs)
|
||||||
[standardnotes-fs](https://github.com/tannercollin/standardnotes-fs) to mount my
|
to mount my notes as a file system to view and edit them as plain text files.
|
||||||
notes as a file system to view and edit them as plain text files.
|
|
||||||
|
|
||||||
I take weekly backups of the mounted file system on my media server with cron:
|
I take weekly backups of the mounted file system on my media server with cron:
|
||||||
|
|
||||||
@@ -130,9 +130,7 @@ in case Telegram disappears or my account gets banned.
|
|||||||
<span class="aside">Saves the messages to a sqlite db</span>
|
<span class="aside">Saves the messages to a sqlite db</span>
|
||||||
|
|
||||||
Telegram includes a data export feature, but it can't be automated. Instead I
|
Telegram includes a data export feature, but it can't be automated. Instead I
|
||||||
run the deprecated software
|
run the deprecated software [telegram-export](https://github.com/expectocode/telegram-export) hourly with cron:
|
||||||
[telegram-export](https://github.com/expectocode/telegram-export) hourly with
|
|
||||||
cron:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
0 * * * * bash -c 'timeout 50m /home/tanner/opt/telegram-export/env/bin/python -m telegram_export' > /var/log/telegramexport.log 2>&1
|
0 * * * * bash -c 'timeout 50m /home/tanner/opt/telegram-export/env/bin/python -m telegram_export' > /var/log/telegramexport.log 2>&1
|
||||||
@@ -143,16 +141,12 @@ Hasn't corrupted the database yet.
|
|||||||
|
|
||||||
### Phone
|
### Phone
|
||||||
|
|
||||||
[Signal
|
[Signal Messenger](https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms&hl=en_CA&gl=US) automatically exports a copy of my text messages database, and
|
||||||
Messenger](https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms&hl=en_CA&gl=US)
|
[Aegis](https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis&hl=en_CA&gl=US) allows me to export an encrypted JSON file of my two-factor authentication
|
||||||
automatically exports a copy of my text messages database, and
|
|
||||||
[Aegis](https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis&hl=en_CA&gl=US)
|
|
||||||
allows me to export an encrypted JSON file of my two-factor authentication
|
|
||||||
codes.
|
codes.
|
||||||
|
|
||||||
I mount my phone's internal storage as a file system on my desktop using
|
I mount my phone's internal storage as a file system on my desktop using
|
||||||
[adbfs-rootless](https://github.com/spion/adbfs-rootless). I then rsync the
|
[adbfs-rootless](https://github.com/spion/adbfs-rootless). I then rsync the files over to my media server:
|
||||||
files over to my media server:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ./adbfs ~/mntphone
|
$ ./adbfs ~/mntphone
|
||||||
@@ -180,9 +174,8 @@ All the files will be included in the 1 TB hard drive backup rotations.
|
|||||||
|
|
||||||
### Web Services
|
### Web Services
|
||||||
|
|
||||||
Web services that I run like [txt.t0.vc](https://txt.t0.vc) and
|
Web services that I run like [txt.t0.vc](https://txt.t0.vc) and [QotNews](https://news.t0.vc) are backed up daily, weekly,
|
||||||
[QotNews](https://news.t0.vc) are backed up daily, weekly, and monthly depending
|
and monthly depending on how frequently the data changes.
|
||||||
on how frequently the data changes.
|
|
||||||
|
|
||||||
I run `rdiff-backup` on the remote server with cron:
|
I run `rdiff-backup` on the remote server with cron:
|
||||||
|
|
||||||
@@ -205,11 +198,9 @@ the `rdiff-backup --server` command for security.
|
|||||||
|
|
||||||
### Protospace
|
### Protospace
|
||||||
|
|
||||||
I run a lot of services for [Protospace](https://protospace.ca/), my city's
|
I run a lot of services for [Protospace](https://protospace.ca/), my city's makerspace.
|
||||||
makerspace.
|
|
||||||
|
|
||||||
The member portal I wrote called [Spaceport](https://my.protospace.ca/) creates
|
The member portal I wrote called [Spaceport](https://my.protospace.ca/) creates an archive I download daily:
|
||||||
an archive I download daily:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
40 10 * * * wget --content-disposition \
|
40 10 * * * wget --content-disposition \
|
||||||
@@ -219,8 +210,7 @@ an archive I download daily:
|
|||||||
https://api.my.protospace.ca/backup/
|
https://api.my.protospace.ca/backup/
|
||||||
```
|
```
|
||||||
|
|
||||||
The website and [wiki](https://wiki.protospace.ca) that I sysadmin get
|
The website and [wiki](https://wiki.protospace.ca) that I sysadmin both get backed up weekly:
|
||||||
backed up weekly:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
0 12 * * 1 mysqldump --all-databases > /var/www/dump.sql
|
0 12 * * 1 mysqldump --all-databases > /var/www/dump.sql
|
||||||
@@ -228,9 +218,7 @@ backed up weekly:
|
|||||||
20 12 * * 1 rdiff-backup /var/www pshostbak@remotebackup::/mnt/backup/remote/pshostbak/weekly/www/
|
20 12 * * 1 rdiff-backup /var/www pshostbak@remotebackup::/mnt/backup/remote/pshostbak/weekly/www/
|
||||||
```
|
```
|
||||||
|
|
||||||
The Protospace [Minecraft
|
The Protospace [Minecraft server](http://games.protospace.ca:8123/?worldname=world&mapname=flat&zoom=3&x=74&y=64&z=354) I run gets backed up daily:
|
||||||
server](http://games.protospace.ca:8123/?worldname=world&mapname=flat&zoom=3&x=74&y=64&z=354)
|
|
||||||
I run gets backed up daily:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
00 15 * * * date -Iseconds > /home/tanner/minecraft/backup_check.txt
|
00 15 * * * date -Iseconds > /home/tanner/minecraft/backup_check.txt
|
||||||
@@ -299,14 +287,11 @@ correctly.
|
|||||||
## Rotating Hard Drives
|
## Rotating Hard Drives
|
||||||
|
|
||||||
I rotate through 2.5" 1 TB hard drives each Saturday when I do a backup. They
|
I rotate through 2.5" 1 TB hard drives each Saturday when I do a backup. They
|
||||||
are quite cheap at [$65 CAD](https://www.memoryexpress.com/Products/MX65194)
|
are quite cheap at [$65 CAD](https://www.memoryexpress.com/Products/MX65194) each so I can have a bunch floating around.
|
||||||
each so I can have a bunch floating around.
|
|
||||||
|
|
||||||
|
|
||||||
I keep one connected to the server, one in my bag, one offsite, one at my
|
I keep one connected to the server, one in my bag, one offsite, one at my
|
||||||
mother's house, and one at my dad's house. Every Saturday I run the script above
|
mother's house, and one at my dad's house. Every Saturday I run the script above
|
||||||
to take a copy and then swap the drive with the one in my bag. It then gets
|
to take a copy and then swap the drive with the one in my bag. It then gets <span class="aside">I go back home about twice per year</span>
|
||||||
<span class="aside">I go back home about twice per year</span>
|
|
||||||
swapped when I visit my offsite location. Same for when I visit my parents. This
|
swapped when I visit my offsite location. Same for when I visit my parents. This
|
||||||
means that all hard drives eventually get rotated through with new data and
|
means that all hard drives eventually get rotated through with new data and
|
||||||
don't sit too long unpowered.
|
don't sit too long unpowered.
|
||||||
|
@@ -3,6 +3,7 @@ Date: 2021-04-10
|
|||||||
Category: Writing
|
Category: Writing
|
||||||
Summary: Bypass ISP blocked ports using VPN port forwarding for public access.
|
Summary: Bypass ISP blocked ports using VPN port forwarding for public access.
|
||||||
Wide: true
|
Wide: true
|
||||||
|
Short: 2
|
||||||
|
|
||||||
[TOC]
|
[TOC]
|
||||||
|
|
||||||
@@ -14,16 +15,15 @@ This article explains how I set it up and is targeted towards Linux sysadmins.
|
|||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
I have a cheap $5 per month virtual server with [Digital
|
I have a cheap $5 per month virtual server with [Digital Ocean](https://digitalocean.com) that runs
|
||||||
Ocean](https://digitalocean.com) that runs Debian GNU/Linux 10. An OpenVPN
|
Debian GNU/Linux 10. An OpenVPN server is running on this virtual server.
|
||||||
server is running on this virtual server.
|
|
||||||
|
|
||||||
My media server at home has an OpenVPN client connected to the server and is
|
My media server at home has an OpenVPN client connected to the server and is
|
||||||
assigned a static IP on the VPN network.
|
assigned a static IP on the VPN network.
|
||||||
|
|
||||||
The virtual server has routing enabled and forwards inbound traffic __from the
|
The virtual server has routing enabled and forwards inbound traffic __from the
|
||||||
internet__ to my media server at home. This allows me to have external HTTP and SSH
|
internet__ to my media server at home. This allows me to have external HTTP and
|
||||||
access.
|
SSH access.
|
||||||
|
|
||||||
## Server Setup
|
## Server Setup
|
||||||
|
|
||||||
@@ -40,8 +40,7 @@ $ sudo apt install openvpn ufw
|
|||||||
|
|
||||||
### OpenVPN Server
|
### OpenVPN Server
|
||||||
|
|
||||||
These steps roughly follow [this
|
These steps roughly follow [this guide](https://wiki.debian.org/OpenVPN#TLS-enabled_VPN).
|
||||||
guide](https://wiki.debian.org/OpenVPN#TLS-enabled_VPN).
|
|
||||||
|
|
||||||
Generate TLS certificates and keys:
|
Generate TLS certificates and keys:
|
||||||
|
|
||||||
@@ -52,7 +51,7 @@ $ sudo make-cadir easy-rsa/
|
|||||||
$ sudo chown -R tanner:tanner easy-rsa/
|
$ sudo chown -R tanner:tanner easy-rsa/
|
||||||
```
|
```
|
||||||
|
|
||||||
Replace `tanner` with your own username, this is temporary.
|
Replace `tanner` with your Linux username, this is temporary.
|
||||||
|
|
||||||
<span class="aside">The `.rnd` file prevents a warning</span>
|
<span class="aside">The `.rnd` file prevents a warning</span>
|
||||||
|
|
||||||
@@ -88,7 +87,8 @@ We make a `mediaserver` client because we want to assign a static IP to it. You
|
|||||||
need to make a different one for each client you want with a static IP.
|
need to make a different one for each client you want with a static IP.
|
||||||
|
|
||||||
Also, if you want generic clients that all get dynamic IPs for use on your
|
Also, if you want generic clients that all get dynamic IPs for use on your
|
||||||
laptop, phone, etc. to protect you from public WiFi, create only a single extra one:
|
laptop, phone, etc. to protect you from public WiFi (like a normal VPN), create
|
||||||
|
only a single extra one:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ./easyrsa build-client-full client nopass # optional
|
$ ./easyrsa build-client-full client nopass # optional
|
||||||
@@ -135,7 +135,8 @@ $ sudo mkdir ccd
|
|||||||
$ sudo touch ccd/mediaserver
|
$ sudo touch ccd/mediaserver
|
||||||
```
|
```
|
||||||
|
|
||||||
Replace `mediaserver` with whatever client name you used above. Edit it like so:
|
Replace `mediaserver` with whatever client name you used above. Edit it like
|
||||||
|
so:
|
||||||
|
|
||||||
<span class="aside">Your home server will be `10.8.0.100`</span>
|
<span class="aside">Your home server will be `10.8.0.100`</span>
|
||||||
|
|
||||||
@@ -220,11 +221,11 @@ COMMIT
|
|||||||
Replace `123.123.123.123` with your VPN server's external IP address and `eth0`
|
Replace `123.123.123.123` with your VPN server's external IP address and `eth0`
|
||||||
with the external interface.
|
with the external interface.
|
||||||
|
|
||||||
This will forward TCP traffic on port 2222 to your home server. If you want to use
|
This will forward TCP traffic on port 2222 to your home server. If you want to
|
||||||
port 22, then you need to set the VPN SSH server to something else.
|
use port 22, then you need to set the VPN SSH server to something else.
|
||||||
|
|
||||||
A full example of `/etc/ufw/before.rules` with other ports included can be found
|
A full example of `/etc/ufw/before.rules` with other ports included can be
|
||||||
here:
|
found here:
|
||||||
|
|
||||||
[https://txt.t0.vc/URUG](https://txt.t0.vc/URUG)
|
[https://txt.t0.vc/URUG](https://txt.t0.vc/URUG)
|
||||||
|
|
||||||
@@ -247,7 +248,8 @@ $ sudo apt install openvpn
|
|||||||
|
|
||||||
### Client Configs
|
### Client Configs
|
||||||
|
|
||||||
For static IP clients (like your home server), create the config file `/etc/openvpn/client.conf`:
|
For static IP clients (like your home server), create the config file
|
||||||
|
`/etc/openvpn/client.conf`:
|
||||||
|
|
||||||
```
|
```
|
||||||
client
|
client
|
||||||
@@ -287,7 +289,8 @@ $ sudo cat /etc/openvpn/easy-rsa/pki/ca.crt
|
|||||||
|
|
||||||
Also replace `vpn.example.com` with the subdomain you assigned earlier.
|
Also replace `vpn.example.com` with the subdomain you assigned earlier.
|
||||||
|
|
||||||
For device clients (like your laptop and phone), create the config file `client.ovpn`:
|
For device clients (like your laptop and phone), create the config file
|
||||||
|
`client.ovpn`:
|
||||||
|
|
||||||
<span class="aside">`redirect-gateway def1` forces traffic over the VPN</span>
|
<span class="aside">`redirect-gateway def1` forces traffic over the VPN</span>
|
||||||
|
|
||||||
@@ -376,7 +379,7 @@ To add your VPN on Gnome, open VPN settings, import file, and select
|
|||||||
You should now be fine to access your home server from over the internet.
|
You should now be fine to access your home server from over the internet.
|
||||||
|
|
||||||
To forward additional ports, just edit the `/etc/ufw/before.rules` file like
|
To forward additional ports, just edit the `/etc/ufw/before.rules` file like
|
||||||
above.
|
above and apply the changes to `ufw`.
|
||||||
|
|
||||||
You can now point a domain to your virtual server's IP and use that to connect
|
You can now point a domain to your virtual server's IP and use that to connect
|
||||||
to your home server. Use a CNAME to make it easy to change later:
|
to your home server. Use a CNAME to make it easy to change later:
|
||||||
|
2
content/extra/robots.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
User-agent: *
|
||||||
|
Disallow:
|
38
content/garage-door-opener.md
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
Title: Garage Door Opener Hack
|
||||||
|
Date: 2021-12-26
|
||||||
|
Category: Creations
|
||||||
|
Summary: Hacking my garage door opener to work over Wifi.
|
||||||
|
Short: 5
|
||||||
|
|
||||||
|
In the quest to automate as much of my house as possible, I thought it would be
|
||||||
|
useful to be able to remotely control my garage door from my home automation
|
||||||
|
system. If I suspected that I forgot to close it while leaving, I could check in
|
||||||
|
my security cameras and then close it from anywhere. It's nice having this peace
|
||||||
|
of mind, even if it almost never happens.
|
||||||
|
|
||||||
|
Instead of reverse engineering the wireless protocol, cracking the encryption,
|
||||||
|
and sending my own commands, I figured it would be much easier to hack the
|
||||||
|
hardware. I cracked open a spare remote to find that it contained a basic PCB
|
||||||
|
with simple tactile switches.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
My plan was to solder an Arduino controlled relay in parallel with the button
|
||||||
|
that toggled the garage door. I would also power the remote from the 3 V pin. I
|
||||||
|
soldered four wires on to the appropriate pins.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
I drilled a hole in the plastic case and routed the wires through it while
|
||||||
|
reassembling the remote. It's connected to an Adafruit ESP8266 Arduino with a
|
||||||
|
relay module shield.
|
||||||
|
|
||||||
|
The Arduino joins my isolated home automation Wifi network and connects over
|
||||||
|
MQTT, a simple messaging protocol, to my automation server. When it receives a
|
||||||
|
command over MQTT it toggles the relay on for a quarter of a second and then
|
||||||
|
off, simulating a button press.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Update: this system has been flawless for two months now. It's worked every time
|
||||||
|
I've tried to toggle the door and has never opened by mistake.
|
@@ -1,7 +1,8 @@
|
|||||||
Title: Hand of Ozymandias
|
Title: Hand of Ozymandias
|
||||||
Date: 2012-03-23
|
Date: 2012-03-23
|
||||||
Category: Projects
|
Category: Creations
|
||||||
Summary: A withered hand I welded out of scrap metal.
|
Summary: A withered hand I welded out of scrap metal.
|
||||||
|
Short: hand
|
||||||
|
|
||||||
I was visiting my cousins in Radium, BC and decided to learn stick welding at
|
I was visiting my cousins in Radium, BC and decided to learn stick welding at
|
||||||
their shop. I wanted to create a sculpture, so with pieces of scrap metal I
|
their shop. I wanted to create a sculpture, so with pieces of scrap metal I
|
||||||
|
BIN
content/images/garage/garage1.jpg
Normal file
After Width: | Height: | Size: 239 KiB |
BIN
content/images/garage/garage2.jpg
Normal file
After Width: | Height: | Size: 247 KiB |
BIN
content/images/garage/garage3.jpg
Normal file
After Width: | Height: | Size: 293 KiB |
BIN
content/images/panel/panel1.jpg
Normal file
After Width: | Height: | Size: 162 KiB |
BIN
content/images/panel/panel2.jpg
Normal file
After Width: | Height: | Size: 147 KiB |
BIN
content/images/panel/panel3.jpg
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
content/images/wine/wine1.jpg
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
content/images/wine/wine2.jpg
Normal file
After Width: | Height: | Size: 146 KiB |
BIN
content/images/wine/wine3.jpg
Normal file
After Width: | Height: | Size: 151 KiB |
@@ -1,7 +1,8 @@
|
|||||||
Title: LED Dress
|
Title: LED Dress
|
||||||
Date: 2016-03-18
|
Date: 2016-03-18
|
||||||
Category: Projects
|
Category: Creations
|
||||||
Summary: A dress made out of LEDs that twinkle like stars.
|
Summary: A dress made out of LEDs that twinkle like stars.
|
||||||
|
Short: 4
|
||||||
|
|
||||||
A friend of mine was attending a stars and constellations themed ball. She
|
A friend of mine was attending a stars and constellations themed ball. She
|
||||||
wanted to wear a dress that was lit up with LEDs acting as twinkling stars.
|
wanted to wear a dress that was lit up with LEDs acting as twinkling stars.
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
Title: Remote Control Light Switch
|
Title: Remote Control Light Switch
|
||||||
Date: 2014-10-09
|
Date: 2014-10-09
|
||||||
Category: Projects
|
Category: Creations
|
||||||
Summary: A device to toggle my lights remotely.
|
Summary: A device to toggle my lights remotely.
|
||||||
|
Short: remote
|
||||||
|
|
||||||
I wanted the ability to toggle my bedroom light remotely for convenience. I
|
I wanted the ability to toggle my bedroom light remotely for convenience. I
|
||||||
designed a circuit that allows me to control my light with any
|
designed a circuit that allows me to control my light with any
|
||||||
|
@@ -3,6 +3,7 @@ Date: 2020-10-31
|
|||||||
Category: Writing
|
Category: Writing
|
||||||
Summary: A recommendation on which flavour of Linux to run.
|
Summary: A recommendation on which flavour of Linux to run.
|
||||||
Wide: true
|
Wide: true
|
||||||
|
Short: 6
|
||||||
|
|
||||||
[TOC]
|
[TOC]
|
||||||
|
|
||||||
@@ -60,8 +61,8 @@ familiarity with it.
|
|||||||
|
|
||||||
Since Debian requires all its software to be free and open source, proprietary
|
Since Debian requires all its software to be free and open source, proprietary
|
||||||
hardware drivers aren't included in its main repo. This can make installing
|
hardware drivers aren't included in its main repo. This can make installing
|
||||||
Debian difficult if your hardware requires non-free drivers. You'll need to use
|
Debian difficult if your hardware requires proprietary drivers. You'll need to use
|
||||||
a non-free installation image found here:
|
an installation image found here:
|
||||||
|
|
||||||
<https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/>
|
<https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/>
|
||||||
|
|
||||||
|
6
content/pages/creations.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Title: Creations
|
||||||
|
Template: creations
|
||||||
|
Slug: z
|
||||||
|
|
||||||
|
|
||||||
|
Qot.
|
6
content/pages/projects.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Title: Projects
|
||||||
|
Template: projects
|
||||||
|
Slug: y
|
||||||
|
|
||||||
|
|
||||||
|
Qot.
|
6
content/pages/writing.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Title: Writing
|
||||||
|
Template: writing
|
||||||
|
Slug: x
|
||||||
|
|
||||||
|
|
||||||
|
Qot.
|
@@ -1,7 +1,8 @@
|
|||||||
Title: Man’s Reach Exceeds His Grasp
|
Title: Man's Reach Exceeds His Grasp
|
||||||
Date: 2012-04-11
|
Date: 2012-04-11
|
||||||
Category: Projects
|
Category: Creations
|
||||||
Summary: My first attempt at painting with acrylic.
|
Summary: My first attempt at painting with acrylic.
|
||||||
|
Short: 7
|
||||||
|
|
||||||
The painting is called “Man’s Reach Exceeds His Grasp”. I've always wanted to
|
The painting is called “Man’s Reach Exceeds His Grasp”. I've always wanted to
|
||||||
try painting and thought I had a good idea, so after a couple of drawings I
|
try painting and thought I had a good idea, so after a couple of drawings I
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
Title: Automatic Plant Waterer
|
Title: Automatic Plant Waterer
|
||||||
Date: 2014-06-05
|
Date: 2014-06-05
|
||||||
Category: Projects
|
Category: Creations
|
||||||
Summary: A device that automatically waters plants.
|
Summary: A device that automatically waters plants.
|
||||||
|
short: 8
|
||||||
|
|
||||||
One day I decided watering my one plant was too much work, so I automated it.
|
One day I decided watering my one plant was too much work, so I automated it.
|
||||||
It's also great for when I'm on vacation. The plant is a year old now and
|
It's also great for when I'm on vacation. The plant is a year old now and
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
Title: Solar Car
|
Title: Solar Car
|
||||||
Date: 2013-04-27
|
Date: 2013-04-27
|
||||||
Category: Projects
|
Category: Creations
|
||||||
Summary: About my time volunteering with the University of Calgary Solar Car Team, where I designed a maximum power point tracker.
|
Summary: About my time volunteering with the University of Calgary Solar Car Team, where I designed a maximum power point tracker.
|
||||||
|
Short: 9
|
||||||
|
|
||||||
I joined the University of Calgary Solar Car Team in my first semester for a
|
I joined the University of Calgary Solar Car Team in my first semester for a
|
||||||
chance to learn things, gain practical experience, and meet people that share my
|
chance to learn things, gain practical experience, and meet people that share my
|
||||||
|
47
content/text/air-quality.txt
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
aka pollution, dust
|
||||||
|
|
||||||
|
Study linking air pollution to mental disorders:
|
||||||
|
https://www.kcl.ac.uk/news/study-supports-link-between-traffic-related-air-pollution-and-mental-disorders
|
||||||
|
|
||||||
|
Calgary air quality:
|
||||||
|
https://www.cbc.ca/news/canada/calgary/calgary-air-quality-map-ranking-1.4547149
|
||||||
|
|
||||||
|
Woodgears (Matthias Wandel) page on dust:
|
||||||
|
https://woodgears.ca/dust/dylos.html
|
||||||
|
https://woodgears.ca/dust_collector/index.html
|
||||||
|
|
||||||
|
Study of low-cost sensor accuracy:
|
||||||
|
https://www.hindawi.com/journals/js/2018/5096540/
|
||||||
|
|
||||||
|
Experiments on DIY air purifier:
|
||||||
|
https://news.t0.vc/QZKP
|
||||||
|
https://dyno-might.github.io/2020/12/15/some-real-data-on-a-DIY-box-fan-air-purifier/
|
||||||
|
|
||||||
|
|
||||||
|
Sensors
|
||||||
|
=======
|
||||||
|
|
||||||
|
Fancy serial one with inlet:
|
||||||
|
- SDS011
|
||||||
|
- $17 USD
|
||||||
|
https://www.aliexpress.com/item/32606349048.html
|
||||||
|
|
||||||
|
One Farzad gave me:
|
||||||
|
- DSM501A
|
||||||
|
- $4 USD
|
||||||
|
https://www.aliexpress.com/item/1005001710572424.html
|
||||||
|
|
||||||
|
Fancy commercial one:
|
||||||
|
- DC1100 PRO
|
||||||
|
- $289 USD
|
||||||
|
|
||||||
|
Professional fluke:
|
||||||
|
- Fluke 985
|
||||||
|
- $7000 CAD
|
||||||
|
|
||||||
|
Good digikey one:
|
||||||
|
- https://www.digikey.ca/en/products/detail/honeywell-sensing-and-productivity-solutions/HPMA115S0-XXX/7202204
|
||||||
|
- connector? https://www.digikey.ca/en/products/detail/molex/0151340803/6198165 --- NO
|
||||||
|
- cable per sensor:
|
||||||
|
- 4 x 900-2149211112-ND (pre-crimped lead)
|
||||||
|
- 1 x WM1726-ND (connector housing)
|
51
content/text/android-app-decompiling.txt
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
aka hacking apk reverse engineering
|
||||||
|
|
||||||
|
|
||||||
|
Guides:
|
||||||
|
|
||||||
|
https://blog.securityevaluators.com/how-to-view-tls-traffic-in-androids-logs-6a42ca7a6e55
|
||||||
|
https://archive.ph/zDaV6
|
||||||
|
- used during Lutron hacking
|
||||||
|
|
||||||
|
Tools:
|
||||||
|
$ sudo apt install adb apktool openjdk-11-jdk-headless zipalign apksigner
|
||||||
|
$ locate apktool
|
||||||
|
- replace apktool with new version:
|
||||||
|
- https://github.com/iBotPeaches/Apktool/releases
|
||||||
|
$ sudo mv /usr/share/apktool/apktool.jar /usr/share/apktool/apktool.jar.orig
|
||||||
|
$ sudo mv ~/Downloads/apktool_2.5.0.jar /usr/share/apktool/apktool.jar
|
||||||
|
|
||||||
|
|
||||||
|
Get APK file:
|
||||||
|
- find name of the app
|
||||||
|
$ adb shell pm list packages | grep covid
|
||||||
|
- find path of the app
|
||||||
|
$ adb shell pm path ca.ab.gov.covidrecordsverifier
|
||||||
|
- pull the apk
|
||||||
|
$ adb pull [path] .
|
||||||
|
|
||||||
|
Decompile:
|
||||||
|
$ apktool d application.apk -o output/
|
||||||
|
|
||||||
|
Compile:
|
||||||
|
$ apktool b output/ --use-aapt2 -o patched.apk
|
||||||
|
$ zipalign 4 patched.apk patched2.apk
|
||||||
|
|
||||||
|
Sign:
|
||||||
|
- disable verification over USB in developer settings?
|
||||||
|
- the following just once:
|
||||||
|
$ keytool -genkey -v -keystore release.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
|
||||||
|
$ apksigner sign --ks release.keystore patched2.apk
|
||||||
|
|
||||||
|
Install:
|
||||||
|
$ adb install patched2.apk
|
||||||
|
|
||||||
|
|
||||||
|
Read logs:
|
||||||
|
$ adb logcat -c
|
||||||
|
|
||||||
|
|
||||||
|
Old instructions
|
||||||
|
----------------
|
||||||
|
|
||||||
|
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore release.keystore patched.apk alias_name
|
67
content/text/anti-aging.txt
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
Slowing Aging
|
||||||
|
=============
|
||||||
|
|
||||||
|
- Avoid DNA damage (wear sunscreen)
|
||||||
|
- Eat less - caloric restriction
|
||||||
|
- Eat less protein
|
||||||
|
- Do exercise (HIIT)
|
||||||
|
- Be cold
|
||||||
|
- Be hot
|
||||||
|
|
||||||
|
... these trigger longevity genes to trick body into preserving genome
|
||||||
|
|
||||||
|
|
||||||
|
Reversing aging
|
||||||
|
===============
|
||||||
|
|
||||||
|
Theory
|
||||||
|
------
|
||||||
|
|
||||||
|
- Shinya Yamanaka discovered 4 factors that reset epigenome of cell back to pluriportent stem cell
|
||||||
|
- Myc, Oct3/4, Sox2 and Klf4
|
||||||
|
- dont do it all, would turn into tumor
|
||||||
|
- suggests there are ways to revert cells and reverse ageing
|
||||||
|
- David Sinclar's lab reversed aging in old mice so they could see like they were young again
|
||||||
|
- used 3/4 of the reprogramming factors, not Myc as causes cancer
|
||||||
|
- can turn system on and off to limit reversal
|
||||||
|
|
||||||
|
|
||||||
|
Resources
|
||||||
|
=========
|
||||||
|
|
||||||
|
- Veratasium How to Slow Aging:
|
||||||
|
https://www.youtube.com/watch?v=QRt7LjqJ45k
|
||||||
|
|
||||||
|
- JRE David Sinclair #1:
|
||||||
|
https://www.youtube.com/watch?v=HOTS0HS7aq4
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
Calorie restriction, mostly vegetarian diet, avoid sugar and carbs.
|
||||||
|
On weekends, he exercises at the gym and then sits in a hot sauna before plunging himself into an ice-cold pool, as well as tracks his biomarkers regularly.
|
||||||
|
Takes vitamin D, vitamin K2, and aspirin.
|
||||||
|
Takes each morning: resveratrol, NMN, and metformin
|
||||||
|
|
||||||
|
- JRE David Sinclair #2:
|
||||||
|
https://www.youtube.com/watch?v=ZGLL77wYxe8
|
||||||
|
|
||||||
|
0:00 The new book, resveratrol
|
||||||
|
7:00 NMN and NAD+, metformin and exercise
|
||||||
|
18:00 Sinclair’s family went on a safari
|
||||||
|
48:30 back to the anti-aging book, longevity
|
||||||
|
52:20 Sinclair’s healthy 80 year old father: “He’s fitter than me”, his rebel grandmother
|
||||||
|
1:10:00 intermittent fasting
|
||||||
|
1:15:50 I.V. NAD+
|
||||||
|
1:18:00 nutrition, yogurt and other food
|
||||||
|
1:32:00 resveratrol, colorful foods
|
||||||
|
1:41:00 sleep
|
||||||
|
1:45:40 what should people be doing? (Sinclair is wrong about airport scanners)
|
||||||
|
1:48:25 NMN and NR online
|
||||||
|
1:50:25 CRISPR/ genetic engineering
|
||||||
|
2:08:00 blood rejuvenation
|
||||||
|
2:12:50 what is on the horizon? senescence cells, “We’ve learned how to fly…”
|
||||||
|
|
||||||
|
- Age reduction breakthrough:
|
||||||
|
https://joshmitteldorf.scienceblog.com/2020/05/11/age-reduction-breakthrough/
|
||||||
|
|
||||||
|
- Yamanaka paper:
|
||||||
|
https://www.cell.com/fulltext/S0092-8674(06)00976-7
|
127
content/text/design.txt
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
UI / UX
|
||||||
|
=======
|
||||||
|
|
||||||
|
Principals:
|
||||||
|
https://news.t0.vc/EKUD/c#punnerud1596400621
|
||||||
|
|
||||||
|
Little details:
|
||||||
|
https://littlebigdetails.com/
|
||||||
|
|
||||||
|
Choosing a colour palette:
|
||||||
|
https://refactoringui.com/previews/building-your-color-palette/
|
||||||
|
|
||||||
|
What not to do:
|
||||||
|
https://annoying.technology/
|
||||||
|
https://grumpy.website/
|
||||||
|
|
||||||
|
|
||||||
|
Web Design / Inspo
|
||||||
|
==================
|
||||||
|
|
||||||
|
https://breakermag.com/trapped-at-sea-with-cryptos-nouveau-riche/
|
||||||
|
- Good mobile site, very clean and just works
|
||||||
|
|
||||||
|
https://www.maxhallinan.com/posts/2018/12/07/little-languages/
|
||||||
|
- Good, simple blog. Lacks an image-first menu though.
|
||||||
|
|
||||||
|
https://taimur.me/posts/notes-from-malcolm-gladwell-s-writing-masterclass-part-1
|
||||||
|
- Another left-aligned simple blog
|
||||||
|
|
||||||
|
http://haya2now.jp/en.html
|
||||||
|
- Cool dashboard UI for japanese space probe
|
||||||
|
|
||||||
|
https://wiki.xxiivv.com/#devine+lu+linvega
|
||||||
|
- Devine Lu Linvega: Some portfolio of a designer that makes and uses lots of tools and systems
|
||||||
|
|
||||||
|
https://maki.cat
|
||||||
|
- css / html god that's into japanese culture and cute things
|
||||||
|
|
||||||
|
https://www.thecut.com/2019/05/how-scammers-trick-people-into-thinking-theyre-wealthy.html
|
||||||
|
- very sexy clean cut news website
|
||||||
|
|
||||||
|
https://techcrunch.com/2019/05/06/windows-gets-a-new-terminal/
|
||||||
|
- clean blog post
|
||||||
|
|
||||||
|
https://wattenberger.com/
|
||||||
|
- she does lots of stuff
|
||||||
|
|
||||||
|
https://devonzuegel.github.io/
|
||||||
|
- also does lots of stuff, cool projects, notes
|
||||||
|
|
||||||
|
http://nolannicholson.com/index.html
|
||||||
|
- dead simple portfolio website. perfect, maybe just add images
|
||||||
|
- this might have changed?
|
||||||
|
|
||||||
|
https://vim.reversed.top/
|
||||||
|
- card like interface
|
||||||
|
|
||||||
|
https://simplenote.com/
|
||||||
|
- great product website
|
||||||
|
|
||||||
|
https://www.gwern.net/index
|
||||||
|
- latex looking site, guy does a lot of stuff
|
||||||
|
|
||||||
|
https://caro.io/
|
||||||
|
- good folio site with squares like what I wanted
|
||||||
|
|
||||||
|
https://markosaric.com/
|
||||||
|
- marketing guy that has a nice dark mode theme
|
||||||
|
- this guy tricked me into reading an ad: https://news.t0.vc/VBHA blew up on HN
|
||||||
|
|
||||||
|
https://anders.unix.se/
|
||||||
|
- very clean readable website
|
||||||
|
|
||||||
|
https://schollz.com
|
||||||
|
- also simple website with projects and blog. guy does a lot, very inspiring
|
||||||
|
|
||||||
|
https://www.unwoke.hr
|
||||||
|
- great design for job board
|
||||||
|
|
||||||
|
https://ciechanow.ski/archives/
|
||||||
|
- very informative blog with clean demos
|
||||||
|
|
||||||
|
https://mazaj.ca
|
||||||
|
- odai's friend arabic coffee website
|
||||||
|
- beautiful design, graphics, and business plan
|
||||||
|
|
||||||
|
https://www.brandur.org/articles
|
||||||
|
- sexy clean articles
|
||||||
|
|
||||||
|
https://secret.club/2021/05/13/source-engine-rce-join.html
|
||||||
|
- great blog design
|
||||||
|
|
||||||
|
https://www.munichre.com
|
||||||
|
- nice official business looking site
|
||||||
|
|
||||||
|
|
||||||
|
Motherfucking websites:
|
||||||
|
https://motherfuckingwebsite.com/
|
||||||
|
http://bettermotherfuckingwebsite.com/
|
||||||
|
https://perfectmotherfuckingwebsite.com/
|
||||||
|
https://thebestmotherfucking.website/
|
||||||
|
https://bestmotherfucking.website/
|
||||||
|
https://evenbettermotherfucking.website/
|
||||||
|
|
||||||
|
https://inconvergent.net/
|
||||||
|
https://img.inconvergent.net/generative/78b7266.html
|
||||||
|
- cool artist's minimalistic site
|
||||||
|
|
||||||
|
Crazy websites:
|
||||||
|
- https://news.t0.vc/EYHQ (list)
|
||||||
|
- https://www.kickscondor.com/
|
||||||
|
- https://yvettesbridalformal.p1r8.net/
|
||||||
|
|
||||||
|
|
||||||
|
Colors:
|
||||||
|
|
||||||
|
Nice colors:
|
||||||
|
- #83a8f3 (close to cornflower blue)
|
||||||
|
|
||||||
|
|
||||||
|
Fonts
|
||||||
|
=====
|
||||||
|
|
||||||
|
Baskerville:
|
||||||
|
https://fonts.google.com/specimen/Libre+Baskerville#pairings
|
||||||
|
- NYT study said it was best?
|
||||||
|
|
19
content/text/dsp-sdr.txt
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
aka Signal Conditioning, software defined radio, gnu radio, rtl-sdr
|
||||||
|
|
||||||
|
Good intro:
|
||||||
|
http://pyageng.mpastell.com/book/dsp.html
|
||||||
|
http://pyageng.mpastell.com/book/sampling.html#cid7
|
||||||
|
|
||||||
|
Textbook list:
|
||||||
|
https://dspguru.com/dsp/books/favorites/
|
||||||
|
|
||||||
|
DSP Guide:
|
||||||
|
http://www.dspguide.com/
|
||||||
|
|
||||||
|
GNU Radio cookbook:
|
||||||
|
https://cdn.hackaday.io/files/1648847054397056/GRC%20Cook%20Book.pdf
|
||||||
|
|
||||||
|
SDR assignments:
|
||||||
|
https://greatscottgadgets.com/sdr/
|
||||||
|
|
||||||
|
|
28
content/text/esp8266.txt
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
Datasheet:
|
||||||
|
https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf
|
||||||
|
Tech Reference:
|
||||||
|
https://www.espressif.com/sites/default/files/documentation/esp8266-technical_reference_en.pdf
|
||||||
|
PCB Design Guidelines:
|
||||||
|
https://www.espressif.com/sites/default/files/documentation/esp8266_hardware_design_guidelines_en.pdf
|
||||||
|
|
||||||
|
Pins
|
||||||
|
====
|
||||||
|
|
||||||
|
Multiplexing analog input:
|
||||||
|
https://internetofhomethings.com/homethings/?p=530
|
||||||
|
|
||||||
|
Digital:
|
||||||
|
- has hysterisis
|
||||||
|
- Vil = 0.25 * Vin
|
||||||
|
- Vih = 0.75 * Vin
|
||||||
|
|
||||||
|
ADC:
|
||||||
|
- only 1 analog pin, A0
|
||||||
|
- 10 bits, 0-1023
|
||||||
|
- only supports 0.2 - 1.2 V, unless there's on-board voltage divider
|
||||||
|
|
||||||
|
|
||||||
|
WeMos D1 Mini
|
||||||
|
=============
|
||||||
|
|
||||||
|
- has on board 3V3 ADC divider
|
249
content/text/linux.txt
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
Enter today's date in ISO format:
|
||||||
|
$ date -I
|
||||||
|
To include seconds:
|
||||||
|
$ date -Is
|
||||||
|
|
||||||
|
Ping scan subnet (find a Raspberry Pi):
|
||||||
|
$ nmap -sn 192.168.0.0/24
|
||||||
|
Port 22 scan subnet:
|
||||||
|
$ nmap -sS -p 22 192.168.10.0/24
|
||||||
|
- run as root to get device names
|
||||||
|
|
||||||
|
To SCP with spaces in path, escape the spaces and surround the whole arg with quotes.
|
||||||
|
|
||||||
|
Serial Terminal:
|
||||||
|
Minicom /dev/ttyACM0 115200 8N1 w/ Hardware flow control: yes works.
|
||||||
|
If not, send Break (ctrl-a F).
|
||||||
|
To enable on server side (systemd):
|
||||||
|
$ systemctl enable serial-getty@ttyS0.service
|
||||||
|
$ systemctl start serial-getty@ttyS0.service
|
||||||
|
|
||||||
|
How to list wifi networks:
|
||||||
|
$ sudo iw dev wlp58s0 scan
|
||||||
|
|
||||||
|
Show top 10 edited files in git repo:
|
||||||
|
$ git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -10
|
||||||
|
|
||||||
|
Recursively hash directory, then hash result:
|
||||||
|
$ md5deep -rl . | sort | md5sum
|
||||||
|
|
||||||
|
Redirect stderr to stdout and pipe: |&
|
||||||
|
Redirect stderr to stdout: 2>&1 (do it after)
|
||||||
|
|
||||||
|
Copy torrent but use hardlinks instead:
|
||||||
|
$ cp -al source dest
|
||||||
|
|
||||||
|
Byobu tmux toggle function keys:
|
||||||
|
Shift + F12
|
||||||
|
- do this if Alt+Arrow is letters
|
||||||
|
|
||||||
|
Get rid of extra byobu sessions:
|
||||||
|
$ tmux ls | grep ^_ | cut -f1 "-d:" | xargs -t -L1 -r tmux kill-session -t
|
||||||
|
|
||||||
|
Make a PDF look scanned:
|
||||||
|
$ convert "$1" -alpha Off -density 150 -colorspace gray -blur 0.5x0.5 -rotate 0.4 -level 40%,60% "scanned-$1"
|
||||||
|
|
||||||
|
Insert last arg: alt+.
|
||||||
|
Insert 2nd last arg: alt+_ alt+.
|
||||||
|
Insert 3rd last arg: alt+_ 2 alt+.
|
||||||
|
|
||||||
|
SSH reverse tunnel router admin:
|
||||||
|
$ ssh -L 2222:192.168.0.1:80 user@10.9.0.3
|
||||||
|
- open localhost:2222 in browser
|
||||||
|
|
||||||
|
Select a display over ssh:
|
||||||
|
$ export DISPLAY=:1
|
||||||
|
|
||||||
|
Spawn new shell with group assignments:
|
||||||
|
$ exec su -l $USER
|
||||||
|
|
||||||
|
xargs:
|
||||||
|
- converts stdin to arguments for commands that dont accept stdin
|
||||||
|
- used with echo, compacts a list to one line
|
||||||
|
- see each command xargs runs: --verbose
|
||||||
|
- dont run if stdin is empty: -r
|
||||||
|
- run command once per line: -L1
|
||||||
|
- convert stdin to argument:
|
||||||
|
$ echo 'foo' | xargs mkdir
|
||||||
|
- convert list to one line:
|
||||||
|
$ cat foo.txt | xargs echo
|
||||||
|
- run a command for each line:
|
||||||
|
$ cat foo.txt | xargs -L0 --verbose echo
|
||||||
|
|
||||||
|
|
||||||
|
Systemd
|
||||||
|
=======
|
||||||
|
|
||||||
|
Journalctl
|
||||||
|
----------
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
$ journalctl --utc
|
||||||
|
$ journalctl -b # display logs since boot
|
||||||
|
$ journalctl --since "2015-01-10" --until "2015-01-11 03:00"
|
||||||
|
$ journalctl --since 09:00 --until "1 hour ago"
|
||||||
|
$ journalctl -u nginx.service -u php-fpm.service --since today
|
||||||
|
|
||||||
|
|
||||||
|
Bash scripting
|
||||||
|
==============
|
||||||
|
|
||||||
|
Always quote variables when you use them.
|
||||||
|
Run set -eu to crash when on errors and when using unset variables.
|
||||||
|
Use basedir to just get filename.
|
||||||
|
|
||||||
|
Gpg sign, encrypt, and armour:
|
||||||
|
gpg -sear [NAME]
|
||||||
|
|
||||||
|
Get window's handle with xdotool:
|
||||||
|
xdotool search --name "Google Play"
|
||||||
|
|
||||||
|
Get window's position and size with xdotool:
|
||||||
|
xdotool getwindowgeometry 44047673
|
||||||
|
Subtract 10 from the Y position, and 82 from the Y
|
||||||
|
|
||||||
|
|
||||||
|
Keyboard Shortcuts
|
||||||
|
==================
|
||||||
|
|
||||||
|
Focus Keepass, Super+Z: bash /home/tanner/scripts/focuskeepass.sh
|
||||||
|
Arrange Desktop, Super+X: /home/tanner/scripts/arrangedesktop.sh
|
||||||
|
Home Controller: Super+C: /home/tanner/scripts/homecontroller.sh
|
||||||
|
Toggle light 0, Super+1: /home/tanner/scripts/homecontroller.sh 0
|
||||||
|
Open terminal, Super+T: xfce4-terminal
|
||||||
|
Rofi, Super+`: rofi -combi-modi window,run -show combi -normal-window
|
||||||
|
|
||||||
|
** set "switch windows" to alt-tab to make it normal
|
||||||
|
|
||||||
|
Make right alt normal:
|
||||||
|
- tweak tool > keyboard & mouse > Additional Layout Options button
|
||||||
|
- expand "Key to choose 3rd level"
|
||||||
|
- deselect Right Alt
|
||||||
|
|
||||||
|
|
||||||
|
Nginx
|
||||||
|
=====
|
||||||
|
|
||||||
|
Log rotate /etc/logrotate.d/nginx:
|
||||||
|
size 100M
|
||||||
|
missingok
|
||||||
|
rotate 20
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
notifempty
|
||||||
|
create 0640 www-data adm
|
||||||
|
|
||||||
|
Logging /etc/nginx/nginx.conf:
|
||||||
|
# Make sure to copy the GeoIP files!
|
||||||
|
geoip_country /usr/share/GeoIP/GeoIP.dat;
|
||||||
|
geoip_city /usr/share/GeoIP/GeoIPCity.dat;
|
||||||
|
log_format tannersformat '[$time_iso8601] $remote_addr ($geoip_city, $geoip_country_code) $request_method "$server_name$request_uri" $status "$http_referer" "$http_user_agent"';
|
||||||
|
access_log /var/log/nginx/access.log tannersformat;
|
||||||
|
error_log /var/log/nginx/error.log;
|
||||||
|
|
||||||
|
$ wget https://t0.vc/f/GeoIPCity.dat
|
||||||
|
$ sudo mv GeoIPCity.dat /usr/share/GeoIP/GeoIPCity.dat
|
||||||
|
|
||||||
|
|
||||||
|
OpenVPN
|
||||||
|
=======
|
||||||
|
|
||||||
|
Setup:
|
||||||
|
$ sudo su root
|
||||||
|
- follow steps here:
|
||||||
|
- https://wiki.debian.org/OpenVPN#TLS-enabled_VPN
|
||||||
|
- skip editing vars
|
||||||
|
- add random data to /etc/openvpn/easy-rsa/pki/.rnd to get rid of error messages
|
||||||
|
- use the # ./easyrsa [command] methods
|
||||||
|
- encrypt CA with password
|
||||||
|
- build the optional intermediate CA
|
||||||
|
- https://wiki.debian.org/OpenVPN#Static-Key_VPN
|
||||||
|
- improves security
|
||||||
|
- set auth SHA256
|
||||||
|
- save config file to /etc/openvpn/server.conf
|
||||||
|
- * set root's shell back to /bin/false *
|
||||||
|
|
||||||
|
Static IP:
|
||||||
|
- create a client (ie. "mediaserver") with easyrsa
|
||||||
|
$ mkdir /etc/openvpn/ccd
|
||||||
|
- edit /etc/openvpn/ccd/mediaserver:
|
||||||
|
ifconfig-push 10.8.0.100 255.255.255.0
|
||||||
|
- edit /etc/openvpn/server.conf:
|
||||||
|
client-config-dir /etc/openvpn/ccd
|
||||||
|
|
||||||
|
Routing / port forward:
|
||||||
|
- edit /etc/sysctl.conf:
|
||||||
|
net.ipv4.ip_forward=1
|
||||||
|
- edit /etc/default/ufw:
|
||||||
|
DEFAULT_FORWARD_POLICY="ACCEPT"
|
||||||
|
- edit /etc/ufw/before.rules at the top:
|
||||||
|
*nat
|
||||||
|
:POSTROUTING ACCEPT [0:0]
|
||||||
|
# ssh port forwarding
|
||||||
|
-A PREROUTING -d 159.203.223.101 -p tcp --dport 43655 -j DNAT --to-dest 10.8.0.100:43655
|
||||||
|
-A POSTROUTING -d 10.8.0.100 -p tcp --dport 43655 -j SNAT --to-source 10.8.0.1
|
||||||
|
# Allow traffic from OpenVPN client to eth0
|
||||||
|
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
|
||||||
|
COMMIT
|
||||||
|
$ sudo ufw disable && sudo ufw enable
|
||||||
|
$ sudo sysctl net.ipv4.ip_forward=1
|
||||||
|
- source: https://gist.github.com/kimus/9315140
|
||||||
|
|
||||||
|
Systemd fix:
|
||||||
|
- ensure config file is at /etc/openvpn/server.conf
|
||||||
|
$ sudo systemctl start openvpn@server
|
||||||
|
$ sudo systemctl enable openvpn@client
|
||||||
|
$ sudo systemctl daemon-reload
|
||||||
|
$ sudo service openvpn restart
|
||||||
|
- verify stop / start with ps aux | grep openvpn
|
||||||
|
- do same for "client"
|
||||||
|
- source: https://ubuntu.com/server/docs/service-openvpn
|
||||||
|
|
||||||
|
Systemd client:
|
||||||
|
$ sudo mv vpn2-client.ovpn /etc/openvpn/client.conf
|
||||||
|
$ sudo chown root:root /etc/openvpn/client.conf
|
||||||
|
$ sudo chmod 600 /etc/openvpn/client.conf
|
||||||
|
- if there's a password:
|
||||||
|
$ sudo -E vim /etc/openvpn/auth.txt
|
||||||
|
$ sudo chmod 600 /etc/openvpn/auth.txt
|
||||||
|
- add password to file
|
||||||
|
- add "askpass /etc/openvpn/auth.txt" to config file
|
||||||
|
- set up systemd:
|
||||||
|
$ sudo systemctl start openvpn@client
|
||||||
|
$ sudo systemctl enable openvpn@client
|
||||||
|
$ sudo systemctl daemon-reload
|
||||||
|
$ sudo service openvpn restart
|
||||||
|
|
||||||
|
Disable routing traffic over VPN:
|
||||||
|
- remove all "redirect-gateway" lines in client config
|
||||||
|
|
||||||
|
Gnome client:
|
||||||
|
- vpn settings, add
|
||||||
|
- import from file, select vpn2-client.ovpn
|
||||||
|
- add missing private key from /home/tanner/.cert/nm-openvpn/
|
||||||
|
- add password gush-tilt-shine-chute-pace-gecko
|
||||||
|
|
||||||
|
|
||||||
|
New Desktop
|
||||||
|
-----------
|
||||||
|
|
||||||
|
$ sudo apt install git tree htop byobu unattended-upgrades curl axel man-db vim vim-gtk netcat xfce4-terminal firefox chromium keepassxc mpv network-manager-openvpn-gnome bash-completion xdotool mlocate ncdu
|
||||||
|
$ sudo apt remove firefox-esr
|
||||||
|
- set up home directory...
|
||||||
|
|
||||||
|
Firefox extentions:
|
||||||
|
- Cookie AutoDelete
|
||||||
|
- Decentraleyes
|
||||||
|
- HTTPS Everywhere
|
||||||
|
- I dont care about cookies
|
||||||
|
- New Tab Override
|
||||||
|
- NoScript
|
||||||
|
- Privacy Badger
|
||||||
|
- SponsorBlock
|
||||||
|
- uBlock Origin
|
||||||
|
|
||||||
|
Fix popping after audio stops (disable audio power save):
|
||||||
|
$ sudo bash -c 'echo 0 > /sys/module/snd_hda_intel/parameters/power_save'
|
||||||
|
- to persist append to /etc/modprobe.d/audio_disable_powersave.conf:
|
||||||
|
options snd_hda_intel power_save=0
|
||||||
|
|
41
content/text/meditation.txt
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
Notes from Andy
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Mastering your mind:
|
||||||
|
- can you control yourself?
|
||||||
|
- can you sit still physically?
|
||||||
|
- can you control your mind?
|
||||||
|
- can you concentrate on a simple object and nothing else?
|
||||||
|
- can you have no thoughts?
|
||||||
|
- can you free your mind from remembering the past or future?
|
||||||
|
- can you have no visual images / sounds?
|
||||||
|
- can you stop your inner monologue?
|
||||||
|
|
||||||
|
|
||||||
|
How to meditate:
|
||||||
|
- these steps are very gradual, not distinct steps:
|
||||||
|
- master focusing in the present (1-2 years)
|
||||||
|
- disregard the past and future
|
||||||
|
- focus on noises in the present. can jump around or listen to all.
|
||||||
|
- on failure gently pull back to the present
|
||||||
|
- mastery when you can do this for an hour
|
||||||
|
- can start with shorter sessions
|
||||||
|
- master focusing only a single element in the present
|
||||||
|
- for example, your breath
|
||||||
|
- master stopping the monologue
|
||||||
|
- stop talking to yourself
|
||||||
|
- stop making comments
|
||||||
|
- stop the chatter
|
||||||
|
- master total absorption into that single element
|
||||||
|
- deeper focus into the element
|
||||||
|
- Samadhi state
|
||||||
|
- can only experience your own, dont read the wiki
|
||||||
|
- Andy reached this only once, he felt omnipotent
|
||||||
|
|
||||||
|
- this becomes an intrinsic skill like talking and walking rather than a motor skill like throwing?
|
||||||
|
- if you dont use it you lose it?
|
||||||
|
- one you reach Samadhi your mind always meditates
|
||||||
|
|
||||||
|
|
||||||
|
Naval theory:
|
||||||
|
https://twitter.com/naval/status/1261481222359801856
|
170
content/text/note-taking.txt
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
aka notetaking
|
||||||
|
|
||||||
|
Solutions
|
||||||
|
=========
|
||||||
|
|
||||||
|
Desires
|
||||||
|
-------
|
||||||
|
|
||||||
|
- Open source
|
||||||
|
- End to end encryption
|
||||||
|
- Portable data store - md (or exportable)
|
||||||
|
- Images
|
||||||
|
- Rich text editor WYSIWYG
|
||||||
|
- Linking notes together
|
||||||
|
- to whole note or header in note
|
||||||
|
- Sync
|
||||||
|
- Mobile support
|
||||||
|
- Folders
|
||||||
|
- Undo / versioning
|
||||||
|
|
||||||
|
|
||||||
|
Reviews
|
||||||
|
-------
|
||||||
|
|
||||||
|
Joplin:
|
||||||
|
- UI is very fast
|
||||||
|
- has its own sync server now, wait to mature?
|
||||||
|
- scroll in render view glitchy / laggy when zoomed
|
||||||
|
- WYSIWYG editor breaks some markdown
|
||||||
|
- clicking links in WYSIWYG requires ctrl
|
||||||
|
- can't see note names in notebook tree, so will be hard to find
|
||||||
|
- maybe that's better?
|
||||||
|
- mobile app lacks WYSIWYG
|
||||||
|
- mobile app md editor scroll shitty
|
||||||
|
- slow to edit notes in mobile app
|
||||||
|
- white flashes on dark mode desktop theme when switching notebooks
|
||||||
|
- Todo feature is cool. can make each note a todo and use the body to add context / info
|
||||||
|
- easy to rearrange todos
|
||||||
|
|
||||||
|
Obsidian:
|
||||||
|
- highly reviewed, looks sexy but needs more contrast
|
||||||
|
- no WYSIWYG editor yet - planned
|
||||||
|
- has graph and backlinks
|
||||||
|
- not open source
|
||||||
|
- files stored as plain text
|
||||||
|
|
||||||
|
|
||||||
|
Wiki.js:
|
||||||
|
- Supports LaTeX
|
||||||
|
- Support Markdown (it also supports formats such as html)
|
||||||
|
- Works in-browser (and therefore can be accessed on any device)
|
||||||
|
- Editing is easy (although this sounds like a "duh" feature, many self-hosted note apps are more like static site generators)
|
||||||
|
- Uploading files is simple
|
||||||
|
- Has multiple backup options (I use GitHub and .gitignore the textbooks)
|
||||||
|
|
||||||
|
|
||||||
|
Boostnote:
|
||||||
|
- no mobile support
|
||||||
|
|
||||||
|
Trilium:
|
||||||
|
- great encryption
|
||||||
|
- poor mobile support, Dom uses telegram as a buffer
|
||||||
|
- fully tried it, mobile is just too broken
|
||||||
|
- doesnt scroll all the way to the bottom of folders and note contents
|
||||||
|
- lots of other minor bugs
|
||||||
|
- parts of UI not updating like archived notes
|
||||||
|
- randomly refreshes the page
|
||||||
|
- header sizes all look the same
|
||||||
|
- today note button is slow to load
|
||||||
|
|
||||||
|
Simplenote:
|
||||||
|
- not self-hosted
|
||||||
|
- no folders
|
||||||
|
|
||||||
|
Turtl:
|
||||||
|
- buggy app
|
||||||
|
- bad organization system
|
||||||
|
|
||||||
|
Org-mode
|
||||||
|
- needs emacs
|
||||||
|
|
||||||
|
Taskwarrior:
|
||||||
|
- command line only
|
||||||
|
|
||||||
|
Zim:
|
||||||
|
- no built in sync
|
||||||
|
- no mobile
|
||||||
|
|
||||||
|
TiddlyWiki
|
||||||
|
- no built in sync
|
||||||
|
- one html file
|
||||||
|
- modern browsers block some file features?
|
||||||
|
|
||||||
|
https://collectednotes.com/
|
||||||
|
- no android
|
||||||
|
- watch them
|
||||||
|
|
||||||
|
https://github.com/athensresearch/athens
|
||||||
|
- not finished, keep an eye on
|
||||||
|
- ugly theme
|
||||||
|
|
||||||
|
Outline:
|
||||||
|
- https://www.getoutline.com/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Zenkit: proprietary
|
||||||
|
OneNote: proprietary
|
||||||
|
Google Keep: proprietary
|
||||||
|
Synapbook: proprietary
|
||||||
|
Workflowy: proprietary
|
||||||
|
Notion: proprietary, UX issues: https://news.t0.vc/DCGM
|
||||||
|
Roam Research: proprietary, cool graph feature though
|
||||||
|
RemNote: proprietary, spaced repetition
|
||||||
|
|
||||||
|
|
||||||
|
https://contexted.io/
|
||||||
|
https://rwtxt.com
|
||||||
|
|
||||||
|
Stuff to read:
|
||||||
|
https://news.t0.vc/YUAT/c
|
||||||
|
https://news.t0.vc/WLJJ/c
|
||||||
|
https://news.t0.vc/ORXL/c
|
||||||
|
https://old.reddit.com/r/CGPGrey/comments/ihkqjp/cortex_105_atomic_notes/
|
||||||
|
|
||||||
|
|
||||||
|
The perfect note-taking app:
|
||||||
|
https://www.youtube.com/watch?v=wpcVQeF07G4
|
||||||
|
- goes over the three types of note-takers
|
||||||
|
- librarian: likes to catalogue, usually write-only -> evernote
|
||||||
|
- gardener: likes connecting ideas in their own way -> roam
|
||||||
|
- architect: likes designing processes and structure -> notion
|
||||||
|
|
||||||
|
|
||||||
|
Formatting / Template
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Unformatted info can just be sentences, paragraphs, or points.
|
||||||
|
|
||||||
|
|
||||||
|
Section
|
||||||
|
=======
|
||||||
|
|
||||||
|
Place two empty lines before the section header, empty line after
|
||||||
|
|
||||||
|
|
||||||
|
Subsection
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Sub-subsection:
|
||||||
|
No linebreak for text within a section
|
||||||
|
|
||||||
|
Generic lists or steps:
|
||||||
|
- dash then a space
|
||||||
|
- lower case for prose
|
||||||
|
- Data points: gets capital
|
||||||
|
- like this
|
||||||
|
- sublists
|
||||||
|
- two spaces, dash, space
|
||||||
|
|
||||||
|
Todo lists:
|
||||||
|
o unfinished task
|
||||||
|
v finished task (looks like check mark)
|
||||||
|
x cancelled task
|
||||||
|
|
||||||
|
- I wonder if I should just use markdown?
|
||||||
|
|
||||||
|
* notes to consider
|
||||||
|
$ commands to run
|
||||||
|
|
39
content/text/python.txt
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
Development Setup:
|
||||||
|
$ sudo apt install python3 python3-pip python-virtualenv python3-virtualenv
|
||||||
|
$ virtualenv -p python3 env
|
||||||
|
$ . env/bin/activate
|
||||||
|
$ pip install -r requirements.txt
|
||||||
|
|
||||||
|
Django clone setup:
|
||||||
|
$ python manage.py makemigrations
|
||||||
|
$ python manage.py migrate
|
||||||
|
$ python manage.py createsuperuser
|
||||||
|
$ DEBUG=true python manage.py runserver 0.0.0.0:8000
|
||||||
|
|
||||||
|
|
||||||
|
Logging:
|
||||||
|
|
||||||
|
use logger.exception
|
||||||
|
|
||||||
|
Machine learning:
|
||||||
|
comma.ai switched to pyTorch
|
||||||
|
|
||||||
|
|
||||||
|
How to make a package:
|
||||||
|
https://news.t0.vc/ZBPS
|
||||||
|
|
||||||
|
|
||||||
|
Timezones
|
||||||
|
=========
|
||||||
|
|
||||||
|
NEVER USE .replace(tzinfo= EXCEPT FOR WITH UTC!
|
||||||
|
|
||||||
|
Assigning timezone to parsed string:
|
||||||
|
- example, you get a text timestamp and parse it with strptime
|
||||||
|
- solution:
|
||||||
|
t = datetime.strptime(timestamp, '%Y-%m-%d %H:%M:%S')
|
||||||
|
tz = pytz.timezone('America/Edmonton')
|
||||||
|
result = tz.localize(t)
|
||||||
|
|
||||||
|
|
||||||
|
|
70
content/text/spain-portugal.txt
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
Barcelona:
|
||||||
|
- very touristy
|
||||||
|
|
||||||
|
Tarragona:
|
||||||
|
- 20 minutes south of Barcelona
|
||||||
|
- much cheaper and more historical
|
||||||
|
- Roman ruins are still there
|
||||||
|
- very close to the ocean
|
||||||
|
- lots of walking
|
||||||
|
- Tim stayed at Olivia hotel
|
||||||
|
- 100 m from Mediterranian
|
||||||
|
- right on the giant town plaza
|
||||||
|
- Amphithéâtre, Aqueducts, walls
|
||||||
|
|
||||||
|
Cervera:
|
||||||
|
- 25200 Lleida
|
||||||
|
- Tim's wife taught
|
||||||
|
- zero english
|
||||||
|
- train goes from Barcelona
|
||||||
|
- crazy festivals every ten days:
|
||||||
|
https://www.youtube.com/watch?v=kr03rCwa9ms
|
||||||
|
|
||||||
|
Malaga:
|
||||||
|
- city with the most soul
|
||||||
|
- nice beaches
|
||||||
|
- poorer
|
||||||
|
|
||||||
|
Granada:
|
||||||
|
- **alhambra: palace of the largest islamic empire, book ahead
|
||||||
|
- alkazah
|
||||||
|
|
||||||
|
*Alhambra:
|
||||||
|
- 'Remember to be punctual to access the Nasrid Palaces at the time selected on your ticket. The rest of the monument can be visited from 8:30 a.m. to 6:00 p.m. winter; 8:30 a.m. to 8:00 p.m. summer.'
|
||||||
|
- random document number 10L-ID10T
|
||||||
|
- Booking Reference Number: H0DIOBJ
|
||||||
|
|
||||||
|
Valencia:
|
||||||
|
- good flee market
|
||||||
|
|
||||||
|
Seville:
|
||||||
|
- odai's friend owns restaurant
|
||||||
|
- alcazar
|
||||||
|
- plaza de espana
|
||||||
|
- opera?
|
||||||
|
- Diego Velázquez birthplace?
|
||||||
|
|
||||||
|
|
||||||
|
Portugal
|
||||||
|
========
|
||||||
|
|
||||||
|
Lagos:
|
||||||
|
- Brassao restaurant very good
|
||||||
|
- sunset
|
||||||
|
|
||||||
|
Lisbon:
|
||||||
|
- a bit dirty
|
||||||
|
- have low expectations
|
||||||
|
|
||||||
|
Sintra:
|
||||||
|
- look like disney
|
||||||
|
- actual castle
|
||||||
|
- 45 min train from Lisbon
|
||||||
|
|
||||||
|
Porto:
|
||||||
|
- beautiful
|
||||||
|
- odai like better than lisbon
|
||||||
|
- on a cliffside
|
||||||
|
- where harry potter started
|
||||||
|
|
||||||
|
|
34
content/text/vim-tricks.txt
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
Enter word under cursor into cmdline:
|
||||||
|
CTRL-R CTRL-W
|
||||||
|
(:help c_CTRL-R)
|
||||||
|
|
||||||
|
Rewrap text (reformat):
|
||||||
|
gq
|
||||||
|
|
||||||
|
Remove duplicates from file:
|
||||||
|
vim ~/.ssh/authorized_keys +":sort u|wq"
|
||||||
|
|
||||||
|
N ctrl-^ goes to buffer N
|
||||||
|
|
||||||
|
Centre current line on screen:
|
||||||
|
zz
|
||||||
|
|
||||||
|
Newrw:
|
||||||
|
- fixed on left: :20Lexplore
|
||||||
|
- change to tree: i
|
||||||
|
- toggle .hidden files: gh
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Config
|
||||||
|
======
|
||||||
|
|
||||||
|
Start Vim without reading .vimrc:
|
||||||
|
vim -u NONE
|
||||||
|
|
||||||
|
Minimal sane config:
|
||||||
|
set encoding=utf-8
|
||||||
|
set nocompatible
|
||||||
|
set background=dark
|
||||||
|
set hidden
|
||||||
|
|
28
content/wine-crate-coffee-table.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
Title: Wine Crate Coffee Table
|
||||||
|
Date: 2018-09-12
|
||||||
|
Category: Creations
|
||||||
|
Summary: A coffee table made out of wooden wine creates.
|
||||||
|
Short: 0
|
||||||
|
|
||||||
|
My close friend Odai saw a simple coffee table design online that was built out
|
||||||
|
of four wooden wine crates. They are quite cheap and available at any hardware
|
||||||
|
store. We each wanted to make one so went and bought eight crates and some
|
||||||
|
plywood to use as a base.
|
||||||
|
|
||||||
|
We went to my local makerspace, Protospace, to build them in the wood shop. We
|
||||||
|
thought it would be a quick job only taking a few hours, but it turned out to be
|
||||||
|
a twelve hour job over a couple of days. At least we were in good company!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The wine crates were glued and then brad-nailed together. Extra wood was added
|
||||||
|
under the thin top strips for support. After the glue dried, the brad nails were
|
||||||
|
painstakingly removed because the ones we used were too long and stuck out.
|
||||||
|
|
||||||
|
After being attached to the base, the entire table was sanded and then stained.
|
||||||
|
We let it dry overnight and returned the following day to add a quick layer of
|
||||||
|
varnish.
|
||||||
|
|
||||||
|

|
69
pelicanconf_lite.py
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*- #
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import os
|
||||||
|
|
||||||
|
AUTHOR = 'Tanner Collin'
|
||||||
|
SITENAME = 'Tanner Collin'
|
||||||
|
SITEURL = ''
|
||||||
|
|
||||||
|
PATH = 'content'
|
||||||
|
|
||||||
|
TIMEZONE = 'Canada/Mountain'
|
||||||
|
|
||||||
|
DEFAULT_LANG = 'en'
|
||||||
|
|
||||||
|
# Feed generation is usually not desired when developing
|
||||||
|
FEED_ALL_ATOM = None
|
||||||
|
CATEGORY_FEED_ATOM = None
|
||||||
|
TRANSLATION_FEED_ATOM = None
|
||||||
|
AUTHOR_FEED_ATOM = None
|
||||||
|
AUTHOR_FEED_RSS = None
|
||||||
|
|
||||||
|
DEFAULT_PAGINATION = False
|
||||||
|
|
||||||
|
MARKDOWN = {
|
||||||
|
'extension_configs': {
|
||||||
|
'markdown.extensions.codehilite': {'css_class': 'highlight'},
|
||||||
|
'markdown.extensions.extra': {},
|
||||||
|
'markdown.extensions.meta': {},
|
||||||
|
'markdown.extensions.toc': {
|
||||||
|
'toc_depth': '2-3',
|
||||||
|
'anchorlink': True,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'output_format': 'html5',
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC_PATHS = ['images', 'extra']
|
||||||
|
|
||||||
|
EXTRA_PATH_METADATA = {
|
||||||
|
#'extra/favicon.svg': {'path': 'favicon.svg'},
|
||||||
|
}
|
||||||
|
|
||||||
|
# Uncomment following line if you want document-relative URLs when developing
|
||||||
|
#RELATIVE_URLS = True
|
||||||
|
|
||||||
|
THEME = 'themes/lite'
|
||||||
|
|
||||||
|
# turn off useless outputs
|
||||||
|
TAG_SAVE_AS = ''
|
||||||
|
CATEGORY_SAVE_AS = ''
|
||||||
|
AUTHOR_SAVE_AS = ''
|
||||||
|
ARCHIVES_SAVE_AS = ''
|
||||||
|
AUTHORS_SAVE_AS = ''
|
||||||
|
CATEGORIES_SAVE_AS = ''
|
||||||
|
TAGS_SAVE_AS = ''
|
||||||
|
|
||||||
|
INDEX_SAVE_AS = 'index.html'
|
||||||
|
ARTICLE_URL = '{short}'
|
||||||
|
ARTICLE_SAVE_AS = '{short}/index.html'
|
||||||
|
PAGE_URL = '{slug}'
|
||||||
|
PAGE_SAVE_AS = '{slug}/index.html'
|
||||||
|
|
||||||
|
def list_text_files():
|
||||||
|
return sorted(os.listdir('./content/text'))
|
||||||
|
|
||||||
|
JINJA_GLOBALS = {'list_text_files': list_text_files}
|
||||||
|
|
||||||
|
PROD = False
|
17
prototype.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<style>
|
||||||
|
body {background: #eee; font: 1.1rem/1.5 serif;}
|
||||||
|
h1, h2 {margin-left: -24; font-family: sans-serif;}
|
||||||
|
a {text-decoration: none; color: #000; border-bottom: 1px solid #000;}
|
||||||
|
</style>
|
||||||
|
<div style="max-width: 600; margin: auto">
|
||||||
|
<h1>Tanner Collin</h1>
|
||||||
|
<p> Hi, I'm Tanner! I do firmware and web development in Calgary.</p>
|
||||||
|
<a href="/">Contact</a> |
|
||||||
|
<a href="/r">Resume</a> |
|
||||||
|
<a href="/p">Projects</a> |
|
||||||
|
<a href="/c">Creations</a> |
|
||||||
|
<a href="/w">Writing</a>
|
||||||
|
<h2>Contact Info</h2>
|
||||||
|
<p>Email: <a href="mailto:site2@tannercollin.com">site2@tannercollin.com</a></p>
|
||||||
|
<p>Telegram: <a href="https://t.me/tannercollin">@tannercollin</a></p>
|
||||||
|
</div>
|
69
publishconf_lite.py
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*- #
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import os
|
||||||
|
|
||||||
|
AUTHOR = 'Tanner Collin'
|
||||||
|
SITENAME = 'Tanner Collin'
|
||||||
|
SITEURL = ''
|
||||||
|
|
||||||
|
PATH = 'content'
|
||||||
|
|
||||||
|
TIMEZONE = 'Canada/Mountain'
|
||||||
|
|
||||||
|
DEFAULT_LANG = 'en'
|
||||||
|
|
||||||
|
# Feed generation is usually not desired when developing
|
||||||
|
FEED_ALL_ATOM = None
|
||||||
|
CATEGORY_FEED_ATOM = None
|
||||||
|
TRANSLATION_FEED_ATOM = None
|
||||||
|
AUTHOR_FEED_ATOM = None
|
||||||
|
AUTHOR_FEED_RSS = None
|
||||||
|
|
||||||
|
DEFAULT_PAGINATION = False
|
||||||
|
|
||||||
|
MARKDOWN = {
|
||||||
|
'extension_configs': {
|
||||||
|
'markdown.extensions.codehilite': {'css_class': 'highlight'},
|
||||||
|
'markdown.extensions.extra': {},
|
||||||
|
'markdown.extensions.meta': {},
|
||||||
|
'markdown.extensions.toc': {
|
||||||
|
'toc_depth': '2-3',
|
||||||
|
'anchorlink': True,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'output_format': 'html5',
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC_PATHS = ['images', 'extra', 'text']
|
||||||
|
|
||||||
|
EXTRA_PATH_METADATA = {
|
||||||
|
#'extra/favicon.svg': {'path': 'favicon.svg'},
|
||||||
|
}
|
||||||
|
|
||||||
|
# Uncomment following line if you want document-relative URLs when developing
|
||||||
|
#RELATIVE_URLS = True
|
||||||
|
|
||||||
|
THEME = 'themes/lite'
|
||||||
|
|
||||||
|
# turn off useless outputs
|
||||||
|
TAG_SAVE_AS = ''
|
||||||
|
CATEGORY_SAVE_AS = ''
|
||||||
|
AUTHOR_SAVE_AS = ''
|
||||||
|
ARCHIVES_SAVE_AS = ''
|
||||||
|
AUTHORS_SAVE_AS = ''
|
||||||
|
CATEGORIES_SAVE_AS = ''
|
||||||
|
TAGS_SAVE_AS = ''
|
||||||
|
|
||||||
|
INDEX_SAVE_AS = 'index.html'
|
||||||
|
ARTICLE_URL = '{short}'
|
||||||
|
ARTICLE_SAVE_AS = '{short}/index.html'
|
||||||
|
PAGE_URL = '{slug}'
|
||||||
|
PAGE_SAVE_AS = '{slug}/index.html'
|
||||||
|
|
||||||
|
def list_text_files():
|
||||||
|
return sorted(os.listdir('./content/text'))
|
||||||
|
|
||||||
|
JINJA_GLOBALS = {'list_text_files': list_text_files}
|
||||||
|
|
||||||
|
PROD = True
|
45
themes/lite/templates/article.html
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block meta %}
|
||||||
|
<meta charset=UTF-8>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
p, h2, h3, h4, h5 {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.toclink {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
.highlight > pre {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0.5rem;
|
||||||
|
overflow-x: auto;
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
:not(pre)>code {
|
||||||
|
padding: 0 2px;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
.aside {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.toc {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
width: 600px;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>{{ article.title }}</h1>
|
||||||
|
{{ article.summary }}
|
||||||
|
{{ article.locale_date }}
|
||||||
|
<hr />
|
||||||
|
{{ article.content }}
|
||||||
|
{% endblock %}
|
2
themes/lite/templates/base.html
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
{% block meta %}{% endblock %}<link rel=icon href=data:,>{% block style %}{% endblock %}<pre style=font:unset>{% block content %}
|
||||||
|
{% endblock %}
|
21
themes/lite/templates/creations.html
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block meta %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
Creations
|
||||||
|
=========
|
||||||
|
|
||||||
|
Sometimes I create art or interactive tech.
|
||||||
|
|
||||||
|
{% for article in articles if article.category.name == 'Creations' %}
|
||||||
|
<a href="/{{ article.url }}">{{ article.title }}</a>
|
||||||
|
{{ article.summary | striptags }}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
44
themes/lite/templates/index.html
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
Hi, I'm Tanner! I like home automation, privacy, bots,
|
||||||
|
Python, <a href=d>sensors*</a>, Debian, coffee, and makerspaces.
|
||||||
|
|
||||||
|
Please sign my <a href=g>Guest Book</a>!
|
||||||
|
|
||||||
|
Email: site3@tannercollin.com
|
||||||
|
Telegram: @tannercollin
|
||||||
|
|
||||||
|
Resume
|
||||||
|
|
||||||
|
Firmware Engineer at Cabana Blockchain, 2018-
|
||||||
|
Lead Hardware Engineer at Critical Control, 2016-2018
|
||||||
|
Electrical Engineer at Opener Aero, 2016-2016
|
||||||
|
Electrical Engineer Intern at Pason Systems, 2014-2015
|
||||||
|
BSc. Electrical Engineering from University of Calgary
|
||||||
|
|
||||||
|
Projects
|
||||||
|
|
||||||
|
<a href=q>QotNews*
|
||||||
|
<a href=n>Notica*
|
||||||
|
<a href=m>Spaceport*
|
||||||
|
<a href=t>t0txt*
|
||||||
|
<a href=y>[more]</a>
|
||||||
|
|
||||||
|
* external link
|
||||||
|
|
||||||
|
Creations
|
||||||
|
|
||||||
|
{% for article in articles_page.object_list if article.category.name == 'Creations' %}
|
||||||
|
{% if loop.index <= 4 %}
|
||||||
|
<a href={{ article.url }}>{{ article.title }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
<a href=z>[more]
|
||||||
|
</a>
|
||||||
|
Writing
|
||||||
|
|
||||||
|
{% for article in articles_page.object_list if article.category.name == 'Writing' %}
|
||||||
|
<a href={{ article.url }}>{{ article.title }}
|
||||||
|
{% endfor %}
|
||||||
|
<a href=x>[more]
|
||||||
|
{% endblock %}
|
4
themes/lite/templates/page.html
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<pre>
|
||||||
|
{{ page.content }}
|
||||||
|
</pre>
|
||||||
|
|
36
themes/lite/templates/projects.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block meta %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
Projects
|
||||||
|
========
|
||||||
|
|
||||||
|
My main hobby is working on software projects. I typically design websites or
|
||||||
|
build tools that make my life easier.
|
||||||
|
|
||||||
|
<a href="https://news.t0.vc/" target="_blank" rel="noreferrer noopener">QotNews*</a> - <a class="source" href="https://git.tannercollin.com/tanner/qotnews" target="_blank" rel="noreferrer noopener">source code*</a>
|
||||||
|
Hacker News, Reddit, Lobsters, and Tildes articles pre-rendered in reader mode.
|
||||||
|
Optimized for speed and distraction-free reading.
|
||||||
|
|
||||||
|
<a href="https://notica.us" target="_blank" rel="noreferrer noopener">Notica*</a> - <a class="source" href="https://github.com/tannercollin/Notica" target="_blank" rel="noreferrer noopener">source code*</a>
|
||||||
|
Send browser notifications from your terminal. No installation. No registration.
|
||||||
|
|
||||||
|
<a href="https://my.protospace.ca" target="_blank" rel="noreferrer noopener">Spaceport*</a> - <a class="source" href="https://github.com/Protospace/spaceport" target="_blank" rel="noreferrer noopener">source code*</a>
|
||||||
|
Makerspace members' portal for Calgary Protospace. It tracks membership,
|
||||||
|
courses, training, access cards, and more.
|
||||||
|
|
||||||
|
<a href="https://txt.t0.vc" target="_blank" rel="noreferrer noopener">t0txt*</a> - <a class="source" href="https://github.com/tannercollin/t0txt" target="_blank" rel="noreferrer noopener">source code*</a>
|
||||||
|
Minimal command line pastebin. Allows you to upload text notes from a bash pipe
|
||||||
|
or web browser.
|
||||||
|
|
||||||
|
<a href="https://github.com/tannercollin/standardnotes-fs" target="_blank" rel="noreferrer noopener">standardnotes-fs*</a>
|
||||||
|
A filesystem that mounts your Standard Notes account as a directory of text
|
||||||
|
files that you can edit.
|
||||||
|
|
||||||
|
* external link
|
||||||
|
{% endblock %}
|
||||||
|
|
28
themes/lite/templates/writing.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block meta %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
Writing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Various articles, mostly about computers.
|
||||||
|
|
||||||
|
{% for article in articles if article.category.name == 'Writing' %}
|
||||||
|
<a href="/{{ article.url }}">{{ article.title }}</a>
|
||||||
|
{{ article.summary | striptags }}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
Text Files
|
||||||
|
----------
|
||||||
|
|
||||||
|
Here are some random text notes that I share with the public.
|
||||||
|
|
||||||
|
{% for f in list_text_files() %}
|
||||||
|
<a href="../text/{{ f }}">{{ f }}</a>
|
||||||
|
{% endfor %}
|
||||||
|
{% endblock %}
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 34 KiB |
BIN
themes/theme/static/me.webp
Normal file
After Width: | Height: | Size: 25 KiB |
@@ -25,12 +25,7 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block info %}
|
{% block info %}
|
||||||
Tanner Collin
|
<p>← <a href="/">Return Home</a></p>
|
||||||
<p class="contact-icons">
|
|
||||||
<a href="mailto:site2@tannercollin.com" rel="noreferrer noopener"><img alt="email" src="/theme/mail.svg" width="20" height="20" /></a>
|
|
||||||
<a href="https://t.me/tannercollin" target="_blank" rel="noreferrer noopener"><img alt="telegram" src="/theme/telegram.svg" width="20" height="20" /></a>
|
|
||||||
<a href="https://github.com/tannercollin" target="_blank" rel="noreferrer noopener"><img alt="github" src="/theme/github.svg" width="20" height="20" /></a>
|
|
||||||
</p>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
@@ -41,7 +36,6 @@
|
|||||||
<div class="content">
|
<div class="content">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<p><a href="/">← Return to Home</a></p>
|
|
||||||
<header>
|
<header>
|
||||||
<h1>{{ article.title }}</h1>
|
<h1>{{ article.title }}</h1>
|
||||||
<div class="summary">
|
<div class="summary">
|
||||||
|
@@ -1,12 +1,3 @@
|
|||||||
{% if PROD %}
|
|
||||||
<?php
|
|
||||||
$themeClass = '';
|
|
||||||
if (!empty($_COOKIE['theme'])) {
|
|
||||||
$themeClass = $_COOKIE['theme'];
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@@ -18,21 +9,10 @@
|
|||||||
<meta name="author" content="{{ AUTHOR }}" />
|
<meta name="author" content="{{ AUTHOR }}" />
|
||||||
{% endblock head %}
|
{% endblock head %}
|
||||||
|
|
||||||
<link rel="preload" href="/theme/fonts/AppSILB.ttf" as="font" type="font/ttf" crossorigin="anonymous">
|
|
||||||
<link rel="preload" href="/theme/fonts/AppSILBI.ttf" as="font" type="font/ttf" crossorigin="anonymous">
|
|
||||||
<link rel="preload" href="/theme/fonts/AppSILI.ttf" as="font" type="font/ttf" crossorigin="anonymous">
|
|
||||||
<link rel="preload" href="/theme/fonts/AppSILR.ttf" as="font" type="font/ttf" crossorigin="anonymous">
|
|
||||||
|
|
||||||
<link rel="preload" href="/theme/fonts/Lato-Bold.ttf" as="font" type="font/ttf" crossorigin="anonymous">
|
|
||||||
<link rel="preload" href="/theme/fonts/Lato-BoldItalic.ttf" as="font" type="font/ttf" crossorigin="anonymous">
|
|
||||||
<link rel="preload" href="/theme/fonts/Lato-Italic.ttf" as="font" type="font/ttf" crossorigin="anonymous">
|
|
||||||
<link rel="preload" href="/theme/fonts/Lato-Regular.ttf" as="font" type="font/ttf" crossorigin="anonymous">
|
|
||||||
|
|
||||||
<link rel="icon" href="favicon.svg">
|
<link rel="icon" href="favicon.svg">
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
{% include 'style.css' %}
|
{% include 'style.css' %}
|
||||||
{% include 'fonts.css' %}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script defer src="/theme/instant-page.js"></script>
|
<script defer src="/theme/instant-page.js"></script>
|
||||||
@@ -49,7 +29,10 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="copyright">
|
<p class="footer">
|
||||||
|
<span class="wname">Webring:</span> <a href="https://jason.schwarzenberger.co.nz/" class="wprev">< Previous</a> | <a href="https://webring.t0.vc" class="windex">Index</a> | <a href="https://udia.ca" class="wnext">Next ></a>
|
||||||
|
</p>
|
||||||
|
<p class="footer">
|
||||||
© 2012–2021 Tanner Collin
|
© 2012–2021 Tanner Collin
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
|
10
themes/theme/templates/creations.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block meta %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
Nothing to see here...
|
||||||
|
{% endblock %}
|
@@ -1,59 +0,0 @@
|
|||||||
@font-face {
|
|
||||||
font-family: 'Apparatus SIL';
|
|
||||||
src: url('/theme/fonts/AppSILR.ttf') format('truetype');
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Apparatus SIL';
|
|
||||||
font-style: italic;
|
|
||||||
src: url('/theme/fonts/AppSILI.ttf') format('truetype');
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Apparatus SIL';
|
|
||||||
font-weight: bold;
|
|
||||||
src: url('/theme/fonts/AppSILB.ttf') format('truetype');
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Apparatus SIL';
|
|
||||||
font-weight: bold;
|
|
||||||
font-style: italic;
|
|
||||||
src: url('/theme/fonts/AppSILBI.ttf') format('truetype');
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Lato';
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 400;
|
|
||||||
src: local('Lato Italic'), local('Lato-Italic'), url('/theme/fonts/Lato-Italic.ttf') format('truetype');
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Lato';
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 700;
|
|
||||||
src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url('/theme/fonts/Lato-BoldItalic.ttf') format('truetype');
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Lato';
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
src: local('Lato Regular'), local('Lato-Regular'), url('/theme/fonts/Lato-Regular.ttf') format('truetype');
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Lato';
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 700;
|
|
||||||
src: local('Lato Bold'), local('Lato-Bold'), url('/theme/fonts/Lato-Bold.ttf') format('truetype');
|
|
||||||
font-display: swap;
|
|
||||||
}
|
|
@@ -8,11 +8,16 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block info %}
|
{% block info %}
|
||||||
<img src="/theme/me.jpg" width="128" class="me" alt="me smiling wide and looking into the camera lit up brightly" />
|
<picture>
|
||||||
|
<source type="image/webp" srcset="/theme/me.webp">
|
||||||
|
<source type="image/jpeg" srcset="/theme/me.jpg">
|
||||||
|
<img src="/theme/me.jpg" width="128" height="164" class="me" alt="me smiling wide and looking into the camera lit up brightly">
|
||||||
|
</picture>
|
||||||
|
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<h1>Tanner Collin</h1>
|
<h1>Tanner Collin</h1>
|
||||||
<p class="contact-icons">
|
<p class="contact-icons">
|
||||||
<a href="mailto:site2@tannercollin.com" rel="noreferrer noopener"><img alt="email" src="/theme/mail.svg" width="20" height="20" /></a>
|
<a href="mailto:site4@tannercollin.com" rel="noreferrer noopener"><img alt="email" src="/theme/mail.svg" width="20" height="20" /></a>
|
||||||
<a href="https://t.me/tannercollin" target="_blank" rel="noreferrer noopener"><img alt="telegram" src="/theme/telegram.svg" width="20" height="20" /></a>
|
<a href="https://t.me/tannercollin" target="_blank" rel="noreferrer noopener"><img alt="telegram" src="/theme/telegram.svg" width="20" height="20" /></a>
|
||||||
<a href="https://github.com/tannercollin" target="_blank" rel="noreferrer noopener"><img alt="github" src="/theme/github.svg" width="20" height="20" /></a>
|
<a href="https://github.com/tannercollin" target="_blank" rel="noreferrer noopener"><img alt="github" src="/theme/github.svg" width="20" height="20" /></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -20,18 +25,15 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="content content-index">
|
<div class="content index">
|
||||||
<p>
|
<p>
|
||||||
Hi, I'm Tanner! I do firmware and web development in Calgary.
|
Hi, I'm Tanner! I do firmware and web development in Calgary.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="leftcol">
|
|
||||||
<div class="inside">
|
|
||||||
|
|
||||||
<h2>Contact Info</h2>
|
<h2>Contact Info</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Email: <a href="mailto:site2@tannercollin.com">site2@tannercollin.com</a> <br />
|
Email: <a href="mailto:site4@tannercollin.com">site4@tannercollin.com</a> <br />
|
||||||
Telegram: <a href="https://t.me/tannercollin" target="_blank" rel="noreferrer noopener">@tannercollin</a>
|
Telegram: <a href="https://t.me/tannercollin" target="_blank" rel="noreferrer noopener">@tannercollin</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -90,16 +92,12 @@
|
|||||||
<div class="summary">
|
<div class="summary">
|
||||||
<p>A filesystem that mounts your Standard Notes account as a directory of text files that you can edit.</p>
|
<p>A filesystem that mounts your Standard Notes account as a directory of text files that you can edit.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="rightcol">
|
|
||||||
<div class="inside">
|
|
||||||
<h2>Creations</h2>
|
<h2>Creations</h2>
|
||||||
|
|
||||||
<p>Sometimes I create art or interactive tech.</p>
|
<p>Sometimes I create art or interactive tech.</p>
|
||||||
|
|
||||||
{% for article in articles_page.object_list if article.category.name == 'Projects' %}
|
{% for article in articles_page.object_list if article.category.name == 'Creations' %}
|
||||||
<h3><a href="{{ article.url }}">{{ article.title }}</a></h3>
|
<h3><a href="{{ article.url }}">{{ article.title }}</a></h3>
|
||||||
<div class="summary">
|
<div class="summary">
|
||||||
{{ article.summary }}
|
{{ article.summary }}
|
||||||
@@ -117,6 +115,4 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
10
themes/theme/templates/projects.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block meta %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
Nothing to see here...
|
||||||
|
{% endblock %}
|
@@ -4,7 +4,7 @@ html {
|
|||||||
|
|
||||||
body {
|
body {
|
||||||
text-rendering: optimizeLegibility;
|
text-rendering: optimizeLegibility;
|
||||||
font: 1.2rem/1.0 Lato,sans-serif;
|
font-family: serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@@ -13,22 +13,27 @@ a {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.info h1 {
|
.info h1 {
|
||||||
font: 1.2rem/1.0 Lato,sans-serif;
|
font: 1.1rem/1.0 sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.index h3 {
|
||||||
|
font: 1.1rem/1.5 serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
.source {
|
.source {
|
||||||
font: 1rem/1.5 Apparatus SIL,serif;
|
font: 0.9rem/1.5 serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
font-size: 1rem;
|
font-size: 0.9rem;
|
||||||
|
line-height: 1.2;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
:not(pre)>code {
|
:not(pre)>code {
|
||||||
padding: 0 2px;
|
padding: 0 2px;
|
||||||
font-size: 0.9rem;
|
font-size: 0.8rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
@@ -36,8 +41,8 @@ pre {
|
|||||||
margin: 2rem auto 12rem auto;
|
margin: 2rem auto 12rem auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.copyright {
|
.footer {
|
||||||
font: 1rem/1.5 Apparatus SIL,serif;
|
font: 0.9rem/1.5 serif;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,14 +63,13 @@ pre {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.content p.metadata {
|
.content p.metadata {
|
||||||
font: 1rem/1.0 Apparatus SIL,serif;
|
font: 0.9rem/1.0 serif;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content div.summary p {
|
.content div.summary p {
|
||||||
margin-top: -0.5rem;
|
margin-top: -0.5rem;
|
||||||
margin-left: 1rem;
|
margin-left: 1.5rem;
|
||||||
font-style: italic;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
@@ -73,19 +77,11 @@ pre {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.content-wide {
|
.content-wide {
|
||||||
max-width: 46rem;;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content-index {
|
|
||||||
max-width: none;
|
max-width: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content-index h3 {
|
|
||||||
font: 1.2rem/1.5 Apparatus SIL,serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content p {
|
.content p {
|
||||||
font: 1.2rem/1.5 Apparatus SIL,serif;
|
font: 1.1rem/1.5 serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content ul {
|
.content ul {
|
||||||
@@ -93,7 +89,7 @@ pre {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.content li {
|
.content li {
|
||||||
font: 1.2rem/1.5 Apparatus SIL,serif;
|
font: 1.1rem/1.5 serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content img {
|
.content img {
|
||||||
@@ -107,7 +103,7 @@ pre {
|
|||||||
position: relative;
|
position: relative;
|
||||||
width: 8rem;
|
width: 8rem;
|
||||||
margin-left: -9rem;
|
margin-left: -9rem;
|
||||||
font-size: 1rem;
|
font-size: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toclink:not(:hover) {
|
.toclink:not(:hover) {
|
||||||
@@ -124,6 +120,7 @@ pre {
|
|||||||
float: left;
|
float: left;
|
||||||
width: 8rem;
|
width: 8rem;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bar .me {
|
.bar .me {
|
||||||
@@ -148,9 +145,7 @@ pre {
|
|||||||
|
|
||||||
@media screen and (max-width:36rem) {
|
@media screen and (max-width:36rem) {
|
||||||
.bar {
|
.bar {
|
||||||
display: table;
|
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
margin: auto;
|
|
||||||
margin-top: -0.5rem;
|
margin-top: -0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,30 +178,6 @@ pre {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width:58rem) {
|
|
||||||
.container {
|
|
||||||
max-width: 75rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.leftcol {
|
|
||||||
float: left;
|
|
||||||
width: 50%;
|
|
||||||
margin-top: -1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.leftcol > .inside {
|
|
||||||
padding-right: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rightcol {
|
|
||||||
overflow: hidden;
|
|
||||||
margin-top: -1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rightcol > .inside {
|
|
||||||
padding-left: 1rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background-color: #eee;
|
background-color: #eee;
|
||||||
|
10
themes/theme/templates/writing.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block meta %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
Nothing to see here...
|
||||||
|
{% endblock %}
|