update website

This commit is contained in:
trimill 2024-05-12 19:21:34 -04:00
parent c6495852ba
commit 354e41873a
Signed by: trimill
GPG key ID: 4F77A16E17E10BCB
17 changed files with 441 additions and 319 deletions

View file

@ -6,7 +6,7 @@ timestamp: 2022-06-01T00:00:00-04:00
Much like any ordinary child, I spent much of my childhood watching math videos on YouTube. During this time I discovered many channels that you might already be familiary with: [3Blue1Brown](https://www.youtube.com/c/3blue1brown), [Numberphile](https://www.youtube.com/user/numberphile), [Stand-up Maths](https://www.youtube.com/user/standupmaths), and many, many others. I credit these videos with inspiring me to continue my fascination with mathematics. However, one of these channels rises above all others in terms of how it shaped me: [Vihart](https://www.youtube.com/user/Vihart).
Vi's videos, although lacking in pixels, more than make up for it with their humor, art, music, and beautiful introductions into various mathematics concepts that one would be lucky to even mention in a school curriculum. These videos introduced me to [$$ \tau $$](https://www.youtube.com/watch?v=FtxmFlMLYRI) (tau) - the superior circle constant, equal to the ratio between a circle's circumference and its radius (two times $$ \pi $$). Each day this June, leading up to June 28 ([tau day](https://tauday.org)), I will be posting a creative demonstration of the beauty of this constant, circles, and mathematics as a whole.
Vi's videos, although lacking in pixels, more than make up for it with their humor, art, music, and beautiful introductions into various mathematics concepts that one would be lucky to even mention in a school curriculum. These videos introduced me to [$\tau$](https://www.youtube.com/watch?v=FtxmFlMLYRI) (tau) - the superior circle constant, equal to the ratio between a circle's circumference and its radius (two times $\pi$). Each day this June, leading up to June 28 ([tau day](https://tauday.org)), I will be posting a creative demonstration of the beauty of this constant, circles, and mathematics as a whole.
All code used to generate these visualizations will be available [on GitHub](https://github.com/TriMill/28-days-of-tau/) the same day the blog post is released.
@ -14,6 +14,6 @@ All code used to generate these visualizations will be available [on GitHub](htt
![Day 1 - Labyrinth](/static/i/blog/tau-day1.png)
This image shows the digits of tau (as represented in a base-10 positional system) by assigning each one an angle, where 0 is directly right and each subsequent digit is $$ \frac{\tau}{10} $$ radians counterclockwise. The first digit is right next to the center, and following digits are further out and connected by arcs.
This image shows the digits of tau (as represented in a base-10 positional system) by assigning each one an angle, where 0 is directly right and each subsequent digit is $\frac{\tau}{10}$ radians counterclockwise. The first digit is right next to the center, and following digits are further out and connected by arcs.
[GitHub](https://github.com/TriMill/28-days-of-tau/tree/main/day1)
[GitHub](https://github.com/TriMill/28-days-of-tau/tree/main/day1)

View file

@ -8,6 +8,6 @@ timestamp: 2022-06-03T00:00:00-04:00
![Day 3 - Polygons](/static/i/blog/tau-day3.png)
One of the oldest methods known to calculate circle constants is inscribing polygons of increasing side counts within circles. It is easy to find the area of these polygons, and as the number of sides increases the area approaches $$ \frac{\tau}{2} $$ (assuming a circle with radius 1).
One of the oldest methods known to calculate circle constants is inscribing polygons of increasing side counts within circles. It is easy to find the area of these polygons, and as the number of sides increases the area approaches $\frac{\tau}{2}$ (assuming a circle with radius 1).
[GitHub](https://github.com/TriMill/28-days-of-tau/tree/main/day3)
[GitHub](https://github.com/TriMill/28-days-of-tau/tree/main/day3)

View file

@ -9,5 +9,5 @@ My favorite number is 12. Some people I have talked to do not understand the con
- 12 has 6 factors (1, 2, 3, 4, 6, and 12), which is more factors than any positive integer less than it.
- The dodecahedron, one of the five platonic solids (and the only one to have pentagonal faces), has 12 faces. The cube (the only platonic solid with square faces) has 12 edges.
- Base 12 is a very good positional number system, much more practical than base 10 (although not as good as base 6)
- The Riemann zeta function evaluated at -1 is equal to $$ \frac{-1}{12} $$
- i like it :)
- The Riemann zeta function evaluated at -1 is equal to $\frac{-1}{12}$
- i like it :)

View file

@ -4,9 +4,8 @@ desc: The future of syndication is finally here
timestamp: 2022-07-04T12:49:00-04:00
---
![citrons: "we should have a unified GEORGE RSS feed that combines all of the RSS feeds in GEORGE
"](/static/i/blog/rssb_origins.png)
![citrons: "we should have a unified GEORGE RSS feed that combines all of the RSS feeds in GEORGE"](/static/i/blog/rssb_origins.png)
When this idea was brought up a few months ago, I stated in response that I would pursue it at a later date if no one else had (possibly). Recently, that later date has occured.
RSS Bundler is a program that reads from multiple RSS feeds, merges them into one, and serves the resulting feed using an embedded HTTP server. The source code is available [here on GitHub](https://github.com/TriMill/rss-bundler). The aforementioned GEORGE RSS bundle is available [here](https://api.trimill.xyz/george-bundle/rss.xml).
RSS Bundler is a program that reads from multiple RSS feeds, merges them into one, and serves the resulting feed using an embedded HTTP server. The source code is available [here on GitHub](https://github.com/TriMill/rss-bundler). The aforementioned GEORGE RSS bundle is available [here](https://api.trimill.xyz/george-bundle/rss.xml).

View file

@ -16,5 +16,5 @@ If you are not happy with preexisting pies, it is quite simple to innovate an en
With pie, the possibilities are endless.
[^1]: [this list](https://thepizzacalc.com/pizza-toppings-list-4/) includes 80 standard pizza toppings. this yields $$ 2^{80} $$ possible pizzas. if a human lives for 100 years and eats 3 meals per day, they will eat about 110,000 meals, which is far less than $$ 2^{80} $$.
[^1]: [this list](https://thepizzacalc.com/pizza-toppings-list-4/) includes 80 standard pizza toppings. this yields $2^{80}$ possible pizzas. if a human lives for 100 years and eats 3 meals per day, they will eat about 110,000 meals, which is far less than $2^{80}$.

BIN
flaskr/static/i/bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

View file

@ -0,0 +1,76 @@
.codehilite .c { color: #999999; font-style: italic } /* Comment */
.codehilite .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.codehilite .esc { color: #d0d0d0 } /* Escape */
.codehilite .g { color: #d0d0d0 } /* Generic */
.codehilite .k { color: #6ab825; font-weight: bold } /* Keyword */
.codehilite .l { color: #d0d0d0 } /* Literal */
.codehilite .n { color: #d0d0d0 } /* Name */
.codehilite .o { color: #d0d0d0 } /* Operator */
.codehilite .x { color: #d0d0d0 } /* Other */
.codehilite .p { color: #d0d0d0 } /* Punctuation */
.codehilite .ch { color: #999999; font-style: italic } /* Comment.Hashbang */
.codehilite .cm { color: #999999; font-style: italic } /* Comment.Multiline */
.codehilite .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */
.codehilite .cpf { color: #999999; font-style: italic } /* Comment.PreprocFile */
.codehilite .c1 { color: #999999; font-style: italic } /* Comment.Single */
.codehilite .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
.codehilite .gd { color: #d22323 } /* Generic.Deleted */
.codehilite .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
.codehilite .gr { color: #d22323 } /* Generic.Error */
.codehilite .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
.codehilite .gi { color: #589819 } /* Generic.Inserted */
.codehilite .go { color: #cccccc } /* Generic.Output */
.codehilite .gp { color: #aaaaaa } /* Generic.Prompt */
.codehilite .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
.codehilite .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
.codehilite .gt { color: #d22323 } /* Generic.Traceback */
.codehilite .kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */
.codehilite .kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */
.codehilite .kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */
.codehilite .kp { color: #6ab825 } /* Keyword.Pseudo */
.codehilite .kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */
.codehilite .kt { color: #6ab825; font-weight: bold } /* Keyword.Type */
.codehilite .ld { color: #d0d0d0 } /* Literal.Date */
.codehilite .m { color: #3677a9 } /* Literal.Number */
.codehilite .s { color: #ed9d13 } /* Literal.String */
.codehilite .na { color: #bbbbbb } /* Name.Attribute */
.codehilite .nb { color: #24909d } /* Name.Builtin */
.codehilite .nc { color: #447fcf; text-decoration: underline } /* Name.Class */
.codehilite .no { color: #40ffff } /* Name.Constant */
.codehilite .nd { color: #ffa500 } /* Name.Decorator */
.codehilite .ni { color: #d0d0d0 } /* Name.Entity */
.codehilite .ne { color: #bbbbbb } /* Name.Exception */
.codehilite .nf { color: #447fcf } /* Name.Function */
.codehilite .nl { color: #d0d0d0 } /* Name.Label */
.codehilite .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */
.codehilite .nx { color: #d0d0d0 } /* Name.Other */
.codehilite .py { color: #d0d0d0 } /* Name.Property */
.codehilite .nt { color: #6ab825; font-weight: bold } /* Name.Tag */
.codehilite .nv { color: #40ffff } /* Name.Variable */
.codehilite .ow { color: #6ab825; font-weight: bold } /* Operator.Word */
.codehilite .w { color: #666666 } /* Text.Whitespace */
.codehilite .mb { color: #3677a9 } /* Literal.Number.Bin */
.codehilite .mf { color: #3677a9 } /* Literal.Number.Float */
.codehilite .mh { color: #3677a9 } /* Literal.Number.Hex */
.codehilite .mi { color: #3677a9 } /* Literal.Number.Integer */
.codehilite .mo { color: #3677a9 } /* Literal.Number.Oct */
.codehilite .sa { color: #ed9d13 } /* Literal.String.Affix */
.codehilite .sb { color: #ed9d13 } /* Literal.String.Backtick */
.codehilite .sc { color: #ed9d13 } /* Literal.String.Char */
.codehilite .dl { color: #ed9d13 } /* Literal.String.Delimiter */
.codehilite .sd { color: #ed9d13 } /* Literal.String.Doc */
.codehilite .s2 { color: #ed9d13 } /* Literal.String.Double */
.codehilite .se { color: #ed9d13 } /* Literal.String.Escape */
.codehilite .sh { color: #ed9d13 } /* Literal.String.Heredoc */
.codehilite .si { color: #ed9d13 } /* Literal.String.Interpol */
.codehilite .sx { color: #ffa500 } /* Literal.String.Other */
.codehilite .sr { color: #ed9d13 } /* Literal.String.Regex */
.codehilite .s1 { color: #ed9d13 } /* Literal.String.Single */
.codehilite .ss { color: #ed9d13 } /* Literal.String.Symbol */
.codehilite .bp { color: #24909d } /* Name.Builtin.Pseudo */
.codehilite .fm { color: #447fcf } /* Name.Function.Magic */
.codehilite .vc { color: #40ffff } /* Name.Variable.Class */
.codehilite .vg { color: #40ffff } /* Name.Variable.Global */
.codehilite .vi { color: #40ffff } /* Name.Variable.Instance */
.codehilite .vm { color: #40ffff } /* Name.Variable.Magic */
.codehilite .il { color: #3677a9 } /* Literal.Number.Integer.Long */

View file

@ -1,202 +1,200 @@
@font-face {
font-family: Merriweather;
src: url(/static/f/Merriweather-Light.woff2);
font-weight: 400;
font-family: Merriweather;
src: url(/static/f/Merriweather-Light.woff2);
font-weight: 400;
}
@font-face {
font-family: Merriweather;
src: url(/static/f/Merriweather-LightItalic.woff2);
font-weight: 400;
font-style: italic;
font-family: Merriweather;
src: url(/static/f/Merriweather-LightItalic.woff2);
font-weight: 400;
font-style: italic;
}
@font-face {
font-family: Merriweather;
src: url(/static/f/Merriweather-Bold.woff2);
font-weight: 700;
font-family: Merriweather;
src: url(/static/f/Merriweather-Bold.woff2);
font-weight: 700;
}
@font-face {
font-family: Merriweather;
src: url(/static/f/Merriweather-BoldItalic.woff2);
font-weight: 700;
font-style: italic;
font-family: Merriweather;
src: url(/static/f/Merriweather-BoldItalic.woff2);
font-weight: 700;
font-style: italic;
}
@font-face {
font-family: "Roboto Slab";
src: url(/static/f/RobotoSlab-Medium.woff2);
font-weight: 500;
font-family: "Roboto Slab";
src: url(/static/f/RobotoSlab-Medium.woff2);
font-weight: 500;
}
@media (prefers-color-scheme: dark) {
:root.theme-system {
--bg: #131720;
--bg-intense: #000000;
--bg-faded: #293441;
--fg: #e6ded6;
--fg-faded: #908a81;
--accent-1: #2aca98;
--accent-1-dark: #268d78;
--error: #ee6d7d;
}
.only-theme-light {
display: none;
}
:root.theme-system {
--bg: #131720;
--bg-intense: #000000;
--bg-faded: #293441;
--fg: #e6ded6;
--fg-faded: #908a81;
--accent-1: #2aca98;
--accent-1-dark: #268d78;
--error: #ee6d7d;
--error-bg: #9b3440;
--bgimg: url("/static/i/bg.png");
}
.only-theme-light {
display: none;
}
}
@media (prefers-color-scheme: light) {
:root.theme-system {
--bg: #f6f5f2;
--bg-intense: #ffffff;
--bg-faded: #cbc4c7;
--fg: #28262b;
--fg-faded: #989097;
--accent-1: #0642c3;
--accent-1-dark: #07136d;
--accent-2: #0f7904;
--accent-2-dark: #094a05;
--error: #a50518;
}
.only-theme-dark {
display: none;
}
:root.theme-system {
--bg: #f6f5f2;
--bg-intense: #ffffff;
--bg-faded: #cbc4c7;
--fg: #28262b;
--fg-faded: #989097;
--accent-1: #0642c3;
--accent-1-dark: #07136d;
--accent-2: #0f7904;
--accent-2-dark: #094a05;
--error: #a50518;
--error-bg: #ee6d7d;
--bgimg: url("/static/i/bg_light.png");
}
.only-theme-dark {
display: none;
}
}
:root.theme-dark {
--bg: #131720;
--bg-intense: #000000;
--bg-faded: #293441;
--fg: #e6ded6;
--fg-faded: #908a81;
--accent-1: #2aca98;
--accent-1-dark: #268d78;
--error: #ee6d7d;
--bg: #131720;
--bg-intense: #000000;
--bg-faded: #293441;
--fg: #e6ded6;
--fg-faded: #908a81;
--accent-1: #2aca98;
--accent-1-dark: #268d78;
--error: #ee6d7d;
--error-bg: #9b3440;
--bgimg: url("/static/i/bg.png");
}
:root.theme-light {
--bg: #f6f5f2;
--bg-intense: #ffffff;
--bg-faded: #cbc4c7;
--fg: #28262b;
--fg-faded: #989097;
--accent-1: #0642c3;
--accent-1-dark: #07136d;
--error: #a50518;
}
:root.theme-special {
--bg: #ffff00;
--bg-intense: #ffffff;
--bg-faded: #00ff00;
--fg: #ff00ff;
--fg-faded: #ff0000;
--accent-1: #00ffff;
--accent-1-dark: #0000ff;
--error: #000000;
font-family: "Comic Sans MS", cursive;
--bg: #f6f5f2;
--bg-intense: #ffffff;
--bg-faded: #cbc4c7;
--fg: #28262b;
--fg-faded: #989097;
--accent-1: #0642c3;
--accent-1-dark: #07136d;
--error: #a50518;
--error-bg: #ee6d7d;
--bgimg: url("/static/i/bg_light.png");
}
:root {
color: var(--fg);
--text-fonts: "Merriweather", "DejaVu Serif", serif;
font-family: var(--text-fonts);
font-size: 19px;
font-weight: 400;
line-height: 1.6;
--link: var(--accent-1);
--link-hover: var(--accent-1-dark);
--link-active: var(--accent-1-dark);
--button: var(--bg-intense);
--button-hover: var(--bg-faded);
--button-active: var(--accent-1-dark);
overflow-wrap: break-word;
color: var(--fg);
--text-fonts: "Merriweather", "DejaVu Serif", serif;
font-family: var(--text-fonts);
font-size: 19px;
font-weight: 400;
line-height: 1.6;
--link: var(--accent-1);
--link-hover: var(--accent-1-dark);
--link-active: var(--accent-1-dark);
--button: var(--bg-intense);
--button-hover: var(--bg-faded);
--button-active: var(--accent-1-dark);
overflow-wrap: break-word;
}
h1, h2, h3, nav {
font-family: "Roboto Slab", serif;
font-weight: 500;
margin-top: 16px;
margin-bottom: 16px;
font-family: "Roboto Slab", serif;
font-weight: 500;
margin-top: 16px;
margin-bottom: 16px;
}
h1 {
width: fit-content;
margin-left: auto;
margin-right: auto;
margin-top: 4px;
margin-bottom: 0px;
width: fit-content;
margin-left: auto;
margin-right: auto;
margin-top: 4px;
margin-bottom: 0px;
}
body {
background: var(--bg);
width: min(750px, 90vw);
margin: auto;
min-height: 100vh;
display: flex;
flex-direction: column;
background-image: var(--bgimg);
background-color: var(--bg);
image-rendering: pixelated;
width: min(750px, 90vw);
margin: auto;
min-height: 100vh;
display: flex;
flex-direction: column;
}
main {
flex-grow: 1;
flex-grow: 1;
}
hr {
width: 100%;
width: 100%;
}
section {
padding-left: 10px;
background-color: var(--bg-intense);
padding-left: 10px;
background-color: var(--bg-intense);
}
footer {
text-align: center;
color: var(--fg-faded);
margin-top: auto;
flex-shrink: 0;
min-height: 50px;
font-size: 12px;
text-align: center;
color: var(--fg-faded);
margin-top: auto;
flex-shrink: 0;
min-height: 50px;
font-size: 12px;
}
footer code {
font-size: 12px;
font-size: 12px;
}
nav {
padding-top: 10px;
width: fit-content;
margin: auto;
font-size: 20px;
padding-top: 10px;
width: fit-content;
margin: auto;
font-size: 20px;
}
nav > svg {
position: absolute;
top: 16px;
height: 20px;
width: auto;
padding-left: 15px;
padding-right: 10px;
fill: var(--fg);
position: absolute;
top: 16px;
height: 20px;
width: auto;
padding-left: 15px;
padding-right: 10px;
fill: var(--fg);
}
nav > a {
color: var(--fg);
text-decoration: none;
padding-left: 10px;
padding-right: 10px;
color: var(--fg);
text-decoration: none;
padding-left: 10px;
padding-right: 10px;
}
nav > a:hover { color: var(--fg-faded); }
a {
color: var(--link);
text-decoration: none;
color: var(--link);
text-decoration: none;
}
:root[theme="contrast"] a, :root[theme="contrast-dark"] a {
text-decoration: underline;
text-decoration: underline;
}
a:hover { color: var(--link-hover); }
@ -204,55 +202,84 @@ a:hover { color: var(--link-hover); }
a:active { color: var(--link-active); }
.faded {
color: var(--fg-faded);
color: var(--fg-faded);
}
p {
margin-top: 10px;
margin-bottom: 10px;
margin-top: 10px;
margin-bottom: 10px;
}
blockquote {
border-left: 2px solid var(--fg-faded);
margin-left: 2px;
padding-left: 15px;
border-left: 2px solid var(--fg-faded);
margin-left: 2px;
padding-left: 15px;
}
code, pre {
background-color: var(--bg-intense);
padding-left: 3px;
padding-right: 3px;
padding-top: 2px;
padding-bottom: 2px;
border-radius: 3px;
font-family: "Fira Mono", monospace;
font-size: 18px;
background-color: var(--bg-intense);
padding-left: 3px;
padding-right: 3px;
padding-top: 2px;
padding-bottom: 2px;
border-radius: 3px;
font-family: "Fira Mono", monospace;
font-size: 18px;
}
pre {
padding-top: 3px;
padding-bottom: 3px;
padding-left: 12px;
border-left: 5px solid var(--accent-1-dark);
padding-top: 3px;
padding-bottom: 3px;
padding-left: 12px;
border-left: 5px solid var(--accent-1-dark);
}
button, input, select, textarea {
color: var(--fg);
background-color: var(--bg-faded);
border: 2px solid var(--fg-faded);
border-radius: 3px;
font-family: var(--text-fonts);
font-size: 16px;
color: var(--fg);
background-color: var(--bg-faded);
border: 2px solid var(--fg-faded);
border-radius: 3px;
font-family: var(--text-fonts);
font-size: 16px;
}
button:active, input[type=button]:active {
background-color: var(--bg);
background-color: var(--bg);
}
button:active, input[type=button]:active {
background-color: var(--bg);
background-color: var(--bg);
}
.error {
color: var(--error);
color: var(--error);
}
#abdetect-container {
position: relative;
display: inline-block;
text-align: center;
margin-bottom: 5px;
}
#abthankyou {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
color: var(--fg-faded);
font-size: 12px;
}
#ad {
z-index: 99999;
background: var(--error-bg);
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
color: var(--fg);
font-weight: bold;
}

View file

@ -1,77 +1,90 @@
<!DOCTYPE html>
<html lang="en" class="theme-{{ theme }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ meta.title }}</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="trimill">
<meta name="description" content="{{ meta.desc }}">
<meta property="og:description" content="{{ meta.desc }}">
<meta property="og:title" content="{{ meta.title }}">
<meta property="og:site_name" content="trimill.xyz">
<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='logo16.png') }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='logo32.png') }}">
<link rel="icon" type="image/png" sizes="64x64" href="{{ url_for('static', filename='logo64.png') }}">
<link rel="icon" type="image/png" sizes="320x320" href="{{ url_for('static', filename='logo320.png') }}">
<link rel="icon" type="image/png" sizes="640x640" href="{{ url_for('static', filename='logo640.png') }}">
<meta name="author" content="trimill">
<meta name="description" content="{{ meta.desc }}">
<meta name="theme-color" content="#2aca98">
<meta property="og:description" content="{{ meta.desc }}">
<meta property="og:title" content="{{ meta.title }}">
<meta property="og:site_name" content="trimill.xyz">
<meta property="og:image" content="{{ url_for('static', filename='logo640.png') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<style>
body {
{% if meta.fullscreen == True %}
width: 100%;
{% else %}
width: min({{ meta.pagewidth or "800px"}}, 80vw);
{% endif %}
}
</style>
<title>{{ meta.title }}</title>
<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='logo16.png') }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='logo32.png') }}">
<link rel="icon" type="image/png" sizes="64x64" href="{{ url_for('static', filename='logo64.png') }}">
<link rel="icon" type="image/png" sizes="320x320" href="{{ url_for('static', filename='logo320.png') }}">
<link rel="icon" type="image/png" sizes="640x640" href="{{ url_for('static', filename='logo640.png') }}">
{% block head %} {% endblock %}
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<style>
body {
{% if meta.fullscreen == True %}
width: 100%;
{% else %}
width: min({{ meta.pagewidth or "800px"}}, 80vw);
{% endif %}
}
</style>
{% block head %} {% endblock %}
</head>
<body>
{% if meta.fullscreen != True %}
<nav>
<a href="/">Home</a> ·
<a href="/projects/">Projects</a> ·
<a href="/blog/">Blog™</a> ·
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" style="position: sticky;">
<a href="?theme={{ data.next_theme[theme] | safe }}">
<!--<rect width="8" height="8" fill="#00000000">-->
{% if theme == "dark" %}
<path d="M2.72 0c-1.58.53-2.72 2.02-2.72 3.78 0 2.21 1.79 4 4 4 1.76 0 3.25-1.14 3.78-2.72-.4.13-.83.22-1.28.22-2.21 0-4-1.79-4-4 0-.45.08-.88.22-1.28z" />
<title>Dark theme</title>
{% elif theme == "light" %}
<path d="M4 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-2.5 1c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm5 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-2.5 1c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-3.5 1.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-6 2.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm5 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-2.5 1c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5z" />
<title>Light theme</title>
{% elif theme == "special" %}
<image href="/static/i/apioform1.png" width="8" height="8" />
transform="translate(0 1)">
<title>Ocular apiation occuring, do not close page until eyes have been apiated to completion.</title>
{% else %}
<path d="M3.41 0a.5.5 0 0 0-.13.06l-3 1.5a.5.5 0 1 0 .44.88l3-1.5a.5.5 0 0 0-.31-.94zm1 1.5a.5.5 0 0 0-.13.06l-4 2a.5.5 0 1 0 .44.88l4-2a.5.5 0 0 0-.31-.94zm0 2a.5.5 0 0 0-.13.06l-3 1.5a.5.5 0 0 0 .22.94h2a.5.5 0 0 0 .16-1l1.06-.56a.5.5 0 0 0-.31-.94zm-2.56 3.5a.5.5 0 0 0 .16 1h1a.5.5 0 1 0 0-1h-1a.5.5 0 0 0-.09 0 .5.5 0 0 0-.06 0z" transform="translate(1)" />
<title>System default theme</title>
{% endif %}
<!--</rect>-->
</a>
</svg>
</nav>
{% if meta.fullscreen != True %}
<nav>
<a href="/">Home</a> ·
<a href="/projects/">Projects</a> ·
<a href="/blog/">Blog™</a> ·
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" style="position: sticky;">
<a href="?theme={{ data.next_theme[theme] | safe }}">
{% if theme == "dark" %}
<path d="M2.72 0c-1.58.53-2.72 2.02-2.72 3.78 0 2.21 1.79 4 4 4 1.76 0 3.25-1.14 3.78-2.72-.4.13-.83.22-1.28.22-2.21 0-4-1.79-4-4 0-.45.08-.88.22-1.28z" />
<title>Dark theme</title>
{% elif theme == "light" %}
<path d="M4 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-2.5 1c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm5 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-2.5 1c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-3.5 1.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-6 2.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm5 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-2.5 1c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5z" />
<title>Light theme</title>
{% else %}
<path d="M3.41 0a.5.5 0 0 0-.13.06l-3 1.5a.5.5 0 1 0 .44.88l3-1.5a.5.5 0 0 0-.31-.94zm1 1.5a.5.5 0 0 0-.13.06l-4 2a.5.5 0 1 0 .44.88l4-2a.5.5 0 0 0-.31-.94zm0 2a.5.5 0 0 0-.13.06l-3 1.5a.5.5 0 0 0 .22.94h2a.5.5 0 0 0 .16-1l1.06-.56a.5.5 0 0 0-.31-.94zm-2.56 3.5a.5.5 0 0 0 .16 1h1a.5.5 0 1 0 0-1h-1a.5.5 0 0 0-.09 0 .5.5 0 0 0-.06 0z" transform="translate(1)" />
<title>System default theme</title>
{% endif %}
</a>
</svg>
</nav>
<h1>{{ meta.title }}</h1>
<h1>{{ meta.title }}</h1>
<hr style="width: 100%">
<hr style="width: 100%">
{% endif %}
<main>
{% block content %}{% endblock %}
</main>
{% if meta.fullscreen != True %}
<hr>
{% block footer_content %}{% endblock %}
<footer>
{{ data.feet | random | safe }}
</footer>
{% endif %}
{% endif %}
<main>
{% block content %}{% endblock %}
</main>
{% if meta.fullscreen != True %}
<hr>
<div id="abdetect-container">
<span class="ad-slot" id="ad">
you aren't using an adblocker! click
<a href="https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/">here (firefox)</a> or
<a href="https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm">here (chrome)</a> to install one.
</span>
<span id="abthankyou">
thank you for using an adblocker!
</span>
<span style="visibility: hidden;">
you aren't using an adblocker! click
<a href="">here (firefox)</a> or
<a href="">here (chrome)</a> to install one.
</span>
</div>
{% block footer_content %}{% endblock %}
<footer>
{{ data.feet | random | safe }}
</footer>
{% endif %}
</body>
</html>

View file

@ -2,30 +2,31 @@
{% block head %}
<!-- KaTex -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css" integrity="sha384-Xi8rHCmBmhbuyyhbI88391ZKP2dmfnOl4rT9ZfRI7mLTdk1wblIUnrIq35nqwEvC" crossorigin="anonymous">
<link rel="stylesheet" href="/static/pygments.css">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.js" integrity="sha384-X/XCfMm41VSsqRNQgDerQczD69XqmjOOOwYQvr/uuC+j4OPoNhVgjdGFwhvN02Ja" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/contrib/auto-render.min.js" integrity="sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR" crossorigin="anonymous"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
renderMathInElement(document.body, {
delimiters: [
{left: '$$', right: '$$', display: false},
{left: '\\[', right: '\\]', display: true},
],
throwOnError : false
});
});
document.addEventListener("DOMContentLoaded", function() {
renderMathInElement(document.body, {
delimiters: [
{left: '$', right: '$', display: false},
{left: '\\[', right: '\\]', display: true},
],
throwOnError : false
});
});
</script>
<style>
img {
display: block;
max-width: 80%;
margin-left: auto;
margin-right: auto;
display: block;
max-width: 80%;
margin-left: auto;
margin-right: auto;
}
p {
margin-top: 24px;
margin-bottom: 24px;
margin-top: 24px;
margin-bottom: 24px;
}
</style>
{% endblock %}

View file

@ -1,21 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Blog™</title>
<link href="https://trimill.xyz/blog/atom.xml" rel="self" />
<link href="https://trimill.xyz/blog/" />
<updated>{{ data.blogposts[0].timestamp.isoformat() }}</updated>
<author>
<name>TriMill</name>
</author>
<id>https://trimill.xyz/blog/</id>
<title>Blog™</title>
<link href="https://trimill.xyz/blog/atom.xml" rel="self" />
<link href="https://trimill.xyz/blog/" />
<updated>{{ data.blogposts[0].timestamp.isoformat() }}</updated>
<author>
<name>TriMill</name>
</author>
<id>https://trimill.xyz/blog/</id>
{% for post in data.blogposts %}
<entry>
<title>{{ post.title }}</title>
<link href="https://trimill.xyz/{{ post.url }}" />
<summary>{{ post.desc }}</summary>
<updated>{{ post.timestamp.isoformat() }}</updated>
<id>https://trimill.xyz/{{ post.url }}</id>
</entry>
{% endfor %}
</feed>
{% for post in data.blogposts %}
<entry>
<title>{{ post.title }}</title>
<link href="https://trimill.xyz/{{ post.url }}" />
<summary>{{ post.desc }}</summary>
<updated>{{ post.timestamp.isoformat() }}</updated>
<id>https://trimill.xyz/{{ post.url }}</id>
</entry>
{% endfor %}
</feed>

View file

@ -6,7 +6,7 @@ get updates delivered directly to you using the <a href="/blog/rss.xml">RSS</a>
{% for post in data.blogposts %}
<hr style="width: 20%">
<h2 style="margin-top: 10px; margin-bottom: 10px">
<a href="{{ post.url }}">{{ post.title }}</a>
<a href="{{ post.url }}">{{ post.title }}</a>
</h2>
<p class="faded">{{ post.date.isoformat() }}</p>
<p>{{ post.desc }}</p>

View file

@ -36,18 +36,16 @@
{% block footer_content %}
{% if theme == "light" %}
<iframe height="50" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23f6f5f2&c_fg=%2328262b&c_links=%230642c3&c_george=%230d8101&c_underline=%230d8101" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
{% elif theme == "special" %}
<iframe height="50" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23ffff00&c_fg=%23ff00ff&c_links=%2300ffff&c_george=%2300ff00&c_underline=%2300ff00" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
<iframe title="GEORGE" height="50" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23f6f5f2&c_fg=%2328262b&c_links=%230642c3&c_george=%230d8101&c_underline=%230d8101" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
{% elif theme == "system" %}
<iframe height="50" class="only-theme-dark" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23131720&c_fg=%23e6ded6&c_links=%232aca98&c_george=%23268d78&c_underline=%23268d78" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
<iframe height="50" class="only-theme-light" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23f6f5f2&c_fg=%2328262b&c_links=%230642c3&c_george=%230d8101&c_underline=%230d8101" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
<iframe title="GEORGE" height="50" class="only-theme-dark" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23131720&c_fg=%23e6ded6&c_links=%232aca98&c_george=%23268d78&c_underline=%23268d78" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
<iframe title="GEORGE" height="50" class="only-theme-light" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23f6f5f2&c_fg=%2328262b&c_links=%230642c3&c_george=%230d8101&c_underline=%230d8101" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
{% else %}
<iframe height="50" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23131720&c_fg=%23e6ded6&c_links=%232aca98&c_george=%23268d78&c_underline=%23268d78" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
<iframe title="GEORGE" height="50" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23131720&c_fg=%23e6ded6&c_links=%232aca98&c_george=%23268d78&c_underline=%23268d78" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
{% endif %}
<p>
<iframe src="https://john.citrons.xyz/embed?ref=trimill.xyz" style="margin-left:auto;display:block;margin-right:auto;max-width:732px;width:100%;height:94px;border:none;"></iframe>
<iframe title="johnvertisement" src="https://john.citrons.xyz/embed?ref=trimill.xyz" style="margin-left:auto;display:block;margin-right:auto;max-width:732px;width:100%;height:94px;border:none;"></iframe>
</p>
<br>

View file

@ -2,81 +2,89 @@
{% extends "/_base.html" %}
{% block content %}
<h2><a href="https://g.trimill.xyz/trimill/complexpr">complexpr</a></h2>
<h2><a href="https://cx.trimill.xyz/">CXGraph</a></h2>
<p>
Complexpr is a toy programming language with an interpreter written in Rust. It is dynamically typed, with
native support for rational and complex numbers, lists and maps, and first-class functions. It features
pipeline operators (similar to Elixir's <code>|&gt;</code>) to express nested function calls more cleanly.
CXGraph is the successor to Complex Grapher. It allows the definition of multiple functions,
iteration, and interactive sliders and draggable points. It is implemented primarily in Rust
using WASM and WebGPU.
</p>
<h2><a href="https://g.trimill.xyz/trimill/talc">Talc</a></h2>
<p>
Talc is a procedural/functional programming language implemented in Rust. It supports
several numeric types, first-class functions, file I/O, string manipulation, exceptions,
and several other features.
</p>
<h2><a href="https://g.trimill.xyz/trimill/quectocraft">Quectocraft</a></h2>
<p>
Quectocraft is an extensible, ultra-minimalist implementation of a Minecraft server. By doing away with most
features of the vanilla server (such as world generation and interaction) it can run without consuming many system
resources. It is written primarily in Rust, but can load simple plugins written in Lua to add chat features and commands.
Quectocraft is an extensible, ultra-minimalist implementation of a Minecraft server.
By doing away with most features of the vanilla server (such as world generation and
interaction) it can run without consuming many system resources. It is written primarily
in Rust, but can load simple plugins written in Lua to add chat features and commands.
</p>
<h2><a href="https://g.trimill.xyz/trimill/rss-bundler">RSS Bundler</a></h2>
<p>
RSS Bundler is a tool that bundles multiple RSS feeds into one. At a fixed interval it fetches content from the configured
feeds, merges them together, and stores and serves the result. RSS Bundler is written in Rust.
</p>
<h2><a href="/projects/complex_grapher">Complex grapher</a></h2>
<p>
Complex grapher allows you to functions using <a href="https://en.wikipedia.org/wiki/Domain_coloring">domain coloring</a>.
Functions are written in a custom expression language and compiled to GLSL. WebGL is then used to generate a color for each pixel.
Complex grapher also has support for iterating functions, allowing you to generate fractals such as the Mandelbrot and Julia sets.
RSS Bundler is a tool that bundles multiple RSS feeds into one. At a fixed interval it fetches content from the configured
feeds, merges them together, and stores and serves the result. RSS Bundler is written in Rust.
</p>
<h2><a href="/projects/zzcxz_vis">zzcxz visualizer</a></h2>
<p>
zzcxz visualizer displays a force-directed graph of <a href="https://zzcxz.citrons.xyz/">zzcxz</a>, a collaborative interactive
fiction project. It is written in JavaScript and uses D3.js.
zzcxz visualizer displays a force-directed graph of <a href="https://zzcxz.citrons.xyz/">zzcxz</a>, a collaborative interactive
fiction project. It is written in JavaScript and uses D3.js.
</p>
<h2><a href="https://g.trimill.xyz/trimill/complexpr">complexpr</a></h2>
<p>
Complexpr is a toy programming language with an interpreter written in Rust. It is dynamically typed, with
native support for rational and complex numbers, lists and maps, and first-class functions. It features
pipeline operators (similar to Elixir's <code>|&gt;</code>) to express nested function calls more cleanly.
</p>
<h2><a href="https://g.trimill.xyz/trimill/sysh">sysh</a></h2>
<p>
sysh is a shell that allows users to run Linux syscalls directly. It supports the entire set of x86_64 syscalls, as well as
several other commands to manage memory, manipulate data, and perform arithmetic. sysh is written in C, using Python to
automatically generate some code.
sysh is a shell that allows users to run Linux syscalls directly. It supports the entire set of x86_64 syscalls, as well as
several other commands to manage memory, manipulate data, and perform arithmetic. sysh is written in C, using Python to
automatically generate some code.
</p>
<h2><a href="https://g.trimill.xyz/trimill/musidl">Musidl</a></h2>
<p>
Musidl is a Bash script that downloads music using <a href="https://github.com/yt-dlp/yt-dlp">yt-dlp</a> and
automatically add ID3v2 tags based on Youtube Music metadata.
Musidl is a Bash script that downloads music using <a href="https://github.com/yt-dlp/yt-dlp">yt-dlp</a> and
automatically add ID3v2 tags based on Youtube Music metadata.
</p>
<h2><a href="/projects/mazemaker">Maze maker</a></h2>
<p>
Generate random mazes based on a variety of parameters. Written in JavaScript using <a href="https://p5js.org/">p5.js</a>.
Generate random mazes based on a variety of parameters. Written in JavaScript using <a href="https://p5js.org/">p5.js</a>.
</p>
<h2><a href="/projects/converter">Unit converter</a></h2>
<p>
Convert between various different units, including commonly-used ones as well as unusual or archaic ones.
Convert between various different units, including commonly-used ones as well as unusual or archaic ones.
</p>
<h2><a href="/projects/fracbase">Fraction base converter</a></h2>
<p>
Convert a fraction to its positional notation in an arbitrary base.
Convert a fraction to its positional notation in an arbitrary base.
</p>
<h2><a href="/projects/number">number</a></h2>
<p>
Make number go up.
Make number go up.
</p>
<h2><a href="/projects/pixelcircle">Pixel circle</a></h2>
<p>
Create pixelated circles with a specified radius.
Create pixelated circles with a specified radius.
</p>
<h2><a href="/projects/stars">Stars</a></h2>
<p>
Generate stars.
Generate stars.
</p>

View file

@ -1,20 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Blog™</title>
<link>https://trimill.xyz/blog/</link>
<description>Blog™</description>
<language>en</language>
<pubDate>{{ data.blogposts[0].timestamp.strftime("%a, %d %b %Y %H:%M:%S %z") }}</pubDate>
{% for post in data.blogposts %}
<item>
<title>{{ post.title }}</title>
<link>https://trimill.xyz/{{ post.url }}</link>
<description>{{ post.desc }}</description>
<pubDate>{{ post.timestamp.strftime("%a, %d %b %Y %H:%M:%S %z") }}</pubDate>
<guid>https://trimill.xyz/{{ post.url }}</guid>
</item>
{% endfor %}
<title>Blog™</title>
<link>https://trimill.xyz/blog/</link>
<description>Blog™</description>
<language>en</language>
<pubDate>{{ data.blogposts[0].timestamp.strftime("%a, %d %b %Y %H:%M:%S %z") }}</pubDate>
{% for post in data.blogposts %}
<item>
<title>{{ post.title }}</title>
<link>https://trimill.xyz/{{ post.url }}</link>
<description>{{ post.desc }}</description>
<pubDate>{{ post.timestamp.strftime("%a, %d %b %Y %H:%M:%S %z") }}</pubDate>
<guid>https://trimill.xyz/{{ post.url }}</guid>
</item>
{% endfor %}
</channel>
</rss>
</rss>

View file

@ -3,4 +3,4 @@
. venv/bin/activate
export FLASK_APP=flaskr
export FLASK_ENV=development
flask run
flask run