Diary

Welcome! :-)

This is both a wiki (a website editable by all) and a blog (an online diary about the stuff Alex Schroeder reads and does). If you’re a friend or relative, you might be interested in reading Life instead of this page. If you’ve come here from an RPG blog, you might want to head over to RPG. There are other similar categories to be found on the SiteMap.

Für Rollenspieler gibt es ebenfalls eine eigene RSP Kategorie.

2018-06-24 Capitalism

Capitalism makes sure all deeds are done with maximum misery. Sell as high as possible. Buy as low as possible. Haggle until you tire. Work until you can no more. Those are the affordances of the system. To enjoy yourself and the time you’re given on this earth needs resistance. You need to resist. You need to resist the temptation to exploit yourself and your fellow humans. Resist and enjoy what little time you have left.

@Wolf480pl said that the key is valuing your free time and stopping when you have enough and I agree. I think this is part of the resistance. But sadly I have enough friends that say they would like to work less but they don’t not because they need the money but because they want the money.

Another example is how much energy people are willing to many spend on looking for the best deal. This sucks a tiny bit of life from them – and makes sure the vendors aren’t enjoying themselves too much, either. Sure, the market is very efficient. But it’s members are also unhappy.

Tags:

Add Comment

2018-06-24 Blogging

I think there is a need for a place where people can post a long article without having a blog of their own. In as far as Medium was able to provide that, I liked it. But everything else on top of that was unnecessary. This BoingBoing post lists a few alternatives I like. I like txt.fyi in particular.

Brutalist blogging platforms!!

But to be honest, I think Mastodon could be a viable Medium alternative. I keep telling people that extending the 500 character limit and allowing for simple emphasis (italic) and strong emphasis (bold) would do wonders. Google+ has shown that some people will use it to write amazing posts. But I’ve met a resistance on Mastodon which seems to be deeply rooted and I don’t get it.

@saper said Pleroma already has a 5000 character limit so perhaps that is simply the way forward. And it has a single column layout which is better for long posts. The CSS for mobile is terrible, though. We could use Pleroma with Brutaldon, the simple HTML client for Mastodon on without any Javascript! (“Brutaldon is a brutalist, Web 1.0 web interface for Mastodon.” – source)

Tags:

Add Comment

2018-06-18 Work

Just heard this on Thinking Allowed, in Marx & Marxism:

What, then, constitutes the alienation of labor?

First, the fact that labor is external to the worker, i.e., it does not belong to his intrinsic nature; that in his work, therefore, he does not affirm himself but denies himself, does not feel content but unhappy, does not develop freely his physical and mental energy but mortifies his body and ruins his mind. The worker therefore only feels himself outside his work, and in his work feels outside himself. He feels at home when he is not working, and when he is working he does not feel at home. His labor is therefore not voluntary, but coerced; it is forced labor. It is therefore not the satisfaction of a need; it is merely a means to satisfy needs external to it. Its alien character emerges clearly in the fact that as soon as no physical or other compulsion exists, labor is shunned like the plague. External labor, labor in which man alienates himself, is a labor of self-sacrifice, of mortification. Lastly, the external character of labor for the worker appears in the fact that it is not his own, but someone else’s, that it does not belong to him, that in it he belongs, not to himself, but to another. Just as in religion the spontaneous activity of the human imagination, of the human brain and the human heart, operates on the individual independently of him – that is, operates as an alien, divine or diabolical activity – so is the worker’s activity not his spontaneous activity. It belongs to another; it is the loss of his self.

Estranged Labour, in Economic and Philosophical Manuscripts of 1844 by Karl Marx

All the people trying to tell us that we should find a labor we love, that makes us happy, need to read this passage again.

I don’t work for the love of it and earn something on the side, as if by lucky accident. I do it for the money.

And when I work, I do the things I don’t want to do and when I’m at home, I do the things I want to do. And to think that I should want to do the things I do for the love of it, that is to think along the lines of Big Brother in 1984 by George Orwell. You don’t only get punished but you must want it, too.

Now, of course I am happy to have found a job that seems better to me than all the others given the money I earn, the people I work with, the flexibilities I am granted – but I am still alienated. This is not me.

