<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
  
  <title>Notiz-Blog</title>
  <subtitle>Persönliche Notizen von Oliver Rademaker: Rezepte, DevOps-Snippets und Technik-Anleitungen.</subtitle>
  <link href="https://blog.kyro.space/feed.xml" rel="self" />
  <link href="https://blog.kyro.space/" />
  <updated>2026-03-15T00:00:00Z</updated>
  <id>https://blog.kyro.space/</id>
  <author>
    <name>Oliver Rademaker</name>
  </author>
  <entry>
    <title>Glutenfreier Pizzateig</title>
    <link href="https://blog.kyro.space/notizen/rezept-gf-pizza-teig/" />
    <updated>2026-03-15T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-gf-pizza-teig/</id>
    <content type="html">&lt;p&gt;Rezept ist für 2 Pizzen:&lt;/p&gt;
&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Glutenfreie Mehlmischung: 220g&lt;/li&gt;
&lt;li&gt;Hirsemehl: 110g&lt;/li&gt;
&lt;li&gt;Flohsamenschalen: 15g&lt;/li&gt;
&lt;li&gt;Zucker: 15g&lt;/li&gt;
&lt;li&gt;frische Hefe: 15g&lt;/li&gt;
&lt;li&gt;kaltes Wasser: 425g&lt;/li&gt;
&lt;li&gt;Olivenöl: 15g&lt;/li&gt;
&lt;li&gt;Apfelessig: 15g&lt;/li&gt;
&lt;li&gt;Salz: 12g&lt;/li&gt;
&lt;li&gt;grobes Reismehl oder Maisgrieß&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zubereitung&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Glutenfreies-, Hirse-Mehl und Salz mischen =&amp;gt; Mehlmischung.&lt;/li&gt;
&lt;li&gt;Flohsamenschalen, Zucker und Hefe in Wasser auflösen, gut verrühren und 10 Minuten quellen lassen.&lt;/li&gt;
&lt;li&gt;Alle Zutaten zur Mehlmischung hinzugeben und für ca. 4-5 Minuten gut verrühren&lt;/li&gt;
&lt;li&gt;Teig in ein gefettetes und fest verschließbares Gefäß geben und geschlossen für ca. 15 Minuten gehen lassen.&lt;/li&gt;
&lt;li&gt;Teig in zwei Teile portionieren. Jede Portion auf einem Bett aus Reismehl oder Maisgrieß betten. Den Teig ebenfalls mit Reismehl oder Maisgrieß bestreuen und von innen nach außen eine Pizza formen&lt;/li&gt;
&lt;li&gt;Pizza mit einem Tuch abgedeckt für ca. 1h bei Raumtemperatur gehen lassen.&lt;/li&gt;
&lt;li&gt;Pizza belegen und so heiß wie möglich backen.&lt;/li&gt;
&lt;/ol&gt;
</content>
  </entry>
  <entry>
    <title>Nachos con salsa</title>
    <link href="https://blog.kyro.space/notizen/rezept-salsa-sauce/" />
    <updated>2025-08-31T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-salsa-sauce/</id>
    <content type="html">&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tomaten: 5&lt;/li&gt;
&lt;li&gt;Jalapeños Chili: 3&lt;/li&gt;
&lt;li&gt;grüne Paprika: 1&lt;/li&gt;
&lt;li&gt;gelbe Paprika: 1&lt;/li&gt;
&lt;li&gt;rote Paprika: 1&lt;/li&gt;
&lt;li&gt;Koriander: 1 Bund&lt;/li&gt;
&lt;li&gt;Zwiebel: 1&lt;/li&gt;
&lt;li&gt;Chipotle: 2&lt;/li&gt;
&lt;li&gt;Knoblauch: 2 Zehen&lt;/li&gt;
&lt;li&gt;Dosen Tomaten gewürfelt: 1&lt;/li&gt;
&lt;li&gt;Limette: 1&lt;/li&gt;
&lt;li&gt;Zitrone: 1&lt;/li&gt;
&lt;li&gt;Kreuzkümmel: 1 TL&lt;/li&gt;
&lt;li&gt;Olivenöl&lt;/li&gt;
&lt;li&gt;Salz&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zubereitung&lt;/h2&gt;
</content>
  </entry>
  <entry>
    <title>Hummus</title>
    <link href="https://blog.kyro.space/notizen/rezept-hummus/" />
    <updated>2024-04-24T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-hummus/</id>
    <content type="html">&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Kichererbsen: 1 Dose (265g)&lt;/li&gt;
&lt;li&gt;Knoblauch: 1 große Zehe&lt;/li&gt;
&lt;li&gt;Zitronensaft: kleine halbe&lt;/li&gt;
&lt;li&gt;Tahin: 6 TL&lt;/li&gt;
&lt;li&gt;Olivenöl: 3 EL&lt;/li&gt;
&lt;li&gt;Kreuzkümmel: 0.5 TL&lt;/li&gt;
&lt;li&gt;Salz: 3 TL&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zubereitung&lt;/h2&gt;
&lt;p&gt;Topf mit reichlich Wasser und Kichererbsen füllen. Ca. 15 min kochen. Dann die Schalen/Häute der Kichererbsen mit einer Schaumkelle abschöpfen.&lt;/p&gt;
&lt;p&gt;Alle Zutaten mit einem Mixer oder Pürierstab zerkleinern bis keine Stücke mehr vorhanden sind. Kaltes Wasser kann in sehr kleinen Mengen beigegeben werden, um die Cremigkeit zu erhöhen.&lt;/p&gt;
&lt;p&gt;Hummus in saubere und mit heißem Wasser ausgespülte Gläser abfüllen und auf dem Kopf stehen lassen bis es kalt geworden ist. Im Kühlschrank ist er so ein paar Tage haltbar.&lt;/p&gt;
&lt;p&gt;Guten Appetit.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Gefüllte Spitzpaprika mit roten Linsen</title>
    <link href="https://blog.kyro.space/notizen/rezept-spitzpaprika-mit-linsen/" />
    <updated>2024-03-18T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-spitzpaprika-mit-linsen/</id>
    <content type="html">&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Spitzpaprika: 2&lt;/li&gt;
