`tkinter.messagebox`

module shows Windows native dialogs (win/tkWinDialog.c#L2950), and it shows Mac OS native dialogs (macosx/tkMacOSXDialog.c#L1399), but since Linux doesn't However, Python does *not* currently have any non-ugly "ttk" bindings for this (Lib/tkinter/messagebox.py#L61).

```
set /p="Install this extension, then press Enter: https://microsoftedge.microsoft.com/addons/detail/gamjhjfeblghkihfjdpmbpajhlpmobbp"
set /p="Download this file, then press Enter: https://res-dod.cdn.office.net/owasmime/20.21.804.1/SmimeOutlookWebChrome.msi?v=4.0800"
msiexec /a %USERPROFILE%\Downloads\SmimeOutlookWebChrome.msi /qb TARGETDIR="%LOCALAPPDATA%\Microsoft\Edge"
REG ADD HKCU\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\com.microsoft.outlook.smime.chromenativeapp /ve /d "%LOCALAPPDATA%\Microsoft\Edge\SmimeOutlookWebChrome\native-app-host-manifest.json"
set /p="Restart Edge, then press Enter."
```

]]>The tldr is:

- Pip 23.3 or newer "just works" after you add a simple snippet to your config file.
`; %AppData%\pip\pip.ini ; "${XDG_HOME-$HOME/.config}/pip/pip.ini" [global] use-feature = truststore`

**However**, said snippet will break older versions of pip.- In particular,
`pip < 23.3, >= 22.2`

will break, complaining that you need to install the "truststore" package before you can install*any*packages—a perfect "catch 22".

- In particular,
- As of the last time I checked (CPython 3.12.1), ensurepip, which is what's used to bootstrap virtual environments) installs one of these broken versions of pip.
- If you create your venvs with PyPA's "virtualenv" (specifically
`virtualenv >= 20.24.6`

) rather than venv, you will get a version of pip that works.- If you're using PyPA's "build" tool, it will automatically switch to using virtualenv if available, which means your "isolated" builds will work behind a corporate firewall.

- If you create your venvs with PyPA's "virtualenv" (specifically

```
REM on Windows
pip install -v "readme-renderer < 42.0" & REM https://github.com/pypa/twine/issues/1015
pip install twine
```

```
# on Mac and Linux
pip install -v "readme-renderer < 42.0" # https://github.com/pypa/twine/issues/1015
pip install twine
```

This won't pollute your registry or any other folders than the current one with an installation of rust or rustc or cargo or the rust updater or the rust updater installer or whatever other weird litter the kids are advocating for your system these days

*Alternatively*, if you really need some feature of `readme-renderer >= 42.0`

, here's a less simple workaround that provides all the same guarantees as the previous one:

```
REM on Windows
REM https://github.com/pypa/twine/issues/1015
REM https://github.com/pypa/readme_renderer/blob/42.0/pyproject.toml#L10
REM https://github.com/messense/nh3/blob/v0.2.15/.github/workflows/CI.yml#L58
REM https://github.com/rust-lang/rust-forge/issues/225
REM https://github.com/rust-lang/rust/issues/116028
REM https://github.com/rust-lang/cargo/issues/1734
set /p="Download TGZ from https://forge.rust-lang.org/infra/other-installation-methods.html#standalone-installers then press Enter"
msiexec /a "%USERPROFILE%\Downloads\rust-1.75.0-x86_64-pc-windows-msvc.msi" /qb TARGETDIR="%cd%"
cmd /C set ^"PATH=%cd%\Rust\bin;%PATH%^" ^& set ^"CARGO_TARGET_DIR=%cd%\Rust\.cargo^" ^& python -m pip install -v twine
```

