First version with notes

This commit is contained in:
Vyn 2025-06-12 11:59:23 +02:00
parent cb91e02327
commit 86aef1608b
Signed by: vyn
GPG key ID: E1B2BE34E7A971E7
45 changed files with 7075 additions and 0 deletions

24
.gitignore vendored Normal file
View file

@ -0,0 +1,24 @@
# build output
# dist/ # It's intentional to push the build
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
# jetbrains setting folder
.idea/

4
.vscode/extensions.json vendored Normal file
View file

@ -0,0 +1,4 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

11
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

12
astro.config.mjs Normal file
View file

@ -0,0 +1,12 @@
// @ts-check
import { defineConfig } from 'astro/config';
import remarkAlert from 'remark-github-blockquote-alert';
// https://astro.build/config
export default defineConfig({
integrations: [],
markdown: {
remarkPlugins: [remarkAlert]
}
});

19
content.config.ts Normal file
View file

@ -0,0 +1,19 @@
// 1. Import utilities from `astro:content`
import { defineCollection, z } from "astro:content";
// 2. Import loader(s)
import { glob, file } from "astro/loaders";
// 3. Define your collection(s)
const notes = defineCollection({
loader: glob({ pattern: "**/*.md", base: "./src/content/notes" }),
schema: z.object({
slug: z.string(),
title: z.string(),
createdAt: z.coerce.date(),
updatedAt: z.coerce.date(),
}),
});
// 4. Export a single `collections` object to register your collection(s)
export const collections = { notes };

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 8L3 12L8 16M16 16L21 12L16 8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 339 B

4
dist/_astro/note.BjCyRRIL.svg vendored Normal file
View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13 3H7C5.89543 3 5 3.89543 5 5V19C5 20.1046 5.89543 21 7 21H17C18.1046 21 19 20.1046 19 19V9M13 3L19 9M13 3V8C13 8.55228 13.4477 9 14 9H19M9 13H15M9 17H15" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 464 B

14
dist/about/index.html vendored Normal file
View file

