<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>JavaScript on Natenoms Blog</title><link>https://natenom.de/tags/javascript/</link><description>Recent content in JavaScript on Natenoms Blog</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright/><lastBuildDate>Mon, 25 Sep 2023 00:40:56 +0200</lastBuildDate><atom:link href="https://natenom.de/tags/javascript/index.xml" rel="self" type="application/rss+xml"/><item><title>Viewer für 360°-Fotos im Blog verbessert</title><link>https://natenom.de/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/</link><pubDate>Mon, 25 Sep 2023 00:40:56 +0200</pubDate><guid>https://natenom.de/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/</guid><description><![CDATA[<p>Gestern und heute habe ich mich viel mit dem Photo-Sphere-Viewer auseinander gesetzt, den ich hier im Blog verwende, um die 360°-Fotos darzustellen und dabei auch einige Dinge verbessern können.</p>
<p>Mit Hilfe der ausführlichen Dokumentation des <a  class='urlextern'  href="https://github.com/mistic100/Photo-Sphere-Viewer">Photo-Sphere-Viewer</a> konnte ich den jetzt richtig im Blog einbinden, sodass ich auch die verschiedenen Plugins nutzen kann, was bisher nicht möglich war, da ich von dieser Thematik keine Ahnung habe.</p>
<p>Auch konnte ich meinen Shortcode zum Einbinden des Viewers verbessern.</p>]]></description><content:encoded><![CDATA[<p>Gestern und heute habe ich mich viel mit dem Photo-Sphere-Viewer auseinander gesetzt, den ich hier im Blog verwende, um die 360°-Fotos darzustellen und dabei auch einige Dinge verbessern können.</p>
<p>Mit Hilfe der ausführlichen Dokumentation des <a  class='urlextern'  href="https://github.com/mistic100/Photo-Sphere-Viewer">Photo-Sphere-Viewer</a> konnte ich den jetzt richtig im Blog einbinden, sodass ich auch die verschiedenen Plugins nutzen kann, was bisher nicht möglich war, da ich von dieser Thematik keine Ahnung habe.</p>
<p>Auch konnte ich meinen Shortcode zum Einbinden des Viewers verbessern.</p>
<h2 id="verbesserungen-des-360-viewers" data-numberify>Verbesserungen des 360°-Viewers<a class="anchor ms-1" href="#verbesserungen-des-360-viewers"></a></h2>
<ul>
<li>Es ist jetzt möglich, auch bei mehreren 360°-Fotos in einem Blogbeitrag jeweils eine OpenStreetMap-Karte mit dem Standort anzuzeigen, bisher war das nur einmal pro Blogbeitrag möglich. <a  href="/2023/09/fotos-und-360-grad-fotos-von-sonntag/#360-fotos-oder-sogenannte-spheres">Hier ein Beispiel</a>.</li>
<li>Dank des Gyroskop-Plugins kann man das Smartphone im Raum bewegen und sieht das, was vor Ort auch in dieser Richtung war. Das geht aber nur, wenn das Smartphone einen Lagesensor hat und der Browser das unterstützt. Dazu muss man unten rechts auf das Kompass-Symbol drücken.</li>
<li>Der Fischaugen-Effekt ist aus. Das Foto wird also beim Verändern der Ansicht nicht mehr verzerrt.</li>
<li>Der Photo-Sphere-Viewer wurde auf die neueste Version aktualisiert.</li>
</ul>

<h2 id="weitere-möglichkeiten-in-zukunft-dank-plugins" data-numberify>Weitere Möglichkeiten in Zukunft dank Plugins<a class="anchor ms-1" href="#weitere-möglichkeiten-in-zukunft-dank-plugins"></a></h2>
<p>In Zukunft kann ich mir vorstellen, auch noch mehr <a  class='urlextern'  href="https://photo-sphere-viewer.js.org/plugins/">Funktionen der Plugins</a> zu nutzen, wie z. B. die Möglichkeit für Markierungen innerhalb der 360°-Fotos. Oder auch das automatische scrollen der Fotos.</p>

<h2 id="metadaten--so-wichtig-für-unvollständige-panoramen" data-numberify>Metadaten – so wichtig für unvollständige Panoramen<a class="anchor ms-1" href="#metadaten--so-wichtig-für-unvollständige-panoramen"></a></h2>
<p>Beim Testen ist mir aufgefallen, dass der Viewer Panorama-Fotos automatisch auf nur einen Teil der &ldquo;Leinwand tapeziert&rdquo;, wenn das Foto nicht 360° in der Horizontalen abdeckt, sondern nur einen Teil davon. In vor allem älteren Panorama-Fotos funktioniert das jedoch nicht.</p>
<p>Der Verdacht: Metadaten.</p>
<p>Und tatsächlich, es liegt an Metadaten. In älteren Panorama-Fotos gab es die nie und in aktuellen Panorama-Fotos entferne ich die Metadaten vor dem Veröffentlichen per Script. Sobald die Metadaten fehlen, gibt es bei teilweisen Panoramen harte Schnitte und keine unvollständigen Bereiche mehr.</p>
<p>Hier ein Vergleich, oben mit Metadaten, unten ohne:</p>
 <figure class="image-caption"><a href="2023-09-24-leinwand-mit-metadaten.jpg"><picture>
                <source type="image/webp" srcset="/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-mit-metadaten_huca07ef848694fda6b487003cc1208909_55472_360x0_resize_q95_h2_catmullrom.webp 360w,/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-mit-metadaten_huca07ef848694fda6b487003cc1208909_55472_500x0_resize_q95_h2_catmullrom.webp 500w,/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-mit-metadaten_huca07ef848694fda6b487003cc1208909_55472_816x0_resize_q95_h2_catmullrom.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-mit-metadaten_huca07ef848694fda6b487003cc1208909_55472_360x0_resize_q95_h2_catmullrom.webp 360w, /2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-mit-metadaten_huca07ef848694fda6b487003cc1208909_55472_500x0_resize_q95_h2_catmullrom.webp 500w, /2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-mit-metadaten_huca07ef848694fda6b487003cc1208909_55472_816x0_resize_q95_h2_catmullrom.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-mit-metadaten_huca07ef848694fda6b487003cc1208909_55472_816x0_resize_q95_h2_catmullrom.webp" title="" loading="lazy" width="816" height="598" /></picture></a></figure>
 <figure class="image-caption"><a href="2023-09-24-leinwand-ohne-metadaten.jpg"><picture>
                <source type="image/webp" srcset="/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-ohne-metadaten_huca9ef6b32c95b47a63018db3b0d28885_95438_360x0_resize_q95_h2_catmullrom.webp 360w,/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-ohne-metadaten_huca9ef6b32c95b47a63018db3b0d28885_95438_500x0_resize_q95_h2_catmullrom.webp 500w,/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-ohne-metadaten_huca9ef6b32c95b47a63018db3b0d28885_95438_816x0_resize_q95_h2_catmullrom.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-ohne-metadaten_huca9ef6b32c95b47a63018db3b0d28885_95438_360x0_resize_q95_h2_catmullrom.webp 360w, /2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-ohne-metadaten_huca9ef6b32c95b47a63018db3b0d28885_95438_500x0_resize_q95_h2_catmullrom.webp 500w, /2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-ohne-metadaten_huca9ef6b32c95b47a63018db3b0d28885_95438_816x0_resize_q95_h2_catmullrom.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/2023-09-24-leinwand-ohne-metadaten_huca9ef6b32c95b47a63018db3b0d28885_95438_816x0_resize_q95_h2_catmullrom.webp" title="" loading="lazy" width="816" height="598" /></picture></a></figure>
<p>Welche Metadaten eine Rolle spielen, <a  class='urlextern'  href="https://developers.google.com/streetview/spherical-metadata">ist hier dokumentiert</a>. Auch auf der Projektseite von Photo-Sphere-Viewer gibt es dazu einen Abschnitt und es wird auch erklärt, wie man diese Daten angeben kann, ohne sie in die Metadaten zu schreiben, <a  class='urlextern'  href="https://photo-sphere-viewer.js.org/guide/adapters/equirectangular.html#cropped-panorama">siehe hier</a>. Dort gibt es ganz unten auch einen Bereich, wo man diese Angaben anhand eines lokalen Beispielfotos ausprobieren kann.</p>
<p>Das sind die relevanten Metadaten (aus <code>exiftool</code>) mit den Werten für das hier verwendete Beispiel:<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<pre tabindex="0"><code>Cropped Area Left Pixels        : 0
Cropped Area Top Pixels         : 1278
Cropped Area Image Width Pixels : 6774
Cropped Area Image Height Pixels: 1634
Full Pano Width Pixels          : 8330
Full Pano Height Pixels         : 4165
</code></pre><p>Man kann diese Metadaten auch mit Hilfe von exiftool wieder in Fotos hineinschreiben, falls man z. B. noch auf das unbearbeitete Originalfoto Zugriff hat:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>exiftool -overwrite_original -CroppedAreaImageHeightPixels<span style="color:#f92672">=</span><span style="color:#ae81ff">1634</span> -CroppedAreaImageWidthPixels<span style="color:#f92672">=</span><span style="color:#ae81ff">6774</span> -CroppedAreaLeftPixels<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span> -CroppedAreaTopPixels<span style="color:#f92672">=</span><span style="color:#ae81ff">1278</span> -FullPanoWidthPixels<span style="color:#f92672">=</span><span style="color:#ae81ff">8330</span> -FullPanoHeightPixels<span style="color:#f92672">=</span><span style="color:#ae81ff">4165</span> datei.webp
</span></span></code></pre></div><p>Statt die Tags manuell hinzuzufügen kann man sie beim Entfernen der anderen Metadaten in den Fotos belassen. Mein Script zum Entfernen von Metadaten habe ich nun so umgeschrieben, dass diese Daten erhalten bleiben:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>preservetags<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;-aperturevalue -shuttervalue -iso -mime -exposuretime -focallength -orientation -exposurebias -flash -CroppedAreaImageHeightPixels -CroppedAreaImageWidthPixels -CroppedAreaLeftPixels -CroppedAreaTopPixels -FullPanoWidthPixels -FullPanoHeightPixels -InitialViewHeadingDegrees -InitialViewPitchDegrees -InitialViewRollDegrees -ProjectionType&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>exiftool -all<span style="color:#f92672">=</span> -tagsfromfile @ <span style="color:#e6db74">${</span>preservetags<span style="color:#e6db74">}</span> -overwrite_original datei.webp<span style="color:#e6db74">&#34;
</span></span></span></code></pre></div>
<h2 id="sooo-schön" data-numberify>Sooo schön<a class="anchor ms-1" href="#sooo-schön"></a></h2>
<p>Besonders die Funktion mit dem Gyroskop auf Smartphones gefällt mir sehr gut und auch, dass man jetzt auch bei mehreren 360°-Fotos pro Blogbeitrag zu jedem Foto jeweils eine eigene Karte mit dem Ort darstellen kann. Das sind wirklich schöne und einfach zu erstellende Erinnerungen.</p>
<p>Ich werde ab jetzt auch Panorama-Fotos mit diesem Viewer darstellen lassen.</p>

<h2 id="kleine-aber-nicht-mehr-aktive-alternative--pannellum" data-numberify>Kleine, aber nicht mehr aktive Alternative – Pannellum<a class="anchor ms-1" href="#kleine-aber-nicht-mehr-aktive-alternative--pannellum"></a></h2>
<p>Es gibt eine Alternative zum Photo-Sphere-Viewer, nämlich <a  class='urlextern'  href="https://pannellum.org/">Pannellum</a>. Der Viewer ist nur 21 kB klein und hat einen ausreichenden Funktionsumfang, wenn ich davon ausgehe, was ich hier bisher im Blog benötigt hatte. Der Viewer wird aber schon seit 2019 nicht mehr groß weiterentwickelt. Man muss lediglich eine .js-Datei und eine .css-Datei einbinden, mehr nicht.</p>
<p>An Pannellum gefällt mir unter anderem, dass das Foto optional erst nach einem Klick auf einen Knopf geladen wird. Das spart Bandbreite.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Die Liste der aller für Panoramen relevanter Tags <a  class='urlextern'  href="https://exiftool.org/TagNames/XMP.html#GPano">gibt es hier</a>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content:encoded></item><item><title>Mehrere Spheres (360°-Fotos) in einem Blogbeitrag</title><link>https://natenom.de/2023/09/mehrere-spheres-in-einem-blogbeitrag/</link><pubDate>Mon, 11 Sep 2023 00:17:50 +0200</pubDate><guid>https://natenom.de/2023/09/mehrere-spheres-in-einem-blogbeitrag/</guid><description><![CDATA[<p>Ich wollte heute einen Blogbeitrag erstellen, in dem mehrere 360°-Fotos (hier nur noch &ldquo;Sphere&rdquo; genannt) eingebunden werden und stellte fest, dass immer nur die erste Sphere angezeigt wurde. Vermutlich hatte ich <a  href="/2023/01/es-gibt-wieder-360-grad-fotos-in-meinem-foto-blog/">damals beim &ldquo;Implementieren&rdquo;</a> nicht an so etwas gedacht.</p>]]></description><content:encoded><![CDATA[<p>Ich wollte heute einen Blogbeitrag erstellen, in dem mehrere 360°-Fotos (hier nur noch &ldquo;Sphere&rdquo; genannt) eingebunden werden und stellte fest, dass immer nur die erste Sphere angezeigt wurde. Vermutlich hatte ich <a  href="/2023/01/es-gibt-wieder-360-grad-fotos-in-meinem-foto-blog/">damals beim &ldquo;Implementieren&rdquo;</a> nicht an so etwas gedacht.</p>
<p>Das Problem ist, dass der Shortcode den folgenden Code beinhaltet:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;viewer&#34;</span> <span style="color:#a6e22e">style</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;width: 100%; height: 60vh;&#34;</span>&gt;&lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>    const viewer = new PhotoSphereViewer.Viewer({
</span></span><span style="display:flex;"><span>        container: document.querySelector(&#39;#viewer&#39;),
</span></span><span style="display:flex;"><span>[…]
</span></span></code></pre></div>
<h2 id="eindeutige-id-mit-ordinal" data-numberify>Eindeutige ID mit .Ordinal<a class="anchor ms-1" href="#eindeutige-id-mit-ordinal"></a></h2>
<p>Ich habe jetzt nicht wirklich Ahnung von diesem ganzen Zeugs, aber eine ID innerhalb eines HTML-Dokuments muss eindeutig sein und sobald man mehrere Spheres einbindet, gibt es mindestens zwei <code>id=&quot;viewer&quot;</code>.</p>
<p>D. h. ich musste den Code ändern und sowohl die ID als auch die Konstante <code>viewer</code> für jedes eingebundene Sphere eindeutig machen. Mit Hilfe der Variable <code>.Ordinal</code> ist das einfach umsetzbar. Die Variable besagt, an wie vielter Stelle der aktuelle Shortcode im Kontext der aktuellen Seite steht.</p>
<p>Dabei stieß ich auf ein Problem, denn irgendwas in Hugo macht magische Dinge und fügt automatisch Anführungszeichen ein, sobald man eine Hugo Variable innerhalb eines <code>&lt;script&gt;</code>-Konstrukts einfügt.</p>
<p>So wird aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>&lt;<span style="color:#a6e22e">script</span>&gt;
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">viewer_</span>{{ .<span style="color:#a6e22e">Ordinal</span> }} = <span style="color:#a6e22e">new</span> [<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">/</span><span style="color:#a6e22e">script</span>&gt;
</span></span></code></pre></div><p>In Ergebnis das hier:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">viewer_</span><span style="color:#e6db74">&#34;2&#34;</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> [<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">script</span>&gt;
</span></span></code></pre></div><p>Details dazu gibt es <a  class='urlextern'  href="https://discourse.gohugo.io/t/cant-insert-shortcode-parameter-without-quotation-marks/1481/4">hier</a> zu lesen und die Lösung ist <a  class='urlextern'  href="https://gohugo.io/functions/safejs/">safeJS</a>.</p>
<p>Der funktionierende Code sieht dann so aus und die Anführungszeichen sind dann weg:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>&lt;<span style="color:#a6e22e">script</span>&gt;
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">viewer_</span>{{ .<span style="color:#a6e22e">Ordinal</span> | <span style="color:#a6e22e">safeJS</span> }} = <span style="color:#a6e22e">new</span> [<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">/</span><span style="color:#a6e22e">script</span>&gt;
</span></span></code></pre></div>
<h2 id="noch-mehr-arbeit-für-die-karte" data-numberify>Noch mehr Arbeit für die Karte<a class="anchor ms-1" href="#noch-mehr-arbeit-für-die-karte"></a></h2>
<p>Optional kann ich für jede Sphere auch einen Kartenausschnitt von OpenStreetMap einbinden, <a  href="/2023/03/verbesserter-shortcode-fuer-die-einbindung-von-360-grad-fotos-in-meinem-blog/#beispiel">siehe hier</a>. Dabei gibt es jedoch das selbe Problem mit der eindeutigen ID und auch hier lädt nur die erste Karte. Denn das JavaScript referenziert auch mehrere IDs.</p>
<p>Doch das übersteigt meine Fertigkeiten mit JavaScript und Co und deshalb werde ich die Karten bei mehreren Spheres pro Blogbeitrag erst einmal nicht einbinden, bis ich eine Lösung gefunden habe.</p>
<p>Immerhin gibt es unter jeder Sphere optional die Möglichkeit, einen Link zum Standort zu hinterlegen und das werde ich stattdessen nutzen.</p>

<h2 id="scripte-und-css-nur-einmal-einbinden" data-numberify>Scripte und CSS nur einmal einbinden<a class="anchor ms-1" href="#scripte-und-css-nur-einmal-einbinden"></a></h2>
<p>So kann ich jetzt auch mehrere Spheres in einem Blogbeitrag einfügen. Doch es werden noch bei jeder Einbindung die notwendigen, externen Scripte eingebunden. Ordinal kann ich hier nicht dafür verwenden, denn der liefert für jeden verwendeten Shortcode innerhalb eines Blogbeitrags eine eindeutige Nummer, jedoch nicht die Information, ob der Shortcode bereits aufgerufen wurde.</p>
<p>Deshalb bietet sich die Funktion <code>.Scratch</code> an.</p>
<p>Mit diesem Code werden Scripte und CSS nur beim ersten Sphere eingebunden, bei weiteren nicht erneut:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>&lt;!<span style="color:#f92672">--</span> <span style="color:#a6e22e">Sphere</span> <span style="color:#a6e22e">js</span> <span style="color:#a6e22e">und</span> <span style="color:#a6e22e">css</span> <span style="color:#a6e22e">nur</span> <span style="color:#a6e22e">einmalig</span> <span style="color:#a6e22e">einbinden</span> <span style="color:#f92672">--</span>&gt;
</span></span><span style="display:flex;"><span>{{ <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">ne</span> (<span style="color:#960050;background-color:#1e0010">$</span>.<span style="color:#a6e22e">Page</span>.<span style="color:#a6e22e">Scratch</span>.<span style="color:#a6e22e">Get</span> <span style="color:#e6db74">&#34;sphere_used&#34;</span>) <span style="color:#e6db74">&#34;true&#34;</span> }}
</span></span><span style="display:flex;"><span>{{ <span style="color:#960050;background-color:#1e0010">$</span>.<span style="color:#a6e22e">Page</span>.<span style="color:#a6e22e">Scratch</span>.<span style="color:#a6e22e">Set</span> <span style="color:#e6db74">&#34;sphere_used&#34;</span> <span style="color:#e6db74">&#34;true&#34;</span> }}
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Hier</span> <span style="color:#a6e22e">Einbindung</span> <span style="color:#a6e22e">der</span> <span style="color:#a6e22e">Scripte</span> <span style="color:#a6e22e">und</span> <span style="color:#a6e22e">CSS</span>.
</span></span><span style="display:flex;"><span>{{ <span style="color:#a6e22e">end</span> }}
</span></span></code></pre></div>]]></content:encoded></item><item><title>Es gibt wieder 360°-Fotos in meinem Foto-Blog (Update)</title><link>https://natenom.de/2023/01/es-gibt-wieder-360-grad-fotos-in-meinem-foto-blog/</link><pubDate>Wed, 18 Jan 2023 03:51:14 +0100</pubDate><guid>https://natenom.de/2023/01/es-gibt-wieder-360-grad-fotos-in-meinem-foto-blog/</guid><description><![CDATA[<p>Früher hatte ich dank eines <a  href="/2017/09/es-gibt-eine-neue-kategorie-in-meinem-blog-mit-360-foto-schnappschuessen/">WordPress-Plugins im Blog</a> die Möglichkeit, sogenannte 360°-Fotos anzeigen zu lassen. Doch irgendwann wurde das Plugin nicht mehr aktualisiert und so hatte ich es aus Sicherheitsgründen wieder entfernt.</p>
<p>Als ich heute in meinem Foto-Blog gestöbert hatte, sah ich ein solches Foto. Ohne die entsprechende Formatierung sieht es natürlich total verzerrt aus.</p>
<p>Und dann habe ich ein OpenSource-Projekt gefunden, das es ermöglicht, solche Fotos richtig anzeigen zu lassen. Implementiert in JavaScript, sodass ich das in Hugo sehr einfach selbst einbinden kann.</p>]]></description><content:encoded><![CDATA[<p>Früher hatte ich dank eines <a  href="/2017/09/es-gibt-eine-neue-kategorie-in-meinem-blog-mit-360-foto-schnappschuessen/">WordPress-Plugins im Blog</a> die Möglichkeit, sogenannte 360°-Fotos anzeigen zu lassen. Doch irgendwann wurde das Plugin nicht mehr aktualisiert und so hatte ich es aus Sicherheitsgründen wieder entfernt.</p>
<p>Als ich heute in meinem Foto-Blog gestöbert hatte, sah ich ein solches Foto. Ohne die entsprechende Formatierung sieht es natürlich total verzerrt aus.</p>
<p>Und dann habe ich ein OpenSource-Projekt gefunden, das es ermöglicht, solche Fotos richtig anzeigen zu lassen. Implementiert in JavaScript, sodass ich das in Hugo sehr einfach selbst einbinden kann.</p>
<p>Das Projekt heißt &ldquo;Photo Sphere Viewer&rdquo; und die Website ist <a  class='urlextern'  href="https://photo-sphere-viewer.js.org/">photo-sphere-viewer.js.org</a>. Die Installationsanleitung gibt es <a  class='urlextern'  href="https://photo-sphere-viewer.js.org/guide/#install-photo-sphere-viewer">hier</a>.</p>

<h2 id="shortcode-für-hugo" data-numberify>Shortcode für Hugo<a class="anchor ms-1" href="#shortcode-für-hugo"></a></h2>
<p>Für Hugo habe ich ganz Natenom-gemäß – es funktioniert, ist aber nicht schön gemacht – einen Shortcode erstellt. Dieser nutzt die angegebenen Shortcode-Parameter <code>src</code> und <code>caption</code>. Vri wird das dann später in schön implementieren. 😊</p>
<p>Der Quelltext des Shortcodes entspricht hauptsächlich dem Beispiel in der oben genannten Installationsanleitung, enthält aber zustäzlich noch eine deutsche Übersetzung für die Steuerelemente. Und die benötigten JavaScript- und CSS-Dateien habe ich heruntergeladen und stelle sie direkt auf dem eigenen Server zur Verfügung.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-jinja" data-lang="jinja"><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>img <span style="color:#f92672">:=</span> <span style="color:#f92672">(</span>.Page.Resources.ByType <span style="color:#e6db74">&#34;image&#34;</span><span style="color:#f92672">)</span>.GetMatch <span style="color:#f92672">(</span>printf <span style="color:#e6db74">&#34;*%s&#34;</span> <span style="color:#f92672">(</span>.Get <span style="color:#e6db74">&#34;src&#34;</span><span style="color:#f92672">))</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>caption <span style="color:#f92672">:=</span> <span style="color:#e6db74">&#34;&#34;</span> -<span style="color:#75715e">}}{{</span> <span style="color:#66d9ef">if</span> isset .Params <span style="color:#e6db74">&#34;caption&#34;</span> <span style="color:#75715e">}}{{</span> <span style="color:#960050;background-color:#1e0010">$</span>caption <span style="color:#f92672">=</span> <span style="color:#f92672">(</span>.Get <span style="color:#e6db74">&#34;caption&#34;</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">markdownify</span> <span style="color:#f92672">)</span> <span style="color:#75715e">}}{{</span> end <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>&lt;head&gt;
</span></span><span style="display:flex;"><span>    &lt;!-- for optimal display on high DPI devices --&gt;
</span></span><span style="display:flex;"><span>    &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34; /&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    &lt;link rel=&#34;stylesheet&#34; href=&#34;https://natenom.de/my_css/sphere/index.min.css&#34; /&gt;
</span></span><span style="display:flex;"><span>&lt;/head&gt;
</span></span><span style="display:flex;"><span>&lt;script src=&#34;https://natenom.de/my_js/sphere/three.min.js&#34;&gt;&lt;/script&gt;
</span></span><span style="display:flex;"><span>&lt;script src=&#34;https://natenom.de/my_js/sphere/index.min.js&#34;&gt;&lt;/script&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;!-- the viewer container must have a defined size --&gt;
</span></span><span style="display:flex;"><span>&lt;div id=&#34;viewer&#34; style=&#34;width: 100%; height: 60vh;&#34;&gt;&lt;/div&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;script&gt;
</span></span><span style="display:flex;"><span>    const viewer = new PhotoSphereViewer.Viewer({
</span></span><span style="display:flex;"><span>        container: document.querySelector(&#39;#viewer&#39;),
</span></span><span style="display:flex;"><span>        panorama: &#39;<span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>img -<span style="color:#75715e">}}</span>&#39;,
</span></span><span style="display:flex;"><span>        caption: &#39;<span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>caption -<span style="color:#75715e">}}</span>&#39;,
</span></span><span style="display:flex;"><span>        fisheye: true,
</span></span><span style="display:flex;"><span>        lang: {
</span></span><span style="display:flex;"><span>            zoom: &#39;Zoomen&#39;,
</span></span><span style="display:flex;"><span>            zoomOut: &#39;Heraus zommen&#39;,
</span></span><span style="display:flex;"><span>            zoomIn: &#39;Hinein zoomen&#39;,
</span></span><span style="display:flex;"><span>            moveUp: &#39;Nach oben&#39;,
</span></span><span style="display:flex;"><span>            moveDown: &#39;Nach unten&#39;,
</span></span><span style="display:flex;"><span>            moveLeft: &#39;Nach links&#39;,
</span></span><span style="display:flex;"><span>            moveRight: &#39;Nach rechts&#39;,
</span></span><span style="display:flex;"><span>            download: &#39;Herunterladen&#39;,
</span></span><span style="display:flex;"><span>            fullscreen: &#39;Vollbild&#39;,
</span></span><span style="display:flex;"><span>            menu: &#39;Menü&#39;,
</span></span><span style="display:flex;"><span>            close: &#39;Schließen&#39;,
</span></span><span style="display:flex;"><span>            twoFingers: &#39;Benutze 2 Finger zum Navigieren.&#39;,
</span></span><span style="display:flex;"><span>            ctrlZoom: &#39;Benutze Strg und das Mausrad, um im Bild zu zoomen.&#39;,
</span></span><span style="display:flex;"><span>            loadError: &#39;Das Panorama kann nicht geladen werden.&#39;,
</span></span><span style="display:flex;"><span>          }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    });
</span></span><span style="display:flex;"><span>&lt;/script&gt;
</span></span></code></pre></div>
<h2 id="einbindung-per-shortcode" data-numberify>Einbindung per Shortcode<a class="anchor ms-1" href="#einbindung-per-shortcode"></a></h2>
<p>Und so sieht das im Ergebnis aus. Das verwendet Bild stammt von einem alten Blogbeitrag aus der Zeit, als das oben genannte WordPress-Plugin noch in meinem Blog verwendet wurde.</p>
<p>Ich hatte das damals mit der Foto-App eines Smartphones erstellt.</p>
<p>Die Einbindung in einem Blogbeitrag sieht so aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-jinja" data-lang="jinja"><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">&lt;</span> sphere src<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;20171019_360_baustelle_perouse_heimsheim.jpg&#34;</span> caption<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Eine Baustelle bei Perourse.&#34;</span> <span style="color:#f92672">&gt;</span><span style="color:#75715e">}}</span>
</span></span></code></pre></div><p>Und das Ergebnis (Screenshot):</p>
 <figure class="image-caption"><a href="2023-01-18-360-grad-beispiel-cover.webp"><picture><source type="webp" srcset="/2023/01/es-gibt-wieder-360-grad-fotos-in-meinem-foto-blog/2023-01-18-360-grad-beispiel-cover.webp" />
			         <img alt="Screenshot mit einem Foto einer Baustelle und unten den verschiedenen Bedienelementen wie links/rechts scrollen, Vollbild umschalten, einer Beschreibung und mehr." src="/2023/01/es-gibt-wieder-360-grad-fotos-in-meinem-foto-blog/2023-01-18-360-grad-beispiel-cover.webp" title="" width="790" height="491" loading="lazy" /></picture></a><figcaption>So sieht das Ergebnis aus.</figcaption></figure>

<h2 id="konfiguration-von-nginx" data-numberify>Konfiguration von Nginx<a class="anchor ms-1" href="#konfiguration-von-nginx"></a></h2>
<p>Da die <a  class='urlextern'  href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/img-src">CSP-Header</a> im Webserver relativ strikt gesetzt sind, hat das Nachladen der Fotos nicht funktioniert. Dazu musste ich im entsprechenden Bereich <code>blob:</code> erlauben:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#66d9ef">img-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">data:</span> <span style="color:#e6db74">blob:</span>;
</span></span></code></pre></div>
<h2 id="beispiele" data-numberify>Beispiele<a class="anchor ms-1" href="#beispiele"></a></h2>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content">2023-02-24: Es gibt jetzt ein neues Tag <a  href="/tags/360/">360</a> für solche 360°-Fotos.</div>
</div>


<p>Und hier die Links zu allen alten 360°-Fotos, die mit dem neuen Photo Sphere Viewer wieder angesehen werden können:</p>
<ul>
<li><a  href="/2017/09/360-foto-schnappschuss-000-waldweg/">Waldweg</a></li>
<li><a  href="/2017/09/360-foto-schnappschuss-001-neuer-belforter-platz-und-rathaus-in-leonberg/">Belforter Platz in Leonberg</a></li>
<li><a  href="/2017/09/360-foto-schnappschuss-001-sonne-und-landschaft/">Sonne und Landschaft</a></li>
<li><a  href="/2017/09/360-foto-schnappschuss-003-dorfplatz-in-hausen/">Dorfplatz in Hausen an der Würm</a></li>
<li><a  href="/2017/10/360-foto-snapshot-004-pfarrgarten-in-neuhausen-enzkreis/">Pfarrgarten in Neuhausen (Enzkreis)</a></li>
<li><a  href="/2017/10/360-foto-snapshot-005-baustelle/">Baustelle zwischen Perouse und Heimsheim</a></li>
<li><a  href="/2017/12/360-foto-snapshot-006-schnee-im-wald/">Schnee im Wald</a></li>
<li><a  href="/2018/03/360-snapshot-007-pforzheim-wartberg-bei-sonnenschein/">Wartberg in Pforzheim bei Sonnenschein</a></li>
<li><a  href="/2018/04/360-schnappschuss-zwischen-althengstett-und-moettlingen/">Schnappschuss zwischen Althengstett und Möttlingen</a></li>
</ul>

<h2 id="in-zukunft-bessere-qualität" data-numberify>In Zukunft bessere Qualität<a class="anchor ms-1" href="#in-zukunft-bessere-qualität"></a></h2>
<p>Früher hatte ich solche Fotos immer mit dem Smartphone und einer einfachen App gemacht. Da hatte man keinerlei Einfluss auf das Ergebnis. Dadurch ist die Qualität der Fotos sehr durchwachsen.</p>
<p>Aktuell scheint es keine freie Android-App für so etwas zu geben und die Foto-App meines Smartphones kann das leider nicht.</p>
<p>Daher habe ich mich entschieden, zukünftig die Fotos mit einem normalen Fotoapparat zu machen und diese mit der Software <a  class='urlextern'  href="https://hugin.sourceforge.io/">Hugin</a> zu einem 360°-Panorama zu verbinden.</p>

<h2 id="was-mir-noch-fehlt" data-numberify>Was mir noch fehlt<a class="anchor ms-1" href="#was-mir-noch-fehlt"></a></h2>

<h3 id="lagesensor" data-numberify>Lagesensor<a class="anchor ms-1" href="#lagesensor"></a></h3>
<p>Ich erinnere mich daran, dass der Lagesensor des Smartphones bei dem alten Plugin in WordPress ausgewertet wurde. So konnte man das Smartphone vor sich halten und in alle Richtungen drehen und konnte entsprechend die Richtung im 360°-Foto im Smartphone sehen.</p>
<p>Das wäre noch eine schöne Funktion. Vielleicht gibt es sie auch bereits und ich habe sie noch nicht gefunden.</p>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content">Update (2023-10-17): Mit dem aktuellen 360-Grad-Viewer im Blog ist das möglich, es gibt dafür ein Plugin.</div>
</div>



<h3 id="link-zum-originalbild" data-numberify>Link zum Originalbild<a class="anchor ms-1" href="#link-zum-originalbild"></a></h3>
<p>Es gibt zwar bereits einen Button, um das Panorama herunterzuladen, aber ich möchte irgendwo noch einen Link unter dem Betrachtungsfenster einfügen, sodass man das Originalbild im aktuellen Fenster öffnen kann, statt es herunterzuladen.</p>]]></content:encoded><enclosure url="https://natenom.de/2023/01/es-gibt-wieder-360-grad-fotos-in-meinem-foto-blog/2023-01-18-360-grad-beispiel-cover.webp" length="84472" type="image/webp"/></item><item><title>Neuerungen in Blog und Wiki</title><link>https://natenom.de/2022/12/neuerungen-in-blog-und-wiki/</link><pubDate>Thu, 01 Dec 2022 19:21:04 +0100</pubDate><guid>https://natenom.de/2022/12/neuerungen-in-blog-und-wiki/</guid><description>&lt;p>Es gibt mal wieder einige Änderungen in Blog und Wiki, die ich hier auflisten möchte. Ein paar kommen vom aktualisierten Theme (im Blog) und andere hat &lt;a class='urlextern' href="https://vrifox.cc">Vri&lt;/a> umgesetzt. Vielen Dank dafür. ☺️&lt;/p></description><content:encoded><![CDATA[<p>Es gibt mal wieder einige Änderungen in Blog und Wiki, die ich hier auflisten möchte. Ein paar kommen vom aktualisierten Theme (im Blog) und andere hat <a  class='urlextern'  href="https://vrifox.cc">Vri</a> umgesetzt. Vielen Dank dafür. ☺️</p>
<h2 id="blog" data-numberify>Blog<a class="anchor ms-1" href="#blog"></a></h2>

<h3 id="datenschutzkonformes-iframe" data-numberify>Datenschutzkonformes iframe<a class="anchor ms-1" href="#datenschutzkonformes-iframe"></a></h3>
<p>Der Entwickler des Themes, das ich hier verwende, hat einen neuen Shortcode <a  class='urlextern'  href="https://hbs.razonyang.com/v1/en/docs/shortcodes/iframe/">iframe</a> implementiert. Der externe Inhalt wird erst geladen, nachdem der Benutzer auf &ldquo;Laden&rdquo; geklickt hat.</p>
<p>Es ist möglich, vorgegebene Texte für die Schaltfläche und auch für den Beschreibungstext anzupassen.</p>
<p>Hier ein Beispiel:</p>
<pre tabindex="0"><code class="language-hugo" data-lang="hugo">{{&lt; iframe src=&#34;http://umap.openstreetmap.fr/en/map/natenoms-buros_642889#11/48.8503/8.9209&#34; trigger=&#34;manual&#34; loadButtonText=&#34;Externe Karte laden&#34; loadInfo=&#34;Ein Klick hierdrauf lädt Daten von OpenStreetMap. Der Anbieter erhält dadurch deine IP-Adresse und weitere Daten von dir.&#34; &gt;}}
</code></pre><p>So sieht das dann aus:</p>
 <figure class="image-caption"><a href="images/2022-12-01-iframe.webp"><picture>
                <source type="image/webp" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe_hu225f2876a3388e707474404cfb1dc742_7564_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe_hu225f2876a3388e707474404cfb1dc742_7564_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe_hu225f2876a3388e707474404cfb1dc742_7564_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Screenshot vom noch nicht geladenen iframe mit den genannten Infotexten." srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe_hu225f2876a3388e707474404cfb1dc742_7564_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe_hu225f2876a3388e707474404cfb1dc742_7564_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe_hu225f2876a3388e707474404cfb1dc742_7564_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe_hu225f2876a3388e707474404cfb1dc742_7564_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="469" /></picture></a><figcaption>Noch wurde nichts geladen.</figcaption></figure>
 <figure class="image-caption"><a href="images/2022-12-01-iframe-geladen.webp"><picture>
                <source type="image/webp" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe-geladen_hu115bc8ef8656f5f54c686cbf10514d87_110152_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe-geladen_hu115bc8ef8656f5f54c686cbf10514d87_110152_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe-geladen_hu115bc8ef8656f5f54c686cbf10514d87_110152_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Screenshot vom geladenen iframe mit der OpenStreetMap-Karte." srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe-geladen_hu115bc8ef8656f5f54c686cbf10514d87_110152_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe-geladen_hu115bc8ef8656f5f54c686cbf10514d87_110152_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe-geladen_hu115bc8ef8656f5f54c686cbf10514d87_110152_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-iframe-geladen_hu115bc8ef8656f5f54c686cbf10514d87_110152_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="469" /></picture></a><figcaption>Der externe Inhalt wurde geladen. <a  class='urlextern'  href="https://www.openstreetmap.org/copyright">Copyright by OpenStreetMap Contributors</a></figcaption></figure>

<h3 id="seiten-im-suchindex-verstecken" data-numberify>Seiten im Suchindex verstecken<a class="anchor ms-1" href="#seiten-im-suchindex-verstecken"></a></h3>
<p>Setzt man im Front Matter eines Blogbeitrags den Parameter <code>index: false</code>, so wird diese Seite nicht in den Suchindex aufgenommen und kann somit auch nicht über die Suche des Blogs gefunden werden.</p>
<p>Externe Suchmaschinen können die Seite natürlich trotzdem finden.</p>

<h3 id="ähnliche-beiträge" data-numberify>Ähnliche Beiträge<a class="anchor ms-1" href="#ähnliche-beiträge"></a></h3>
<p>Die Liste der ähnlichen Beitrag oberhalb von Blogbeiträgen ist jetzt ansehnlicher geworden, da ich das Datumsformat dort gekürzt habe.</p>
<p>Oben vorher, unten nachher:</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-old_hu40d3a03acdbe2edd12b89de96afd6305_39948_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-old_hu40d3a03acdbe2edd12b89de96afd6305_39948_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-old_hu40d3a03acdbe2edd12b89de96afd6305_39948_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-old_hu40d3a03acdbe2edd12b89de96afd6305_39948_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-old_hu40d3a03acdbe2edd12b89de96afd6305_39948_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-old_hu40d3a03acdbe2edd12b89de96afd6305_39948_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-old_hu40d3a03acdbe2edd12b89de96afd6305_39948_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="281" /></picture><figcaption></figcaption></figure><p>
</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-new_hu88ba997eef9ee589540ad010f98dd5ee_33702_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-new_hu88ba997eef9ee589540ad010f98dd5ee_33702_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-new_hu88ba997eef9ee589540ad010f98dd5ee_33702_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-new_hu88ba997eef9ee589540ad010f98dd5ee_33702_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-new_hu88ba997eef9ee589540ad010f98dd5ee_33702_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-new_hu88ba997eef9ee589540ad010f98dd5ee_33702_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/12/neuerungen-in-blog-und-wiki/images/2022-10-21-related-posts-new_hu88ba997eef9ee589540ad010f98dd5ee_33702_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="299" /></picture><figcaption></figcaption></figure><p>
</p>

<h3 id="unter-der-haube" data-numberify>Unter der Haube<a class="anchor ms-1" href="#unter-der-haube"></a></h3>
<p>Vri hat eine zusätzliche Konfiguration zum Blog hinzugefügt, die nur greift, wenn man die Seite lokal mit <code>hugo server</code> baut. Dann werden nur die Blogbeiträge aus dem aktuellen Jahr gerendert, sodass das Rendern insgesamt nur noch 4 statt 20 Sekunden dauert.</p>
<p>Wenn man neue Blogbeiträge schreibt oder einfach nur etwas am Stil im Blog anpassen möchte, dann kann man so viel Zeit sparen.</p>

<h2 id="wiki" data-numberify>Wiki<a class="anchor ms-1" href="#wiki"></a></h2>

<h3 id="navigationsleiste" data-numberify>Navigationsleiste<a class="anchor ms-1" href="#navigationsleiste"></a></h3>
<p>Statt die aktuelle und hervorgehobene Seite in der Navigationsleiste komplett in Blau zu hinterlegen, hat Vri das jetzt mal ordentlich und schön gemacht. Das Blau hatte historische Gründe, denn die Navigation im alten Wiki sah genauso aus.</p>
<p>Vorher und nachher:</p>
<p></p><figure class="image-caption"><picture><source type="webp" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-sidebar-old.webp" />
			         <img alt="Alte Sidebar" src="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-sidebar-old.webp" title="" width="255" height="335" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>
<p></p><figure class="image-caption"><picture><source type="webp" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-sidebar-new.webp" />
			         <img alt="Neue Sidebar" src="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-sidebar-new.webp" title="" width="255" height="335" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>

<h3 id="interaktive-navigation" data-numberify>Interaktive Navigation<a class="anchor ms-1" href="#interaktive-navigation"></a></h3>
<p>Zusätzlich habe ich den Navigationsbaum so umgestellt, dass er wieder dynamisch ist, d. h. man kann jederzeit alle Bereiche öffnen.</p>
<p>Da das Wiki eine statische Website ist, muss deshalb jedoch der gesamte Navigationsbaum in jeder einzelnen Seite des Wikis enthalten sein und somit wird jede Seite im Wiki um circa 4,8 kB größer. Im Fall von <a  href="/docs/muellsammeln/">Müllsammeln</a> z. B. 33,2 kB statt sonst 28,4 kB.</p>
<p>Die Unterschiede von <a  class='urlextern'  href="https://pagespeed.web.dev/">Googles Pagespeed</a> zwischen dynamischem und statischem Navigationsbaum sind zudem marginal bis gar nicht vorhanden. Für die Desktop-Ansicht kann man keine Unterschiede feststellen, nur in der mobilen Ansicht gibt es leichte Unterschiede. Hier zwei Screenshots von der Auswertung der mobilen Ansicht:</p>
 <figure class="image-caption float-left"><a href="images/2022-11-29-wiki-statischer-navibaum-mobil.webp"><picture><source type="webp" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-11-29-wiki-statischer-navibaum-mobil_hud6d2c5350607372290eb1bb74e1cd2fa_155404_200x0_resize_q95_h2_catmullrom_2.webp" />
			         <img alt="Screenshot der Ergebnisse von Google Pagespeed." src="/2022/12/neuerungen-in-blog-und-wiki/images/2022-11-29-wiki-statischer-navibaum-mobil_hud6d2c5350607372290eb1bb74e1cd2fa_155404_200x0_resize_q95_h2_catmullrom_2.webp" title="" width="200" height="545" loading="lazy" /></picture></a><figcaption>Ergebnisse für den statischen Navigationsbaum.</figcaption></figure>
 <figure class="image-caption float-left"><a href="images/2022-11-29-wiki-interaktiver-navibaum-mobil.webp"><picture><source type="webp" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-11-29-wiki-interaktiver-navibaum-mobil_hu182c3e936a829fd31a65c6bbde0b0fbd_177914_200x0_resize_q95_h2_catmullrom_2.webp" />
			         <img alt="Screenshot der Ergebnisse von Google Pagespeed." src="/2022/12/neuerungen-in-blog-und-wiki/images/2022-11-29-wiki-interaktiver-navibaum-mobil_hu182c3e936a829fd31a65c6bbde0b0fbd_177914_200x0_resize_q95_h2_catmullrom_2.webp" title="" width="200" height="594" loading="lazy" /></picture></a><figcaption>Ergebnisse für den interaktiven Navigationsbaum.</figcaption></figure>
<div style="clear: both;"></div>


<p>Die Größe des DOM (Document Object Model) wird von Pagespeed im Wiki generell moniert. Mit statischem Navigationsbaum sind es 1982 Elemente und mit dynamischem Navigationsbaum sind es 3094 Elemente.</p>
<p>Ein weiterer Nachteil des dynamischen Navigationsbaums ist, dass alle Seiten im Wiki nicht mehr so lange gecached werden können. Denn sobald sich irgendwo im Wiki der Titel einer Seite oder deren Anordnung ändert, muss jede Seite im Browser des Besuchers neu geladen werden, um den Navigationsbaum korrekt anzuzeigen.</p>
<p>Ich denke, mit den kleinen Nachteilen kann man leben und der dynamische Navigationsbaum ist meiner Ansicht nach ein großer Zugewinn für die Nutzbarkeit des Wikis. Außerdem ändere ich ja nicht ständig Seiten im Wiki.</p>

<h3 id="shortcodes" data-numberify>Shortcodes<a class="anchor ms-1" href="#shortcodes"></a></h3>
<p>Vri hat das SCSS von Shortcodes umstrukturiert und konnte somit Shortcodes generell auf <code>max-width: 80%</code> einstellen, sodass sie nicht mehr breiter sind als der restliche Inhalt einer Seite.</p>
<p>Zudem werden Überschriften von Hinweisboxen (Update, Tipp, Warnung, …) im Feed jetzt groß geschrieben, wie auch auf der Website.</p>

<h3 id="suchfunktion" data-numberify>Suchfunktion<a class="anchor ms-1" href="#suchfunktion"></a></h3>
<p>Auch hat Vri rechts oben im Wiki ein Formularfeld für die Suchfunktion des Wikis eingefügt, sodass man nicht mehr umständlich erst auf &ldquo;Suche&rdquo; klicken und dann den Suchbegriff auf der anschließend ladenden Seite eingeben muss.</p>
<p></p><figure class="image-caption"><picture><source type="webp" srcset="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-suchleiste-wiki.webp" />
			         <img alt="Screenshot der Suchleiste im Wiki" src="/2022/12/neuerungen-in-blog-und-wiki/images/2022-12-01-suchleiste-wiki.webp" title="" width="584" height="62" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>

<h3 id="kein-html-quelltext-mehr" data-numberify>Kein HTML-Quelltext mehr<a class="anchor ms-1" href="#kein-html-quelltext-mehr"></a></h3>
<p>Ich habe im Wiki <code>unsafe=false</code> eingestellt. Somit wird HTML-Quelltext innerhalb einer Seite generell nicht mehr gerendert, sondern nur entfernt. Im Zuge des Umzugs von Dokuwiki hatte ich das auf <code>true</code> gesetzt, damit erst einmal alle Inhalte sichtbar waren. Mittlerweile habe ich alle Inhalte ins Markdown-Format überführt, bis auf eine Liste mit (teils veralteter) Software. In der Hugo-Doku gibt es weitere Informationen zu den Einstellungen fürs <a  class='urlextern'  href="https://gohugo.io/getting-started/configuration-markup/">Rendern in Hugo</a> (nach <code>unsafe</code> suchen).</p>]]></content:encoded><enclosure url="https://natenom.de/2022/12/neuerungen-in-blog-und-wiki/cover.webp" length="7564" type="image/webp"/></item><item><title>JavaScript für Kommentarfunktion in eigene Datei ausgelagert</title><link>https://natenom.de/2022/11/javascript-fuer-kommentarfunktion-in-eigene-datei-ausgelagert/</link><pubDate>Sun, 06 Nov 2022 17:25:07 +0100</pubDate><guid>https://natenom.de/2022/11/javascript-fuer-kommentarfunktion-in-eigene-datei-ausgelagert/</guid><description><![CDATA[<p>Vri hat heute das System für <a  href="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/">Kommentare hier im Blog</a> verbessert.</p>
<p>Vielen Dank dafür. ☺️</p>]]></description><content:encoded><![CDATA[<p>Vri hat heute das System für <a  href="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/">Kommentare hier im Blog</a> verbessert.</p>
<p>Vielen Dank dafür. ☺️</p>
<p>Sie hat das ganze JavaScript-Zeugs in eine eigene Datei ausgelagert und den Code angepasst. Dieser wird natürlich nur eingebunden, wenn im Front Matter die Kommentarfunktion aktiviert ist.</p>

<h2 id="javascript" data-numberify>JavaScript<a class="anchor ms-1" href="#javascript"></a></h2>
<p>Hier die Datei <a  href="/my_js/mastodon-comments.js">mastodon-comments.js</a>.</p>

<h2 id="hugo-template" data-numberify>Hugo-Template<a class="anchor ms-1" href="#hugo-template"></a></h2>
<p>Das Template (<code>layouts/partials/post/comments/custom.html</code>) für Hugo sieht jetzt so aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go-html-template" data-lang="go-html-template"><span style="display:flex;"><span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">with</span> <span style="color:#a6e22e">.Params.comments</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;masto-comments datenschutz&#34;</span>&gt;
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span>&gt;&lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/ueber/datenschutz/#kommentare&#34;</span>&gt;(Datenschutzinformationen zu Kommentaren via Mastodon)&lt;/<span style="color:#f92672">a</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-wrapper&#34;</span> <span style="color:#a6e22e">data-mastodon-host</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.host</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">&#34;</span> <span style="color:#a6e22e">data-mastodon-username</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.username</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">&#34;</span> <span style="color:#a6e22e">data-mastodon-id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.id</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">&#34;</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-buttons&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-outline-primary&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.host</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">/interact/</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.id</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">?type=reply&#34;</span> <span style="color:#a6e22e">target</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;_blank&#34;</span>&gt;Kommentar schreiben&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-outline-primary&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.host</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">/@</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.username</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">/</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.id</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">&#34;</span> <span style="color:#a6e22e">target</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;_blank&#34;</span>&gt;Tröt öffnen&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-list&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;load-comments&#34;</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-primary&#34;</span>&gt;Kommentare anzeigen (via Mastodon)&lt;/<span style="color:#f92672">button</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">noscript</span>&gt;&lt;<span style="color:#f92672">p</span>&gt;Du benötigst JavaScript, um die Kommentare hier anzeigen zu lassen.&lt;/<span style="color:#f92672">p</span>&gt;&lt;/<span style="color:#f92672">noscript</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/my_js/purify.min.js&#34;</span>&gt;&lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/my_js/mastodon-comments.js&#34;</span>&gt;&lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">else</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments nocomment&#34;</span>&gt;Kommentare sind für diesen Blogbeitrag (noch) nicht aktiviert. Nach der Veröffentlichung eines Blogbeitrags dauert das in der Regel noch ein paar Minuten.&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">end</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span>&gt;&lt;<span style="color:#f92672">details</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments email&#34;</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">summary</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments email-summary&#34;</span>&gt;Alternative: Anmerkung per E-Mail&lt;/<span style="color:#f92672">summary</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments emailcontent&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">p</span>&gt;Du kannst mir Anmerkungen zum Blogbeitrag per E-Mail schicken, &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#39;mailto:user@tld.org?subject=Anmerkung zum Blog&amp;body=Hallo Natenom. Zum Blogbeitrag &#34;</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">$.Page.Permalink</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">&#34; habe ich eine Anmerkung:&#39;</span>&gt;wenn du hier klickst&lt;/<span style="color:#f92672">a</span>&gt;. Der Inhalt davon bleibt privat und wird nicht hier im Kommentarbereich veröffentlicht.&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">details</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span></code></pre></div>
<h2 id="css" data-numberify>CSS<a class="anchor ms-1" href="#css"></a></h2>
<p>Beim CSS hat sich nichts geändert und das <a  href="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/#css">gibt es hier</a>.</p>]]></content:encoded></item><item><title>Kommentare in meinem statischen Blog via Mastodon</title><link>https://natenom.de/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/</link><pubDate>Tue, 01 Nov 2022 20:01:42 +0100</pubDate><guid>https://natenom.de/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/</guid><description><![CDATA[<p>Seit dem Umzug meines Blogs <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">von WordPress hin zu einer statischen Website</a> Anfang des Jahres hatte ich ganz leicht, aber wirklich nur ganz bisschen die Kommentarfunktion vermisst. Es gab hier sowieso nur selten Kommentare. Eine Interaktionsmöglichkeit ist aber trotzdem schön.</p>
<p>Deshalb haben wir heute die Möglichkeit im Blog integriert, in dafür freigeschalteten Blogbeiträgen per Mastodon zu kommentieren.</p>]]></description><content:encoded><![CDATA[<p>Seit dem Umzug meines Blogs <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">von WordPress hin zu einer statischen Website</a> Anfang des Jahres hatte ich ganz leicht, aber wirklich nur ganz bisschen die Kommentarfunktion vermisst. Es gab hier sowieso nur selten Kommentare. Eine Interaktionsmöglichkeit ist aber trotzdem schön.</p>
<p>Deshalb haben wir heute die Möglichkeit im Blog integriert, in dafür freigeschalteten Blogbeiträgen per Mastodon zu kommentieren.</p>
<p>Vielen Dank an die Menschen, die mir auf <a  class='urlextern'  href="https://social.anoxinon.de/@natenom/109263561189792179">Mastodon auf meine Frage hin</a> antworteten. Darüber konnte ich <a  class='urlextern'  href="https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/">diesen Blogbeitrag</a> finden, der das Vorgehen für Hugo erklärt.</p>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content">2022-11-06: Die Einbindung von Kommentaren aus Mastodon erfolgt jetzt transparent, <a  href="/2022/11/transparenz-fuer-kommentare-im-blog-via-mastodon/">siehe hier</a>.</div>
</div>



<h2 id="was-ist-mastodon" data-numberify>Was ist Mastodon?<a class="anchor ms-1" href="#was-ist-mastodon"></a></h2>
<p><a  class='urlextern'  href="https://de.wikipedia.org/wiki/Mastodon_%28Software%29">Mastodon</a> ist ein Teil vom <a  class='urlextern'  href="https://de.wikipedia.org/wiki/Fediverse">Fediverse</a>. Jeder Mensch kann dort einen Account bei einem beliebigen Anbieter einer Instanz erstellen.</p>
<p>Man kann sich das vorstellen wie bei E-Mails. Jeder Mensch hat einen anderen E-Mail-Anbieter und kann trotzdem mit jedem anderen Menschen auf der Welt kommunizieren.</p>

<h2 id="vorab-wie-es-funktioniert" data-numberify>Vorab: Wie es funktioniert<a class="anchor ms-1" href="#vorab-wie-es-funktioniert"></a></h2>

<h3 id="für-menschen-die-kommentieren" data-numberify>Für Menschen, die kommentieren<a class="anchor ms-1" href="#für-menschen-die-kommentieren"></a></h3>
<p>Entweder nach unten scrollen oder rechts auf die Sprechblase (rechts oben im Blogbeitrag) klicken. Dann landet man hier:</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="258" /></picture><figcaption></figcaption></figure><p>
</p>
<p>Dann &ldquo;Kommentare anzeigen (via Mastodon)&rdquo; anklicken:</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="310" /></picture><figcaption></figcaption></figure><p>
</p>
<p>Oder einen der oberen Links anklicken, um zu kommentieren oder den Tröt in einem neuen Tab zu öffnen.</p>
<p>Um zu kommentieren, benötigt man entweder einen Mastodon-Account, einen Friendica-Account oder irgend einen anderen Account eines Dienstes des Fediverse.</p>

<h3 id="für-mich-als-betreiber-des-blogs" data-numberify>Für mich als Betreiber des Blogs<a class="anchor ms-1" href="#für-mich-als-betreiber-des-blogs"></a></h3>
<ol>
<li>Blogbeitrag veröffentlichen.</li>
<li>Link zum Blogbeitrag auf Mastodon tröten.</li>
<li>Im veröffentlichen Blogbeitrag im <code>Front Matter</code> einfügen:</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">comments</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">host</span>: <span style="color:#ae81ff">social.anoxinon.de</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">username</span>: <span style="color:#ae81ff">natenom</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">id</span>: <span style="color:#ae81ff">123456789</span><span style="color:#ae81ff">…</span>
</span></span></code></pre></div><ol start="4">
<li>Blogbeitrag erneut veröffentlichen mit dem geänderten <code>Front Matter</code>.</li>
</ol>
<p>Die ID ist die lange Zahl am Ende des Links eines Tröts (Toots).</p>
<p>Ich habe bewusst entschieden, den Host immer im Front Matter des Blogbeitrag zu hinterlegen, statt ihn global in der Konfiguration von Hugo zu hinterlegen. Denn es könnte sein, dass ich zukünftig eine andere Instanz verwenden werde und dann sollten bisherige Kommentare weiterhin zugreifbar bleiben.</p>
<p>Der Nachteil dieser Lösung ist, dass es immer etwas dauert (da der Blog neu generiert wird), bis Kommentare im Blog eingebunden werden können, obwohl es bereits einen Tröt auf Mastodon gibt. Das macht aber nichts, da man trotzdem bereits auf Mastodon antworten kann und diese Antworten später auch über den Blog sichtbar sind.</p>
<p><em>(Man könnte auch kurz vor dem Veröffentlichen des Beitrags bereits einen Mastodon-Tröt zum Blogbeitrag schreiben, müsste dann aber das Vorschaubild und den Titel manuell eintragen und würde nur wenig Zeit sparen.)</em></p>

<h2 id="umsetzung-für-meinen-blog" data-numberify>Umsetzung für meinen Blog<a class="anchor ms-1" href="#umsetzung-für-meinen-blog"></a></h2>
<p>Hier die Anleitung, wie wir das mit dem hier verwendeten Theme &ldquo;<a  class='urlextern'  href="https://github.com/razonyang/hugo-theme-bootstrap">Hugo Theme Bootstrap</a>&rdquo; umgesetzt haben.</p>
<p>Wir haben den Quelltext des oben bereits genannten <a  class='urlextern'  href="https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/">Blogbeitrags</a> an den Blog angepasst.</p>
<div class="shortcode-notice info">
    <div class="shortcode-notice-title info">
        Info</div>
    <div class="notice-content">Vielen Dank an Vri, die dafür gesorgt hat, dass das Ergebnis schön aussieht.</div>
</div>



<h3 id="template" data-numberify>Template<a class="anchor ms-1" href="#template"></a></h3>
<p>Dieser Quelltext kommt in die Datei <code>layouts/partials/post/comments/custom.html</code>:</p>
<div class="shortcode-details">
    <details>
    <summary>Quelltext der Datei</summary>
        <div class="shortcode-details content"><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>{{ with .Params.comments }}
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;masto-comments datenschutz&#34;</span>&gt;
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span>&gt;&lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/ueber/datenschutz/#kommentare&#34;</span>&gt;(Datenschutzinformationen zu Kommentaren via Mastodon)&lt;/<span style="color:#f92672">a</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-wrapper&#34;</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-buttons&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-outline-primary&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://{{ .host }}/interact/{{ .id }}?type=reply&#34;</span> <span style="color:#a6e22e">target</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;_blank&#34;</span>&gt;Kommentar schreiben&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-outline-primary&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://{{ .host }}/@{{ .username }}/{{ .id }}&#34;</span> <span style="color:#a6e22e">target</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;_blank&#34;</span>&gt;Tröt öffnen&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-list&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;load-comments&#34;</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-primary&#34;</span>&gt;Kommentare anzeigen (via Mastodon)&lt;/<span style="color:#f92672">button</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">noscript</span>&gt;&lt;<span style="color:#f92672">p</span>&gt;Du benötigst JavaScript, um die Kommentare hier anzeigen zu lassen.&lt;/<span style="color:#f92672">p</span>&gt;&lt;/<span style="color:#f92672">noscript</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/my_js/purify.min.js&#34;</span>&gt;&lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>  document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;load-comments&#39;</span>).<span style="color:#a6e22e">addEventListener</span>(<span style="color:#e6db74">&#39;click&#39;</span>, <span style="color:#a6e22e">loadComment</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">unsafe</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">unsafe</span>
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&amp;/g</span>, <span style="color:#e6db74">&#39;&amp;amp;&#39;</span>)
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&lt;/g</span>, <span style="color:#e6db74">&#39;&amp;lt;&#39;</span>)
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&gt;/g</span>, <span style="color:#e6db74">&#39;&amp;gt;&#39;</span>)
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&#34;/g</span>, <span style="color:#e6db74">&#39;&amp;quot;&#39;</span>)
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&#39;/g</span>, <span style="color:#e6db74">&#39;&amp;#039;&#39;</span>);
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">loadComment</span>() {
</span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;load-comments&#39;</span>).<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;Lade …&#39;</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">fetch</span>(<span style="color:#e6db74">&#39;https://{{ .host }}/api/v1/statuses/{{ .id }}/context&#39;</span>)
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">response</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">response</span>.<span style="color:#a6e22e">json</span>();
</span></span><span style="display:flex;"><span>      })
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">data</span>) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">data</span>[<span style="color:#e6db74">&#39;descendants&#39;</span>] <span style="color:#f92672">&amp;&amp;</span>
</span></span><span style="display:flex;"><span>        Array.<span style="color:#a6e22e">isArray</span>(<span style="color:#a6e22e">data</span>[<span style="color:#e6db74">&#39;descendants&#39;</span>]) <span style="color:#f92672">&amp;&amp;</span> 
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">data</span>[<span style="color:#e6db74">&#39;descendants&#39;</span>].<span style="color:#a6e22e">length</span> <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) {
</span></span><span style="display:flex;"><span>        document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;mastodon-comments-list&#39;</span>).<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">data</span>[<span style="color:#e6db74">&#39;descendants&#39;</span>].<span style="color:#a6e22e">forEach</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">reply</span>) {
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span>);
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">emojis</span>.<span style="color:#a6e22e">forEach</span>(<span style="color:#a6e22e">emoji</span> =&gt; {
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span>.<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">`:</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">shortcode</span><span style="color:#e6db74">}</span><span style="color:#e6db74">:`</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">`&lt;img src=&#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">static_url</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; alt=&#34;Emoji </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">shortcode</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; height=&#34;20&#34; width=&#34;20&#34; /&gt;`</span>);
</span></span><span style="display:flex;"><span>          });
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">replyCreationDate</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Date(<span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">created_at</span>).<span style="color:#a6e22e">toLocaleDateString</span>(<span style="color:#66d9ef">undefined</span>, { <span style="color:#a6e22e">day</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span>, <span style="color:#a6e22e">month</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;short&#39;</span>, <span style="color:#a6e22e">hour</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span>, <span style="color:#a6e22e">minute</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span> });
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">replyCreationDateLong</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Date(<span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">created_at</span>).<span style="color:#a6e22e">toLocaleDateString</span>(<span style="color:#66d9ef">undefined</span>, { <span style="color:#a6e22e">day</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span>, <span style="color:#a6e22e">month</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;long&#39;</span>, <span style="color:#a6e22e">year</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span>, <span style="color:#a6e22e">hour</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span>, <span style="color:#a6e22e">minute</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span> });
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">mastodonComment</span> <span style="color:#f92672">=</span>
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">`&lt;div class=&#34;mastodon-comment&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            &lt;div class=&#34;avatar&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              &lt;img src=&#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">avatar_static</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; alt=&#34;&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            &lt;/div&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            &lt;div class=&#34;content&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              &lt;div class=&#34;author-wrapper&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                &lt;a class=&#34;author&#34; href=&#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">url</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; rel=&#34;nofollow&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                  &lt;span class=&#34;author-name&#34;&gt;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&lt;/span&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                  &lt;span class=&#34;author-handle&#34;&gt;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">acct</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">&lt;/span&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                &lt;/a&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                &lt;a class=&#34;date&#34; href=&#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">uri</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; rel=&#34;nofollow&#34; title=&#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">replyCreationDateLong</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                  </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">replyCreationDate</span><span style="color:#e6db74">}</span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                &lt;/a&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              &lt;/div&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              &lt;div class=&#34;mastodon-comment-content&#34;&gt;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">content</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&lt;/div&gt; 
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            &lt;/div&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          &lt;/div&gt;`</span>;
</span></span><span style="display:flex;"><span>          document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;mastodon-comments-list&#39;</span>).<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">DOMPurify</span>.<span style="color:#a6e22e">sanitize</span>(<span style="color:#a6e22e">mastodonComment</span>, {<span style="color:#e6db74">&#39;RETURN_DOM_FRAGMENT&#39;</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">true</span>}));
</span></span><span style="display:flex;"><span>        });
</span></span><span style="display:flex;"><span>      } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>          document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;mastodon-comments-list&#39;</span>).<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&lt;p&gt;Keine Kommentare gefunden&lt;/p&gt;&#34;</span>;
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    });
</span></span><span style="display:flex;"><span>  };
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>{{ else }}
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments nocomment&#34;</span>&gt;Kommentare sind für diesen Blogbeitrag (noch) nicht aktiviert. Nach der Veröffentlichung eines Blogbeitrags dauert das in der Regel noch ein paar Minuten.&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>{{ end }}
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span>&gt;&lt;<span style="color:#f92672">details</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments email&#34;</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">summary</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments email-summary&#34;</span>&gt;Alternative: Anmerkung per E-Mail&lt;/<span style="color:#f92672">summary</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments emailcontent&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">p</span>&gt;Du kannst mir Anmerkungen zum Blogbeitrag per E-Mail schicken, &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#39;mailto:user@tld.org?subject=Anmerkung zum Blog&amp;body=Hallo Natenom. Zum Blogbeitrag &#34;{{ $.Page.Permalink }}&#34; habe ich eine Anmerkung:&#39;</span>&gt;wenn du hier klickst&lt;/<span style="color:#f92672">a</span>&gt;. Der Inhalt davon bleibt privat und wird nicht hier im Kommentarbereich veröffentlicht.&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">details</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span></code></pre></div></div>
    </details>
</div>

<div class="shortcode-notice info">
    <div class="shortcode-notice-title info">
        Info</div>
    <div class="notice-content">Der Inhalt des <a  class='urlextern'  href="https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/">Blogbeitrags</a>, von dem ich den oberen Quelltext entnommen habe, ist lizensiert unter Creative Commons BY-SA 4.0. Daher gehe ich davon aus, dass auch der dort gelistete Quelltext unter diese Lizenz fällt. Sollte dem nicht so sein, so bitte ich um eine Nachricht. Entsprechend steht der hier angepasste Quelltext unter der selben Lizenz zur Verfügung.</div>
</div>



<h3 id="css" data-numberify>CSS<a class="anchor ms-1" href="#css"></a></h3>
<p>Das SCSS kommt in die Datei <code>assets/main/scss/_custom.scss</code>:</p>
<div class="shortcode-details">
    <details>
    <summary>CSS für die Kommentarfunktion</summary>
        <div class="shortcode-details content"><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scss" data-lang="scss"><span style="display:flex;"><span><span style="color:#75715e">/* Für Kommentar, die von Mastodon geladen werden. :) */</span>
</span></span><span style="display:flex;"><span>#mastodon-comments-wrapper {
</span></span><span style="display:flex;"><span>	#mastodon-comments-buttons {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">margin-bottom</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span><span style="color:#ae81ff">.5</span><span style="color:#66d9ef">em</span>;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	#mastodon-comments-list {
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">button</span>#load-comments {
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">border</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">border-radius</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span><span style="color:#e6db74">#{</span>$prefix<span style="color:#e6db74">}</span>border-radius);
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">background-color</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span><span style="color:#e6db74">#{</span>$prefix<span style="color:#e6db74">}</span>btn-border-color);
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">margin</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span> auto;
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">.mastodon-comment</span> {
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">display</span><span style="color:#f92672">:</span> grid;
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">grid-gap</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">1</span><span style="color:#66d9ef">em</span>;
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">grid-template-columns</span><span style="color:#f92672">:</span> auto <span style="color:#ae81ff">1</span><span style="color:#66d9ef">fr</span>;
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">.avatar</span> <span style="color:#f92672">img</span> {
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">border-radius</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span><span style="color:#e6db74">#{</span>$prefix<span style="color:#e6db74">}</span>border-radius);
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">position</span><span style="color:#f92672">:</span> relative;
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">top</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">6</span><span style="color:#66d9ef">px</span>;
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">width</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">48</span><span style="color:#66d9ef">px</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">.content</span> {
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">.author-wrapper</span> {
</span></span><span style="display:flex;"><span>					<span style="color:#a6e22e">.author</span> {
</span></span><span style="display:flex;"><span>						<span style="color:#a6e22e">.author-name</span> {
</span></span><span style="display:flex;"><span>							<span style="color:#a6e22e">font-weight</span><span style="color:#f92672">:</span> bold;
</span></span><span style="display:flex;"><span>						}
</span></span><span style="display:flex;"><span>						<span style="color:#66d9ef">&amp;</span><span style="color:#a6e22e">:hover</span> {
</span></span><span style="display:flex;"><span>							<span style="color:#a6e22e">color</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span>hbs-link-color);
</span></span><span style="display:flex;"><span>							<span style="color:#a6e22e">text-decoration</span><span style="color:#f92672">:</span> none;
</span></span><span style="display:flex;"><span>							<span style="color:#a6e22e">.author-name</span> {
</span></span><span style="display:flex;"><span>								<span style="color:#a6e22e">color</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span>hbs-link-hover-color);
</span></span><span style="display:flex;"><span>								<span style="color:#a6e22e">text-decoration</span><span style="color:#f92672">:</span> underline;
</span></span><span style="display:flex;"><span>							}
</span></span><span style="display:flex;"><span>						}
</span></span><span style="display:flex;"><span>					}
</span></span><span style="display:flex;"><span>					<span style="color:#a6e22e">.date</span> {
</span></span><span style="display:flex;"><span>						<span style="color:#a6e22e">float</span><span style="color:#f92672">:</span> right;
</span></span><span style="display:flex;"><span>					}
</span></span><span style="display:flex;"><span>				}
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div></div>
    </details>
</div>


<h3 id="javascript" data-numberify>JavaScript<a class="anchor ms-1" href="#javascript"></a></h3>
<p>Es wird die Bibliothek <a  class='urlextern'  href="https://github.com/cure53/DOMPurify">DomPurify</a> benötigt. Die steht unter einer freien <a  class='urlextern'  href="https://github.com/cure53/DOMPurify/blob/main/LICENSE">Lizenz</a> zur Verfügung und kann somit verwendet werden.</p>
<p>Die Datei habe ich heruntergeladen und nach <code>static/my_js/purify.min.js</code> abgelegt.</p>

<h3 id="header-auf-dem-webserver" data-numberify>Header (auf dem Webserver)<a class="anchor ms-1" href="#header-auf-dem-webserver"></a></h3>
<p>Auf meinem Server sind die Header für den Blog relativ streng eingestellt.</p>
<p>Damit JavaScript Daten von extern laden darf, musste der Header in der Nginx-Konfiguration von:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#66d9ef">Eadd_header</span> <span style="color:#e6db74">Content-Security-Policy</span> <span style="color:#e6db74">&#34;default-src</span> <span style="color:#e6db74">&#39;none&#39;</span>; <span style="color:#66d9ef">font-src</span> <span style="color:#e6db74">&#39;self&#39;</span>; <span style="color:#66d9ef">connect-src</span> <span style="color:#e6db74">&#39;self&#39;</span>; <span style="color:#66d9ef">form-action</span> <span style="color:#e6db74">&#39;self&#39;</span>; <span style="color:#66d9ef">img-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">data:</span> <span style="color:#e6db74">https://*.natenom.com</span> <span style="color:#e6db74">https://*.natenom.de</span>; <span style="color:#66d9ef">media-src</span> <span style="color:#e6db74">https://*.natenom.com</span> <span style="color:#e6db74">https://*.natenom.de</span>; <span style="color:#66d9ef">script-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">&#39;unsafe-inline&#39;</span>; <span style="color:#66d9ef">style-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">&#39;unsafe-inline&#39;</span>; <span style="color:#66d9ef">frame-ancestors</span> <span style="color:#e6db74">&#39;none&#39;</span>;<span style="color:#66d9ef">&#34;</span>;
</span></span></code></pre></div><p>geändert werden nach:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#66d9ef">Eadd_header</span> <span style="color:#e6db74">Content-Security-Policy</span> <span style="color:#e6db74">&#34;default-src</span> <span style="color:#e6db74">&#39;none&#39;</span>; <span style="color:#66d9ef">font-src</span> <span style="color:#e6db74">&#39;self&#39;</span>; <span style="color:#66d9ef">connect-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">https://social.anoxinon.de</span>; <span style="color:#66d9ef">form-action</span> <span style="color:#e6db74">&#39;self&#39;</span>; <span style="color:#66d9ef">img-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">https://social.anoxinon.de</span> <span style="color:#e6db74">data:</span> <span style="color:#e6db74">https://*.natenom.com</span> <span style="color:#e6db74">https://*.natenom.de</span>; <span style="color:#66d9ef">media-src</span> <span style="color:#e6db74">https://*.natenom.com</span> <span style="color:#e6db74">https://*.natenom.de</span>; <span style="color:#66d9ef">script-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">&#39;unsafe-inline&#39;</span>; <span style="color:#66d9ef">style-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">&#39;unsafe-inline&#39;</span>; <span style="color:#66d9ef">frame-ancestors</span> <span style="color:#e6db74">&#39;none&#39;</span>;<span style="color:#66d9ef">&#34;</span>;
</span></span></code></pre></div><p>Sowohl im Bereich <code>connect-src</code> als auch bei <code>img-src</code> musste die Domain der Mastodon-Instanz eingetragen werden.</p>

<h3 id="datenschutz" data-numberify>Datenschutz<a class="anchor ms-1" href="#datenschutz"></a></h3>
<p>Die Informationen zum Datenschutz wurden um den Bereich &ldquo;Kommentare&rdquo; erweitert, <a  href="/ueber/datenschutz/#kommentare">siehe hier</a>.</p>

<h2 id="was-noch-fehlt" data-numberify>Was noch fehlt<a class="anchor ms-1" href="#was-noch-fehlt"></a></h2>

<h3 id="tröts-für-kommentarfunktion-nicht-automatisch-löschen-lassen" data-numberify>Tröts für Kommentarfunktion nicht automatisch löschen lassen<a class="anchor ms-1" href="#tröts-für-kommentarfunktion-nicht-automatisch-löschen-lassen"></a></h3>
<p>Meine Mastodon-Tröts werden bei mir derzeit nach einem Monat automatisch gelöscht. Kommentare würden so nach dieser Zeit nicht mehr angezeigt werden.</p>
<p>Es ist jedoch in Mastodon einstellbar, dass bestimmte Tröts nicht gelöscht werden, z. B. solche, die man zu den Lesezeichen hinzugefügt hat. Dadurch könnte ich die Lesezeichen-Funktion aber nicht mehr für andere Inhalte benutzen.</p>
<p>Eine Alternative wäre, die Automatisch-Löschen-Funktion von Mastodon nicht mehr zu verwenden und stattdessen ein externes Script (<a  href="/2021/03/alte-toots-eines-mastodon-accounts-automatisiert-loeschen/">siehe hier</a>). Dieses Tool könnte man so konfigurieren, dass es keine Toots löscht, die ein bestimmtes Hashtag beinhalten.</p>

<h3 id="eingerückt" data-numberify>Eingerückt<a class="anchor ms-1" href="#eingerückt"></a></h3>
<p>Es wäre schön, wenn auch auf der Seite erkennbar wäre, auf welchen Mastodon-Tröt genau jemand geantwortet hat. Die Reihenfolge passt zwar schon, aber die Einrückungen fehlen noch.</p>]]></content:encoded></item><item><title>Eigene Pseudo-Galerie für Hugo als Ersatz für Hugo-Shortcode-Gallery</title><link>https://natenom.de/2022/09/eigene-pseudo-galerie-fuer-hugo-als-ersatz-fuer-hugo-shortcode-gallery/</link><pubDate>Tue, 06 Sep 2022 03:42:05 +0200</pubDate><guid>https://natenom.de/2022/09/eigene-pseudo-galerie-fuer-hugo-als-ersatz-fuer-hugo-shortcode-gallery/</guid><description>&lt;p>Als ich Anfang des Jahres diesen Blog hier von &lt;a href="/2022/03/umzug-dokuwiki-hugo-1-vorarbeiten/">WordPress zu Hugo umzog&lt;/a>, war mir die Funktion einer Bildergalerie sehr wichtig. Schließlich gab es in meinem Blog sehr viele Bildergalerien.&lt;/p></description><content:encoded><![CDATA[<p>Als ich Anfang des Jahres diesen Blog hier von <a  href="/2022/03/umzug-dokuwiki-hugo-1-vorarbeiten/">WordPress zu Hugo umzog</a>, war mir die Funktion einer Bildergalerie sehr wichtig. Schließlich gab es in meinem Blog sehr viele Bildergalerien.</p>
<h2 id="hugo-shortcode-gallery" data-numberify>Hugo-Shortcode-Gallery<a class="anchor ms-1" href="#hugo-shortcode-gallery"></a></h2>
<p>Dafür verwendete ich <a  class='urlextern'  href="https://github.com/mfg92/hugo-shortcode-gallery">hugo-shortcode-gallery</a>. Hierbei werden die von Hugo generierten Vorschaubilder per JavaScript geladen und bei einem Klick darauf werden in einer Lightbox die Originale angezeigt. Letzteres war zuletzt in Firefox ziemlich lahm.</p>
<p>Eine Galerie fügt man mit diesem Shortcode ein:</p>
<pre><code>{{&lt; gallery match=&quot;images/*&quot; &gt;}}
</code></pre>
<p>Damit werden alle Bilder im Unterverzeichnis <code>images/</code> des <code>Page Bundle</code> zur Galerie hinzugefügt. So kann man auch mehrere Galerien in einem Blogbeitrag mittels verschiedenen Unterverzeichnissen erstellen lassen.</p>

<h2 id="einzelbilder-statt-galerie" data-numberify>Einzelbilder statt Galerie<a class="anchor ms-1" href="#einzelbilder-statt-galerie"></a></h2>
<p>Über die Zeit hat sich jedoch für mich herauskristallisiert, dass ich Galerien gar nicht benötige. Stattdessen finde ich es jetzt besser, Bilder einzeln einzubinden, sodass man auch zu jedem Bild eine Beschreibung und einen Alt-Text hinterlegen kann. Und auch eine Lightbox will ich nicht mehr haben, Bilder werden per Klick direkt geöffnet.</p>
<p>Schon seit längerem nutze ich daher gar keine Galerien mehr.</p>
<p>Da aber in circa 90 Blogbeiträgen bereits die anfangs genutzten Galerien enthalten sind, wollte ich mir die Arbeit ersparen, diese manuell umschreiben zu müssen.</p>

<h2 id="eigene-pseudogalerie-statt-hugo-shortcode-gallery" data-numberify>Eigene Pseudogalerie statt Hugo-Shortcode-Gallery<a class="anchor ms-1" href="#eigene-pseudogalerie-statt-hugo-shortcode-gallery"></a></h2>
<p>Deshalb habe ich die Hugo-Shortcode-Gallery aus dem Projekt entfernt und einen gleichnamigen eigenen Shortcode erstellt, der die Bilder per Markdown einfügt und mit dem Original verlinkt, so <a  href="/ueber/mitmachen/#einzelbilder-per-markdown-syntax">wie hier beschrieben</a>.</p>
<p>Man kann somit die alte Form weiterverwenden und für</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c" data-lang="c"><span style="display:flex;"><span>{{<span style="color:#f92672">&lt;</span> gallery match<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;images/*&#34;</span> <span style="color:#f92672">&gt;</span>}}
</span></span></code></pre></div><p>wird durch alle passenden Bilder iteriert und dann wird das hier eingefügt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>[<span style="color:#f92672">![</span>](<span style="color:#a6e22e">images/bild1.jpg</span>)](images/bild1.jpg)
</span></span><span style="display:flex;"><span>[<span style="color:#f92672">![</span>](<span style="color:#a6e22e">images/bild2.jpg</span>)](images/bild2.jpg)
</span></span><span style="display:flex;"><span>…
</span></span></code></pre></div><p>Das nächste Rendern des Blogs dauerte nach der Änderung sehr lange, schließlich mussten für hunderte Bilder in insgesamt 90 Galerien verschiedene Bildgrößen generiert werden. Für meinen Blog waren das so zusätzlich 1,6 GB an neuen Bildateien.</p>
<p>Diese Änderung ist jetzt im Blog und auch im Wiki implementiert. Ich musste in der <code>config.toml</code> des Wikis den <code>timeout</code> etwas erhöhen, da es dort Galerien mit extrem vielen Bildern gibt.</p>

<h2 id="alt-und-neu-im-vergleich" data-numberify>Alt und neu im Vergleich<a class="anchor ms-1" href="#alt-und-neu-im-vergleich"></a></h2>
<p>Links die alte Galerie und rechts die neue.</p>
 <figure class="image-caption float-left"><a href="2022-09-06-blog-alte-galerie.png"><picture><source type="webp" srcset="/2022/09/eigene-pseudo-galerie-fuer-hugo-als-ersatz-fuer-hugo-shortcode-gallery/2022-09-06-blog-alte-galerie_hub50ef4cb36e35f912a3e960b4f2e72a6_522831_350x0_resize_q95_h2_catmullrom_3.webp" />
			         <img alt="Screenshot der alten Galerie mit kleinen Vorschaubildern." src="/2022/09/eigene-pseudo-galerie-fuer-hugo-als-ersatz-fuer-hugo-shortcode-gallery/2022-09-06-blog-alte-galerie_hub50ef4cb36e35f912a3e960b4f2e72a6_522831_350x0_resize_q95_h2_catmullrom_3.webp" title="" width="350" height="661" loading="lazy" /></picture></a><figcaption>Alte Galerie.</figcaption></figure>
 <figure class="image-caption float-left"><a href="2022-09-06-blog-neue-pseudo-galerie-cover.png"><picture><source type="webp" srcset="/2022/09/eigene-pseudo-galerie-fuer-hugo-als-ersatz-fuer-hugo-shortcode-gallery/2022-09-06-blog-neue-pseudo-galerie-cover_hued90b20beeb03bfd7de479d9f64597de_427108_350x0_resize_q95_h2_catmullrom_3.webp" />
			         <img alt="Screenshot der alten Galerie mit normalgroßen Vorschaubildern." src="/2022/09/eigene-pseudo-galerie-fuer-hugo-als-ersatz-fuer-hugo-shortcode-gallery/2022-09-06-blog-neue-pseudo-galerie-cover_hued90b20beeb03bfd7de479d9f64597de_427108_350x0_resize_q95_h2_catmullrom_3.webp" title="" width="350" height="661" loading="lazy" /></picture></a><figcaption>Neue Pseudo-Galerie.</figcaption></figure>
<div style="clear: both;"></div>


<p>Hier der <a  href="/2015/07/ein-paar-bilder-von-den-schoenen-bauten-unseres-minecraft-servers/">Link zum Blogbeitrag mit den schönen Minecraft-Bauten</a>.</p>

<h2 id="passt" data-numberify>Passt<a class="anchor ms-1" href="#passt"></a></h2>
<p>Das passt so für mich. Es gibt eine Abhängigkeit weniger, um die man sich ganz selten mal kümmern muss und die eigene Lösung benötigt auch kein JavaScript mehr.</p>
<p>Und falls ich mal in einen Blogbeitrag ganz viele Bilder als reinen Bilddump werfen möchte, dann kann ich das weiterhin mit dem entsprechenden Shortcode machen. Bevorzugt sind aber weiterhin Bilder mit Bildbeschreibung im Alt-Text.</p>]]></content:encoded><enclosure url="https://natenom.de/2022/09/eigene-pseudo-galerie-fuer-hugo-als-ersatz-fuer-hugo-shortcode-gallery/2022-09-06-blog-neue-pseudo-galerie-cover.png" length="427108" type="image/png"/></item><item><title>Suchfunktion im Blog massiv beschleunigt (und wie man Beiträge von der Suche ausschließen kann)</title><link>https://natenom.de/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/</link><pubDate>Sun, 01 May 2022 15:11:04 +0200</pubDate><guid>https://natenom.de/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/</guid><description><![CDATA[<p>Obwohl im Blog als auch im <a  href="https://wiki.natenom.de/">Wiki</a> dieselbe Suche (FuseJS) verwendet wird, dauert es im Blog deutlich länger bis die Ergebnisse angezeigt werden, als im Wiki, wo die Ergebnisse fast sofort zu sehen sind.</p>
<p>Meine erst Vermutung war, dass es unter anderem daran liegt, dass es im Blog um die 2600 Beiträge gibt, während es im Wiki &ldquo;nur&rdquo; 578 Seiten sind. Daraus ergibt sich für den Blog eine Dateigröße für die <code>index.json</code>-Datei von über 3,8 MiB, während es im Wiki 0,87 MiB sind.</p>
<p>Die genannte json-Datei muss der Client-Browser herunterladen, um darin dann per JavaScript lokal die Suche anzuwenden. Und bei einer Datei um 3,8 MiB dauert das dann sehr lange.</p>
<p>Erst später stellte ich fest, dass es weit mehr Optimierungspotential durch die Konfiguration der Suche via FuseJS gibt.</p>]]></description><content:encoded><![CDATA[<p>Obwohl im Blog als auch im <a  href="https://wiki.natenom.de/">Wiki</a> dieselbe Suche (FuseJS) verwendet wird, dauert es im Blog deutlich länger bis die Ergebnisse angezeigt werden, als im Wiki, wo die Ergebnisse fast sofort zu sehen sind.</p>
<p>Meine erst Vermutung war, dass es unter anderem daran liegt, dass es im Blog um die 2600 Beiträge gibt, während es im Wiki &ldquo;nur&rdquo; 578 Seiten sind. Daraus ergibt sich für den Blog eine Dateigröße für die <code>index.json</code>-Datei von über 3,8 MiB, während es im Wiki 0,87 MiB sind.</p>
<p>Die genannte json-Datei muss der Client-Browser herunterladen, um darin dann per JavaScript lokal die Suche anzuwenden. Und bei einer Datei um 3,8 MiB dauert das dann sehr lange.</p>
<p>Erst später stellte ich fest, dass es weit mehr Optimierungspotential durch die Konfiguration der Suche via FuseJS gibt.</p>
<p>Es gibt also zwei Ansätze für die Optimierung der Suchfunktion im Blog.</p>
<ul>
<li><a  href="#a_fusejs-optimieren">FuseJS Einstellungen optimieren</a></li>
<li><a  href="#a_beitraege-ausschliessen">Suchindex verkleinern durch Auschließen von Beiträgen</a></li>
</ul>
<p>Letzteres kann man auch umsetzen, wenn man bestimmte Inhalte generell aus der Suche ausschließen möchte.</p>

<h2 id="a_fusejs-optimieren" data-numberify>FuseJS optimieren (das größte Potential)<a class="anchor ms-1" href="#a_fusejs-optimieren"></a></h2>
<p>Es gibt viele Einstellungen für FuseJS. Die Wirkung der meisten Einstellungen verstehe ich nicht wirklich. Ich habe also erst einmal im Blog das selbe eingestellt wie auch in der Suche im Wiki:</p>
<pre><code>shouldSort: true,
includeMatches: true,
threshold: 0.0,
tokenize:true,
location: 0,
distance: 100,
maxPatternLength: 32,
minMatchCharLength: 3,
</code></pre>
<p><em>(Die Syntax für die Einstellungen im Wiki ist eine andere als im Blog. Denn dort sind die Einstellunen nicht im Front Matter hinterlegt, sondern direkt im JavaScript, da ich die <a  href="/2022/03/mein-neues-wiki-mit-hugo-neue-suche-und-andere-optimierungen/">Originalsuchfunktion im Wiki selbst durch FuseJS ersetzt hatte</a>)</em></p>
<p>Im Blog wird daraus in der Datein <code>config.toml</code> im Bereich <code>params</code>:</p>
<pre><code>search.fuse.threshold = 0.0
search.fuse.location = 0
search.fuse.distance = 100
search.fuse.minMatchCharLength = 3
</code></pre>
<p>Hier die <a  class='urlextern'  href="https://hbs.razonyang.com/en/docs/layouts/search/">Hilfeseite zu FuseJS, wie es im Blog verwendet wird</a>.</p>
<p>Hier die vollständige Liste der Einstellungen für FuseJS <a  class='urlextern'  href="https://fusejs.io/api/options.html">gibt es hier</a>.</p>

<h3 id="ergebnis-der-vom-wiki-übernommenen-einstellungen" data-numberify>Ergebnis der vom Wiki übernommenen Einstellungen<a class="anchor ms-1" href="#ergebnis-der-vom-wiki-übernommenen-einstellungen"></a></h3>
<p>Vor den Änderungen hatte eine Suche nach z. B. <a  href="/search/?q=ettlingen%20und%20zur%c3%bcck">&ldquo;ettlingen und zurück&rdquo;</a> im Chromium-Browser 20 Sekunden gedauert und es wurden 1741 Ergebnisse gefunden, von denen nur das erste Ergebnis alle Begriffe beinhaltete.</p>
<p>Die vielen weiteren Ergebnise sind vermutlich dem Fuzzy-Search geschuldet. Aber damit kann ich persönlich eh nichts anfangen, das konnte also eh weg.</p>
<p></p><figure class="image-caption"><a href="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-alte-suche-blog.png"><picture>
                <source type="image/webp" srcset="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-alte-suche-blog_hu96fb3dbd42b5654a9bcde5e47dda7aec_174593_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-alte-suche-blog_hu96fb3dbd42b5654a9bcde5e47dda7aec_174593_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-alte-suche-blog_hu96fb3dbd42b5654a9bcde5e47dda7aec_174593_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Suchergebnisse im Blog nach den Begriffen &amp;rsquo;ettlingen und zurück&amp;rsquo;. Das erste Ergebnis passt, der Rest beinhaltet nicht alle Begriffe." srcset="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-alte-suche-blog_hu96fb3dbd42b5654a9bcde5e47dda7aec_174593_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-alte-suche-blog_hu96fb3dbd42b5654a9bcde5e47dda7aec_174593_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-alte-suche-blog_hu96fb3dbd42b5654a9bcde5e47dda7aec_174593_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-alte-suche-blog_hu96fb3dbd42b5654a9bcde5e47dda7aec_174593_816x0_resize_q95_h2_catmullrom_3.webp" title="Suche im Blog mit alten Einstellungen." loading="lazy" width="816" height="567" /></picture></a><figcaption>Suche im Blog mit alten Einstellungen.</figcaption></figure><p>
</p>
<p>Nach der Änderung der Sucheinstellungen dauert die Suche weniger als 1 Sekunde und es wird nur das einzig passende Ergebnis angezeigt:</p>
<p></p><figure class="image-caption"><a href="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog.png"><picture>
                <source type="image/webp" srcset="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog_huea1de37256a471ce19793b95172bd4dd_145748_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog_huea1de37256a471ce19793b95172bd4dd_145748_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog_huea1de37256a471ce19793b95172bd4dd_145748_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Suchergebnisse im Blog nach den Begriffen &amp;rsquo;ettlingen und zurück&amp;rsquo;. Das einzigen beiden Ergebnisse passen." srcset="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog_huea1de37256a471ce19793b95172bd4dd_145748_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog_huea1de37256a471ce19793b95172bd4dd_145748_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog_huea1de37256a471ce19793b95172bd4dd_145748_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog_huea1de37256a471ce19793b95172bd4dd_145748_816x0_resize_q95_h2_catmullrom_3.webp" title="Suche im Blog mit neuen Einstellungen." loading="lazy" width="816" height="389" /></picture></a><figcaption>Suche im Blog mit neuen Einstellungen.</figcaption></figure><p>
</p>
<p>Bei anderen Suchbegriffen, wie z. B. &ldquo;Staatsanwaltschaft&rdquo;, wurden wegen Fuzzy-Search Ergebnisse gefunden, die den Begriff &ldquo;Staatsanwaltschaft&rdquo; gar nicht beinhalteten sondern nur eine Teilmenge der selben Buchstaben in anderen Konstellationen und Wörtern. So war ein Ergebnis z. B. der Blogbeitrag mit dem Titel &ldquo;<a  href="/2016/12/fotografie-landschaft/">Fotografie: Landschaft</a>&rdquo;, der nur Fotos und gar keinen Text beinhaltete.</p>

<h3 id="a_erweiterte-suche" data-numberify>Erweiterte Suche aktiviert<a class="anchor ms-1" href="#a_erweiterte-suche"></a></h3>
<p>Ich habe im Blog für FuseJS auch gleich die erweiterte Suche aktiviert, denn damit kann man tolle Dinge machen, wie man <a  class='urlextern'  href="https://fusejs.io/examples.html#extended-search">hier nachlesen kann</a>.</p>
<p>So findet man z. B. alle Blogbeiträge, die mit dem String &ldquo;Fotos&rdquo; beginnen:</p>
<pre><code>^Fotos
</code></pre>
<p>Oder mit dem String &ldquo;werfen&rdquo; enden:</p>
<pre><code>werfen$
</code></pre>
<p>Mit den alten Einstellungen für die Suche findet diese für &ldquo;werfen&rdquo; 2216 Ergebnisse und die meisten beinhalten den Begriff nicht einmal.</p>
<p>Leerzeichen werden als <code>AND</code> verwendet und für <code>OR</code> nutzt man Pipe-Zeichen (<code>|</code>).</p>
<p>Zur Aktivierung der erweiterten Suche fügt man in die Datei <code>config.toml</code> im Bereich <code>[params]</code> ein:</p>
<pre><code>search.fuse.useExtendedSearch = true
</code></pre>
<p>Man findet zusätzlich noch ein paar mehr relevante Ergebnisse auch ohne explizite Verwendung der erweiterten Möglichkeiten.</p>

<h3 id="ergebnis-der-optimierung-der-fusejs-einstellungen" data-numberify>Ergebnis der Optimierung der FuseJS-Einstellungen<a class="anchor ms-1" href="#ergebnis-der-optimierung-der-fusejs-einstellungen"></a></h3>
<p>Jetzt bin ich auch im Blog mit der Suchfunktion sehr zufrieden. Ich habe bisher alles gefunden, wonach ich testweise gesucht habe, und das ohne viele, viele weitere unnötige Suchergebnisse.</p>
<p>Dazu gibt es jetzt noch erweiterte Suchfunktionen, wie oben beschrieben. Damit muss ich mich nur erinnern, welche Begriffe ich in einem Beitrag verwendet haben könnte.</p>
<p>Zum Beispiel hatte ich mal den Spruch &ldquo;rechter Reifen Mittelstreifen&rdquo; verwendet, den ich jetzt so auch finde. Zusätzlich kann ich Beiträge finden, die genau diesen String enthalten ODER mit dem String &ldquo;bußgeldstelle&rdquo; beginnen mit <code>&quot;rechter reifen mittelstreifen&quot;|^bußgeldstelle</code> und <a  href="/search/?q=%22rechter%20reifen%20mittelstreifen%22%7C%5Ebu%C3%9Fgeldstelle">das Ergebnis beinhaltet 17 Blogbeiträge</a>:</p>
<p></p><figure class="image-caption"><a href="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-2.png"><picture>
                <source type="image/webp" srcset="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-2_huc3fccf615613d0c1192e671f097a39d3_224448_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-2_huc3fccf615613d0c1192e671f097a39d3_224448_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-2_huc3fccf615613d0c1192e671f097a39d3_224448_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-2_huc3fccf615613d0c1192e671f097a39d3_224448_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-2_huc3fccf615613d0c1192e671f097a39d3_224448_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-2_huc3fccf615613d0c1192e671f097a39d3_224448_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-2_huc3fccf615613d0c1192e671f097a39d3_224448_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="543" /></picture></a><figcaption></figcaption></figure><p>
</p>
<p>Sucht man nur nach &ldquo;bußgeldstelle&rdquo;, dann werden 26 Blogbeiträge gefunden.</p>
<p>Und die Suche ist jetzt schnell, die Ergebnisse sind immer nach circa einer Sekunde da (in Chromium, in Firefox aus dem selben Rechner nach ca. 3 bis 4 Sekunden..</p>
<p>Und als mir dann noch einfiel, dass die Bußgeldstelle mir gegenüber mal die Kombination &ldquo;scharf rechts&rdquo; verwendete, kann ich auch danach noch suchen mit dem Suchbegriff <code>bußgeldstelle &quot;scharf rechts&quot;</code> und <a  href="/search/?q=bu%C3%9Fgeldstelle%20%22scharf%20rechts%22">das Ergebnis ist</a>:</p>
<p></p><figure class="image-caption"><a href="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-scharf-rechts.png"><picture>
                <source type="image/webp" srcset="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-scharf-rechts_hu0a35505a144d92ce3c9f8bef6a0934c1_96275_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-scharf-rechts_hu0a35505a144d92ce3c9f8bef6a0934c1_96275_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-scharf-rechts_hu0a35505a144d92ce3c9f8bef6a0934c1_96275_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-scharf-rechts_hu0a35505a144d92ce3c9f8bef6a0934c1_96275_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-scharf-rechts_hu0a35505a144d92ce3c9f8bef6a0934c1_96275_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-scharf-rechts_hu0a35505a144d92ce3c9f8bef6a0934c1_96275_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/images/2022-05-01-neue-suche-blog-scharf-rechts_hu0a35505a144d92ce3c9f8bef6a0934c1_96275_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="272" /></picture></a><figcaption></figcaption></figure><p>
</p>
<p>Kurz: Die neue Suche rockt 👍 😄</p>

<h2 id="a_beitraege-ausschliessen" data-numberify>Bestimmte Dinge aus der Suche ausschließen (wenig Potenzial)<a class="anchor ms-1" href="#a_beitraege-ausschliessen"></a></h2>
<p>Mein erster Ansatz war es, bestimmte Dinge aus dem Suchindex auszuschließen. Erst danach probierte ich die <a  href="#a_fusejs-optimieren">Optimierung der Einstellungen von FuseJS</a> aus, das letzlich zum erhofften Performanceschub führte.</p>
<p>Ich will das hier aber trotzdem stehen lassen, da es vielleicht je nach Website nützlich sein kann, bestimmte Kategorien oder alte Blogbeiträge vom Suchindex auszuschließen.</p>

<h3 id="kategorien-ausschließen" data-numberify>Kategorien ausschließen<a class="anchor ms-1" href="#kategorien-ausschließen"></a></h3>
<p>Man kann Kategorien ausschließen, die sowieso wenig gesucht werden, weil sie z. B. fast nur Fotos enthalten oder auch Kategorien, zu denen es schon lange keine Inhalte mehr gab, wie hier im Blog z. B. &ldquo;Spiele&rdquo;.</p>

<h3 id="alte-beiträge-ausschließen" data-numberify>Alte Beiträge ausschließen<a class="anchor ms-1" href="#alte-beiträge-ausschließen"></a></h3>
<p>Genau. Siehe unten. 😊</p>

<h3 id="inhalt-teilweise-aus-der-suche-entfernen" data-numberify>Inhalt (teilweise) aus der Suche entfernen<a class="anchor ms-1" href="#inhalt-teilweise-aus-der-suche-entfernen"></a></h3>
<p>Derzeit beinhaltet die json-Datei noch den kompletten Inhalt eines Blogbeitrags. Das könnte man ändern und nur noch z. B. Tags, Kategorien, Daten aus dem Front Matter und vielleicht noch die ersten 250 Zeichen des Inhalts jedes Blogbeitrags in die json-Datei einfügen.</p>
<p>Das gefällt mir aber nicht, da man dann auch nur Dinge findet, die in diesen ersten 250 Zeichen enthalten sind.</p>

<h3 id="umsetzung-an-einem-beispiel" data-numberify>Umsetzung an einem Beispiel<a class="anchor ms-1" href="#umsetzung-an-einem-beispiel"></a></h3>
<p>Hier beispielhaft eine Erläuterung, wie man Blogbeiträge von der Suche (bzw. von der Eintragung in die <code>index.json</code>) ausschließt, die die folgenden Bedingungen erfüllen.</p>
<ul>
<li>Beiträge, die älter sind als 5 Jahre.</li>
<li>Beiträge, die zu den folgenden Kategorien gehören:
<ul>
<li><a  href="/categories/fotografie/">Fotografie</a></li>
<li><a  href="/categories/mumble/">Mumble</a></li>
<li><a  href="/categories/mumble/">Musik</a></li>
<li><a  href="/categories/spiele/">Spiele</a></li>
</ul>
</li>
</ul>
<p>Zur Umsetzung muss man die Datei <code>themes/hugo-theme-bootstrap/layouts/index.json</code> nach <code>layouts/index.json</code> kopieren und wie folgt anpassen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-jinja" data-lang="jinja"><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>.Scratch.Add <span style="color:#e6db74">&#34;index&#34;</span> slice -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> range .Site.RegularPages -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">if</span> ge <span style="color:#f92672">(</span>sub now.Year .Date.Year<span style="color:#f92672">)</span> <span style="color:#ae81ff">4</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">or</span> <span style="color:#f92672">(</span><span style="color:#66d9ef">in</span> .Params.categories <span style="color:#e6db74">&#34;Musik&#34;</span><span style="color:#f92672">)</span> <span style="color:#f92672">(</span><span style="color:#66d9ef">in</span> .Params.categories <span style="color:#e6db74">&#34;Fotografie&#34;</span><span style="color:#f92672">)</span> <span style="color:#f92672">(</span><span style="color:#66d9ef">in</span> .Params.categories <span style="color:#e6db74">&#34;Mumble&#34;</span><span style="color:#f92672">)</span> <span style="color:#f92672">(</span><span style="color:#66d9ef">in</span> .Params.categories <span style="color:#e6db74">&#34;Spiele&#34;</span><span style="color:#f92672">)</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">else</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>date <span style="color:#f92672">:=</span> .Date.Format <span style="color:#960050;background-color:#1e0010">$</span>.Site.Params.dateFormat -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>title <span style="color:#f92672">:=</span> .Title <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">if</span> <span style="color:#960050;background-color:#1e0010">$</span>.Site.Params.titleCase -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>            <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>title <span style="color:#f92672">=</span> title <span style="color:#960050;background-color:#1e0010">$</span>title -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> end -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>img <span style="color:#f92672">:=</span> <span style="color:#e6db74">&#34;&#34;</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">if</span> .Params.Images -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>img <span style="color:#f92672">=</span> index .Params.Images <span style="color:#ae81ff">0</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">absURL</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">else</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>images <span style="color:#f92672">:=</span> .Resources.ByType <span style="color:#e6db74">&#34;image&#34;</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>featured <span style="color:#f92672">:=</span> <span style="color:#960050;background-color:#1e0010">$</span>images.GetMatch <span style="color:#e6db74">&#34;*feature*&#34;</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">not</span> <span style="color:#960050;background-color:#1e0010">$</span>featured <span style="color:#75715e">}}{{</span> <span style="color:#960050;background-color:#1e0010">$</span>featured <span style="color:#f92672">=</span> <span style="color:#960050;background-color:#1e0010">$</span>images.GetMatch <span style="color:#e6db74">&#34;{*cover*,*thumbnail*}&#34;</span> <span style="color:#75715e">}}{{</span> end -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">with</span> <span style="color:#960050;background-color:#1e0010">$</span>featured -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>            <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>img <span style="color:#f92672">=</span> <span style="color:#960050;background-color:#1e0010">$</span>featured.Permalink -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> end -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> end -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>item <span style="color:#f92672">:=</span> <span style="color:#f92672">(</span>dict <span style="color:#e6db74">&#34;title&#34;</span> <span style="color:#960050;background-color:#1e0010">$</span>title <span style="color:#e6db74">&#34;tags&#34;</span> .Params.tags <span style="color:#e6db74">&#34;categories&#34;</span> .Params.categories <span style="color:#e6db74">&#34;series&#34;</span> .Params.series <span style="color:#e6db74">&#34;content&#34;</span> .Plain <span style="color:#e6db74">&#34;permalink&#34;</span> .Permalink <span style="color:#e6db74">&#34;date&#34;</span> <span style="color:#960050;background-color:#1e0010">$</span>date <span style="color:#e6db74">&#34;img&#34;</span> <span style="color:#960050;background-color:#1e0010">$</span>img<span style="color:#f92672">)</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>.Scratch.Add <span style="color:#e6db74">&#34;index&#34;</span> <span style="color:#960050;background-color:#1e0010">$</span>item -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">{{</span> end <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> end -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>.Scratch.Get <span style="color:#e6db74">&#34;index&#34;</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">uniq</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">jsonify</span> -<span style="color:#75715e">}}</span></span></span></code></pre></div>
<p>Um einen Hinweis auf der Suchseite einfügen zu können, kopiert man die Datei <code>themes/hugo-theme-bootstrap/layouts/_default/search.html</code> nach <code>layouts/_default/search.html</code> und trägt z. B. ein:</p>
<pre><code>&lt;p&gt;&lt;a href=&quot;/ueber/suche/&quot;&gt;Hinweis: Einige Blogbeiträge sind von der Suche ausgeschlossen. Für Details hier klicken.&lt;/a&gt;&lt;/p&gt;
</code></pre>

<h3 id="ergebnis-der-optimierung-via-weglassen" data-numberify>Ergebnis der Optimierung via Weglassen<a class="anchor ms-1" href="#ergebnis-der-optimierung-via-weglassen"></a></h3>
<p>Im Ergebnis wurde die index.json statt 3,8 MiB nur noch ca. 1,4 MiB groß. Ohne <a  href="#a_fusejs-optimieren">Optimierung der Sucheinstellungen von FuseJS</a> wurde das aber nur etwas schneller.</p>]]></content:encoded><enclosure url="https://natenom.de/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/cover.png" length="174624" type="image/png"/></item><item><title>Änderungen im Blog und im Wiki</title><link>https://natenom.de/2022/04/aenderungen-im-blog-und-im-wiki/</link><pubDate>Sat, 09 Apr 2022 04:42:36 +0200</pubDate><guid>https://natenom.de/2022/04/aenderungen-im-blog-und-im-wiki/</guid><description>&lt;p>Wir (Vri und ich) haben wieder einiges im Blog und auch im Wiki verschönert. Okay, ich war nur dabei und habe gemeckert.&lt;/p></description><content:encoded><![CDATA[<p>Wir (Vri und ich) haben wieder einiges im Blog und auch im Wiki verschönert. Okay, ich war nur dabei und habe gemeckert.</p>
<h2 id="top-bar" data-numberify>Top Bar<a class="anchor ms-1" href="#top-bar"></a></h2>
<p>Die TopBars von Blog und neuem Wiki sind jetzt angeglichen und es wird das einfarbige Logo verwendet, das auch noch etwas größer ist und als SVG vorliegt. Zudem wurden beide bezüglich Schrift und Höhe einander angeglichen.</p>

<h3 id="blog" data-numberify>Blog<a class="anchor ms-1" href="#blog"></a></h3>
<p></p><figure class="image-caption"><a href="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-vorher.png"><picture>
                <source type="image/webp" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-vorher_hu0ffa6d36dc1f7649fea560b6292e6c5d_11138_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-vorher_hu0ffa6d36dc1f7649fea560b6292e6c5d_11138_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-vorher_hu0ffa6d36dc1f7649fea560b6292e6c5d_11138_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Vorher" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-vorher_hu0ffa6d36dc1f7649fea560b6292e6c5d_11138_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-vorher_hu0ffa6d36dc1f7649fea560b6292e6c5d_11138_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-vorher_hu0ffa6d36dc1f7649fea560b6292e6c5d_11138_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-vorher_hu0ffa6d36dc1f7649fea560b6292e6c5d_11138_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="43" /></picture></a><figcaption></figcaption></figure><p>
</p>
<p></p><figure class="image-caption"><a href="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-nachher.png"><picture>
                <source type="image/webp" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-nachher_hu59ccb290e46f8f04d0d10b1c2cc7ca1f_10695_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-nachher_hu59ccb290e46f8f04d0d10b1c2cc7ca1f_10695_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-nachher_hu59ccb290e46f8f04d0d10b1c2cc7ca1f_10695_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Nachher" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-nachher_hu59ccb290e46f8f04d0d10b1c2cc7ca1f_10695_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-nachher_hu59ccb290e46f8f04d0d10b1c2cc7ca1f_10695_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-nachher_hu59ccb290e46f8f04d0d10b1c2cc7ca1f_10695_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-blog-nachher_hu59ccb290e46f8f04d0d10b1c2cc7ca1f_10695_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="43" /></picture></a><figcaption></figcaption></figure><p>
</p>

<h3 id="wiki" data-numberify>Wiki<a class="anchor ms-1" href="#wiki"></a></h3>
<p></p><figure class="image-caption"><a href="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-vorher.png"><picture>
                <source type="image/webp" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-vorher_hu9e1319bda7615346a4de5ff4a3df919c_14259_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-vorher_hu9e1319bda7615346a4de5ff4a3df919c_14259_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-vorher_hu9e1319bda7615346a4de5ff4a3df919c_14259_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Vorher" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-vorher_hu9e1319bda7615346a4de5ff4a3df919c_14259_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-vorher_hu9e1319bda7615346a4de5ff4a3df919c_14259_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-vorher_hu9e1319bda7615346a4de5ff4a3df919c_14259_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-vorher_hu9e1319bda7615346a4de5ff4a3df919c_14259_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="142" /></picture></a><figcaption></figcaption></figure><p>
</p>
<p></p><figure class="image-caption"><a href="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-nachher.png"><picture>
                <source type="image/webp" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-nachher_hucc985d2dd04d0fed65973a566d222fcc_13204_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-nachher_hucc985d2dd04d0fed65973a566d222fcc_13204_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-nachher_hucc985d2dd04d0fed65973a566d222fcc_13204_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Nachher" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-nachher_hucc985d2dd04d0fed65973a566d222fcc_13204_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-nachher_hucc985d2dd04d0fed65973a566d222fcc_13204_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-nachher_hucc985d2dd04d0fed65973a566d222fcc_13204_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-topbar-wiki-nachher_hucc985d2dd04d0fed65973a566d222fcc_13204_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="142" /></picture></a><figcaption></figcaption></figure><p>
</p>

<h2 id="inline-code" data-numberify>Inline Code<a class="anchor ms-1" href="#inline-code"></a></h2>
<p>Die Darstellung von Inline-Code wurde verbessert, sodass unterschiedliche Teile in unterschiedlichen Zeilen nicht mehr aussehen, als würden sie zusammen kleben.</p>
<p></p><figure class="image-caption"><picture><source type="png" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-inlinecode-vorher.png" />
			         <img alt="Vorher" src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-inlinecode-vorher.png" title="" width="803" height="129" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>
<p></p><figure class="image-caption"><picture><source type="png" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-inlinecode-nachher.png" />
			         <img alt="Nachher" src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-inlinecode-nachher.png" title="" width="803" height="129" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>

<h2 id="kategorien-und-tags" data-numberify>Kategorien und Tags<a class="anchor ms-1" href="#kategorien-und-tags"></a></h2>
<p>Im Theme, das ich hier im Blog verwende, ist per Voreinstellung in einzelnen Beiträgen nur anhand der Positionierung unterscheidbar, was Kategorien und was Tags sind.</p>
<p>Das haben wir dadurch geändert, dass Tags jetzt immer ein Raute-Zeichen vorangestellt wird, sowohl im Beitrag als auch in der rechten Seitenleiste. Die Idee kam von einem dritten Menschen.🙂</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-vorher_hu21b431491a53141c0bc8dc7ae3408a63_69774_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-vorher_hu21b431491a53141c0bc8dc7ae3408a63_69774_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-vorher_hu21b431491a53141c0bc8dc7ae3408a63_69774_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Vorher" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-vorher_hu21b431491a53141c0bc8dc7ae3408a63_69774_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-vorher_hu21b431491a53141c0bc8dc7ae3408a63_69774_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-vorher_hu21b431491a53141c0bc8dc7ae3408a63_69774_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-vorher_hu21b431491a53141c0bc8dc7ae3408a63_69774_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="184" /></picture><figcaption></figcaption></figure><p>
</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-nachher_hu335dcab1af8163006901b60ef5a81a5f_70792_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-nachher_hu335dcab1af8163006901b60ef5a81a5f_70792_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-nachher_hu335dcab1af8163006901b60ef5a81a5f_70792_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Nachher" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-nachher_hu335dcab1af8163006901b60ef5a81a5f_70792_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-nachher_hu335dcab1af8163006901b60ef5a81a5f_70792_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-nachher_hu335dcab1af8163006901b60ef5a81a5f_70792_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-tags-in-beitraegen-nachher_hu335dcab1af8163006901b60ef5a81a5f_70792_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="184" /></picture><figcaption></figcaption></figure><p>
</p>

<h2 id="unter-der-haube--css---scss" data-numberify>Unter der Haube – CSS -> SCSS<a class="anchor ms-1" href="#unter-der-haube--css---scss"></a></h2>
<p>Dann hat Vri noch das ganze CSS aufgeräumt und daraus SCSS gemacht.</p>

<h2 id="post-panel" data-numberify>Post-Panel<a class="anchor ms-1" href="#post-panel"></a></h2>
<p>Das Panel, das rechts oben innerhalb von Blogbeiträgen angezeigt wird, wurde bisher beim Herunterscrollen auf mobilen Geräten ausgeblendet und stattdessen ein Icon aus dem Font-Awesome angezeigt. Jetzt ist es dauerhaft sichtbar und dafür konnte das Icon weg.</p>

<h2 id="keine-lightbox-mehr" data-numberify>Keine Lightbox mehr<a class="anchor ms-1" href="#keine-lightbox-mehr"></a></h2>
<p>Bisher gab es im Blog eine Lightbox. Hat man auf ein Vorschaubild geklickt, das mit dem Originalbild verknüpft war, so hat man die Website nicht verlassen, um zum Bild zu gelangen, sondern das Bild wurde in einem kleinen Overlay innerhalb der Website angezeigt.</p>
<p>Das ist ansich eine schöne Sache. Jedoch kommt es so immer wieder vor, dass Bilder, die eigentlich in einer höheren Auflösung vorliegen, in diesem Overlay trotzdem nur verkleinert angezeigt werden. Ganz deutlich merkt man dies bei Panoramafotos. Auch auf mobilen Geräten hat man das sehr gut gesehen, da hier die Vorschaubilder meist so breit sind wie der Bildschirm und das Overlay mit dem Originalbild nicht wesentlich größer war.</p>
<p>Ich habe mich daher heute dazu entschieden, das Lightbox-Script im Blog zu entfernen. Klickt man ein Vorschaubild an, öffnet sich im aktuellen Tab also das Bild. Über den Zurück-Button im Browser gelangt man wieder zur Website.</p>
<p>Ich weiß noch nicht, ob das so bleiben wird und ob das für normale Menschen gut ist, aber für mich passt es erst einmal.</p>
<p>Es wird dadurch auch wieder etwas weniger JavaScript im Blog eingebunden. Das spart für die Lightbox für die .js-Datei und die .css-Datei insgesamt 9 KiB.</p>
<p>Ausgenommen sind Galerien. Diese werden weiterhin in einem (anderen) Overlay auf der aktuellen Seite angezeigt. Das finde ich gut so, denn eine Galerie gehört irgendwie zusammen, während einzelne Bilder eben einzelne Bilder sind.</p>
<p></p><figure class="image-caption"><a href="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-im-overlay.png"><picture>
                <source type="image/webp" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-im-overlay_hua4b52ba8aad51f0bc976066134f5ec29_740004_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-im-overlay_hua4b52ba8aad51f0bc976066134f5ec29_740004_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-im-overlay_hua4b52ba8aad51f0bc976066134f5ec29_740004_816x0_resize_q95_h2_catmullrom_3.webp 816w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-im-overlay_hua4b52ba8aad51f0bc976066134f5ec29_740004_1632x0_resize_q95_h2_catmullrom_3.webp 1632w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px" />
                <img alt="Mit Overlay" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-im-overlay_hua4b52ba8aad51f0bc976066134f5ec29_740004_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-im-overlay_hua4b52ba8aad51f0bc976066134f5ec29_740004_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-im-overlay_hua4b52ba8aad51f0bc976066134f5ec29_740004_816x0_resize_q95_h2_catmullrom_3.webp 816w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-im-overlay_hua4b52ba8aad51f0bc976066134f5ec29_740004_1632x0_resize_q95_h2_catmullrom_3.webp 1632w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px"
                     src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-im-overlay_hua4b52ba8aad51f0bc976066134f5ec29_740004_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="426" /></picture></a><figcaption></figcaption></figure><p>
</p>
<p></p><figure class="image-caption"><a href="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-ohne-overlay.png"><picture>
                <source type="image/webp" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-ohne-overlay_hu82b3888671612169a7bcb3b7432771ce_1398598_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-ohne-overlay_hu82b3888671612169a7bcb3b7432771ce_1398598_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-ohne-overlay_hu82b3888671612169a7bcb3b7432771ce_1398598_816x0_resize_q95_h2_catmullrom_3.webp 816w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-ohne-overlay_hu82b3888671612169a7bcb3b7432771ce_1398598_1632x0_resize_q95_h2_catmullrom_3.webp 1632w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px" />
                <img alt="Ohne Overlay im Tab" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-ohne-overlay_hu82b3888671612169a7bcb3b7432771ce_1398598_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-ohne-overlay_hu82b3888671612169a7bcb3b7432771ce_1398598_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-ohne-overlay_hu82b3888671612169a7bcb3b7432771ce_1398598_816x0_resize_q95_h2_catmullrom_3.webp 816w,/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-ohne-overlay_hu82b3888671612169a7bcb3b7432771ce_1398598_1632x0_resize_q95_h2_catmullrom_3.webp 1632w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px"
                     src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-bild-ohne-overlay_hu82b3888671612169a7bcb3b7432771ce_1398598_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="426" /></picture></a><figcaption></figcaption></figure><p>
</p>

<h2 id="seitenliste-im-wiki" data-numberify>Seitenliste im Wiki<a class="anchor ms-1" href="#seitenliste-im-wiki"></a></h2>
<p>Die Abstände sind verringert worden, gefällt mir so besser.</p>
<p></p><figure class="image-caption"><picture><source type="png" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-seitenliste-vorher.png" />
			         <img alt="Vorher" src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-seitenliste-vorher.png" title="" width="597" height="539" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>
<p></p><figure class="image-caption"><picture><source type="png" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-seitenliste-nachher.png" />
			         <img alt="Nachher" src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-seitenliste-nachher.png" title="" width="597" height="539" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>

<h2 id="footer-im-wiki" data-numberify>Footer im Wiki<a class="anchor ms-1" href="#footer-im-wiki"></a></h2>
<p>Die Farben im Footer sind jetzt richtig.</p>
<p></p><figure class="image-caption"><picture><source type="png" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-footer-vorher.png" />
			         <img alt="Vorher" src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-footer-vorher.png" title="" width="326" height="119" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>
<p></p><figure class="image-caption"><picture><source type="png" srcset="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-footer-nachher.png" />
			         <img alt="Nachher" src="/2022/04/aenderungen-im-blog-und-im-wiki/images/2022-04-09-footer-nachher.png" title="" width="326" height="119" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>]]></content:encoded><enclosure url="https://natenom.de/2022/04/aenderungen-im-blog-und-im-wiki/cover.png" length="1398598" type="image/png"/></item><item><title>Änderungen im Blog</title><link>https://natenom.de/2022/04/aenderungen-im-blog/</link><pubDate>Wed, 06 Apr 2022 01:13:23 +0200</pubDate><guid>https://natenom.de/2022/04/aenderungen-im-blog/</guid><description>&lt;p>Es gab wieder ein paar Änderungen im Blog. Dieses Mal wieder dank Vri :)&lt;/p></description><content:encoded><![CDATA[<p>Es gab wieder ein paar Änderungen im Blog. Dieses Mal wieder dank Vri :)</p>
<h2 id="neue-icons--octicons" data-numberify>Neue Icons – Octicons<a class="anchor ms-1" href="#neue-icons--octicons"></a></h2>
<p>Im Blog werden an ein paar Stellen Icons von der Schrift Font-Awesome verwendet. Das hat uns beiden nicht sehr gefallen und Vri hat mich auf Octicons hingewiesen. Das ist ein Satz aus frei nutzbaren Icons, die als SVG zur Verfügung gestellt werden.</p>
<p>Vri hat Icons im Panel eines Blogbeitrags deshalb durch diese Octicons ausgetauscht.</p>
<p>Die Icons werden automatisch je nach Hell-/Dunkel-Theme angepasst.</p>
<p>Die Octicons Icons <a  class='urlextern'  href="https://primer.style/octicons/">gibt es hier</a>. Dazu wurde auch entsprechend die <a  href="/lizenz">Lizenz-Seite</a> hier im Blog angepasst.</p>
<p>Auch das Icon für externe URLs ist jetzt eines von Octicons.</p>

<h2 id="jetzt-ohne-javascript" data-numberify>Jetzt ohne JavaScript<a class="anchor ms-1" href="#jetzt-ohne-javascript"></a></h2>
<p>Die Icons im Panel eines Blogbeitrags (Kommtentare, Inhaltsverzeichnis, …) wurden bisher nur angezeigt, wenn JavaScript aktiviert war. Das ist jetzt nicht mehr notwenidig, da die Icons inline eingefügt wurden.</p>
<p>Vorher:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/04/aenderungen-im-blog/images/2022-03-29-share-icons-jetzt_hu38b07dd2d22e430f5624093c2d02aa0e_96451_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/04/aenderungen-im-blog/images/2022-03-29-share-icons-jetzt_hu38b07dd2d22e430f5624093c2d02aa0e_96451_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/04/aenderungen-im-blog/images/2022-03-29-share-icons-jetzt_hu38b07dd2d22e430f5624093c2d02aa0e_96451_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/04/aenderungen-im-blog/images/2022-03-29-share-icons-jetzt_hu38b07dd2d22e430f5624093c2d02aa0e_96451_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/04/aenderungen-im-blog/images/2022-03-29-share-icons-jetzt_hu38b07dd2d22e430f5624093c2d02aa0e_96451_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/04/aenderungen-im-blog/images/2022-03-29-share-icons-jetzt_hu38b07dd2d22e430f5624093c2d02aa0e_96451_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/04/aenderungen-im-blog/images/2022-03-29-share-icons-jetzt_hu38b07dd2d22e430f5624093c2d02aa0e_96451_816x0_resize_q95_h2_catmullrom_3.webp" title="Icons aus Font-Awesome und nur via JavaScript" loading="lazy" width="816" height="181" /></picture><figcaption>Icons aus Font-Awesome und nur via JavaScript</figcaption></figure><p>
</p>
<p>Jetzt:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/04/aenderungen-im-blog/images/2022-04-06-screenshot-panel-icons_hu405380ca27527a8bc190df987c6bf6f5_46113_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/04/aenderungen-im-blog/images/2022-04-06-screenshot-panel-icons_hu405380ca27527a8bc190df987c6bf6f5_46113_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/04/aenderungen-im-blog/images/2022-04-06-screenshot-panel-icons_hu405380ca27527a8bc190df987c6bf6f5_46113_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/04/aenderungen-im-blog/images/2022-04-06-screenshot-panel-icons_hu405380ca27527a8bc190df987c6bf6f5_46113_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/04/aenderungen-im-blog/images/2022-04-06-screenshot-panel-icons_hu405380ca27527a8bc190df987c6bf6f5_46113_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/04/aenderungen-im-blog/images/2022-04-06-screenshot-panel-icons_hu405380ca27527a8bc190df987c6bf6f5_46113_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/04/aenderungen-im-blog/images/2022-04-06-screenshot-panel-icons_hu405380ca27527a8bc190df987c6bf6f5_46113_816x0_resize_q95_h2_catmullrom_3.webp" title="Icons aus Octicons und auch ohne JavaScript" loading="lazy" width="816" height="144" /></picture><figcaption>Icons aus Octicons und auch ohne JavaScript</figcaption></figure><p>
</p>]]></content:encoded></item><item><title>Umzug von WordPress zu Hugo – Teil 1 – Von den Gründen bis zum ersten funktionierenden Blog</title><link>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/</link><pubDate>Thu, 03 Feb 2022 07:30:33 +0100</pubDate><guid>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/</guid><description>Schon einige Male in den vergangenen Jahren habe ich versucht, meinen Blog von WordPress auf Hugo umzuziehen. Immer gab es dabei für mich unüberwindbare Hürden. Jetzt endlich hat es mal in einem neuen Anlauf funktioniert.
Hier berichte ich davon, wie genau ich das gemacht habe, was es zu bedenken galt und wie es im Ergebnis geworden ist. In erster Linie ist es für mich als Dokumentation gedacht, damit ich das in x Zeit noch nachvollziehen kann.</description><content:encoded><![CDATA[<p>Schon einige Male in den vergangenen Jahren habe ich versucht, meinen Blog von WordPress auf Hugo umzuziehen. Immer gab es dabei für mich unüberwindbare Hürden. Jetzt endlich hat es mal in einem neuen Anlauf funktioniert.</p>
<p>Hier berichte ich davon, wie genau ich das gemacht habe, was es zu bedenken galt und wie es im Ergebnis geworden ist. In erster Linie ist es für mich als Dokumentation gedacht, damit ich das in x Zeit noch nachvollziehen kann. Und wenn jemand anderes damit auch noch etwas anfangen kann, dann ist es noch besser.</p>
<p>Dabei schreibe ich übrigens das erste Mal einen Blogbeitrag mit einem einfachen Editor, offline, ohne Browser, in einem einfachen Textbearbeitungsprogramm. Und das fühlt sich gut an.</p>

<h2 id="wieso-überhaupt-weg-von-wordpress" data-numberify>Wieso überhaupt weg von WordPress?<a class="anchor ms-1" href="#wieso-überhaupt-weg-von-wordpress"></a></h2>
<p>Ich habe WordPress seit 2009 für meinen Blog benutzt und es immer auf eigenen Servern selbst gehostet. Ich war immer sehr zufrieden damit. WordPress hat es mir ermöglicht, mich immer nur auf den Inhalt konzentrieren zu können und hat mir die ganze Arbeit drumherum abgenommen. Und es ist immer noch so. Das schätze ich an dem Content Management System WordPress. Jedes Upgrade auf eine neue Version war immer fehlerfrei mit nur wenigen Klicks möglich.</p>
<p>Die meisten Funktionen von WordPress habe ich nie benutzt. Und mit dem Update auf den Gutenberg-Editor und jetzt kürzlich auf 5.9 mit dem Super Feature &ldquo;Full Site Editing&rdquo; ist noch klarer geworden, dass ich solch ein komplexes System nicht benötige. Es ist immer noch sehr einfach zu bedienen und zu aktualisieren, aber ich brauche es eben nicht.</p>
<p>Was ich brauche, ist eine einfache Möglichkeit, Texte zu schreiben, die Maus möglichst nicht bewegen zu müssen und außerdem benötige ich nur die grundlegensten Formatierungen. Kurzum das, was <a  class='urlextern'  href="https://daringfireball.net/projects/markdown/">Markdown</a> bietet.</p>
<p>Natürlich sind da noch andere Aspekte:</p>
<ul>
<li>Wartbarkeit: Webserver, PHP, Datenbank, alles will gepflegt werden und benötigt ab und zu Aufmerksamkeit. Mit Hugo kann man den kompletten Blog, der aus statischen Dateien (HTML, CSS, JavaScript) besteht, auf einen Webserver werfen und für immer dort liegen lassen.</li>
<li>Portierbarkeit/Backup: Sollte ich mal vom Rad fallen und nicht mehr aufstehen, kann man sich das Archiv herunterladen und hat weiterhin Zugriff auf die Inhalte des Blogs. Entsprechend wird man sich später das einmal alle x Zeit aktualisierte Archiv herunterladen können. Dazu später mehr.</li>
<li>Sicherheit: Da nichts dynamisch ausgeführt wird, gibt es auch keine Sicherheitslücken, die jemand ausnutzen könnte.</li>
<li>&ldquo;Einfachheit&rdquo;: Text-Editor, Hugo laufen lassen, hochladen per SFTP. Fertig.</li>
</ul>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Fenster eines Texteditors unter KDE/Plasma" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp" title="Fenster eines Texteditors unter KDE/Plasma" loading="lazy" width="816" height="523" /></picture></a><figcaption>Fenster eines Texteditors unter KDE/Plasma</figcaption></figure><p>
</p>

<h2 id="ein-schönes-theme-für-hugo-finden" data-numberify>Ein schönes Theme für Hugo finden<a class="anchor ms-1" href="#ein-schönes-theme-für-hugo-finden"></a></h2>
<p>Man kann natürlich auch selbst ein Theme bauen, aber das ist nichts für mich.</p>
<p>Eine Liste von aktuell 285 Themes gibt es auf der Webseite von Hugo, siehe <a  class='urlextern'  href="https://themes.gohugo.io/">hier</a>.</p>
<p>Ich habe mich für das Theme <a  class='urlextern'  href="https://themes.gohugo.io/themes/hugo-theme-bootstrap/">Bootstrap Theme for Personal Blog and Documentations</a> entschieden, weil es fast alles liefert, was ich benötige und vielfältige Einstellungsmöglichkeiten hat.</p>
<p>Was ich besonders mag:</p>
<ul>
<li>Dark Mode/Light Mode</li>
<li>Suchfunktion (<a  class='urlextern'  href="https://fusejs.io">fuse.js</a>)</li>
<li>Durch Ausblenden der Seitenliste kann der Inhaltsbereich breiter gemacht werden.</li>
<li>Es gibt bereits Shortcodes für Nachrichtenboxen (Info, Alarm, &hellip;). Siehe <a  class='urlextern'  href="https://hbs.razonyang.com/en/docs/shortcodes/alert/">hier</a>.</li>
<li><a  class='urlextern'  href="https://gohugo.io/templates/internal/#configure-twitter-cards">Twitter Cards</a> und <a  class='urlextern'  href="https://gohugo.io/templates/internal/#configure-open-graph">Open Graph</a></li>
<li>Responsive</li>
<li>optional mehrsprachig</li>
<li>Archivseiten</li>
<li>Shortcods für Verleinern von Bildern. Die verkleinerten Bilder werden beim Rendern von Hugo aus den Originaldateien erzeugt.</li>
<li>Lazy loading für Bilder</li>
<li>Inhaltsverzeichnis für Blogbeiträge</li>
<li>Keine Einbindung von externen Inhalten</li>
<li>Liste von &ldquo;ähnlichen Beiträgen&rdquo;</li>
</ul>

<h2 id="vor-dem-export-in-wordpress-aufräumen" data-numberify>Vor dem Export in WordPress aufräumen<a class="anchor ms-1" href="#vor-dem-export-in-wordpress-aufräumen"></a></h2>

<h3 id="tabellen-aufräumen" data-numberify>Tabellen aufräumen<a class="anchor ms-1" href="#tabellen-aufräumen"></a></h3>
<p>Vor dem Export der Daten kann man den Blog noch etwas aufräumen. Hat man z. B. wie ich über die Jahre viele verschiedene Plugins ausprobiert und wieder entfernt, dann könnten die Daten der Plugins immer noch irgendwo in den Tabellen der Datenbank liegen und beim Export in den Daten landen. Das wären alles zusätzliche Daten, die man nicht benötigt.</p>
<p>Dazu hatte ich mal einen eigenen Blogbeitrag verfasst, siehe <a  href="/2021/05/datenbank-von-wordpress-auch-mal-aufraeumen/">hier</a>.</p>

<h3 id="entwürfe" data-numberify>Entwürfe<a class="anchor ms-1" href="#entwürfe"></a></h3>
<p>Werden Entwürfe exportiert, dann erhalten diese in der exportierten Version kein Datum und sind somit erstmal aus dem Sichtbereich raus oder bekommen seltsame Namen/URLs zugewiesen wie z. B. &ldquo;?p=52696/&rdquo;, das der fortlaufenden ID von Blogbeiträgen entspricht. Das will man später alles nicht einzeln bearbeiten müssen. Deshalb Entwürfe löschen oder veröffentlichen.</p>

<h3 id="verlinkungen-in-wordpress" data-numberify>Verlinkungen in WordPress<a class="anchor ms-1" href="#verlinkungen-in-wordpress"></a></h3>
<p>Man kann in WordPress entweder die komplette URL verwenden (Standard), um auf einen Beitrag im eigenen Blog zu verlinken oder die ID des Beitrags verwenden.</p>
<p>Die komplette URL wäre z. B. &ldquo;natenom.de/2021/01/beitrag-ueber-den-kleinen-elefanten&rdquo; während die ID &ldquo;natenom.de/?p=12345&rdquo; wäre.</p>
<p>Solche Verlinkungen sollte man noch im laufenden WordPress Blog finden und in die erste Form (lange URL) überführen, da die zweite Form mit der ID in Hugo nicht funktionieren wird.</p>
<p>Dazu reicht die Suchfunktion im Adminpanel aus. Man sucht nach &ldquo;/?p=&rdquo;. In meinem Fall fanden sich ca. 130 solcher Beiträge mit ID Verlinkungen.</p>

<h2 id="optional-backup-des-blogs--für-hugo-nicht-relevant" data-numberify>(optional) Backup des Blogs – Für Hugo nicht relevant<a class="anchor ms-1" href="#optional-backup-des-blogs--für-hugo-nicht-relevant"></a></h2>
<p>Da der Blog am Ende abgeschaltet werden soll, habe ich ein letztes Mal Backups gemacht:</p>
<ul>
<li>Backup der WordPress Datenbank</li>
<li>Als Admin in WordPress angemeldet und unter Werkzeuge -&gt; Daten exportieren -&gt; Alle Inhalte ausgewählt und die xml-Datei heruntergeladen. In dieser Datei sind alle Beiträge, alle Seiten und auch die Kommentare von Benutzern enthalten. Nicht jedoch die hochgeladenen Dateien. In meinem Fall ist die Datei um 50 MiB groß und hat um die 50000 Zeilen.</li>
<li>Backup des kompletten WordPress-Verzeichnisses inklusive den hochgeladenen Dateien und dem ganzen PHP-Zeug</li>
<li>Herunterladen der kompletten Webseite mit wget, um später noch nachvollziehen zu können, unter welchen URLs was zu finden war. Für solche URLs, die Hugo nicht generiert. Die könnte man dann mit einem Webserver passend weiterleiten. Die Kommandozeile dafür ist:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget --recursive --domains<span style="color:#f92672">=</span>natenom.de --html-extension --page-requisites --convert-links --no-parent <span style="color:#e6db74">&#34;/&#34;</span> -R <span style="color:#e6db74">&#34;*xmlrpc*&#34;</span> --reject-regex <span style="color:#e6db74">&#34;.*wp-content.*&#34;</span></span></span></code></pre></div>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content"><p>Wenn es Probleme gibt und eine Meldung in der Form <code>no follow attribute found</code>, dann benötigt man zusätzlich noch diesen Parameter:</p>
<pre><code>-erobots=off
</code></pre>
</div>
</div>


<p>Das Verzeichnis <code>wp-content</code> habe ich bewusst ausgelassen, da es nur hochgeladene Dateien enthält (ca. 7 GiB), die bereits in einem anderen Backup enthalten sind.</p>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp" title="Export Tool von WordPress. Exportiert alles außer der hochgeladenen Dateien." loading="lazy" width="816" height="430" /></picture></a><figcaption>Export Tool von WordPress. Exportiert alles außer der hochgeladenen Dateien.</figcaption></figure><p>
</p>

<h2 id="daten-für-hugo-aus-wordpress-exportieren" data-numberify>Daten für Hugo aus WordPress exportieren<a class="anchor ms-1" href="#daten-für-hugo-aus-wordpress-exportieren"></a></h2>
<p>Mit dem Tool <a  class='urlextern'  href="https://github.com/SchumacherFM/wordpress-to-hugo-exporter">WordPress to Hugo Exporter</a> kann man alle Seiten und Beiträg eines Blogs in eine Zip-Datei exportieren.</p>
<p>Ich gehe hier nicht darauf ein, wie man das Tool verwendet, da das ausreichend gut auf dessen Webseite erklärt ist. Wichtig ist hier nur, dass man am Ende eine Datei erhält, hier im Beispiel mit dem Namen wpexport.zip.</p>
<p>Auf der Projektseite steht, was man an der PHP-Datei anpassen muss, damit auch Kommentare exportiert werden.</p>
<p>Der Export kann eine ganze Weile dauern und sollte deshalb auf der Kommandozeile ausgeführt werden. Die <code>wpexport.zip</code> meines Blogs hatte eine Dateigröße von etwas mehr als 7 GiB.</p>
<p>Die Datei <code>wpexport.zip</code> hat diese Struktur:</p>
<pre tabindex="0"><code>seite-a/index.md
seite-b/index.md
irgendeine-seite/index.md
posts/
    2022-01-05-mein-beitrag-im-januar
    2022-01-06-mein-beitrag-ueber-bluemeleinchen
    2022-02-08-ein-neuer-beitrag-mit-tollen-fahrraedern
wp-content/
    uploads/
        2022/
            01/
                2022-01-04-hochgeladenes-bild-1.jpg
                2022-01-04-hochgeladenes-bild-2.jpg
config.yaml
</code></pre><ul>
<li>Es sind alle &ldquo;Seiten&rdquo; des Blogs als Verzeichnisse enthalten, in den index.md-Dateien sind die Inhalte.</li>
<li>Die &ldquo;Beiträge&rdquo; (Englisch &ldquo;Posts&rdquo;) liegen als md-Dateien im Verzeichnis &ldquo;posts&rdquo;.</li>
<li>Die hochgeladenen Dateien wie Fotos, Screenshots oder auch Audio und Video liegen im Verzeichnis wp-content/uploads, sortiert nach Jahr und Monat.</li>
<li>Dann gibt es noch die Datei config.yaml, welche die URL des Blogs enthält, den Namen und die Beschreibung.</li>
</ul>
<p>Die Daten lädt man dann auf den eigenen PC herunter.</p>

<h2 id="eine-webseite-mit-hugo-anlegen-und-theme-einfügen" data-numberify>Eine Webseite mit Hugo anlegen und Theme einfügen<a class="anchor ms-1" href="#eine-webseite-mit-hugo-anlegen-und-theme-einfügen"></a></h2>
<p>Ich will hier nicht darauf eingehen, wie man eine Webseite mit Hugo anlegt und das Theme einfügt, das ist auf der Projektseite bereits ausführlich gut dokumentiert, siehe <a  class='urlextern'  href="https://gohugo.io/getting-started/quick-start/">hier</a>.</p>
<p>Sobald das erledigt und das Theme eingebunden ist, kann man die exportierten Daten aus dem heruntergeladenen Archiv entpacken und die Daten in das Verzeichnis des neuen Blogs hineinkopieren:</p>
<ul>
<li>Die Datei <code>config.yaml</code> habe ich weg gelassen.</li>
<li>Das Verzeichnis <code>posts</code> wird nach <code>content</code> kopiert.</li>
<li>Das Verzeichnisse <code>seite-x</code> werden nach <code>content/pages</code> kopiert.</li>
<li>Das Verzeichnis <code>wp-content</code> wird nach <code>static</code> kopiert.</li>
</ul>

<h2 id="ein-bisschen-konfiguration" data-numberify>Ein bisschen Konfiguration<a class="anchor ms-1" href="#ein-bisschen-konfiguration"></a></h2>
<p>Eine Liste aller Einstellungsmöglichkeiten gibt es auf der <a  class='urlextern'  href="https://hbs.razonyang.com/v0/en/docs/configuration/">Seite des Theme-Entwicklers</a>.</p>

<h3 id="taxonomie" data-numberify>Taxonomie<a class="anchor ms-1" href="#taxonomie"></a></h3>
<p>Bei der Taxonomie wollte ich die URLs von WordPress möglichst erhalten.</p>
<p>Per Voreinstellung verwendet Hugo für tags in der URL &ldquo;tags&rdquo;, WordPress jedoch &ldquo;tag&rdquo;. Bei Kategorien verwendet Hugo &ldquo;categories&rdquo; und WordPress &ldquo;category&rdquo;.</p>
<p>Das kann man in der <code>config.toml</code> anpassen mit:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">taxonomies</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">category</span> = <span style="color:#e6db74">&#39;category&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">tag</span> = <span style="color:#e6db74">&#39;tag&#39;</span></span></span></code></pre></div>
<p>In meinem ausgewählten Theme funktioniert das jedoch leider nicht, da zwingend &ldquo;tags&rdquo; und &ldquo;categories&rdquo; notwendig sind. Kann man sicher anpassen, ich aber nicht. Also bleibt es bei den Voreinstellungen. Ich werde es dann einfach mit dem Webserver weiterleiten lassen.</p>
<p>In Nginx z. B. mit:</p>
<pre tabindex="0"><code>rewrite ^/tag/(.*)$ /tags/$1 redirect;
rewrite ^/category/(.*)$ /categories/$1 redirect;
</code></pre><p>Wenn das gut funktioniert, kann man das später auf <em>permanent</em> umschreiben.</p>

<h3 id="beiträge-nicht-gelistet" data-numberify>Beiträge nicht gelistet<a class="anchor ms-1" href="#beiträge-nicht-gelistet"></a></h3>
<p>Auf der Startseite des Blogs wurden die Beiträge nicht gelistet. Mit Herumprobieren konnte ich herausfinden, dass das an dem Eintrag &ldquo;type: post&rdquo; im Front Matter (Metadaten eines Beitrags) lag. Daher habe ich mit dem folgenden Shell-Aufruf diese Zeile in allen md-Dateien gelöscht:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i <span style="color:#e6db74">&#34;/^type: post</span>$<span style="color:#e6db74">/d&#34;</span> *.md</span></span></code></pre></div>

<h3 id="sonstige-konfiguration" data-numberify>Sonstige Konfiguration<a class="anchor ms-1" href="#sonstige-konfiguration"></a></h3>
<p>Hier noch ein paar weitere wichtige Dinge, die ich in der Konfiguration eingestellt habe.
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">baseURL</span> = <span style="color:#e6db74">&#34;/&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">rssLimit</span> = <span style="color:#ae81ff">15</span>
</span></span><span style="display:flex;"><span>[<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">params</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">comment</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">breadcrumb</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">palette</span> = <span style="color:#e6db74">&#34;blue&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">dateFormat</span> = <span style="color:#e6db74">&#34;Mon, 02 Jan 2006 15:04&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">mainSections</span> = [<span style="color:#e6db74">&#34;posts&#34;</span>, <span style="color:#e6db74">&#34;pages&#34;</span> ]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">poweredBy</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">math</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">diagram</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">logo</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">description</span> = <span style="color:#e6db74">&#34; Verkehrswende, Fahrrad, CriticalMass, OpenBikeSensor, SimRa, Mumble, Open Source, Minimalist, OpenStreetMap, Müllsammeln&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">recentPostCount</span> = <span style="color:#ae81ff">5</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">relatedPostCount</span> = <span style="color:#ae81ff">6</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">categoryCount</span> = <span style="color:#ae81ff">200</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">tagCount</span> = <span style="color:#ae81ff">150</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">searchBar</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">post</span>.<span style="color:#a6e22e">copyright</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">search</span>.<span style="color:#a6e22e">fuse</span>.<span style="color:#a6e22e">threshold</span> = <span style="color:#ae81ff">0.0</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">countTaxonomyPosts</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">post</span>.<span style="color:#a6e22e">excerpt</span> = <span style="color:#e6db74">&#34;description&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">viewer</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">showShare</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">socialShare</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">outputs</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">home</span> = [<span style="color:#e6db74">&#34;HTML&#34;</span>, <span style="color:#e6db74">&#34;RSS&#34;</span>, <span style="color:#e6db74">&#34;JSON&#34;</span>]</span></span></code></pre></div></p>

<h2 id="von-absoluten-urls-zu-relativen-urls" data-numberify>Von absoluten URLs zu relativen URLs<a class="anchor ms-1" href="#von-absoluten-urls-zu-relativen-urls"></a></h2>
<p>Ich habe keine Ahnung von SEO und habe mich nie damit beschäftigt. Könnte es sein, dass WordPress aus SEO-Gründen absoulte URLs verwendet und nicht realtive? Ich habe dazu die Info auf einer Webseite gefunden, dass relative Links problematisch werden könnten, wenn der Server nicht richtig eingerichtet sei.</p>
<p>Hat man Bedenken, dann weiter zum nächsten Abschnitt.</p>
<p>Aber: Will man den neuen Blog auf dem eigenen PC anschauen, benötigt man ohne die Veränderungen der URLs eine Internetverbindung, damit eingebettete Inhalte wie z. B. Bilder vom Browser von der ursprünglichen Webseite heruntergeladen werden können. Oder aber man biegt das DNS temporär um, muss dann aber zumindest aus https http machen, und so weiter.</p>

<h3 id="absolute-urls-auf-hochgeladene-dateien" data-numberify>Absolute URLs auf hochgeladene Dateien<a class="anchor ms-1" href="#absolute-urls-auf-hochgeladene-dateien"></a></h3>
<p>Alle Verlinkungen auf Fotos, Bilder und Videos sind in WordPress mit der absoulten URL angegeben, in meinem Fall mit <code>natenom.de/wp-content/uploads/...</code>. Und das wird so auch in die md-Dateien exportiert.</p>
<p>Deshalb kann man die URLs mit dem Streameditor sed umschreiben lassen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#/wp-content/uploads/#/wp-content/uploads/#g&#39;</span> *.md</span></span></code></pre></div>
<p>(Ich habe das aktuell erstmal noch nicht getan.)</p>
<p>Das Kommando führt man in allen Verzeichnissen aus, in denen md-Dateien liegen. Man könnte das auch so umschreiben, dass es ausgehend vom neuen Blogverzeichnis alle md-Dateien findet und so alle erfasst. Aber so reicht es mir.</p>

<h3 id="absolute-urls-auf-blogbeiträge" data-numberify>Absolute URLs auf Blogbeiträge<a class="anchor ms-1" href="#absolute-urls-auf-blogbeiträge"></a></h3>
<p>Das selbe gilt auch für Verlinkungen im Blogbeiträgen auf andere Beiträg im eigenen Blog. Auch diese URLs lasse ich umschreiben:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#/#/#g&#39;</span> *.md</span></span></code></pre></div>
<p>(Ich habe das aktuell erstmal noch nicht getan.)</p>
<p>Aus dem absoulten Link <code>/</code> wird dadurch <code>/</code>.</p>

<h2 id="umlaute-in-urls-von-kategorien-und-tags" data-numberify>Umlaute in URLs von Kategorien und Tags<a class="anchor ms-1" href="#umlaute-in-urls-von-kategorien-und-tags"></a></h2>
<p>Ich verwende im Blog das Tag &ldquo;Müllsammeln&rdquo; und die Kategorie &ldquo;Mobilität&rdquo;. Wordpress hat dabei automatisch die Umlaute in den dafür genutzten URLs in die alternativen Schreibweisen &ldquo;muellsammeln&rdquo; und &ldquo;mobilitaet&rdquo; umgewandelt. Hugo macht das nicht, weshalb dort das Tag auch &ldquo;müllsammeln&rdquo; lautet.</p>
<p>Es gibt mehrere Lösungen:</p>
<ol>
<li>Es dabei belassen, denn mittlerweile sind diese Zeichen kein Problem mehr. Es sieht nur nicht sonderlich schön aus, wenn man statt <strong>mobilität</strong> das hier sieht <strong>mobilit%C3%A4t</strong></li>
<li>Ohne Veränderungen an den Beiträgen wäre die Option <strong>removePathAccents</strong> von Hugo möglich, die aus &ldquo;mobilität&rdquo; &ldquo;mobilitat&rdquo; macht.</li>
<li>Hugo selbst zu verändern, <a  class='urlextern'  href="https://www.von-laufenberg.de/blog/it/hugo-umlaute/">siehe hier</a>.</li>
<li>Alle Vorkommen der Tags in den Beiträgen mit sed umschreiben und ö durch oe ersetzen usw.</li>
<li>Weiterleitungen durch den Webserver, siehe unten.</li>
</ol>
<p>Einen Issue mit vielen Informationen zu diesem Theme gibt es auf Github, <a  class='urlextern'  href="https://github.com/gohugoio/hugo/issues/3476">siehe hier</a>. Ein weitere Issue zu dem Thema ist seit November 2021 noch offen, <a  class='urlextern'  href="https://github.com/gohugoio/hugo/issues/9134">siehe hier</a>.</p>
<p>Ich habe mich entschieden, das so zu belassen das erst einmal mit Weiterleitungen zu &ldquo;fixen&rdquo; und zu schauen, was sich bei dem Issue tut.</p>
<p>In Nginx sind diese:</p>
<pre tabindex="0"><code>rewrite ^/tag/muellsammeln/(.*)$ /tags/müllsammeln/$1 redirect;
rewrite ^/category/mobilitaet/(.*)$ /categories/mobilität/$1 redirect;
rewrite ^/tag/(.*)$ /tags/$1 redirect;
rewrite ^/category/(.*)$ /categories/$1 redirect;
</code></pre><p>Ich nutze bei solchen Dingen am Anfang immer erst redirect, was dem HTTP Status 302 entspricht und ändere das dann irgendwann zu permanent (Status 301) um.</p>

<h2 id="fehlerseite-für-404" data-numberify>Fehlerseite für 404<a class="anchor ms-1" href="#fehlerseite-für-404"></a></h2>
<p>Falls doch mal eine Seite nicht gefunden wird, habe ich die <code>404.html</code> in Nginx eingerichtet:</p>
<pre tabindex="0"><code>error_page 404 /404.html;
</code></pre><p>Hier kann man die Seite mal ansehen: <a  href="/blabla-diese-seite-gibt-es-nicht">Dieser Link zeigt auf eine nicht vorhandene Seite</a>.</p>

<h2 id="damit-erstmal-keine-inhalte-fehlen" data-numberify>Damit erstmal keine Inhalte fehlen<a class="anchor ms-1" href="#damit-erstmal-keine-inhalte-fehlen"></a></h2>
<p>Würde man jetzt schon Hugo starten, würden vermutlich viele Inhalte in verschiedenen Beiträgen fehlen. Das liegt daran, dass das oben genannte Export-Tool viele HTML Tags nicht in Markdown konvertieren kann und dann an diesen Stellen den HTML-Quelltext in die exportierten md-Dateien schreibt. Doch Hugo filtert diesen HTML-Quelltext beim Rendern der Website heraus.</p>
<p>Damit ich nicht erst alle 2560 Blogbeiträge manuell überprüfen und korrigieren muss, bevor ich den neuen Blog öffentlich machen kann, habe ich mich entschieden, dieses Verhalten von Hugo umzustellen und Hugo anzuweisen, den HTML-Quelltext nicht herauszufiltern. Das ist zwar nicht im Sinne des Erfinders aber so habe ich die Möglichkeit, die Arbeit auf <em>irgendwann</em> später zu verschieben.</p>
<p>Details dazu findet man <a  class='urlextern'  href="https://gohugo.io/news/0.60.0-relnotes/">hier</a>. Suche nach <code>unsafe</code>.</p>
<p>In die config.toml fügt man dazu Folgendes ein:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">markup</span>]
</span></span><span style="display:flex;"><span>  [<span style="color:#a6e22e">markup</span>.<span style="color:#a6e22e">goldmark</span>]
</span></span><span style="display:flex;"><span>    [<span style="color:#a6e22e">markup</span>.<span style="color:#a6e22e">goldmark</span>.<span style="color:#a6e22e">renderer</span>]
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">unsafe</span> = <span style="color:#66d9ef">true</span></span></span></code></pre></div>

<h2 id="run-hugo-run" data-numberify>Run Hugo, Run<a class="anchor ms-1" href="#run-hugo-run"></a></h2>
<p>Jetzt kann man Hugo veranlassen, den neuen Blog das erste Mal zu rendern und dann lokal zur Verfügung zu stellen. Per Voreinstellung ist er unter localhost:1313 erreichbar.</p>
<p>Dazu wechselt man auf der Kommandozeile in das Verzeichnis des neuen Blogs und führt aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>hugo server --renderToDisk -D -E -F -v</span></span></code></pre></div>
<p>Jetzt werden alle gerenderten Dateien und auch die aus dem <code>static</code>-Verzeichnis in das Verzeichnis <code>public</code> kopiert, welches Hugo automatisch erstellt, wenn es noch nicht existiert.</p>
<p>Sobald alles bereit ist, gibt es eine Meldung wie etwa:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>                   |  DE   
</span></span><span style="display:flex;"><span>-------------------+-------
</span></span><span style="display:flex;"><span>  Pages            | <span style="color:#ae81ff">4350</span>  
</span></span><span style="display:flex;"><span>  Paginator pages  | <span style="color:#ae81ff">1694</span>  
</span></span><span style="display:flex;"><span>  Non-page files   |    <span style="color:#ae81ff">1</span>  
</span></span><span style="display:flex;"><span>  Static files     |   <span style="color:#ae81ff">88</span>  
</span></span><span style="display:flex;"><span>  Processed images |    <span style="color:#ae81ff">0</span>  
</span></span><span style="display:flex;"><span>  Aliases          |  <span style="color:#ae81ff">889</span>  
</span></span><span style="display:flex;"><span>  Sitemaps         |    <span style="color:#ae81ff">1</span>  
</span></span><span style="display:flex;"><span>  Cleaned          |    <span style="color:#ae81ff">0</span>  
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Built in <span style="color:#ae81ff">45228</span> ms
</span></span><span style="display:flex;"><span>Watching <span style="color:#66d9ef">for</span> changes in /home/natenom-web-hugo/<span style="color:#f92672">{</span>assets,content,layouts,static,themes<span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>Watching <span style="color:#66d9ef">for</span> config changes in /home/natenom-web-hugo/config.toml, <span style="color:#f92672">[</span>…<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Environment: <span style="color:#e6db74">&#34;development&#34;</span>
</span></span><span style="display:flex;"><span>Serving pages from /home/natenom-web-hugo/public
</span></span><span style="display:flex;"><span>Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
</span></span><span style="display:flex;"><span>Web Server is available at http://localhost:1313/ <span style="color:#f92672">(</span>bind address 127.0.0.1<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>Press Ctrl+C to stop</span></span></code></pre></div>

<h2 id="erstmal-fertig" data-numberify>Erstmal fertig<a class="anchor ms-1" href="#erstmal-fertig"></a></h2>
<p>Das reicht dann auch wieder für diesen Beitrag. Man kann jetzt schon im eigenen Blog offline umgucken und wird hier und da noch unschöne Dinge finden, wie falsch dargestellte Bilder.</p>
<p>In <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2">Teil 2</a> geht es darum, für die Übergangszeit das übrig gebliebene HTML, das nicht zu Markdown konvertiert werden konnte, automatisiert so zu verändern, dass der Blog trotzdem ansehnlich ist, wenn auch noch nicht perfekt.</p>
]]></content:encoded><enclosure url="https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/cover.png" length="162917" type="image/png"/></item><item><title>New release for fgallery (1.8) – Creator for static image galleries with HTML, CSS and Javascript</title><link>https://natenom.de/2016/01/new-release-for-fgallery-1-8-creator-for-static-image-galleries-with-html-css-and-javascript/</link><pubDate>Thu, 14 Jan 2016 17:20:46 +0000</pubDate><guid>https://natenom.de/2016/01/new-release-for-fgallery-1-8-creator-for-static-image-galleries-with-html-css-and-javascript/</guid><description><![CDATA[<p>With fgallery you can create an image gallery offline on your computer, upload it to some cheap web storage and forget about it, <a  href="https://f.natenom.de/public/minecraft/screenshots/kaguBe-Survival-Server/Sonstiges/">for example this one</a>.</p>
<p>It is written in Perl.</p>]]></description><content:encoded><![CDATA[<p>With fgallery you can create an image gallery offline on your computer, upload it to some cheap web storage and forget about it, <a  href="https://f.natenom.de/public/minecraft/screenshots/kaguBe-Survival-Server/Sonstiges/">for example this one</a>.</p>
<p>It is written in Perl.</p>
<p>New in this release:</p>
<ul>
<li>Handle bogus whitespace in EXIF timestamps.</li>
<li>Ignore hidden/invalid files instead of failing.</li>
<li>Support „tificc2“ as an alias to „tificc“ (for Fedora).</li>
<li>Avoid calling „tificc“ for images already in sRGB.</li>
<li>Load thumbnails on-demand for faster loading of large galleries.</li>
<li><strong>Extract and visualize image captions</strong> (<a  class='urlextern'  href="http://www.thregr.org/~wavexx/software/fgallery/index.html#image-captioning">see here how it works</a>).</li>
<li>Added „utils/fcaption“ to edit image captions.</li>
</ul>
<p>I am looking forward for the ability to display some meta information like aperture, exposure, ISO and more (see <a  class='urlextern'  href="https://github.com/wavexx/fgallery/issues/17">this issue</a>) and would then like to use this for my <a  href="/categories/fotografie/">photographs</a>.</p>
<p>A demo gallery with the latest features can be found at <a  class='urlextern'  href="http://www.thregr.org/~wavexx/software/fgallery/demo/#10">www.thregr.org/</a>.</p>
<p>Website of the project: <a  class='urlextern'  href="http://www.thregr.org/~wavexx/software/fgallery/">www.thregr.org/~wavexx/software/fgallery/</a>.</p>]]></content:encoded></item><item><title>Verbesserungen im Wiki</title><link>https://natenom.de/2012/04/verbesserungen-im-wiki/</link><pubDate>Fri, 27 Apr 2012 18:55:01 +0000</pubDate><guid>https://natenom.de/2012/04/verbesserungen-im-wiki/</guid><description>&lt;p>Es gibt ein paar Verbesserungen in der Navigation des &lt;a title="http://wiki.natenom.de" href="http://wiki.natenom.de" target="_self">Wikis&lt;/a>:&lt;/p></description><content:encoded><![CDATA[<p>Es gibt ein paar Verbesserungen in der Navigation des <a title="http://wiki.natenom.de" href="http://wiki.natenom.de" target="_self">Wikis</a>:</p>
<ul>
<li>Die Navigation scrollt nun nicht mehr nach rechts mit, wenn einzelne Überschriften breiter sind als die Spalte.
<ul>
<li>
<p>Trotzdem werden nun auch zu lange Seitennamen in der Navigation komplett angezeigt, wenn man mit der Maus darüber geht.<br>
Vielen Dank an <a title="http://deltachaos.de" href="http://deltachaos.de" target="_self">Deltachaos</a>, der sich dafür die Zeit genommen und das technisch umgesetzt hat. Das JavaScript und das CSS für die Umsetzung gibt es im <a title="https://wiki.natenom.de/docs/sammelsurium/dokuwiki/lange_seitennamen_navigation/" href="https://wiki.natenom.de/docs/sammelsurium/dokuwiki/lange_seitennamen_navigation/" target="_self">Wiki</a>.<br>
So sieht das dann aus (ohne die Änderung wäre nach „…. zwischen Mumble-S“ alles abgeschnitten):</p> <div class="mceTemp"></p>
  <p>
    <figure id="attachment_13427" aria-describedby="caption-attachment-13427" style="width: 575px" class="wp-caption alignnone"><img loading="lazy" class="size-full wp-image-13427 " title="Lange Seitennamen anzeigen" src="/wp-content/uploads/2012/04/lange_seitennamen_anzeigen.png" alt="Lange Seitennamen anzeigen" srcset="/wp-content/uploads/2012/04/lange_seitennamen_anzeigen.png 575w, /wp-content/uploads/2012/04/lange_seitennamen_anzeigen-150x35.png 150w, /wp-content/uploads/2012/04/lange_seitennamen_anzeigen-300x70.png 300w" sizes="(max-width: 575px) 100vw, 575px" /><figcaption id="caption-attachment-13427" class="wp-caption-text">Lange Seitennamen anzeigen</figcaption></figure>
  </p>
</div>
</li>
<li>
<p>Man sieht keine Text-Vorschau der einzelnen Seiten mehr, was eher gestört hat als dass es hilfreich war.</p>
</li>
<li>
<p>Durch eine Änderung an der Konfiguration lädt die Navigation nun etwas schneller.</p>
</li>
<li>
<p>Die Seitennamen und Namensräume sind nun alphabetisch sortiert, was die Übersichtlichkeit sehr verbessert:</p>
<figure id="attachment_13402" aria-describedby="caption-attachment-13402" style="width: 400px" class="wp-caption alignnone"><img loading="lazy" class="size-full wp-image-13402" title="Navigation ist nun sortiert" src="/wp-content/uploads/2012/04/navigation_sortiert.png" alt="Navigation ist nun sortiert" srcset="/wp-content/uploads/2012/04/navigation_sortiert.png 400w, /wp-content/uploads/2012/04/navigation_sortiert-81x150.png 81w, /wp-content/uploads/2012/04/navigation_sortiert-162x300.png 162w" sizes="(max-width: 400px) 100vw, 400px" /><figcaption id="caption-attachment-13402" class="wp-caption-text">Navigation ist nun sortiert</figcaption></figure></li> </ul> 
<p>Hier gehts zum Wiki: <a  href="http://wiki.natenom.de"title="http://wiki.natenom.de">http://wiki.natenom.de</a>.</p>
</li>
</ul>
</li>
</ul>]]></content:encoded></item><item><title>Etherpad Lite (Node.js)</title><link>https://natenom.de/2011/08/etherpad-lite-node-js/</link><pubDate>Tue, 30 Aug 2011 11:54:38 +0000</pubDate><guid>https://natenom.de/2011/08/etherpad-lite-node-js/</guid><description>&lt;p>Wollte schon immer mal ein eigenes EtherPad installieren, weil man damit wirklich gut mit mehreren Leuten an etwas arbeiten kann; aber der Mix aus Javascript, Java und sonstwas war sehr abschreckend. Und die Option öffentlich verfügbare Pads zu nutzen war mir nicht so geheuer; schließlich weiß man nie wer wirklich was sieht und wie lange etwas online bleibt.&lt;/p></description><content:encoded><![CDATA[<p>Wollte schon immer mal ein eigenes EtherPad installieren, weil man damit wirklich gut mit mehreren Leuten an etwas arbeiten kann; aber der Mix aus Javascript, Java und sonstwas war sehr abschreckend. Und die Option öffentlich verfügbare Pads zu nutzen war mir nicht so geheuer; schließlich weiß man nie wer wirklich was sieht und wie lange etwas online bleibt.</p>
<p>Wie man ausserdem auf der Projektseite von EtherPad Lite lesen kann, braucht das alte EtherPad auch ordentlich Ressourcen (257 MB direkt nach dem Start, bis zu ~1 GB).</p>
<p>Das neue <a title="https://github.com/Pita/etherpad-lite/" href="https://github.com/Pita/etherpad-lite/" target="_self">Etherpad Lite</a> braucht nur <a title="http://nodejs.org/" href="http://nodejs.org/" target="_self">Node.js</a> und ist ziemlich einfach zu <a title="https://github.com/Pita/etherpad-lite/" href="https://github.com/Pita/etherpad-lite/" target="_self">installieren</a>. Lite deshalb, weil es viel weniger Ressourcen frisst (16 MB nach dem Start, bis zu ~30 MB).</p>
<p>So, nun haben wir auch so ein Ding, jedoch nicht öffentlich mit Passwort-Schutz :)</p>
<p>Schon aus Prinzip ist das Pad nur per https und ohne Erhebung von IP-Adressen erreichbar und  liegt auf einem mit <a title="https://de.wikipedia.org/wiki/Linux_Unified_Key_Setup" href="https://de.wikipedia.org/wiki/Linux_Unified_Key_Setup" target="_self">LUKS</a> verschlüsselten Datenträger; wenn später der Server an einen neuen Kunden geht oder heruntergefahren wird, kommt man auch nicht an die Daten ran :)</p>
<p><a title="https://de.wikipedia.org/wiki/Logical_Volume_Manager" href="https://de.wikipedia.org/wiki/Logical_Volume_Manager" target="_self">LVM</a> ist schon toll.</p>
<figure id="attachment_10558" aria-describedby="caption-attachment-10558" style="width: 395px" class="wp-caption alignnone"><img loading="lazy" class="size-full wp-image-10558 " title="EtherPad Lite" src="/wp-content/uploads/2011/08/etherpadlite.png" alt="EtherPad Lite" srcset="/wp-content/uploads/2011/08/etherpadlite.png 395w, /wp-content/uploads/2011/08/etherpadlite-150x101.png 150w, /wp-content/uploads/2011/08/etherpadlite-300x202.png 300w" sizes="(max-width: 395px) 100vw, 395px" /><figcaption id="caption-attachment-10558" class="wp-caption-text">EtherPad Lite</figcaption></figure>
<p>Gefunden bei: <a title="http://www.gulli.com/news/16978-etherpad-lite-2-jahre-herumprobieren-und-entschlackung-2011-08-29" href="http://www.gulli.com/news/16978-etherpad-lite-2-jahre-herumprobieren-und-entschlackung-2011-08-29" target="_self"><a  class='urlextern'  href="http://www.gulli.com/news/16978-etherpad-lite-2-jahre-herumprobieren-und-entschlackung-2011-08-29">http://www.gulli.com/news/16978-etherpad-lite-2-jahre-herumprobieren-und-entschlackung-2011-08-29</a></a></p>]]></content:encoded></item></channel></rss>