switch from org to markdown
This commit is contained in:
parent
d97176b3a3
commit
6740f99f2a
|
@ -1,35 +1,67 @@
|
||||||
---
|
---
|
||||||
layout: post
|
|
||||||
title: Creating an open source NAS
|
title: Creating an open source NAS
|
||||||
subtitle: Why use proprietary when FLOSS do tricc?
|
description: My process for building an open source NAS with a powerful single board computer and a couple of large HDDs
|
||||||
description: My process for building an open source NAS with a powerful single board computer and a couple of massive HDDs
|
tags: Sysadmin NAS Backups
|
||||||
tags: sysadmin hosting nas backups
|
|
||||||
date: 2020-03-09 23:43 -0400
|
date: 2020-03-09 23:43 -0400
|
||||||
cover: /assets/posts/disk.png
|
cover: /assets/posts/disk.png
|
||||||
draft: true
|
draft: true
|
||||||
---
|
---
|
||||||
A few months ago, I decided that I needed a NAS. I didn't want anything proprietary because this was going to store all of my data, my mother's, possibly some friends', as well as backups for *all* of my servers; I needed to know I had full control over every aspect of the system to ensure it was secure. To that end, I decided to build it with an SBC[^1] from [Pine64](https://www.pine64.org).
|
|
||||||
|
A few months ago, I decided that I needed a NAS. I didn't want anything
|
||||||
|
proprietary because this was going to store all of my data, my mother's,
|
||||||
|
possibly some friends', as well as backups for _all_ of my servers; I needed to
|
||||||
|
know I had full control over every aspect of the system to ensure it was secure.
|
||||||
|
To that end, I decided to build it with an SBC[^1] from
|
||||||
|
[Pine64](https://www.pine64.org).
|
||||||
|
|
||||||
# Parts
|
# Parts
|
||||||
* [ROCKPro64](https://store.pine64.org/?product=rockpro64-4gb-single-board-computer) - $79.99
|
|
||||||
* [NAS Case](https://store.pine64.org/?product=rockpro64-metal-desktopnas-casing) - $44.99
|
- [ROCKPro64](https://store.pine64.org/?product=rockpro64-4gb-single-board-computer) -
|
||||||
* [SATA -> PCIe adapter & RAID controller](https://www.amazon.com/N-ORANIE-Controller-HyperDuo-Multiplier-88SE9230/dp/B07KYP5RRL) - $47.99
|
$79.99
|
||||||
* [6 TB WD Red Pro](https://www.newegg.com/p/N82E16822234344) - $203.99
|
- [NAS
|
||||||
* [Heatsink w/ fan](https://store.pine64.org/?product=rockpro64-10mm-low-profile-heatsink-with-fan) - $5.29
|
Case](https://store.pine64.org/?product=rockpro64-metal-desktopnas-casing) -
|
||||||
* [Fan for the case](https://store.pine64.org/?product=fan-for-rockpro64-metal-desktopnas-casing) - $3.99
|
$44.99
|
||||||
* Power supply: [US](https://store.pine64.org/?product=rockpro64-12v-5a-us-power-supply) or [EU](https://store.pine64.org/?product=rockpro64-12v-5a-eu-power-supply) - $12.99
|
- [SATA -> PCIe adapter & RAID
|
||||||
* [16 GB eMMC Module](https://store.pine64.org/?product=16gb-emmc) - $15.95
|
controller](https://www.amazon.com/N-ORANIE-Controller-HyperDuo-Multiplier-88SE9230/dp/B07KYP5RRL) -
|
||||||
* Any microSD card
|
$47.99
|
||||||
|
- [6 TB WD Red Pro](https://www.newegg.com/p/N82E16822234344) - $203.99
|
||||||
|
- [Heatsink w/
|
||||||
|
fan](https://store.pine64.org/?product=rockpro64-10mm-low-profile-heatsink-with-fan) -
|
||||||
|
$5.29
|
||||||
|
- [Fan for the
|
||||||
|
case](https://store.pine64.org/?product=fan-for-rockpro64-metal-desktopnas-casing) -
|
||||||
|
$3.99
|
||||||
|
- Power supply:
|
||||||
|
[US](https://store.pine64.org/?product=rockpro64-12v-5a-us-power-supply) or
|
||||||
|
[EU](https://store.pine64.org/?product=rockpro64-12v-5a-eu-power-supply) -
|
||||||
|
$12.99
|
||||||
|
- [16 GB eMMC Module](https://store.pine64.org/?product=16gb-emmc) - $15.95
|
||||||
|
- Any microSD card
|
||||||
|
|
||||||
**Total:** $415.18
|
**Total:** $415.18
|
||||||
|
|
||||||
To reduce the overall cost, you could go with a cheaper HDD; I got this one because I need reliability in the *very* long run but a more inexpensive disk is perfectly suitable. Without accounting for the drive, the NAS is ~$215 and very reasonably priced compared to most other options.
|
To reduce the overall cost, you could go with a cheaper HDD; I got this one
|
||||||
|
because I need reliability in the _very_ long run but a more inexpensive disk is
|
||||||
|
perfectly suitable. Without accounting for the drive, the NAS is ~$215 and very
|
||||||
|
reasonably priced compared to most other options.
|
||||||
|
|
||||||
# Assembly
|
# Assembly
|
||||||
Refer to [Pine64's wiki](https://wiki.pine64.org/index.php/NASCase) on assembling the case. I don't know if it was intentional or what but, for the HDDs, I was only given enough screws for one. For the cover, I still have three empty screw holes. It's not a huge deal but it would have been nice to have enough screws for everything.
|
|
||||||
|
Refer to [Pine64's wiki](https://wiki.pine64.org/index.php/NASCase) on
|
||||||
|
assembling the case. I don't know if it was intentional or what but, for the
|
||||||
|
HDDs, I was only given enough screws for one. For the cover, I still have three
|
||||||
|
empty screw holes. It's not a huge deal but it would have been nice to have
|
||||||
|
enough screws for everything.
|
||||||
|
|
||||||
# Software
|
# Software
|
||||||
I chose to go with [OpenMediaVault](https://openmediavault.org). However, I didn't use Pine64's image; there were a variety of errors when basic operations were run so I decided to use vanilla [armbian](https://www.armbian.com). Thankfully, they have an image for the [ROCKPro64](https://www.armbian.com/rockpro64/) and it worked flawlessly. The next step was getting OMV set up on it but, like a boss, they provide a script for that 😉
|
|
||||||
|
I chose to go with [OpenMediaVault](https://openmediavault.org). However, I
|
||||||
|
didn't use Pine64's image; there were a variety of errors when basic operations
|
||||||
|
were run so I decided to use vanilla [armbian](https://www.armbian.com).
|
||||||
|
Thankfully, they have an image for the
|
||||||
|
[ROCKPro64](https://www.armbian.com/rockpro64/) and it worked flawlessly. The
|
||||||
|
next step was getting OMV set up on it but, like a boss, they provide a script
|
||||||
|
for that 😉
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
wget https://raw.githubusercontent.com/OpenMediaVault-Plugin-Developers/installScript/master/install
|
wget https://raw.githubusercontent.com/OpenMediaVault-Plugin-Developers/installScript/master/install
|
||||||
|
@ -37,13 +69,21 @@ chmod +x install
|
||||||
sudo ./install
|
sudo ./install
|
||||||
```
|
```
|
||||||
|
|
||||||
Additional setup info can be found in an [armbian guide](https://github.com/OpenMediaVault-Plugin-Developers/docs/blob/master/Adden-A-Installing_OMV5_on_Armbian.pdf) they've created.
|
Additional setup info can be found in an [armbian
|
||||||
|
guide](https://github.com/OpenMediaVault-Plugin-Developers/docs/blob/master/Adden-A-Installing_OMV5_on_Armbian.pdf)
|
||||||
|
they've created.
|
||||||
|
|
||||||
# Drivers
|
# Drivers
|
||||||
This posed a huge problem for me. Neither the "official" ROCKPro64 OMV image nor armbian included the driver for my RAID controller so I had to figure that out.
|
|
||||||
|
|
||||||
Huge shoutout to `fromport` in the `#openmediavault` channel on Freenode; they were a *massive* help with getting the driver situation sorted out.
|
This posed a huge problem for me. Neither the "official" ROCKPro64 OMV image nor
|
||||||
|
armbian included the driver for my RAID controller so I had to figure that out.
|
||||||
|
|
||||||
Check out [Secluded.Site](https://secluded.site), my personal webpage; I'll be using it for posts like this in the future and will try to leave this space for official announcements (like when backups have been automated using this very NAS 😉).
|
Huge shoutout to `fromport` in the `#openmediavault` channel on Freenode; they
|
||||||
|
were a _massive_ help with getting the driver situation sorted out.
|
||||||
|
|
||||||
|
Check out [Secluded.Site](https://secluded.site), my personal webpage; I'll be
|
||||||
|
using it for posts like this in the future and will try to leave this space for
|
||||||
|
official announcements (like when backups have been automated using this very
|
||||||
|
NAS 😉).
|
||||||
|
|
||||||
[^1]: Single Board Computer
|
[^1]: Single Board Computer
|
||||||
|
|
|
@ -1,118 +1,108 @@
|
||||||
---
|
---
|
||||||
layout: post
|
layout: post
|
||||||
title: Email & Privacy/Security Concerns
|
title: Email & privacy/security concerns
|
||||||
date: 2020-03-21 01:46 -0400
|
date: 2020-03-21 01:46 -0400
|
||||||
draft: true
|
draft: true
|
||||||
---
|
---
|
||||||
|
|
||||||
Plaintext email
|
## Plaintext email
|
||||||
---------------
|
|
||||||
|
|
||||||
Email is inerently insecure. By default, everything is sent in plaintext
|
Email is inerently insecure. By default, everything is sent in plaintext from
|
||||||
from one server to the next with no encryption whatsoever. Servers can
|
one server to the next with no encryption whatsoever. Servers can encrypt mail
|
||||||
encrypt mail in-transit by implementing SSL and TLS but that still
|
in-transit by implementing SSL and TLS but that still leaves copies of your data
|
||||||
leaves copies of your data in plaintext on both servers. For example,
|
in plaintext on both servers. For example, see [this email I sent to
|
||||||
see [this email I sent to
|
|
||||||
myself](https://bin.nixnet.services/?f76b8366e6b7a7b0#95skPFhsptkfyMH3i1n25ENZeUzrmYEUHzDVezaToGn).
|
myself](https://bin.nixnet.services/?f76b8366e6b7a7b0#95skPFhsptkfyMH3i1n25ENZeUzrmYEUHzDVezaToGn).
|
||||||
At the very bottom, the content of my email is shown in the file for
|
At the very bottom, the content of my email is shown in the file for anyone with
|
||||||
anyone with access to the server to see. At first glance, this may not
|
access to the server to see. At first glance, this may not seem like such a huge
|
||||||
seem like such a huge deal. It does, however, become a big deal when
|
deal. It does, however, become a big deal when you're conducting private
|
||||||
you're conducting private business over email. If I so chose, I could
|
business over email. If I so chose, I could go to that directory and read
|
||||||
go to that directory and read everything you're saying and there's
|
everything you're saying and there's nothing you could do about it. Any mail
|
||||||
nothing you could do about it. Any mail provider has this capability:
|
provider has this capability: Gmail, Yahoo! Mail, Fastmail, the list goes on.
|
||||||
Gmail, Yahoo! Mail, Fastmail, the list goes on. Unless special measures
|
Unless special measures are taken to encrypt your emails _at rest_, this holds
|
||||||
are taken to encrypt your emails *at rest*, this holds true in every
|
true in every single case.
|
||||||
single case.
|
|
||||||
|
|
||||||
Encrypted email
|
## Encrypted email
|
||||||
---------------
|
|
||||||
|
|
||||||
Providers like [Protonmail](https://protonmail.com) and
|
Providers like [Protonmail](https://protonmail.com) and
|
||||||
[Tutanota](https://www.tutanota.com/) do exactly this and that is their
|
[Tutanota](https://www.tutanota.com/) do exactly this and that is their main
|
||||||
main draw. Mail to and from other users of the same platform (Protonmail
|
draw. Mail to and from other users of the same platform (Protonmail ->
|
||||||
-> Protonmail, Tutanota -> Tutanota) is encrypted from end-to-end as
|
Protonmail, Tutanota -> Tutanota) is encrypted from end-to-end as well as at
|
||||||
well as at rest so the only parties that can read it are the sender and
|
rest so the only parties that can read it are the sender and the receiver; the
|
||||||
the receiver; the provider itself can't access them. However, the
|
provider itself can't access them. However, the benefit of at-rest encryption
|
||||||
benefit of at-rest encryption becomes absolutely meaningless the
|
becomes absolutely meaningless the _second_ you communicate with someone on a
|
||||||
*second* you communicate with someone on a server that *doesn't*
|
server that _doesn't_ implement it. Protonmail -> Gmail is 100% insecure and
|
||||||
implement it. Protonmail -> Gmail is 100% insecure and Google is free
|
Google is free to perform whatever text analysis and user profiling they wish.
|
||||||
to perform whatever text analysis and user profiling they wish. NixNet
|
NixNet Mail will implement at-rest encryption in the near future but, even then,
|
||||||
Mail will implement at-rest encryption in the near future but, even
|
there is no way to verify that that's _actually_ the case unless I gave everyone
|
||||||
then, there is no way to verify that that's *actually* the case unless
|
root access to my server at all times (security and compliance **_nightmare_**).
|
||||||
I gave everyone root access to my server at all times (security and
|
The only viable solution is to take your privacy into your own hands and encrypt
|
||||||
compliance ***nightmare***). The only viable solution is to take your
|
emails yourself.
|
||||||
privacy into your own hands and encrypt emails yourself.
|
|
||||||
|
|
||||||
GPG encryption
|
## GPG encryption
|
||||||
--------------
|
|
||||||
|
|
||||||
"GPG" stands for "GNU Privacy Guard" and is a libre implementation
|
"GPG" stands for "GNU Privacy Guard" and is a libre implementation of "PGP" or
|
||||||
of "PGP" or "Pretty Good Privacy", originally created by [Phil
|
"Pretty Good Privacy", originally created by [Phil
|
||||||
Zimmerman](https://en.wikipedia.org/wiki/Phil_Zimmermann). PGP was
|
Zimmerman](https://en.wikipedia.org/wiki/Phil_Zimmermann). PGP was eventually
|
||||||
eventually bought by Symantec and became Symantec Encryption Desktop and
|
bought by Symantec and became Symantec Encryption Desktop and GPG quickly became
|
||||||
GPG quickly became the most widely used implementation of [OpenPGP
|
the most widely used implementation of [OpenPGP
|
||||||
standards](https://tools.ietf.org/html/rfc4880). GPG integration is
|
standards](https://tools.ietf.org/html/rfc4880). GPG integration is especially
|
||||||
especially common in open source email clients such as
|
common in open source email clients such as
|
||||||
[Thunderbird](https://www.thunderbird.net/) and
|
[Thunderbird](https://www.thunderbird.net/) and
|
||||||
[Evolution](https://wiki.gnome.org/Apps/Evolution). It relies on
|
[Evolution](https://wiki.gnome.org/Apps/Evolution). It relies on [public-key
|
||||||
[public-key
|
cryptography](https://en.wikipedia.org/wiki/Public-key_cryptography) and allows
|
||||||
cryptography](https://en.wikipedia.org/wiki/Public-key_cryptography) and
|
users to encrypt their emails with another user's public key. The email would
|
||||||
allows users to encrypt their emails with another user's public key.
|
then be *de*crypted using the receiver's _private_ key. Take a look at this
|
||||||
The email would then be *de*crypted using the receiver's *private* key.
|
[encrypted email I sent to
|
||||||
Take a look at this [encrypted email I sent to
|
|
||||||
myself](https://bin.nixnet.services/?70f0ac93b8df9416#Fske8BYAVdoYzD76VgBb5AimRqm2yY8HgnpdcAzUwuD7).
|
myself](https://bin.nixnet.services/?70f0ac93b8df9416#Fske8BYAVdoYzD76VgBb5AimRqm2yY8HgnpdcAzUwuD7).
|
||||||
As admin of the server, that is literally all I can see. The text
|
As admin of the server, that is literally all I can see. The text between `BEGIN
|
||||||
between `BEGIN PGP MESSAGE` and `END PGP MESSAGE` is the email body and
|
PGP MESSAGE` and `END PGP MESSAGE` is the email body and it just looks like a
|
||||||
it just looks like a block of random characters to me. To the person
|
block of random characters to me. To the person receiving the message, however,
|
||||||
receiving the message, however, after decryption, they'll be able to
|
after decryption, they'll be able to read it just like the plaintext one linked
|
||||||
read it just like the plaintext one linked in the first section.
|
in the first section.
|
||||||
|
|
||||||
If you want to learn more about GPG encryption and protecting your
|
If you want to learn more about GPG encryption and protecting your privacy when
|
||||||
privacy when using email, I recommend reading through [Email
|
using email, I recommend reading through [Email
|
||||||
Self-Defense](https://emailselfdefense.fsf.org/en/), a fantastic
|
Self-Defense](https://emailselfdefense.fsf.org/en/), a fantastic resource from
|
||||||
resource from the Free Software Foundation.
|
the Free Software Foundation.
|
||||||
|
|
||||||
***NOTE:*** Encrypting an email *does not* encrypt the metadata. When you
|
**_NOTE:_** Encrypting an email _does not_ encrypt the metadata. When you sign
|
||||||
sign up for a new email service, send one to yourself and inspect the
|
up for a new email service, send one to yourself and inspect the headers to see
|
||||||
headers to see if they obfuscate identifying details.
|
if they obfuscate identifying details.
|
||||||
|
|
||||||
Metadata
|
## Metadata
|
||||||
--------
|
|
||||||
|
|
||||||
Another thing to keep in mind with emails is metadata in the headers of
|
Another thing to keep in mind with emails is metadata in the headers of the
|
||||||
the emails. In Roundcube, you can view these by clicking `More` then
|
emails. In Roundcube, you can view these by clicking `More` then `View source`.
|
||||||
`View source`. In Thunderbird, just press `CTRL` + `U`.For other clients
|
In Thunderbird, just press `CTRL` + `U`.For other clients and web UIs, you'll
|
||||||
and web UIs, you'll just have to look around for options to show
|
just have to look around for options to show headers, view source, download,
|
||||||
headers, view source, download, something like that. You can also take a
|
something like that. You can also take a look at the [email I sent
|
||||||
look at the [email I sent
|
|
||||||
myself](https://bin.nixnet.services/?f76b8366e6b7a7b0#95skPFhsptkfyMH3i1n25ENZeUzrmYEUHzDVezaToGn).
|
myself](https://bin.nixnet.services/?f76b8366e6b7a7b0#95skPFhsptkfyMH3i1n25ENZeUzrmYEUHzDVezaToGn).
|
||||||
|
|
||||||
I'll break down some of the lines and explain what they are. Some of it
|
I'll break down some of the lines and explain what they are. Some of it is
|
||||||
is irrelevant to this and will be skipped though.
|
irrelevant to this and will be skipped though.
|
||||||
|
|
||||||
`Return-Path: <amolith@nixnet.xyz> ` 👉 Address your reply will go to
|
`Return-Path: <amolith@nixnet.xyz> ` 👉 Address your reply will go to
|
||||||
|
|
||||||
`Delivered-To: amolith@nixnet.email ` 👉 Address the email was sent to
|
`Delivered-To: amolith@nixnet.email ` 👉 Address the email was sent to
|
||||||
|
|
||||||
`To: Amolith <amolith@nixnet.email> ` 👉 The *displayed* receiver
|
`To: Amolith <amolith@nixnet.email> ` 👉 The _displayed_ receiver
|
||||||
|
|
||||||
`From: Amolith <amolith@nixnet.xyz> ` 👉 The *displayed* sender
|
`From: Amolith <amolith@nixnet.xyz> ` 👉 The _displayed_ sender
|
||||||
|
|
||||||
`Subject: Email demonstration ` 👉 Subject of the email
|
`Subject: Email demonstration ` 👉 Subject of the email
|
||||||
|
|
||||||
`Date: Sat, 23 Nov 2019 00:20:46 -0500 ` 👉 Timestamp at which the email
|
`Date: Sat, 23 Nov 2019 00:20:46 -0500 ` 👉 Timestamp at which the email was
|
||||||
was sent. This does include the timezone and can be used to identify you
|
sent. This does include the timezone and can be used to identify you
|
||||||
|
|
||||||
`User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 `
|
`User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
|
||||||
👉 Full user-agent the email application includes with the email. In this
|
Thunderbird/68.2.2 ` 👉 Full user-agent the email application includes with the
|
||||||
case, it consists of the organisation, my display server, my operating
|
email. In this case, it consists of the organisation, my display server, my
|
||||||
system and architecture, the HTML rendering engine, and the email client
|
operating system and architecture, the HTML rendering engine, and the email
|
||||||
and version. This can *really* be used to identify you.
|
client and version. This can _really_ be used to identify you.
|
||||||
|
|
||||||
The rest of it is server-side stuff that doesn't matter too much for
|
The rest of it is server-side stuff that doesn't matter too much for _this_
|
||||||
*this* document but will likely be discussed elsewhere in the future.
|
document but will likely be discussed elsewhere in the future. Together, all of
|
||||||
Together, all of this metadata can be used to identify people in a
|
this metadata can be used to identify people in a conversation. Timezone (vague
|
||||||
conversation. Timezone (vague location), OS, email application,
|
location), OS, email application, correspondents, and client version. That last
|
||||||
correspondents, and client version. That last component could actually
|
component could actually be useful for determining whether or not the client is
|
||||||
be useful for determining whether or not the client is susceptible to
|
susceptible to certain malware attacks
|
||||||
certain malware attacks
|
|
||||||
|
|
|
@ -0,0 +1,339 @@
|
||||||
|
---
|
||||||
|
title: "A perfect email setup (for me)"
|
||||||
|
author: ["Amolith"]
|
||||||
|
lastmod: 2023-01-27T13:00:36-05:00
|
||||||
|
tags: ["Email", "Workflow"]
|
||||||
|
categories: ["Technology"]
|
||||||
|
draft: true
|
||||||
|
---
|
||||||
|
|
||||||
|
I've never been satisfied with any of the email clients most people use. I've
|
||||||
|
tried [Thunderbird,](https://www.thunderbird.net/en-GB/)
|
||||||
|
[Evolution,](https://wiki.gnome.org/Apps/Evolution)
|
||||||
|
[Mailspring,](https://getmailspring.com/)
|
||||||
|
[Mail.app,](https://support.apple.com/mail) [Roundcube,](https://roundcube.net/)
|
||||||
|
[SOGo,](https://sogo.nu/) [Geary,](https://wiki.gnome.org/Apps/Geary) and _many_
|
||||||
|
more. _None_ of them handle multiple accounts particularly well because all of
|
||||||
|
the emails associated with that account are bound within it. Sure, you can make
|
||||||
|
a new folder somewhere called `TODO` and move all of your actionable emails to
|
||||||
|
that folder but, when you go to move actionable emails from _another_ account
|
||||||
|
into that folder, you'll likely find that the client simply doesn't let you. If
|
||||||
|
it does, when you reply, it will likely be sent from the wrong account. This is
|
||||||
|
a limitation of the IMAP protocol; everything is _managed_ locally but changes
|
||||||
|
are pushed to the remote server and mixing things the way I want leads to broken
|
||||||
|
setups.
|
||||||
|
|
||||||
|
Before I go any further, these are a few characteristics of my ideal email tool.
|
||||||
|
|
||||||
|
- Support for multiple accounts (obviously)
|
||||||
|
- _Native desktop application_ (**not**
|
||||||
|
[Electron](https://github.com/electron/electron))
|
||||||
|
- Has stellar keyboard shortcuts
|
||||||
|
- Doesn't require internet connectivity (other than downloading and sending of
|
||||||
|
course)
|
||||||
|
- Organisation can be done with tags
|
||||||
|
|
||||||
|
## Why tags? {#why-tags}
|
||||||
|
|
||||||
|
Because they're better. Hierarchies are useful for prose and code but not for
|
||||||
|
files, emails, notes, or anything where an item may fit within multiple
|
||||||
|
categories. Imagine you get an email from your Computer Science professor that
|
||||||
|
includes test dates, homework, and information about another assignment. In that
|
||||||
|
same email, he asks every student to reply with something they learned from the
|
||||||
|
previous class as a form of attendance. In a hierarchy, the best place for this
|
||||||
|
might just be a `TODO` folder _even though_ it would also fit under `School`,
|
||||||
|
`CS`, `Dates`, `To read`, and `Homework`. Maybe you have a few minutes and want
|
||||||
|
to clear out some emails that don't require any interaction. In a tag-based
|
||||||
|
workflow, this would be a good time to open `To read`, get that email out of the
|
||||||
|
way, and remove the `To read` tag. It would still show up under the other tags
|
||||||
|
so you can find it later and take the time to fully answer the professor's
|
||||||
|
question, add those dates to your calendar, and add the homework assignments to
|
||||||
|
your `TODO` list. Hierarchies can be quite cumbersome to work with, especially
|
||||||
|
when one folder ends up getting all the data. Tags ensure that you only see what
|
||||||
|
you want when you want it. Tags are more efficient and they will remain my
|
||||||
|
organisation system of choice.
|
||||||
|
|
||||||
|
## The tools {#the-tools}
|
||||||
|
|
||||||
|
In short, the tools we will be using are...
|
||||||
|
|
||||||
|
- [`mbsync`](https://isync.sourceforge.io/mbsync.html) to download our emails
|
||||||
|
- [`notmuch`,](https://notmuchmail.org/) the primary way emails will be
|
||||||
|
organised
|
||||||
|
- [`afew`](https://afew.readthedocs.io/en/latest/) to apply initial `notmuch`
|
||||||
|
tags based on subject, sender, recipient, etc.
|
||||||
|
- [NeoMutt](https://neomutt.org/) to interact with those emails, reply,
|
||||||
|
compose, add/remove tags, etc.
|
||||||
|
- [`msmtp`](https://marlam.de/msmtp/) for relaying our replies and
|
||||||
|
compositions to our mail provider
|
||||||
|
|
||||||
|
Yes, it's a lot. Yes, it's time-consuming to set up. Yes, it's worth it (in my
|
||||||
|
opinion).
|
||||||
|
|
||||||
|
## `mbsync` {#mbsync}
|
||||||
|
|
||||||
|
As I said above, IMAP is limiting; we need to use some other method of
|
||||||
|
downloading our emails. There's an awesome piece of software called
|
||||||
|
[mbsync](https://isync.sourceforge.io/mbsync.html) which is built for exactly
|
||||||
|
this purpose. Its configuration can be rather daunting if you have as many
|
||||||
|
accounts as I do (19) but it's not _terrible_.
|
||||||
|
|
||||||
|
The following sections are named **Near**, **Far**, and **Sync**. Near and Far
|
||||||
|
are terms mbsync uses to profile _how_ your emails are stored, _where_ they're
|
||||||
|
stored, and how to interact with them. In this guide, Far will our mail
|
||||||
|
provider's IMAP server and Near will be our local Maildir.
|
||||||
|
|
||||||
|
### Far {#far}
|
||||||
|
|
||||||
|
```text
|
||||||
|
IMAPAccount amo_ema
|
||||||
|
Host imap.nixnet.email
|
||||||
|
CertificateFile /etc/ssl/certs/ca-certificates.crt
|
||||||
|
SSLType STARTTLS
|
||||||
|
User amolith@nixnet.email
|
||||||
|
PassCmd "secret-tool lookup Title amolith@nixnet.email"
|
||||||
|
|
||||||
|
IMAPStore amo_ema-remote
|
||||||
|
Account amo_ema
|
||||||
|
```
|
||||||
|
|
||||||
|
### Near {#near}
|
||||||
|
|
||||||
|
```text
|
||||||
|
MaildirStore amo_ema-local
|
||||||
|
SubFolders Verbatim
|
||||||
|
Path ~/new-mail/amo_ema/
|
||||||
|
Inbox ~/new-mail/amo_ema/INBOX/
|
||||||
|
```
|
||||||
|
|
||||||
|
In the first block, `localrepository` and `remoterepository` tell OfflineIMAP
|
||||||
|
where to look for your emails. `use_exa-local` is an arbitrary naming scheme I
|
||||||
|
use to differentiate between the various local and remote accounts. It can
|
||||||
|
easily be swapped with something else.
|
||||||
|
|
||||||
|
### Sync {#sync}
|
||||||
|
|
||||||
|
```text
|
||||||
|
Channel amo_ema
|
||||||
|
Far :amo_ema-remote:
|
||||||
|
Near :amo_ema-local:
|
||||||
|
SyncState *
|
||||||
|
Patterns *
|
||||||
|
Create Both
|
||||||
|
```
|
||||||
|
|
||||||
|
The repository sections describe how the emails are stored or retrieved. In the
|
||||||
|
`local` block, you'll notice that the type is `Maildir`. In this format, each
|
||||||
|
email is given a unique filename and stored in a hierarchy of folders within
|
||||||
|
your account. This is often how your emails are stored on your provider's mail
|
||||||
|
server.
|
||||||
|
|
||||||
|
`pythonfile` is used here to authenticate with the remote server. This can be
|
||||||
|
complicated and depends _entirely_ on how you manage your passwords. I use
|
||||||
|
[KeePassXC](https://keepassxc.org/) and love it. When I set OfflineIMAP up,
|
||||||
|
however, it didn't have `libsecret` compatibility. This would have made setup
|
||||||
|
significantly easier but, as it already just works™, I don't really see a reason
|
||||||
|
to change it.
|
||||||
|
|
||||||
|
This new feature allows `libresecret`-based applications to query KeePassXC for
|
||||||
|
your passwords or store them there on your behalf. CLI/TUI applications that
|
||||||
|
need a secure mechanism for background authentication can use `secret-tool
|
||||||
|
lookup Title "TITLE_OF_PASSWORD"` as the password command. See [the pull
|
||||||
|
request](https://github.com/keepassxreboot/keepassxc/pull/2726) for more
|
||||||
|
details. Because this wasn't a feature when I first set it up, I put my
|
||||||
|
passwords in plaintext files and encrypted them with the GPG key stored on my
|
||||||
|
YubiKey. As long as my key is plugged in, OfflineIMAP can authenticate and
|
||||||
|
download all my emails just fine. The process for using a GPG key _not_ stored
|
||||||
|
on a hardware token is pretty much the same and I'll talk about that process
|
||||||
|
instead.
|
||||||
|
|
||||||
|
These are the contents of my `~/.offlineimap.py`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
#! /usr/bin/env python2
|
||||||
|
from subprocess import check_output
|
||||||
|
def get_pass(account):
|
||||||
|
return check_output(["gpg", "-dq", f" ~/.mail_pass/{account}.gpg"]).strip("\n")
|
||||||
|
```
|
||||||
|
|
||||||
|
This runs `gpg -dq ~/.mail_pass/use_exa.gpg` then strips the newline character
|
||||||
|
before returning it to OfflineIMAP. `-d` tells GPG that you're passing it a file
|
||||||
|
you want decrypted and `-q` tells it not to give any output other than the
|
||||||
|
file's contents. For a setup that works with this Python script, put your
|
||||||
|
passwords in plaintext files with the account name as the file name (e.g.
|
||||||
|
`use_exa`). You'll then encrypt it with `gpg -er <YOUR_KEY_ID> use_exa`. Running
|
||||||
|
`gpg -dq use_exa.gpg` should display your password. Repeat for every account and
|
||||||
|
store the resulting files in `~/.mail_pass/`.
|
||||||
|
|
||||||
|
The other option, `sync_deletes`, is whether or not to delete remote emails that
|
||||||
|
have been deleted locally. I enabled that because I want to have easy control
|
||||||
|
over how much remote storage is used.
|
||||||
|
|
||||||
|
Here's the next block again so you don't have to scroll up:
|
||||||
|
|
||||||
|
```text
|
||||||
|
[Repository use_exa-remote]
|
||||||
|
type = IMAP
|
||||||
|
remotehost = imap.example.com
|
||||||
|
starttls = yes
|
||||||
|
ssl = no
|
||||||
|
remoteport = 143
|
||||||
|
remoteuser = user@example.com
|
||||||
|
remotepasseval = get_pass("use_exa")
|
||||||
|
auth_mechanisms = GSSAPI, XOAUTH2, CRAM-MD5, PLAIN, LOGIN
|
||||||
|
maxconnections = 1
|
||||||
|
createfolders = True
|
||||||
|
sync_deletes = yes
|
||||||
|
```
|
||||||
|
|
||||||
|
This one's pretty self-explanatory. `type`, `remotehost`, `starttls`, `ssl`, and
|
||||||
|
`remoteport` should all be somewhere in your provider's documentation.
|
||||||
|
`remoteuser` is your email address and `remotepasseval` is the function that
|
||||||
|
will return your password and allow OfflineIMAP to authenticate. You'll want
|
||||||
|
enter the name of your password file without the `.gpg` extension; the script
|
||||||
|
takes care of adding that. Leave `auth_mechanisms` alone and the same for
|
||||||
|
`maxconnections` unless you know your provider won't rate limit you or something
|
||||||
|
for opening multiple connections. `sync_deletes` is the same as in the previous
|
||||||
|
block.
|
||||||
|
|
||||||
|
Copy those three blocks for as many accounts as you want emails downloaded from.
|
||||||
|
I have 510 lines just for `Account` and `Repository` blocks due to the number of
|
||||||
|
address I'm keeping track of.
|
||||||
|
|
||||||
|
## `notmuch` {#notmuch}
|
||||||
|
|
||||||
|
[`notmuch`](https://notmuchmail.org/) is _a fast, global-search, and tag-based
|
||||||
|
email system_. This what does all of our organisation as well as what provides
|
||||||
|
the "virtual" mailboxes NeoMutt will display later on. Configuration is
|
||||||
|
incredibly simple. This file goes in `~/.notmuch-config`.
|
||||||
|
|
||||||
|
```text
|
||||||
|
[database]
|
||||||
|
path=/home/user/mail/
|
||||||
|
|
||||||
|
[user]
|
||||||
|
name=Amolith
|
||||||
|
primary_email=user@example.com
|
||||||
|
|
||||||
|
[new]
|
||||||
|
tags=unread;new;
|
||||||
|
ignore=Trash;
|
||||||
|
|
||||||
|
[search]
|
||||||
|
exclude_tags=deleted;spam;
|
||||||
|
|
||||||
|
[maildir]
|
||||||
|
synchronize_flags=true
|
||||||
|
```
|
||||||
|
|
||||||
|
First section is the path to where all of your archives are, the `[user]`
|
||||||
|
section is where you list all of your accounts, `[new]` adds `tags` to mail
|
||||||
|
notmuch hasn't indexed yet and ignores indexing the `Trash` folder, and
|
||||||
|
`[search]` ignores mail tagged with `deleted` or `spam`. The final section tells
|
||||||
|
`notmuch` to add maildir flags which correspond with `notmuch` tags. These flags
|
||||||
|
will be synced to the remote server the next time OfflineIMAP runs and things
|
||||||
|
will be somewhat organised in your webmail interface.
|
||||||
|
|
||||||
|
After creating the configuration file, run `notmuch new` and wait for all of
|
||||||
|
your mail to be indexed. This could take a short amount of time or it could take
|
||||||
|
minutes up to an hour, depending on how many emails you have. After it's
|
||||||
|
finished, you'll be able to run queries and see matching emails:
|
||||||
|
|
||||||
|
```text
|
||||||
|
$ notmuch search from:user@example.com
|
||||||
|
thread:0000000000002e9d December 28 [1/1] Example User; Random subject that means nothing
|
||||||
|
```
|
||||||
|
|
||||||
|
This is not terribly useful in and of itself because you can't read it or reply
|
||||||
|
to it or anything. That's where the Mail User Agent (MUA) comes in.
|
||||||
|
|
||||||
|
## `afew` {#afew}
|
||||||
|
|
||||||
|
[`afew`](https://afew.readthedocs.io/en/latest/) is _an initial tagging script
|
||||||
|
for notmuch_. After calling `notmuch new`, `afew` will add tags based on headers
|
||||||
|
such as `From:`, `To:`, `Subject:`, etc. as well as handle killed threads and
|
||||||
|
spam. The official [quickstart
|
||||||
|
guide](https://afew.readthedocs.io/en/latest/quickstart.html) is probably the
|
||||||
|
best resource on getting started but I'll include a few tips here as well.
|
||||||
|
|
||||||
|
## NeoMutt {#neomutt}
|
||||||
|
|
||||||
|
## `msmtp` {#msmtp}
|
||||||
|
|
||||||
|
`msmtp` is what's known as a _Mail Transfer Agent_ (MTA). You throw it an email
|
||||||
|
and it will relay that to your mail provider's SMTP server so it can have the
|
||||||
|
proper headers attached for authentication, it can be sent from the proper
|
||||||
|
domain, etc. All the necessary security measures can be applied that prevent
|
||||||
|
your email from going directly to spam or from being rejected outright.
|
||||||
|
|
||||||
|
`msmtp`'s configuration is also fairly simple if a bit long, just like
|
||||||
|
OfflineIMAP's.
|
||||||
|
|
||||||
|
```text
|
||||||
|
# Set default values for all following accounts.
|
||||||
|
defaults
|
||||||
|
|
||||||
|
# Use the mail submission port 587 instead of the SMTP port 25.
|
||||||
|
port 587
|
||||||
|
|
||||||
|
# Always use TLS.
|
||||||
|
tls on
|
||||||
|
```
|
||||||
|
|
||||||
|
This section just sets the defaults. It uses port 587 (STARTTLS) for all SMTP
|
||||||
|
servers unless otherwise specified and enables TLS.
|
||||||
|
|
||||||
|
```text
|
||||||
|
account user@example.com
|
||||||
|
host smtp.example.com
|
||||||
|
from user@example.com
|
||||||
|
auth on
|
||||||
|
user user@example.com
|
||||||
|
passwordeval secret-tool lookup Title "user@example.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
This section is where things get tedious. When passing an email to `msmtp`, it
|
||||||
|
looks at the `From:` header and searches for a block with a matching `from`
|
||||||
|
line. If it finds one, it will use those configuration options to relay the
|
||||||
|
email. `host` is simply the SMTP server of your mail provider, sometimes this is
|
||||||
|
`mail.example.com`, `smtp.example.com`, etc. I've already explained `from`,
|
||||||
|
`auth` simply says that a username and password will have to be provided, `user`
|
||||||
|
is that username, and `passwordeval` is a method to obtain the password.
|
||||||
|
|
||||||
|
When I got to configuring `msmtp`, [KeePassXC](https://keepassxc.org/) had just
|
||||||
|
released their `libsecret` integration and I wanted to try it. `secret-tool` is
|
||||||
|
a command line tool used to store and retrieve passwords from whatever keyring
|
||||||
|
you're using. I think KDE has `kwallet` and GNOME has `gnome-keyring` if you
|
||||||
|
already have those set up and want to use them; the process should be quite
|
||||||
|
similar regardless.
|
||||||
|
|
||||||
|
As mentioned above `secret-tool` stores and retrieves passwords. For retrieval,
|
||||||
|
it expects the command to look like this.
|
||||||
|
|
||||||
|
```text
|
||||||
|
secret-tool lookup {attribute} {value} ...
|
||||||
|
```
|
||||||
|
|
||||||
|
I don't know what `kwallet` and `gnome-keyring`'s attributes are but this can be
|
||||||
|
used with KeePassXC by specifying the `Title` attribute. If the password to your
|
||||||
|
email account is stored in KeePassXC with the address as the entry title, you
|
||||||
|
can retrieve it by simply running...
|
||||||
|
|
||||||
|
```text
|
||||||
|
secret-tool lookup Title "user@example.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
If you have a different naming system, you'll have to experiment and try
|
||||||
|
different things; I don't know what KeePassXC's other attributes are so I can't
|
||||||
|
give other examples.
|
||||||
|
|
||||||
|
```text
|
||||||
|
passwordeval gpg -dq ~/.mail_pass/use_exa.gpg
|
||||||
|
```
|
||||||
|
|
||||||
|
Now that the whole block is assembled, copy/paste/edit for as many accounts as
|
||||||
|
you want to send email from.
|
||||||
|
|
||||||
|
## Summary {#summary}
|
||||||
|
|
||||||
|
## <span class="org-todo todo TODO">TODO</span> Pong fluffy when finished {#pong-fluffy-when-finished}
|
|
@ -0,0 +1,373 @@
|
||||||
|
---
|
||||||
|
title: "Audacity and the telemetry pull request"
|
||||||
|
author: ["Amolith"]
|
||||||
|
lastmod: 2023-01-27T13:00:37-05:00
|
||||||
|
tags: ["Open source culture", "Audio editing", "Music", "Drama"]
|
||||||
|
categories: ["Technology"]
|
||||||
|
draft: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Five days ago at the time of writing, [Dmitry Vedenko](https://github.com/crsib)
|
||||||
|
opened a Pull Request (PR) in [Audacity's GitHub
|
||||||
|
repository](https://github.com/audacity/audacity/pull/835) entitled [_Basic
|
||||||
|
telemetry for the Audacity_.](https://github.com/audacity/audacity/pull/835)
|
||||||
|
About two days later, all hell broke loose. That PR now has over 3.3 thousand
|
||||||
|
downvotes and more than one thousand comments from nearly 400 individuals. I
|
||||||
|
started reading the posts shortly after they began and kept up with them over
|
||||||
|
the following days, reading every single new post. I recognise that few people
|
||||||
|
are going to feel like wading through over 1k comments so this is my attempt to
|
||||||
|
provide a summary of the PR itself using the community's code reviews along with
|
||||||
|
a summary of the various opinions conveyed in the comments.
|
||||||
|
|
||||||
|
When I reference comments, I'll provide a footnote that includes a link to the
|
||||||
|
comment and a link to a screenshot just in case it's removed or edited in the
|
||||||
|
future.
|
||||||
|
|
||||||
|
## Audacity's acquisition {#audacity-s-acquisition}
|
||||||
|
|
||||||
|
I haven't been able to find _much_ information in this area so forgive me if I'm
|
||||||
|
scant on details.
|
||||||
|
|
||||||
|
On 30 April, a company called [Muse Group](https://mu.se/) acquired
|
||||||
|
[Audacity.](https://www.audacityteam.org/) According to [their
|
||||||
|
website](https://mu.se), Muse is the parent company behind many musical
|
||||||
|
applications and tools. It was founded by Eugeny Naidenov just days before it
|
||||||
|
acquired Audacity. Before all of this, Eugeny Naidenov founded [Ultimate
|
||||||
|
Guitar](https://www.ultimate-guitar.com/) (UG) in 1998. The service grew rather
|
||||||
|
quickly and now has over 300 million users. UG acquired [Dean Zelinsky
|
||||||
|
Guitars](https://deanzelinsky.com/) in 2012, [Agile
|
||||||
|
Partners](http://agilepartners.com/) in 2013,
|
||||||
|
[MuseScore](https://musescore.org/) in 2017, and
|
||||||
|
[Crescendo](http://trycrescendo.com/) in 2018. Muse Group was established in
|
||||||
|
2021 and it seems as if all of the services UG acquired were (or will be)
|
||||||
|
transferred to Muse Group, as well as UG itself. Immediately following its
|
||||||
|
establishment, Muse not only acquired Audacity but also
|
||||||
|
[StaffPad.](https://www.staffpad.net/)
|
||||||
|
|
||||||
|
I say 30 April because that's when Muse published their [press
|
||||||
|
release](https://mu.se/newsroom/tpost/6dhedma301-muse-group-acquires-audacity-expanding-c)
|
||||||
|
and when Martin Keary (Tantacrul) published a video entitled [_I’m now in charge
|
||||||
|
of Audacity. Seriously._](https://www.youtube.com/watch?v=RMWNvwLiXIQ) According
|
||||||
|
to his comment,[^fn:1] Martin will help with proposing Audacity's roadmap and
|
||||||
|
many of its future features as well as working with the community. This has been
|
||||||
|
his role with MuseScore since he joined that project and he will be continuing
|
||||||
|
it here.
|
||||||
|
|
||||||
|
`-----BEGIN PERSONAL OPINION-----`
|
||||||
|
|
||||||
|
Looking at [his website,](https://www.martinkeary.com/) I also suspect he will
|
||||||
|
play a large role in redesigning Audacity's interface. Considering that he was
|
||||||
|
instrumental in designing [the best mobile interface I've ever had the absolute
|
||||||
|
pleasure of experiencing,](https://www.martinkeary.com/#/ubuntu-touch-os/) I
|
||||||
|
have high hopes that this is the case.
|
||||||
|
|
||||||
|
`------END PERSONAL OPINION------`
|
||||||
|
|
||||||
|
## Telemetry implementation {#telemetry-implementation}
|
||||||
|
|
||||||
|
### Implementation Basics {#implementation-basics}
|
||||||
|
|
||||||
|
A few days after the acquisition, a PR was opened that adds _Basic telemetry for
|
||||||
|
the Audacity_. This implementation collects "application opened" events and
|
||||||
|
sends those to Yandex to estimate the number of Audacity users. It also collects
|
||||||
|
session start and end events, errors for debugging, file used for import and
|
||||||
|
export, OS and Audacity versions, and the use of effects, generators, and
|
||||||
|
analysis tools so they can prioritise future improvements. Sending this data
|
||||||
|
would be optional and the user would be presented with a dialogue the first time
|
||||||
|
they launch the application after installation or after they update to the
|
||||||
|
including release. This description was mostly copied directly from [the PR
|
||||||
|
description
|
||||||
|
itself.](https://github.com/audacity/audacity/pull/835#issue-629891447)
|
||||||
|
|
||||||
|
### Frontend Implementation {#frontend-implementation}
|
||||||
|
|
||||||
|
This is fairly straightforward and a pretty standard UI for prompting users to
|
||||||
|
consent to analytics and crash logging. This section is included because the
|
||||||
|
community has strong opinions regarding the language used and its design, but
|
||||||
|
that will be discussed later. The screenshot below is copied directly from the
|
||||||
|
PR.
|
||||||
|
|
||||||
|
{{< figure
|
||||||
|
src="~/repos/sites/secluded/static/assets/pngs/audacity-pr/consentdialogue.png"
|
||||||
|
link="~/repos/sites/secluded/static/assets/pngs/audacity-pr/consentdialogue.png"
|
||||||
|
|
||||||
|
> }}
|
||||||
|
|
||||||
|
### Backend Implementation {#backend-implementation}
|
||||||
|
|
||||||
|
Many of the code reviews include the reviewer's personal opinion so I will
|
||||||
|
summarise the comment, provide the code block in question, and link directly to
|
||||||
|
the comment in a footnote.[^fn:2]
|
||||||
|
|
||||||
|
```c
|
||||||
|
if (!inputFile.Write (wxString::FromUTF8 (ClientID + "\n")))
|
||||||
|
return false;
|
||||||
|
```
|
||||||
|
|
||||||
|
[Lines 199-200 of
|
||||||
|
TelemetryManager.cpp](https://github.com/crsib/audacity/blob/c9264d2478fe2af82aeb6e2a0295b00b3a27ce53/libraries/lib-telemetry/TelemetryManager.cpp#L199-L200)
|
||||||
|
save the user's unique client ID to a file.[^fn:3] This allows the analytics
|
||||||
|
tool (in this case, Google Analytics) to aggregate data produced by a single
|
||||||
|
user.
|
||||||
|
|
||||||
|
```c
|
||||||
|
def_vars()
|
||||||
|
|
||||||
|
set( CURL_DIR "${_INTDIR}/libcurl" )
|
||||||
|
set( CURL_TAG "curl-7_76_0")
|
||||||
|
```
|
||||||
|
|
||||||
|
[Lines 3-6 of
|
||||||
|
CMakeLists.txt](https://github.com/crsib/audacity/blob/c9264d2478fe2af82aeb6e2a0295b00b3a27ce53/cmake-proxies/libcurl/CMakeLists.txt#L3-L6)
|
||||||
|
"vendor in" libcurl.[^fn:4] This is when an application directly includes
|
||||||
|
sources for a utility rather than making use utilities provided by the system
|
||||||
|
itself.
|
||||||
|
|
||||||
|
```c
|
||||||
|
ExternalProject_Add(curl
|
||||||
|
PREFIX "${CURL_DIR}"
|
||||||
|
INSTALL_DIR "${CURL_DIR}"
|
||||||
|
GIT_REPOSITORY https://github.com/curl/curl
|
||||||
|
GIT_TAG ${CURL_TAG}
|
||||||
|
GIT_SHALLOW Yes
|
||||||
|
CMAKE_CACHE_ARGS ${CURL_CMAKE_ARGS}
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
[Lines 29-36 of
|
||||||
|
CMakeLists.txt](https://github.com/crsib/audacity/blob/c9264d2478fe2af82aeb6e2a0295b00b3a27ce53/cmake-proxies/libcurl/CMakeLists.txt#L29-L36)
|
||||||
|
add curl as a remote dependency.[^fn:5] This means that the machine building
|
||||||
|
Audacity from its source code has to download curl during that build.
|
||||||
|
|
||||||
|
```c
|
||||||
|
S.Id (wxID_NO).AddButton (rejectButtonTitle);
|
||||||
|
S.Id (wxID_YES).AddButton (acceptButtonTitle)->SetDefault ();
|
||||||
|
```
|
||||||
|
|
||||||
|
[Lines 93-94 of
|
||||||
|
TelemetryDialog.cpp](https://github.com/crsib/audacity/blob/c9264d2478fe2af82aeb6e2a0295b00b3a27ce53/src/telemetry/TelemetryDialog.cpp#L93-L94)
|
||||||
|
add buttons to the dialogue asking the user whether they consent to data
|
||||||
|
collection.[^fn:6] `SetDefault` focuses the button indicating that the user does
|
||||||
|
consent. This means that if the user doesn't really look at the dialogue and
|
||||||
|
presses Spacebar or Enter, or if they do so accidentally by simply bumping the
|
||||||
|
key, they unintentionally consent to data collection. If the user desires, this
|
||||||
|
can later be changed in the settings menu. However, if they weren't aware what
|
||||||
|
they were consenting to _or that they did consent_, they won't know to go back
|
||||||
|
and opt out.
|
||||||
|
|
||||||
|
There are other problems with the code that include [simple
|
||||||
|
mistakes,](https://github.com/audacity/audacity/pull/835#discussion_r628816050)
|
||||||
|
[styling that's inconsistent with the rest of the
|
||||||
|
project,](https://github.https//github.com/audacity/audacity/pull/835#discussion_r628774985)
|
||||||
|
[unhandled return values resulting in skewed
|
||||||
|
data,](https://github.com/audacity/audacity/pull/835#discussion_r628500849) [use
|
||||||
|
of inappropriate
|
||||||
|
functions,](https://github.com/audacity/audacity/pull/835#discussion_r628792423)
|
||||||
|
and [spelling errors in the
|
||||||
|
comments.](https://github.com/audacity/audacity/pull/835#discussion_r628818054)
|
||||||
|
I believe these are less important than those above so they won't be discussed.
|
||||||
|
|
||||||
|
## Community opinions {#community-opinions}
|
||||||
|
|
||||||
|
There were many strong opinions regarding both the frontend and backend
|
||||||
|
implementations of this PR, from the wording of the dialogue and highlighting
|
||||||
|
the consent button to devices running something other than Windows and macOS not
|
||||||
|
being able to send telemetry and thus skewing the data that _was_ collected.
|
||||||
|
|
||||||
|
### Opinions on the frontend {#opinions-on-the-frontend}
|
||||||
|
|
||||||
|
Really, the only frontend here is the consent dialogue. However, there are
|
||||||
|
_many_ comments about it, the most common of which is probably that the wording
|
||||||
|
is not only too vague[^fn:7] but also inaccurate.[^fn:8] The assertion that
|
||||||
|
Google Analytics are not anonymous and any data sent can be trivially
|
||||||
|
de-anonymised (or de-pseudonymised) is repeated many times over. Below are a few
|
||||||
|
links to comments stating such. I searched for the term _"anonymous"_, copied
|
||||||
|
relevant links, and stopped when my scrollbar reached halfway down the page.
|
||||||
|
|
||||||
|
- [r628156527](https://github.com/audacity/audacity/pull/835#discussion_r628156527)
|
||||||
|
- [833969780](https://github.com/audacity/audacity/pull/835#issuecomment-833969780)
|
||||||
|
- [833969933](https://github.com/audacity/audacity/pull/835#issuecomment-833969933)
|
||||||
|
- [r627995927](https://github.com/audacity/audacity/pull/835#discussion_r627995927)
|
||||||
|
- [834358022](https://github.com/audacity/audacity/pull/835#issuecomment-834358022)
|
||||||
|
- [834377549](https://github.com/audacity/audacity/pull/835#issuecomment-834377549)
|
||||||
|
- [834382007](https://github.com/audacity/audacity/pull/835#issuecomment-834382007)
|
||||||
|
- [834385463](https://github.com/audacity/audacity/pull/835#issuecomment-834385463)
|
||||||
|
- [834405825](https://github.com/audacity/audacity/pull/835#issuecomment-834405825)
|
||||||
|
- [834531779](https://github.com/audacity/audacity/pull/835#issuecomment-834531779)
|
||||||
|
- [834546874](https://github.com/audacity/audacity/pull/835#issuecomment-834546874)
|
||||||
|
- [834638000](https://github.com/audacity/audacity/pull/835#issuecomment-834638000)
|
||||||
|
|
||||||
|
The next most pervasive comment is regarding the consent buttons at the bottom
|
||||||
|
of the dialogue where users opt in or out.[^fn:9] Many individuals call this
|
||||||
|
design a _dark pattern_. Harry Brignull, a UX specialist focusing on deceptive
|
||||||
|
interface practises, describes dark patterns as [_tricks used in websites and
|
||||||
|
apps that make you do things that you didn't mean
|
||||||
|
to_.](https://www.darkpatterns.org/) The dark pattern in this situation is the
|
||||||
|
opt-in button being highlighted. Many community members assert that users will
|
||||||
|
see the big blue button and click it without actually reading the dialogue's
|
||||||
|
contents. They just want to record their audio and this window is a distraction
|
||||||
|
that prevents them from doing so; it needs to get out of the way and the
|
||||||
|
quickest way to dismiss it is clicking that blue button. Below is a list of some
|
||||||
|
comments criticising this design.
|
||||||
|
|
||||||
|
- [834286641](https://github.com/audacity/audacity/pull/835#issuecomment-834286641)
|
||||||
|
- [834358022](https://github.com/audacity/audacity/pull/835#issuecomment-834358022)
|
||||||
|
- [834399813](https://github.com/audacity/audacity/pull/835#issuecomment-834399813)
|
||||||
|
- [834479968](https://github.com/audacity/audacity/pull/835#issuecomment-834479968)
|
||||||
|
- [835250737](https://github.com/audacity/audacity/pull/835#issuecomment-835250737)
|
||||||
|
- [835253882](https://github.com/audacity/audacity/pull/835#issuecomment-835253882)
|
||||||
|
- [835291066](https://github.com/audacity/audacity/pull/835#issuecomment-835291066)
|
||||||
|
- [835445481](https://github.com/audacity/audacity/pull/835#issuecomment-835445481)
|
||||||
|
|
||||||
|
Another issue that was brought up by a couple of individuals was the lack of a
|
||||||
|
privacy policy.[^fn:10] The consent dialogue links to one, but, at the time of
|
||||||
|
writing, one does not exist at [the provided
|
||||||
|
URL.](https://www.audacityteam.org/contact/privacy-policy/) I have [archived the
|
||||||
|
state of the
|
||||||
|
page](https://web.archive.org/web/20210510012924/https://www.audacityteam.org/contact/privacy-policy/)
|
||||||
|
in case that changes in the future.
|
||||||
|
|
||||||
|
### Opinions on the backend {#opinions-on-the-backend}
|
||||||
|
|
||||||
|
```c
|
||||||
|
if (!inputFile.Write (wxString::FromUTF8 (ClientID + "\n")))
|
||||||
|
return false;
|
||||||
|
```
|
||||||
|
|
||||||
|
The issue many individuals take with this snippet is saving the `ClientID`. Say
|
||||||
|
an individual has an odd file that causes Audacity to crash any time they try to
|
||||||
|
open it. Say they attempt to open it a hundred times. Without giving the client
|
||||||
|
a unique ID, it could look like there are 100 people having an issue opening a
|
||||||
|
file instead of just the one. However, by virtue of each installation having an
|
||||||
|
entirely unique ID, this telemetry _is not anonymous_. Anonymity would be
|
||||||
|
sending statistics in such a way that connecting those failed attempts to a
|
||||||
|
single user would be impossible. At best, this implementation is _pseudonymous_
|
||||||
|
because the client is given a random ID, you don't have to sign in with an
|
||||||
|
account or something.
|
||||||
|
|
||||||
|
```c
|
||||||
|
def_vars()
|
||||||
|
|
||||||
|
set( CURL_DIR "${_INTDIR}/libcurl" )
|
||||||
|
set( CURL_TAG "curl-7_76_0")
|
||||||
|
```
|
||||||
|
|
||||||
|
Timothe Litt's comment gives a good description of why "vendoring in" libcurl is
|
||||||
|
a bad idea[^fn:11] and Tyler True's comment gives a good overview of the pros
|
||||||
|
and cons of doing so.[^fn:12] Many people take issue with this _specifically_
|
||||||
|
because it's libcurl. Security flaws in it are _very_ common and Audacity's copy
|
||||||
|
would need to be _manually_ kept up to date with every upstream release to
|
||||||
|
ensure none of its vulnerabilities can be leveraged to compromise users. If the
|
||||||
|
Audacity team was going to stay on top of all of the security fixes, they would
|
||||||
|
need to release a new version every week or so.
|
||||||
|
|
||||||
|
```c
|
||||||
|
ExternalProject_Add(curl
|
||||||
|
PREFIX "${CURL_DIR}"
|
||||||
|
INSTALL_DIR "${CURL_DIR}"
|
||||||
|
GIT_REPOSITORY https://github.com/curl/curl
|
||||||
|
GIT_TAG ${CURL_TAG}
|
||||||
|
GIT_SHALLOW Yes
|
||||||
|
CMAKE_CACHE_ARGS ${CURL_CMAKE_ARGS}
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
The problem with downloading curl at build-time is that it's simply disallowed
|
||||||
|
for many Linux- and BSD-based operation systems. When a distribution builds an
|
||||||
|
application from source, its build dependencies are often downloaded ahead of
|
||||||
|
time and, as a security measure, the build machine is cut off from the internet
|
||||||
|
to prevent any interference. Because this is disallowed, the build will fail and
|
||||||
|
the application won't be available on those operation systems.
|
||||||
|
|
||||||
|
Note, however, that these build machines would have the option to disable
|
||||||
|
telemetry at build-time. This means the machine wouldn't attempt to download
|
||||||
|
curl from GitHub and the build would succeed but, again, telemetry would be
|
||||||
|
disabled for anyone not on Windows or macOS. This defeats the whole purpose of
|
||||||
|
adding telemetry in the first place.
|
||||||
|
|
||||||
|
```c
|
||||||
|
S.Id (wxID_NO).AddButton (rejectButtonTitle);
|
||||||
|
S.Id (wxID_YES).AddButton (acceptButtonTitle)->SetDefault ();
|
||||||
|
```
|
||||||
|
|
||||||
|
There was a lot of feedback about the decision to highlight the consent button
|
||||||
|
but that was mentioned up in the frontend section; I won't rehash it here.
|
||||||
|
|
||||||
|
### Broader and particularly well-structured comments {#broader-and-particularly-well-structured-comments}
|
||||||
|
|
||||||
|
These are simply some comments I feel deserve particular attention.
|
||||||
|
|
||||||
|
From SndChaser...
|
||||||
|
|
||||||
|
- [834037351](https://github.com/audacity/audacity/pull/835#issuecomment-834037351)
|
||||||
|
-
|
||||||
|
|
||||||
|
## The Audacity team's response {#the-audacity-team-s-response}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## The privacy policy modification {#the-privacy-policy-modification}
|
||||||
|
|
||||||
|
<https://github.com/audacity/audacity/issues/1213#issuecomment-875274890>
|
||||||
|
|
||||||
|
[^fn:1]:
|
||||||
|
[Link to the
|
||||||
|
comment](https://github.com/audacity/audacity/pull/835#issuecomment-836069326)
|
||||||
|
and [link to the screenshot](/assets/pngs/audacity-pr/tantacrulrole.png)
|
||||||
|
|
||||||
|
[^fn:2]:
|
||||||
|
Note that because I am not a C programmer, these reviews might not be
|
||||||
|
entirely accurate and I wouldn't be able to catch the reviewer's error. I am
|
||||||
|
relying on other community members to catch issues and comment on them; none
|
||||||
|
of the reviews I link to have such comments so I'm assuming they are
|
||||||
|
correct.
|
||||||
|
|
||||||
|
[^fn:3]:
|
||||||
|
[Link to the
|
||||||
|
review](https://github.com/audacity/audacity/pull/835#discussion_r627993755) and
|
||||||
|
[link to the screenshot](/assets/pngs/audacity-pr/writeanalyticsid.png)
|
||||||
|
|
||||||
|
[^fn:4]:
|
||||||
|
[Link to the
|
||||||
|
review](https://github.com/audacity/audacity/pull/835#discussion_r628005925) and
|
||||||
|
[link to the screenshot](/assets/pngs/audacity-pr/vendorcurl.png)
|
||||||
|
|
||||||
|
[^fn:5]:
|
||||||
|
[Link to the
|
||||||
|
review](https://github.com/audacity/audacity/pull/835#discussion_r628008821) and
|
||||||
|
[link to the screenshot](/assets/pngs/audacity-pr/externaldependency.png)
|
||||||
|
|
||||||
|
[^fn:6]:
|
||||||
|
[Link to the
|
||||||
|
review](https://github.com/audacity/audacity/pull/835#discussion_r628124998) and
|
||||||
|
[link to the screenshot](/assets/pngs/audacity-pr/defaultconsentbutton.png)
|
||||||
|
|
||||||
|
[^fn:7]:
|
||||||
|
[Link to the
|
||||||
|
comment](https://github.com/audacity/audacity/pull/835#discussion_r627756976)
|
||||||
|
and [link to the screenshot](/assets/pngs/audacity-pr/vaguedialogue.png)
|
||||||
|
|
||||||
|
[^fn:8]:
|
||||||
|
[Link to the
|
||||||
|
comment](https://github.com/audacity/audacity/pull/835#discussion_r627764300)
|
||||||
|
and the screenshot is the same as previous
|
||||||
|
|
||||||
|
[^fn:9]:
|
||||||
|
[Link to the
|
||||||
|
comment](https://github.com/audacity/audacity/pull/835#issuecomment-834286641)
|
||||||
|
and [link to the screenshot](/assets/pngs/audacity-pr/darkpattern.png)
|
||||||
|
|
||||||
|
[^fn:10]:
|
||||||
|
[Link to the
|
||||||
|
comment](https://github.com/audacity/audacity/pull/835#discussion_r627762185)
|
||||||
|
and [link to the screenshot](/assets/pngs/audacity-pr/missingprivacypolicy.png)
|
||||||
|
|
||||||
|
[^fn:11]:
|
||||||
|
[Link to the
|
||||||
|
comment](https://github.com/audacity/audacity/pull/835#issuecomment-834451187)
|
||||||
|
and [link to the screenshot](/assets/pngs/audacity-pr/privatelibcurl.png)
|
||||||
|
|
||||||
|
[^fn:12]:
|
||||||
|
[Link to the
|
||||||
|
comment](https://github.com/audacity/audacity/pull/835#issuecomment-834010117)
|
||||||
|
and [link to the screenshot](/assets/pngs/audacity-pr/vendorproscons.png)
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
title: "Email can be pleasant, but like all good things, it takes work"
|
||||||
|
author: ["Amolith"]
|
||||||
|
lastmod: 2023-01-27T13:00:36-05:00
|
||||||
|
categories: ["Meta"]
|
||||||
|
draft: true
|
||||||
|
toc: true
|
||||||
|
---
|
|
@ -1,10 +1,9 @@
|
||||||
---
|
---
|
||||||
title: "Focus intentionally"
|
title: "Focus intentionally"
|
||||||
author: ["Amolith"]
|
author: Amolith
|
||||||
lastmod: 2022-04-23T21:12:29-04:00
|
lastmod: 2022-04-23T21:12:29-04:00
|
||||||
categories: ["Meta"]
|
categories: ["Meta"]
|
||||||
draft: true
|
draft: true
|
||||||
toc: true
|
|
||||||
---
|
---
|
||||||
|
|
||||||
I am too easily distracted. Sitting at my desk on an average day, I have movies,
|
I am too easily distracted. Sitting at my desk on an average day, I have movies,
|
||||||
|
@ -18,22 +17,21 @@ Putting all of this together results in terrible productivity and incessant
|
||||||
procrastination If my primary task is something I'm less-than-motivated to
|
procrastination If my primary task is something I'm less-than-motivated to
|
||||||
accomplish.
|
accomplish.
|
||||||
|
|
||||||
In a recent episode of _The Art of Manliness_, Brett McKay interviews Dr. BJ Fogg
|
In a recent episode of _The Art of Manliness_, Brett McKay interviews Dr. BJ
|
||||||
about his new book, _Tiny Habits: The Small Changes That Change Everything_. One
|
Fogg about his new book, _Tiny Habits: The Small Changes That Change
|
||||||
of Dr. Fogg's statements in this episode stuck with me; when training yourself
|
Everything_. One of Dr. Fogg's statements in this episode stuck with me; when
|
||||||
to adopt new behaviours, there are three things that must factors that determine
|
training yourself to adopt new behaviours, there are three things that must
|
||||||
your success: motivation, ability, and a prompt. A prompt is just something that
|
factors that determine your success: motivation, ability, and a prompt. A prompt
|
||||||
reminds you of the behaviour you're trying to adopt. The act of brushing your
|
is just something that reminds you of the behaviour you're trying to adopt. The
|
||||||
teeth might be the prompt for flossing. The act of flossing might be the prompt
|
act of brushing your teeth might be the prompt for flossing. The act of flossing
|
||||||
for making coffee. In my situation, the prompt is just needing to get work done
|
might be the prompt for making coffee. In my situation, the prompt is just
|
||||||
so we'll ignore that factor. Ability refers to how simple you find the task and
|
needing to get work done so we'll ignore that factor. Ability refers to how
|
||||||
motivation is how motivated you are to accomplish it. These last two must
|
simple you find the task and motivation is how motivated you are to accomplish
|
||||||
balance each other out; if your motivation to complete the task is low, your
|
it. These last two must balance each other out; if your motivation to complete
|
||||||
ability must be high — the task must be easy, while if your ability is low, your
|
the task is low, your ability must be high — the task must be easy, while if
|
||||||
motivation must be rather high.
|
your ability is low, your motivation must be rather high.
|
||||||
|
|
||||||
|
## Note
|
||||||
## Notes {#notes}
|
|
||||||
|
|
||||||
- Close primary browser with a million tabs open and use Epiphany
|
- Close primary browser with a million tabs open and use Epiphany
|
||||||
- Close all the chat apps
|
- Close all the chat apps
|
||||||
|
@ -42,8 +40,7 @@ motivation must be rather high.
|
||||||
- Take off your smart/fitness watch
|
- Take off your smart/fitness watch
|
||||||
- If you listen to music, make it something calming, not eclectic
|
- If you listen to music, make it something calming, not eclectic
|
||||||
|
|
||||||
|
## References
|
||||||
## References {#references}
|
|
||||||
|
|
||||||
- [The Art of Manliness: Become a Focused Monotasker](https://www.artofmanliness.com/character/behavior/monotasking-podcast/)
|
- [The Art of Manliness: Become a Focused Monotasker](https://www.artofmanliness.com/character/behavior/monotasking-podcast/)
|
||||||
- [The Art of Manliness: The Tiny Habits That Change Everything](https://www.artofmanliness.com/character/habits/podcast-581-the-tiny-habits-that-change-everything/)
|
- [The Art of Manliness: The Tiny Habits That Change Everything](https://www.artofmanliness.com/character/habits/podcast-581-the-tiny-habits-that-change-everything/)
|
||||||
|
|
|
@ -9,26 +9,27 @@ toc: true
|
||||||
---
|
---
|
||||||
|
|
||||||
This is primarily intended for people new to FreeBSD. If you're already familiar
|
This is primarily intended for people new to FreeBSD. If you're already familiar
|
||||||
with it, [the wiki page](https://wiki.freebsd.org/Laptops/Framework_Laptop) will probably tell you everything you need. I had no idea
|
with it, [the wiki page](https://wiki.freebsd.org/Laptops/Framework_Laptop) will
|
||||||
what I was doing so I had no idea what I was looking for! I had been beating my
|
probably tell you everything you need. I had no idea what I was doing so I had
|
||||||
head against a wall for about three hours before I decided to join `#freebsd` on
|
no idea what I was looking for! I had been beating my head against a wall for
|
||||||
[Libera.Chat](https://libera.chat/); the people there were friendly, helpful, and gave me tons of great
|
about three hours before I decided to join `#freebsd` on
|
||||||
advice. I highly recommend popping in if you have any issues!
|
[Libera.Chat](https://libera.chat/); the people there were friendly, helpful,
|
||||||
|
and gave me tons of great advice. I highly recommend popping in if you have any
|
||||||
|
issues!
|
||||||
|
|
||||||
## The Handbook {#the-handbook}
|
## The Handbook {#the-handbook}
|
||||||
|
|
||||||
Open [the handbook.](https://docs.freebsd.org/en/books/handbook/) Follow [the handbook.](https://docs.freebsd.org/en/books/handbook/) Read [the whole handbook.](https://docs.freebsd.org/en/books/handbook/) The developers
|
Open [the handbook.](https://docs.freebsd.org/en/books/handbook/) Follow [the
|
||||||
spend a _lot_ of time making sure it's the best resource available for learning
|
handbook.](https://docs.freebsd.org/en/books/handbook/) Read [the whole
|
||||||
FreeBSD. In most cases, it will have an answer for any question related to
|
handbook.](https://docs.freebsd.org/en/books/handbook/) The developers spend a
|
||||||
FreeBSD.
|
_lot_ of time making sure it's the best resource available for learning FreeBSD.
|
||||||
|
In most cases, it will have an answer for any question related to FreeBSD.
|
||||||
|
|
||||||
That said, the Framework laptop is so new that it's not fully supported by the
|
That said, the Framework laptop is so new that it's not fully supported by the
|
||||||
current stable release, so for now, we'll need to diverge a bit. This guide is
|
current stable release, so for now, we'll need to diverge a bit. This guide is
|
||||||
really only applicable until the release of FreeBSD 13.1 and until `drm-kmod` hits
|
really only applicable until the release of FreeBSD 13.1 and until `drm-kmod`
|
||||||
version 5.5+. Once those two criteria are met, following the handbook should be
|
hits version 5.5+. Once those two criteria are met, following the handbook
|
||||||
entirely sufficient!
|
should be entirely sufficient!
|
||||||
|
|
||||||
|
|
||||||
## The Source {#the-source}
|
## The Source {#the-source}
|
||||||
|
|
||||||
|
@ -36,15 +37,15 @@ In section 2.5.3 of the handbook/installer, make sure you tick the `src` box to
|
||||||
download the FreeBSD source code. It'll be necessary for building our graphics
|
download the FreeBSD source code. It'll be necessary for building our graphics
|
||||||
drivers later on.
|
drivers later on.
|
||||||
|
|
||||||
|
|
||||||
## The Graphics {#the-graphics}
|
## The Graphics {#the-graphics}
|
||||||
|
|
||||||
This is where things are less-than-ideal at the moment. _Usually_, installing
|
This is where things are less-than-ideal at the moment. _Usually_, installing
|
||||||
[graphics/drm-kmod](https://cgit.freebsd.org/ports/tree/graphics/drm-kmod) would be sufficient, but the version in both FreeBSD's package
|
[graphics/drm-kmod](https://cgit.freebsd.org/ports/tree/graphics/drm-kmod) would
|
||||||
repos and in the ports tree is too old. At the time of writing, it's compatible
|
be sufficient, but the version in both FreeBSD's package repos and in the ports
|
||||||
with Linux kernel 5.4 while the Framework's drivers are in Linux kernel 5.5+.
|
tree is too old. At the time of writing, it's compatible with Linux kernel 5.4
|
||||||
We'll need to clone the _sources_ for `graphics/drm-kmod`, check out a more recent
|
while the Framework's drivers are in Linux kernel 5.5+. We'll need to clone the
|
||||||
branch, build the drivers, and use those instead.
|
_sources_ for `graphics/drm-kmod`, check out a more recent branch, build the
|
||||||
|
drivers, and use those instead.
|
||||||
|
|
||||||
I'm not 100% certain whether the first step here is necessary but I don't feel
|
I'm not 100% certain whether the first step here is necessary but I don't feel
|
||||||
like reinstalling to check.
|
like reinstalling to check.
|
||||||
|
@ -56,27 +57,32 @@ like reinstalling to check.
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/freebsd/drm-kmod
|
git clone https://github.com/freebsd/drm-kmod
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Check out the `5.7-stable` branch with
|
4. Check out the `5.7-stable` branch with
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git checkout -b 5.7-stable --track remotes/origin/5.7-stable
|
git checkout -b 5.7-stable --track remotes/origin/5.7-stable
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Build the package with `make`
|
5. Build the package with `make`
|
||||||
6. Uninstall `drm-kmod` and all of its dependencies with `pkg remove drm-kmod`
|
6. Uninstall `drm-kmod` and all of its dependencies with `pkg remove drm-kmod`
|
||||||
followed by `pkg autoremove`
|
followed by `pkg autoremove`
|
||||||
7. Install the more up-to-date drivers with `make install`
|
7. Install the more up-to-date drivers with `make install`
|
||||||
8. Make sure the module works as expected with `kldload /boot/modules/i915kms.ko`
|
8. Make sure the module works as expected with `kldload
|
||||||
|
/boot/modules/i915kms.ko`
|
||||||
9. If you suddenly see grey in your terminal, it works! Go ahead and add it to
|
9. If you suddenly see grey in your terminal, it works! Go ahead and add it to
|
||||||
your boot config by appending the following line to `/etc/rc.conf`
|
your boot config by appending the following line to `/etc/rc.conf`
|
||||||
|
|
||||||
```text
|
```text
|
||||||
kld_load="/boot/modules/i915kms.ko"
|
kld_load="/boot/modules/i915kms.ko"
|
||||||
```
|
```
|
||||||
|
|
||||||
10. Reboot and you should be able to start Xorg as the handbook describes!
|
10. Reboot and you should be able to start Xorg as the handbook describes!
|
||||||
|
|
||||||
Again all of this information is available on [the FreeBSD wiki page for the
|
Again all of this information is available on [the FreeBSD wiki page for the
|
||||||
Framework laptop.](https://wiki.freebsd.org/Laptops/Framework_Laptop) The `Graphics` row in section 2 says _requires DRM-KMOD 5.5 or
|
Framework laptop.](https://wiki.freebsd.org/Laptops/Framework_Laptop) The
|
||||||
higher. Fails to initialize with DRM-KMOD 5.4._ That's in reference to the
|
`Graphics` row in section 2 says _requires DRM-KMOD 5.5 or higher. Fails to
|
||||||
package we just built and installed.
|
initialize with DRM-KMOD 5.4._ That's in reference to the package we just built
|
||||||
|
and installed.
|
||||||
|
|
||||||
Hope this helps!
|
Hope this helps!
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
\*\* TODO Making yourself overly available
|
||||||
|
|
||||||
|
\*\*\* References
|
||||||
|
[[https://www.nytimes.com/2021/03/05/opinion/ezra-klein-podcast-cal-newport.html?showTranscript=1][Stop. Breathe. We Can’t Keep Working Like This.]]
|
||||||
|
|
||||||
|
**\* Notes
|
||||||
|
\*\*** Get rid of information that isn't important \***\* Escalate the info that is
|
||||||
|
\*\*** Set /clear/ boundaries for when you are available \***\* Enforce those with automatic DnD rules or use timers
|
||||||
|
\*\*** With groups...
|
||||||
|
**\*** Specialisation is /good/ and should be /encouraged/
|
||||||
|
**\*** /All/ of the above points apply with coworkers as well
|
||||||
|
|
||||||
|
\*\*\* TODO Pong Jake when finished
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: "Stop using gmail"
|
||||||
|
date: 2023-01-27T13:04:33-05:00
|
||||||
|
draft: true
|
||||||
|
---
|
|
@ -0,0 +1,251 @@
|
||||||
|
---
|
||||||
|
title: 'Catchy title about Supernote being "the new paper"'
|
||||||
|
author: ["Amolith"]
|
||||||
|
lastmod: 2023-01-27T13:00:37-05:00
|
||||||
|
tags: ["Supernote", "Writing", "Productivity", "Organisation"]
|
||||||
|
categories: ["Technology"]
|
||||||
|
draft: true
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
I like writing things down. I like the feel of the pen (preferably a fountain
|
||||||
|
pen) gliding smoothly over the paper, that nice solid feeling of the tip against
|
||||||
|
the table, seeing the ink dry as it flows from the nib, accidentally swiping my
|
||||||
|
hand through it before it's finished and smearing a bit of ink across the page,
|
||||||
|
then cursing under my breath as I dab it up with a handkerchief or a napkin or
|
||||||
|
something else nearby. I also love that writing things by hand [has an impact on
|
||||||
|
memory and improves
|
||||||
|
retention.](https://journals.sagepub.com/doi/abs/10.1177/0956797614524581)
|
||||||
|
|
||||||
|
## The problem {#the-problem}
|
||||||
|
|
||||||
|
Unfortunately, I don't love keeping up with that paper. Across many different
|
||||||
|
classes, even with dedicated folders for each one, something important
|
||||||
|
inevitably gets lost. Notebooks are also bulky and can take up a lot of space. I
|
||||||
|
tried [bullet journalling](https://bulletjournal.com/) for about a month earlier
|
||||||
|
this year and, while the process was enjoyable, the maintenance was not. My
|
||||||
|
brain moves faster than my pen (even though I have terrible handwriting) and I
|
||||||
|
inevitably forget letters or even whole words. This is a problem while writing
|
||||||
|
in pen because white-out looks ugly and I dislike wasting whole pages because of
|
||||||
|
a couple mistakes.
|
||||||
|
|
||||||
|
The obvious solution here is to get an iPad with an Apple Pen, right? Right??
|
||||||
|
|
||||||
|
Wrong because Apple bad.[^fn:1]
|
||||||
|
|
||||||
|
## The solution {#the-solution}
|
||||||
|
|
||||||
|
Enter the world of ... what are they even called? E-ink notebooks? Paper
|
||||||
|
tablets? E-R/W?[^fn:2] Do they even have a "device category" yet? I don't know,
|
||||||
|
but they solve my problem in a wonderful way.
|
||||||
|
|
||||||
|
As the names suggest, these are devices that can _usually_ open and read e-books
|
||||||
|
(EPUBs, PDFs, etc.), annotate them, and create standalone pages of notes as if
|
||||||
|
they were full notebooks. The most well-known of these devices is likely the
|
||||||
|
[reMarkable.](https://remarkable.com/) They had a [hugely successful
|
||||||
|
crowdfunding
|
||||||
|
campaign](https://venturebeat.com/2019/10/08/remarkable-raises-15-million-to-bring-its-e-paper-tablets-to-more-scribblers/)
|
||||||
|
and produced the reMarkable 1, followed by [the reMarkable 2 in 2020.](https://blog.remarkable.com/remarkable-2-the-next-generation-paper-tablet-91b47d0080cb)
|
||||||
|
There are a few devices like these by now but we'll look at the reMarkable
|
||||||
|
first.
|
||||||
|
|
||||||
|
## The reMarkable {#the-remarkable}
|
||||||
|
|
||||||
|
This device boasts all of the features I was looking for. It renders digital
|
||||||
|
content, from books and manuals to comics and manga, allows you to mark those
|
||||||
|
documents up as you would if they were physical media, create full notebooks of
|
||||||
|
hand written text, organise them, search, and, if your handwriting is legible
|
||||||
|
enough (mine certainly is not), perform OCR on your notes and email a
|
||||||
|
transcription to yourself. It even runs Linux and the developers have opened SSH
|
||||||
|
up so you can remote in and tinker with it as much as you like. Because of this,
|
||||||
|
there's a pretty awesome [community of people creating third-party tools and
|
||||||
|
integrations](https://github.com/reHackable/awesome-reMarkable) that add even
|
||||||
|
further functionality. My favourite is probably
|
||||||
|
[rMview,](https://github.com/bordaigorl/rmview) a really fast VNC client for the
|
||||||
|
reMarkable that allows you to view your device's screen on any computer.
|
||||||
|
|
||||||
|
After watching all of [MyDeepGuide's](https://www.youtube.com/c/MyDeepGuide)
|
||||||
|
[extensive playlist on the
|
||||||
|
reMarkable,](https://www.youtube.com/playlist?list=PLsSI9-gaSSmiXwb7Vjk5Vb-nB41UTnrXd)
|
||||||
|
however, I decided to go with a different product.
|
||||||
|
|
||||||
|
## Enter the Supernote A5X {#enter-the-supernote-a5x}
|
||||||
|
|
||||||
|
The [Supernote A5X](https://www.supernote.com/#/product?type=SN-A5-X) has all of
|
||||||
|
the basic features the reMarkable has: reading documents, writing notes, and
|
||||||
|
organising your content. Its implementation, on the other hand, seems to be much
|
||||||
|
more polished. It also lacks some features from the reMarkable while adding
|
||||||
|
others.
|
||||||
|
|
||||||
|
## Operating System {#operating-system}
|
||||||
|
|
||||||
|
While the reMarkable runs Codex,[^fn:3] a _"custom Linux-based OS optimised for
|
||||||
|
low-latency e-paper"_, the Supernote just runs Android. There are both benefits
|
||||||
|
and detriments to this; on one hand, they're running all of Android, bloated
|
||||||
|
that it is, on a very lightweight tablet. On the other, they don't have to
|
||||||
|
develop and maintain a custom operating system. This allows them to focus on
|
||||||
|
other aspects that are arguably more important so I don't actually mind that it
|
||||||
|
runs Android.
|
||||||
|
|
||||||
|
The only place that Android stands out is in system operations; file transfer
|
||||||
|
uses MTP and, when you swipe down from the top of the device, a small bar
|
||||||
|
appears similar to what was in early Android. This lets you change WiFi
|
||||||
|
networks, sync with the Supernote Cloud, take a screenshot, search, and access
|
||||||
|
the system settings. Nothing else about the device really screams Android to me.
|
||||||
|
|
||||||
|
## Community {#community}
|
||||||
|
|
||||||
|
I don't usually browse Reddit but [the Supernote
|
||||||
|
community](https://old.reddit.com/r/Supernote/) there is fascinating. I haven't
|
||||||
|
looked around enough to know exactly what his relationship is with the company,
|
||||||
|
but one of the members, [u/hex2asc,](https://old.reddit.com/user/hex2asc) seems
|
||||||
|
to represent Supernote in something of an official capacity. He's incredibly
|
||||||
|
active and usually responds to posts and questions within a day or two.
|
||||||
|
|
||||||
|
Before I purchased a Supernote, [I wrote a
|
||||||
|
post](https://old.reddit.com/r/Supernote/comments/lhffyd/sync_targets_open_document_formats_and_crossnote/)
|
||||||
|
asking about a couple of things that concerned me: sync targets, open document
|
||||||
|
formats, and cross-note links. I don't really plan to write full documents on
|
||||||
|
the device but having the option to do so would still be nice. The other
|
||||||
|
features are absolutely killer for me as I would like to maintain a Zettelkasten
|
||||||
|
(I wrote about [using Vim to do so](/vim-as-a-markdown-editor/) last year but
|
||||||
|
didn't end up sticking with it) and manage document synchronisation with my own
|
||||||
|
Nextcloud server. The community was quick to respond and confirm that
|
||||||
|
Zettelkasten functionality would be implemented soon™. u/hex2asc responded _the
|
||||||
|
day after_ and said that WebDAV would be supported but not earlier than May
|
||||||
|
(September update: it's still not supported), ODF would likely not be supported,
|
||||||
|
and cross-note links were definitely a possibility. Another community member has
|
||||||
|
been avidly following the subreddit and even put together an [unofficial
|
||||||
|
roadmap.](https://app-rm.roadmunk.com/publish/03e6dca3d769e2b7015f7f48a649cb3f75f44d9e)
|
||||||
|
|
||||||
|
## Interfaces {#interfaces}
|
||||||
|
|
||||||
|
### Home & Organisation {#home-and-organisation}
|
||||||
|
|
||||||
|
#### <span class="org-todo todo TODO">TODO</span> Record very short video about home/organisation {#record-very-short-video-about-home-organisation}
|
||||||
|
|
||||||
|
### Settings {#settings}
|
||||||
|
|
||||||
|
#### <span class="org-todo todo TODO">TODO</span> Record very short video about settings {#record-very-short-video-about-settings}
|
||||||
|
|
||||||
|
### Writing & Annotating {#writing-and-annotating}
|
||||||
|
|
||||||
|
The following images are screenshots of the full page above with the possible UI
|
||||||
|
variations while reading a book. This first one is default, with the editing bar
|
||||||
|
at the top. It is exactly the same as what's displayed on the blank pages for
|
||||||
|
hand writing full notes. From left to right is the Table of Contents toggle, the
|
||||||
|
pen tools (fineliner, "fountain" pen,[^fn:4] and highlighter), the erasers,
|
||||||
|
lasso select tool, undo/redo, context menu, palm rejection toggle, previous
|
||||||
|
page, goto page, next page, and exit.
|
||||||
|
|
||||||
|
{{< figure
|
||||||
|
src="~/repos/sites/secluded/static/assets/pngs/supernote-reader-default.png" >}}
|
||||||
|
|
||||||
|
You can hold your finger on that bar and drag it down to detach it from the top.
|
||||||
|
The default width exposes all the tools without whitespace. You can move it
|
||||||
|
around the screen by dragging the circle with a straight line through the middle
|
||||||
|
on the far left.
|
||||||
|
|
||||||
|
{{< figure
|
||||||
|
src="~/repos/sites/secluded/static/assets/pngs/supernote-reader-medium.png" >}}
|
||||||
|
|
||||||
|
If you tap that circle, the width shrinks and everything except the pens,
|
||||||
|
erasers, and undo/redo buttons are hidden. It can be dragged the same was as in
|
||||||
|
the previous image and tapping that circle will expand the bar again.
|
||||||
|
|
||||||
|
{{< figure
|
||||||
|
src="~/repos/sites/secluded/static/assets/pngs/supernote-reader-small.png" >}}
|
||||||
|
|
||||||
|
The last mode is with the bar completely hidden. You achieve this just by
|
||||||
|
dragging it to the right edge of the screen. Once hidden, you can swipe right to
|
||||||
|
left from the edge and it will be revealed flush with the right edge.
|
||||||
|
|
||||||
|
{{< figure
|
||||||
|
src="~/repos/sites/secluded/static/assets/pngs/supernote-reader-minimal.png" >}}
|
||||||
|
|
||||||
|
## Experience {#experience}
|
||||||
|
|
||||||
|
### Reading content {#reading-content}
|
||||||
|
|
||||||
|
I love e-ink. I think it looks beautiful and would love to have an e-ink
|
||||||
|
monitor.[^fn:5] That said, the Supernote has an especially nice display with 226
|
||||||
|
PPI (pixels per inch). The image below was taken with my phone's camera so it's
|
||||||
|
not very good. However, if you zoom in a bit, you can see that the curved edges
|
||||||
|
of some letters are _slightly_ pixellated. Viewing with my naked eye at a
|
||||||
|
comfortable distance, it does look better _to me_ than some of my print books,
|
||||||
|
however.
|
||||||
|
|
||||||
|
{{< figure
|
||||||
|
src="~/repos/sites/secluded/static/assets/pngs/supernote-resolution.png" >}}
|
||||||
|
|
||||||
|
_At the moment,_ I am pretty disappointed with Table of Contents detection for
|
||||||
|
ePUBs. A great many of my books seem to use a legacy ToC format that the
|
||||||
|
Supernote sees and tries/fails to read before attempting to read the more
|
||||||
|
up-to-date one. This is easily remedied by editing the ePUB in
|
||||||
|
[Calibre,](https://calibre-ebook.com/) going to Tools → Upgrade Book Internals →
|
||||||
|
Remove the legacy Table of Contents in NCX format. You might need to make a
|
||||||
|
small change to one of the HTML files and revert it before the save button is
|
||||||
|
enabled. After that, just copy it back over to the Supernote and everything
|
||||||
|
should work properly.
|
||||||
|
|
||||||
|
### Writing notes {#writing-notes}
|
||||||
|
|
||||||
|
I write notes as often if not _more_ often than I read and annotate books. It's
|
||||||
|
the main reason I purchased the device and I love the experience. The Supernote
|
||||||
|
doesn't _really_ feel like paper despite what their marketing materials claim,
|
||||||
|
though it doesn't feel _bad_ either. It's hard to describe but I would say it's
|
||||||
|
something like writing with a rollerball pen on high-quality paper with a marble
|
||||||
|
counter underneath: incredibly smooth with but a little bit of texture so it
|
||||||
|
doesn't feel like writing on a glass display.
|
||||||
|
|
||||||
|
While writing latency[^fn:6] is noticeable, I really don't have a huge issue
|
||||||
|
with it. I write very quickly but find that the slight latency actually makes
|
||||||
|
writing _more_ enjoyable. It sounds weird and I'm not sure why, but I _really_
|
||||||
|
like writing on the Supernote; it's wonderfully smooth, pressure-sensitive, the
|
||||||
|
latency makes things interesting, and [the Heart of Metal
|
||||||
|
pen](https://supernote.com/#/part?id=SP-04) feels good in my hand.
|
||||||
|
|
||||||
|
### Surfacing Content {#surfacing-content}
|
||||||
|
|
||||||
|
While organisation is done using a regular filesystem hierarchy, the Supernote
|
||||||
|
does have other ways to search for and surface your notes. As you're writing,
|
||||||
|
you can use the lasso select tool and encircle a word. A little dialogue pops up
|
||||||
|
and gives you a few buttons for things you can do with that selection: copy,
|
||||||
|
move to another page, cut, add it to the Table of Contents, or mark it as a key
|
||||||
|
word. If you select the key word icon, the Supernote does some incredible
|
||||||
|
OCR[^fn:7] on it and displays a dialogue where you can add it to the note file
|
||||||
|
as a tag. This dialogue allows you to edit the word before adding it just in
|
||||||
|
case the OCR was wonky. Even with my terrible handwriting, I've found that it
|
||||||
|
works very well and I rarely have to make edits.
|
||||||
|
|
||||||
|
## <span class="org-todo todo TODO">TODO</span> Ping Isi and Volpeon when finished {#ping-isi-and-volpeon-when-finished}
|
||||||
|
|
||||||
|
[^fn:1]:
|
||||||
|
I dislike Apple's operating system, their hardware, business model, privacy
|
||||||
|
practises, and much of what they stand for as a company. Don't @ me.
|
||||||
|
|
||||||
|
[^fn:2]:
|
||||||
|
E-R/W is a play on media commonly being labelled as R/W when you can read
|
||||||
|
from it and write to it.
|
||||||
|
|
||||||
|
[^fn:3]:
|
||||||
|
Taken from their [support page about the reMarkable
|
||||||
|
2;](https://support.remarkable.com/hc/en-us/articles/360006699537-About-reMarkable-2-)
|
||||||
|
search the page for _operating system_ and it should show up.
|
||||||
|
|
||||||
|
[^fn:4]:
|
||||||
|
It's not really a fountain pen even though that's what they call it; it's
|
||||||
|
just pressure-sensitive.
|
||||||
|
|
||||||
|
[^fn:5]:
|
||||||
|
There does seem to be a group of people interested in just such a thing:
|
||||||
|
_[Challenges Building an Open-Source E Ink
|
||||||
|
Laptop](https://alexsoto.dev/challenges-building-an-open-source-eink-laptop.html)_
|
||||||
|
|
||||||
|
[^fn:6]:
|
||||||
|
In this situation, latency refers to how long it takes for "ink" to show up
|
||||||
|
on the "page" after writing something.
|
||||||
|
|
||||||
|
[^fn:7]:
|
||||||
|
_Optical Character Recognition_: the program looks at your handwriting and
|
||||||
|
tries to turn it into text.
|
Loading…
Reference in New Issue