master
HumanoidSandvichDispenser 2022-09-12 19:20:07 -07:00
commit 6f77542a7f
29 changed files with 870 additions and 0 deletions

2
.gitignore vendored 100644
View File

@ -0,0 +1,2 @@
public/
.hugo_build.lock

View File

@ -0,0 +1,6 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---

23
config.yml 100644
View File

@ -0,0 +1,23 @@
baseURL: "https://sandvich.xyz"
languageCode: "en-us"
title: "sandvich.xyz"
taxonomies:
tag: tags
Params:
remark42SiteID = "sandvich"
remark42Url = "https://remark42.sandvich.xyz"
markup:
highlight:
codeFences: true
hl_Lines: ""
hl_inline: false
lineNoStart: 1
lineNos: true
lineNumbersInTable: true
tabWidth: 4
style: "doom-one"
googleAnalytics: "G-PD0SR7PGT8"

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

View File

@ -0,0 +1,65 @@
#+TITLE: Duolingo is a Video Game
#+DATE: <2022-09-11 Sun>
#+TAGS[]: language
Do you ever wonder what a 2000-day streak on a Duolingo course would be like? You would be imagining that you would be extremely attractive to every single woman and man on the planet with your hyperpolyglot gigachad alpha male tongue.
But 99.9% of the time, that isn't the case.
* The Problem with Duolingo
A lot of people seem to have the misconception that Duolingo will teach you how to speak a language. Duolingo is a video game. A very addictive one at that. The main issue with Duolingo is that you're learning how to /translate/ rather than learning how to /speak/ a language.
This wouldn't normally be a huge issue if you're learning a language gramatically closer to English, such as German, but even 2000-day streakers can make occasional grammar mistakes.
It does, however, get more difficult to use Duolingo to learn distant languages.
** You don't learn to think in your target language
As you learn a language, you should ask yourself: am I thinking in my target language as I read? Let's take this example sentence in Latin.
#+begin_quote
Write this in English: Marcus nōn solus habitat.
#+end_quote
You would normally interpret it in English as:
#+begin_quote
Marcus does not live by himself.
#+end_quote
Because Latin is a highly inflected language, there would be many forms of the same word that would mean different things. The words "habitat" and "habitāre" and "habitō" and "habitāverītis" all mean "to live", but they each mean something different when put in context.
Now if you were prompted to write the same sentence in Latin, you would have trouble trying to decide which inflection to use. Your head is still thinking in English.
Not only that, but how would you translate "by himself" in Latin? At this point, you're writing a Latin sentence with English constructions.
** You're only learning how to translate
After passing your first few lessons in German Duolingo, you would know that:
#+begin_quote
"Mir geht es gut" = "I am fine"
"und" = "and"
"du" = "you"
#+end_quote
If you wanted to translate "I am fine, and you?" then you would string those phrases together in your head.
#+begin_quote
Mir geht es gut, und du?
#+end_quote
The word "du" (nominative) would be incorrect because it is not in the same grammatical case as "mir" (dative).
Duolingo wouldn't teach you this, but if you study the language's grammar, you would understand why it is not correct.
* What should I use Duolingo for then?
As stated before, Duolingo is a video game. You can learn the basics of a language, but you will never learn the grammar and semantics of your target language.
And for some languages, it will instead develop nasty translation habits that would hinder your progress if you continue to pursue learning it.
Depending on the language, it's best that you learn it in context, especially through the [[https://en.wikipedia.org/wiki/Direct_method_(education)][direct method]].

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -0,0 +1,190 @@
#+TITLE: Everyone should learn C
#+DATE: <2022-09-12 Mon>
#+TAGS[]: computer-science
Everyone that is going into computer science should learn how to write C.
I can hear people saying, "But who uses C in 2022? That's for boomers and a waste of time. I'm just going to write everything in my epic wholesome language like Python or JS. That way, I have more time to play Valorant and look at my phone more than my parents."
My reasons that I will list here isn't because C is fast. We all know that C is fast. However, not all of us are going to build an entire operating system, web browser, text editor, etc. And it's also not because there is a lot of demand for C either.
I am going to appear arrogant and unapologetic, but I assume anyone that doesn't know basic C knows less of what they are doing when they program in another language. That, however, does not actually bar you from writing anything good if you have no knowledge of C; plenty of popular software have been written by people who do not know any C.
But how are you going to know how a computer works or how a computer thinks?
* You will start thinking like a computer
Let's take this snippet of JS.
#+begin_src javascript
const arr = [ 2, 3, 5, 7, 9 ]
arr.filter(x => x < 6).map(x => x + 2).forEach(x => console.log(x));
#+end_src
It sounds very declarative. It does what you want it to do. However, the way you read this is a lot like English. Filter the array such that each element is less than 6, add two to each element, and print each element.
It's not that thinking in English is wrong, but if something goes wrong, it's hard to debug and see exactly what happened. It describes what is done but not how it is done, which makes it harder to follow the steps.
Here's the same snippet but in C.
#+begin_src c
int arr[] = { 2, 3, 5, 7, 9 };
int size = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < size; i++) {
if (arr[i] < 6) {
arr[i] += 2;
printf("%d\n", arr[i]);
}
}
#+end_src
You can see exactly what is happening. You are iterating through the array, checking if each element is less than 6, adding 2 if it is, and printing it. This is a lot closer to how computers think.
If something ever goes wrong in the middle of your code, it's easier to see what happened as it is laid out in steps, and you can pinpoint exactly what went wrong.
* You will understand what abstractions do
Higher-level languages do a good job at abstracting this information from you that you do not have to worry about it.
One of the most common abstractions in higher level languages you will see is memory allocation.
The way you learn arrays in higher level languages is that they store an ordered list of objects that you can index by an integer. Indices typically start at 0 because it just is.
#+begin_src python
array = [ None ] * 4
# THIS LANGUAGE IS NOT WHOLESOME POGGERS WHY DOES YOUR CRINGE LANGUAGE START AT ZERO
array[0] = 2
array[1] = 30
array[2] = 4
array[3] = 8
#+end_src
In C, an array is just a bunch of data allocated in memory next to each other.
Index notation in C is short for a pointer to an address with an offset. The reason why indices start at 0 is because it's 0 addresses away from the first element.
#+begin_src c
int main() {
const int len = 4;
int *arr;
// allocate memory for 4 integers that will be next to each other
arr = (int*)malloc(sizeof(int) * len);
// value that arr points to is 2
*arr = 2; // arr[0] = 2
// value of the integer that is 1 address ahead of arr is 30
*(arr + 1) = 30; // arr[1] = 30
// value of the integer that is 2 addresses ahead of arr is 4
arr[2] = 4; // *(arr + 2) = 4
// you can even do something stupid like this
int **next_address = ((int(*)[4])arr) + 1;
int *last_element = (int *)next_address - 1;
*last_element = 8; // arr[3] == *last_element
// this is out of range, but it still compiles
// this may or may not cause can error at runtime
arr[123] = 2;
}
#+end_src
The index operator is only simply another way of writing pointer arithmetic.
Higher level languages hide this from you. They won't show you how memory is laid out in a program.
* You will understand what you write
C# was one of the first languages I learned. One of the things that used to bug me was why different types are passed, compared, and set etc. by value or by reference.
Here we have an example C# program:
#+begin_src csharp
class Program
{
struct TestStruct
{
public int val;
}
class TestClass
{
public int val;
}
static void Main(string[] args)
{
TestStruct forsen = new TestStruct { val = 0 };
TestStruct weeb = new TestStruct { val = 0 };
TestClass velcuz = new TestClass { val = 0 };
TestClass funny = new TestClass { val = 0 };
Console.WriteLine($"forsen is weeb: {forsen == weeb}");
Console.WriteLine($"velcuz is funny: {velcuz == funny}");
Console.WriteLine($"velcuz is weeb: {velcuz.val == weeb.val}");
}
}
#+end_src
#+RESULTS:
: forsen is weeb: true
: velcuz is funny: false
: velcuz is weeb: true
You will notice that when you compare ~forsen~ and ~weeb~, their values are compared, not their reference, so ~forsen == weeb~.
But ~velcuz~ and ~funny~ are reference types, so the addresses they are pointing to are compared.
You will also notice that ~velcuz.val~ is equal to ~weeb.val~, and since they are both ~int~, they are compared by value.
If you were starting to learn, it seems to be confusing because there isn't really a way to distinguish a value and a reference.
Here's the same example but in C.
#+begin_src c
struct test_struct {
int val;
};
int main() {
const SIZE = sizeof(struct test_struct);
struct test_struct forsen = { .val = 0 };
struct test_struct weeb = { .val = 0 };
struct test_struct *velcuz = (struct test_struct*)malloc(SIZE);
velcuz->val = 0;
struct test_struct *funny = (struct test_struct*)malloc(SIZE);
funny->val = 0;
printf("forsen is weeb: %s\n",
memcmp(&forsen, &weeb, SIZE) == 0 ? "true" : "false");
printf("velcuz is funny: %s\n",
memcmp(&velcuz, &funny, SIZE) == 0 ? "true" : "false");
printf("velcuz is weeb: %s\n",
memcmp(&velcuz->val, &weeb.val, SIZE) == 0 ? "true" : "false");
return 0;
}
#+end_src
#+RESULTS:
: forsen is weeb: true
: velcuz is funny: false
: velcuz is weeb: true
C, however, distinguishes values and references with pointers and reference operations. It lets you understand how values and references are compared. The nature of pointers and references are become a lot more obvious, whereas in C#, it just appears to be more theoretical.
* Conclusion
Although you will not write everything in C, it is good to have a fundamental knowledge in C as it gives you an idea of how your computer and how your favorite language works.
It would be easier to teach a student C as it gives them the practical concepts of programming rather than theoretical concepts and paradigms. Just like in math, it is far easier to understand it if you are able to understand proofs rather than simply memorizing equations.
Unlike other languages, C is a rather simple language compared to the abstracted high-level languages they commonly teach in high school (and sometimes college) computer science courses.