@ -0,0 +1,14 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="description" content="Evalyte"><meta name="viewport" content="width=device-width"><!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />--><meta name="generator" content="Astro v5.9.2"><title>Evalyte - About</title><script defer src="https://umami.evalyte.net/script.js" data-website-id="4fd77337-0f39-4eac-b19b-c09ebf8c8db3"></script><style>@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Regular.ttf);font-weight:400}@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Bold.ttf);font-weight:700}:root{--primary: #5d9eda;--secondary: #b1d0ee;--background: #282c34;--pane: #21252b;--surface: #31353f;--surface2: #51555f;--text: #d1d1d1;--headline: #ffffff;--hint: #797979;color:var(--text);--default-gap: 16px}a{text-decoration:none;color:var(--secondary)}nav>a{color:var(--text)}body{margin:0;min-height:100vh;display:flex;flex-direction:column}html{margin:0;font-family:system-ui,sans-serif;background:var(--background)}main{flex:1}header{background:var(--pane)}header>div{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:2rem;margin:auto;padding:16px;font-family:Comfortaa;font-weight:700;font-size:1rem;@media (min-width: 1200px){width:1200px}}nav{display:flex;flex-direction:row;align-items:center;gap:2rem}#logo{font-size:2rem;color:var(--primary);text-wrap:nowrap}h1,h2,h3,h4{font-family:Comfortaa;font-weight:400;color:var(--headline);padding:0}h1{color:var(--primary);font-size:3rem}h2{font-size:2rem}h3{font-size:1.5rem}h4{font-size:1.25rem}code{font-family:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace}code:not(pre>code){background-color:#21252b;font-size:.9rem;padding:0 4px;border-radius:4px}.astro-code{padding:16px;max-width:80vw}pre{background-color:#21252b!important}.markdown-alert-title{margin-bottom:8px}footer{color:var(--hint);text-align:center;margin-bottom:16px}
main[data-astro-cid-kh7btl4r]{margin:auto;padding:32px;width:800px;max-width:calc(100% - 2rem);display:flex;flex-direction:column}section[data-astro-cid-kh7btl4r]{display:flex;flex-direction:column}
</style></head> <body> <header> <div> <a href="/" id="logo">&gt; _</a> <nav> <a href="https://code.evalyte.net" target="_blank">Repositories</a> <!--<a href="/devlog">Devlog</a>--> <a href="/notes">Notes</a> <!--<a href="/utilities">Utilities</a>--> <!--<a href="/services">Services</a>--> <a href="/about">About</a> </nav> </div> </header> <main data-astro-cid-kh7btl4r> <section data-astro-cid-kh7btl4r> <h1 data-astro-cid-kh7btl4r>Hello, World</h1> <p data-astro-cid-kh7btl4r>
I'm a self-taught developer who likes to create desktop & web applications, custom tools and sometimes games.<br data-astro-cid-kh7btl4r><br data-astro-cid-kh7btl4r>
As I really like to understand how things work, I do a lot of projects and enjoy reinventing the wheel, creating my own software, this is the reason this website exists.
</p> </section> <section data-astro-cid-kh7btl4r> <h1 data-astro-cid-kh7btl4r>What exactly is Evalyte ?</h1> <p data-astro-cid-kh7btl4r>
Evalyte is the brand for my projects, a namespace, my lab and my way of sharing about software and open source, it's like my home, it's not my nickname.<br data-astro-cid-kh7btl4r><br data-astro-cid-kh7btl4r>
You'll find here mostly desktop apps, web apps and other things related to tech.<br data-astro-cid-kh7btl4r><br data-astro-cid-kh7btl4r>
Everything I make available here is free and open source, most are self-made but I might also host existing software.
</p> </section> <section data-astro-cid-kh7btl4r> <h1 data-astro-cid-kh7btl4r>Want to contribute ?</h1> <p data-astro-cid-kh7btl4r>
You can report issues or make suggestions,
but I don't accept contributions in the form code or pull request, I want to stay the
only owner and developer for now.
</p> </section> </main> <footer>© 2024 Evalyte</footer> </body></html>

BIN
dist/fonts/Comfortaa-Bold.ttf vendored Normal file

Binary file not shown.

BIN
dist/fonts/Comfortaa-Light.ttf vendored Normal file

Binary file not shown.

BIN
dist/fonts/Comfortaa-Medium.ttf vendored Normal file

Binary file not shown.

BIN
dist/fonts/Comfortaa-Regular.ttf vendored Normal file

Binary file not shown.

BIN
dist/fonts/Comfortaa-SemiBold.ttf vendored Normal file

Binary file not shown.

9
dist/index.html vendored Normal file
View file

@ -0,0 +1,9 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="description" content="Evalyte"><meta name="viewport" content="width=device-width"><!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />--><meta name="generator" content="Astro v5.9.2"><title>Evalyte</title><script defer src="https://umami.evalyte.net/script.js" data-website-id="4fd77337-0f39-4eac-b19b-c09ebf8c8db3"></script><style>@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Regular.ttf);font-weight:400}@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Bold.ttf);font-weight:700}:root{--primary: #5d9eda;--secondary: #b1d0ee;--background: #282c34;--pane: #21252b;--surface: #31353f;--surface2: #51555f;--text: #d1d1d1;--headline: #ffffff;--hint: #797979;color:var(--text);--default-gap: 16px}a{text-decoration:none;color:var(--secondary)}nav>a{color:var(--text)}body{margin:0;min-height:100vh;display:flex;flex-direction:column}html{margin:0;font-family:system-ui,sans-serif;background:var(--background)}main{flex:1}header{background:var(--pane)}header>div{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:2rem;margin:auto;padding:16px;font-family:Comfortaa;font-weight:700;font-size:1rem;@media (min-width: 1200px){width:1200px}}nav{display:flex;flex-direction:row;align-items:center;gap:2rem}#logo{font-size:2rem;color:var(--primary);text-wrap:nowrap}h1,h2,h3,h4{font-family:Comfortaa;font-weight:400;color:var(--headline);padding:0}h1{color:var(--primary);font-size:3rem}h2{font-size:2rem}h3{font-size:1.5rem}h4{font-size:1.25rem}code{font-family:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace}code:not(pre>code){background-color:#21252b;font-size:.9rem;padding:0 4px;border-radius:4px}.astro-code{padding:16px;max-width:80vw}pre{background-color:#21252b!important}.markdown-alert-title{margin-bottom:8px}footer{color:var(--hint);text-align:center;margin-bottom:16px}
h4[data-astro-cid-md6ke2xi]{color:var(--text);text-align:center}p[data-astro-cid-md6ke2xi]{color:var(--text)}.card[data-astro-cid-md6ke2xi]{transition-duration:.5s;min-width:256px;border:1px solid var(--surface2);background:var(--surface);&:hover{box-shadow:inset 0 0 100px 100px #6464641a}padding:16px 32px;border-radius:8px;display:flex;flex-direction:row;align-items:center;gap:16px}.image[data-astro-cid-md6ke2xi]{color:var(--secondary);stroke:currentColor;width:64px;height:64px}.description[data-astro-cid-md6ke2xi]{text-align:center}h1[data-astro-cid-j7pv25f6]{margin:0}main[data-astro-cid-j7pv25f6]{padding-top:0;display:flex;flex-direction:column;gap:32px}#page-intro[data-astro-cid-j7pv25f6]{display:flex;flex-direction:column;align-items:center;gap:32px;padding:32px 32px 96px;background:var(--pane)}#content[data-astro-cid-j7pv25f6]{margin-left:auto;margin-right:auto;display:flex;flex-direction:column;align-items:center;gap:32px;@media (min-width: 1200px){width:1200px}}#description[data-astro-cid-j7pv25f6]{margin-bottom:32px}#firstline[data-astro-cid-j7pv25f6]{text-align:center;margin-top:32px;margin-bottom:32px}.presentation-section[data-astro-cid-j7pv25f6]{width:100%;display:flex;flex-direction:row;gap:32px}.image-text[data-astro-cid-j7pv25f6]{flex:1}.image-text[data-astro-cid-j7pv25f6] div[data-astro-cid-j7pv25f6]{display:flex;flex-direction:column;gap:32px;align-items:start;justify-content:center;padding:16px}.side-to-side-text[data-astro-cid-j7pv25f6]{flex:1;display:flex;flex-direction:column;gap:32px;align-items:start;justify-content:center;padding:16px}.button[data-astro-cid-j7pv25f6]{color:var(--secondary);background:none;border:1px solid var(--secondary);border-radius:8px;padding:8px 16px;font-size:1.5rem;cursor:pointer}.button[data-astro-cid-j7pv25f6]:hover{background-color:#b1d0ee09}h2[data-astro-cid-j7pv25f6]{color:var(--headline)}
</style></head> <body> <header> <div> <a href="/" id="logo">&gt; _</a> <nav> <a href="https://code.evalyte.net" target="_blank">Repositories</a> <!--<a href="/devlog">Devlog</a>--> <a href="/notes">Notes</a> <!--<a href="/utilities">Utilities</a>--> <!--<a href="/services">Services</a>--> <a href="/about">About</a> </nav> </div> </header> <main data-astro-cid-j7pv25f6> <div id="page-intro" data-astro-cid-j7pv25f6> <h1 data-astro-cid-j7pv25f6>Evalyte</h1> </div> <p id="firstline" data-astro-cid-j7pv25f6>
Welcome, I'm <strong data-astro-cid-j7pv25f6>Vyn</strong>, and <strong data-astro-cid-j7pv25f6>Evalyte</strong> is my place where I share things, enjoy.
</p> <div id="content" data-astro-cid-j7pv25f6> <a href="https://code.evalyte.net" target="_blank" class="card" data-astro-cid-md6ke2xi> <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" class="image" data-astro-cid-md6ke2xi="true">
<path d="M8 8L3 12L8 16M16 16L21 12L16 8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
</svg> <div class="text" data-astro-cid-md6ke2xi> <h4 data-astro-cid-md6ke2xi> Repositories </h4> <!--<p class="description">--> <!--{description}--> <!--</p>--> </div> </a> <a href="/notes" target="_self" class="card" data-astro-cid-md6ke2xi> <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" class="image" data-astro-cid-md6ke2xi="true">
<path d="M13 3H7C5.89543 3 5 3.89543 5 5V19C5 20.1046 5.89543 21 7 21H17C18.1046 21 19 20.1046 19 19V9M13 3L19 9M13 3V8C13 8.55228 13.4477 9 14 9H19M9 13H15M9 17H15" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
</svg> <div class="text" data-astro-cid-md6ke2xi> <h4 data-astro-cid-md6ke2xi> Notes </h4> <!--<p class="description">--> <!--{description}--> <!--</p>--> </div> </a> <!--<PortalCategory title="Devlog" description="ok" href="/devlog" image={Devlog}/>--> </div> </main> <footer>© 2024 Evalyte</footer> </body></html>

5
dist/notes/index.html vendored Normal file
View file

@ -0,0 +1,5 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="description" content="Evalyte"><meta name="viewport" content="width=device-width"><!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />--><meta name="generator" content="Astro v5.9.2"><title>Evalyte - Notes</title><script defer src="https://umami.evalyte.net/script.js" data-website-id="4fd77337-0f39-4eac-b19b-c09ebf8c8db3"></script><style>@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Regular.ttf);font-weight:400}@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Bold.ttf);font-weight:700}:root{--primary: #5d9eda;--secondary: #b1d0ee;--background: #282c34;--pane: #21252b;--surface: #31353f;--surface2: #51555f;--text: #d1d1d1;--headline: #ffffff;--hint: #797979;color:var(--text);--default-gap: 16px}a{text-decoration:none;color:var(--secondary)}nav>a{color:var(--text)}body{margin:0;min-height:100vh;display:flex;flex-direction:column}html{margin:0;font-family:system-ui,sans-serif;background:var(--background)}main{flex:1}header{background:var(--pane)}header>div{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:2rem;margin:auto;padding:16px;font-family:Comfortaa;font-weight:700;font-size:1rem;@media (min-width: 1200px){width:1200px}}nav{display:flex;flex-direction:row;align-items:center;gap:2rem}#logo{font-size:2rem;color:var(--primary);text-wrap:nowrap}h1,h2,h3,h4{font-family:Comfortaa;font-weight:400;color:var(--headline);padding:0}h1{color:var(--primary);font-size:3rem}h2{font-size:2rem}h3{font-size:1.5rem}h4{font-size:1.25rem}code{font-family:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace}code:not(pre>code){background-color:#21252b;font-size:.9rem;padding:0 4px;border-radius:4px}.astro-code{padding:16px;max-width:80vw}pre{background-color:#21252b!important}.markdown-alert-title{margin-bottom:8px}footer{color:var(--hint);text-align:center;margin-bottom:16px}
h4[data-astro-cid-dohjnao5]{color:var(--secondary);text-align:center}p[data-astro-cid-dohjnao5]{color:var(--text)}.card[data-astro-cid-dohjnao5]{border:1px solid var(--surface2);background:var(--surface);transition-duration:.5s;&:hover{box-shadow:inset 0 0 100px 100px #6464641a}padding-left:16px;padding-right:16px;border-radius:8px;display:flex;flex-direction:row;align-items:start;gap:16px}.date[data-astro-cid-dohjnao5]{margin-left:auto;align-self:end;color:var(--hint);margin-bottom:8px}main[data-astro-cid-mejek24l]{margin:auto;padding:32px;width:800px;max-width:calc(100% - 2rem);display:flex;flex-direction:column;align-items:center}#description[data-astro-cid-mejek24l]{text-align:center;margin-top:32px;margin-bottom:32px}#applications[data-astro-cid-mejek24l]{padding:32px;display:flex;flex-direction:column;width:100%;gap:16px}
</style></head> <body> <header> <div> <a href="/" id="logo">&gt; _</a> <nav> <a href="https://code.evalyte.net" target="_blank">Repositories</a> <!--<a href="/devlog">Devlog</a>--> <a href="/notes">Notes</a> <!--<a href="/utilities">Utilities</a>--> <!--<a href="/services">Services</a>--> <a href="/about">About</a> </nav> </div> </header> <main data-astro-cid-mejek24l> <h1 data-astro-cid-mejek24l>Notes</h1> <p id="description" data-astro-cid-mejek24l>
Random things that might be useful.
</p> <section id="applications" data-astro-cid-mejek24l> <a href="/notes/selfhost-forgejo-with-podman-without-quadlet" class="card" data-astro-cid-dohjnao5> <h4 data-astro-cid-dohjnao5>Selfhost Forgejo with Podman without Quadlet</h4> <div class="date" data-astro-cid-dohjnao5>6/11/2025</div> </a> <a href="/notes/quick-sort-algorithm" class="card" data-astro-cid-dohjnao5> <h4 data-astro-cid-dohjnao5>Quick Sort algorithm</h4> <div class="date" data-astro-cid-dohjnao5>2/1/2021</div> </a> </section> </main> <footer>© 2024 Evalyte</footer> </body></html>

View file

@ -0,0 +1,51 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="description" content="Evalyte"><meta name="viewport" content="width=device-width"><!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />--><meta name="generator" content="Astro v5.9.2"><title>undefined - Evalyte</title><script defer src="https://umami.evalyte.net/script.js" data-website-id="4fd77337-0f39-4eac-b19b-c09ebf8c8db3"></script><style>@media (prefers-color-scheme: dark){.markdown-alert{--color-border-default: #30363d;--color-accent-fg: #58a6ff;--color-accent-emphasis: #1f6feb;--color-danger-fg: #f85149;--color-danger-emphasis: #da3633;--color-attention-fg: #d29922;--color-attention-emphasis: #9e6a03;--color-done-fg: #a371f7;--color-done-emphasis: #8957e5;--color-success-fg: #3fb950;--color-success-emphasis: #238636}}@media (prefers-color-scheme: light){.markdown-alert{--color-border-default: #d0d7de;--color-accent-fg: #0969da;--color-accent-emphasis: #0969da;--color-danger-fg: #d1242f;--color-danger-emphasis: #cf222e;--color-attention-fg: #9a6700;--color-attention-emphasis: #9a6700;--color-done-fg: #8250df;--color-done-emphasis: #8250df;--color-success-fg: #1a7f37;--color-success-emphasis: #1f883d}}.markdown-alert{border-left:.25em solid var(--borderColor-default, var(--color-border-default));color:inherit;margin-bottom:16px;padding:.5rem 1em}.markdown-alert>:last-child{margin-bottom:0!important}.markdown-alert .markdown-alert-title{align-items:center;display:flex;font-size:14px;font-weight:500;line-height:1}.markdown-alert .markdown-alert-title svg.octicon{margin-right:8px!important;margin-right:var(--base-size-8,8px)!important;fill:currentColor}.markdown-alert.markdown-alert-note{border-left-color:var(--borderColor-accent-emphasis,var(--color-accent-emphasis))}.markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--color-accent-fg);color:var(--fgColor-accent,var(--color-accent-fg))}.markdown-alert.markdown-alert-tip{border-left-color:var(--borderColor-success-emphasis,var(--color-success-emphasis))}.markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--color-success-fg);color:var(--fgColor-success,var(--color-success-fg))}.markdown-alert.markdown-alert-important{border-left-color:var(--borderColor-done-emphasis,var(--color-done-emphasis))}.markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--color-done-fg);color:var(--fgColor-done,var(--color-done-fg))}.markdown-alert.markdown-alert-warning{border-left-color:var(--borderColor-attention-emphasis,var(--color-attention-emphasis))}.markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--color-attention-fg);color:var(--fgColor-attention,var(--color-attention-fg))}.markdown-alert.markdown-alert-caution{border-left-color:var(--borderColor-danger-emphasis,var(--color-danger-emphasis))}.markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--color-danger-fg);color:var(--fgColor-danger,var(--color-danger-fg))}main[data-astro-cid-hhdr4bp3]{padding:32px;display:flex;flex-direction:column;align-items:center;margin:auto;max-width:1200px;gap:32px}
@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Regular.ttf);font-weight:400}@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Bold.ttf);font-weight:700}:root{--primary: #5d9eda;--secondary: #b1d0ee;--background: #282c34;--pane: #21252b;--surface: #31353f;--surface2: #51555f;--text: #d1d1d1;--headline: #ffffff;--hint: #797979;color:var(--text);--default-gap: 16px}a{text-decoration:none;color:var(--secondary)}nav>a{color:var(--text)}body{margin:0;min-height:100vh;display:flex;flex-direction:column}html{margin:0;font-family:system-ui,sans-serif;background:var(--background)}main{flex:1}header{background:var(--pane)}header>div{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:2rem;margin:auto;padding:16px;font-family:Comfortaa;font-weight:700;font-size:1rem;@media (min-width: 1200px){width:1200px}}nav{display:flex;flex-direction:row;align-items:center;gap:2rem}#logo{font-size:2rem;color:var(--primary);text-wrap:nowrap}h1,h2,h3,h4{font-family:Comfortaa;font-weight:400;color:var(--headline);padding:0}h1{color:var(--primary);font-size:3rem}h2{font-size:2rem}h3{font-size:1.5rem}h4{font-size:1.25rem}code{font-family:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace}code:not(pre>code){background-color:#21252b;font-size:.9rem;padding:0 4px;border-radius:4px}.astro-code{padding:16px;max-width:80vw}pre{background-color:#21252b!important}.markdown-alert-title{margin-bottom:8px}footer{color:var(--hint);text-align:center;margin-bottom:16px}
</style></head> <body> <header> <div> <a href="/" id="logo">&gt; _</a> <nav> <a href="https://code.evalyte.net" target="_blank">Repositories</a> <!--<a href="/devlog">Devlog</a>--> <a href="/notes">Notes</a> <!--<a href="/utilities">Utilities</a>--> <!--<a href="/services">Services</a>--> <a href="/about">About</a> </nav> </div> </header> <main data-astro-cid-hhdr4bp3> <div style="display:flex;flex-direction:column;gap:var(--default-gap);justify-content:center;align-items:start"> <div style="display:flex;flex-direction:column;gap:var(--default-gap);justify-content:center;align-items:start"> <h1 data-astro-cid-hhdr4bp3>Quick Sort algorithm</h1> </div> <div style="flex:1"> <p data-astro-cid-hhdr4bp3> <p>To explain the Quick Sort algorithm, lets take a simple example:</p>
<p>We have an array of number (integer) in random order, but we want them in ascending order, so we have to sort them, here comes the Quick Sort algorithm.</p>
<p><em>Note: The range of the numbers and the length of the array have no importance for the algorithm itself, but it will have a performance cost.</em></p>
<h2 id="algorithm">Algorithm</h2>
<p>Select a number, called “pivot”, chosen arbritrary from the array itself, put all the numbers lower than the pivot before it and all the numbers greater after it, split the current partition into 2 new partitions (the ones before and after the pivot), and repeat the procedure for each partition until there is no partition left (when the array length is 1).</p>
<p>The Quick Sort algorithm steps are:</p>
<ul>
<li>Select a pivot value from the partition and move it at the end of the partition (P, the pivot value).</li>
<li>Remember the start index of the current partition (S, the start index).</li>
<li>for each element (E), if E is lower or equal than P, then swap value E with the value at index S, then increment S.</li>
<li>Use the pivot P to divide the partition into 2 new partitions.</li>
<li>Repeat the algorithm for the 2 newly created partitions until there is no partition left.</li>
</ul>
<h2 id="implementation">Implementation</h2>
<h4 id="go">Go</h4>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="go"><code><span class="line"><span style="color:#F97583">func</span><span style="color:#B392F0"> Swap</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">partition</span><span style="color:#E1E4E8"> []</span><span style="color:#F97583">int</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">i</span><span style="color:#F97583"> int</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">j</span><span style="color:#F97583"> int</span><span style="color:#E1E4E8">) {</span></span>
<span class="line"><span style="color:#E1E4E8"> partition[i], partition[j] </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> partition[j], partition[i]</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">func</span><span style="color:#B392F0"> QuickSort</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">partition</span><span style="color:#E1E4E8"> []</span><span style="color:#F97583">int</span><span style="color:#E1E4E8">) {</span></span>
<span class="line"><span style="color:#B392F0"> Swap</span><span style="color:#E1E4E8">(partition, </span><span style="color:#B392F0">len</span><span style="color:#E1E4E8">(partition) </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 2</span><span style="color:#E1E4E8">, </span><span style="color:#B392F0">len</span><span style="color:#E1E4E8">(partition) </span><span style="color:#F97583">-</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">) </span><span style="color:#6A737D">// Select the pivot from the middle (arbitrary) of the partition and swap it with the last element</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> startIndex </span><span style="color:#F97583">:=</span><span style="color:#79B8FF"> 0</span></span>
<span class="line"><span style="color:#E1E4E8"> pivot </span><span style="color:#F97583">:=</span><span style="color:#E1E4E8"> partition[</span><span style="color:#B392F0">len</span><span style="color:#E1E4E8">(partition) </span><span style="color:#F97583">-</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">] </span><span style="color:#6A737D">// Since we already swapped the pivot, we get the value directly from the end of the partition</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583"> for</span><span style="color:#E1E4E8"> i </span><span style="color:#F97583">:=</span><span style="color:#E1E4E8"> startIndex; i </span><span style="color:#F97583">&#x3C;</span><span style="color:#B392F0"> len</span><span style="color:#E1E4E8">(partition); i</span><span style="color:#F97583">++</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#F97583"> if</span><span style="color:#E1E4E8"> partition[i] </span><span style="color:#F97583">&#x3C;=</span><span style="color:#E1E4E8"> pivot {</span></span>
<span class="line"><span style="color:#B392F0"> Swap</span><span style="color:#E1E4E8">(partition, i, startIndex)</span></span>
<span class="line"><span style="color:#E1E4E8"> startIndex</span><span style="color:#F97583">++</span></span>
<span class="line"><span style="color:#E1E4E8"> }</span></span>
<span class="line"><span style="color:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"> // startIndex now point at the first element of the values greater or equal than the pivot</span></span>
<span class="line"><span style="color:#F97583"> if</span><span style="color:#E1E4E8"> startIndex </span><span style="color:#F97583">></span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#B392F0"> QuickSort</span><span style="color:#E1E4E8">(partition[:startIndex </span><span style="color:#F97583">-</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">])</span></span>
<span class="line"><span style="color:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583"> if</span><span style="color:#B392F0"> len</span><span style="color:#E1E4E8">(partition) </span><span style="color:#F97583">-</span><span style="color:#E1E4E8"> startIndex </span><span style="color:#F97583">></span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#B392F0"> QuickSort</span><span style="color:#E1E4E8">(partition[startIndex:])</span></span>
<span class="line"><span style="color:#E1E4E8"> }</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span></code></pre>
<h2 id="performance-speed">Performance (speed)</h2>
<p>Average: O(n*log(n))<br>
Best case: O(n*log(n))<br>
Worst case: O(n²)</p>
<h2 id="sources">Sources</h2>
<p><a href="https://fr.wikipedia.org/wiki/Tri_rapide">https://fr.wikipedia.org/wiki/Tri_rapide</a> (fr)<br>
<a href="https://en.wikipedia.org/wiki/Quicksort">https://en.wikipedia.org/wiki/Quicksort</a> (en)<br>
My experience.</p> </p> </div> </div> </main> <footer>© 2024 Evalyte</footer> </body></html>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="description" content="Evalyte"><meta name="viewport" content="width=device-width"><!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />--><meta name="generator" content="Astro v5.9.2"><title>undefined - Evalyte</title><script defer src="https://umami.evalyte.net/script.js" data-website-id="4fd77337-0f39-4eac-b19b-c09ebf8c8db3"></script><style>@media (prefers-color-scheme: dark){.markdown-alert{--color-border-default: #30363d;--color-accent-fg: #58a6ff;--color-accent-emphasis: #1f6feb;--color-danger-fg: #f85149;--color-danger-emphasis: #da3633;--color-attention-fg: #d29922;--color-attention-emphasis: #9e6a03;--color-done-fg: #a371f7;--color-done-emphasis: #8957e5;--color-success-fg: #3fb950;--color-success-emphasis: #238636}}@media (prefers-color-scheme: light){.markdown-alert{--color-border-default: #d0d7de;--color-accent-fg: #0969da;--color-accent-emphasis: #0969da;--color-danger-fg: #d1242f;--color-danger-emphasis: #cf222e;--color-attention-fg: #9a6700;--color-attention-emphasis: #9a6700;--color-done-fg: #8250df;--color-done-emphasis: #8250df;--color-success-fg: #1a7f37;--color-success-emphasis: #1f883d}}.markdown-alert{border-left:.25em solid var(--borderColor-default, var(--color-border-default));color:inherit;margin-bottom:16px;padding:.5rem 1em}.markdown-alert>:last-child{margin-bottom:0!important}.markdown-alert .markdown-alert-title{align-items:center;display:flex;font-size:14px;font-weight:500;line-height:1}.markdown-alert .markdown-alert-title svg.octicon{margin-right:8px!important;margin-right:var(--base-size-8,8px)!important;fill:currentColor}.markdown-alert.markdown-alert-note{border-left-color:var(--borderColor-accent-emphasis,var(--color-accent-emphasis))}.markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--color-accent-fg);color:var(--fgColor-accent,var(--color-accent-fg))}.markdown-alert.markdown-alert-tip{border-left-color:var(--borderColor-success-emphasis,var(--color-success-emphasis))}.markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--color-success-fg);color:var(--fgColor-success,var(--color-success-fg))}.markdown-alert.markdown-alert-important{border-left-color:var(--borderColor-done-emphasis,var(--color-done-emphasis))}.markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--color-done-fg);color:var(--fgColor-done,var(--color-done-fg))}.markdown-alert.markdown-alert-warning{border-left-color:var(--borderColor-attention-emphasis,var(--color-attention-emphasis))}.markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--color-attention-fg);color:var(--fgColor-attention,var(--color-attention-fg))}.markdown-alert.markdown-alert-caution{border-left-color:var(--borderColor-danger-emphasis,var(--color-danger-emphasis))}.markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--color-danger-fg);color:var(--fgColor-danger,var(--color-danger-fg))}main[data-astro-cid-hhdr4bp3]{padding:32px;display:flex;flex-direction:column;align-items:center;margin:auto;max-width:1200px;gap:32px}
@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Regular.ttf);font-weight:400}@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Bold.ttf);font-weight:700}:root{--primary: #5d9eda;--secondary: #b1d0ee;--background: #282c34;--pane: #21252b;--surface: #31353f;--surface2: #51555f;--text: #d1d1d1;--headline: #ffffff;--hint: #797979;color:var(--text);--default-gap: 16px}a{text-decoration:none;color:var(--secondary)}nav>a{color:var(--text)}body{margin:0;min-height:100vh;display:flex;flex-direction:column}html{margin:0;font-family:system-ui,sans-serif;background:var(--background)}main{flex:1}header{background:var(--pane)}header>div{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:2rem;margin:auto;padding:16px;font-family:Comfortaa;font-weight:700;font-size:1rem;@media (min-width: 1200px){width:1200px}}nav{display:flex;flex-direction:row;align-items:center;gap:2rem}#logo{font-size:2rem;color:var(--primary);text-wrap:nowrap}h1,h2,h3,h4{font-family:Comfortaa;font-weight:400;color:var(--headline);padding:0}h1{color:var(--primary);font-size:3rem}h2{font-size:2rem}h3{font-size:1.5rem}h4{font-size:1.25rem}code{font-family:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace}code:not(pre>code){background-color:#21252b;font-size:.9rem;padding:0 4px;border-radius:4px}.astro-code{padding:16px;max-width:80vw}pre{background-color:#21252b!important}.markdown-alert-title{margin-bottom:8px}footer{color:var(--hint);text-align:center;margin-bottom:16px}
</style></head> <body> <header> <div> <a href="/" id="logo">&gt; _</a> <nav> <a href="https://code.evalyte.net" target="_blank">Repositories</a> <!--<a href="/devlog">Devlog</a>--> <a href="/notes">Notes</a> <!--<a href="/utilities">Utilities</a>--> <!--<a href="/services">Services</a>--> <a href="/about">About</a> </nav> </div> </header> <main data-astro-cid-hhdr4bp3> <div style="display:flex;flex-direction:column;gap:var(--default-gap);justify-content:center;align-items:start"> <div style="display:flex;flex-direction:column;gap:var(--default-gap);justify-content:center;align-items:start"> <h1 data-astro-cid-hhdr4bp3>Selfhost Forgejo with Podman without Quadlet</h1> </div> <div style="flex:1"> <p data-astro-cid-hhdr4bp3> <p>When self-hosting Forgejo, <a href="https://forgejo.org/docs/latest/admin/installation/">the official documentation</a>
provides the steps for binary, Docker and Podman.</p>
<p>However the provided steps for installing with Podman use Quadlet, and if youre out of luck and
Quadlet isnt available in your environment you have to use the Podman CLI, but your lose some nice
things that Quadlet has, especially restart on boot.</p>
<p>Unfortunatly the Forgejo documentation doesnt tell us how to but its easily deductible from the
Quadlet/Systemd config file they provide</p>
<h3 id="script">Script</h3>
<div class="markdown-alert markdown-alert-note" dir="auto">
<p class="markdown-alert-title" dir="auto"><svg class="octicon" viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>NOTE</p>
<p>You might need to modify some values in the script below for your use case</p>
</div>
<p>First, create a directory named <code>forgejo-volume</code>, then create the <code>data</code> and <code>conf</code> directories
inside it so you have <code>forgejo-volume/data</code> and <code>forgejo-volume/conf</code></p>
<p>Then the command is:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">podman</span><span style="color:#9ECBFF"> run</span><span style="color:#79B8FF"> \</span></span>
<span class="line"><span style="color:#79B8FF"> --name</span><span style="color:#9ECBFF"> forgejo</span><span style="color:#79B8FF"> \</span></span>
<span class="line"><span style="color:#79B8FF"> --restart=always</span><span style="color:#79B8FF"> \</span></span>
<span class="line"><span style="color:#79B8FF"> --userns=keep-id:uid=1000,gid=1000</span><span style="color:#79B8FF"> \</span></span>
<span class="line"><span style="color:#79B8FF"> -p</span><span style="color:#9ECBFF"> 3000:3000</span><span style="color:#79B8FF"> \</span></span>
<span class="line"><span style="color:#79B8FF"> -p</span><span style="color:#9ECBFF"> 2222:2222</span><span style="color:#79B8FF"> \</span></span>
<span class="line"><span style="color:#79B8FF"> -v</span><span style="color:#9ECBFF"> ./forgejo-volume/data:/var/lib/gitea</span><span style="color:#79B8FF"> \</span></span>
<span class="line"><span style="color:#79B8FF"> -v</span><span style="color:#9ECBFF"> ./forgejo-volume/conf:/etc/gitea</span><span style="color:#79B8FF"> \</span></span>
<span class="line"><span style="color:#9ECBFF"> codeberg.org/forgejo/forgejo:11-rootless</span></span></code></pre>
<p>Some explanation:</p>
<ul>
<li><code>--restart=always</code> allows us to restart the container on boot, you need to tell systemd to do it
with <code>systemctl --user enable podman-restart.service</code></li>
<li><code>--userns=keep-id:uid=1000,gid=1000</code> allows us to keep the permissions for the volume while
using 1000 for the UID and GID inside the container (because we are using the rootless version)</li>
<li><code>-p 3000:3000</code> Forgejo will listen on port 3000</li>
<li><code>-p 2222:2222</code> Forgejo will accept SSH through port 2222</li>
<li>the two following <code>-v</code> parameters map the volume to the directories inside the container</li>
</ul> </p> </div> </div> </main> <footer>© 2024 Evalyte</footer> </body></html>

7
dist/services/index.html vendored Normal file
View file

@ -0,0 +1,7 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="description" content="Evalyte"><meta name="viewport" content="width=device-width"><!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />--><meta name="generator" content="Astro v5.9.2"><title>Evalyte - Services</title><script defer src="https://umami.evalyte.net/script.js" data-website-id="4fd77337-0f39-4eac-b19b-c09ebf8c8db3"></script><style>@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Regular.ttf);font-weight:400}@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Bold.ttf);font-weight:700}:root{--primary: #5d9eda;--secondary: #b1d0ee;--background: #282c34;--pane: #21252b;--surface: #31353f;--surface2: #51555f;--text: #d1d1d1;--headline: #ffffff;--hint: #797979;color:var(--text);--default-gap: 16px}a{text-decoration:none;color:var(--secondary)}nav>a{color:var(--text)}body{margin:0;min-height:100vh;display:flex;flex-direction:column}html{margin:0;font-family:system-ui,sans-serif;background:var(--background)}main{flex:1}header{background:var(--pane)}header>div{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:2rem;margin:auto;padding:16px;font-family:Comfortaa;font-weight:700;font-size:1rem;@media (min-width: 1200px){width:1200px}}nav{display:flex;flex-direction:row;align-items:center;gap:2rem}#logo{font-size:2rem;color:var(--primary);text-wrap:nowrap}h1,h2,h3,h4{font-family:Comfortaa;font-weight:400;color:var(--headline);padding:0}h1{color:var(--primary);font-size:3rem}h2{font-size:2rem}h3{font-size:1.5rem}h4{font-size:1.25rem}code{font-family:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace}code:not(pre>code){background-color:#21252b;font-size:.9rem;padding:0 4px;border-radius:4px}.astro-code{padding:16px;max-width:80vw}pre{background-color:#21252b!important}.markdown-alert-title{margin-bottom:8px}footer{color:var(--hint);text-align:center;margin-bottom:16px}
main[data-astro-cid-ucd2ps2b]{margin:auto;padding:32px;width:800px;max-width:calc(100% - 2rem);display:flex;flex-direction:column;align-items:center}#description[data-astro-cid-ucd2ps2b]{text-align:center;margin-top:32px;margin-bottom:32px}#applications[data-astro-cid-ucd2ps2b]{padding:32px;display:grid;width:100%;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:32px}#empty[data-astro-cid-ucd2ps2b]{color:var(--hint)}
</style></head> <body> <header> <div> <a href="/" id="logo">&gt; _</a> <nav> <a href="https://code.evalyte.net" target="_blank">Repositories</a> <!--<a href="/devlog">Devlog</a>--> <a href="/notes">Notes</a> <!--<a href="/utilities">Utilities</a>--> <!--<a href="/services">Services</a>--> <a href="/about">About</a> </nav> </div> </header> <main data-astro-cid-ucd2ps2b> <h1 data-astro-cid-ucd2ps2b>Services</h1> <p id="description" data-astro-cid-ucd2ps2b>
Open source, self-hostable or use the free instances with limits
</p> <section id="applications" data-astro-cid-ucd2ps2b> <!--<Card title="Awary" body="Logs and metrics for your apps" href="#"/>--> <!--<Card title="Share" body="Share text, images and links easily" href="#"/>--> <!--<Card title="Anilist Tierlist" body="Make a tierlist using your Anilist lists" href="#"/>--> <!--<Card title="Kona" body="Discord User app" href="#"/>--> </section> <p id="empty" data-astro-cid-ucd2ps2b>
It feels a little bit empty here for now :)
</p> </main> <footer>© 2024 Evalyte</footer> </body></html>

