432 lines
15 KiB
HTML
432 lines
15 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.4, although 0.5 is well in development at this
|
|
point. Plans for the 0.5 release include enabling high-availability with a postgres
|
|
backend. The current backend for metadata is an embedded key-value store called
|
|
<a href="https://github.com/spacejam/sled" target="_blank">#sled</a>. Sled is not going
|
|
away for pict-rs, but supporting multiple metadata repositories has been a goal I've been
|
|
working towards for a while.
|
|
</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>
|