View File

@ -0,0 +1,21 @@
#+TITLE: The Fish and Young Argument
#+DATE: <2022-09-09 Fri>
#+TAGS: english language
What is the write way to right?
Stanley Fish argues grammar is structure is essential to English composition. He supports the idea that teaching a /correct/ grammar is essential to teaching composition, and all college composition classes should teach the traditional forms of English grammar for academic writing.
He believes that teaching the "proper" form of English isn't robbing people of whatever dialect of English that they use. Rather, they are learning a new language alongside. This is particularly controversial as it becomes a cultural value.
However, Vershawn Ashanti Young instead claims that English composition should be taught by "code meshing" or blending dialects together, borrowing elements from each other. He argues this would bridge cultural differences and serve as a more diverse way of teaching English.
Rather than there being a standard form of English that everyone must conform to, everyone should be free to speak their own English, sometimes mixing in other dialects.
Many linguists (or at least most descriptivists) would agree that *there is no correct form of English*. There are many different dialects, and each has its own rules. The idea of a "standard" English is more of a social construct than anything else.
But of course, how you write very much depends on your *rhetorical situation*.
To whom are you writing? The idea that there isn't a correct form of English is absolutely correct. However, depending on who you are writing to, it is better to stick to an appropriate style. Even the type of English you would find in a legal document has completely different diction and sentence structures than what people would generally agree would be "standard English".
What should be taught is how different sentence structures, rhetorical choices, and methods of English affect the meaning, the speaker's message, and how it relates to the audience.