7
dist/utilities/index.html vendored Normal file
View file

@ -0,0 +1,7 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="description" content="Evalyte"><meta name="viewport" content="width=device-width"><!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />--><meta name="generator" content="Astro v5.9.2"><title>Evalyte - Utilities</title><script defer src="https://umami.evalyte.net/script.js" data-website-id="4fd77337-0f39-4eac-b19b-c09ebf8c8db3"></script><style>@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Regular.ttf);font-weight:400}@font-face{font-family:Comfortaa;src:url(/fonts/Comfortaa-Bold.ttf);font-weight:700}:root{--primary: #5d9eda;--secondary: #b1d0ee;--background: #282c34;--pane: #21252b;--surface: #31353f;--surface2: #51555f;--text: #d1d1d1;--headline: #ffffff;--hint: #797979;color:var(--text);--default-gap: 16px}a{text-decoration:none;color:var(--secondary)}nav>a{color:var(--text)}body{margin:0;min-height:100vh;display:flex;flex-direction:column}html{margin:0;font-family:system-ui,sans-serif;background:var(--background)}main{flex:1}header{background:var(--pane)}header>div{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:2rem;margin:auto;padding:16px;font-family:Comfortaa;font-weight:700;font-size:1rem;@media (min-width: 1200px){width:1200px}}nav{display:flex;flex-direction:row;align-items:center;gap:2rem}#logo{font-size:2rem;color:var(--primary);text-wrap:nowrap}h1,h2,h3,h4{font-family:Comfortaa;font-weight:400;color:var(--headline);padding:0}h1{color:var(--primary);font-size:3rem}h2{font-size:2rem}h3{font-size:1.5rem}h4{font-size:1.25rem}code{font-family:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace}code:not(pre>code){background-color:#21252b;font-size:.9rem;padding:0 4px;border-radius:4px}.astro-code{padding:16px;max-width:80vw}pre{background-color:#21252b!important}.markdown-alert-title{margin-bottom:8px}footer{color:var(--hint);text-align:center;margin-bottom:16px}
main[data-astro-cid-ube2l6lb]{margin:auto;padding:32px;width:800px;max-width:calc(100% - 2rem);display:flex;flex-direction:column;align-items:center}#description[data-astro-cid-ube2l6lb]{text-align:center;margin-top:32px;margin-bottom:32px}#applications[data-astro-cid-ube2l6lb]{padding:32px;display:grid;width:100%;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:32px}#empty[data-astro-cid-ube2l6lb]{color:var(--hint)}
</style></head> <body> <header> <div> <a href="/" id="logo">&gt; _</a> <nav> <a href="https://code.evalyte.net" target="_blank">Repositories</a> <!--<a href="/devlog">Devlog</a>--> <a href="/notes">Notes</a> <!--<a href="/utilities">Utilities</a>--> <!--<a href="/services">Services</a>--> <a href="/about">About</a> </nav> </div> </header> <main data-astro-cid-ube2l6lb> <h1 data-astro-cid-ube2l6lb>Utilities</h1> <p id="description" data-astro-cid-ube2l6lb>
Free & open source
</p> <section id="applications" data-astro-cid-ube2l6lb> <!--<Card title="Sway wallpaper" body="Display wallpapers on Sway with added functionalities" href="#"/>--> </section> <p id="empty" data-astro-cid-ube2l6lb>
It feels a little bit empty here for now :)
</p> </main> <footer>© 2024 Evalyte</footer> </body></html>