My current answer is to simple work as little as possible. My job allows me to work 60% over the year and while that isn’t close to Keynes’ 15h, my 24h work week is pretty good already. Not everybody can afford that, of course, but I think that’s what we as a society should want. Except for the substitution effect where rich people are more likely to work longer hours. 🙄

@megfault suggested I also read The Abolition of Work by Bob Black but I didn’t find it very convincing. It argues convincingly that we work too much (bullshit jobs and all of that), and that part I agree with. But «we have to take what useful work remains and transform it into a pleasing variety of game-like and craft-like pastimes, indistinguishable from other pleasurable pastimes» has to work for so much of civil society! I’m thinking dentists, doctors, insurance, building – I want to benefit of the fruit of increased productivity, I don’t want to go back to an agricultural society. That’s why I’d like to focus more on small, incremental changes. Let us start by reducing working hours. Let us start handing out a universal basic income in order to share the fruits of our labor more fairly.

Tags:

Comments on 2018-06-18 Work

What a coincidence - I have recently started reading The Capital. Also, my parents have just retired - my father had been saying he wanted to for a few years already. I used to think you can love your job, but I am (only 4 years into my working life) more and more moving towards the philosophy you describe here. I’d love to spend more time exercising, enjoying nature, crafting, reading...

– Enzo 2018-06-19 19:37 UTC


Yeah, I hit a crisis after 2-4 years at my job and decided that the only way I could bear it was part time. And now I’m I’ve been at the company for 20 years!

– Alex Schroeder 2018-06-19 21:04 UTC

Add Comment

2018-06-16 Article 13

Continuing from my previous discussion of copyright madness...

Don’t force platforms to replace communities with algorithms (Wikimedia): «As policymakers increasingly suggest technological solutions to fight illegal and controversial content online, we ask them to consider the rights of internet users and to leave room for the human side of content moderation.» An Interesting Wiki perspective: «Once flagged by ORES, review and removal of content is handled entirely though community processes. This relationship acknowledges the limitations of machine learning while harnessing its strengths.»

So ein Quatschgesetz (Sascha Lobo) «Mit dem Leistungsschutzrecht wollen sich manche Verleger von der Politik eine digitale Gelddruckmaschine schenken lassen - bald auch auf EU-Ebene. Wie konnte es so weit kommen?»

Save Code Share (FSFE) «Current EU Copyright Review threatens Free and Open Source Software. Take action now to preserve the ability to collaboratively build software online!»

Megathread collected by David Ross: «I can not express enough how important this action is for the health of the Internet. The EU have a Directive going to the vote on June 20, and if you do any of the following it would impact YOU»

Europe's New Copyright Rules Are Like YouTube's Content ID System—for the Entire Internet (Cory Doctorow): «The European Union wants to take the upload filters that make no one happy and apply them to all content on the internet.»

What’s really behind the EU law that would “ban memes” – and how to stop it before June 20 (Julia Reda): «With two weeks to go until the crucial vote in the European Parliament, more and more people are becoming aware of the looming plans for “censorship machines” and a “link tax” in the EU. […] Article 13 of the Copyright Directive will force internet platforms (social networks, video sites, image hosts, etc.) to install upload filters to monitor all user uploads for copyrighted content, including in images […].»

And Julia Reda on the same blog post: «But it’s important to me to underscore that the solution to bad legal proposals and unbalanced lobbying is not to curse or even advocate leaving the EU. (In fact, it’s Anti-EU, Euro-skeptic and right-wing parties that are responsible for giving these proposals majority support in the Committee! Don’t let Eurosceptic politicians get away with voting in favour of breaking the Internet and then blaming the EU for it later!)»

☠️ ☠️ ☠️

With Article 11 and Article 13 passing today, I’m starting to get the feeling that I can’t cheer the copyright industry into their graves fast enough. Sink, all ye ships of publishing houses! Sink, ye newspapers, TV makers and whatever you call yourselves! I’m hoping your industry goes down, your money runs dry, your wealth is squandered at court, your patience is tried, your reputation ruined — may your intellectual property turn to dust into your hands, and may you choke on it.

☠️ ☠️ ☠️

Tags:

Add Comment

2018-06-15 No Twitter, No Facebook

Tired of ads in your feed?

Tired of some algorithm picking some posts to show and others to hide?

Tired them selling your data to everybody One their dog?