View File

@ -0,0 +1,82 @@
#+TITLE: If you write websites in Org Mode...
#+DATE: <2022-09-10 Sat>
#+TAGS[]: emacs tutorial
If you're an Emacs user, you would probably already know how powerful Org Mode is. You can organize notes, manage to-do lists, and write articles. Almost anything can be written with Org Mode. [[https://notes.sandvich.xyz][I write my lecture notes in Org Mode]]. Even this entire article was written in Org Mode.
#+attr_org: :width 256px
#+attr_html: :src ../../assets/org-setup.png
[[../assets/org-setup.png]]
However, you're probably still using the built-in Emacs HTML exporter to generate HTML files or even Pandoc to convert Org to HTML.
An even better way to generate your content is with Hugo.
* Hugo
Hugo is a fast and flexible static site generator written in Go. It does this by using Go templates, which allows Hugo to generate pages [[https://forestry.io/blog/hugo-vs-jekyll-benchmark/][significantly faster than Jekyll]] and be extremely extensible at the same time. Whenever someone visits your site, they are not going to believe that it's all statically generated. It is really that powerful that I've decided to abandon my own Pandoc-based static site generator and move to Hugo.
The main selling point of Hugo for me is org-mode support. Hugo can automatically generate content from org-mode files. I know that Emacs can already do that, but Hugo automates and manages the entire site generation process. It's easier to have something that does the job rather than having to write some Elisp to manage it for you.
Most other static site generators do not have org-mode support. If you want to use org-mode to write your website, you'll either have to stick with Emacs's HTML exporter, write your own with Pandoc, or use Hugo.
* Setting up hugo
The hardest part about Hugo is setting it up to be usable and generate a website. However, many people in the Hugo community have built themes for you to choose, so you do not have to worry about writing your own.
I continue to write my own themes, but a couple I would recommend are [[https://github.com/adityatelange/hugo-PaperMod][PaperMod]] (for something that is attractive and works) and [[https://github.com/LukeSmithxyz/lugo][Lugo]] (for simple websites that you quickly want running).
** If you want to write your own theme
It is not difficult, but it is very time-consuming. If you're going to develop a theme, you should use the ~web-mode~ package because it supports Go's templating syntax.
#+begin_src emacs-lisp
(use-package web-mode)
#+end_src
To get started, check [[https://gohugo.io/templates/introduction/][Hugo's documentation]] and [[https://golang.org/pkg/text/template/][Go documentation]] for more information about how the templating system works. Depending on how much time you have, the fundamentals aren't that useful. The later sections show more practical examples.
* Formatting your Org files
Hugo documents most of their examples with Markdown and use YAML or TOML to document their front matter. However, you can use Org's export options as your front matter.
#+begin_src org
#+TITLE: How to Become Successful
#+AUTHOR: Velcuz
#+TAGS[]: muga funny finnish independent forsen
Hello guys. I will discuss how you can become rich and successful.
#+end_src
* Images
The way images work in Hugo are a bit finicky. You can put them in ~static/~ which is copied to the root directory of the built website, meaning you'd have to reference them with ~/path-from-static~.
If you put them in the same directory as your org files, you can reference them with ~./relative-path.png~, but they won't actually appear since your org files are now built in a directory deeper.
For images to actually appear in both Emacs and your website, you should make a directory for the post, and inside should be your Org content in an ~index.org~ file.
For example, you can create a directory structure like so:
#+begin_example
your-website/
├─ content/
│ ├─ my-cool-articles/
│ │ ├─ top-5-images/
│ │ │ ├─ index.org
│ │ │ ├─ funny-image.png
│ │ ├─ another-top-5/
│ │ │ ├─ index.org
│ │ │ ├─ another-image.png
│ │ ├─ top-5-quotes.org
#+end_example
** WORKAROUND UPDATED 11 SEPTEMBER
Instead of having to put org files into their own directory, you can specify the URL with an ~#+attr_html~ option.
#+begin_src org
#+attr_org: :src ../relative-path/image.png
[[./relative-path/image.png]]
#+end_src

View File

@ -0,0 +1,47 @@
#+TITLE: Schule
#+DATE: <2022-08-27 Sat>
#+TAGS: school education
You'd always hear the kids say "School is useless because they don't teach you anything useful, and you can get a job without going to school!"
I always used to think that was a major coping mechanism people resort to when they get a low test grade. I still do think that, but there is still some truth to it.
The main reason school exists is for people to become educated, right? However, the education system seems to prioritize numbers over actual learning. I am not saying schools don't teach useful classes---I actually believe that every core class (mathematics, English, science, social studies) is very useful (not specifically for practical application, but for developing critical thinking).
The education system has become so competitive and repetitive that it has become more about getting good grades than it is about learning. This takes away from the purpose of school.
* NOOO! YOU MUST TO TAKE HARD CLASSES!1
I go to a magnet high school, and many students here seem to obsess over their GPA. I have met students who do not take classes to learn a subject but rather to increase their GPA. Here's a conversation I had with a classmate at the beginning of the school year:
"Do you have AP Lit[erature]?"
"No, I have English 101/102."
"With Dr. Iron?"
"Yeah, so now I have her for two years."
"So lucky. I wish I could take 101 or at least she could teach AP Lit. I'm just taking AP Lit for that GPA boost, you know."
I have had similar conversations and overheard many others. If students are only taking classes to appear better on their transcripts, then they are expending their happiness and enjoyment in learning for a number. That slight increase will give them only a marginally higher chance of getting into a good school and getting a scholarship.
* Never Ending Cycle
#+begin_export html
<center>
<img src="https://cdn.7tv.app/emote/61178e9c25a41a1170572a0b/4x">
</center>
#+end_export
The competitive school culture has become normalized. Students are told that they need to get into the best schools, so they can get into the best jobs, so they can live in the best places. As more students get higher GPAs, it raises the average, and now to be above the curve, you must work even more.
This becomes a cycle, and it continues until students no longer have any interests or hobbies outside of school. To put it in better words, here's what my friend has told me: "In an ideal world, the purpose of academia would be to help one discover and advance their interests and hobbies. Instead, the way education is structured forces students to participate in what can only be described as a rat race."
* Learning by Memorization
One of the biggest reasons why people never actually "learn" the information taught in their classes is because they aren't taught /why/ or /how/. This applies to every subject in school. The reason why this is so important is because when you understand why something is important, you're more likely to remember it and be able to form further conclusions.
For example, if you're taught that the square root of 64 is 8, you might be able to remember that for a test. But if you're taught that the square root of 64 is 8 because it's the number that, when multiplied by itself, equals 64, then you're more likely to actually understand and use that information in the future. In fact, if you only knew the square root of 64 is 8 but not why, then you wouldn't be able to determine what the square root of 81 is.
Some classes seem to emphasize memorization, but students never learn. We're called /homo sapiens/ because we're /wiser/ compared to other species, which is why we became an extremely successful and invasive species. We've specifically evolved to be able to process and deduce information. When we simply memorize a fact, we are not thinking about it. It's a simple recall task that other species are much better at. Limiting students to repetitive memorization will not teach them anything nor help them develop the proper deductive reasoning skills they need to succeed.

View File

@ -0,0 +1,40 @@
#+TITLE: Software I Use/Recommend
#+DATE: <2022-09-05 Mon>
#+TAGS: software emacs
Dotfiles can be viewed [[https://github.com/humanoidsandvichdispenser/dotfiles][here]] (emacs config in a separate repo).
* Terminal Emulator
I mainly use ~st~ because it starts up instantly. I occassionally use ~alacritty~ since fonts and emojis are currently broken on my build.
* Shell
~zsh~. It's a better interactive shell that isn't ~fish~. I wouldn't use ~fish~ because I'm used to writing ~bash~ syntax.
* Window Manager
I use ~bspwm~. It's very easy to configure, and you can easily script it. I've noticed as more time passes, the more logic I include in my configuration file.
* Text Editing
I've been a Neovim user for a few years, but recently, I have switched to Emacs. What I really like about Emacs is that you if some small functionality is missing, you can easily write it.
I wouldn't say Emacs Lisp is the greatest language, but it is the most fun language to write in.
#+attr_org: :width 512px
#+attr_html: :src ../../assets/emacs.png
[[../assets/emacs.png]]
* File Manager
I'm either going to be manually managing my files on the command line or using a GUI, usually Thunar. I do not like TUI file managers because I'm too slow for them.
* Web Browser
I use Firefox.
* Document Editing
I used to write my documents using LaTeX, but now I usually write them in Org Mode because it's a lot more convenient and does more stuff.

View File

@ -0,0 +1,7 @@
<html>
{{- partial "head.html" . -}}
<body>
{{- partial "header.html" . -}}
{{- block "main" . -}}{{- end -}}
</body>
</html>

View File

@ -0,0 +1,10 @@
{{ partial "head.html" . }}
{{ partial "header.html" }}
<div class="root">
<div class="content">
<h1>
{{ .Title }}
</h1>
{{ partial "post-list.html" .Pages }}
</div>
</div>

View File

@ -0,0 +1,34 @@
{{ partial "head.html" . }}
{{ partial "header.html" }}
<div class="root">
<div class="content">
<h1>
{{ .Title }}
</h1>
<table class="info-table">
<tbody>
<tr id="info-date">
<td><i class="bi bi-clock"></i></td>
<td>{{ dateFormat "2006-01-02" .Date }}</td>
</tr>
<tr id="info-reading-time">
<td><i class="bi bi-hourglass"></i></td>
<td>Reading time {{ .ReadingTime }} min.</td>
</tr>
<tr id="info-tags">
<td><i class="bi bi-tags"></i></td>
<td>
{{ range $k, $v := .Params.tags }}
{{ $url := printf "/tags/%s" (. | urlize) }}
<a class="tag" href="{{ $url }}">{{ . }}</a>
{{ end }}
</td>
</tr>
</tbody>
</table>
{{ .Content }}
{{ partial "remark42.html" . }}
{{ partial "footer.html" }}
{{ template "_internal/google_analytics.html" . }}
</div>
</div>

35
layouts/index.html 100644
View File

@ -0,0 +1,35 @@
{{ define "main" }}
<div>
<article class="main">
<div class="root">
<div class="content">
<h1 class="rainbow">sandvich.xyz</h1>
<center>
<img src="/apuEZY.png" width="256">
<div>
humanoidsandvichdispenser@gmail.com
</div>
<div>
<a href="https://github.com/humanoidsandvichdispenser">GitHub</a>
</div>
<div>
<code>
curl https://sandvich.xyz/sandvich.gpg | gpg --import
</code>
</div>
<div>
<code>
1643 9496 7ED2 8385 A5FE DBCD 9A39 BE37 E602 B22D
</code>
</div>
</center>
<div>
<h3 class="offset-fix">Recent Posts</h3>
</div>
{{ partial "post-list.html" .Site.RegularPages }}
</div>
</div>
</article>
{{ template "_internal/google_analytics.html" . }}
</div>
{{ end }}

View File

@ -0,0 +1,6 @@
<div id="footer">
<hr>
<center>
who is he talking to <img src="/LULE.png">
</center>
</div>

View File

@ -0,0 +1,10 @@
<head>
<title>{{ .Title }}</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.css">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/css/info.css">
<link rel="stylesheet" href="/css/navbar.css">
<link rel="stylesheet" href="/css/post-list.css">
<!--link rel="stylesheet" href="/css/syntax.css"-->
<meta charset="UTF-8"/>
</head>

View File

@ -0,0 +1,6 @@
<nav class="navbar">
<a href="/" class="home">sandvich.xyz</a>
<a href="/posts">Posts</a>
<a href="/tags">Tags</a>
<a href="https://notes.sandvich.xyz">notes.sandvich.xyz</a>
</nav>

View File

@ -0,0 +1,12 @@
<div class="post-list">
{{ range . }}
<a href="{{ .RelPermalink }}" class="post-item">
<span class="date">
{{ dateFormat "2006-01-02" .Date }}
</span>
<span>
{{ .Title }}
</span>
</a>
{{ end }}
</div>

View File

@ -0,0 +1,20 @@
<div id="remark42">
</div>
<script>
var remark_config = {
host: "https://remark.sandvich.xyz",
site_id: "sandvich",
url: {{ .Permalink }},
locale: {{ .Site.Language.Lang }},
theme: "dark"
};
(function(c) {
for(var i = 0; i < c.length; i++){
var d = document, s = d.createElement('script');
s.src = remark_config.host + '/web/' + c[i] +'.js';
s.defer = true;
(d.head || d.body).appendChild(s);
}
})(remark_config.components || ['embed']);
</script>

0
project-todo.org 100644
View File

BIN
static/LULE.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
static/apuEZY.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -0,0 +1,8 @@
.info-table {
font-family: var(--monospace);
color: var(--fg2);
}
i.bi {
margin-right: 8px;
}

143
static/css/main.css 100644
View File

@ -0,0 +1,143 @@
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800&family=Source+Sans+3:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
:root {
--bg0: #282C34;
--bg-dark: #21252b;
--bg1: #31363f;
--bg2: #373d48;
--bg3: #434a56;
--fg0: #abb2bf;
--fg1: #99a2b2;
--fg2: #6e7a91;
--fg3: #4f5664;
--red: #e06c75;
--yellow: #e5c07b;
--green: #98c379;
--blue: #61afef;
--cyan: #56b6c2;
--purple: #c678dd;
--accent: #61afef;
--sans-serif: "Source Sans 3", "Arial", sans-serif;
--monospace: "JetBrains Mono", "Courier", monospace;
}
body {
color: var(--fg0);
background-color: var(--bg0);
font-family: var(--sans-serif);
margin: 0;
}
.content {
max-width: 768px;
margin: auto;
}
h1, h2, h3, h4, h5, h6 {
font-weight: 500;
margin-bottom: 2em;
margin-top: 2em;
font-family: var(--monospace);
}
h1 {
font-size: 40px;
background: linear-gradient(120deg, var(--green) 60%, var(--cyan) 60%);
color: var(--bg0);
display: inline-block;
padding: 8px;
}
@keyframes rainbow {
0% {
background-color: var(--red);
}
20% {
background-color: var(--yellow);
}
40% {
background-color: var(--green);
}
60% {
background-color: var(--blue);
}
80% {
background-color: var(--purple);
}
100% {
background-color: var(--red);
}
}
h1.rainbow {
background: none;
animation-name: rainbow;
animation-duration: 5s;
animation-iteration-count: infinite;
}
h2 {
display: block;
font-size: 32px;
color: var(--blue);
}
h3 {
font-size: 24px;
color: var(--green);
}
h4 {
font-size: 24px;
color: var(--purple);
}
p {
margin-bottom: 2em;
margin-top: 2em;
line-height: 1.5em;
font-size: 20px;
}
a {
color: var(--fg1);
transition-duration: 200ms;
}
a:hover {
color: white;
transition-duration: 200ms;
}
a.tag {
color: inherit;
}
a.tag:hover {
color: white;
}
.content img {
max-width: 100%;
}
pre.example {
font-size: 20px;
background-color: var(--bg-dark);
padding: 4px;
}
#footer {
padding: 8px;
}
#footer hr {
margin: 16px;
border: 1px solid var(--fg3);
background-color: var(--fg3);
}
code {
font-size: 16px;
font-weight: 500;
}

View File

@ -0,0 +1,24 @@
nav {
margin: 0;
background-color: var(--bg-dark);
font-family: var(--monospace);
padding: 8px 0;
position: sticky;
top: 0;
z-index: 5;
}
nav a {
text-decoration: none;
height: 100%;
padding: 8px;
}
nav a:hover {
text-decoration: underline;
}
nav a.home {
background-color: var(--accent);
color: var(--bg0);
}

View File

@ -0,0 +1,26 @@
div.post-list {
display: table;
width: 100%;
}
.post-item {
display: block;
margin: 8px;
width: 100%;
text-decoration: none;
font-size: 24px;
}
.post-item:hover {
background-color: var(--bg-dark);
}
.post-item > span {
display: table-cell;
padding: 8px;
}
.post-item > span.date {
color: var(--fg3);
font-family: var(--monospace);
}

View File

@ -0,0 +1,53 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
JiQ=
=Y8lf
-----END PGP PUBLIC KEY BLOCK-----