5952
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

18
package.json Normal file
View file

@ -0,0 +1,18 @@
{
"name": "",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"build": "astro check && astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"@astrojs/check": "^0.9.4",
"astro": "^5.9.2",
"remark-github-blockquote-alert": "^1.3.1",
"typescript": "^5.6.3"
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

15
src/components/Box.astro Normal file
View file

@ -0,0 +1,15 @@
---
interface Props {
flex?: number
}
const { flex } = Astro.props;
const style = {
flex: flex
}
---
<div style={style}>{<slot/>}</div>

View file

@ -0,0 +1,31 @@
---
interface Props {
href?: string;
}
const { href } = Astro.props;
---
<a href={href} target="_blank" class="button">{<slot/>}</a>
<style>
.button {
color: var(--secondary);
background: none;
border: 1px solid var(--secondary);
border-radius: 8px;
padding: 8px;
padding-left: 16px;
padding-right: 16px;
font-size: 1.5rem;
cursor: pointer;
}
.button:hover {
background-color: #b1d0ee09;
}
</style>

51
src/components/Card.astro Normal file
View file

@ -0,0 +1,51 @@
---
interface Props {
title: string;
createdAt: Date;
updatedAt: Date;
href: string;
}
const { href, title, createdAt } = Astro.props;
---
<a href={href} class="card">
<h4>{title}</h4>
<div class="date">{createdAt?.toLocaleDateString()}</div>
</a>
<style>
h4 {
color: var(--secondary);
text-align: center;
}
p {
color: var(--text);
}
.card {
border: 1px solid var(--surface2);
background: var(--surface);
transition-duration: 0.5s;
&:hover {
box-shadow: inset 0 0 100px 100px rgba(100, 100, 100, 0.1);
}
padding-left: 16px;
padding-right: 16px;
border-radius: 8px;
display: flex;
flex-direction: row;
align-items: start;
gap: 16px;
}
.date {
margin-left: auto;
align-self: end;
color: var(--hint);
margin-bottom: 8px;
}
</style>

22
src/components/Flex.astro Normal file
View file

@ -0,0 +1,22 @@
---
interface Props {
direction?: "row" | "column";
gap?: number
justify?: "start" | "end" | "center"
align?: "start" | "end" | "center"
}
const { direction, gap, justify, align } = Astro.props;
const style = {
display: "flex",
flexDirection: direction ?? "row",
gap: gap ? `${gap}px` : "var(--default-gap)",
justifyContent: justify ?? "center",
alignItems: align ?? "center"
}
---
<div style={style}>{<slot/>}</div>

View file

@ -0,0 +1,65 @@
---
interface Props {
title: string;
description: string;
href: string;
openInNewTab?: boolean
image: ((_props: astroHTML.JSX.SVGAttributes) => any) & ImageMetadata;
}
const { href, title, openInNewTab } = Astro.props;
---
<a href={href} target={openInNewTab ? "_blank" : "_self"} class="card">
<Astro.props.image class="image"/>
<div class="text">
<h4>
{title}
</h4>
<!--<p class="description">-->
<!--{description}-->
<!--</p>-->
</div>
</a>
<style>
h4 {
color: var(--text);
text-align: center;
}
p {
color: var(--text);
}
.card {
transition-duration: 0.5s;
min-width: 256px;
border: 1px solid var(--surface2);
background: var(--surface);
&:hover {
box-shadow: inset 0 0 100px 100px rgba(100, 100, 100, 0.1);
}
padding: 16px;
padding-left: 32px;
padding-right: 32px;
border-radius: 8px;
display: flex;
flex-direction: row;
align-items: center;
gap: 16px;
}
.image {
color: var(--secondary);
stroke: currentColor;
width: 64px;
height: 64px;
}
.description {
text-align: center;
}
</style>

View file

@ -0,0 +1,69 @@
---
slug: quick-sort-algorithm
title: Quick Sort algorithm
createdAt: 2021-02-01
description: Description and implementation of the Quick Sort algorithm
---
To explain the Quick Sort algorithm, let's take a simple example:
We have an array of number (integer) in random order, but we want them in ascending order, so we have to sort them, here comes the Quick Sort algorithm.
*Note: The range of the numbers and the length of the array have no importance for the algorithm itself, but it will have a performance cost.*
## Algorithm
Select a number, called "pivot", chosen arbritrary from the array itself, put all the numbers lower than the pivot before it and all the numbers greater after it, split the current partition into 2 new partitions (the ones before and after the pivot), and repeat the procedure for each partition until there is no partition left (when the array length is 1).
The Quick Sort algorithm steps are:
- Select a pivot value from the partition and move it at the end of the partition (P, the pivot value).
- Remember the start index of the current partition (S, the start index).
- for each element (E), if E is lower or equal than P, then swap value E with the value at index S, then increment S.
- Use the pivot P to divide the partition into 2 new partitions.
- Repeat the algorithm for the 2 newly created partitions until there is no partition left.
## Implementation
#### Go
```go
func Swap(partition []int, i int, j int) {
partition[i], partition[j] = partition[j], partition[i]
}
func QuickSort(partition []int) {
Swap(partition, len(partition) / 2, len(partition) - 1) // Select the pivot from the middle (arbitrary) of the partition and swap it with the last element
startIndex := 0
pivot := partition[len(partition) - 1] // Since we already swapped the pivot, we get the value directly from the end of the partition
for i := startIndex; i < len(partition); i++ {
if partition[i] <= pivot {
Swap(partition, i, startIndex)
startIndex++
}
}
// startIndex now point at the first element of the values greater or equal than the pivot
if startIndex > 1 {
QuickSort(partition[:startIndex - 1])
}
if len(partition) - startIndex > 1 {
QuickSort(partition[startIndex:])
}
}
```
## Performance (speed)
Average: O(n\*log(n))
Best case: O(n\*log(n))
Worst case: O(n²)
## Sources
https://fr.wikipedia.org/wiki/Tri_rapide (fr)
https://en.wikipedia.org/wiki/Quicksort (en)
My experience.

View file

@ -0,0 +1,50 @@
---
slug: selfhost-forgejo-with-podman-without-quadlet
title: Selfhost Forgejo with Podman without Quadlet
createdAt: 2025-06-11
updatedAt: 2025-06-11
---
When self-hosting Forgejo, [the official documentation](https://forgejo.org/docs/latest/admin/installation/)
provides the steps for binary, Docker and Podman.
However the provided steps for installing with Podman use Quadlet, and if you're out of luck and
Quadlet isn't available in your environment you have to use the Podman CLI, but your lose some nice
things that Quadlet has, especially restart on boot.
Unfortunatly the Forgejo documentation doesn't tell us how to but it's easily deductible from the
Quadlet/Systemd config file they provide
### Script
> [!NOTE]
> You might need to modify some values in the script below for your use case
First, create a directory named `forgejo-volume`, then create the `data` and `conf` directories
inside it so you have `forgejo-volume/data` and `forgejo-volume/conf`
Then the command is:
```bash
podman run \
--name forgejo \
--restart=always \
--userns=keep-id:uid=1000,gid=1000 \
-p 3000:3000 \
-p 2222:2222 \
-v ./forgejo-volume/data:/var/lib/gitea \
-v ./forgejo-volume/conf:/etc/gitea \
codeberg.org/forgejo/forgejo:11-rootless
```
Some explanation:
- `--restart=always` allows us to restart the container on boot, you need to tell systemd to do it
with `systemctl --user enable podman-restart.service`
- `--userns=keep-id:uid=1000,gid=1000` allows us to keep the permissions for the volume while
using 1000 for the UID and GID inside the container (because we are using the rootless version)
- `-p 3000:3000` Forgejo will listen on port 3000
- `-p 2222:2222` Forgejo will accept SSH through port 2222
- the two following `-v` parameters map the volume to the directories inside the container

1
src/env.d.ts vendored Normal file
View file

@ -0,0 +1 @@
/// <reference path="../.astro/types.d.ts" />

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 8L3 12L8 16M16 16L21 12L16 8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 339 B

4
src/images/devlog.svg Normal file
View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.9485 11.0195C21.2909 11.6283 21.2909 12.3717 20.9485 12.9805L17.5735 18.9805C17.2192 19.6103 16.5529 20 15.8303 20H8.16969C7.44715 20 6.78078 19.6103 6.42654 18.9805L3.05154 12.9805C2.70908 12.3717 2.70908 11.6283 3.05154 11.0195L6.42654 5.01948C6.78078 4.38972 7.44715 4 8.16969 4H15.8303C16.5529 4 17.2192 4.38972 17.5735 5.01948L20.9485 11.0195Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 661 B

4
src/images/note.svg Normal file
View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13 3H7C5.89543 3 5 3.89543 5 5V19C5 20.1046 5.89543 21 7 21H17C18.1046 21 19 20.1046 19 19V9M13 3L19 9M13 3V8C13 8.55228 13.4477 9 14 9H19M9 13H15M9 17H15" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 464 B

194
src/layouts/Layout.astro Normal file
View file

@ -0,0 +1,194 @@
---
interface Props {
title: string;
}
const { title } = Astro.props;
---
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="description" content="Evalyte" />
<meta name="viewport" content="width=device-width" />
<!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />-->
<meta name="generator" content={Astro.generator} />
<title>{title}</title>
<script defer src="https://umami.evalyte.net/script.js" data-website-id="4fd77337-0f39-4eac-b19b-c09ebf8c8db3"></script>
</head>
<body>
<header>
<div>
<a href="/" id="logo">&gt; _</a>
<nav>
<a href="https://code.evalyte.net" target="_blank">Repositories</a>
<!--<a href="/devlog">Devlog</a>-->
<a href="/notes">Notes</a>
<!--<a href="/utilities">Utilities</a>-->
<!--<a href="/services">Services</a>-->
<a href="/about">About</a>
</nav>
</div>
</header>
<slot />
<footer>© 2024 Evalyte</footer>
</body>
</html>
<style is:global>
@font-face {
font-family: 'Comfortaa';
src: url('/fonts/Comfortaa-Regular.ttf');
font-weight: normal;
}
@font-face {
font-family: 'Comfortaa';
src: url('/fonts/Comfortaa-Bold.ttf');
font-weight: bold;
}
:root {
--primary: #5d9eda;
--secondary: #b1d0ee;
--background: #282c34;
--pane: #21252b;
--surface: #31353f;
--surface2: #51555f;
/*--background: #333333;*/
/*--pane: #242424;*/
/*--surface: #434343;*/
--text: #d1d1d1;
--headline: #ffffff;
--hint: #797979;
color: var(--text);
/* components */
--default-gap: 16px;
}
a {
text-decoration: none;
color: var(--secondary);
}
nav > a {
color: var(--text);
}
body {
margin: 0;
min-height: 100vh;
display: flex;
flex-direction: column;
}
html {
margin: 0;
font-family: system-ui, sans-serif;
background: var(--background);
}
main {
flex: 1;
}
header {
background: var(--pane);
}
header > div {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
gap: 2rem;
margin: auto;
padding: 16px;
font-family: "Comfortaa";
font-weight: bold;
font-size: 1rem;
@media (min-width: 1200px) {
width: 1200px;
}
}
nav {
display: flex;
flex-direction: row;
align-items: center;
gap: 2rem;
}
#logo {
font-size: 2rem;
color: var(--primary);
text-wrap: nowrap;
}
h1, h2, h3, h4 {
font-family: "Comfortaa";
font-weight: normal;
color: var(--headline);
padding: 0;
}
h1 {
color: var(--primary);
font-size: 3rem;
}
h2 {
font-size: 2rem;
}
h3 {
font-size: 1.5rem;
}
h4 {
font-size: 1.25rem;
}
code {
font-family:
Menlo,
Monaco,
Lucida Console,
Liberation Mono,
DejaVu Sans Mono,
Bitstream Vera Sans Mono,
Courier New,
monospace;
}
code:not(pre > code) {
padding: 0px;
background-color: #21252b;
font-size: 0.9rem;
padding-left: 4px;
padding-right: 4px;
border-radius: 4px;
}
.astro-code {
padding: 16px;
max-width: 80vw;
}
pre {
background-color: #21252b !important;
}
.markdown-alert-title {
margin-bottom: 8px;
}
footer {
color: var(--hint);
text-align: center;
margin-bottom: 16px;
}
</style>

54
src/pages/about.astro Normal file
View file

@ -0,0 +1,54 @@
---
import Layout from '../layouts/Layout.astro';
---
<Layout title="Evalyte - About">
<main>
<section>
<h1>Hello, World</h1>
<p>
I'm a self-taught developer who likes to create desktop & web applications, custom tools and sometimes games.</br></br>
As I really like to understand how things work, I do a lot of projects and enjoy reinventing the wheel, creating my own software, this is the reason this website exists.
</p>
</section>
<section>
<h1>What exactly is Evalyte ?</h1>
<p>
Evalyte is the brand for my projects, a namespace, my lab and my way of sharing about software and open source, it's like my home, it's not my nickname.</br></br>
You'll find here mostly desktop apps, web apps and other things related to tech.</br></br>
Everything I make available here is free and open source, most are self-made but I might also host existing software.
</p>
</section>
<section>
<h1>Want to contribute ?</h1>
<p>
You can report issues or make suggestions,
but I don't accept contributions in the form code or pull request, I want to stay the
only owner and developer for now.
</p>
</section>
</main>
</Layout>
<style>
main {
margin: auto;
padding: 32px;
width: 800px;
max-width: calc(100% - 2rem);
display: flex;
flex-direction: column;
}
section {
display: flex;
flex-direction: column;
}
</style>

128
src/pages/index.astro Normal file
View file

@ -0,0 +1,128 @@
---
import Layout from '../layouts/Layout.astro';
import PortalCategory from "../components/PortalCategory.astro"
import CodeBrackets from '../images/code-brackets.svg'
import Note from '../images/note.svg'
import Devlog from '../images/devlog.svg'
---
<Layout title="Evalyte">
<main>
<div id="page-intro">
<h1>Evalyte</h1>
</div>
<p id="firstline">
Welcome, I'm <strong>Vyn</strong>, and <strong>Evalyte</strong> is my place where I share things, enjoy.
</p>
<div id="content">
<PortalCategory title="Repositories" description="ok" href="https://code.evalyte.net" openInNewTab image={CodeBrackets}/>
<PortalCategory title="Notes" description="ok" href="/notes" image={Note}/>
<!--<PortalCategory title="Devlog" description="ok" href="/devlog" image={Devlog}/>-->
</div>
</main>
</Layout>
<style>
h1 {
margin: 0;
}
main {
padding-top: 0;
display: flex;
flex-direction: column;
gap: 32px;
}
#page-intro {
display: flex;
flex-direction: column;
align-items: center;
gap: 32px;
padding: 32px;
padding-bottom: 96px;
background: var(--pane);
}
#content {
margin-left: auto;
margin-right: auto;
display: flex;
flex-direction: column;
align-items: center;
gap: 32px;
@media (min-width: 1200px) {
width: 1200px;
}
}
#description {
margin-bottom: 32px;
}
#firstline {
text-align: center;
margin-top: 32px;
margin-bottom: 32px;
}
/*.image > img {*/
/*width: 100%;*/
/*height: auto;*/
/*box-shadow: rgba(0, 0, 0, 0.25) 0px 54px 55px, rgba(0, 0, 0, 0.12) 0px -12px 30px, rgba(0, 0, 0, 0.12) 0px 4px 6px, rgba(0, 0, 0, 0.17) 0px 12px 13px, rgba(0, 0, 0, 0.09) 0px -3px 5px;*/
/*}*/
.presentation-section {
width: 100%;
display: flex;
flex-direction: row;
gap: 32px;
}
.image-text {
flex: 1;
}
.image-text div {
display: flex;
flex-direction: column;
gap: 32px;
align-items: start;
justify-content: center;
padding:16px;
}
.side-to-side-text {
flex: 1;
display: flex;
flex-direction: column;
gap: 32px;
align-items: start;
justify-content: center;
padding:16px;
}
.button {
color: var(--secondary);
background: none;
border: 1px solid var(--secondary);
border-radius: 8px;
padding: 8px;
padding-left: 16px;
padding-right: 16px;
font-size: 1.5rem;
cursor: pointer;
}
.button:hover {
background-color: #b1d0ee09;
}
h2 {
color: var(--headline);
}
</style>