```
# on Linux
# https://github.com/pypa/twine/issues/1015
# https://github.com/pypa/readme_renderer/blob/42.0/pyproject.toml#L10
# https://github.com/messense/nh3/blob/v0.2.15/.github/workflows/CI.yml#L58
# https://github.com/rust-lang/rust-forge/issues/225
# https://github.com/rust-lang/rust/issues/116028
# https://github.com/rust-lang/cargo/issues/1734
read -p "Download MSI from https://forge.rust-lang.org/infra/other-installation-methods.html#standalone-installers then press Enter"
tar x -zf "$HOME/Downloads/rust-1.75.0-x86_64-unknown-linux-gnu.tar.gz"
PATH="$PWD/rust-1.75.0-x86_64-unknown-linux-gnu/rustc/bin:$PWD/rust-1.75.0-x86_64-unknown-linux-gnu/cargo/bin:$PATH" python -m pip install -v twine
```

]]>After merely scooping a libdvdcss RPM from this cool guy's repository (the CentOS 8 RPM installed without issue on Rocky Linux 9), VLC instantly gained the ability to play DVDs. I could not find any other obvious source of the library for this operating system.

]]>On investigation, it was using the "llvmpipe" Mesa backend, because it lacked ati_drv.so (from “xf86-video-ati”,) for the AMD Radeon HD 7570M GPU; backporting[?] that package from Rocky Linux 8 then rebooting left Steam not finding r600_dri.so (though it seems to have fixed hardware acceleration for Firefox/etc.); scooping up that library from the Rocky Linux Stream 8 RPM (had to transplant it since the RPM had dependency issues; had to transplant it to /usr because Steam wouldn't find it at /usr/local; Steam complained *both* about the absence of the 32-bit and 64-bit versions; so I got them both) for some reason still left Steam kinda non-functional.

Previously on: struggles with RHEL 9 on this laptop…

]]>Addition works, and multiplication works. **But** subtraction is broken, because there isn't any natural number equal to $2-3$.

We might think about fixing subtraction, and *one* way of doing this is by moving to the integers, which allows negative numbers: $\mathbb{Z}=\left\{\dots, -2, -1, 0, 1, 2, \dots\right\}$.

But that still leaves division broken—there isn't any integer equal to $3 \div 4$!

One path forward is to move over to the rational numbers: $\mathbb{Q}=\text{“Proper Fractions”}$. This fixes division and subtraction at the same time. But… this path forward locks us into an infinitely large set. Sometimes (especially in cryptography) it's useful to have a smaller set of numbers that you can actually do ALL the math on.

The official word for “a set of numbers you can do all the math on” is a field. For example, $\mathbb{Q}$ is a field. But (obviously) there are infinitely many fractions, so it's an infinite field. Today you're going to learn about **finite** fields—which are exactly what they say on the tin. They're sometimes called “Galois fields” (gal'waah fields). They're used in almost all cryptographic algorithms. (They probably have other uses, too. [TODO look this up])

However, building these is a bit complicated. I'll need to explain 3 ideas first.

One popular starting block for thinking about smaller universes of numbers is **modular arithmetic**. It starts out just like the natural numbers, but when you're about to reach the limit—the “modulus”—the numbers loop back around to 0. Also, if you try to go back below 0, you get sent up to the highest number. This gives you a miniature “toy version” of the integers that you can do math on without having to worry about looking infinity in the eye! (The way that galaxy-brained mathematicians think of this is “the quotient set of the integers, using the remainder of division by the modulus as the equivalence operator”—but you *absolutely don't* need to learn about that to get a basic understanding of how modular arithmetic works.)

Now, no matter what modulus you pick (as long as it's an integer $\ge 2$), addition works great, and multiplication at least kinda works. (Subtraction works perfectly, too; but I'll leave that as an exercise for the reader, since it doesn't matter for what we're doing today.)

For example, here's **the integers modulo 8**, which I'll write as $\textcolor{indigo}{\mathbb{Z}_8}$ (colored indigo so you can tell the modular integers from this “miniature universe” apart from regular integers):

**Addition in $\textcolor{indigo}{\mathbb{Z}_8}$**

$$\begin{array} {r|r|} + & \textcolor{indigo}{0} & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} \\ \hline \textcolor{indigo}{0} & \textcolor{indigo}{0} & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} \\ \hline \textcolor{indigo}{1} & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} & \textcolor{indigo}{0} \\ \hline \textcolor{indigo}{2} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} & \textcolor{indigo}{0} & \textcolor{indigo}{1} \\ \hline \textcolor{indigo}{3} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} & \textcolor{indigo}{0} & \textcolor{indigo}{1} & \textcolor{indigo}{2} \\ \hline \textcolor{indigo}{4} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} & \textcolor{indigo}{0} & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} \\ \hline \textcolor{indigo}{5} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} & \textcolor{indigo}{0} & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} \\ \hline \textcolor{indigo}{6} & \textcolor{indigo}{6} & \textcolor{indigo}{7} & \textcolor{indigo}{0} & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} \\ \hline \textcolor{indigo}{7} & \textcolor{indigo}{7} & \textcolor{indigo}{0} & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} \\ \hline \end{array}$$

Notice that (for example) $\textcolor{indigo}{6} + \textcolor{indigo}{2} = \textcolor{indigo}{0}$, because $6 + 2 = 8$, which wraps back around to $8-8 = \textcolor{indigo}{0}$!

