diff --git a/Cargo.lock b/Cargo.lock index ccb5d1d..02bb7c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/Cargo.toml b/Cargo.toml index 82f4e99..4839729 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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"] } diff --git a/blog/android-thoughts-2021-07-04.markdown b/blog/android-thoughts-2021-07-04.markdown new file mode 100644 index 0000000..62f6528 --- /dev/null +++ b/blog/android-thoughts-2021-07-04.markdown @@ -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. diff --git a/blog/epilogue-2021-05-26.markdown b/blog/epilogue-2021-05-26.markdown index d2807ad..baa3e97 100644 --- a/blog/epilogue-2021-05-26.markdown +++ b/blog/epilogue-2021-05-26.markdown @@ -2,8 +2,8 @@ title: Epilogue date: 2021-05-26 tags: - - freenode - irc +series: freenode --- # Epilogue diff --git a/blog/final-chapter-2021-05-20.markdown b/blog/final-chapter-2021-05-20.markdown index 2146460..32f7a30 100644 --- a/blog/final-chapter-2021-05-20.markdown +++ b/blog/final-chapter-2021-05-20.markdown @@ -2,8 +2,8 @@ title: Final Chapter date: 2021-05-20 tags: - - freenode - irc +series: freenode --- # Final Chapter diff --git a/blog/footnote-2021-06-15.markdown b/blog/footnote-2021-06-15.markdown new file mode 100644 index 0000000..dee112c --- /dev/null +++ b/blog/footnote-2021-06-15.markdown @@ -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/). diff --git a/blog/gtd-on-paper-2021-06-13.markdown b/blog/gtd-on-paper-2021-06-13.markdown new file mode 100644 index 0000000..b75c03c --- /dev/null +++ b/blog/gtd-on-paper-2021-06-13.markdown @@ -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: + +

The REAL reason to get +a split keyboard pic.twitter.com/I3qBMDU5sQ

— Xe from +Within (@theprincessxena) June +9, 2021
+ +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) diff --git a/blog/waifud-plans-2021-06-19.markdown b/blog/waifud-plans-2021-06-19.markdown new file mode 100644 index 0000000..11107bb --- /dev/null +++ b/blog/waifud-plans-2021-06-19.markdown @@ -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. diff --git a/blog/xesite-app-stores-2021-06-26.markdown b/blog/xesite-app-stores-2021-06-26.markdown new file mode 100644 index 0000000..5be614d --- /dev/null +++ b/blog/xesite-app-stores-2021-06-26.markdown @@ -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. diff --git a/signalboost.dhall b/signalboost.dhall index 5d5fd14..2b6c42f 100644 --- a/signalboost.dhall +++ b/signalboost.dhall @@ -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" } ] diff --git a/static/privacy_policy.html b/static/privacy_policy.html new file mode 100644 index 0000000..6f89a72 --- /dev/null +++ b/static/privacy_policy.html @@ -0,0 +1,172 @@ +

Privacy Policy

+

Last updated: June 25, 2021

+

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.

+

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 Privacy Policy Generator.

+

Interpretation and Definitions

+

Interpretation

+

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.

+

Definitions

+

For the purposes of this Privacy Policy:

+ +

Collecting and Using Your Personal Data

+

Types of Data Collected

+

Personal Data

+

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:

+ +

Usage Data

+

Usage Data is collected automatically when using the Service.

+

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.

+

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.

+

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.

+

Tracking Technologies and Cookies

+

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:

+ +

Cookies can be "Persistent" or "Session" 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: Cookies: What Do They Do?.

+

We use both Session and Persistent Cookies for the purposes set out below:

+ +

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.

+

Use of Your Personal Data

+

The Company may use Personal Data for the following purposes:

+ +

We may share Your personal information in the following situations:

+ +

Retention of Your Personal Data

+

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.

+

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.

+

Transfer of Your Personal Data

+

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.

+

Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.

+

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.

+

Disclosure of Your Personal Data

+

Business Transactions

+

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.

+

Law enforcement

+

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).

+

Other legal requirements

+

The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:

+ +

Security of Your Personal Data

+

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.

+

Children's Privacy

+

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.

+

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.

+

Links to Other Websites

+

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.

+

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

+

Changes to this Privacy Policy

+

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.

+

We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.

+

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.

+

Contact Us

+

If you have any questions about this Privacy Policy, You can contact us:

+