&lt;li&gt;rote Linsen: 100 g&lt;/li&gt;
&lt;li&gt;Möhre: 1&lt;/li&gt;
&lt;li&gt;Zwiebel: 1 halbe mittelgroß&lt;/li&gt;
&lt;li&gt;passierte Tomaten: 150 ml&lt;/li&gt;
&lt;li&gt;Tomatenmark: 1 Teelöffel&lt;/li&gt;
&lt;li&gt;Schafskäse: 1 Packung&lt;/li&gt;
&lt;li&gt;Wasser: 500 ml&lt;/li&gt;
&lt;li&gt;Olivenöl: 1 Teelöffel&lt;/li&gt;
&lt;li&gt;Knoblauch: 1 Zehe&lt;/li&gt;
&lt;li&gt;getrockneter Rosmarin: 1 Teelöffel&lt;/li&gt;
&lt;li&gt;Balsamico: 1 TL&lt;/li&gt;
&lt;li&gt;Salz&lt;/li&gt;
&lt;li&gt;Pfeffer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zubereitung&lt;/h2&gt;
&lt;p&gt;In einem kleinen Topf das Wasser zum Kochen bringen. Linsen dazugeben, Hitze reduzieren und kochen lassen, bis kein Wasser mehr im Topf ist (etwa 10 Minuten).&lt;/p&gt;
&lt;p&gt;Inzwischen Möhre waschen, Zwiebel schälen und beide klein würfeln. Öl in einer Pfanne bei mittlerer Stufe erhitzen, Möhre, Zwiebel und Rosmarin in die Pfanne geben und etwa 5 Minuten leicht anbraten.&lt;/p&gt;
&lt;p&gt;Knoblauch schälen und hacken, in die Pfanne geben. Passierte Tomaten und Tomatenmark unter die Möhren und Zwiebel mischen, die Linsen dazugeben und weitere 5 Minuten bei kleiner Hitze köcheln lassen. Mit Balsamico, Salz und Pfeffer abschmecken.&lt;/p&gt;
&lt;p&gt;Paprikaschoten waschen, längs halbieren und entkernen. Schafskäse in kleine Würfel schneiden. Die Tomatensoße in die Paprikaschoten füllen und Schafskäse darüber verteilen. Etwa 15 Minuten auf dem Grill oder im Backofen garen.&lt;/p&gt;
&lt;p&gt;Guten Appetit.&lt;/p&gt;
&lt;p&gt;Quellen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ndr.de/ratgeber/kochen/rezepte/Gefuellte-Spitzpaprika-mit-Linsen,rezept2782.html&quot;&gt;Original Rezept&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Rhabarberkuchen Rezept</title>
    <link href="https://blog.kyro.space/notizen/rezept-rhabarberkuchen/" />
    <updated>2022-07-02T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-rhabarberkuchen/</id>
    <content type="html">&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Rhabarber: 1kg&lt;/li&gt;
&lt;li&gt;Eier: 5 Stück&lt;/li&gt;
&lt;li&gt;Zucker: 300g&lt;/li&gt;
&lt;li&gt;Mehl: 300g&lt;/li&gt;
&lt;li&gt;Butter: 180g, zerlassen&lt;/li&gt;
&lt;li&gt;Backpulver: 1 Teelöffel&lt;/li&gt;
&lt;li&gt;Salz: 1 Prise&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zubereitung&lt;/h2&gt;
&lt;p&gt;Den Ofen auf 180 °C (Ober-/Unterhitze) vorheizen. Ein Backblech mit Backpapier auskleiden.&lt;/p&gt;
&lt;p&gt;Den Rhabarber putzen und in Stücke schneiden.
Die Eier mit Zucker und Salz schaumig rühren. Das Mehl mit dem Backpulver zu den Eiern sieben und unterrühren. Die geschmolzene Butter unterrühren und den Teig auf das Backblech gießen. Rhabarberstücke gleichmäßig auf dem Teig verteilen. 35 Minuten backen.&lt;/p&gt;
&lt;p&gt;Vor dem Servieren mit Puderzucker bestäuben. Wenn keine Rhabarbersaison ist, tauscht meine Oma den Rhabarber gegen Kirschen. Das schmeckt auch sehr lecker.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;Original-Rezept: &lt;a href=&quot;https://www.chefkoch.de/rezepte/2169641348166403/Omas-Rhabarberkuchen.html&quot;&gt;Chefkoch.de&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
  </entry>
  <entry>
    <title>Veganes Bananenbrot</title>
    <link href="https://blog.kyro.space/notizen/rezept-veganes-bananenbrot/" />
    <updated>2022-04-16T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-veganes-bananenbrot/</id>
    <content type="html">&lt;p&gt;Mein Rezept für veganes Bananenbrot für Allergiker ohne echtes Ei.&lt;/p&gt;
&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Bananen: 5 sehr reife Bananen&lt;/li&gt;
&lt;li&gt;Mehl: 450g Dinkel Type 630&lt;/li&gt;
&lt;li&gt;Zucker: 150g, (Roh-) Rohrzucker&lt;/li&gt;
&lt;li&gt;Vanillezucker: 1,5 Päckchen&lt;/li&gt;
&lt;li&gt;Backpulver: 1 Päckchen&lt;/li&gt;
&lt;li&gt;Pflanzenöl: 6 Esslöffel&lt;/li&gt;
&lt;li&gt;Ersatz- oder Vollei: 1,5&lt;/li&gt;
&lt;li&gt;Salz: 1 Prise&lt;/li&gt;
&lt;li&gt;Sprudelwasser: 1 Schuss&lt;/li&gt;
&lt;li&gt;Margarine: zum Einfetten der Form&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zubereitung&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Bananen, Zucker, Vanillezucker, Öl, Ei und Salz mit einem Handrührgerät zu einer glatten Masse verrühren&lt;/li&gt;
&lt;li&gt;Mehl und Backpulver sieben und langsam unter ständigem Rühren hinzugeben&lt;/li&gt;
&lt;li&gt;Am Ende noch das Sprudelwasser hinzugeben und nur sehr kurz unterrühren&lt;/li&gt;
&lt;li&gt;Die Masse in die mit Margarine gefettete Kastenform geben&lt;/li&gt;
&lt;li&gt;Das Bananenbrot im vorgeheizten Backofen bei 180°C Ober-/Unterhitze ca. 45 Minuten backen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Guten Appetit.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Typescript Setup (NodeJS)</title>
    <link href="https://blog.kyro.space/notizen/typescript-setup/" />
    <updated>2021-12-21T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/typescript-setup/</id>
    <content type="html">&lt;ol&gt;