View file

@ -0,0 +1,46 @@
---
import "remark-github-blockquote-alert/alert.css";
import Layout from '../../layouts/Layout.astro';
import Flex from '../../components/Flex.astro';
import Box from '../../components/Box.astro';
import { getCollection, render } from 'astro:content';
export async function getStaticPaths() {
const posts = await getCollection("notes");
return posts.map(post => ({
params: { id: post.data.slug, slug: post.data.slug },
props: { post },
}));
}
const { post } = Astro.props;
const { Content } = await render(post);
---
<Layout title={`${post.data.name} - Evalyte`}>
<main>
<Flex direction="column" align="start">
<Flex direction="column" align="start">
<h1>{post.data.title}</h1>
</Flex>
<Box flex={1}>
<p>
<Content/>
</p>
</Box>
</Flex>
</main>
</Layout>
<style>
main {
padding: 32px;
display: flex;
flex-direction: column;
align-items: center;
margin: auto;
max-width: 1200px;
gap: 32px;
}
</style>

View file

@ -0,0 +1,48 @@
---
import Layout from '../../layouts/Layout.astro';
import Card from '../../components/Card.astro';
import { getCollection } from 'astro:content';
const notes = await getCollection("notes")
---
<Layout title="Evalyte - Notes">
<main>
<h1>Notes</h1>
<p id="description">
Random things that might be useful.
</p>
<section id="applications">
{notes.map(note => (
<Card title={note.data.title} createdAt={note.data.createdAt} updatedAt={note.data.updatedAt} href={`/notes/${note.data.slug}`}/>
))}
</section>
</main>
</Layout>
<style>
main {
margin: auto;
padding: 32px;
width: 800px;
max-width: calc(100% - 2rem);
display: flex;
flex-direction: column;
align-items: center;;
}
#description {
text-align: center;
margin-top: 32px;
margin-bottom: 32px;
}
#applications {
padding: 32px;
display: flex;
flex-direction: column;
width: 100%;
gap: 16px;
}
</style>