**Multiplication in $\textcolor{indigo}{\mathbb{Z}_8}$**

$$\begin{array} {r|r|} \times & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} \\ \hline \textcolor{indigo}{1} & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} \\ \hline \textcolor{indigo}{2} & \textcolor{indigo}{2} & \textcolor{indigo}{4} & \textcolor{indigo}{6} & \textcolor{indigo}{0} & \textcolor{indigo}{2} & \textcolor{indigo}{4} & \textcolor{indigo}{6} \\ \hline \textcolor{indigo}{3} & \textcolor{indigo}{3} & \textcolor{indigo}{6} & \textcolor{indigo}{1} & \textcolor{indigo}{4} & \textcolor{indigo}{7} & \textcolor{indigo}{2} & \textcolor{indigo}{5} \\ \hline \textcolor{indigo}{4} & \textcolor{indigo}{4} & \textcolor{indigo}{0} & \textcolor{indigo}{4} & \textcolor{indigo}{0} & \textcolor{indigo}{4} & \textcolor{indigo}{0} & \textcolor{indigo}{4} \\ \hline \textcolor{indigo}{5} & \textcolor{indigo}{5} & \textcolor{indigo}{2} & \textcolor{indigo}{7} & \textcolor{indigo}{4} & \textcolor{indigo}{1} & \textcolor{indigo}{6} & \textcolor{indigo}{3} \\ \hline \textcolor{indigo}{6} & \textcolor{indigo}{6} & \textcolor{indigo}{4} & \textcolor{indigo}{2} & \textcolor{indigo}{0} & \textcolor{indigo}{6} & \textcolor{indigo}{4} & \textcolor{indigo}{2} \\ \hline \textcolor{indigo}{7} & \textcolor{indigo}{7} & \textcolor{indigo}{6} & \textcolor{indigo}{5} & \textcolor{indigo}{4} & \textcolor{indigo}{3} & \textcolor{indigo}{2} & \textcolor{indigo}{1} \\ \hline \end{array}$$

Again using the “wrap-around arithmetic”, notice that $\textcolor{indigo}{3} \times \textcolor{indigo}{5} = \textcolor{indigo}{7}$, because $3 \times 5 = 15$, which wraps back around to $15-8 = \textcolor{indigo}{7}$.

However, if you look carefully, you'll also see that $\textcolor{indigo}{4} \times \textcolor{indigo}{6} = \textcolor{indigo}{0}$—that is, two things, neither of which is $\textcolor{indigo}{0}$, multiply to produce $\textcolor{indigo}{0}$! This is technically "allowed", but is very cringe because it flies in the face of common sense, which dictates “If a×b is zero, then either a or b must have been zero!”

In fact, this violation of common sense is *so* cringe that Nature's God will punish you for it by punching a bunch of holes in your division tables (which ruins them):

**"Division" in $\textcolor{indigo}{\mathbb{Z}_8}$**

$$\begin{array} {r|r|} \div & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} \\ \hline \textcolor{indigo}{1} & \textcolor{indigo}{1} & \textcolor{indigo}{2} & \textcolor{indigo}{3} & \textcolor{indigo}{4} & \textcolor{indigo}{5} & \textcolor{indigo}{6} & \textcolor{indigo}{7} \\ \hline \textcolor{indigo}{2} & & \textcolor{indigo}{1} & & \textcolor{indigo}{2} & & \textcolor{indigo}{3} & \\ \hline \textcolor{indigo}{3} & \textcolor{indigo}{3} & \textcolor{indigo}{6} & \textcolor{indigo}{1} & \textcolor{indigo}{4} & \textcolor{indigo}{7} & \textcolor{indigo}{2} & \textcolor{indigo}{5} \\ \hline \textcolor{indigo}{4} & & & & \textcolor{indigo}{1} & & & \\ \hline \textcolor{indigo}{5} & \textcolor{indigo}{5} & \textcolor{indigo}{2} & \textcolor{indigo}{7} & \textcolor{indigo}{4} & \textcolor{indigo}{1} & \textcolor{indigo}{6} & \textcolor{indigo}{3} \\ \hline \textcolor{indigo}{6} & & \textcolor{indigo}{3} & & \textcolor{indigo}{6} & & \textcolor{indigo}{1} & \\ \hline \textcolor{indigo}{7} & \textcolor{indigo}{7} & \textcolor{indigo}{6} & \textcolor{indigo}{5} & \textcolor{indigo}{4} & \textcolor{indigo}{3} & \textcolor{indigo}{2} & \textcolor{indigo}{1} \\ \hline \end{array}$$