&lt;li&gt;Install Nodejs (npm)&lt;/li&gt;
&lt;li&gt;Init Project&lt;pre&gt;&lt;code&gt;npm init
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Install Typescript and TSlint into the project&lt;pre&gt;&lt;code&gt;npm install --save-dev --save-exact typescript tslint
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Init &lt;code&gt;tsconfig.json&lt;/code&gt; and configure&lt;pre&gt;&lt;code&gt;npx tsc --init
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{
	&amp;quot;compilerOptions&amp;quot;: {    		
        &amp;quot;target&amp;quot;: &amp;quot;ES6&amp;quot;,
        &amp;quot;lib&amp;quot;: [&amp;quot;ES6&amp;quot;],
        &amp;quot;experimentalDecorators&amp;quot;: true,
        &amp;quot;emitDecoratorMetadata&amp;quot;: true,
        &amp;quot;module&amp;quot;: &amp;quot;commonjs&amp;quot;,
        &amp;quot;rootDir&amp;quot;: &amp;quot;src&amp;quot;,
        &amp;quot;baseUrl&amp;quot;: &amp;quot;./&amp;quot;,
            &amp;quot;paths&amp;quot;: {
                &amp;quot;*&amp;quot;: [
                    &amp;quot;node_modules/*&amp;quot;,
                    &amp;quot;src/_types/*&amp;quot;
                ]
            },
        },
        &amp;quot;resolveJsonModule&amp;quot;: true,
        &amp;quot;sourceMap&amp;quot;: true,
        &amp;quot;outDir&amp;quot;: &amp;quot;dist&amp;quot;,
        &amp;quot;esModuleInterop&amp;quot;: true,
        &amp;quot;forceConsistentCasingInFileNames&amp;quot;: true,
        &amp;quot;strict&amp;quot;: true,
        &amp;quot;skipLibCheck&amp;quot;: true,
        &amp;quot;include&amp;quot;: [
            &amp;quot;src/**/*.ts&amp;quot;
        ],
        &amp;quot;exclude&amp;quot;: [
            &amp;quot;node_modules&amp;quot;,
            &amp;quot;**/*.spec.ts&amp;quot;
        ]
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Init &lt;code&gt;tslint.json&lt;/code&gt; and configure&lt;pre&gt;&lt;code&gt;npx tslint --init
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{
	&amp;quot;defaultSeverity&amp;quot;: &amp;quot;error&amp;quot;,
	&amp;quot;extends&amp;quot;: [&amp;quot;tslint:recommended&amp;quot;],
	&amp;quot;jsRules&amp;quot;: {},
	&amp;quot;rules&amp;quot;: {
		&amp;quot;no-console&amp;quot;: false
	},
	&amp;quot;rulesDirectory&amp;quot;: [],
    &amp;quot;include&amp;quot;: [&amp;quot;src/**/*&amp;quot;],
    &amp;quot;exclude&amp;quot;: [&amp;quot;node_modules&amp;quot;, &amp;quot;**/*.spec.ts&amp;quot;]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;package.json&lt;/code&gt;&lt;pre&gt;&lt;code&gt;{
    &amp;quot;scripts&amp;quot;: {
        &amp;quot;start&amp;quot;: &amp;quot;tsc &amp;amp;&amp;amp; node dist/app.js&amp;quot;
     },
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content>
  </entry>
  <entry>
    <title>Brötchen Rezept 2</title>
    <link href="https://blog.kyro.space/notizen/rezept-broetchen-2/" />
    <updated>2021-09-20T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-broetchen-2/</id>
    <content type="html">&lt;p&gt;Ein weiteres Rezept für 9 Brötchen à 90g&lt;/p&gt;
&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Mehl: 500g Dinkel Type 630&lt;/li&gt;
&lt;li&gt;Wasser: 300g (ca. 250ml)&lt;/li&gt;
&lt;li&gt;Olivenöl: 20g&lt;/li&gt;
&lt;li&gt;Hefe: 3g, frisch&lt;/li&gt;
&lt;li&gt;Salz: 10g&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zubereitung&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Alle Zutaten vermengen und ca. 10-15 Minuten kneten bis der Teig den Zugtest besteht.&lt;/li&gt;
&lt;li&gt;Den Teig abgedeckt an einem warmen Ort (ca. 25 °C) ca. 1 Stunde gehen lassen.&lt;/li&gt;
&lt;li&gt;Anschließend den Teig abgedeckt für weitere ca. 8-12 Stunden (über Nacht) im Kühlschrank gehen lassen.&lt;/li&gt;
&lt;li&gt;Die Brötchen zu 90g portionieren, falten und rollen.&lt;/li&gt;
&lt;li&gt;Die gerollten Brötchen mit einem sauberen Küchentuch abgedeckt für 30 - 60 Minuten gehen lassen. Wenn sie den Drucktest bestehen sind sie &amp;quot;reif&amp;quot;.&lt;/li&gt;
&lt;li&gt;Nun werden die nochmals aufgegangenen Teiglinge bei ca. 250 °C für 20 Minuten gebacken, bis diese goldbraun sind.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Für noch knusprigere Brötchen&lt;/strong&gt;: Für die ersten 10 Backminuten eine große feuerfeste Schale auf den Backofenboden stellen (z.B. hohes Kuchenblech), mit ca. 1,5l kochendem Wasser befüllen. &lt;strong&gt;ACHTUNG: Das Wasser wird weiter kochen und es entsteht heißer Wasserdampf. Beim Öffnen des Backofens sehr vorsichtig sein, da Verbrühungsgefahr besteht.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Guten Appetit.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>HLS and DASH Webdav Streaming Server</title>
    <link href="https://blog.kyro.space/notizen/webdav-streaming-server/" />
    <updated>2021-04-24T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/webdav-streaming-server/</id>
    <content type="html">&lt;h2&gt;Quellen und Nützliches&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ffmpeg.org/&quot; target=&quot;_blank&quot;&gt;FFmpeg.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.martin-riedl.de/2020/04/17/using-ffmpeg-as-a-hls-streaming-server-overview/&quot; target=&quot;_blank&quot;&gt;Artikel zu FFmpeg als HLS-Server auf martin.riedl.de&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Docker&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM ubuntu:20.04 as base

ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Europe/Berlin

RUN apt-get update -y &amp;amp;&amp;amp; apt-get upgrade -y &amp;amp;&amp;amp; &#92;
    apt-get install -y &#92;
        nginx &#92;
        nginx-extras &#92;
        libnginx-mod-rtmp &#92;
        libnginx-mod-http-geoip2 &#92;
        libnginx-mod-http-geoip &#92;
        libnginx-mod-http-dav-ext &#92;
        libnginx-mod-http-dav-ext

RUN mkdir -p /var/log/nginx &amp;amp;&amp;amp; &#92;
    ln -sf /dev/stdout /var/log/nginx/access.log &amp;amp;&amp;amp; &#92;
    ln -sf /dev/stderr /var/log/nginx/error.log

CMD [&amp;quot;nginx&amp;quot;, &amp;quot;-g&amp;quot;, &amp;quot;daemon off;&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Docker Stack Config&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &amp;quot;3.8&amp;quot;

networks:
  cdn:
    driver: overlay
    attachable: true
  streaming_video:
    external: true

services:
  origin:
    image: localhost:5000/nginx-webdav:latest
    volumes:
      - &amp;quot;/opt/streaming-app/cdn/origin/nginx.conf:/etc/nginx/nginx.conf:ro&amp;quot;
      - &amp;quot;/opt/streaming-app/cdn/origin/conf.d:/etc/nginx/conf.d:ro&amp;quot;
      - &amp;quot;/mnt/gluster/vol/origin:/mnt/streaming-media:rw&amp;quot;
      - &amp;quot;/opt/streaming-app/cdn/cache/data:/usr/share/geoip:ro&amp;quot;
    networks:
      - cdn
      - streaming_video
    ports:
      - target: 8050
        published: 8050
        protocol: tcp
        mode: ingress
      - target: 8080
        published: 8080
        protocol: tcp
        mode: host
      # - target: 8090
      #   published: 8090
      #   protocol: tcp
      #   mode: ingress
    deploy:
      mode: replicated
      replicas: 3
      update_config:
        parallelism: 1
        delay: 1s
        order: stop-first
      placement:
        max_replicas_per_node: 1
        constraints: 
          - node.labels.origin == true
    logging:
      driver: grafana/loki-docker-driver
      options:
        loki-url: http://172.17.0.1:3100/loki/api/v1/push

  cache:
    image: localhost:5000/nginx-webdav:latest
    volumes:
      - &amp;quot;/opt/streaming-app/cdn/cache/nginx.conf:/etc/nginx/nginx.conf:ro&amp;quot;
      - &amp;quot;/opt/streaming-app/cdn/cache/conf.d:/etc/nginx/conf.d:ro&amp;quot;
      - &amp;quot;/opt/streaming-app/cdn/cache/data:/usr/share/geoip:ro&amp;quot;
      - &amp;quot;/opt/streaming-app/cdn/cache/ssl:/usr/share/ssl:ro&amp;quot;
    networks:
      - cdn
    ports:
      - target: 80
        published: 80
        protocol: tcp
        mode: host
      - target: 443
        published: 443
        protocol: tcp
        mode: host
      # - target: 8090
      #   published: 8090
      #   protocol: tcp
      #   mode: ingress
    deploy:
      mode: replicated
      replicas: 1
      update_config:
        parallelism: 1
        delay: 3s
        order: stop-first
      placement:
        max_replicas_per_node: 1
        constraints: 
          - node.labels.cache == true
    logging:
      driver: grafana/loki-docker-driver
      options:
        loki-url: http://172.17.0.1:3100/loki/api/v1/push
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Origin-Server Konfiguration&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;nginx.conf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user  root;
worker_processes  1;

pid        /var/run/nginx.pid;

load_module &amp;quot;modules/ngx_http_geoip2_module.so&amp;quot;;
load_module &amp;quot;modules/ngx_http_dav_ext_module.so&amp;quot;;

events {
    worker_connections  1024;
}


http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout  65;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # geoip
    geoip2 /usr/share/geoip/GeoLite2-Country.mmdb {
        $geoip2_data_country_code source=$remote_addr country iso_code;
        $geoip2_data_country_name source=$remote_addr country names en;
    }

    geoip2 /usr/share/geoip/GeoLite2-City.mmdb {
        $geoip2_data_city_name city names en;
    } 

    # logs
    log_format  geo  &#39;$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; &#39;
                     &#39;$status $body_bytes_sent &amp;quot;$http_referer&amp;quot; &#39;
                     &#39;&amp;quot;$http_user_agent&amp;quot; &amp;quot;$http_x_forwarded_for&amp;quot; &#39;
                     &#39;$geoip2_data_country_code $geoip2_data_country_name $geoip2_data_city_name&#39;;

    access_log /var/log/nginx/access.log geo;
    error_log /var/log/nginx/error.log warn;

    # gzip
    gzip on;
    gzip_vary on;

    # incude sub confs
    include /etc/nginx/conf.d/*.conf;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;conf.d/webdav.conf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    # LISTEN
    listen 8050;

    # WEB ROOT
    root /mnt/streaming-media;

    # do not show files
    autoindex on;

    location / {

        # WEBDAV
        dav_methods     PUT DELETE MKCOL COPY MOVE;
        dav_ext_methods PROPFIND OPTIONS;
        dav_access      user:rw group:rw all:rw;
        create_full_put_path on;	# allow to create sub directorys
        client_max_body_size 100M;

        # Limit Auth basic to Upload Files
        # limit_except GET PROPFIND OPTIONS HEAD {
        #     auth_basic &amp;quot;Access Restricted&amp;quot;;
        #     auth_basic_user_file /etc/nginx/.webdav-origin.htpasswd;
        # }

        # Auto serve masterplaylists
        index master.mpd master.m3u8;

        # Disable cache
        add_header &#39;Cache-Control&#39; &#39;no-cache&#39;;

        # CORS setup
        add_header &amp;quot;Access-Control-Allow-Origin&amp;quot; * always;
        add_header &#39;Access-Control-Expose-Headers&#39; &#39;Content-Length&#39;;
        add_header &amp;quot;Access-Control-Allow-Methods&amp;quot; &amp;quot;GET, HEAD, POST, PUT, OPTIONS, MOVE, DELETE, COPY, LOCK, UNLOCK, PROPFIND&amp;quot; always;
        add_header &amp;quot;Access-Control-Allow-Headers&amp;quot; &amp;quot;Authorization, Origin, X-Requested-With, Content-Type, Accept, DNT, X-CustomHeader, Keep-Alive,User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Range, Range, Depth&amp;quot; always;


        # add some MIME types
        types {
            application/dash+xml mpd;
            application/vnd.apple.mpegurl m3u8;
        }

        # # allow CORS preflight requests
        # if ($request_method = &#39;OPTIONS&#39;) {
        #     add_header &#39;Access-Control-Allow-Origin&#39; &#39;*&#39;;
        #     add_header &#39;Access-Control-Allow-Methods&#39; &#39;GET, POST, OPTIONS&#39;;
        #     add_header &#39;Access-Control-Allow-Headers&#39; &#39;DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range&#39;;
        #     add_header &#39;Access-Control-Max-Age&#39; 1728000;
        #     add_header &#39;Content-Type&#39; &#39;text/plain; charset=utf-8&#39;;
        #     add_header &#39;Content-Length&#39; 0;
        #     return 204;
        # }

        # if ($request_method = &#39;POST&#39;) {
        #     add_header &#39;Access-Control-Allow-Origin&#39; &#39;*&#39;;
        #     add_header &#39;Access-Control-Allow-Methods&#39; &#39;GET, POST, OPTIONS&#39;;
        #     add_header &#39;Access-Control-Allow-Headers&#39; &#39;DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range&#39;;
        #     add_header &#39;Access-Control-Expose-Headers&#39; &#39;Content-Length,Content-Range&#39;;
        # }

        # if ($request_method = &#39;GET&#39;) {
        #     add_header &#39;Access-Control-Allow-Origin&#39; &#39;*&#39;;
        #     add_header &#39;Access-Control-Allow-Methods&#39; &#39;GET, POST, OPTIONS&#39;;
        #     add_header &#39;Access-Control-Allow-Headers&#39; &#39;DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range&#39;;
        #     add_header &#39;Access-Control-Expose-Headers&#39; &#39;Content-Length,Content-Range&#39;;
        # }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;conf.d/origin.conf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
	listen 8080;
	
	# Serve HLS fragments
	location / {
		types {
			application/vnd.apple.mpegurl m3u8;
			video/mp2t ts;
		}

		gzip_types application/vnd.apple.mpegurl;
		
		root /mnt/streaming-media;

		# Disable cache
		add_header Cache-Control no-cache;
		
		# CORS setup
		add_header Access-Control-Allow-Origin * always;
		# add_header Access-Control-Expose-Headers Content-Length;
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;conf.d/stats.conf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 8090;

    allow 192.168.0.0/16;
    deny  all;

    location /stats {
        stub_status;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Cache-Server Konfiguration&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;nginx.conf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user root;
worker_processes  1;

load_module &amp;quot;modules/ngx_http_geoip2_module.so&amp;quot;;

events {
    worker_connections 1048576;
    multi_accept on;
    use epoll;
}

http {
    # BASIC
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
    keepalive_timeout 300s;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # GEOIP
    geoip2 /usr/share/geoip/GeoLite2-Country.mmdb {
        $geoip2_data_country_code source=$remote_addr country iso_code;
        $geoip2_data_country_name source=$remote_addr country names en;
    }

    geoip2 /usr/share/geoip/GeoLite2-City.mmdb {
        $geoip2_data_city_name  city names en;
        $geoip2_data_latitude   location latitude;
        $geoip2_data_longitude  location longitude;
    } 

    # LOGS
    log_format json_analytics escape=json &#39;{&#39;
                            &#39;&amp;quot;msec&amp;quot;: &amp;quot;$msec&amp;quot;, &#39; # request unixtime in seconds with a milliseconds resolution
                            &#39;&amp;quot;connection&amp;quot;: &amp;quot;$connection&amp;quot;, &#39; # connection serial number
                            &#39;&amp;quot;connection_requests&amp;quot;: &amp;quot;$connection_requests&amp;quot;, &#39; # number of requests made in connection
                    &#39;&amp;quot;pid&amp;quot;: &amp;quot;$pid&amp;quot;, &#39; # process pid
                    &#39;&amp;quot;request_id&amp;quot;: &amp;quot;$request_id&amp;quot;, &#39; # the unique request id
                    &#39;&amp;quot;request_length&amp;quot;: &amp;quot;$request_length&amp;quot;, &#39; # request length (including headers and body)
                    &#39;&amp;quot;remote_addr&amp;quot;: &amp;quot;$remote_addr&amp;quot;, &#39; # client IP
                    &#39;&amp;quot;remote_user&amp;quot;: &amp;quot;$remote_user&amp;quot;, &#39; # client HTTP username
                    &#39;&amp;quot;remote_port&amp;quot;: &amp;quot;$remote_port&amp;quot;, &#39; # client port
                    &#39;&amp;quot;time_local&amp;quot;: &amp;quot;$time_local&amp;quot;, &#39;
                    &#39;&amp;quot;time_iso8601&amp;quot;: &amp;quot;$time_iso8601&amp;quot;, &#39; # local time in the ISO 8601 standard format
                    &#39;&amp;quot;request&amp;quot;: &amp;quot;$request&amp;quot;, &#39; # full path no arguments if the request
                    &#39;&amp;quot;request_uri&amp;quot;: &amp;quot;$request_uri&amp;quot;, &#39; # full path and arguments if the request
                    &#39;&amp;quot;args&amp;quot;: &amp;quot;$args&amp;quot;, &#39; # args
                    &#39;&amp;quot;status&amp;quot;: &amp;quot;$status&amp;quot;, &#39; # response status code
                    &#39;&amp;quot;body_bytes_sent&amp;quot;: &amp;quot;$body_bytes_sent&amp;quot;, &#39; # the number of body bytes exclude headers sent to a client
                    &#39;&amp;quot;bytes_sent&amp;quot;: &amp;quot;$bytes_sent&amp;quot;, &#39; # the number of bytes sent to a client
                    &#39;&amp;quot;http_referer&amp;quot;: &amp;quot;$http_referer&amp;quot;, &#39; # HTTP referer
                    &#39;&amp;quot;http_user_agent&amp;quot;: &amp;quot;$http_user_agent&amp;quot;, &#39; # user agent
                    &#39;&amp;quot;http_x_forwarded_for&amp;quot;: &amp;quot;$http_x_forwarded_for&amp;quot;, &#39; # http_x_forwarded_for
                    &#39;&amp;quot;http_host&amp;quot;: &amp;quot;$http_host&amp;quot;, &#39; # the request Host: header
                    &#39;&amp;quot;server_name&amp;quot;: &amp;quot;$server_name&amp;quot;, &#39; # the name of the vhost serving the request
                    &#39;&amp;quot;request_time&amp;quot;: &amp;quot;$request_time&amp;quot;, &#39; # request processing time in seconds with msec resolution
                    &#39;&amp;quot;upstream&amp;quot;: &amp;quot;$upstream_addr&amp;quot;, &#39; # upstream backend server for proxied requests
                    &#39;&amp;quot;upstream_connect_time&amp;quot;: &amp;quot;$upstream_connect_time&amp;quot;, &#39; # upstream handshake time incl. TLS
                    &#39;&amp;quot;upstream_header_time&amp;quot;: &amp;quot;$upstream_header_time&amp;quot;, &#39; # time spent receiving upstream headers
                    &#39;&amp;quot;upstream_response_time&amp;quot;: &amp;quot;$upstream_response_time&amp;quot;, &#39; # time spend receiving upstream body
                    &#39;&amp;quot;upstream_response_length&amp;quot;: &amp;quot;$upstream_response_length&amp;quot;, &#39; # upstream response length
                    &#39;&amp;quot;upstream_cache_status&amp;quot;: &amp;quot;$upstream_cache_status&amp;quot;, &#39; # cache HIT/MISS where applicable
                    &#39;&amp;quot;ssl_protocol&amp;quot;: &amp;quot;$ssl_protocol&amp;quot;, &#39; # TLS protocol
                    &#39;&amp;quot;ssl_cipher&amp;quot;: &amp;quot;$ssl_cipher&amp;quot;, &#39; # TLS cipher
                    &#39;&amp;quot;scheme&amp;quot;: &amp;quot;$scheme&amp;quot;, &#39; # http or https
                    &#39;&amp;quot;request_method&amp;quot;: &amp;quot;$request_method&amp;quot;, &#39; # request method
                    &#39;&amp;quot;server_protocol&amp;quot;: &amp;quot;$server_protocol&amp;quot;, &#39; # request protocol, like HTTP/1.1 or HTTP/2.0
                    &#39;&amp;quot;pipe&amp;quot;: &amp;quot;$pipe&amp;quot;, &#39; # &amp;quot;p&amp;quot; if request was pipelined, &amp;quot;.&amp;quot; otherwise
                    &#39;&amp;quot;gzip_ratio&amp;quot;: &amp;quot;$gzip_ratio&amp;quot;, &#39;
                    &#39;&amp;quot;http_cf_ray&amp;quot;: &amp;quot;$http_cf_ray&amp;quot;,&#39;
                    &#39;&amp;quot;geoip_country_code&amp;quot;: &amp;quot;$geoip2_data_country_code&amp;quot;,&#39;
                    &#39;&amp;quot;geoip_country_name&amp;quot;: &amp;quot;$geoip2_data_country_name&amp;quot;,&#39;
                    &#39;&amp;quot;geoip_city_name&amp;quot;: &amp;quot;$geoip2_data_city_name&amp;quot;,&#39;
                    &#39;&amp;quot;geoip_longitude&amp;quot;: &amp;quot;$geoip2_data_longitude&amp;quot;,&#39;
                    &#39;&amp;quot;geoip_latitude&amp;quot;: &amp;quot;$geoip2_data_latitude&amp;quot;,&#39;
                    &#39;&amp;quot;geoip_location&amp;quot;: {&amp;quot;target&amp;quot;: &amp;quot;$geoip2_data_country_code&amp;quot;, &amp;quot;datapoints&amp;quot;: [[$geoip2_data_longitude, $geoip2_data_latitude]]}&#39;
                    &#39;}&#39;;

    access_log /var/log/nginx/access.log json_analytics;
    error_log /var/log/nginx/error.log warn;

    # gzip
    gzip on;
    gzip_disable &amp;quot;msie6&amp;quot;;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/javascript application/x-javascript text/xml application/xml application/xml+rss application/vnd.ms-fontobject application/x-font-ttf font/opentype font/x-woff image/svg+xml image/x-icon;

    # proxy
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_read_timeout 10s;
    proxy_send_timeout 10s;
    proxy_connect_timeout 10s;
    proxy_cache_path /http-cache-data use_temp_path=off keys_zone=origin_cache_temp:1m max_size=1g inactive=5m;
    proxy_cache origin_cache_temp;
    proxy_cache_methods GET HEAD;
    proxy_cache_key $uri;
    proxy_cache_valid 200 302 1m;
    proxy_cache_valid 404 3s;
    proxy_cache_lock on;
    proxy_cache_lock_age 5s;
    proxy_cache_lock_timeout 1h;
    proxy_ignore_headers Cache-Control;
    proxy_ignore_headers Set-Cookie;

    # sendet die IP-Adresse des Clients zum Origin
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-forwarded-host $host;

    # incude sub confs
    include /etc/nginx/conf.d/*.conf;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;conf.d/cache.conf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    resolver 127.0.0.11;
    set $originService &amp;quot;cdn_origin&amp;quot;;

    listen 80;
    # listen 443 ssl;
    # server_name         example.com;
    # ssl_certificate     /usr/share/ssl/fullchain.pem;
    # ssl_certificate_key /usr/share/ssl/privkey.pem;

    add_header X-Cache-Status $upstream_cache_status;

    location ~* &#92;.(m3u8|mpd)$ {
        proxy_cache_valid 200 302 4s;
        # proxy_pass http://origins;
        proxy_pass http://$originService:8080;
    }

    location / {
        # proxy_pass http://origins;
        proxy_pass http://$originService:8080;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;conf.d/stats.conf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 8090;

    allow 192.168.0.0/16;
    deny  all;

    location /stats {
        stub_status;
    }
}
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Sweet Chili Sauce Rezept</title>
    <link href="https://blog.kyro.space/notizen/rezept-sweet-chili-sauce/" />
    <updated>2021-04-24T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-sweet-chili-sauce/</id>
    <content type="html">&lt;p&gt;Meine Sweet Chili Sauce. Lecker zum Grillen und zu Wraps.&lt;/p&gt;
&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Chilis: 4 getrocknete Chilis (Schärfe 8/10)&lt;/li&gt;
&lt;li&gt;Limetten: 3 Stück&lt;/li&gt;
&lt;li&gt;Knoblauch: 6 Zehen&lt;/li&gt;
&lt;li&gt;Wasser: 500ml&lt;/li&gt;
&lt;li&gt;Zucker: 2 Tassen&lt;/li&gt;
&lt;li&gt;Salz: 1 Teelöffel&lt;/li&gt;
&lt;li&gt;Maisstärke: 2 Esslöffel&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zubereitung&lt;/h2&gt;
&lt;p&gt;Von den getrockneten Chilis nur die Stiele entfernen. Die Limetten auspressen. Die Knoblauchzehen in sehr feine kleine Stücke schneiden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ACHTUNG: Beim Kochen der Chilis entstehen Reizgase. Einatmen vermeiden. (Ich huste jedes Mal!)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Die Chilis 5 Minuten im Wasser kochen.&lt;/p&gt;
&lt;p&gt;Den Topf vom Herd nehmen und die ausgekochten Chilis zusammen mit dem Wasser direkt im Topf mit dem Mixstab pürieren, bis es die typischen roten Stücke gibt.&lt;/p&gt;
&lt;p&gt;Jetzt kommt der Topf wieder auf den Herd. Limettensaft, Knoblauch, Zucker und Salz hinzugeben und alles erneut zum Kochen bringen. Zwischenzeitlich die Maisstärke in etwas kaltes Wasser geben und gut auflösen. Wenn das Chili-Wasser kocht, die aufgelöste Maisstärke unter ständigem Rühren hinzugeben und kurz aufkochen lassen. Jetzt den Herd auf kleine Stufe herunterstellen und noch ca. 15 Minuten ziehen lassen. Fertig.&lt;/p&gt;
&lt;p&gt;Ich fülle die heiße Sauce immer in saubere True Fruits Glasflaschen ab und stelle sie verschlossen zum Abkühlen auf den Kopf.&lt;/p&gt;
&lt;p&gt;Guten Appetit.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Nshima Rezept</title>
    <link href="https://blog.kyro.space/notizen/rezept-nshima/" />
    <updated>2021-01-06T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-nshima/</id>
    <content type="html">&lt;p&gt;Nshima Rezept wie ich es in Zambia gelernt habe.&lt;/p&gt;
&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Maismehl: 4 Tassen&lt;/li&gt;
&lt;li&gt;Wasser: 16 Tassen, wenn benötigt etwas mehr oder weniger&lt;/li&gt;
&lt;li&gt;Salz: ca. 2 Teelöffel&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zubereitung&lt;/h2&gt;
&lt;p&gt;Gieße kaltes Wasser (zweieinhalb Tassen für jede Tasse Maismehl) in einen großen Topf. Bringe es bei starker Hitze zum Kochen.
Nach ein paar Minuten, wenn das Wasser warm ist, füge langsam etwa die Hälfte des Maismehls löffelweise zum Wasser hinzu und rühre dabei ständig mit einem stabilen Holzlöffel. Koche (und rühre) weiter, bis die Mischung zu kochen und zu blubbern beginnt. Reduziere die Hitze auf mittlere Stufe und koche ein paar Minuten.
Koche die Mischung bei mittlerer Hitze, füge das restliche Maismehl hinzu, wie zuvor, und streue es Löffel für Löffel ein, während du weiter rührst. Es ist wichtig, ständig zu rühren - wenn du eine große Menge zubereitest, kann es sein, dass eine Person den Topf hält und eine andere zwei Hände zum Rühren braucht.
Das Nshima sollte sehr dick (keine Flüssigkeit mehr) und glatt (keine Klumpen) sein. Diese Konsistenz kann erreicht sein, bevor das gesamte restliche Maismehl in den Topf gegeben wird - oder es kann notwendig sein, noch mehr Maismehl hinzuzufügen, als in diesem Rezept angegeben.
Sobald die gewünschte Konsistenz erreicht ist, schalte die Hitze aus, decke den Topf ab und lasse das Nshima vor dem Servieren noch einige Minuten stehen.&lt;/p&gt;
&lt;p&gt;Serviere Nshima sofort, heiß, mit dem Ndiwo deiner Wahl. Reiße mit sauberen Händen Stücke von Nshima ab und verwende sie, um die Ndiwo zu schöpfen.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>SSH Port Tunnel</title>
    <link href="https://blog.kyro.space/notizen/ssh-port-tunnel/" />
    <updated>2020-12-17T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/ssh-port-tunnel/</id>
    <content type="html">&lt;p&gt;Um von einem entfernten Computer einen Port auf den lokalen Computer zu tunneln genügt ein einzelner Befehl:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -L &amp;lt;local_port&amp;gt;:&amp;lt;remote_address&amp;gt;:&amp;lt;remote_port&amp;gt; &amp;lt;username&amp;gt;@&amp;lt;server_address&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Beispiel:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entfernter Computer: &lt;strong&gt;10.10.10.10&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Nicht öffentlicher Port auf entferntem Computer: &lt;strong&gt;1234&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Lokaler Port der auf den entfernten Port weitergeleitet wird: &lt;strong&gt;10001&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dann sieht der Befehl wie folgt aus:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -L 10001:10.10.10.10:1234 user@10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Dieser Befehl funktioniert sowohl unter Linux / Unix / Windows (Powershell, Terminal)&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Brötchen Rezept</title>
    <link href="https://blog.kyro.space/notizen/rezept-broetchen-1/" />
    <updated>2020-11-21T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-broetchen-1/</id>
    <content type="html">&lt;p&gt;Mein Brötchen-Grund-Rezept für 4 große Brötchen&lt;/p&gt;
&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hefe: 1/2 Würfel&lt;/li&gt;
&lt;li&gt;Wasser: 200ml&lt;/li&gt;
&lt;li&gt;Mehl: ca. 350g (Sorte(n) nach Belieben, z.B. 50% Weizen Typ 405 und 50% Dinkel Typ 1050)&lt;/li&gt;
&lt;li&gt;Zucker: 1 Teelöffel&lt;/li&gt;
&lt;li&gt;Salz: 4 Teelöffel&lt;/li&gt;
&lt;li&gt;Honig oder Oliven-Öl: ca. 1 Esslöffel&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zubereitung&lt;/h2&gt;
&lt;p&gt;Das handwarme Wasser, den Zucker und die Hefe in z.B. einen Messbecher geben, gut verrühren, abdecken und ca. 15 Minuten stehen lassen, bis kleine Blasen aufsteigen. Währenddessen das Mehl in eine große Schüssel sieben und mit dem Salz vermengen.&lt;/p&gt;
&lt;p&gt;Das Wasser-Hefe-Zucker-Gemisch zum Mehl hinzugeben und mit einer Gabel oder einem Rührgerät grob vermengen. Währenddessen den Honig oder das Oliven-Öl dazu geben. Dann den Teig ca. 10-15 Minuten mit den Händen falten (kneten), bis er eine homogene Masse ist. Der Teig sollte dann weich aber gerade nicht mehr klebrig sein.&lt;/p&gt;
&lt;p&gt;Der fertige Teig verbleibt in der Schüssel, welche mit einem sauberen Küchentuch abgedeckt wird. Die Schüssel mit dem Teig ca. 8 Stunden (über Nacht) in den Kühlschrank oder für ca. 1 Stunde an einem zimmerwarmen, zugfreien Ort belassen, damit der Teig auf ca. doppelte Größe aufgehen kann.&lt;/p&gt;
&lt;p&gt;Den gegangenen Teig vorsichtig aus der Schüssel nehmen und nach Wunsch portionieren (4-6 Portionen). Jede Portion vorsichtig zu einer Kugel rollen, auf ein gelochtes Backblech (speziell zum Brötchenbacken) legen, leicht platt drücken und mit einem scharfen Messer oben ein Kreuz einschneiden. Das fertig bestückte Backblech mit dem Tuch von der Schüssel erneut abdecken und die Teiglinge ca. 30 Minuten erneut gehen lassen.&lt;/p&gt;
&lt;p&gt;Während die Teiglinge ein zweites Mal gehen, kann bereits der Backofen vorbereitet werden. Dazu eine große feuerfeste Schale auf den Backofenboden stellen (z.B. hohes Kuchenblech), mit ca. 1,5l kochendem Wasser befüllen und den Backofen auf 240 °C aufheizen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ACHTUNG: Das Wasser wird weiter kochen und es entsteht heißer Wasserdampf. Beim Öffnen des Backofens sehr vorsichtig sein, da Verbrühungsgefahr besteht.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wenn die Teiglinge erneut aufgegangen sind, diese auf dem Backblech auf mittlere Höhe für ca. 20 Minuten backen. Dabei darauf achten, dass immer genügend Wasser in der Schale am Boden ist.&lt;/p&gt;
&lt;p&gt;Danach die fertigen goldbraunen Brötchen aus dem Ofen entnehmen, etwas abkühlen lassen und genießen.&lt;/p&gt;
&lt;p&gt;Guten Appetit.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>cURL Commands</title>
    <link href="https://blog.kyro.space/notizen/curl-commands/" />
    <updated>2020-04-25T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/curl-commands/</id>
    <content type="html">&lt;p&gt;Meine Kollektion von curl Kommandos.&lt;/p&gt;
&lt;h2&gt;Webdav&lt;/h2&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Webdav URL: http://example.com/webdav&lt;/li&gt;
&lt;li&gt;Username: user&lt;/li&gt;
&lt;li&gt;Password: pass&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Download File&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;curl --remote-name http://example.com/file.txt&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reading Files/Folders&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;curl http://example.com/webdav&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating new Folder&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;curl -X MKCOL http://example.com/webdav/new_folder&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Uploading File&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;curl -T /path/to/local/file.txt http://example.com/webdav/test/new_name.txt&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Renaming File&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;curl -X MOVE --header Destination:http://example.org/webdav/new.txt http://example.com/webdav/old.txt&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deleting Files&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;curl -X DELETE http://example.com/webdav/test.txt&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deleting Folders&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;curl -X DELETE http://example.com/webdav/test&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With basic authentication&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;curl --basic --user user:pass http://example.com/webdav&lt;/code&gt;
&lt;code&gt;curl --digest --user user:pass http://example.com/webdav&lt;/code&gt;
&lt;code&gt;curl --anyauth --user user:pass http://example.com/webdav&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
  </entry>
  <entry>
    <title>Fahrradschaltung einstellen</title>
    <link href="https://blog.kyro.space/notizen/fahrrad-schaltung-einstellen/" />
    <updated>2020-03-14T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/fahrrad-schaltung-einstellen/</id>
    <content type="html">&lt;h2&gt;Schaltwerk einstellen&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Schritt:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;größtes Kettenblatt&lt;/li&gt;
&lt;li&gt;kleinstes Ritzel&lt;/li&gt;
&lt;li&gt;H-Schraube drehen, bis Leitröllchen exakt über Ritzel&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Schritt:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;kleinstes Kettenblatt&lt;/li&gt;
&lt;li&gt;größtes Ritzel&lt;/li&gt;
&lt;li&gt;L-Schraube drehen, bis Leitröllchen exakt über unterem Ritzel steht (innen)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Schritt:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;??? wie in 2. Schritt&lt;/li&gt;
&lt;li&gt;Hintere Anschlagschraube &amp;quot;B&amp;quot; bis 1,5 Kettenglieder zwischen Ritzel (groß) und Leitröllchen ist&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Zugspannung einstellen&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;großes Kettenblatt&lt;/li&gt;
&lt;li&gt;kleines Ritzel&lt;/li&gt;
&lt;li&gt;prüfen: Schalthebel muss vollen Seilzug freigeben&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Mitte / Mitte&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Zug-Schutzwählhebel bis Kette nicht am nächsten hinteren Ritzel schleift&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Umwerfer einstellen&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Schritt&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Leitblech &amp;amp; Kettenblatt&lt;/li&gt;
&lt;li&gt;Abstand Leitblech zu Kettenblatt = 1-3cm&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Schritt&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Schaltung auf &lt;strong&gt;größtes Ritzel&lt;/strong&gt; und &lt;strong&gt;kleinstes Kettenblatt&lt;/strong&gt; schalten&lt;/li&gt;
&lt;li&gt;L-Schraube drehen, bis Leitblech zu Kette ca. 1mm (innen)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Schritt&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;kleinsten Gang wählen&lt;/li&gt;
&lt;li&gt;Zug spannen&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Schritt&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Schaltung auf &lt;strong&gt;kleinstes Ritzel&lt;/strong&gt; und &lt;strong&gt;größtes Kettenblatt&lt;/strong&gt; schalten&lt;/li&gt;
&lt;li&gt;H-Schraube drehen, bis das Leitblech zu der Kette ca. 1mm Abstand hat&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Schritt&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Zugspannung-Schraube am Shifter, bis inneres Leitblech zu der Kette ca. 1mm Abstand hat&lt;/li&gt;
&lt;li&gt;mittleres Ritzel&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Mexikaner Rezept</title>
    <link href="https://blog.kyro.space/notizen/rezept-mexikaner/" />
    <updated>2018-02-21T00:00:00Z</updated>
    <id>https://blog.kyro.space/notizen/rezept-mexikaner/</id>
    <content type="html">&lt;p&gt;Mein Rezept für &lt;strong&gt;meinen Mexikaner aus der Flasche&lt;/strong&gt;. Have fun!&lt;/p&gt;
&lt;h2&gt;Zutaten&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;3l Tomatensaft (Sorte ALDI BIO)&lt;/li&gt;
&lt;li&gt;1l &lt;a href=&quot;https://www.sangrita.de&quot;&gt;Sangrita picante&lt;/a&gt;, würziger/scharfer Tomatensaft für den Geschmack&lt;/li&gt;
&lt;li&gt;2 Flaschen Fuego Hot Pepper Sauce Classic&lt;/li&gt;
&lt;li&gt;2 Flaschen (1,4l) Korn&lt;/li&gt;
&lt;li&gt;1,5 große Zitronen&lt;/li&gt;
&lt;li&gt;0,25l Orangensaft&lt;/li&gt;
&lt;li&gt;7 EL Salz&lt;/li&gt;
&lt;li&gt;Pfeffer&lt;/li&gt;
&lt;li&gt;3 EL Cayenne&lt;/li&gt;
&lt;li&gt;5 EL Zucker&lt;/li&gt;
&lt;li&gt;etwas scharfes Paprikapulver&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tomatensaft, Sangrita, 1,5 Flaschen Sangrita Hot Pepper Sauce und den Saft der Zitronen in einem großen Topf verrühren. Sangrita Flaschen mit etwas Korn ausspülen und den gesamten Korn in den Topf geben. Mit Salz, Pfeffer, Cayenne und Zucker abschmecken. Für mehr Schärfe: &lt;strong&gt;mehr Fuego&lt;/strong&gt;&lt;/p&gt;
</content>
  </entry>
</feed>