Merge branch 'main' into main

This commit is contained in:
Cadey Ratio 2021-07-03 11:07:21 -04:00 committed by GitHub
commit 2d8509fff9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 912 additions and 12 deletions

16
Cargo.lock generated
View File

@ -1641,9 +1641,9 @@ dependencies = [
[[package]]
name = "reqwest"
version = "0.11.3"
version = "0.11.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2296f2fac53979e8ccbc4a1136b25dcefd37be9ed7e4a1f6b05a6029c84ff124"
checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22"
dependencies = [
"base64",
"bytes",
@ -1676,9 +1676,9 @@ dependencies = [
[[package]]
name = "ructe"
version = "0.13.2"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5678e9cc1545f229509acb67cf34793802646f32c77e00bc470b518cfddea579"
checksum = "c6fd2f3b927021cc8586d365c36d16d82d91fdae0a3839819c12c8e86e0f929e"
dependencies = [
"base64",
"bytecount",
@ -1730,9 +1730,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "sdnotify"
version = "0.1.3"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71ce7eac2075a4562fbcbad544cd55d72ebc760e0a5594a7c8829cf2b4b42a7a"
checksum = "1ad78c5d206dedabda370ab0b669c40623a446699ed4604829d0c600420c8d7c"
[[package]]
name = "security-framework"
@ -2224,9 +2224,9 @@ dependencies = [
[[package]]
name = "tracing-subscriber"
version = "0.2.18"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa5553bf0883ba7c9cbe493b085c29926bd41b66afc31ff72cf17ff4fb60dcd5"
checksum = "ab69019741fca4d98be3c62d2b75254528b5432233fd8a4d2739fec20278de48"
dependencies = [
"ansi_term 0.12.1",
"chrono",

View File

@ -47,7 +47,7 @@ patreon = { path = "./lib/patreon" }
# os-specific dependencies
[target.'cfg(target_os = "linux")'.dependencies]
sdnotify = { version = "0.1", default-features = false }
sdnotify = { version = "0.2", default-features = false }
[build-dependencies]
ructe = { version = "0.13", features = ["warp02"] }

View File

@ -0,0 +1,129 @@
---
date: 2021-07-04
title: My Thoughts About Using Android Again as an iPhone User
tags:
- android
- iphone
author: ectamorphic
---
# My Thoughts About Using Android Again as an iPhone User
I used to be a hardcore Android user. It was my second major kind of smartphone
(the first was Windows Mobile 6.1 on a T-Mobile Dash) and it left me hooked to
the concept of smartphones and connected tech in general. I've used many Android
phones over the years but one day I rage-switched over to an iPhone. My Samsung
Galaxy S7 pissed me off for the last time and I went to the Apple store and
bought an iPhone 7 on the spot. I popped my sim card into it (after a lovely
meal at Panda Express) and I was off to the races. I haven't really used Android
since other than in little stints with devices like the Amazon Fire 7 (because
it was so darn cheap).
Recently I realized that it would be very easy to package up my website for the
Google Play Store using [pwabuilder](https://www.pwabuilder.com/). I've been
shipping my site as a progressive web app (PWA) for years (and use that PWA for
testing how the site looks on my phone), but aside from the occasional confused
screenshot that's been tweeted at me I've never actually made much use of this.
It does do an additional level of caching (which is why you can load a bunch of
pages on the site, disconnect from the internet and then still browse those
pages that you loaded like you were online) though, which helps a lot with the
bandwidth cost of this site.
So, I decided to ship this site as an Android app. You can download it from the
Google Play Store
[here](https://play.google.com/store/apps/details?id=website.christine.xesite)
and get a partially native experience. It worked perfectly in the Android
emulator but you really need to experience it on a phone to know for sure. On a
whim I grabbed a [Moto g8
Power](https://www.gsmarena.com/motorola_moto_g8_power-10052.php) from Amazon
and then I used it for the final testing on the app before I shipped it on the
Google Play store. I unboxed the phone, set it up, plugged it into my MacBook
and then hit "run" in Android Studio. The app installed instantly and I saw [the
homepage for my site](https://cdn.christine.website/file/christine-static/blog/Screenshot_20210703-101654.png).
It was a magical experience. Me, someone that has no idea what they are doing
with Android app development was able to take an existing project I've poured
years of work into and make it work on a phone like a native app. I literally
just had the phone barely out of the box and my code was running natively on it.
I don't have to worry about the app timing out, I don't have to pay Google money
to test things on my own device, I just hit play and it runs.
This is the kind of developer experience I wish I could have on iOS. I used to
have a paid developer cert for resigning a few personally hacked up apps, but
when I moved to Canada and changed over my cards to have Canadian billing
addresses I lost the ability to purchase a renewal for my developer certificate.
I _can_ change my Apple account over to a Canadian one but doing that means I
have to delete my Apple Music subscription and that would delete all of the
custom uploaded music I have in the cloud. I have more music up there than I
have disk space locally, so this is not really a viable option.
Meanwhile on Android you just open the box, turn the phone on, set it up, press
on the build number 10 times, enable USB debugging, plug it in, confirm debug
access and bam, you're in. You can test an unlimited number of Android apps
forever. I can give the APK to people and then they can tell me if it works on
their device. You cannot do this on iOS. It's making me really consider if iOS
really is the best option for me going forward.
But then the claws of the Apple ecosystem show their face. I have an iPad,
MacBook Air, Apple Watch, iPhone and AirPods. If I end up switching to Android
as my main phone I make my watch significantly less useful. I won't have the
seamless notification syncing to my wrist unless I buy a new watch. I don't
really know if I want to do that.
At the same time though, Android lets me poke around and change things that
bother me. I can make animations faster, which makes the phone _feel_ so much
more snappy and responsive. I can rip out Chrome and replace it with something
else. I can choose which app to use for text messages. I have _agency_ and
_power_ over my experience in ways that iOS simply cannot match. As a tinkerer
that mains a NixOS tower this is a huge factor for me. And then I'm able to test
my apps for free. I can just do it. I don't have to worry about dev certs,
licenses or anything else. I just put the app on the phone and I'm done.
Android's UX is a lot different than it was when I used it last. The last
Android phone I used had hardware home, menu and back buttons. This Moto g8
Power seems to have some kind of gesture control mode that mostly emulates
modern iPhone gesture controls, so my muscle memory isn't totally freaked out.
It was a bit more sensitive than I would have liked out of the box, but I was
easily able to tweak the sensitivity until I got to a level I was comfortable
with. This would have never been able to happen on iOS.
I guess this post is a lot more rambly and less focused than I thought it would
be while I was outlining it on paper. I didn't go into this expecting a 1:1
experience matchup with what I have on iOS. This phone is not nearly powerful
enough to make them comparable, however I can easily just pick it up, do what I
need and it does it. I'm considering getting a burner sim for this thing so I
can take it with me instead of (or in addition to) my iPhone. The camera is
decent, but I don't really have any good comparison shots yet. Android and iOS
are at a state of convergent evolution at this point. They both do about the
same things. Android is more easily customizeable and iOS is more about a guided
experience. Neither is really "better" at this point, but I guess it really will
boil down to the ecosystem you want.
Apple's walled garden approach has a lot of
things in its favor. You can buy accessories from the Apple Store and they will
just work. You can seamlessly copy things from your phone to your tablet or your
laptop. iCloud and Airdrop glue your machines together, and in the future I can
only anticipate that each of those devices will get more and more muddled
together until there's not really a difference between them. Android has a lot
of options. There's over 15,000 Android devices out there with official Google
Play support. They're all at different patch states and have different gimmicks
to distinguish them, but you have an unparalleled amount of choice and agency.
This means that there's less of a consistent total experience, however it leaves
a lot of room for experimentation and innovation.
I like this phone and the instance of Android that runs on it. The only real
downside I've seen so far is that the update notes are in Spanish. I have no
idea why they're in Spanish, I don't speak Spanish and the phone's UI language
is set to English, but I get ["Seguridad de
Android"](https://twitter.com/theprincessxena/status/1411072416986587138/photo/1)
patches on it and that's my life now.
A lot of the Airdrop and integration features I've been missing have been
supplemented by [Taildrop](https://tailscale.com/kb/1106/taildrop/) and
Tailscale in general. It's really satisfying to be able to work for a company
that makes the annoyingly hard problem of "make computers talk to eachother" so
_trivial_.
Overall, it's a 7/10 experience for me. I'd likely choose Android if I wasn't so
entrenched in the Apple/iOS ecosystem. If only it wasn't so tied into Google's
fangs.

View File

@ -2,8 +2,8 @@
title: Epilogue
date: 2021-05-26
tags:
- freenode
- irc
series: freenode
---
# Epilogue

View File

@ -2,8 +2,8 @@
title: Final Chapter
date: 2021-05-20
tags:
- freenode
- irc
series: freenode
---
# Final Chapter

View File

@ -0,0 +1,144 @@
---
title: Footnote
date: 2021-06-15
tags:
- irc
series: freenode
---
# Footnote
- [Final Chapter](/blog/final-chapter-2021-05-20)
- [Epilogue](/blog/epilogue-2021-05-26)
---
Before the darkness was the darkness, the darkness was a child. This child found
themselves lost and without purpose. Life was scary. Things were changing
constantly, and they found themselves at a loss. One day they were walking about
the etherial network and stumbled across a meeting house.
The child looked inside and was confused. There were hundereds of rooms with
even more people inside. There were rooms on every topic. There was a shower of
culture and an outpouring of knowledge. Hanging out here would permanently
change the course of the child's life.
---
Horrified by the room takeover golem, the remaining regulars had fled their
former homes. This was not a home for legal reasons, but it was their social
home on the etherial network. Sadness had turned to rage had turned to
depression had turned to laughter. One of the former regulars was a apprentice
scryer, so as a lark they decided to set up some meeting rooms to scry their way
into rooms in the old meeting house. It was a one-way scry and all they could do
was watch.
---
Historically, IRC spam has been a unique form of art. Yes, I'm serious. There
have been legitimate works of art created in the desire to disrupt conversations
on IRC. It sounds absurd, but it's true. One unique quality of these artworks is
that in order to see them, they must be shared with others. At some level you
can't view this art alone, and that makes it beautiful.
Fighting IRC spam has turned into a full time job. There are hundreds of
different bot kinds and so many different ways to spam that fighting it is
difficult due to the server software being very simple. Historically IRC
developers have not wanted to add hooks so that people could run a bit of code
on each message as it was being processed. There were legitimate fears that
doing this would allow a malicious server admin to log every channel, not just
the ones they have joined. IRC was created at a time where all of the admins
knew eachother; but they were part of different organizations, each with their
own rules and subtly different codes of conduct.
One of the best ways to fight IRC spam has been to wait until the spammer gets
bored and goes off to do something else. Users are not as understanding to this
method.
---
Someone had set up a golem-creating golem and aimed it at the meta-discussion
room of the former meeting house. It did its job dutifully and continued
marching on:
> (pissnet) come to pissnet for cold wet chats!
The people watching the scry had never seen this brand of disruption before. By
now the people watching had amassed to over a hundred and they were all bored
and eager for something new. Something new was here!
> (pissnet) come to pissnet for cold hard piss!
Over time, the shadowy group behind these golems became known as the urinators.
These urinators became a bit of a hero to the people who watched in horror as
the situation developed. The golems got discovered and ejected, and even earned
the ire of the anti-golem golem. The disguise was clever, the ejections where
swift, but the watchers laughed as the golems kept getting more and more
creative.
---
The darkness was dismayed. Everything was falling apart around them. The
maintainers of the maintenance golems had fled. The spellcrafters that empowered
them [had sworn to give no more
assistance](https://atheme.github.io/atheme-open-letter/). The halls themselves
were starting to show the rot that had built up over the last 20 years of them
existing.
The darkness pondered amongst themselves until they pulled back a memory from
the past. A memory from the child. The halls themselves had to be replaced!
---
The watchers looked on in horror. The scryer had given up hope and decided to
move on with their life. The urinators had suceeded in shutting down the things
that were fun to the watchers. The urinators won.
Some urinators created their own halls. It was an experiment in anarchy for
running these types of halls. It is astounding that it managed to stay as stable
as it did.
---
I have been completely unsure how I should broach the topic of pissnet in these
articles. For people unfamiliar with IRC culture, you must think I'm making shit
up or something. It is _so_ out there that it's almost like an abstact art
gallery or something. But no, pissnet happened. It started as IRC spam and then
turned into this: [letspiss.net](http://letspiss.net/). I don't really think I
can suggest readers of this blog go there. It is some kind of weird anarchist
IRC hackerspace, but most of the users are ircops and can see your IP address.
Like, for people that are really deep into IRC culture, the whole pissnet
shitshow was so out there that they thought the people that were telling them
about that were making that shit up.
But it's real.
---
> We are moving past legacy freenode to a new fork. The new freenode is
> launched. You will slowly be disconnected and when you reconnect, you will be
> on the new freenode. We patiently await to welcome you in freedom's holdout -
> the freenode. If you're looking to connect now, you can already /server
> chat.freenode.net 6697 (ssl) or 6667 (plaintext). It's a new genesis for a new
> era. Thank you for using freenode, and Hello World, from the future. freenode
> is IRC. freenode is FOSS. When you connect, register your nickname and your
> channel and get started. It's a new world. We're so happy to welcome you and
> the millions of others.
The darkness smiled and replaced the halls where they were. The darkness hoped
that millions would follow.
They didn't come.
---
- [Freenode commits suicide, is no longer a serious IRC
network](https://www.devever.net/~hl/freenode_suicide)
- [the end of freenode](https://ariadne.space/2021/06/14/the-end-of-freenode/)
- [All Freenode Channels and Users
Gone](https://old.reddit.com/r/linux/comments/o0263h/all_freenode_channels_and_users_gone/)
- [Last remaining >1000 user community channel seized by freenode
staff](https://linux.chat/linux-on-freenode/)
Freenode is dead. The spirit lives on in [Libera.chat](https://libera.chat/).

View File

@ -0,0 +1,274 @@
---
title: Using Paper for Everyday Tasks
date: 2021-06-13
author: Heartmender
---
# Using Paper for Everyday Tasks
I have a bit of a reputation of being a very techno-savvy person. People have
had the assumption that I have some kind of superpowerful handcrafted task
management system that rivals all other systems and fully integrates with
everything on my desktop. I don't. I use paper to keep track of my day to day
tasks. Offline, handwritten paper. I have a big stack of little notebooks and I
go through them one each month. Today I'm going to discuss the core ideas of my
task management toolchain and walk you through how I use paper to help me get
things done.
I have tried a lot of things before I got to this point. I've used nothing,
Emacs' Org mode, Jira, GitHub issues and a few reminder apps. They all haven't
quite cut it for me.
The natural place to start from is doing nothing to keep track of my tasks and
goals. This can work in the short term. Usually the things that are important
will come back to you and you will eventually get them done. However it can be
hard for it to be a reliable system.
[Focus is hard. Memory is fleeting. Data gets erased. Object permanence is a
myth. Paper sits by the side and laughs.](conversation://Cadey/coffee)
It does work for some people though. I just don't seem to be one of them. Doing
nothing to keep track of my tasks only really works when there are external
structures around to help me keep track of things. Standup meetings or some kind
of daily check-in are vital to this, and they sort of work because my team is
helping keep everyone accountable for getting work done. This is very dependent
on the team culture being healthy and on me being somewhere that I feel
psychologically safe enough to admit when I make a mistake (which I have only
really felt working at Tailscale). It also doesn't follow me from job to job, so
changing employers would also mean I can't take my organization system with me.
So that option is out.
[Emacs](https://www.gnu.org/software/emacs/) is a very extensible text editor.
It has a turing-complete scripting language called Emacs Lisp at its core and
you can build out just about anything you want with it. As such, many packages
have been developed. One of the bigger and more common packages is [Org
Mode](https://orgmode.org/). It is an Emacs major mode that helps you keep track
of notes, todo lists, timekeeping, literate programming, computational notebooks
and more. I have used Org Mode for many years in the past and I have no doubt
that without it I would probably have been fired at least twice.
One of the main philosophies is that Org Mode is text at its core. The whole
user experience is built around text and uses Emacs commands to help you
manipulate text. Here's an example Org Mode file like I used to use for task
management:
```orgmode
#+TITLE: June 2021
* June 10, 2021
** SRE
*** TODO put out the fire in prod before customers notice
Oh god, it's a doozy. The database server takes too long to run queries only
sometimes on Thursdays. Why thursday? No idea. It just happens. Very
frustrating. I wonder if God is cursing me.
** Devel
*** DONE Implement the core of flopnax for abstract rilkefs
CLOSED: [2021-06-10 Thu 16:20]
*** TODO write documentation for flopnax before it is shipped
** Overhead
*** DONE ENG meeting
CLOSED: [2021-06-10 Thu 15:00]
*** TODO Assist Jessie with the finer points of Rust
**** References vs Values
**** Lifetimes
Programming in Rust is the adventure of a lifetime!
** Personal
*** DONE Morning meds
CLOSED: [2021-06-10 Thu 09:04]
*** TODO Evening meds
*** TODO grocery run
```
Org Mode used to be a core part of my workflow and life. It was everpresent and
used to keep track of everything. I would even track usage of certain
recreational substances in Org Mode with a snippet of Emacs Lisp to do some
basic analytics on usage frequency. Org Mode can live with me and I don't have
to give it up when I change jobs.
I got out of the habit a while ago and it's been really hard to go back into the
habit. I still suggest Org Mode to people, but it's no longer the thing that I
use day to day. It also is hard to use from my tablet (iPad) and my phone
(iPhone). It also tends to vanish when you close the window, and when you have
object permanence issues that tends to make things hard.
[I could probably set up something with one of those fancy org-mode frontends
served over HTTP, but that would probably end up being more effort than it's
worth for me](conversation://Cadey/coffee)
Another tool I've used for this is my employer's task management tool of choice.
At past jobs this has ranged from GitHub to Jira. This is a solid choice. It
keeps everything organized and referenced with other people. I don't have to do
manual or automated synchronization of information into that ticket tracking
system to be sure other people are updated. However, you inherit a lot of the
inertia of how the ticket tracking system of choice is used. At a past job there
were unironically 17 different states that a ticket could be in. Most of them
were never used and didn't matter, yet they could not be removed lest it break
the entire process that the product team used to keep track of things.
Doing it like this works great if your opinions about how issues should be
tracked agree with your employer's process (if this is the case, you probably
set up the issue tracking system). As I mentioned before, this also means that
you have to leave that system behind when you change jobs. If you are someone
that never really changes jobs, this can work amazingly. I am not one of those
people.
Something else I've tried is to set up my own private GitHub/Gitea project to
keep track of things. We used one for organizing our move to Ottawa even. This
is a very low-friction system. It is easy to set up and the issues will bother
you in your news feed, so they are everpresent. It's also easy to close the
window and forget about the repo.
There is also that little hit of endorphins from closing an issue. That little
rush can help fuel a habit for using the tool to track things, but the rush goes
away after a while.
[Wait, if you have issues remembering to look at your org mode file or tracker
board or whatever, why can't you just set up a reminder to update it? Surely
that can't be that hard to do?](conversation://Mara/hmm)
[Don't you think that if it was that easy, I would already be doing that? Do you
think I like having this be so hard? Notifications that are repetitive fade into
the background when I see them too often. I subconsciously filter them out. They
do not exist to me. Even if it is one keypress away to open the board or append
to my task list, I will still forget to do it, even if it's
important.](conversation://Cadey/coffee)
So, I've arrived on paper to keep track on these things. Paper is cheap. Paper
is universal. Paper doesn't run out of battery. Paper doesn't vanish into the
shadow realm when I close the window. Paper can do anything I can do with a
pencil. Paper lets me turn back pages in the notebook and scan over for things
that have yet to be done. Honestly I wish I had started using paper for this
sooner. Here's how I use paper:
- Get a cheap notebook or set of notebooks. They should ideally be small,
pocketable notebooks. Something like 30 sheets of paper per notebook. I can't
find the cheap notebooks that I bought on Amazon, but I found something
similar
[here](https://www.amazon.ca/Notebook-Kraft-Cover-Pocket-Squared/dp/B0876LYNYH/).
Don't be afraid to buy more than you need. This stuff is really cheap. Having
more paper around can't hurt. [Field Notes](https://fieldnotesbrand.com/)
works in a pinch, but their notebooks can be a bit expensive. The point is
you have many options.
- Label it with the current month (it's best to start this at the beginning of
a month if you can). Put contact information on the inside cover in case you
lose it.
- Start a new page every day. Put the date at the top of the page.
- Metadata about the day goes in the margins. I use this to keep a log of who
is front as well as taking medicine.
- Write prose freely.
- TODO items start with a `-`. Those represent things you need to do but
haven't done yet.
- When the item is finished, put a vertical line through the `-` to make it a
`+`.
- If the item either can't or won't be done, cross out the `-` to make it into
a `*`.
- If you have to put off a task to a later date, turn the `-` into a `->`. If
there is room, put a brief description of why it needs to be moved or when it
is moved to. If there's no room feel free to write it out in prose form at
the end of your page.
- Notes start with a middot (`·`). They differ from prose as they are not
complete sentences. If you need to, you can always turn them into TODO items
later.
- Write in pencil so you can erase mistakes. Erase carefully to avoid ripping
the paper, You hardly need to use any force to erase things.
- There is only one action, appending. Don't try and organize things by topic
as you would on a computer. This is not a computer, this is paper. Paper
works best when you append only. There is only one direction, forward.
- If you need to relate a bunch of notes or todo items with a topic, skip a
line and write out the topic ending with a colon. When ending the topical
notes, skip another line.
- Don't be afraid to write in it. If you end up using a whole notebook before
the month is up, that is a success. Record insights, thoughts, feelings and
things that come to your mind. You never know what will end up being useful
later.
- At the end of the month, look back at the things you did and summarize/index
them in the remaining pages. Discover any leftover items that you haven't
completed yet so you can either transfer them over to next month or discard
them. It's okay to not get everything done. You may also want to scan it to
back it up into the cloud. You may never reference these scans, but backups
never hurt.
And then just write things in as they happen. Don't agonize over getting them
all. You will not. The aim is to get the important parts. If you really honestly
do miss something that is important, it will come back.
Something else I do is I keep a secondary notebook I call `Knowledge`. It
started out as the notebook that I used to document errata for my homelab, but
overall it's turned into a sort of secondary place to record other information
as well as indexing other details across notebooks. This started a bit on
accident. One of the notebooks from my big order came slightly broken. A few
pages fell out and then I had a smaller notebook in my hands. I stray from the
strict style in this notebook. It's a lot more free flowing based on my needs,
and that's okay. I still try to separate things onto separate pages when I can
to help keep things tidy.
I've also been using it to outline blogposts in the form of bullet trees.
Normally I start these articles as a giant unordered list with sub-levels for
various details on its parent thing. Each top-level thing becomes a "section"
and things boil down into either paragraphs or sentences based on what makes
sense.
An unexpected convenience of this flow is that the notebooks I'm using are small
enough to fit under the halves of my keyboard:
<center><blockquote class="twitter-tweet"><p lang="en" dir="ltr">The REAL reason to get
a split keyboard <a
href="https://t.co/I3qBMDU5sQ">pic.twitter.com/I3qBMDU5sQ</a></p>&mdash; Xe from
Within (@theprincessxena) <a
href="https://twitter.com/theprincessxena/status/1402459138010009605?ref_src=twsrc%5Etfw">June
9, 2021</a></blockquote> <script async
src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></center>
This lets me leave the notebooks in an easy to grab place while also putting
them slightly out of the way until they are needed. I also keep my pencil and
eraser closeby. When I go out of the house, I pack this month's journal, a
pencil and an eraser.
Paper has been a great move for me. There's no constant reminders. There's no
product team trying to psychologically manipulate me into using paper more
(though honestly that might have helped to build the habit of using it daily).
It is a very calm technology and I am all for it.
[Is this technology though? This is just a semi-structured way of writing things
on paper. Does that count as technology?](conversation://Mara/hmm)
[To be honest, I don't know. The line of what is and what is not technology is
very thin in the best case. I think that this counts as a technology, but
overall this is a huge It Depends™. You may not think this is "real" technology
because there's no real electronic component to it. That is a valid opinion,
however I would like to posit that this is technology in the same way that a
manual shaving razor is technology. It was designed and built to purpose. If that
isn't technology, what is? Plus, this way there's no risk of server downtime
preventing me from using paper!](conversation://Cadey/enby)
Oh, also, if you feel bored and a design comes to mind, don't be afraid to
doodle on the cover. Make paper yours. Don't worry about it being perfect. It's
there to help you tell the notebooks apart in the future after they are
complete.
So far over the last month I've made notes on 49 pages. Most of the TODO items
are complete. Less than 10% of them failed/were cancelled. Less than 10% of them
had to roll over to the next day. I assemble my TODO lists based on what I
didn't get done the previous day. I write each thing out by hand to help me
remember to prioritize them. When I need something to do, I look down at my
notebook for incomplete items. I use a rubber band to keep the notebook closed.
I've been considering slipstreaming the stuff currently in the `Knowledge`
notebook into the main monthly one. It's okay to go through paper. That's a
success.
This system works for me. I don't know if it will work for you, but if you have
been struggling with remembering to do things I would really suggest trying it.
You probably have a few paper notebooks left over from startups handing them out
in a swag pack. You probably also have never touched them since you got them.
This is good. I only really use the small notebooks because I found the more
fancy bound notebooks were harder to write on the left sides more than the right
sides. Your mileage may vary.
[I would include a scan of one of my notebook pages here, but that would reveal
some personal information that I don't really want to put on this blog as well
as potentially break NDA terms for work, so I don't want to risk that if you can
understand.](conversation://Cadey/enby)

View File

@ -0,0 +1,106 @@
---
title: waifud Plans
date: 2021-06-19
series: waifud
tags:
- libvirt
- golang
- rust
---
# waifud Plans
So I have this [homelab](/blog/my-homelab-2021-06-08) now, and I want to run
some virtual machines on it. But I don't want to have to SSH into each machine
to do this and I have a lot of time to kill this summer. So I'm going to make a
very obvious move and massively overcomplicate this setup.
[Canada's health system is usually pretty great, however for some reason I have
to wait _four months_ between COIVD vaccine shots. What the heck. That basically
eats up my entire summer. Grrrr](conversation://Cadey/angy)
waifud is a suite of tools that help you manage your server's waifus. This is an
example of name-driven development, or where I had a terrible idea about the
name that was so terrible I had to bring it to its natural conclusion. Thanks to
comments on Reddit and Hacker News about [my systemd talk
video](/talks/systemd-the-good-parts-2021-05-16), I was told that I was
mispronouncing "systemctl" as "system-cuttle" (it came out as "system-cuddle"
for some reason). If virtual machines are waifus to a server, then a management
daemon would be called `waifud`, and the command line tool would be called
`waifuctl` (which is canonically pronounced "waifu-cuddle" and I will accept no
other pronunciations as valid).
Essentially my vision for waifud is to be a "middle ground" between running
virtual machines on one server and something more complicated like
[OpenStack](https://www.openstack.org). I want to be able to have high level
descriptions of virtual machines (including cloud-config userdata) and then hand
them over to waifud to just figure out the logistics of where they should run
for me.
Due to how absurdly useful something like this is, I also wanted to be sure that
it is difficult for companies to use this in production without paying me for
some kind of license. Not to say that this would be intentionally made useless,
more that if I have to support people using this in production I would rather be
paid to do so. I feel it would be better for the project this way. I still have
not decided on what price the support licenses would be, however I would only
ask that people using this in a professional capacity (IE: for their dayjob or
as an integral of a dayjob's production services) acquire a license by
[contacting me](/contact) once the project hits something closer to stable, or
at least when I get to the point that I am using it for all of my virtual
machine fun.
At a high level, waifud will be made out of a few components:
- the waifud control server, written in Rust
- the waifuctl tool, written in Rust
- the waifud-agentd runner node agent, written in Rust
- the waifud-metadatad metadata server, written in Go using userspace WireGuard
to listen on 169.254.169.254:80 to serve metadata to machines that ask for it
- SQLite to store control server data
- Redis to store cloud-config metadata
Right now I have the source code for waifud [available
here](https://github.com/Xe/waifud). It is released under the terms of the
permissive [Be Gay, Do Crimes](https://github.com/Xe/waifud/blob/main/LICENSE)
license, which should sufficiently scare people away for now while I implement
the service. The biggest thing in the repo right now is
[`mkvm`](https://github.com/Xe/waifud/tree/main/cmd/mkvm), which is essentially
the prototype of this project. It downloads a cloud template, injects it into a
ZFS zvol and then configures libvirt to use that ZFS zvol as the root filesystem
of the virtual machine.
This tool works great and I use it very often both personally and in work
settings, however one of the biggest problems that it has is that it assumes
that the urls for the upstream cloud templates will change when the contents of
the file behind the URL changes. This has turned out to be a very very very
wrong assumption and has caused me a lot of churn in testing. I've been looking
at using something like [IPFS](https://ipfs.io) to store these images in, but
I'm still pondering options.
I would also like to have some kind of web management interface for waifud.
Historically frontend web development has been one of my biggest weaknesses. I
would like to use [Alpine.js](https://alpinejs.dev) to make an admin panel.
At a high level, I want waifuctl to have the following features:
- list all virtual machines across the cluster
- create a new virtual machine somewhere
- create a new virtual machine on a specific node
- delete a virtual machine
- fetch a virtual machine's IP address
- edit the cloud config for a virtual machine
- resize a virtual machine's memory and CPU count
- list all templates
- delete a template
- add a new template
The runner machines will communicate with waifud over HTTP with a redis cache
for cloud-config metadata. Each runner node will have its virtual machine subnet
shared both with other runner nodes and other machines on the network using
[Tailscale subnet routes](https://tailscale.com/kb/1019/subnets/). The metadata
server will hook into each machine's network stack using an on-machine WireGuard
config and a userspace instance of WireGuard.
I hope to have something more substantial created by the end of August at
latest. I'm working on the core of waifud at the moment and will likely do a
stream or two of me hacking at it when I can.

View File

@ -0,0 +1,62 @@
---
title: "christine.website is now on the Microsoft Store"
date: 2021-06-26
author: sephiraloveboo
tags:
- release
- Windows11
---
# christine.website is now on the Microsoft Store
This website has been a progressive web app [for a long
time](https://christine.website/blog/progressive-webapp-conversion-2019-01-26).
This means that you can install my blog to your phone as if it was a normal app
via the share menu in Safari on iOS or via other native prompts on other
browsers. However, this is not enough. In the constant pursuit of advancement I
have found a way to make this an even more seamless user experience. I have
released this website on the Microsoft store and you can download it
[here](https://www.microsoft.com/en-ca/p/christinewebsite/9nn7zx20jl85?activetab=pivot:overviewtab).
> Science isn't about *why* - it's about *why not*. *Why* is so much of our
> science dangerous? Why not *marry* safe science if you love it so much? In
> fact, why not invent a special safety door that won't hit you in the butt on
> the way out, because *you are fired!* Not you, test subject. You're doing
> fine.
- Cave Johnson, Portal 2
This will allow me to experiment with push notifications in the future. People
have asked for a way to be notified of new posts to my blog and I want to
experiment with push notifications using service workers. It may be a while
until I end up getting to a point where I can do that, but I want to start
laying the ground work for fully native integration on your machines.
As for why I'm doing this, that's a good question. Microsoft said that Windows
11 was an open platform, and if it really is an open platform then they'll allow
anyone to publish things to their store. I was able to get my existing website
to be published as an app and I will probably use that model going forward with
other projects in the future. I've also started the process of getting [Mara:
Sh0rk of Justice](https://xe.github.io/mara-sh0rk-of-justice/) published in a
similar way.
I have also been prototyping an Android app that is currently in review on the
Google Play store, but if you want to test drive it now, you can download the
APK
[here](https://cdn.christine.website/file/christine-static/apk/christine.website-1.0.3.1-1.apk).
It is currently just a webview pointing to my website and that's all it really
needs to be. The rest of the magic will happen in the background after you
explicitly opt-in to push notifications or whatever once I figure out how to do
that with a server written in Rust. I may have to cave and write the push
notification server pusher part in Node or something, I don't really know for
sure yet.
I am working on making the code for the Android app open source and will post it
[here](https://github.com/Xe/xesite_android) once I figure out all of the files
I need to gitignore properly.
Until then, enjoy a taste of the future! I will look into making this work on
iOS and macOS, but those require a few more steps that are really annoying due
to my Apple developer account being in an odd state due to me being an ex-pat.
Apparently they won't let you use a Canadian address to pay for things with a US
account. Annoying.

View File

@ -242,7 +242,7 @@ in [ Person::{
]
, gitLink = "https://github.com/BytewaveMLP"
}
, Person::{
, Person::{
, name = "Avi Parshan"
, tags =
[ "python"
@ -255,5 +255,18 @@ in [ Person::{
]
, gitLink = "https://github.com/avipars"
, twitter = "https://twitter.com/aviinfinity"
, Person:: {
, name = "Tommy Nguyen"
, tags =
[ "c++"
, "linux"
, "cybersecurity"
, "privacy"
, "technical-writing"
, "web"
, "google-cloud-platform"
]
, gitLink = "https://github.com/remyabel"
}
]

172
static/privacy_policy.html Normal file
View File

@ -0,0 +1,172 @@
<h1>Privacy Policy</h1>
<p>Last updated: June 25, 2021</p>
<p>This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.</p>
<p>We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. This Privacy Policy has been created with the help of the <a href="https://www.freeprivacypolicy.com/free-privacy-policy-generator/" target="_blank">Privacy Policy Generator</a>.</p>
<h1>Interpretation and Definitions</h1>
<h2>Interpretation</h2>
<p>The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.</p>
<h2>Definitions</h2>
<p>For the purposes of this Privacy Policy:</p>
<ul>
<li>
<p><strong>Account</strong> means a unique account created for You to access our Service or parts of our Service.</p>
</li>
<li>
<p><strong>Affiliate</strong> means an entity that controls, is controlled by or is under common control with a party, where &quot;control&quot; means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.</p>
</li>
<li>
<p><strong>Application</strong> means the software program provided by the Company downloaded by You on any electronic device, named christine.website</p>
</li>
<li>
<p><strong>Company</strong> (referred to as either &quot;the Company&quot;, &quot;We&quot;, &quot;Us&quot; or &quot;Our&quot; in this Agreement) refers to christine.website.</p>
</li>
<li>
<p><strong>Cookies</strong> are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses.</p>
</li>
<li>
<p><strong>Country</strong> refers to: Ontario, Canada</p>
</li>
<li>
<p><strong>Device</strong> means any device that can access the Service such as a computer, a cellphone or a digital tablet.</p>
</li>
<li>
<p><strong>Personal Data</strong> is any information that relates to an identified or identifiable individual.</p>
</li>
<li>
<p><strong>Service</strong> refers to the Application or the Website or both.</p>
</li>
<li>
<p><strong>Service Provider</strong> means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used.</p>
</li>
<li>
<p><strong>Usage Data</strong> refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).</p>
</li>
<li>
<p><strong>Website</strong> refers to christine.website, accessible from <a href="https://christine.website" rel="external nofollow noopener" target="_blank">https://christine.website</a></p>
</li>
<li>
<p><strong>You</strong> means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.</p>
</li>
</ul>
<h1>Collecting and Using Your Personal Data</h1>
<h2>Types of Data Collected</h2>
<h3>Personal Data</h3>
<p>While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:</p>
<ul>
<li>Usage Data</li>
</ul>
<h3>Usage Data</h3>
<p>Usage Data is collected automatically when using the Service.</p>
<p>Usage Data may include information such as Your Device's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.</p>
<p>When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.</p>
<p>We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.</p>
<h3>Tracking Technologies and Cookies</h3>
<p>We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include:</p>
<ul>
<li><strong>Cookies or Browser Cookies.</strong> A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser setting so that it will refuse Cookies, our Service may use Cookies.</li>
<li><strong>Flash Cookies.</strong> Certain features of our Service may use local stored objects (or Flash Cookies) to collect and store information about Your preferences or Your activity on our Service. Flash Cookies are not managed by the same browser settings as those used for Browser Cookies. For more information on how You can delete Flash Cookies, please read &quot;Where can I change the settings for disabling, or deleting local shared objects?&quot; available at <a href="https://helpx.adobe.com/flash-player/kb/disable-local-shared-objects-flash.html#main_Where_can_I_change_the_settings_for_disabling__or_deleting_local_shared_objects_" rel="external nofollow noopener" target="_blank">https://helpx.adobe.com/flash-player/kb/disable-local-shared-objects-flash.html#main_Where_can_I_change_the_settings_for_disabling__or_deleting_local_shared_objects_</a></li>
<li><strong>Web Beacons.</strong> Certain sections of our Service and our emails may contain small electronic files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the Company, for example, to count users who have visited those pages or opened an email and for other related website statistics (for example, recording the popularity of a certain section and verifying system and server integrity).</li>
</ul>
<p>Cookies can be &quot;Persistent&quot; or &quot;Session&quot; Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. Learn more about cookies: <a href="https://www.freeprivacypolicy.com/blog/cookies/" target="_blank">Cookies: What Do They Do?</a>.</p>
<p>We use both Session and Persistent Cookies for the purposes set out below:</p>
<ul>
<li>
<p><strong>Necessary / Essential Cookies</strong></p>
<p>Type: Session Cookies</p>
<p>Administered by: Us</p>
<p>Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services.</p>
</li>
<li>
<p><strong>Cookies Policy / Notice Acceptance Cookies</strong></p>
<p>Type: Persistent Cookies</p>
<p>Administered by: Us</p>
<p>Purpose: These Cookies identify if users have accepted the use of cookies on the Website.</p>
</li>
<li>
<p><strong>Functionality Cookies</strong></p>
<p>Type: Persistent Cookies</p>
<p>Administered by: Us</p>
<p>Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website.</p>
</li>
</ul>
<p>For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy.</p>
<h2>Use of Your Personal Data</h2>
<p>The Company may use Personal Data for the following purposes:</p>
<ul>
<li>
<p><strong>To provide and maintain our Service</strong>, including to monitor the usage of our Service.</p>
</li>
<li>
<p><strong>To manage Your Account:</strong> to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.</p>
</li>
<li>
<p><strong>For the performance of a contract:</strong> the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service.</p>
</li>
<li>
<p><strong>To contact You:</strong> To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation.</p>
</li>
<li>
<p><strong>To provide You</strong> with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information.</p>
</li>
<li>
<p><strong>To manage Your requests:</strong> To attend and manage Your requests to Us.</p>
</li>
<li>
<p><strong>For business transfers:</strong> We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred.</p>
</li>
<li>
<p><strong>For other purposes</strong>: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience.</p>
</li>
</ul>
<p>We may share Your personal information in the following situations:</p>
<ul>
<li><strong>With Service Providers:</strong> We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You.</li>
<li><strong>For business transfers:</strong> We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company.</li>
<li><strong>With Affiliates:</strong> We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us.</li>
<li><strong>With business partners:</strong> We may share Your information with Our business partners to offer You certain products, services or promotions.</li>
<li><strong>With other users:</strong> when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside.</li>
<li><strong>With Your consent</strong>: We may disclose Your personal information for any other purpose with Your consent.</li>
</ul>
<h2>Retention of Your Personal Data</h2>
<p>The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.</p>
<p>The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.</p>
<h2>Transfer of Your Personal Data</h2>
<p>Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.</p>
<p>Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.</p>
<p>The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.</p>
<h2>Disclosure of Your Personal Data</h2>
<h3>Business Transactions</h3>
<p>If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.</p>
<h3>Law enforcement</h3>
<p>Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).</p>
<h3>Other legal requirements</h3>
<p>The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:</p>
<ul>
<li>Comply with a legal obligation</li>
<li>Protect and defend the rights or property of the Company</li>
<li>Prevent or investigate possible wrongdoing in connection with the Service</li>
<li>Protect the personal safety of Users of the Service or the public</li>
<li>Protect against legal liability</li>
</ul>
<h2>Security of Your Personal Data</h2>
<p>The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.</p>
<h1>Children's Privacy</h1>
<p>Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.</p>
<p>If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.</p>
<h1>Links to Other Websites</h1>
<p>Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.</p>
<p>We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.</p>
<h1>Changes to this Privacy Policy</h1>
<p>We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.</p>
<p>We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the &quot;Last updated&quot; date at the top of this Privacy Policy.</p>
<p>You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.</p>
<h1>Contact Us</h1>
<p>If you have any questions about this Privacy Policy, You can contact us:</p>
<ul>
<li>
<p>By email: me@christine.website</p>
</li>
<li>
<p>By visiting this page on our website: <a href="https://christine.website/contact" rel="external nofollow noopener" target="_blank">https://christine.website/contact</a></p>
</li>
</ul>