personal-site/index.html
asonix b3bc1fe0ec
All checks were successful
/ publish (push) Successful in 5s
Update pict-rs block
2024-02-11 15:32:04 -06:00

432 lines
14 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta content="width=device-width,initial-scale=1" name="viewport" />
<title>asonix.dog</title>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<meta property="description" content="Meet the dog/lion/whatever" />
<meta property="og:description" content="Meet the dog/lion/whatever" />
<meta property="twitter:description" content="Meet the dog/lion/whatever" />
<style>
* {
box-sizing: border-box;
}
body {
background-color: #fff;
background-image: url('/pinkliom-small2.png');
background-position: bottom right;
background-repeat: no-repeat;
color: #000;
display: flex;
flex-direction: row-reverse;
flex-wrap: wrap;
font-family: sans-serif;
font-size: 16px;
height: 100vh;
margin: 0;
}
h1 {
font-size: 26px;
}
h2 {
font-size: 24px;
}
h3 {
font-size: 22px;
}
h4 {
font-size: 20px;
}
h5 {
font-size: 18px;
}
h6 {
font-size: 16px;
}
nav {
background-color: #f5f5f5;
border-right: 1px solid #dddddd;
color: #000;
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: 100%;
min-width: 200px;
overflow-y: hidden;
padding: 16px;
}
nav a,
nav a:visited {
color: #232323;
}
nav a:focus,
nav a:hover,
nav a:visited:focus,
nav a:visited:hover {
color: #000;
}
header ul {
list-style: none;
padding: 0;
margin: 0;
}
header a {
display: block;
font-size: 20px;
font-weight: 600;
padding: 2px 0;
}
footer p {
font-size: 13px;
max-width: 180px;
}
main {
flex: 1;
min-width: 500px;
max-height: 100%;
overflow-y: auto;
}
main a,
main a:visited {
color: #e10862;
}
main a:focus,
main a:hover,
main a:visited:focus,
main a:visited:hover {
color: #a90649;
}
main p {
line-height: 20px;
}
.overlay {
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
background-color: #ffffffcb;
max-width: 800px;
min-height: 100%;
}
section {
padding: 16px;
}
.web-environment-integrity-message {
display: none;
}
section.web-environment-integrity-message {
background-color: lightyellow;
color: #000;
}
@media (prefers-color-scheme: dark) {
body {
background-color: #232323;
color: #ccc;
}
body h1,
body h2,
body h3,
body h4,
body h5,
body h6,
nav h1,
nav h2,
nav h3,
nav h4,
nav h5,
nav h6 {
color: #e5e5e5;
}
nav {
background-color: #1a1a1a;
border-right: 1px solid #333333;
color: #ccc;
}
nav a,
nav a:visited {
color: #e5e5e5;
}
nav a:focus,
nav a:hover,
nav a:visited:focus,
nav a:visited:hover {
color: #fff;
}
.overlay {
background-color: #232323dd;
}
main a,
main a:visited {
color: #ff8dbc;
}
main a:focus,
main a:hover,
main a:visited:focus,
main a:visited:hover {
color: #ffd3e5;
}
}
@media (max-width: 700px) {
body {
display: block;
height: auto;
}
nav {
background-image: url('/pinkliom-small2.png');
background-repeat: no-repeat;
background-position: bottom right;
min-height: auto;
width: 100%;
overflow-x: auto;
}
main {
min-width: 300px;
max-height: none;
}
}
</style>
</head>
<body>
<main>
<div class="overlay">
<section class="web-environment-integrity-message">
<h1>Your browser contains Google DRM</h1>
<article>
<p>
"Web Environment Integrity" is a Google euphemism for a DRM that is designed to prevent
ad-blocking. In support of an open web, this website does not function with this DRM.
Please install a browser such as
<a href="https://www.mozilla.org/en-US/firefox/new/">Firefox</a> that respects your
freedom and supports ad blockers.
</p>
<p>
Please note that although other browsers such as Vivaldi, Opera, Microsoft Edge, Brave,
and Chromium exist, they are all built from the same Google Chromium codebase and all
inherit the problems of Google's web dominance. The only real options outside of Chrome
are Firefox and Safari.
</p>
</article>
</section>
<section class="main-content">
<h1>Bio</h1>
<article>
<p>
I'm an internet pinkliom with a fondness for types. Find me at the local coffee shop
writing <a href="https://rust-lang.org" target="_blank">#rust</a> and sometimes
<a href="https://elm-lang.org" target="_blank">#elm</a>. I also enjoy single-board
computers. I run my services on a small cluster of boards from
<a href="https://pine64.org" target="_blank">#pine64</a> out of my apartment over a
residential internet connection. If this page took a while to load, that might be why.
</p>
<p>
I have many characters, most of whom are some kind of cat. Because of this, I have many
names as well. People call me asonix (my username on most platforms), Aode (the pinkliom
himself), Tavi, and Arlo, although there's more names that are less common.
</p>
</article>
</section>
<section class="main-content">
<h1>Notable Projects</h1>
<article>
<h3>pict-rs</h3>
<p>
<em>
<a href="https://git.asonix.dog/asonix/pict-rs" target="_blank">
pict-rs on Forgejo
</a>
</em>
</p>
<p>
pict-rs is a simple image hosting service. It started in 2020 as a replacement for
<a href="https://github.com/HaschekSolutions/pictshare" target="_blank">#pictshare</a> in
<a href="https://github.com/LemmyNet/lemmy/" target="_blank">#Lemmy</a>, a federated
reddit alternative. While I have contributed to Lemmy in the past, and pict-rs grew out of
a need for a better image hosting solution, pict-rs is an independent project that I
maintain for use outside of Lemmy. One of my goals is to build a federated art gallery
platform, and having solid image hosting is an important part of that goal.
</p>
<p>
The current stable series for pict-rs is 0.5, and I plan on supporting this release for
the forseeable future. I'm going to try to add additional features in future 0.5.x
releases, rather than publishing a new breaking release. 0.5 has gotten pict-rs to a
point where I'm pretty happy both with the design and the functionality, which might
mean that the next release could be a 1.0. We'll find out if and when it happens.
</p>
</article>
<article>
<h3>AodeRelay</h3>
<p>
<em>
<a href="https://git.asonix.dog/asonix/relay" target="_blank">
AodeRelay on Forgejo
</a>
</em>
</p>
<p>
AodeRelay was my first real fediverse project. It's an
<a href="https://www.w3.org/TR/activitypub/" target="_blank">#ActivityPub</a> server whose
purpose is to forward posts between other subscribed servers. I built this initially to
learn more about ActivityPub, while also contributing to the greater ActivityPub
ecosystem. My own instance of this relay forwards about 7 messages every minute, which
doesn't seem like much, but it translates to 700 outbound requests per minute (one for
each subscribed server for each message), totalling around 1 million outbound requests per
day. It does this with a limit of two CPUs on one of my single-board computers.
</p>
</article>
<article>
<h3>Safe Async</h3>
<p>
<em>
<a href="https://git.asonix.dog/safe-async" target="_blank">
Safe Async on Forgejo
</a>
</em>
</p>
<p>
Safe Async is a collection of components that make up a full asynchronous runtime for
rust, made without any unsafe code. This is more a demonstration of possibility rather
than an attempt to build a real production-grade runtime. Safe Async achieves this by
relying on
<a href="https://github.com/bytecodealliance/rustix" target="_blank">#rustix</a>, a
library that provides safe bindings to posix APIs like <code>poll</code>.
</p>
<p>
Safe Async is made of multiple components. At the lowest level, the <code>polldance</code>
library provides an abstraction for registering and deregistering IO sources and Timers
from an underlying polling mechanism. Next up from that is <code>foxtrot</code>, a library
that uses polldance to create and wake IO futures with polldance. Up from there are
<code>jitterbug</code> and <code>bachata</code>, which are multithreaded and
single-threaded async executors that can be driven as futures on another runtime. And
finally, there's <code>jive</code>. A full async runtime that combines the above libraries
to provide a unified API for spawning and running tasks with IO.
</p>
<p>
Safe Async also provides a number of utilities that are useful for working in async rust,
like an implementation of select, join, join-all, notify, and mpsc. Simple integrations
are provided with trust-dns (jive-dns) for asynchronous DNS resolution and hyper
(hyperjive) for asynchronous HTTP clients and servers.
</p>
</article>
<article>
<h3>VectorDB</h3>
<p>
<em>
<a href="https://git.asonix.dog/asonix/vectordb">
VectorDB on Forgejo
</a>
</em>
</p>
<p>
VectorDB is a simple database for storing and searching vectors in Rust, backed by
<a href="https://www.redb.org" target="_blank">#redb</a>, an embedded key-value store for
rust (similar to sled). My goal in building VectorDB was to implement reverse image search
functionality for pict-rs, or maybe as a standalone application that works with pict-rs.
While the database itself is pretty quick for finding similar vectors, actually computing
those vectors using imagemagick takes a while. For this reason I am not currently pursuing
reverse image search.
</p>
</article>
<article>
<h3>Various Libraries</h3>
<p>
In addition to the applications mentioned above, I maintain a few notable libraries:
</p>
<ul>
<li>
<a href="https://git.asonix.dog/asonix/activitystreams" target="_blank">activitystreams</a>,
a library for parsing and generating valid ActivityStreams JSON objects
</li>
<li>
<a href="https://git.asonix.dog/asonix/actix-form-data" target="_blank">actix-form-data</a>,
a library for handling uploaded <code>multipart/formdata</code> in actix-web
</li>
<li>
<a href="https://git.asonix.dog/asonix/actix-webfinger" , target="_blank">actix-webfinger</a>,
a library for making and serving requests for webfinger in actix-web
</li>
<li>
<a href="https://git.asonix.dog/asonix/actix-actorless-websockets" target="_blank">actix-ws</a>,
a library for managing websocket connections in actix-web without the actix actor framework
</li>
<li>
<a href="https://git.asonix.dog/asonix/background-jobs" target="_blank">background-jobs</a>,
a library for managing retryable tasks that run in the background of an application
</li>
<li>
<a href="https://git.asonix.dog/asonix/http-signature-normalization"
target="_blank">http-signature-normalization</a>,
a library implementing the HTTP Signatures IETF draft
</li>
<li>
<a href="https://git.asonix.dog/asonix/tracing-awc" target="_blank">tracing-awc</a>, a
library for adding traces to the awc HTTP client library
</li>
</ul>
<p>
These libraries are mostly in service of building federated web applications, although the
<code>actix-ws</code> library was created just to see if I could.
</p>
</article>
</section>
</div>
</main>
<nav>
<header>
<h1>Links</h1>
<ul class="main-content">
<li><a href="https://asonix.dog" target="_blank">Home</a></li>
<li><a href="https://blog.asonix.dog" target="_blank">Blog</a></li>
<li><a href="https://git.asonix.dog/asonix" target="_blank">Software</a></li>
<li><a href="https://masto.asonix.dog/@asonix" rel="me" target="_blank">Mastodon</a></li>
<li><a href="https://matrix.to/#/@asonix:matrix.asonix.dog" target="_blank">Matrix</a></li>
<li><a href="https://t.me/asonix" target="_blank">Telegram</a></li>
<li><a href="https://www.furaffinity.net/user/asonix" target="_blank">Furaffinity</a></li>
</ul>
<ul class="web-environment-integrity-message">
<li><a href="https://www.mozilla.org/en-US/firefox/new/">Firefox</a></li>
</ul>
</header>
<footer>
<p>
favicon by <a href="https://weirder.earth/@dzuk" target="_blank">dzuk</a>. background image by ruca.
</p>
</footer>
</nav>
<script>
if (navigator.getEnvironmentIntegrity !== undefined) {
document.querySelectorAll('.web-environment-integrity-message').forEach((elem) => elem.setAttribute("style", "display: block;"));
document.querySelectorAll('.main-content').forEach((elem) => elem.setAttribute("style", "display: none;"));
}
</script>
</body>
</html>