The code and data behind xeiaso.net
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

Broken links (#574)

* Replace broken link to wasmcloud.app

* Replace broken link to dumbotaku.com with the Wayback Machine

* Replace broken link to oddcode.daveamit.com with the Wayback Machine

* Fix broken link to tokipona.net

* Fix broken link to github.com/Xe/waifud

* Fix broken link to cloud.debian.org

* Replace broken link to rust-for-linux.github.io with the Wayback Machine

* Fix broken link to ohmyposh.dev

* Replace broken link to docs.vrchat.com with the Wayback Machine

* Replace broken link to learning-rust.github.io

* Fix broken links to tulpa.dev/cadey/printerfacts

* Fix broken links to github.com/Xe/nixos-configs

* Fix broken link to tulpa.dev/cadey/gitea-release

* Replace broken link to lojban.pw with the Wayback Machine

* Remove broken link to printerfacts.cetacean.club

* Remove broken links to home.cetacean.club

* Replace broken link to caddyserver.com with the Wayback Machine

authored by

Stephen Wade and committed by
GitHub
7b1e0e83 605ddfa9

+58 -57
+7 -7
blog/TLDR-rust-2020-09-19.markdown
··· 80 80 if some_cond { 81 81 2 82 82 } 83 - 83 + 84 84 4 85 85 } 86 86 ``` ··· 125 125 The [Result](https://doc.rust-lang.org/std/result/) type represents things that 126 126 can fail with specific errors. The [eyre Result 127 127 type](https://docs.rs/eyre) represents things that can fail 128 - with any error. For readability, this post will use the eyre Result type. 128 + with any error. For readability, this post will use the eyre Result type. 129 129 130 130 [The angle brackets in the `Result` type are arguments to the type, this allows 131 131 the Result type to work across any type you could imagine.](conversation://Mara/hacker) ··· 137 137 if y == 0 { 138 138 return 0, errors.New("cannot divide by zero") 139 139 } 140 - 140 + 141 141 return x / y, nil 142 142 } 143 143 ``` ··· 236 236 if err != nil { 237 237 return 0, err 238 238 } 239 - 239 + 240 240 return result, nil 241 241 } 242 242 ``` ··· 544 544 - String, an owned UTF-8 string 545 545 - PathBuf, a filepath string (encoded in whatever encoding the OS running this 546 546 code uses for filesystems) 547 - 547 + 548 548 The strings are different types for safety reasons. See the linked blogpost for 549 549 more detail about this. 550 550 ··· 614 614 fn math_works() { 615 615 assert_eq!(2 + 2, 4); 616 616 } 617 - 617 + 618 618 #[tokio::test] // needs tokio as a dependency 619 619 async fn http_works() { 620 620 let _ = get_html("https://within.website").await.unwrap(); ··· 626 626 `unwrap()` in production code can cause the server to crash and can incur data 627 627 loss. 628 628 629 - [Alternatively, you can also use the <a href="https://learning-rust.github.io/docs/e4.unwrap_and_expect.html#expect">`.expect()`</a> method instead 629 + [Alternatively, you can also use the <a href="https://doc.rust-lang.org/std/error/index.html#common-message-styles">`.expect()`</a> method instead 630 630 of `.unwrap()`. This lets you attach a message that will be shown when the 631 631 result isn't Ok.](conversation://Mara/hacker) 632 632
+6 -6
blog/cloud-init-2021-06-04.markdown
··· 20 20 a coworker wrote that allows users to automatically install Tailscale on every 21 21 distro and version Tailscale supports. I wanted to try and avoid having to 22 22 install each version of every distribution manually, so I started looking for 23 - options. 23 + options. 24 24 25 25 [This may seem like overkill (and at some level it probably is), however as a 26 26 side effect of going through this song and dance you can spin up a bunch of VMs ··· 80 80 groups: [ wheel ] 81 81 sudo: [ "ALL=(ALL) NOPASSWD:ALL" ] 82 82 shell: /bin/bash 83 - ssh-authorized-keys: 83 + ssh-authorized-keys: 84 84 - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPYr9hiLtDHgd6lZDgQMkJzvYeAXmePOrgFaWHAjJvNU cadey@ontos 85 85 86 86 write_files: ··· 94 94 Please make sure to change the username and swap out the SSH key as needed, 95 95 unless you want to get locked out of your VM. For more information about what 96 96 you can do from cloud-init, see the list of modules 97 - [here](http://cloudinit.readthedocs.io/en/latest/topics/modules.html). 97 + [here](http://cloudinit.readthedocs.io/en/latest/topics/modules.html). 98 98 99 99 Now that you have the two yaml files you can make the seed image with this 100 100 command (Linux): ··· 378 378 one) 379 379 - [CentOS 8](https://cloud.centos.org/centos/8-stream/x86_64/images/) (use the 380 380 `GenericCloud` one) 381 - - [Debian 9](http://cloud.debian.org/images/cloud/OpenStack/9.13.22-20210531/) 381 + - [Debian 9](https://cloud.debian.org/images/cloud/OpenStack/current-9/) 382 382 (use the `openstack` one) 383 - - [Debian 10](http://cloud.debian.org/images/cloud/buster/20210329-591/) (use 383 + - [Debian 10](https://cloud.debian.org/images/cloud/buster/latest/) (use 384 384 the `generic` one) 385 - - [Debian 11](http://cloud.debian.org/images/cloud/bullseye/daily/) (use the 385 + - [Debian 11](https://cloud.debian.org/images/cloud/bullseye/latest/) (use the 386 386 `generic` one) 387 387 - [Fedora 34](https://alt.fedoraproject.org/cloud/) (use the Openstack image) 388 388 - [OpenSUSE Leap
+1 -1
blog/convoluted-vrchat-gchat-setup-2021-02-24.markdown
··· 129 129 </center> 130 130 131 131 Then with some clever use of the 132 - [Chroma key filter in VRChat](https://docs.vrchat.com/docs/vrchat-201812) 132 + [Chroma key filter in VRChat](https://web.archive.org/web/20180612173651/https://docs.vrchat.com/docs/vrchat-201812) 133 133 I was able to get some basic compositing of my avatar onto the picture. I 134 134 fiddled with the placement of things and then I was able to declare success 135 135 with this image I posted to Twitter:
+6 -6
blog/dev-printerfact-2021-04-17.markdown
··· 41 41 - A way to run tests to ensure that kernel is behaving cromulently 42 42 - A way to be able to _repeat_ these tests on another machine to be more certain 43 43 that the thing you made works more than once 44 - 44 + 45 45 To aid in that first step, the Rust for Linux team shipped a [Nix 46 46 config](https://github.com/Rust-for-Linux/nix) to let you `nix-build -A kernel` 47 47 yourself a new kernel whenever you wanted. So let's do that and see what ··· 182 182 ## Ensuring Cromulence 183 183 184 184 > A noble spirit embiggens the smallest man. 185 - > 185 + > 186 186 > I've never heard of the word "embiggens" before. 187 187 > 188 188 > I don't know why, it's a perfectly cromulent word ··· 361 361 println!("user attempted to read from the file!"); 362 362 363 363 Ok(0) 364 - } 364 + } 365 365 } 366 366 367 367 struct PrinterFacts { ··· 466 466 fn get_fact(&self) -> KernelResult<&'static str> { 467 467 let mut ent = [0u8; 1]; // Mara\ declare a 1-sized array of bytes 468 468 kernel::random::getrandom(&mut ent)?; // Mara\ fill it with entropy 469 - 469 + 470 470 Ok(FACTS[ent[0] as usize % FACTS.len()]) // Mara\ return a random fact 471 471 } 472 472 } ··· 556 556 for chara in characters: 557 557 if "a" in chara: 558 558 a_tier.append(chara) 559 - 559 + 560 560 print(a_tier) 561 561 ``` 562 562 ··· 619 619 ``` 620 620 621 621 Oh dear. It's failing. Let's take a closer look at that 622 - [FileOperations](https://rust-for-linux.github.io/docs/kernel/file_operations/trait.FileOperations.html) 622 + [FileOperations](https://web.archive.org/web/20210621170531/https://rust-for-linux.github.io/docs/kernel/file_operations/trait.FileOperations.html) 623 623 trait and see if there are any hints. It looks like the 624 624 `declare_file_operations!` macro is setting the `TO_USE` constant somehow. Let's 625 625 see what it's doing under the hood:
+3 -3
blog/drone-kubernetes-cd-2020-07-10.markdown
··· 48 48 49 49 naersk = pkgs.callPackage sources.naersk { }; 50 50 gruvbox-css = pkgs.callPackage sources.gruvbox-css { }; 51 - 51 + 52 52 pfacts = naersk.buildPackage { 53 53 inherit src; 54 54 remapPathPrefix = true; ··· 117 117 Hub](https://hub.docker.com/repository/docker/xena/printerfacts/tags). 118 118 119 119 I have a drone manifest that looks like 120 - [this](https://tulpa.dev/cadey/printerfacts/src/branch/master/.drone.yml): 120 + [this](https://tulpa.dev/cadey/printerfacts/src/commit/6d152cde84fc8a6424d438b6c75fe9216801c972/.drone.yml): 121 121 122 122 ```yaml 123 123 kind: pipeline ··· 280 280 for generating the Kubernetes manifest (see 281 281 [here](https://xeiaso.net/blog/dhall-kubernetes-2020-01-25)) and then 282 282 runs 283 - [`scripts/release.sh`](https://tulpa.dev/cadey/printerfacts/src/branch/master/scripts/release.sh): 283 + [`scripts/release.sh`](https://tulpa.dev/cadey/printerfacts/src/commit/6d152cde84fc8a6424d438b6c75fe9216801c972/scripts/release.sh): 284 284 285 285 ``` 286 286 #!/usr/bin/env nix-shell
+1 -1
blog/gitea-release-tool-2020-05-31.markdown
··· 126 126 This allows me to bump the `VERSION` and `CHANGELOG.md`, then push that commit 127 127 to git and a new release will automatically be created. You can see how the 128 128 `CHANGELOG.md` file grows with the [CHANGELOG of 129 - gitea-release](https://tulpa.dev/cadey/gitea-release/src/branch/master/CHANGELOG.md). 129 + gitea-release](https://tulpa.dev/cadey/gitea-release/src/branch/main/CHANGELOG.md). 130 130 131 131 Once the release is pushed to gitea, you can then use drone to trigger 132 132 deployment commands. For example here is the deployment pipeline used to
+1 -2
blog/how-i-start-rust-2020-03-15.markdown
··· 443 443 444 444 And [open the swagger UI](http://127.0.0.1:8000/swagger-ui/) in your favorite 445 445 browser. This will show you a graphical display of all of the routes and the 446 - data types in your service. For an example, see 447 - [here](https://printerfacts.cetacean.club/swagger-ui/index.html). 446 + data types in your service. 448 447 449 448 ## Error responses 450 449
+4 -4
blog/i-was-wrong-about-nix-2020-02-10.markdown
··· 49 49 [static executable][staticbin]), and creates the runtime environment for it. 50 50 51 51 [godockerfile]: https://github.com/Xe/dockerfiles/blob/master/lang/go/Dockerfile 52 - [staticbin]: https://oddcode.daveamit.com/2018/08/16/statically-compile-golang-binary/ 52 + [staticbin]: https://web.archive.org/web/20220504183916/https://oddcode.daveamit.com/2018/08/16/statically-compile-golang-binary/ 53 53 54 54 Let's let it build and see how big the result is: 55 55 ··· 70 70 binary was _statically linked_ to specifically avoid this) 71 71 - Most of the files in the docker image are unrelated to my website's 72 72 functionality and are involved with the normal functioning of Linux systems 73 - 73 + 74 74 Granted, [Alpine Linux][alpine] does a good job at keeping this chaff to a 75 75 minimum, but it is still there, still needs to be updated (causing all of my 76 76 docker images to be rebuilt and applications to be redeployed) and still takes ··· 248 248 xena/christinewebsite latest 0d1ccd676af8 50 years ago 94.6MB 249 249 ``` 250 250 251 - And the output is 16 megabytes smaller. 251 + And the output is 16 megabytes smaller. 252 252 253 253 The image age might look weird at first, but it's part of the reproducibility 254 254 Nix offers. The date an image was built is something that can change with time ··· 272 272 And that's it. This is _fantastic_. Nearly all of the disk usage has been 273 273 eliminated. If someone manages to trick my website into executing code, that 274 274 attacker cannot do anything but run more copies of my website (that will 275 - immediately fail and die because the port is already allocated). 275 + immediately fail and die because the port is already allocated). 276 276 277 277 This strategy pans out to more complicated projects too. Consider a case where a 278 278 frontend and backend need to be built and deployed as a unit. Let's create a new
+1 -1
blog/lipu-pi-o-wawa-e-lukin-2018-10-14.markdown
··· 68 68 69 69 --- 70 70 71 - This post is written primarily in [toki pona](http://tokipona.net/tp/Default.aspx), 71 + This post is written primarily in [toki pona](https://tokipona.org/), 72 72 or the language of good. It is a constructed language that is minimal (only about 73 73 120 words in total) yet it is enough to express just about every practical day to 74 74 day communication need. [It's also small enough there's tokenizers for it](https://github.com/Xe/x/blob/master/web/tokiponatokens/toki_pona.go).
+4 -4
blog/reconlangmo-1-name-ctx-history-2020-05-05.markdown
··· 16 16 [Klingon][tlhnganhol] from the Star Trek series, the [various forms of 17 17 Elvish][elvish] as described by J. R. R. Tolkien or [Dothraki][dothraki] from 18 18 Game of Thrones. This series will show an example of how one of those kinds of 19 - languages are created. 19 + languages are created. 20 20 21 21 [conlangs]: https://en.wikipedia.org/wiki/Constructed_language 22 22 [tlhnganhol]: https://en.wikipedia.org/wiki/Klingon_language ··· 68 68 - A decorative script that I'll turn into a font 69 69 70 70 [seximal]: https://www.seximal.net 71 - [lojban]: https://lojban.pw/cll/uncll-1.2.6/xhtml_section_chunks/chapter-tour.html#section-bridi 71 + [lojban]: https://web.archive.org/web/20200928095138/https://lojban.pw/cll/uncll-1.2.6/xhtml_section_chunks/chapter-tour.html 72 72 [salishan]: https://en.wikipedia.org/wiki/Salishan_languages 73 73 [apriori]: https://en.wikipedia.org/wiki/Constructed_language#A_priori_and_a_posteriori_languages 74 74 ··· 88 88 created for myself to archive my personal thoughts, they probably deserve to be 89 89 able to read them. Otherwise, this would allow me to write my diary from pretty 90 90 much anywhere, even in plain sight out in public. People can't shoulder-surf and 91 - read what they literally cannot understand. 91 + read what they literally cannot understand. 92 92 93 93 --- 94 94 95 95 I plan to continue going through this series as the prompts come out and will 96 96 put my responses on my blog along with explanations, analysis and sample code 97 97 (where relevant). I will probably also reformat these posts (and relevant 98 - dictionary files) to an eBook and later into a reference grammar book. 98 + dictionary files) to an eBook and later into a reference grammar book. 99 99 100 100 Like I said though, this project is for myself. I do not expect this language to 101 101 change the world for anyone but me. Let's see where this rabbit hole goes.
+11 -12
blog/rtmp-server-setup-2020-01-11.markdown
··· 7 7 - live-streaming 8 8 --- 9 9 10 - I have set up my own [RTMP][rtmp] server that allows me to live stream to [my own 11 - infrastructure][streampage]. This allows me to own my own setup and not need to 10 + I have set up my own [RTMP][rtmp] server that allows me to live stream to my own 11 + infrastructure. This allows me to own my own setup and not need to 12 12 rely on other services such as Twitch or YouTube. As a side effect of doing 13 13 this, I can enable people who use my streaming server to use picture-in-picture 14 14 mode in iPadOS without having to hack the streaming app, among other things. ··· 17 17 platforms as much as possible. 18 18 19 19 [rtmp]: https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol 20 - [streampage]: https://home.cetacean.club/stream 21 20 22 21 I chose to do my setup with a few key parts: 23 22 ··· 58 57 59 58 ## stream.html 60 59 61 - I have a custom stream page set up [on my server][streampage] that has a 60 + I have a custom stream page set up on my server that has a 62 61 friendly little wrapper to the video player. [Here][streamhtml] is the source 63 62 code for it. It's very short and easy to follow. I have these files at 64 63 `/srv/http/home.cetacean.club` on my VPN server. 65 64 66 65 This wraps [hls.js][hlsjs] so that users on every browser I care to support can 67 - watch the stream as it happens. 66 + watch the stream as it happens. 68 67 69 68 ## Caddy 70 69 ··· 76 75 # Set up automagic Let's Encrypt 77 76 tls me@xeiaso.net 78 77 79 - # Proxy the playlist, stream data 78 + # Proxy the playlist, stream data 80 79 # and statistics to the rtmp server 81 80 proxy /hls http://127.0.0.1:8080 82 81 proxy /live http://127.0.0.1:8080 ··· 84 83 85 84 # make /stream.html show up as /stream 86 85 ext .html 87 - 86 + 88 87 # serve data out of /srv/http/home.cetacan.club 89 88 # you can put your HTTP document root 90 89 # anywhere you want, but I like it being ··· 96 95 For more information on the Caddy configuration directives used here, see the 97 96 following: 98 97 99 - - [tls](https://caddyserver.com/v1/docs/tls) 100 - - [proxy](https://caddyserver.com/v1/docs/proxy) 101 - - [ext](https://caddyserver.com/v1/docs/ext) 102 - - [root](https://caddyserver.com/v1/docs/root) 98 + - [tls](https://web.archive.org/web/20200505225233/https://caddyserver.com/v1/docs/tls) 99 + - [proxy](https://web.archive.org/web/20200505225233/https://caddyserver.com/v1/docs/proxy) 100 + - [ext](https://web.archive.org/web/20200505225233/https://caddyserver.com/v1/docs/ext) 101 + - [root](https://web.archive.org/web/20200505225233/https://caddyserver.com/v1/docs/root) 103 102 104 103 ## Caveats 105 104 ··· 114 113 manually on social media platforms. 115 114 116 115 I hope this little overview of my setup was informative. I'll be 117 - streaming [there][streampage] very irregularly, mostly as time permits/the 116 + streaming there very irregularly, mostly as time permits/the 118 117 spirit moves me. I plan to stream art, gaming and code. 119 118 120 119 Thanks for reading, have a good day.
+3 -2
blog/various-updates-2020-11-18.markdown
··· 201 201 If you would like to have a call with me for examining your process for building 202 202 Docker images in CI and get a list of actionable suggestions for how to work 203 203 around this, [contact me](/contact) so that we can discuss pricing and 204 - scheduling. 204 + scheduling. 205 205 206 206 I have been using Docker for my entire professional career (way back since 207 207 Docker required you to recompile your kernel to enable cgroup support in public ··· 216 216 Here's hoping that the immigration purgatory ends soon. I'm lucky enough to have 217 217 enough cash built up that I can weather this jobless month. I've been using this 218 218 time to work on personal projects (like mi and 219 - [wasmcloud](https://wasmcloud.app)) and better myself. I've also done a little 219 + [wasmcloud](https://tulpa.dev/within/wasmcloud)) and better myself. 220 + I've also done a little 220 221 writing that I plan to release in the future after I clean it up. 221 222 222 223 In retrospect I probably should have done [NaNoWriMo](https://nanowrimo.org/)
+2 -1
blog/vtubing-linux-2021-01-15.markdown
··· 75 75 catastrophe. 76 76 77 77 Other people have reported that you need to use 78 - [Lutris](https://dumbotaku.com/info/401) to install and use VSeeFace on Linux. 78 + [Lutris](https://web.archive.org/web/20220830184802/https://dumbotaku.com/info/401) 79 + to install and use VSeeFace on Linux. 79 80 This did not work. This did not work at all. Trying to do it this way on a NixOS 80 81 machine was an absolute waste of my time and was demoralizing and frustrating. 81 82
+4 -3
blog/waifud-plans-2021-06-19.markdown
··· 62 62 permissive [Be Gay, Do Crimes](https://github.com/Xe/waifud/blob/main/LICENSE) 63 63 license, which should sufficiently scare people away for now while I implement 64 64 the service. The biggest thing in the repo right now is 65 - [`mkvm`](https://github.com/Xe/waifud/tree/main/cmd/mkvm), which is essentially 65 + [`mkvm`](https://github.com/Xe/waifud/tree/df8e362034e3923158813a9260cf9d3cf399ebf6/cmd/mkvm), 66 + which is essentially 66 67 the prototype of this project. It downloads a cloud template, injects it into a 67 68 ZFS zvol and then configures libvirt to use that ZFS zvol as the root filesystem 68 - of the virtual machine. 69 + of the virtual machine. 69 70 70 71 This tool works great and I use it very often both personally and in work 71 72 settings, however one of the biggest problems that it has is that it assumes ··· 77 78 78 79 I would also like to have some kind of web management interface for waifud. 79 80 Historically frontend web development has been one of my biggest weaknesses. I 80 - would like to use [Alpine.js](https://alpinejs.dev) to make an admin panel. 81 + would like to use [Alpine.js](https://alpinejs.dev) to make an admin panel. 81 82 82 83 At a high level, I want waifuctl to have the following features: 83 84
+2 -2
blog/why-i-use-suckless-tools-2020-06-05.markdown
··· 138 138 139 139 The rest of my desktop environment is built up using a few other tools that 140 140 build on top of dwm. You can see the NixOS modules I've made for it 141 - [here](https://github.com/Xe/nixos-configs/blob/master/common/programs/dwm.nix) 142 - and [here](https://github.com/Xe/nixos-configs/blob/master/common/users/cadey/dwm.nix): 141 + [here](https://github.com/Xe/nixos-configs/blob/f9303523e0eacd75aef96c55626d6aac3c04007f/common/programs/dwm.nix) 142 + and [here](https://github.com/Xe/nixos-configs/blob/f9303523e0eacd75aef96c55626d6aac3c04007f/common/users/cadey/dwm.nix): 143 143 144 144 - [xrandr](https://wiki.archlinux.org/index.php/Xrandr) to set up my multiple 145 145 monitors and rotation for them
+1 -1
blog/windows-pain-2021-03-03.markdown
··· 242 242 I use stuff cribbed from [oh my fish](https://github.com/oh-my-fish/oh-my-fish) 243 243 for my fish prompt. I googled "oh my powershell" and hoped I would get lucky 244 244 with finding some nice batteries-included tools. 245 - [I got lucky](https://ohmyposh.dev/docs/installation/). 245 + [I got lucky](https://ohmyposh.dev/docs). 246 246 247 247 After looking through the options I saw a theme named `sorin` that looks like 248 248 this:
+1 -1
talks/thinking-different-2018-11-03.markdown
··· 6 6 7 7 # Thinking Different 8 8 9 - A look over [ilo Kesi](https://github.com/Xe/x/tree/master/discord/ilo-kesi), a chatbot of mine that parses commands from the grammar of [Toki Pona](http://tokipona.org). 9 + A look over [ilo Kesi](https://github.com/Xe/x/tree/master/discord/ilo-kesi), a chatbot of mine that parses commands from the grammar of [Toki Pona](https://tokipona.org). 10 10 11 11 Originally presented privately at an internal work get-together for Heroku.