Join Mastodon!

The woman who taught internet strangers to actually care for one another. «Echo represents a lost vision of social media. If Facebook, Instagram and Twitter are big social, then Echo is small social. It’s also just what we need right now. […] Perhaps big social was never the right outcome for this wild experiment we call the internet. Perhaps we’d be happier with constellations of smaller, regional, and interest-specific communities; communities whose stakeholders are the users themselves, and whose moderators and decision-makers aren’t rendered opaque through distance and centralized authority. Perhaps social life doesn’t scale. Perhaps the future looks very much like the past. More like Echo.»

Or this, same article: «Today the role of moderators has changed. Rather than deputized members of our own community, they are a precarious workforce on the front lines of digital trauma. The raw feed of flagged Facebook content is unimaginable to the average user: a parade of violence, pornography, and hate speech.»

Tags:

Add Comment

2018-06-14 Wrote a Bot

I wrote a Mastodon bot: @textmapper. It posts a Text Mapper map once a day.

It was surprisingly easy to do! I’m still confused by how easy it was. I was expecting some bugs. It... just worked!? I had great libraries to work with: Mastodon.py, CairoSVG, and all the other things I used.

I’m also using the Software Wiki to keep track of ideas.

Tags:

Add Comment

2018-06-14 Surveillance Capitalism

«In his 1964 book, One-Dimensional Man, philosopher Herbert Marcuse argued that in technologically advanced societies totalitarianism can be imposed without terror. This occurs through the transformation of private life into part of an overall system of domination. For Marcuse, the sphere of mass consumption, for instance, went beyond fulfilling basic needs to provide more comfort, luxury and affluence. These incentives not only mask the everyday oppressions that people experience, but they also act as a veneer that traps people’s imaginations from envisioning a different, possibly better way of living.» – Mass Surveillance and “Smart Totalitarianism” by Chris Spannos

I think we just need to talk more about the dead world politics and capitalism is steering us towards, and we need to play and party harder. George Herbert apparently said “living well is the best revenge” and it surely must also be the best role model.

Have fun. Denounce the idiocy of the system whenever you feel like it but without getting you down. Don’t let them grind you down. Remember, living well is key.

But some things are easy: buy less, work less, care less.

Don’t read the daily news. Know enough about current events to make decisions but not enough to bring you down. Read a weekly paper, or dip into the river of news online, but do it rarely.

If you make enough money to live, don’t work more to earn more.

Tags:

Add Comment

2018-06-13 Jurahöhenweg Rennen

I’ve been wanting to run the Jura-Höhenweg for a while now. I ran the first leg back in 2016, then two more sections in 2017, and now I’ve resumed my running. I’m also in a better shape and so I can run 20km (slowly) without a problem. This is great!

I should take even more pictures! :)

Tags:

Comments on 2018-06-13 Jurahöhenweg Rennen

Using Sitelen Mute:

~/src/sitelen-mute/sitelen-mute \
    --title "Jurahöhenweg 2016-2018" \
    --description "Den Jura Höhenweg Rennen." \
    --url https://alexschroeder.ch/gallery/2018-jurahoehenweg/ \
    Album 2018-jurahoehenweg

– Alex Schroeder 2018-06-13 10:22 UTC

Add Comment

2018-06-12 Markdown to PDF

So I’m trying to move my list of spellcasters into a repository where I can start working on a PDF of sorts. I already knew that I didn’t want to try Pandoc. So here we are.

@mathieu suggested WeasyPrint. It converts HTML to PDF. It’s written in Python and I prefer that to the node module markdown-pdf. When I tried markdown-pdf, I had no access to the intermediary HTML and thus I didn’t know where to start when I tried writing a CSS for it.

So now I’m using WeasyPrint and that means I need a Markdown to HTML processor. Python already comes with Markdown and I just used it, yesterday. Perfect!

And now in my Makefile:

%.pdf: %.html
	weasyprint $< $@

%.html: %.md
	python3 -m markdown --extension=markdown.extensions.tables --file=$@ $<

I haven’t looked at fiddling with the CSS, though. I’m just happy that I access to the intermediary HTML file.

Tags:

Comments on 2018-06-12 Markdown to PDF

PDF files:

– Alex Schroeder 2018-06-14 13:15 UTC

Add Comment

2018-06-11 Highlighting Code and Rendering Markdown for cgit

If you publish your git repositories via cgit, you might want to link to Markdown files like you did on GitHub. By default this doesn’t work, though: the Markdown filter only applies to the About section. All the other Markdown files are simply highlighted but not rendered.

This is what we want:

Markdown is rendered

But this is the default:

Markdown is highlighted

This page hacks the two solutions together and will make your code eyes cry. I’m sorry.

Your /etc/cgitrc gets a line like the following:

source-filter=/usr/lib/cgit/filters/syntax-highlighting-or-markdown.py

And the content of this file:

#!/usr/bin/env python3

# This script uses Pygments and Python3. You must have both installed
# for this to work.
#
# http://pygments.org/
# http://python.org/
#
# It may be used with the source-filter or repo.source-filter settings
# in cgitrc.
#
# The following environment variables can be used to retrieve the
# configuration of the repository for which this script is called:
# CGIT_REPO_URL        ( = repo.url       setting )
# CGIT_REPO_NAME       ( = repo.name      setting )
# CGIT_REPO_PATH       ( = repo.path      setting )
# CGIT_REPO_OWNER      ( = repo.owner     setting )
# CGIT_REPO_DEFBRANCH  ( = repo.defbranch setting )
# CGIT_REPO_SECTION    ( = section        setting )
# CGIT_REPO_CLONE_URL  ( = repo.clone-url setting )


import sys
import io
import types
import markdown
from pygments import highlight
from pygments.util import ClassNotFound
from pygments.lexers import TextLexer
from pygments.lexers import MarkdownLexer
from pygments.lexers import guess_lexer
from pygments.lexers import guess_lexer_for_filename
from pygments.formatters import HtmlFormatter


sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
data = sys.stdin.read()
filename = sys.argv[1]
formatter = HtmlFormatter(style='pastie')

try:
	lexer = guess_lexer_for_filename(filename, data)
except ClassNotFound:
	# check if there is any shebang
	if data[0:2] == '#!':
		try:
			lexer = guess_lexer(data)
		except ClassNotFound:
			lexer = TextLexer()
	else:
		lexer = TextLexer()
except TypeError:
	lexer = TextLexer()

