From 302d405cc3470ce945b86e60bb7d13355cdb6bc7 Mon Sep 17 00:00:00 2001 From: Snorre Ettrup Altschul Date: Thu, 6 Feb 2025 22:56:02 +0100 Subject: [PATCH] did some grinding off camera --- public/css/css.css | 40 +++++++++- public/index.html | 11 ++- public/js/code_highlighter.js | 14 +++- public/js/md2html.js | 71 +++++++++--------- .../openbirch.png | Bin .../post.md} | 0 .../thumbnail.png | Bin 0 -> 21557 bytes .../hibernating.png | Bin .../post.md} | 51 ++++++++----- .../starting.png | Bin .../thumbnail.png | Bin 0 -> 27604 bytes public/posts/index.html | 30 ++++---- public/posts/test.md | 5 +- src/main.rs | 38 +++++++--- 14 files changed, 169 insertions(+), 91 deletions(-) rename public/posts/{openbirch => My language is 700x slower than python}/openbirch.png (100%) rename public/posts/{How I made a programming language 700x slower than python.md => My language is 700x slower than python/post.md} (100%) create mode 100644 public/posts/My language is 700x slower than python/thumbnail.png rename public/posts/{minecraft-proxy => Putting hungry minecraft servers to sleep}/hibernating.png (100%) rename public/posts/{Putting hungry minecraft servers to sleep.md => Putting hungry minecraft servers to sleep/post.md} (66%) rename public/posts/{minecraft-proxy => Putting hungry minecraft servers to sleep}/starting.png (100%) create mode 100644 public/posts/Putting hungry minecraft servers to sleep/thumbnail.png diff --git a/public/css/css.css b/public/css/css.css index a05d6af..5a2d4f0 100644 --- a/public/css/css.css +++ b/public/css/css.css @@ -1,4 +1,4 @@ -@import url(https://fonts.bunny.net/css?family=chivo-mono:500); +@import url(https://fonts.bunny.net/css?family=albert-sans:400,800); @import url(/css/colours.css); code { @@ -8,6 +8,34 @@ code { border-radius: var(--radius); } +h1 { + letter-spacing: -4%; +} + +h2, +h3 { + letter-spacing: -3%; + margin: calc(2*var(--margin)) 0 +} + +h1,h2,h3 { + margin-bottom:0px; +} + +.header h1 { + margin-bottom: 0.5em; +} + +ul, +ol { + padding-left: calc(4*var(--margin)); +} + +li::marker { + color: var(--link); +} + + ul.posts>li { margin-top: var(--margin); } @@ -23,7 +51,7 @@ pre.codeblock { html { color: var(--text); background-color: var(--background); - font-family: 'Chivo Mono', monospace; + font-family: 'Albert Sans', sans-serif; } body { @@ -33,9 +61,15 @@ body { a { color: var(--link); + transition: 0.1s ease-in-out; + text-decoration: none; } a:visited { + color: var(--link); +} + +a:hover { color: var(--link-visited); } @@ -49,7 +83,7 @@ body { align-items: center; justify-content: center; - line-height: 1.5; + line-height: 1.3; } #content { diff --git a/public/index.html b/public/index.html index 3ec0d87..944601a 100644 --- a/public/index.html +++ b/public/index.html @@ -2,6 +2,7 @@ + @@ -37,15 +38,13 @@ Footer
@@ -61,10 +60,10 @@ let posts = (await response.text()).split("\n"); let p = document.querySelector("#content>.content.posts>h2"); - p.innerText = "Recent posts"; + p.innerHTML = "Recent posts"; let elem = document.querySelector("#content>.content.posts>ul"); - elem.innerHTML = posts.slice(0,3).map(x => `
  • ${x}
  • `).join("\n"); + elem.innerHTML = posts.slice(0, 3).map(x => `
  • ${x}
  • `).join("\n"); elem.style.maxWidth = "40ch"; elem.classList.add("posts"); })() diff --git a/public/js/code_highlighter.js b/public/js/code_highlighter.js index d883e61..f04ab02 100644 --- a/public/js/code_highlighter.js +++ b/public/js/code_highlighter.js @@ -23,6 +23,16 @@ const match = (m) => (peek, take) => { take(m.length); return true; } +const match_identifier = (m) => (peek, take) => { + if (match(m)(peek, take)) { + if (peek(0).match(/[0-9a-z]/)) { + take(-m.length); + return false + } + return true; + } + return false; +} const take_until = (p) => (peek, take) => { let b = ""; while (!p()) { @@ -33,7 +43,7 @@ const take_until = (p) => (peek, take) => { } const simpleHighlight = (c) => (keyword) => (peek, take) => { - if (match(keyword)(peek, take)) + if (match_identifier(keyword)(peek, take)) return `${keyword}`; } @@ -60,7 +70,7 @@ const multiline_comment = (prefix, suffix) => (peek, take) => { const string = (c) => (peek, take) => { if (match(c)(peek, take)) { let b = c; - b += take_until(() => match(c)(peek,take))(peek, take); + b += take_until(() => match(c)(peek, take))(peek, take); b += c; return `${b}` } diff --git a/public/js/md2html.js b/public/js/md2html.js index aa98e10..a925dcf 100644 --- a/public/js/md2html.js +++ b/public/js/md2html.js @@ -62,13 +62,23 @@ const md2tokens = (markdown, newline) => { case '\\': i++; - if (peek(0) == 't' && peek(1) == 'o' && peek(2) == 'c') { - advance(); - advance(); - advance(); + const match_word = (word) => { + for (let j = 0; j < word.length; j++) { + if (peek(j) != word[j]) + return false; + } + i += word.length; + return true; + }; + + if (match_word("toc")) { tokens.push({ type: "toc" }); break; } + if (match_word("title")) { + tokens.push({ type: "title" }); + break; + } current_string += markdown[i]; break; @@ -131,8 +141,7 @@ const md2tokens = (markdown, newline) => { } finish(); - advance(); - advance(); + i += 2; let alt_text = capture_until("]"); advance(); if (!match("(")) { @@ -164,10 +173,7 @@ const md2tokens = (markdown, newline) => { } if (peek(0) == "-" && peek(1) == "-" && peek(2) == "-" && peek(3) == "\n") { - advance(); - advance(); - advance(); - + i += 3; tokens.push({ type: "hline" }); break; } @@ -191,6 +197,15 @@ const md2tokens = (markdown, newline) => { break; case '\n': + if ((peek(-1) != " " || peek(-2) != " ") && peek(-1) != "\n") { + current_string += " "; + tokens.push({ type: "span", content: current_string }); + current_string = ""; + newline = true; + + break; + } + if (newline_count > 2) break; @@ -198,6 +213,8 @@ const md2tokens = (markdown, newline) => { newline_count++; finish(); tokens.push({ type: "newline" }) + if (newline_count == 1 && peek(-1) == "\n") + tokens.push({ type: "newline" }) break; case '[': @@ -261,40 +278,20 @@ const highlight_code = (language, code) => { return highlight(map, code); } -const tokens2html = (tokens) => { +const tokens2html = (tokens, title) => { let output = ""; for (let token of tokens) { switch (token.type) { case "toc": - let htok = tokens.filter(x => x.type == "header"); - console.log(htok); - const createList = (tokens, depth = 2) => { - let list = ''; - let listItems = ''; - - - while (tokens.length > 0 && tokens[0].level <= depth) { - const token = tokens.shift(); - listItems += `
  • ${token.content}
  • `; - - if (tokens.length > 0 && tokens[0].level > token.depth) { - listItems += createList(tokens, token.depth + 1); - } - } - - if (listItems) { - list = `
      ${listItems}
    `; - } - - return list; - }; - - output += createList(htok); + output += "TABLE LE CONTENTOS" + break; + case "title": + output += `

    ${title}

    ` break; case "span": output += `${token.content}`; - break + break; case "bold": output += `${token.content}` break; @@ -305,7 +302,7 @@ const tokens2html = (tokens) => { output += `${token.content}` break; case "header": - output += `${token.content}` + output += `${token.content}` if (token.level == 2) output += "
    "; break; case "hline": diff --git a/public/posts/openbirch/openbirch.png b/public/posts/My language is 700x slower than python/openbirch.png similarity index 100% rename from public/posts/openbirch/openbirch.png rename to public/posts/My language is 700x slower than python/openbirch.png diff --git a/public/posts/How I made a programming language 700x slower than python.md b/public/posts/My language is 700x slower than python/post.md similarity index 100% rename from public/posts/How I made a programming language 700x slower than python.md rename to public/posts/My language is 700x slower than python/post.md diff --git a/public/posts/My language is 700x slower than python/thumbnail.png b/public/posts/My language is 700x slower than python/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..27833da352f61edb9a65f880b2c1423c6815bcaf GIT binary patch literal 21557 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 z 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 WKUc8cX9326GU%cWQKcI9g8m1*&+?A| literal 0 HcmV?d00001 diff --git a/public/posts/minecraft-proxy/hibernating.png b/public/posts/Putting hungry minecraft servers to sleep/hibernating.png similarity index 100% rename from public/posts/minecraft-proxy/hibernating.png rename to public/posts/Putting hungry minecraft servers to sleep/hibernating.png diff --git a/public/posts/Putting hungry minecraft servers to sleep.md b/public/posts/Putting hungry minecraft servers to sleep/post.md similarity index 66% rename from public/posts/Putting hungry minecraft servers to sleep.md rename to public/posts/Putting hungry minecraft servers to sleep/post.md index 894bd7b..c437ea3 100644 --- a/public/posts/Putting hungry minecraft servers to sleep.md +++ b/public/posts/Putting hungry minecraft servers to sleep/post.md @@ -2,32 +2,49 @@ Minecraft Rust Async Networking Proxy CRIU # Minecraft servers are HUNGRY -They hunger for your ram and your cpu. This makes it either expensive or laggy to try and host multiple servers at once. -This was something I encountered when my friend built a homeserver out of spare computer parts that was barely powerful enough to run a minecraft server. -The problem was that soon multiple people wanted a minecraft server hosted by him (which included us wanting to play modded minecraft). +They hunger for your ram and your cpu. This makes it either expensive or +laggy to try and host multiple servers at once. -It was a hassle to ssh into the server and start and stop the various servers depending on who wanted to play, -especially since a lot of people only played very rarily. +This was something I encountered when my friend built a homeserver out of +spare computer parts that was barely powerful enough to run a minecraft +server. -I remembered that I'd seen [a project](https://github.com/gekware/minecraft-server-hibernation) that claimed to be able to hibernate a minecraft server if nobody was playing on it. -The only issue was that it worked for a single server, and did so by starting and stopping the server process. +The problem was that soon multiple people wanted a minecraft server +hosted by him (which included us wanting to play modded minecraft). -This meant that if we wanted to join a modded server the hundreds of mods could make us wait for several minutes before we could play. +It was a hassle to ssh into the server and start and stop the various +servers depending on who wanted to play, especially since a lot of people +only played very rarily. -Another issue was the fact that it could only host a single server. This meant that we would have to run multiple intances of the watcher, -and that each server would be assigned to an arbitrary port that would be needed when connecting. +I remembered that I'd seen +[a project](https://github.com/gekware/minecraft-server-hibernation) +that claimed to be able to hibernate a minecraft server if nobody was +playing on it. The only issue was that it worked for a single server, and +did so by starting and stopping the server process. + +This meant that if we wanted to join a modded server the hundreds of mods +could make us wait for several minutes before we could play. + +Another issue was the fact that it could only host a single server. This +meant that we would have to run multiple intances of the watcher, and that +each server would be assigned to an arbitrary port that would be needed +when connecting. # Building a reverse proxy for minecraft -Since my friends server was accessible through a domain we thought it would be cool if instead of supplying a port -you could connect to a subdomain and be sent to a specific server. +Since my friends server was accessible through a domain we thought it +would be cool if instead of supplying a port you could connect to a +subdomain and be sent to a specific server. -The simplest way to do this would be to create a dhcp record for each subdomain to point to a server, -but that would be slow and tedious to set up for every server. +The simplest way to do this would be to create a dhcp record for each +subdomain to point to a server, but that would be slow and tedious to set +up for every server. -We then tried nginx, as it seemingly could magically redirect traffic to an internal port based on the subdomain. -I quickly found out that this did *not* work for minecraft servers (who would have guessed), but after doing some research -I decided on creating my own reverse proxy that spoke the minecraft protocol instead of HTTP. +We then tried nginx, as it seemingly could magically redirect traffic to +an internal port based on the subdomain. I quickly found out that this did +*not* work for minecraft servers (who would have guessed), but after doing +some research I decided on creating my own reverse proxy that spoke the +minecraft protocol instead of HTTP. # The Minecraft protocol diff --git a/public/posts/minecraft-proxy/starting.png b/public/posts/Putting hungry minecraft servers to sleep/starting.png similarity index 100% rename from public/posts/minecraft-proxy/starting.png rename to public/posts/Putting hungry minecraft servers to sleep/starting.png diff --git a/public/posts/Putting hungry minecraft servers to sleep/thumbnail.png b/public/posts/Putting hungry minecraft servers to sleep/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..32593abbc80b4bd1e130d195ac8af38da22e3fc1 GIT binary patch literal 27604 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 HodX*HPMeW_ literal 0 HcmV?d00001 diff --git a/public/posts/index.html b/public/posts/index.html index 808844c..279e98b 100644 --- a/public/posts/index.html +++ b/public/posts/index.html @@ -2,6 +2,7 @@ +