<?xml version="1.0" encoding="utf-8" standalone="yes"?> <?xml-stylesheet href="https://maik.io/pretty-feed-v3.xsl" type="text/xsl"?>

<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Code on maik.io</title>
    <link>https://maik.io/tags/code/</link>
    <description>Recent content in Code on maik.io</description>
    <generator>maik.io</generator>
    <language>de-de</language>
    <lastBuildDate>Tue, 20 Jan 2026 18:07:08 +0200</lastBuildDate>
    <atom:link href="https://maik.io/tags/code/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Better Monospace</title>
      <link>https://maik.io/notes/2026-01-20-better-monospace/</link>
      <pubDate>Tue, 20 Jan 2026 18:07:08 +0200</pubDate>
      <guid>https://maik.io/notes/2026-01-20-better-monospace/</guid>
      <description>&lt;p&gt;Vor &lt;a href=&#34;https://maik.io/notes/2009-08-12-better-helvetica/&#34; title=&#34;Better Helvetica | maik.io&#34; target=&#34;_blank&#34; &gt;langer Zeit&lt;/a&gt; hatte ich mir einmal CSS-Code notiert, der Helvetica oder ähnliche Schriftarten nutzt, sofern sie lokal auf dem jeweiligen System verfügbar sind. Kürzlich brauchte ich etwas Vergleichbares für Code, also Schriftarten mit fester Laufweite. Nach etwas Recherche bin ich auf folgenden Code gekommen.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;font-family&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;ui-monospace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;SFMono-Regular&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SF Mono&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;nt&#34;&gt;Menlo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;Monaco&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;nt&#34;&gt;Consolas&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Cascadia Mono&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;s2&#34;&gt;&amp;#34;Liberation Mono&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;DejaVu Sans Mono&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;s2&#34;&gt;&amp;#34;Courier New&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;monospace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded>
      <![CDATA[<p>Vor <a href="https://maik.io/notes/2009-08-12-better-helvetica/" title="Better Helvetica | maik.io" target="_blank" >langer Zeit</a> hatte ich mir einmal CSS-Code notiert, der Helvetica oder ähnliche Schriftarten nutzt, sofern sie lokal auf dem jeweiligen System verfügbar sind. Kürzlich brauchte ich etwas Vergleichbares für Code, also Schriftarten mit fester Laufweite. Nach etwas Recherche bin ich auf folgenden Code gekommen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">font-family</span><span class="o">:</span> <span class="nt">ui-monospace</span><span class="o">,</span> <span class="nt">SFMono-Regular</span><span class="o">,</span> <span class="s2">&#34;SF Mono&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">             <span class="nt">Menlo</span><span class="o">,</span> <span class="nt">Monaco</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">             <span class="nt">Consolas</span><span class="o">,</span> <span class="s2">&#34;Cascadia Mono&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">             <span class="s2">&#34;Liberation Mono&#34;</span><span class="o">,</span> <span class="s2">&#34;DejaVu Sans Mono&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">             <span class="s2">&#34;Courier New&#34;</span><span class="o">,</span> <span class="nt">monospace</span><span class="o">;</span>
</span></span></code></pre></div>]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Alte Beiträge in Hugo markieren</title>
      <link>https://maik.io/notes/2025-10-21-alte-beitraege-in-hugo-markieren/</link>
      <pubDate>Tue, 21 Oct 2025 15:58:00 +0200</pubDate>
      <guid>https://maik.io/notes/2025-10-21-alte-beitraege-in-hugo-markieren/</guid>
      <description>&lt;p&gt;Ich habe eine kleine Hinweisfunktion eingebaut, die bei Beiträgen erscheint, die älter als ein Jahr sind. Mir war wichtig, dass dieser Hinweis nicht bei reinen Fotobeiträgen auftaucht – Fotos verlieren schließlich selten an Relevanz.
Zuerst habe ich selbst eine funktionierende Version geschrieben, anschließend den Code von einem Sprachmodell noch etwas optimieren lassen. Jetzt läuft bei mir folgende Variante:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/* Tags prüfen */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tags&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;slice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tags&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tagsLower&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;apply&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tags&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;lower&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;hasPhoto&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tagsLower&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;photo&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/* Relevantes Datum bestimmen und Stichtag berechnen */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pageDate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;AsTime&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;or&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Lastmod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;PublishDate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;oneYearAgo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;AddDate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*Hinweis nur auf echten Seiten, mit gültigem Datum, älter als 1 Jahr und nicht beim Tag &amp;#34;photo&amp;#34; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;IsPage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;not&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;hasPhoto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;gt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pageDate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Unix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pageDate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;oneYearAgo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;alert alert-warning&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Hinweis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Dieser&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Artikel&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ist&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;über&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ein&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Jahr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;alt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Die&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Informationen&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;könnten&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;veraltet&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sein&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded>
      <![CDATA[<p>Ich habe eine kleine Hinweisfunktion eingebaut, die bei Beiträgen erscheint, die älter als ein Jahr sind. Mir war wichtig, dass dieser Hinweis nicht bei reinen Fotobeiträgen auftaucht – Fotos verlieren schließlich selten an Relevanz.
Zuerst habe ich selbst eine funktionierende Version geschrieben, anschließend den Code von einem Sprachmodell noch etwas optimieren lassen. Jetzt läuft bei mir folgende Variante:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="cm">/* Tags prüfen */</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="err">$</span><span class="nx">tags</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">default</span><span class="w"> </span><span class="p">(</span><span class="nx">slice</span><span class="p">)</span><span class="w"> </span><span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">tags</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="err">$</span><span class="nx">tagsLower</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">apply</span><span class="w"> </span><span class="err">$</span><span class="nx">tags</span><span class="w"> </span><span class="s">&#34;lower&#34;</span><span class="w"> </span><span class="s">&#34;.&#34;</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="err">$</span><span class="nx">hasPhoto</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="err">$</span><span class="nx">tagsLower</span><span class="w"> </span><span class="s">&#34;photo&#34;</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="cm">/* Relevantes Datum bestimmen und Stichtag berechnen */</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="err">$</span><span class="nx">pageDate</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">time</span><span class="p">.</span><span class="nf">AsTime</span><span class="w"> </span><span class="p">(</span><span class="nx">or</span><span class="w"> </span><span class="p">.</span><span class="nx">Lastmod</span><span class="w"> </span><span class="p">.</span><span class="nx">PublishDate</span><span class="w"> </span><span class="p">.</span><span class="nx">Date</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="err">$</span><span class="nx">oneYearAgo</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">(</span><span class="nx">now</span><span class="p">).</span><span class="nx">AddDate</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="cm">/*Hinweis nur auf echten Seiten, mit gültigem Datum, älter als 1 Jahr und nicht beim Tag &#34;photo&#34; */</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="p">.</span><span class="nf">IsPage</span><span class="w"> </span><span class="p">(</span><span class="nx">not</span><span class="w"> </span><span class="err">$</span><span class="nx">hasPhoto</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nf">gt</span><span class="w"> </span><span class="p">(</span><span class="err">$</span><span class="nx">pageDate</span><span class="p">.</span><span class="nx">Unix</span><span class="p">)</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nx">lt</span><span class="w"> </span><span class="err">$</span><span class="nx">pageDate</span><span class="w"> </span><span class="err">$</span><span class="nx">oneYearAgo</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="p">&lt;</span><span class="nx">div</span><span class="w"> </span><span class="nx">class</span><span class="p">=</span><span class="s">&#34;alert alert-warning&#34;</span><span class="p">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Hinweis</span><span class="p">:</span><span class="w"> </span><span class="nx">Dieser</span><span class="w"> </span><span class="nx">Artikel</span><span class="w"> </span><span class="nx">ist</span><span class="w"> </span><span class="nx">über</span><span class="w"> </span><span class="nx">ein</span><span class="w"> </span><span class="nx">Jahr</span><span class="w"> </span><span class="nx">alt</span><span class="p">.</span><span class="w"> </span><span class="nx">Die</span><span class="w"> </span><span class="nx">Informationen</span><span class="w"> </span><span class="nx">könnten</span><span class="w"> </span><span class="nx">veraltet</span><span class="w"> </span><span class="nx">sein</span><span class="p">.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="p">&lt;</span><span class="o">/</span><span class="nx">div</span><span class="p">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="nx">end</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span></code></pre></div>]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Traditionelle Programmierkenntnisse</title>
      <link>https://maik.io/notes/2024-11-01-traditionelle-programmierkenntnisse/</link>
      <pubDate>Fri, 01 Nov 2024 11:14:29 +0100</pubDate>
      <guid>https://maik.io/notes/2024-11-01-traditionelle-programmierkenntnisse/</guid>
      <description>&lt;p&gt;Ein spannender Artikel der &amp;ldquo;Zeit&amp;rdquo; beleuchtet die Frage, ob es angesichts des KI-Zeitalters noch sinnvoll ist, Programmieren zu lernen. Die zunehmende Automatisierung und der Einsatz von Künstlicher Intelligenz werfen die Überlegung auf, ob traditionelle Programmierkenntnisse an Bedeutung verlieren.&lt;/p&gt;
&lt;p&gt;Eva Wolfangel schreibt in »&lt;a href=&#34;https://www.zeit.de/digital/2024-10/programmieren-kuenstliche-intelligenz-technologie/komplettansicht&#34; title=&#34;Programmieren: Programmieren lernen – kann das weg?&#34; target=&#34;_blank&#34; &gt;Programmieren: Programmieren lernen – kann das weg?&lt;/a&gt;« für zeit.de&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Das Sicherheitsdenken beeinflusst auch seine Perspektive auf ChatGPT und Co. Aus seiner Sicht ist es nicht ratsam, Dinge von KI erledigen zu lassen, die man nicht auch selbst kann: &amp;ldquo;Man sollte schon wissen, was man tut&amp;rdquo;, sagt er, &amp;ldquo;sonst ist es fahrlässig: erkläre mal deiner Versicherung, dass du nicht wusstest, was deine Software tut.&amp;rdquo; Schließlich sind sogenannte Supply-Chain-Attacken weit verbreitet, bei denen Angreifer an einer Stelle in eine Software oder ein System eindringen und dadurch überall dort Schaden anrichten können, wo das System eingesetzt wird oder die Software als Baustein verwendet. Von daher könne KI zwar Anfängern helfen, Dinge zu entwickeln, mit denen sie sich nicht auskennen – &amp;ldquo;aber wenn ich das seit zehn Jahren mache, sehe ich sofort die Angriffsmöglichkeiten&amp;rdquo;.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Ein spannender Artikel der &ldquo;Zeit&rdquo; beleuchtet die Frage, ob es angesichts des KI-Zeitalters noch sinnvoll ist, Programmieren zu lernen. Die zunehmende Automatisierung und der Einsatz von Künstlicher Intelligenz werfen die Überlegung auf, ob traditionelle Programmierkenntnisse an Bedeutung verlieren.</p>
<p>Eva Wolfangel schreibt in »<a href="https://www.zeit.de/digital/2024-10/programmieren-kuenstliche-intelligenz-technologie/komplettansicht" title="Programmieren: Programmieren lernen – kann das weg?" target="_blank" >Programmieren: Programmieren lernen – kann das weg?</a>« für zeit.de</p>
<blockquote>
<p>Das Sicherheitsdenken beeinflusst auch seine Perspektive auf ChatGPT und Co. Aus seiner Sicht ist es nicht ratsam, Dinge von KI erledigen zu lassen, die man nicht auch selbst kann: &ldquo;Man sollte schon wissen, was man tut&rdquo;, sagt er, &ldquo;sonst ist es fahrlässig: erkläre mal deiner Versicherung, dass du nicht wusstest, was deine Software tut.&rdquo; Schließlich sind sogenannte Supply-Chain-Attacken weit verbreitet, bei denen Angreifer an einer Stelle in eine Software oder ein System eindringen und dadurch überall dort Schaden anrichten können, wo das System eingesetzt wird oder die Software als Baustein verwendet. Von daher könne KI zwar Anfängern helfen, Dinge zu entwickeln, mit denen sie sich nicht auskennen – &ldquo;aber wenn ich das seit zehn Jahren mache, sehe ich sofort die Angriffsmöglichkeiten&rdquo;.</p>
</blockquote>
<p>Ein toller Artikel, jedoch wird die Antwort immer &ldquo;Ja&rdquo; lauten, da Modelle immer mit Daten versorgt werden müssen.
Unabhängig vom Fortschritt der KI bleibt das Verständnis für Programmierung ein fundamentaler Baustein im digitalen Zeitalter.</p>
]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Ein Viertel</title>
      <link>https://maik.io/notes/2024-10-30-ein-viertel/</link>
      <pubDate>Wed, 30 Oct 2024 14:30:00 +0100</pubDate>
      <guid>https://maik.io/notes/2024-10-30-ein-viertel/</guid>
      <description>&lt;p&gt;Ich frage mich bei der nachstehenden Meldung, ob dies der Auslöser dafür sein könnte, dass die Produkte von Google kontinuierlich an Qualität einbüßen. Wie erwartet, weist Google jegliche Behauptungen dieser Art vehement zurück.&lt;/p&gt;
&lt;p&gt;Mike Faust schreibt in »&lt;a href=&#34;https://www.golem.de/news/kuenstliche-intelligenz-google-erzeugt-ein-viertel-seines-codes-mit-ki-2410-190320.html&#34; title=&#34;Künstliche Intelligenz: Google erzeugt ein Viertel seines Codes mit KI&#34; target=&#34;_blank&#34; &gt;Künstliche Intelligenz: Google erzeugt ein Viertel seines Codes mit KI&lt;/a&gt;« für golem.de&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Auch die Entwickler von Google verwenden für die Weiterentwicklung ihrer Produkte künstliche Intelligenz. Mittlerweile wurde ein Viertel des verwendeten Codes von KI generiert. Dieser werde geprüft und akzeptiert, bevor er zum Einsatz komme, sagte der CEO von Google und Alphabet, Sundar Pichai, während der Vorstellung des Geschäftsberichts zum 3. Quartal 2024.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Ich frage mich bei der nachstehenden Meldung, ob dies der Auslöser dafür sein könnte, dass die Produkte von Google kontinuierlich an Qualität einbüßen. Wie erwartet, weist Google jegliche Behauptungen dieser Art vehement zurück.</p>
<p>Mike Faust schreibt in »<a href="https://www.golem.de/news/kuenstliche-intelligenz-google-erzeugt-ein-viertel-seines-codes-mit-ki-2410-190320.html" title="Künstliche Intelligenz: Google erzeugt ein Viertel seines Codes mit KI" target="_blank" >Künstliche Intelligenz: Google erzeugt ein Viertel seines Codes mit KI</a>« für golem.de</p>
<blockquote>
<p>Auch die Entwickler von Google verwenden für die Weiterentwicklung ihrer Produkte künstliche Intelligenz. Mittlerweile wurde ein Viertel des verwendeten Codes von KI generiert. Dieser werde geprüft und akzeptiert, bevor er zum Einsatz komme, sagte der CEO von Google und Alphabet, Sundar Pichai, während der Vorstellung des Geschäftsberichts zum 3. Quartal 2024.</p>
</blockquote>
]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Auto Squash in GitHub Respository</title>
      <link>https://maik.io/notes/2024-10-25-auto-squash-in-github-respository/</link>
      <pubDate>Fri, 25 Oct 2024 16:19:35 +0200</pubDate>
      <guid>https://maik.io/notes/2024-10-25-auto-squash-in-github-respository/</guid>
      <description>&lt;p&gt;Das Blog wird mit dem CMS Hugo betrieben und die Inhalte versioniert auf GitHub abgelegt. Gelegentlich werden auf GitHub auch Dateien abgelegt, die im Blog verlinkt werden sollen. Diese Dateien befinden sich in einem anderen &lt;a href=&#34;https://github.com/Maik-Wi/maik-wi.github.io&#34; target=&#34;_blank&#34; &gt;öffentlichen Repository&lt;/a&gt;, für das eine Versionierung nicht erforderlich ist.&lt;/p&gt;
&lt;p&gt;Um die Anzahl der Commits zu reduzieren, wurde eine Automatisierung mittels &lt;code&gt;Squash Commits&lt;/code&gt; implementiert. Dies geschieht durch den Einsatz von GitHub Actions, wodurch alle Änderungen auf einen einzigen Commit zusammengeführt werden. Im Folgenden wird der Prozess beschrieben.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Das Blog wird mit dem CMS Hugo betrieben und die Inhalte versioniert auf GitHub abgelegt. Gelegentlich werden auf GitHub auch Dateien abgelegt, die im Blog verlinkt werden sollen. Diese Dateien befinden sich in einem anderen <a href="https://github.com/Maik-Wi/maik-wi.github.io" target="_blank" >öffentlichen Repository</a>, für das eine Versionierung nicht erforderlich ist.</p>
<p>Um die Anzahl der Commits zu reduzieren, wurde eine Automatisierung mittels <code>Squash Commits</code> implementiert. Dies geschieht durch den Einsatz von GitHub Actions, wodurch alle Änderungen auf einen einzigen Commit zusammengeführt werden. Im Folgenden wird der Prozess beschrieben.</p>
<p>Zunächst ist der Zugriff auf die Repository-Einstellungen erforderlich. Unter dem Abschnitt „Actions&quot; findet sich die Option „Actions Permissions&quot;, mit der die Erlaubnis zur Verwendung von Actions von Drittanbietern oder aus dem GitHub Marketplace festgelegt werden kann. Diese Einstellung kann allerdings durch Organisationsrichtlinien oder Sicherheitsvorgaben eingeschränkt sein, um mögliche Sicherheitsrisiken zu minimieren.</p>
<p>Nach erfolgreicher Konfiguration lässt sich die Funktionalität überprüfen, indem die GitHub Action getestet und in das eigene Repository integriert wird.</p>
<p>Nachfolgend ist der Code für die GitHub Action aufgeführt.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Squash Commits</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">push</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">branches</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">jobs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">squash_commits</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l">ubuntu-latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Checkout Repository</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/checkout@v2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Configure Git</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">          git config --global user.email &#34;your-email@example.com&#34;
</span></span></span><span class="line"><span class="cl"><span class="sd">          git config --global user.name &#34;Your Name&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Squash all commits</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">          git reset --soft $(git commit-tree HEAD^{tree} -m &#34;Single commit&#34;)
</span></span></span><span class="line"><span class="cl"><span class="sd">          git commit --amend -m &#34;Squashed commit&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Push changes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">          git push --force</span><span class="w">
</span></span></span></code></pre></div>]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Bookmarklet Blogging</title>
      <link>https://maik.io/notes/2024-08-19-bookmarklet-blogging/</link>
      <pubDate>Mon, 19 Aug 2024 20:08:00 +0200</pubDate>
      <guid>https://maik.io/notes/2024-08-19-bookmarklet-blogging/</guid>
      <description>&lt;p&gt;Kürzlich bin ich auf ein spannendes &lt;a href=&#34;https://nicolas-hoizey.com/articles/2023/02/08/a-bookmarklet-to-create-a-new-link-content-markdown-on-github/&#34; title=&#34;A bookmarklet to create a new link content Markdown on GitHub&#34; target=&#34;_blank&#34; &gt;Bookmarklet bei Nicolas&lt;/a&gt; gestoßen. Es soll das Link-Blogging für alle erleichtern, die ein auf GitHub gehostetes Blog haben. Das Skript ist zwar noch nicht ganz perfekt, aber es hat mich dazu inspiriert, es weiterzuentwickeln.&lt;/p&gt;
&lt;p&gt;Hier ist meine Version des Bookmarklets&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Funktion zum Erstellen eines &amp;#34;Slug&amp;#34; aus einem Text
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;slugify&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;                &lt;span class=&#34;c1&#34;&gt;// Den Text als Zeichenkette behandeln
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replaceAll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;           &lt;span class=&#34;c1&#34;&gt;// Schrägstriche (/) durch Leerzeichen ersetzen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;normalize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NFD&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;               &lt;span class=&#34;c1&#34;&gt;// Unicode normalisieren (diakritische Zeichen trennen)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/[^\w\s-]+/g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;      &lt;span class=&#34;c1&#34;&gt;// Sonderzeichen entfernen (außer Buchstaben, Zahlen, Leerzeichen, Bindestriche)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;toLowerCase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;                  &lt;span class=&#34;c1&#34;&gt;// In Kleinbuchstaben umwandeln
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/\s+/g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;           &lt;span class=&#34;c1&#34;&gt;// Mehrere Leerzeichen auf ein einzelnes reduzieren
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;                         &lt;span class=&#34;c1&#34;&gt;// Führende und endende Leerzeichen entfernen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/ +/g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;            &lt;span class=&#34;c1&#34;&gt;// Alle Leerzeichen durch Bindestriche ersetzen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;                               &lt;span class=&#34;c1&#34;&gt;// Slug zurückgeben
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Titel der aktuellen Seite aus dem Dokument abrufen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;pageTitle&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Falls ein Text markiert ist, diesen als &amp;#34;linkSelection&amp;#34; setzen, ansonsten leer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;linkSelection&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;getSelection&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;?&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getSelection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Inhalt für den Link ermitteln:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Zuerst den markierten Text verwenden, falls vorhanden, ansonsten eine Meta-Beschreibung,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// oder den ersten Absatz im &amp;lt;main&amp;gt;, &amp;lt;article&amp;gt;, oder &amp;lt;p&amp;gt;-Tag
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;linkContent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;linkSelection&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;querySelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;head meta[name=description]&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;querySelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;main p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;textContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;querySelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;article p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;textContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;querySelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;textContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Die URL der aktuellen Seite
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;linkUrl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Eingabeaufforderung für den Link-Titel (Standardwert: Seiten-Titel)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Title of the link?&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;pageTitle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!==&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// Nur fortfahren, wenn der Benutzer einen Titel angegeben hat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// Eingabeaufforderung für den Link-Slug (Standardwert: aus Titel generierter Slug)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;slug&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Slug of the link?&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;slugify&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;slug&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!==&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// Nur fortfahren, wenn der Benutzer einen Slug angegeben hat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;// Das aktuelle Datum und die Uhrzeit im ISO-Format abrufen und in lesbare Form bringen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;currentDate&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;toISOString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;T&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/\.\d{3}Z/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; +00:00&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;// Dateiinhalt für den Blogeintrag erstellen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fileContent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`---\n`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;sb&#34;&gt;`date: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;currentDate&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;\n`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;sb&#34;&gt;`title: &amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;\n`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;sb&#34;&gt;`authors: &amp;#34;maik&amp;#34;\n`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;sb&#34;&gt;`tags: []\n`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;sb&#34;&gt;`---\n\n`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;sb&#34;&gt;`[&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;linkUrl&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt; &amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;) für &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;linkUrl&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;\n\n`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;linkContent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;?&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;linkContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replaceAll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;\n&amp;gt; &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;\n`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;// GitHub-URL für das Erstellen einer neuen Datei zusammenbauen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;githubUrl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`https://github.com/Maik-Wi/blog/new/main/?`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;sb&#34;&gt;`filename=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`content/notes/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;currentDate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;slice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;slug&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;-index.md`&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;sb&#34;&gt;`&amp;amp;value=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fileContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;sb&#34;&gt;`&amp;amp;message=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`New link: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;// Die URL in einem neuen Fenster öffnen, sodass der Nutzer sie bei GitHub weiterbearbeiten kann
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;githubUrl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded>
      <![CDATA[<p>Kürzlich bin ich auf ein spannendes <a href="https://nicolas-hoizey.com/articles/2023/02/08/a-bookmarklet-to-create-a-new-link-content-markdown-on-github/" title="A bookmarklet to create a new link content Markdown on GitHub" target="_blank" >Bookmarklet bei Nicolas</a> gestoßen. Es soll das Link-Blogging für alle erleichtern, die ein auf GitHub gehostetes Blog haben. Das Skript ist zwar noch nicht ganz perfekt, aber es hat mich dazu inspiriert, es weiterzuentwickeln.</p>
<p>Hier ist meine Version des Bookmarklets</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Funktion zum Erstellen eines &#34;Slug&#34; aus einem Text
</span></span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">slugify</span> <span class="o">=</span> <span class="nx">text</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kd">let</span> <span class="nx">str</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">toString</span><span class="p">();</span>                <span class="c1">// Den Text als Zeichenkette behandeln
</span></span></span><span class="line"><span class="cl">        <span class="nx">str</span> <span class="o">=</span> <span class="nx">str</span><span class="p">.</span><span class="nx">replaceAll</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="p">,</span> <span class="s2">&#34; &#34;</span><span class="p">);</span>           <span class="c1">// Schrägstriche (/) durch Leerzeichen ersetzen
</span></span></span><span class="line"><span class="cl">        <span class="nx">str</span> <span class="o">=</span> <span class="nx">str</span><span class="p">.</span><span class="nx">normalize</span><span class="p">(</span><span class="s2">&#34;NFD&#34;</span><span class="p">);</span>               <span class="c1">// Unicode normalisieren (diakritische Zeichen trennen)
</span></span></span><span class="line"><span class="cl">        <span class="nx">str</span> <span class="o">=</span> <span class="nx">str</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/[^\w\s-]+/g</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">);</span>      <span class="c1">// Sonderzeichen entfernen (außer Buchstaben, Zahlen, Leerzeichen, Bindestriche)
</span></span></span><span class="line"><span class="cl">        <span class="nx">str</span> <span class="o">=</span> <span class="nx">str</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">();</span>                  <span class="c1">// In Kleinbuchstaben umwandeln
</span></span></span><span class="line"><span class="cl">        <span class="nx">str</span> <span class="o">=</span> <span class="nx">str</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/\s+/g</span><span class="p">,</span> <span class="s2">&#34; &#34;</span><span class="p">);</span>           <span class="c1">// Mehrere Leerzeichen auf ein einzelnes reduzieren
</span></span></span><span class="line"><span class="cl">        <span class="nx">str</span> <span class="o">=</span> <span class="nx">str</span><span class="p">.</span><span class="nx">trim</span><span class="p">();</span>                         <span class="c1">// Führende und endende Leerzeichen entfernen
</span></span></span><span class="line"><span class="cl">        <span class="nx">str</span> <span class="o">=</span> <span class="nx">str</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/ +/g</span><span class="p">,</span> <span class="s2">&#34;-&#34;</span><span class="p">);</span>            <span class="c1">// Alle Leerzeichen durch Bindestriche ersetzen
</span></span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nx">str</span><span class="p">;</span>                               <span class="c1">// Slug zurückgeben
</span></span></span><span class="line"><span class="cl">    <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Titel der aktuellen Seite aus dem Dokument abrufen
</span></span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">pageTitle</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nb">document</span><span class="p">.</span><span class="nx">title</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Falls ein Text markiert ist, diesen als &#34;linkSelection&#34; setzen, ansonsten leer
</span></span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">linkSelection</span> <span class="o">=</span> <span class="s2">&#34;getSelection&#34;</span> <span class="k">in</span> <span class="nb">window</span> <span class="o">?</span> <span class="nb">window</span><span class="p">.</span><span class="nx">getSelection</span><span class="p">().</span><span class="nx">toString</span><span class="p">().</span><span class="nx">trim</span><span class="p">()</span> <span class="o">:</span> <span class="s2">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Inhalt für den Link ermitteln:
</span></span></span><span class="line"><span class="cl">    <span class="c1">// Zuerst den markierten Text verwenden, falls vorhanden, ansonsten eine Meta-Beschreibung,
</span></span></span><span class="line"><span class="cl">    <span class="c1">// oder den ersten Absatz im &lt;main&gt;, &lt;article&gt;, oder &lt;p&gt;-Tag
</span></span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">linkContent</span> <span class="o">=</span> <span class="nx">linkSelection</span> <span class="o">||</span>
</span></span><span class="line"><span class="cl">        <span class="nb">window</span><span class="p">.</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&#34;head meta[name=description]&#34;</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">trim</span><span class="p">()</span> <span class="o">||</span>
</span></span><span class="line"><span class="cl">        <span class="nb">window</span><span class="p">.</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&#34;main p&#34;</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">textContent</span><span class="p">.</span><span class="nx">trim</span><span class="p">()</span> <span class="o">||</span>
</span></span><span class="line"><span class="cl">        <span class="nb">window</span><span class="p">.</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&#34;article p&#34;</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">textContent</span><span class="p">.</span><span class="nx">trim</span><span class="p">()</span> <span class="o">||</span>
</span></span><span class="line"><span class="cl">        <span class="nb">window</span><span class="p">.</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&#34;p&#34;</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">textContent</span><span class="p">.</span><span class="nx">trim</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Die URL der aktuellen Seite
</span></span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">linkUrl</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Eingabeaufforderung für den Link-Titel (Standardwert: Seiten-Titel)
</span></span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">title</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">prompt</span><span class="p">(</span><span class="s2">&#34;Title of the link?&#34;</span><span class="p">,</span> <span class="nx">pageTitle</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">title</span> <span class="o">!==</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span>  <span class="c1">// Nur fortfahren, wenn der Benutzer einen Titel angegeben hat
</span></span></span><span class="line"><span class="cl">        <span class="c1">// Eingabeaufforderung für den Link-Slug (Standardwert: aus Titel generierter Slug)
</span></span></span><span class="line"><span class="cl">        <span class="kd">let</span> <span class="nx">slug</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">prompt</span><span class="p">(</span><span class="s2">&#34;Slug of the link?&#34;</span><span class="p">,</span> <span class="nx">slugify</span><span class="p">(</span><span class="nx">title</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">slug</span> <span class="o">!==</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span>  <span class="c1">// Nur fortfahren, wenn der Benutzer einen Slug angegeben hat
</span></span></span><span class="line"><span class="cl">            <span class="c1">// Das aktuelle Datum und die Uhrzeit im ISO-Format abrufen und in lesbare Form bringen
</span></span></span><span class="line"><span class="cl">            <span class="kr">const</span> <span class="nx">currentDate</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">()).</span><span class="nx">toISOString</span><span class="p">().</span><span class="nx">replace</span><span class="p">(</span><span class="s2">&#34;T&#34;</span><span class="p">,</span> <span class="s2">&#34; &#34;</span><span class="p">).</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/\.\d{3}Z/</span><span class="p">,</span> <span class="s2">&#34; +00:00&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// Dateiinhalt für den Blogeintrag erstellen
</span></span></span><span class="line"><span class="cl">            <span class="kd">let</span> <span class="nx">fileContent</span> <span class="o">=</span> <span class="sb">`---\n`</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">                <span class="sb">`date: </span><span class="si">${</span><span class="nx">currentDate</span><span class="si">}</span><span class="sb">\n`</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">                <span class="sb">`title: &#34;</span><span class="si">${</span><span class="nx">title</span><span class="si">}</span><span class="sb">&#34;\n`</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">                <span class="sb">`authors: &#34;maik&#34;\n`</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">                <span class="sb">`tags: []\n`</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">                <span class="sb">`---\n\n`</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">                <span class="sb">`[</span><span class="si">${</span><span class="nx">title</span><span class="si">}</span><span class="sb">](</span><span class="si">${</span><span class="nx">linkUrl</span><span class="si">}</span><span class="sb"> &#34;</span><span class="si">${</span><span class="nx">title</span><span class="si">}</span><span class="sb">&#34;) für </span><span class="si">${</span><span class="nx">linkUrl</span><span class="si">}</span><span class="sb">\n\n`</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">                <span class="sb">`</span><span class="si">${</span><span class="nx">linkContent</span> <span class="o">?</span> <span class="nx">linkContent</span><span class="p">.</span><span class="nx">replaceAll</span><span class="p">(</span><span class="s2">&#34;\n&#34;</span><span class="p">,</span> <span class="s2">&#34;\n&gt; &#34;</span><span class="p">)</span> <span class="o">:</span> <span class="s2">&#34;&#34;</span><span class="si">}</span><span class="sb">\n`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// GitHub-URL für das Erstellen einer neuen Datei zusammenbauen
</span></span></span><span class="line"><span class="cl">            <span class="kd">let</span> <span class="nx">githubUrl</span> <span class="o">=</span> <span class="sb">`https://github.com/Maik-Wi/blog/new/main/?`</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">                <span class="sb">`filename=</span><span class="si">${</span><span class="sb">`content/notes/</span><span class="si">${</span><span class="nx">currentDate</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span><span class="si">}</span><span class="sb">-</span><span class="si">${</span><span class="nx">slug</span><span class="si">}</span><span class="sb">-index.md`</span><span class="si">}</span><span class="sb">`</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">                <span class="sb">`&amp;value=</span><span class="si">${</span><span class="nb">encodeURIComponent</span><span class="p">(</span><span class="nx">fileContent</span><span class="p">)</span><span class="si">}</span><span class="sb">`</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">                <span class="sb">`&amp;message=</span><span class="si">${</span><span class="nb">encodeURIComponent</span><span class="p">(</span><span class="sb">`New link: </span><span class="si">${</span><span class="nx">title</span><span class="si">}</span><span class="sb">`</span><span class="p">)</span><span class="si">}</span><span class="sb">`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// Die URL in einem neuen Fenster öffnen, sodass der Nutzer sie bei GitHub weiterbearbeiten kann
</span></span></span><span class="line"><span class="cl">            <span class="nb">window</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span><span class="nx">githubUrl</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">})();</span>
</span></span></code></pre></div>]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Mit CSS gestalten</title>
      <link>https://maik.io/notes/2024-07-16-mit-css-gestalten/</link>
      <pubDate>Tue, 16 Jul 2024 13:54:15 +0100</pubDate>
      <guid>https://maik.io/notes/2024-07-16-mit-css-gestalten/</guid>
      <description>&lt;p&gt;Auf dem Blog onli-blogging.de von Onli bin ich auf einen spannenden Beitrag gestoßen. Dort wird gezeigt, &lt;a href=&#34;https://www.onli-blogging.de/2384/Externe-Links-mit-CSS-kennzeichnen.html&#34; target=&#34;_blank&#34; &gt;wie man ausschließlich Links, die zu externen Seiten führen, mit CSS gestalten kann&lt;/a&gt;. Das gefällt mir, da es erneut dazu beiträgt, den Einsatz von JavaScript zu verringern.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Auf dem Blog onli-blogging.de von Onli bin ich auf einen spannenden Beitrag gestoßen. Dort wird gezeigt, <a href="https://www.onli-blogging.de/2384/Externe-Links-mit-CSS-kennzeichnen.html" target="_blank" >wie man ausschließlich Links, die zu externen Seiten führen, mit CSS gestalten kann</a>. Das gefällt mir, da es erneut dazu beiträgt, den Einsatz von JavaScript zu verringern.</p>
]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Bookmarklet for Linkblogging</title>
      <link>https://maik.io/notes/2024-04-24-bookmarklet-for-linkblogging/</link>
      <pubDate>Wed, 24 Apr 2024 19:28:40 +0100</pubDate>
      <guid>https://maik.io/notes/2024-04-24-bookmarklet-for-linkblogging/</guid>
      <description>&lt;p&gt;Stammleser meiner Webseite werden zweifellos festgestellt haben, dass meine Artikel einem klaren Strukturierungsmuster folgen.
Jedes Mal, wenn ich ein aussagekräftiges Zitat aus einem tollen Artikel aufzeigen will, beginnt der Text-Block mit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$AUTOR verfasst in »$TITEL_DES_ARTIKELS« für $DOMAIN
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; $ZITIERTER_ABSATZ
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Für die Erstellung unter iOS nutze ich die App Kurzbefehle. Auf meinem ThinkPad musste ich jedoch eine alternative Lösung finden. Daher habe ich kurzerhand ein Bookmarklet entwickelt, das ich mithilfe von ChatGPT ergänzt habe.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Stammleser meiner Webseite werden zweifellos festgestellt haben, dass meine Artikel einem klaren Strukturierungsmuster folgen.
Jedes Mal, wenn ich ein aussagekräftiges Zitat aus einem tollen Artikel aufzeigen will, beginnt der Text-Block mit:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$AUTOR verfasst in »$TITEL_DES_ARTIKELS« für $DOMAIN
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&gt; $ZITIERTER_ABSATZ
</span></span></code></pre></div><p>Für die Erstellung unter iOS nutze ich die App Kurzbefehle. Auf meinem ThinkPad musste ich jedoch eine alternative Lösung finden. Daher habe ich kurzerhand ein Bookmarklet entwickelt, das ich mithilfe von ChatGPT ergänzt habe.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="nl">javascript</span><span class="p">:</span><span class="w"> </span><span class="p">(</span><span class="n">function</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">var</span><span class="w"> </span><span class="n">currentPageUrl</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">window</span><span class="p">.</span><span class="na">location</span><span class="p">.</span><span class="na">href</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">var</span><span class="w"> </span><span class="n">currentPageHostname</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">URL</span><span class="p">(</span><span class="n">currentPageUrl</span><span class="p">).</span><span class="na">hostname</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">var</span><span class="w"> </span><span class="n">selectedText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">window</span><span class="p">.</span><span class="na">getSelection</span><span class="p">().</span><span class="na">toString</span><span class="p">().</span><span class="na">trim</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">var</span><span class="w"> </span><span class="n">pageTitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">document</span><span class="p">.</span><span class="na">title</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">var</span><span class="w"> </span><span class="n">pageAuthor</span><span class="w"> </span><span class="o">=</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">document</span><span class="p">.</span><span class="na">querySelector</span><span class="p">(</span><span class="err">&#39;</span><span class="n">meta</span><span class="o">[</span><span class="n">name</span><span class="o">=</span><span class="s">&#34;author&#34;</span><span class="o">]</span><span class="err">&#39;</span><span class="p">).</span><span class="na">content</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">var</span><span class="w"> </span><span class="n">currentDate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Date</span><span class="p">().</span><span class="na">toISOString</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">selectedText</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">alert</span><span class="p">(</span><span class="s">&#34;Bitte markieren Sie einen Text auf der Seite.&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">return</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">var</span><span class="w"> </span><span class="n">markdownContent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">`</span><span class="o">---</span><span class="err">\</span><span class="n">nlayout</span><span class="p">:</span><span class="w"> </span><span class="n">post</span><span class="err">\</span><span class="n">ntitle</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="err">\</span><span class="n">ndate</span><span class="p">:</span><span class="w"> </span><span class="n">$</span><span class="p">{</span><span class="n">currentDate</span><span class="p">}</span><span class="err">\</span><span class="n">nauthor</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;maik&#34;</span><span class="err">\</span><span class="n">ntags</span><span class="p">:</span><span class="w"> </span><span class="o">[]</span><span class="err">\</span><span class="n">n</span><span class="o">---</span><span class="err">\</span><span class="n">n</span><span class="err">\</span><span class="n">n</span><span class="err">\</span><span class="n">n$</span><span class="p">{</span><span class="n">pageAuthor</span><span class="p">}</span><span class="w"> </span><span class="n">schreibt</span><span class="w"> </span><span class="n">in</span><span class="w"> </span><span class="o">%</span><span class="n">C2</span><span class="o">%</span><span class="n">BB</span><span class="o">[</span><span class="n">$</span><span class="p">{</span><span class="n">pageTitle</span><span class="p">}</span><span class="o">]</span><span class="p">(</span><span class="n">$</span><span class="p">{</span><span class="n">currentPageUrl</span><span class="p">})</span><span class="o">%</span><span class="n">C2</span><span class="o">%</span><span class="n">AB</span><span class="w"> </span><span class="n">f</span><span class="o">%</span><span class="n">C3</span><span class="o">%</span><span class="n">BCr</span><span class="w"> </span><span class="n">$</span><span class="p">{</span><span class="n">currentPageHostname</span><span class="p">}</span><span class="err">\</span><span class="n">n</span><span class="err">\</span><span class="n">n</span><span class="o">&gt;</span><span class="w"> </span><span class="n">$</span><span class="p">{</span><span class="n">selectedText</span><span class="p">}</span><span class="err">\</span><span class="n">n</span><span class="err">`</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">var</span><span class="w"> </span><span class="n">blob</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Blob</span><span class="p">(</span><span class="o">[</span><span class="n">markdownContent</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">type</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;text/markdown&#34;</span><span class="w"> </span><span class="p">});</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">var</span><span class="w"> </span><span class="n">anchor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">document</span><span class="p">.</span><span class="na">createElement</span><span class="p">(</span><span class="s">&#34;a&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">anchor</span><span class="p">.</span><span class="na">download</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;markierter_text.md&#34;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">anchor</span><span class="p">.</span><span class="na">href</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">window</span><span class="p">.</span><span class="na">URL</span><span class="p">.</span><span class="na">createObjectURL</span><span class="p">(</span><span class="n">blob</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">anchor</span><span class="p">.</span><span class="na">click</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">})();</span><span class="w">
</span></span></span></code></pre></div><p>Interessierte können den Quellcode einfach als Link abspeichern.</p>
<p>Ich konnte das Script unter folgenden Broswern bzw. Betriebssystemen positiv testen.</p>
<table>
  <thead>
      <tr>
          <th>OS</th>
          <th>Chrome</th>
          <th>Safari</th>
          <th>Firefox</th>
          <th>Edge</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Windows 10</td>
          <td>✅</td>
          <td></td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>Fedora 39</td>
          <td></td>
          <td></td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>iPad OS</td>
          <td></td>
          <td>✅</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>iOS</td>
          <td></td>
          <td>✅</td>
          <td></td>
          <td></td>
      </tr>
  </tbody>
</table>
<div class="supporttip">
	<h3>Support me with a tip</h3>
		<a href="https://paypal.me/maik/0.99">
			<div class="supporttipbox s">
				<svg xmlns="http://www.w3.org/2000/svg" fill="#000000" height="32" width="32" viewBox="0 0 59.092 59.092" xmlns:v="https://vecta.io/nano"><path d="M57.955 14.36c-.446-.355-.972-.5-1.502-.423-.13-.012-.377-.259-.39-.37l.103-.719c.095-.658-.173-1.376-.716-1.918s-1.26-.814-1.918-.717l-.701.102c-.13-.012-.377-.258-.39-.37l.103-.719c.095-.658-.173-1.376-.716-1.918s-1.259-.817-1.918-.717l-.701.102c-.13-.012-.377-.258-.39-.37l.103-.719c.095-.658-.173-1.376-.716-1.918s-1.262-.813-1.918-.717l-.701.102c-.13-.012-.377-.258-.39-.37l.018-.126c.077-.534-.064-1.047-.409-1.481C44.25.393 43.298.076 42.593.014a3.14 3.14 0 0 0-2.436.823c-.776.699-1.219 1.732-1.381 2.318-.478.84-3.098 5.738-4.17 13.546l-1.595-1.595c-1.749-1.748-4.475-1.914-6.427-.526l-.051-.068-.593.594h0L15.107 25.941c-1.949 1.949-1.949 5.121 0 7.07l1.134 1.134c-3.04.326-8.592 1.355-13.205 4.62-2.022.733-3.146 2.102-3.011 3.678.063.729.388 1.713 1.112 2.289.445.354.97.501 1.502.423.13.012.377.258.39.37l-.103.719c-.094.659.174 1.376.717 1.919s1.26.803 1.919.716l.698-.103c.13.012.378.259.391.371l-.103.718c-.094.658.173 1.375.716 1.918s1.262.806 1.92.718l.698-.103c.13.012.378.259.391.371l-.103.718c-.095.658.173 1.375.715 1.918s1.26.81 1.92.718l.7-.103c.13.012.377.258.39.37l-.018.126a1.9 1.9 0 0 0 .409 1.482c.556.7 1.507 1.017 2.212 1.079a3.36 3.36 0 0 0 .299.014c.783 0 1.509-.279 2.115-.816.816-.724 1.246-1.767 1.403-2.338.477-.839 3.097-5.738 4.169-13.548l1.456 1.456c.975.975 2.255 1.462 3.535 1.462s2.561-.487 3.536-1.462l.017-.017h0l8.759-8.759h0l2.058-2.058c1.949-1.949 1.949-5.121 0-7.07l-.995-.995c3.039-.326 8.592-1.355 13.206-4.62 2.023-.73 3.146-2.099 3.011-3.677-.062-.729-.387-1.713-1.112-2.289zM33.253 40.776L20.41 23.466l4.65-4.651 1.249-1.25 12.843 17.311-5.899 5.9zM18.528 55.034l-.132.223-.005.146c-.099.339-.589 1.755-1.716 1.684-.416-.037-.772-.241-.818-.286l.018-.126c.095-.658-.173-1.376-.716-1.918-.471-.472-1.073-.735-1.655-.735-.089 0-.177.007-.265.019l-.699.103c-.13-.012-.377-.259-.391-.371l.103-.718c.094-.658-.173-1.375-.716-1.918s-1.261-.809-1.92-.718l-.698.103c-.13-.012-.378-.259-.391-.371l.103-.718c.094-.658-.173-1.375-.716-1.918s-1.259-.807-1.92-.718l-.699.103c-.13-.012-.377-.259-.39-.37l.103-.719c.095-.658-.173-1.375-.716-1.918s-1.259-.811-1.892-.713c-.112-.054-.343-.439-.383-.907-.083-.961 1.468-1.547 1.78-1.655l.172-.06.117-.085c5.298-3.806 12.271-4.381 14.015-4.466l1.107 1.107c-.113.059-.218.138-.305.242-1.274 1.507-2.134 1.537-3.845 1.596-.611.021-1.304.046-2.104.146a1 1 0 0 0 .123 1.992 1.05 1.05 0 0 0 .125-.008c.711-.089 1.328-.11 1.925-.131.773-.027 1.502-.062 2.223-.24-1.744 2.323-2.644 5.466-2.264 8.503a1 1 0 0 0 .991.876 1.05 1.05 0 0 0 .125-.008 1 1 0 0 0 .868-1.116c-.452-3.612 1.348-7.534 4.185-9.121.149-.084.257-.206.343-.341l1.094 1.094c-.925 8.899-4.131 14.38-4.164 14.436zm13.069-12.603c-1.17 1.169-3.073 1.17-4.243 0l-2.582-2.582-5.86-5.86-2.392-2.392c-1.169-1.17-1.169-3.072 0-4.242l2.459-2.46 12.844 17.31-.226.226zm10.834-10.834l-1.849 1.849-12.81-17.266c.511-.354 1.106-.537 1.705-.537a2.99 2.99 0 0 1 2.121.877l2.721 2.721h0l1.401 1.401 6.712 6.712c.563.563.874 1.316.874 2.121s-.311 1.559-.875 2.122zm12.862-13.123l-.287.144C49.708 22.426 42.733 23 40.99 23.085l-1.086-1.086c.13-.059.25-.147.349-.264 1.274-1.508 2.133-1.537 3.844-1.596.612-.021 1.305-.045 2.105-.146a1 1 0 0 0 .868-1.116 1.01 1.01 0 0 0-1.116-.868c-.711.089-1.329.11-1.926.131-.773.026-1.501.061-2.222.24a11.96 11.96 0 0 0 2.264-8.502c-.068-.549-.577-.932-1.116-.868a1 1 0 0 0-.868 1.116c.451 3.612-1.348 7.533-4.185 9.121-.165.093-.278.232-.365.385L36.4 18.494c.925-8.899 4.131-14.38 4.164-14.436l.136-.229.002-.144c.104-.345.613-1.769 1.714-1.68.415.037.772.241.818.286l-.018.126c-.095.658.173 1.376.716 1.918s1.258.809 1.918.717l.701-.102c.13.012.377.258.39.37l-.102.72c-.095.658.173 1.376.716 1.918s1.26.812 1.918.717l.701-.102c.13.012.377.258.39.37l-.103.719c-.095.658.173 1.376.716 1.918s1.259.814 1.918.717l.701-.102c.13.012.377.258.39.37l-.103.719c-.094.659.174 1.376.717 1.919s1.263.808 1.892.71c.112.054.343.438.382.907.083.963-1.469 1.547-1.781 1.654z"/></svg>
				<br>
				<bold>Snack-Sized Tip</bold>
			</div>
		</a>

		<a href="https://paypal.me/maik/4.99">
			<div class="supporttipbox m">
				<svg xmlns="http://www.w3.org/2000/svg" fill="#000000" height="32" width="32" viewBox="0 0 41.992 41.992" xmlns:v="https://vecta.io/nano"><path d="M40.841 10.999c-1.424-2.198-3.962-2.921-6.342-3.362-.294-2.93-.803-5.095-1.214-6.008-.129-.287-.521-1.159-1.368-1.159H2.824c-.847 0-1.239.873-1.369 1.159-1.528 3.396-4.437 24.006 7.546 37.53 1.332 1.503 3.226 2.364 5.197 2.364h6.344c1.971 0 3.865-.861 5.196-2.364 1.29-1.456 2.398-2.998 3.364-4.588.31.035.618.06.921.06 4.897 0 8.945-4.566 10.992-12.544 1.357-5.286 1.302-8.809-.174-11.088zm-16.6 26.834c-.952 1.074-2.3 1.69-3.699 1.69h-4.839-1.505c-1.399 0-2.748-.616-3.7-1.69C-.904 24.963 2.075 5.159 3.264 2.469h28.212c1.189 2.69 4.167 22.495-7.235 35.364zm14.837-16.245c-1.381 5.385-4.397 10.828-8.866 11.017 4.076-7.854 4.798-16.618 4.446-22.9 2.136.443 3.651 1.064 4.503 2.381 1.136 1.752 1.109 4.862-.083 9.502zm-31.953-4.56c-.059-.549-.56-.947-1.1-.888a1 1 0 0 0-.888 1.101c.698 6.537 3.254 13.052 7.392 18.837a1 1 0 1 0 1.627-1.165c-3.938-5.504-6.369-11.689-7.031-17.885zM6.052 11.09c.046.006.091.009.136.009a1 1 0 0 0 .99-.866c.19-1.406.462-3.001 1.29-4.113a1 1 0 0 0-.207-1.4c-.443-.328-1.07-.235-1.399.206C5.804 6.35 5.436 8.189 5.195 9.965a1 1 0 0 0 .857 1.125z"/></svg>
				<br>
				<bold>Coffee-Sized Tip</bold>
			</div>
		</a>

		<a href="https://paypal.me/maik/9.99">
			<div class="supporttipbox l">
				<svg xmlns="http://www.w3.org/2000/svg" fill="#000000" height="32" width="32" viewBox="0 0 58.393 58.393" xmlns:v="https://vecta.io/nano"><circle cx="36.504" cy="21.827" r="1"/><circle cx="41.722" cy="19.179" r="1"/><circle cx="40.41" cy="21.695" r="1"/><circle cx="14.256" cy="17.06" r="1"/><circle cx="20.088" cy="15.736" r="1"/><circle cx="16.865" cy="14.736" r="1"/><circle cx="12.006" cy="33.124" r="1"/><circle cx="15.256" cy="30.8" r="1"/><circle cx="16.865" cy="32.8" r="1"/><path d="M26.184 11.787a.7.7 0 0 1 .53.087c.079.049.218.161.259.358.289 1.4 1.701 2.294 3.153 2.001.189-.042.377-.009.53.087.079.049.218.161.259.358.142.689.555 1.276 1.163 1.653a2.69 2.69 0 0 0 1.423.404 2.79 2.79 0 0 0 .566-.058 1 1 0 0 0 .776-1.183c-.112-.54-.64-.885-1.182-.776-.19.04-.376.008-.53-.087-.079-.049-.218-.161-.258-.358-.143-.689-.556-1.277-1.164-1.653-.591-.368-1.298-.491-1.989-.347-.37.079-.724-.124-.79-.446-.143-.689-.556-1.277-1.164-1.653a2.71 2.71 0 0 0-1.99-.347A1 1 0 0 0 25 11.01c.113.54.638.887 1.184.777zm3.956 14.155a1 1 0 0 0-.979 1.021c.003.116-.064.192-.112.193-1.166.026-2.093 1.028-2.067 2.235.003.116-.064.192-.112.193a2.07 2.07 0 0 0-1.504.697 2.22 2.22 0 0 0-.563 1.539 1 1 0 0 0 .999.978h.023a1 1 0 0 0 .977-1.022c-.001-.074.038-.19.112-.191 1.166-.026 2.094-1.029 2.068-2.236-.003-.116.064-.191.111-.192 1.166-.026 2.094-1.029 2.068-2.236-.012-.552-.442-.949-1.021-.979zm-7.164-3.65c-.152.345-.521.517-.821.385-.644-.283-1.362-.288-2.021-.011-.641.269-1.151.773-1.436 1.421a1 1 0 0 0 .513 1.317.99.99 0 0 0 .402.085 1 1 0 0 0 .916-.598c.078-.176.212-.312.378-.382.086-.036.258-.083.442-.003 1.31.579 2.861-.055 3.458-1.409.078-.176.212-.312.378-.382.086-.036.258-.083.442-.003.644.283 1.362.288 2.021.011.641-.269 1.151-.773 1.436-1.421a1 1 0 0 0-.513-1.317c-.506-.224-1.095.006-1.318.513-.078.176-.212.312-.378.382a.57.57 0 0 1-.442.003 2.54 2.54 0 0 0-2.022-.011c-.642.269-1.151.773-1.435 1.42zm34.534-3.444c-.007-.019-.022-.031-.03-.05a18.92 18.92 0 0 0-1.059-3.111c-.014-.047-.042-.089-.063-.135-2.29-5.026-6.57-8.22-11.735-10.163-.032-.016-.055-.042-.09-.055-.024-.008-.048-.004-.072-.01-2.205-.815-4.566-1.407-6.995-1.823-.145-.055-.279-.072-.409-.063-4.991-.812-10.241-.896-15.019-.647-.013 0-.023-.007-.036-.007-.021 0-.039.011-.061.012-4.286.227-8.185.715-11.145 1.18-2.562.404-4.486 2.468-4.743 5.036-.005.055-.02.102-.024.153L4.527 28.361c-1.821 1.161-5.663 4.307-4.204 9.463.515 1.818 1.356 2.887 2.501 3.174.209.053.55.227.5.545-.386 2.448-1.042 6.965-1.091 9.713-.024 1.323.411 2.433 1.258 3.207 1.2 1.098 2.888 1.262 3.782 1.262.314 0 .531-.021.594-.027.353-.023 3.474-.291 4.504-2.447.627-1.312.297-2.912-.972-4.751l16.396-6.647c.205.107.414.188.63.254.034.011.065.028.1.038a3.98 3.98 0 0 0 .787.134 6.29 6.29 0 0 0 .672.004c.049-.002.098-.009.148-.012.187-.013.37-.034.549-.065l.135-.025c.211-.041.416-.094.613-.159l.04-.012c.731-.248 1.364-.653 1.838-1.207.18-.21.329-.445.465-.691.004-.006.007-.013.01-.02.132-.242.242-.503.331-.78.003-.009.007-.015.01-.024l18.779-7.615c.125-.042 3.097-1.074 4.619-4.198 1.166-2.391 1.162-5.292-.011-8.627zm-2.506 2.045c-.348-.762-.727-1.512-1.135-2.25l1.184-1.013c.284.787.522 1.615.698 2.495s.024 1.76-.376 2.504c.013-.547-.092-1.127-.371-1.736zm-.785-5.18l-1.398 1.196c-.747-1.131-1.602-2.214-2.599-3.226l1.218-1.768c1.096 1.104 2.035 2.363 2.779 3.798zM44.111 9.435l.669-1.846c1.893.791 3.633 1.774 5.156 2.982l-1.201 1.744c-1.308-1.08-2.837-2.048-4.624-2.88zM37.2 7.252l.586-1.681c1.769.329 3.49.758 5.123 1.311l-.643 1.775c-1.509-.564-3.195-1.034-5.066-1.405zm-7.197-.838V4.721c1.935.084 3.876.25 5.78.521l-.581 1.668c-1.602-.237-3.328-.406-5.199-.496zM26.78 4.651l1.223.01v1.687a80.84 80.84 0 0 0-5 .077V4.742a84.94 84.94 0 0 1 3.777-.091zM15.003 7.087V5.412a107.02 107.02 0 0 1 6-.562v1.681a118.48 118.48 0 0 0-6 .556zm-3.895-1.134l1.895-.28v1.656a162.28 162.28 0 0 0-4.635.686 3.64 3.64 0 0 1 2.74-2.062zm-.54 46.432c-.447.941-2.243 1.274-2.875 1.32-.479.055-2.034.031-2.853-.718-.422-.387-.622-.941-.607-1.695.047-2.627.688-7.04 1.067-9.437.202-1.281-.634-2.457-1.988-2.797-.378-.095-.775-.76-1.063-1.779-1.171-4.138 2.22-6.596 3.732-7.461l.459-.263 1.522-19.45c5.287-.874 9.931-1.409 14.01-1.651.011 0 .02.006.031.006.018 0 .033-.009.051-.01 5.398-.316 9.812-.124 13.451.452.019.008.031.023.051.03a1 1 0 0 0 .329.056c.032 0 .062-.011.094-.015 2.441.416 4.515 1.012 6.305 1.741.076.056.151.115.245.149.067.024.135.026.203.035 2.203.951 3.947 2.115 5.365 3.414.07.11.162.208.276.287.023.016.048.021.072.035 2.218 2.143 3.61 4.619 4.74 7.09.883 1.929-1.665 3.369-1.956 3.525L32.275 33.13l-.123.487c-.133.53-.137 1.102-.013 1.654.267 1.182.326 2.176.189 2.957l-.023.113c-.177.847-.6 1.343-1.114 1.624-.505.264-1.073.32-1.465.321-.094-.001-.188 0-.279-.007a1.84 1.84 0 0 1-.482-.097l-.042-.015c-.145-.055-.278-.127-.397-.222l-.07-.056c-.057-.052-.114-.103-.165-.166-.581-.715-.7-2.093-.564-3.069l.24-1.732L11.7 41.686c-1.863.724-2.96 1.707-3.353 3.006-.417 1.381.027 2.976 1.36 4.873.6.853 1.234 2.033.861 2.82zm-.305-7.113c.2-.662.928-1.241 2.185-1.729l13.254-5.511c.052.706.21 1.527.595 2.269L10.42 46.738c-.216-.574-.278-1.068-.157-1.466zm45.474-18.703c-1.142 2.372-3.455 3.199-3.529 3.227L34.389 37.02c-.026-.674-.118-1.398-.297-2.187-.021-.092-.034-.184-.039-.274l20.274-8.429c.77-.32 1.422-.811 1.961-1.396-.101.653-.278 1.269-.551 1.835zM14.046 36.921c4.228 0 7.667-2.738 7.667-6.104 0-2.046-1.002-2.958-1.844-3.363-.936-.45-1.988-.45-2.823-.45-1.573 0-9.667 2.023-9.667 5.813 0 4.104 3.09 4.104 6.667 4.104zm3.008-7.917c.644 0 1.426.002 1.948.253.213.103.711.342.711 1.561 0 2.225-2.595 4.104-5.667 4.104-4.667 0-4.667-.445-4.667-2.104 0-1.78 6.132-3.814 7.675-3.814zm-.689-8.309c4.228 0 7.667-2.738 7.667-6.104 0-2.046-1.002-2.958-1.844-3.363-.932-.448-2.012-.45-2.812-.45-1.584 0-9.678 2.023-9.678 5.813 0 4.104 3.09 4.104 6.667 4.104zm3.008-7.917c.644 0 1.426.002 1.948.253.213.103.711.342.711 1.561 0 2.225-2.595 4.104-5.667 4.104-4.667 0-4.667-.445-4.667-2.104 0-1.78 6.132-3.814 7.675-3.814zm12.63 8.773c0 4.103 3.089 4.103 6.667 4.103 4.228 0 7.667-2.737 7.667-6.103 0-2.047-1.003-2.959-1.844-3.363-.933-.449-2.013-.451-2.812-.451-1.585-.001-9.678 2.023-9.678 5.814zm9.673-3.815c.644 0 1.427.002 1.95.253.213.103.711.343.711 1.562 0 2.224-2.595 4.103-5.667 4.103-4.667 0-4.667-.445-4.667-2.103 0-1.781 6.132-3.815 7.673-3.815z"/></svg>
				<br>
				<bold>Lunch-Sized Tip</bold>
			</div>
		</a>
</div>

]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Externe Umleitung in Hugo</title>
      <link>https://maik.io/notes/2023-12-17-externe-umleitung-in-hugo/</link>
      <pubDate>Sun, 17 Dec 2023 10:55:00 +0200</pubDate>
      <guid>https://maik.io/notes/2023-12-17-externe-umleitung-in-hugo/</guid>
      <description>&lt;p&gt;Als Blogger hatte ich heute den Wunsch, URLs, die auf ein Unterverzeichnis zeigen, auch extern umzuleiten.&lt;/p&gt;
&lt;p&gt;In dem Blogpost »&lt;a href=&#34;https://dannorth.net/hugo-redirects/#the-solution&#34; title=&#34;Using Hugo as a redirect service&#34; target=&#34;_blank&#34; &gt;Using Hugo as a redirect service&lt;/a&gt;« von Daniel Terhorst-North stieß ich auf eine super schlanke Lösung.&lt;/p&gt;
&lt;p&gt;Um dies zu erreichen, muss die folgende Datei im Theme-Ordner angelegt werden: &lt;code&gt;/layouts/redirect/single.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Der Datei muss der folgende Quellcode hinzugefügt werden:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{- template &amp;#34;_internal/alias.html&amp;#34; (dict &amp;#34;Permalink&amp;#34; .Params.target) -}}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nun kann man eine Datei erstellen und die Weiterleitung mit den folgenden vier Zeilen definieren. Dabei bestimmt der Dateiname auch das Verzeichnis der Quell-URL:&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Als Blogger hatte ich heute den Wunsch, URLs, die auf ein Unterverzeichnis zeigen, auch extern umzuleiten.</p>
<p>In dem Blogpost »<a href="https://dannorth.net/hugo-redirects/#the-solution" title="Using Hugo as a redirect service" target="_blank" >Using Hugo as a redirect service</a>« von Daniel Terhorst-North stieß ich auf eine super schlanke Lösung.</p>
<p>Um dies zu erreichen, muss die folgende Datei im Theme-Ordner angelegt werden: <code>/layouts/redirect/single.html</code>.</p>
<p>Der Datei muss der folgende Quellcode hinzugefügt werden:</p>
<pre tabindex="0"><code>{{- template &#34;_internal/alias.html&#34; (dict &#34;Permalink&#34; .Params.target) -}}
</code></pre><p>Nun kann man eine Datei erstellen und die Weiterleitung mit den folgenden vier Zeilen definieren. Dabei bestimmt der Dateiname auch das Verzeichnis der Quell-URL:</p>
<pre tabindex="0"><code>---
type: redirect
target: https://google.de
---
</code></pre>]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Showcode</title>
      <link>https://maik.io/notes/2023-11-21-showcode/</link>
      <pubDate>Tue, 21 Nov 2023 17:42:37 +0100</pubDate>
      <guid>https://maik.io/notes/2023-11-21-showcode/</guid>
      <description>&lt;p&gt;Wenn du schnell und einfach Code-Snippets im Bildformat teilen möchtest, empfehle ich dir, einen Blick auf »&lt;a href=&#34;https://showcode.app/&#34; title=&#34;Showcode&#34; target=&#34;_blank&#34; &gt;Showcode&lt;/a&gt;« zu werfen. Diese beeindruckende Anwendung ermöglicht es dir, attraktive Bilder zu erstellen, auf denen dein Code in einem stilvollen Terminalfenster mit herausragendem Code-Highlighting und verschiedenen coolen Farbschemata angezeigt wird. Jo&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Wenn du schnell und einfach Code-Snippets im Bildformat teilen möchtest, empfehle ich dir, einen Blick auf »<a href="https://showcode.app/" title="Showcode" target="_blank" >Showcode</a>« zu werfen. Diese beeindruckende Anwendung ermöglicht es dir, attraktive Bilder zu erstellen, auf denen dein Code in einem stilvollen Terminalfenster mit herausragendem Code-Highlighting und verschiedenen coolen Farbschemata angezeigt wird. Jo</p>
]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>GitHub Copilot stiehlt Code</title>
      <link>https://maik.io/notes/2023-08-01-github-copilot-stiehlt-code/</link>
      <pubDate>Tue, 01 Aug 2023 08:17:13 +0200</pubDate>
      <guid>https://maik.io/notes/2023-08-01-github-copilot-stiehlt-code/</guid>
      <description>&lt;p&gt;Golo Roden zeigt in seinem Video »&lt;a href=&#34;https://www.youtube.com/watch?v=uM__OqpYJl4&#34; title=&#34;Jetzt bewiesen: GitHub Copilot stiehlt Code // deutsch - YouTube&#34; target=&#34;_blank&#34; &gt;Jetzt bewiesen: GitHub Copilot stiehlt Code&lt;/a&gt;« eindrücklich, dass auch ein LLM gegen Copyright verstoßen kann.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Golo Roden zeigt in seinem Video »<a href="https://www.youtube.com/watch?v=uM__OqpYJl4" title="Jetzt bewiesen: GitHub Copilot stiehlt Code // deutsch - YouTube" target="_blank" >Jetzt bewiesen: GitHub Copilot stiehlt Code</a>« eindrücklich, dass auch ein LLM gegen Copyright verstoßen kann.</p>
]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Apple Store Notifier</title>
      <link>https://maik.io/notes/2022-03-19-apple-store-notifier/</link>
      <pubDate>Sat, 19 Mar 2022 23:00:00 +0100</pubDate>
      <guid>https://maik.io/notes/2022-03-19-apple-store-notifier/</guid>
      <description>&lt;p&gt;Apple hat vor einigen Tagen neue Produkte angekündigt. Wie immer sind die Artikel in den Stores nur bedingt vorrätig. Wer schlau ist, schaut online, ob das gewünschte Produkt im örtlichen Apple Store vorrätig ist. Wer faul ist, nutzt dazu das folgende Python Script, um das automatisiert zu machen. Achtung &lt;a href=&#34;https://pushover.net&#34; target=&#34;_blank&#34; &gt;Pushover&lt;/a&gt; wird vorausgesetzt.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fetch_availability&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;product_number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;store&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;little&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;mt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;regular&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;parts.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;product_number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;fts&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://www.apple.com/de/shop/fulfillment-messages&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;stores&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;][&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;][&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pickupMessage&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;][&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;stores&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;store&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;store&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stores&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;storeNumber&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;avail&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;partsAvailability&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;][&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;product_number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;store_name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;storeName&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;available&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;avail&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pickupDisplay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ineligible&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;store_pickup_quote&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;avail&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;storePickupQuote&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;pickup_search_quote&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;avail&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pickupSearchQuote&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;pickup_display&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;avail&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pickupDisplay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;assemble_availability_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;product_number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store_ids&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;avail_text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store_id&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store_ids&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;avail&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fetch_availability&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;product_number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;avail_text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;avail&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;store_name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;avail&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;store_pickup_quote&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;avail_text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;create_file_if_not_exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filepath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filepath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filepath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;do_it&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;part_no&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store_ids&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kwargs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;availability_text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;assemble_availability_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;part_no&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;store_ids&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;create_file_if_not_exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/tmp/cache.txt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/tmp/cache.txt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;r+&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;availability_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;No Changes&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;flush&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Changes detected&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;availability_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;flush&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kwargs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pushover_enabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;post&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://api.pushover.net/1/messages.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;s2&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kwargs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pushover_token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kwargs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pushover_user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;s2&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;availability_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;s2&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CHANGES DETECTED&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/x-www-form-urlencoded&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;truncate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;seek&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;availability_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;__name__&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;do_it&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;environ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MONITORED_PART_NO&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;environ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MONITORED_STORES&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;pushover_enabled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;environ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PUSHOVER_ENABLED&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;pushover_token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;environ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PUSHOVER_TOKEN&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;pushover_user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;environ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PUSHOVER_USER&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;environ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;POLLING_DELAY_SECONDS&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das Script liegt im Repository &lt;a href=&#34;https://github.com/dstapp/apple-store-notifier&#34; target=&#34;_blank&#34; &gt;dprandzioch/apple-store-notifier&lt;/a&gt; auf GitHub.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Apple hat vor einigen Tagen neue Produkte angekündigt. Wie immer sind die Artikel in den Stores nur bedingt vorrätig. Wer schlau ist, schaut online, ob das gewünschte Produkt im örtlichen Apple Store vorrätig ist. Wer faul ist, nutzt dazu das folgende Python Script, um das automatisiert zu machen. Achtung <a href="https://pushover.net" target="_blank" >Pushover</a> wird vorausgesetzt.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env python3</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">requests</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">time</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fetch_availability</span><span class="p">(</span><span class="n">product_number</span><span class="p">,</span> <span class="n">store_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;store&#34;</span><span class="p">:</span> <span class="n">store_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;little&#34;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;mt&#34;</span><span class="p">:</span> <span class="s2">&#34;regular&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;parts.0&#34;</span><span class="p">:</span> <span class="n">product_number</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;fts&#34;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="o">=</span> <span class="s2">&#34;https://www.apple.com/de/shop/fulfillment-messages&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">data</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">stores</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s2">&#34;body&#34;</span><span class="p">][</span><span class="s2">&#34;content&#34;</span><span class="p">][</span><span class="s2">&#34;pickupMessage&#34;</span><span class="p">][</span><span class="s2">&#34;stores&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">store</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">store</span> <span class="k">for</span> <span class="n">store</span> <span class="ow">in</span> <span class="n">stores</span> <span class="k">if</span> <span class="n">store</span><span class="p">[</span><span class="s2">&#34;storeNumber&#34;</span><span class="p">]</span> <span class="o">==</span> <span class="n">store_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">avail</span> <span class="o">=</span> <span class="n">store</span><span class="p">[</span><span class="s2">&#34;partsAvailability&#34;</span><span class="p">][</span><span class="n">product_number</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;store_name&#34;</span><span class="p">:</span> <span class="n">store</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;storeName&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;available&#34;</span><span class="p">:</span> <span class="n">avail</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;pickupDisplay&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="s2">&#34;ineligible&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;store_pickup_quote&#34;</span><span class="p">:</span> <span class="n">avail</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;storePickupQuote&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;pickup_search_quote&#34;</span><span class="p">:</span> <span class="n">avail</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;pickupSearchQuote&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;pickup_display&#34;</span><span class="p">:</span> <span class="n">avail</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;pickupDisplay&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">assemble_availability_text</span><span class="p">(</span><span class="n">product_number</span><span class="p">,</span> <span class="n">store_ids</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">avail_text</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">store_id</span> <span class="ow">in</span> <span class="n">store_ids</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">avail</span> <span class="o">=</span> <span class="n">fetch_availability</span><span class="p">(</span><span class="n">product_number</span><span class="p">,</span> <span class="n">store_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">avail_text</span> <span class="o">+=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">avail</span><span class="p">[</span><span class="s2">&#34;store_name&#34;</span><span class="p">]</span><span class="si">}</span><span class="s1">: </span><span class="si">{</span><span class="n">avail</span><span class="p">[</span><span class="s2">&#34;store_pickup_quote&#34;</span><span class="p">]</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">avail_text</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">create_file_if_not_exists</span><span class="p">(</span><span class="n">filepath</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">filepath</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="s2">&#34;w&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">do_it</span><span class="p">(</span><span class="n">part_no</span><span class="p">,</span> <span class="n">store_ids</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">availability_text</span> <span class="o">=</span> <span class="n">assemble_availability_text</span><span class="p">(</span><span class="n">part_no</span><span class="p">,</span> <span class="n">store_ids</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">create_file_if_not_exists</span><span class="p">(</span><span class="s2">&#34;/tmp/cache.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;/tmp/cache.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;r+&#34;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&#34;utf-8&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="o">==</span> <span class="n">availability_text</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;No Changes&#34;</span><span class="p">,</span> <span class="n">flush</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Changes detected&#34;</span><span class="p">,</span> <span class="n">availability_text</span><span class="p">,</span> <span class="n">flush</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&#34;pushover_enabled&#34;</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&#34;1&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                    <span class="s2">&#34;https://api.pushover.net/1/messages.json&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                    <span class="n">data</span><span class="o">=</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;token&#34;</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&#34;pushover_token&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;user&#34;</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&#34;pushover_user&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;message&#34;</span><span class="p">:</span> <span class="n">availability_text</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;CHANGES DETECTED&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                    <span class="p">},</span>
</span></span><span class="line"><span class="cl">                    <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&#34;Content-Type&#34;</span><span class="p">:</span> <span class="s2">&#34;application/x-www-form-urlencoded&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">                <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">truncate</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">availability_text</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">do_it</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&#34;MONITORED_PART_NO&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">            <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&#34;MONITORED_STORES&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&#34;,&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="n">pushover_enabled</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&#34;PUSHOVER_ENABLED&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">            <span class="n">pushover_token</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&#34;PUSHOVER_TOKEN&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">            <span class="n">pushover_user</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&#34;PUSHOVER_USER&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&#34;POLLING_DELAY_SECONDS&#34;</span><span class="p">]))</span>
</span></span></code></pre></div><p>Das Script liegt im Repository <a href="https://github.com/dstapp/apple-store-notifier" target="_blank" >dprandzioch/apple-store-notifier</a> auf GitHub.</p>
<p>Quelle: <a href="https://mobile.twitter.com/__davd/status/1504884055917142018" target="_blank" >Unterhaltung von @timohetzel und @davd</a></p>
]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Ghost Bookmarklet</title>
      <link>https://maik.io/notes/2021-12-23-ghost-bookmarklet/</link>
      <pubDate>Thu, 23 Dec 2021 22:29:00 +0000</pubDate>
      <guid>https://maik.io/notes/2021-12-23-ghost-bookmarklet/</guid>
      <description>&lt;p&gt;Nach meinem Wechsel von Grav zu Ghost muss ich den einen oder anderen Artikel nochmal anpassen. Damit ich schnell vom Frontend ins Backend wechseln kann, habe ich mir ein supersimples Bookmarklet geschrieben. Einfach folgenden Code als Lesezeichen speichern.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;javascript&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;/edit&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nachdem man auf das Lesezeichen klickt, wechselt der Browser auf &lt;code&gt;http://DEINEBLOG.URL/edit&lt;/code&gt; und sofern du eingeloggt bist, kannst du den Artikel direkt bearbeiten.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Nach meinem Wechsel von Grav zu Ghost muss ich den einen oder anderen Artikel nochmal anpassen. Damit ich schnell vom Frontend ins Backend wechseln kann, habe ich mir ein supersimples Bookmarklet geschrieben. Einfach folgenden Code als Lesezeichen speichern.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="nx">javascript</span><span class="o">:</span><span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span><span class="o">=</span><span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span><span class="o">+</span><span class="s1">&#39;/edit&#39;</span><span class="p">;</span>
</span></span></code></pre></div><p>Nachdem man auf das Lesezeichen klickt, wechselt der Browser auf <code>http://DEINEBLOG.URL/edit</code> und sofern du eingeloggt bist, kannst du den Artikel direkt bearbeiten.</p>
]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Dropbox auf Uberspace</title>
      <link>https://maik.io/notes/2021-09-30-dropbox-auf-uberspace/</link>
      <pubDate>Thu, 30 Sep 2021 19:08:00 +0000</pubDate>
      <guid>https://maik.io/notes/2021-09-30-dropbox-auf-uberspace/</guid>
      <description>&lt;p&gt;Dieses Blog und weitere Dienste hoste ich bei &lt;a href=&#34;https://uberspace.de/&#34; target=&#34;_blank&#34; &gt;Uberspace.de&lt;/a&gt;. Vor einigen Jahren konnte man den Dropbox-Client im eigenen Benutzerkonto installieren. Seitdem Uberspace auf &lt;a href=&#34;https://blog.uberspace.de/uberspace-7-episode-1/&#34; target=&#34;_blank&#34; &gt;CentOS 7 gewechselt&lt;/a&gt; ist, geht das leider nicht mehr.&lt;/p&gt;
&lt;p&gt;Vor einigen Wochen erfuhr ich von &lt;a href=&#34;https://maestral.app&#34; target=&#34;_blank&#34; &gt;Maestral&lt;/a&gt;, einem Dropbox-Client eines Drittanbieters.&lt;/p&gt;
&lt;p&gt;Zuerst müssen wir die Software &lt;code&gt;pip&lt;/code&gt; aktualisieren. Das geht ganz einfach mit folgendem Befehl:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python3 -m pip install --upgrade pip --user
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jetzt können wir Maestral installieren, das geht ähnlich einfach:&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Dieses Blog und weitere Dienste hoste ich bei <a href="https://uberspace.de/" target="_blank" >Uberspace.de</a>. Vor einigen Jahren konnte man den Dropbox-Client im eigenen Benutzerkonto installieren. Seitdem Uberspace auf <a href="https://blog.uberspace.de/uberspace-7-episode-1/" target="_blank" >CentOS 7 gewechselt</a> ist, geht das leider nicht mehr.</p>
<p>Vor einigen Wochen erfuhr ich von <a href="https://maestral.app" target="_blank" >Maestral</a>, einem Dropbox-Client eines Drittanbieters.</p>
<p>Zuerst müssen wir die Software <code>pip</code> aktualisieren. Das geht ganz einfach mit folgendem Befehl:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python3 -m pip install --upgrade pip --user
</span></span></code></pre></div><p>Jetzt können wir Maestral installieren, das geht ähnlich einfach:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python3 -m pip install --upgrade maestral --user
</span></span></code></pre></div><p>Nun kommen wir schon zu dem Punkt, bei dem ihr Maestral Zugriff auf euer Dropbox-Konto gebt. Das machen wir über folgenden Befehl:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">maestral auth link
</span></span></code></pre></div><p>Nun wird unter <code>$home/.config/maestral/</code> die Konfigurationsdatei <code>maestral.ini</code> angelegt.</p>
<p>Außerdem erklärt die Anwendung, was zu tun ist. Ihr bestätigt das und bekommt eine URL angezeigt, die ihr in eurem Browser öffnet. Ihr werdet dazu aufgefordert, euch in eure Dropbox einzuloggen und Maestral die Freigabe zu geben. Nachdem ihr das bestätigt habt, bekommt ihr ein Token angezeigt. Den kopiert ihr und fügt ihn im Terminal ein.</p>
<p>Nun sollte die Authentifizierung abgeschlossen sein und wir können die letzten Schritte starten.</p>
<p>Wir wechseln mit folgendem Befehl das Verzeichnis:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> .config/maestral
</span></span></code></pre></div><p>Die angelegte Konfigurationsdatei öffnen wir mit dem nachfolgenden Einzeiler:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nano maestral.ini
</span></span></code></pre></div><p>Unter <code>path</code> hinterlegt ihr den Ordner, der euer Dropbox-Ordner sein soll. Achtung, der Ordner muss bereits existieren. Es bietet sich an, wenn ihr in eurem Homeverzeichnis einen Ordner namens Dropbox angelegt habt und diesen nutzt.</p>
<p>Nun sollten wir das <code>notification_level</code> auf <code>100</code> setzen, damit keine Notification erstellt werden.</p>
<p>Die CPU-Auslastung habe ich von 20 % auf maximal 10 % reduziert. Dann dauert die erste Synchronisierung zwar etwas länger, aber wir dürfen nicht vergessen, wir <a href="https://manual.uberspace.de/basics-resources/" target="_blank" >teilen</a> uns den Host mit anderen Usern.</p>
<p>Mein <code>maestral.ini</code> sieht wie folgt aus:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[auth]</span>
</span></span><span class="line"><span class="cl"><span class="na">account_id</span> <span class="o">=</span> <span class="s">secret_account_id</span>
</span></span><span class="line"><span class="cl"><span class="na">keyring</span> <span class="o">=</span> <span class="s">keyrings.alt.file.PlaintextKeyring</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[app]</span>
</span></span><span class="line"><span class="cl"><span class="na">notification_level</span> <span class="o">=</span> <span class="s">100</span>
</span></span><span class="line"><span class="cl"><span class="na">log_level</span> <span class="o">=</span> <span class="s">20</span>
</span></span><span class="line"><span class="cl"><span class="na">update_notification_interval</span> <span class="o">=</span> <span class="s">604800</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[sync]</span>
</span></span><span class="line"><span class="cl"><span class="na">path</span> <span class="o">=</span> <span class="s">/home/maik/Dropbox</span>
</span></span><span class="line"><span class="cl"><span class="na">excluded_items</span> <span class="o">=</span> <span class="s">[]</span>
</span></span><span class="line"><span class="cl"><span class="na">reindex_interval</span> <span class="o">=</span> <span class="s">1209600</span>
</span></span><span class="line"><span class="cl"><span class="na">max_cpu_percent</span> <span class="o">=</span> <span class="s">10.0</span>
</span></span><span class="line"><span class="cl"><span class="na">keep_history</span> <span class="o">=</span> <span class="s">604800</span>
</span></span><span class="line"><span class="cl"><span class="na">upload</span> <span class="o">=</span> <span class="s">True</span>
</span></span><span class="line"><span class="cl"><span class="na">download</span> <span class="o">=</span> <span class="s">True</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[main]</span>
</span></span><span class="line"><span class="cl"><span class="na">version</span> <span class="o">=</span> <span class="s">16.0.0</span>
</span></span></code></pre></div><p>Mit Strg + x könnt ihr die Änderungen speichern und Maestral das erste Mal starten:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">maestral start
</span></span></code></pre></div><p>Ob der Client nun synchronisiert, könnt ihr mit folgendem Befehl checken:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">maestral status
</span></span></code></pre></div>]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>CSS Brighter</title>
      <link>https://maik.io/notes/2020-08-06-css-brighter/</link>
      <pubDate>Thu, 06 Aug 2020 03:05:00 +0000</pubDate>
      <guid>https://maik.io/notes/2020-08-06-css-brighter/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://twitter.com/missmatsuko/status/1264033342317449216&#34; target=&#34;_blank&#34; &gt;Wie Matsuko&lt;/a&gt;, finde ich Videos manchmal ebenfalls zu dunkel, wenn ich abends Netflix oder YouTube schaue. In der Regel stelle ich dann den Bildschirm heller, ich würde aber lieber nur das Video heller stellen. Mit dem folgenden Codeschnipsel kann man genau das tun.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;/* Brighter Netflix and YouTube videos */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;video&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;^=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;blob:https://www.netflix.com/&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;video&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;^=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;blob:https://www.youtube.com/&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;brightness&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded>
      <![CDATA[<p><a href="https://twitter.com/missmatsuko/status/1264033342317449216" target="_blank" >Wie Matsuko</a>, finde ich Videos manchmal ebenfalls zu dunkel, wenn ich abends Netflix oder YouTube schaue. In der Regel stelle ich dann den Bildschirm heller, ich würde aber lieber nur das Video heller stellen. Mit dem folgenden Codeschnipsel kann man genau das tun.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="c">/* Brighter Netflix and YouTube videos */</span>
</span></span><span class="line"><span class="cl"><span class="nt">video</span><span class="o">[</span><span class="nt">src</span><span class="o">^=</span><span class="s2">&#34;blob:https://www.netflix.com/&#34;</span><span class="o">],</span>
</span></span><span class="line"><span class="cl"><span class="nt">video</span><span class="o">[</span><span class="nt">src</span><span class="o">^=</span><span class="s2">&#34;blob:https://www.youtube.com/&#34;</span><span class="o">]</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">filter</span><span class="p">:</span> <span class="nb">brightness</span><span class="p">(</span><span class="mf">1.4</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Little Trick</title>
      <link>https://maik.io/notes/2020-04-26-little-trick/</link>
      <pubDate>Sun, 26 Apr 2020 22:00:00 +0000</pubDate>
      <guid>https://maik.io/notes/2020-04-26-little-trick/</guid>
      <description>&lt;p&gt;Auf Twitter bin ich über einen cleveren Trick von &lt;a href=&#34;https://twitter.com/flaviocopes/&#34; target=&#34;_blank&#34; &gt;Flavio&lt;/a&gt; gestolpert.&lt;/p&gt;
&lt;p&gt;Mit folgendem Quellcode kann man auch unterschiedliche Bilder beim Wechseln zwischen hellem und dunklem Modus nutzen.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;picture&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;source&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;srcset&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;dank.png&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;media&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;(prefers-color-scheme: dark)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;img&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;bright.png&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;picture&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded>
      <![CDATA[<p>Auf Twitter bin ich über einen cleveren Trick von <a href="https://twitter.com/flaviocopes/" target="_blank" >Flavio</a> gestolpert.</p>
<p>Mit folgendem Quellcode kann man auch unterschiedliche Bilder beim Wechseln zwischen hellem und dunklem Modus nutzen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">picture</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">source</span> <span class="na">srcset</span><span class="o">=</span><span class="s">&#34;dank.png&#34;</span> <span class="na">media</span><span class="o">=</span><span class="s">&#34;(prefers-color-scheme: dark)&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;bright.png&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">picture</span><span class="p">&gt;</span>
</span></span></code></pre></div>]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Hello Darkness</title>
      <link>https://maik.io/notes/2020-03-31-hello-darkness/</link>
      <pubDate>Tue, 31 Mar 2020 22:00:00 +0000</pubDate>
      <guid>https://maik.io/notes/2020-03-31-hello-darkness/</guid>
      <description>&lt;p&gt;Solltet ihr ein Gerät nutzen, das einen Darkmode hat, so färbt sich dieses kleine Blog nun auch entsprechend eurer Systemeinstellung.&lt;/p&gt;
&lt;p&gt;Mit Hilfe der &lt;a href=&#34;https://adactio.com/journal/15941&#34; target=&#34;_blank&#34; &gt;Beschreibung von Jeremy Keith&lt;/a&gt; konnte ich das ganz schnell umsetzen.&lt;/p&gt;
&lt;p&gt;Eigentlich ist es sehr, sehr einfach. Einfach den folgenden Code in seine &lt;code&gt;style.css&lt;/code&gt; packen und die gewünschten CSS-Eigenschaften für den Darkmode hinterlegen.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;media&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prefers-color-scheme&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;dark&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c&#34;&gt;/* Darkmode CSS-Eigenschaften hier */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Man könnte jetzt noch überlegen, ob man einen Schalter im Blog möchte, mit dem man die Einstellung überschreiben kann. Thomas Steiner beschreibt das &lt;a href=&#34;https://web.dev/prefers-color-scheme/&#34; target=&#34;_blank&#34; &gt;hier&lt;/a&gt; auch ganz gut.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Solltet ihr ein Gerät nutzen, das einen Darkmode hat, so färbt sich dieses kleine Blog nun auch entsprechend eurer Systemeinstellung.</p>
<p>Mit Hilfe der <a href="https://adactio.com/journal/15941" target="_blank" >Beschreibung von Jeremy Keith</a> konnte ich das ganz schnell umsetzen.</p>
<p>Eigentlich ist es sehr, sehr einfach. Einfach den folgenden Code in seine <code>style.css</code> packen und die gewünschten CSS-Eigenschaften für den Darkmode hinterlegen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">@</span><span class="k">media</span> <span class="o">(</span><span class="nt">prefers-color-scheme</span><span class="o">:</span> <span class="nt">dark</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* Darkmode CSS-Eigenschaften hier */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Man könnte jetzt noch überlegen, ob man einen Schalter im Blog möchte, mit dem man die Einstellung überschreiben kann. Thomas Steiner beschreibt das <a href="https://web.dev/prefers-color-scheme/" target="_blank" >hier</a> auch ganz gut.</p>
]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>CSS Shadows</title>
      <link>https://maik.io/notes/2020-01-17-css-shadows/</link>
      <pubDate>Fri, 17 Jan 2020 23:00:00 +0100</pubDate>
      <guid>https://maik.io/notes/2020-01-17-css-shadows/</guid>
      <description>&lt;p&gt;Schatten in CSS von Hand zu schreiben ist zwar möglich aber ein Krampf. Es gibt schon seit Jahren diverse Tools, um visuell schöne Schatten zu erstellen. Ein weiteres Tool ist von &lt;a href=&#34;https://brumm.af/&#34; target=&#34;_blank&#34; &gt;Philipp Brumm&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;smooth-shadow&#34;&gt;&lt;a href=&#34;https://brumm.af/shadows&#34; title=&#34;Make a smooth css shadow&#34; target=&#34;_blank&#34; &gt;Smooth Shadow&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Für alle die nicht wissen was gemeint ist, ein simpler Schatten in CSS kann so aussehen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;box-shadow&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;8px&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;2px&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;rgba&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;02&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;7px&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;3px&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;rgba&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;028&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded>
      <![CDATA[<p>Schatten in CSS von Hand zu schreiben ist zwar möglich aber ein Krampf. Es gibt schon seit Jahren diverse Tools, um visuell schöne Schatten zu erstellen. Ein weiteres Tool ist von <a href="https://brumm.af/" target="_blank" >Philipp Brumm</a>.</p>
<h3 id="smooth-shadow"><a href="https://brumm.af/shadows" title="Make a smooth css shadow" target="_blank" >Smooth Shadow</a></h3>
<p>Für alle die nicht wissen was gemeint ist, ein simpler Schatten in CSS kann so aussehen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">box-shadow</span><span class="o">:</span> <span class="nt">0</span> <span class="nt">2</span><span class="p">.</span><span class="nc">8px</span> <span class="nt">2</span><span class="p">.</span><span class="nc">2px</span> <span class="nt">rgba</span><span class="o">(</span><span class="nt">0</span><span class="o">,</span> <span class="nt">0</span><span class="o">,</span> <span class="nt">0</span><span class="o">,</span> <span class="nt">0</span><span class="p">.</span><span class="nc">02</span><span class="o">),</span> <span class="nt">0</span> <span class="nt">6</span><span class="p">.</span><span class="nc">7px</span> <span class="nt">5</span><span class="p">.</span><span class="nc">3px</span> <span class="nt">rgba</span><span class="o">(</span><span class="nt">0</span><span class="o">,</span> <span class="nt">0</span><span class="o">,</span> <span class="nt">0</span><span class="o">,</span> <span class="nt">0</span><span class="p">.</span><span class="nc">028</span><span class="o">),</span>
</span></span></code></pre></div>]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Auto Updates Homebridge &amp; Pi-Hole</title>
      <link>https://maik.io/notes/2019-02-25-auto-updates-homebridge-pi-hole/</link>
      <pubDate>Mon, 25 Feb 2019 08:02:00 +0200</pubDate>
      <guid>https://maik.io/notes/2019-02-25-auto-updates-homebridge-pi-hole/</guid>
      <description>&lt;p&gt;Nachdem ich etwas recherchiert habe, habe ich keinen Grund gefunden, warum man seinen Raspberry Pi und die Services &lt;a href=&#34;https://pi-hole.net&#34; target=&#34;_blank&#34; &gt;Pi-Hole&lt;/a&gt; und &lt;a href=&#34;https://homebridge.io&#34; target=&#34;_blank&#34; &gt;Homebridge&lt;/a&gt; nicht automatisch updaten sollte. Das führt zu mehr Sicherheit und außerdem muss man sich dann nicht immer wieder ins System einloggen und kann faktisch &lt;code&gt;SSH&lt;/code&gt; deaktivieren.&lt;/p&gt;
&lt;p&gt;Ich habe mir folgendes Script geschrieben und lasse es einmal pro Tag per &lt;code&gt;Cron&lt;/code&gt; ausführen.&lt;/p&gt;
&lt;p&gt;Vielleicht braucht das noch jemand. Wenn du Gründe hast, die gegen ein automatisches Update sprechen, sprich &lt;a href=&#34;https://twitter.com/maik_wi?lang=de&#34; target=&#34;_blank&#34; &gt;mich auf Twitter&lt;/a&gt; an.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Nachdem ich etwas recherchiert habe, habe ich keinen Grund gefunden, warum man seinen Raspberry Pi und die Services <a href="https://pi-hole.net" target="_blank" >Pi-Hole</a> und <a href="https://homebridge.io" target="_blank" >Homebridge</a> nicht automatisch updaten sollte. Das führt zu mehr Sicherheit und außerdem muss man sich dann nicht immer wieder ins System einloggen und kann faktisch <code>SSH</code> deaktivieren.</p>
<p>Ich habe mir folgendes Script geschrieben und lasse es einmal pro Tag per <code>Cron</code> ausführen.</p>
<p>Vielleicht braucht das noch jemand. Wenn du Gründe hast, die gegen ein automatisches Update sprechen, sprich <a href="https://twitter.com/maik_wi?lang=de" target="_blank" >mich auf Twitter</a> an.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;####### UPDATE DES SYSTEMS #######&#34;</span>
</span></span><span class="line"><span class="cl">sudo apt-get update
</span></span><span class="line"><span class="cl">sudo apt-get upgrade -y
</span></span><span class="line"><span class="cl">sudo apt-get autoremove -y
</span></span><span class="line"><span class="cl">sudo apt-get dist-upgrade -y
</span></span><span class="line"><span class="cl">sudo apt-get autoclean
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;####### UPDATE VON PI-HOLE #######&#34;</span>
</span></span><span class="line"><span class="cl">pihole -up
</span></span><span class="line"><span class="cl">pihole updateGravity
</span></span></code></pre></div><p>Den Homebridge-Teil müsstet ihr auf eure Plugins anpassen.</p>
]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>
    <item>
      <title>Dropbox auf Uberspace deinstallieren</title>
      <link>https://maik.io/notes/2018-10-25-dropbox-auf-uberspace-deinstallieren/</link>
      <pubDate>Thu, 25 Oct 2018 22:00:00 +0000</pubDate>
      <guid>https://maik.io/notes/2018-10-25-dropbox-auf-uberspace-deinstallieren/</guid>
      <description>&lt;p&gt;Nachdem Dropbox auf dem Uberspace &lt;a href=&#34;https://www.golem.de/news/cloud-dropbox-faehrt-linux-support-zurueck-1808-136009.html&#34; target=&#34;_blank&#34; &gt;nicht mehr läuft&lt;/a&gt; und ich meinen &lt;a href=&#34;__GHOST_URL__/blog/mobiles-blogging-mit-kirby-coda-und-kurzbefehle-fuer-ios&#34; &gt;Blogging-Workflow geändert&lt;/a&gt; habe, will ich Dropbox löschen und alle &lt;code&gt;.dropbox.attr&lt;/code&gt;-Dateien löschen. Das sind Metadateien, die Dropbox in jedem Ordner anlegt.&lt;/p&gt;
&lt;p&gt;Als Erstes löschen wir Dropbox. Dazu loggen wir uns per &lt;code&gt;SSH&lt;/code&gt; auf dem Uberspace ein.&lt;/p&gt;
&lt;p&gt;Dann wechseln wir ins &lt;code&gt;Home&lt;/code&gt;-Verzeichnis.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ~
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mit folgendem Befehl löschen wir die Dateien, die nach der Installation angelegt wurden.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rv Dropbox .dropbox .dropbox-dist
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm ~/service/dropboxd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;svc -dx . log
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rf ~/etc/run-dropboxd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mein Blog lag in der Dropbox, das heißt, ich muss in den öffentlichen Bereich wechseln und auch hier unnötige Dateien löschen.&lt;/p&gt;</description>
      <content:encoded>
      <![CDATA[<p>Nachdem Dropbox auf dem Uberspace <a href="https://www.golem.de/news/cloud-dropbox-faehrt-linux-support-zurueck-1808-136009.html" target="_blank" >nicht mehr läuft</a> und ich meinen <a href="__GHOST_URL__/blog/mobiles-blogging-mit-kirby-coda-und-kurzbefehle-fuer-ios" >Blogging-Workflow geändert</a> habe, will ich Dropbox löschen und alle <code>.dropbox.attr</code>-Dateien löschen. Das sind Metadateien, die Dropbox in jedem Ordner anlegt.</p>
<p>Als Erstes löschen wir Dropbox. Dazu loggen wir uns per <code>SSH</code> auf dem Uberspace ein.</p>
<p>Dann wechseln wir ins <code>Home</code>-Verzeichnis.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> ~
</span></span></code></pre></div><p>Mit folgendem Befehl löschen wir die Dateien, die nach der Installation angelegt wurden.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">rm -rv Dropbox .dropbox .dropbox-dist
</span></span><span class="line"><span class="cl">rm ~/service/dropboxd
</span></span><span class="line"><span class="cl">svc -dx . log
</span></span><span class="line"><span class="cl">rm -rf ~/etc/run-dropboxd
</span></span></code></pre></div><p>Mein Blog lag in der Dropbox, das heißt, ich muss in den öffentlichen Bereich wechseln und auch hier unnötige Dateien löschen.</p>
<p>In den meisten Fällen ist das mit folgendem Befehl geschehen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> ~/html
</span></span></code></pre></div><p>Nun suchen wir nach den <code>.dropbox.attr</code>-Dateien und löschen sie im selben Zug.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">find . -name <span class="s2">&#34;.dropbox.attr&#34;</span> -exec rm -rf <span class="o">{}</span> <span class="se">\;</span>
</span></span></code></pre></div><p>Das war es auch schon.</p>
<p>Quelle:</p>
<ul>
<li><a href="https://wiki.uberspace.de/system:daemontools" target="_blank" >Uberspace Wiki</a></li>
<li><a href="https://www.cyberciti.biz/faq/linux-unix-how-to-find-and-remove-files/" target="_blank" >nixCraft</a></li>
</ul>
]]>    
      <![CDATA[<br><br><hr><br><small><p>Vielen Dank fürs Lesen! Wenn du Lust auf noch mehr Gedanken, Updates und ab und zu einen Blick hinter die Kulissen hast, folge mir doch gern auf <a href="https://maik.io/mastodon">Mastodon</a> oder <a href="https://maik.io/instagram">Instagram</a>.</p><p>Hast du Fragen oder Feedback? Schreib mir gern eine <a href="https://maik.io/email">E-Mail</a>.</p></small>]]>
      </content:encoded>  
    </item>      
  </channel>
</rss>