54
src/pages/services.astro Normal file
View file

@ -0,0 +1,54 @@
---
import Layout from '../layouts/Layout.astro';
import Card from '../components/Card.astro';
---
<Layout title="Evalyte - Services">
<main>
<h1>Services</h1>
<p id="description">
Open source, self-hostable or use the free instances with limits
</p>
<section id="applications">
<!--<Card title="Awary" body="Logs and metrics for your apps" href="#"/>-->
<!--<Card title="Share" body="Share text, images and links easily" href="#"/>-->
<!--<Card title="Anilist Tierlist" body="Make a tierlist using your Anilist lists" href="#"/>-->
<!--<Card title="Kona" body="Discord User app" href="#"/>-->
</section>
<p id="empty">
It feels a little bit empty here for now :)
</p>
</main>
</Layout>
<style>
main {
margin: auto;
padding: 32px;
width: 800px;
max-width: calc(100% - 2rem);
display: flex;
flex-direction: column;
align-items: center;;
}
#description {
text-align: center;
margin-top: 32px;
margin-bottom: 32px;
}
#applications {
padding: 32px;
display: grid;
width: 100%;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 32px;
}
#empty {
color: var(--hint);
}
</style>

51
src/pages/utilities.astro Normal file
View file

@ -0,0 +1,51 @@
---
import Layout from '../layouts/Layout.astro';
import Card from '../components/Card.astro';
---
<Layout title="Evalyte - Utilities">
<main>
<h1>Utilities</h1>
<p id="description">
Free & open source
</p>
<section id="applications">
<!--<Card title="Sway wallpaper" body="Display wallpapers on Sway with added functionalities" href="#"/>-->
</section>
<p id="empty">
It feels a little bit empty here for now :)
</p>
</main>
</Layout>
<style>
main {
margin: auto;
padding: 32px;
width: 800px;
max-width: calc(100% - 2rem);
display: flex;
flex-direction: column;
align-items: center;;
}
#description {
text-align: center;
margin-top: 32px;
margin-bottom: 32px;
}
#applications {
padding: 32px;
display: grid;
width: 100%;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 32px;
}
#empty {
color: var(--hint);
}
</style>

7
tsconfig.json Normal file
View file

@ -0,0 +1,7 @@
{
"extends": "astro/tsconfigs/strict",
"compilerOptions": {
"strictNullChecks": true,
"allowJs": true
}
}