by roundabout, Friday, 27 December 2024, 09:15:36 (1735290936), pushed by roundabout, Friday, 27 December 2024, 09:15:52 (1735290952)
Author identity: vlad <vlad.muntoiu@gmail.com>
29ccb74f661b4a7d3df607cc4d1384ab2c9eb33e
.idea/.gitignore
@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
.idea/inspectionProfiles/Project_Default.xml
@@ -43,11 +43,12 @@
</option>
<option name="myCustomValuesEnabled" value="true" />
</inspection_tool>
<inspection_tool class="JupyterPackageInspection" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="PyInterpreterInspection" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="9">
<list size="10">
<item index="0" class="java.lang.String" itemvalue="pygame" />
<item index="1" class="java.lang.String" itemvalue="numpy" />
<item index="2" class="java.lang.String" itemvalue="requests" />
@@ -57,6 +58,7 @@
<item index="6" class="java.lang.String" itemvalue="flask_babel" />
<item index="7" class="java.lang.String" itemvalue="flask_bcrypt" />
<item index="8" class="java.lang.String" itemvalue="flask_sqlalchemy" />
<item index="9" class="java.lang.String" itemvalue="jinja2-fragments" />
</list>
</value>
</option>
@@ -96,8 +98,7 @@
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredIdentifiers">
<list>
<option value="gi.repository.Gtk" />
<option value="dict.discard" />
<option value="main.struct" />
</list>
</option>
</inspection_tool>
.idea/modules.xml
@@ -2,7 +2,7 @@
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/blog.iml" filepath="$PROJECT_DIR$/.idea/blog.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/site.iml" filepath="$PROJECT_DIR$/.idea/site.iml" />
</modules>
</component>
</project>
.idea/site.iml
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
articles/Font stacks.md
@@ -0,0 +1,246 @@
---
title: "Proposed system font stacks"
topics: ["web", "typography", "fonts", "css", "design"]
date: 2024-12-27
---
I've seen [Modern Font Stacks](https://modernfontstacks.com/). I agree that there are many cases
where system fonts are fine, but the stacks there have some problems, especially with GNU/Linux
devices.
On GNU/Linux, there are usually two sets of metrically-compatible Microsoft font clones:
Liberation and GNU FreeFont. They have a huge difference. Liberation are original designs, but
not very good ones. FreeFont are descended from TeX fonts, so they look almost exactly like
Helvetica, Times and Courier.
## The stacks
### GUI
```
system-ui, -apple-system, BlinkMacSystemFont, Roboto, "Noto Sans", "Segoe UI", Inter, Cantarell,
Ubuntu, "DejaVu Sans", "Bitstream Vera Sans", "Sans", "Helvetica Neue", "Helvetica",
"Lucida Grande", sans-serif
```
These fonts are used by the OS and designed to be pleasant to read at any size, and have features
such as weights.
Note how the intent is to avoid Arial and Liberation fonts, which are not very pleasant.
* `system-ui` is a standard, but not all browsers support it.
* `-apple-system` and `BlinkMacSystemFont` are pre-standard names for the system font that only
work on Apple devices.
* Roboto is the font in Android and some GNU/Linux distributions.
* Noto Sans is the fallback font for Roboto, as well as the font of KDE.
* Segoe UI is the font of Windows.
* Inter will likely be the font of GNOME in the future.
* Cantarell is the font of GNOME (at least until they change it to Inter).
* Ubuntu is the font of Ubuntu (obviously).
* DejaVu Sans was popular on many Unixes in the past.
* Bitstream Vera Sans is the font DejaVu Sans was based on.
* Sans usually refers to one of the above two fonts on GNU/Linux.
* Helvetica Neue was the old font of MacOS and iOS.
* Helvetica was the even older font of iOS.
* Lucida Grande was the even older font of MacOS.
* sans-serif is the generic sans-serif font.
### Transitional serif
```
Charter, "Bitstream Charter", "Source Serif 4", "Source Serif Pro", source-serif-pro, "Noto Serif",
"FreeSerif", "Nimbus Roman", "Times New Roman", "Times", serif
```
Transitional serifs appeared around 1750 and feature medium contrast.
The intent here is also to avoid Liberation Serif, so FreeSerif/Nimbus Roman (which are an
actual clone of Times) are preferred to Times New Roman which falls back to Liberation Serif
on most GNU/Linux distributions. In my opinion Cambria, used in the original Modern Font Stacks,
is not a very nice font.
### Old style serif
```
Garamond, Palatino, "Palatino Linotype", "URW Palladio L", "Book Antiqua", "URW Bookman L",
Bookman, P052, C059, serif;
```
Old style serifs appeared early, in the Renaissance period, and were developed from calligraphy.
### Humanist sans
```
Cantarell, "Gill Sans Nova", "Gill Sans", "Gill Sans MT", Lato, "Source Sans Pro", "Source Sans 3",
source-sans-pro, Skeena, Candara, Ubuntu, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans",
"Trebuchet MS", sans-serif
```
Humanist sans serifs, unlike neo-grotesques, have rounder shapes and more stroke contrast, and
usually, true italics.
This is very different from the Modern Font Stacks one. I don't like the idea of using Ubuntu when
Cantarell and Lato exist, which are much closer to a humanist font that isn't very unusual.
### Geometric sans
```
"Futura PT", "Futura LT", Futura, Lexend, "Readex Pro", Avenir, "Avenir Next", "Century Gothic",
"Avant Garde", "URW Gothic", sans-serif
```
Geometric sans serifs are usually based on circles and straight lines. They first appeared in the
1920s.
Again, I've included some free fonts that don't suck.
### Neo-grotesque GUI
```
Roboto, Inter, "SF Pro", Aptos, Geist, FreeSans, "Nimbus Sans", "Helvetica Neue", system-ui, -apple-system,
BlinkMacSystemFont, sans-serif
```
Neo-grotesque fonts are a category of sans-serif typefaces that have more complex shapes than
geometric fonts, but lower contrast than humanist fonts. This stack prefers the more modern
fonts which appeared in the digital era.
Yes, I'm avoiding excessive spreading of Inter.
### Neo-grotesque (Swiss)
```
FreeSans, "Nimbus Sans", "Helvetica Neue", Helvetica, Aptos, Geist, Inter, Roboto, "SF Pro",
"Microsoft Sans Serif", Arial, sans-serif
```
This prefers Helvetica or its clones, more classic neo-grotesque fonts.
### Monospace (slab/typewriter)
```
"Courier Prime", FreeMono, "Cutive Mono", Nimbus Mono PS", "Courier New", Courier, monospace
```
Monospaced fonts have the same width for all characters. This has a preference for fonts like
Courier which use slab serifs and originate from typewriters.
### Monospace (sans/code)
```
ui-monospace, "Roboto Mono", "Source Code Pro", source-code-pro, "SF Mono", "IBM Plex Mono",
Inconsolata, Menlo, Consolas, "Droid Sans Mono", "DMCA Sans Serif", "Hack", "DejaVu Sans Mono",
"Bitstream Vera Sans Mono", monospace
```
This prefers sans-serif monospace fonts that are not too quirky and are designed for technical
applications.
### FuN MoNoSpAcE
```
"Cascadia Code", "Fira Code", "Fira Mono", "JetBrains Mono", "Ubuntu Mono", "Operator Mono",
"Roboto Mono", "Source Code Pro", "SF Mono", "IBM Plex Mono", "Inconsolata", "Menlo", "Consolas",
"Droid Sans Mono", "DMCA Sans Serif", "Hack", "DejaVu Sans Mono", "Bitstream Vera Sans Mono",
monospace
```
Of course, this prefers "fun" coding fonts with script italics, low f bar, unusual digits, and
let's not forget ligatures!
### I-wanna-be-a-mac
```
"SF Pro", apple-system, BlinkMacSystemFont, "San Francisco", Inter, Roboto, Geist, FreeSans,
"Nimbus Sans", "Helvetica Neue", Helvetica, "Arial Nova", "Arial", sans-serif
```
This is for all who want to be like Apple - that is the major reason they prefer Inter.
### I-wanna-be-a-mac mono
```
"SF Mono", "JetBrains Mono", "Roboto Mono", ui-monospace, "Geist Mono", "Fira Mono", "Fira Code",
Hack, "DejaVu Sans Mono", "Bitstream Vera Sans Mono", Menlo, Consolas, monospace
```
This copies SF Mono.
### Industrial
```
"D-DIN", Bahnschrift, Grandview, "DIN Alternate", "FF DIN", "URW DIN", DIN, "Alte DIN", "Alte DIN 1451",
"Alte DIN 1451 Mittelschrift", Barlow, "SF Compact", "SF Pro", Inter, Roboto, sans-serif
```
Industrial typefaces generally use straight lines instead of ellipses, and are often used in
technical applications or signage.
This prefers the DIN family which is the font used for road signs in Germany.
### Rounded
```
"SF Pro Rounded", "Hiragino Maru Githic", "Quicksand", "Varela Round", "Nunito", "Lato",
"Arial Rounded MT Bold", sans-serif
```
Rounded fonts are sans-serif but have rounded terminals.
### Slab serif
```
"Roboto Slab", "Rockwell Nova", "Rockwell", "Sitka Small", "Noto Serif", serif
```
Slab serifs have more blocky serifs.
### Didone
```
Didot, "Bodoni MT", "Noto Serif Display", "Playfair Display", "Abril Fatface", "URW Palladio L",
"Noto Serif", serif
```
Didone serifs have very high contrast and thin serifs.
### Narrow sans (display)
```
Oswald, Anton, Impact, "Arial Narrow", sans-serif
```
Bold, narrow sans-serif fonts, only for headings.
### Print handwriting
```
"Segoe Print", "Bradley Hand", Comic Neue", "Comic Sans MS", "Comic Sans", "TSCu_Comic",
"Coming Soon", "Knewave", casual, cursive
```
These mimic handwriting but without cursive (joined) letters.
### Cursive
```
"Segoe Script", "Lucida Handwriting", "Dancing Script", cursive
```
These mimic cursive (joined) handwriting.
### Semi-humanist sans???
```
"DejaVu Sans", "Bitstream Vera Sans", Verdana, sans-serif
```
Wide, with good readability especially at small sizes on low-resolution screens.
### Condensed semi-humanist sans???
```
"DejaVu Sans Condensed", Tahoma, sans-serif
```
Same as above, but not so wide.
articles/Roundabout policies.md
@@ -0,0 +1,90 @@
---
title: Roundabout-host.com policies
topics: ["roundabout-host", "roundabout", "privacy policy", "terms of service"]
hidden: true
---
Welcome to roundabout-host.com! Before using our services, please take a moment to
review these important policies.
Terms of service
----------------
### Content guidelines
We maintain a respectful environment, free from political, religious, inappropriate,
controversial, or offensive material and topics. We reserve the right to remove any
content that violates these guidelines.
#### Content licensing
Content which has practical value, such as software, documentation, or datasets, stored
in public repositories, **must** be licensed under a free software licence, as defined
by [the Free Software Foundation](https://www.gnu.org/licenses/license-list.html). To be
a free software licence, it must grant these four freedoms to the users of the software:
* The freedom to run the program as you wish, for any purpose (freedom 0).
* The freedom to study how the program works, and change it so it does your computing as
you wish (freedom 1). Access to the source code is a precondition for this.
* The freedom to redistribute copies so you can help others (freedom 2).
* The freedom to distribute copies of your modified versions to others (freedom 3). By
doing this you can give the whole community a chance to benefit from your changes.
Access to the source code is a precondition for this.
and these freedoms must not discriminate against groups or types of usage.
However, you are not forced to give copies to anyone, so not everyone needs to be a user.
Hosting content in private repositories is allowed if either of these conditions is met:
* The software is truly private, and all users have the four freedoms. If you are the only user,
this is always the case. Otherwise, all users must be able to use the software freely, even
though they do not have to share it with others, so the software can stay secret.
* The software is freely available elsewhere.
Regarding other types of content, such as artistic works or writings that express an opinion,
any licence is fine, as long as you acknowledge the fact that it will be available to the public
and this service will not restrict access to it. However, we still recommend using a free
licence for this type of content as well.
Additionally, it is mandatory to follow any relevant licences of any content not created by you.
### User responsibilities
You are solely responsible for the content you upload to our service. You must not upload content
that infringes on these terms or any applicable legislation.
### Usage policies
The service is provided as-is; while we wish to provide a reliable service, we cannot guarantee
uptime or data integrity. The service is provided for normal usage levels; excessive usage, attempts
to disrupt or abuse the service are strictly prohibited.
### Termination of service
We reserve the right to terminate or suspend accounts that violate our terms of service without
prior notice.
### Updates to the terms of service
These terms may be updated periodically by posting them here; continued use of the service
implies acceptance of the updated terms.
Privacy policy
--------------
### Data collection
We collect the following data:
* Request data: IP address, method and URL of the request. Storing this data is common practice
for web servers for debugging and security purposes.
* User data: username, email address, and any other data you explicitly provide.
* Content you upload to the service using git or by submitting a form.
We do not collect:
* Any other personal data, unless you provide it explicitly.
* Usage patterns.
We don't participate in advertising networks. The only cookies we use are required to store your
session and preferences sucks as your language.
Basically, the only data we collect is the one you explicitly provide to us. We don't track you.
### Data usage
We use the data we collect to:
* Provide the service to you.
* Communicate with you about the service or your content. We don't send marketing emails.
* Enforce our terms of service and protect against abuse.
### Data sharing
* We do not share or sell your data to third parties.
main.py
@@ -59,6 +59,7 @@ index_page = ampoule.Page(site, "index.html", topics=topics)
site.add_page("/", main_page)
site.add_page("/projects/", projects_page)
site.add_page("/index/", index_page)
site.add_page("/about/", ampoule.Page(site, "about.html"))
# Add static files
site.add_from_index(
templates/about.html
@@ -0,0 +1,17 @@
{% extends "default.html" %}
{% block title %}
About me
{% endblock %}
{% block content %}
<h1>About me</h1>
<p>
</p>
<h2>Links</h2>
<ul>
<li><a href="mailto:root@roundabout-host.com">Send me an e-mail</a></li>
<li><a href="https://roundabout-host.com/roundabout">Profile on roundabout-host</a></li>
<li><a href="https://github.com/Secret-chest">GitHub</a></li>
<li><a href="https://matrix.to/@roundabout-git:matrix.org#/@roundabout-git:matrix.org">Matrix</a></li>
</ul>
{% endblock %}
templates/default.html
@@ -13,6 +13,7 @@
<li><a href="/">Home</a></li>
<li><a href="/projects">Projects</a></li>
<li><a href="/index">Index</a></li>
<li><a href="/about">About</a></li>
<li><a href="https://roundabout-host.com/roundabout">Roundabout-host</a></li>
</ul>
<ul>
templates/home.html
@@ -4,13 +4,15 @@
<h1>All articles</h1>
{% for article in articles %}
<article class="content-area">
{% if article["image"] %}
<img src="{{ article['image'] }}" alt="{{ article['image-alt'] }}" class="article-image">
{% endif %}
<h2><a href="/articles/{{ article.file_name }}" class="article-title">{{ article["title"] }}</a></h2>
<div class="home-article-date">{{ article.date | strftime("%Y-%m-%d") }}</div>
<p>{{ article.content | first_paragraph | markdown }}</p>
</article>
{% if not article.hidden %}
<article class="content-area">
{% if article["image"] %}
<img src="{{ article['image'] }}" alt="{{ article['image-alt'] }}" class="article-image">
{% endif %}
<h2><a href="/articles/{{ article.file_name }}" class="article-title">{{ article["title"] }}</a></h2>
<div class="home-article-date">{{ article.date | strftime("%Y-%m-%d") }}</div>
<p>{{ article.content | first_paragraph | markdown }}</p>
</article>
{% endif %}
{% endfor %}
{% endblock %}