Joking aside, the technical reason the division table is ruined is that $\textcolor{indigo}{2}$, $\textcolor{indigo}{4}$, and $\textcolor{indigo}{6}$ don't have any multiplicative inverse in $\textcolor{indigo}{\mathbb{Z}_8}$—that is, there *isn't any* solution to “$\textcolor{indigo}{2} \times \textcolor{indigo}{\text{?}} = \textcolor{indigo}{1}$”*. Because of that, we say that division *just isn't defined* on $\textcolor{indigo}{\mathbb{Z}_8}$.

(*Yes, you guessed right: “$\textcolor{indigo}{4} \times \textcolor{indigo}{\text{?}} = \textcolor{indigo}{1}$” and “$\textcolor{indigo}{6} \times \textcolor{indigo}{\text{?}} = \textcolor{indigo}{1}$” *also* have no solution. You can double-check this yourself by looking back at the multiplication table and noticing there isn't any $\textcolor{indigo}{1}$ to be found in the $\textcolor{indigo}{2}$, $\textcolor{indigo}{4}$, or $\textcolor{indigo}{6}$ columns!)

Now, you might ask: can this be fixed? The answer: yes, but it's hard. (But that's what we're here today to do!)

The easy solution is just to give up and instead use a prime number (like 2; 7; or 6,277,101,735,386,680,763,835,789,423,207,666,416,083,908,700,390,324,961,279) as your modulus. Then, multiplication and division will just work right away, without any problem.

The hard solution requires two more ideas before we can start to explain it… actually, the first of these ideas *is* the easy solution, so let's look into that!

What if we tried to make a modular arithmetic table with $7$ (which is prime) as the modulus, rather than 8?

Well, I already spoiled it earlier: all the math—including division—will just work. (But let's look at the example anyway!)

**Addition in $\textcolor{teal}{\mathbb{F}_7}$**

$$\begin{array} {r|r|} + & \textcolor{teal}{0} & \textcolor{teal}{1} & \textcolor{teal}{2} & \textcolor{teal}{3} & \textcolor{teal}{4} & \textcolor{teal}{5} & \textcolor{teal}{6} \\ \hline \textcolor{teal}{0} & \textcolor{teal}{0} & \textcolor{teal}{1} & \textcolor{teal}{2} & \textcolor{teal}{3} & \textcolor{teal}{4} & \textcolor{teal}{5} & \textcolor{teal}{6} \\ \hline \textcolor{teal}{1} & \textcolor{teal}{1} & \textcolor{teal}{2} & \textcolor{teal}{3} & \textcolor{teal}{4} & \textcolor{teal}{5} & \textcolor{teal}{6} & \textcolor{teal}{0} \\ \hline \textcolor{teal}{2} & \textcolor{teal}{2} & \textcolor{teal}{3} & \textcolor{teal}{4} & \textcolor{teal}{5} & \textcolor{teal}{6} & \textcolor{teal}{0} & \textcolor{teal}{1} \\ \hline \textcolor{teal}{3} & \textcolor{teal}{3} & \textcolor{teal}{4} & \textcolor{teal}{5} & \textcolor{teal}{6} & \textcolor{teal}{0} & \textcolor{teal}{1} & \textcolor{teal}{2} \\ \hline \textcolor{teal}{4} & \textcolor{teal}{4} & \textcolor{teal}{5} & \textcolor{teal}{6} & \textcolor{teal}{0} & \textcolor{teal}{1} & \textcolor{teal}{2} & \textcolor{teal}{3} \\ \hline \textcolor{teal}{5} & \textcolor{teal}{5} & \textcolor{teal}{6} & \textcolor{teal}{0} & \textcolor{teal}{1} & \textcolor{teal}{2} & \textcolor{teal}{3} & \textcolor{teal}{4} \\ \hline \textcolor{teal}{6} & \textcolor{teal}{6} & \textcolor{teal}{0} & \textcolor{teal}{1} & \textcolor{teal}{2} & \textcolor{teal}{3} & \textcolor{teal}{4} & \textcolor{teal}{5} \\ \hline \end{array}$$

(As you probably expected, nothing to see here; addition never had any problems. Moving along…)

**Multiplication in $\textcolor{teal}{\mathbb{F}_7}$**

$$\begin{array} {r|r|} \times & \textcolor{teal}{1} & \textcolor{teal}{2} & \textcolor{teal}{3} & \textcolor{teal}{4} & \textcolor{teal}{5} & \textcolor{teal}{6} \\ \hline \textcolor{teal}{1} & \textcolor{teal}{1} & \textcolor{teal}{2} & \textcolor{teal}{3} & \textcolor{teal}{4} & \textcolor{teal}{5} & \textcolor{teal}{6} \\ \hline \textcolor{teal}{2} & \textcolor{teal}{2} & \textcolor{teal}{4} & \textcolor{teal}{6} & \textcolor{teal}{1} & \textcolor{teal}{3} & \textcolor{teal}{5} \\ \hline \textcolor{teal}{3} & \textcolor{teal}{3} & \textcolor{teal}{6} & \textcolor{teal}{2} & \textcolor{teal}{5} & \textcolor{teal}{1} & \textcolor{teal}{4} \\ \hline \textcolor{teal}{4} & \textcolor{teal}{4} & \textcolor{teal}{1} & \textcolor{teal}{5} & \textcolor{teal}{2} & \textcolor{teal}{6} & \textcolor{teal}{3} \\ \hline \textcolor{teal}{5} & \textcolor{teal}{5} & \textcolor{teal}{3} & \textcolor{teal}{1} & \textcolor{teal}{6} & \textcolor{teal}{4} & \textcolor{teal}{2} \\ \hline \textcolor{teal}{6} & \textcolor{teal}{6} & \textcolor{teal}{5} & \textcolor{teal}{4} & \textcolor{teal}{3} & \textcolor{teal}{2} & \textcolor{teal}{1} \\ \hline \end{array}$$

Without putting your finger on it, doesn't that table look… prettier? Tidier? Neater?

OK, now put your finger on it: notice that each column and each row includes each (non-$\textcolor{teal}{0}$) element exactly once! That means that you can turn any (non-$\textcolor{teal}{0}$) element into any other element, just by a single multiplication! And you'll never *accidentally* get $\textcolor{teal}{0}$; the only way to reach it by multiplication is by multiplying by $\textcolor{teal}{0}$ *on purpose*. Of course, this means…

**Division in $\textcolor{teal}{\mathbb{F}_7}$**

$$\begin{array} {r|r|} \div & \textcolor{teal}{1} & \textcolor{teal}{2} & \textcolor{teal}{3} & \textcolor{teal}{4} & \textcolor{teal}{5} & \textcolor{teal}{6} \\ \hline \textcolor{teal}{1} & \textcolor{teal}{1} & \textcolor{teal}{2} & \textcolor{teal}{3} & \textcolor{teal}{4} & \textcolor{teal}{5} & \textcolor{teal}{6} \\ \hline \textcolor{teal}{2} & \textcolor{teal}{4} & \textcolor{teal}{1} & \textcolor{teal}{5} & \textcolor{teal}{2} & \textcolor{teal}{6} & \textcolor{teal}{3} \\ \hline \textcolor{teal}{3} & \textcolor{teal}{5} & \textcolor{teal}{3} & \textcolor{teal}{1} & \textcolor{teal}{6} & \textcolor{teal}{4} & \textcolor{teal}{2} \\ \hline \textcolor{teal}{4} & \textcolor{teal}{2} & \textcolor{teal}{4} & \textcolor{teal}{6} & \textcolor{teal}{1} & \textcolor{teal}{3} & \textcolor{teal}{5} \\ \hline \textcolor{teal}{5} & \textcolor{teal}{3} & \textcolor{teal}{6} & \textcolor{teal}{2} & \textcolor{teal}{5} & \textcolor{teal}{1} & \textcolor{teal}{4} \\ \hline \textcolor{teal}{6} & \textcolor{teal}{6} & \textcolor{teal}{5} & \textcolor{teal}{4} & \textcolor{teal}{3} & \textcolor{teal}{2} & \textcolor{teal}{1} \\ \hline \end{array}$$

…our division table doesn't have any holes in it—division actually works now!

All this to say that, if (and only if) $p$ is prime, then $\mathbb{Z}_p$ (the integers modulo $p$) is just exactly the same thing as $\mathbb{F}_p$ (the finite field with $p$ elements). Now you know about finite fields with a prime number of elements!

But there are some finite fields with a non-prime number of elements, and we occasionally need those, so let's keep learning until we find out how they work…

Now, the mathematicians call a group of numbers that has addition, subtraction, and multiplication that at least kinda works a ring. (Rings don't care whether division works. As you might have guessed, $\textcolor{indigo}{\mathbb{Z}_8}$ from earlier is a ring.)

Actually, the elements of the ring don't even have to be numbers. They can be any object. Let's create a ring right now with a ridiculous object in it!

We'll start out with $\textcolor{olive}{\mathbb{F}_3}$ (which is a field, admittedly)—

**Addition in $\textcolor{olive}{\mathbb{F}_3}$**

$$\begin{array} {r|r|} + & \textcolor{olive}{0} & \textcolor{olive}{1} & \textcolor{olive}{2} \\ \hline \textcolor{olive}{0} & \textcolor{olive}{0} & \textcolor{olive}{1} & \textcolor{olive}{2} \\ \hline \textcolor{olive}{1} & \textcolor{olive}{1} & \textcolor{olive}{2} & \textcolor{olive}{0} \\ \hline \textcolor{olive}{2} & \textcolor{olive}{2} & \textcolor{olive}{0} & \textcolor{olive}{1} \\ \hline \end{array}$$

**Multiplication in $\textcolor{olive}{\mathbb{F}_3}$**

$$\begin{array} {r|r|} \times & \textcolor{olive}{1} & \textcolor{olive}{2} \\ \hline \textcolor{olive}{1} & \textcolor{olive}{1} & \textcolor{olive}{2} \\ \hline \textcolor{olive}{2} & \textcolor{olive}{2} & \textcolor{olive}{1} \\ \hline \end{array}$$

and we just throw some garbage in there and say “this is an element now”—for example, if we added an arbitrary symbol in just to see how the math would cope: ${\textcolor{olive}{\mathbb{F}_3}}{[{\text{}}]}$.

The good news is: this “adjoinment” does not break addition, subtraction, or multiplication!

The bad news is: it breaks division (which is why the result is called a “ring”), *and* it has an infinite amount of elements—

**Addition in $\textcolor{olive}{\mathbb{F}_3}{[{\text{}}]}$**

$$\begin{array} {r|r|} + & \textcolor{olive}{0} & \textcolor{olive}{1} & \textcolor{olive}{2} & \textcolor{olive}{1}\text{} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{2}\text{} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{1}\text{}^2 & \dots & \textcolor{olive}{1}\text{}^{100} & \dots \\

\hline \textcolor{olive}{0} & \textcolor{olive}{0} & \textcolor{olive}{1}& \textcolor{olive}{2} & \textcolor{olive}{1}\text{} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{2}\text{} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{1}\text{}^2 & \dots & \textcolor{olive}{1}\text{}^{100} & \dots \\

\hline \textcolor{olive}{1} & \textcolor{olive}{1} & \textcolor{olive}{2} & \textcolor{olive}{0} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{1}\text{} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{2}\text{} & {({\textcolor{olive}{1}\text{}^2 + \textcolor{olive}{1}})} & \dots & {({\textcolor{olive}{1}\text{}^{100} + \textcolor{olive}{1}})} & \dots \\

\hline \textcolor{olive}{1}\text{} & \textcolor{olive}{1}\text{} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{2}\text{} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{0} & \textcolor{olive}{1} & \textcolor{olive}{2} & {({\textcolor{olive}{1}\text{}^2 + \textcolor{olive}{1}\text{}})} & \dots & \_ & \dots \\

\hline {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{1}\text{} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \_ & \dots \\

\hline {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{1}\text{} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \_ & \dots \\

\hline \textcolor{olive}{2}\text{} & \textcolor{olive}{2}\text{} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \_ & \dots \\

\hline {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \_ & \dots \\

\hline {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \_ & \dots \\

\hline \textcolor{olive}{1}\text{}^2 & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots &\_ & \dots \\

\hline \dots & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots &\_ & \dots \\

\hline \textcolor{olive}{1}\text{}^{100} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \textcolor{olive}{2}\text{}^{100} & \dots \\

\hline \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots \\

\hline \end{array}$$

]]>\hline \textcolor{olive}{0} & \textcolor{olive}{0} & \textcolor{olive}{1}& \textcolor{olive}{2} & \textcolor{olive}{1}\text{} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{2}\text{} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{1}\text{}^2 & \dots & \textcolor{olive}{1}\text{}^{100} & \dots \\

\hline \textcolor{olive}{1} & \textcolor{olive}{1} & \textcolor{olive}{2} & \textcolor{olive}{0} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{1}\text{} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{2}\text{} & {({\textcolor{olive}{1}\text{}^2 + \textcolor{olive}{1}})} & \dots & {({\textcolor{olive}{1}\text{}^{100} + \textcolor{olive}{1}})} & \dots \\

\hline \textcolor{olive}{1}\text{} & \textcolor{olive}{1}\text{} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{2}\text{} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{0} & \textcolor{olive}{1} & \textcolor{olive}{2} & {({\textcolor{olive}{1}\text{}^2 + \textcolor{olive}{1}\text{}})} & \dots & \_ & \dots \\

\hline {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{1}\text{} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \_ & \dots \\

\hline {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & {({\textcolor{olive}{1}\text{} + \textcolor{olive}{2}})} & \textcolor{olive}{1}\text{} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \_ & \dots \\

\hline \textcolor{olive}{2}\text{} & \textcolor{olive}{2}\text{} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \_ & \dots \\

\hline {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{1}})} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \_ & \dots \\

\hline {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & {({\textcolor{olive}{2}\text{} + \textcolor{olive}{2}})} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \_ & \dots \\

\hline \textcolor{olive}{1}\text{}^2 & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots &\_ & \dots \\

\hline \dots & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots &\_ & \dots \\

\hline \textcolor{olive}{1}\text{}^{100} & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \_ & \dots & \textcolor{olive}{2}\text{}^{100} & \dots \\

\hline \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots \\

\hline \end{array}$$

sudo dnf install \ "https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E '%rhel').noarch.rpm" \ "https://mirrors.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-$(rpm -E '%rhel').noarch.rpm" \ && \ sudo dnf install ffmpeg

I didn't even need to restart Firefox afterwards; it just all seemed to start working immediately

]]>I diagnosed this via dmesg:

```
[ 108.888963] Intel(R) Wireless WiFi driver for Linux
[ 108.889046] iwlwifi 0000:25:00.0: enabling device (0000 -> 0002)
[ 108.889135] iwlwifi 0000:25:00.0: can't disable ASPM; OS doesn't have ASPM control
[ 108.937577] iwlwifi 0000:25:00.0: Direct firmware load for iwlwifi-6000-6.ucode failed with error -2
[ 108.969279] iwlwifi 0000:25:00.0: Direct firmware load for iwlwifi-6000-5.ucode failed with error -2
[ 108.969412] iwlwifi 0000:25:00.0: Direct firmware load for iwlwifi-6000-4.ucode failed with error -2
[ 108.969462] iwlwifi 0000:25:00.0: no suitable firmware found!
[ 108.969495] iwlwifi 0000:25:00.0: minimum version required: iwlwifi-6000-4
[ 108.969530] iwlwifi 0000:25:00.0: maximum version supported: iwlwifi-6000-6
[ 108.969577] iwlwifi 0000:25:00.0: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
```

The “solution” was to do this (on a **live system** which can't persist any changes between reboots and doesn't have easy access to install packages):

- Mount an existing, functioning Linux installation at
`/mnt`

(or download the RPM package at the below link) - Copy
`iwlwifi-6000-4.ucode`

from`$source/lib/firmware`

to`/lib/firmware`

`modprobe -r iwlwifi; modprobe iwlwifi`

Disturbingly, this seems to be a ** regression** policy decision. They have the firmware available for RL8—

`iwl6000-firmware`

—only it's vanished from the RL9 repos.If you want to ignore this omen (don't do it!) and continue installing RL9 anyway, you can just save that RPM file somewhere and then install it again on the system after it reboots into the installed RL9. Unlike a live system, you don't need to do the above mumbo-jumbo; you only need to install that package and then reboot.

If you don't have an (additional) flash drive on hand, and just using Ethernet isn't an option, I recommend alt-tabbing out of the installer while it's running to smuggle the file into the in-progress system, specifically `/mnt/sysroot/root`

, so you can access it easily in any event.

8 months and 14 days after the day my account was alleged to have been deactivated for inactivity, I got a surprise order in—my first ever order as an Amazon Seller! Since the account was abandoned, I hadn't bothered keeping it up to date through a change of phone number. I figured if I ever needed to, I could just reactivate it with e-mail.

So I reset the password—with no problem, mind you; my e-mail was still valid—and tried to get back into the account. I was stuck on the phone-OTP page, and it didn't offer any alternatives; clicking the link for alternatives just directed me to a number to contact Amazon Customer Support. I then spent a few hours on the phone over the course of a few days trying to get back into the account—including uploading my ID for verification, which “re-activated” the *non-seller side* of my account and allowed me to (halfway) log in to it, but I still couldn't view or change any account settings, such as phone number, without receiving an SMS code at my old number.

The sequence of phone calls ended with me submitting the following ticket to the Seller Central Technical Support Page form, which explicitly states “ If you cannot contact us through Seller Central, please contact us using the form below”. It only offers 3 ticket types: Password Reset, Account Termination, and “Reactivate Your Account” (I chose the last of these, since the *password reset* actually works self-service, and I certainly don't want to *terminate* my account):

I'm trying to ship order #112-8574881-6472201.

I cannot log in because I no longer have access to my old phone number (██████████). How can I regain access to my seller account so that I can ship this order?

I just got off a phone call with a representative who said that this contact form is my only chance at restoring access.

A few hours later, I got this reply:

This email is not the correct channel to report login issues.

However in order to help you, I'm providing you with the below information.

If you encounter sign-in issues due to the issues with 2 step verification, try the following steps:

If your phone is lost or stolen, contact your carrier immediately and ask them to block or suspend your line, until you can figure out what happened.

To gain access to your seller account, try logging into Seller Central and click Didn't receive the code? on the bottom of the Two-Step Verification page. Select your backup method for receiving your code.

If you don't have a backup device and can't change your settings, you'll need to go through the Two-Step Verification Account Recovery process. This process requires you to submit documentation verifying your identity. Once verified (usually within 12 hours), Two-Step Verification will be disabled so you can log in. On your next login, you will be required to set up Two-Step Verification again, this time using devices that you have access to.

To access Password Assistance tool click on the below link

https://sellercentral.amazon.com/ap/forgotpassword?openid.assoc_handle=sc_na_amazon_v2&pageId=sc_na_amazon_v2Please click on the below link for Two-Step Verification FAQ

https://sellercentral.amazon.com/help/hub/reference/external/202153510For more information about Seller Central sign in help, please use the below help page:

https://sellercentral.amazon.com/help/hub/reference/external/login-helpI hope this helps.

I tried all these, with no luck.

This response didn't permit an e-mail reply, only a reply through the online portal (which I couldn't access due to being logged out—I did try), so I replied back through the same form:

(RE CASE 13397397731. I can't reply on the portal because I can't log in. I was directed to this form by phone support in Customer Service Reply ID A1IS0W6E70DFNO.)

My phone wasn't lost or stolen. I changed numbers years ago and forgot about this account until I got an e-mail telling me that I finally got an Order (#112-8574881-6472201).

When I try to log in, it sends an OTP to my old number. There is no button that says “Didn't receive the code?”, but there is a link that says “If you can’t receive the code, or if you changed your email or phone number, try a different way.” When I click that link, it just says “To continue, you'll need to contact Customer Service.” and directs me to a page with a support phone number which directed me to this form after a very long call.

You say to try the “Two-Step Verification Account Recovery”, but when I I visit https://www.amazon.com/a/recover/upload it requires me to log in and gives the same result as trying to log in normally, directing me to Customer Service without giving me the opportunity to upload ID verification.

How can I get back into my Seller Account so I can ship order #112-8574881-6472201?

Depressingly, their reply gave 0 indication they'd read my ticket:

Thank you for contacting Amazon.

I understand you are having issues with, logging into your selling account.

I have some information and resources to assist you.

We'd suggest you to refer to the link here – https://sellercentral.amazon.com/help/hub/reference/external/202153510 for more details on 2 step verification code.

(Yes, the link they sent is just a help article which links to *the very page I said wasn't working for me*!)

Worried that my previous message to them was too long, I tried the BLUF strategy:

I cannot get into my account.

Per my previous email, the Two-Step Recovery Process isn't available; clicking the link to recover my account only directs me to contact customer service when I can't access the OTP.

(RE CASE 13397397731 & 13401113931. I can't reply on the portal because I can't log in. I was directed to this form by phone support in Customer Service Reply ID A1IS0W6E70DFNO.)

But they gave a fucking functionally identical canned nonsequitur response:

Thank you for contacting Amazon.

I understand you are having issues with, two step verification.

I have some information and resources to assist you.

Please follow the steps mentioned in "Seller Central Sign In help section".

This page can be access after clicking on 'Help' option on the log in page.

Here is the direct link: https://sellercentral.amazon.com/help/hub/reference/external/login-help

You can view your account performance at (https://sellercentral.amazon.com/performance/dashboard?ref=ah_em_op) or select Account Health on the home screen of the Amazon Seller app on your iOS or Android device. Your Account Health shows how well your account is performing against the performance metrics and policies required to sell on

[sic]

— Download iOS App at (https://itunes.apple.com/na/app/amazon-seller/

— Download Android App at (https://play.google.com/store/apps/details?id=com.amazon.sellermobile.android&hl[sic])Thank you for taking the time to seek assistance with maintaining your Account Health.

I apologize from the bottom of my heart to whoever placed Amazon Order #112-8574881-6472201. Your cables will be very late, and delivered by another seller, because Amazon did not **permit me** to log on and print the shipping label in time for the order window.