if isinstance(lexer, MarkdownLexer):
        # based on html-converters/md2html
        sys.stdout.write('''
<!-- close the stuff we want to hide anyway -->
</code></pre></td></tr></table>
<style>
.blob { display: none }
.markdown-body {
    font-size: 14px;
    line-height: 1.6;
    margin-top: 20px;
    overflow: hidden;
}
.markdown-body>*:first-child {
    margin-top: 0 !important;
}
.markdown-body>*:last-child {
    margin-bottom: 0 !important;
}
.markdown-body a.absent {
    color: #c00;
}
.markdown-body a.anchor {
    display: block;
    padding-left: 30px;
    margin-left: -30px;
    cursor: pointer;
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
}
.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 {
    margin: 20px 0 10px;
    padding: 0;
    font-weight: bold;
    -webkit-font-smoothing: antialiased;
    cursor: text;
    position: relative;
}
.markdown-body h1 .mini-icon-link, .markdown-body h2 .mini-icon-link, .markdown-body h3 .mini-icon-link, .markdown-body h4 .mini-icon-link, .markdown-body h5 .mini-icon-link, .markdown-body h6 .mini-icon-link {
    display: none;
    color: #000;
}
.markdown-body h1:hover a.anchor, .markdown-body h2:hover a.anchor, .markdown-body h3:hover a.anchor, .markdown-body h4:hover a.anchor, .markdown-body h5:hover a.anchor, .markdown-body h6:hover a.anchor {
    text-decoration: none;
    line-height: 1;
    padding-left: 0;
    margin-left: -22px;
    top: 15%}
.markdown-body h1:hover a.anchor .mini-icon-link, .markdown-body h2:hover a.anchor .mini-icon-link, .markdown-body h3:hover a.anchor .mini-icon-link, .markdown-body h4:hover a.anchor .mini-icon-link, .markdown-body h5:hover a.anchor .mini-icon-link, .markdown-body h6:hover a.anchor .mini-icon-link {
    display: inline-block;
}
.markdown-body h1 tt, .markdown-body h1 code, .markdown-body h2 tt, .markdown-body h2 code, .markdown-body h3 tt, .markdown-body h3 code, .markdown-body h4 tt, .markdown-body h4 code, .markdown-body h5 tt, .markdown-body h5 code, .markdown-body h6 tt, .markdown-body h6 code {
    font-size: inherit;
}
.markdown-body h1 {
    font-size: 28px;
    color: #000;
}
.markdown-body h2 {
    font-size: 24px;
    border-bottom: 1px solid #ccc;
    color: #000;
}
.markdown-body h3 {
    font-size: 18px;
}
.markdown-body h4 {
    font-size: 16px;
}
.markdown-body h5 {
    font-size: 14px;
}
.markdown-body h6 {
    color: #777;
    font-size: 14px;
}
.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre {
    margin: 15px 0;
}
.markdown-body hr {
    background: transparent url("/dirty-shade.png") repeat-x 0 0;
    border: 0 none;
    color: #ccc;
    height: 4px;
    padding: 0;
}
.markdown-body>h2:first-child, .markdown-body>h1:first-child, .markdown-body>h1:first-child+h2, .markdown-body>h3:first-child, .markdown-body>h4:first-child, .markdown-body>h5:first-child, .markdown-body>h6:first-child {
    margin-top: 0;
    padding-top: 0;
}
.markdown-body a:first-child h1, .markdown-body a:first-child h2, .markdown-body a:first-child h3, .markdown-body a:first-child h4, .markdown-body a:first-child h5, .markdown-body a:first-child h6 {
    margin-top: 0;
    padding-top: 0;
}
.markdown-body h1+p, .markdown-body h2+p, .markdown-body h3+p, .markdown-body h4+p, .markdown-body h5+p, .markdown-body h6+p {
    margin-top: 0;
}
.markdown-body li p.first {
    display: inline-block;
}
.markdown-body ul, .markdown-body ol {
    padding-left: 30px;
}
.markdown-body ul.no-list, .markdown-body ol.no-list {
    list-style-type: none;
    padding: 0;
}
.markdown-body ul li>:first-child, .markdown-body ul li ul:first-of-type, .markdown-body ul li ol:first-of-type, .markdown-body ol li>:first-child, .markdown-body ol li ul:first-of-type, .markdown-body ol li ol:first-of-type {
    margin-top: 0px;
}
.markdown-body ul li p:last-of-type, .markdown-body ol li p:last-of-type {
    margin-bottom: 0;
}
.markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul {
    margin-bottom: 0;
}
.markdown-body dl {
    padding: 0;
}
.markdown-body dl dt {
    font-size: 14px;
    font-weight: bold;
    font-style: italic;
    padding: 0;
    margin: 15px 0 5px;
}
.markdown-body dl dt:first-child {
    padding: 0;
}
.markdown-body dl dt>:first-child {
    margin-top: 0px;
}
.markdown-body dl dt>:last-child {
    margin-bottom: 0px;
}
.markdown-body dl dd {
    margin: 0 0 15px;
    padding: 0 15px;
}
.markdown-body dl dd>:first-child {
    margin-top: 0px;
}
.markdown-body dl dd>:last-child {
    margin-bottom: 0px;
}
.markdown-body blockquote {
    border-left: 4px solid #DDD;
    padding: 0 15px;
    color: #777;
}
.markdown-body blockquote>:first-child {
    margin-top: 0px;
}
.markdown-body blockquote>:last-child {
    margin-bottom: 0px;
}
.markdown-body table th {
    font-weight: bold;
}
.markdown-body table th, .markdown-body table td {
    border: 1px solid #ccc;
    padding: 6px 13px;
}
.markdown-body table tr {
    border-top: 1px solid #ccc;
    background-color: #fff;
}
.markdown-body table tr:nth-child(2n) {
    background-color: #f8f8f8;
}
.markdown-body img {
    max-width: 100%;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
.markdown-body span.frame {
    display: block;
    overflow: hidden;
}
.markdown-body span.frame>span {
    border: 1px solid #ddd;
    display: block;
    float: left;
    overflow: hidden;
    margin: 13px 0 0;
    padding: 7px;
    width: auto;
}
.markdown-body span.frame span img {
    display: block;
    float: left;
}
.markdown-body span.frame span span {
    clear: both;
    color: #333;
    display: block;
    padding: 5px 0 0;
}
.markdown-body span.align-center {
    display: block;
    overflow: hidden;
    clear: both;
}
.markdown-body span.align-center>span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: center;
}
.markdown-body span.align-center span img {
    margin: 0 auto;
    text-align: center;
}
.markdown-body span.align-right {
    display: block;
    overflow: hidden;
    clear: both;
}
.markdown-body span.align-right>span {
    display: block;
    overflow: hidden;
    margin: 13px 0 0;
    text-align: right;
}
.markdown-body span.align-right span img {
    margin: 0;
    text-align: right;
}
.markdown-body span.float-left {
    display: block;
    margin-right: 13px;
    overflow: hidden;
    float: left;
}
.markdown-body span.float-left span {
    margin: 13px 0 0;
}
.markdown-body span.float-right {
    display: block;
    margin-left: 13px;
    overflow: hidden;
    float: right;
}
.markdown-body span.float-right>span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: right;
}
.markdown-body code, .markdown-body tt {
    margin: 0 2px;
    padding: 0px 5px;
    border: 1px solid #eaeaea;
    background-color: #f8f8f8;
    border-radius: 3px;
}
.markdown-body code {
    white-space: nowrap;
}
.markdown-body pre>code {
    margin: 0;
    padding: 0;
    white-space: pre;
    border: none;
    background: transparent;
}
.markdown-body .highlight pre, .markdown-body pre {
    background-color: #f8f8f8;
    border: 1px solid #ccc;
    font-size: 13px;
    line-height: 19px;
    overflow: auto;
    padding: 6px 10px;
    border-radius: 3px;
}
.markdown-body pre code, .markdown-body pre tt {
    margin: 0;
    padding: 0;
    background-color: transparent;
    border: none;
}
''')
        sys.stdout.write(HtmlFormatter(style='pastie').get_style_defs('.highlight'))
        sys.stdout.write('''
        </style>   
        ''')
        sys.stdout.write("<div class='markdown-body' id='top'>")
        sys.stdout.flush()
        # Note: you may want to run this through bleach for sanitization
        html = markdown.markdown(
                data,
                output_format="html5",
                extensions=[
                        "markdown.extensions.fenced_code",
                        "markdown.extensions.codehilite",
                        "markdown.extensions.tables",
                        "markdown.extensions.toc"],
                extension_configs={
                        "markdown.extensions.codehilite":{"css_class":"highlight"}})
        sys.stdout.write(html)
        sys.stdout.write("</div>")
        # add back the useless tags (and this table will be hidden just like the first one)
        sys.stdout.write("<table class='blob'><tr><td><pre><code>")
