Various site updates
Published on , 2287 words, 9 minutes to read
landscape, mountains, breath of the wild, 1girl, fox ears, dark blue hair, blue eyes, surfboard, surfing, beach, simple sketch, clean lines, rakugaki - Waifu Diffusion v1.3 (float16)Hey all, just some smaller updates on my site and the infrastructure around this blog. I'm also throwing in some of my smaller project updates that I haven't gotten to on the blog.
Sonic Frontiers stream
I'm going to be streaming the game Sonic Frontiers on Twitch on November 8th, 2022 at 10:00 EDT through at least 12:00 EDT. I may go longer depending on how the game is, but I took the day off for this so I may as well take advantage of it.
If you want to add this to your calendar, you can either import the ICS file for the event or add it to Google Calendar. This is my first time pre-announcing a stream like this and I hope that this will be worth it.
Do you like "video games"? I'm going to be playing Sonic Frontiers on Twitch on its release date! Check it out at https://twitch.tv/princessxen on Tuesday, November 8th at 10:00 Eastern through at least 12:00 Eastern.
Mastodon quoting
One of the big things I've done is add support for embedding mastodon posts in a more native way. Mastodon normally has an "embed this post" link, which makes things look like this:
However, I think I can do it better. I wrote some code to serialize the mastodon post information to JSON on the disk and then I can render out toots like this:
This new watch feels great. I love how the pride edition band looks.
It also works with embedded videos:
Testing a video upload for writing something to do with Mastodon
I think this looks much cleaner. It also puts a lot less load on the Mastodon server that I use, which will certainly make Cult Pony happier.
This works by putting the mastodon data into .json
files that I ship around
with both my site's git repo and the runtime closure of my website binary. When
the HTML parser sees one of these tags:
<XeblogToot url="https://pony.social/@cadey/109258440953407431"></XeblogToot>
It looks up that toot's information on the disk and then renders that into memory. This allows me to ensure all this information is not fetched from the target Mastodon server on every page load, which should help with reducing load on the fediverse servers that I link to.
Ads enabled globally
Previously I only enabled ads for users visiting my blog from Hacker News and Reddit. These ads are done with Ethical Ads, which is done by the people behind the popular documentation service Read the Docs.
I want to stress the following things:
- The income that I get from the advertisements is being used to fund the infrastructure for this website and other hilarious projects I have in the pipeline, just like the Patreon.
- You can use an ad blocker all you want. The only thing that will happen is that you will see a "nag message" that gently asks you to not as well as linking to my Patreon. I have no way of tracking who actually blocks ads.
- I have identified a few websites that I think are cool in an attempt to not show ads when you visit from them, but the main one that I wanted to get working with this (Lobsters) appears to only sometimes give out referrer information in an effort to discourage content marketing. I am going to come up with an alternative workaround for Lobsters users to view my posts without advertising income.
- It turns out hosting video is kinda expensive.
I am working on an integration with Patreon that allows patrons to bypass ads from being shown in the blog. I have also been considering having other features like commenting on posts, but for right now I am focusing on other things.
Robocadey 2: Stable Diffusion edition
Recently I created a project named robocadey. This took all of my tweets, fed them into GPT-2 and then generated new tweets. This worked for a while, but then things fell apart due to python catastrophes and I never was able to get things working again.
Don't worry, because I have created a brand new python catastrophe using Stable Diffusion. More specifically using a variant of the Stable Diffusion model named Waifu Diffusion. Waifu Diffusion is the model that you see in most of my blog's hero images. Scrying an image out of Waifu Diffusion is similar to searching danbooru (warning, NSFW images) for images.
To use Robocadey 2, all you need to do is mention @robocadey@pony.social with a set of tags. For example, this input:
@robocadey 1girl, cute, solo, portrait, brown hair, brown eyes, long hair, smile, blush, laptop, coffee shop, katana
Will get you this output:
@cadey here is your image:
prompt: 1girl, cute, solo, portrait, brown hair, brown eyes, long hair, smile, blush, laptop, coffee shop, katana
seed: 1099521048
Generated with Waifu Diffusion v1.3 (float16)
Please do feel free to experiment with this. Keep in mind that it can only
process one image at a time (the poor 2060 in ontos
only has enough vram to do
one image at a time), so depending on load you may have to wait your turn.
I'm not sure if this is a bug or a feature, but if you reply to the bot, it'll also take that as input to generate new images:
You can find the source code here. This is not in a state that is ready for other people to use though. I don't expect it to ever get in such a state. This is an experiment that will some day stop working and that's okay.
Be sure to save images that you really like, the bot account is configured to autodelete generated images after two weeks. This means that the images in my post are going to eventually go dead too, but that's okay.
Mastodon as my main microblogging outlet
I am really not getting good vibes with the results of Elon Musk purchasing Twitter. I'm starting to post more on Mastodon at @cadey@pony.social instead. I currently have a reposting service set up to ferry posts between Mastodon and Twitter, but there is a significant delay when things get reposted. If you want things more expediently, I suggest you follow me on Mastodon.
If you see the #noxp
hashtag in either my Twitter or Mastodon posts, the
reason it is there is to stop the reposting service from reposting things.
I made a LinkedIn
I have given in and created a LinkedIn account. I really don't like how LinkedIn traps a lot of information about people, and how that information is used by attackers in order to social engineer people better. But, most of the industry expects you to have one. If I have to have one, then at least I want to do it "right". I'll be reposting my blog content there.
API endpoints
I have created a few small API endpoints for the blog. They allow you to get information about the most recent post on the blog as well as more detailed information on individual posts. I am considering these endpoints stable and I am working hard to make sure that the API compatibility will not break in future releases without proper warning.
These API calls don't have rate limits currently, but please don't be the person that makes me have to add them.
/api/new_post
This returns information about the most recent post to my blog. This will return a JSON object that contains at least the following fields:
- title - The title of the post
- summary - Either a human-readable summary of the post or the description of the estimated read time of the post
- link - The link to the post
Here is an example (piped through jq
):
{
"title": "How to make NixOS compile nginx with OpenSSL 1.x",
"summary": "3 minute read",
"link": "https://xeiaso.net/blog/nixos-nginx-openssl-1.x"
}
/api/[blog|talks]/{slug}
This returns information on a blog post by URL slug. In the blogpost URL
https://xeiaso.net/blog/nixos-nginx-openssl-1.x
, the slug is the
nixos-nginx-openssl-1.x
part. This returns the JSON Feed
Item form of the
blogpost or talk summary in question.
This also includes a custom _xesite_frontmatter
extension that will contain at
least this information:
about
(required, string) is a link to the documentation for the extension in my blog's GitHub repository. It gives readers of the JSON Feed information about what this extension does. This is for informational purposes only and can safely be ignored by programs.series
(optional, string) is the optional blogpost series name that this item belongs to. When I post multiple posts about the same topic, I will usually set theseries
to the same value so that it is more discoverable on my series index page.slides_link
(optional, string) is a link to the PDF containing the slides for a given talk. This is always set on talks, but is technically optional because not everything I do is a talk.vod
(optional, string) is an object that describes where you can watch the Video On Demand (vod) for the writing process of a post. When populated, this is an object that always contains the string fieldstwitch
andyoutube
. These will be URLs to the videos so that you can watch them on demand.
I reserve the right to add fields to this in the future, but when I do I will update the documentation accordingly.
XeDN video metrics plans
I'm considering adding some Xeact-powered JavaScript to allow me to track events on the video I'm hosting on my own infrastructure. My intent is to create some grafana graphs to track the following events:
- The video being watched to completion
- The video load being stalled
- The video is able to be played
- If HTTP Live Streaming works
I also plan to surface some of these metrics on the blog itself, namely having the video being watched to completion function as a proxy for the view count metric on YouTube.
Updates on longer projects
This is going to have some smaller updates that aren't worth their own sections.
- I am researching part 2 of my Bitcoin/Ethereum article that I'll be writing with Open Skies again. We plan to have this article cover smart contracts, how to use them, why you would want to use them, and what problems they have when they intersect with the "real world". At this point I'm almost certain that calling them "contracts" is a misnomer that is misleading enough to be observably harmful.
- waifud is still in progress, I am currently stalled on the metadata API. I
can't figure out how to make the libvirt virtual machine connect to the new
metadata service
isekaid
without either the flow being rejected or libvirt NAT-ing the connection. I am trying to get a direct connection to either169.254.169.254
orfc00::da1a
(data) so that virtual machines can use that to bootstrap cloud-init. If anyone has ideas, please contact me. I hope to have this usable for other people by the end of the year. Please let me know if you want to be an early beta tester. - I have been planning out ideas for a completely AI generated image booru like danbooru, e621, Derpibooru or Furbooru. I want to create this as a demonstration of what image generation technology could be able to do if this technology was a bit more efficient. I don't expect this to be ready any time soon, and when it is ready I will likely be limiting it heavily.
- XeDN needs to be rewritten to have a better caching strategy. Right now it does work but it has a slight habit of totally falling over at the worst possible times. Browsers retry things, so it's not realistically as bad as you'd think.
- My blog is built using Nix flakes now. I need to finish migrating my last cloud server over to flakes.
- My blog is being served with LibreSSL instead of OpenSSL 3.x. I plan to write
about how you can use
system.replaceRuntimeDependencies
to mitigate the OpenSSL vulnerability with the patched version of OpenSSL on Tuesday, when the patch is released. I don't know if the OpenSSL bug is going to be super bad, but if it is then I get to show off a neat trick with NixOS so it's win/win in my book.
And that's what's going on in my world! Hope this was an interesting look into all of the things that I'm tinkering with and working on for my personal projects. Hopefully things will settle down once I get someone to help me do DevRel at Tailscale. I've hit a point where I'm not able to do everything on my own anymore and if you want to help make things happen, please apply to that role.
Be well!
Facts and circumstances may have changed since publication. Please contact me before jumping to conclusions if something seems wrong or unclear.
Tags: mastodon, stream, sonicfrontiers, robocadey, noxp