1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
blog/output/feeds/all.atom.xml

1431 lines
109 KiB
XML

2 years ago
<?xml version="1.0" encoding="utf-8"?>
3 months ago
<feed xmlns="http://www.w3.org/2005/Atom"><title>LEdoian's Blog</title><link href="https://blog.ledoian.cz/" rel="alternate"></link><link href="https://blog.ledoian.cz/feeds/all.atom.xml" rel="self"></link><id>https://blog.ledoian.cz/</id><updated>2024-09-09T16:28:00+02:00</updated><entry><title>Using Gleam in HTML with as little JavaScript knowledge as possible</title><link href="https://blog.ledoian.cz/using-gleam-in-html-low-js.html" rel="alternate"></link><published>2024-09-09T16:28:00+02:00</published><updated>2024-09-09T16:28:00+02:00</updated><author><name>LEdoian</name></author><id>tag:blog.ledoian.cz,2024-09-09:/using-gleam-in-html-low-js.html</id><summary type="html">&lt;p&gt;I've been looking at the &lt;a class="reference external" href="https://gleam.run"&gt;Gleam language&lt;/a&gt; recently. Among other features, it can be compiled to JavaScript, and thus presumably used on web frontend. I wanted to try that. This is a short tutorial on how to do that with little idea how JavaScript is supposed to work.&lt;/p&gt;
&lt;p&gt;My initial …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've been looking at the &lt;a class="reference external" href="https://gleam.run"&gt;Gleam language&lt;/a&gt; recently. Among other features, it can be compiled to JavaScript, and thus presumably used on web frontend. I wanted to try that. This is a short tutorial on how to do that with little idea how JavaScript is supposed to work.&lt;/p&gt;
&lt;p&gt;My initial JS knowledge: &lt;tt class="docutils literal"&gt;alert(3)&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;onclick&lt;/tt&gt; and some basic selectors, i.e. the little stuff that is useful to add minor interactivity to HTML pages and implement trivial ViolentMonkey scripts. Namely: I have no knowledge about modules and whatnot, and this post is just a result of my trial-and-error attempt at embedding my Gleam. I succeeded, but still have no idea what I am doing :-)&lt;/p&gt;
&lt;div class="section" id="my-code"&gt;
&lt;h2&gt;My code&lt;/h2&gt;
&lt;p&gt;Let's start with some trivial code, in &lt;tt class="docutils literal"&gt;src/lol.gleam&lt;/tt&gt; (in a project initialised with &lt;tt class="docutils literal"&gt;gleam new lol&lt;/tt&gt; and the &lt;tt class="docutils literal"&gt;repeatedly&lt;/tt&gt; package added with &lt;tt class="docutils literal"&gt;gleam add repeatedly&lt;/tt&gt;):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
import gleam/io
import repeatedly
pub fn say_hello() {
repeatedly.call(2000, Nil, fn(_state, _call) {io.println(get_greeting())})
}
pub fn get_greeting() {
&amp;quot;Hello World!&amp;quot;
}
pub fn main() {
io.println(&amp;quot;3, 2, 1, go!&amp;quot;)
}
&lt;/pre&gt;
&lt;p&gt;This snippet has many of the basic stuff I might need in future: it does some io, it uses another package &lt;a class="footnote-reference" href="#stdlib-package" id="footnote-reference-1"&gt;[1]&lt;/a&gt;, it returns data I will want to show. At first I am mostly interested in multiplatform stuff (i.e. running also on the BEAM backend), so I don't want to use any DOM frameworks at first, though I will mention some of the ways later in the post.&lt;/p&gt;
&lt;p&gt;So, build this for JavaScript: &lt;tt class="docutils literal"&gt;gleam build &lt;span class="pre"&gt;--target&lt;/span&gt; javascript&lt;/tt&gt;, and &lt;em&gt;stuff happens&lt;/em&gt;. It is not very clear what to do now, but &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;grep``ping&lt;/span&gt; through the ``build/&lt;/tt&gt; directory shows that the built code lives in &lt;tt class="docutils literal"&gt;build/dev/javascript/lol/lol.mjs&lt;/tt&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="embedding-the-code"&gt;
&lt;h2&gt;Embedding the code&lt;/h2&gt;
&lt;p&gt;Here comes the fun part: the code is in JavaScript &lt;em&gt;module&lt;/em&gt;, not plain code. That comes with several surprises:
- It can only be imported from other modules, not by “plain” code in global scope
- Due to CORS, imports only work with network schemes, not with the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;file://&lt;/span&gt;&lt;/tt&gt; one
- Due to scoping, I have not found a way of using the functions from devtools console&lt;/p&gt;
&lt;p&gt;Big wins for the platform /s, but we have to live with that, so let's try to write the respective HTML for this. I put that in &lt;tt class="docutils literal"&gt;main.html&lt;/tt&gt; in the project root, but it does not probably matter. The code:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=utf-8&amp;gt; &amp;lt;!-- firefox complains otherwise --&amp;gt;
&amp;lt;title&amp;gt;Buh&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- some random elements to work with --&amp;gt;
&amp;lt;button id=butt&amp;gt;Klik mee&amp;lt;/button&amp;gt;
&amp;lt;p id=uwu&amp;gt;
&amp;lt;!-- the “binding” to our Gleam code. This probably needs to be at the end of the page, since it needs to be able to use the selectors. --&amp;gt;
&amp;lt;script type=module&amp;gt; //It has to be a module to allow imports
import * as lol from &amp;quot;./build/dev/javascript/lol/lol.mjs&amp;quot;;
// Set the text of one element to the computed stuff:
let par = document.getElementById('uwu');
par.innerText = lol.get_greeting();
// Let's have an interactive button (I love the come-from pattern, but using `onclick` would be even trickier…)
let butt = document.getElementById('butt');
butt.addEventListener('click', lol.say_hello);
// Apparently, the `main` function does not get run automatically, so call that explicitly.
lol.main();
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Shoutout to &lt;a class="reference external" href="https://stackoverflow.com/questions/53630310/use-functions-defined-in-es6-module-directly-in-html"&gt;the person who asked the same question on StackOverflow&lt;/a&gt;. From this point on, we only need a HTTP server; luckily, Python has one in stdlib, so just calling &lt;tt class="docutils literal"&gt;python3 &lt;span class="pre"&gt;-m&lt;/span&gt; http.server 12312&lt;/tt&gt; in the project root lets us load &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;http://localhost:12312/main.html&lt;/span&gt;&lt;/tt&gt; and see our page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="next-steps-alternatives-et-cetera"&gt;
&lt;h2&gt;Next steps, alternatives et cetera&lt;/h2&gt;
&lt;p&gt;When developing web frontend in Gleam, the more common way is using a framework like &lt;a class="reference external" href="https://hexdocs.pm/lustre/index.html"&gt;Lustre&lt;/a&gt; or at least a DOM library (there are &lt;a class="reference external" href="https://packages.gleam.run/?search=dom"&gt;several&lt;/a&gt;, I have no idea how mature those are). I did not go this route yet, because I am more interested in using backend-agnostic Gleam code from JavaScript and don't mind writing the trivial bindings in JavaScript. &lt;a class="footnote-reference" href="#netzpevnik-gleam" id="footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also, a common thing to do is using a minifier+bundler like &lt;a class="reference external" href="https://hexdocs.pm/esgleam/index.html"&gt;esgleam&lt;/a&gt; (it uses &lt;a class="reference external" href="https://esbuild.github.io/"&gt;esbuild&lt;/a&gt; under the hood), so that the whole project is in one file. I don't think I need that now (having the JS be readable is more important to me atm and I don't want to complicate things further), but there is at least &lt;a class="reference external" href="https://erikarow.land/notes/esgleam-embed"&gt;one tutorial&lt;/a&gt; on how to do that.&lt;/p&gt;
&lt;p&gt;Also, during writing of this article I realised Gleam can run all the JS code from itself, so I could have a &lt;tt class="docutils literal"&gt;js_main&lt;/tt&gt; function that would bind the HTML from Gleam itself. But this is probably more readable and separated anyway.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="stdlib-package" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Well, as far as I understand it, Gleam's stdlib is actually just another package anyway.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="netzpevnik-gleam" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I will probably use some kind of framework eventually as a part of &lt;a class="reference external" href="https://gitea.ledoian.cz/LEdoian/netzpevnik"&gt;netzpevnik&lt;/a&gt;, but I am exploring the technologies that will be involved, so I want to keep stuff simple.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="programming"></category><category term="gleam"></category><category term="software"></category><category term="web"></category></entry><entry><title>Hello, I'm agender</title><link href="https://blog.ledoian.cz/hello-im-agen.html" rel="alternate"></link><published>2024-05-21T17:03:00+02:00</published><updated>2024-05-21T17:03:00+02:00</updated><author><name>LEdoian</name></author><id>tag:blog.ledoian.cz,2024-05-21:/hello-im-agen.html</id><summary type="html">&lt;p&gt;Hell yeah, a coming out!&lt;/p&gt;
6 months ago
&lt;p&gt;Important: Please, read this article &lt;em&gt;in full&lt;/em&gt; and do not just skim it. There
is no TL;DR, I don't think any reasonable summary of this post can be made
without me misrepresenting myself. Alternatively, please just skip this article
altogether I am fine with …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hell yeah, a coming out!&lt;/p&gt;
&lt;p&gt;Important: Please, read this article &lt;em&gt;in full&lt;/em&gt; and do not just skim it. There
is no TL;DR, I don't think any reasonable summary of this post can be made
without me misrepresenting myself. Alternatively, please just skip this article
altogether I am fine with people not knowing these details about me and not
acting upon them. Thank you a lot! (The way of interacting with me changes only
a little, if at all, but I care a lot about how this fact about me is handled.)&lt;/p&gt;
&lt;p&gt;NB &lt;a class="footnote-reference" href="#pun" id="footnote-reference-1"&gt;[1]&lt;/a&gt;: This is only about me at this time. My experiences are my own,
please don't assume any of this applies to anybody else while it might, there
are a lot of other agender experiences that are quite different from mine and
assuming others are feeling the same will probably lead to misrepresentation
and hurtful attitude. Please, just ask (it may feel weird, but being treated
wrong feels weirder), thanks.&lt;/p&gt;
&lt;p&gt;Also, my own identity and feelings may change in the future (as they certainly
have in the past), so while I'll try to add an obsoletion banner to the top of
this article when/if that happens, if you think I'm inconsistent with what I
have written here, please also ask me about that.&lt;/p&gt;
&lt;p&gt;This is a rather general post, I would like to write separate articles going
into more detail. I'll add them here, but before I do that, feel free to ask me &lt;a class="footnote-reference" href="#asking-bad-questions" id="footnote-reference-2"&gt;[2]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, let's get into my gender!&lt;/p&gt;
&lt;div class="section" id="what-am-i-feeling"&gt;
&lt;h2&gt;What am I feeling&lt;/h2&gt;
&lt;p&gt;I feel reasonably fine. The better question is: what am I &lt;em&gt;not&lt;/em&gt; feeling? I do
not feel gender I don't relate to being man or woman, I am just me. The
ideals of &amp;quot;stereotypical&amp;quot; man or woman feel foreign to me, and for as long as I
can remember, I haven't felt &amp;quot;wo/manly&amp;quot;.&lt;/p&gt;
&lt;p&gt;Before I thought about it, I would tell you that I was one of the classic
genders. Passively, that would be my best guess: my given name is that
gender, my ID says I am that sex, etc.&lt;/p&gt;
&lt;p&gt;But then I thought about it, and pretty much didn't find the answer to &amp;quot;how do
I feel my assumed gender?&amp;quot;. I read some classical descriptions, and didn't feel
like I match. I even considered, whether I would want to be treated as the
opposite gender, but the answer was something like &amp;quot;nah, sure it would be
different, but that has its own set of problems and I don't see any wins there
either.&amp;quot;&lt;/p&gt;
&lt;p&gt;That's the short timeline, I will share more details in a separate post. If I
write it, that is.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="how-to-behave-towards-me"&gt;
&lt;h2&gt;How to behave towards me&lt;/h2&gt;
&lt;p&gt;Important disclaimer: Especially this section &lt;strong&gt;only talks about me&lt;/strong&gt;, other
agender people may feel differently. Do &lt;strong&gt;not&lt;/strong&gt; assume anything about other
(agender) people from this!&lt;/p&gt;
&lt;div class="section" id="language"&gt;
&lt;h3&gt;Language&lt;/h3&gt;
&lt;p&gt;The first thing that comes to mind is the language. In general, I don't like
being titled with gendered words when referring specifically to me (i.e. I am
not a &amp;quot;boy&amp;quot;, &amp;quot;lady&amp;quot;, &amp;quot;man&amp;quot;, &amp;quot;daughter&amp;quot; etc.) please prefer general words like
&amp;quot;person&amp;quot;. When addressing me together with other people, I will not complain to
be included under general statements like &amp;quot;ladies and gentlemen&amp;quot;. This means
that there should not be too much that changes in this regard.&lt;/p&gt;
&lt;p&gt;Pronouns everyone's favourite topic are a bit tricky due to differences
between languages I speak. In English I slightly prefer they/them, but any
traditional pronouns (he/it/she) are also fine with me.&lt;/p&gt;
&lt;p&gt;In Czech, due to inflection of names, first start to referring to me as
LEdoian, because my given name would sound very weird in other grammatical
genders. And then probably still keep using masculine for me (LEdoian is
declined the same way as &amp;quot;pán&amp;quot;) while I am open to experimentation &lt;a class="footnote-reference" href="#grammatically-neutral" id="footnote-reference-3"&gt;[3]&lt;/a&gt;,
I have not figured out the details and would like to arrange individually (at
least at first). If you want to be part of the experimentation, ask me :-)&lt;/p&gt;
&lt;p&gt;I do not consider my given name to be a deadname (at least for now), you can
keep using it and don't need to feel bad for doing that. However, don't use the
name in a different grammaical gender, that would sound weird. And unless we
already use some variation of my given name, do not try to invent a new one.&lt;/p&gt;
&lt;!-- I could put here a table like at pronouns.page (or other pages), but I am
afraid it would be too visually appealing for people to avoid reading the
text. And I can definitely not put everything in it, so it might cause more
harm than without the table. Sorry. (It's like four paragraphs anyway, so…) --&gt;
&lt;/div&gt;
&lt;div class="section" id="in-relation-to-others"&gt;
&lt;h3&gt;In relation to others&lt;/h3&gt;
&lt;p&gt;I am not completely out yet in fact, sharing with &amp;quot;whoever on the internet
actually cares about me enough to read my blog&amp;quot; currently seems like one of the
safer ways. So while me being agender is not a secret anymore, I
wouldn't like it to be the &amp;quot;gossip of the day&amp;quot; either (it's not a good talking
point and I am giving way too litle detail here for anyone to be able to
represent me accurately anyway). Don't out me just because you can &lt;a class="footnote-reference" href="#coming-out-to-some-people" id="footnote-reference-4"&gt;[4]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If somehow the talk comes to this topic and you need to reference me
specifically, I think the best thing is to hint that I am &lt;em&gt;non-binary&lt;/em&gt; as the
reasonable compromise between misrepresenting me as any binary gender and fully
outing me. Also try keeping in mind that the term &amp;quot;non-binary&amp;quot; is an umbrella
term that conveys even &lt;em&gt;less&lt;/em&gt; information about feeling of self than &amp;quot;man&amp;quot; or
&amp;quot;woman&amp;quot; do. See also &lt;a class="reference internal" href="#the-queer-quirks"&gt;the queer quirks&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;If the listener knows me, you can tell them to ask me if they are interested in
more. That is more preferred approach than referencing this blogpost, because
that lets me represent myself better and in a more concise way than this post
can.&lt;/p&gt;
&lt;p&gt;On a related note, you may find yourself in a discussion that misrepresents me &lt;a class="footnote-reference" href="#idk-how" id="footnote-reference-5"&gt;[5]&lt;/a&gt;.
While I understand that you might want me to feel good and included, I would
like you to &lt;em&gt;not&lt;/em&gt; stand up for me too explicitly. I don't want to it being the
big deal, if I am present, it is way more comfortable to be accidentally
misrepresented than having the conversation take a bad turn and becoming weird.
(See &lt;a class="reference external" href="https://youtube.com/watch?v=auXqQp-jWsk"&gt;this episode of Couple-ish&lt;/a&gt;
for a maybe-not-too-exaggerated example of a derailed discussion.) Probably the
best thing is to ignore the misrepresentation or dismiss it with something like
&amp;quot;that is actually more complicated&amp;quot;. If I am present, let me do most of the
speaking (or ignoring) I think I know how much I want to stand for myself in
a given situation. (Standing up for non-binary/trans*/genderqueer/… people in
general is fine if you want to do that, just please don't make that inherently
about me &lt;a class="footnote-reference" href="#being-ally-is-more-acceptable" id="footnote-reference-6"&gt;[6]&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;That being said, referring to me as LEdoian is fine (I think most people know
that this is my nickname, even if they don't actively use it), if we decided to
use a different grammatical gender for Czech, it's both fine to use that and to
fall back to masculine if that feels it would fit the conversation. &lt;a class="footnote-reference" href="#incompatible-agreements-maybe" id="footnote-reference-7"&gt;[7]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The fun part is interacting with me, which follows completely different rule:
if you think I am misgendering &lt;em&gt;myself&lt;/em&gt;, please tell me you think so. This
helps me be more mindful about when I use gendered language. (If I misgender
someone who is out or you are allowed to out them, also please tell me, it is
probably unintentional.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="other-stuff"&gt;
&lt;h3&gt;Other stuff&lt;/h3&gt;
&lt;p&gt;It's nice to be able to represent myself in forms, so I like being able to
choose the third option for gender (if you need to ask). I don't particularly
mind whether it is described as &amp;quot;other&amp;quot; or &amp;quot;not specified&amp;quot;. (Just maybe don't
try to be too clever about the choice, &lt;a class="reference external" href="https://genders.wtf"&gt;or else&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;While I am not very proactive about my gender (as in, I don't have the urge to
tell anyone on sight), I am quite open about my experience. Feel free to ask me
if you are interested. If you think it would be too weird to ask out of the
blue (or you just want to let me know you read this blogpost I appreciate
that!), ask me what my hair colour is :-)&lt;/p&gt;
&lt;p&gt;And again, please prefer asking me to assuming stuff about me (or possibly
anyone). Gender is weird, there is a lot I am not telling in this post and a
lot of nuance that can be hard to convey to general public.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="the-queer-quirks"&gt;
&lt;h2&gt;The queer quirks&lt;/h2&gt;
&lt;p&gt;I understand not everyone has studied queer-sensitive language &lt;a class="footnote-reference" href="#ally-year-ago" id="footnote-reference-8"&gt;[8]&lt;/a&gt;,
so let me put here a few basic rules for talking about queer people. (Again,
just a quick rundown, I may write a separate article about this.) As opposed to
the above, &lt;strong&gt;this section is general&lt;/strong&gt; and represents the current usage of
language, to the best of my knowledge.&lt;/p&gt;
&lt;p&gt;Parts of speech: Most labels like &amp;quot;agender&amp;quot;, &amp;quot;transgender&amp;quot;, &amp;quot;non-binary&amp;quot;,
&amp;quot;genderqueer&amp;quot; are used as adjectives (like e.g. the word &amp;quot;blue&amp;quot;), so they are
used like &amp;quot;an agender person&amp;quot;, &amp;quot;the transgender flag&amp;quot;, &amp;quot;they are non-binary&amp;quot;.
&lt;em&gt;Do not&lt;/em&gt; say ~~&amp;quot;flag of agenders&amp;quot;, &amp;quot;they are a genderqueer&amp;quot;~~ or even ~~&amp;quot;John is
transgendered&amp;quot;~~. Some labels can be also used as nouns, and &lt;em&gt;some people&lt;/em&gt; also
reclaim &lt;em&gt;some labels&lt;/em&gt; to be used as nouns, but others may not think that is
appropriate usage for them. E.g. the word &amp;quot;enby&amp;quot; belongs to the former group,
but &amp;quot;gay&amp;quot; belongs to the later (acc. to &lt;a class="reference external" href="https://en.wiktionary.org/wiki/gay#Usage_notes_2"&gt;wiktionary&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;This usage differs a bit in different languages, though. In Czech, most labels
are still adjectives, though. Usually labels are not inflected, except when the
word is &amp;quot;Czech-compatible enough&amp;quot;: „vidím transgender ženu“, „s nebinárními
přáteli“.&lt;/p&gt;
&lt;p&gt;Labels: Labels itself are mostly useful as approximations of what someone
feels. They are useful to relate to others and in communicating, but almost
never give full information themselves. Some are
umbrella terms for many experiences, which may have their own label; however,
this does not mean that by using a sublabel one also identifies with the
umbrella term which the sublabel is canonicaly part of. It is &lt;strong&gt;up to the
person themself&lt;/strong&gt; to determine which labels they want to use, labeling others
against their will is inappropriate/rude. Sublabels that are not widely known
are often termed &amp;quot;microlabels&amp;quot;. (Using labels is voluntary, queer people do
not need to use any labels for themselves.)&lt;/p&gt;
&lt;p&gt;Few relevant labels/words:&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;transgender&lt;/dt&gt;
&lt;dd&gt;in the widest sense, a person who experiences their gender differently from
the gender they were assigned at birth. A broad umbrella term. (People who
experience gender in accordance to the gender they were assigned at birth are
termed &lt;em&gt;cisgender&lt;/em&gt;.)&lt;/dd&gt;
&lt;dt&gt;non-binary&lt;/dt&gt;
&lt;dd&gt;a person who does not feel to be &amp;quot;100% man&amp;quot; or &amp;quot;100% woman&amp;quot;. Canonicaly this
falls under the transgender umbrella. Also a rather broad umbrella term.&lt;/dd&gt;
&lt;dt&gt;agender&lt;/dt&gt;
&lt;dd&gt;a person who does not experience gender. Canonically under non-binary. In
fact, this still covers very different experiences regarding gender.&lt;/dd&gt;
&lt;dt&gt;genderqueer&lt;/dt&gt;
&lt;dd&gt;synonymous in definition to non-binary: not exclusively man or woman. (As
written above, not all non-binary people also identify as genderqueer, and not
all genderqueer people identify as non-binary.)&lt;/dd&gt;
&lt;dt&gt;enby (n.)&lt;/dt&gt;
&lt;dd&gt;when used as noun, a non-binary equivalent to words &amp;quot;boy&amp;quot; and &amp;quot;girl&amp;quot;. Some
non-binary people use the term for themselves, other see it as too childish.&lt;/dd&gt;
&lt;dt&gt;intersex&lt;/dt&gt;
&lt;dd&gt;(included just for the distinction) having ambiguous or mismatching
biological sex characteristics (genitalia, chromosomes, phenotype). Not
necessarily under the transgender umbrella intersex people may experience
their gender (a social construct) in a way typical for the one they were
assigned at birth.&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="section" id="my-gender-labels"&gt;
&lt;h3&gt;My gender labels&lt;/h3&gt;
&lt;p&gt;(Not general anymore, this is solely about me again.)&lt;/p&gt;
&lt;p&gt;I use the following labels to describe my experience with gender to most
people: agender, genderless (synonymous in definition to agender), non-binary,
enby. My microlabels are out of scope of this post (to keep it short and not
give undefined words).&lt;/p&gt;
&lt;p&gt;The label &amp;quot;genderqueer&amp;quot; somewhat describes my experience, but I don't use it
I think &amp;quot;non-binary&amp;quot; is more approachable and more explicitly states that it
doesn't really describe a particular gender experience. In other words,
depending on the wording I would say it technically &lt;em&gt;applies&lt;/em&gt;, but not that I
&lt;em&gt;use&lt;/em&gt; the label.&lt;/p&gt;
&lt;p&gt;I don't use the word &amp;quot;transgender&amp;quot; to describe myself. To me it feels the word
often conveys the idea of gender change, transition and associated challenges,
and I don't identify with this experience. (I think I can understand at least
some parts of the struggle, though, and I do enjoy transgender memes :-))&lt;/p&gt;
&lt;p&gt;There are a few words that I might use to describe myself, I don't consider
them to be microlabels, but they have a tricky relation to my gender (which is
out of scope of this blogpost). Please, do not use them to describe me, unless
I described in detail what I mean (canary: this has not happened since writing
this post), even if I used the word myself and you know the definition:
gender-nonconforming, genderfluid.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="faq-forcefully-avoided-questions-fairly-anticipated-questions"&gt;
&lt;h2&gt;FAQ: Forcefully avoided questions / Fairly anticipated questions&lt;/h2&gt;
&lt;p&gt;I guess people will ask, so let me just put down some answers here in advance :-)&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;How do you know you really are agender? What will you do if you start feeling gender? Is it just a phase?&lt;/dt&gt;
&lt;dd&gt;The label is just a way to put a name to what I feel now. And no, I don't
have all the answers &lt;a class="footnote-reference" href="#reference" id="footnote-reference-9"&gt;[9]&lt;/a&gt;. Using the label allows me to find other
people with similar feelings, learn how they navigate possible challenges and
puts my mind at peace that I am not completely insane/broken/alone. If my identity
changes, I'll try to find comfort in another label probably. If it is just a
phase, so be it, I can probably still learn something about myself from it.&lt;/dd&gt;
&lt;dt&gt;Does anything else change about you?&lt;/dt&gt;
&lt;dd&gt;Yes. Apart from what I have written on this page, I realised that I do not
have to follow gender stereotypes/expectations for myself, so I started
experimenting more with my appearance. Confused a few people already :-D&lt;/dd&gt;
&lt;dt&gt;What if I accidentally outed you?&lt;/dt&gt;
&lt;dd&gt;That's life, and it's not like it can be undone. Since me being agender is
low-key public information anyway, it is not a big deal to me. However, if
you tell me who you've told, it will help me be ready if they start asking
unexpected questions (esp. because when someone first interacts with a queer
topic they might be unintentionally insensitive). You can also tell the
person you outed me to that I am basically fine with them knowing, so that
they don't &lt;a class="reference external" href="https://blog.ledoian.cz/do-not-gossip-identities.html"&gt;need to metagame&lt;/a&gt; w.r.t.
my gender.&lt;/dd&gt;
&lt;dt&gt;What do you have between your legs?&lt;/dt&gt;
&lt;dd&gt;Not answering this one. You wouldn't ask your teacher. You wouldn't ask your
boss, you wouldn't ask your uncle and then make sure yourself. Asking such
questions is inappropriate and being asked such questions is unpleasant.
&lt;a class="footnote-reference" href="#reference" id="footnote-reference-10"&gt;[9]&lt;/a&gt; (How I feel my gender is not related to my anatomy. How does
having two nostrils make you feel?) &lt;a class="footnote-reference" href="#dysphoria-question" id="footnote-reference-11"&gt;[10]&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;There are a few questions to which the answer is something like: &amp;quot;no, it's
complicated, maybe read the blogpost in a few days again and if it still isn't
clear, please ask me directly.&amp;quot;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;So you are a man/boy?&lt;/li&gt;
&lt;li&gt;So you are a woman/girl?&lt;/li&gt;
&lt;li&gt;Are you transgender?&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="closing-thought"&gt;
&lt;h2&gt;Closing thought&lt;/h2&gt;
&lt;p&gt;This is a rather sensitive topic, not just for me, but for many people who are
struggling with/doubting/hiding their gender (and the doubts can return or be
persistent). While this post is not focused on other such people, I'd be glad if you,
my dear reader, try being considerate to other
experiences/feelings similar to mine. Many other people are not in a position
to feel safe talking about these struggles. One of the reasons I am
writing this is because I want/need more people to try considering these
challenges (and through that help spread understanding) and I am &amp;quot;lucky&amp;quot; that I
can be relatively open about it, at least on the internet and in some irl
groups.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="pun" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Pun intended :-)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="asking-bad-questions" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If you are not sure whether your question would be
bad to ask, try being sensitive and tolerant and ask me anyway. And be sure
I know I don't have any obligation to answer, so if I don't, respect it. (I
don't think I am likely to reject you, but still I think it is better to
explicitly state the expectations.)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="grammatically-neutral" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;In fact, I am now trying to use the neutral
grammatical gender for myself, but as a language exercise, not as the
definitive gender to use. You don't need to keep this in mind when
talking with me, though I will adapt to whatever grammatical gender we
use.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="coming-out-to-some-people" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-4"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;There are several people I want to make sure I
come out to myself when I am ready. I need them to understand me
correctly, it would be painful to refute any misconceptions they get from
other sources. This blogpost is written carefully and would be OK for
them to read as an introduction, but probably still unnecessary. (Please
don't go around like &amp;quot;Hey, I cannot tell you but LEdoian has an interesting
post on their blog, go check that out&amp;quot;, ffs.)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="idk-how" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-5"&gt;[5]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I haven't thought about what failure modes of discussion my
gender could yield, but I guess some could emerge, so I am adding this
paragraph just in case :-)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="being-ally-is-more-acceptable" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-6"&gt;[6]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;So far, being LGBTQ+ ally looks like being
a safe position for me. I am not yet sure if being openly non-binary would
be also safe. Therefore, while I can ~freely advocate for
queer/trans/non-binary people in general, standing up for myself in
particular might have unseen consequences.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="incompatible-agreements-maybe" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-7"&gt;[7]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;In the unlikely event you meet someone and
you use different grammatical gender for me, throw a game of
rock-paper-scissors or something. Or use another way to determine. &amp;quot;Don't
make trouble and agree on something!&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="ally-year-ago" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-8"&gt;[8]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;To be fair, I didn't know the language a year ago myself
and I still keep finding new words and descriptions of gender experiences.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="reference" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;[9]&lt;/td&gt;&lt;td&gt;&lt;em&gt;(&lt;a class="fn-backref" href="#footnote-reference-9"&gt;1&lt;/a&gt;, &lt;a class="fn-backref" href="#footnote-reference-10"&gt;2&lt;/a&gt;)&lt;/em&gt; Kudos to you if you recognise this reference :-)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="dysphoria-question" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-11"&gt;[10]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Asking this question is also insensitive and possibly
actively harmful towards people who feel distressed by the mismatch between
their gender and genitalia. Just please don't ask about this.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="queer"></category><category term="gender"></category><category term="identity"></category></entry><entry><title>Only NAT packets you can deliver responses for</title><link href="https://blog.ledoian.cz/masquerade-with-filter.html" rel="alternate"></link><published>2024-05-08T13:32:00+02:00</published><updated>2024-05-08T13:32:00+02:00</updated><author><name>LEdoian</name></author><id>tag:blog.ledoian.cz,2024-05-08:/masquerade-with-filter.html</id><summary type="html">&lt;p&gt;When setting up a masquerading nat, it is worth considering masquerading only
packets from known networks. That is, instead of rule like &lt;tt class="docutils literal"&gt;iifname &lt;span class="pre"&gt;eth-inside&lt;/span&gt;
masquerade&lt;/tt&gt; use something like &lt;tt class="docutils literal"&gt;iifname &lt;span class="pre"&gt;eth-inside&lt;/span&gt; ip saddr 198.51.100.0/24
masquerade&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I learned the hard way: my laptop in a masqueraded network picked …&lt;/p&gt;</summary><content type="html">&lt;p&gt;When setting up a masquerading nat, it is worth considering masquerading only
packets from known networks. That is, instead of rule like &lt;tt class="docutils literal"&gt;iifname &lt;span class="pre"&gt;eth-inside&lt;/span&gt;
masquerade&lt;/tt&gt; use something like &lt;tt class="docutils literal"&gt;iifname &lt;span class="pre"&gt;eth-inside&lt;/span&gt; ip saddr 198.51.100.0/24
masquerade&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I learned the hard way: my laptop in a masqueraded network picked a wrong
source address from a subnet the router had no knowledge about. The outbound
packets passed through right, but the responses came in, undergone translation,
and since the destination was unknown to the router, it used the &lt;em&gt;default&lt;/em&gt;
route, sending the packet back to the ISP.&lt;/p&gt;
&lt;p&gt;The result: IDS triggered by &lt;em&gt;many&lt;/em&gt; packets from my router with source IP
addresses from all around the Internet, all with destination to my private
address. (The ISP was not happy about that.)&lt;/p&gt;
</content><category term="til"></category><category term="linux"></category></entry><entry><title>Creating own XKB tweaks</title><link href="https://blog.ledoian.cz/custom-xkb-tweaks.html" rel="alternate"></link><published>2024-04-17T16:40:00+02:00</published><updated>2024-04-17T16:40:00+02:00</updated><author><name>LEdoian</name></author><id>tag:blog.ledoian.cz,2024-04-17:/custom-xkb-tweaks.html</id><summary type="html">&lt;p&gt;Debugging this took me a bit too long, so I want to write about the caveat.&lt;/p&gt;
7 months ago
&lt;p&gt;My problem: My laptop does not have PageUp and PageDown keys, and many other
keyboards I use have similar deficiencies. And I use various environments and
various systems, some of which are shared with …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Debugging this took me a bit too long, so I want to write about the caveat.&lt;/p&gt;
&lt;p&gt;My problem: My laptop does not have PageUp and PageDown keys, and many other
keyboards I use have similar deficiencies. And I use various environments and
various systems, some of which are shared with other people who don't need/want
my tweaks. IOW: I want something generic, but it must be confined to my user
no system-wide daemon, no udev remapping. (I mostly ended up with these
solutions when I searched for a way to remap keys on Wayland.)&lt;/p&gt;
&lt;p&gt;Requirements: xkbcommon implementation of XKB with utilities. It is quite
common these days (duh…), but you could probably just compile this yourself if
you don't have it.&lt;/p&gt;
&lt;div class="section" id="the-tweaking"&gt;
&lt;h2&gt;The tweaking&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://xkbcommon.org/doc/current/user-configuration.html"&gt;xkbcommon guide&lt;/a&gt; tells us that we
can inspect the files in &lt;a class="footnote-reference" href="#lazy" id="footnote-reference-1"&gt;[1]&lt;/a&gt; &lt;tt class="docutils literal"&gt;/usr/share/X11/xkb&lt;/tt&gt; for the source files
and just write our bits to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.config/xkb/symbols/ledoian&lt;/span&gt;&lt;/tt&gt;. In particular, I
added this snippet to remap keyboard brightness controls to PageUp/Down:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
partial
xkb_symbols &amp;quot;qs&amp;quot; {
key &amp;lt;I238&amp;gt; {[ Prior ]};
key &amp;lt;I237&amp;gt; {[ Next ]};
};
&lt;/pre&gt;
&lt;p&gt;The key identifiers are taken e.g. from &lt;tt class="docutils literal"&gt;xkbcli &lt;span class="pre"&gt;interactive-wayland&lt;/span&gt;&lt;/tt&gt;.
However, this is KcCGST &lt;a class="footnote-reference" href="#kccgst-vs-rmlvo" id="footnote-reference-2"&gt;[2]&lt;/a&gt; description, but layouts are
configured using RMLVO, so I need to define an option and tell what it should
do. The guide wants me to create &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.config/xkb/rules/evdev&lt;/span&gt;&lt;/tt&gt; with:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
! option = symbols
ledoian:qs = +ledoian(qs)
! include %S/evdev
&lt;/pre&gt;
&lt;p&gt;Now I just add &lt;tt class="docutils literal"&gt;ledoian:qs&lt;/tt&gt; &lt;a class="footnote-reference" href="#option-vs-symbol" id="footnote-reference-3"&gt;[3]&lt;/a&gt; to my keyboard configuration
and… it does not work. For this, at all, but if I remap e.g. the L key, that
gets applied. The problem? That included file says that the default keyboard
model always includes &lt;tt class="docutils literal"&gt;inet(evdev)&lt;/tt&gt; symbols. Those symbols set the default
meaning of the keys, but since that got applied later, it overrides my tweak.&lt;/p&gt;
&lt;p&gt;Solution: first include, then add my option.&lt;/p&gt;
&lt;p&gt;How to debug: read stuff that &lt;tt class="docutils literal"&gt;xkbcli &lt;span class="pre"&gt;compile-keymap&lt;/span&gt; &lt;span class="pre"&gt;--verbose&lt;/span&gt;&lt;/tt&gt; tells you
(pass your config as &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--layout&lt;/span&gt;&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--variant&lt;/span&gt;&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--options&lt;/span&gt;&lt;/tt&gt;, …). At the top
it says what it does:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
xkbcommon: DEBUG: Include path added: /home/ledoian/.config/xkb
xkbcommon: DEBUG: Include path added: /usr/share/X11/xkb
xkbcommon: DEBUG: Compiling from RMLVO: rules 'evdev', model 'pc105', layout 'us', variant '(null)', options '(null)'
xkbcommon: DEBUG: Compiling from KcCGST: keycodes 'evdev+aliases(qwerty)', types 'complete', compat 'complete', symbols 'pc+us+inet(evdev)'
&lt;/pre&gt;
&lt;p&gt;My option would appear before the &lt;tt class="docutils literal"&gt;inet(evdev)&lt;/tt&gt; part.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="a-note-about-x11"&gt;
&lt;h2&gt;A note about X11&lt;/h2&gt;
&lt;p&gt;X11 uses a separate implementation of XKB (the original one, in fact), which
does _not_ look into the user directory, just the system ones. However, you can
compile the keymap yourself using &lt;tt class="docutils literal"&gt;xkbcli &lt;span class="pre"&gt;compile-keymap&lt;/span&gt; [KEYMAP OPTIONS] &amp;gt;
my_layout.xkb&lt;/tt&gt; and load it into the X server with &lt;tt class="docutils literal"&gt;xkbcomp my_layout.xkb $DISPLAY&lt;/tt&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="lazy" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;This is not technically accurate, really the paths reference
&lt;tt class="docutils literal"&gt;$XDG_something&lt;/tt&gt; variables. I am lazy and just copied my system, so YMMV
(probably won't, though).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="kccgst-vs-rmlvo" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;There are two levels of describing the keymap: the
lowlevel one is called KcCGST (short for keycodes, compat, geometry,
symbols, types) and is considered to be an implementation detail; the
user-facing one is RMLVO (rules, model, layout, variant, options) and that
is what you use in the configs, with &lt;tt class="docutils literal"&gt;setxkbmap&lt;/tt&gt; &amp;amp;c.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="option-vs-symbol" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;While both this example and the &lt;a class="reference external" href="https://www.freedesktop.org/wiki/Software/XKeyboardConfig/"&gt;upstream&lt;/a&gt; layouts name
the symbols and options similarly, I think they don't need to be related
you should be able to put whatever you want in your options to the left of
&lt;tt class="docutils literal"&gt;=&lt;/tt&gt;, the right hand side is the name of the symbol file and if a
non-default layout from that file is used, its name is put in the
parentheses.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="technology"></category><category term="lifehack"></category><category term="software"></category><category term="linux"></category></entry><entry><title>You sure you want to hear the gossip?</title><link href="https://blog.ledoian.cz/do-not-gossip-identities.html" rel="alternate"></link><published>2024-03-11T22:49:00+01:00</published><updated>2024-03-11T22:49:00+01:00</updated><author><name>LEdoian</name></author><id>tag:blog.ledoian.cz,2024-03-11:/do-not-gossip-identities.html</id><summary type="html">&lt;p&gt;Sometimes, not knowing something about your friends is simpler than knowing
9 months ago
something you know you aren't supposed to know…&lt;/p&gt;
&lt;p&gt;TL;DR: If you are gossiping, please handle information which change attitude
towards others with care and maybe share them with consent of the &lt;em&gt;listener&lt;/em&gt;. &lt;a class="footnote-reference" href="#on-gossiping" id="footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some time ago, I was …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Sometimes, not knowing something about your friends is simpler than knowing
something you know you aren't supposed to know…&lt;/p&gt;
&lt;p&gt;TL;DR: If you are gossiping, please handle information which change attitude
towards others with care and maybe share them with consent of the &lt;em&gt;listener&lt;/em&gt;. &lt;a class="footnote-reference" href="#on-gossiping" id="footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some time ago, I was casually talking with my friend, let's call them Alex.
For one reason or another, we got to gossip and I learnt a new, very private
information about our mutual friend, Bay. &lt;a class="footnote-reference" href="#names2" id="footnote-reference-2"&gt;[2]&lt;/a&gt; I knew Bay would not
expect me to know or possibly even want me to know at that time, yet the new
part of their identity would require me to behave differently around Bay in
order not to hurt them. &lt;a class="footnote-reference" href="#non-disclosure" id="footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That turned my interactions with Bay into a bit of a minefield:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;If I behaved according to what I learnt, I may easily overstep Bay's
boundaries and invade their privacy, possibly quite badly. &lt;a class="footnote-reference" href="#my-privacy" id="footnote-reference-4"&gt;[4]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If I kept my old behaviour, I would feel like I am actively hurting Bay.&lt;/li&gt;
&lt;li&gt;If I accidentally slipped my tongue in front of Bay and they notice, I still
ending up invading their privacy as in point 1.&lt;/li&gt;
&lt;li&gt;I am also prone to sharing the gossip, maybe accidentally. I would be to
someone else what Alex was to me, and I certainly didn't want to cast this
&amp;quot;curse&amp;quot; on anyone. &lt;a class="footnote-reference" href="#gossip-circumstances" id="footnote-reference-5"&gt;[5]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If Bay subconsciously noticed I am behaving in line with their secret and in
another interaction I wouldn't, they could feel invalidated (without an
obvious reason why).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It sucks, it made talking to Bay needlessly stressful. Please don't do that.&lt;/p&gt;
&lt;p&gt;So, to reiterate the message: &lt;strong&gt;Please gossip *safely* and *consensually* about
stuff that is private in nature and would change attitudes towards people.&lt;/strong&gt;
For the queer stuff, this can be rephrased in layman's terms as &lt;strong&gt;please just
don't out other people to people who do not explicitly want to know.&lt;/strong&gt; &lt;a class="footnote-reference" href="#consent" id="footnote-reference-6"&gt;[6]&lt;/a&gt;&lt;/p&gt;
&lt;!-- ReST wtf, why can't I put emphasis in strong? --&gt;
&lt;p&gt;(Again, maybe gossip safely anyway, but for the &amp;quot;regular&amp;quot; gossip you can
usually hide what you know without feeling that bad.)&lt;/p&gt;
&lt;div class="section" id="final-remarks"&gt;
&lt;h2&gt;Final remarks&lt;/h2&gt;
&lt;p&gt;I wrote this post mainly to raise awareness and help learn from past mistakes.
It is not meant to shame Alex for telling me, they might not have been aware
and neither were I at the time.&lt;/p&gt;
&lt;p&gt;Apart from the role as &amp;quot;me&amp;quot; in the story, I also were &amp;quot;Bay&amp;quot; a few times,
luckily not with a too intimate part of my identity. And while I try not to be
another &amp;quot;Alex&amp;quot;, I cannot rule that completely out unfortunately.&lt;/p&gt;
&lt;p&gt;This post has been a long time in my backlog (~6 months maybe), it is not a
reaction to any recent gossip I have heard. (The points I make still hold ofc,
but lately I only heard &amp;quot;the ordinary stuff&amp;quot; which I will probably just forget
and not care about without harming anyone.)&lt;/p&gt;
&lt;p&gt;Lastly, Bay eventually told me themself, so my life is peaceful again. I didn't
ask if I am allowed to talk about that and with whom, so I err on the safe side
and will not write here anything else :-)&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="on-gossiping" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I mean, gossiping is not nice to the mentioned person who
doesn't usually consent, but it's not like I could prevent people from
gossiping, so this post is not about that. Also, you can conceal your
knowledge of &amp;quot;regular&amp;quot; gossip more easily than of gossip which changes your
attitude.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="names2" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I originally wanted to have the friends be Alice and Bob, but that
might support the narative that &amp;quot;girls gossip&amp;quot;, which is sexist and IME not
accurate (more like &amp;quot;everyone gossips&amp;quot;). So I made my friends be of
ambiguous gender and use they/them pronouns. Sorry, this might make the post
a bit harder to read, but the stereotypes need to die :-)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="non-disclosure" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I will not give any more information here. Don't try to
guess, I am not telling. Bay is my friend and deserves privacy. (However, if
you suspect that you might be the Bay of this story, by all means ask me
whether you are. I don't want you to feel bad / insecure / unsure / … (And
in fact, there may be multiple Bays…))&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="my-privacy" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-4"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;There are definitely parts of my identity I do not share much
and would probably get upset at various people (and also paranoid) if I got
outed. OTOH, the number of people who know my secrets is non-decreasing
anyway, so I try to prepare that someone unexpected inevitably will overstep
this boundary, possibly in a good faith. (If you want to try to act upon my
secrets, I'd appreciate you asking beforehand to avoid weird reactions.)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="gossip-circumstances" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-5"&gt;[5]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Naturally, this gossip sharing can have various
circumstances: Me (or Alex) being unaware that the listener (call them
Cameron) doesn't know, slipping my tongue in a subtle way yet Cameron
understanding the subtext, being drunk, … It might be difficult to keep the
secret in all those situations.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="consent" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-6"&gt;[6]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If the listener wants to know and go sweeping mines and you are
willing to tell them, ~~sure, tell them~~ it's up to you and I have no say
in that. Learn the consequences and go for the interactions you want to
have!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="queer"></category><category term="relationships"></category><category term="identity"></category></entry><entry><title>Print your stuff on Möbius bands!</title><link href="https://blog.ledoian.cz/mobius-print.html" rel="alternate"></link><published>2024-03-02T18:07:00+01:00</published><updated>2024-03-03T14:59:00+01:00</updated><author><name>LEdoian</name></author><id>tag:blog.ledoian.cz,2024-03-02:/mobius-print.html</id><summary type="html">&lt;p&gt;I found a fun and useful way of printing stuff to ~~both~~all sides of a paper.
9 months ago
I just need to find the right printer!&lt;/p&gt;
&lt;div class="section" id="quick-recap-how-to-conventionally-print-stuff-two-sided"&gt;
&lt;h2&gt;Quick recap: how to conventionally print stuff two-sided&lt;/h2&gt;
&lt;p&gt;A typical way is just sending the page to get printed two-sided (with setting
the correct way …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;I found a fun and useful way of printing stuff to ~~both~~all sides of a paper.
I just need to find the right printer!&lt;/p&gt;
&lt;div class="section" id="quick-recap-how-to-conventionally-print-stuff-two-sided"&gt;
&lt;h2&gt;Quick recap: how to conventionally print stuff two-sided&lt;/h2&gt;
&lt;p&gt;A typical way is just sending the page to get printed two-sided (with setting
the correct way of flipping pages). That is, on the other side of page 1 is
page 2, next sheet contains pages 3,4, then 5 &amp;amp; 6, …&lt;/p&gt;
&lt;p&gt;This is usually trivial to print on duplex printers, a bit hard to simulate on
one-sided printers (but some drivers can do that) and has drawbacks when you
need to look at stuff on other pages at the same time you need to flip the
sheet often, as you only can put half of the pairs of pages next to each other
(even one and the following odd one).&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;object data="https://blog.ledoian.cz/images/mobius-print/twoside.svg" style="width: 66%;" type="image/svg+xml"&gt;&lt;/object&gt;
&lt;p class="caption"&gt;Ordinary two-sided printing. Red arrows show sheet flips between consecutive
pages.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;A slight improvement hack is putting two pages on the same side of the paper
(works well with A-series of papers, I don't know for Letters &amp;amp;co.) you can
put up to four pages of the original document next to each other, if they are
the right ones, but there are still pairs of pages that need turning sheets.
Also only works if the original pages do not have too tiny features on them.
&lt;a class="footnote-reference" href="#illustrations" id="footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Booklets are fun and approachable, but still suffer from the same issues as the
conventional duplex print. They might be a bit hard to print, but programs like
&lt;tt class="docutils literal"&gt;pdfbook&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;paperjam&lt;/tt&gt; make it easy to prepare for the classic duplex
printing. Also, it is maybe hard to tell which page ends up where, as the order
is: last+first, second+penultimate, third-from-end+third, … until the pages
meet in the middle.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;object data="https://blog.ledoian.cz/images/mobius-print/booklet.svg" style="width: 66%;" type="image/svg+xml"&gt;&lt;/object&gt;
&lt;p class="caption"&gt;The most common booklet order with two pages per side for landscape
orientation. (Note that we show more pages, and thus more sheet-flips; the
number of sheet-flips is in fact the same as for two-sided printing.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="the-improvement-for-seeing-multiple-consecutive-pages"&gt;
&lt;h2&gt;The improvement for seeing multiple consecutive pages&lt;/h2&gt;
&lt;p&gt;In order to be able to look simultaneously at many consecutive pages of the
original, I think the order of first+first-past-half, second+second-past-half,
… middle+last is much better (or maybe even the best). Since consecutive pages
end up on different sheets (whenever there are at least three pages), if the
original has e.g. figures on different page or long code listing, you can see
it all!&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;object data="https://blog.ledoian.cz/images/mobius-print/mobius.svg" style="width: 66%;" type="image/svg+xml"&gt;&lt;/object&gt;
&lt;p class="caption"&gt;The &amp;quot;Möbius order&amp;quot; of pages.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;And this is really easy to use: You read a page and when you don't need it
anymore, you flip it and put to the end of the page stack &lt;a class="footnote-reference" href="#ordering" id="footnote-reference-2"&gt;[2]&lt;/a&gt;. If you
need to look at several pages, just rotate them in the same order as they go the
first time. &lt;a class="footnote-reference" href="#mistake" id="footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Need to print this? For one-sided printers this is rather easy, too: just print
the first half (the bigger one) on the sheets, then put them back into the tray
and print the rest on them. You might need to experiment which side the sheets
should be put in and whether you need to print the rest in reverse order, but
that is it.&lt;/p&gt;
&lt;p&gt;Got the pages shuffled? Sort them by the first half, as if the print was
one-sided.&lt;/p&gt;
&lt;p&gt;The only annoying thing for me is that there is not much software that could
reorder the pages for two-sided printing, so that you don't need to re-insert
the sheets back in the tray. So I &lt;a class="reference external" href="https://blog.ledoian.cz/images/mobius-print/interleave.patch"&gt;patched&lt;/a&gt; &lt;a class="reference external" href="https://mj.ucw.cz/sw/paperjam/"&gt;paperjam&lt;/a&gt; to enable this. &lt;a class="footnote-reference" href="#multi-mobius" id="footnote-reference-4"&gt;[4]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And the best part? If you would try to glue consecutive pages side-to-side,
you'd end up with a Möbius band! So if you get a Möbius paper, you can just
print this one-sided (duh :-D)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="honorable-mention-leporello"&gt;
&lt;h2&gt;Honorable mention: leporello&lt;/h2&gt;
&lt;p&gt;Printing leporellos (aka concertina folded) also has many of the same benefits,
since there is only one pair of consecutive pages that need a page flip. The
order is first+last, second+penultimate, … and the original pages can be
shuffled this way with &lt;tt class="docutils literal"&gt;paperjam&lt;/tt&gt; or simply using the other order for the
second side printing, than for the Möbius band. But there is a bit of fun
topology missing here :-)&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;object data="https://blog.ledoian.cz/images/mobius-print/leporello.svg" style="width: 66%;" type="image/svg+xml"&gt;&lt;/object&gt;
&lt;p class="caption"&gt;A leporello order is also quite good, with only one sheet-flip in the entire
document.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="is-this-the-best-order"&gt;
&lt;h2&gt;Is this the best order?&lt;/h2&gt;
&lt;p&gt;Yes, if &amp;quot;best&amp;quot; means &amp;quot;the minimum difference of numbers of pages that get put
on the same sheet is as big as possible&amp;quot;. The proof is left as an exercise for
the reader.&lt;/p&gt;
&lt;!-- Hint: you cannot pair the middle page to anything else to get a better
result. --&gt;
&lt;p&gt;Of course, this holds for a set of pages with no additional assumptions. In
ordinary print, having a sheet-turn between chapters is fine and under similar
guarantees other approaches may yield better results.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cheat-sheet-paperjam-commands"&gt;
&lt;h2&gt;Cheat sheet: paperjam commands&lt;/h2&gt;
&lt;table border="1" class="docutils"&gt;
&lt;caption&gt;Various commands for ordering pages for duplex printing with paperjam.&lt;/caption&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Order&lt;/th&gt;
&lt;th class="head"&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Classic two-sided&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;null&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Two pages per side&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;nup(2)&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Booklet&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;book&lt;/tt&gt; (follow with &lt;tt class="docutils literal"&gt;nup(2)&lt;/tt&gt; for actual booklet print)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Leporello&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;modulo(2) {1 2} modulo(1,half) {1 &lt;span class="pre"&gt;-1}&lt;/span&gt;&lt;/tt&gt; (The first &lt;tt class="docutils literal"&gt;modulo&lt;/tt&gt; just adds blank pages to the end.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Möbius (with patch)&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;interleave(2)&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Möbius (known page count)&lt;/td&gt;
9 months ago
&lt;td&gt;&lt;tt class="docutils literal"&gt;select &lt;span class="pre"&gt;{1..5&lt;/span&gt; &lt;span class="pre"&gt;10..6}&lt;/span&gt; modulo(1,half) {1 &lt;span class="pre"&gt;-1}&lt;/span&gt;&lt;/tt&gt;&lt;/td&gt;
9 months ago
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Multiple Möbius bands, odd-even&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;modulo(4) {1 3 2 4}&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Multiple bands, &amp;quot;modulo 3&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;modulo(6) {1 4 2 5 3 6}&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Second half (smaller) of pages in reverse order&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;modulo(1,half) &lt;span class="pre"&gt;{-1}&lt;/span&gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Second half (smaller) of pages in normal order&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;modulo(1,half) &lt;span class="pre"&gt;{-1}&lt;/span&gt; modulo(1) &lt;span class="pre"&gt;{-1}&lt;/span&gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;First half (bigger) of pages&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;modulo(2) {1 2} modulo(1,half) {1}&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I might create more patches for avoiding the weird &lt;tt class="docutils literal"&gt;modulo&lt;/tt&gt; commands…&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="illustrations" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Most of the figures in this article are drawn with a single
page per a side of a sheet. I consider putting more pages on a single side
of paper to be an implementation detail, because it is not always possible
(e.g. with too small font) and sometimes you could put more than two pages
on a single side of paper, which leads to the fact that if you put
everything on one side of the paper, you can see everything at once and save
the other side. Not very useful though… My only exception is the booklet
printing below, because that one seems to be rather common.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="ordering" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;See how this neatly puts the first-past-half page right after
the half of the stack? Awesome!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="mistake" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Also, if you flip the page around the wrong edge, you can just
rotate the rest of the stack and end up with the correct orientation.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="multi-mobius" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-4"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;A slight variation for which I can generate the order
with upstream &lt;tt class="docutils literal"&gt;paperjam&lt;/tt&gt; is using this order on small subsets of pages.
For example, if you only want to be able to see any two consecutive pages,
you can do this for just four pages the order is then 1+3, 2+4, 5+7, 6+8,…
Since each sheet either contains two odd or two even pages, the following
page is on different sheet than the previous one. And you can do this
&amp;quot;modulo 3&amp;quot; to see three pages: 1+4, 2+5, 3+6, 7+10, … This &amp;quot;simulates&amp;quot;
multiple smaller Möbius bands, but will be probably harder to use.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="technology"></category><category term="lifehack"></category><category term="print"></category></entry><entry><title>How to convert CBZ to PDF</title><link href="https://blog.ledoian.cz/cbz-to-pdf.html" rel="alternate"></link><published>2024-02-17T16:55:00+01:00</published><updated>2024-02-17T16:55:00+01:00</updated><author><name>LEdoian</name></author><id>tag:blog.ledoian.cz,2024-02-17:/cbz-to-pdf.html</id><summary type="html">&lt;ol class="arabic simple"&gt;
9 months ago
&lt;li&gt;Extract the archive (cbz is just a zip, cbr is a rar, …)&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Convert individual pictures to PDF using &lt;tt class="docutils literal"&gt;img2pdf&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;ul class="first last"&gt;
&lt;li&gt;Many other ways including &lt;tt class="docutils literal"&gt;convert&lt;/tt&gt; from ImageMagick tend to do weird stuff like breaking aspect ratios or adding margins&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;Merge files into the single PDF, e.g. using &lt;tt class="docutils literal"&gt;qpdf &lt;span class="pre"&gt;--empty&lt;/span&gt; &lt;span class="pre"&gt;--pages …&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;ol class="arabic simple"&gt;
&lt;li&gt;Extract the archive (cbz is just a zip, cbr is a rar, …)&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Convert individual pictures to PDF using &lt;tt class="docutils literal"&gt;img2pdf&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;ul class="first last"&gt;
&lt;li&gt;Many other ways including &lt;tt class="docutils literal"&gt;convert&lt;/tt&gt; from ImageMagick tend to do weird stuff like breaking aspect ratios or adding margins&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;Merge files into the single PDF, e.g. using &lt;tt class="docutils literal"&gt;qpdf &lt;span class="pre"&gt;--empty&lt;/span&gt; &lt;span class="pre"&gt;--pages&lt;/span&gt; *.pdf &lt;span class="pre"&gt;--&lt;/span&gt; output.pdf&lt;/tt&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://askubuntu.com/questions/207172/how-to-convert-cbr-to-pdf"&gt;https://askubuntu.com/questions/207172/how-to-convert-cbr-to-pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://superuser.com/questions/497293/how-to-convert-calibre-cbr-to-pdf-format-in-linux"&gt;https://superuser.com/questions/497293/how-to-convert-calibre-cbr-to-pdf-format-in-linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="why"&gt;
&lt;h2&gt;Why&lt;/h2&gt;
&lt;p&gt;My eBook reader (PocketBook Touch Lux) does not seem to be able to handle cbz.&lt;/p&gt;
&lt;/div&gt;
</content><category term="til"></category><category term="comics"></category><category term="software"></category></entry><entry><title>Do not forget about IPv6 DNS</title><link href="https://blog.ledoian.cz/forgetting-dns6.html" rel="alternate"></link><published>2024-01-24T03:20:00+01:00</published><updated>2024-01-24T03:20:00+01:00</updated><author><name>LEdoian</name></author><id>tag:blog.ledoian.cz,2024-01-24:/forgetting-dns6.html</id><summary type="html">&lt;p&gt;Do you think IPv6-only internet works OK? I am going to tell you that it does
10 months ago
not, but it is not immediately visible. TL;DR: The internet can be broken also
by forgetting to add AAAA records of the &lt;em&gt;nameservers&lt;/em&gt;. This creates IPv4
requirement for the resolving even when the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Do you think IPv6-only internet works OK? I am going to tell you that it does
not, but it is not immediately visible. TL;DR: The internet can be broken also
by forgetting to add AAAA records of the &lt;em&gt;nameservers&lt;/em&gt;. This creates IPv4
requirement for the resolving even when the target is reachable using IPv6.&lt;/p&gt;
&lt;div class="section" id="quick-recap"&gt;
&lt;h2&gt;Quick recap&lt;/h2&gt;
&lt;p&gt;Connecting to a website is easy, right? You type in the name, you get the front page.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;object data="https://blog.ledoian.cz/images/forgetting-dns6/image1.svg" style="width: 50%;" type="image/svg+xml"&gt;&lt;/object&gt;
&lt;p class="caption"&gt;This is a very naïve idea of connecting to a server.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;OK, it is a bit harder: the computer needs an IP address, so we need to use
this magic box called DNS. The flow looks something like this:&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;object data="https://blog.ledoian.cz/images/forgetting-dns6/image2.svg" style="width: 50%;" type="image/svg+xml"&gt;&lt;/object&gt;
&lt;p class="caption"&gt;Slightly better, now we at least know the machine-readable address.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;And for IPv6-only everything on the picture has to have IPv6 connectivity and AAAA DNS records.&lt;/p&gt;
&lt;div class="section" id="reaching-ipv4-land-from-ipv6-only"&gt;
&lt;h3&gt;Reaching IPv4 land from IPv6-only&lt;/h3&gt;
&lt;p&gt;There are few^H^H^Hmany sites that still only support IPv4. To reach them, we
need someone who can reach both the IPv4- and IPv6-land to go there on our
behalf a proxy. This proxy can be ad-hoc (I often use &lt;tt class="docutils literal"&gt;ssh &lt;span class="pre"&gt;-D&lt;/span&gt;&lt;/tt&gt;) or there
are well-known protocols like NAT64 with DNS64 to do that in a standard and
lightweight manner. &lt;a class="footnote-reference" href="#nat44" id="footnote-reference-1"&gt;[1]&lt;/a&gt;
In that case, the connection looks like this:&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;object data="https://blog.ledoian.cz/images/forgetting-dns6/image3.svg" style="width: 100%;" type="image/svg+xml"&gt;&lt;/object&gt;
&lt;p class="caption"&gt;And now we can reach the whole internet.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;You might already know that you need some workaround like this to reach GitHub.
What I think you might not know, you need similar workaround to reach the Wikipedia.&lt;/p&gt;
&lt;p&gt;Disclaimer: I like Wikipedia and this is not meant to shame them, just use as
an example. I am aware of several other sites suffering from the same problem,
including at least one IPv6 test. &lt;a class="footnote-reference" href="#test-aaaa" id="footnote-reference-2"&gt;[2]&lt;/a&gt; (It would be nice if they added
the missing piece in the puzzle, though.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="enter-dns"&gt;
&lt;h2&gt;Enter DNS&lt;/h2&gt;
&lt;p&gt;Our picture has one unexplored magic box: the DNS. As per the definition (which
I just made up and was not bothered to even fully formulate):&lt;/p&gt;
&lt;blockquote&gt;
yada yada distributed database of records attached to the strings domain
names. The records hold various information about the domain depending on the type.&lt;/blockquote&gt;
&lt;p&gt;There are three interesting types of records: A records give IPv4 addresses,
AAAA give IPv6 addresses and NS give names of servers who know about the
particular subtree of the database. And to actually resolve the final AAAA
record the (recursive) resolver starts at the &lt;em&gt;root zone&lt;/em&gt; and tries to find
the answer. &lt;a class="footnote-reference" href="#dns-simplification" id="footnote-reference-3"&gt;[3]&lt;/a&gt; The resolution algorithm can be visualised like this:&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;object data="https://blog.ledoian.cz/images/forgetting-dns6/image4.svg" style="width: 100%;" type="image/svg+xml"&gt;&lt;/object&gt;
&lt;p class="caption"&gt;Yeah, it's a mess.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There is one extra tricky bit: the NS records contain &lt;em&gt;names&lt;/em&gt;, not addresses,
so when resolving we need &lt;em&gt;two&lt;/em&gt; queries for each layer (very simplified):
first we ask for the final domain (&lt;tt class="docutils literal"&gt;blog.ledoian.cz&lt;/tt&gt;) and get a NS record
(when the server does not have the answer) and then we need to ask for the A or
AAAA record of the name from that record, so that we can connect to the server
mentioned in the NS record. (This allows a nameserver to be made redundant
and/or reside on other types of network.)&lt;/p&gt;
&lt;p&gt;You might start to see the issue. When the DNS was just a black box, we could
paint the whole picture green and call it a day. And from the regular user's
point of view, that is the case, just use some public DNS like 1.1.1.1, 8.8.8.8
or 9.9.9.9. Oh, right, I meant these easy-to-remember addresses:
2606:4700:4700::1111, 2001:4860:4860::8888 and 2620:fe::fe, respectively. The
point is, they will give you the answer because they are dual-stack, not IPv6-only.&lt;/p&gt;
&lt;p&gt;In a way, those servers (or other dual-stack resolvers) act like another proxy,
similar to the SSH, NAT64 and NAT44 ones mentioned earlier. This may not be
much of a problem for many people. But if you have any reason to use your own
recursive DNS server (privacy reasons, DNSSEC validation, ISP provides bad
service, you are the ISP, …) &lt;em&gt;inside&lt;/em&gt; an IPv6-only network, you &lt;em&gt;will&lt;/em&gt; have
issues. &lt;a class="footnote-reference" href="#dns-behind-nat64" id="footnote-reference-4"&gt;[4]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="example-wikipedia"&gt;
&lt;h2&gt;Example: Wikipedia&lt;/h2&gt;
&lt;p&gt;Let's now see this in action. You know Wikipedia, right? And you can reach
Wikipedia on IPv6, right? It has an AAAA record (don't mind the CNAME, that
means that the server is really called some other way):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ dig en.wikipedia.org AAAA
[…]
en.wikipedia.org. 18737 IN CNAME dyna.wikimedia.org.
dyna.wikimedia.org. 323 IN AAAA 2a02:ec80:600:ed1a::1
&lt;/pre&gt;
&lt;p&gt;And this record does work:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ ncat --ssl 2a02:ec80:600:ed1a::1 443 &amp;lt;&amp;lt;GO
GET /wiki/Main_Page HTTP/1.1
Host: en.wikipedia.org
GO
HTTP/1.1 200 OK
[…]
content-language: en
content-type: text/html; charset=UTF-8
content-length: 98078
&amp;lt;!DOCTYPE html&amp;gt;
[…]
&lt;/pre&gt;
&lt;p&gt;But we can dig deeper: let's see what servers we are really asking:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ dig en.wikipedia.org AAAA +trace
; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG … &amp;lt;&amp;lt;&amp;gt;&amp;gt; en.wikipedia.org AAAA +trace
;; global options: +cmd
. 78918 IN NS e.root-servers.net.
. 78918 IN NS f.root-servers.net.
. 78918 IN NS g.root-servers.net.
. 78918 IN NS h.root-servers.net.
. 78918 IN NS i.root-servers.net.
. 78918 IN NS j.root-servers.net.
. 78918 IN NS k.root-servers.net.
. 78918 IN NS l.root-servers.net.
. 78918 IN NS m.root-servers.net.
. 78918 IN NS a.root-servers.net.
. 78918 IN NS b.root-servers.net.
. 78918 IN NS c.root-servers.net.
. 78918 IN NS d.root-servers.net.
;; Received 525 bytes from … in 0 ms
org. 172800 IN NS c0.org.afilias-nst.info.
org. 172800 IN NS a2.org.afilias-nst.info.
org. 172800 IN NS a0.org.afilias-nst.info.
org. 172800 IN NS b0.org.afilias-nst.org.
org. 172800 IN NS b2.org.afilias-nst.org.
org. 172800 IN NS d0.org.afilias-nst.org.
;; Received 788 bytes from 202.12.27.33#53(m.root-servers.net) in 24 ms
wikipedia.org. 3600 IN NS ns0.wikimedia.org.
wikipedia.org. 3600 IN NS ns1.wikimedia.org.
wikipedia.org. 3600 IN NS ns2.wikimedia.org.
;; Received 658 bytes from 2001:500:48::1#53(b2.org.afilias-nst.org) in 20 ms
en.wikipedia.org. 86400 IN CNAME dyna.wikimedia.org.
;; Received 94 bytes from 208.80.153.231#53(ns1.wikimedia.org) in 132 ms
&lt;/pre&gt;
&lt;p&gt;Hey, there are IPv4 addresses in there! I know, this is cheating, the output is
from a dual-stack machine. But we can still simulate IPv6-only resolution
by adding &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-6&lt;/span&gt;&lt;/tt&gt; flag:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ dig en.wikipedia.org AAAA +trace -6
; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG … &amp;lt;&amp;lt;&amp;gt;&amp;gt; en.wikipedia.org AAAA +trace -6
;; global options: +cmd
. 78915 IN NS d.root-servers.net.
. 78915 IN NS e.root-servers.net.
. 78915 IN NS f.root-servers.net.
. 78915 IN NS g.root-servers.net.
. 78915 IN NS h.root-servers.net.
. 78915 IN NS i.root-servers.net.
. 78915 IN NS j.root-servers.net.
. 78915 IN NS k.root-servers.net.
. 78915 IN NS l.root-servers.net.
. 78915 IN NS m.root-servers.net.
. 78915 IN NS a.root-servers.net.
. 78915 IN NS b.root-servers.net.
. 78915 IN NS c.root-servers.net.
;; Received 525 bytes from … in 0 ms
org. 172800 IN NS d0.org.afilias-nst.org.
org. 172800 IN NS c0.org.afilias-nst.info.
org. 172800 IN NS b2.org.afilias-nst.org.
org. 172800 IN NS a0.org.afilias-nst.info.
org. 172800 IN NS b0.org.afilias-nst.org.
org. 172800 IN NS a2.org.afilias-nst.info.
;; Received 816 bytes from 2001:500:2::c#53(c.root-servers.net) in 8 ms
wikipedia.org. 3600 IN NS ns0.wikimedia.org.
wikipedia.org. 3600 IN NS ns1.wikimedia.org.
wikipedia.org. 3600 IN NS ns2.wikimedia.org.
couldn't get address for 'ns0.wikimedia.org': not found
couldn't get address for 'ns1.wikimedia.org': not found
couldn't get address for 'ns2.wikimedia.org': not found
dig: couldn't get address for 'ns0.wikimedia.org': no more
&lt;/pre&gt;
&lt;p&gt;Some of those IPv4 addresses were benign the respective servers are reachable
both using IPv4 and IPv6 address or there is an alternative server that is
reachable using IPv6. That is the case for the root nameserver in the second
case, we used C, which has IPv6 address (2001:500:2::c). In fact, the M server
also has IPv6 address, but dig chose the IPv4 one (it should not matter):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ dig m.root-servers.net AAAA
[…]
m.root-servers.net. 77991 IN AAAA 2001:dc3::35
&lt;/pre&gt;
&lt;p&gt;But the latter case is the bigger issue. For the domain &lt;tt class="docutils literal"&gt;wikipedia.org&lt;/tt&gt; there
are three nameservers:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ dig wikipedia.org NS -6
[…]
wikipedia.org. 86400 IN NS ns0.wikimedia.org.
wikipedia.org. 86400 IN NS ns1.wikimedia.org.
wikipedia.org. 86400 IN NS ns2.wikimedia.org.
&lt;/pre&gt;
&lt;p&gt;This is the last answer that we could get on an IPv6-only network, because none of
these three servers has AAAA record (some of them may have IPv6 address unknown to us):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ dig ns0.wikimedia.org AAAA
[…]
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 59468
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
&lt;/pre&gt;
&lt;p&gt;The NOERROR status says the domain name exists, but we got zero answers for
AAAA records. This is the case for all three nameservers. And here is the
ultimate picture of what is happening and what goes wrong.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;object data="https://blog.ledoian.cz/images/forgetting-dns6/image5.svg" style="width: 100%;" type="image/svg+xml"&gt;&lt;/object&gt;
&lt;p class="caption"&gt;The breakage in action&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Also note that the connection from the laptop to the DNS resolver may in fact
consist of a chain of several (caching, non-recursive) DNS resolvers, so that
the final DNS resolver can have dual-stack connectivity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-problems-with-this-state"&gt;
&lt;h2&gt;The problems with this state&lt;/h2&gt;
&lt;p&gt;So, what is the deal. We &lt;em&gt;just&lt;/em&gt; need to have a dual-stack DNS resolver
somewhere, and that's it, no? Well, yes but actually yes.&lt;/p&gt;
&lt;p&gt;There are two problems with this: First, this means that any new ISP needs to
have &lt;em&gt;at least some&lt;/em&gt; IPv4 address, even if they intend to just use IPv6
services. IPv4 addresses are scarce, &lt;a class="reference external" href="https://blog.apnic.net/2021/12/16/opinion-ipv4-address-markets/"&gt;expensive&lt;/a&gt; and small
blocks &lt;a class="reference external" href="https://labs.ripe.net/author/stephen_strowes/visibility-of-ipv4-and-ipv6-prefix-lengths-in-2019/"&gt;don't route well&lt;/a&gt;,
which is not great both from the
new ISP's and from overal routing's point of view. It also hinders IPv6
deployment and postpones IPv4 abandonment, needlessly.&lt;/p&gt;
&lt;p&gt;The second issue is that this is not very visible. We are building IPv6 world,
but deep inside it still relies on IPv4, which might lead to great surprise
when we start cutting off IPv4 internet. And it might lead to false sense of
having IPv6 deployed, which is not true to the whole extent.&lt;/p&gt;
&lt;p&gt;Insert &amp;quot;It was DNS&amp;quot; meme here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="solution"&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;The solution of this state is simple: get IPv6 connectivity to your
authoritative DNS server (or use another) and do not forget to add an AAAA
record for it in DNS. If the DNS server already has IPv6 it is probably just
a matter of adding a single line to the zone file (and a second one for the DNSSEC
signature), which should not be a big deal.&lt;/p&gt;
&lt;p&gt;Unfortunately, this needs to be done for the whole DNS chain.
Especially domain names at universities are infamous for very nested domains.
A domain name may look like
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;machine.department.location.faculty.university.some-common.suffix&lt;/span&gt;&lt;/tt&gt;. That
tree is deep and so is the resolution of this problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="amusing-bug-of-almost-good-deployment"&gt;
&lt;h2&gt;Amusing bug of almost good deployment&lt;/h2&gt;
&lt;p&gt;We have seen there may be multiple NS records for a domain and thus
multiple nameservers. This is good for redundancy. But this does not mean that
the servers will have the same records they are only supposed to give
equivalent answers (as far as I know).&lt;/p&gt;
&lt;p&gt;I have come across a silly misconfiguration: a domain which has several
nameservers, which serve a &lt;em&gt;slightly&lt;/em&gt; different set of NS records for its
subdomain. Specifically, the servers which were only reachable using IPv4 were
&lt;em&gt;exactly&lt;/em&gt; the servers that knew about one additional nameserver for the
subdomain, which, incidentally, was the &lt;em&gt;only&lt;/em&gt; one that was IPv6-capable.&lt;/p&gt;
&lt;p&gt;So, while all the correct records were present in DNS (somewhat/somewhere), this still
meant that IPv6-only resolution was doomed to fail because the IPv6 nameserver
chain was broken. (This has already been fixed.)&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="nat44" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;This is very much the same as when you try to reach the
IPv4-public-land from IPv4-private-land, that is, from a private range of IP
addresses. This is called either just NAT, or NAT44 to denote IPv4-to-IPv4 NAT.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="test-aaaa" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;There are several more tests that do not even have the AAAA
record, lol.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="dns-simplification" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;In my example, there is a single recursive DNS
resolver external to my machine in order not to complicate it too much.
The real deployment is often trickier.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="dns-behind-nat64" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-4"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I have not yet tried to run a recursive DNS in a network
with DNS64 and NAT64. Could be fun :-D My wild guess is that I would need
CLAT (i.e. the full 464XLAT deployment) to make that work, since the
resolver is connecting directly to IPv4 addresses and would need to learn to
use NAT64 to resolve them. (The CLAT could be built right into the resolver,
though).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="networking"></category><category term="ipv6-only"></category><category term="dns"></category></entry><entry><title>About this blog</title><link href="https://blog.ledoian.cz/about-blog.html" rel="alternate"></link><published>2024-01-10T16:47:00+01:00</published><updated>2024-01-10T16:47:00+01:00</updated><author><name>LEdoian</name></author><id>tag:blog.ledoian.cz,2024-01-10:/about-blog.html</id><summary type="html">&lt;p&gt;This is my blog and this article describes its setup and other details about my
11 months ago
intentions. The actual &lt;a class="reference internal" href="#the-setup"&gt;setup&lt;/a&gt; is probably the most
interesting tech-wise.&lt;/p&gt;
&lt;div class="section" id="what-is-this"&gt;
&lt;h2&gt;What is this?&lt;/h2&gt;
&lt;p&gt;My own space on the internet where I can post whatever and link others to it.
It might end up containing rants …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;This is my blog and this article describes its setup and other details about my
intentions. The actual &lt;a class="reference internal" href="#the-setup"&gt;setup&lt;/a&gt; is probably the most
interesting tech-wise.&lt;/p&gt;
&lt;div class="section" id="what-is-this"&gt;
&lt;h2&gt;What is this?&lt;/h2&gt;
&lt;p&gt;My own space on the internet where I can post whatever and link others to it.
It might end up containing rants, guides, ideas, or maybe nothing at all in the
end. Only the future will tell.&lt;/p&gt;
&lt;p&gt;The blog might even serve as my personal web page/introduction. Maybe. Maybe not…&lt;/p&gt;
&lt;p&gt;The main motivation is to have low-effort way to post random stuff. Which leads
to my requirements for this thing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="requirements"&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;p&gt;(The requirements are a bit too idealistic, so not all of them were satisfied…)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;low-effort, me-friendly, low-maintenance I don't want to have to learn too
many new technologies to use this. This includes the required technologies:
Python, Markdown/reStructuredText, Jinja2, git, …&lt;/li&gt;
&lt;li&gt;Technical and math content ~~friendly~~ compatible I expect that to appear
here.&lt;/li&gt;
&lt;li&gt;Static site for security, coolness factor and control. Also static on the
front-end, because I don't like JavaScript and/or running untrusted code on
my machine (even when in a sandbox). The SSG should likely be aimed at
creating blogs, not documentation. Also, self-contained, as in not depending
on third-party sites.&lt;/li&gt;
&lt;li&gt;No moving parts in the infrastructure (or as few as possible) if it works
on my machine, it should just get mirrored to the public site with as few
modifications as possible.&lt;/li&gt;
&lt;li&gt;Transparent I should be able to understand it, maybe others could also use
it as a resource or take inspiration. (At one point, this deployment itself
started being interesting, so if I can share the background as well as the
final webpage, it would be cool.)&lt;/li&gt;
&lt;li&gt;Followable I know you internet guys like to ~~stalk~~ follow people :-)&lt;/li&gt;
&lt;li&gt;Aligned with my values: minimalist, simple, extensible/hackable, FLOSS&lt;/li&gt;
&lt;li&gt;If the platform could distinguish translations and do strikethroughs, it would
be nice, but that is not a hard requirement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are several features of conventional blogs that I consider to be a
non-goals or even anti-goals. Mostly it is about interactivity I don't aim
for having any kind of comments here, or really anything that would require
JavaScript or complex HTML/CSS. And appearance goes past me as well, I instead
try to let the browser decide how to display this page more on that &lt;a class="reference internal" href="#design-considerations"&gt;below&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The workflow I wanted to achieve is something like: Write the content, git it,
build it (locally, no CI/CD), push it, done. Single write, single push, very
simple.&lt;/p&gt;
&lt;p&gt;And I managed to achieve something like that, via learning (too much?) about
git.&lt;/p&gt;
&lt;!-- TODO: fix the worktree bug already! --&gt;
&lt;/div&gt;
&lt;div class="section" id="the-setup"&gt;
&lt;h2&gt;The setup&lt;/h2&gt;
&lt;p&gt;Naturally for a sysadmin/netadmin, the setup consists of 7 ~~ISO/OSI~~ layers:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;strong&gt;Physical layer&lt;/strong&gt;: cheap Hetzner VPS. Not physical, but whatever.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network layer&lt;/strong&gt;: Nginx&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistence layer&lt;/strong&gt;: &lt;a class="reference external" href="https://gitea.ledoian.cz/LEdoian/blog"&gt;this git repo&lt;/a&gt;. I will elaborate below why can
you see this both rendered here and in the source form in Forgejo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content layer&lt;/strong&gt;: Markdown or reStructuredText files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business logic layer&lt;/strong&gt;: &lt;a class="reference external" href="https://getpelican.com"&gt;Pelican&lt;/a&gt;. It's rather
popular and written in Python, I didn't look further.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presentation layer&lt;/strong&gt;: I hacked my own theme, because I didn't like any in
the &lt;a class="reference external" href="https://github.com/getpelican/pelican-themes"&gt;pelican-themes repo&lt;/a&gt;.
I was a bit inspired by the layout of &lt;a class="reference external" href="https://eev.ee/blog"&gt;eevee's blog&lt;/a&gt;, but I wanted a dark theme. And as you can see, I
can't do quality frontend, so it ended up horrible… :-D&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stalking layer&lt;/strong&gt;: Pelican's built-in RSS and Atom feed generators. Not
linked from anywhere at the moment, but &lt;a class="reference external" href="https://gitea.ledoian.cz/LEdoian/blog/src/branch/blog/output/feeds"&gt;the repo will tell you&lt;/a&gt; what
hides under the &lt;tt class="docutils literal"&gt;/feeds/&lt;/tt&gt; path. Or you can utilize the repo (for personal
use the content's license is not decided at the moment)…&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Most of this is straightforward, the fancy part is my repo. The repo contains
both source and rendered content, so that I can point Nginx right at a checkout
and have Git solve both persistence and deployment without additional moving
parts.&lt;/p&gt;
&lt;p&gt;There are two tricks in the configuration of Git repositories: pushing to a
checked out repo is enabled by configuring &lt;tt class="docutils literal"&gt;receive.denyCurrentBranch =
updateInstead&lt;/tt&gt; in the target repository (which is just a normal repo, not a
bare one), and then I just told my source repositories &lt;a class="footnote-reference" href="#multiple-src" id="footnote-reference-1"&gt;[1]&lt;/a&gt; to use
two push targets for the remote (the first line &lt;em&gt;replaces&lt;/em&gt; the original push
address for some reason):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
git remote set-url --add --push blog_remote gitea&amp;#64;gitea.ledoian.cz:LEdoian/blog.git
git remote set-url --add --push blog_remote blog_user&amp;#64;blog.ledoian.cz:blog_dir
&lt;/pre&gt;
&lt;p&gt;The blog user is just a user with SSH access via authorized keys, no special
sauce there. Nginx is then pointed to serve &lt;tt class="docutils literal"&gt;~blog_user/blog_dir/output/&lt;/tt&gt; at
&lt;tt class="docutils literal"&gt;blog.ledoian.cz&lt;/tt&gt;. (The &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;git-remote(1)&lt;/span&gt;&lt;/tt&gt; manpage requires me to have both
repositories in sync, but as long as I configure all my repositories this way,
I should be safe, and I think I could get away with my blog checkout getting
behind accidentally.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="my-workflow-and-lots-of-drafts"&gt;
&lt;h2&gt;My workflow and lots of drafts&lt;/h2&gt;
&lt;p&gt;It's Git so it's only natural for me to use various branches and repositories
even for a dumb blog. There are in fact 4 stages an article may go through &lt;a class="footnote-reference" href="#skipping-stages" id="footnote-reference-2"&gt;[2]&lt;/a&gt;:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;A private draft: lives on a branch &lt;tt class="docutils literal"&gt;priv/something&lt;/tt&gt;, may contain private
infos (like when I would just copy-paste from terminal without redaction)
and this branch will probably never be merged to the main repo. Nothing
about these branches is guaranteed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;A public WIP draft: uses a branch called &lt;tt class="docutils literal"&gt;pub/something&lt;/tt&gt; which is pushed
to Forgejo (and in fact also to the blog itself, but that is just an
implementation detail). The draft is either does not build or is very
incomplete and I expect to add stuff in a way that could break the build, so
I put it on a separate branch. The branch will be probably merged to the
main branch (called &lt;tt class="docutils literal"&gt;blog&lt;/tt&gt;) when it is ready.&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;pub/…&lt;/tt&gt; branches can be created either manually or by cherry-picking
from the respective &lt;tt class="docutils literal"&gt;priv/…&lt;/tt&gt; branch, but that will likely not be
distinguishable. (I am too lazy to keep the references even in the commit
logs.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;When a draft is almost ready (or the content has simple syntax), it gets
placed on the &lt;tt class="docutils literal"&gt;blog&lt;/tt&gt; branch. The only thing that designates it as a draft
is &lt;tt class="docutils literal"&gt;status: draft&lt;/tt&gt; in the frontmatter, which means that the article will
get rendered and put somewhere on the public blog, but not reachable from
the title page (&amp;quot;unlisted&amp;quot;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Of course, eventually (and hopefully) the article gets published for
everyone to see. At that point, it is complete (or at least that is what I
thought when marking it as published). Possibly it might be updated in the
future, but no such update is anticipated at the moment of publishing. &lt;a class="footnote-reference" href="#update-this" id="footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I use Git to synchronize my private branches among machines, so there are
actually two &amp;quot;server-side&amp;quot; repositories (private and public one) and thus two
remotes. &lt;a class="footnote-reference" href="#private-branches-wish" id="footnote-reference-4"&gt;[4]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As for the actual workflow, for the main branch it usually consists of: writing
content, committing it, building the web, checking it locally, committing the
built blog and pushing it. Sometimes I do the commits together, but I always
separate the rendering/building commits from the content-creating ones, so that
I can handle those differently if needed (i.e. there is no point in
cherry-picking the built content, I can generate it). &lt;a class="footnote-reference" href="#git-purists" id="footnote-reference-5"&gt;[5]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For other branches I use some applicable subset of the steps above, probably.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="design-considerations"&gt;
&lt;h2&gt;Design considerations&lt;/h2&gt;
&lt;p&gt;The appearance of the blog is maybe not nice. That is for two reasons: I don't
have the right idea about how to make it much better and I want to have a
rather simple CSS for the web. The latter wish is because I tend to tweak
appearance of sites I visit using my own styles, so I would like you to be able
to do the same.&lt;/p&gt;
&lt;p&gt;And for the former reason, if you have any ideas / improvements (including user
styles), hit me at &lt;a class="reference external" href="mailto:blog&amp;#64;pokemon.ledoian.cz"&gt;blog&amp;#64;pokemon.ledoian.cz&lt;/a&gt; :-)&lt;/p&gt;
&lt;p&gt;My overall idea is a dark-by-default &lt;a class="footnote-reference" href="#light-theme" id="footnote-reference-6"&gt;[6]&lt;/a&gt; minimalist page with a single menu on the
right containig all the relevant links. The page should not dictate too much
but rather let the user agent decide the rendering (&lt;a class="reference external" href="https://html.spec.whatwg.org/multipage/rendering.html#rendering"&gt;it does anyway…&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I want my blog to render similarly in Gecko-, WebKit- and Blink-based browsers
(e.g. Firefox, Badwolf, Qutebrowser). Others should be usable.
Browser-/engine-specific styles are not welcome let's keep it simple. And no
JavaScript…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-in-progress-todos"&gt;
&lt;h2&gt;Work in progress / TODOs&lt;/h2&gt;
&lt;p&gt;This thing is at the moment very barebones, which is sufficient for the main
purpose. However, I would like to have some features here, one day, hopefully:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Dates in the article headers (and maybe more improvements of the theme, see
above)&lt;/li&gt;
&lt;li&gt;Stable category and tag names and a page with a description of them. As of
now I haven't really invented a system of sorting my content, which leads to
a mess… Please don't rely on categories having any particular name / URL for
now.&lt;/li&gt;
&lt;li&gt;Link the RSS feeds from somewhere&lt;/li&gt;
&lt;li&gt;Personal info with links to my other profiles&lt;/li&gt;
&lt;li&gt;Some linking to the Fediverse and using it for comments (since there will be
no comments here)&lt;/li&gt;
&lt;li&gt;Sensible translations, maybe (if I/someone ever get to write the same content
again in a different language…)&lt;/li&gt;
&lt;li&gt;Improve the list of talks I've given (create some kind of sensible table maybe?)&lt;/li&gt;
&lt;li&gt;Decide on a licence for the content (If you want to utilize something here
before I do that, please ask me, I think we can find a way :-))&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are so upset with this blog (or maybe bored) that you want to improve
it, send me patches / ideas. I don't expect anyone to do that, though :-D (And
I do not promise you that I will use the patch, even if it matches all my
opinions above. I also have some gut feelings about what I like…)&lt;/p&gt;
&lt;p&gt;Also, tell me if you hate something else about my page. I want to at least know
whom I upset :-D (but I will probably also think about your gripes and whether
I can and should try to avoid them…)&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="multiple-src" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I also use multiple machines on which I can write stuff.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="skipping-stages" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;p class="first"&gt;I am lazy and chaotic (good), so the stages are optional
and non-linear, and sometimes involve paper. This article is a prime
example: parts of it were on two different private branches, but at the end
I wrote it from scratch directly on the main branch. And the requirements
were written on a paper originally.&lt;/p&gt;
&lt;p class="last"&gt;Nevertheless, the general idea still holds and may inspire others, so it
makes sense to keep this part in the article. (Also, this footnote might not
make sense before reading the definition of the stages, but I didn't find a
better place to put it…)&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="update-this" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Well, given this article contains some future plans, I
actually anticipate update of this one, but maybe not in the near future. So
the outline is not really correct, but I make the rules :-) (There
were some build breaks on the main branch, too :-D)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="private-branches-wish" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-4"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I would love if my Forgejo could have &amp;quot;private
branches&amp;quot;, but I understand that the overhead for doing this is not nice,
since it would need to be able to decide for any object, whether it is
public or not (you can do &lt;tt class="docutils literal"&gt;git fetch &amp;lt;remote&amp;gt; &lt;span class="pre"&gt;&amp;lt;object-hash&amp;gt;&lt;/span&gt;&lt;/tt&gt;) and somehow
keep track even with rebases, merges, force-pushes, many branches, … Having
a separate private repository is not a big problem in comparison.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="git-purists" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-5"&gt;[5]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Git purists might want to tell me that committing build
artifacts is not good practice. I know and I explicitly don't care in case
of this repo, because here I prioritise my own comfort of being able to
check everything locally and then be reasonably sure the deployed version
will also work, all this with only a single push somewhere. Of course, one
could argue that with that there is no reason to create two commits, but it
does not really bother me to run something like &lt;tt class="docutils literal"&gt;git commit &lt;span class="pre"&gt;-m&amp;quot;render&amp;quot;&lt;/span&gt;
output/&lt;/tt&gt; when I am sure it works, and this keeps readable diffs separate
from the non-readable ones (i.e. the changes in generated HTML).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="light-theme" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-6"&gt;[6]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Having the page be dark-by-default is my preference, but I
respect that others may prefer light sites. However, I have not yet
determined what colors should be used (probably still cyan / blue / maybe
purple-ish, but I don't know what shade) nor understood how to use
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;&amp;#64;media(prefers-color-scheme)&lt;/span&gt;&lt;/tt&gt; in a maintainable and simple way (in the
context of my theme). So naturally, this is postponed to the future…&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="technology"></category><category term="meta"></category><category term="infrastructure"></category></entry><entry><title>Smršť 2023 (CZ)</title><link href="https://blog.ledoian.cz/smrst2023-cs.html" rel="alternate"></link><published>2023-12-02T18:00:00+01:00</published><updated>2023-12-02T18:00:00+01:00</updated><author><name>LEdoian</name></author><id>tag:blog.ledoian.cz,2023-12-02:/smrst2023-cs.html</id><content type="html">&lt;p&gt;Na &lt;a class="reference external" href="https://ksp.mff.cuni.cz/akce/smrst/2023/"&gt;Smršti&lt;/a&gt; jsem přednášel o distribuci SW a o technicky zajímavých železničních neštěstích.&lt;/p&gt;
1 year ago
&lt;div class="section" id="materialy"&gt;
&lt;h2&gt;Materiály&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://blog.ledoian.cz/static/talks/smrst2023/talk.pdf"&gt;Slidy ke přednášce o neštěstích&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Pozn.: Možná se ještě změní adresa téhle stránky, protože je to celé WIP…)&lt;/p&gt;
&lt;/div&gt;
</content><category term="talks"></category><category term="smršť"></category><category term="trains"></category><category term="software-engineering"></category></entry></feed>