else:
        # printout pygments' css definitions as well
        sys.stdout.write('<style>')
        sys.stdout.write(formatter.get_style_defs('.highlight'))
        sys.stdout.write('</style>')
        sys.stdout.write(highlight(data, lexer, formatter, outfile=None))

Tags:

Comments on 2018-06-11 Highlighting Code and Rendering Markdown for cgit

I might yet get to replace all the links in Gridmapper!

– Alex Schroeder 2018-06-11 21:02 UTC


I also added the TOC extension to /usr/lib/cgit/filters/html-converters/md2html:

markdown.markdownFromFile(
    output_format="html5",
    extensions=[
        "markdown.extensions.fenced_code",
        "markdown.extensions.codehilite",
        "markdown.extensions.tables",
        "markdown.extensions.toc"],
    extension_configs={"markdown.extensions.codehilite":{"css_class":"highlight"}})

– Alex Schroeder 2018-06-13 07:05 UTC

Add Comment

More...

Comments


Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. Note: in order to facilitate peer review and fight vandalism, we will store your IP number for a number of days. See Privacy Policy for more information. See Info for text formatting rules. You can edit this page if you need to fix typos. You can subscribe to updates by email without leaving a comment.

To save this page you must answer this question:

Please say HELLO.

Referrers: Planet Emacsen Alex Schroeder 🐝 (@kensanata@octodon.social) - Octodon Diary Asshat Paladins Gothridge Manor Ynas Midgard's RPG Blog